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 :

comment trier par insertion un tableau bidimentionnel??


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut comment trier par insertion un tableau bidimentionnel??
    donc voila je dois realisé un tri de tableau pour ca il faut que j'affiche le tableau sans etre trier et ensuite trier la 3eme colone
    c'est un tableau avec 4 caracteristiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    origine   extremité   prix  durée
     
     0          0           0    0
     0          0           0    0
     0          0           0    0
    dans ce style!
    mon debut de programme est comme ca


    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
    #include <stdio.h>
    #include <stdlib.h>
    /************************
     *DECLARATION DES TYPES**
     ***********************/
     
    struct tuyaux{
      int origine;
      int extremite;
      int prix;
      int duree;
    };
     
     
    int main()
    {
     
      int nbTuyaux;
      printf ("entrez le nombre de tuyaux dans le reseau >");
      scanf ("%d",&nbTuyaux);
     
      struct tuyaux reseau[nbTuyaux];
      int i;
       printf("entrer l'origine,l'extremite,le prix et la durée des travaux \n");
        for(i=0;i<nbTuyaux;i++){
         printf("pour le %d =>",i+1);
           scanf("%d %d %d %d",&reseau[i].origine,&reseau[i].extremite,&reseau[i].prix,&reseau[i].duree);
      }
      printf("origine extremite prix   duree\n");
      for(i=0;i<nbTuyaux;i++){
         printf("   %d        %d       %d      %d \n",reseau[i].origine,reseau[i].extremite,reseau[i].prix,reseau[i].duree);
      }

  2. #2
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    par contre je ne voudrait pas la solution mais juste comment demarrer , la demarcher a suivre au debut pour commencer

    en fait je me demande surtout comment dire qu'il faut trier telle colone
    il faut faire [tuyaux] [reseau[i].prix]??

  3. #3
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Il serai beaucoup plus simple et plus élégant de travailler avec les outils du C++ :
    -> Remplacer les scanf par des std::cin
    -> Remplacer les printf par des std::cout
    -> Utiliser des conteneurs de la librairie standard plutôt que des tableaux C (std::list<> ou std::vector<>)
    -> Tu n'est pas obligé de mettre le mot clef struct devant une instanciation.

    Et le tri sera possible de deux manières :
    -> Tu définis un opérateur de comparaison (l'opérateur <) pour ta class tuyau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool operator<(const CTuyau& T1, const CTuyau& T2)
    {
            return T1.prix < T2.prix;
    }
    et tu apelles la méthode sort() de ton conteneur.
    -> Tu apelles la méthode sort() en passant par argument un prédicat.
    Un prédicat est une fonction qui retourne un bool et qui prend en arguments deux objets de même type.
    Ce prédicat aura le même effet que l'opérateur <...

    Tu peux aller voir ici, ça pourra surement t'aider pour les conteneurs.
    Et ici, pour les prédicats.

  4. #4
    Membre confirmé Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par défaut
    Bonjour joan_al_catala,
    je crois que tu t'es trompé de forum, car c'est du code C et non C++.
    Pour ta question, tu peux accéder à prix avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    reseau[i]; //accède à la i ème case du tableau reseau
    reseau[i].prix; // accède au prix de la i ème case du tableau reseau
    A+

    b Oo

  5. #5
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    oui je crois bien m'etre trompé c'est bien du c non pas du c++
    oui je peux y acceder en faisant reseau[i] mais le probleme c'est que comment va t'il savoir qu"il s'agit de la colone des prix? car les variable sont defini apart du tableau

  6. #6
    Membre confirmé Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par défaut
    Je vais faire un bout de code et expliquer ce qui se passe :
    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
     
    // les includes
     
    struct tuyaux
    {
      int origine;
      int extremite;
      int prix;
      int duree;
    };
     
    int main()
    {
       struct tuyaux monTuyau;
       /* Comme monTuyau est un tuyau je peux accéder a son origine, à son extremite, à son prix et à sa durée */
     
       monTuyau.origine = monTuyau.extremite = 0; /* monTuyau a désormais une origine et une extrémité de 0 */
       monTuyau.prix = 3; // monTuyau coute desormais 3 euros
       monTuyau.duree = 1; // monTuyau dure 1 minute
     
       struct tuyaux tabTuyau[10];
       /* je crée un tableau qui contient 10 tuyaux :
            le premier est tabTuyau[0] et le dernier tabTuyau[9]
          Chaque élément du tableau est un tuyau donc par exemple :
          tabTuyau[0] est un tuyau et donc on peut acceder à son origne, son extremite, etc ...
       */
       tabTuyau[0].prix = 1; // le prix du tuyau contenu à la case 0 est de 1
     
      return 0;
    }
    voila j'espere que tu as compris, donc pour trier ton tableau, il faut que tu parcours le tableau élément par élément.

    b Oo

    [oui on est bien dans le forum C, mais il avait posté le message dans le forum C++]

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    <delestage>

  8. #8
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    On est bien sur le forum C ici ?
    J'ai posté quand le sujet était encore sur le forum C++, sujet déplacé...

  9. #9
    Membre confirmé Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par défaut

    Bon je crois avoir compris ce que tu veux.
    En fait tu ne veux pas trier ton tableau, je veux dire par là que tu ne modifies pas ton tableau de départ.
    Tu veux juste que dans un autre tableau de même taille que le premier, que chaque case contienne l'indice de la première case qui a le plus petit prix supérieur. Et pour l'élément maximum tu lui mets -1 comme indice.
    Donc :
    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
     
    int tab[nb_tuyau];
    tuyaux reseau[nb_tuyau];
     
     
    /* on cherche le minimun */
    int indiceMin = 0; // indice de l'élément minimum
    for (int i = 1; i < nb_tuyau; ++i)
    {
      if (reseau[i].prix < reseau[indiceMin].prix)
      {
        indiceMin = i;
      }
    }
     /* le minimum se trouve à l'indice indiceMin*/
     
     
    int mininmum = 100000;
    int indice = -1;
    /* on cherche le minimum mais supérieur à la valeur du minimum courant*/
    for (int i = 0; i < nb_tuyau; ++i)
    {
      if (reseau[i].prix < minimum && reseau[i].prix > reseau[indiceMin].prix)
      {
        minimum = reseau[i].prix;
        indice = i;
      }
    }
    /*on a le deuxième plus petit élément*/
     
    tab[indiceMin] = indice; /* on met dans la case du plus petit élément l'indice du prix immédiatement supérieur */
     
    ... 
    /* faire la même chose pour les autres. Une fonction récursive doit pouvoir être implémentée, ou sinon une autre boucle peut faire l'affaire */
    J'espère que cela t'auras éclairé.

    A+

    b Oo

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par joan_al_catala
    donc voila je dois realisé un tri de tableau pour ca il
    qsort().

Discussions similaires

  1. [MySQL] Comment trier par ordre alphabétique l'extraction de la base de donnée
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 12/06/2013, 11h01
  2. Comment trier par nom ?
    Par orochimaru dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/08/2006, 23h00
  3. Réponses: 1
    Dernier message: 27/05/2006, 23h13
  4. Réponses: 28
    Dernier message: 24/05/2006, 18h20
  5. comment trier par le sens inverse?
    Par helenafr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2006, 17h48

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