Optimize code
This commit is contained in:
parent
b69aa774ad
commit
dc1aab94ac
|
@ -1,114 +1,114 @@
|
||||||
/*
|
/*
|
||||||
AUTORE: Manuel Vichi
|
AUTORE: Manuel Vichi
|
||||||
Esercizio su qsort con array di struct (con spiegazione codice)
|
Esercizio su qsort con array di struct (con spiegazione codice)
|
||||||
*/
|
*/
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char nome;
|
char nome;
|
||||||
char cognome;
|
char cognome;
|
||||||
int annoDiNascita;
|
int annoDiNascita;
|
||||||
} Persona;
|
} Persona;
|
||||||
|
|
||||||
char letteraCasuale() {
|
char letteraCasuale() {
|
||||||
return 'A' + rand() % 26;
|
return 'A' + rand() % 26;
|
||||||
}
|
}
|
||||||
|
|
||||||
int annoCasuale() {
|
int annoCasuale() {
|
||||||
return 1990 + rand() % 21;
|
return 1990 + rand() % 21;
|
||||||
}
|
}
|
||||||
|
|
||||||
int confrontaPerCognome(const void* a, const void* b) {
|
int confrontaPerCognome(const void* a, const void* b) {
|
||||||
Persona* p1 = (Persona*)a;
|
Persona* p1 = (Persona*)a;
|
||||||
Persona* p2 = (Persona*)b;
|
Persona* p2 = (Persona*)b;
|
||||||
return p1->cognome - p2->cognome;
|
return p1->cognome - p2->cognome;
|
||||||
}
|
}
|
||||||
|
|
||||||
int confrontaPerAnnoDiNascita(const void* a, const void* b) {
|
int confrontaPerAnnoDiNascita(const void* a, const void* b) {
|
||||||
Persona* p1 = (Persona*)a;
|
Persona* p1 = (Persona*)a;
|
||||||
Persona* p2 = (Persona*)b;
|
Persona* p2 = (Persona*)b;
|
||||||
return p2->annoDiNascita - p1->annoDiNascita;
|
return p2->annoDiNascita - p1->annoDiNascita;
|
||||||
}
|
}
|
||||||
|
|
||||||
int confrontaPerNomeCognome(const void* a, const void* b) {
|
int confrontaPerNomeCognome(const void* a, const void* b) {
|
||||||
Persona* p1 = (Persona*)a;
|
Persona* p1 = (Persona*)a;
|
||||||
Persona* p2 = (Persona*)b;
|
Persona* p2 = (Persona*)b;
|
||||||
if (p1->nome == p2->nome) {
|
if (p1->nome == p2->nome) {
|
||||||
return p2->cognome - p1->cognome;
|
return p2->cognome - p1->cognome;
|
||||||
}
|
}
|
||||||
return p2->nome - p1->nome;
|
return p2->nome - p1->nome;
|
||||||
}
|
}
|
||||||
void stampaPersone(Persona persone[], int size) {
|
void stampaPersone(Persona persone[], int size) {
|
||||||
cout << "Nome " << " Cognome " << " Anno di Nascita" << endl;
|
cout << "Nome " << " Cognome " << " Anno di Nascita" << endl;
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
cout << setw(2) << persone[i].nome << ". " << setw(6) << persone[i].cognome << ". " << setw(12) << persone[i].annoDiNascita << endl;
|
cout << setw(2) << persone[i].nome << ". " << setw(6) << persone[i].cognome << ". " << setw(12) << persone[i].annoDiNascita << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
srand((time(NULL)));
|
srand((time(NULL)));
|
||||||
int size = 10;
|
int size = 10;
|
||||||
Persona persone[size];
|
Persona persone[size];
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; i++) {
|
||||||
persone[i].nome = letteraCasuale();
|
persone[i].nome = letteraCasuale();
|
||||||
persone[i].cognome = letteraCasuale();
|
persone[i].cognome = letteraCasuale();
|
||||||
persone[i].annoDiNascita = annoCasuale();
|
persone[i].annoDiNascita = annoCasuale();
|
||||||
}
|
}
|
||||||
cout << "Persone prima dell'ordinamento:" << endl;
|
cout << "Persone prima dell'ordinamento:" << endl;
|
||||||
stampaPersone(persone, size);
|
stampaPersone(persone, size);
|
||||||
qsort(persone, size, sizeof(Persona), confrontaPerCognome);
|
qsort(persone, size, sizeof(Persona), confrontaPerCognome);
|
||||||
cout << endl << "Ordinamento per cognome crescente:" << endl;
|
cout << endl << "Ordinamento per cognome crescente:" << endl;
|
||||||
stampaPersone(persone, size);
|
stampaPersone(persone, size);
|
||||||
qsort(persone, size, sizeof(Persona), confrontaPerAnnoDiNascita);
|
qsort(persone, size, sizeof(Persona), confrontaPerAnnoDiNascita);
|
||||||
cout << endl << "Ordinamento per anno di nascita decrescente:" << endl;
|
cout << endl << "Ordinamento per anno di nascita decrescente:" << endl;
|
||||||
stampaPersone(persone, size);
|
stampaPersone(persone, size);
|
||||||
qsort(persone, size, sizeof(Persona), confrontaPerNomeCognome);
|
qsort(persone, size, sizeof(Persona), confrontaPerNomeCognome);
|
||||||
cout << endl << "Ordinamento per nome decrescente ed eventualmente per cognome decrescente:" << endl;
|
cout << endl << "Ordinamento per nome decrescente ed eventualmente per cognome decrescente:" << endl;
|
||||||
stampaPersone(persone, size);
|
stampaPersone(persone, size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Spiegazione del codice:
|
Spiegazione del codice:
|
||||||
|
|
||||||
1. Struct Persona:
|
1. Struct Persona:
|
||||||
La struct contiene tre campi:
|
La struct contiene tre campi:
|
||||||
nome: l'iniziale del nome.
|
nome: l'iniziale del nome.
|
||||||
cognome: l'iniziale del cognome.
|
cognome: l'iniziale del cognome.
|
||||||
annoDiNascita: l'anno di nascita della persona.
|
annoDiNascita: l'anno di nascita della persona.
|
||||||
|
|
||||||
Generazione di valori casuali:
|
Generazione di valori casuali:
|
||||||
La funzione letteraCasuale() restituisce un carattere casuale tra 'A' e 'Z'.
|
La funzione letteraCasuale() restituisce un carattere casuale tra 'A' e 'Z'.
|
||||||
La funzione annoCasuale() restituisce un numero casuale tra 1990 e 2010.
|
La funzione annoCasuale() restituisce un numero casuale tra 1990 e 2010.
|
||||||
|
|
||||||
2. Ordinamento:
|
2. Ordinamento:
|
||||||
Vengono definiti tre metodi di confronto utilizzabili con qsort:
|
Vengono definiti tre metodi di confronto utilizzabili con qsort:
|
||||||
confrontaPerCognome() ordina in base al cognome crescente.
|
confrontaPerCognome() ordina in base al cognome crescente.
|
||||||
confrontaPerAnnoDiNascita() ordina in base all'anno di nascita decrescente.
|
confrontaPerAnnoDiNascita() ordina in base all'anno di nascita decrescente.
|
||||||
confrontaPerNomeCognome() ordina prima per nome decrescente e, in caso di parità, per cognome decrescente.
|
confrontaPerNomeCognome() ordina prima per nome decrescente e, in caso di parità, per cognome decrescente.
|
||||||
|
|
||||||
Funzione qsort:
|
Funzione qsort:
|
||||||
La funzione qsort() di C++ è usata per ordinare l'array di persone. È una funzione standard che richiede:
|
La funzione qsort() di C++ è usata per ordinare l'array di persone. È una funzione standard che richiede:
|
||||||
Il puntatore all'array da ordinare.
|
Il puntatore all'array da ordinare.
|
||||||
Il numero di elementi nell'array.
|
Il numero di elementi nell'array.
|
||||||
La dimensione di ogni elemento (in questo caso sizeof(Persona)).
|
La dimensione di ogni elemento (in questo caso sizeof(Persona)).
|
||||||
Una funzione di confronto che stabilisce come ordinare gli elementi.
|
Una funzione di confronto che stabilisce come ordinare gli elementi.
|
||||||
|
|
||||||
3. Stampa dell'array:
|
3. Stampa dell'array:
|
||||||
La funzione stampaPersone() stampa il contenuto dell'array di persone in un formato leggibile.
|
La funzione stampaPersone() stampa il contenuto dell'array di persone in un formato leggibile.
|
||||||
|
|
||||||
Dettagli sull'ordinamento:
|
Dettagli sull'ordinamento:
|
||||||
|
|
||||||
Ordinamento per cognome crescente:
|
Ordinamento per cognome crescente:
|
||||||
qsort utilizza confrontaPerCognome() per confrontare i cognomi delle persone e ordinarle in ordine crescente.
|
qsort utilizza confrontaPerCognome() per confrontare i cognomi delle persone e ordinarle in ordine crescente.
|
||||||
|
|
||||||
Ordinamento per anno di nascita decrescente:
|
Ordinamento per anno di nascita decrescente:
|
||||||
qsort utilizza confrontaPerAnnoDiNascita() per confrontare gli anni di nascita e ordinarli in ordine decrescente.
|
qsort utilizza confrontaPerAnnoDiNascita() per confrontare gli anni di nascita e ordinarli in ordine decrescente.
|
||||||
|
|
||||||
Ordinamento per nome decrescente e, a parità di nome, per cognome decrescente:
|
Ordinamento per nome decrescente e, a parità di nome, per cognome decrescente:
|
||||||
qsort utilizza confrontaPerNomeCognome() per ordinare prima in base al nome in ordine decrescente, e in caso di parità, ordina in base al cognome decrescente.
|
qsort utilizza confrontaPerNomeCognome() per ordinare prima in base al nome in ordine decrescente, e in caso di parità, ordina in base al cognome decrescente.
|
||||||
*/
|
*/
|
|
@ -54,7 +54,7 @@ int main(void) {
|
||||||
srand((time(NULL)));
|
srand((time(NULL)));
|
||||||
int size = 10;
|
int size = 10;
|
||||||
Persona persone[size];
|
Persona persone[size];
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; i++) {
|
||||||
persone[i].nome = letteraCasuale();
|
persone[i].nome = letteraCasuale();
|
||||||
persone[i].cognome = letteraCasuale();
|
persone[i].cognome = letteraCasuale();
|
||||||
persone[i].annoDiNascita = annoCasuale();
|
persone[i].annoDiNascita = annoCasuale();
|
||||||
|
|
Loading…
Reference in New Issue