Realiser un programme en c
Fermé
rachidima18
Messages postés
7
Date d'inscription
mercredi 4 novembre 2009
Statut
Membre
Dernière intervention
25 août 2010
-
23 janv. 2010 à 07:30
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 26 janv. 2010 à 23:17
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 26 janv. 2010 à 23:17
A voir également:
- Realiser un programme en c
- Programme demarrage windows 10 - Guide
- Réaliser un organigramme - Guide
- Mettre en veille un programme - Guide
- Desinstaller un programme - Guide
- Forcer la fermeture d'un programme - Guide
5 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
23 janv. 2010 à 14:39
23 janv. 2010 à 14:39
Merci d'éviter les abréviation et de soigner l'orthpgraphe.
Pourquoi ton code ne fonctionne pas
Ton problème se situe au niveau de ta boucle. Tu ne fais qu'examiner e[0] car i vaut 0 à la première itération, et quand il prend la valeur 1, ta boucle for se termine.
De plus, tu n'as pas initialisé le contenu de la variable "e" donc elle contient des valeurs a priori aléatoire.
Conseils préliminaires
Essaye aussi de ne pas utiliser de noms de variables aussi peu explicites. Donne de vrais noms, qui indiquent leur signification. Si tu es une puriste tu même rajouter un préfixe devant pour rappeler leur type (par exemple i si c'est un entier, s si c'est une chaîne de caractère etc...).
Enfin, il n'y a aucune raison d'inclure <conio.h> qui est un header spécifique windows et qui n'est pas utilisé dans ton code.
Une première solution
Voici à quoi pourrait ressembler ton programme :
Petites explications
Une chaîne de caractère (char *) se termine toujours par un caractère spécial, le caractère '\0' qui vaut en réalité 0. En C, toute valeur non nulle est vrai donc on pourrait écrire :
De plus, la chaîne phrase n'a pas de raison de varier dans la fonction main, donc on rajoute le mot clé (const) pour interdire une éventuelle modification.
Plus loin avec les pointeurs
Idéalement il vaudrait mieux parcourir la chaîne avec un pointeur mais c'est un concept que tu n'as peut-être pas encore vu. Si ça ne te parle pas encore, laisse tomber ce qui suit.
On peut également imaginer d'utiliser la fonction "tolower".
Au final ce serait plus ça qu'il faudrait écrire :
Bonne chance
Pourquoi ton code ne fonctionne pas
Ton problème se situe au niveau de ta boucle. Tu ne fais qu'examiner e[0] car i vaut 0 à la première itération, et quand il prend la valeur 1, ta boucle for se termine.
De plus, tu n'as pas initialisé le contenu de la variable "e" donc elle contient des valeurs a priori aléatoire.
Conseils préliminaires
Essaye aussi de ne pas utiliser de noms de variables aussi peu explicites. Donne de vrais noms, qui indiquent leur signification. Si tu es une puriste tu même rajouter un préfixe devant pour rappeler leur type (par exemple i si c'est un entier, s si c'est une chaîne de caractère etc...).
Enfin, il n'y a aucune raison d'inclure <conio.h> qui est un header spécifique windows et qui n'est pas utilisé dans ton code.
Une première solution
Voici à quoi pourrait ressembler ton programme :
#include <stdio.h> int main(){ const char *phrase = "J'aime les tapirs. Et eux aussi ils m'aiment !"; unsigned int i; unsigned int nb_e = 0; for(i = 0; phrase[i] != '\0'; ++i){ if(phrase[i] == 'e' || phrase[i] == 'E') ++nb_e; } printf("Il y a %d lettres 'e' dans la phrase '%s\n'.", nb_e, phrase); // getchar(); return 0; }
Petites explications
Une chaîne de caractère (char *) se termine toujours par un caractère spécial, le caractère '\0' qui vaut en réalité 0. En C, toute valeur non nulle est vrai donc on pourrait écrire :
for(i = 0; phrase[i]; ++i){ ... }
De plus, la chaîne phrase n'a pas de raison de varier dans la fonction main, donc on rajoute le mot clé (const) pour interdire une éventuelle modification.
Plus loin avec les pointeurs
Idéalement il vaudrait mieux parcourir la chaîne avec un pointeur mais c'est un concept que tu n'as peut-être pas encore vu. Si ça ne te parle pas encore, laisse tomber ce qui suit.
On peut également imaginer d'utiliser la fonction "tolower".
Au final ce serait plus ça qu'il faudrait écrire :
#include <stdio.h> #include <ctype.h> int main(){ const char *phrase = "J'aime les tapirs. Et eux aussi ils m'aiment !"; const char *pcur_char; char cur_char; unsigned int nb_e = 0; // Parcourir chaque caractère de 'phrase' for(pcur_char = phrase; *pcur_char; ++pcur_char){ cur_char = tolower(*pcur_char); // le caractère courant en minuscule if(cur_char == 'e') ++nb_e; } printf("Il y a %d lettres 'e' dans la phrase '%s'\n", nb_e, phrase); // getchar(); return 0; }
Bonne chance
rachidima18
Messages postés
7
Date d'inscription
mercredi 4 novembre 2009
Statut
Membre
Dernière intervention
25 août 2010
25 janv. 2010 à 00:42
25 janv. 2010 à 00:42
merci mamiemando
mais ce pirogramme que tu as fais il donne seulement une resultat directement(il y a 5 .....)
moi je vx faire un programme qui demande a l"utilisateur d'entrer une phrase puis il donne la resultat
et merci d'avance
mais ce pirogramme que tu as fais il donne seulement une resultat directement(il y a 5 .....)
moi je vx faire un programme qui demande a l"utilisateur d'entrer une phrase puis il donne la resultat
et merci d'avance
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
25 janv. 2010 à 06:19
25 janv. 2010 à 06:19
Et bien tu rajoutes :
Cdlt,
char phrase[100]; scanf("%99s", phrase);
Cdlt,
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
25 janv. 2010 à 12:36
25 janv. 2010 à 12:36
Attention toutefois si l'utilisateur entre une phrase de plus de 100 caractères. En C++ on utiliserait par exemple la classe std::string pour s'affranchir de ce genre de détails. En C je pense que la fonction getline (qui sait redimensionner la zone mémoire dans laquelle on va stocker la chaîne) peut faire l'affaire, mais c'est du détail et à mon avis, pas le but de ton exercice.
Conclusion : fais comme a dit fiddy :-)
Conclusion : fais comme a dit fiddy :-)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
25 janv. 2010 à 21:39
25 janv. 2010 à 21:39
En C je pense que la fonction getline (qui sait redimensionner la zone mémoire dans laquelle on va stocker la chaîne) peut faire l'affaire,
Attention getline() n'est pas une fonction C standard. Il s'agit d'une extension GNU.
Attention getline() n'est pas une fonction C standard. Il s'agit d'une extension GNU.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
26 janv. 2010 à 23:17
26 janv. 2010 à 23:17
Bonne remarque :-)