ББК 32.973.2-018.1
УДК 004.43(075)
П12
Павловская Т. А., Щупак Ю. А.
П12 C/C++. Структурное и объектно-ориентированное программирование: Практикум. — СПб.: Питер, 2011. — 352 с.: ил. — (Серия «Учебное пособие»).
ISBN 978-5-459-00613-1
Практикум предназначен для изучения языка программирования С++ на семинарах или самостоятельно. Издание дополняет и расширяет учебник Т. А. Павловской «С/С++. Программирование на языке высокого уровня», но может использоваться и как отдельное пособие.
На примерах, сопровождаемых теоретическими сведениями, рассматриваются: основные конструкции, массивы, строки, структуры, функции, шаблоны, динамические структуры данных, классы, шаблоны, наследование, исключения, стандартная библиотека, UML, концепции программной инженерии и паттерны проектирования. Обсуждаются алгоритмы, приемы отладки, вопросы качества и стиля. По каждой теме приведено несколько комплектов заданий для лабораторных работ.
ББК 32.973.2-018. УДК 004.43(075) Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги.
ISBN 978-5-459-00613-1 © ООО Издательство «Питер», Краткое оглавление Предисловие
Часть I. Структурное программирование
Семинар 1. Линейные программы
Семинар 2. Ветвления и циклы
Семинар 3. Одномерные массивы и указатели
Семинар 4. Двумерные массивы
Семинар 5. Строки и файлы
Семинар 6. Структуры
Семинар 7. Функции
Семинар 8. Перегрузка и шаблоны функций
Семинар 9. Динамические структуры данных
Часть II. Объектно-ориентированное программирование
Семинар 10. Классы
Семинар 11. Наследование
Семинар 12. Шаблоны классов. Обработка исключительных ситуаций................. Семинар 13. Стандартные потоки
Семинар 14. Файловые и строковые потоки. Строки класса string
Семинар 15. Стандартная библиотека шаблонов
Приложение. Основные приемы работы в Microsoft Visual C++.NET 2005........... Литература
Алфавитный указатель
Оглавление Предисловие
Часть I. Структурное программирование
Семинар 1. Линейные программы
Задача 1.1. Расчет по формуле
Вывод кириллицы
Отладка программы
Описание переменных
Задача 1.2. Временной интервал
Итоги
Задания
Семинар 2. Ветвления и циклы
Разветвляющиеся программы
Задача 2.1. Вычисление значения функции, заданной графически
Задача 2.2. Выстрел по мишени
Задача 2.3. Клавиши курсора
Циклы
Задача 2.4. Таблица значений функции
Задача 2.5. Вычисление суммы ряда
Итоги
Задания
Семинар 3. Одномерные массивы и указатели
Задача 3.1. Количество элементов между минимумом и максимумом
Задача 3.2. Сумма элементов правее последнего отрицательного
Задача 3.3. Быстрая сортировка массива
Итоги
Задания
Семинар 4. Двумерные массивы
Задача 4.1. Среднее арифметическое и количество положительных элементов массива
6 Оглавление Задача 4.2. Номер столбца из положительных элементов
Задача 4.3. Упорядочивание строк матрицы
Итоги
Задания
Семинар 5. Строки и файлы
Описание строк
Операции со строками
Работа с символами
Задача 5.1. Поиск подстроки
Задача 5.2. Подсчет количества вхождений слова в текст
Задача 5.3. Вывод вопросительных предложений
Итоги
Задания
Семинар 6. Структуры
Задача 6.1. Поиск в простой базе (массив структур)
Задача 6.2. Сортировка массива структур
Задача 6.3. Структуры и бинарные файлы
Задача 6.4. Структуры в динамической памяти
Итоги
Задания
Семинар 7. Функции
Задача 7.1. Передача в функцию параметров стандартных типов
Задача 7.1-а. Передача в функцию имени функции
Задача 7.2. Передача массивов в функцию
Задача 7.3. Передача строк в функцию
Задача 7.4. Передача структур в функцию
Задача 7.5. Рекурсивные функции
Многофайловые проекты
Что и как следует размещать в заголовочном файле
Задача 7.6. Многофайловый проект — форматирование текста
Итоги
Задания
Функции и массивы
Функции, строки и файлы
Функции, структуры и бинарные файлы
Семинар 8. Перегрузка и шаблоны функций
Перегрузка функций
Задача 8.1. Перегрузка функций
Шаблоны функций
Задача 8.2. Шаблоны функций
Итоги
Задания
Семинар 9. Динамические структуры данных
Задача 9.1. Стек
Задача 9.2. Линейный список
Оглавление Задача 9.3. Бинарное дерево
Итоги
Задания
Часть II. Объектно-ориентированное программирование
Семинар 10. Классы
Появление объектно-ориентированного программирования
Критерии качества декомпозиции проекта
Что принесло с собой ООП
От структуры — к классу
Задача 10.1. Поиск в простой базе (массив объектов)
Конструктор по умолчанию
Инициализаторы конструктора
Конструктор копирования
Перегрузка операций
Перегрузка операций инкремента
Перегрузка операции присваивания
Статические элементы класса
Задача 10.2. Реализация класса треугольников
Этап 1
Этап 2
Этап 3
Этап 4
Итоги
Задания
Семинар 11. Наследование
Наследование классов
Замещение функций базового класса
Конструкторы и деструкторы в производном классе
Устранение неоднозначности при множественном наследовании
Доступ к объектам иерархии
Виртуальные методы
Абстрактные классы. Чисто виртуальные методы
Отношения между классами. Диаграммы классов на языке UML
Ассоциация
Наследование
Агрегация
Зависимость
Паттерны проектирования
Паттерн Стратегия (Strategy)
Проектирование программы с учетом будущих изменений
Задача 11.1. Функциональный калькулятор
Задача 11.2. Продвинутый функциональный калькулятор
Задача 11.3. Работа с объектами символьных и шестнадцатеричных строк....... Итоги
Задания
Общая часть заданий для вариантов 1–20
Варианты 1–10
Варианты 11–20
Семинар 12. Шаблоны классов. Обработка исключительных ситуаций......... Шаблоны классов
Определение шаблона класса
Использование шаблона класса
Организация исходного кода
Параметры шаблонов
Специализация
Использование функциональных объектов для настройки шаблонных классов
Разработка шаблонного класса для представления разреженных массивов... Задача 12.1. Шаблонный класс для разреженных массивов
Обработка исключительных ситуаций
Определение исключений
Перехват исключений
Неперехваченные исключения
Классы исключений. Иерархии исключений
Спецификации исключений
Исключения в конструкторах
Исключения в деструкторах
Задача 12.2. Шаблонный класс векторов
Итоги
Задания
Семинар 13. Стандартные потоки
Потоковые классы
Классы стандартных потоков
Заголовочные файлы библиотеки ввода-вывода C++
Объекты и методы стандартных потоков ввода-вывода
Обработка ошибок потоков
Перегрузка операций извлечения и вставки для типов, определенных программистом
Задача 13.1. Первичный ввод и поиск информации в базе данных
Итоги
Задания
Семинар 14. Файловые и строковые потоки. Строки класса string................ Файловые потоки
Строковые потоки
Строки класса string
Задача 14.1. Подсчет количества вхождений слова в текст
Задача 14.2. Вывод вопросительных предложений
Итоги
Задания
Оглавление Семинар 15. Стандартная библиотека шаблонов
Основные концепции стандартной библиотеки
Контейнеры
Итераторы
Общие свойства контейнеров
Алгоритмы
Использование последовательных контейнеров
Задача 15.1. Сортировка вектора
Шаблонная функция print для вывода содержимого контейнера
Адаптеры контейнеров
Стек
Очередь
Очередь с приоритетами
Использование алгоритмов
Алгоритмы count и nd
Алгоритмы count_if и nd_if
Алгоритм for_each
Алгоритм search
Алгоритм sort
Функциональные объекты
Обратные итераторы
Итераторы вставки и алгоритм copy
Алгоритм merge
Использование ассоциативных контейнеров
Множества
Словари
Задача 15.2. Формирование частотного словаря
Задача 15.3. Морской бой
Итоги
Задания
Приложение. Основные приемы работы в Microsoft Visual C++.NET 2005..... Запуск интегрированной среды.Создание пустого проекта
Добавление файлов к проекту
Многофайловые проекты
Редактирование текста программы
Сохранение проекта и программы, завершение работы
Продолжение работы над проектом
Компиляция и компоновка программы
Выполнение и отладка программы
Работа со справочной системой
Литература
Алфавитный указатель
Предисловие Эта книга не просто объединяет под одной обложкой практикумы «Структурное программирование» и «Объектно-ориентированное программирование» [22, 23]:
материалы были переработаны и обновлены, листинги программ обновлены и проверены в среде Microsoft.NET.
Наша цель — научить читателя самостоятельно создавать грамотные и, по возможности, профессиональные программы на C++. Практикум рассчитан на планомерное освоение этого языка с начального и до профессионального уровня. Извлечь пользу из этой книги смогут в первую очередь студенты, обучающиеся по направлению «Информатика и вычислительная техника» и смежным с ним, а также любознательные школьники, упорные пенсионеры, домохозяйки, безработные менеджеры — в общем, все, кто твердо решил освоить этот непростой язык для практического применения.
Книга состоит из двух частей: «Структурное программирование» и «Объектноориентированное программирование». В первой части рассматриваются возможности С++, используемые в рамках процедурной парадигмы: стандартные типы данных, управляющие конструкции языка, массивы, указатели, строки, структуры, функции, шаблоны функций, а также динамические структуры данных. Обсуждаются алгоритмы, методы и приемы написания программ, типичные ошибки, которые совершают начинающие (и не только) программисты, вопросы качества и стиля. Большое внимание уделяется процессу отладки и тестирования.
Во второй части обсуждаются методы создания объектно-ориентированных программ, шаблонов классов, использование наследования, исключений, классов и алгоритмов стандартной библиотеки, введение в UML и паттерны проектирования.
В подавляющем большинстве учебников по C++ приводятся конструкции языка и примеры, иллюстрирующие их работу. Любой программист, работавший над реальными проектами, понимает, что знания синтаксиса и правил выполнения операторов далеко не достаточно для того, чтобы писать программы приемлемого качества. Это особенно справедливо для такого многогранного языка, как C++.
Если вы не знакомы с основами ООП и с базовыми концепциями программной инженерии (software engineering), то написанная вами программа, если и заработает,