Tri alphabétique [Fermé]

Signaler
-
 guess -
Bonjour /bonsoir s'il vous plait je n'arrive pas à écrire un programme en c qui range 3 noms par ordre alphabétique j'ai besoin d'aide merci

4 réponses

Messages postés
50799
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
30 janvier 2021
6 850
J'ai déjà tout essayer j'ai utilisé les structure rien les pointeurs sur les tableau rien et pourtant se soit les structure ou les pointeurs ça arrive a prendre les noms et les stocker en mémoire mai le tri ne donne pas
Et j'ai pensé o tableau a 2d mai l'autre là ça n'arrive pas a prendre les noms une fois erreur
Messages postés
5478
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
3 mars 2021
928
Salut a.brice,

Alors, comme ton problème a l'air d'être, en fait, comment structurer tes données, voilà quelques indications :

Les tableaux contenant plusieurs chaînes de caractères en C sont effectivement des tableaux de tableaux (donc des tableaux 2D) vu qu'une chaîne est elle même un tableau de caractères terminé par le caractère '\0'.

Une façon de faire est de déclarer un pointeur sur un pointeur sur char, d'allouer la mémoire nécessaire pour 3 pointeurs sur char, et d'y mettre les pointeurs sur tes chaînes de caractères (dont l'espace doit lui même être alloué).

Tu ne précises pas si ces noms sont saisis par l'utilisateur ou pas.

Alors, en supposant qu'ils ne le soient pas, tu peux faire comme cela pour initialiser tes chaînes et structure de données :

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n;
    const int max_noms = 3;
    char * st1 = "Riri";
    char * st2 = "Fifi";
    char * st3 = "Loulou";

    /* on réserve la mémoire nécessaire à 3 pointeurs sur char */
    char ** noms = malloc(3 * sizeof(char *));
    /* on affecte nos 3 pointeurs sur char dans le tableau */
    noms[0] = st1;
    noms[1] = st2;
    noms[2] = st3;
    /* afficher la liste non triée */
    printf("la liste de noms avant le tri est :\n");
    for (n = 0; n < max_noms; n++)
        printf("%s\n", noms[n]);

    /* faire le tri ici */
    TODO

    /* afficher la liste triée */
    printf("la liste de noms après le tri est :\n");
    for (n = 0; n < max_noms; n++)
        printf("%s\n", noms[n]);

    /* libérer la mémoire allouée */
    free(noms);

    return 0;
}

ensuite, tu as juste besoin de la fonction strcmp() dans string.h pour les comparer

http://www.cplusplus.com/reference/cstring/strcmp/

et faire des permutations de pointeurs pour les classer dans l'ordre alphabétique

en toute rigueur, tu devrais utiliser un algorithme de tri (par exemple, pour faire simple le tri à bulles https://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles)

mais avec 3 éléments seulement c'est trivial et tu pourrais même tester tous les cas

je te laisse faire le tri :-)


Dal
Bonjour,


https://forums.commentcamarche.net/forum/affich-1896963-tri-par-ordre-alphabetique-en-c


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#define MAXN 30
#define MAX_etu 150

typedef struct etudiant {
char nom[MAXN];
char prenom[MAXN];
float med;
float final;
float tp;
}ETUDIANT;


void initialise(ETUDIANT *tab_etu, int nb_etu);


int recherchePosition(ETUDIANT* tab_etu,char nom1[MAXN],char prenom1[MAXN], int nbelements);
int comparer(char* nom1, char* nom2);
void insereNom(ETUDIANT *tab_etu, int nbelements,int pos);
void affiche(ETUDIANT *tab, int nb_etu);


int main()
{
ETUDIANT tab[MAX_etu];

int nb_etu;
float note;
char reponse;
int i=0,j=0;

printf("entrez le nombre d'etudiants\n");
scanf("%d",&nb_etu);
fgetc(stdin);

for(i=0;i<nb_etu;i++)
{initialise(tab,i);//fonction déja définie
j=recherchePosition(tab,tab[i].nom,tab[i].prenom,i);//c'est la fonction qui me pose le plus problème
printf("----------valeur retournee vaut-----%d--------------\n\n",j);// juste pour avoir le resultat sous les yeux
insereNom(tab,i+1, j);//pour inserer le dernier nom entré à la place qu'il doit occuper.
}
affiche(tab,nb_etu);//pour afficher le tableau
}


voici les fonctions que j'ai appelées sur le programme principal:

int recherchePosition(ETUDIANT* tab_etu,char nom1[MAXN],char prenom1[MAXN], int nbelements)
{
// int n, m,k=0,i=0;

int i;
int j=0;
for(i=0;i<=nbelements;i++)
{
if(strcmp((tab_etu[i].nom),nom1)<0)
{ j++;
}
}

return j;
}



void insereNom(ETUDIANT *tab_etu, int nbelements,int pos)
{
int i,j=nbelements;
i=pos; //recherchePosition(tab_etu,tab_etu[j-1].nom,tab_etu[j-1].prenom,nbelements);
j=nbelements;
while(j>i)

{
strcpy((tab_etu[j].nom),(tab_etu[j-1].nom));
strcpy((tab_etu[j].prenom),(tab_etu[j-1].prenom));
(tab_etu[j].med)=(tab_etu[j-1].med);
(tab_etu[j].final)=(tab_etu[j-1].final);
(tab_etu[j].tp)=(tab_etu[j-1].tp);
j--;

}
strcpy((tab_etu[i].nom),tab_etu[j-1].nom);

}

void affiche(ETUDIANT *tab, int nb_etu)
{
int j;
for(j=0;j<nb_etu;j++)
{
printf("\n%s",tab[j].nom);
printf("\n%s",tab[j].prenom);
prinf("\n%f",tab[j].med);
prinf("\n%f",tab[j].final);
prinf("\n%f",tab[j].tp);
}
}