Se connecter avec
S'enregistrer | Connectez-vous

Comptez les occurences des lettres dans un fichier

Dernière réponse : dans Programmation

Coucou c'est encore moi. J'ai encore un souci, plus leger que le precedent mais bon.
Alors voila je dois chercher le nombre de chaque lettre dans un fichier. Mon programme marche à moitié puisqu'il ne compte que les A et ne continu plus. Je comprend pas pourquoi.
Voici le programme en question:

  1. for(c='a';c<='z';c++)
  2. {
  3. cpt=0;
  4. while (!fdf(flot))
  5. {
  6. p=strchr(consulter(flot),c); // retourne une adresse
  7.  
  8. if (p!=(char*)NULL)
  9. {
  10. cpt++;
  11. p++;
  12. p=strchr(p,c);
  13. prendre(flot);
  14. }
  15. else prendre(flot); //passe à la lettre suivante
  16. }
  17. if(cpt>0)
  18. {
  19. printf("Le nombre d'occurence de %c = %d\n",c,cpt);
  20. }
  21. }


Voila merci d'avance pour votre aide
@+
PS: je suis à disposition pour d'éventuelles questions
Lassé par la pub ? Créez un compte

c'est sur, et tu peux surement optimiser la chose :
tu crée un tableau de correspondance lettre<->nombre_trouve
tant que t'est pas à la fin de ton fichier, tu parcours tout ton fichier, lettre à lettre. si ton caractere est une lettre, tu incrémente le nombre pour celle ci(dans le tableau donc)
et enfin pour chaque element(donc lettre) de ton tableau tu connaitra le nombre


PS : pour ton 'algo' actuel : vire prendre(flot) dans ton if, et vire le mot ELSE :

if (p!=(char*)NULL){
cpt++;
p++;
p=strchr(p,c);
}
prendre(flot);

ca fait la meme chose avec une ligne de moins

Ben pour moi il se remet tout le temps au debut du fichier mais c'est vrai que l'erreur vient surement de là.
Erf le problème c'est que j'essai mais j'arrive pas.
J'ai essayé d'ouvrir le fichier à chaque for et de le fermer à la fin du for mais ca marche toujours pas.
Une idée de comment faire ?
Et merci déjà

stan876 a écritBen pour moi il se remet tout le temps au debut du fichier mais c'est vrai que l'erreur vient surement de là.
Erf le problème c'est que j'essai mais j'arrive pas.
J'ai essayé d'ouvrir le fichier à chaque for et de le fermer à la fin du for mais ca marche toujours pas.
Une idée de comment faire ?
Et merci déjà

t'as essayé ma proposition? une seule ouverture necessaire, c'est suremenet bcp plus rapide

Oui donc je sais que le a correspond à 97 et que le z correspond à 122. Mais comment le compilateur va comprendre que je parle du code du a,b,etc..
Je peux pas faire de for (c='97';c='122';c++) alors je fais comment ?

Bon alors j'ai fait comme tu m'as dit KangOl mais ça marche toujours pas. Il me compte que les a. Le probleme vient donc qu'il ne reparcours pas le fichier plus d'une fois. Mais je sais pas comment faire. J'ai essayé d'ouvrir le fichier et de le fermer dans le for comme ça il est obligé de la parcourer mais ça veut pas marcher.
Sinon pour ta proposition didiboy ça marche niquel mais ça m'avance pas trop, c'est juste pour optimiser :)  mais merci quand même.
Allez si vous pouvez me dire comment parcourir le fichier plus d'une fois ça serait cool. Merci les gens @+

donc faut
ouvrir le fichier
pour chaque lettre
se placer au debut du fichier
reinitialiser compteur a zero
pour chaque caractere du fichier
si caractere = lettre en cour
incrementer compteur
finpour
afficher compteur
finpour
fermer fichier

Le probleme de ton truc c'est que quand tu dis "si caractere = lettre en cours" je sais pas le faire. Je m'explique dans mon cas ça donnerai if(c==consulter(flot))
Le probleme c'est que ma fonction consulter a le prototype suivant:
void *consulter(Flot flot)
Il y a donc un souci car je compare un void* avec un caractère et ça le compilateur il aime pas :( 
Donc voila. Sinon moi je propose un truc du style, surement moins bien mais dis moi ce que tu en penses


pour chaque lettre
ouvrir le fichier
reinitialiser compteur a zero
si caractere = lettre en cour
incrementer compteur
finsi
afficher compteur
fermer fichier
finpour


Alors? :) 

Ok j'ai fait une recherche et je dois dire que c'est pas mal. Mais je tiens aussi à dire que j'ai jamais vu ça. Enfin j'ai appris un truc sympa là merci même si j'arrive toujours pas à calculer les occurences de chaque lettre :( 

Ton algo est proche de celui d'un calcul d'histographe dans une image il ne faut biensur pas reparcourrir ton fichier pour chaque lettre. Il suffit de créer un tableau contenant des compteur que tu increment pour chaque lettre rencontré:
  1. unsigned int tab[255]; //declaration du tableau
  2. init(tab); //initialise le tableau à zero
  3. while( c = lireFichier() ) { //Parcour le fichier
  4. tab[ c ]++; //Increment le tableau pour le caractere 'c'
  5. }
  6. //Le tableau contient le nmobre de chaque caractere trouvé
  7. show( tab );

dark_ange a dit :
Coucou c'est encore moi. J'ai encore un souci, plus leger que le precedent mais bon.
Alors voila je dois chercher le nombre de chaque lettre dans un fichier. Mon programme marche à moitié puisqu'il ne compte que les A et ne continu plus. Je comprend pas pourquoi.
Lassé par la pub ? Créez un compte