Вопрос задан 25.11.2023 в 21:37. Предмет Информатика. Спрашивает Силюкова Юля.

Перед вами частичная реализация на 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"; }
0 0
Перейти к ответам

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

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Боранбай Абылай.

Для реализации операторов +=, == и + необходимо изменить класс 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

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

В данном коде реализован класс Fraction, который представляет собой структуру данных для работы с математическими дробями. Класс имеет приватные поля _numerator (числитель) и _denominator (знаменатель).

Конструктор класса Fraction принимает два параметра: num (числитель) и den (знаменатель). Если знаменатель равен 0, выбрасывается исключение std::invalid_argument. Значения числителя и знаменателя присваиваются соответствующим приватным полям класса, после чего вызывается метод reduce() для сокращения дроби.

Метод toString() возвращает строковое представление дроби. Если числитель равен 0, возвращается строка "0". Если знаменатель равен 1, возвращается строковое представление числителя. В противном случае, возвращается строка в формате "числитель/знаменатель".

Приватный метод reduce() сокращает дробь, если это возможно. Для нахождения наибольшего общего делителя используется функция std::gcd() из стандартной библиотеки. Если НОД не равен 1, числитель и знаменатель делятся на НОД.

Оператор += увеличивает данную дробь на целое число a. Метод не реализован и должен быть дописан.

Оператор == сравнивает две дроби. Метод не реализован и должен быть дописан.

Оператор + складывает две дроби. Метод не реализован и должен быть дописан.

В функции main() создаются объекты класса Fraction и выполняются различные операции с дробями. Результаты операций выводятся на экран.

0 0

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос