
(Como se ve la Calculadora de matrices en yakuake).
Bueno aca esta la primera interaccion significativa que hice con la programacion. Por un lado fue la primera ves que hice un programa bien pensado y ademas lo hice correr en linux, lo cual quizas para muchos no sea importante, pero para el que parte con este mundo es un gusto entretenido.
Bueno basicamente es una buena calculadora de matrices que trabaja con memoria estatica. Trabaja muy bien con las funciones, y ademas pienso que quedo estitacamente comoda para trabajar, claro que se puede mejorar muchisimo mas (claro esta, sin usar el conio.h).
Bueno que lo disfruten no mas po.
/* Este programa a seido llevado a cabo por dos estudiantes de informatica, como primer trabajo de programacion*/
#include <stdio.h>
#include <stdlib.h>
/*Aqui declaramos las funciones que usaremos en nuestra calculadora*/
void ingreso_matriz (float a[30][30],int limf,int limc);
void imprimir(float a[30][30], int limf, int limc);
void suma(float a[30][30],float b[30][30],float c[30][30], int limf,int limc);
void multiplicacion(float a[30][30],float b[30][30], float c[30][30],int limf, int x, int limc);
void traspuesta (float a[30][30], float b[30][30], int limf, int limc);
int asimetrica (float a[30][30], int limf, int limc );
void escalar(float a[30][30],float b[30][30], int limf, int limc, float z);
int magico(float a[30][30], int lim);
float determinante(float a[30][30], int lim);
void inversa(float a[30][30],float b[30][30], int lim);
/* Este es el programa principal*/
int main()
{
int o;
printf("\033[2J");
printf("\033[0;0f");
do
{
printf("\n\t\t CALCULADORA DE MATRICES\n\n");
printf("\t\n\t\t Opciones\n\n");
printf("1 Ingresar matriz\t\t2 Suma\n3 Multiplicacion\t\t4 Traspuesta\n");
printf("5 Asimetrica\t\t\t6 Escalar\n7 Cuadrado magico\t\t8 Determinante\n");
printf("9 Inversa\t\t\t0 Exit\n\n");
scanf("%d",&o);
switch(o)
{
case 0:
exit(0);
case 1:
{
int f,c;
float m[30][30];
printf("ingrese dimencion de la matriz (f c)");
scanf("%d %d",&f,&c);
ingreso_matriz(m,f,c);
imprimir(m,f,c);
printf("\n\n");
break;
}
case 2:
{
int f,c;
float m[30][30],n[30][30],r[30][30];
printf("ingrese la dimencion de las matrices (f c)");
scanf("%d %d",&f,&c);
printf("\nIngrese los elementos de la primera Matriz\n\n");
ingreso_matriz(m,f,c);
printf("\nIngrese los elementos de la segunda matriz\n\n");
ingreso_matriz(n,f,c);
suma(m,n,r,f,c);
printf("\nLa matriz resultante es:\n\n");
imprimir(r,f,c);
printf("\n\n");
break;
}
case 3:
{
int i,j,k,l;
float m[30][30],n[30][30],r[30][30];
printf("Ingrese dimension de la primera matriz (f c)");
scanf("%d %d",&i,&j);
printf("\nIngrese dimension de la segunda matriz (f c)");
scanf("%d %d",&k,&l);
if(j==k)
{
ingreso_matriz(m,i,j);
printf("\n");
ingreso_matriz(n,k,l);
multiplicacion(m,n,r,i,j,l);
imprimir(r,i,l);
printf("\n\n");
}
else
printf("Error de dimension!");
break;
}
case 4:
{
int i,j;
float m[30][30],r[30][30];
printf("Ingrese dimension de la matriz (f c) ");
scanf("%d %d",&i,&j);
ingreso_matriz(m,i,j);
traspuesta(m,r,i,j);
imprimir(r,j,i);
break;
}
case 5:
{
int i,j,x;
float m[30][30];
printf("Ingrese dimension de la matriz NxN \n\n");
scanf("%d",&i);
ingreso_matriz(m,i,i);
imprimir(m,i,i);
x=asimetrica (m,i,i);
if(x==0)
printf("\n\nLa matriz no es asimetrica\n\n");
else
printf ("\n\nLa matriz es asimetrica\n\n");
break;
}
case 6:
{
int i,j;
float m[30][30],r[30][30],p;
printf("Ingrese dimension de la matriz (f c)\n\n");
scanf("%d %d", &i,&j);
ingreso_matriz(m,i,j);
printf("Ingrese el escalar: ");
scanf("%f",&p);
escalar(m,r,i,j,p);
imprimir(r,i,j);
break;
}
case 7:
{
int i,x;
float m[30][30];
printf("Ingrese orden de la matriz (NxN): ");
scanf("%d",&i);
ingreso_matriz(m,i,i);
x=magico(m,i);
if(x==0)
printf("\nLa matriz es Cuadrado Magico\n\n");
else
printf("\nLa matriz no es Cuadrado Magico\n\n");
break;
}
case 8:
{
int i,j,k,l,n;
float m[30][30],z;
printf("Ingrese orden de la matriz NxN : ");
scanf("%d",&n);
printf("\nIngrese elementos de la matriz ordenados por fila\n");
ingreso_matriz(m,n,n);
z=determinante(m,n);
imprimir(m,n,n);
printf("\nEl determinante es: %f\n\n",z);
break;
}
case 9:
{
int i,j,n,z;
float m[30][30],r[30][30],x[30][30];
printf("Ingre orden de la matriz a invertir (NxN): ");
scanf("%d",&n);
printf("\n\nIngrese los elementos de la matriz ordenados por fila\n");
ingreso_matriz(m,n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
x[i][j]=m[i][j];
z=determinante(x,n);
if(z!=0)
{
printf("\nLa matriz a invertir:\n");
imprimir(m,n,n);
inversa(m,r,n);
printf("\n\nLa matriz inversa es:\n");
imprimir(r,n,n);
printf("\n\n");
}
else
printf("\n\nLa matriz no posee inversa\n\n\nLa matriz tiene determinante igual a cero");
break;
}
}
}
while(o>0&&o<10);
}
/*De aqui en adelante: algoritmo de funciones*/
void ingreso_matriz(float a[30][30], int limf, int limc)
{
int i,j;
for (i=0;i<limf;i++)
for(j=0;j<limc;j++)
{
printf("ingrese elemento [%d][%d] ",i+1,j+1);
scanf("%f",&a[i][j]);
}
}
void imprimir(float a[30][30], int limf, int limc)
{
int i,j;
for (i=0;i<limf;i++)
{
printf("\n");
for(j=0;j<limc;j++)
printf("%7.2f\t",a[i][j]);
}
}
void suma(float a[30][30],float b[30][30],float c[30][30], int limf, int limc)
{
int i,j;
for (i=0;i<limf;i++)
for(j=0;j<limc;j++)
c[i][j] = a[i][j]+b[i][j];
}
void multiplicacion(float a[30][30],float b[30][30], float c[30][30],int limf, int x, int limc)
{
int i,j,k;
for(i=0;i<limf;i++)
for(k=0;k<limc;k++)
{
for(j=0;j<x;j++)
{
c[i][k]+=(a[i][j]*b[j][k]);
}
}
}
void traspuesta (float a[30][30], float b[30][30], int limf, int limc)
{
int i,j;
for(i=0;i<limf;i++)
for(j=0;j<limc;j++)
b[j][i]=a[i][j];
}
int asimetrica (float a[30][30], int limf, int limc )
{
int i,j;
for(i=0;i<limf;i++)
for(j=0;j<limc;j++)
if(a[i][j]!=-1*a[j][i])
return 0;
return 1;
}
void escalar(float a[30][30], float b[30][30], int limf,int limc,float z)
{
int i,j;
for(i=0;i<limf;i++)
for(j=0;j<limc;j++)
b[i][j]=a[i][j]*z;
}
int magico(float a[30][30], int lim)
{
int i,j;
float suma,suma2;
suma=0;
for(i=0;i<lim;i++)
suma+=a[0][i];
for(i=0;i<lim;i++)
{
suma2=0;
for(j=0;j<lim;j++)
suma2+=a[i][j];
if(suma2!=suma)
{
return 1;
break;
}
}
for(j=0;j<lim;j++)
{
suma2=0;
for(i=0;i<lim;i++)
suma2+=a[j][i];
if(suma2!=suma)
{
return 1;
break;
}
}
suma2=0;
for(i=0;i<lim;i++)
suma2+=a[i][i];
if(suma2!=suma)
return 1;
suma2=0;
for(i=0;i<lim;i++)
suma2+=a[i][lim-1-i];
if(suma2!=suma)
return 1;
return 0;
}
float determinante(float a[30][30],int lim)
{
int k,l,i,j,n,op=0;
float det;
n=lim-1;
det=a[0][0];
// Esto es para probar si es que funciona cuando el primer elemento es igual a cero, a[k][k]=0, y corresponde a
// una modificacion hecha por nosotros. lo demas fue sacado del algoritmos hecho ya por otro programador.
if(a[0][0]==0)
{
float aux[30];
int h;
for(h=0;h<lim;h++)
{
aux[h]=a[0][h];
a[0][h]=a[1][h];
a[1][h]=aux[h];
}
op=1;
det=-a[0][0];
}
// Esto es el algoritmo en si que es el responsable de efectuar el calculo del
// determinante
// el algoritmo fue sacado de un programa ya hecho y puesto en www.elrincondelc.com agradecemos mucho al creador
// pues nos sirvio mucho para sacar adelante un primer trabajo de programacion*/
for(k=0;k<n;k++)
{
l=k+1;
for(i=l;i<lim;i++)
{
for(j=l;j<lim;j++)
a[i][j] = ( a[k][k]*a[i][j]-a[k][j]*a[i][k] )/a[k][k];
}
det=det*a[k+1][k+1];
}
return det;
}
// Esta parte tambien se pudo llevar a cabo gracias a que algun programador la subio a la pagina, tambien se lo
// agradecemos mucho.
void inversa(float a[30][30],float b[30][30],int lim)
{
int i,j,k,l,m,x,y;
float pivote;
for(i=0;i<lim;i++)
{
j=i;
pivote=a[i][j];
b[i][j]=1/pivote;
for(m=0;m<lim;m++)
if(m!=i)
b[i][m]=a[i][m]/pivote;
for(m=0;m<lim;m++)
if(m!=j)
b[m][j]=-a[m][j]/pivote;
for(x=0;x<lim;x++)
for(y=0;y<lim;y++)
if(x!=i&&y!=j)
b[x][y]=a[x][y]-(a[i][y]*a[x][j])/pivote;
for(k=0;k<lim;k++)
for(l=0;l<lim;l++)
a[k][l]=b[k][l];
}
}
// Este programa a sido llevado a cabo por:
// SEBASTIAN MACHUCA serroba@msn.com
// FRANSISCO LOPEZ
// agradeceremos cualquier comentario o mejora a nuestro programa.
0 Comments:
Post a Comment
<< Home