[C] Números Racionais
Publicado por Enzo de Brito Ferber (última atualização em 25/04/2017)
[ Hits: 9.504 ]
Homepage: http://www.maximasonorizacao.com.br
Script que define um TDA (tipo de dados abstracto) chamado RATIONAL para manipular frações (números racionais). Um número racional é qualquer número representado pela razão entre dois intereiros A e B, na forma A/B. O programa implementa funções para criar um número racional a partir de dois inteiros, somar, subtrair, dividir, multiplicar e simplificar.
Compilar com:
gcc -o rational rational.c -Wall -lm
/* rational.c
* gcc -o rational rational.c -Wall -lm
*
* (C) 2017 - Enzo Ferber, <enzoferber@gmail.com>
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#define MIN(a,b) (a < b ? a : b)
#define BUF_SIZE 32
struct rational {
int n; /* numerator */
int d; /* denominator */
};
typedef struct rational RATIONAL;
void *xmalloc(size_t n)
{
void *p = malloc(n);
if(!p) {
perror("malloc");
exit(EXIT_FAILURE);
}
return p;
}
int GCD(int a, int b)
{
register int i;
/* if any is zero, return 1 */
if(!a || !b) return 1;
for(i = MIN(a,b); i >= 1; i--)
if(!(a % i) && !(b % i)) break;
return i;
}
RATIONAL *make_rational(int n, int d)
{
RATIONAL *r = xmalloc(sizeof *r);
r->n = n;
r->d = d;
return r;
}
RATIONAL *simplify_rational(RATIONAL *r)
{
int m = GCD(r->n, r->d);
r->n /= m;
r->d /= m;
/* just for consistency */
return r;
}
RATIONAL *add_rational(RATIONAL *a, RATIONAL *b)
{
RATIONAL *r = xmalloc(sizeof *r);
r->n = (a->n * b->d) + (b->n * a->d);
r->d = a->d * b->d;
return simplify_rational(r);
}
RATIONAL *subtract_rational(RATIONAL *a, RATIONAL *b)
{
RATIONAL *r = xmalloc(sizeof *r);
r->n = (a->n * b->d) - (b->n * a->d);
r->d = a->d * b->d;
return simplify_rational(r);
}
RATIONAL *divide_rational(RATIONAL *a, RATIONAL *b)
{
RATIONAL *r = xmalloc(sizeof *r);
r->n = a->n * b->d;
r->d = a->d * b->n;
return simplify_rational(r);
}
RATIONAL *multiply_rational(RATIONAL *a, RATIONAL *b)
{
RATIONAL *r = xmalloc(sizeof *r);
r->n = a->n * b->n;
r->d = a->d * b->d;
return simplify_rational(r);
}
int read_int(char *label) {
char buffer[BUF_SIZE];
fprintf(stderr, label);
fgets(buffer, BUF_SIZE, stdin);
return atoi(buffer);
}
RATIONAL *get_rational(void)
{
int a, b;
a = read_int("Numerador : ");
b = read_int("Denominador: ");
return make_rational(a, b);
}
void print_rational(char *label, RATIONAL *r)
{
printf("%s: %d/%d\n", label, r->n, r->d);
}
int main(int argc, char *argv[])
{
RATIONAL *a, *b, *add, *sub, *mul, *div;
a = get_rational();
b = get_rational();
add = add_rational(a, b);
sub = subtract_rational(a, b);
mul = multiply_rational(a, b);
div = divide_rational(a, b);
print_rational("A ", a);
print_rational("B ", b);
print_rational("add", add);
print_rational("sub", sub);
print_rational("mul", mul);
print_rational("div", div);
free(a);
free(b);
free(add);
free(sub);
free(mul);
free(div);
return 0;
}
/* EoF */
Integração numérica - Método da Quadratura Gaussiana
Método de Power para calcular o autovelor dominante de uma matriz
Faça suas próprias atualizações de pacotes/programas no Void Linux e torne-se um Contribuidor
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Instalar e Configurar a santíssima trindade (PAP) no Void Linux
Pisando no acelerador do Linux Mint: Kernel XanMod, zRAM e Ajustes de Swap
Como compilar kernel no Linux Mint
Lançamento do Brutal DOOM test 6
Consertando o erro no Brave de webgl
Solução para ter de volta as bordas e barra de títulos das janelas em zenity no Debian 13.x
Seno, Coseno, Tangente em CLIPPER (0)
Inserir uma URL num arquvo pelo Ubuntu (CLIPPER) (0)
VMWare Player não conecta na rede nem consigo intercambiar arquivos (1)









