[C] Números Racionais
Publicado por Enzo de Brito Ferber (última atualização em 25/04/2017)
[ Hits: 8.802 ]
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 */
Rotinas para manipulação de matrizes
HaiDownlodManager - simples programa para baixar arquivos
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Wifi não funciona no Aspire ES 15 com o Debian (8)
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta