2012-11-14 15 views
10

Dato un array di strutture (in C) sto tentando di stampare i risultati in gruppi di genere e nel sottordine per ordine numerico. Per esempio:ordinamento membri dell'array di strutture

struct employee{ 
char gender[13] 
char name[13]; 
int id; 
}; 

dire che io definisco la matrice struttura in questo modo:

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

Come potrei fare per la stampa dei risultati come

1234 Matt 
1235 Josh 


2345 Jessica 

risposta

15

Avrai bisogno di implementare una funzione di ordinamento che confronta le struct come richiedete

int compare(const void *s1, const void *s2) 
{ 
    struct employee *e1 = (struct employee *)s1; 
    struct employee *e2 = (struct employee *)s2; 
    int gendercompare = strcmp(e1->gender, e2->gender); 
    if (gendercompare == 0) /* same gender so sort by id */ 
    return e1->id - e2->id; 
    else 
    return -gendercompare; /* the minus puts "male" first as in the question */ 
} 

e quindi utilizzare qsort della libreria standard.

qsort(data, count, sizeof(struct employee), compare); 

All'interno della funzione di confronto si consiglia di verificare la presenza di id parità di condizioni, allora si può ordinare per nome (anche utilizzando strcmp()) come più vi piace.

Ken

Edit: appena compilato e fissato questo. Ecco un piccolo programma di test

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

    struct employee{ 
     char gender[13]; 
     char name[13]; 
     int id; 
    }; 

    int compare(const void *s1, const void *s2) 
    { 
     struct employee *e1 = (struct employee *)s1; 
     struct employee *e2 = (struct employee *)s2; 
     int gendercompare = strcmp(e1->gender, e2->gender); 
     if (gendercompare == 0) /* same gender so sort by id */ 
     return e1->id - e2->id; 
     else 
     return -gendercompare; 
    } 

    main() 
    { 
     int i; 
     struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

     for (i = 0; i < 3; ++i) 
     printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); 

     qsort(info, 3, sizeof(struct employee), compare); 

     for (i = 0; i < 3; ++i) 
     printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); 
    } 

Con uscita:

$ ./a.exe 
1234 male Matt 
2345 female Jessica 
1235 male Josh 
1234 male Matt 
1235 male Josh 
2345 female Jessica 
+1

Penso che vogliamo "ordine secondario in ordine numerico" – dreamcrash

+0

Ecco una sorta di domanda fuori ma dire che definisco una funzione. Come passarei i conenti delle informazioni sui dipendenti a quella funzione? – bardockyo

+0

Se qualcuno ha problemi a capire questo, può fare riferimento a https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/qsort.htm –

2

Usa il tuo algoritmo di ordinamento preferito sul struct array. Quando si confrontano due elementi dell'array per decidere quale è "maggiore", confrontare i loro sessi; se i sessi sono uguali, confronta i loro numeri. (Si consiglia di definire una funzione separata per fare questo confronto, per rendere le cose più chiare.) Successivamente, stampare la matrice ordinata in ordine usando la formattazione desiderata. Tieni traccia di quando il sesso passa da maschio a femmina in modo da poter inserire tre nuove righe aggiuntive, come nel tuo esempio.

Modifica: per prendere in prestito spudoratamente da kallikak, puoi semplicemente passare la funzione di confronto a qsort, ma farlo restituire 1 se una struttura è "maggiore", -1 se è "minore" e (se necessario) 0 se è lo stesso (usando la procedura che ho descritto sopra). Dai un'occhiata a How to write a compare function for qsort from stdlib? per aiuto su come scrivere una funzione di confronto personalizzata.

+0

Grazie ad entrambi per la risposta. Mi stavo chiedendo come controllare anche il genere mentre si utilizza un algoritmo di ordinamento. Ad esempio, diciamo che sto usando quicksort se right è bardockyo

+0

Vedere il metodo di confronto nel mio esempio. Puoi controllare tutti i campi della tua struttura mentre decidi di ordinare. – kallikak

0

che sia più facile da capire, come sono debole nel puntatore, spero che aiuta ............

#include<bits/stdc++.h> 

using namespace std; 


struct employee{ 
    char gender[13]; 
    char name[13]; 
    int id; 
}; 

bool compare(employee s1,employee s2) 
{ 
    return s1.id<s2.id; 
} 

main() 
{ 
    int i; 
    struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 
    sort(info,info+3,compare); 
    for (i = 0; i < 3; i++) 
    printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name); 
} 
Problemi correlati