Предмет: Информатика, автор: Swerrio

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

}

Ответы

Автор ответа: Stephan2
1

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


Swerrio: лучший. спасибо.
Stephan2: можно лучший?
Похожие вопросы
Предмет: История, автор: dimapetrovic443
Предмет: Русский язык, автор: kamaltomiris2011
Задание 1.Составьте по тексту вопросный план.
Задание 2. Выпишите 1, 2 предложения и расставьте знаки препинания, выделив запятыми вводные слова.
Несомненно с незапамятных времён обширная казахская земля была культурной колыбелью всего евразийского
пространства. По словам ученых в древности по степям Казахстана проходил Великий Шелковый путь,
связавший Восток и Запад. Казахский народ имеет многовековую историю, является обладателем культурных
ценностей, вошедших в сокровищницу мировой цивилизации.
По количеству и разнообразию памятников, Казахстан не уступает таким странам как Индия, Китай, государствам
Средиземноморья, является своеобразным музеем под открытым небом. Недвижимых памятников истории, археологии
архитектуры насчитываются около 25 тысяч. Казахстан является «чемпионом» в Центральной Азии по количеству
эпиграфических памятников (надгробных надписей). Мавзолей Жошы-хана в Улытау находится в самом
географическом центре Казахстана. Сегодня многие из этих памятников признаны ЮНЕСКО памятниками всемирного
значения: Мавзолей Ходжа Ахмеда Яссави и комплекс петроглифов Тамгалы в Алматинской области, памятник Алтын
Адам («Золотой человек»), мавзолей Ходжи Ахмеда Яссави, Отрар, Туркестан.
К тому же в библиотеках хранятся более 66 млн книг и редких рукописей. Основная часть казахского фольклора
восходит к золотоордынской эпохе. Вспоминаются образы эмира Едиге и Асана Кайгы - советника Азь Жанибека,
великого ордынского правителя. Одна из самых популярных и знаковых лиро-эпических казахских поэм «Кыз-Жибек>>
включена в мировое культурное наследие.
Многое в Казахстане уходит корнями в древность. Даже название национальной валюты Казахстана - «тенге»
происходит из древности, от названия золотоордынской валюты «данг». Кстати, от него же происходит и русское
<<Деньги».


ПОМОГИТЕ ПЖЖ