Projet bloquer
baptous
-
paly2 Messages postés 254 Date d'inscription Statut Membre Dernière intervention -
paly2 Messages postés 254 Date d'inscription Statut Membre Dernière intervention -
Bonjour j'ai comme projet ( a faire dans mes études ) de crée un programme qui analyse un texte qui a pour but de:
-calculer le nombre de mots
-déterminer la longueur moyenne des mots
-donner l'occurence d'un mot choisit
- afficher la liste des mots répétés ( il me reste que cette partie a faire mais je n'y arrive point )
avec ce programme j'ai du y joindre un texte plutot une poésie.
voici mon programme
En espérant que vous puissiez m'aider, merci d'avance
-calculer le nombre de mots
-déterminer la longueur moyenne des mots
-donner l'occurence d'un mot choisit
- afficher la liste des mots répétés ( il me reste que cette partie a faire mais je n'y arrive point )
avec ce programme j'ai du y joindre un texte plutot une poésie.
voici mon programme
#include <stdio.h> #include <stdlib.h> #include <string.h> char *lire_mot (); main() { char texte [500]; char mot [256],c; int n,i,l,oc,s,nbmots; float m ; FILE *f; char *token; //f=fopen("H:\\BUREAUTIQUE\\poesieminiprojet.txt","r"); //f=fopen ("\\Ordinateur\\miniprojet\\poesieminiprojet.txt","r"); f=fopen ("C:\\miniprojet\\poesieminiprojet.txt","r"); if (f==NULL) { printf("Probleme fichier non trouvé"); return(1); } n=fread(texte,sizeof(char),400,f); if (n<400) { printf("Probleme"); return(1); } texte[400]='\0'; fclose(f); //printf("%s",texte); printf( "=====================\n"); /* get the first token */ token = strtok(texte, " " ); /* walk through other tokens */ oc=0; s=0; n=0; while( token != NULL ) { l=strlen(token); printf( "%s (%d)\n", token ,l); token = strtok(NULL, " "); if (token==NULL) { continue; } //printf( "===================== \n"); /* //gets(texte); n=1; strcpy (mot,lire_mot(token,n)); s=0; oc = 0; */ char *motchoisit = "les"; if (strcmp(token,motchoisit)==0) { oc++; } s=s+l; n++; } printf( ">>>>>>>>>>>>>>>\n"); nbmots = n-1; m = 1.*s/nbmots; printf ("\n n %d", nbmots); printf ("\n s %d ", s); printf ("\n m %f", m); //printf ("\n s/n %d %d", s,nbmots); printf ("\n oc %d",oc); return 0; }
En espérant que vous puissiez m'aider, merci d'avance
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- Projet bloquer
- Bloquer pub youtube - Accueil - Streaming
- Filigrane projet - Guide
- Bloquer sur messenger - Guide
- Comment savoir si on est bloqué sur Messenger ou Facebook ? - Guide
- Gant projet - Télécharger - Gestion de projets
1 réponse
Je n'ai pas testé le programme, et je ne comprends pas tout à fait ce que tu veux comme aide.
Néanmoins, il y a plusieurs petits trucs que j'ai pu voir en parcourant le programme des yeux (peut-être que certains sont donc faux) :
Lignes 10-15 : tu n'initialises aucune variable ici, par conséquent tu dois le faire par la suite... C'est assez déconseillé. Tu pourrais faire quelque chose comme :
Si tu fais ceci, tu te mets à l'abris de pas mal de bugs et tu peux supprimer les lignes 42-43 (mais pas la ligne 44 vu que tu as déjà utilisé n avant et que tu dois donc le réinitialiser. Essaie d'ailleurs d'uiliser des variables différentes, on n'est pas à 4 octets de mémoire près).
Lignes 49-52: Ces lignes doivent se trouver à la fin de la boucle, puisque tu utilises token par la suite dans la boucle. De plus, des mots ne sont pas séparés que par des espaces et peuvent aussi être séparés par de la ponctuation. Je te proposes donc de donner, comme second argument à la fonction strtok, quelque chose comme " ,;?!:'()" (ce qui est aussi valable ligne 39).
Lignes 25-31: Ton tableau texte fait 500 cases... Pourquoi se limiter à 400 dans le fread ? Puis, fread peut retourner moins de 400 si le texte fait, tout simplement, moins de 400 caractères. Le test d'erreur doit donc se faire avec la valeur 0. Ensuite, si le texte fait moins de 400 caractères, le caractère '\0' doit se retrouver tout de même à la fin du texte. Je te propose donc ce code :
Ligne 73: Pourquoi n-1 ? Ce serait plutot n+1, non ? Et si tu initialises ta variable n à 1 plutôt qu'à 0, tu n'as même plus besoin de la variable nbmots et tu peux directement utiliser n comme le nombre de mots.
Ligne 63: Tu ne peux pas initialiser motchoisit à "les" parce que motchoisit n'est pas une chaîne de caractères, mais un pointeur ! Il faut donc faire:
Ligne 74: Pourquoi 1.*s et pas tout simplement s ??
Peut-être qu'il y a d'autres erreurs (je répète que je n'ai pas testé le programme).
En espérant que cela t'aidera,
paly2
Néanmoins, il y a plusieurs petits trucs que j'ai pu voir en parcourant le programme des yeux (peut-être que certains sont donc faux) :
Lignes 10-15 : tu n'initialises aucune variable ici, par conséquent tu dois le faire par la suite... C'est assez déconseillé. Tu pourrais faire quelque chose comme :
char texte[500] = "", mot[256] = ""; char c = 0; int n = 0, i = 0, l = 0, oc = 0, s = 0, nbmots = 0; float m = 0; FILE *f = NULL; char *token = NULL;
Si tu fais ceci, tu te mets à l'abris de pas mal de bugs et tu peux supprimer les lignes 42-43 (mais pas la ligne 44 vu que tu as déjà utilisé n avant et que tu dois donc le réinitialiser. Essaie d'ailleurs d'uiliser des variables différentes, on n'est pas à 4 octets de mémoire près).
Lignes 49-52: Ces lignes doivent se trouver à la fin de la boucle, puisque tu utilises token par la suite dans la boucle. De plus, des mots ne sont pas séparés que par des espaces et peuvent aussi être séparés par de la ponctuation. Je te proposes donc de donner, comme second argument à la fonction strtok, quelque chose comme " ,;?!:'()" (ce qui est aussi valable ligne 39).
Lignes 25-31: Ton tableau texte fait 500 cases... Pourquoi se limiter à 400 dans le fread ? Puis, fread peut retourner moins de 400 si le texte fait, tout simplement, moins de 400 caractères. Le test d'erreur doit donc se faire avec la valeur 0. Ensuite, si le texte fait moins de 400 caractères, le caractère '\0' doit se retrouver tout de même à la fin du texte. Je te propose donc ce code :
n = fread(texte, sizeof(char), 499, f); if (n == 0) { printf("Probleme\n"); return(1); } texte[n] = '\0';
Ligne 73: Pourquoi n-1 ? Ce serait plutot n+1, non ? Et si tu initialises ta variable n à 1 plutôt qu'à 0, tu n'as même plus besoin de la variable nbmots et tu peux directement utiliser n comme le nombre de mots.
Ligne 63: Tu ne peux pas initialiser motchoisit à "les" parce que motchoisit n'est pas une chaîne de caractères, mais un pointeur ! Il faut donc faire:
char motchoisit[] = "les";
Ligne 74: Pourquoi 1.*s et pas tout simplement s ??
Peut-être qu'il y a d'autres erreurs (je répète que je n'ai pas testé le programme).
En espérant que cela t'aidera,
paly2
N'oublie pas que ceci multiplierait beaucoup le temps que prendrait l'exécution de ton programme, même si pour un petit texte de 500 caractères tu ne verras sans doute pas la différence (en revanche, pour un gros texte d'un million de caractères...).
Par rapport a ce que vous me dites a la toute fin je dois faire quoi avec strtok pour en faire l'affichage de liste des mots répétés?
Les deux boucles utilisent donc strtok, mais strtok ne peut fonctionner que sur une chaîne à la fois (si on rappelle strtok avec autre chose que NULL en premier paramètre, on perd l'endroit où on était avec la chaîne précédente).
Du coup, il existe une autre fonction, strtok_r, qui permet de gérer plusieurs chaînes en même temps.
Ce code d'exemple devrait fonctionner (à vérifier tout de même) :
Par contre cette fonction n'est pas un standard du C, et peut-etre qu'elle n'existe pas sous Windows (en tout cas elle existe sous GNU/Linux).
char mots[250][100];
int countMots[250];
while( token != NULL )
{
char motCurrent = realloc(token, 100 * sizeof(char));
for (int i = 0; i < 250; i++);
{
if (mots[i] == NULL)
{
mots[i] = motCurrent;
countMots[i] = 1;
break;
}
if(strcmp(mots[i], motCurrent) == 0)
{
countMots[i]++;
break;
}
}
}
Mais il me découvrir 2erreurs une avec le char 100 il me dit erreur d'incompatibilité de type et une au for
De plus, tu as mis un point-virgule à la fin de la ligne de ton for. Pour le compilateur, cela veut dire qu'il n'y a pas de bloc délimité par des accolades après le for, d'où la raison probable de ton erreur (puisqu'il y a quand même des accolades).
Mais je ne comprends pas trop ce que tu veux faire avec ton code... Essaie peut-être quelque chose comme ça :
Code à mettre avant ta boucle :
Code à mettre dans ta boucle:
Je n'ai pas testé le code ci-dessus, verifie donc qu'il ne contient pas d'erreurs.
En effet, si tu fais comme ceci, tu peux tout à fait garder strtok dans ta boucle comme tu le faisais.