Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinamento di un array di struct
Forum - C/C++ - Ordinamento di un array di struct

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 19:57
Venerdì, 22/08/2014
Ciao a tutti, sono qui per chiedervi un aiuto.
Sto provando a creare un dizionario in C++ (molto semplice, sono agli inizi) e sono arrivato alla necessità di ordinare le parole che vengono inserite nella struct.

Avrei intenzione di usare qualche libreria già presente per ordinare l'array di struct (per le parole) basandomi sul nome della parola, che è una variabile all'interno della struct.

Come fare?
Grazie in anticipo. :D

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 20:43
Venerdì, 22/08/2014
La funzione "qsort" della stdlib ti permette di ordinare un array qualunque usando una funzione comparatrice a tua scelta.

PM Quote
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 22:09
Venerdì, 22/08/2014
Testo quotato

Postato originariamente da ZioCrocifisso:

La funzione "qsort" della stdlib ti permette di ordinare un array qualunque usando una funzione comparatrice a tua scelta.


Mhm, ok.
E un esempio di funzione comparatrice quale può essere?
Boh, tipo tra stringhe.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 0:30
Sabato, 23/08/2014

Ultima modifica effettuata da nessuno il 23/08/2014 alle 0:31


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 19:29
Sabato, 23/08/2014
Grazie mille, provo appena possibile :)

PM Quote
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 21:04
Domenica, 24/08/2014
Allora, ho riscontrato alcuni errori, copio direttamente tutto il programma.

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <string>
  3. #include <stdlib.h>
  4.  
  5. using namespace std;
  6.  
  7. struct parole
  8. {
  9.     string nome, definizione;
  10. } dizio1[10000];
  11. char risp='s';
  12. int I=0;
  13.  
  14. int compare(const void *a,const void *b)
  15. {
  16.     return ( *(int*)a - *(int*)b );
  17. }
  18.  
  19.  
  20. bool cont()
  21.         {
  22.             int tentativi=1;
  23.             while(tentativi<4)
  24.             {
  25.                 cout<<"Vuoi continuare? (s/n)"<<endl;
  26.                 char risp=0;
  27.                 cin>>risp;
  28.  
  29.                 switch(risp)
  30.                 {
  31.                 case 's':
  32.                     return true;
  33.                 case 'n':
  34.                     return false;
  35.                 default:
  36.                     cout<<"La risposta inserita non e' corretta. "<<tentativi<<"o tentativo su 4."<<endl;
  37.                     tentativi++;
  38.                 }
  39.             }
  40.             cout<<"Lo prendero' come un no."<<endl;
  41.             return false;
  42.         }
  43.  
  44. void caricamento()
  45. {
  46.     while(cont==true&&I<20)
  47.     {
  48.         cout<<"Inserire nome parola"<<endl;
  49.         cin>>dizio1[I].nome;
  50.         cout<<"Definizione: "<<endl;
  51.         getline(cin,dizio1[I].definizione);
  52.         getline(cin,dizio1[I].definizione);
  53.         I++;
  54.         cont();
  55.     }
  56. };
  57.  
  58. void ordinamento()
  59. {
  60.     int n;
  61.     qsort (dizio1.nome, I, sizeof(string), compare);
  62.   return 0;
  63. }
  64.  
  65. void visualizzazione()
  66. {
  67.     for(I=0;I<20;I++)
  68.     {
  69.         if(dizio1[I].nome=="");
  70.         else
  71.         cout<<endl<<"- - - -"<<dizio1[I].nome<<" - "<<dizio1[I].definizione<<endl<<endl;
  72.     };
  73. }
  74.  
  75. int main()
  76. {
  77.     caricamento();
  78.     visualizzazione();
  79.     ordinamento();
  80.     cout<<"Ora verra' visualizzato il dizionario in ordine alfabetico:";
  81.     visualizzazione();
  82. }



Un errore è nella riga 46, non va bene il confronto con la booleana e non ho idea del motivo.

Idem con l'altro errore alla riga 61:
"error: request for member 'nome' in 'dizio1', which is of non-class type 'parole [10000]'"

e 62:
"error: return-statement with a value, in function returning 'void' [-fpermissive]|"

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 21:18
Domenica, 24/08/2014
Per il primo errore: cont è una funzione, anche se è senza argomenti devi comunque chiamarla con () se vuoi ottenere il valore booleano che restituisce.
Per il secondo: dizio1 è un array di struct parole, non un singolo struct. Non puoi ottenere un campo da un array di struct, devi usare dizio1 e basta. Inoltre la tua funzione compare è sbagliata, dovresti usare quella che ti ha suggerito nessuno specificando però il campo della struct.
Per il terzo: beh mi sembra abbastanza chiaro, non puoi restituire un valore in una funzione che non dovrebbe (void).

PM Quote
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 21:26
Domenica, 24/08/2014
Testo quotato

Postato originariamente da ZioCrocifisso:

Per il primo errore: cont è una funzione, anche se è senza argomenti devi comunque chiamarla con () se vuoi ottenere il valore booleano che restituisce.
Per il secondo: dizio1 è un array di struct parole, non un singolo struct. Non puoi ottenere un campo da un array di struct, devi usare dizio1 e basta. Inoltre la tua funzione compare è sbagliata, dovresti usare quella che ti ha suggerito nessuno specificando però il campo della struct.
Per il terzo: beh mi sembra abbastanza chiaro, non puoi restituire un valore in una funzione che non dovrebbe (void).


Ok, il primo errore mi è chiarissimo, idem il terzo e li ho corretti.

Per il secondo non ci sono con la funzione compare.
La sintassi ok, è questa
Codice sorgente - presumibilmente C++

  1. int compare (const void * a, const void * b)
  2. {
  3.   return ( *(int*)a - *(int*)b );
  4. }


ma come la adatto?

PM Quote
Avatar
ghostmars919 (Member)
Newbie


Messaggi: 9
Iscritto: 06/09/2012

Segnala al moderatore
Postato alle 21:37
Domenica, 24/08/2014
Devi passare due parametri alla funzione... In questo caso le parole che devono essere confrontate per poi poterle ordinare.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo