C/C++

Задача на C++

Помогите решить!

Создай класс Fraction (обыкновенная дробь). Добавь конструктор, который будет принимать два целых числа и добавлять объекту атрибуты - числитель и знаменатель. Добавь метод print который будет выводить текстовое представление объекта в формате: «Дробь {числитель}/{знаменатель}», например «Дробь 1/2». Переопредели методы арифметических операций сложение, вычитание, умножение, деление (/). Методы должны возвращать объект класса Fraction - новую дробь равную результату выполнения арифметической операции с двумя исходными дробями.


Считай с клавиатуры четыре целых чисел - числитель и знаменатель первой дроби и числитель и знаменатель второй дроби. Создай экземпляры класса Fraction с параметрами считанными с клавиатуры. Выведи результаты арифметических операций сложение, вычитание, умножение, деление (/) этих дробей.

Входные данные:
Вводится четыре строки, каждая строка содержит целое число - числитель и знаменатель первой дроби и числитель и знаменатель второй дроби.

Выходные данные:
Выводится 4 строки в формате «Дробь {числитель}/{знаменатель}» без кавычек.



Пример работы программы:
Входные данные:
2
4
1
4
Выходные данные:
Дробь 3/4
Дробь 1/4
Дробь 1/8
Дробь 2/1
Ш?
Шамс ??????
247
Держи:
 #include 

using namespace std;

typedef long num_t;

num_t gcd(num_t n1, num_t n2) {
num_t tmp;
while (n2 != 0) {
tmp = n1;
n1 = n2;
n2 = tmp % n2;
}
return n1;
}

class Fraction {
private:
const num_t num;
const num_t den;

public:
Fraction(const num_t n, const num_t d): num(n), den(d) {}

static Fraction reduce(const num_t n, const num_t d) {
// сокращаем на НОД и относим знак к числителю
const num_t g = abs(gcd(n, d));
const num_t s = d < 0;
return Fraction(((n ^ -s) + s) / g, ((d ^ -s) + s) / g);
}

Fraction operator + (const Fraction &that) {
const num_t lcm = den * that.den / gcd(den, that.den);
return reduce(num * lcm / den + that.num * lcm / that.den, lcm);
}

Fraction operator - (const Fraction &that) {
const num_t lcm = den * that.den / gcd(den, that.den);
return reduce(num * lcm / den - that.num * lcm / that.den, lcm);
}

Fraction operator * (const Fraction &that) {
return reduce(num * that.num, den * that.den);
}

Fraction operator / (const Fraction &that) {
return reduce(num * that.den, den * that.num);
}

void print(ostream &o) {
o > num2 >> den2;

Fraction f1(num1, den1), f2(num2, den2);
(f1 + f2).print(cout);
(f1 - f2).print(cout);
(f1 * f2).print(cout);
(f1 / f2).print(cout);

return 0;
}
Только надо сказать, целое переполнение тут не отслеживается, поэтому постарайся уложиться в sizeof(long) (на нормальных платформах это 64 бита, а в микрософте у Билла до сих пор в 32-битных штанишках прыгают).
Дмитрий Широков
Дмитрий Широков
87 571
Лучший ответ
Шамс ?????? Спасибо)