MATRIZ


/*MATRIZ.  Programa compilado con Turbo C   El programa calcula lo siguiente:  Inversa de una matriz
  Determinante de una matriz   Multiplicacion de matrices   Suma de matrices   Resta de matrices   Traspuesta de una matriz   Escalar por una matriz   Producto Punto   Negativo de una matriz   Traza de una matriz
*/
#include <stdio.h>  /*para printf y scanf*/
#include <conio.h>  /*para gotoxy,textcolor y textbackground*/
#include <process.h>/*para exit y system*/
#include <math.h>   /*para fabs*/
#include <dos.h>    /*para sleep*/
#define N 20
#define M N

typedef float real;
typedef real MATRIZ[M][N];
typedef enum {BIEN,ERROR}boolean;
typedef enum {FALSE,TRUE}BANDERA;
enum{CUADRADA,SINGULAR};
enum{SUMA=1,RESTA,MULTIPLICA,INVERSA,TRASPUESTA,PUNTO,ESCALAR,NEGATIVO,TRAZA,SALIR};
void _error(int i)
{
   char *msg[]={
  "MATRIZ NO ES CUADRADA",
  "MATRIZ ES SINGULAR",
  ""
  };
   printf("\n %s ",msg[i]);
   printf("\n");
   getch();
}
real LeeValor(void)
{
  real valor;
  scanf("%f",&valor);
  return valor;
}

void ImprimeMatriz(MATRIZ A,int ren,int col,BANDERA ban)
{
  register int i,j;
  int f,c;
  if(!ban){
   gotoxy(4,14);
   printf("Matriz Tecleada:");
   for(i=0;i<ren;i++){
f=(i+1)+15;
for(j=0;j<col;j++){
  c=(j+1)*7;
  gotoxy(c,f);
  printf("%g",A[i][j]);
  getch();
 }
}
  }
  if(ban){
   system("cls");
   gotoxy(10,2);
   textbackground(BLUE);
   textcolor(WHITE|BLINK);
   cprintf("                         Resultado                           ");
   textbackground(BLACK);
   for(i=0;i<ren;i++){
f=(i+1)+6;
 for(j=0;j<col;j++){
  c=(j+5)*7;
  gotoxy(c,f);
  printf("%g",A[i][j]);
  getch();
 }
}
  }
}

boolean LeeMatriz(int *ren,int *col,MATRIZ A)
{
   register int i,j;
   int f,c;
   system("cls");
   printf("\n Escriba los renglones de la matriz -> ");
   scanf("%d",&(*ren));
   printf(" Escriba las columnas de la matriz -> ");
   scanf("%d",&(*col));
   if(*col == *ren){
for(i=0;i< *ren;i++){
f=(i+1)+6;
 for(j=0;j< *col;j++){
  c=(j+1)*7;
  gotoxy(2,5);
  printf("Teclee los valores: ");
  gotoxy(c,f);
  A[i][j]=LeeValor();
 }
}
   }
   else{
_error(CUADRADA);
exit(1);
return ERROR;
   }
ImprimeMatriz(A,*ren,*col,FALSE);
return BIEN;
}


void Suma(MATRIZ A,MATRIZ B,MATRIZ C,int ren,int col)
{
 register int i,j;
 for(i=0;i<ren;++i)
  for(j=0;j<col;++j)
   C[i][j]=A[i][j]+B[i][j];
}

void Resta(MATRIZ A,MATRIZ B,MATRIZ C,int ren,int col)
{
 register int i,j;
 for(i=0;i<ren;++i)
  for(j=0;j<col;++j)
   C[i][j]=A[i][j]-B[i][j];
}

void Punto(MATRIZ A,MATRIZ B,MATRIZ C,int ren,int col)
{
 register int i,j;
 for(i=0;i<ren;++i)
  for(j=0;j<col;++j)
   C[i][j]=A[i][j]*B[i][j];
}

boolean Multiplica(MATRIZ A,MATRIZ B,MATRIZ C,int ra,int ca,int rb,int cb)
{
 register int i,j,k;

 if(ca==rb){
  for(i=0;i<ra;++i)
   for(j=0;j<cb;++j){
C[i][j]=0;
for(k=0;k<ca;++k)
 C[i][j]+=A[i][k]*B[k][j];
}
   return BIEN;
  }
  return ERROR;
}


void Traspuesta(MATRIZ A,int ren,int col)
{
 register int i,j;
 MATRIZ B;
 for(i=0;i<col;++i)
  for(j=0;j<ren;++j)
   B[i][j]=A[j][i];

 for(i=0;i<col;++i)
  for(j=0;j<ren;++j)
   A[i][j]=B[i][j];
}

void Escalar(MATRIZ A,int ren,int col,float k)
{
  register int i,j;
  for(i=0;i<ren;++i)
   for(j=0;j<col;++j)
A[i][j]*=k;
}

void Negativo(MATRIZ A,int ren,int col)
{
  register int i,j;
  for(i=0;i<ren;++i)
   for(j=0;j<col;++j)
A[i][j]*=-1;
}

real Traza(MATRIZ A,int ren,int col)
{
  register int i,j;
  real Suma=0.0;
  ren=col;
  for(i=0;i<ren;++i)
   Suma+=A[i][i];
   return Suma;
}

void Intercambiar(real *x,real *y)
{
 float Temporal;
 Temporal= *x;
 *x = *y;
 *y = Temporal;
}

boolean Inversa(int n,MATRIZ A,MATRIZ B,real *Det)
{
  real r;
  int Pivote;
  register int i,j,k;
  *Det=1.0;
  for(i=0;i<n;++i)
   for(j=n;j<2*n;++j)
if(j==(i+n)) A[i][j]=1;
else A[i][j]=0;

   for(i=0;i<n-1;i++){
Pivote=i;
for(j=i+1;j<n;j++)
 if(fabs(A[Pivote][i]) < fabs(A[j][i]))
  Pivote=j;

   if(Pivote!=i){
for(j=0;j<2*n;j++)
Intercambiar(&A[i][j],&A[Pivote][j]);
*Det=-(*Det);
   }

   if(!A[i][i]){
_error(SINGULAR);
return ERROR;

   };
   for(j=i+1;j<n;j++)
if(A[j][i]){
r=A[j][i]/A[i][i];
 for(k=i+1;k<2*n;k++)
  A[j][k]-=r*A[i][k];
}
  }

   for(i=0;i<n;++i)
(*Det)*=A[i][i];

   if(!A[n-1][n-1]){
_error(SINGULAR);
return ERROR;
   };
   for(i=n;i<n*2;i++){
A[n-1][i]/=A[n-1][n-1];
 for(j=n-2;j>=0;j--){
  r=A[j][i];
for(k=j+1;k<n;k++)
r-=A[j][k]*A[k][i];
 A[j][i]=r/A[j][j];
 }
   }

   for(i=0;i<n;++i)
for(j=0;j<n;++j)
B[i][j]=A[i][j+n];
 return BIEN;
}

void Menu(void)
{
   system("cls");
   gotoxy(32,2);
   printf(" M A T R I C E S");
   printf("\n\n");
   printf("1.- SUMA\n");
   printf("2.- RESTA\n");
   printf("3.- MULTIPLICA\n");
   printf("4.- INVERSA Y DETERMINANTE\n");
   printf("5.- TRASPUESTA.\n");
   printf("6.- PRODUCTO PUNTO.\n");
   printf("7.- MATRIZ POR UN ESCALAR.\n");
   printf("8.- NEGATIVO DE UNA MATRIZ.\n");
   printf("9.- TRAZA DE UNA MATRIZ.\n");
   printf("10.- Exit\n");
   printf("=> ");
}

void main(void)
{
  MATRIZ A,B,C;
  int ra,ca,rb,cb;
  int ren,col;
  int opcion;
  real k,Tr,Det;
  Menu();
  scanf("%d",&opcion);
  while(opcion!=SALIR){
switch(opcion){
 case SUMA:       LeeMatriz(&ra,&ca,A);
  LeeMatriz(&rb,&cb,B);
  Suma(A,B,C,ra,ca);
  ImprimeMatriz(C,ra,ca,TRUE);
  break;
 case RESTA:      LeeMatriz(&ra,&ca,A);
  LeeMatriz(&rb,&cb,B);
  Resta(A,B,C,ra,ca);
  ImprimeMatriz(C,ra,ca,TRUE);
  break;
 case PUNTO:      LeeMatriz(&ra,&ca,A);
  LeeMatriz(&rb,&cb,B);
  Punto(A,B,C,ra,ca);
  ImprimeMatriz(C,ra,ca,TRUE);
  break;
 case MULTIPLICA: LeeMatriz(&ra,&ca,A);
  LeeMatriz(&rb,&cb,B);
  Multiplica(A,B,C,ra,ca,rb,cb);
  ImprimeMatriz(C,ra,cb,TRUE);
  break;
 case TRASPUESTA: LeeMatriz(&ra,&ca,A);
  Traspuesta(A,ra,ca);
  ImprimeMatriz(A,ca,ra,TRUE);
  break;
 case ESCALAR:    LeeMatriz(&ra,&ca,A);
  printf("\n Escalar-> ");
  scanf("%f",&k);
  Escalar(A,ra,ca,k);
  ImprimeMatriz(A,ca,ra,TRUE);
  break;
 case NEGATIVO:   LeeMatriz(&ren,&col,A);
  Negativo(A,ren,col);
  ImprimeMatriz(A,ren,col,TRUE);
  break;
 case TRAZA:      LeeMatriz(&ren,&col,A);
  Tr=Traza(A,ren,col);
  printf("\n\n   TRAZA(A) = %g",Tr);
  getch();
  break;
 case INVERSA:    LeeMatriz(&ren,&col,A);
  Inversa(ren,A,B,&Det);
  printf("\n\n   DETERMINANTE(A) = %g",Det);
  getch();
  ImprimeMatriz(B,ren,col,TRUE);
  break;
 default:         printf("\n\nOpcion incorrecta.\n\n");
  system("PAUSE");
  Menu();
  break;
}
Menu();
scanf("%d",&opcion);
  }
  gotoxy(32,18);
  printf(" Fin de %s",__FILE__);
  sleep(1);
}
Descarga