Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récursivité en C

    11 juillet 2018 à 21:04:21

    Bonjour à tous !


    Etant très nul en programmation, je dois m'entrainer cet été sur pas mal de notions que j'ai loupé en cours.


    Voici le sujet de ce qui m'est demandé : 


    Écrivez une fonction récursive <tt style="z-index: 10; text-align: justify; background-color: #ffffff;">print_n_char()</tt> qui prend en paramètre un caractère (char c) et un entier non signé (unsigned int n). Cette fonction affiche n fois le caractère c. Pour ceux qui ne savent pas, "char" est un type du C, comme "int".


    Voici ce que moi j'ai fait et qui ne fonctionne évidemment pas :


    #include <stdio.h>
    #include <stdlib.h>
    
    char print_and_char(char, unsigned int);
    
    int main(){
            char res = print_and_char('*',5);
            printf("%c",res);
            printf("\n");
            return 0;
    }
    
    char print_and_char(char c, unsigned int n){
            if (n>0){
                    return print_and_char(c,n-1);;
            }
            else{
                    return 0;
            }
    }
    
    
    
    
    
    


    Pouvez-vous m'éclairer ? Sans me donner la réponse c'est mieux :)


    Merci à tous !

    • Partager sur Facebook
    • Partager sur Twitter
      11 juillet 2018 à 21:22:23

      Salut,

      Dans ta fonction, il faut bien que tu affiches le caractère à un moment. Là on a juste l'impression que tu as pris une fonction récursive au hasard et que tu as changé le nom et supprimé des trucs.

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        11 juillet 2018 à 21:38:08

        Mon affichage se fait dans le main : 


        printf("%c",res);

        Etant donné que je suis en récursif j'utilise des fonctions et non des procédures, d'ou l'utilisation des return...


        yo@n97one a écrit:

        Salut,

        Dans ta fonction, il faut bien que tu affiches le caractère à un moment. Là on a juste l'impression que tu as pris une fonction récursive au hasard et que tu as changé le nom et supprimé des trucs.

        • Partager sur Facebook
        • Partager sur Twitter
          11 juillet 2018 à 22:17:32

          Oui, mais dans ton main tu n'affiches qu'une fois. Essaie de suivre tes appels de fonction à la main pour par exemple print_and_char('a', 2), tu verras que ta fonction est pour le moment complètement vide, elle ne fait que retourner 0. D'ailleurs ça ne te paraît pas bizarre qu'on ne fasse rien du paramètre c ?

          Une manière de voir ton programme c'est ça.

          • Si on doit afficher le caractère 0 fois, on ne fait rien.
          • Sinon, si on doit l'afficher n fois (nstrictement positif), on l'affiche une fois et on demande à l'afficher n - 1 fois grâce à l'appel récursif.

          -
          Edité par yo@n97one 11 juillet 2018 à 22:18:14

          • Partager sur Facebook
          • Partager sur Twitter
          Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
            11 juillet 2018 à 22:48:22

            yo@n97one a écrit:

            • Sinon, si on doit l'afficher n fois (nstrictement positif), on l'affiche une fois et on demande à l'afficher n - 1 fois grâce à l'appel récursif.

            -
            Edité par yo@n97one il y a 8 minutes

            L'appel récursif dans le if ne permet justement pas de répéter l'opération jusqu'à ce que n soit égal à zéro ?

            Sinon, effectivement, ce que tu disais sur le paramètre c me parait logique, reste à trouver comment l'exploiter maintenant.

            • Partager sur Facebook
            • Partager sur Twitter
              11 juillet 2018 à 23:00:18

              Ta fonction sera rappelé jusqu'à ce que n soit égal à zéro, mais dans ta fonction tu ne fais rien. C'est dans ta fonction que tu dois afficher le caractère une fois si n est non nul.

              En l'état, voici ce qui se passe quand on appelle la fonction avec 'a' et 3.

              print_and_char('a', 3) : 3 est différent de 0, on retourne print_and_char('a', 2).
              print_and_char('a', 2) : 2 est différent de 0, on retourne print_and_char('a', 1).
              print_and_char('a', 1) : 1 est différent de 0, on retourne print_and_char('a', 0).
              print_and_char('a', 0) : on retourne 0.
              
              print_and_char('a', 0) retourne 0 : print_and_char('a', 1) retourne 0
                                                : print_and_char('a', 2) retourne 0
                                                : print_and_char('a', 3) retourne 0
              

              Et donc, tu retournes juste 0, tu n'affiches jamais rien dans ta fonction. Pour toi, où affiches-tu le caractère n fois dans ton code ?

              -
              Edité par yo@n97one 11 juillet 2018 à 23:02:55

              • Partager sur Facebook
              • Partager sur Twitter
              Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                11 juillet 2018 à 23:21:26

                Je pensais afficher dans le main. Je pensais que c'était pour ça que l'on me forçais à utiliser une fonction plutôt qu'une procédure
                • Partager sur Facebook
                • Partager sur Twitter
                  11 juillet 2018 à 23:49:28

                  Ben on te dit que ta fonction doit afficher, donc elle doit afficher, ce n'est pas le main qui doit afficher. En C, on parle très rarement de procédures et même quand il n'y a que des effets de bord, on croise plus souvent le mot fonction.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                    12 juillet 2018 à 0:01:12

                    yo@n97one a écrit:

                    Ben on te dit que ta fonction doit afficher, donc elle doit afficher, ce n'est pas le main qui doit afficher. En C, on parle très rarement de procédures et même quand il n'y a que des effets de bord, on croise plus souvent le mot fonction.


                    Justement, cet exercice à pour but de ne pas confondre les deux.

                    J'ai très facilement réussi cet exercice au moyen d'un for dans un void (qui ne renvoi rien mais qui affiche !). Seulement, le but ici est de faire une fonction qui renvoi un résultat et de l'afficher dans le main.

                    Mais je vois pas trop comment faire.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 juillet 2018 à 0:14:02

                      Tu peux tout à fait afficher et renvoyer quelque chose. L'énoncé est quand même assez clair : Cette fonction affiche n fois le caractère c.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                        12 juillet 2018 à 7:37:21

                        En no récursif, ça donne ça :

                        void printN ( char a, unsigned int nb )
                        {
                            while ( nb-- )
                            {
                                printf ( "%c", a );
                            }
                        }
                        
                        int main ( void )
                        {
                            printN ( 'c', 5 );
                            return( 0 );
                        }

                        maintenant, ton objectif est sans changer les prototype de la fonction changer sa façon de faire.

                        voyons comment faire pas à pas.

                        void printN ( char a, uinsigned int nb )
                        {
                            printf ( "%c", a );
                        }

                        là on l'affiche une fois seulement donc il suffit de rappeler cette fonction N-1

                        void printN ( char a, unsigned int nb )
                        {
                            printf ( "%c", a );
                        
                            if ( nb > 1 )
                            {
                                printN ( a, nb-1 );
                            }
                        }
                        

                        voila maintenant à toi de comprendre.




                        • Partager sur Facebook
                        • Partager sur Twitter

                        la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                        Mon GitHub

                          12 juillet 2018 à 8:33:20

                          ox223252 a écrit :

                          void printN ( char a, unsigned int nb )
                          {
                              printf ( "%c", a );
                          
                              if ( nb > 1 )
                              {
                                  printN ( a, nb-1 );
                              }
                          }
                          

                          voila maintenant à toi de comprendre.

                          Voilà ce que j'ai fait :

                          #include <stdio.h>
                          #include <stdlib.h>
                          
                          char print_and_char(char, unsigned int);
                          
                          int main (){
                                  print_and_char('*',5);
                                  return 0;
                          }
                          
                          char print_and_char(char c, unsigned int n){
                                  printf("%c",c);
                                  if (n==0){
                                          return 0;
                                  }
                                  else{
                                          print_and_char(c,n-1);
                                  }
                          }
                          
                          
                          
                          

                          Par contre je ne comprends pas le warning qui m'est retourné :

                          pyra.c: In function ‘print_and_char’:
                          pyra.c:19:1: warning: control reaches end of non-void function [-Wreturn-type]
                           }
                           ^
                          

                          Je me demande si c'est pas le printf dans la fonction qui fait ça ?

                          Sinon effectivement cela fonctionne :

                          ubuntu@ubuntu:~/Documents/Programmation/TP1$ ./a.out 
                          ******
                          ubuntu@ubuntu:~/Documents/Programmation/TP1$ 
                          








                          -
                          Edité par Credo des travailleurs ! 12 juillet 2018 à 8:36:09

                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 juillet 2018 à 8:48:08

                            ta fonction est sensé renvoyer une char et elle renvoie rien.

                            control reaches end of non-void function 

                            c'est pour ça, rajoute un :

                            return ( 0 );

                            pour que ce soit bon ou modifie le prototype de la fonction pour la passer en :

                            void print_and_char(...)



                            -
                            Edité par ox223252 12 juillet 2018 à 8:50:10

                            • Partager sur Facebook
                            • Partager sur Twitter

                            la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                            Mon GitHub

                              12 juillet 2018 à 8:52:04

                              Ta fonction est déclarée comme ayant un type de retour, hors si tu passes dans le "else" de ta fonction, rien n'est renvoyé.

                              Ça doit être :

                              char print_and_char(char c, unsigned int n){
                                      printf("%c",c);
                                      if (n==0){
                                              return 0;
                                      }
                                      else{
                                              return print_and_char(c,n-1);
                                      }
                              }

                              Mais comme tu n'as pas l'air de récupérer le retour de la fonction, mieux vaut passer le type de retour en "void" et enlever les "return".

                              Comme ça :

                              void print_and_char(char c, unsigned int n){
                                      printf("%c",c);
                                      if (n!=0){
                                              print_and_char(c,n-1);
                                      }
                              }




                              -
                              Edité par CeBiM 12 juillet 2018 à 8:57:02

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
                                12 juillet 2018 à 8:53:11

                                J'ai trouvé pour le Warning !


                                char print_and_char(char c, unsigned int n){
                                        printf("%c",c);
                                        if (n==0){
                                                return 0;
                                        }
                                        else{
                                                return print_and_char(c,n-1);
                                        }


                                Y 'avait bien un return à rajouter.


                                Je ne clos pas le sujet j'ai une partie bien plus dure qui arrive ^^

                                Merci encore !



                                ox223252 a écrit:

                                ta fonction est sensé renvoyer une char et elle renvoie rien.

                                control reaches end of non-void function 

                                c'est pour ça, rajoute un :

                                return ( 0 );

                                pour que ce soit bon ou modifie le prototype de la fonction pour la passer en :

                                void print_and_char(...)



                                -
                                Edité par ox223252 il y a moins de 30s



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 juillet 2018 à 9:34:36

                                  Credo des travailleurs > Je ne clos pas le sujet j'ai une partie bien plus dure qui arrive ^^

                                  créais un second sujet ce sera plus simple, je pense

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                                  Mon GitHub

                                    12 juillet 2018 à 9:41:47

                                    Ta fonction n'est pas correcte, elle n'affiche pas n fois le caractère c, mais n + 1 fois.

                                    -
                                    Edité par yo@n97one 12 juillet 2018 à 9:42:07

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                      12 juillet 2018 à 9:43:40

                                      Credo des travailleurs ! a écrit:

                                      char print_and_char(char c, unsigned int n){
                                              printf("%c",c);
                                              if (n==0){
                                                      return 0;
                                              }
                                              else{
                                                      return print_and_char(c,n-1);
                                              }

                                      Je ne clos pas le sujet j'ai une partie bien plus dure qui arrive

                                      Il faudrait d'abord corriger cette fonction pour qu'elle affiche n fois c, non ?

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        12 juillet 2018 à 10:08:35

                                        Et elle retourne toujours un caractère nul dont personne ne fait quoi que ce soit, ce qui est d'une inutilité totale, et révèle qu'il faut que tu revoies sérieusement les bases, concernant

                                        • l'appel de fonction,
                                        • déclaration du type retourné (ou son absence, déclarée par void)
                                        • utilisation de return

                                        PS : nulle part il n'est écrit que ta fonction doit retourner quelque chose

                                        Écrivez une fonction récursive print_n_char() 
                                        qui prend en paramètre un caractère (char c) 
                                        et un entier non signé (unsigned int n). 
                                        Cette fonction affiche n fois le caractère c. 
                                        

                                        Donc il faut aussi que tu fasses un effort pour lire et comprendre ce qui est écrit dans les énoncés, au lieu d'avoir des hallucinations du genre

                                        le but ici est de faire une fonction 
                                        qui renvoi un résultat 
                                        et de l'afficher dans le main.

                                        l'énoncé ne parle pas du main, ni de renvoyer un résultat.



                                        -
                                        Edité par michelbillaud 12 juillet 2018 à 10:18:48

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          12 juillet 2018 à 11:20:17

                                          ça j'arrive vraiment pas à le comprendre, comment vois tu cela ?

                                          yo@n97one a écrit:

                                          Ta fonction n'est pas correcte, elle n'affiche pas n fois le caractère c, mais n + 1 fois.

                                          -
                                          Edité par yo@n97one il y a environ 1 heure

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            12 juillet 2018 à 11:29:59

                                            J'ai regardé le code et j'ai vu que ça faisait une itération de trop. Mais sinon tu peux le voir en testant. Genre sur la capture d'écran que tu as donnée, tu essayes d'afficher 5 étoiles, et il en affiche 6.

                                            Il faut que tu apprennes à analyser ton code à la main. Par exemple, ici, si tu demandes d'afficher 0 fois, que se passe-t-il concrètement.

                                            • On rentre dans la fonction.
                                            • On croise un printf, on l'exécute => on a affiché le caractère une fois (problème).
                                            • On a un if(n == 0), la condition est respectée, on rentre dans ce bloc.
                                            • On retourne 0.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                              12 juillet 2018 à 12:12:10

                                              Ah yes j'ai compris je pense :

                                              char print_and_char(char c, unsigned int n){
                                                      if (n==0){
                                                              return 0;
                                                      }
                                                      else{
                                                              printf("%c",c);
                                                              return print_and_char(c,n-1);
                                                      }
                                              }
                                              



                                              yo@n97one a écrit:

                                              J'ai regardé le code et j'ai vu que ça faisait une itération de trop. Mais sinon tu peux le voir en testant. Genre sur la capture d'écran que tu as donnée, tu essayes d'afficher 5 étoiles, et il en affiche 6.

                                              Il faut que tu apprennes à analyser ton code à la main. Par exemple, ici, si tu demandes d'afficher 0 fois, que se passe-t-il concrètement.

                                              • On rentre dans la fonction.
                                              • On croise un printf, on l'exécute => on a affiché le caractère une fois (problème).
                                              • On a un if(n == 0), la condition est respectée, on rentre dans ce bloc.
                                              • On retourne 0.


                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Récursivité en C

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown