Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 5-6_n — копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
144.59 Кб
Скачать

Int main () {

Fraction f1(1, 4);

f1.print ();

Fraction f2(1, 2);

f2.print ();

}

Должен выдавать следующий результат:

1/4

1/2

b) Добавьте перегрузку оператора умножения (*) для выполнения операции умножения объекта класса Fraction на целочисленное значение и для перемножения двух объектов класса Fraction. Используйте способ перегрузки оператора через дружественную функцию.

Подсказка: Умножение двух дробей осуществляется умножением двух числителей, а затем отдельно двух знаменателей. Для выполнения операции умножения объекта на целочисленное значение, умножьте только числитель на целочисленное значение (знаменатель не трогайте).

Следующий фрагмент кода:

#include <iostream>

Int main () {

Fraction f1(3, 4);

f1.print ();

Fraction f2(2, 7);

f2.print ();

Fraction f3 = f1 * f2;

f3.print ();

Fraction f4 = f1 * 3;

f4.print ();

Fraction f5 = 3 * f2;

f5.print ();

Fraction f6 = Fraction (1, 2) * Fraction (2, 3) * Fraction (3, 4);

f6.print ();

}

Должен выдавать следующий результат:

3/4

2/7

6/28

9/4

6/7

6/24

Дополнительное задание

c) Дробь 2/4 — это та же дробь, что и 1/2, только 1/2 не делится до минимальных неделимых значений.

Мы можем уменьшить любую заданную дробь до наименьших значений, найдя наибольший общий делитель (НОД) для числителя и знаменателя, а затем выполнить деление как числителя, так и знаменателя на НОД.

Ниже приведена функция поиска НОД:

int nod (int a, int b) {

return (b == 0)? (a > 0? a : -a) : nod(b, a % b);

Добавьте эту функцию в ваш класс и реализуйте метод reduce(), который будет уменьшать дробь. Убедитесь, что дробь будет максимально и корректно уменьшена.

Следующий фрагмент кода:

#include <iostream>

Int main () {

Fraction f1(3, 4);

f1.print ();

Fraction f2(2, 7);

f2.print ();

Fraction f3 = f1 * f2;

f3.print ();

Fraction f4 = f1 * 3;

f4.print ();

Fraction f5 = 3 * f2;

f5.print ();

Fraction f6 = Fraction (1, 2) * Fraction (2, 3) * Fraction (3, 4);

f6.print ();

return 0;

}

Должен выдавать следующий результат:

3/4

2/7

3/14

9/4

6/7

1/4

Перегрузка операций через обычные функции

  Мы перегружали операции через дружественные функции operator+ ():

#include <iostream>

class Dollars {

private:

Int m_dollars;

public:

Dollars (int dollars) {m_dollars = dollars;}

// Выполняем Dollars + Dollars через дружественную функцию

friend Dollars operator+(const Dollars &d1, const Dollars &d2);

Int getDollars () const {return m_dollars;}

};

// Примечание: Эта функция не является методом класса!

Dollars operator+(const Dollars &d1, const Dollars &d2) {

// Используем конструктор Dollars и operator+(int, int).

// Мы имеем доступ к закрытому члену m_dollars, так как эта //функция является дружественной классу Dollars

return Dollars (d1.m_dollars + d2.m_dollars);

}

Int main () {

Dollars dollars1(7);

Dollars dollars2(9);

Dollars dollarsSum = dollars1 + dollars2;

std::cout << "I have " << dollarsSum.getDollars() << " dollars." << std::endl;

return 0;

}

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

В примере, приведенном выше, наша дружественная функция перегрузки операции  + имеет прямой доступ к закрытому члену m_dollars класса Dollars.

Однако, если нам не нужен доступ к членам определенного класса, мы можем перегрузить операцию и через обычную функцию.

Так в классе Dollars присутствует геттер getDollars (), с помощью которого мы можем получить доступ к m_dollars извне класса.

Перепишем перегрузку оператора +  через обычную функцию:

#include <iostream>

class Dollars{

private: