ryder0007
Messages postés6Date d'inscriptionmercredi 13 décembre 2006StatutMembreDernière intervention 8 mars 2011
-
8 mars 2011 à 18:08
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
9 mars 2011 à 17:24
Bonjour,
Voila j'ai terminer de programmer mon premier programme et je voudrais savoir ce que vous en pensez. Il permet de compter le nombre de caracters,le nombre de caracters sans espace ,le nombre de paragraphe et le nombre de mots
#include <stdio.h>
#include <stdlib.h>
void analyse(char *contenu,int size,int & ncaracter,int & ncaracter_,int & nparagraphe,int & nmot)//fonction permettant de calculer le nombre de caracter,de caracters sans espaces,le nombre de paragraphe
//et le nombre de mot contenu dans le tableau pointé par contenu
{
int i=0;
int valide=1,valide2=1;
while(i<size)
{
if(contenu[i]=='\0')
{
return;
}
int file_size(FILE *file)//fonction permettant de calculer la taille d'un fichier text
{
fseek(file,SEEK_END,SEEK_END);
int size=ftell(file);
fseek(file,0,0);
return size;
}
int main(int argc,char *argv[])
{
char *contenu;
int size;
int ncaracter,ncaracter_,nparagraphe,nmot;
FILE *file=fopen(argv[1],"r");
size=file_size(file);
printf("Analyse du fichier %s...\nTaille :%i octets\n",argv[1],size);
contenu=(char*)malloc(sizeof(char)*size);
fread(contenu,size,1,file);
ncaracter=0;ncaracter_=0,nparagraphe=1,nmot=0;
analyse(contenu,size,ncaracter,ncaracter_,nparagraphe,nmot);
printf("Nombre de caracter: %i\nNombre de caracter sans espace :%i\nNombre de paragraphes: %i\nNombre de mot:%i\n",ncaracter,ncaracter_,nparagraphe,nmot);
return 0;
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 9 mars 2011 à 17:22
- Attention: Tu utilises un compilateur C++ pour faire du C ! (Si tu as Dev-C++, jette-le !)
* "malloc" n'a pas besoin d'être casté
* Le '&' dans un argument de fonction n'existe pas. Il est apparu avec le C++.
- Il y a beaucoup de lourdeur de code. Il est possible de se passer des variables valide et valide2.
- Tu oublies parfois de tester l'existence d'un élément dans le tableau. Par exemple: "if(contenu[i+2]!='\n' && contenu[i+2]!=' ')", et si "i + 2 > size" ?
- Tu dois tester que tu as bien tous les arguments quand tu utilises argc et argv
- Tu dois tester la réussite de l'ouverture du fichier.
Je te propose la version suivante (en espérant ne pas avoir fait d'erreur). Elle gère aussi le nombre de ligne.
#include <stdio.h>
#include <stdlib.h>
void analyse(const char* contenu, int* ncaracter,int* ncaracter_, int* nparagraphe, int* nmot, int* ligne)
{
/* Tant qu'il reste des caractères à lire */
while (contenu && *contenu)
{
/* On est sur une lettre, donc on est sur un mot */
if (*contenu && *contenu != ' ' && *contenu != '\n')
++*nmot;
/* On va jusqu'à la fin du mot courant */
while (*contenu && *contenu != ' ' && *contenu != '\n')
{
++*ncaracter_;
++*ncaracter;
++contenu;
}
/* On saute les espace et sauts de ligne, jusqu'à atteindre le prochain mot */
while (*contenu && (*contenu ' ' || *contenu '\n'))
{
/* 3 espaces à la suite => c'est un paragraphe */
if (*contenu '\n' && *(contenu + 1) && *(contenu + 1) '\n' &&
*(contenu + 2) && *(contenu + 2) == '\n')
{
++*nparagraphe;
*ligne += 3;
*ncaracter += 3;
contenu += 3;
}
else
{
if (*contenu == '\n')
++*ligne;
++*ncaracter;
++contenu;
}
}
}
}
int file_size(FILE* file)
{
int size = 0;
fseek(file,SEEK_END,SEEK_END);
size = ftell(file);
fseek(file, 0, 0);
return size;
}
int main(int argc,char *argv[])
{
char* contenu = 0;
int size = 0;
int ncaracter = 0;
int ncaracter_ = 0;
int nparagraphe = 0;
int nmot = 0;
int ligne = 0;
FILE* file;
if (argc < 2)
{
printf("Usage: %s fichier\n", argv[0]);
return 1;
}
file = fopen(argv[1], "r");
if (!file)
{
printf("%s: can't open\n", argv[1]);
return 2;
}
size = file_size(file);
printf("Analyse du fichier %s...\nTaille :%i octets\n", argv[1], size);
contenu = malloc(sizeof(char) * size);
fread(contenu, size, 1, file);
fclose(file);
analyse(contenu, &ncaracter, &ncaracter_, &nparagraphe, &nmot, &ligne);
printf("Nombre de caracter: %i\n"
"Nombre de caracter sans espace :%i\n"
"Nombre de paragraphes: %i\n"
"Nombre de mot: %i\n"
"Nombre de ligne: %i\n", ncaracter, ncaracter_, nparagraphe, nmot, ligne);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 9 mars 2011 à 17:24
Petite erreur de commentaire. Remplacez:
/* 3 espaces à la suite => c'est un paragraphe */
Par:
/* 3 sauts de ligne à la suite => c'est un paragraphe */
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question