#include #include #include struct Racional { int numerador; int denominador; }; Racional novo_racional(int numerador, int denominador); Racional soma(Racional const &, Racional const &); Racional substracao(Racional const &, Racional const &); Racional produto(Racional const &, Racional const &); Racional divisao(Racional const &, Racional const &); bool igual(Racional const &, Racional const &); void normaliza(Racional &); int main(int, char const *[]) { Racional um_decimo = novo_racional(1, 10); Racional soma_tres; soma_tres = soma(um_decimo, soma(um_decimo, um_decimo)); Racional tres_decimos = novo_racional(3, 10); if (igual(tres_decimos, soma_tres)) { std::cout << "Funcionou!\n"; } else { std::cout << "Nao entende soma!\n"; } Racional outro = novo_racional(30, 100); if (!igual(tres_decimos, outro)) { std::cout << "Nao entende fatores comuns!\n"; } auto dois_decimos = substracao(tres_decimos, um_decimo); if (!igual(dois_decimos, novo_racional(1, 5))) { std::cout << "Nao entende subtracao!\n"; } auto nove_centesimos = produto(tres_decimos, outro); std::cout << "nove centesimos: " << nove_centesimos.numerador << "/" << nove_centesimos.denominador << std::endl; auto tres = divisao(tres_decimos, um_decimo); if (!igual(tres, novo_racional(3, 1))) { std::cout << "Nao entende divisao.\n"; } auto mais_outro = novo_racional(-3, -10); if (!igual(tres_decimos, mais_outro)) { std::cout << "Nao entende negativos.\n"; } return 0; } void normaliza(Racional &r) { if (r.denominador == 0) { std::cerr << "Denominador nulo nao permitido!\n"; exit(1); } if (r.denominador < 0) { r.numerador = -r.numerador; r.denominador = -r.denominador; } auto fator_comum = std::gcd(r.numerador, r.denominador); r.numerador /= fator_comum; r.denominador /= fator_comum; } Racional novo_racional(int numerador, int denominador) { Racional resultado{numerador, denominador}; normaliza(resultado); return resultado; } Racional soma(Racional const &a, Racional const &b) { // x/y + w/z => (x*z + w*y)/(y*z) auto den = a.denominador * b.denominador; auto num = a.numerador * b.denominador + b.numerador * a.denominador; Racional resultado = novo_racional(num, den); return resultado; } Racional substracao(Racional const &a, Racional const &b) { // x/y - w/z => (x*z - w*y)/(y*z) auto den = a.denominador * b.denominador; auto num = a.numerador * b.denominador - b.numerador * a.denominador; return novo_racional(num, den); } Racional produto(Racional const &a, Racional const &b) { // x/y * w/z => (x*w)/(y*z) auto num = a.numerador * b.numerador; auto den = a.denominador * b.denominador; return novo_racional(num, den); } Racional divisao(Racional const &a, Racional const &b) { // x/y * w/z => (x*w)/(y*z) auto num = a.numerador * b.denominador; auto den = a.denominador * b.numerador; return novo_racional(num, den); } bool igual(Racional const &a, Racional const &b) { return (a.numerador == b.numerador) && (a.denominador == b.denominador); }