/* Fuente: RACIONAL.C
Programa: ARITMETICA BASICA CON NUMEROS RACIONALES
Descripción: Este programa permite operar con números racionales. Un número racional
se caracteriza por estar expresado con un denominador y un denominador.
Las operaciones que contempla son:
- suma
- resta
- producto
- división
Además utiliza una función para proporcionar siempre la expresión irreducible del número
racional
*/
#include <stdio.h>
#include <math.h>
#include <ctype.h>
/* ---------------------------------------------------------- */
/* Definiciones globales */
/* ---------------------------------------------------------- */
typedef struct {
int num; /* Numerador */
int denom; /* Denominador */
} Racional;
/* ---------------------------------------------------------- */
/* Prototipos */
/* ---------------------------------------------------------- */
void Modulo_Principal (void);
void Presentacion (void);
void LeerRacional (Racional *);
void MostrarRacional (Racional);
void SumaRacional (Racional, Racional, Racional *);
void RestaRacional (Racional, Racional, Racional *);
void MultiplicaRacional (Racional, Racional, Racional *);
void DivideRacional (Racional, Racional, Racional *);
void SimplificaRacional (Racional *);
int mcd (int, int);
/* ---------------------------------------------------------- */
int main (void) {
/* ---------------------------------------------------------- */
char respuesta;
Presentacion();
do
Modulo_Principal();
do
{ printf("¿Otra ejecución (S/N)?: "); fflush(stdin
); /* Limpia el buffer de teclado */ }
while (respuesta != 'S' && respuesta != 'N');
}
while (respuesta != 'N');
return 0;
} /* Fin del main */
/* ---------------------------------------------------------- */
void Modulo_Principal (void) {
/* ---------------------------------------------------------- */
Racional rac1, rac2, rsum, rres, rprod, rdiv;
printf("Introduzca el primer número racional:\n"); LeerRacional(&rac1);
printf("Introduzca el segundo número racional:\n"); LeerRacional(&rac2);
SumaRacional (rac1, rac2, &rsum);
MostrarRacional(rsum);
RestaRacional (rac1, rac2, &rres);
MostrarRacional(rres);
MultiplicaRacional (rac1, rac2, &rprod);
MostrarRacional(rprod);
DivideRacional (rac1, rac2, &rdiv);
MostrarRacional(rdiv);
}
/* ---------------------------------------------------------- */
void Presentacion (void) {
/* ---------------------------------------------------------- */
puts("ARITMETICA BASICA CON NUMEROS RACIONALES"); puts("========================================"); puts("Realiza la suma de números racionales"); puts("Siempre presenta la expresión irreducible del número racional"); }
/* ---------------------------------------------------------- */
void LeerRacional (Racional *r) {
/* ---------------------------------------------------------- */
scanf("%d/%d", &(r
->num
), &(r
->denom
)); }
/* ---------------------------------------------------------- */
void SumaRacional (Racional a, Racional b, Racional *r) {
/* ---------------------------------------------------------- */
if(a.denom == b.denom){
(r->num)=(a.num + b.num);
(r->denom)=(a.denom);
}else{
(r->denom)=(a.denom * b.denom);
(r->num)=(((r->denom/a.denom)*a.num) + ((r->denom/b.denom)*b.num));
}
SimplificaRacional(&r);
}
/* ---------------------------------------------------------- */
void RestaRacional (Racional a, Racional b, Racional *r) {
/* ---------------------------------------------------------- */
if(a.denom == b.denom){
(r->denom)=(a.denom);
(r->num) = (a.num - b.num);
}else{
(r->denom)=(a.denom * b.denom);
(r->num)=(((r->denom/a.denom)*a.num) - ((r->denom/b.denom)*b.num));
}
SimplificaRacional(&r);
}
/* ---------------------------------------------------------- */
void MultiplicaRacional (Racional a, Racional b, Racional *r) {
/* ---------------------------------------------------------- */
(r->num)=(a.num*b.num);
(r->denom)=(a.denom*b.denom);
SimplificaRacional(&r);
}
/* ---------------------------------------------------------- */
void DivideRacional (Racional a, Racional b, Racional *r) {
/* ---------------------------------------------------------- */
(r->num)=(a.num*b.denom);
(r->denom=a.denom*b.num);
SimplificaRacional(&r);
}
/* ---------------------------------------------------------- */
void MostrarRacional (Racional r) {
/* ---------------------------------------------------------- */
if (r.denom != 1)
}
/* ---------------------------------------------------------- */
void SimplificaRacional (Racional *r) {
/* ---------------------------------------------------------- */
// Calcula el mcd del numerador y del denominador
// Divide numerador y denominador por su mcd
// Si la fraccion debe llevar segno negativo (num*dem <0)
// entonces el signo se coloca al numerador
int min;
min=mcd(r->num, r->denom);
r->num = (r->num)/min;
r->denom =(r->denom)/min;
if((r->num * r->denom)<0){
r->num = - r->num;
}
}
/* ---------------------------------------------------------- */
int mcd (int n, int d) {
/* ---------------------------------------------------------- */
/* Calcula el máximo común dividor de n y d */
/* Precisa que d sea distinto de cero */
/* Precisa que n > d */
int c;
if(n!=0 && d!=0 && n>d){
do{
c=n%d;
if(c!=0){
n=d;
d=c;
}
}while(c!=0);
}else{
return;
}
return d;
}