PDA

Visualizza la versione completa : Odinare una classifica


Fagna
21-08-2008, 12:36
salve, avrei bisogno di aiuto per un esame..
in pratica dovrei ordinare una classifica che ha questa struttura dati per squadra

typedef struct squadra
{
char nome[31];
int golfatti;
int golsubiti;
int vittorie;
int pareggi;
int sconfitte;
int punti;
}SQUADRA;

pallinopinco
21-08-2008, 13:02
Hai letto il regolamento del forum?

mondobimbi
21-08-2008, 15:19
dovresti precisare se la tua richiesta Ŕ relativa al C o al C++.
Suppongo che si tratti di C, una soluzione possibile Ŕ quella di utilizzare la funzione di libreria qsort .
Non so la tua conoscenza del C, l'utilizzo di questa funzione presuppone la conoscenza dei puntatori e dei puntatari a funzione.
Il prototipo della funzione Ŕ


#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));


e la trovi descritta in rete o su qualunque libro di testo del C.
La funzione di comparazione riceverÓ, nel tuo caso, come argomento due puntatori alla tua struttura, e sarÓ del tipo



static int
cmpsquadre (const void *p1, const void *p2)
{

squadra *s1 = ( squadra * ) p1;
squadra *s2 = ( squadra * ) p2;


return strcmp( s1->nome, s2->nome );

}


la chiamata alla funzione risulterÓ




squadra squadre [ numero_squadre ];

....
....

qsort(&squadre[0], num_squadre, sizeof( squadra *), cmpsquadre);



ho fatto tutto a mente, pu˛ esserci qualche imprecisione
ciao
sergio

Fagna
21-08-2008, 17:17
scusa se non ho precisato..
il inguaggio Ŕ il c++. cambia qualcosa ad usare qsort?

e la struttura dati completa Ŕ

typedef struct squadra
{
char nome[31];
int golfatti;
int golsubiti;
int vittorie;
int pareggi;
int sconfitte;
int punti;
}SQUADRA;

//vettore legato alla lista squadra per identificare la squadra e i suoi dati
typedef struct classifica
{
SQUADRA dati;
struct classifica *next;
};

mondobimbi
21-08-2008, 18:12
in c++ puoi utilizzare la libreria STD e i suoi algoritmi.

Comunque lo stesso risultato lo ottieni con la qsort., ma non puoi utilizzare una lista concatenata, ma devi crearti una array di SQUADRA.
Mi correggo la funzione di comparazione che se applicata ai punti e non ai nome diviene



static int
cmpsquadre (const void *p1, const void *p2)
{

SQUADRA *s1 = ( SQUADRA * ) p1;
SQUADRA *s2 = ( SQUADRA * ) p2;


return ( s1->punti - s2->punti );

}

giuseppe500
21-08-2008, 19:23
grazie mondobimbi.
ma perchŔ la definizione:


#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));


ha questo parametro:
const void *
Ŕ un puntatore a void suppongo ,
perchŔ const?
perchŔ ci vanno a finire due elementi struct SQUADRA?

scusa se sono pesante, ma Ŕ per chiarirmi le idee...

mondobimbi
21-08-2008, 21:36
la qsort, cosý come pensata, deve funzionare con qualsiasi tipo di dato organizzato in una array.
compar Ŕ definito come un puntatore a funzione che ritorna un int ed ha come argomento due puntatori a const void , perchŔ a priori non si sa quale dato dovrÓ confrontare.
Questa funzione sarÓ richiamata all'interno della implementazione della funzione qsort Ŕ ritornerÓ un valore intero che Ŕ == 0 se gli elementi che si confrontano in quel momento sono uguali < di zero o maggiore di zero altrimenti, stesso funzionamento che ha la strcmp .
La funzione compare la definisci tu, perchŔ solo tu sai come ordinare l'array del tipo che hai creato.
In questo caso tu vuoi ordinare la tua array in ordine crescente del campo punti della struttura SQUADRA.
Durante il riordinamento la funzione qsort considererÓ due elementi della tua array (quelli che in quel momento sono da riordinare) e chiamerÓ la funzione compar che riceverÓ i puntatori a quei dati. Sebbene quindi dichiarati come const void * va quindi fatto un cast alla struttura SQUADRA per poter accedere ai loro campi punti, che sono quelli che andranno confrontati. La funzione, nel tuo caso, semplicemente ritorna la differenza trai due interi perchŔ questo giÓ rispetta la specifica della funzione compar.
Ti ricordo per˛ che le tue squadre dovranno essere organizzate in una array per utilizzare la funzione qsort.
ciao
sergio

Fagna
22-08-2008, 10:52
Ho fatto cosý:


.

....
qsort(testa, num ,sizeof(classifica), Confronta);
.....

int Confronta(const void *p1, const void *p2)
{ SQUADRA* s1 = (SQUADRA*)p1;
SQUADRA* s2 = (SQUADRA*)p2;

return(s1->punti-s2->punti);

}

ma non funziona :(

mondobimbi
22-08-2008, 11:35
devi usare un array, nel tuo caso un array di SQUADRA per poter utilizzare la qsort.

Per esempio con una allocazione statica ( ma puoi farla anche dinamica con malloc ),

SQUADRA campionato [ numero_squadre ] ;

poi inserisci in campionato [0] ... campionato [n] le tue squadre.

la chiamata a qsort la fai cosý

qsort ( &campionato [ 0 ], numero_squadre, sizeof ( SQUADRA ), Confronta );

o analogo


qsort ( campionato, numero_squadre, sizeof ( SQUADRA ), Confronta );

Fagna
22-08-2008, 12:04
ma io per registrare le squadre faccio un'allocazione dinamica, un inserimento ordinato...
non uso nessun vettore... cambia molto? (non sono molto pratico.. :( )

Loading