![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Здраствуйте
Вот такое вот задание: Создать класс Frac(дробные числа) с перегруженными операциями + - * / , а также с возможностью приведения типа Frac->double. Должны быть реализованы также ToString(), Equals(), ==, !=. Помогите пожалуйста ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
Отличное задание! Правда "дробные числа Frac" принято называть рациональными (rational) числами, или дробями, но это мелочь.
Задание несложное, минут на 15. Ну, на пару часов не слишком опытному. Самому слабо? Хотя бы с нашей помощью. Добавлено через 1 минуту и 9 секунд Есть предложение, подкупающее новизной: переместиться в раздел "для новичков" и там совместными усилиями разработать. Хоть польза будет |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Если честно я только за,просто я C++ только начал изучать и в нём я ещё просто ничего почти не умею |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
Ну вот и будет повод потренироваться. Это ведь не последнее задание? Зачем тогда вообще в универ ходить...
![]() колкость про Frac снимаю))) |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
мне щас надо типо поросить модеров что б они переместили тему? или эту закрыть ,а там заново написать? |
|||
|
||||
baldina |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
можно и тут продолжить. надо будет, перенесут.
а можно подождать пока кто-нить придет и денег попросит. или бесплатно кинет код (которого кстати в интернете навалом) Добавлено @ 17:31 предлагаю для начала условия задачи записать на языке программирования, а дальше - уточнять и реализовывать. класс в C++ в общем виде выглядит так:
то, что в секции public, является публичным, общедоступным интерфейсом. здесь будут функции и операции, которые по условию должен иметь класс. по условию нам нужно написать класс Frac
в котором должны быть перегруженные арифметические операции. В классах обычно перегружают операции +=, -=, *= и т.п., а операции +, -, * реализуют через них
Так же нам понадобятся функции приведения типа и преобразования в строку
продолжайте. когда напишем интерфейс, займемся реализацией Добавлено через 13 минут и 30 секунд != можно (и правильно) реализовать через ==
Добавлено через 14 минут и 56 секунд впрочем я тороплюсь с реализацией. сначала опишите весь интерфейс класса, т.е. все нужные методы (функции-члены) класса Это сообщение отредактировал(а) baldina - 27.11.2013, 17:34 |
||||||||||
|
|||||||||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Так правильно? |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 5 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
DarkinRal, суперически. половину сделали.
можно заняться реализацией. для этого нужно определить, какие данные будут в классе. думаю, это несложно: чем определяется рациональное число (дробь)? эти данные будут приватными (вне секции public) членами класса (переменными). их мы будем использовать при реализации функций. Добавлено через 5 минут и 3 секунды функции будем реализовывать по обычным правилам арифметики дробей. преобразование в double - тоже несложно, нужно выполнить нецелочисленное деление и вернуть результат. чуть сложнее будет с преобразованием в строку, плюс понадобится специальная функция - конструктор для инициализации экземпляров нашего класса. конец уже виден)) Добавлено через 14 минут и 51 секунду в качестве бонуса приведу код функции нахождения наибольшего общего делителя (алгоритм Евклида) - она понадобится для нормализации числа:
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
DarkinRal, в интерфейсе класса не хватает метода для ==
кстати, при наличии == что должна делать функция Equals() ? еще, думаю, будет правильным ввести в интерфейс оператор < для сравнения чисел |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Вот,получил дополнение к заданию.
Вычислить значение полинома в точке. Все коэффициенты и x должны иметь тип Frac. Это сообщение отредактировал(а) DarkinRal - 28.11.2013, 11:39 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
Как класс закончим, и дополнение сделаем. Было б корыто)))
Как насчет моего вопроса
и дополнений в интерфейсе? Добавлено @ 11:53 Насчет полиномов - можете на досуге подумать, как лучше вычислить значение. Алгоритм вычисления не зависит от типа а и х. Вам о схеме Горнера говорили? Добавлено через 2 минуты и 5 секунд и еще был вопрос Это сообщение отредактировал(а) baldina - 28.11.2013, 11:53 |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
||||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
уточняйте.
и показывайте поправленный класс и ваши соображения. Добавлено @ 12:18 А пока - на секунду отвлечемся от класса. Подумаем, как он будет использоваться (собственно, с этого обычно начинают - для разработки интерфейса, но интерфейс нам был и так дан в составе задания). Сейчас есть повод - дополнение к заданию. Допустим, что нам дан полином с коэф. типа Frac, и надо вычислить его значение в точке x. Как задан полином? Очевидно, своими коэффициентами. Их удобно хранить в массиве: индекс элемента массива - номер коэффициента. Для вычисления значения в точке понадобится функция, принимающая адрес массива, его размер и значение x:
её будем использовать, например, так:
Это сообщение отредактировал(а) baldina - 28.11.2013, 12:33 |
||||
|
|||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Вот по поводу Equals
Это значит что наш клас должен реализовать интерфейс IEquatable И пере определить метод equals, который будет основан на == Этот метод должен принимать как наш тип для сравнения так и object http://msdn.microsoft.com/ru-ru/library/ms...#code-snippet-1 http://msdn.microsoft.com/en-us/library/vs...(v=vs.100).aspx |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
управляемый код? ну да ладно...
про устройство рациональных чисел вы что-то молчите... |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
очень хорошо. давайте их обозначим p и q соответственно.
значит в реализации класса должны присутствовать два члена, в которых будут храниться значения p и q. надо определиться, какого они типа, и добавить их в класс - в приватную секцию (выше "public"). ими мы и будем манипулировать, реализуя методы класса. |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
VS показует ошибки в функции константы.ToString() просит поставить ; operator - функция преобразования должна быть нестатической функциией-членом |
|||
|
||||
baldina |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
функции-члены класса должны быть объявлены в теле класса. посчитайте скобочки.
определение класса должно заканчиваться точкой с запятой. Данные класса p и q определены, прекрасно. Как будут устанавливаться их начальные значения? Для этого служат специальные функции-члены - конструкторы. Это функции одноименные с классом, вызываются в момент объявления переменной.
нам понадобится конструктор вида Frac (int p=0, int q=1) параметры по умолчанию полезны тем, что мы сможем объявлять переменные не только как
теперь определение операций. давайте с легкого начнем. сумма двух рациональных чисел p1/q1+p2/q2= (p1*q2+p2*q1)/(q1*q2). значит функцию operator+= можно определить так:
Минус можно реализовать через плюс
остальные делаете аналогично. Как справитесь, поговорим о нормализации числа |
||||||||||
|
|||||||||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Только не понял,что там в конструкторе надо объявить. и надо ли там операции == и != ? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
DarkinRal, объявляя функцию в классе не надо писать Frac::
Этот префикс нужен только для определений вне класса, для указания к какому классу относится функция. Вы бы хоть попробовали откомпилировать код. Добавлено @ 14:37 где там? все уже написано вроде как правильно. в конструкторе надо проинициализировать значения членов класса p и q соответствующими аргументами конструктора. ну или хотя бы присвоить. арументам лучше дать другие имена, что бы не путать с членами класса. часто членам класса добавляют префиксы или суффиксы, что бы легче отличать. например, p_ и q_ Добавлено @ 14:39 т.е.
Это сообщение отредактировал(а) baldina - 7.1.2014, 14:40 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
для реализации операций понадобится функция нормализация числа: сокращение числителя и знаменателя на наибольший общий делитель, что бы числа, например, вида 4/8 приводить к 1/2
для этого надо уметь находить НОД. существует алгоритм Евклида, который можно записать рекуррентным соотношением gcd (m, n) = gcd (n, m mod n) c с ограничением gcd (m, 0) = m gcd - greatest common divisor mod - операция получения остатка от деления, в C/C++ это операция % в общем виде алгоритм можно реализовать простой рекурсивной функцией
Добавлено через 4 минуты и 10 секунд в итоге должно получиться что-то вроде http://ideone.com/OHZ2ph изучайте Это сообщение отредактировал(а) baldina - 7.1.2014, 14:55 |
|||
|
||||
DarkinRal |
|
|||
![]() This_IS_300 Профиль Группа: Участник Сообщений: 14 Регистрация: 27.11.2013 Где: Ukraine/Kremenchu k Репутация: нет Всего: нет |
Здраствуйте,спасибо за пример.Но когда запустил его через visual studio 2012 то выдало несколько ошибок:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |