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

Класс обыкновенной дроби - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 10:39     Класс обыкновенной дроби #1
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
class TFraction
{
 public:
  signed int numerator;
  unsigned denominator;
  TFraction operator + (TFraction);
  TFraction operator - (TFraction);
  TFraction operator * (TFraction);
  TFraction operator / (TFraction);
  TFraction operator + (signed int);
  TFraction operator - (signed int);
  TFraction operator * (signed int);
  TFraction operator / (signed int);
  TFraction operator + (unsigned int);
  TFraction operator - (unsigned int);
  TFraction operator * (unsigned int);
  TFraction operator / (unsigned int);
  TFraction operator += (TFraction);
  TFraction operator -= (TFraction);
  TFraction operator *= (TFraction);
  TFraction operator /= (TFraction);
  TFraction operator += (signed int);
  TFraction operator -= (signed int);
  TFraction operator *= (signed int);
  TFraction operator /= (signed int);
  TFraction operator += (unsigned int);
  TFraction operator -= (unsigned int);
  TFraction operator *= (unsigned int);
  TFraction operator /= (unsigned int);
  bool operator == (TFraction);
  bool operator != (TFraction);
  bool operator > (TFraction);
  bool operator < (TFraction);
  bool operator >= (TFraction);
  bool operator <= (TFraction);
  bool operator == (signed int);
  bool operator != (signed int);
  bool operator > (signed int);
  bool operator < (signed int);
  bool operator >= (signed int);
  bool operator <= (signed int);
  bool operator == (unsigned int);
  bool operator != (unsigned int);
  bool operator > (unsigned int);
  bool operator < (unsigned int);
  bool operator >= (unsigned int);
  bool operator <= (unsigned int);
  friend TFraction operator + (signed int, TFraction);
  friend TFraction operator - (signed int, TFraction);
  friend TFraction operator * (signed int, TFraction);
  friend TFraction operator / (signed int, TFraction);
  friend TFraction operator + (unsigned int, TFraction);
  friend TFraction operator - (unsigned int, TFraction);
  friend TFraction operator * (unsigned int, TFraction);
  friend TFraction operator / (unsigned int, TFraction);
  friend bool operator == (signed int, TFraction);
  friend bool operator != (signed int, TFraction);
  friend bool operator > (signed int, TFraction);
  friend bool operator < (signed int, TFraction);
  friend bool operator >= (signed int, TFraction);
  friend bool operator <= (signed int, TFraction);
  friend bool operator == (unsigned int, TFraction);
  friend bool operator != (unsigned int, TFraction);
  friend bool operator > (unsigned int, TFraction);
  friend bool operator < (unsigned int, TFraction);
  friend bool operator >= (unsigned int, TFraction);
  friend bool operator <= (unsigned int, TFraction);
  ...
};
. При сложении и вычитании класс должен приводить оба операнда к общему знаменателю и выполнять целочисленную операцию с числителями, при умножении на дробь умножать отдельно числитель и отдельно знаменатель, при умножении на целое умножать только числитель, при делении на целое умножать знаменатель. Назначение - вычисления без потери точности в тех случаях, когда конечные, или промежуточные результаты не выражаются конечными двоичными десятичными дробями, но могут быть выражены конечными обыкновенными дробями и точное сравнение с целыми и между собой чисел, не выражаемых конечными двоичными десятичными дробями, выражаемых конечными обыкновенными дробями. А теперь три вопроса:
1. Чего не хватает в этой декларации?
2. Возможна ли перегрузка деления целых, возвращающая класс?
3. Имеет ли смысл перегрузка деления целых, возвращающая TFraction?
Третий вопрос одновременно является частью первых дух.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.12.2012, 11:00     Класс обыкновенной дроби #2
1. Выкинуть к чертям все эти стопицот перегрузок. Определяйте операции только для пар (дробь, дробь). Все целые, вещественные и т. п. приводятся к дробям. Меньше геморроя.
2. Лучше сразу делайте на длинной арифметике. У числителей-знаменателей есть свойство быстро расти и не влазить в int, если вычисления с ними проводятся не для учебника по арифметике для третьего класса.
3. Принимайте дроби в операторы по ссылкам.
4. Стопицот удобных конструкторов из всего, что можно. И конвертеры дробей во всё, что можно.

Не по теме:

5. А ещё лучше выкиньте это всё и возьмите GNU Multiple Precision Arithmetic Library.



Перегрузить деление интов нельзя.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 11:04  [ТС]     Класс обыкновенной дроби #3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Стопицот удобных конструкторов из всего, что можно. И конвертеры дробей во всё, что можно.
А по-конкретнее?

Добавлено через 1 минуту
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Лучше сразу делайте на длинной арифметике.
Хорошо бы. Только я что то не соображу хорошую реализацию самой длинной арифметики.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.12.2012, 11:07     Класс обыкновенной дроби #4
Конструкторы из пар целых чисел, из вещественных чисел, из строки, copy/move наконец. И наоборот: в std::pair, в вещественные числа, в строку. Хотите ещё приключений — можно не только десятичную систему поддерживать.

Цитата Сообщение от taras atavin Посмотреть сообщение
Хорошо бы. Только я что то не соображу хорошую реализацию самой длинной арифметики.
Я уже сказал про GMP. Там есть и поддержка дробей со всем вышеперечисленным в том числе.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 11:12  [ТС]     Класс обыкновенной дроби #5
Ещё вопросы:
1. Нужен ли метод "скократить дробь", делящий числитель и знаменатель на наибольший общий делитель?
2. Должен ли он вызываться после каждой операции?

Добавлено через 1 минуту
3. Имеет ли смысл добавить член "целая часть"?
4. Нужен ли метод "привести к правильной"?
5. Должен ли он вызываться в каждой операции, кроме деления на целое?

Добавлено через 2 минуты
И всё таки меня интересует перегрузка
C++
1
2
3
4
5
6
7
TFraction operator / (int numerator, denominator)
{
 TFraction Result;
 Result.numerator=numerator;
 Result.denominator=denominator;
 return Result;
}
. Проглотит ли её компилятор и нужно ли так делать?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.12.2012, 11:14     Класс обыкновенной дроби #6
Цитата Сообщение от taras atavin Посмотреть сообщение
1. Нужен ли метод "скократить дробь", делящий числитель и знаменатель на наибольший общий делитель?
2. Должен ли он вызываться после каждой операции?
Ага, неявно. Пользователю он ни к чему, для него дробь всегда в каноничной форме: всегда неприводима с положительным знаменателем.

Цитата Сообщение от taras atavin Посмотреть сообщение
3. Имеет ли смысл добавить член "целая часть"?
4. Нужен ли метод "привести к правильной"?
5. Должен ли он вызываться в каждой операции, кроме деления на целое?
Лучше уж метод "дай мне целую часть". При операциях эту целую часть всё равно ж придётся загонять обратно в числитель.

Цитата Сообщение от taras atavin Посмотреть сообщение
И всё таки меня интересует перегрузка

Проглотит ли её компилятор и нужно ли так делать?
Операторы для стандартных типов данных не перегружаются. Если вам очень хочется сахар, а на Fraction(2, 3), то есть C++11-литералы. Правда, для переменных не покатят.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 11:20     Класс обыкновенной дроби
Еще ссылки по теме:

C++ Класс "Дроби" и перегрузка операторов для этого класса
Класс "Дроби". Как собрать приложение из трёх файлов? C++
Составить программу печати n-го элемента в виде обыкновенной несократимой дроби C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.12.2012, 11:20  [ТС]     Класс обыкновенной дроби #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Хотите ещё приключений — можно не только десятичную систему поддерживать.
Да, конечно. Можно в плавающей запятой отвести место для основания системы, все цифры хранить в смешанной с меньшим основанием, равным двойке и уравнять основания порядка и системы счисления для мантиссы. Но если одна дробь троичная, а другая семеричная, то сформулируй ка правила арифметических операций с ними. А для обыкновенных универсальные правила уже есть.
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
При операциях эту целую часть всё равно ж придётся загонять обратно в числитель.
Кто сказал? При умножении на целое можно отдельно умножить целую часть и отдельно числитель дробной части, при сложении с целым сложить его только с целой частью, при сложении с дробью дробные части складываются отдельно, целые отдельно. Целую придётся загонять в числитель только при делении и при умножении на дробь с ненулевым числителем дробной части.
Yandex
Объявления
21.12.2012, 11:20     Класс обыкновенной дроби
Ответ Создать тему
Опции темы

Текущее время: 06:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru