logo

Matrius multidimensionals en C

Requisit previ: Matrius en C

Una matriu multidimensional es pot denominar com una matriu de matrius que emmagatzema dades homogènies en forma tabular. Les dades en matrius multidimensionals s'emmagatzemen generalment en ordre de fila principal a la memòria.



El forma general de declarar matrius N-dimensionals es mostra a continuació.

Sintaxi:

data_type array_name[size1][size2]....[sizeN];>
  • tipus_dada : Tipus de dades a emmagatzemar a la matriu.
  • nom_matriu : Nom de la matriu.
  • talla1, talla2,…, talla N : Mida de cada dimensió.

Exemples :



quants milions hi ha en mil milions
  Two dimensional array:   int two_d[10][20];   Three dimensional array:   int three_d[10][20][30];>

Mida de les matrius multidimensionals:

El nombre total d'elements que es poden emmagatzemar en una matriu multidimensional es pot calcular multiplicant la mida de totes les dimensions.
Per exemple:

  • La matriu int x[10][20] pot emmagatzemar un total (10*20) = 200 elements.
  • De la mateixa manera, matriu int x[5][10][20] pot emmagatzemar un total (5*10*20) = 1000 elements.

Per obtenir la mida de la matriu en bytes, multipliquem la mida d'un sol element amb el nombre total d'elements de la matriu.
Per exemple:

  • Mida de la matriu int x[10][20] = 10 * 20 * 4 = 800 bytes. (on int = 4 bytes)
  • De la mateixa manera, la mida de int x[5][10][20] = 5 * 10 * 20 * 4 = 4000 bytes. (on int = 4 bytes)

Les formes més utilitzades de la matriu multidimensional són:



  1. Matriu bidimensional
  2. Matriu tridimensional

Matriu bidimensional en C

A matriu bidimensional o Matriu 2D en C és la forma més simple de la matriu multidimensional. Podem visualitzar una matriu bidimensional com una matriu de matrius unidimensionals disposades una sobre l'altra formant una taula amb files 'x' i columnes 'y' on el nombre de fila va de 0 a (x-1) i el número de columna. oscil·la entre 0 i (y-1).

Representació gràfica d'una matriu bidimensional

Representació gràfica d'una matriu bidimensional de mida 3 x 3

Declaració de matriu bidimensional en C

La forma bàsica de declarar una matriu 2D amb x files i i columnes en C es mostra a continuació.

Sintaxi:

data_type array_name[x][y];>

on,

  • tipus_dada: Tipus de dades a emmagatzemar en cada element.
  • nom_matriu: nom de la matriu
  • x: Nombre de files.
  • i: Nombre de columnes.

Podem declarar una matriu enter bidimensional per dir 'x' amb 10 files i 20 columnes com:

Exemple:

int x[10][20];>

Nota: En aquest tipus de declaració, la matriu s'assigna memòria a la pila i la mida de la matriu s'ha de conèixer en el moment de la compilació, és a dir, la mida de la matriu està fixada. També podem crear una matriu dinàmicament en C mitjançant els mètodes esmentats aquí.

Inicialització de matrius bidimensionals en C

Les diferents maneres en què es pot inicialitzar una matriu 2D són les següents:

  1. Utilitzant la llista d'inicialitzadors
  2. Ús de bucles

1. Inicialització de la matriu 2D mitjançant la llista d'inicialitzadors

Podem inicialitzar una matriu 2D en C utilitzant una llista d'inicialitzadors tal com es mostra a l'exemple següent.

Primer mètode:

int x[3][4] = {0, 1 ,2 ,3 ,4 , 5 , 6 , 7 , 8 , 9 , 10 , 11}>

La matriu anterior té 3 files i 4 columnes. Els elements de les claus d'esquerra a dreta s'emmagatzemen a la taula també d'esquerra a dreta. Els elements s'ompliran a la matriu per ordre: els 4 primers elements de l'esquerra s'ompliran a la primera fila, els 4 següents a la segona fila, etc.

Segon mètode (millor) :

int x[3][4] = {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}};>

Aquest tipus d'inicialització fa ús de claus imbricades. Cada conjunt de claus interiors representa una fila. A l'exemple anterior, hi ha un total de tres files, de manera que hi ha tres conjunts de tirants interiors. L'avantatge d'aquest mètode és que és més fàcil d'entendre.

Nota: El nombre d'elements de la llista d'inicialitzadors sempre ha de ser inferior o igual al nombre total d'elements de la matriu.

També podem declarar la matriu sense definir la mida de la fila si estem utilitzant la inicialització de llista. El compilador deduirà automàticament la mida de la matriu en aquest cas:

data_type array_name[][y] = {...} ;>

Encara és obligatori definir el nombre de columnes.

2. Inicialització de la matriu 2D mitjançant Loops

Podem utilitzar qualsevol bucle C per inicialitzar cada membre d'una matriu 2D un per un, tal com es mostra a l'exemple següent.

Exemple:

int x[3][4]; for(int i = 0; i <3; i++){ for(int j = 0; j < 4; j++){ x[i][j] = i + j; } }>

Aquest mètode és útil quan els valors de cada element tenen alguna relació seqüencial.

Accés a elements de matrius bidimensionals en C

S'accedeix als elements de les matrius 2D mitjançant índexs de files i índexs de columnes. Cada element d'una matriu 2D es pot fer referència a:

Sintaxi:

array_name[i][j]>

on,

  • jo: L'índex de fila.
  • j: L'índex de columna.

Exemple:

int x[2][1];>

L'exemple anterior representa l'element present a la tercera fila i la segona columna.

convertint la cadena a int java

Nota : En matrius, si la mida d'una matriu és N. El seu índex serà de 0 a N-1. Per tant, per a l'índex de fila 2 el número de fila és 2+1 = 3. Per a la sortida de tots els elements d'una matriu bidimensional podem utilitzar bucles for imbricats. Necessitarem dos' per 'bucles. Un per recórrer les files i un altre per recórrer columnes.

Per imprimir tota la matriu, accedim a cada element un per un mitjançant bucles. L'ordre de recorregut pot ser l'ordre principal de la fila o l'ordre principal de la columna, depenent del requisit. L'exemple següent mostra el recorregut de la fila principal d'una matriu 2D.

Exemple:

C




// C Program to print the elements of a> // Two-Dimensional array> #include> int> main(>void>)> {> >// an array with 3 rows and 2 columns.> >int> x[3][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };> >// output each array element's value> >for> (>int> i = 0; i <3; i++) {> >for> (>int> j = 0; j <2; j++) {> >printf>(>'Element at x[%i][%i]: '>, i, j);> >printf>(>'%d '>, x[i][j]);> >}> >}> >return> (0);> }> // This code is contributed by sarajadhav12052009>

>

>

Sortida

Element at x[0][0]: 0 Element at x[0][1]: 1 Element at x[1][0]: 2 Element at x[1][1]: 3 Element at x[2][0]: 4 Element at x[2][1]: 5>

Complexitat temporal: O(N*M) , on N (aquí 3) i M (aquí 2) són nombres de files i columnes respectivament.

Complexitat espacial: O(1)

Com s'emmagatzemen les matrius 2D a la memòria?

Els elements de la matriu 2-D s'han d'emmagatzemar de manera contigu a la memòria. Com que els ordinadors tenen adreces de memòria lineal, les matrius 2-D s'han de linealitzar per permetre el seu emmagatzematge. Hi ha dues maneres d'aconseguir la linealització dels elements de la matriu:

  • Fila-principal- La tècnica de linealització emmagatzema primer la primera fila de la matriu, després la segona fila de la matriu, després la tercera fila, i així successivament. (és a dir, els elements s'emmagatzemen per files. Les files es llisten en funció de les columnes)
  • Columna major – Aquesta tècnica de linealització emmagatzema primer la primera columna, després la segona columna, després la tercera columna, i així successivament, és a dir, (els elements s'emmagatzemen per columnes. Les columnes es llisten en funció de les files)

L'ordinador no fa un seguiment de les adreces de tots els elements de la matriu, però fa un seguiment de l'adreça base (adreça inicial del primer element) i calcula les adreces dels elements quan cal.

Per saber-ne més, consulta l'article - Càlcul de l'adreça de l'element d'1-D, 2-D i 3-D

Matriu tridimensional en C

A Matriu tridimensional o 3D array en C és una col·lecció de matrius bidimensionals. Es pot visualitzar com a múltiples matrius 2D apilades una sobre l'altra.

Representació gràfica d'una matriu tridimensional

Representació gràfica d'una matriu tridimensional de mida 3 x 3 x 3

Declaració de matriu tridimensional en C

Podem declarar una matriu 3D amb x Matrius 2D que tenen cadascuna i files i Amb columnes utilitzant la sintaxi que es mostra a continuació.

Sintaxi:

data_type array_name[x][y][z];>
  • tipus_dada: Tipus de dades a emmagatzemar en cada element.
  • nom_matriu: nom de la matriu
  • x: Nombre de matrius 2D.
  • i: Nombre de files a cada matriu 2D.
  • Amb: Nombre de columnes a cada matriu 2D.

Exemple:

int array[3][3][3];>

Inicialització de la matriu tridimensional en C

La inicialització en una matriu 3D és la mateixa que la de les matrius 2D. La diferència és a mesura que augmenta el nombre de dimensions, de manera que també augmentarà el nombre de claus imbricades.

Una matriu 3D en C es pot inicialitzar utilitzant:

  1. Llista d'inicialitzadors
  2. Bucles

Inicialització de la matriu 3D mitjançant la llista d'inicialitzadors

Mètode 1 :

int x[2][3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};>

Mètode 2 (millor) :

int x[2][3][4] =   {   { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} },  { {12,13,14,15}, {16,17,18,19}, {20,21,22,23} }  };>

De nou, igual que les matrius 2D, també podem declarar les matrius 3D sense especificar la mida de les primeres dimensions si estem utilitzant la llista d'inicialitzadors per a la inicialització. El compilador deduirà automàticament la mida de la primera dimensió. Però encara hem d'especificar la resta de dimensions.

data_type array_name[][y][z] = {....};>

Inicialització de la matriu 3D mitjançant bucles

També és similar al de la matriu 2D amb un bucle més imbricat per accedir a una dimensió més.

int x[2][3][4]; for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { for (int k=0; k<4; k++) { x[i][j][k] = (some_value); } } }>

Accés als elements de la matriu tridimensional en C

L'accés als elements en 3D Arrays també és similar al de 2D Arrays. La diferència és que hem d'utilitzar tres bucles en lloc de dos bucles per a una dimensió addicional a les matrius 3D.

Sintaxi:

array_name[x][y][z]>

on,

  • x: Índex de matriu 2D.
  • i: Índex d'aquesta fila de matriu 2D.
  • Amb: Índex d'aquesta columna de matriu 2D.

C




// C program to print elements of Three-Dimensional Array> #include> int> main(>void>)> {> >// initializing the 3-dimensional array> >int> x[2][3][2] = { { { 0, 1 }, { 2, 3 }, { 4, 5 } },> >{ { 6, 7 }, { 8, 9 }, { 10, 11 } } };> >// output each element's value> >for> (>int> i = 0; i <2; ++i) {> >for> (>int> j = 0; j <3; ++j) {> >for> (>int> k = 0; k <2; ++k) {> >printf>(>'Element at x[%i][%i][%i] = %d '>, i,> >j, k, x[i][j][k]);> >}> >}> >}> >return> (0);> }>

>

>

invertint la cadena en java
Sortida

Element at x[0][0][0] = 0 Element at x[0][0][1] = 1 Element at x[0][1][0] = 2 Element at x[0][1][1] = 3 Element at x[0][2][0] = 4 Element at x[0][2][1] = 5 Element at x[1][0][0] = 6 Element at x[1][0][1] = 7 Element at x[1][1][0] = 8 Element at x[1][1][1] = 9 Element at x[1][2][0] = 10 Element at x[1][2][1] = 11>

De manera similar, podem crear matrius amb qualsevol nombre de dimensions. Tanmateix, la complexitat també augmenta a mesura que augmenta el nombre de dimensions. La matriu multidimensional més utilitzada és la matriu bidimensional.

Les matrius també estan estretament relacionades amb els punters en llenguatge C. Per saber més sobre la relació de matrius amb punters en C, consulteu això article.