[ Foro de C++ ]
Me puede decir alguien porque está mal?. Solo me sale mal la multiplicacion y no se porque es.
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
//Defino MAX hasta 5 para que el orden de la mtrzi sea como maximo 5 y que asi la matriz no sea muy grande
#define MAX 5
//Declaro las clases para evitar posibles "warnings"
void mostrar_matriz(double matriz[][MAX], int orden);
void mostrar_gaussU(double matriz[][MAX], int orden, double matrizU[MAX][MAX]);
void multiplicacion(double identidad[][MAX], double matrizU[][MAX], double matrizMult[][MAX], int FA, int FB, int CA, int CB);
void ceros_arriba(int i, int j, int orden,double matriz[][MAX],double identidad[][MAX]);
void ceros_abajo(int i, int j, int orden,double matriz[][MAX],double identidad[][MAX]);
//Funcion main principal para realizar el programa.
int main()
{
//declaro todas las variables que voy a usar posteriormente
double matrizU[MAX][MAX]; //variable que almacena la matriz U
double matrizMult[MAX][MAX]; //variable que almacena la matriz resultado de la multiplicacion de la matriz inversa y la matriz U
double matriz[MAX][MAX]; //variable que almacena la matriz que se introduce por teclado
int ordenz=0;
int FA,FB,CA,CB = orden;
//Pido el orden de la matriz ya que tiene que ser cuadrada
printf("\n\n\n");
printf("\n\t\tCALCULADORA DE LAS INTEGRALES DE GAUSS SEIDEL");
printf("\n\n\n");
printf("Ingresa el orden de la matriz (maximo %d): ", MAX);
scanf("%d", &orden);
//Salta un error en caso de que el orden de la matriz sea menor que 0 o mayor que MAX que es el rango maximo
while (orden < 0 || orden > MAX) {
printf("\nEl orden de la matriz no puede ser mayor que %d\n", MAX);
printf("Ingrese nuevamente el orden de la matriz: "); //Vuelve a pedir el orden
scanf("%d", &orden);
}
//Pido los datos de la matriz
printf("\nIngrese los elementos de la matriz:\n\n");
for (i = 0; i < orden; i++) {
for (j = 0; j < orden; j++) {
scanf("%lf", &matriz[i][j]);
}
}
printf("\nMostrando la matriz ingresada:\n");
mostrar_matriz(matriz, orden);
printf("Multiplicacion de 2 matrices, la matriz ingresada y la matrizU");
multiplicacion(matriz, matrizU, matrizMult, FA, FB, CA, CB);
mostrar_matriz(matrizMult, orden);
getchar();
getchar();
return 0;
}
//Funcion que muestra la matriz introducida por teclado
//Esto se desarrolla mediante un bucles que va recorriendo las filas y columnas
//de la matriz y va imprimiendo los datos de cada posicion
void mostrar_matriz(double matriz[][MAX], int orden)
{
int i, j; //Variables usadas para bucles
printf("Orden: %d\n", orden);
for (i = 0; i < orden; i++) { //Recorre las filas
for (j = 0; j < orden; j++) {//Recorre las columnas
printf("\t%.1lf", matriz[i][j]);
}
printf("\n"); //Salto de linea cada vez que recorre todas las columnas de una fila
}
}
//Esta funcion realiza el calculo que se almacena en una matriz llamada matrizU
//Esta matriz es como una matriz triangular superior pero al contrario y con simbolos negativos
// | 1 0 2 | | 0 0 -2 |
// matriz normal: | 3 4 1 | matriz U: | 0 0 -1 |
// | 8 6 9 | | 0 0 0 |
void mostrar_gaussU(double matriz[][MAX], int orden, double matrizU[MAX][MAX]){
int i, j; //Variables usadas para bucles
printf("\nMatriz U\n");
printf("\n");
for (i = 0; i < orden; i++) //recorre las filas
{
for (j = 0; j < orden; j++) //recorre las columnas
{
if (i > j) //guarda valores 0 ya estos valores son los que estan por debajo de la diagonal principal
{
printf("\t0");
matrizU[i][j] = matriz[i][j];
}else if(i == j){ //guarda valores 0 ya que estos valores son los de la diagonal principal
printf("\t0");
matrizU[i][j] = matriz[i][j];
}
else{ //los valores son los que estan por debajo de la diagonal principal
//compruebo el signo del numero
if(matriz[i][j]<0){
printf("\t%d", abs(matriz[i][j])); //abs se utiliza para sacar el valor absoluto
matrizU[i][j] = matriz[i][j];
}else{
printf("\t%d", ((matriz[i][j]*0)-matriz[i][j])); //multiplico el valor por 0 y resto el propio valor para que sea negativo
matrizU[i][j] = matriz[i][j];
}
}
}
printf("\n");
}
}
//Esta funcion realiza el calculo que se almacena en una matriz llamada matrizL
//Esta matriz es como una matriz triangular inferior pero al contrario y con simbolos negativos
// | 1 0 2 | | 0 0 0 |
// matriz normal: | 3 4 1 | matriz L: | -3 0 0 |
// | 8 6 9 | | -8 -6 0 |
//Funcion la cual realiza una multiplicacion entre 2 matrices,
//en este caso la realiza entre la matriz inversa y la matriz U,
//este resultado se almacena en la variable matrizMult
void multiplicacion(double identidad[][MAX], double matrizU[][MAX], double matrizMult[][MAX], int FA, int FB, int CA, int CB){
int i, j, k; //Variables usadas para bucles
for (i = 0 ; i < FA ; i++){ //recorre las filas
for (j = 0 ; j < CB ; j++){ //recorre las columnas
matrizMult[i][j]=0;//establece la posicion a cero
for (k = 0 ; k < CA ; k++){
matrizMult[i][j] = matrizMult[i][j]+identidad[i][k]*matrizU[k][j];//va modificando la matriz mientras multiplica la matriz
}
}
}
}
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)