// vectors de vectors

Matrius en C

Vectors multidimensionals: com es declaren, com es recorren, i el parany d'haver d'indicar totes les mides (menys la primera) quan es passen a una funció.

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

NomValor

Matriu

Terminal

Pas 1 / 1

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?