И. Ю. Каширин, В. С. Новичков
От С к С++
2-е издание, стереотипное
Допущено УМО по университетскому политехническому
образованию в качестве учебного пособия
для студентов высших учебных заведений,
обучающихся по специальности
«Программное обеспечение вычислительной
техники и автоматизированных систем»
Москва
Горячая линия - Телеком
2012
Стр.1
Каширин И. Ю., Новичков В. С.
К31
От С к С++: Учебное пособие для вузов. – 2-е изд., стереотип.
– М.: Горячая линия – Телеком, 2012. – 334 с.: ил.
ISBN 978-5-9912-0259-6.
Учебное пособие содержит необходимые теоретические
сведения и набор упражнений и задач различной степени
сложности, позволяющих приобрести навыки практического
программирования на алгоритмических языках С и С++ (Си
и Си++) и проконтролировать усвоение материала. Практические
задания для программирования на С++ имеют «сквозную»
структуру – распределены по мере изложения разделов. Материал
книги успешно апробирован авторами в высших технических
учебных заведениях.
Для студентов высших и средних учебных заведений, может
быть использована начинающими программистами при изучении
алгоритмических языков С и С++.
ББК 32.973
Адрес издательства в Интернет WWW.TECHBOOK.RU
Учебное издание
Каширин Игорь Юрьевич, Новичков Валентин Семенович
От С к С++: Учебное пособие
2-е издание, стереотипное
Редактор П. В. Румянцев
Художник В. Г. Ситников
Подготовка оригинал-макета И. М. Чумаковой
.
Подписано к печати 25.03.2012. Формат 60×88 1/16. Усл. печ. л. 21.
Тираж 200 экз. (1-й завод 100 экз.)
ISBN 978-5-9912-0259-6
© И. Ю. Каширин,
В. С. Новичков, 2005, 2012
© Оформление издательства «Горячая линия – Телеком», 2012
Стр.2
ПРЕДИСЛОВИЕ
Среди современных алгоритмических языков языки С и С++ занимают,
пожалуй, первое место по распространенности и разнообразию версий.
Они относятся к семейству универсальных языков программирования,
т. е. ориентированных на весьма широкий круг задач, которые могут
решаться при помощи ЭВМ. Кроме того, авторы этой книги признают
лидерство языков С и С++ среди известных универсальных языков как
наиболее концептуально целостных. Дело в том, что разработка любого
из инструментальных программных средств, к которым относятся и языки
программирования, основана на строгом теоретическом базисе.
Теория разработки алгоритмических языков учитывает отлаживаемость
программ (как быстрый поиск ошибок), гибкость языка при внесении
текущих изменений в программу, возможности дальнейшего развития
самого языка и его средств программистом и т. д. В этом отношении
язык С довольно полно отвечает основным требованиям теории, являясь
последовательным преемником оригинальных решений, воплощенных
ранее в цепочке поколений языков Ассемблера, Фортрана, Алгола. Взяв
из них самое лучшее, язык С приобрел множество новых свойств, сделавших
его одним из первых универсальных функциональных языков.
Язык программирования С разработан сотрудниками фирмы Bell
Labs Деннисом Ритчи и Кеном Томпсоном в 1972 г. во время их совместной
работы над операционной системой UNIX на ЭВМ РDР-11. Однако
его популярность быстро переросла рамки конкретной ЭВМ, конкретной
операционной системы и конкретных задач системного программирования.
В настоящее время ни одна инструментальная операционная
система не может считаться полной, если в ее состав не входит
компилятор языка С.
В некотором смысле язык С является самым универсальным языком,
так как кроме набора средств, присущих современным языкам программирования
высокого уровня (структурность, модульность, определяемые
типы данных), в него включены средства для программирования на уровне
Ассемблера (указатели, побитовые операции, операции сдвига). Большой
набор операторов и операций позволяет писать компактные и эффективные
программы.
Однако такие мощные средства требуют от программиста осторожности,
аккуратности и хорошего знания языка со всеми его преимуществами
и недостатками.
В настоящей книге рассматриваются реализации С и С++, разработанные
фирмой Borland.
3
Стр.3
И. Ю. Каширин, В. С.Новичков. От С к С++
Язык С – структурированный, модульный, компилируемый, универсальный
язык, традиционно используемый для системного программирования.
Он является переносимым языком, так как прикладные программы,
написанные на нем, могут быть легко перенесены с одного компьютера
на другой, даже если они имеют различные операционные системы.
Язык С может использоваться практически для любых задач.
Строгое следование авторов языка С функциональной концепции позволило
изящно достроить язык и перевести его в объектно-ориентированную
версию – С++, практически не меняя ни старой синтаксической,
ни семантической основы.
Быстрое развитие языка программирования С++ с появлением новых
версий, использующих идеи CASE-технологии, свидетельствует
о том, что идеология С не только современна, но и будет иметь большое
будущее.
Настоящая книга состоит из двух основных частей, описывающих
соответственно программирование на языках C и C++. Для чтения книги
практически не нужно иметь навыков программирования на каких-либо
более простых алгоритмических языках.
В то же время читателю, уже знакомому с языком С, может быть рекомендовано
начинать чтение с более поздних глав, посвященных программированию
на языке С++.
Практические упражнения, приведенные в конце каждой главы, имеют
различную степень сложности и значительно облегчат понимание материала
при их выполнении.
Книга может быть использована как для самостоятельного изучения,
так и для чтения курса лекций с лабораторным практикумом в высших
учебных заведениях.
4
Стр.4
Оглавление
ПРЕДИСЛОВИЕ.............................................................................................. 3
ГЛАВА 1. ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ........ 5
1.1. ЭТАПЫ РЕШЕНИЯ ЗАДАЧ НА ЭВМ.............................................................. 5
1.2. РАЗРАБОТКА АЛГОРИТМА РЕШЕНИЯ ЗАДАЧИ............................................. 9
1.2.1. Понятие алгоритма ......................................................................... 9
1.2.2. Алгоритмизация............................................................................ 11
1.2.3. Схемы алгоритмов........................................................................ 12
1.3. ПОСТРОЕНИЕ ПРОСТЕЙШИХ ПРОГРАММ .................................................. 15
1.3.1. Структура программы.................................................................. 16
1.3.2. Идентификаторы........................................................................... 17
1.3.3. Константы...................................................................................... 18
1.3.4. Арифметические операции .......................................................... 20
1.3.5. Математические функции............................................................ 22
1.3.6. Операция присваивания............................................................... 23
1.3.7. Функции ввода и вывода.............................................................. 24
1.3.8. Основные типы данных................................................................ 26
1.4. СТИЛЬ ЗАПИСИ ПРОГРАММ НА ЯЗЫКЕ С................................................... 27
1.5. ПРИМЕР СОСТАВЛЕНИЯ ЛИНЕЙНОЙ ПРОГРАММЫ.................................... 28
Вопросы для самоконтроля ................................................................... 30
Упражнения............................................................................................. 31
ГЛАВА 2. ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ
АЛГОРИТМОВ ............................................................................................. 35
2.1. ПОНЯТИЕ РАЗВЕТВЛЯЮЩЕГОСЯ АЛГОРИТМА .......................................... 35
2.2. ОПЕРАЦИИ ЛОГИЧЕСКОГО ТИПА .............................................................. 36
2.3. УСЛОВНЫЙ ОПЕРАТОР.............................................................................. 37
2.4. ОПЕРАЦИЯ УСЛОВИЯ................................................................................ 40
2.5. ОПЕРАТОР-ПЕРЕКЛЮЧАТЕЛЬ.................................................................... 41
2.6. ПРИМЕР СОСТАВЛЕНИЯ РАЗВЕТВЛЯЮЩЕЙСЯ ПРОГРАММЫ..................... 43
Упражнения............................................................................................. 44
2.7. ПОБИТОВЫЕ ОПЕРАЦИИ ........................................................................... 48
Вопросы для самоконтроля ................................................................... 49
Дополнительные упражнения................................................................ 50
ГЛАВА 3. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ
АЛГОРИТМОВ ............................................................................................. 52
3.1. ПОНЯТИЕ ЦИКЛИЧЕСКОГО АЛГОРИТМА................................................... 52
3.1.1. Определение цикла....................................................................... 52
3.1.2. Структурограммы......................................................................... 54
329
Стр.329
И. Ю. Каширин, В. С.Новичков. От С к С++
3.1.3. Циклы с известным числом повторений..................................... 55
3.1.4. Итерационные циклы ................................................................... 58
3.1.5. Вложенные циклы ........................................................................ 59
3.2. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ С ИЗВЕСТНЫМ
ЧИСЛОМ ПОВТОРЕНИЙ..................................................................................... 61
3.2.1. Оператор цикла с параметром..................................................... 61
3.2.2. Табулирование функции .............................................................. 62
3.2.3. Вычисление конечных сумм и произведений............................ 63
Вопросы для самоконтроля ................................................................... 65
Упражнения............................................................................................. 66
3.3. КОНСТРУИРОВАНИЕ ПРОГРАММ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ С
НЕИЗВЕСТНЫМ ЧИСЛОМ ПОВТОРЕНИЙ............................................................ 69
3.3.1. Оператор цикла с предусловием ................................................. 69
3.3.2. Оператор цикла с постусловием.................................................. 71
3.3.3. Операция «запятая»...................................................................... 75
3.3.4. Пример циклической программы................................................ 75
Вопросы для самоконтроля ................................................................... 77
Дополнительные упражнения................................................................ 77
3.3.5. Итерационные циклы. Вычисление суммы ряда ....................... 79
3.3.6. Метод итерации для уточнения корней...................................... 82
Вопросы для самоконтроля ................................................................... 84
Упражнения............................................................................................. 84
3.4. ПРОЕКТИРОВАНИЕ АЛГОРИТМОВ И ПРОГРАММ СО СТРУКТУРОЙ
ВЛОЖЕННЫХ ЦИКЛОВ...................................................................................... 88
3.4.1. Табулирование функций от нескольких переменных ............... 89
3.4.2. Вычисление кратных сумм и произведений............................... 91
Вопросы для самоконтроля ................................................................... 93
Упражнения............................................................................................. 93
ГЛАВА 4. МАССИВЫ И УКАЗАТЕЛИ..................................................... 96
4.1. МАССИВЫ................................................................................................. 96
4.1.1. Описание массива......................................................................... 96
4.1.2. Одномерные массивы................................................................... 97
4.1.3. Двумерные массивы ................................................................... 101
4.1.4. Ввод-вывод массивов ................................................................. 103
4.1.5. Примеры программирования задач
с использованием массивов ................................................................. 105
4.1.6. Инициализация массивов........................................................... 110
Вопросы для самоконтроля ................................................................. 111
Упражнения........................................................................................... 112
330
Стр.330
Оглавление
4.2. УКАЗАТЕЛИ............................................................................................. 114
4.2.1. Описание указателей .................................................................. 114
4.2.2. Адресные операции .................................................................... 114
4.2.3. Инициализация указателей ........................................................ 115
4.2.4. Особенности использования массивов и указателей
в программе........................................................................................... 116
4.2.5. Ввод-вывод данных с помощью указателей............................. 117
4.2.6. Пример программирования задачи с использованием
указателей.............................................................................................. 119
Вопросы для самоконтроля ................................................................. 121
Упражнение........................................................................................... 121
ГЛАВА 5. ФУНКЦИИ................................................................................ 122
5.1. ОСНОВНЫЕ ПОНЯТИЯ ............................................................................. 122
5.1.1. Вспомогательные, или подчиненные, алгоритмы ................... 122
5.1.2. Понятие функции........................................................................ 124
5.1.3. Определение функции................................................................ 125
5.1.4. Описание функции ..................................................................... 126
5.1.5. Вызов функции ........................................................................... 129
5.2. ОБМЕН ИНФОРМАЦИЕЙ МЕЖДУ ФУНКЦИЯМИ........................................ 131
5.2.1. Оператор возврата ...................................................................... 131
5.2.2. Передача адреса в функцию ...................................................... 131
5.2.3. Библиотечные функции.............................................................. 134
5.2.4. Примеры программ с функциями.............................................. 134
Упражнения........................................................................................... 138
5.3. ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ МАССИВОВ И УКАЗАТЕЛЕЙ
В ФУНКЦИЯХ.................................................................................................. 140
5.3.1. Пример составления программы............................................... 145
Упражнения........................................................................................... 148
5.4. ФУНКЦИИ РАБОТЫ С ТЕКСТОВЫМИ СТРОКАМИ И ФРАГМЕНТАМИ
ОПЕРАТИВНОЙ ПАМЯТИ ................................................................................ 151
5.4.1. Пример программы с массивами и указателями в функциях .153
Вопросы для самоконтроля ................................................................. 155
Упражнения........................................................................................... 155
Дополнительные упражнения.............................................................. 157
5.5. РЕКУРСИИ............................................................................................... 159
5.5.1. Понятие рекурсии....................................................................... 159
5.5.2. Техника построения рекурсивных алгоритмов........................ 161
5.5.3. Формы рекурсий ......................................................................... 164
5.5.3.1. Простая линейная рекурсия ............................................. 164
5.5.3.2. Параллельная рекурсия .................................................... 165
331
Стр.331
И. Ю. Каширин, В. С.Новичков. От С к С++
5.5.3.3. Взаимная рекурсия............................................................ 165
5.5.3.4. Рекурсия более высокого порядка................................... 167
5.5.4. Рекурсия и итерация................................................................... 167
5.5.5. Пример составления программы............................................... 169
Вопросы для самоконтроля ................................................................. 172
Упражнения........................................................................................... 173
ГЛАВА 6. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ........................ 175
6.1. ОПРЕДЕЛЕНИЕ СТРУКТУРЫ..................................................................... 175
6.1.1. Пример составления программы............................................... 177
Упражнения........................................................................................... 181
6.2. СТРУКТУРА ТИПА ПОЛЯ БИТОВ............................................................... 184
6.3. ОБЪЕДИНЕНИЕ........................................................................................ 184
6.4. ОПЕРАЦИИ НАД СТРУКТУРАМИ И ИХ ЭЛЕМЕНТАМИ ............................. 185
6.5. СТРУКТУРЫ И ФУНКЦИИ......................................................................... 186
6.6. ПЕРЕМЕННЫЕ СТРУКТУРЫ...................................................................... 187
6.7. ПРИМЕР ПРОГРАММЫ СО СТРУКТУРАМИ................................................ 189
Вопросы для самоконтроля ................................................................. 192
Упражнения........................................................................................... 193
ГЛАВА 7. ФАЙЛЫ..................................................................................... 196
7.1. ОПРЕДЕЛЕНИЕ ФАЙЛА............................................................................ 196
7.2. ОТКРЫТИЕ ФАЙЛА.................................................................................. 196
7.3. ЗАКРЫТИЕ ФАЙЛА................................................................................... 198
7.4. ВВОД-ВЫВОД ФАЙЛА.............................................................................. 199
7.4.1. Ввод-вывод символа................................................................... 199
7.4.2. Ввод-вывод строки ..................................................................... 201
7.4.3. Ввод-вывод целого ..................................................................... 201
7.4.4. Форматированный ввод-вывод.................................................. 201
7.4.5. Ввод-вывод блока ....................................................................... 202
Упражнения........................................................................................... 202
7.5. ПРОИЗВОЛЬНЫЙ ДОСТУП К ФАЙЛУ ........................................................ 204
7.6. ПРИМЕР ПРОГРАММЫ С ФАЙЛАМИ......................................................... 206
Вопросы для самоконтроля ................................................................. 210
Дополнительные упражнения.............................................................. 211
ГЛАВА 8. ДИРЕКТИВЫ ПРЕПРОЦЕССОРА......................................... 213
8.1. ПРЕПРОЦЕССОР ЯЗЫКА С ....................................................................... 213
8.2. ВКЛЮЧЕНИЕ В ТЕКСТ ПРОГРАММЫ ВНЕШНЕГО ФАЙЛА......................... 213
8.3. ВЫПОЛНЕНИЕ МАКРОПОДСТАНОВОК..................................................... 214
8.4. СТАНДАРТНЫЕ МАКРООПРЕДЕЛЕНИЯ .................................................... 216
8.5. УСЛОВНАЯ КОМПИЛЯЦИЯ ...................................................................... 216
Вопросы для самоконтроля ................................................................. 218
332
Стр.332
Оглавление
Упражнение........................................................................................... 219
ГЛАВА 9. КЛАССЫ С++ ........................................................................... 220
9.1. КОНЦЕПЦИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
В ЯЗЫКЕ С++ ................................................................................................. 220
9.2. ПОНЯТИЕ «КЛАСС»................................................................................. 221
9.3. УПРАВЛЕНИЕ ДОСТУПОМ К ЭЛЕМЕНТАМ ДАННЫХ КЛАССОВ ................ 223
9.4. ОПРЕДЕЛЕНИЕ ФУНКЦИЙ-ЧЛЕНОВ КЛАССА (МЕТОДОВ)......................... 225
9.5. ОБЪЕКТЫ КЛАССОВ ................................................................................ 227
9.6. ПРИМЕР ПРОГРАММЫ С КЛАССАМИ....................................................... 229
Вопросы для самоконтроля ................................................................. 230
Упражнения........................................................................................... 231
ГЛАВА 10. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ................................. 232
10.1. КОНСТРУКТОРЫ КЛАССОВ.................................................................... 232
10.2. ОПЕРАЦИЯ ССЫЛКИ.............................................................................. 235
10.3. ДЕСТРУКТОРЫ КЛАССОВ ...................................................................... 236
10.4. ПРИМЕР ПРОГРАММЫ С КОНСТРУКТОРАМИ И ДЕСТРУКТОРАМИ ......... 237
Вопросы для самоконтроля ................................................................. 238
Упражнения........................................................................................... 239
ГЛАВА 11. ПЕРЕГРУЖАЕМЫЕ ОПЕРАЦИИ........................................ 240
11.1. ПОНЯТИЕ ПЕРЕГРУЗКИ ОПЕРАЦИЙ ....................................................... 240
11.2. ПЕРЕГРУЗКА РАЗЛИЧНЫХ ОПЕРАЦИЙ................................................... 241
11.3. ПРИМЕР ПРОГРАММЫ С ПЕРЕГРУЗКОЙ ОПЕРАЦИЙ............................... 242
Вопросы для самоконтроля ................................................................. 243
Упражнения........................................................................................... 243
ГЛАВА 12. ПОТОКИ ВВОДА-ВЫВОДА................................................. 244
12.1. КОНЦЕПЦИЯ ПОТОКОВ ......................................................................... 244
12.2. ОПЕРАЦИИ ВСТАВКИ В ПОТОК.............................................................. 244
12.3. УПРАВЛЕНИЕ ФОРМАТОМ..................................................................... 245
12.4. ОПЕРАЦИИ ВСТАВКИ, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ.................... 249
12.5. МАНИПУЛЯТОРЫ, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ.......................... 250
12.6. ОПЕРАЦИИ ИЗВЛЕЧЕНИЯ ИЗ ПОТОКА.................................................... 256
12.7. ОПЕРАЦИИ ИЗВЛЕЧЕНИЯ, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ.............. 258
12.8. ПРИМЕР ПРОГРАММЫ С ПОТОКАМИ ВВОДА-ВЫВОДА ......................... 258
Вопросы для самоконтроля ................................................................. 263
Упражнения........................................................................................... 263
ГЛАВА 13. ПРОИЗВОДНЫЕ КЛАССЫ................................................... 264
13.1. ПРОСТОЕ НАСЛЕДОВАНИЕ.................................................................... 264
13.2. ДОСТУП К НАСЛЕДУЕМЫМ КОМПОНЕНТАМ......................................... 265
13.3. КОНСТРУКТОРЫ ДЛЯ ПРОИЗВОДНЫХ КЛАССОВ.................................... 268
333
Стр.333