Aidez moi pour un programme en C

Résolu
stephe8 Messages postés 65 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 24 octobre 2009 - 20 févr. 2009 à 19:57
stephe8 Messages postés 65 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 24 octobre 2009 - 22 févr. 2009 à 00:48
bjr
j'ai un programme qui s'execute mais ne donne rien,ce programme c'est de lire deux tableaux a partir de deux fichier
 ces tableaux sont triés lun decroissant et l'autre croissant et je veux stocké le total dans un autre fichier (c-a-d faire la fusion du deux tableau de tel sort quel soit trié croissant )
voila mon programme
corrigé le svp ou bien donnez moi des conseils
#include<stdio.h>
#include<conio.h>


main()
{
      FILE* fichierA;
      FILE* fichierB;
      FILE* fichierC;
     
      int A[50],C[100],B[50];
      int i,j,k;
      int dimA,dimB;
      dimA=A[0];
      dimB=B[0];
     
      clrscr();
     
     
      fichierA=fopen("fichierA.TXT", "r");
      fichierB=fopen("fichierB.TXT", "r");
      fichierC=fopen("fichierC.TXT", "w");
     
     
      fscanf(fichierA,"%d",&dimA);
      printf("la dimension du tab A est %d\n",dimA);
      for(i=0;i<dimA;i++)
      {fscanf(fichierA,"%d",&A[i]);}
      for(i=0;i<dimA;i++)
   
     
      fscanf(fichierB,"%d",&dimB);
      printf("la dimension du tab B est %d\n",dimB);
      for(j=0;j<dimB;j++)
      fscanf(fichierA,"%d",&B[j]);
     
 
    
         
     
      fscanf(fichierB,"%d",&dimB);
      fscanf(fichierA,"%d",&dimA);
      {for(i=0;i<dimA+dimB;i++)
      C[i]=0;}
     
     
      fscanf(fichierB,"%d",&dimB);
      fscanf(fichierA,"%d",&dimA);
      i=0;
      j=dimB-1;
      while((i<dimA)&&(i<dimB))
      {
                 fscanf(fichierB,"%d",&B[j]);
                 fscanf(fichierA,"%d",&A[i]);  
                 if(A[i]<B[j])
                 { C[k]=A[i];
                              i++;
                              k++;
                              }
                 else { 
                              C[k]=B[j];
                              j--;
                              k++;
                 }
      }
     
     
      i=0;
      fscanf(fichierA,"%d",&dimA);
      while(i<dimA)
      {                      C[k]=A[i];
                              i++;
                              k++;
                  }
                 
      fscanf(fichierB,"%d",&dimB);
      j=dimB-1;
      while(j<dimB)
      {                      C[k]=A[j];
                              j--;
                              k++;
                  }
               
               
               


      fscanf(fichierB,"%d",&dimB);
      fscanf(fichierA,"%d",&dimA);       
         for(k=0;k<dimB+dimA;k++)  
         {
  fprintf(fichierC,"%d",C[k]);
  }
        
         fclose(fichierA);
         fclose(fichierB);
         fclose(fichierC);
       
        
  getchar();
  return(0);
    }

3 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 févr. 2009 à 23:20
Salut,

Rooooh. La fausse joie. Un moment je me suis dit : "stephe -> Stéphanie". Il se trouve que je suis un grand fan des Stéphanies. Mais là c'est raté. Bref.

Impressionant le nombre d'étudiants étrangés qui postent ces derniers temps.

Et avec un peu toujours la même façon de coder et de poster le message. Encore que toi tu as pas trop mal posé la question. Si si. Le petit "corrigé le svp ou bien donnez moi des conseils". On aime.

Mais je m'égare. Et je vais encore en faire des kilos.

Sache, jeune stephe8, qu'un code ce n'est pas un texte. C'est un poème. Une oeuvre d'art. Faut que chaque ligne parle de celui qui l'a écrite. Faut que ça ait un début et une fin. Faut que ce soit beau. Faut pas bacler le boulot. Faut respecter les normes et les habitudes, dans la mesure du possible. Bref, faut au moins aimer son code juste après l'avoir écrit. On le détestera un an plus tard mais ce n'est pas le problème.

1) Indentation et aspect du code :

## La première chose qui choque dans ton code, comme ça, de visu, c'est l'indentation. L'indentation n'a aucun sens pour le compilateur. Pourtant elle est fondamentale pour la relecture du code. Une mauvaise indentation peut sans problème provoquer une mauvaise compréhension du code. Faut qu'elle soit réalisée au quart de poil. Et faut pas se dire "j'indenterai à la fin". On indente tout de suite.

Et là ton indentation est hasardeuse, bien qu'on remarque quelques efforts. Je ne sais pas si tu as utilisé le caractère tabulation, mais c'est à éviter. On aboutit vite à du n'importe quoi car les tabulation sont traitées différement d'un éditeur à l'autre. Il faut faire des espaces. On peut souvent configurer les éditeurs pour qu'une pression sur la touche tab soit transformée en un certain nombre d'espace. Concernant la taille de l'indentation, on utilise généralement 2 ou 4 espaces. Utiliser deux espaces permet de ne pas avoir du code trop à droite sur l'écran et est plus rapide à l'édition. Utiliser 4 espaces est considéré par certains comme plus lisible.

## De même que pour l'indentation, il faut toujours positionner les espaces optionnels de la même façon. for() ou for (). Mais pas for avec ou sans espace entre for et () dans le même code. Les {} si optionnelles, on les met généralement pas. Si on les mets quand elles sont optionnelles on les met toujours. Bref, il faut suivre son propre guide de style à la lettre.

## Les commentaires, c'est important aussi.

2) Remarques syntaxiques :

## Valeur de retour du main :
return(0);

return 0; Une sortie de fonction n'est pas un appel de fonction.

## Type de retour du main :

Ton main dois renvoyer un int.

3) Structure générale du code :

On essaie généralement de faire des fonctions de petites tailles dédiées à un travail précis. Cela augmente de beaucoup la lisibilité, la maintenabilité, la réusabilité...

4)  Bonnes pratiques :
 
## Il faut généralement tester les codes d'erreur des fonctions suceptibles d'échouer (Ouvertures de fichier...) et on informe l'utilisateur en cas de pépin.

## Il faut éviter absolument de rédiger deux fois le même code. Les copier coller sont interdits. Faire une boucle, un fonction... Mais jamais deux fois un code similaire !

## Il faut éviter d'utiliser des headers non standards. Comme conio.h.

## Il faut compiler au moins avec -Wall si tu utilises gcc, pour avoir les warnings, qui sont souvent des erreurs ou des imprécision génantes.

5) Erreurs :

## Boucle en trop :

      for(i=0;i<dimA;i++)
   
     
      fscanf(fichierB,"%d",&dimB);

La tu risque quelques ennuis...

## Un peu partout :

  fscanf(fichierB, "%d", &dimB);
  fscanf(fichierA, "%d", &dimA);

Pourquoi relire les tailles ? Elles sont plusieurs fois dans le fichier ? Inutile. Et attention, la lecture d'un fichier ne recommence pas au début par l'opération du saint esprit.

## k non initialisé :

k n'est pas initialisé avant d'être utilisé.

## Condition de sortie de boucle :

      while((i<dimA)&&(i<dimB))

Tu aurais du mettre un j quelque part.

## Affectation bizarre :

  dimA = A[0];
  dimB = B[0];

D'une part A et B ne sont pas encore initialisé, mais en plus tu ne te sert pas de dimA et dimB avant des les réaffecter.

## Deuxième et troisième boucle while :

Elles servent à récupérer les valeurs du tableau que l'on a pas entièrement parcouru après la première boucle while. Il ne faut donc pas toucher à i et j avant de rentrer dedans.

C[k]=A[j];

Dans la deuxième boucle. Tu voulais mettre B ici.

## Globalement :

D'une manière générale : de la rigueur !!! Sinon tu n'arrivera qu'à faire des bugs !!!

6) Ma solution :
Je propose d'utiliser la première case des tableaux pour stocker leurs tailles.
Je suppose A croissant, B décroissant, et je produit C croissant.
<hr size="2" width="100%" />Fichier A :
6 5 9 12 22 33 806
Fichier B :
6 500 21 15 9 3 1
Fichier C :
12 1 3 5 9 9 12 15 21 22 33 500 806
<hr size="2" width="100%" />#include <stdio.h>

#define FILE_A "fichierA.TXT"
#define FILE_B "fichierB.TXT"
#define FILE_C "fichierC.TXT"

void PrintArray(char *lpArrayName, int *lpVals)
{
  int i;
 
  printf("%s : ", lpArrayName);
  for (i = 1; i <= lpVals[0]; i++)
    printf("%d ", lpVals[i]);
  printf("\n");
}

int ReadArrayFromFile(char *lpFileName, int *lpVals)
{
  FILE* lpFile;
  int i;

  lpFile = fopen(lpFileName, "r");
  if (lpFile == NULL) return 0;
 
  fscanf(lpFile, "%d", &lpVals[0]);
  for (i = 1; i <= lpVals[0]; i++)
    fscanf(lpFile, "%d", &lpVals[i]);

  fclose(lpFile);
  return -1;
}

int WriteArrayToFile(char *lpFileName, int *lpVals)
{
  FILE* lpFile;
  int i;

  lpFile = fopen(lpFileName, "w");
  if (lpFile == NULL) return 0;

  for (i = 0; i <= lpVals[0]; i++)
    fprintf(lpFile, "%d ", lpVals[i]);

  fclose(lpFile);
  return -1;
}

int main()
{
  int A[50], B[50], C[100];
  int i, j, k;

  if (! ReadArrayFromFile(FILE_A, A))
  {
    printf("Echec de l'ouverture de %s\n", FILE_A);
    return 1;
  }

  if (! ReadArrayFromFile(FILE_B, B))
  {
    printf("Echec de l'ouverture de %s\n", FILE_B);
    return 1;
  }

  PrintArray("A", A);
  PrintArray("B", B);

  C[0] = A[0] + B[0];

  i = 1;
  j = B[0];
  k = 1;
  while ((i <= A[0]) && (j > 0))
  {
    if (A[i] < B[j])
    {
      C[k] = A[i];
      i++;
      k++;
    }
    else
    {
      C[k] = B[j];
      j--;
      k++;
    }
  }

  while(i <= A[0])
  {
    C[k] = A[i];
    i++;
    k++;
  }

  while (j > 0)
  {
    C[k] = B[j];
    j--;
    k++;
  }

  PrintArray("C", C);

  if (! WriteArrayToFile(FILE_C, C))
  {
    printf("Echec de l'ouverture de %s\n", FILE_C);
    return 1;
  }

  return 0;
}
3
stephe8 Messages postés 65 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 24 octobre 2009
20 févr. 2009 à 23:05
svp aidez moi
0
stephe8 Messages postés 65 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 24 octobre 2009
22 févr. 2009 à 00:48
merci bcp pour ta gentillesse et de ton aide anisi pour tes conseil
0
Rejoignez-nous