Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de tri de tableau

...un peu spécial

    16 mai 2006 à 14:54:51

    j'avoue que mon problème n'est pas évident à comprendre, mais je vais essayé de l'expliquer au cas où vous pourriez m'aider.

    alors voila : on a un tableau de type struct tuyau contenant les caractéristiques de plusieurs tuyaux :origine, extrémité, prix,...
    ces tuyaux sont rangés dans l'ordre d'origine puis d'extrémité.
    je voudrais les ranger dans l'ordre de leur prix, sans avoir à refaire le tableau entier.

    je m'explique : je crée un tableau ainsi qu'une variable qui contiendront l'indice de chaque tuyau. la variable contiendra l'adresse du tuyau le moins cher, et pour chaque tuyau, le tableau contiendra l'indice du tuyau juste plus cher.

    je ne ferais pas le tableau avec toutes les données car ce serait trop long mais voici l'autre tableau et la variable qui l'accompagne :

    variable : |0|
    tableau : |-1| | | | | | voilà comment sont initialisés ces variables.

    le résultat doit donner quelque chose du genre :
    variable : |2|
    tableau |5|4|0|1|-1|3|

    le tuyau le moins cher serait donc celui d'indice 2 dans le tableau de type struct tuyau,
    le 2e moins cher serai celui à l'indice 2 dans le tableau que je viens de présenter,
    le 3e celui qui est à l'indice 0 (ce dernier est le 2e moins cher), etc.
    pour le plus cher, on lui donne comme valeur -1 dans le tableau pour dire que l'on a fini.

    voilà le code de la fonction que j'ai taper pour faire ce tableau :
    //fonction qui calcule le tableau d'entier
    void ordreprix(struct tuyau tabtuyau[], int nb_tuyau, int tabordre[],int moinscher)
    {
      int i,j, k;
      for(k=1;k<nb_tuyau;k++)
        {
          if(tabtuyau[k].prix<tabtuyau[moinscher].prix)
            {
              tabordre[k]=moinscher;
              moinscher=k;
            }
          else
            {
              for(i=0;i!=-1;i=tabordre[i])
                {
                  if(tabordre[i]=-1)
                    {
                      tabordre[i]=k;
                      tabordre[k]=-1;
                    }
                    else
                      {
                        for(j=0;j!=-1;j=tabordre[j])
                         { if((tabordre[i]<tabordre[k])&&(tabordre[k]<tabordre[j]))
                            {
                              tabordre[i]=k;
                              tabordre[k]=j;
                            }
                         else printf("Il y a un problème au niveau du calcul de l'ordre des prix.\n");
                         }
                      }
                  }
            }
        }
    }



    je sais que ce code contient une ou deux erreurs de sytaxe que je n'ai pas réussi à trouver (peut etre un problème de {} entre autre selon moi)
    mais je sais que même sans ça le programme ne marche pas, il s'arrete au bout de 2 tour dans la 1e boucle for.

    voilà ce que je voudrais faire :

    Citation : Pas de titre


    on commence à partir du 2e tuyau(puisqu'on a déjà classé le premier lors de l'initialisation),
    le tuyau à traiter est il moins cher que l'actuel premier?
    si oui on le place en 1e, l'ancien 1e doit etre le 2e moins cher;
    sinon on parcours dans l'ordre les tuyau déjà traités;
    s'il est plus cher que tous les tuyaux déjà traités, on le place en dernier, son prédécesseur doit etre l'ancien tuyau le plus cher;
    sinon il se trouve entre deux tuyaux d'indices i et j, il devient le suivant de i et le prédécesseur de j.



    voilà l'idée, mon problème vient surtout d'après moi que je ne sais pas comment organiser mes boucles for

    donc si quelqu'un a une idée --'
    ...je bloque dessus depuis une semaine! lol (mais pas comme un charné non plus, j'ai pas le temps)
    merci d'avance

    ps : j'ai rajouté unr accolade qu'il manquait... si quelqu'un arrive à résoudre mon problème pourrait-il m'aider?
    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2006 à 9:08:14

      bon comme personne ne m'a répondu je suppose que :
      -soit personne n'a rien compris à mon problème (ce qu'il fallait faire, comment,...)
      -soit personne ne savait comment faire (ce qui m'étonnerait fort... :-° )
      -soit tout le monde a eu la flemme de répondre.

      finalement c'est bon j'ai réussi à trouver mon problème.

      c'est vrai que je ne me suis pas très bien exprimé, désolé mais j'étais pressé par le temps.

      donc si vous voulez je vous redonne le problème et si ça vous intéresse vous pouvez y réfléchir dessus et je donnerais la solution plus tard (mais dites moi si ça interesse quelqu'un , que je n'écrive pas le code sur le forum si tout le monde s'en fout! :-° )

      donc voilà le sujet :

      Citation : Pas de titre


      c'est l'histoire d'une mairie qui veut alimenter un nouveau quartier en eau (jusque là tout est clair, c'est vrai que c'est pratique l'eau courante...quand on a pas à galéré dessus :p )

      voilà le schémas qui illustre l'arrivee en eau du quartier:
      1
      / \
      2 3_____
      / \ \
      4 5 6
      \
      7
      *désolé mais ce schémas je n'arrive pas bien à l'arranger - -'

      en gros il y a :
      un tuyau entre
      1 et 2
      1 et 3
      2 et 4
      2 et 5
      3 et 6
      6 et 7
      ces tuyaux sont classés dans un tableau par ordre d'origine, puis s'ils ont la même origine, par ordre d'extrémité, et contenant d'autres données : le prix et la durée des travaux

      tuyau origine extremite prix duree
      0______1_______ 2_____30___8
      1______1________3_____70__21
      2______3________4_____20__25
      3______3________5_____50__11
      4______3________6_____90__35
      5______6________7_____40__17

      j'espère que le tableau et les tuyaux seront bien présentés... :euh:

      le but est de ranger ces tuyaux dans l'ordre croissant de prix sans recopier toutes les données du tableau
      car cet exemple est très petit, dans la réalité, il y aurait beaucoup beaucoup beaucoup plus de tuyaux, ça prendrait donc une place en mémoire énoooooorme!
      il faut donc créer une variable qui contiendra le tuyau le moins cher et un tableau où on classera l'indice du tuyau par ordre de prix, comme je l'avait expliqué 2jours avant.

      on initialise la variable à 0 et le tableau en faisant t[0]=-1 : -1 v eut dire qu'il n'ya plus de tuyau répertoriés
      concrètement, cette initialisation signifie qu'il n'y a qu'un seul tuyau, (le tableau au dessus n'a qu'une ligne)
      il faut donc rajouter les autres tuyaux en disant :"s'il est moins cher che celui qui est actuellement le moins cher, alors ce dernier n'est plus le moins cher, mais vient juste après;
      sinon on regarde s'il est plus cher que ceux qu'on a déja classé :
      si c'est le cas l'ancien plus cher précède le nouveau plus cher,
      sinon on le case entre deux autres tuyaux : un jste moins cher, l'autre juste plus cher. "

      ok c'est logique mais après on les range comment ??
      c'est quoi cette histoire de tableau avec un -1?


      en fait ce tableau est est un peu comme un tableau de pointeurs où la case sur laquelle on se trouve donne l'indice du tuyau suivant

      le -1 dit "j'ai fini de comparer les tuyaux que j'ai déjà classé."

      si vous comparez le tableau que je viens de faire et celui dans le post précédent, regardez les indices des tuyaux et comparez leurs prix.



      les connaissances nécessaires sont les tableaux, les structures et un peu de pointeurs, et encore c'est possible de faire sans (mais je ne connais pas cette autre manière mais je sais qu'elle marche, je l'ai vue de mes propoes yeux :p ) ça consiste à faire appel à goto, mais je ne connais pas cete fonctionalors j'ai utilisé un pointeur.
      la difficukté n'est pas là de toute façon (à moins de n'avoir vraiment rien compris aux pointeur, mais alors rien de rien, je ne maitrise pas encore comme il faut mais je n'ai pas eu de problème, c'est pour dire!)

      alors voilà j'ai expliqué mieux que la derniere fois le sujet, si quelqu'un est intéressé qu'on me le fasse savoir, je donnerait la solution en cas de galère (lol)
      ou même je peux aider puisque je sais maintenant comment faire :D ...(ben ouais je suis fier j'ai bien galéré dessus quand même!)

      alors bon courage à ceux qui voudront tenter.
      • Partager sur Facebook
      • Partager sur Twitter

      problème de tri de tableau

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown