usando el metodo Gauss-Jordan... La función diagonal es la que va a llevar a cabo el método.. se pide como entrada el numero de incognitas del sistema y después los coeficientes... metes primero el numerador, das espacio, metes el denominador y das enter.. y así hasta que termines con la matriz
*/
#include< stdio.h >
//esta es mi estructura de fraccion...
typedef struct {
int numerador;
int denominador;
}fraccion;
fraccion suma(fraccion,fraccion);//suma dos fracciones
fraccion resta(fraccion,fraccion);//resta dos fracciones
fraccion mult(fraccion,fraccion);//multiplica dos fracciones
fraccion div(fraccion,fraccion);//divide dos fracciones
fraccion simplifica(fraccion);//simplifica una fraccion
void diagonal(fraccion [][10],int);//esta funcion es la del metodo gauss-jordan
void leemat(fraccion[][10],int);//esta funcion llena de datos una matriz de tipo fraccion
void impmat(fraccion[][10],int);//esta funcion imprime la matriz de tipo fraccion
int mcd(int,int);//calcula el maximo comun divisor entre dos numeros usando algoritmo de Euclides
void main()
{
fraccion mat[11][10],n1,n2,r;
int n;
puts("Introduzca el número de incognitas de su sistema: ");
scanf("%d",&n);
puts("Introduzca su matriz aumentada:");
leemat(mat,n);
diagonal(mat,n);
puts("Su matriz diagonalizada es: \n");
impmat(mat,n);
//bloque de prueba de operaciones con fracciones
/*
puts("Dame la primer fraccion (parte entera, parte fraccion)");
scanf("%d %d",&n1.numerador,&n1.denominador);
puts("Dame la segunda fraccion (parte entera, parte fraccion)");
scanf("%d %d",&n2.numerador,&n2.denominador);
r=suma(n1,n2);
printf("Suma: %d/%d \n",r.numerador,r.denominador);
r=resta(n1,n2);
printf("Resta: %d/%d \n",r.numerador,r.denominador);
r=mult(n1,n2);
printf("Multiplicacion: %d/%d \n",r.numerador,r.denominador);
r=div(n1,n2);
printf("Division: %d/%d \n",r.numerador,r.denominador); */
}
fraccion suma(fraccion n1,fraccion n2)
{
fraccion r;
if((n1.numerador+n2.numerador==0)&&(n1.denominador==n2.denominador))
{r.numerador=0;r.denominador=1;return r;}
else
{r.numerador=n1.numerador*n2.denominador+n2.numerador*n1.denominador;
r.denominador=n1.denominador*n2.denominador;
return r;/*simplifica(r);*/}
}
fraccion resta(fraccion n1,fraccion n2)
{
fraccion r;
if((n1.numerador==n2.numerador)&&(n1.denominador==n2.denominador))
{r.numerador=0;r.denominador=1;return r;}
else
{ r.numerador=n1.numerador*n2.denominador-((n2.numerador)*(n1.denominador));
r.denominador=n1.denominador*n2.denominador;
return simplifica(r);}
}
fraccion mult(fraccion n1,fraccion n2)
{
fraccion r;
if((n1.numerador==0)||(n2.numerador==0))
{r.numerador=0;r.denominador=1;return r;}
else
{r.numerador=n1.numerador*n2.numerador;
r.denominador=n1.denominador*n2.denominador;
return simplifica(r);
}
}
fraccion div(fraccion n1,fraccion n2)
{
fraccion r;
int val=0;
if(n2.numerador==0)
{puts("Error de división entre cero"); return r;}
else if((n1.numerador<0 amp="amp" n2.numerador="n2.numerador">0))//solo el primero negativo
{val=1;
n1.numerador=n1.numerador*(-1);
}
else if((n2.numerador<0 amp="amp" n1.numerador="n1.numerador">0))//solo el segundo negativo
{val=1;
n2.numerador=n2.numerador*(-1);
}
else if((n2.numerador<0 amp="amp" br="br" dos="dos" los="los" n1.numerador="n1.numerador" negativos="negativos"> {
n1.numerador=n1.numerador*(-1);
n2.numerador=n2.numerador*(-1);
}
r.numerador=n1.numerador*n2.denominador;
r.denominador=n1.denominador*n2.numerador;
if(val)
r.numerador=r.numerador*(-1);
return simplifica(r);
}
fraccion simplifica(fraccion r)
{
fraccion s;
int val=0,x;
if(r.numerador){
x=mcd(abs(r.numerador),abs(r.denominador));
s.numerador=r.numerador/x;
s.denominador=r.denominador/x;
return s;
}
else{s.numerador=0;
s.denominador=1;
return s;
}
}
int mcd(int a, int b){
if(a a^=b;
b^=a;
a^=b;
}
int c=a%b;
while(c){
a=b;
b=c;
c=a%b;
}
return b;
}
void leemat(fraccion mat[][10],int n)
{
int i,j;
for(i=0;i
}
void impmat(fraccion mat[][10],int n)
{
int i,j;
for(i=0;i
putchar('\n');
}
}
void diagonal(fraccion mat[][10],int n)
{
// Aplicación del método de Gauss-Jordan
int r,c,c2,i,j,k=0,r2,c3;
fraccion p,tem[10],p2,m;
//Ceros en triangulito de abajo (:
for(r=0;r
for(c=0;c<=n;c++)
{ mat[c][r]=div(mat[c][r],p);//
}
for(r2=r+1;r2
p2=mat[r][r2];//pivote 2
for(c2=0;c2<=n;c2++)
{tem[c2]=mult(p2,mat[c2][r]);
mat[c2][r2]=resta(tem[c2],mat[c2][r2]);
}
}
}
//Ceros en triangulito de arriba
for(c=n-1;c>=0;c--)
for(r=c-1;r>=0;r--)
{
p=mat[c][r];
for(c2=0;c2<=n;c2++)
{ tem[c2]=mult(mat[c2][r+1],p);
mat[c2][r]=resta(mat[c2][r],tem[c2]);
}
}
if(n==3)
{
mat[3][0]=resta(mat[3][0],mult(mat[2][0],mat[3][2]));;
mat[2][0].numerador=0;
mat[2][0].denominador=1;
}
else if(n==4)
{
mat[4][1]=resta(mat[4][1],mult(mat[4][3],mat[3][1]));
mat[3][1].numerador=0;
mat[3][1].denominador=1;
p=mult(mat[2][2],mat[2][0]);
p2=mult(mat[4][2],mat[2][0]);
mat[2][0]=resta(mat[2][0],p);
mat[4][0]=resta(mat[4][0],p2);
p=mult(mat[3][0],mat[3][3]);
p2=mult(mat[3][0],mat[4][3]);
mat[3][0]=resta(mat[3][0],p);
mat[4][0]=resta(mat[4][0],p2);
}
}
No hay comentarios:
Publicar un comentario