0

Estaba programando esta calculadora en C++ de matrices, con rango "n". Al momento de printear algunos valores, me salen: 1073545225 -537067511 -537067511.

Ni idea de que puede ser la verdad. sería de mucha ayuda si me dicen que es lo que pasa.

#include <iostream>
using namespace std;
int main()
{
  int ai, aj, n, bi, bj;
  cout<<"Ingrese rango matriz: ";
  cin>>n;
  int matriza[n][n]; // Con esto obtegno el valor en posicion n,n
  int matrizb[n][n];
  int matrizc[n][n];
  double valordesuma, valortotalpos, valorpos;

//  PRIMERA MATRIZ OBTENCION DATOS
    cout <<"MATRIZ A"<<endl;;
  for (ai=0; ai<n; ai=ai+1) //Por filas
  {
    cout <<"Ingrese fila "<<ai<<": ";
    for (aj=0;aj<n; aj=aj+1) // por columnas
    {
      // cout<<"Ingrese fila: ";
      cin>>valorpos;
      cout<<" ";
      matriza[ai][aj] = valorpos;

    }
  }
// SEGUNDA MATRIZ OBTENCION DATOS
  cout<<"MATRIZ B: "<<endl;
for (bi=0; bi<n; bi=bi+1) //Por filas
{
  cout <<"Ingrese fila "<<bi<<": ";
  for (bj=0;bj<n; bj=bj+1) // por columnas
  {
    // cout<<"Ingrese fila: ";
    cin>>valorpos;
    cout<<" ";
    matrizb[bi][bj] = valorpos;

  }
}
// AHORA PROCEDEMOS A CALCULAR VALORES.
for (aj=0; aj<n; aj=aj+1)
{
  for (bi=0; bi<n;bi=bi+1)
  {
    if (bi==aj){
    valordesuma = matriza[ai][aj] * matrizb[bj][bi];
    valortotalpos = valortotalpos + valordesuma;
    matrizc[aj][bi] = valortotalpos;
    cout<<matrizc[aj][bi]<<endl;
    }
  }
}
}

Saludos!!

gbianchi
  • 19,675
  • 11
  • 38
  • 58
  • 2
    Mira [ask] para que tu pregunta sea mejor recibida. Tambien, aprovecha y haz el [tour] para entender mejor como funcionamos y de paso obtener tu primera [medalla](https://es.stackoverflow.com/help/badges)! Ni idea de tu problema, pero si buscas que bi==aj siempre, ,entonces uno de los for sobra, porque bi==aj solo cuando son el mismo. y otro problema que veo es que ai quedo con un numero fuera de tu matriz antes.. y no lo redeclaraste.. que estabas buscando ahi? lo mismo pasa con bi, todo dentro del ultimo if – gbianchi Mar 21 '19 at 19:04
  • @gbianchi Pues para no tener `Ni idea de tu problema`, estás **muy bien** de la vista O_O – Trauma Mar 21 '19 at 19:26
  • 1
    Bue pero capaz su problema era otro mas profundo @Trauma.. Obviamente si ai esta fuera de la matriz, va a traer cualquier porqueria... – gbianchi Mar 21 '19 at 19:27
  • @gbianchi No, que va. Lo que pasa es que con ese `if( )`, **no coloca ningún valor** en la formación de destino, y le sale basura aleatoria. – Trauma Mar 21 '19 at 19:28
  • @gbianchi ¡ Ah carajo ! Tienes razón, solo muestra lo que **si** asigna. Bueno, no me apetece *debuggear* ahora mismo :-( – Trauma Mar 21 '19 at 19:30
  • yo veo la matrix y debugueo a ojo ;) – gbianchi Mar 21 '19 at 19:30
  • Je je ... yo bastante *debuggueo* en el curro ... habría que ver que valores usa, por si hace desbordamiento. – Trauma Mar 21 '19 at 19:31
  • 2
    No inicializas `valortotalpos` a cero, por tanto cuando le sumas los productos, el resultado final puede ser cualquier cosa. – abulafia Mar 21 '19 at 20:04

1 Answers1

5

Tu primer y más importante problema es que estás usando formaciones1 de longitud variable FLV, hay varios hilos que han tratado este tema: echa un vistazo.

Tu segundo problema importante es que no das valor inicial a variables que usas en cálculos, como valortotalpos; al no tener esta variable un valor inicial, su valor será indeterminado (por ejemplo un número intergaláctico) el cuál, al formar parte de un cálculo, contagiará su valor indeterminado al resultado.

Tu tercer problema es que en los bucles finales usas unas variables para controlar el flujo, pero otras para acceder a los valores de la matriz. Las variables ai y bj acaban los bucles iniciales con valores n+1 y al usar estos índices después en los bucles finales estarás leyendo/escribiendo en posiciones incorrectas de la matriz, dando lugar a valores extraños (en el mejor de los casos).


Las formaciones en C++ deben tener un tamaño conocido en tiempo de ejecución, a no ser que se alojen en memoria dinámica (con el operador new). Dado que tú quieres la segunda opción deberías cambiar el código de esta manera:

cout<<"Ingrese rango matriz: ";
cin>>n;

int **matriza = new int*[n]{};
for (int indice = 0; indice < n; ++indice)
{
    matriza[indice] = new int[n]{};
}

El código anterior crea una matriz de enteros de n×n, pero es muy incómodo de usar además de necesitar liberar la memoria manualmente al finalizar:

for (int indice = 0; indice < n; ++indice)
{
    delete[] matriza[indice];
}
delete[] matriza;

Yo te aconsejo usar std::vector en su lugar, empezando por unos alias:

using fila = std::vector<int>;
using matriz = std::vector<fila>;

Con estos alias, crear las matrices es así de fácil y claro:

int n;
std::cin >> n;
matriz matriza(n, fila(n));
matriz matrizb(n, fila(n));
matriz matrizc(n, fila(n));

El rellenar las matrices puede usarse igual, pero puede simplificarse:

//  PRIMERA MATRIZ OBTENCION DATOS
std::cout <<"MATRIZ A\n";
for (auto &f : matriza) //Por filas
{
    for (auto &v : f) // por columnas
    {
        std::cin >> v;
    }
}
// SEGUNDA MATRIZ OBTENCION DATOS
std::cout <<"MATRIZ B\n";
for (auto &f : matrizb) //Por filas
{
    for (auto &v : f) // por columnas
    {
        std::cin >> v;
    }
}

Finalmente, no se qué pretendes en los últimos bucles, ya que las variables de control son aj y bi pero usas ai y bj para acceder a las posiciones del bucle lo cuál posiblemente provoque un fallo de acceso (que explicaría tus valores extraños), yo no he usado ai ni bj, pero no se si es lo que querías.

Puedes ver el código funcionando en Wandbox.

Otras cosas a tener en cuenta.

A parte de los problemas relacionados con FLV, tu código tiene otros problemas menores que te aconsejo valorar para mejorarlo.

  • Debes dar a tus variables nombres explicativos, tu código se hace difícil de seguir, difícil de entender y difícil de depurar cuando usas variables cuyos nombres son cortos y fácilmente confundibles (ai y aj pueden ser difíciles de distinguir).
  • Es una buena práctica inicalizar tus variables, incluso cuando lo primero que haces con ellas es darles valor; si tomas por costumbre inicializar variables incluso cuando no es necesario, no se te olvidará hacerlo cuando si lo sea.
  • Procura favorecer el uso de \n frente al uso de std::endl, la segunda opción puede (en algunos casos) dar lugar a problemas de rendimiento. Lee este hilo para más detalles.
  • La función main debe devolver un valor al finalizar. Lee este hilo para más detalles.

  1. También conocidas como arreglos o en inglés array.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82