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.
- También conocidas como arreglos o en inglés array.