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);
        }
}

Numeros pares e impares en C.

#include< stdio.h >

int main(){

   char a;
  
   puts("Introduzca un número: ");
   a=getchar();
  
   if(a%2==0)
      puts("El número es par.");
   else
      puts("El número es impar.");

 //if((c>='0')&&(c<='9'))
 //   if(c-'0'%2==1)
//       puts("Impar");
//      else puts("Par");
  

   return 0;
            }

Dia del Año en C.

#include < stdio.h >

void leer_entrada(int *pm, int *pd, int *pa);
int convertir(int mm, int dd, int aa);

int main()
{
    int mm,dd,aa;
    int dia_semana;
   
    static char *diasemana[] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Sabado" };
    static char *mes[] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
   
    printf("Rutina de conversion de  fecha \n Para parar, introducir 0 0 0");
   
    leer_entrada(&mm, &dd, &aa);
   
    //Convertir fecha a dia numerico de la semana
    while (mm > 0)
    {
        dia_semana = convertir (dd, mm, aa);
        printf("\n El dia fue %s, %d %s de %d \n",diasemana[dia_semana], dd,mes[mm-1], aa);
        leer_entrada(&mm, &dd, &aa);
    }
}

void leer_entrada(int *pm, int *pd, int *pa) //Convertir una fecha en el dia de la semana.
{
    printf("\n Introducir MM DD AAAA: ");
    scanf("%d %d %d", pm, pd, pa);
    system("clear"); //Sirve para limpiar la pantalla en Linux.
    return;
}

int convertir (int mm, int dd, int aa) //Convertir una fecha en el dia de la semana.
{
   
long ndias; //Num de dias desde el comienzo de 1900.
long nciclos; //Num de cliclos de 4 años despues de 1900.
int nanios; //Num de años despues del ultimo cilico de 4 años.
int dia; //Dia de la semana {0,1,2,3,4,5,6}

//Conversiones numericas   
aa-=1900;
ndias = (long) (30.42 * (mm - 1)) + dd; //Dia aprox del año.

if(mm == 2) ++ndias; //Ajuste para febrero.
if((mm > 2) && (mm < 8)) --ndias; //Ajuste para marzo-julio.
if((aa % 4 == 0) && (mm > 2)) ++ndias; //Ajuste para el año bisiesto.

nciclos = aa / 4; //Ciclos de 4 años despues de 1900.

ndias += nciclos * 1461; //Añadir dias por ciclos de 4 años.

nanios = aa % 4; //Años despues del ultimo ciclo de 4 años.

if(nanios > 0) //Añadir dias por años despues del ultimo ciclo.
  ndias += 365 * nanios +1;
  
if(ndias > 59) --ndias; //Ajustar para 1900 (No año bisiesto).
  dia = ndias % 7;
 
  return(dia);
}

Funciones diversas en C.

//Funcion para calcular el MOD (Residuo)
int mod (int a, int b)
{

 if (a>0 && b>0 && a>b)
 {
   int z;
   z= (a-((a/b)*b));
   return z;
}

if (a>0 && b>0 && aa)
 {
   return a;
}
if (a<0 a="a" amp="amp" b="b">b)
 {
   return a;
}


 if (a<0 a="a" amp="amp" b="b" br="br"> {
   int z;
   a=a*(-1);
   b=b*(-1);
   z= (a-((a/b)*b))*(-1);
   return z;
}

 if (a>0 && b<0 br="br"> {
   int z;
   b=(b*-1);
   z=((a-((a/b)*b))-b);
   return z;
}

if (a<0 amp="amp" b="b">0)
 {
   int z;
   a=(a*-1);
   z=(b-(a-((a/b)*b)));
   return z;
   }
}
//Funcion maximo comun divisor recursividad
int mcd(int a,int b)
{
if(b==0)
return a;
else
return mcd(b,a%b);
}
//Funcion recursiva para sumar los 10 primeros numeros
int suma(int n) andres pico
{
    if(n==0)
        return 0;
    else
        return n+suma(n-1);
}
//Funcion recursiva para elevar un numero a un exponente
int exp(int b,int e)
{
    if(e==0)
        return 1;
    else
        return b*exp(b,e-1);
}

//Funcion para calcular el numero fibonacci
int fibo(int n)
{
if ((n==0)||(n==1))
return n;
else
return fibo(n-1)+fibo(n-2);
} 

//FUNCION PARA MULTIPLICAR DOS NUMEROS
int multiplicar(int n,int b)
{
if(b==0)
return 0;
else
return multiplicar(n,b-1)+n;
}

//Funcion de los factores primos
int factores_primos(int n,int b)
{
    if (n==1)
        return 1;
    else
        {
            if(n%b==0)
                return b+factores_primos((n/b),b);
            if(n%b!=0)
                factores_primos(n,b+1);
    }
}

//Funcion para invertir un numero
int inverso(int num)
{
    if (num < 10)
        return num;
    else
    return mod(num,10) * exp(10, digitos(num) - 1) + inverso(num / 10);
}

//Funcion para contar los digitos
int digitos(int num) 
{
    if (num < 10)
        return 1;
    return 1 + digitos(num/10);
}

Abrir archivos en C.

#include< stdio.h >

int main()
{
            FILE *in;
            char nomarch[20];
            puts("Dame el nombre del archivo :D");
            scanf("%s",nomarch);
           
            if((in=fopen(nomarch,"r"))==NULL)
                     printf("Error al abrir el archivo %s.\n",nomarch);
            else
                     printf("archivo %s abierto correctamente :D \n",nomarch);
                
            fclose(in);
}

Leer archivos en C.

#include< stdio.h >

void lee(FILE *in);

int main(int agc,char *agv[]){
           
            FILE *in;
            if(agc>1){
                  if(in=fopen(*(agv+1),"r")!==NULL)
                               printf("ERROR al abrir el archivo %s\n",(agv+1));
                  else{
                       lee(in);
                       fclose(in);
                      }           
                      }
            else
                 puts("Faltan argumentos");
                
                 return 0;
             
           }
void lee(FILE *in){
                       int c;
                       while((c=getc(in))!=EOF)
                             putchar(c);
                            
                   }

Llenar archivos en C.

#include< stdio.h >;

void llena(FILE *in);

int main(){
            FILE *in;
            char nomarch[20];
            puts("Dame el nombre del archivo :D");
            scanf("%s",nomarch);
           
            if((in=fopen(nomarch,"w+"))==NULL)
                     printf("Error al abrir el archivo %s.\n",nomarch);
            else
                     printf("archivo %s abierto correctamente :D \n",nomarch);
                    
            llena(in);        
            fclose(in);
           
           }
        
void llena(FILE *in){
                    putc('H',in);
                    putc('E',in);
                    putc('L',in);
                    putc('L',in);
                    putc('O',in);
                    putc(' ',in);
                    putc('W',in);
                    putc('O',in);
                    putc('L',in);
                    putc('R',in);
                    putc('D',in);
                    
                    }