Допущено учебно-методическим объединением вузов по университетскому политехническому образованию в качестве учебного пособия для студентов высших
учебных заведений, обучающихся по специальности 220400 «Программное обеспечение вычислительной
техники и автоматизированных систем»

Оглавление
ПРЕДИСЛОВИЕ 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
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
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
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
Упражнение 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
13.4. ПРОИЗВОДНЫЕ И ОБЪЕМЛЮЩИЕ КЛАССЫ 270
13.5. ПРИМЕРЫ СВЯЗНЫХ СПИСКОВ 271
13.6. ПОЛИМОРФИЗМ 283
13.7. ПРАВИЛО ISA( ) 286
Вопросы для самоконтроля 287
Упражнения 287
ГЛАВА 14. ОСОБЕННОСТИ НАСЛЕДОВАНИЯ КЛАССОВ 288
14.1. АБСТРАКТНЫЕ КЛАССЫ 288
14.2. МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ 289
14.3. АДРЕСА БАЗОВЫХ КЛАССОВ 291
14.4. ВИРТУАЛЬНОЕ НАСЛЕДОВАНИЕ 293
Вопросы для самоконтроля 294
Упражнения 294
ГЛАВА 15. ФАЙЛЫ ПОЛЬЗОВАТЕЛЯ 295
15.1. ВВОД-ВЫВОД В ФАЙЛАХ 295
15.2. ОТКРЫТИЕ ФАЙЛОВ 295
15.3. ЗАКРЫТИЕ ФАЙЛОВ 297
15.4. ПОИСК В ПОТОКЕ 297
15.5. ПРИВЯЗКА ПОТОКОВ 298
15.6. УКАЗАТЕЛИ НА ПОТОКИ 298
15.7. ОБРАБОТКА ОШИБОК В ПОТОКАХ 299
15.8. ВВОД-ВЫВОД ДВОИЧНЫХ ФАЙЛОВ 300
15.9. ВВОД-ВЫВОД В ОПЕРАТИВНОЙ ПАМЯТИ 301
15.10. ПРИМЕР ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ ФАЙЛА 302
Вопросы для самоконтроля 306
Упражнения 306
ПРИЛОЖЕНИЕ 1. НЕКОТОРЫЕ БИБЛИОТЕЧНЫЕ ФУНКЦИИ 307
П-1.1. ПОДПРОГРАММЫ КЛАССИФИКАЦИИ СИМВОЛОВ 307
П-1.2. ПОДПРОГРАММЫ ПРОЦЕССОВ 307
П-1.3. ПОДПРОГРАММЫ ПРЕОБРАЗОВАНИЯ СИМВОЛОВ И СТРОК 309
П-1.4. ПОДПРОГРАММЫ ВВОДА-ВЫВОДА 310
П-1.5. ПОДПРОГРАММЫ МАНИПУЛИРОВАНИЯ СТРОКАМИ 313
П-1.6. ПОДПРОГРАММЫ РАСПРЕДЕЛЕНИЯ ПАМЯТИ 314
ПРИЛОЖЕНИЕ 2. БИБЛИОТЕЧНЫЕ ФУНКЦИИ ГРАФИКИ 316
П-2.1. ФУНКЦИИ УСТАНОВКИ ГРАФИЧЕСКОЙ СРЕДЫ 316
П-2.2. ФУНКЦИИ РИСОВАНИЯ 317
П-2.3. ОСНОВНЫЕ МАКРООПРЕДЕЛЕНИЯ ГРАФИКИ 318
ПРИЛОЖЕНИЕ 3. УПРАЖНЕНИЯ ПО С++ (ОБЪЕКТЫ) 321
СПИСОК ЛИТЕРАТУРЫ 328

ПРЕДИСЛОВИЕ

Среди современных алгоритмических языков языки С и С++ занимают, пожалуй, первое место по распространенности и разнообразию версий. Они относятся к семейству универсальных языков программирования, т. е. ориентированных на весьма широкий круг задач, которые могут решаться при помощи ЭВМ. Кроме того, авторы этой книги признают лидерство языков С и С++ среди известных универсальных языков как наиболее концептуально целостных. Дело в том, что разработка любого из инструментальных программных средств, к которым относятся и языки программирования, основана на строгом теоретическом базисе.
Теория разработки алгоритмических языков учитывает отлаживаемость программ (как быстрый поиск ошибок), гибкость языка при внесении текущих изменений в программу, возможности дальнейшего развития самого языка и его средств программистом и т. д. В этом отношении язык С довольно полно отвечает основным требованиям теории, являясь последовательным преемником оригинальных решений, воплощенных ранее в цепочке поколений языков Ассемблера, Фортрана, Алгола. Взяв из них самое лучшее, язык С приобрел множество новых свойств, сделавших его одним из первых универсальных функциональных языков.
Язык программирования С разработан сотрудниками фирмы Bell Labs Деннисом Ритчи и Кеном Томпсоном в 1972 г. во время их совместной работы над операционной системой UNIX на ЭВМ РDР-11. Однако его популярность быстро переросла рамки конкретной ЭВМ, конкретной операционной системы и конкретных задач системного программирования. В настоящее время ни одна инструментальная операционная система не может считаться полной, если в ее состав не входит компилятор языка С.
В некотором смысле язык С является самым универсальным языком, так как кроме набора средств, присущих современным языкам программирования высокого уровня (структурность, модульность, определяемые типы данных), в него включены средства для программирования на уровне Ассемблера (указатели, побитовые операции, операции сдвига). Большой набор операторов и операций позволяет писать компактные и эффективные программы.
Однако такие мощные средства требуют от программиста осторожности, аккуратности и хорошего знания языка со всеми его преимуществами и недостатками.
В настоящей книге рассматриваются реализации С и С++, разработанные фирмой Borland.
Язык С – структурированный, модульный, компилируемый, универсальный язык, традиционно используемый для системного программирования. Он является переносимым языком, так как прикладные программы, написанные на нем, могут быть легко перенесены с одного компьютера на другой, даже если они имеют различные операционные системы. Язык С может использоваться практически для любых задач.
Строгое следование авторов языка С функциональной концепции позволило изящно достроить язык и перевести его в объектно-ориентированную версию – С++, практически не меняя ни старой синтаксической, ни семантической основы.
Быстрое развитие языка программирования С++ с появлением новых версий, использующих идеи CASE-технологии, свидетельствует о том, что идеология С не только современна, но и будет иметь большое будущее.
Настоящая книга состоит из двух основных частей, описывающих соответственно программирование на языках C и C++. Для чтения книги практически не нужно иметь навыков программирования на каких-либо более простых алгоритмических языках.
В то же время читателю, уже знакомому с языком С, может быть рекомендовано начинать чтение с более поздних глав, посвященных программированию на языке С++.
Практические упражнения, приведенные в конце каждой главы, имеют различную степень сложности и значительно облегчат понимание материала при их выполнении.
Книга может быть использована как для самостоятельного изучения, так и для чтения курса лекций с лабораторным практикумом в высших учебных заведениях.