Допущено учебно-методическим объединением вузов по университетскому политехническому образованию в качестве учебного пособия для студентов высших 
 учебных заведений, обучающихся по специальности 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++. Для чтения книги практически не нужно иметь навыков программирования на каких-либо более простых алгоритмических языках. 
 В то же время читателю, уже знакомому с языком С, может быть рекомендовано начинать чтение с более поздних глав, посвященных программированию на языке С++.
 Практические упражнения, приведенные в конце каждой главы, имеют различную степень сложности и значительно облегчат понимание материала при их выполнении.
 Книга может быть использована как для самостоятельного изучения, так и для чтения курса лекций с лабораторным практикумом в высших учебных заведениях.