miércoles, 10 de noviembre de 2010

Lenguaje C Fracciones

Materia: Lenguajes de Programación

Hola compañeros en esta entrada voy a explicarles un código que recuerdo lo hicimos en alguna clase de la materia Taller de Programación, en este código en C utilizo typedef struct, se trata de un programa que suma, resta, multiplica y divide fracciones.
Lo voy a ir explicando bloque por bloque luego ya lo junto todo.

Primero que nada incluyo la librería estándar y defino la estructura de el tipo de dato que se llama FRAC y a su vez contiene dos variables de tipo short que se ve algo así:
#include<stdio.h>
typedef struct {
short numerador;
short denominador;
}FRAC;
después defino una función setvalue que va a regresar un dato tipo FRAC y va a entrar en ella dos variables llamadas a y b que corresponden al numerador y al denominador, esta función sirve para saber si la fracción con la que quiero trabajar es correcta, porque si llegara tener un 0 en el denominador pues no se puede acer ninguna suma, resta multiplicación o division con ella, para esto dentro la función tengo un if que me ayuda a identificar el denominador y si el denominador no es 0 pues devuelve la variable tipo FRAC correctamente pero si es 0 manda un mensaje de error y regresa un valor equivocado.
FRAC setvalue(int a, int b){
FRAC ar;
if(b!=0){
ar.denominador=b;
ar.numerador=a;
return(ar);
}
printf("Entonces el valor no existe");
ar.numerador=-1;
ar.denominador=1;
return(ar);
}
Ahora esta función que aunque es muy pequeña es de gran utilidad para poder mostrar las fracciones de esta forma numero1/numero2, recibe una variable tipo FRAC llamada ar, de ar obtiene el numerador(ar.numerador) y el denominador(ar.denominador) y los coloca de la forma ar.numerador/ar.denominador, la función no regresa nada porque lo único que hace es dar formato a la impresión.
void toprint (FRAC ar){
printf("%d/%d", ar.numerador, ar.denominador);
return;
}
Y ahora viene la parte matemática
Defino la función mult que va a recibir dos tipo FRAC de entrada que son a y b y va a regresar otro tipo FRAC al que llamé ar. Para obtener la multiplicación de una fracción se tiene que multiplicar el numerador1 por el numerador2 y el denominador1 por el denominador2, bueno en código es igualito, tengo que entra FRAC a, en dónde obviamente a tiene su denominador(a.denominador) y su numerador(a.numerador), lo mismo pasa con b(b.numerador y b.denominador), entonces hay que obtener el valor de FRAC ar, es decir el valor de ar.numerador y ar.denominador, para esto se multiplica a.numerador*b.numerador y esto es igual a ar.numerador, y a.denominadorr*b.denominador y esto es igual a ar.denominador, se ve largo pero esto es en realidad muy simple, este es el código:
FRAC mult(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.numerador;
ar.denominador=a.denominador*b.denominador;
return(ar);
}

Lo mismo para la división, bueno tomando en cuenta que para la división se multiplica el numerador1*denominador2 y el numerador2*denominador1, la forma de implementarlo en ódigo es:

FRAC div(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.denominador;
ar.denominador=a.denominador*b.numerador;
return(ar);
}
Y la suma y resta de fracciones ya no es tan directa, pero tampoco es la gran cosa, la fórmula para sumar fracciones es multiplicar el numerador1 por el denominador2 y sumarle la multiplicación de el numerador2 por el denominador1 y esto es el numerador resultante y el denominador se obtiene de multiplicar el denominador1 por el denominador2, esto obviamente es de la manera más fácil, no simplificada, el código en C queda así:

FRAC suma(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.denominador+b.numerador*a.denominador;
ar.denominador=a.denominador*b.denominador;
return(ar);
}

Y para la resta es lo mismo:

FRAC rest(FRAC a, FRAC b){
FRAC ar;
ar.numerador=a.numerador*b.denominador-b.numerador*a.denominador;
ar.denominador=a.denominador*b.denominador;
return(ar);
}
Ahora la función principal el main que va llamara todas estas funciones que ya explique, bueno primero definí tres variables tipo FRAC las dos primera son los datos de entrada en las funciones de los que tanto he hablado, y la otra es el resultado, en los primeros renglones del main podemos ver la llamada la función multiplicar que primero que nada le da valores a las dos fracciones con las que estaremos trabajando, después evalúa con la función setvalue para saber si es el denominador no es 0, enseguida llama a la función de multiplicar para obtener el resultado, la ya lo que sigue es la forma de imprimirlo con la función toprintf que definí arriba, que me permite usar "/" para que se puedan ver como fracciones en la pantalla, despues uso otro print aunque este ya depende si es multiplicación, dimisión, suma o resta bueno en este caso es la multiplicación entonces escribo un "*" .
 int main(void){
FRAC nomvar1, nomvar2, nomvar3;
nomvar1=setvalue(1,3);
nomvar2=setvalue(1,2);
nomvar3=mult(nomvar1, nomvar2);
printf("\n\t");
toprint(nomvar1);
printf(" * ");
toprint(nomvar2);
printf(" = ");
toprint(nomvar3);

/*todo lo que sigue es lo mismo*/
FRAC n1, n2, n3;
n1=setvalue(1,3);
n2=setvalue(1,2);
n3=div(n1, n2);
printf("\n\t");
toprint(n1);
printf(" / ");
toprint(n2);
printf(" = ");
toprint(n3);


FRAC m1, m2, m3;
m1=setvalue(1,3);
m2=setvalue(1,2);
m3=suma(m1, m2);
printf("\n\t");
toprint(m1);
printf(" + ");
toprint(m2);
printf(" = ");
toprint(m3);

FRAC p1, p2, p3;
p1=setvalue(1,3);
p2=setvalue(1,2);
p3=rest(p1, p2);
printf("\n\t");
toprint(p1);
printf(" - ");
toprint(p2);
printf(" = ");
toprint(p3);

printf("\n\n\n");
system("pause");
}



La muestra de la ejecución del código:



Por sí alguien lo quiere descargar:
fracciones.c

Cualquier duda, corrección, etc. comenten.

7 comentarios:

  1. Excelente tu entrada, solo que se me ocurrió esto y q pasaría si queremos hacer cualquier operación pero con fracciones negativas??
    :O jajaj
    se podra?

    ResponderEliminar
  2. Hola de nuevo..

    Nada más si diría lo de los espacios en blanco y unos saltos de línea para poder hacer más legible el código, porque la verdad, en unos renglones me perdía un poquito. Pero no mucho.

    Debemos recordar que un lenguaje de programación debe ser entendible y claro tanto para el programador como para otras personas.

    Te lo digo por experiencia propia, pues cuando he visto mis códigos de segundo semestre, ya no los leo tan fácil.

    De hecho tengo mi entrada de escritura de códigos en el cual hablo al respecto.

    Saludos. Muy buena entrada. Me gusta el proceso de las operaciones.

    ResponderEliminar
  3. tomare en cuenta lo de los espacios en blanco Crispin , ami tmb me gusta más como se ve asi con espacios pero se me olvida hacerlo, :D

    ResponderEliminar
  4. Pues, no especificas para qué es esta entrada, pero veo que todavía puedes ocupar puntos en el lab y te pongo cuatro ahí.

    ResponderEliminar
  5. Hola

    Y que pasa si quiero dividir dos números a, b pero el programa los imprima
    a/b o b/a sin que lo haga a decimales?
    Espero puedas ayudar

    ResponderEliminar
  6. Que pasa si quiero hacer operaciones con fracciones en formato: E,a/b ?

    ResponderEliminar