begin process at 2012 05 28 12:04:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Fichier & Disque

 > 

aidez moi pour un programme en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

aidez moi pour un programme en C

vendredi 20 février 2009 à 19:57:44 | aidez moi pour un programme en C

stephe8

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

vendredi 20 février 2009 à 23:05:01 | Re : aidez moi pour un programme en C

stephe8

svp aidez moi
samedi 21 février 2009 à 23:20:56 | Re : aidez moi pour un programme en C

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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.

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

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

dimanche 22 février 2009 à 00:48:04 | Re : aidez moi pour un programme en C

stephe8

merci bcp pour ta gentillesse et de ton aide anisi pour tes conseil


Cette discussion est classée dans : fscanf, fichierb, dima, fichiera, dimb


Répondre à ce message

Sujets en rapport avec ce message

problème de lecture d'un fichier txt [ par yeager ] Bonjour!J'ai un problème pour la lecture d'un fichier texte. Le fichier est créé mais lorsque je donne le chemin d'accées fopen me renvoie la valeur N Pb avec fscanf pour récupérer une phrase !!! [ par bertrand85 ] Sltje comprend pas g tt essayé mais ca marche pas !!!fscanf(fic,"%d/%d/%d %[^\n]\n",&var_j,&var_m,&var_a,com);j'arrive à tt récupérer dans le fichier problèeme avec fscanf() [ par xkindool ] Désolé de poster un message pour si peu mais je n'arrive pas a débugger :/Mon prog ne marche pas, il est simplement censé afficher les lignes d'un fic Equivalent fscanf en win32 [ par gagah1 ] Salut à tous!Est-ce qu'il y a une fonction equivalente à fscanf en win32???Merci d'avance pour les reponses. Prb de compatibilite avec fscanf et mon interface graphique [ par gazzall ] Bonjour,j'ai un projet a realiser.Le but de mon projet et de comparer differentes versions d'un meme programme realiser par des etudiants et voir si u fgets() fscanf() et taille du mot [ par goutbouyo ] Salut c'est encore moi ...J'ai encore un problème :Dans un fichier j'ai soit des noms composés ou soit des noms simples.Pour chaque nom on passe à la Lire une ligne vide avec fscanf() [ par kiboumz ] Bonjour, j'ai un petit problème, j'essaie d'afficher des lignes à l'écran lu à partir d'un fichier, tout cela fonctionne jusqu'à je recontre une ligne Fscanf ne fait pas ce que je veux ... [ par tichadok ] Bonjour, voici mon problème condensé dans ce bout de code : un fichier fic.txt contient : 2.0 3.0 un fichier lect.c contient : #include int main( fscanf + lecture fichier obj [ par fafa21081974 ] hello tout le monde Un petit envoi pour appeler à l'aide. Bon voilà, je veux lire des données dans un fichier.Obj pour les sommets pas de soucis ma comment remplacer fscanf [ par blh_ind ] Bonjour à tous, comment remplacer fscanf(file, "%d//%d", &v, &n) avec iostream en evitant les stringstream si possible Exemple : Dans un fichier tot


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales