0

Estoy comenzando a utilizar matrices e hice como ejercicio el hacer una tabla 3X3, que el usuario las rellene y que después muestre la tabla pero cuando ejecutó el programa me muestra en una parte números que no ingrese. Si encuentran el error explíquenme en que me equivoque.

#include <iostream>

using namespace std;

int main( ) {
  int a[2][2], columna, fila;

  for( fila = 0; fila < 3; fila++ ) {
    for( columna = 0; columna < 3; columna++ ) {
      cout << "introduzca el numero de la fila [" << fila << "] y de la columna [" << columna << "]:" << endl;
      cin >> a[fila][columna];
    }
  }

  for( fila = 0; fila < 3; fila++ ) {
    for( columna = 0; columna < 3; columna++ ) {
      cout << a[fila][columna] << "|";
    }
    cout<<endl;
  } 

  return 0;
}
Trauma
  • 25,297
  • 4
  • 37
  • 60
karantooo
  • 21
  • 1
  • 3

2 Answers2

1

En (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;
}

  1. También conocida como arreglo o en inglés array.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
0

El problema está en que tu matriz es de 2x2 pero tus ciclos for son de 3 iteraciones:

#include<iostream>
using namespace std;

int main () {
  int a[3][3], columna, fila;
  for (fila = 0; fila < 3; fila++) {
    for (columna = 0; columna<3; columna++){
      cout<<"introduzca el numero de la fila ["<<fila<<"] y de la columna ["<<columna<<"]:"<<endl;
      cin>>a[fila][columna];
    }
  }
  for(fila = 0; fila < 3; fila++){
    for (columna = 0; columna < 3; columna++){
      cout<<a[fila][columna]<<"|";
    }
    cout<<endl;
  }
  return 0;
}
akko
  • 2,378
  • 2
  • 27
  • 56