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

Доброго времени суток! Срочно нужна помощь! Надо было написать класс дроби на С++ с функциями всех операций над дробями и с перегрузкой операторов. Всё функции операций над дробями я сделал. А вот с перегрузкой операторов проблема. Умоляю помогите сделать перегрузку операторов и объясните как и для чего она делается. Даю последние баллы! Заранее благодарю за помощь.
Вот моя программа (в ней все верно, она рабочая) :
#include <iostream>
class fraction
{
public:
int num;
int denum;
bool vec;
void print()
{
std::cout« this-> num « "/" « this-> denum « std::endl;
}
void swap (int *a, int *b)
{
int f;
f= *a;
*a = *b;
*b = f;
}
int NOD(int a, int b)
{
int div;
if (a<0)
a=-a;
if (b<0)
b=-b;
while (a != b)
{
if (a < b)
swap(&a,&b);
a = a - b;
}
div = a;
return div;
}
fraction mul (fraction arg)
{
fraction temp;
temp.num = this->num * arg.num;
temp.denum = this->denum * arg.denum;
return temp;
}
fraction mul_number(int arg)
{
fraction temp;
temp.num = num * arg;
temp.denum = denum;
int common = NOD(temp.num, temp.denum);
temp.num /=common;
temp.denum/=common;
return temp;
}
fraction del(fraction arg)
{
fraction temp;
temp.num = this-> num * arg.denum;
temp.denum = this->denum * arg.num;
return temp;
}
fraction del_number(int arg)
{
fraction temp;
temp.num = num;
temp.denum = denum * arg;
return temp;
}
fraction del_number_two(int arg)
{
fraction temp;
temp.num = denum * arg;
temp.denum = num;
return temp;
}
fraction add(fraction arg)
{
fraction temp;
temp.num = (this ->num *arg.denum) + (arg.num*denum);
temp.denum = this -> denum * arg.denum;
return temp;
}
fraction add_number(int arg)
{
fraction temp;
temp.num = arg * this->denum + this-> num;
temp.denum = this->denum;
return temp;
}
fraction sub(fraction arg)
{
fraction temp;
temp.num = (this->num *arg.denum) - (arg.num*denum);
temp.denum = this ->denum * arg.denum;
return temp;
}
fraction sub_number(int arg) //вычитание целого числа из дроби
{
fraction temp;
temp.num -= arg * this-> denum - this-> num ;
temp.denum = this->denum;
return temp;
}
fraction sub_number2(int arg) // вычитание дроби из целого числа
{
fraction temp;
temp.num = arg * this->denum - this-> num;
temp.denum = this->denum;
return temp;
}
fraction step(fraction arg)
{
fraction temp;
temp.num = (num *num);
temp.denum = (denum*denum);
return temp;
}
fraction sokr(fraction arg)
{
fraction temp;
int div;
div = NOD(num,denum);
temp.num = (this -> num / div);
temp.denum = (this-> denum / div);
return temp;
}
double convertingTOdecimal(fraction arg)
{
return (double)num/denum;
}
};

int main()
{
fraction fr1;
fr1.num;
fr1.denum;
std::cout«"Enter the first fraction: ";std::cin»fr1.num »fr1.denum;
fraction fr2;
fr2.num;
fr2.denum;
std::cout«"Enter the second fraction: ";std::cin»fr2.num »fr2.denum;
int arg;
std::cout«"Enter a number for operations with fractions: ";std::cin»arg;
fr1.print();
fr2.print();
fr1.mul(fr1).print();
fr1.mul_number(arg).print();
fr1.del(fr2).print();
fr1.del_number(arg).print();
fr1.del_number_two(arg).print();
fr1.add(fr2).print();
fr1.add_number(arg).print();
fr1.sub(fr2).print();
fr1.sub_number(arg).print();
fr1.sub_number2(arg).print();
fr1.step(fr1).print();
fr1.sokr(fr1).print();
double decimal = fr1.convertingTOdecimal(fr1);
std::cout«decimal«std::endl;
}​


kotakasi52: У меня компилятор её не выводит. Тут точно всё верно? Я без возможности запуска ничего не сделаю с легаси кодом.
kumiho9fox: да, все верно, программа работает исправно у меня на ноутбуке и в компиляторе онлайн
kumiho9fox: в VS code
kotakasi52: Очень длинный код. Я попробую сократить, ибо в этом сейчас разбираться особо не хочу.
kumiho9fox: да, код длиноватый, но так требовал препод. буду очень благодарна, если сможете помочь с моей проблемой

Ответы

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

Ответ:

#include <iostream>

using namespace std;

class Fraction {

private:

   int numerator;   // числитель

   int denominator; // знаменатель

public:

   Fraction(int n = 0, int d = 1): numerator(n), denominator(d) {}

   

   // перегрузка оператора сложения

   Fraction operator+(const Fraction& f) {

       int n = numerator * f.denominator + f.numerator * denominator;

       int d = denominator * f.denominator;

       return Fraction(n, d);

   }

   

   // перегрузка оператора вычитания

   Fraction operator-(const Fraction& f) {

       int n = numerator * f.denominator - f.numerator * denominator;

       int d = denominator * f.denominator;

       return Fraction(n, d);

   }

   

   // перегрузка оператора умножения

   Fraction operator*(const Fraction& f) {

       int n = numerator * f.numerator;

       int d = denominator * f.denominator;

       return Fraction(n, d);

   }

   

   // перегрузка оператора деления

   Fraction operator/(const Fraction& f) {

       int n = numerator * f.denominator;

       int d = denominator * f.numerator;

       return Fraction(n, d);

   }

   

   // перегрузка оператора вывода

   friend ostream& operator<<(ostream& out, const Fraction& f) {

       out << f.numerator << "/" << f.denominator;

       return out;

   }

};

// меняй числа в fraction и тем самым будешь регулировать дроби, которые будет обрабатывать программа. При желании, можешь сам ввод через терминал оформить.

int main() {

   Fraction f1(44, 2), f2(54, 3);

   cout << "f1 = " << f1 << endl;

   cout << "f2 = " << f2 << endl;

   

   Fraction sum = f1 + f2;

   Fraction diff = f1 - f2;

   Fraction product = f1 * f2;

   Fraction quotient = f1 / f2;

   

   cout << "f1 + f2 = " << sum << endl;

   cout << "f1 - f2 = " << diff << endl;

   cout << "f1 * f2 = " << product << endl;

   cout << "f1 / f2 = " << quotient << endl;

   

   return 0;

}

Объяснение:

Ты спрашивал, а что же такое это ваше перезагрузка операторов. А эта такая шняга, которая позволяет определить как должны быть выполнены операции с определенными классами типов данных. Например, перезагрузка оператора "+" для класса дробей позволяет определить, как складывать две дроби, а перезагрузка оператора "<<" позволяет выводить объекты класса дробей в поток вывода. Вот как-то так это и работает.

Приложения:

kumiho9fox: спасибо большое, очень выручили!
kotakasi52: Я даже сам доволен своей работой. Очень рад, что смог помочь. Желаю тебе преподов, которые не будут просить такой огромный и непонятный код. Я чуть не умер, когда не него впервые посмотрел.
kumiho9fox: ещё раз спасибо, редко попадаются люди, которые действительно помогают, а не скидывают первый же ответ с других сайтов
kotakasi52: И если не сложно, то поставь его как лучший ответ, если он полностью устраивает. А то мне прям одной не хватает, чтобы ЛВЛ себе апнуть) И да прибудут с тобой светлые силы программирования!
kumiho9fox: обязательно поставлю, как это будет возможно
Похожие вопросы
Предмет: Алгебра, автор: vertijanastasia90215