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
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.
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.
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.
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 ?
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.
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.
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
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."
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
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.
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.
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.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub