Premier prog

ryder0007 Messages postés 6 Date d'inscription mercredi 13 décembre 2006 Statut Membre Dernière intervention 8 mars 2011 - 8 mars 2011 à 18:08
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 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;
}

valide=1;
valide2=1;
if(contenu[i]==' ')
{
valide=0;
valide2=1;
if(contenu[i+1]!=' ')
{
nmot++;
}
}
else if(contenu[i]=='\n')
{
valide=0;
valide2=0;
if(contenu[i+1]== '\n')
{
if(contenu[i+2]!='\n' && contenu[i+2]!=' ')
{
nparagraphe++;
}
}
else
{
if(contenu[i+1]!=' ')
{
nmot++;
}
}
}
if(valide)
{
ncaracter_++;
}
if(valide2)
{
ncaracter++;
}
i++;
}
}

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;
}

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous