unidimensional recorrer multidimensionales multidimensional matriz matrices llenar inicializar escalonadas ejemplos array c++ c multidimensional-array

c++ - recorrer - Inicialización de matriz multidimensional



multidimensional array c++ (3)

He visto una pregunta en el examen de C ++ hoy:

Dado el conjunto int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2} , ¿cuál es el valor de Multi[1][1][0] ?

¿No deberían inicializarse arreglos tridimensionales como este: {{{},{}},{{},{}},{{},{}}} ? ¿Cómo puedo encontrar el valor del elemento con tales indeces? Es muy confuso


La respuesta correcta que debería arrojar puntaje completo sería: código de compilación con todas las advertencias habilitadas y no terminará escribiendo código malo como este.

gcc test.c -std=c11 -pedantic-errors -Wall -Wextra test.c: In function ''main'': test.c:6:3: warning: missing braces around initializer [-Wmissing-braces] int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}; ^

Sin embargo, sospecho que su profesor no está tan preocupado por el hecho de que el código sea basura, sino que busca los detalles en el lenguaje C que permite que las matrices (y las estructuras) se inicialicen aunque la lista de llaves no coincida con la estructura de lo que se está inicializando

En lo que respecta al lenguaje C, int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2} es completamente equivalente a :

// properly written initialization list for a 3D array int Multi[2][3][2] = { { {14, 11}, {13, 10}, { 9, 6} }, { { 8, 7}, { 1, 5}, { 4, 2} } };

La única razón por la cual se permite el primer formulario es porque te permite escribir cosas como

int Multi[2][3][2] = {0};

que inicializa explícitamente el primer elemento a 0 y el resto de los elementos como si tuvieran una duración de almacenamiento estática (0 también). Lo que significa que todos los elementos se establecerán en cero.

Escribir cosas como int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2} está abusando del lenguaje C. Es una muy mala práctica. Hacerlo está prohibido por MISRA-C, etc.

Un buen profesor estaría preocupado por enseñarte cómo habilitar todas las advertencias del compilador y cómo inicializar correctamente las matrices multidimensionales, en lugar de permitirte interpretar el código sin sentido ofuscado.


Puede inicializar arreglos en ambos sentidos, aunque se recomienda el uso de llaves internas rizadas, ya que mejora la legibilidad.

La manera más fácil de encontrar el valor de un elemento de una matriz multidimensional sin formatear con llaves es dividir la matriz. Por ejemplo, las dimensiones de su matriz son 2x3x2:

Primero divida la matriz en 2 conjuntos ( 2 x3x2)

{14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}}

Luego divide cada conjunto en 3 conjuntos (2x 3 x 2)

{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}

Ahora, como ve, quedan 2 elementos en cada conjunto más pequeño (2x3x2), por lo que ha formateado su matriz con llaves.

Ahora es más sencillo encontrar el valor del elemento con el índice de [1][1][0] . Este elemento es el segundo ([ 1 ] [1] [0]) elemento más grande del segundo (1) [ 1 ] [0]) elemento más pequeño del primer elemento ([1] [1] [ 0 ]), por lo que la respuesta es 1 .

Dicho esto, una pregunta de examen muestra la falta de profesionalismo de su profesor, que está más interesado en abusar de la sintaxis del lenguaje de programación, en lugar de enseñar las reglas fundamentales de inicialización.


int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};

mapa de memoria de Multi [2] [3] [2] es->

Multi [0] [0] [0] = 14;

Multi [0] [0] [1] = 11;

Multi [0] [1] [0] = 13;

Multi [0] [1] [1] = 10;

Multi [0] [2] [0] = 9;

Multi [0] [2] [1] = 6;

Multi [1] [0] [0] = 8;

Multi [1] [0] [1] = 7;

Multi [1] [1] [0] = 1;

Multi [1] [1] [1] = 5;

Multi [1] [2] [0] = 42;

Multi [1] [2] [1] = 2;

por lo tanto, el valor de Multi [1] [1] [0] = 1; esto es tan simple

y también podemos inicializar así

int Multi [2] [3] [2] = {{{14,11}, {13,10}, {9,6}}, {{8,7}, {1,5}, {4,2 }}};