/*
* Nombre de programa: Operaciones con Matrices
* Descripcion: ...
*
*
* Autor: _Lx
* Fecha: N/A
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int const LIMIT = 20 ;
/*
int const L1 = 20;
int const L2 = 20;
void LEER_MTRZ( float X[L_1][L_2], int *DIM_X_A, int *DIM_X_B );
void MST_MTRZ( float X[L_1][L_2], int DIM_X_A, int DIM_X_B );
*/
void LEERC_MTRZ( float X[LIMIT][LIMIT], int *DIM_X );
void MSTC_MTRZ ( float X[LIMIT][LIMIT], int DIM_X );
float DET_MTRZ ( float X[LIMIT][LIMIT], int DIM_X );
void TRANS_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT],
int DIM_X_A, int DIM_X_B, int *DIM_Y_A, int *DIM_Y_B);
int COFAC_MTRZ ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y );
int ADJ_MTRZ ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y );
int INV_MTRZ ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y );
int main()
{
float MTRZ_1[LIMIT][LIMIT], MTRZ_2[LIMIT][LIMIT];
int DIM_1, DIM_2, C, PX, PY;
system("title Matrices ... ");
LEERC_MTRZ(MTRZ_1, &DIM_1);
MSTC_MTRZ( MTRZ_1, DIM_1 );
if( DIM_1 > 0 ){
printf("\nLa determinante de la matriz es: %.14lf\n", DET_MTRZ
(MTRZ_1
, DIM_1
)); }
if(INV_MTRZ( MTRZ_1, MTRZ_2, DIM_1, &DIM_2)){
MSTC_MTRZ( MTRZ_2, DIM_2 );
printf("\nLa determinante de la matriz inversa es: %.14lf\n\n", DET_MTRZ
(MTRZ_2
, DIM_2
)); }
return(0);
}
void LEERC_MTRZ( float X[LIMIT][LIMIT], int *DIM_X ){
int DIM;
float TEMP;
printf("\nIngrese orden de la matriz cuadrada: ");
if( DIM < LIMIT){
if( DIM > 0 )
printf("Ingresando elementos ... \n\n");
for( int i = 0 ; i < DIM ; i++ ){
for( int j = 0 ; j < DIM ; j++ ){
printf("[%d][%d]: ", i
+1, j
+1);
X[i][j] = TEMP;
}
}
*DIM_X = DIM;
}
else{
printf("Orden fuera de rango ... \n\n"); }
}
void MSTC_MTRZ( float X[LIMIT][LIMIT], int DIM_X ){
if( DIM_X <= 0 )
printf("\nLa matriz no tiene elementos\n\n");
else{
if( DIM_X <= 5 ){
printf("\nMostrando Matriz (%d x %d):\n\n ", DIM_X
, DIM_X
);
for( int i = 0 ; i < DIM_X ; i++ ){
}
for( int i = 0 ; i < DIM_X ; i++ ){
for( int j = 0 ; j < DIM_X ; j++ ){
}
}
}
}
}
/*
void LEER_MTRZ( float X[L_1][L_2], int *DIM_X_A, int *DIM_X_B ){
int DIM_1, DIM_2;
float TEMP;
printf("\nIngrese la 1ra dimension de la matriz: ");
scanf("%d", &DIM_1);
printf("\nIngrese la 2da dimension de la matriz: ");
scanf("%d", &DIM_2);
printf("\n");
if( DIM_1 < L_1 && DIM_2 < L_2){
if( DIM_1 > 0 && DIM_2 > 0 ){
printf("Ingresando elementos ... \n\n");
for( int i = 0 ; i < DIM_1 ; i++ ){
for( int j = 0 ; j < DIM_2 ; j++ ){
printf("[%d][%d]: ", i+1, j+1);
scanf("%f", &TEMP);
X[i][j] = TEMP;
}
}
*DIM_X_A = DIM_1;
*DIM_X_B = DIM_2;
}
else{
printf("Dimension(es) fuera de rango ...\n\n");
system("pause");
exit(0);
}
}
void MST_MTRZ( float X[L_1][L_2], int DIM_X_A, int DIM_X_B ){
if( DIM_X_A <= 0 || DIM_X_B <= 0)
printf("\n\nLa matriz no tiene elementos");
else{
printf("\nMostrando Matriz:\n\n");
for( int i = 0 ; i < DIM_X_A ; i++ ){
printf("{ ");
for( int j = 0 ; j < DIM_X_B ; j++ ){
printf("%9.2f", X[i][j]);
}
printf(" }\n");
}
}
}
*/
void ELIMFC_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int FILA, int COLUM ){
for( int i = FILA + 1 ; i < DIM_X ; i++ ){
for( int j = COLUM + 1 ; j < DIM_X ; j++ ){
Y[i-1][j-1] = X[i][j];
}
}
if( COLUM > 0 ){
for( int i = FILA + 1 ; i < DIM_X ; i++ ){
for( int j = 0; j < COLUM ; j++ ){
Y[i-1][j] = X[i][j];
}
}
}
if( FILA > 0 ){
for( int i = 0 ; i < FILA ; i++ ){
for( int j = COLUM + 1 ; j < DIM_X ; j++ ){
Y[i][j-1] = X[i][j];
}
}
if( COLUM > 0 ){
for( int i = 0 ; i < FILA ; i++ ){
for( int j = 0; j < COLUM ; j++ ){
Y[i][j] = X[i][j];
}
}
}
}
}
float POW( float X, int N){
float P = 1.;
for( int i = 1 ; i <= N ; i++ ){
P = P * X ;
}
return P;
}
float DET_MTRZ( float X[LIMIT][LIMIT], int DIM_X){
// Prb17.
float DET = 0;
float A[LIMIT][LIMIT];
if( DIM_X == 1 )
DET = X[0][0];
else if( DIM_X == 2 )
DET = X[0][0] * X[1][1] - X[0][1] * X[1][0] ;
else if( DIM_X > 2 ){
for( int i = 0 ; i < DIM_X ; i++ ){
ELIMFC_MTRZ( X , A, DIM_X, 0, i);
DET+= X[0][i] * POW( -1, i)* DET_MTRZ( A , DIM_X-1);
}
}
return DET;
}
void TRANS_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT],
int DIM_X_A, int DIM_X_B, int *DIM_Y_A, int *DIM_Y_B){
// Prb11b.
// No es necesario que la matriz sea cuadrática para esta función.
for( int i = 0 ; i < DIM_X_A ; i++ ){
for( int j = 0 ; j < DIM_X_B ; j++ ){
Y[j][i] = X[i][j];
}
}
*DIM_Y_A = DIM_X_B;
*DIM_Y_B = DIM_X_A;
}
int COFAC_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ){
float A[LIMIT][LIMIT];
int R = 0;
if( DIM_X > 1){
for( int i = 0 ; i < DIM_X ; i++ ){
for( int j = 0 ; j < DIM_X ; j++ ){
ELIMFC_MTRZ( X , A, DIM_X, i, j);
Y[i][j] = POW( -1, i + j )* DET_MTRZ( A , DIM_X-1);
}
}
R = 1;
}
*DIM_Y = DIM_X;
return R;
}
int ADJ_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ){
float Z[LIMIT][LIMIT];
int DIM_Z, R = 0;
if( DIM_X > 1 ){
COFAC_MTRZ( X , Z , DIM_X, &DIM_Z );
TRANS_MTRZ( Z , Y , DIM_Z, DIM_Z, DIM_Y, DIM_Y );
R = 1;
}
else
*DIM_Y = DIM_Z;
return R;
}
int INV_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ){
// Prb12=16.
float Z[LIMIT][LIMIT];
int DIM_Z, R = 0;
float DET = DET_MTRZ( X , DIM_X );
if( DET != 0. || DIM_X < 1){
if( DIM_X > 1 ){
ADJ_MTRZ( X , Z , DIM_X, &DIM_Z );
printf("\n\nCalculando la matriz inversa ... \n");
for( int i = 0 ; i < DIM_Z ; i++ ){
for( int j = 0 ; j < DIM_Z ; j++ ){
Y[i][j] = Z[i][j] / DET;
}
}
R = 1;
}
else
printf("\nLa matriz no tiene inversa ( Orden menor que 2 ).\n\n\n"); }
else
printf("\nLa matriz no tiene inversa ( Determinante = 0 ).\n\n\n");
*DIM_Y = DIM_Z;
return R;
}