L’array a due dimensioni

La matrice (o array a due dimensioni) è un insieme di elementi dello stesso tipo che sono in corrispondenza biunivoca con un insieme di coppie ordinate di numeri interi, che rappresentano rispettivamente il numero della riga e il numero della colonna della matrice.
Le matrici in linguaggio C vengono definite in modo analogo agli array:

tipo NomeMatrice[N][M];

indicando il tipo delle sue componenti, il nome della matrice, il numero N di righe, il numero M di colonne.
Se la matrice è quadrata la definizione può essere fatta in questo modo:

#define MAX 20
int tabella[MAX][MAX];

Per esempio, per organizzare gli incassi nei 20 reparti di un grande magazzino nei 6 giorni della settimana, la struttura dati più adatta è una matrice di 20 righe e 6 colonne, di numeri float, che viene dichiarata in C con il seguente frammento di codice:

#define NR 20
#define NG 6
float incassi[NR][NG];

Se si vuole calcolare l’incasso totale di tutti i reparti nel quarto giorno della settimana (giorno di indice 3), occorre utilizzare una struttura for all’interno del seguente segmento di programma:

float somma = 0;
for (i=0; i<NR; i++)
{

somma += incassi[i][3];
}
printf("%f \n", somma);

La struttura dati più adatta ad organizzare le temperature massime registrate in 50 città nei 31 giorni del mese è una matrice di 50 righe e 31 colonne:

#define NCIT 50
#define NGG 31
int temper[
NCIT][NGG
];


La temperatura registrata nel giorno 18 nella 27esima città si ottiene con la seguente istruzione di output, ricordando che gli indici partono da 0:


printf("%d \n", temper[26][17]);

ESEMPIO: Calcolare i totali di riga e di colonna degli elementi di una matrice

Il problema va scomposto in due parti: la prima riguarda il caricamento dei dati in memoria, la seconda è relativa ai calcoli e alla scrittura dei risultati.
La struttura dati definita è un array a due dimensioni.
Per il caricamento dei dati si consideri ogni riga della matrice come un vettore e si proceda al caricamento di un array attraverso una ripetizione con contatore che va da 0 al numero delle colonne – 1. Questa ripetizione viene annidata in una ripetizione più esterna che permette di ripetere l’operazione di acquisizione dei dati per tutte le righe della matrice.
Nella seconda parte relativa al calcolo dei totali di riga e di colonna, per ogni riga si azzera la variabile di accumulo, si totalizzano in questa variabile i valori della riga con una ripetizione con contatore che va da 0 al numero di colonne - 1 e alla fine si scrive il contenuto della 
variabile di totalizzazione. Per ottenere i totali di colonna il procedimento
si sviluppa in modo analogo al precedente sostituendo il termine “righe” con il termine “colonne”.

Programma C

/* Totali.c: totali di riga e colonna di una matrice */
#include <stdio.h>
#define max 100
/* prototipi delle funzioni */
int ChiediRighe(void);
int ChiediColonne(void);
void CaricaMatrice(int m[ma x][ma x], int r, int c);
/* funzione principale */
int main(void) {
/* input */
int righe, colonne; /* dimensioni indicate dall'utente */
int mat[ma x][ma x]; /* matrice */
/* output */
int TotRiga; /* totale di riga */
int TotColonna; /* totale di colonna */
/* lavoro */
int i, j; /* contatori dei cicli for */
righe = ChiediRighe();
colonne = ChiediColonne();
printf("Carica gli elementi della matrice \n");
CaricaMatrice(mat, righe, colonne);
printf("\n");
for (i=0; i<righe; i++) {
TotRiga = 0;
for (j=0; j<colonne; j++) {
TotRiga += mat[i][j];
}
printf("%7d \n",TotRiga);
}
printf("\n");
for (j=0; j<colonne; j++) {
TotColonna = 0;
for (i=0; i<righe; i++) {
TotColonna += mat[i][j];
}
printf("%5d",TotColonna);
}
printf("\n");
return 0;
}
/* prima dimensione della matrice */
int ChiediRighe(void) {
int d;
do {
printf("Numero di righe: ");
scanf("%d", &d);
} while (d<1 || d>max);
return d;
} /* ChiediRighe */
/* seconda dimensione della matrice */
int ChiediColonne(void) {
int d;
do {
printf("Numero di colonne: ");
scanf("%d", &d);
} while (d<1 || d>max);
return d;
} /* ChiediColonne */
/* caricamento delle componenti */
void CaricaMatrice(int m[ma x][ma x], int r, int c) {
int i, j;
for (i=0; i<r; i++) {
for (j=0; j<c; j++) {
printf("Elemento di posto %d, %d : ", i, j);
scanf("%d", &m[i][j]);
}
}
return;
} /* CaricaMatrice */

ESERCIZI

Array

  1. Dopo aver caricato in memoria un array di numeri interi con 10 componenti, calcolare la somma delle componenti.
  2. Dopo aver caricato in memoria un array di numeri interi con 10 componenti, contare le componenti che hanno valore superiore a 5.
  3. Dopo aver caricato in memoria un array di numeri interi con 10 componenti, raddoppiare il valore delle prime tre componenti.

Matrici

  1. Costruire la tavola pitagorica per i numeri da 0 a 9, in pratica la matrice che ha per componenti il valore che si ottiene moltiplicando l’indice della riga per l’indice della colonna.
  2. Dopo aver caricato in memoria una matrice di interi quadrata di ordine n (con n inserito da tastiera non superiore a 10), sommare gli elementi della diagonale principale.
  3. I dati sugli stipendi di 5 dipendenti nei primi 3 mesi dell’anno sono organizzati in una matrice, il numero di riga indica il numero del dipendente, il numero di colonna indica il mese. Calcolare la somma degli stipendi pagati al secondo dipendente.
  4. I dati sugli incassi di 3 reparti di un grande magazzino nei primi 6 mesi dell’anno sono organizzati in una matrice, il numero di riga indica il numero del reparto, il numero di colonna indica il mese. Calcolare l’incasso totale del mese di aprile.
  5. I dati sulle votazioni di 10 studenti in 4 prove sono organizzati in una matrice, il numero di riga indica il numero dello studente, il numero di colonna indica il numero della prova. Calcolare la media dei voti dello studente che occupa la quinta posizione nell’elenco.