Trier par insertiion par ordre croissant

Trier par insertiion par ordre croissant - C - Programmation

Marsh Posté le 29-10-2006 à 23:50:55    

Bonjour a tous,
je fais un code pour rentrer des resultats de competitions a l'arrivée de candidats d'un course.
des qu'un candidat arrive, j'entre son numero de dossard, et si celui ci est bon, une invite se presente pour entrer le temps (la performance).
Ce que je voudrais faire apres avoir renseigner le nom et le temps, c'est que cela se classe dans un tableau par temps croissant, de ce fait ensuite je n'aurais qu'a afficher ce tableau par ordre d'indice pour que s'affiche les candidats par ordre d'arrivée du premier au dernier.
Seulement ce que j'ai fait ne fonctionne pas.. j'utilise Visual Studio 2005, voici mon code
 
 
             system("cls" );
 printf("/---------------- S U I V I   D E   L A   C O M P E T I T I O N ----------------/\n\n" );
 nbcandi=0;
 printf("ENTREZ LE NUMERO DE DOSSARD\n" );
 scanf("%d",&dossardlu);
 do
 {
  if(dossardlu > nbarriv || dossardlu<1)
  {
   printf("INEXISTANT\n\n" );
  }
   else
  {
   for (i = 0; i < nbcandi  && (dossardlu - 1< nbarriv)  && (Arrive[i].doss != dossardlu);  i = i + 1);// dossard déjà inscrit ou inexistant ?  
   if (i == nbcandi)  
   {
    printf("ENTREZ LE TEMPS REALISE\n" );
    scanf("%f",&tpslu);
    for(j = nbarriv - 1; j >= 0 && tpslu < Arrive[j].tps; j = j - 1) // Tri par insertion !
    {  
     Arrive[j+1] = Arrive[j];
    }
    j = j + 1;
    Arrive[j].doss = dossardlu - 1;
    if(tpslu == 0)
     printf("%-2d %-20s %-2s DISQUALIFIE\n",dossardlu,Candi[dossardlu-1].nom,Candi[dossardlu-1].nat);
    else
     printf("%-2d %-20s %-2s %.2f\n",dossardlu,Candi[dossardlu-1].nom,Candi[dossardlu-1].nat,tpslu);
   }
   else
   {
    printf("DEJA INSCRIT\n" );  
   }
   printf(" ----------------------------------------------------------------------\n" );
   printf("|                         CLASSEMENT PROVISOIRE                        |\n" );
   printf(" ----------------------------------------------------------------------\n" );
   printf("| Rang|Numero de dossard|         Nom        |Nationalite|   Temps     |\n" );
   printf(" ----------------------------------------------------------------------\n" );
  }
 for(i=0 ; i<nbarriv ; i=i+1)
  printf("%d %f\n",Arrive[i].doss,Arrive[i].tps);
 printf("ENTREZ LE NUMERO DE DOSSARD\n" );
 scanf("%d",&dossardlu);
 }
 while(dossardlu!=0);
}
 
pourriez vous m'aider s'il vous plait ?  
Merci beaucoup.


---------------
-- Zoltan --
Reply

Marsh Posté le 29-10-2006 à 23:50:55   

Reply

Marsh Posté le 30-10-2006 à 08:38:12    

[Merci de lire les règles du forum et d'apprendre à utiliser les balises pour le code]

Zoltan87 a écrit :

je fais un code pour rentrer des resultats de competitions a l'arrivée de candidats d'un course.
des qu'un candidat arrive, j'entre son numero de dossard, et si celui ci est bon, une invite se presente pour entrer le temps (la performance).
Ce que je voudrais faire apres avoir renseigner le nom et le temps, c'est que cela se classe dans un tableau par temps croissant, de ce fait ensuite je n'aurais qu'a afficher ce tableau par ordre d'indice pour que s'affiche les candidats par ordre d'arrivée du premier au dernier.
Seulement ce que j'ai fait ne fonctionne pas.. j'utilise Visual Studio 2005, voici mon code


Pour trier un tableau, je recommande qsort(). Pour les saisies je recommande de tout baser sur fgets() . scanf() est beaucoup trop complexe à mettre en oeuvre de façon fiable.
 
Ton code est incomplet et ne compile pas. On ne peut pas le tester.
 
J'arrive à compiler ça, mais je ne sais pas trop ce que je fais... C'est toi le patron

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct arrive
  4. {
  5.    int doss;
  6.    double tps;
  7. };
  8. struct candi
  9. {
  10.    char nom[32];
  11.    char nat[32];
  12. };
  13. int main (void)
  14. {
  15.    int nbarriv = 10;
  16.    struct arrive Arrive[20];
  17.    struct candi Candi[20];
  18.    int nbcandi = 20;
  19.    int dossardlu;
  20.    system ("cls" );
  21.    printf
  22.       ("/---------------- S U I V I   D E   L A   C O M P E T I T I O N ----------------/\n\n" );
  23.    printf ("ENTREZ LE NUMERO DE DOSSARD\n" );
  24.    scanf ("%d", &dossardlu);
  25.    do
  26.    {
  27.       if (dossardlu > nbarriv || dossardlu < 1)
  28.       {
  29.          printf ("INEXISTANT\n\n" );
  30.       }
  31.       else
  32.       {
  33.          int i;
  34.          // dossard déjà inscrit ou inexistant ?
  35.          for (i = 0;
  36.               i < nbcandi && (dossardlu - 1 < nbarriv)
  37.               && (Arrive[i].doss != dossardlu); i = i + 1);
  38.          if (i == nbcandi)
  39.          {
  40.             double tpslu;
  41.             int j;
  42.             printf ("ENTREZ LE TEMPS REALISE\n" );
  43.             scanf ("%lf", &tpslu);
  44.             for (j = nbarriv - 1; j >= 0 && tpslu < Arrive[j].tps; j = j - 1) // Tri par insertion !
  45.             {
  46.                Arrive[j + 1] = Arrive[j];
  47.             }
  48.             j = j + 1;
  49.             Arrive[j].doss = dossardlu - 1;
  50.             if (tpslu == 0)
  51.                printf ("%-2d %-20s %-2s DISQUALIFIE\n", dossardlu,
  52.                        Candi[dossardlu - 1].nom, Candi[dossardlu - 1].nat);
  53.             else
  54.                printf ("%-2d %-20s %-2s %.2f\n", dossardlu,
  55.                        Candi[dossardlu - 1].nom, Candi[dossardlu - 1].nat,
  56.                        tpslu);
  57.          }
  58.          else
  59.          {
  60.             printf ("DEJA INSCRIT\n" );
  61.          }
  62.          printf
  63.             (" ----------------------------------------------------------------------\n" );
  64.          printf
  65.             ("|                         CLASSEMENT PROVISOIRE                        |\n" );
  66.          printf
  67.             (" ----------------------------------------------------------------------\n" );
  68.          printf
  69.             ("| Rang|Numero de dossard|         Nom        |Nationalite|   Temps     |\n" );
  70.          printf
  71.             (" ----------------------------------------------------------------------\n" );
  72.       }
  73.       {
  74.          int i;
  75.          for (i = 0; i < nbarriv; i = i + 1)
  76.             printf ("%d %f\n", Arrive[i].doss, Arrive[i].tps);
  77.       }
  78.       printf ("ENTREZ LE NUMERO DE DOSSARD\n" );
  79.       scanf ("%d", &dossardlu);
  80.    }
  81.    while (dossardlu != 0);
  82.    return 0;
  83. }


En tout cas, ce genre d'application mérite plus qu'un bricolage de coin de table. La séquence habituelle
 
1 - définition (Quoi ?)
2 - conception (Comment ?)
3 - réalisation (codage et tests)
 
doit plus que jamais être appliquée et respectée, sinon ça va partir en vrille au milieu de la compétition et tu n'auras rien gagné du tout sur un classement fait à la main... Il sera alors trop facile et injuste de dire comme on l'entend souvent "c'est la faute de l'ordinateur"...


Message édité par Emmanuel Delahaye le 30-10-2006 à 09:00:35

---------------
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

Marsh Posté le 30-10-2006 à 12:08:19    

je ne comprend pas votre code .. et nous n'avons pas encore appris les fonctions dont vous parler ..


---------------
-- Zoltan --
Reply

Marsh Posté le 30-10-2006 à 12:31:14    

Zoltan87 a écrit :

je ne comprend pas votre code .. et nous n'avons pas encore appris les fonctions dont vous parler ..


Gné ? Tu réalises une vraie application et tu ne connais pas le C ?
 
Quand au code, c'est tout simplement le tiens. Tu ne le reconnais pas ?


Message édité par Emmanuel Delahaye le 30-10-2006 à 12:32:23

---------------
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

Marsh Posté le 30-10-2006 à 12:35:25    

Biensur que si je le reconnais ! Euh faut bien commencer, on peut pas tout savoir lorsque l'on fait son premier programme il me semble .. ai je tord ?
J'aimerais simplement en fait que l'on mexplique l'algorithme de tri par insertion puis que l'on me montre un exemple (si possible avec des structures et des variables semblables aux miennes de telle sorte que je puisse identifier, et surtout comprendre pour pouvoir a l'avenir le refaire ). Desole de ne pas avoir ete plus precis des le debut. Merci pour votre aide


---------------
-- Zoltan --
Reply

Marsh Posté le 30-10-2006 à 13:08:51    

Zoltan87 a écrit :

Euh faut bien commencer, on peut pas tout savoir lorsque l'on fait son premier programme il me semble .. ai je tord ?


En partie. On est censé maitriser les bases, c'est à dire la définition, la conception et le codage.
De plus, tu n'as pas parlé d'un 'premier programme', mais d'une application de terrain tout à fait opérationnelle.
 
Je t'ai donc très vite mis en garde contre une conception à l'arrache d'un tel programme. Gamelle garantie.
 
J'aimerais simplement en fait que l'on mexplique l'algorithme de tri par insertion puis que l'on me montre un exemple (si possible avec des structures et des variables semblables aux miennes de telle sorte que je puisse identifier, et surtout comprendre pour pouvoir a l'avenir le refaire ). Desole de ne pas avoir ete plus precis des le debut. Merci pour votre aide
J'ai bien peur que si je te dise
1 - le tri par insertion, ce n'est pas ce que tu crois
2 - ce que tu veux faire, c'est de l'insertion triée
3 - pour cela, il faut mettre en oeuvre une liste chainée
tu grimpes aux rideaux...
 
C'est pour ça que je t'ai tout de suite orienté vers une solution simple qui est qsort(). Maintenant, si tu me réponds 'je ne connais pas cette fonction', je vais me coucher... Tu me réveilleras quand tu auras relu ton livre de C...
 
Evidemment, si il s'agit d'une application scolaire, c'est différent, mais il fallait être plus clair dès le début...


Message édité par Emmanuel Delahaye le 30-10-2006 à 13:09:10

---------------
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

Marsh Posté le 30-10-2006 à 13:17:59    

Bon aller je vais essayer d'être gentil.
Grosso modo ce que tu veux c'est trier les éléments d'un tableau. Comme tu ne connais pas qsort() et que tu ne sembles pas vouloir chercher à quoi ça ressemble (ou tout simplement on t'a demandé de n'utiliser que ce que l'on t'a appris jusqu'à présent), tu es bien obligé de faire ta propre fonction de tri.
 
A priori deux choix s'offrent à toi :
- soit tu tries au fur et à mesure que tu met les éléments dans ton tableau,
- soit tu les tries un fois que celui-ci est rempli.
 
On va supposer que tu fais le second choix...
Donc, tu peux faire des recherches avec ton moteur préférer pour les différents types de tri existant. Pour ma part, un petit coup de Google sur "tri à bulle" et le premier résultat semble très adapté pour ton cas. Je te laisse donc regarder http://www-ipst.u-strasbg.fr/ipst/ [...] ibulle.htm. Tu peux éventuellement chercher ailleurs d'autres méthodes de tri si celle-ci ne te convient pas... (au passage si tu jette un coup d'oeil sur wikipédia tu tomberas vite sur http://fr.wikipedia.org/wiki/Algorithme_de_tri en cherchant simplement tri...)
 
Bonne continuation.

Reply

Marsh Posté le 30-10-2006 à 13:26:06    

Merci beaucoup a vous deux, mais ca serait difficile un tri au fur et a mesure ? une insertion triée comme l'a si bien dit Emmanuel Delahaye.
 
ps: je n'ai pas de livre de C et mes profs ne se privent pas pour nous rappeller que "les bouquins de C ne servent a rien, ceux qui les ecrivent ne savent qu'ecrire et rarement etre competent lorsqu'il s'agit de vraiment coder", je ne fais que cité. xD


---------------
-- Zoltan --
Reply

Marsh Posté le 30-10-2006 à 14:06:27    

-1 pour ton prof...
 
Sinon pour une insertion triée, je pense que la solution d'Emmanuel avec les listes chaînées est très bien :)

Reply

Marsh Posté le 30-10-2006 à 14:21:28    

Zoltan87 a écrit :

mes profs ne se privent pas pour nous rappeller que "les bouquins de C ne servent a rien, ceux qui les ecrivent ne savent qu'ecrire et rarement etre competent lorsqu'il s'agit de vraiment coder"


 
Alors ça c'est quand même assez monstrueux  :ouch: Tu es dans quelle école/fac si c'est pas indiscret ?
 

Reply

Marsh Posté le 30-10-2006 à 14:21:28   

Reply

Marsh Posté le 30-10-2006 à 14:34:11    

Zoltan87 a écrit :

Biensur que si je le reconnais ! Euh faut bien commencer, on peut pas tout savoir lorsque l'on fait son premier programme il me semble .. ai je tord ?
J'aimerais simplement en fait que l'on mexplique l'algorithme de tri par insertion puis que l'on me montre un exemple (si possible avec des structures et des variables semblables aux miennes de telle sorte que je puisse identifier, et surtout comprendre pour pouvoir a l'avenir le refaire ). Desole de ne pas avoir ete plus precis des le debut. Merci pour votre aide


 
voilà voilà : http://www.siteduzero.com/tuto-3-4 [...] rtion.html
 
EDIT:  

Citation :

ps: je n'ai pas de livre de C et mes profs ne se privent pas pour nous rappeller que "les bouquins de C ne servent a rien, ceux qui les ecrivent ne savent qu'ecrire et rarement etre competent lorsqu'il s'agit de vraiment coder", je ne fais que cité. xD


 
 :lol:  je te conseil de faire le contraire de ce que te dis ton prof...
 


Message édité par Bad_Day le 30-10-2006 à 14:36:04
Reply

Marsh Posté le 30-10-2006 à 15:08:04    

je suis a l'iut de paris 5 (un des meilleur pourtant si on en crois les stats).merci beaucoup Bad_Day


---------------
-- Zoltan --
Reply

Sujets relatifs:

Leave a Replay

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