Premier prog

Signaler
Messages postés
6
Date d'inscription
mercredi 13 décembre 2006
Statut
Membre
Dernière intervention
8 mars 2011
-
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
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

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
- 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
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
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