PRACTICA FINAL
PROGRAMACIÓN:
Calculadora
de fracciones
en C
Realizado por Pablo Osuna Martín
1º Doble Grado de Ingeniera Biomédica e Ingeniería de
Sistemas de Telecomunicación
Universidad CEU San Pablo
Código fuente:
Main.c:
#include <stdio.h>
#include "operaciones.h"
int main (void) {
int op=0;
int *numerador;
int *denominador;
int N=10;
int c=0;
int pos=0;
int pos1=0;
int pos2=0;
numerador=(int*)malloc(N*sizeof(int));
denominador=(int*)malloc(N*sizeof(int));
printf ("CALCULADORA DE FRACCIONES\n\n");
while (op!=11) {
printf ("\nOpciones:\n\n");
printf("[Link] fraccion [Link] fraccion [Link] una fraccion [Link] todas las
fracciones\n");
printf ("[Link] real fraccion [Link] fraccion [Link] fracciones [Link] fracciones\n");
printf ("[Link] fracciones [Link] fracciones [Link]\n\n");
printf ("Introduzca la opcion que desea:");
scanf ("%i",&op);
switch (op) {
case 1:
{printf ("Introduzca su fraccion: ");
scanf ("%i/%i", &numerador[c], &denominador[c]);
if (denominador[c]==0) {
printf ("\nERROR\n");}
else c=c+1;};break;
case 2:
{printf ("Introduzca la posicion de la fraccion que desea eliminar:");
scanf ("%i", &pos);
eliminar (numerador, denominador, &c, pos);}; break;
case 3:
{printf ("Introduzca la posicion de la fraccion:");
scanf ("%i",&pos);
printf ("La fraccion de la posicion %i es: %i/%i\n", pos, numerador [pos], denominador [pos]);};
break;
case 4:
{int i;
for (i=0; i<c; i++) {
printf("%i)%i/%i ", i, numerador[i], denominador [i]);}
printf ("\n");}; break;
case 5:
{float real=0;
printf ("Introduzca la posicion de la fraccion:");
scanf("%i",&pos);
reales(numerador, denominador, pos, &real);
printf("El real es: %f\n", real);} break;
case 6:
{printf ("Introduzca la posicion de la fraccion:");
scanf("%i",&pos);
simplificar (numerador, denominador, pos);
printf ("La fraccion simplificada es: %i/%i", numerador[pos], denominador[pos]);}; break;
case 7:
{printf ("Introduzca la posicion de la primera fraccion:");
scanf("%i",&pos1);
printf ("Introduzca la posicion de la segunda fraccion:");
scanf("%i",&pos2);
sumar (numerador, denominador, c, pos1, pos2);
printf ("El resultado de la suma es: %i/%i", numerador[c], denominador[c]);
c=c+1;}; break;
case 8:
{printf ("Introduzca la posicion de la primera fraccion: ");
scanf ("%i", &pos1);
printf ("Introduzca la posicion de la segunda fraccion: ");
scanf ("%i", &pos2);
restar (numerador,denominador, c, pos1, pos2);
printf("El resultado de la resta es: %i/%i", numerador [c], denominador [c]);
c=c+1;}; break;
case 9:
{printf ("Introduzca la posicion de la primera fraccion: ");
scanf ("%i", &pos1);
printf ("Introduzca la posicion de la segunda fraccion: ");
scanf ("%i", &pos2);
multiplicar(numerador,denominador, c, pos1, pos2);
printf("El resultado de la multiplicacion es: %i/%i", numerador [c], denominador [c]);
c=c+1;}; break;
case 10:
{printf ("Introduzca la posicion de la primera fraccion: ");
scanf ("%i", &pos1);
printf ("Introduzca la posicion de la segunda fraccion: ");
scanf ("%i", &pos2);
dividir(numerador,denominador, c, pos1, pos2);
printf("El resultado de la division es: %i/%i", numerador [c], denominador [c]);
c=c+1;}; break;
case 11: ;break;
default: printf("\nERROR");
}
if (c==N){
N=N+10;
numerador=(int*)realloc(numerador, N*sizeof(int));
denominador=(int*)realloc(denominador, N*sizeof(int));}
}
}
Operaciones.h:
extern void eliminar (int numerador [], int denominador [], int *c, int pos);
extern void mostrart (int numerador [], int denominador[], int c);
extern int reales (int numerador[], int denominador[], int pos, float *real);
extern void simplificar (int numerador [], int denominador[], int pos);
extern void sumar (int numerador[],int denominador[],int c, int pos1, int pos2);
extern void restar (int numerador[],int denominador[],int c, int pos1, int pos2);
extern void multiplicar(int numerador[],int denominador[],int c, int pos1, int pos2);
extern void dividir(int numerador[],int denominador[],int c, int pos1, int pos2);
Operaciones.c:
#include <stdio.h>
#include "operaciones.h"
extern eliminar (int numerador [], int denominador [], int *c, int pos) {
int i=0;
int t=*c;
for (i=pos; i<=(t-1) ; i++) {
numerador[i]=numerador[i+1];
}
for (i=pos; i<=(t-1) ; i++) {
denominador[i]=denominador[i+1];
}
*c=*c-1;
}
extern int reales (int numerador[], int denominador[], int pos, float *real){
*real=((float)numerador[pos]/(float)denominador[pos]);
extern void simplificar (int numerador [], int denominador[], int pos){
int resto=0;
int num=numerador [pos];
int den=denominador[pos];
while (den!=0){
resto=(num%den);
num=den;
den=resto;
}
numerador [pos]=numerador[pos]/num;
denominador [pos]=denominador[pos]/num;
}
extern void sumar (int numerador[],int denominador[],int c, int pos1, int pos2){
int resto=0;
int num=0;
int den=0;
int denr=0;
int numr=0;
int num1=numerador [pos1];
int den1=denominador[pos1];
int num2=numerador [pos2];
int den2=denominador[pos2];
den=den1*den2;
num=(den2*num1)+(den1*num2);
denr=den;
numr=num;
while (den!=0){
resto=(num%den);
num=den;
den=resto;
}
numerador [c]=numr/num;
denominador [c]=denr/num;
extern void restar (int numerador [], int denominador[], int c, int pos1, int pos2){
int num1=numerador[pos1];
int den1=denominador[pos1];
int num2=numerador[pos2];
int den2=denominador[pos2];
int numr=0;
int denr=0;
numr=(den2*num1)-(den1*num2);
denr=den1*den2;
int num=numr;
int den=denr;
int resto=100;
while (resto!=0) {
resto=num%den;
num=den;
den=resto;
}
numerador [c]=numr/num;
denominador [c]=denr/num;
extern void multiplicar(int numerador [], int denominador[], int c, int pos1, int pos2){
int num1=numerador[pos1];
int den1=denominador[pos1];
int num2=numerador[pos2];
int den2=denominador[pos2];
int numr=0;
int denr=0;
numr=num1*num2;
denr=den1*den2;
int num=numr;
int den=denr;
int resto=100;
while (resto!=0) {
resto=num%den;
num=den;
den=resto;
}
numerador [c]=numr/num;
denominador [c]=denr/num;
extern void dividir(int numerador [], int denominador[], int c, int pos1, int pos2){
int num1=numerador[pos1];
int den1=denominador[pos1];
int num2=numerador[pos2];
int den2=denominador[pos2];
int numr=0;
int denr=0;
numr=num1*den2;
denr=den1*num2;
int num=numr;
int den=denr;
int resto=100;
while (resto!=0) {
resto=num%den;
num=den;
den=resto;
}
numerador [c]=numr/num;
denominador [c]=denr/num;
}
Conclusiones:
En esta practica se aplican y practican un amplio abanico de conceptos de
programación tales como la programación modular y el uso de funciones. Además,
profundiza en el uso de arrays (como introducir y utilizar los datos que este contiene) y
como establecer y modificar su capacidad a través de la memoria dinámica. Para esta
práctica yo invertí alrededor de 9 horas de trabajo, sin contar el tiempo de estudio
para aprender todos los conceptos y herramientas utilizadas.
En primer lugar, leí con detenimiento los requisitos para la calculadora e hice un
pequeño esquema de como debía estructurarse el programa. En este esquema me
centré sobre todo en la estructura básica del programa: el uso de while para que se
repitiera hasta que el usuario desease, la impresión en pantalla de las diferentes
opciones, solicitar al usuario la opción deseada, un switch que clasifica las diferentes
opciones del programa y para que se realice la que el usuario ha solicitado y el
aumento de la memoria de los arrays cuando estos se llenasen.
A partir de este esquema básico, fui desarrollando en cada caso del switch las
diferentes funciones de esta calculadora. Para ello, dividí cada función en dos partes, la
parte de interacción con el usuario (imprimir en pantalla, escanear los valores que
introduce el usuario…) y la parte de cálculo. La parte de interacción con el usuario se
encuentra en el programa principal “main.c”, mientras que la parte de operaciones y
modificaciones en la memoria la desarrollé en el modulo “operaciones.c”.
De esta forma, obtuve una calculadora de fracciones totalmente funcional y sin ningún
tipo de restricciones de almacenamiento (ya que la memoria va aumentando a medida
que se vaya llenando gracias a la memoria dinámica).