* * Ora tratteremo gli array a 2 dimensioni. Un array a 2 dimensioni si puo' * considerare un array di array monodimensionali, o in altri termini una * matrice righe-colonne, molto simile ad una scacchiera o al reticolo * della battaglia navale. La tabellina pitagorica puo' essere considerata * un'array, ad esempio. * Ecco come si definisce un array a 2 dimensioni: * * tipo nome[dimensione1] [dimensione2]; * * Come esempio, definiamo un array con 3 righe e 5 colonne, ossia 3*5=15 * elementi: * * int tabelluccia[3][5]; * * In questo modo creeremo una tabella del genere: * * [0][0] [0][1] [0][2] [0][3] [0][4] * * [1][0] [1][1] [1][2] [1][3] [1][4] * * [2][0] [2][1] [2][2] [2][3] [2][4] * * Con [0][0] si intende il primo elemento, e per raggiungere gli altri si * devono variare i 2 indici opportunamente. * Per scrivere un valore nell'elemento [1][2], si fa cosi': * * tabelluccia[1][2]=10; * Scrivo nell'elemento [1][2] * * * Il primo indice e' quello che corrisponde alle righe, mentre il secondo * corrisponde alle colonne. * Definiamo un array come quello sopra, con 3 righe e 5 colonne: * * int battaglia[3][5]; * * Ora potremo giocare a battaglia navale nell'array: mettiamo un 1 dove * stanno le navi... * * battaglia[1][3] = 1; * battaglia[1][4] = 1; * * Abbiamo messo un incrociatore nel nostro mare. Ora giochiamo: * * battaglia[2][0] -> niente * battaglia[1][4] -> colpito! * * Nella battaglia navale si usano i numeri e le lettere, ad esempio 1A,1B * eccetera, per maggiore chiarezza, ma nel nostro caso entrambi gli indici * sono numerici. Abbiamo detto che la tabellina pitagorica e' un array * bidimensionale: ci proporremo di fare un programma che stampa una * tavola pitagorica. * Nel corso di questo programma vedremo dei loop for nidificati; un loop * e' nidificato quando si trova all'interno di un altro ciclo, ad es: * * for (i=0; i<10; i++) * Loop esterno per fare tutte le righe * * { * for (j=0; j<10; j++) tabba[i][j]=5; * Loop interno che fa una riga * * } * * Questi 2 loop nidificati riempiono l'array tabba con valori 5. * Dato che gli array bidimensionali hanno 2 dimensioni, un solo loop * for non basta per riempirli, perche' in un array di dimensioni [10][10] * ci sono 100 elementi, e per riempirli tutti e' necessario scrivere in * tutte le conbinazioni di indici: i due loop nidificati qua sopra quando * riempiono l'array seguono questo ordine: * * Il loop for interno, la prima volta che e' eseguito, ha i che vale 0 * e j varia da 0 a 9: * * [0][0] [0][1] [0][2] [0][3] [0][4] [0][5] [0][6] [0][7] [0][8] [0][9] * * La seconda volta che e' eseguito, i vale 1: * * [1][0] [1][1] [1][2] [1][3] [1][4] [1][5] [1][6] [1][7] [1][8] [1][9] * * E cosi' via, finche' il loop esterno non termina con i=9. * Un'ultima nota: per inizializzare un array bidimensionale, ossia dare * subito un valore ai suoi elementi al momento della dichiarazione, si * fa come con gli array monodimensionali, ma per maggior chiarezza si * adotta una diversa forma "estetica": * * int prova[4][2] = { * 4,5 * 8,3 * 2,2 * 9,1 }; * * In questo modo si rende piu' chiara la posizione di righe e colonne, ma * si potrebbe dichiarare anche in modo meno leggibile. * Vediamo il programmino: */ #include <stdio.h> /* Includiamo la libreria standard */ /* Funzione principale e inizio del programma */ int main(void) /* Funzione principale, eseguita per prima */ { /* Inizio della funzione main() */ int i,j; /* Due variabili intere che mi servono come * contatori per righe e colonne dell'array */ int tabba[10][10]; /* Tabella di 10*10=100 elementi */ /* Con questi 2 loop nidificati creiamo la tabella pitagorica, ossia * diamo come valore di ogni elemento dell'array la moltiplicazione del * suo indice i per l'indice j, ossia il risultato di riga*colonna, infatti * nella tabella pitagorica all'incrocio di righe e colonne si trova proprio * il risultato della moltiplicazione di riga*colonna. * Occorrono 2 loop nidificati perche' con il loop interno si fa una riga, * il quale e' ripetuto per il numero delle righe i, in modo da farle tutte. */ for (i=0; i<10; i++) /* Loop esterno... numero righe: 10 */ { for (j=0; j<10; j++) tabba[i][j]=i*j; /* Facciamo la moltiplicazione * i*j per tutta la riga col * loop for nidificato. */ } /* Ora con altri 2 loop for nidificati stampiamo tutti i valori della * tabella a video nell'ordine giusto, lo stesso della scrittura. * Da notare che saltiamo gli indici 0, che essendo sempre zero non ci * interessano. */ for (i=1; i<10; i++) /* Loop esterno per fare tutte le righe*/ { for (j=1; j<10; j++) /* Loop interno che stampa una riga */ { printf("%3d",tabba[i][j]); /* Stampiamo un valore */ } printf("\n"); /* a capo ad ogni incremento di i */ } return(0); /* la funzione main restituisce uno 0 intero */ } /* Fine della funzione main() */ /* Avrete notato che nel printf, al posto del solito %d, c'e' un %3d. * Infatti e' possibile indicare, in questo modo, che vogliamo stampare * sempre e solo 3 caratteri per ogni numero; questo per "pareggiare" la * tabella, che altrimenti con il solo %d non sarebbe stata allineata * per la differente lunghezza dei numeri ad una cifra (0-9) rispetto a * quelli con due cifre (10-81). Per esempio con %5d si sarebbero stampati * 5 caratteri per ogni numero, anche se fosse ad 1 solo carattere: i * restanti 4 sarebbero spaziature. Questa opzione e' presente anche per * i %f, adatti ai numeri float. * * E' possibile lavorare con array a 3 o piu' dimensioni: * * int prova[4][4][4] * * Questo e' un vettore a 3 dimensioni: avra' 4*4*4=64 elementi. * Comunque per ora ci bastano array ad 1 e 2 dimensioni. */