Dev - C++ - Multiplicacion de matrices

 
Vista:

Multiplicacion de matrices

Publicado por Marcos (1 intervención) el 24/05/2022 02:37:42
Tengo este código y no se que está mal, si alguien me puede ayudar lo agredecería



#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 matriz 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
}
}
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Multiplicacion de matrices

Publicado por Alfil (1444 intervenciones) el 24/05/2022 09:41:14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
 
using namespace std;
 
void leer(int **&m, int &fil, int &col);
void sumar(int **a, int afil, int acol, int **b, int bfil, int bcol);
void restar(int **a, int afil, int acol, int **b, int bfil, int bcol);
void multiplicar(int **a, int afil, int acol, int **b, int bfil, int bcol);
void imprimir(int **m, int fil, int col);
void menu();
 
int main()
{
    char opcion;
    int **a;
    int **b;
    int afil, acol, bfil, bcol;
 
    do {
        menu();
        cin >> opcion;
        cout << endl;
 
        switch (opcion)
        {
            case '1':
                cout << "Datos de la Matriz A: " << endl;
                leer(a, afil, acol);
                cout << "Datos de la Matriz B: " << endl;
                leer(b, bfil, bcol);
                break;
 
            case '2':
                sumar(a, afil, acol, b, bfil, bcol);
                break;
 
            case '3':
                restar(a, afil, acol, b, bfil, bcol);
                break;
 
            case '4':
                multiplicar(a, afil, acol, b, bfil, bcol);
                break;
 
            case '5':
                cout << "Matriz A: " << endl;
                imprimir(a, afil, acol);
                cout << "Matriz B: " << endl;
                imprimir(b, bfil, bcol);
                break;
 
            case '6':
                cout << "FIN DEL PROGRAMA" << endl << endl;
                break;
 
            default:
                cout << "OPCION NO VALIDA" << endl << endl;
                break;
        }
        cin.ignore(80, '\n');
 
    } while (opcion != '6');
}
 
void menu()
{
    cout << endl;
    cout << "     MENU PRINCIPAL" << endl;
    cout << "=========================" << endl;
    cout << "1.- Introducor Datos" << endl;
    cout << "2.- Sumar Matrices" << endl;
    cout << "3.- Restar Matrices" << endl;
    cout << "4.- Multiplicar Matrices" << endl;
    cout << "5.- Imprimir Matrices" << endl;
    cout << "6.- Salir" << endl;
    cout << "=========================" << endl;
    cout << "OPCION (1 - 6): ";
}
 
void imprimir(int **m, int fil, int col)
{
    for (int i = 0; i < fil; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << m[i][j] << " ";
        }
        cout << endl;
    }
}
 
void leer(int **&m, int &fil, int &col)
{
    cout << "Numero de Filas: "; cin >> fil;
    cout << "Numero de Columnas: "; cin >> col;
 
    m = new int*[fil];
    for (int i = 0; i < fil; i++)
        m[i] = new int[col];
 
    for (int i = 0; i < fil; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << "[" << i << "][" << j << "]: ";
            cin >> m[i][j];
        }
        cout << endl;
    }
}
 
void sumar(int **a, int afil, int acol, int **b, int bfil, int bcol)
{
    if (afil != bfil || acol != bcol)
    {
        cout << "Las Dimensiones de las Matrices NO Coinciden" << endl << endl;
        return;
    }
 
    cout << endl << "Suma de A + B: " << endl;
    for (int i = 0; i < afil; i++)
    {
        for (int j = 0; j < acol; j++)
        {
            cout << a[i][j] + b[i][j] << " ";
        }
        cout << endl;
    }
}
 
void restar(int **a, int afil, int acol, int **b, int bfil, int bcol)
{
    if (afil != bfil || acol != bcol)
    {
        cout << "Las Dimensiones de las Matrices NO Coinciden" << endl << endl;
        return;
    }
 
    cout << endl << "Resta de A - B: " << endl;
    for (int i = 0; i < afil; i++)
    {
        for (int j = 0; j < acol; j++)
        {
            cout << a[i][j] - b[i][j] << " ";
        }
        cout << endl;
    }
}
 
void multiplicar(int **a, int afil, int acol, int **b, int bfil, int bcol)
{
    if (acol != bfil)
    {
        cout << "Las Columnas de A deben Coincidir con las Filas de B" << endl << endl;
        return;
    }
 
    int **z = new int*[afil];
 
 
    for (int i = 0; i < afil; i++)
        z[i] = new int[bcol];
 
    cout << endl << "Multiplicacion de A * B: " << endl;
    for (int i = 0; i < afil; i++)
    {
        for (int j = 0; j < bcol; j++)
        {
            z[i][j] = 0;
            for (int k = 0; k < acol; k++)
            {
                z[i][j] = z[i][j] + a[i][k] * b[k][j];
            }
        }
    }
 
    imprimir(z, afil, bcol);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar