Bonjour, j'aimerai savoir comment faire pour trouver les nombre de 'e' par exemple dans une phrase que l'utilisateur saisis.
Sachant que je ne connais pas les chaines de caracteres. Donc en utilisant le type char.
Merci de me mettre sur la voie.
Version imprimable
Bonjour, j'aimerai savoir comment faire pour trouver les nombre de 'e' par exemple dans une phrase que l'utilisateur saisis.
Sachant que je ne connais pas les chaines de caracteres. Donc en utilisant le type char.
Merci de me mettre sur la voie.
Si tu ne sais pas ce qu'est une chaine de caractère, tu ne peux pas faire cet exercice.Citation:
Envoyé par skulled
Il y a un bug quelque part.
Ceci dit je peux te faire une Grande Révélation, si tu t'y sens prêt...
Une chaine de caractère est une séquence de caractères terminée par un 0. Elle est implémentée, par exemple, par un tableau de char donc chaque élément consécutif contient une valeur représentant un caractère. La chaine s'arrête au premier 0 rencontré. Les valeurs suivantes sont ignorées par les fonctions dites 'de chaines de caractères', c'est à dire dont le comportement est basé sur ce principe.
printf(), les fonctions str*() etc.
S'agissant d'un tableau de char, c'est l'adresse du premier élément du tableau qui est passé aux fonctions. Le paramètre est donc de type char *.
Suite à cette Révélation, ton exercice devient plutôt simple : pour chaque élément du tableau de char (élément situé avant le premier '\0' rencontré), regarder si c'est un 'e'.Citation:
Envoyé par Emmanuel Delahaye
J'en profite pour te donner une Petite Révélation (deux grandes d'un coup, ça serait un peu dur ;)) : le premier élément d'un tableau se trouve à l'indice 0, et non à l'indice 1...
Salut,
Après la théorie la pratique! Rien de tel que d' apprendre par l' exemple.
Le pointeur constitue la quatrième révélation mystique.Code:
1
2
3
4
5
6
7
8
9
10
11 int nombre_de_e (char* a) { int nb=0; while (*a != '\0') { if (a[0]=='e') nb++; a++; } return nb; }
Rien de tel qu'apprendre par soi-même, c'est mieux je pense ;)Citation:
Envoyé par Lunixinclar
Vue la difficulté du truc, il aurait pu essayer de le faire lui-même. Enfin bon... ce n'est pas grave, on va dire que c'est ton cadeau de Noël ;)
Nas'
Comment ça il aurait pu? L'implémentation avec l' instruction for reste à faire.
Lunixinclar > tu aurais du modifier un pointeur local à la fonction sinon la chaine de départ est foutue.
8O La chaine de départ est inchangée. C'est le pointeur local qui a bougé...Citation:
Envoyé par minirop
Par contre j'aurais mis :
car il n'y a aucune raison de refuser les chaines constantes.Code:int nombre_de_e (char const* a)
Merci c'est gentil, mais il doit y avoir un possibilitée sans les pointeurs et les chaines de caractere puisque je ne les ai pas appris encore.
But de l'exo:
-faire saisir à l'utilisateur au plus 127 char, on prevoira un caractere de fin 'F' pour materialiser la fin souhaité de la saisie.
-Afficher à l'écran le nbre total de char saisie ainsi que:
Vous avez saisis "*" fois la lettre "a"
Vous avez saisis "*" fois la lettre "b"
Vous avez saisis "*" fois la lettre "c"
................................................
Vous avez saisis "*" fois la lettre "z"
Merci de m'aider ou même de me donner quelques indices.
Simple :Citation:
Envoyé par skulled
Code:
1
2
3
4
5
6 - Définition d'un tableau t de 26 cases (1 par lettre), pour les compteurs; - Faire - Saisie d'une lettre s; - Si s != 'F', t[la_bonne_case]++; Tant que s != 'F'; - Afficher le tableau.
pourrai tu m'eclaircir un plus stp au niveau des tableaux je n'ai pas bien compris.
Il faut 2 tableaux?
Qu'est ce que "s"? un tableau??...
Merci
Pour ma solution, il faut un seul tableau d'entiers, de 26 cases correspondant chacune à une lettre de l'alphabet (de 'a' à 'z').Citation:
Envoyé par skulled
Il faut aussi un caractère (type char en C). s est le caractère saisi par l'utilisateur.
L'algo consiste à lire la lettre saisie par l'utilisateur, et à incrémenter (i.e. ajouter 1) à la case du tableau qui correspond à cette lettre (la case 0 si la lettre est 'a', la case 1 pour la lettre 'b', etc.).
Voilà, tu devrais pouvoir écrire le code C correspondant assez facilement.
Et si tu crée deux tableaux:
Un contenant toutes les lettres de l'alphabet(TAB1) dans l'ordre et l'autre sera fait comme un histogramme(HISTO) de 26 cases logique vu qu'il y a 26 lettres......
Principe:
tu recuperes ta phrase saisit par l'utilisateur, tu compares les lettres une a une avec ton tableau TAB1. Quand tu trouves la lettre cherchée tu recuperes la position de celle ci et tu increment la case de HISTO[position] de 1.
A la fin tu fai afficher tes deux tableaux les un en dessous des autres et voila.....
Et voila fai en peu de temps donc a ameliorer mais dans le fond c est ca et y marche
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #include <stdlib.h> #include <conio.h> #include <math.h> #include <string.h> void main(void){ int histo[25]; char tab[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '\0'}; int i, j=0, taille; char ligne[2000]; char *c; for(i=0; i<25; i++) /* On initialise le tableau */ histo[i]=0; printf(" Rentrez la phrase a traiter \n"); scanf("%s", ligne); /* On recupere la ligne saisit */ taille=strlen(ligne); /* Calcule de la longueur */ c=ligne; /* On place le pointeur */ while(j<taille){ /* Boucle pour analyser chaque caractere */ for(i=0; i<25; i++){ if((c[j]==tab[i])){ histo[i]=histo[i]+1; /* Si on trouve le caractere on incremente HISTO */ break; } } j++; } for(i=0; i<25; i++){ /* Affichage */ printf("%d *", histo[i]); printf(" %c\n", tab[i]); } }
Est ce vous avez testez votre code?
Tapez une phrase où il y a des espace? ca ne marchera pas!!!
en plus, pourquoi inclure <math.h>!! et pourqoui
la fonction main doit en principe retourner int!!!!Code:void main(void)
Comme j'ai marqué j'ai fait ca vite fait en faisant des copier coller....
Et pour le void main(void) ya pas de soucis on peut le declarer comme ca, ca ne pose pas de probleme.
SI il ya des espaces je pense que la boucle se fera jusqu'a ce que le compteur arrive a terme et puis c'est tout...
Non : Le type retourné par main()Citation:
Envoyé par orj30754
Bon ton algo était correcte mais l'implémentation est à revoir :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #include <stdio.h> #include <string.h> #define MAX_SIZE 128 #define NB_ITEM(t) (sizeof (t) / sizeof *(t)) int main(void) { char tab[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; int histo[NB_ITEM (tab)] = {0}; char ligne[MAX_SIZE]; int i; int j; (void)printf ("Rentrez la phrase a traiter :\n"); if (fgets (ligne, sizeof (ligne), stdin)) { for (i = 0; ligne[i]; i++) { for (j = 0; j < NB_ITEM (tab); j++) { if (ligne[i] == tab[j]) { histo[j]++; break; } } } for(i = 0; i < NB_ITEM (tab); i++) { (void)printf ("%d *", histo[i]); (void)printf (" %c\n", tab[i]); } } return 0; }
:!: Achtung :!:Citation:
Envoyé par gege2061
Ce n'est pas du tout ce que j'ai conseillé maintes fois et qui est :
Qui fonctionne avec tous les tableaux.Code:
1
2#define NB_ITEM(tab) (sizeof (tab) / sizeof *(tab)) /* EDIT */
(attention à la place des parenthèses...)
Effectivement, c'est une erreur :oops: c'est corrigé ;)Citation:
Envoyé par Emmanuel Delahaye
Ce ne serait pas plutôt:
?Code:#define NB_ITEM(tab) (sizeof (tab) / sizeof *(tab))