Oppure

Loading
22/08/14 17:57
pingumen96
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
aaa
22/08/14 18:43
ZioCrocifisso
La funzione "qsort" della stdlib ti permette di ordinare un array qualunque usando una funzione comparatrice a tua scelta.
aaa
22/08/14 20:09
pingumen96
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.
aaa
22/08/14 22:30
nessuno
Ultima modifica effettuata da nessuno 22/08/14 22: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à.
23/08/14 17:29
pingumen96
Grazie mille, provo appena possibile :)
aaa
24/08/14 19:04
pingumen96
Allora, ho riscontrato alcuni errori, copio direttamente tutto il programma.

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

struct parole
{
    string nome, definizione;
} dizio1[10000];
char risp='s';
int I=0;

int compare(const void *a,const void *b)
{
    return ( *(int*)a - *(int*)b );
}


bool cont()
        {
            int tentativi=1;
            while(tentativi<4)
            {
                cout<<"Vuoi continuare? (s/n)"<<endl;
                char risp=0;
                cin>>risp;

                switch(risp)
                {
                case 's':
                    return true;
                case 'n':
                    return false;
                default:
                    cout<<"La risposta inserita non e' corretta. "<<tentativi<<"o tentativo su 4."<<endl;
                    tentativi++;
                }
            }
            cout<<"Lo prendero' come un no."<<endl;
            return false;
        }

void caricamento()
{
    while(cont==true&&I<20)
    {
        cout<<"Inserire nome parola"<<endl;
        cin>>dizio1[I].nome;
        cout<<"Definizione: "<<endl;
        getline(cin,dizio1[I].definizione);
        getline(cin,dizio1[I].definizione);
        I++;
        cont();
    }
};

void ordinamento()
{
    int n;
    qsort (dizio1.nome, I, sizeof(string), compare);
  return 0;
}

void visualizzazione()
{
    for(I=0;I<20;I++)
    {
        if(dizio1[I].nome=="");
        else
        cout<<endl<<"- - - -"<<dizio1[I].nome<<" - "<<dizio1[I].definizione<<endl<<endl;
    };
}

int main()
{
    caricamento();
    visualizzazione();
    ordinamento();
    cout<<"Ora verra' visualizzato il dizionario in ordine alfabetico:";
    visualizzazione();
}



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]|"
aaa
24/08/14 19:18
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).
aaa
24/08/14 19:26
pingumen96
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
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

ma come la adatto?
aaa