Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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 - Pagina 2

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


Messaggi: 9
Iscritto: 30/10/2013

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

Postato originariamente da ghostmars919:

Devi passare due parametri alla funzione... In questo caso le parole che devono essere confrontate per poi poterle ordinare.


Augh ghostmars.

E i parametri come li scrivo?
E' un array, non saprei come scriverlo in modo che passi tutto...
Sto entrando un pochino in palla.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6133
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:32
Domenica, 24/08/2014
Scusa ma se vuoi usare il C++ perché complicarsi la vita con gli array e qsort?

Utilizza un vector e un sort.


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
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 16:04
Lunedì, 25/08/2014
La funzione che devi passare a qsort prende come argomenti due elementi dell'array e restituisce un valore che indica se i due elementi sono uguali oppure quale dei due è maggiore. Non sei tu che devi passargli argomenti, ma è qsort che lo fa. Infatti chiama la tua funzione ogni volta che ha bisogno di sapere che relazione c'è tra due elementi. Quella definizione probabilmente l'hai presa da internet e non va bene perché così non capirai nulla. Devi creare una funzione compare che accetta due argomenti di tipo puntatore a struct parola e che restituisce un valore positivo quando il primo elemento dev'essere messo dopo il secondo, zero quando sono uguali e negativo quando il primo va prima del secondo.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 16:37
Lunedì, 25/08/2014
Io darei inoltre un'occhiatina qui: http://www.cplusplus.com/reference/string/string/compare/
giusto per avere un'idea di come eseguire il confronto tra stringhe

PM Quote
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 19:51
Martedì, 26/08/2014
Testo quotato

Postato originariamente da nessuno:

Scusa ma se vuoi usare il C++ perché complicarsi la vita con gli array e qsort?

Utilizza un vector e un sort.


Non ho abbastanza dimestichezza con il vector, sono alle prime armi.
Però ci ho provato ed ecco il risultato:
Codice sorgente - presumibilmente C++

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


Il problema è alla riga 66, suppongo... non ho capito come fare la comparazione.
Testo quotato

Postato originariamente da ZioCrocifisso:

La funzione che devi passare a qsort prende come argomenti due elementi dell'array e restituisce un valore che indica se i due elementi sono uguali oppure quale dei due è maggiore. Non sei tu che devi passargli argomenti, ma è qsort che lo fa. Infatti chiama la tua funzione ogni volta che ha bisogno di sapere che relazione c'è tra due elementi. Quella definizione probabilmente l'hai presa da internet e non va bene perché così non capirai nulla. Devi creare una funzione compare che accetta due argomenti di tipo puntatore a struct parola e che restituisce un valore positivo quando il primo elemento dev'essere messo dopo il secondo, zero quando sono uguali e negativo quando il primo va prima del secondo.


Credo di esserci quasi.
Non capisco solo come faccio a puntare su un elemento della struct, per il resto ho capito.

Testo quotato

Postato originariamente da TheDarkJuster:

Io darei inoltre un'occhiatina qui: http://www.cplusplus.com/reference/string/string/compare/
giusto per avere un'idea di come eseguire il confronto tra stringhe


Non bastano i simboli <, > e ==?
Se penso male significa che dovrei rivedermi le stringhe.

Ultima modifica effettuata da pingumen96 il 26/08/2014 alle 20:00
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:59
Mercoledì, 27/08/2014
Da quel che vedo e che posso capire non hai studiato C++, ma solo C, e sena i puntatori. E questo è MOLTO male. Non ti sto rimproverando, non c'è niente di male a non saper usare gli oggetti e i template, solo che i puntatori sono importantissimi, provvedi a studiare come funzionano. Detto questo:
una stringa è un array di caratteri, che termina con un byte 0. per intenderci

char a[5] = "ciao";

significa:
a[0] = 'c'
a[1] = 'i'
a[2] = 'a'
a[3] = 'o'
!!! a[4] = 0x00 !!!

usare == <= >= non ha alcun senso. Secondo quale criterio
albero è maggiore o minore o uguale di banana?
Allora per fare le comparazioni devi usare: strcmp, funzione di libreria, che accetta come parametro due puntatori (a un dato di tipo char).
Questa funziona restituisce 0 se le due stringhe sono uguali,
un numero negativo se il primo carattere diverso nel primo argomento viene prima (vedi codice ASCII)
un numero positivo se il primo carattere diverso nel secondo argomento viene dopo.

String.Compare fa la stessa cosa, solo che invece di farlo con array di caratteri lo fa con delle stringhe (string).

Il tuo compare dovrà essere definito così (prototipo di funzione):
Codice sorgente - presumibilmente C/C++

  1. int compare(string*, string*);


PM Quote
Avatar
pingumen96 (Normal User)
Newbie


Messaggi: 9
Iscritto: 30/10/2013

Segnala al moderatore
Postato alle 16:28
Giovedì, 28/08/2014
Grazie per le dritte, DarkJuster.
Studio i puntatori prima di seguire il tuo consiglio per il compare :yup:

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo