MATRIZ
Publicado por
Sergio Velasquez
en
19:33
lunes, 14 de diciembre de 2009
Etiquetas:
C++
,
Programación
/*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





No response to “MATRIZ”
Publicar un comentario