10 aprile 2024
Il C non permette di definire Classi e oggetti, si possono comunque definire dei tipi aggiuntivi per aggregare dati:
struct
Una struttura è un insieme di dati, si differenzia dagli array perché:
Si possono inizializzare le strutture quando vengono dichiarate:
Si possono inizializzare meno elementi rispetto a quelli dichiarati, in questo caso gli elementi non inizializzati vengono impostati a 0.
Un modo alternativo di inizializzare:
Per accedere ai singoli elementi di una struttura (detti anche membri) si usa l’operatore .
(punto) dopo il nome della variabile:
Si può copiare interamente una struttura usando una variabile dello stesso tipo:
Importante
Solo l’operatore =
è valido tra 2 struct, gli operatori ==
e !=
NON si possono usare per vedere se due strutture sono uguali.
Le stutture possono avere un nome, gli si può associare un tipo, oppure possono essere anonime.
Le strutture col nome, detto structure tag, si dichiarano come abbiamo già visto:
Avviso
Il tipo di una variabile struct
è struct nome_struct
, omettere la parola struct è un errore.
Nel caso in cui un si voglia usare una struct solo in un punto specifico del codice non è necessario associarvi un nome, si può dichiarare e associare direttamente:
typedef
è un operatore che permette di definire alias per i tipi:
Queste dichiarazioni permettono scrivere codice più chiaro.
Dal momento che le strutture sono usate moltissimo e i programmatori sono pigri, solitamente, si preferisce omettere la parola chiave struct
per riferirsi al tipo delle strutture grazie a typedef:
Una volta definito il tipo con typedef, si può popolare una struttura con la stessa sintassi dell’inizializzazione, occorre fare un cast esplicito però:
struct
A prescindere da quale metodo di definizione si scelga, le strutture possono essere argomenti di funzioni e restituite da funzioni:
struct
e puntatoriSi possono creare puntatori a strutture (come per qualsiasi altro tipo di dato):
struct
Si vuole creare un sistema informatico per la gestione squadra della nazionale Italiana di calcio che giocò ai mondiali del 1982:
Ai fini della classifica è necessario memorizzare il nome della squadra e i punti ottenuti:
La struct Giocatore
è di fatto un tipo di dato, possiamo quindi creare un array di esami dove memorizzare la formazione:
Per ordinare i giocatori in base al numero di maglia, bisogna introdurre un algoritmo di ordinamento:
Il più intuitivo, ma non il più efficiente, è il Bubble Sort:
Si può inizializzare solo un elemento di una union:
Come per le strutture, posso dare nomi alle unioni tramite tag oppure con typedef.
In molti programmi si usano interi come “codici” per indicare varie cose. Un caso comune sono per esempio i codici di errore.
Spesso si usano macro o costanti, ma è più chiaro usare enumerazioni:
enum {CUORI, QUADRI, FIORI, PICCHE} s1, s2;
Ora le variabili s1
e s2
possono assumere solo uno dei quattro valori definiti.
Le strutture sono molto utili per definire… strutture dati.
Per esempio si possono definire array dinamici, liste concatenate, alberi, pile, code…
Gli array in C sono molto limitati, infatti dobbiamo gestire la loro lunghezza a mano…
Si può creare una struttura che contenga un array e la sua lunghezza:
Adesso si può passare la struttura come argomento di una funzione:
void stampa_array(IntArray a) {
for (int i = 0; i < a.length; i++) {
printf("%d ", a.array[i]);
}
printf("\n");
}
Si nota subito che non abbiamo più bisogno di passare la lunghezza dell’array come argomento.
Dati e Algoritmi