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
Bonjour,
j'ai ecris ce programme pour afficher cobien de fois on a ecrit le caractere 'e' et 'E'
mais ça pas entierement marcher
il y a plusieure problemes dedans
est ce qu'il ya qlq1 qui peut m'aider svp
c'est le programme que j'ai ecrit
(((((((
#include <stdio.h>
#include <conio.h>
void main()
{char e[6];
int i=0,j=0,k=0,m=0;
for(i=0;i<1;i++)

{
printf("entrer\n");
scanf("%c",&e[i]);
if(e[i]=='e')
i++;
if(e[i]=='E')
j++;
}
printf(" il y a %d e et %d E ", m,k);
getch();
}
))))

merci d'avance;)

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
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 :

#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
0
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
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
0
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
Et bien tu rajoutes :
char phrase[100];
scanf("%99s", phrase);


Cdlt,
0
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
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 :-)
0
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
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.
0

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
Bonne remarque :-)
0