0

Me he topado con un error un poco particular con las matrices.

El programa pide al usuario el numero de filas, después el numero de columnas que va a tener la matriz; luego pide a usuario que inserte los valores para rellenar la matriz.

El error viene al intentar imprimir los elementos de la matriz: Cuando la matriz tiene 3 columnas y 3 filas, presenta números erróneos que nunca se guardaron.

#include<iostream>
#include<windows.h>
#include<locale.h>
using namespace std;

int main(){
    int cafi,caco,vael;
    cout<<"Cantidad de filas que desea"<<endl;
    cin>>cafi;
    cout<<"Cantidad de columnas que desea"<<endl;
    cin>>caco;
    for(int i=0; i < cafi; i++){
        int array[cafi][caco];
        for(int o=0; o < caco; o++){
            cout<<"Valor del elemento situado en la fila "<<i<<" columna "<<o<<endl;
            cin>>array[i][o];
            if(i+1==cafi && o+1==caco){
                for(int ia = 0; ia <= i; ia++){
                    for(int io = 0; io <= o; io++){
                        cout<<"El valor del elemento situado en la fila "<<ia<<" columna "<<io<<" es:"<<array[ia][io]<<endl;
                    }

                }
            }
        }
    }

    return 0;
}
Trauma
  • 25,297
  • 4
  • 37
  • 60

1 Answers1

4

En las formaciones en espacio de memoria automático requieren que el tamaño sea una constante (un valor conocido en tiempo de compilación) no una variable:

int cafi,caco,vael; // cafi y caco son variables.
cout<<"Cantidad de filas que desea"<<endl;
cin>>cafi;
cout<<"Cantidad de columnas que desea"<<endl;
cin>>caco;
for(int i=0; i < cafi; i++){
    int array[cafi][caco]; // Incorrecto, cafi y caco no son valores constantes.

Si lo que necesitas es que los valores sean definidos por el usuario, entonces tu formación debe ir en espacio de memoria dinámico, es decir: debes usar el operador new para crear memoria dinámica:

int cafi,caco,vael;

cout<<"Cantidad de filas que desea"<<endl;
cin>>cafi;

cout<<"Cantidad de columnas que desea"<<endl;
cin>>caco;

// Pedimos memoria para las filas.
int **array = new int*[cafi];
// Pedimos memoria para las columnas.
for (int i = 0; i != cafi; ++i)
    array[i] = new int[caco];

for (int i = 0; i != cafi; ++i) {
    // ...

No olvides que cuando ya no uses esa memoria, deberás liberarla en sentido inverso a como la pediste:

// Liberamos las columnas
for (int i = 0; i != cafi; ++i)
    delete[] array[i];
// Liberamos las filas.
delete[] array;

Propuesta.

Deja de usar formaciones, usa std::vector:

unsigned long cafi, caco;

cout << "Cantidad de filas que desea"<<endl;
cin >> cafi;

cout << "Cantidad de columnas que desea"<<endl;
cin >> caco;

auto array = std::vector<std::vector<int>>(cafi, std::vector<int>(caco));

// Leer datos.
int f{};
for (auto &fila : array)
{
    int c{};
    for (auto &valor : fila)
    {
        cout << "Valor del elemento situado en la fila " << f << " columna " << c << '\n';
        cin >> valor;
        ++c;
    }
    ++f;
}

Puedes ver el código funcionando en Try it online!.

Otras cosas a tener en cuenta.

  • Evita incluir cabeceras que no usas: no estás usando nada de las cabecera <locale.h> ni <Windows.h>.
  • Usa las cabeceras adecuadas: la cabecera <locale.h> pertenece al lenguaje , si la necesitas en un programa C++ deberías usar su versión adaptada a dicho lenguaje <clocale>, lee este hilo para saber más del tema.
  • Procura no abusar de la cláusula using namespace, si realmente necesitas usarla hazlo en el ámbito lo más pequeño posible (por ejemplo: en el cuerpo de la función), lee este hilo para saber más del tema.
  • Procura no abusar de std::endl, esa orden es necesaria en contadas ocasiones y no debería usarse indiscriminadamente, lee este hilo para saber más del tema.
  • Favorece el pre-incremento frente al post-incremento, lee este artículo para saber más del tema.
  • Deja a tu código respirar: No hay necesidad de apretujar todas las líneas y todos los operadores.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Me parece curioso que la respuesta que aceptaron, quitando los headers windows.h y locale.h, compila y ejecuta sin problemas (g++/c++ 14). Llevo parte de la noche rompiendome la cabeza de por qué inicializa `array`. – aeportugal Mar 30 '20 at 08:13
  • 1
    @aeportugal echa un vistazo a los hilos sobre [Formaciones de Tamaño Variable](https://es.stackoverflow.com/search?q=%5Bc%2B%2B%5D+vla) para responder a esa duda. – PaperBirdMaster Mar 30 '20 at 08:27