2016-02-06 2 views
0

Actuellement, je suis ceci:tri ne trie pas le premier élément du tableau

struct employe{ 
    char nomE[25]; 
    char posteE; 
    float nbHeureE; 
    float tauxE; 
} employes[16]; 
int nbPers = 0; 

void readFile(){ 
    int i=0; 

    FILE * entree; 
    if(entree = fopen("employes.dat", "r")) 
    { 
     fscanf(entree, "%24c %c %f %f", &employes[i].nomE, &employes[i].posteE, &employes[i].nbHeureE, &employes[i].tauxE); 
     nbPers++; 
     while(!feof(entree)) 
     { 
      i++; 
      fscanf(entree, "%24c %c %f %f", &employes[i].nomE, &employes[i].posteE, &employes[i].nbHeureE, &employes[i].tauxE); 
      nbPers++; 
     } 
     fclose(entree); 
    } 
    else printf("Impossible d'ouvrir le fichier!\n"); 
} 

void trier(struct employe employes[], int nbPers){ 
    int j,i,k; 
    struct employe temp; 
    for(i=0;i<16;i++) 
    { 
     for(j=1;j<15;j++) 
     { 
      if(strcmp(employes[i].nomE, employes[j].nomE) < 0) 
      { 
       temp = employes[i]; 
       employes[i] =employes[j]; 
       employes[j] = temp; 
      } 
     } 
    } 
} 

int main() { 
    int p=0; 

    readFile(); 
    trier(employes, nbPers); 
    for(p=0; p<nbPers; p++) 
    printf("%s", employes[p].nomE); 

    return 0; 
} 

employes.dat ressemble à ceci:

Tremblay Alain   A 35.0 35.5 
Vachon Jean    P 40.0 22.75 
Lapalme Justin   O 40.0 15.75 
Deschenes Sylvie   P 35.0 25.0 
Lachance Carl   O 37.5 18.0 
Labonte Chantal   P 40.0 20.0 
Doucet Michel   A 40.0 33.75 
Desjardins Alex   P 35.0 25.0 
Tardif Guy    A 40.0 28.5 
Clinclin Stephane  O 40.0 20.75 
Lafleur Marie   A 37.5 32.75 
Desbiens Robert   P 35.0 25.0 
Desautels Maryse   P 35.0 26.0 
St-germain guy   O 37.5 15.0 
Bourgeois Louis   A 37.5 29.0 
St-amour Flavie   P 40.0 25.0 

Je suis en train de trier ma structure employee par ordre alphabétique du nom (char nomE [25];). Mais, pour une raison quelconque, il dosnt sorte le premier nom et ce sorties:

Tremblay Alain 
Bourgeois Louis 
Clinclin Stephane 
Desautels Maryse 
Desbiens Robert 
Deschenes Sylvie 
Desjardins Alex 
Doucet Michel 
Labonte Chantal 
Lachance Carl 
Lafleur Marie 
Lapalme Justin 
St-amour Flavie 
St-germain guy 
Tardif Guy 
Vachon Jean 

Si quelqu'un a une idée pourquoi, je voudrais vraiment apprécier la réponse. Merci d'avance.

+0

Je pense que ce lien devrait vous aider http://stackoverflow.com/questions/28071593/read-lines-from-a-file-and-create-alphabetically-sorted-array – viratpuar

+0

Je n'ai pas essayé votre code mais D'après ce que je me souviens de BubbleSort (gasp!), la boucle interne devrait être quelque chose comme 'for (j = i; j <16; j ++)' ... et quand tout sera compris, vous pourriez vouloir enlever le hardcoded 16 (juste en disant). À votre santé. –

+0

J'ai essayé ce que vous avez suggéré mais il inverse seulement l'ordre alphabétique et saute toujours le prénom. –

Répondre

0

Change:

for(i=0;i<16;i++) { 
    for(j=1;j<15;j++){ 

à:

for(i=0;i<16;i++) { 
    for(j=0;j<15;j++){ 

EDIT: Vous avez confondu SelectionSort avec BubbleSort. SelectionSort va de pair avec i = 0 et j = i + 1 mais aussi avec i < 15 et j < 16, alors que BubbleSort est i = 1-i < 16 et j = 0 et j < 15. La version donnée ci-dessus a l'inconvénient de faire un peu plus d'échanges que nécessaire, mais produit toujours le résultat correct à la fin. Voir mon commentaire pour sa mise en œuvre dans ideone.com environnement. Parce que vous n'avez pas besoin de vérifier le premier élément après la première itération.

+0

Il va maintenant à la fin quand il est supposé aller entre Tardif Guy et Vachon Jean ... –

+0

Non, je comprends bien [ici] (http://ideone.com/ohLZSE). C'est peut-être parce que vous faites courir le 15ème élément avec '<15' au lieu de' <16' s'il n'y a pas de 'Vachon Jean' à la fin. Normalement, Tremblay Alain est le dernier mais trié. – user8

+0

Il n'y a pas de différence, il vous suffit d'accéder aux éléments (noms) à travers chaque structure dans le tableau de la structure. – user8