{"id":21362255,"url":"https://github.com/ilyachalov/lafore-book-examples","last_synced_at":"2025-06-11T05:35:23.531Z","repository":{"id":47922289,"uuid":"172665245","full_name":"ilyachalov/lafore-book-examples","owner":"ilyachalov","description":"Примеры и решения упражнений из книги Роберта Лафоре «ООП в C++», 4-е издание","archived":false,"fork":false,"pushed_at":"2021-02-17T05:41:56.000Z","size":1347,"stargazers_count":13,"open_issues_count":3,"forks_count":8,"subscribers_count":0,"default_branch":"master","last_synced_at":"2023-05-01T06:21:19.098Z","etag":null,"topics":["cpp","examples","lafore","learning","russian"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ilyachalov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-02-26T08:02:45.000Z","updated_at":"2023-03-07T23:14:35.000Z","dependencies_parsed_at":"2022-08-12T14:20:14.419Z","dependency_job_id":null,"html_url":"https://github.com/ilyachalov/lafore-book-examples","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilyachalov%2Flafore-book-examples","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilyachalov%2Flafore-book-examples/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilyachalov%2Flafore-book-examples/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilyachalov%2Flafore-book-examples/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ilyachalov","download_url":"https://codeload.github.com/ilyachalov/lafore-book-examples/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225850163,"owners_count":17534067,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","examples","lafore","learning","russian"],"created_at":"2024-11-22T06:14:33.970Z","updated_at":"2024-11-22T06:14:34.440Z","avatar_url":"https://github.com/ilyachalov.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# lafore-book-examples\nПримеры и решения упражнений из книги Роберта Лафоре «ООП в C++», 4-е издание (перевод с английского на русский язык).\n\nДля 2-16 глав (к первой главе в книге нет ни примеров, ни упражнений). Всего в книге 16 глав. Данный проект осуществлен в 2019-2020 годах.\n\nКнига вышла в оригинале на английском языке в 2001 году. С тех пор автор новых редакций не выпускал, а внесение исправлений и дополнений книге не помешало бы, учитывая, как минимум, несколько крупных изменений стандарта языка C++ за прошедшие 18 лет.\n\nКроме того, автор не рассчитывал на русский язык. Переводчик просто перевел с английского на русский комментарии и строковые константы. В итоге студент после запуска примеров из книги получает в консоли вместо русских букв кракозябры.\n\nЯ переписал примеры из книги с использованием Юникода (широких символов). То есть, к примеру, вместо cout и cin используются их версии для широких символов wcout и wcin, вместо char используется wchar_t и так далее.\n\nТексты программ разложены в две папки: 1) [Lafore-examples](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples) (примеры); 2) [Lafore-exercise-solutions](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions) (решения упражнений). Внутри этих папок файлы еще разбиты по главам. Названия файлов с примерами начинаются трехзначным числом — это номер страницы в книге, на которой встречается этот пример. В названиях файлов с решениями упражнений указан номер главы и номер упражнения.\n\nТексты программ сохранены в файлах с расширением \".cpp\" в кодировке UTF-8 с сигнатурой (BOM). Завершения строк выполнены в формате Windows (CR LF).\n\nВсе выложенные тут программы были собраны без ошибок в среде «Visual Studio Community 2017», запускались и тестировались в операционной системе «Windows 7 Профессиональная» (SP1).\n\nПереключение стандартных потоков ввода и вывода в режим Юникода выполнено с помощью нестандартной для языка C++ функции \\_setmode, поэтому в Linux, видимо, работать не будет.\n\nЯ посветил разбору 4-го издания учебника Лафоре более ста постов в своем блоге. Почитать эти посты можно по [этой ссылке](https://ilyachalov.livejournal.com/133205.html).\n## lafore-console-graphics-lite\nБиблиотека (в папке [Lafore-console-graphics-lite](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-console-graphics-lite)), содержащая функции «упрощенного варианта консольной графики», написанные Лафоре для использования в примерах книги. Подробное ее описание можно посмотреть в приложении «Д» к книге (стр.824-835).\n\nИспользуется в примерах и упражнениях:\n* [179_circstrc.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_05/179_circstrc.cpp) 5-й главы;\n* [225_circles.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_06/225_circles.cpp) и [231_circtor.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_06/231_circtor.cpp) 6-й главы;\n* [380_multshap.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_09/380_multshap.cpp) 9-й главы;\n* [461_horse.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_10/461_horse.cpp) 10-й главы;\n* [486_virtshap.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_11/486_virtshap.cpp) и [11chapter_08exercise.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-exercise-solutions/chapter_11/11chapter_08exercise.cpp) 11-й главы;\n* примере многофайловой программы [elev](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples/chapter_13/elev), а также в упражнениях: [elev2](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_02exercise_elev2), [elev3](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_02exercise_elev3), [elev4](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_03exercise_elev4) 13-й главы.\n\nКроме использования Юникода (широких символов) я еще внес некоторые изменения: 1) добавил функцию end_graphics, которая возвращает настройки цвета текста консоли к тем, которые были установлены до запуска программы; 2) изменил функцию set_cursor_pos так, чтобы графические объекты рисовались относительно текущего положения курсора, а не относительно левого верхнего угла.\n## вывод на печать\nДля реализации вывода текста на печать в примерах 12-й главы использованы функции из набора Windows API (через функции Windows GDI). В названия файлов, где используются эти функции, добавлена концовка «_winapi»:\n* [589_ezprint_winapi.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_12/589_ezprint_winapi.cpp);\n* [589_oprint_winapi.cpp](https://github.com/ilyachalov/lafore-book-examples/blob/master/Lafore-examples/chapter_12/589_oprint_winapi.cpp).\n## примеры многофайловых программ\nВ 13-й главе учебника, посвященной многофайловым программам, автор сначала дает большую теоретическую часть, а затем два больших примера таких программ: [verylong](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples/chapter_13/verylong) и [elev](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples/chapter_13/elev).\n\nВ теоретической части автор иллюстрирует изложение материала кусочками кода. Я оформил эти кусочки в полноценные маленькие программы, для которых можно запустить сборку и увидеть сообщения об ошибках, которые описывает Лафоре.\n\nКаждую многофайловую программу я поместил в отдельную папку-проект.\n## упражнения к 13-й главе\n1. В первом упражнении к 13-й главе предлагается расширить многофайловую программу [verylong](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples/chapter_13/verylong), в рамках которой создан одноименный класс для работы с очень длинными натуральными числами, каждый разряд которых хранится в отдельном элементе массива. Изначально эта программа выполняет сложение и умножение натуральных чисел. Поставлена задача расширить диапазон чисел от _натуральных_ (только положительные целые числа) до вообще всех _целых чисел_ (и положительных, и отрицательных). Для этого я добавил в класс __verylong__ поле __sign__, что потребовало переписывания методов сложения и умножения с учетом знаков чисел, а также добавления метода сравнения чисел.\u003c/br\u003e\u003c/br\u003eПосле этого я добавил методы для нахождения разности и результата деления чисел. В случае деления выполняется _целочисленное деление_. Для полноты картины я добавил и метод, возвращающий остаток от целочисленного деления. Файлы проекта: [verylong2](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_01exercise_verylong2).\n\n2. Во втором упражнении к 13-й главе требуется, наоборот, упростить имеющуюся многофайловую программу [elev](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples/chapter_13/elev), которая рисует на экране действующую симуляцию работы четырех лифтов в 20-этажном здании. Требуется переписать программу, чтобы она работала только с одним лифтом (можно, конечно, просто изменить константу с числом лифтов в 1, но в задании требуется именно переписать программу и вообще убрать эту константу). Файлы проекта: [elev2](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_02exercise_elev2).\u003c/br\u003e\u003c/br\u003eВ этом же упражнении предлагается еще больше упростить программу: теперь в лифте может быть только один пассажир (то есть и только один пункт назначения). Про запросы с этажей при этом ничего не сказано; я решил, что их может быть (как и было ранее) сколько угодно. Я взял написанную ранее многофайловую программу [elev2](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_02exercise_elev2) и подкорректировал там два метода класса __elevator__. В методе __elevator::get_destinations__ я убрал возможность выбора множества пунктов назначения, оставив возможность выбора только одного пункта назначения (пассажир-то у нас может быть только один). В методе __elevator::decide__ я переставил местами некоторые условия, чтобы учесть то, что лифт сначала должен достичь пункта назначения и высадить пассажира, а только потом отвечать на запросы с этажей. Теперь лифт не может взять пассажира «по пути», так как по условиям задания в лифте может быть только один пассажир. Файлы проекта: [elev3](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_02exercise_elev3).\n\n3. В третьем упражнении к 13-й главе требуется убрать один из недостатков алгоритма работы кабин лифтов программы [elev](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-examples/chapter_13/elev). Файлы проекта: [elev4](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_03exercise_elev4).\n\n4. В четвертом упражнении к 13-й главе требуется создать свою библиотеку классов и клиентскую программу для ее тестирования. Я создал библиотеку классов в четырех вариантах:\u003c/br\u003e\u003c/br\u003e* [mylib1](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_04exercise_mylib1): в виде заголовочного файла __mylib.h__ (интерфейс) и исходного файла __mylib.cpp__ (реализация);\u003c/br\u003e* [mylib2](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_04exercise_mylib2): в виде заголовочного файла __mylib.h__ (интерфейс) и объектного файла __mylib.obj__ (реализация);\u003c/br\u003e* [mylib3](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_04exercise_mylib3): в виде заголовочного файла __mylib.h__ (интерфейс) и файла статической библиотеки __mylib.lib__ (реализация);\u003c/br\u003e* [mylib4](https://github.com/ilyachalov/lafore-book-examples/tree/master/Lafore-exercise-solutions/chapter_13/13chapter_04exercise_mylib4_dll_1): в виде заголовочного файла __mylib.h__ (интерфейс), файла библиотеки импорта __ProjectDLL.lib__ и файла динамической библиотеки __ProjectDLL.dll__ (реализация).\u003c/br\u003e\u003c/br\u003eВо всех четырех вариантах используется одна и та же клиентская программа __test_app.cpp__ для тестирования созданной библиотеки.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filyachalov%2Flafore-book-examples","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filyachalov%2Flafore-book-examples","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filyachalov%2Flafore-book-examples/lists"}