È necessario memorizzare mille numeri interi. Vuoi davvero dichiarare “int a, b, c…” fino a “z” e poi andare avanti? No. È noioso e soggetto a errori. Invece, usi un array.
Un array è una raccolta di valori dello stesso tipo. Li racchiude in un unico blocco di memoria. In C, lo dichiari in questo modo:
int a[5];
Questo è tutto. Cinque numeri interi. Pronti a partire.
Perché gli array C iniziano da zero
Ecco il trucco che fa inciampare i principianti. Gli array C sono indicizzati con zero.
Se dichiari “int a[5]”, hai cinque slot. Ma sono numerati 0, 1, 2, 3 e 4. Non esiste un “a[5]”. Se provi ad accedere a “a[5]”, stai leggendo memoria che non appartiene al tuo array. C non ti fermerà. Ti darà solo spazzatura o crash. Questa è una funzionalità, non un bug. È veloce. È anche pericoloso.
Si accede agli elementi utilizzando le parentesi quadre. “a[0]” è il primo elemento. “a[4]” è l’ultimo.
Generazione di numeri casuali in C
Costruiamo qualcosa di utile. Creeremo un programma che genera 10 numeri casuali e li ordina.
Per prima cosa servono i numeri. La libreria standard del C ha rand(), ma diamo un’occhiata a un’implementazione classica per comprenderne i meccanismi. Questo codice utilizza un generatore congruenziale lineare, un metodo tratto dal libro K&R C.
Notare la riga “#define MAX 10”. Questo crea una costante. Per convenzione le costanti vengono scritte tutte maiuscole. Li fa risaltare. Dichiari l’array “int a[MAX]” all’esterno della funzione “main”. Questo la rende una variabile globale. Esiste ovunque nel programma.
Anche la variabile rand_seed è globale. Inizia alle 10. Poiché il seme è fisso, i numeri “casuali” sono in realtà gli stessi ogni volta che si esegue il programma. Se vuoi la vera casualità, la semineresti con l’ora del sistema. Per ora, la coerenza è utile per il debug.
Comprendere l’ordinamento delle bolle
Ora arriva la parte difficile. Ordinamento.
Utilizzeremo il bubble sort. È l’algoritmo di ordinamento più semplice. È anche il più lento. Ma ti insegna come interagiscono loop e array.
Aggiungi questo codice alla tua funzione main, sostituendo il commento su “more stuff”:
Cosa sta succedendo qui?
Il ciclo esterno viene eseguito “MAX-1” volte. Il ciclo interno viene eseguito meno volte per ogni passaggio. Perché? Perché i numeri più grandi “bollano” alla fine dell’array ad ogni passaggio. Non è necessario controllarli di nuovo.
All’interno del ciclo interno, confrontiamo a[y] con a[y+1]. Se quello di sinistra è più grande, li scambiamo. Usiamo una variabile temporanea “t” per mantenere il valore mentre spostiamo i pezzi.
“L’unico modo semplice per capire veramente cosa sta facendo questo codice è eseguirlo a mano.”
Prendi un pezzo di carta. Disegna cinque caselle. Mettici dei numeri. Esegui il codice riga per riga. Sposta i numeri. Vedrai i grandi numeri affondare sul fondo. I più piccoli galleggiano. È visivo. È meccanico.
Errori comuni nell’array C
C non ti tiene la mano. Cadrai dal bordo.
- Nessun controllo dell’intervallo. Se accedi a “a[10]” in un array di dimensione 10, C non urlerà. Leggerà qualunque memoria sia successiva. Ciò porta a bug sottili che sono difficili da trovare.
- Le chiamate alle funzioni necessitano di parentesi. È necessario scrivere
x = rand();. Se scrivix = rand;, stai assegnando l’indirizzo di memoria della funzione ax. Non il risultato. Compila. Si rompe.
Prova questo
Non limitarti a leggere. Codice.
- Cambia il ciclo che riempie l’array in una singola riga. Puoi farlo?
- Spostare la logica dell’ordinamento delle bolle in una propria funzione. Chiamatelo “void bubble_sort()”. Sposta le variabili “x”, “y” e “t” all’interno di quella funzione. Diventano locali. L’array “a” è globale, quindi non è necessario passarlo.
- Cambia
rand_seedin valori diversi. Guarda il cambiamento dell’output.
Gli array sono fondamentali. Sono gli elementi costitutivi delle strutture dati. Padroneggiateli e il resto del C diventerà più chiaro. Ignora l’indice zero e passerai ore a eseguire il debug di un arresto anomalo verificatosi tre passaggi fa.






























