Definir o tipo fracao, para representar uma fração de valores inteiros. Escrever a função int compara(fracao f1, fracao f2), que retorna 0 , se as frações representam o mesmo valor, ou retorna 1, se as frações representam valores diferentes. Escrever as funções fracao soma(fracao f1, fracao f2), que retorna a soma das frações f1 e f2, e fracao produto(fracao f1, fracao f2), que retorna o produto das frações f1 e f2. Escrever a função main() para testar as funções compara, soma e produto. Para simplificar uma fração, usar o algoritmo de Euclides para o máximo divisor comum:
int mdc(int x, int y)
{
int r = 1;
while (r != 0)
{
r = x % y;
x = Y;
Y = r;
}
return x;
}
int mdc(int x, int y)
{
int r = 1;
while (r != 0)
{
r = x % y;
x = Y;
Y = r;
}
return x;
}
Passo 1
O exercício pede para definirmos um tipo que represente frações (numerador/denominador inteiros) e implementar funções para comparar, somar, multiplicar e simplificar frações usando o algoritmo de Euclides.
Passo 2
Primeiro, vamos criar uma struct C chamada fracao com dois campos inteiros: numerador e denominador. Isso nos dá um jeito organizado de passar frações às funções.
Em seguida, precisamos de uma função mdc(int x, int y) que calcule o máximo divisor comum usando o algoritmo de Euclides. A ideia é ir pegando o resto da divisão até chegar a zero; o divisor naquele ponto é o mdc.
Em seguida, precisamos de uma função mdc(int x, int y) que calcule o máximo divisor comum usando o algoritmo de Euclides. A ideia é ir pegando o resto da divisão até chegar a zero; o divisor naquele ponto é o mdc.
Passo 3
Para garantir que nossas operações gerem frações na forma mais simples, fazemos uma função void simplifica(fracao *f) que calcula o mdc do numerador e do denominador e divide ambos pelo mdc. Isso mantém o sinal correto e evita denominadores negativos.
Passo 4
A função int compara(fracao f1, fracao f2) deve verificar se as duas frações representam o mesmo valor. Em vez de converter para ponto flutuante (que pode dar erro), comparamos cruzado: f1.num * f2.den == f2.num * f1.den. Se for igual, retornamos 0, senão 1.
Passo 5
Para somar frações em fracao soma(fracao f1, fracao f2), usamos a fórmula clássica: numerador = f1.numf2.den + f2.numf1.den e denominador = f1.den*f2.den. Depois simplificamos o resultado antes de retornar.
Passo 6
Para produto, em fracao produto(fracao f1, fracao f2) basta numerador = f1.num * f2.num e denominador = f1.den * f2.den, e então simplificar antes de retornar.
Passo 7
Por fim, escrevemos a função main() para testar tudo. Criamos algumas frações, chamamos compara, soma e produto, e imprimimos os resultados no console para verificar que está funcionando corretamente.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
typedef struct {
int num;
int den;
} fracao;
int num;
int den;
} fracao;
int mdc(int x, int y) {
int r;
// Garantir valores positivos
x = abs(x);
y = abs(y);
while (y != 0) {
r = x % y;
x = y;
y = r;
}
return x;
}
int r;
// Garantir valores positivos
x = abs(x);
y = abs(y);
while (y != 0) {
r = x % y;
x = y;
y = r;
}
return x;
}
void simplifica(fracao *f) {
int d = mdc(f->num, f->den);
if (d != 0) {
f->num /= d;
f->den /= d;
}
// Ajustar sinal para que só num possa ser negativo
if (f->den < 0) {
f->den = -f->den;
f->num = -f->num;
}
}
int d = mdc(f->num, f->den);
if (d != 0) {
f->num /= d;
f->den /= d;
}
// Ajustar sinal para que só num possa ser negativo
if (f->den < 0) {
f->den = -f->den;
f->num = -f->num;
}
}
int compara(fracao f1, fracao f2) {
// Simplificar antes de comparar (opcional, mas seguro)
simplifica(&f1);
simplifica(&f2);
long a = (long)f1.num * f2.den;
long b = (long)f2.num * f1.den;
return (a == b) ? 0 : 1;
}
// Simplificar antes de comparar (opcional, mas seguro)
simplifica(&f1);
simplifica(&f2);
long a = (long)f1.num * f2.den;
long b = (long)f2.num * f1.den;
return (a == b) ? 0 : 1;
}
fracao soma(fracao f1, fracao f2) {
fracao res;
res.num = f1.num * f2.den + f2.num * f1.den;
res.den = f1.den * f2.den;
simplifica(&res);
return res;
}
fracao res;
res.num = f1.num * f2.den + f2.num * f1.den;
res.den = f1.den * f2.den;
simplifica(&res);
return res;
}
fracao produto(fracao f1, fracao f2) {
fracao res;
res.num = f1.num * f2.num;
res.den = f1.den * f2.den;
simplifica(&res);
return res;
}
fracao res;
res.num = f1.num * f2.num;
res.den = f1.den * f2.den;
simplifica(&res);
return res;
}
int main() {
fracao a = {2, 3};
fracao b = {4, 6};
fracao c = {5, -10};
fracao a = {2, 3};
fracao b = {4, 6};
fracao c = {5, -10};
printf("Comparar 2/3 e 4/6: %s\n", (compara(a, b) == 0) ? "iguais" : "diferentes");
printf("Comparar 2/3 e 5/(-10): %s\n", (compara(a, c) == 0) ? "iguais" : "diferentes");
fracao s = soma(a, b);
printf("Soma de 2/3 + 4/6 = %d/%d\n", s.num, s.den);
fracao p = produto(a, c);
printf("Produto de 2/3 * 5/(-10) = %d/%d\n", p.num, p.den);
return 0;
}