Форум программистов, компьютерный форум CyberForum.ru

Организовать производный класс, содержащий функции вычисления деления и умножения дробей - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти номер первого отрицательного числа в массиве http://www.cyberforum.ru/cpp-beginners/thread884527.html
Вот все задание: Найти максимальный и минимальный элемент в двумерном массиве и указать их номера. Указать номер первого отрицательного числа в массиве; если таковой отсутствует выдать сообщение «такого элемента нет». Написал код, но вот с нахождением первого отрицательного запутался, цикл ходит по всем индексам, и брейк тоже не помогает. Как доделать, не пойму.. #include <iostream> using...
C++ Обработка исключений в программе Здраствуйте! Вот условие задачи: Создать шаблонный класс - одномерный массив. Тип элементов массива определяется параметром шаблона. Предусмотреть возможность записывать в файл и читать из файла данные о введенных объекты и сохранить в файле результаты работы программы. Определить обработчик исключительной ситуации, если количество элементов массива, считанных из файла, превышает заданное... http://www.cyberforum.ru/cpp-beginners/thread884506.html
Структура - Расчет движения (создавать файл из таких структур, добавлять новые данные и делать выборку из этого файла) C++
Задание. Создать пользовательский тип данных – структура, имя и поля которой заданы в таблице. Разработать программу, которая позволяла бы создавать файл из таких структур, добавлять в созданный файл новые данные и делать какую – либо выборку из этого файла (какие данные выбирать из файла определяет сам студент). 2 Расчет движения 1. Наименование воздушной линии 2. Тип самолета...
C++ Структура (распечатать список спортсменов, которые занимаются плаванием с указанием их возраста)
Задание. Определить пользовательский тип – структура. Поля структуры определить из формулировки задания. Разработать алгоритм и по нему составить программу для обработки динамического массива, каждый элемент которой является такой структурой. 2. Распечатать список спортсменов, которые занимаются плаванием с указанием их возраста.
C++ Дан английский текст. Найти количество слов, начинающихся с символа ‘b’. http://www.cyberforum.ru/cpp-beginners/thread884501.html
Задание. Разработать алгоритм и по нему составить два варианта (с указателями и без них) программы для обработки текста. 2 Дан английский текст. Найти количество слов, начинающихся с символа ‘b’.
C++ Определить k — количество особых элементов массива А, считая его элемент особым, если он больше суммы остальных элементов его столбца Задание. Разработать алгоритм и по нему составить два варианта программы для обработки двумерного массива. Первый вариант программы – работа со статическим массивом, второй – с динамическим. 2.Дана матрица А размером n х m. Определить k — количество особых элементов массива А, считая его элемент особым, если он больше суммы остальных элементов его столбца. подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
30.05.2013, 11:23     Организовать производный класс, содержащий функции вычисления деления и умножения дробей
Цитата Сообщение от roker2010 Посмотреть сообщение
Организовать производный класс, содержащий функции вычисления деления и умножения дробей, функцию приведения дроби к несократимому виду.
А зачем тут производный класс?! Хм. Возможно, чтобы показать вам, что надо делать публичные геттеры и сеттеры.

Не имеет смысла делать наследование.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
 
class Fraction {
 public:
  Fraction() : numerator(0), denominator(1) {}
  Fraction(int number) : numerator(number), denominator(1) {}
  Fraction(int numerator, int denominator) : numerator(numerator),
    denominator(denominator) {}
  int getNumerator() const { return numerator; }
  int getDenominator() const { return denominator; }
  Fraction reduce() const {
    int gcd = getGcd(numerator, denominator);
    int numerator = getNumerator() / gcd;
    int denominator = getDenominator() / gcd;
    if (denominator < 0) {
      numerator = -numerator;
      denominator = -denominator;
    }
    return Fraction(numerator, denominator);
  }
 
  /*
   * Сравнение дробей
   * возвращает 0, если дроби равны
   * возвращает значение < 0 если левая дробь меньше
   * возвращает значение > 0 если левая дробь больше
   */
  int compare(const Fraction &f) const {
    return getNumerator() * f.getDenominator() -
      getDenominator() * f.getNumerator();
  }
  /*
   * Арифметические действия с дробями
   */
  Fraction add(const Fraction &f) const {
    return Fraction(getNumerator() * f.getDenominator() +
      getDenominator() * f.getNumerator(),
      getDenominator() * f.getDenominator());
  }
  Fraction subtract(const Fraction &f) const {
    return Fraction(getNumerator() * f.getDenominator() -
      getDenominator() * f.getNumerator(),
      getDenominator() * f.getDenominator());
  }
  Fraction multiply(const Fraction &f) const {
    return Fraction(getNumerator() * f.getNumerator(),
      getDenominator() * f.getDenominator());
  }
  Fraction divide(const Fraction &f) const {
    return Fraction(getNumerator() * f.getDenominator(),
      getDenominator() * f.getNumerator());
  }
 private:
  static int getGcd(int a, int b) {
    if (a < 0) a = -a;
    if (b < 0) b = -b;
    while (a && b) {
      if (a >= b) {
        a %= b;
      } else {
        b %= a;
      }
    }
    return a | b;
  }
  int numerator, denominator;
};
 
std::ostream &operator<<(std::ostream &stream, const Fraction &fraction) {
  Fraction f = fraction.reduce();
  return stream << f.getNumerator() << "/" << f.getDenominator();
}
 
// операторы арифметических действий
Fraction operator+(const Fraction &a, const Fraction &b) {
  return a.add(b);
}
Fraction operator-(const Fraction &a, const Fraction &b) {
  return a.subtract(b);
}
Fraction operator*(const Fraction &a, const Fraction &b) {
  return a.multiply(b);
}
Fraction operator/(const Fraction &a, const Fraction &b) {
  return a.divide(b);
}
 
// ну и для полноты картины операторы сравнения
bool operator<(const Fraction &a, const Fraction &b) {
  return a.compare(b) < 0;
}
 
bool operator<=(const Fraction &a, const Fraction &b) {
  return a.compare(b) <= 0;
}
 
bool operator>(const Fraction &a, const Fraction &b) {
  return a.compare(b) > 0;
}
 
bool operator>=(const Fraction &a, const Fraction &b) {
  return a.compare(b) >= 0;
}
 
bool operator==(const Fraction &a, const Fraction &b) {
  return a.compare(b) == 0;
}
 
bool operator!=(const Fraction &a, const Fraction &b) {
  return a.compare(b) != 0;
}
 
int main(int, char**) {
  // можно функциями, но читается плохо
  std::cout << Fraction(1, 4).multiply(Fraction(1).divide(Fraction(2, 3).add(Fraction(5, 6)))) << std::endl;
  
  // операторами удобнее
  std::cout << Fraction(1, 4) * (1 / (Fraction(2, 3) + Fraction(5, 6))) << std::endl;
}
 
Текущее время: 08:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru