С++
Доброго времени суток суток! Нужна помощь с перегрузкой операторов в классе дробь. Я сделала перегрузку всех функций кроме функции сокращения (sokr fraction) и функции перевода обычной дроби в десятичную (convertingTOdecimel). Ещё нужна помощь, не знаю как прописывать main во время перегрузки операторов.
Вот моя программа(по перегрузки) :
#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
Объяснение:
Здравствуйте! Я могу помочь вам перегрузить функции sokr() и convertingTOdecimal(). Для перегрузки этих функций нам не нужно изменять main(), но я бы все равно хотел дать вам несколько советов для более удобного и эффективного тестирования вашего класса fraction.
Первое, что мне бросилось в глаза, это то, что в вашем классе fraction есть переменная vec, которую вы никак не используете. Если вы планируете добавить операции сравнения (==, !=, <, >, <=, >=), то эта переменная может пригодиться. Если же она не нужна, то я бы рекомендовал ее удалить из класса.
Во-вторых, я бы предложил изменить некоторые методы класса, чтобы они не принимали аргументы, а работали со значениями объекта, на котором они вызываются. Например, вместо fraction sokr(fraction arg) можно сделать fraction sokr(), а вместо double convertingTOdecimal(fraction arg) можно сделать double convertingTOdecimal(). Таким образом, вызов этих функций будет выглядеть более естественно, например: fr1.sokr().print().
Теперь давайте перегрузим функцию sokr(). Для этого нам нужно определить оператор /, который будет возвращать объект fraction сокращенный до несократимой дроби. Мы можем использовать метод NOD(), чтобы найти наибольший общий делитель числителя и знаменателя, и затем поделить оба на него. Вот как будет выглядеть определение оператора:
fraction operator/(const fraction& other) const {
int div = NOD(num, denum);
return {num / div, denum / div};
}
Здесь мы определяем оператор / как метод класса fraction, который принимает второй объект fraction в качестве аргумента и возвращает объект fraction, содержащий сокращенную дробь. Обратите внимание на то, что мы используем ключевое слово const после списка аргументов, чтобы указать, что метод не изменяет состояние объекта, на котором он вызывается.
Теперь мы можем изменить функцию sokr() следующим образом:
fraction sokr() const {
return *this / fraction{1, 1};
}
Здесь мы просто вызываем оператор / с аргументом fraction{1, 1} (это эквивалентно делению на единицу) для текущего объекта (*this) и возвращ
int sokr_fraction(int numerator, int denominator) {
int gcd = find_gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;
return numerator;
}
// перегрузка функции sokr_fraction с параметрами типа double
double sokr_fraction(double numerator, double denominator) {
double gcd = find_gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;
return numerator;
}
double convertingTOdecimel(int numerator, int denominator) {
return static_cast(numerator) / denominator;
}
// перегрузка функции convertingTOdecimel с параметрами типа double
double convertingTOdecimel(double numerator, double denominator) {
return numerator / denominator;
}