IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de récursivité


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 44
    Par défaut Problème de récursivité
    Bonjour a tous

    j ai un devoir a rendre en informatique,ce devoir est le suivant:
    je dois "construire" une fonction qui compte le nombre de 9 dans un unsigned long int ,et je dois de preference utiliser la recursivité,mais voila probleme,
    lorsque j excecute le programme ,il me met "NOT eNOUGH MEMory" il ne s excecute pas !!!!
    VOICI le code ,merci d avance pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include<stdio.h>
    #include<conio.h>
    unsigned nbneuf(unsigned long int,int);
    main()
    {
    unsigned long int a,p;
    int n,x;
    clrscr();
     
    printf("Donnez votre nombre ooooh:");
    scanf("%lu",&a);
    p=a;
    n=0;
     
    x=nbneuf(p,n);
     
    printf("il y en a %d ",x);
    getch();
    }
    //***************************************************************************
    unsigned nbneuf(unsigned long int p,int n)
    {
    if(p>0)
    {
    if((p%10)==9)
    	  n++;
     
    	  p=p/10;
    	  nbneuf(p,n);
    	  }
    	  else
      return n;
     
     }

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mehdi.berra
    dois de preference utiliser la recursivité,mais voila probleme,
    lorsque j excecute le programme ,il me met "NOT eNOUGH MEMory" il ne s excecute pas !!!!
    La récursivité, ça ne s'invente pas. Tu n'as pas eu de cours ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #include<stdio.h>
     
    static unsigned nbneuf (unsigned long p, int n)
    {
       if (p > 0)
       {
          /* debug */
          printf ("%lu : %d\n", p, n);
     
          if ((p % 10) == 9)
          {
             n = nbneuf (p / 10, n + 1);
          }
          else
          {
             n = nbneuf (p / 10, n);
          }
       }
       return n;
    }
     
    int main (void)
    {
       unsigned long int a;
       int x;
       printf ("Donnez votre nombre : ");
       fflush (stdout);
       scanf ("%lu", &a);
       x = nbneuf (a, 0);
       printf ("il y en a %d 9 dans %lu\n", x, a);
     
       return 0;
    }
    Pose des questions si tu ne comprends pas.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 80
    Par défaut
    Petite variation que j'espère correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include<stdio.h>
     
    static unsigned nbneuf (unsigned long p)
    {
      if (p>0)
        return nbneuf(p/10) + (p%10 == 9);
      else
        return 0;
    }
     
    int main (void)
    {
      unsigned long int a;
      int x;
      printf ("Donnez votre nombre : ");
      fflush (stdout);
      scanf ("%lu", &a);
      x = nbneuf (a);
      printf ("il y en a %d 9 dans %lu\n", x, a);
     
      return 0;
    }
    Candide

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par c-candide
    Petite variation que j'espère correcte :
    C'est astucieux mais ça nécessite des connaissance du C qui vont au-dela des connaissances de base. Mais c'est bien de montrer que ça existe...

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 75
    Par défaut généralité
    Mehdi,

    Si une fonction renvoie une valeur, il serait (peut-être) judicieux d'utiliser cette valeur de retour pour utiliser correctement cette fonction...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned nbneuf(unsigned long int p,int n) 
    { 
      if((p%10)==9)  n++;   
    p=p/10; 
    if (p>0) n=nbneuf(p,n); 
      return n;   
    }
    ca marche bcp mieux comme ca...

    Concernant le pb de mémoire, il faudrait initialiser la variable dont tu transmets l'adresse à scanf(quelle peut être l'adresse d'une variable jamais initialisée?)

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Par défaut version de c-candide
    Quelqu'un peut-il m'expliquer la version de c-candide ?
    Merci

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sliya
    Quelqu'un peut-il m'expliquer la version de c-candide ?
    Merci
    Voici un petit dessin exemple:


    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par pierrot106
    Concernant le pb de mémoire, il faudrait initialiser la variable dont tu transmets l'adresse à scanf(quelle peut être l'adresse d'une variable jamais initialisée?)
    Le code unsigned long int a a pour effet d'allouer une zone mémoire nommée a. Si on ne l'initialise pas, son contenu est effectivement indéfini, mais son adresse est parfaitement connue, elle !

    Il n'y a aucun problème à utiliser &a dans le scanf (excepté, peut-être scanf elle-même ).

    Celà dit, c'est effectivement une bonne habitude à prendre que d'initialiser systématiquement ses variables...

Discussions similaires

  1. Problème de récursivité
    Par amestoche dans le forum Langage
    Réponses: 2
    Dernier message: 20/04/2007, 15h41
  2. Problème Arnaud <> récursivité
    Par Kanter dans le forum Delphi
    Réponses: 13
    Dernier message: 20/02/2007, 16h54
  3. Problème de récursivité
    Par nmathon dans le forum Delphi
    Réponses: 5
    Dernier message: 12/01/2007, 16h40
  4. Problème de récursivité en Prolog
    Par poooky dans le forum Prolog
    Réponses: 5
    Dernier message: 04/01/2007, 17h35
  5. Problème de récursivité
    Par tazmania dans le forum C
    Réponses: 24
    Dernier message: 14/12/2005, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo