En c++ (y otros muchos lenguajes de programación) los índices de formaciones van desde 0
a el número de elementos menos uno. Estás confundiendo el índice máximo con el número máximo en la definición de la formación1:
int a[2][2];
La anterior definición no crea una formación de 3 × 3 con las filas 0, 1 y 2 y las columnas 0, 1 y 2. Crea una formación 2 × 2 con las filas 0 y 1 y las columnas 0 y 1.
Así pues, como ha señalado akko tus bucles recorren más filas y columnas de las que la formación dispone. Para solucionarlo simplemente haz que tu formación tenga las filas × columnas que esperas:
int a[3][3];
Propuesta.
- Para evitar problemas de índices, usa el bucle
for
de rango.
- Declara una constante para el tamaño de tu formación, hará que el código sea más legible y más fácil de mantener.
- No hay obligación de usar la cláusula
using namespace std;
pues es sólo es una ayuda a la escritura de código; si decides usar esta cláusula no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.
- Evita abusar de
std::endl
(pues puede causar problemas de rendimiento) y favorece el uso del salto de línea explícito (\n
). Lee este hilo para saber por qué.
Siguiendo los anteriores consejos, tu código podría quedar así:
int main( ) {
using namespace std;
constexpr int lado = 3;
int a[lado][lado];
int indice = 0;
for (auto &fila : a) {
for (auto &valor : fila ) {
cout << "introduzca el numero de la fila [" << (indice / lado) << "] y de la columna [" << (indice % lado) << "]:\n";
cin >> valor;
++índice;
}
}
for (auto &fila : a) {
for (auto &valor : fila ) {
cout << valor << "|";
}
cout<<'\n';
}
return 0;
}
- También conocida como arreglo o en inglés array.