Перед вами частичная реализация на 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