/*----------------------------------------------------------------
| Autor: |
| Fecha: Versión: 1.0 |
|-----------------------------------------------------------------|
| Descripción del Programa: |
| |
| ----------------------------------------------------------------*/
// Incluir E/S y Librerías Standard
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
// Zona de Declaración de Constantes
// Zona de Declaración de Tipos
// Zona de Cabeceras de Procedimientos y Funciones
char menu();
bool ConfirmaSalida();
void intercambia(int &x, int &y);
int MCD(int x, int y);
void leer_fraccion(int &n, int &d);
void escribir_fraccion(int n, int d);
void suma_fracciones(int n1,int d1,int n2,int d2,int &n3,int &d3);
void multiplica_fracciones(int n1,int d1,int n2,int d2,int &n3,int &d3);
void simplifica_fraccion(int n1,int d1,int &n3,int &d3);
// Programa Principal
int main()
{
// Zona de Declaración de Variables del Programa principal
char op;
int n1,n2,n3,d1,d2,d3;
bool salir;
salir = false;
while(!salir)
{
op = menu();
switch(op)
{
case 'A': cout << "Fraccion 1" << endl;
leer_fraccion(n1, d1);
cout << "Fraccion 2" << endl;
leer_fraccion(n2, d2);
suma_fracciones(n1,d1,n2,d2,n3,d3);
cout << endl << endl;
escribir_fraccion(n1,d1);
cout << " + ";
escribir_fraccion(n2,d2);
cout << " = ";
escribir_fraccion(n3,d3);
cout << endl << endl;
break;
case 'B': cout << "Fraccion 1" << endl;
leer_fraccion(n1, d1);
cout << "Fraccion 2" << endl;
leer_fraccion(n2, d2);
suma_fracciones(n1,d1,-n2,d2,n3,d3);
cout << endl << endl;
escribir_fraccion(n1,d1);
cout << " - ";
escribir_fraccion(n2,d2);
cout << " = ";
escribir_fraccion(n3,d3);
cout << endl << endl;
break;
case 'C': cout << "Fraccion 1" << endl;
leer_fraccion(n1, d1);
cout << "Fraccion 2" << endl;
leer_fraccion(n2, d2);
multiplica_fracciones(n1,d1,n2,d2,n3,d3);
cout << endl << endl;
escribir_fraccion(n1,d1);
cout << " * ";
escribir_fraccion(n2,d2);
cout << " = ";
escribir_fraccion(n3,d3);
cout << endl << endl;
break;
case 'D': cout << "Fraccion 1" << endl;
leer_fraccion(n1, d1);
cout << "Fraccion 2" << endl;
leer_fraccion(n2, d2);
multiplica_fracciones(n1,d1,d2,n2,n3,d3);
cout << endl << endl;
escribir_fraccion(n1,d1);
cout << " / ";
escribir_fraccion(n2,d2);
cout << " = ";
escribir_fraccion(n3,d3);
cout << endl << endl;
break;
case 'E': cout << "Fraccion " << endl;
leer_fraccion(n1, d1);
simplifica_fraccion(n1,d1,n3,d3);
cout << endl << endl;
escribir_fraccion(n1,d1);
cout << " = ";
escribir_fraccion(n3,d3);
cout << endl << endl;
break;
case 'X': salir = ConfirmaSalida();
cout << endl << endl;
break;
}
system("Pause"); // Hacer una pausa
system("cls"); // Borrar la Pantalla
}
return 0; // Valor de retorno al S.O.
}
// Implementación de Procedimientos y Funciones
char menu()
{
char op;
cout << " MENU" << endl;
cout << " ====" << endl;
cout << "Elaborado Por : Nombre Apellidos" << endl;
cout << "E.T.S.I Informatica 1ºA Gestion" << endl;
cout << "Fecha: 9 de Diciembre de 2.003" << endl;
cout << endl;
cout << " A. Sumar Fracciones." << endl;
cout << " B. Restar Fracciones." << endl;
cout << " C. Multiplicar Fracciones." << endl;
cout << " D. Dividir Fracciones." << endl;
cout << " E. Simplificar Fracción." << endl;
cout << " X. Salir del Programa" << endl;
cout << endl;
cout << " Introduzca su opcion: " ;
cin >> op;
op = toupper(op);
while ( ((op<'A') || (op>'E')) && (op!='X') )
{
cout << " Opcion Incorrecta ..." << endl;
cout << endl;
cout << " Introduzca su opcion: " ;
cin >> op;
op = toupper(op);
}
return op;
}
bool ConfirmaSalida()
{
char car;
cout << "?Esta seguro de salir (S/N)?";
cin >> car;
car = toupper(car);
return (car=='S');
}
void leer_fraccion(int &n, int &d)
{
cout << "Numerador: ";
cin >> n;
cout << "Denominador: ";
cin >> d;
}
void escribir_fraccion(int n, int d)
{
cout << n << "/" << d;
}
void intercambia(int &x, int &y)
{ int t;
t = x;
x = y;
y = t;
}
int MCD(int x, int y)
{ // El MCD no depende del signo por lo que uso el valor absoluto
x = abs(x);
y = abs(y);
while(x!=y)
{ if (x>y)
{ x = x -y;
}
else
{ intercambia(x,y);
}
}
return x;
}
void suma_fracciones(int n1,int d1,int n2,int d2,int &n3,int &d3)
{
simplifica_fraccion(n1*d2 + n2*d1,d1*d2,n3,d3);
}
void multiplica_fracciones(int n1,int d1,int n2,int d2,int &n3,int &d3)
{
simplifica_fraccion(n1*n2,d1*d2,n3,d3);
}
void simplifica_fraccion(int n1,int d1,int &n3,int &d3)
{
int mcd;
// Ajusto los Valores
mcd = MCD(n1,d1);
n3 = abs(n1)/mcd;
d3 = abs(d1)/mcd;
// Ajusto el Signo
if (n1*d1<0) // Tienen distinto signo
{
n3 = -n3;
}
}