Correction des erreurs

Fermé
Idriss SALL Messages postés 5 Date d'inscription samedi 11 janvier 2014 Statut Membre Dernière intervention 19 novembre 2014 - Modifié par Chris 94 le 8/05/2014 à 01:52
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 8 mai 2014 à 13:10
Bonjour,

je besoin d'un coup de pouce. En faite le programme s'execute mais le probleme se trouve vers l'affichage de resultat (ça ne donne pas le resultat voulu).

je vous remercie d'avance.

voici le code:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>


typedef struct
{
 int id,cpt;
 char Nom[20], Prenom[20];
}candidat;

typedef struct
{
 int nbrv,idc;
 char Nom[20];
}centre;


void creation(int nbca, int nbcen)
 {
    candidat ca[nbca];
    centre cen[nbcen];

  FILE *fca;
  FILE *vce;
  int i;
  fca=fopen("listcandidat.csv","w");
  vce=fopen("votecentre.csv","w");
  if(fca!=NULL)
  {
   for(i=0;i<nbca;i++)
        {
         printf("veuillez saisir le numero du candidat %d :",i+1);
         scanf("%d",&ca[i].id);
         ca[i].cpt=0;
         fflush(stdin);
         printf("veuillez saisir le Nom  du candidat       :");
   gets(ca[i].Nom);
   printf("veuillez saisir le Prenom du candidat     :");
   gets(ca[i].Prenom);
   puts(" ");
     }
  fwrite(ca,sizeof(candidat),nbca,fca);
   fclose(fca);
  }
  if(vce!=NULL)
   {
       puts("\n");
     for(i=0;i<nbcen;i++)
      {
        printf("veuillez saisir le numero du centre :");
        scanf("%d",&cen[i].idc);fflush(stdin);
        printf("veuillez saisir le Nom du centre :");
        gets(cen[i].Nom);
             printf("veuillez saisir le nombre des votants :");
        scanf("%d",&cen[i].nbrv);
        puts(" ");
      }
      fwrite(cen, sizeof(centre),nbcen,vce);
      fclose(vce);
   }

 }

 void tricandidat(int nbc,candidat ca[])//Sous programmes permettent de trie un tableau de type candidat
   {
             int k,h,cpt;
             candidat tmp;
    for(k=0;k<nbc-1;k++)
        {
           for(h=k+1;h<nbc;h++)
               {
                 if(ca[k].cpt>ca[h].cpt)
                     {
            tmp.cpt=ca[h].cpt;
            tmp.id=ca[h].id;
            strcpy(tmp.Nom,ca[h].Nom );
                     strcpy(tmp.Prenom,ca[h].Prenom );

                                 ca[h].id=ca[k].id;
            ca[h].cpt=ca[k].cpt;
            strcpy(ca[h].Nom,ca[k].Nom );
                     strcpy(ca[h].Prenom,ca[k].Prenom );

                     ca[k].cpt=tmp.id;
                     ca[k].cpt=tmp.cpt;
                     strcpy(ca[k].Nom,tmp.Nom );
                     strcpy(ca[k].Prenom,tmp.Prenom );

         }
               }

        }



   }


 void vote(int nbca,int nbcen)
 {
    candidat ca[nbca];
    centre cen[nbcen];
    int i,j,tmp,p,q;
    char nomfichier[20][20];
    FILE *fca;
  FILE *vce;
    FILE *fb,*fc;
    fc=fopen("resultcentre.csv","w");
  vce=fopen("votecentre.csv","r");
  puts("\n");
  if(vce!=NULL)
       {
     fread(cen, sizeof(centre),nbcen,vce);
     fclose(vce);

     for(j=0;j<nbcen;j++)
        {

            printf("Nom fichier de centre\n"); fflush(stdin);//fichier contenant le resultat par centre
            gets(nomfichier[j]);

            fca=fopen("listcandidat.csv","r");
     if(fca!=NULL)
       {

          fread(ca,sizeof(candidat),nbca,fca);
            }fclose(fca);

          fb=fopen(nomfichier[j],"w");

         while(cen[j].nbrv>1)
       {
                printf("l'identifiant du centre No%d\n",cen[j].idc);
                printf("les nombres des votants sont %d\n",cen[j].nbrv);
                printf("Le nom du centre est %s\n",cen[j].Nom);


                  for(i=0;i<nbca;i++)
                     {
                      printf("l'identifiant du candidat est %d\n",ca[i].id);
                  printf("Le nom est %s\n",ca[i].Nom);
                  printf("Le prenom est %s\n",ca[i].Prenom);

                       }
                    puts("\n");

                    //Votez
                    printf("Entrez le numero du candidat choisit\n");
                    scanf("%d",&tmp);

                    for(i=0;i<nbca;i++)
                     {
                          if(tmp==ca[i].id)
                           {
                             ca[i].cpt++;
                           }
                      }
          cen[j].nbrv--;
         }

         if(cen[j].nbrv==1)
          {
               int k;

       tricandidat(nbca,ca);

            printf("le resultat apres tri\n");

    for(k=0;k<nbca;k++)
      {
         printf("id cdd %d\n",ca[k].id);
         puts(ca[k].Nom);
         puts(ca[k].Prenom);


      }

             fwrite(ca,sizeof(candidat),nbca,fb);
             fclose(fb);
          }



        } fwrite(nomfichier,sizeof(char),nbcen,fc);
         fclose(fc);


      }
}

 void affiche(int nbc,candidat ca[])
      {
           int l;
            for(l=0;l<nbc;l++)
              {
               printf("Voici le resultat selon ordre merite ",l+1);
               printf(" le numero,le Nom et le Prenom sont:%d,%s,%s\n",ca[l].id,ca[l].Nom,ca[l].Prenom);


              }
      }

void resultat(int nbca, int nbcen)
   {
       candidat ca[nbca],result[nbca];
       centre cen[nbcen];
       char cenresult[nbcen][20];
       FILE *fc,*fd,*ff,*fcv;
       fc=fopen("resultcentre.csv","r"); //ok
       fcv=fopen("votecentre.csv","r"); //ok
       ff=fopen("resulfinal.csv","w"); //ok
      int i,j,k;
         fread(cenresult,sizeof(char),nbcen,fc);//le nom ts les fichiers bureau
          fclose(fc);
          fread(cen,sizeof(centre),nbcen,fcv);
          fclose(fcv);

      for(j=0;j<nbcen;j++)
        {

          fd=fopen(cenresult[j],"r"); //ok
          fread(ca,sizeof(candidat),nbca,fd);
          fclose(fd);
          if(j==0)
            {
              for(i=0;i<nbca;i++)
               {
                   result[i].id=ca[i].id;
                   result[i].cpt=ca[i].cpt;
        strcpy(result[i].Nom,ca[i].Nom );
        strcpy(result[i].Prenom,ca[i].Prenom );
              }
             }

             else
            {
              for(i=0;i<nbca;i++)
               {

               for(k=0;k<nbca;k++)
                 {
                    if(result[i].id=ca[k].id)
                     result[i].cpt=result[i].cpt+ca[k].cpt;

      }
             }
            }
          for(i=0;i<nbca;i++)
            {
             if(i==nbca-1)
               {
                printf("Vainqueur du centre N° %d\n",i+1);
                printf("Son identite est %d \t",ca[i].id);
                puts(ca[i].Prenom);
                puts(ca[i].Nom);
               }

            }
      }

       tricandidat(nbca,result);

       int l;
            for(l=0;l<nbca;l++)
              {
               printf("Voici le resultat selon ordre de merite ",l+1);
               printf(" le numero,le Nom,Prenom : %d,%s,%s\n",result[l].id,result[l].Nom,result[l].Prenom);
              }

       fwrite(result,sizeof(candidat),nbca,ff);
    fclose(ff);
   }


 main()
 {
  int nbca,nbcen;
  printf("veuillez saisir le nombre de centre   :");
  scanf("%d",&nbcen);
  printf("veuillez saisir le nombre de candidat :");
  scanf("%d",&nbca);
  puts("\n");
  creation(nbca,nbcen);
  vote(nbca,nbcen);
  resultat(nbca,nbcen);

 }



A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
8 mai 2014 à 13:10
Bonjour,

#include<conio.h>
Non standard. A ne pas mettre.

main()
Le bon prototype est : int main(void)
Et il ne faut pas oublier : return 0; en fin du main().

candidat ca[nbca];
centre cen[nbcen];

Correct mais déconseillé. Tu utilises un mécanisme apporté par la nouvelle norme. Donc il faut t'assurer que ton compilateur est compliant ISO C99 et respecte le VLA... Ou alors, et je te le conseille, tu utilises les pointeurs et les alloues avec un malloc() => Ca sera plus portable.
Pareil pour les lignes similaires.

fflush(stdin);
Comportement non défini. A ne pas utiliser. Si tu veux vider le buffer clavier, il faut ce faire la fonction soi-même (utilisation de while getchar() sur EOF ou '\n').

gets(ca[i].Nom);
Fonction obsolète. A ne pas utiliser. Utilise plutôt fgets(). Attention, cela met un '\n' dans la variable. A toi de voir si tu souhaites la supprimer ou la garder. Pour la supprimer il suffit de le remplacer par un '\0' (strchr()).

Voilà pour les erreurs qui m'ont sauté aux yeux. Corrige déjà tout ça et reposte ton code en uniformisant l'indentation si possible.

Cdlt,
1