ООП: Перегрузка операций, наследование и все в кучу

1. Класс rational, по мотивам Boost rational number library

презентация и ideone

Как Вы думаете, почему в результате на ideone в третья строка «Bad rational obtained!»?

Задание:

  1. Доделать класс rational (дописать необходимые методы, долго, но шаблонно). Но еще гораздо лучше скопировать объявление класса, а все методы реализовать самим — отличная практика.
  2. Написать программу находящую максимум и сумму в массиве (или векторе) рациональных чисел.

2. Наследование, полиморфизм (классы Person, Student)

презентация

Как Вы ответили на вопрос на последнем слайде? Как было бы логичнее?

Класс «Куча»

В стандартной библиотеке STL языка C++ уже реализована структура данных куча, она же пирамида, она же heap.

Только реализована она в не объектно-ориентированном виде, а в качестве 3 стандартных алгоритмов make_heappush_heappop_heap. Эти алгоритмы можно применять к разным контейнерам, в том числе и вектору. А если же Вы захотите кучу в ООП стиле, Вам понадобиться совсем немного времени для того, чтобы создать класс «Куча». Если Вам совсем не терпится, посмотрите мой вариант.

В предложенном варианте, как и раньше класс записан в тот же файл, что и функция main(). Что не очень хорошо, так как подобный класс может использоваться в разных проектах и поэтому его лучше выделить в отдельный заголовочный файл, например heap.h

После этого можно будет включить заголовочный файл уже известной Вам директивой #include:

Кавычки здесь обозначают обращение к текущей директории, а не директории со стандартными заголовочными файлами.

А что будет, если случайно или специально повторить директиву два раза, например вот так:

?

Тестирование и отладка

Думаю, понятно, что студенты иногда ошибаются. Но и профессиональные программисты ведь тоже. В частности, программисты Freescale Semiconductor, Inc., разрабатывающие прошивку плеера Microsoft Zune, появившегося на рынке в ноябре 2006 г., допустили ошибку в коде преобразования дат. Вот этот код:

более полная версия: http://ideone.com/PAlFc9
краткая версия, только ошибочный фрагмент: http://ideone.com/nrgOLo

Введите количество дней, начиная с 1.01.1980 г., и код вернет Вам дату (день, месяц, год) и день недели. Например, если ввести 1, получим 1.01.1980, если ввести 2, получим 2.01.1980, если ввести 32, получим 1.02.1981, если ввести 367, получим 1.01.1981.

Попробуйте ввести число 10593 (соответствует дате 31 декабря 2008 г.) Программа зависнет (см. http://ideone.com/n52k5K ). Так же зависли и все устройства Microsoft Zune 30 Gb, включенные 31 декабря 2008 г и пришли в себя только на следующий день.

Сможете ли Вы найти ошибку? В этом Вам поможет встроенный отладчик Microsoft Visual Studio.

Историю и весь код см. здесь:

История (на англ)
Оригинальный исходный код

Related Images:

Добавить комментарий