Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Odinare una classifica

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    7

    Odinare una classifica

    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;

  2. #2
    Hai letto il regolamento del forum?
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  3. #3
    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 è
    codice:
    #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

    codice:
    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à

    codice:
      squadra squadre [ numero_squadre ];
    
    ....
    ....
    
       qsort(&squadre[0], num_squadre, sizeof( squadra *), cmpsquadre);
    ho fatto tutto a mente, può esserci qualche imprecisione
    ciao
    sergio

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    7
    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;
    };

  5. #5
    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

    codice:
    static int
    cmpsquadre (const void *p1, const void *p2)
    {
    
       SQUADRA *s1 = ( SQUADRA * ) p1;
       SQUADRA *s2 = ( SQUADRA * ) p2;
    
    
       return ( s1->punti - s2->punti );
    
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie mondobimbi.
    ma perchè la definizione:
    codice:
    #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...

  7. #7
    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    7
    Ho fatto così:


    .
    Codice PHP:
    .... 
      
    qsort(testanum ,sizeof(classifica), Confronta); 
    ..... 

      
    int Confronta(const void *p1, const void *p2)
     {     
    SQUADRAs1 = (SQUADRA*)p1;  
           
    SQUADRAs2 = (SQUADRA*)p2
     
            return(
    s1->punti-s2->punti);    

      } 
    ma non funziona

  9. #9
    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 );

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    7
    ma io per registrare le squadre faccio un'allocazione dinamica, un inserimento ordinato...
    non uso nessun vettore... cambia molto? (non sono molto pratico.. )

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.