Probleme dans une fonction recursive

Fermé
kamaldita - 31 mars 2009 à 14:21
 loupius - 31 mars 2009 à 19:52
Bonjour,
je dois faire l'exo suivant :Écrivez une fonction récursive qui compte le nombre de caractères numériques (0 à 9) dans une chaîne de caractères, svp g vraiment besoin de votre aide g deja essayer de faire un code mais malheureusement cela ne marche pas pliiiiiz aidez moi.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define dim 100
void fct(int,int*);
main()
{
int n,b;
char ch[dim];
printf("enter votre chaine de caractere:\t");
scanf("%s",ch);
n=strlen(ch);
fct(n,&b);
printf("%d",b);
system("PAUSE");
return 0;
}
void fct(int n,int *b)
{
char ch[dim];
if(n>0)
{
if(ch[n-1]=='0')
{
b++;
fct(n-1,b);
}
else
fct(n-1,b);
}
}
A voir également:

2 réponses

Ce n'était pas la peine d'ouvrir une nouvelle question, il suffisait de mettre le code comme jipicy te l'avais demandé.
Ton code ne tient pas la route:
- que fais-tu de la chaîne entrée par l'utilisateur ? Tu penses qu'en mettant le même nom de variable (en l'occurence 'chn'), il s'agira de la même variable que celle déclarée dans le 'main' ? Et bien ce n'est pas le cas, les variables sont locales. Il ne s'agit pas de résoudre le problème en utilisant des variables globales, mais de passer le 'chn' du 'main' à la fonction.
Au travail!
0
alors voici le changement mais ca ne marche pa #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define dim 100
void fct(char[],int,int*);
main()
{
int n,b=9;
char ch[dim];
printf("enter votre chaine de caractere:\t");
scanf("%s",ch);
n=strlen(ch);
fct(ch,n,&b);
printf("%d",b);
system("PAUSE");
return 0;
}
void fct(char ch[],int n,int *b)
{
if(n>0)
{
if(ch[n-1]=='l')
{
*b++;
fct(ch,n-1,b);
}
else
fct(ch,n-1,b);
}
}
0
Attention:
*b++ que veux-tu faire ???
*b++ signifie *(b++) car l'incrémentation est prioritaire sur l'indirection, et je ne pense pas que c'est ce que tu veux (si c'est le cas, oublie car ici 'incrémenter le pointeur sur l'entier' n'a aucun sens).
Alors il faut parenthéser (nouveau verbe ;-) ), ce qui donne: (*b)++;
Nota:
- Au lieu de passer l'entier sous forme de pointeur, ne serait-il pas plus judicieux de choisir une fonction qui retourne un entier...
- A quoi sert-il de passer la longueur de la chaîne ? Ne pourrait-on pas, dans la fonction détecter la fin de chaîne ? Je te laisse deviner comment. J'ai comme l'impression que l'on va diminuer par 2 ou 3 le nombre de lignes de la fonction.
Encore un peu de courage!
0
kamaldita > loupius
31 mars 2009 à 18:46
la longueur de la chaine est , je pense, necessaire car dans le cadre de la recursivité c obligatoire.
MAIS MERCCIIIIIIIIIIIIIIII loupius tu m'a été d'une tres grande aide j'ai effectué le changement " (*b)++;" et ca a marcher donc le programme qui suit marche tres bien (il me detecte le nombre de"1" dans la chaine)
(encore une fois merciii loupius)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define dim 100
void fct(char[],int,int*);
main()
{
int n,b=0;
char ch[dim];
printf("enter votre chaine de caractere:\t");
scanf("%s",ch);
n=strlen(ch);
fct(ch,n,&b);
printf("%d",b);
system("PAUSE");
return 0;
}
void fct(char ch[],int n,int *b)
{
if(n>0)
{
if(ch[n-1]=='1')
{
(*b)++;
fct(ch,n-1,b);
}
else
fct(ch,n-1,b);
}
}
0
loupius > kamaldita
31 mars 2009 à 19:12
Je crois que la question posée demandait à compter les chiffres de 0 à 9; moi je propose le programme suivant:
#include <ctype.h>
#include <stdio.h>

#define dim 100

int fct(char* ch)
{
	return ( (*ch) ? (isdigit(*ch) ? fct(ch+1)+1 : fct(ch+1)) : (0) );
}

int main()
{
	char ch[dim];
	printf("Entrez votre chaine de caracteres: ");
	scanf("%s", ch);
	printf("Le nombre de chiffre est: %d\n", fct(ch));
	//system("PAUSE");
	return 0;
}
Tu vois il n'y a pas besoin de transmettre, ni de calculer d'ailleurs, la longueur de la chaîne.
Bon, je sais, il y a des chagrineux qui vont pinailler sur l'instruction ternaire, mais elle existe et je trouve que c'est un bon endroit pour l'utiliser.
D'autre part, j'ai laissé le 'scanf', bien que pour moi c'est à proscrire pour saisir une chaîne de caractères, mais disons que pour un exemple ça convient.
A+.
Bon courage.
0
kamaldita > loupius
31 mars 2009 à 19:41
a vrai dire je dois avouer ke g bcp appri de ce programme car (et c se qui prouve que je suis debutante)je n'ai jamais entendue parler de "ctype.h" ni de "isdigit" d'ailleurs , mais comme il n'est jamais trop tard pour apprendre je suis contente d'avoir ajouter ceci a mes connaissance!
merci é ac +
0
kamaldita > kamaldita
31 mars 2009 à 19:48
et g remplacer le scanf par le gets pour eviter le problem de l'espace
0