
Перед вами частичная реализация на C++ математической дроби. Класс Fraction из себя представляет
структуру данных с приватными полями _numerator (числитель) и _denomenator (знаменатель). Публичный метод toString() - дает строковое представление дроби Приватный метод reduce() - сокращает дробь, если возможно Необходимо реализовать следующие операторы: Оператор +=, увеличивает данную дробь на целое число Оператор ==, сравнивает между собой две дроби Оператор +, складывает между собой две дроби Для сокращения дроби при реализации программы можете использовать метод reduce, либо функции std::gcd (поиск НОД) и std::lcm (поиск НОК)* Код: #include #include #include #include class Fraction { public: Fraction(const int num = 0, const int den = 1); Fraction(const Fraction& other) = default; ~Fraction() = default; std::string toString() const; Fraction& operator+=(int a); friend bool operator==(const Fraction& left, const Fraction& rigth); friend const Fraction operator+(const Fraction& left, const Fraction& rigth); private: void reduce(); private: int _numeratotr; int _denomenator; }; Fraction::Fraction(const int num, const int den) { if (den == 0) { throw std::invalid_argument("denomenator can't be zero"); } _numeratotr = num; _denomenator = den; reduce(); } std::string Fraction::toString() const { if (_numeratotr == 0) { return "0"; } if (_denomenator == 1) { return std::to_string(_numeratotr); } return std::to_string(_numeratotr) + "/" + std::to_string(_denomenator); } void Fraction::reduce() { auto gcd = std::gcd(std::abs(_numeratotr), _denomenator); if (gcd != 1) { _numeratotr /= gcd; _denomenator /= gcd; } } Fraction& Fraction::operator+=(int a) { // Напиши меня! } bool operator==(const Fraction& left, const Fraction& rigth) { // Напиши меня! } const Fraction operator+(const Fraction& left, const Fraction& rigth) { // Напиши меня! } int main() { Fraction a(0, 10); Fraction b(2, 5); std::cout << a.toString() << " " << b.toString() << " " << (a == b) << "\n"; a += 2; Fraction c(40, 20); std::cout << a.toString() << " " << c.toString() << " " << (a == c) << "\n"; auto d = a + b; std::cout << d.toString() << " " << "\n"; }

Ответы на вопрос

Для реализации операторов +=, == и + необходимо изменить класс Fraction следующим образом:
Оператор +=:
Fraction& Fraction::operator+=(int a) {
_numeratotr += a * _denomenator;
reduce();
return *this;
}
Оператор увеличивает значение числителя на a, умноженное на знаменатель, затем вызывает метод reduce для сокращения дроби.
Оператор ==:
bool operator==(const Fraction& left, const Fraction& right) {
return left._numeratotr == right._numeratotr && left._denomenator == right._denomenator;
}
Оператор сравнивает числитель и знаменатель двух дробей. Если они равны, то возвращает true, иначе - false.
Оператор +:
const Fraction operator+(const Fraction& left, const Fraction& right) {
int lcm = std::lcm(left._denomenator, right._denomenator);
int new_numerator = left._numeratotr * (lcm / left._denomenator) + right._numeratotr * (lcm / right._denomenator);
return Fraction(new_numerator, lcm);
}
Оператор находит наименьшее общее кратное знаменателей двух дробей, затем вычисляет новое значение числителя путем умножения числителя каждой дроби на соответствующее значение, чтобы получить общий знаменатель. Затем возвращает новую дробь, созданную с использованием нового числителя и наименьшего общего кратного знаменателя.
Полный код с реализацией всех трех операторов:
#include <iostream>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <numeric>
class Fraction {
public:
Fraction(const int num = 0, const int den = 1);
Fraction(const Fraction& other) = default;
~Fraction() = default;
std::string toString() const;
Fraction& operator+=(int a);
friend bool operator==(const Fraction& left, const Fraction& right);
friend const Fraction operator+(const Fraction& left, const Fraction& right);
private:
void reduce();
private:
int _numeratotr;
int _denomenator;
};
Fraction::Fraction(const int num, const int den) {
if (den == 0) {
throw std::invalid_argument("denomenator can't be zero");
}
_numeratotr = num;
_denomenator = den;
reduce();
}
std::string Fraction::toString() const {
if (_numeratotr == 0) {
return "0";
}
if (_denomenator == 1) {
return std::to_string(_numeratotr);
}
return std::to_string(_numeratotr) + "/" + std::to_string(_denomenator);
}
void Fraction::reduce() {
auto gcd = std::gcd(std::abs(_numeratotr), _denomenator);
if (gcd != 1) {
_numeratotr /= gcd;
_denomenator /= gcd;
}
}
Fraction



В данном коде реализован класс Fraction, который представляет собой структуру данных для работы с математическими дробями. Класс имеет приватные поля _numerator (числитель) и _denominator (знаменатель).
Конструктор класса Fraction принимает два параметра: num (числитель) и den (знаменатель). Если знаменатель равен 0, выбрасывается исключение std::invalid_argument. Значения числителя и знаменателя присваиваются соответствующим приватным полям класса, после чего вызывается метод reduce() для сокращения дроби.
Метод toString() возвращает строковое представление дроби. Если числитель равен 0, возвращается строка "0". Если знаменатель равен 1, возвращается строковое представление числителя. В противном случае, возвращается строка в формате "числитель/знаменатель".
Приватный метод reduce() сокращает дробь, если это возможно. Для нахождения наибольшего общего делителя используется функция std::gcd() из стандартной библиотеки. Если НОД не равен 1, числитель и знаменатель делятся на НОД.
Оператор += увеличивает данную дробь на целое число a. Метод не реализован и должен быть дописан.
Оператор == сравнивает две дроби. Метод не реализован и должен быть дописан.
Оператор + складывает две дроби. Метод не реализован и должен быть дописан.
В функции main() создаются объекты класса Fraction и выполняются различные операции с дробями. Результаты операций выводятся на экран.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili