Recherche de voyelles dans un fichier - C - Programmation
Marsh Posté le 17-04-2010 à 15:28:05
- tu ne regardes que les 6 premiers caractères de chaque ligne lue
- tu ne compares chacun de ces caractères qu'avec une seule voyelle
En prime,
- les constantes magiques comme 6, c'est mal
- l'indentation aléatoire
Marsh Posté le 17-04-2010 à 15:53:41
- regarder chaque caractère de tes lignes
- les comparer avec toutes les voyelles
- définir un nom symbolique et l'utiliser à la place de 6
- indenter correctement
Marsh Posté le 17-04-2010 à 15:55:17
Quand tu fais
for(i = 0; i < 6; i++)
if(chaine[i] == voy[i])
tu testes seulement si le i-eme caractère de la chaine est la i-eme voyelle au lieu de tester si chaque caractère de la chaine est la i-me voyelle.
En modifiant un peu ton code ceci marche:
Code :
|
Une version un peu plus évoluée, qui teste aussi les majuscules:
Code :
|
La même chose avec un switch:
Code :
|
A+,
Marsh Posté le 17-04-2010 à 18:12:55
gilou a écrit :
|
Mouais. tolower() aurait été ici assez approprié...
Code :
|
Là où on s'amuserait, ce serait pour tester les é, è, ê, ë, î, ï, ...
Marsh Posté le 17-04-2010 à 18:26:54
En effet. ça serait surtout approprié dans le switch (buffer[i])
un switch (tolower(buffer[i])) permet de virer la moitié des cases du switch.
De toute façon, si j'avais vraiment codé cela en dehors d'une amélioration du code donné, j'aurais introduit une structure de donnée struct avec un champ lettre et un champ compte, car c'est ce que suggère le problème.
A+,
Marsh Posté le 17-04-2010 à 18:45:25
gilou a écrit : De toute façon, si j'avais vraiment codé cela en dehors d'une amélioration du code donné, j'aurais introduit une structure de donnée struct avec un champ lettre et un champ compte, car c'est ce que suggère le problème. |
Voire même un champ "tableau de lettres" associé au champ compte ce qui permet ainsi de compter les é, è, ê comme la même lettre...
Marsh Posté le 17-04-2010 à 19:16:04
Je ferais plutôt cela au niveau d'une fonction dédiée mytolower, car ça risque de compliquer l'algorithmique d'un exo a la base simple, mais c'est une question de gout.
Et on peut vite arriver aux questions métaphysiques: si on compte aussi les consonnes, un ß compte t'il pour deux s? etc
A+,
Marsh Posté le 17-04-2010 à 19:35:05
Merci gilou c'est ok
Si j'ai compris mon 1er code test que les 6 premiers caractères sur 1000 c'est ça ou pas?
Code :
|
PS: Tu utilise for (i = 0; i <strlen(chaine); i++) mais je peut mettre aussi for (i = 0; i <TAILLE_MAX; i++) ?
Marsh Posté le 17-04-2010 à 19:53:22
lassault1 a écrit : Merci gilou c'est ok
|
Même pas: ton code teste si le premier caractère est 'a', si le 2e est 'e', si le 3e est 'i'... et si le 6e est 'y'.
lassault1 a écrit : PS: Tu utilise for (i = 0; i <strlen(chaine); i++) mais je peut mettre aussi for (i = 0; i <TAILLE_MAX; i++) ? |
Surtout pas: si la ligne lue par fgets et copiée dans chaine fait moins que TAILLE_MAX caractères tu vas continuer a tester pour des caractères qui trainent dans le reste du tableau chaine, mais qui n'ont pas été mis la par fgets.
C'est a ça que sert la limitation i <strlen(chaine): a ne tester que les caractères effectivement copiés par fgets.
fgets met un '\0' a la fin de ce qu'il copie, et c'est ce que détecte strlen pour calculer la bonne longueur.
A+,
Marsh Posté le 17-04-2010 à 20:15:41
Citation : Même pas: ton code teste si le premier caractère est 'a', si le 2e est 'e', si le 3e est 'i'... et si le 6e est 'y'. |
C'est pas ce que j'ai dis ?
Citation : Surtout pas: si la ligne lue par fgets et copiée dans chaine fait moins que TAILLE_MAX caractères tu vas continuer a tester pour des caractères qui trainent dans le reste du tableau chaine, mais qui n'ont pas été mis la par fgets. |
Ok ! dans ce cas strlen(chaine) sert a optimisé la boucle ?
Marsh Posté le 17-04-2010 à 20:26:08
Non, à la rendre correcte. Si par hasard (ou parce que la ligne précédente était plus longue) il y a une voyelle après la fin de la ligne, tu la compterais.
Pour optimiser, il vaut mieux ne calculer strlen qu'une fois en stockant le résultat dans une variable, ce qu'avait fait Gilou dans une de ses versions.
Marsh Posté le 17-04-2010 à 20:59:15
lassault1 a écrit :
|
Non, ce que tu as dit, que tu testes seulement les 6 premier caracteres, ca signifierait que ton code teste si le premier caractère est 'a',ou 'e', ou 'i'... ou 'y', puis qu'il teste si le 2e caractère est 'a',ou 'e', ou 'i'... ou 'y', ... puis qu'il teste si le 6e caractère est 'a',ou 'e', ou 'i'... ou 'y'.
A+,
Marsh Posté le 21-04-2010 à 00:09:15
Code :
|
Pourquoi pas avoir mis tout simplement for(i = 0; i < sizeof(chaine); i++) au lieu de :
Code :
|
Marsh Posté le 21-04-2010 à 03:04:52
Parce que sur un tableau, sizeof d'un tableau, ca renvoie le nombre total de cases, ca se fout complètement de la position du \0 dans le tableau.
Exemple:
char chaine[8] = "Toto"; ca mt les caractères T, o, t, o et \0 en position 0, 1, 2, 3 et 4 du tableau.
sizeof(chaine) vaut 8, mais strlen(chaine) vaut 4 (4 caractères avant le \0)
A+,
Marsh Posté le 17-04-2010 à 13:18:50
Bonjour a tous
Pourquoi mon code ne trouve pas tout les voyelles qui se trouve dans mon texte ?