Update struct/ordinamenti_qsort.cpp

This commit is contained in:
Vichingo455 2025-01-22 17:32:49 +00:00
parent f461eb02fb
commit 854e1351ad
1 changed files with 113 additions and 113 deletions

View File

@ -1,114 +1,114 @@
/* /*
AUTORE: Manuel Vichi AUTORE: Manuel Vichi
Esercizio su qsort con array di struct 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.
*/ */