Vectors multidimensionals
Un vector normal (int v[5]) és una línia de caselles. Una matriu (int m[2][3]) és, per sota, exactament això: un vector de vectors — files que al seu torn contenen columnes.
Declaració i inicialització
#define FILES 2
#define COLUMNES 3
int m[FILES][COLUMNES] = {
{1, 2, 3},
{4, 5, 6}
};
Cada parella de claus { } és una fila. m[0][0] val 1, m[1][2] val 6. Com amb els vectors normals, la mida ha de ser coneguda en temps de compilació — per això #define.
Recórrer una matriu
Exemple
for (i = 0; i < FILES; i++) {
for (j = 0; j < COLUMNES; j++) {
printf("%d ", m[i][j]);
}
printf("\n");
}
Calen dos bucles niats: el de fora recorre les files (i), el de dins recorre les columnes d'aquella fila (j). El printf("\n") després del bucle de dins és el que separa cada fila en una línia diferent.
Com a paràmetre d'una funció
Igual que amb un vector normal, una matriu no es copia quan es passa a una funció. Però hi ha una diferència important en com s'escriu el paràmetre.
Exemple
int suma_matriu(int m[][COLUMNES], int files) {
int i, j, total = 0;
for (i = 0; i < files; i++) {
for (j = 0; j < COLUMNES; j++) {
total = total + m[i][j];
}
}
return total;
}
int m[][COLUMNES]: el nombre de files el pots ometre (per això sol es passa també com a paràmetre, files), però el nombre de columnes és obligatori. El compilador necessita saber quants elements ocupa cada fila per calcular on comença la següent — sense aquest valor, no sabria com llegir m[i][j] correctament.
Mira la matriu recórrer's pas a pas
Fixa't en com el bucle de dins recorre tota una fila abans que el de fora passi a la següent.
Matrius
Codi
Variables
| Nom | Valor |
|---|
Matriu
Terminal
Problemes per resoldre
Sense solució ni comprovació automàtica: escriu el programa, compila'l (gcc programa.c -o programa) i prova'l amb els exemples. Les pistes són plegades perquè les obris només si les necessites.
1. Suma de cada fila
Donada una matriu de 3 files i 4 columnes amb valors escrits al codi, mostra la suma de cada fila, una per línia.
Fila 0: 10 Fila 1: 26 Fila 2: 42
Pistes
Per cada fila i, un bucle intern que recorri les columnes i vagi acumulant en un total que reinicies a 0 just abans de començar cada fila.
2. El màxim d'una matriu
Escriu una funció maxim_matriu(int m[][COLUMNES], int files) que retorni el valor més gran de tota la matriu.
El màxim és: 9
Pistes
Comença suposant que el màxim és m[0][0], i recorre tota la matriu (els dos bucles niats) comparant cada element amb el candidat actual.
3. Matriu identitat
Omple una matriu quadrada N×N (per exemple, 4×4) amb la matriu identitat: 1 a la diagonal principal (on la fila i la columna coincideixen) i 0 a la resta. Mostra-la.
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
Pistes
Dins el bucle niat, la decisió és senzilla: m[i][j] = (i == j) ? 1 : 0; — l'operador ternari que ja coneixes.
Exercicis d'autoavaluació
Aquests es generen amb valors nous a l'atzar i tenen solució comprovable.
Quina serà la sortida per terminal d'aquest programa?