Se connecter / S'enregistrer
Votre question

Recherche de voyelles dans un fichier?

Tags :
  • Programmation
Dernière réponse : dans Programmation
17 Avril 2010 13:27:00

Bonjour a tous :) 

Pourquoi mon code ne trouve pas tout les voyelles qui se trouve dans mon texte ?

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #define TAILLE_MAX 1000
  4.  
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8.  
  9. char voy[6] = {'a','e','i','o','u','y'};
  10. int compte[6] = {0}, i;
  11. FILE* fichier = NULL;
  12. char chaine[TAILLE_MAX] = "";
  13.  
  14. if ((fichier = fopen("test.txt", "r")) != NULL)
  15. {
  16. while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
  17. {
  18. for(i = 0; i < 6; i++)
  19. if(chaine[i] == voy[i])
  20. compte[i] = compte[i] + 1; // On affiche la chaîne qu'on vient de lire
  21. }
  22.  
  23. printf("Votre texte comporte :\n");
  24. for(i = 0; i < 6; i++)
  25. printf("%d fois la lettre %c\n", compte[i], voy[i]);
  26.  
  27. fclose(fichier);
  28. }
  29.  
  30. return 0;
  31. }

Autres pages sur : recherche voyelles fichier

a b L Programmation
17 Avril 2010 15:55:51

Peux-tu indenter ton code ?
m
0
l
a c 232 L Programmation
18 Avril 2010 00:09:44

je t'ai fait ça ;) 
m
0
l
Contenus similaires
a b L Programmation
18 Avril 2010 11:52:51

Merci. ;) 

  1. int compte[6] = {0}

Ici, tu n'initialises que la première valeur, donc il faut mettre {0,0,0,0,0,0}, ou faire un memset.

Ensuite il te faut 3 boucles imbriquées:
- une qui lit les lignes du fichier (ton while avec fgets)
- une qui boucle sur tous les caractères de la ligne, pour chaque ligne
- une qui boucle sur tes voyelles pour chaque caractère

Toi, tu n'en a fait que 2 avec ton for. Si tu regardes en debug, tu devrais voir ceci:
- test du 1er caractère avec 'a'
- test du 2eme caractère avec 'e'
- test du 3eme caractère avec 'i'
- test du 4eme caractère avec 'o'
- test du 5eme caractère avec 'u'
- test du 6eme caractère avec 'y'
- passage à la ligne suivante
Donc, tu ne testes que les 6 premiers caractères et tu ne compares qu'une seule voyelle pour chaque caractère

m
0
l
18 Avril 2010 16:19:45

Merci

En mettant qu'un {0} j'initialise tout mon tableau a zéro :) 


Juste pour comprendre.. dans mon 1er code ( là ou se trouve l'erreur)

  1. for(i = 0; i < 6; i++)
  2. if(chaine[i] == voy[i])
  3. compte[i] = compte[i] + 1;


j'ai :

lecture de la 1er ligne

chaine[0] == voy[0]
chaine[1] == voy[1]
...
chaine[5] == voy[5]

mais à la lecture de la 2eme ligne la valeur de i revient à 0 ? (car a la fin de la lecture de la 1ere ligne i =5)
m
0
l
a b L Programmation
18 Avril 2010 16:35:31

Citation :
En mettant qu'un {0} j'initialise tout mon tableau a zéro :) 

Non, c'est faux, tu n'initialises que la première valeur.
Après tu dois avoir la chance que tout soit initialisé à 0.

Oui 'i' revient à 0 car tu refais une nouvelle boucle (tu refais l'initialisiton du for: i=0).
m
0
l
18 Avril 2010 17:19:09

Citation :
Citation cour du siteduzéro :
Comment initialiser tout le tableau à 0 ?
Eh bien, il vous suffit d'initialiser au moins la première valeur à 0, et toutes les autres valeurs non indiquées prendront la valeur 0 :) 

  1. int tableau[4] = {0}; // Toutes les cases du tableau seront initialisées à 0



Cette technique a l'avantage de fonctionner avec un tableau de n'importe quelle taille (là ça marche pour 4 cases, mais s'il en avait eu 100 ça aurait été bon aussi ;)  )


http://www.siteduzero.com/tutoriel-3-14015-les-tableaux...
m
0
l
a b L Programmation
18 Avril 2010 21:38:32

J'ai regardé ce que dit la norme C99 pour être sûr (6.7.8 Initialization). Quelques extraits (point 10 et 21):
Citation :
10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.


Citation :
21 If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.


Donc, effectivement, ils ont prévus le cas de l'initialisation incomplète.
Si c'est plus petit (point 21), ça met bien à 0 (2ème cas du point 10).
Par contre si tu veux tout initialiser à -1, il te faut mettre -1 partout.

Même s'il ne le dit pas, ton extrait peut faire comprendre que la suite sera initialisé par la même valeur, mais c'est bien 0 quelque soit la première valeur. Tu peux leur suggérer que leur formulation est dangereuse ;) 
m
0
l
19 Avril 2010 12:55:27

merci a vous..
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS