problème de tri par insertion : à l'aide !!!

problème de tri par insertion : à l'aide !!! - C - Programmation

Marsh Posté le 19-11-2006 à 14:44:37    

bonjour à tous,
 
j'ai un problème avec un tri par insertion fait en même temps que le remplissage de la table à trier.
 
il s'agit d'un tri sur 3 colonnes (CodeLingerie, CodeService, et CodeArticle), il y a une quantité pour chaque triplet, et le truc c'est d'ajouter la quantité si un doublon a été détecté.
 
le problème semble être sur la gestion des doublons qui ne sont pas tous détectés.
le tri se fait bien, aucune ligne ne manque, et la quantité totale des articles est bonne par rapport au fichier d'entrée.
 
voici une partie du code : (je n'ai pas mis toutes les déclarations de variables car elle ne semblent pas être en cause)

Code :
  1. struct StructDonnees
  2. {
  3.   char dayte [TailleDate+1];
  4.   char CodeClient [TailleCodeClient+1];
  5.   char CodeLingerie [TailleCodeLingerie+1];
  6.   char CodeService [TailleCodeServiceGenerix+1];
  7.   char CodeArticle [TailleCodeArticleGenerix+1];
  8.   char NumBordereau [TailleNumBordereau+1];
  9.   char quantite [TailleQuantite+1];
  10. };
  11.  
  12. StructDonnees *TableDonnees;
  13.  
  14. void AjouteDonnees (StructDonnees *TableDonnees,long unsigned i,char *1,char *2,char *3,char *4,char *5,char *6,char *7)
  15. {
  16.     strcpy (TableDonnees [i].dayte,1);
  17.     strcpy (TableDonnees [i].CodeClient,2);
  18.     strcpy (TableDonnees [i].CodeLingerie,3);
  19.     strcpy (TableDonnees [i].CodeService,4);
  20.     strcpy (TableDonnees [i].CodeArticle,5);
  21.     strcpy (TableDonnees [i].NumBordereau,6);
  22.     strcpy (TableDonnees [i].quantite,7);
  23. }
  24.  
  25.     if (CompteurTable==0)
  26.     {
  27.                AjouteDonnees (TableDonnees,1,dayte,CodeClient,CodeLingerie,CodeService,CodeArticle,NumBordereau,quantite);
  28.            CompteurTable++;
  29.     }
  30.      else
  31.          {
  32.        i=CompteurTable;
  33.        while (i>=1 && strcmp (TableDonnees [i].CodeLingerie,CodeLingerie)>0)
  34.        {
  35.            i--;
  36.        }
  37.        if (strcmp (TableDonnees [i].CodeLingerie,CodeLingerie)!=0)
  38.        {// LE CODE LINGERIE N'EXISTE PAS => INSERTION DE LA LIGNE
  39.         for (j=CompteurTable;j>=i+1;j--)
  40.                {
  41.                       TableDonnees [j+1]=TableDonnees [j];
  42.                }
  43.                AjouteDonnees (TableDonnees,i,dayte,CodeClient,CodeLingerie,CodeService,CodeArticle,NumBordereau,quantite);
  44.               CompteurTable++;
  45.            }
  46.            else
  47.            {// LE CODE LINGERIE EXISTE => RECHERCHE DU CODE SERVICE
  48.         while (i>=1 && strcmp (TableDonnees [i].CodeLingerie,CodeLingerie)==0
  49.                && strcmp (TableDonnees [i].CodeService,CodeService)>0)
  50.               {
  51.                        i--;
  52.             }
  53.             if (strcmp (TableDonnees [i].CodeService,CodeService)!=0)
  54.               {// LE CODE SERVICE N'EXISTE PAS => INSERTION DE LA LIGNE
  55.                  for (j=CompteurTable;j>=i+1;j--)
  56.             {
  57.                       TableDonnees [j+1]=TableDonnees [j];
  58.                   }
  59.                AjouteDonnees (TableDonnees,i,dayte,CodeClient,CodeLingerie,CodeService,CodeArticle,NumBordereau,quantite);
  60.             CompteurTable++;
  61.              }
  62.            else
  63.            {// LE CODE SERVICE EXISTE => RECHERCHE DU CODE ARTICLE
  64.         while (i>=1 && strcmp (TableDonnees [i].CodeLingerie,CodeLingerie)==0
  65.                && strcmp (TableDonnees [i].CodeService,CodeService)==0
  66.               && strcmp (TableDonnees [i].CodeArticle,CodeArticle)>0)
  67.           {
  68.                       i--;
  69.             }
  70.         if (strcmp (TableDonnees [i].CodeArticle,CodeArticle)!=0)
  71.           {// LE CODE ARTICLE N'EXISTE PAS => INSERTION DE LA LIGNE
  72.             for (j=CompteurTable;j>=i+1;j--)
  73.             {
  74.                           TableDonnees [j+1]=TableDonnees [j];
  75.                       }
  76.                AjouteDonnees (TableDonnees,i,dayte,CodeClient,CodeLingerie,CodeService,CodeArticle,NumBordereau,quantite);
  77.             CompteurTable++;
  78.                }
  79.                  else
  80.                  {// LE CODE ARTICLE EXISTE
  81.             QteTotale=atoi (TableDonnees [i].quantite) + atoi (quantite);
  82.             sprintf (TableDonnees [i].quantite,"%lu",QteTotale);
  83.  
  84.                  }// FIN DU else DU if (strcmp (TableDonnees [i].CodeArticle,CodeArticle)!=0)
  85.               }// FIN DU else DU if (strcmp (TableDonnees [i].CodeService,CodeService)!=0)
  86.            }// FIN DU else DU if (strcmp (TableDonnees [i].CodeLingerie,CodeLingerie)!=0)
  87.     }// FIN DU else DU if (CompteurTable==0)


je n'ai pas mis toute la fonction car ça ferait un peu long, mais peut-être faudra-t'il ...
 
désolé pour l'indentation, je viens de me battre avec mais ça fait pas pareil en aperçu qu'en edit ...
 
je vous remercie d'avance pour toute réponse, je suis vraiment à la bourre sur mon projet, c'est pour le boulot donc ça rigole pas trop.


Message édité par manu le 19-11-2006 à 16:23:33
Reply

Marsh Posté le 19-11-2006 à 14:44:37   

Reply

Marsh Posté le 19-11-2006 à 15:17:34    

mets ton code source entre les balises [cpp][/cpp] s'il te plaît, on verra mieux le tout :)

Reply

Marsh Posté le 19-11-2006 à 15:22:20    

Siluro a écrit :

mets ton code source entre les balises [cpp][/cpp] s'il te plaît, on verra mieux le tout :)


c'est fait.
merci du conseil.
 

Reply

Marsh Posté le 19-11-2006 à 15:47:33    

Ton code est pollué par les lignes de recopie de données (la suite des strcpy). Tu devrais mettre cette partie la dans une fonction, ce serait plus clair et on pourrait plus facilement trouver où est l'erreur.

Reply

Marsh Posté le 19-11-2006 à 16:24:41    

Trap D a écrit :

Ton code est pollué par les lignes de recopie de données (la suite des strcpy). Tu devrais mettre cette partie la dans une fonction, ce serait plus clair et on pourrait plus facilement trouver où est l'erreur.


c'est fait.
 
mais l'indentation est toujours pourrie, je sais pas trop comment faire pour ça.

Reply

Marsh Posté le 20-11-2006 à 13:29:02    

personne n'a le temps de se pencher sur mon problème ... ?

Reply

Marsh Posté le 20-11-2006 à 17:13:29    

Bonjour,
 
Ton problème n'est pas très clair...
Que dois tu trier et dans quoi?
Tu dis que tu as un problème, dis ce qui ne fonctionne pas, ça ira un peu plus vite...

Reply

Marsh Posté le 20-11-2006 à 17:16:11    

manu a écrit :

personne n'a le temps de se pencher sur mon problème ... ?


Trop de code complexe. Identifie le problème et poste le code minimum et complet qui le montre. (Technique de débogage bien connue...)


Message édité par Emmanuel Delahaye le 20-11-2006 à 17:17:02

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed