Примеры и решения упражнений из книги Роберта Лафоре «ООП в C++», 4-е издание (перевод с английского на русский язык).
Для 2-16 глав (к первой главе в книге нет ни примеров, ни упражнений). Всего в книге 16 глав. Данный проект осуществлен в 2019-2020 годах.
Книга вышла в оригинале на английском языке в 2001 году. С тех пор автор новых редакций не выпускал, а внесение исправлений и дополнений книге не помешало бы, учитывая, как минимум, несколько крупных изменений стандарта языка C++ за прошедшие 18 лет.
Кроме того, автор не рассчитывал на русский язык. Переводчик просто перевел с английского на русский комментарии и строковые константы. В итоге студент после запуска примеров из книги получает в консоли вместо русских букв кракозябры.
Я переписал примеры из книги с использованием Юникода (широких символов). То есть, к примеру, вместо cout и cin используются их версии для широких символов wcout и wcin, вместо char используется wchar_t и так далее.
Тексты программ разложены в две папки: 1) Lafore-examples (примеры); 2) Lafore-exercise-solutions (решения упражнений). Внутри этих папок файлы еще разбиты по главам. Названия файлов с примерами начинаются трехзначным числом — это номер страницы в книге, на которой встречается этот пример. В названиях файлов с решениями упражнений указан номер главы и номер упражнения.
Тексты программ сохранены в файлах с расширением ".cpp" в кодировке UTF-8 с сигнатурой (BOM). Завершения строк выполнены в формате Windows (CR LF).
Все выложенные тут программы были собраны без ошибок в среде «Visual Studio Community 2017», запускались и тестировались в операционной системе «Windows 7 Профессиональная» (SP1).
Переключение стандартных потоков ввода и вывода в режим Юникода выполнено с помощью нестандартной для языка C++ функции _setmode, поэтому в Linux, видимо, работать не будет.
Я посветил разбору 4-го издания учебника Лафоре более ста постов в своем блоге. Почитать эти посты можно по этой ссылке.
Библиотека (в папке Lafore-console-graphics-lite), содержащая функции «упрощенного варианта консольной графики», написанные Лафоре для использования в примерах книги. Подробное ее описание можно посмотреть в приложении «Д» к книге (стр.824-835).
Используется в примерах и упражнениях:
- 179_circstrc.cpp 5-й главы;
- 225_circles.cpp и 231_circtor.cpp 6-й главы;
- 380_multshap.cpp 9-й главы;
- 461_horse.cpp 10-й главы;
- 486_virtshap.cpp и 11chapter_08exercise.cpp 11-й главы;
- примере многофайловой программы elev, а также в упражнениях: elev2, elev3, elev4 13-й главы.
Кроме использования Юникода (широких символов) я еще внес некоторые изменения: 1) добавил функцию end_graphics, которая возвращает настройки цвета текста консоли к тем, которые были установлены до запуска программы; 2) изменил функцию set_cursor_pos так, чтобы графические объекты рисовались относительно текущего положения курсора, а не относительно левого верхнего угла.
Для реализации вывода текста на печать в примерах 12-й главы использованы функции из набора Windows API (через функции Windows GDI). В названия файлов, где используются эти функции, добавлена концовка «_winapi»:
В 13-й главе учебника, посвященной многофайловым программам, автор сначала дает большую теоретическую часть, а затем два больших примера таких программ: verylong и elev.
В теоретической части автор иллюстрирует изложение материала кусочками кода. Я оформил эти кусочки в полноценные маленькие программы, для которых можно запустить сборку и увидеть сообщения об ошибках, которые описывает Лафоре.
Каждую многофайловую программу я поместил в отдельную папку-проект.
-
В первом упражнении к 13-й главе предлагается расширить многофайловую программу verylong, в рамках которой создан одноименный класс для работы с очень длинными натуральными числами, каждый разряд которых хранится в отдельном элементе массива. Изначально эта программа выполняет сложение и умножение натуральных чисел. Поставлена задача расширить диапазон чисел от натуральных (только положительные целые числа) до вообще всех целых чисел (и положительных, и отрицательных). Для этого я добавил в класс verylong поле sign, что потребовало переписывания методов сложения и умножения с учетом знаков чисел, а также добавления метода сравнения чисел.
После этого я добавил методы для нахождения разности и результата деления чисел. В случае деления выполняется целочисленное деление. Для полноты картины я добавил и метод, возвращающий остаток от целочисленного деления. Файлы проекта: verylong2. -
Во втором упражнении к 13-й главе требуется, наоборот, упростить имеющуюся многофайловую программу elev, которая рисует на экране действующую симуляцию работы четырех лифтов в 20-этажном здании. Требуется переписать программу, чтобы она работала только с одним лифтом (можно, конечно, просто изменить константу с числом лифтов в 1, но в задании требуется именно переписать программу и вообще убрать эту константу). Файлы проекта: elev2.
В этом же упражнении предлагается еще больше упростить программу: теперь в лифте может быть только один пассажир (то есть и только один пункт назначения). Про запросы с этажей при этом ничего не сказано; я решил, что их может быть (как и было ранее) сколько угодно. Я взял написанную ранее многофайловую программу elev2 и подкорректировал там два метода класса elevator. В методе elevator::get_destinations я убрал возможность выбора множества пунктов назначения, оставив возможность выбора только одного пункта назначения (пассажир-то у нас может быть только один). В методе elevator::decide я переставил местами некоторые условия, чтобы учесть то, что лифт сначала должен достичь пункта назначения и высадить пассажира, а только потом отвечать на запросы с этажей. Теперь лифт не может взять пассажира «по пути», так как по условиям задания в лифте может быть только один пассажир. Файлы проекта: elev3. -
В третьем упражнении к 13-й главе требуется убрать один из недостатков алгоритма работы кабин лифтов программы elev. Файлы проекта: elev4.
-
В четвертом упражнении к 13-й главе требуется создать свою библиотеку классов и клиентскую программу для ее тестирования. Я создал библиотеку классов в четырех вариантах:
* mylib1: в виде заголовочного файла mylib.h (интерфейс) и исходного файла mylib.cpp (реализация);
* mylib2: в виде заголовочного файла mylib.h (интерфейс) и объектного файла mylib.obj (реализация);
* mylib3: в виде заголовочного файла mylib.h (интерфейс) и файла статической библиотеки mylib.lib (реализация);
* mylib4: в виде заголовочного файла mylib.h (интерфейс), файла библиотеки импорта ProjectDLL.lib и файла динамической библиотеки ProjectDLL.dll (реализация).
Во всех четырех вариантах используется одна и та же клиентская программа test_app.cpp для тестирования созданной библиотеки.