Вопрос задан 17.11.2023 в 08:57. Предмет Информатика. Спрашивает Соколов Даниил.

С++ Доброго времени суток суток! Нужна помощь с перегрузкой операторов в классе дробь. Я сделала

перегрузку всех функций кроме функции сокращения (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; }Умоляю, помогите, даю последние баллы ​
0 0
Перейти к ответам

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

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

Объяснение:

Здравствуйте! Я могу помочь вам перегрузить функции 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) и возвращ

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

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

Исправим некоторые ошибки в вашем коде:

1. Исправим опечатки в функции `print()` (заменим `«` на `<<`). 2. В функции `NOD` добавим инициализацию переменной `div` нулем перед циклом. 3. В функции `mul` заменим `temp.num += this->num * arg.num;` и `temp.denum += this->denum * arg.denum;` для корректного сложения числителя и знаменателя. 4. Добавим `return 0;` в конце функции `main()`.

Теперь к вашему вопросу по сокращению и переводу в десятичную.

1. Функция сокращения (sokr): ```cpp fraction sokr() { fraction temp; int div = NOD(num, denum); temp.num = this->num / div; temp.denum = this->denum / div; return temp; } ```

2. Функция перевода в десятичную (convertingTOdecimal): ```cpp double convertingTOdecimal() { return static_cast(num) / denum; } ```

Теперь, чтобы использовать эти функции, вы можете модифицировать вашу функцию `main()` следующим образом:

```cpp int main() { fraction fr1; std::cout << "Enter the first fraction:"; std::cin >> fr1.num >> fr1.denum;

fraction fr2; 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.sokr().print(); // использование функции сокращения std::cout << "Decimal representation of fr1: " << fr1.convertingTOdecimal() << std::endl;

return 0; } ```

Теперь ваш код должен быть более полным и удовлетворять вашим требованиям. Не забывайте проверять ввод пользователя на корректность для предотвращения ошибок при выполнении программы.

0 0

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

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

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

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