sábado, 13 de noviembre de 2010

C - Calculadora de Fracciones

Lenguajes de Programación - PUNTOS EXTRA

Termine de escribir este código que lo había dejado pendiente desde el semestre pasado, se trata de una calculadora que suma fracciones por medio una estructura, o mas bien, un nuevo tipo de dato definido por mi que toma la forma de una fracción y realiza las operaciones de la aritmética básica.

Esta es la definición de mi nuevo tipo de dato:
typedef struct fraccion {
     int num;
     int den;
} frac;

Un tipo de dato "fraccion" al cual me referire durante el programa como "frac", mi tipo de dato solo esta compuesto por el numerador y el denominador, ambos son enteros.

Este es el constructor del dato:
frac construye(int a, int b) {
  frac temp;
  temp.num = a;
  if(b==0){
      printf("El denominador no puede ser cero");
      temp.den = 1;
      return(temp);      
  }
  temp.den = b;
  return(temp);
}

Toma los parámetros enviados desde main, el numerador y denominador, y los fusiona en un solo tipo de dato; si el denominador el 0, la función regresa una fracción entera ademas de una advertencia. El constructor se visita 2 veces, porque las operaciones se realizan por parejas de datos.

Estas son los algoritmos para realizar las operaciones:
// Para sumar

frac add(frac a, frac b) {
 frac temp;
 temp.den = a.den * b.den;
 temp.num = (a.num * b.den) + (a.den * b.num);
 return(temp);
}

//Funcion para multiplicar

frac mult(frac a, frac b) {
 frac temp;
 temp.num = a.num * b.num;
 temp.den = a.den * b.den;
 return(temp);
}

//Funcion para div

frac div(frac a, frac b) {
 frac temp;
 temp.num = a.num * b.den;
 temp.den = a.den * b.num;
 return(temp);
}

// Para restar
frac res(frac a, frac b) {
 frac temp;
 b.num = b.num * -1;
 temp = add(a, b);
 return(temp);
}

Por si no se acuerdan: la suma es la adición de la multiplicación cruzada de los numeradores y denominadores, los denominadores se multiplican directo; la resta es igual solo cambiamos el signo de un numerador. La multiplicación es directa numerador x numerador, denominador x denominador; mientras que para la división se realiza una multiplicación cruzada.

Para imprimir los datos utilizo esta rutina:
void imprime (frac a, char op, frac b, frac c) {
 printf("\n");
 toprint(a);
 printf(" %c ", op);
 toprint(b);
 printf(" = ");
 toprint(c);
 printf("\n");
 return;  
}

Esta rutina imprime las fracciones construidas con su resultado.

La funcion main pide los datos de una forma especial, no hace falta hacer elecciones ni nada, el formato de entrada de datos es el siguiente: num/den + num/den, mas grafico: 1/2+1/4
La funcion reconoce los datos y los envía al constructor y reconoce el operador aritmético para realizar determinada accion:
int main(int argc, char** args) {
 char f, op;
 int an, bn;
 frac A, B, C;
 f = 's';
 printf("\t\tPROGRAMA PARA REALIZAR CALCULOS CON FRACCIONES\n\n");
 do{
   printf("Dame los datos\n");
   scanf("%d/%d", &an, &bn);
   A = construye(an, bn);
   scanf("%c", &op);
   scanf("%d/%d", &an, &bn);
   B = construye(an, bn);
   if(op == '+')
C = add(A, B);   
   if(op == '*')
C = mult(A, B);
   if(op == '/')
C = div(A, B);
   if(op == '-')
C = res(A, B);
   imprime(A, op, B, C);
   scanf("%c", &f);
 } while(f!='f');
 return 0;
}


PROGRAMA COMPLETO: fracciones.c

Para compilar: gcc -o fracciones fracciones.c
Para ejecutar: ./fracciones

EJECUCIÓN



PD: Para salir del programa escriben "f"

SALUDOS!!! ^_^

2 comentarios: