/
haseew
/
Lab_4
Обзор
Документация
Войти
/
haseew
/
Lab_4
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Rational.cpp
100 строк
3 KB
Egorchik
Lab_4
23 мар 2026, 14:20
23 мар 2026, 14:20
065d234
Код
Авторство
О чём код?
#include "Rational.h" #include <numeric> #include <stdexcept> // внутренний метод сокращения дроби void Rational::reduce() { if (den == 0) { throw std::invalid_argument("Znamenatel ne mozhet byt nulevym!"); } // находим нод числителя и знаменателя int g = std::gcd(num, den); num /= g; den /= g; // знаменатель должен быть положительным if (den < 0) { num = -num; den = -den; } } // конструктор дроби Rational::Rational(int numerator, int denominator) : num(numerator), den(denominator) { reduce(); // сразу приводим дробь к несократимому виду } int Rational::Numerator() const { return num; } int Rational::Denominator() const { return den; } // унарный плюс Rational Rational::operator+() const { return *this; } // унарный минус Rational Rational::operator-() const { return Rational(-num, den); } // операторы присваивания со сложением, вычитанием, умножением и делением Rational& Rational::operator+=(const Rational &r) { num = num * r.den + r.num * den; den = den * r.den; reduce(); return *this; } // оператор -= Rational& Rational::operator-=(const Rational &r) { num = num * r.den - r.num * den; den = den * r.den; reduce(); return *this; } // оператор *= Rational& Rational::operator*=(const Rational &r) { num *= r.num; den *= r.den; reduce(); return *this; } // оператор /= Rational& Rational::operator/=(const Rational &r) { if (r.num == 0) { throw std::invalid_argument("Delenie na nol!"); } num *= r.den; den *= r.num; reduce(); return *this; } // бинарные операторы Rational operator+(Rational lhs, const Rational &rhs) { return lhs += rhs; } Rational operator-(Rational lhs, const Rational &rhs) { return lhs -= rhs; } Rational operator*(Rational lhs, const Rational &rhs) { return lhs *= rhs; } Rational operator/(Rational lhs, const Rational &rhs) { return lhs /= rhs; } // сравнение равенства bool operator==(const Rational &lhs, const Rational &rhs) { return lhs.num == rhs.num && lhs.den == rhs.den; } // сравнение неравенства bool operator!=(const Rational &lhs, const Rational &rhs) { return !(lhs == rhs); } // вывод дроби std::ostream& operator<<(std::ostream &os, const Rational &r) { if (r.den == 1) { os << r.num; // если знаменатель 1, выводим как целое число } else { os << r.num << "/" << r.den; } return os; }