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 :

Trier par ordre croissant un tableau à double dimension


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Points : 54
    Points
    54
    Par défaut Trier par ordre croissant un tableau à double dimension
    Bonjour à tous, j'ai eu l'idée de créer un programme qui récupère les X notes des Y élèves d'une classe, et les tries de manière croissante.

    Je souhaiterais donc trouver une façon de trier par ordre croissant les valeurs du tableau "note[i][j]". Je me suis basé sur un algorithme trouvé sur le net pour trier ce dernier, cependant juste les notes du premier élève sont triés. Le reste de notes reste dans l'ordre ou je l'ai rentré, et j'avoue ne pas comprendre pourquoi. Voici mon algorithme.

    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
     
    int main() {
     
    int nombreEleve, nombreNote, i = 0, j=0, tri = 1;
    double note[100][100];
     
     
    printf("Combien d'eleves : ");
        scanf("%d", &nombreEleve);
     
        printf("Combien de notes par eleve : ");
        scanf("%d", &nombreNote);
     
     
     
    for (i=0; i<nombreEleve; i++)
        {
            for (j=0; j<nombreNote; j++)
            {
                printf("Eleve %d - note %d ", i, j);
                scanf("%lf", &note[i][j]);
                sommeNote += note[i][j];
                nombredesnote++;
     
            }
    }
     
     
     
    for (i=0; i<nombreEleve; i++)
        {
            printf("tri = %d\n\n", tri);
     
            while(tri == 1)
            {
                tri = 0;
     
                for (j=0; j<nombreNote-1; j++)
                {
                    if(note[i][j]>note[i][j + 1])
                    {
                        temp = note[i][j];
                        note[i][j]= note[i][j + 1];
                        note[i][j + 1] = temp;
                        tri=1;
     
                    }
                }
            }
        }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    Tu a oublié de réinitialiser tri à 1 à la boucle i suivante.
    Pour i==0, on sort de la boucle while quand tri==0. Et pour i==1, on ne rentre pas dans la boucle.
    Mais pour trier en C, il y a la fonction qsort.

  3. #3
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Points : 54
    Points
    54
    Par défaut
    Merci pour ta réponse
    Cependant, j'ai peur de ne pas comprendre. Les tableaux à double dimensions sont tout nouveau pour moi ^^
    J'ai pourtant initialisé tri à 1 au tout début du programme (int tri = 1.
    A quelle ligne du programme devrais-je mettre un tri = 1 selon toi ? Devrais-je supprimer une initialisation foireuse de la variable tri durant mon programme ?
    Merci

    Je viens d'appliquer une modification intéressante. J'ai remonté le while(tri == 1) avant d'entrer dans la boucle i. A présent, tout les X élèves ont leurs notes triés, mais à part. Par exemple, si je rentre : 1er élèves = 9 8 7 et 2eme élève = 6 5 4, le programme va m'afficher 1er eleve = 7 8 9 et le 2 eme eleve = 4 5 6 (soit 7 8 9 4 5 6). Alors que je voudrais avoir : 4 5 6 7 8 9.
    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
     
    while(tri == 1)
            {
                 for (i=0; i<nombreEleve; i++)
                    {
                        tri = 0;
     
                        for (j=0; j<nombreNote-1; j++)
                            {
                                if(note[i][j]>note[i][j + 1])
                                {
                                    temp = note[i][j];
                                    note[i][j]= note[i][j + 1];
                                    note[i][j + 1] = temp;
                                    tri=1;
     
                                }
                            }
                        }
                    }

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    J'ai mal compris ce que tu cherchais à faire, et du coup, ma première réponse n'était pas très pertinente.
    Je pensais que tu cherchais à trier les notes de chaque élève, alors que d'après ton dernier message, tu cherches plutôt à obtenir une liste globale triée, donc à une dimension.
    Par exemple :
    e1 = (9,3,3), e2 = (1,7,2) => liste=(1,2,3,3,7,9)
    Dans ce cas, il faut commencer par placer les notes en vrac dans un tableau à une dimension, qui contiendra nombreEleve*nombreNote éléments, avant de trier ce tableau.

  5. #5
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Points : 54
    Points
    54
    Par défaut
    Tant mieux quelque part, je suis bien plus à l'aise avec les tableaux à une dimension. Cependant, à quel moment je remplis ce tableau à une dimension ?
    Via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (i=0; i<nombreEleve; i++)
                    {
                        for (j=0; j<nombreNote * nombreEleve; j++)
                            {
                               note[i][j] = TableauDeNoteAUneDimension[j];
                            }
                    }
    ?
    Merci pour tes réponses, je me suis bien proche de la solution à présent.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    Si tu n'as pas besoin de conserver la liste des notes pour chaque élève, autant saisir directement un tableau à une dimension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    double note[10000];
     
    for (i = k = 0; i < nombreEleve; i++)
    {	printf("Notes eleve %d :\n", i);
    	for (j = 0; j < nombreNote; j++, k++)
    	{	printf("  note %d : ", j);
    		scanf("%lf", &note[k]);
    	}
    }
    Et si tu as besoin de la conserver, remplit dans la même boucle un tableau note_eleve[100][100] en même temps que le tableau note[]

  7. #7
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Points : 54
    Points
    54
    Par défaut
    Merci infiniment à toi

Discussions similaires

  1. Trier par ordre croissant une colonne de tableau
    Par c.piette dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/05/2015, 20h21
  2. Trier par ordre croissant des valeurs dans un tableau
    Par ftrap dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/06/2013, 10h35
  3. Trier par ordre alphabétique un tableau
    Par barbiche dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 09/03/2007, 17h15
  4. trier par ordre alphabetique un tableau de char
    Par Pitou5464 dans le forum C
    Réponses: 3
    Dernier message: 02/11/2006, 18h44

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