Tri de tableaux de structure

Résolu/Fermé
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020 - Modifié le 14 mai 2020 à 14:19
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 - 19 mai 2020 à 19:13
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

yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480
14 mai 2020 à 14:32
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?
0
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020
14 mai 2020 à 15:11
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;
}
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480
14 mai 2020 à 15:29
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];
?
0
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020
15 mai 2020 à 10:12
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.
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480
15 mai 2020 à 10:14
qu'as-tu essayé pour déplacer les noms?
0
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020 > yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024
15 mai 2020 à 11:06
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;
}
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480 > ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020
15 mai 2020 à 12:03
à quelle ligne as-tu essayé de déplacer les noms?
0
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020
15 mai 2020 à 14:37
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.
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480
15 mai 2020 à 16:02
commence peut-être par des exercices plus simples, avec des nombres plutôt que des textes.
0
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020 > yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024
16 mai 2020 à 14:51
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.
0
ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020 > ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020
19 mai 2020 à 18:55
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;
}
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480 > ProgCnew Messages postés 7 Date d'inscription jeudi 14 mai 2020 Statut Membre Dernière intervention 19 mai 2020
19 mai 2020 à 19:13
l'indice finit par prendre tout son sens...
peux-tu marquer la discussion comme résolue?
0