IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tri dans un tableau et indices


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Points : 45
    Points
    45
    Par défaut Tri dans un tableau et indices
    bonjour a vous,
    voici mon probleme, je dispose d'un tableau contenant des prix qui sont dans le desordre.
    je souhaite les classer.
    pour ce faire, je cree un tableau d entiers du meme nombre d elements que le premier dans lequel se trouve l indice du prix suivant.
    le premier indice etant donné par une variable appelée "premier" dans mon code.
    voici un exemple :
    disons que je dispose d un tableau dans lequel sont mes prix dans le desordre :
    |3|1|2|
    une fois trié le tableau créé sera donc :
    |-1|2|0| et "premier"=1
    le -1 m indiquant que c etait le dernier prix.
    je m explique :
    - a l indice 1 (indiqué par "premier"), se trouve le prix le plus bas
    - a l indice 1 de mon nouveau tableau ce trouve 2
    ce qui m indique que le second prix le moins cher est a l indice 2 du premier tableau
    - a l indice 2, toujours de mon nouveau tableau ce trouve 0, m indiquant le suivant, jusqu a trouver -1 pour me dire que c etait le dernier prix, et donc le plus cher.

    l interet d une telle methode est que l on ne parcourt qu une seule fois le premier tableau.
    Pour un grand nombre d elements, ce tri est tres rapide...

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #include <stdio.h>
     
    int initabtuyau(int nbrtuyau, int tabtuyau[]); // initialise le tableau
    int triprix(int nbrtuyau, int tabtuyau[]); //fonction de tri
    int afftab(int nbr, int tab[]); //affiche un tableau
    int initabindice(int nbr, int tabindice[]); //initialise le nouveau tableau
     
    int main(void){
        int nbrtuyau;
        printf("Entrer le nombre de tuyaux differents :\n");
        scanf("%d", &nbrtuyau);
        int tabtuyau[nbrtuyau];
        initabtuyau(nbrtuyau, tabtuyau);
        system("pause");
        triprix(nbrtuyau, tabtuyau);
        system("pause");
    }
     
    int initabtuyau(int nbrtuyau, int tabtuyau[]){
        printf("Initialisation du Tableau :\n");
        int x;
        for(x=0; x<nbrtuyau; x++){
        printf("Origine du Tuyau %d :\n", x);
        scanf("%d", &tabtuyau[x]);
        }
         return 1;
    }
     
     
    int triprix(int nbrtuyau, int tabtuyau[]){
        int tabindice[nbrtuyau];
        initabindice(nbrtuyau, tabindice);
        int tuyencours;
        int premier;
        int ancienpremier;
        int dernier;
        int a;
        int cherche;
        int juste_sup, juste_inf, jj;
        premier=0;
        for(tuyencours=0; tuyencours<nbrtuyau; tuyencours++){
                          if(tuyencours==0){   // au premier, il est forcement le moins cher et le dernier !
                                               tabindice[0]=-1;
                                               dernier=0;
                                               premier=0;
                          }
                          else{
                               printf("else pas le premier\n");
                               if(tabtuyau[tuyencours]<=tabtuyau[premier]){     // le moins cher de tous
                                                        ancienpremier = premier;
                                                        premier = tuyencours;
                                                        tabindice[tuyencours]=ancienpremier;
                               }
                               else{
                                    cherche=premier;
                                    juste_inf=premier;                  
                                    while(((tabtuyau[tuyencours]>tabtuyau[cherche]) || (juste_inf!=-1)) || (cherche!=-1)){
                                                                                    jj=juste_inf;                                                                        
                                                                                   juste_inf = tabindice[cherche];
                                                                                   cherche=tabindice[cherche];     
                                                                                   printf("juste_inf = %d\ttabtuyau[juste_inf]=%d\n", juste_inf, tabtuyau[juste_inf]);
                                                                                   printf("jj=%d\tcherche= %d\n", jj, cherche);                                                                                                        
                                    }
                                    if((juste_inf==-1) && (cherche==-1)){ // le plus cher
                                                      tabindice[dernier]=tuyencours;
                                                      tabindice[tuyencours]=-1;
                                                      dernier=tuyencours;
                                                      //printf("le plus cher!\n");
                                    }
                                    else{       // entre 2 prix deja classes                              
                                         printf("%d<%d<%d\n", tabtuyau[juste_inf], tabtuyau[tuyencours], tabtuyau[cherche]);
                                         tabindice[tuyencours]=cherche;
                                         tabindice[juste_inf]=tuyencours;
                                    }
         }
         }
         printf("Le premier prix est : %d\n", premier);
         afftab(nbrtuyau, tabindice);
         system("pause");
    }
    }
     
    int afftab(int nbr, int tab[]){
        int x;
        for(x=0;x<nbr;x++){
                           printf("%d\t ", tab[x]);
        }
        printf("\n\n");
    }
     
    int initabindice(int nbr, int tabindice[]){
        int x;
        for(x=0; x<nbr; x++){
                 tabindice[x]=0;
        }
    }
    mon probleme est que ma fonction ne fait pas la difference entre un prix plus cher que tous ceux deja tries, et un prix ce situant entre 2 deja traités...
    rien a faire, je ne trouve pas la solution ...


    je debute, et je suis sur que la solution est sous mes yeux, mais je ne la trouve pas...

    HELP ME plz

    j espere avoir ete clair, ca n est pas facile a expliquer...
    bonne journee a vous

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Moi je dirais juste, fait un dessin!!! Et je trouve assez bizzare ta méthode de tri.

    Car tu dis vouloir les classer, mais est ce que ton exemple fonctionne si on prend 1|6|10|5|4|8, qu'est ce qu'il y uar dans le deuxieme tableau?
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    si en entré tu as :

    entré:------ indice: ----- tabeau trié: -- et en "premier" l indice 0
    --1 ---------- 0 ------------ 4
    --6 ---------- 1 ------------ 5
    --10 --------- 2 ------------ -1
    --5 ---------- 3 ------------ 1
    --4 --------- 4 ------------ 3
    --8 ---------- 5 ------------ 2


    c est vrai que c est pas simple a comprendre.
    dans le tableau trié, ca te donne l indice du prix suivant le moins elevé du tableau d origine.
    mais ca te donne aussi dans le tableau trié a cet indice le suivant, ect jusqu a tomber sur -1.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Indentation dans le code. Merci pour la lisibilité!!!!!


    Moi si j'ai compris ton probleme, tu veux trier du plus petit au pus grand ton tableau d'entier.
    Si tu n'as pas besoin de garder ton premier tableau, pas besoin de creer un deuxieme tableau.
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Voici un code de tri du plus petit au plus grand, il n'utilise qu'un tableau celui du départ. Par contre le tableau de départ est mort dans le sens ou on a trié dedans.
    Voilà et pas besoin de relire tout le tableau.

    Bon voilà, si tu le comprend à adapter dans ton code, sinon pose des questions et un algo de bases pour moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
      int i,j,tempory;
      int nb; //nombre de poste du tableaua initialiser
      int tab[20]; //a initialiser
     
      for(i=0;i<nb;i++)
      {
        for(j=i;j<nb;j++)
         {
           if(tab[i]>tab[j])
           {
               tempory=tab[j];
               tab[j]=tab[i];
               tab[i]=tempory;
           }
         }
      }
      for(i=0;i<nb;i++)
          printf("%d\n",tab[i]);
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    merci de vos reponse,
    oui, bien sur que tu tries le tableau, mais d une, je dois absolument garder mon tableau tel quel, mais en plus si tu as, exagerons, 10 000 données, ca va mettre super longtemps, le temps de parcourir tes boucles for...
    alors que moi je ne parcours le tableau qu une seule fois ...
    j ai trouvé la solution finalement a force de m acharner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    void triprix(int nbrtuyau, int tabtuyau[]){
        int tabindice[nbrtuyau];
        initabindice(nbrtuyau, tabindice);
        int tuyencours;
        int premier;
        int ancienpremier;
        int dernier;
        int cherche;
        int juste_inf, jj;
        premier=0;
        for(tuyencours=0; tuyencours<nbrtuyau; tuyencours++){
                          if(tuyencours==0){   // au premier, il est forcement le moins cher et le dernier !
                                               tabindice[0]=-1;
                                               dernier=0;
                                               premier=0;
                          }
                          else{
                               if(tabtuyau[tuyencours]<=tabtuyau[premier]){     // le moins cher de tous
                                                        ancienpremier = premier;
                                                        premier = tuyencours;
                                                        tabindice[tuyencours]=ancienpremier;
                               }
                               else{
                                    cherche=premier;
                                    juste_inf=premier;                  
                                    while(tabtuyau[cherche]<tabtuyau[tuyencours]){
                                                                                    jj=juste_inf;                                                                        
                                                                                   juste_inf = tabindice[cherche];
                                                                                   cherche=tabindice[cherche];                                                                                                            
                                                                                   if(cherche==-1)goto a;
                                    }
                                    if((juste_inf==-1) && (cherche==-1)){ // il est le plus cher
                                                      tabindice[dernier]=tuyencours;
                                                      tabindice[tuyencours]=-1;
                                                      dernier=tuyencours;
                                    }
                                    else{ // il est entre jj et cherche =>     jj < tuyencours < cherche
                                         a:                                     
                                         tabindice[tuyencours]=cherche;
                                         tabindice[jj]=tuyencours;
                                    }
         }
         }
         printf("Le premier prix est : %d\n", premier);
         afftab(nbrtuyau, tabindice);
         system("pause");
    }
    }
    voila, ca fonctionne
    merci a tous,
    si vous voulez des commentaires supplementaires, n hesitez pas

  7. #7
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par size_one_1
    merci de vos reponse,
    oui, bien sur que tu tries le tableau, mais d une, je dois absolument garder mon tableau tel quel, mais en plus si tu as, exagerons, 10 000 données, ca va mettre super longtemps, le temps de parcourir tes boucles for...
    alors que moi je ne parcours le tableau qu une seule fois ...
    j ai trouvé la solution finalement a force de m acharner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    void triprix(int nbrtuyau, int tabtuyau[]){
        int tabindice[nbrtuyau];
        initabindice(nbrtuyau, tabindice);
        int tuyencours;
        int premier;
        int ancienpremier;
        int dernier;
        int cherche;
        int juste_inf, jj;
        premier=0;
        for(tuyencours=0; tuyencours<nbrtuyau; tuyencours++){
                          if(tuyencours==0){   // au premier, il est forcement le moins cher et le dernier !
                                               tabindice[0]=-1;
                                               dernier=0;
                                               premier=0;
                          }
                          else{
                               if(tabtuyau[tuyencours]<=tabtuyau[premier]){     // le moins cher de tous
                                                        ancienpremier = premier;
                                                        premier = tuyencours;
                                                        tabindice[tuyencours]=ancienpremier;
                               }
                               else{
                                    cherche=premier;
                                    juste_inf=premier;                  
                                    while(tabtuyau[cherche]<tabtuyau[tuyencours]){
                                                                                    jj=juste_inf;                                                                        
                                                                                   juste_inf = tabindice[cherche];
                                                                                   cherche=tabindice[cherche];                                                                                                            
                                                                                   if(cherche==-1)goto a;
                                    }
                                    if((juste_inf==-1) && (cherche==-1)){ // il est le plus cher
                                                      tabindice[dernier]=tuyencours;
                                                      tabindice[tuyencours]=-1;
                                                      dernier=tuyencours;
                                    }
                                    else{ // il est entre jj et cherche =>     jj < tuyencours < cherche
                                         a:                                     
                                         tabindice[tuyencours]=cherche;
                                         tabindice[jj]=tuyencours;
                                    }
         }
         }
         printf("Le premier prix est : %d\n", premier);
         afftab(nbrtuyau, tabindice);
         system("pause");
    }
    }
    voila, ca fonctionne
    merci a tous,
    si vous voulez des commentaires supplementaires, n hesitez pas
    ne pas oublier
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    exact
    merci miron

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Es-tu sûr de ne parcourir le tableau qu'une seule fois ???
    Première boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        for(tuyencours=0; tuyencours<nbrtuyau; tuyencours++){
    deuxième boucle (même si elle ne parcours pas le tableau en entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(tabtuyau[cherche]<tabtuyau[tuyencours])
    {
       jj=juste_inf;
       juste_inf = tabindice[cherche];
       cherche=tabindice[cherche]; 
       if(cherche==-1)goto a;
    }
    Il faudrait étudier la complexité plus en détails.
    D'autre part, ton goto est du plus mauvais effet.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    oui, pas reellement une seule fois, mais c est ce que j ai trouvé de plus economique...

    pour le GOTO, je te l accorde, mais je n arrivais pas a distinguer de la boucle while si il est le plus cher, ou entre les deux, j obtenais des valeurs absurde ...

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Chacun son école comme qui dirais.

    Mais bon tu fais beaucoup de test ,de plus tu as un goto, et un while imbriqué. Moi je demande à voir si ton code est maintenable à long terme. Et si il suffit de rajouter une ligne dans ma boucle pour garder le tableau original.

    Voilà et bon courage.
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri dans un tableau à deux dimensions
    Par Neuromancien2 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/08/2007, 12h59
  2. Tri dans un tableau
    Par MegaNam dans le forum Fortran
    Réponses: 5
    Dernier message: 22/03/2007, 14h43
  3. [Tableaux] question recherche et tri dans un tableau
    Par nicopoal dans le forum Langage
    Réponses: 7
    Dernier message: 25/01/2007, 16h41
  4. [Tableaux] Tri dans un tableau
    Par ssebuser dans le forum Langage
    Réponses: 11
    Dernier message: 12/12/2006, 20h29
  5. [Debutant] Stocker des objets dans un tableau à plusieurs indices
    Par Invité dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/09/2006, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo