Доброго времени суток! Срочно нужна помощь! Надо было написать класс дроби на С++ с функциями всех операций над дробями и с перегрузкой операторов. Всё функции операций над дробями я сделал. А вот с перегрузкой операторов проблема. Умоляю помогите сделать перегрузку операторов и объясните как и для чего она делается. Даю последние баллы! Заранее благодарю за помощь.
Вот моя программа (в ней все верно, она рабочая) :
#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;
}
Answers & Comments
Verified answer
Ответ:
#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;
}
Объяснение:
Ты спрашивал, а что же такое это ваше перезагрузка операторов. А эта такая шняга, которая позволяет определить как должны быть выполнены операции с определенными классами типов данных. Например, перезагрузка оператора "+" для класса дробей позволяет определить, как складывать две дроби, а перезагрузка оператора "<<" позволяет выводить объекты класса дробей в поток вывода. Вот как-то так это и работает.