Tri de tableaux de structure [Résolu]

Signaler
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020
-
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
-
Bonjour,

Je viens de me lancer, un peu par curiosité, dans l'apprentissage de la programmation en C. J'ai donc acheté un livre, dont certains exercices n'ont pas de correction. Dans un de ces exercices, on me demande de déclarer un tableau de quatre structures scores nommé joueurs. Jusque là, tout va bien. Ensuite on me demande de trier les scores dans l'ordre décroissant, en utilisant ce que j'ai appris dans les leçons précédentes. Le tri des scores fonctionne, mais je n'arrive pas à faire correspondre les noms qui vont avec les scores.

on me donne un petit indice, l'auteur du livre indique qu'en ligne 27, il a écrit joureurs[a] = joueurs[b];

Ci-dessous, le code que j'ai utilisé.
#include <stdio.h>
#include <stdlib.h>
#define TAILLE 4
int main()
{ struct scores
{
char nomJoueur[32];
int score;
};
struct scores joueurs[4];
int x;
for (x = 0; x<TAILLE; x++)
{
printf("Indiquer le joueur %d : ", x+1 );
scanf("%s", joueurs[x].nomJoueur);
printf("Indiquer le son score : ");
scanf("%d", &joueurs[x].score);
}
puts("Infos du joueur");
printf("#\tNom\tScore\n");
for(x = 0; x<TAILLE; x++)
{
printf("%d\t%s\t%5d\n", x+1, joueurs[x].nomJoueur, joueurs[x].score);
}
int interne, externe, temp;
for(externe=0; externe<TAILLE-1; externe++)
{
for( interne=externe+1; interne<TAILLE; interne++)
{
if( joueurs[externe].score < joueurs[interne].score)
{
temp=joueurs[externe].score;
joueurs[externe].score = joueurs[interne].score;
joueurs[interne].score = temp;
}
}
}
puts("Tableau apres tri: ");
for(x=0; x<TAILLE; x++)
printf("%d\t%s\t%5d\n", x+1, joueurs[x].nomJoueur, joueurs[x].score);
putchar('\n');

return 0;
}

Merci d'avance.

4 réponses

Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
750
bonjour,
merci d'utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

il me semble que tu tries les scores, alors que tu souhaites sans doute trier les joueurs en fonction de leur score.
pour mieux comprendre ce que fais ton programme, pourquoi n'affiches-tu pas le tableau à chaque étape du tri?
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020

Bonjour,
Désolé pour les balises de code , je ne connaissais pas, c'est la première fois que je m'inscrit dans un forum.
Dans un premier temps, on demande de créer le code pour faire un tableau en saisissant un nom puis un score. Ensuite, il est demandé de faire le tri décroissant des scores. Là le tri se fait mais les noms n'ont pas changer d'ordre. Donc l'auteur donne comme indice que dans son code à lui, il a rajouté joueurs[a] = joueurs[b]; mais je ne trouve pas le reste de l'astuce.

#include <stdio.h>
#include <stdlib.h>
#define TAILLE 4
int main()
{  struct scores
    {
        char nomJoueur[32];
        int score;
    };
    struct scores joueurs[4];
    int x;
    for (x = 0; x<TAILLE; x++)
    {
        printf("Indiquer le joueur %d : ", x+1 );
        scanf("%s", joueurs[x].nomJoueur);
         printf("Indiquer le son score : ");
        scanf("%d", &joueurs[x].score);
    }
    puts("Infos du joueur");
    printf("#\tNom\tScore\n");
    for(x = 0; x<TAILLE; x++)
    {
        printf("%d\t%s\t%5d\n", x+1, joueurs[x].nomJoueur, joueurs[x].score);
    }
        int interne, externe, temp;
        for(externe=0; externe<TAILLE-1; externe++)
    {
            for( interne=externe+1; interne<TAILLE; interne++)
                {
                    if( joueurs[externe].score < joueurs[interne].score)
                {
                    temp=joueurs[externe].score;
                    joueurs[externe].score = joueurs[interne].score;
                    joueurs[interne].score   = temp;
    }
    }
    }
    puts("Tableau apres tri: ");
    for(x=0; x<TAILLE; x++)
    printf("%d\t%s\t%5d\n", x+1, joueurs[x].nomJoueur, joueurs[x].score);
    putchar('\n');

    return 0;
}
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
750
pour mieux comprendre ce que fais ton programme, pourquoi n'affiches-tu pas le tableau à chaque étape du tri?
à ton avis, que fait
joueurs[a] = joueurs[b];
?
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020

Bonjour,

J'ai réussi à faire apparaître les différentes étapes du tri, mais je n'ai toujours pas réussi à déplacer les noms de joueur qui correspondent au score. Je ne connais que le tri de tableau sur une colonne ou une ligne. Je suppose que joueurs[a] = joueurs[b] sert à convertir le tableau, mais je ne sais pas comment.
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
750
qu'as-tu essayé pour déplacer les noms?
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020
>
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020

Pour commencer, j'ai essayé avec un tableau plus simple à deux colonnes comprenant déjà les prenoms et les scores. J'ai fais toutes sortes de modifs dans le "if" et dans le "temp" en rajoutant "prenom[TAILLE][x]".

Voici le tableau utilisé.

#include <stdio.h>
#include <stdlib.h>
#define TAILLE 4
int main()
{char joueurs[4];
    char prenom[TAILLE][25] = {"Georges", "john", "Thomas ", "James"};
    int score[TAILLE]= {1, 2, 3, 4};
    int x, index;
    putchar('\n');

    for(x=0; x<TAILLE; x++)
    {
       printf("%s\t%5d\n",prenom[x], score[x]);
       index++;
    }
        putchar('\n');
         int interne, externe, temp;

        for(externe=0; externe<TAILLE-1; externe++)
            {
                for( interne=externe+1; interne<TAILLE; interne++)
            {
                        for(x=0; x<TAILLE; x++)
                        printf("%s\t%5d\n",prenom[x], score[x]);
                        if(score[externe]<score[interne])
            {
                temp= score[externe];
                score[externe]= score[interne];
                score[interne]=temp;
            }
        }
    }
    /* Affiche tableau après tri*/
    puts("Tableau apres tri: \n");
    for(x=0; x<TAILLE; x++)
     printf("%s\t%5d\n", prenom[x], score[x]);
    putchar('\n');

    return 0;
}
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
750 >
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020

à quelle ligne as-tu essayé de déplacer les noms?
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020

Je ne comprends pas trop bien comment le tri fonctionne. J'ai mis un "printf" avant le "if" et pourtant, je vois bien comment se placent le différents chiffres au fur et à mesure du tri. Je croyais que le programme évoluait ligne par ligne. Je me suis surtout axé à placer les noms après le "if" de différentes manières ou dans les accolades du "temp". Je ne vois vraiment pas comment lier les noms avec les scores. Je suis pas fait pour la programmation apparemment.
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
750
commence peut-être par des exercices plus simples, avec des nombres plutôt que des textes.
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020
>
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020

Oui, je vais reprendre tous ça , je n'ai pas tout bien assimilé, je vous le ferai savoir si un jour je trouve la solution.
merci à vous.
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020
>
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020

Bonsoir,

J'ai enfin trouvé une solution qui fonctionne, j'étais vraiment mal parti, ça demande encore de l'entraînement.
#define TAILLE 4
int main()
{  struct scores
    {
        char nomJoueur[32];
        int score;
    };
    struct scores joueurs[4];
    struct scores temp;
    int x, ex, in;
    for (x = 0; x<TAILLE; x++)
    {
        printf(" Indiquer le joueur %d : ", x+1 );
        scanf(" %s", joueurs[x].nomJoueur);
         printf(" Indiquer le son score : ");
        scanf("%d", &joueurs[x].score);
    }
    putchar('\n');
    puts(" Infos du joueur\n");
    printf(" #\tNom\tScore\n");

    for(x = 0; x<TAILLE; x++)
    {
        printf(" %d\t%s\t%5d\n", x+1, joueurs[x].nomJoueur, joueurs[x].score);
    }
        for(ex=0; ex<TAILLE-1; ex++)
        {
             for( in=ex+1; in<TAILLE; in++)
            {
                    if( joueurs[ex].score < joueurs[in].score)
                {
                    temp=joueurs[in];
                    joueurs[in] = joueurs[ex];
                    joueurs[ex] = temp;
                }
            }
        }
    puts(" Tableau apres tri: ");
    for(x=0; x<TAILLE; x++)
    printf(" %d\t%s\t%5d\n", x+1, joueurs[x].nomJoueur, joueurs[x].score);
    putchar('\n');

    return 0;
}
Messages postés
13426
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
4 décembre 2020
750 >
Messages postés
7
Date d'inscription
jeudi 14 mai 2020
Statut
Membre
Dernière intervention
19 mai 2020

l'indice finit par prendre tout son sens...
peux-tu marquer la discussion comme résolue?