Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
6 / 7 / 4
Регистрация: 17.09.2013
Сообщений: 337

Разработать класс рациональных дробей

05.05.2014, 18:03. Показов 1969. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
азработать класс рациональных дробей. Предусмотреть в нём все методы, которые необходимы, чтобы новый тип данных мог быть использован наравне с системными типами: арифметические операции, операции сравнения, преобразования типов…
Программа с классом рациональных дробей выглядит так.
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
#include <iostream>
#include <conio.h>
 
#define show(x) #x << " = " << x << "  "
#define test(x) if(x) cout << #x << endl
// Âû÷èñëåíèå ÍÎÄ = Íàèáîëüøèé îáùèé äåëèòåëü
// GCD = Greatest Common Divider (ïî-àíãëèéñêè)
long GCD( long a, long b ){ return b==0 ? a : GCD(b,a%b); }
 
// Êëàññ "Ðàöèîíàëüíàÿ äðîáü"
class Rat {
  void init( long n, long d ){ 
    long gcd = GCD(n,d); // âû÷èñëÿåì íàèáîëüøèé îáùèé äåëèòåëü ÷èñëèòåëÿ è çíàìåíàòåëÿ
    // Ñîêðàùàåì äðîáü 
    this->n = n/gcd; 
    this->d = d/gcd; 
    curObj++; 
    constCalls++; 
  };
public:   
  static int curObj /* òåêóùåå êîë-âî îáúåêòîâ */, constCalls /* êîë-âî âûçîâîâ êîíñòðóêòîðîâ */; 
  long n,d; // ×èñëèòåëü è çíàìåíàòåëü nominator/denominator 
  Rat(long n, long d) { init(n,d); } // "Îñíîâíîé" êîíñòðóêòîð
  Rat(const Rat& x) { init(x.n,x.d); }; // Êîíñòðóêòîð êîïèðîâàíèÿ
  Rat() { init(0,1); } // Êîíñòðóêòîð "ïî-óìîë÷àíèþ", äðîáü ðàâíàÿ 0 - 0/1
  ~Rat() { curObj--; } // Äåñòðóêòîð (óìåíüøàåò êîëè÷åñòâî îáúåêòîâ)
  // Àðèôìåòè÷åñêèå îïåðàöèè
  Rat operator+(const Rat& x) const { return Rat( n*x.d+d*x.n, d*x.d ); }
  Rat operator-(const Rat& x) const { return Rat( n*x.d-d*x.n, d*x.d ); }
  Rat operator*(const Rat& x) const { return Rat( x.n*n, x.d*d ); }
  Rat operator/(const Rat& x) const { return Rat( n*x.d, d*x.n ); }
  // Îïåðàöèè ñðàâíåíèÿ
  bool operator==(const Rat& x) const { return n*x.d == d*x.n; }
  bool operator!=(const Rat& x) const { return n*x.d != d*x.n; }
  bool operator>(const Rat& x) const { return n*x.d > d*x.n; }
  bool operator<(const Rat& x) const { return n*x.d < d*x.n; }
  bool operator>=(const Rat& x) const { return n*x.d >= d*x.n; }
  bool operator<=(const Rat& x) const { return n*x.d <= d*x.n; }
};
 
// Èíèöèàëèçèðóåì ñòàòè÷åñêèå ïåðåìåííûå
int Rat::curObj = 0, Rat::constCalls = 0;
 
using namespace std;
 
// Ïåðåãðóçêà îïåðàöèè âûâîäà â ïîòîê äëÿ êëàññà "Ðàöèîíàëüíàÿ äðîáü"
ostream& operator << ( ostream& os, const Rat& x ){ return os << x.n << "/" << x.d; };
 
// Îñíîâíàÿ ïðîãðàììà - äåìîíñòðàöèÿ âîçìîæíîñòåé êëàññà "Ðàöèîíàëüíàÿ äðîáü"
void demoRat(){
     int n1, n2, d1, d2;
     cin >> n1 >> n2;
     cin >> d1 >> d2;
     Rat a(n1, n2), b(d1, d2), c = a * b + a / b;
  cout << show(a) << show(b) << endl;
  cout << show(a+b) << show(a-b) << show(a*b) << show(a/b) << endl;
  test(a==b); test(a!=b); test(a>b); test(a<b); test(a>=b); test(a<=b); test( a*b == b*a );
}
 
int main() {
  demoRat();
  cout << "Îáúåêòîâ â ïàìÿòè = " << Rat::curObj << "   Âûçîâîâ êîíñòðóêòîðîâ = " << Rat::constCalls << endl; 
  getch();   
  return 0;
}
Как переделать эту программу, чтобы в ней был класс смешанных дробей?

Добавлено через 43 минуты
Я решил проблему таким способом.
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
#include <iostream>
#include <conio.h>
 
#define show(x) #x << " = " << x << "  "
#define test(x) if(x) cout << #x << endl
// Âû÷èñëåíèå ÍÎÄ = Íàèáîëüøèé îáùèé äåëèòåëü
// GCD = Greatest Common Divider (ïî-àíãëèéñêè)
long GCD( long a, long b ){ return b==0 ? a : GCD(b,a%b); }
 
// Êëàññ "Ðàöèîíàëüíàÿ äðîáü"
class Rat {
  void init( long n, long d ){ 
    long gcd = GCD(n,d); // âû÷èñëÿåì íàèáîëüøèé îáùèé äåëèòåëü ÷èñëèòåëÿ è çíàìåíàòåëÿ
    // Ñîêðàùàåì äðîáü 
    this->n = n/gcd; 
    this->d = d/gcd; 
    curObj++; 
    constCalls++; 
  };
public:   
  static int curObj /* òåêóùåå êîë-âî îáúåêòîâ */, constCalls /* êîë-âî âûçîâîâ êîíñòðóêòîðîâ */; 
  long n,d; // ×èñëèòåëü è çíàìåíàòåëü nominator/denominator 
  Rat(long n, long d) { init(n,d); } // "Îñíîâíîé" êîíñòðóêòîð
  Rat(const Rat& x) { init(x.n,x.d); }; // Êîíñòðóêòîð êîïèðîâàíèÿ
  Rat() { init(0,1); } // Êîíñòðóêòîð "ïî-óìîë÷àíèþ", äðîáü ðàâíàÿ 0 - 0/1
  ~Rat() { curObj--; } // Äåñòðóêòîð (óìåíüøàåò êîëè÷åñòâî îáúåêòîâ)
  // Àðèôìåòè÷åñêèå îïåðàöèè
  Rat operator+(const Rat& x) const { return Rat( n*x.d+d*x.n, d*x.d ); }
  Rat operator-(const Rat& x) const { return Rat( n*x.d-d*x.n, d*x.d ); }
  Rat operator*(const Rat& x) const { return Rat( x.n*n, x.d*d ); }
  Rat operator/(const Rat& x) const { return Rat( n*x.d, d*x.n ); }
  // Îïåðàöèè ñðàâíåíèÿ
  bool operator==(const Rat& x) const { return n*x.d == d*x.n; }
  bool operator!=(const Rat& x) const { return n*x.d != d*x.n; }
  bool operator>(const Rat& x) const { return n*x.d > d*x.n; }
  bool operator<(const Rat& x) const { return n*x.d < d*x.n; }
  bool operator>=(const Rat& x) const { return n*x.d >= d*x.n; }
  bool operator<=(const Rat& x) const { return n*x.d <= d*x.n; }
};
 
// Èíèöèàëèçèðóåì ñòàòè÷åñêèå ïåðåìåííûå
int Rat::curObj = 0, Rat::constCalls = 0;
 
using namespace std;
 
// Ïåðåãðóçêà îïåðàöèè âûâîäà â ïîòîê äëÿ êëàññà "Ðàöèîíàëüíàÿ äðîáü"
ostream& operator << ( ostream& os, const Rat& x ){ return os << x.n << "/" << x.d; };
 
// Îñíîâíàÿ ïðîãðàììà - äåìîíñòðàöèÿ âîçìîæíîñòåé êëàññà "Ðàöèîíàëüíàÿ äðîáü"
void demoRat(){
     int n, n1, n2, d, d1, d2;
     cin >> n>> n1 >> n2;
     cin >> d>> d1 >> d2;
     n1 = n*n2+n1;
     d1=d*d2+d1;
     Rat a(n1, n2), b(d1, d2), c = a * b + a / b;
  cout << show(a) << show(b) << endl;
  cout << show(a+b) << show(a-b) << show(a*b) << show(a/b) << endl;
  test(a==b); test(a!=b); test(a>b); test(a<b); test(a>=b); test(a<=b); test( a*b == b*a );
}
 
int main() {
  demoRat();
  cout << "Îáúåêòîâ â ïàìÿòè = " << Rat::curObj << "   Âûçîâîâ êîíñòðóêòîðîâ = " << Rat::constCalls << endl; 
  getch();   
  return 0;
}
Как вывести результат в виде смешанной дроби?

Добавлено через 1 минуту
И как организовать преобразование типов?

Добавлено через 17 секунд
И почему поставлено троеточие?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.05.2014, 18:03
Ответы с готовыми решениями:

Класс рациональных дробей
Написать пользоват. тип рациональных дробей. Внутреннее представление типа: int a, b; должно быть таким, что число a/b должно...

Класс рациональных дробей RatNum
Класс RatNum имитирует работу с обычными дробями. Полями этого класса должны быть два поля типа int: числитель и знаменатель дроби....

Преобразование к типу double (класс рациональных дробей)
Имеется класс рациональных дробей (чтоб код лишним не нагружать оставил только перегрузки операций сложения дробей и чисел). все работает и...

7
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2014, 18:56
Цитата Сообщение от MahovIV Посмотреть сообщение
как организовать преобразование типов?
- Конструктор вида T(U) выполняет преобразование типа U в тип T. Реализуется в классе T.
- Оператор вида operator T(U) выполняет преобразование типа U в тип Т. Реализуется в классе U.
Цитата Сообщение от MahovIV Посмотреть сообщение
почему поставлено троеточие?
Где?
0
6 / 7 / 4
Регистрация: 17.09.2013
Сообщений: 337
06.05.2014, 18:57  [ТС]
После преобразование типов.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2014, 19:01
MahovIV, ну из русского языка это понимается как и т.д. Потому что набор в перечислении не полный.
0
6 / 7 / 4
Регистрация: 17.09.2013
Сообщений: 337
06.05.2014, 19:04  [ТС]
А что может быть ещё в этом наборе?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2014, 21:07
Цитата Сообщение от MahovIV Посмотреть сообщение
А что может быть ещё в этом наборе?
Ввод/вывод в поток например (упомянут в коде между прочим)
0
6 / 7 / 4
Регистрация: 17.09.2013
Сообщений: 337
06.05.2014, 22:39  [ТС]
Это всё?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2014, 22:51
Цитата Сообщение от MahovIV Посмотреть сообщение
Это всё?
Это Вам препод ответит уже
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2014, 22:51
Помогаю со студенческими работами здесь

Матрица рациональных дробей
П.5.4.Правил Запрещено создавать темы с бессмысленными названиями вроде &quot;Помогите!&quot;, &quot;Вопрос&quot; и т.п. Есть матрица.txt,...

Калькулятор рациональных дробей
Первая программа принимает от пользователя три строки, (первая и третья строки – это правильные рациональные или десятичные дроби вида ...

Усовершенствованный калькулятор рациональных дробей
Добавил операторы сравнения и равно, всё скомпилировалось, ровно работает, при добавлении &lt;=,&gt;=,!= в отдельных case, всё...

Олимпиадное задание "Калькулятор рациональных дробей"
Калькулятор рациональных дробей (выполнение операций сложения, вычитания, умножения, деления).

Класс: Создать класс дробь - рациональных чисел, являющихся отношением двух целых чисел...
Создать класс дробь - рациональных чисел, является отношением двух целых чисел. Определить необходимые методы, конструкторы, деструкторы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru