Top.Mail.Ru
Ответы

Товарищи программисты... объясните блок кода пожалуйста)

есть прога си++, которая работает с дробями... не понятно что делает данный блок кода:

friend ostream& operator<<(ostream& out, const Rational& x) {
if (x.n1 < 0 || x.d2 < 0) out << '-';
out << '(' << abs(x.n1) << ", " << abs(x.d2) << ')';
return out;
}

вот сама программа:
#include <iostream>
using namespace std;
class Rational {
public:
using llong = long long;
Rational(llong n, llong d) : n1(n), d2(d) {
reduce_();
}
Rational add(const Rational& x) { //+
auto n = n1 * x.d2 + d2 * x.n1;
auto d = d2 * x.d2;
return Rational(n, d);
}
Rational sub(const Rational& x) { //-
auto n = n1 * x.d2 - d2 * x.n1;
auto d = d2 * x.d2;
return Rational(n, d);
}
Rational mul(const Rational& x) { //*
auto n = n1 * x.n1;
auto d = d2 * x.d2;
return Rational(n, d);
}
Rational div(const Rational& x) {
auto n = n1 * x.d2;
auto d = d2 * x.n1;
return Rational(n1, d);
}
private:
llong n1;
llong d2;
void reduce_() {
auto x = gcd_(n1, d2);
n1 /= x;
d2 /= x;
if (n1 < 0 && d2 < 0) {
n1 = abs(n1);
d2 = abs(d2);
}
}
llong gcd_(llong a, llong b) {
a = abs(a);
b = abs(b);
while (a != b) {
if (a > b) swap(a, b);
b = b - a;
}
return a;
}
friend ostream& operator<<(ostream& out, const Rational& x) {
if (x.n1 < 0 || x.d2 < 0) out << '-';
out << '(' << abs(x.n1) << ", " << abs(x.d2) << ')';
return out;
}
};
int main() {
Rational a(-23, -9);
Rational b(45, 35);
auto add = a.add(b);
auto sub = a.sub(b);
auto mul = a.mul(b);
auto div = a.div(b);
cout
<< a << " + " << b << " = " << add << '\n'
<< a << " - " << b << " = " << sub << '\n'
<< a << " * " << b << " = " << mul << '\n'
<< a << " / " << b << " = " << div << '\n';
cin.get();
}

По дате
По Рейтингу
Аватар пользователя
Новичок

Переопределяет оператор << для удобного вывода в поток

PS: Почему не переопределены операторы +- итд - тайна покрытая мраком
И кстати в коде логическая ошибка - выводит знак "минус" в случае когда и числитель и знаменатель отрицательные