Skip to content

Примеры и решения упражнений из книги Роберта Лафоре «ООП в C++», 4-е издание

Notifications You must be signed in to change notification settings

ilyachalov/lafore-book-examples

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

lafore-book-examples

Примеры и решения упражнений из книги Роберта Лафоре «ООП в 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

Библиотека (в папке Lafore-console-graphics-lite), содержащая функции «упрощенного варианта консольной графики», написанные Лафоре для использования в примерах книги. Подробное ее описание можно посмотреть в приложении «Д» к книге (стр.824-835).

Используется в примерах и упражнениях:

Кроме использования Юникода (широких символов) я еще внес некоторые изменения: 1) добавил функцию end_graphics, которая возвращает настройки цвета текста консоли к тем, которые были установлены до запуска программы; 2) изменил функцию set_cursor_pos так, чтобы графические объекты рисовались относительно текущего положения курсора, а не относительно левого верхнего угла.

вывод на печать

Для реализации вывода текста на печать в примерах 12-й главы использованы функции из набора Windows API (через функции Windows GDI). В названия файлов, где используются эти функции, добавлена концовка «_winapi»:

примеры многофайловых программ

В 13-й главе учебника, посвященной многофайловым программам, автор сначала дает большую теоретическую часть, а затем два больших примера таких программ: verylong и elev.

В теоретической части автор иллюстрирует изложение материала кусочками кода. Я оформил эти кусочки в полноценные маленькие программы, для которых можно запустить сборку и увидеть сообщения об ошибках, которые описывает Лафоре.

Каждую многофайловую программу я поместил в отдельную папку-проект.

упражнения к 13-й главе

  1. В первом упражнении к 13-й главе предлагается расширить многофайловую программу verylong, в рамках которой создан одноименный класс для работы с очень длинными натуральными числами, каждый разряд которых хранится в отдельном элементе массива. Изначально эта программа выполняет сложение и умножение натуральных чисел. Поставлена задача расширить диапазон чисел от натуральных (только положительные целые числа) до вообще всех целых чисел (и положительных, и отрицательных). Для этого я добавил в класс verylong поле sign, что потребовало переписывания методов сложения и умножения с учетом знаков чисел, а также добавления метода сравнения чисел.

    После этого я добавил методы для нахождения разности и результата деления чисел. В случае деления выполняется целочисленное деление. Для полноты картины я добавил и метод, возвращающий остаток от целочисленного деления. Файлы проекта: verylong2.

  2. Во втором упражнении к 13-й главе требуется, наоборот, упростить имеющуюся многофайловую программу elev, которая рисует на экране действующую симуляцию работы четырех лифтов в 20-этажном здании. Требуется переписать программу, чтобы она работала только с одним лифтом (можно, конечно, просто изменить константу с числом лифтов в 1, но в задании требуется именно переписать программу и вообще убрать эту константу). Файлы проекта: elev2.

    В этом же упражнении предлагается еще больше упростить программу: теперь в лифте может быть только один пассажир (то есть и только один пункт назначения). Про запросы с этажей при этом ничего не сказано; я решил, что их может быть (как и было ранее) сколько угодно. Я взял написанную ранее многофайловую программу elev2 и подкорректировал там два метода класса elevator. В методе elevator::get_destinations я убрал возможность выбора множества пунктов назначения, оставив возможность выбора только одного пункта назначения (пассажир-то у нас может быть только один). В методе elevator::decide я переставил местами некоторые условия, чтобы учесть то, что лифт сначала должен достичь пункта назначения и высадить пассажира, а только потом отвечать на запросы с этажей. Теперь лифт не может взять пассажира «по пути», так как по условиям задания в лифте может быть только один пассажир. Файлы проекта: elev3.

  3. В третьем упражнении к 13-й главе требуется убрать один из недостатков алгоритма работы кабин лифтов программы elev. Файлы проекта: elev4.

  4. В четвертом упражнении к 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 для тестирования созданной библиотеки.

About

Примеры и решения упражнений из книги Роберта Лафоре «ООП в C++», 4-е издание

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published