Translate

martes, 8 de enero de 2013

Gauss-Jordan en C.

/*El programa tiene que resolver un sistema de ecuaciones de n incognitas
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        for(j=0;j            scanf("%d %d",&mat[j][i].numerador,&mat[j][i].denominador);

}

void impmat(fraccion mat[][10],int n)
{
    int i,j;
    for(i=0;i        {for(j=0;j            printf("%d/%d\t",mat[j][i].numerador,mat[j][i].denominador);
        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    {    p=mat[r][r];//pivote 1
       
        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: