- •Аннотация
- •Предисловие
- •Г л а в а 1. Введение в указатели
- •§1. Понятие указателя. Операции разыменования и разадресации
- •§2. Инициализация и присваивание указателей
- •§3. Передача параметров функций с помощью указателей.
- •§4. Распределение динамической памяти.
- •4.1. Операция new
- •4.2. Операция delete
- •Упражнения, тесты.
- •Указатели и массивы
- •§1. Связь указателей и массивов
- •1.1. Указатели и одномерные массивы
- •1.2. Указатели и матрицы
- •Int MyFun (int *X, int n)
- •§3. Операции над указателями при работе с массивами.
- •3.1. Арифметические операции
- •3.2. Операции сравнения.
- •§4. Использование операций над указателями при работе с одномерными массивами
- •4.1. Использование индексов
- •4.2. Указатель в качестве параметра цикла
- •4.3. Использование указателя и индекса
- •§5. Строки.
- •5.1. Общая характеристика строк.
- •5.2. Примеры алгоритмов работы со строками.
- •5.3. Анализ строковых функций.
- •§6. Использование операций над указателями при работе со статической матрицей.
- •Упражнения, тесты.
- •Массивы указателей
- •§1. Статический массив указателей
- •§2. Частично динамическая матрица.
- •Int arr_of_size[n];
- •§3. Статический массив строк
- •§4. Динамический массив указателей
- •4.1. Указатель на указатель
- •4.2. Динамические “матрицы”.
- •Int *arr_of_size;
- •4.3. Передача матрицы в функцию
- •Int a[10]; FunArr1(a, 10,…);
- •Упражнения, тесты.
- •Задачи второго среднего уровня.
- •Структуры и другие типы, определяемые пользователем
- •§1. Структуры
- •Объявление структуры
- •1.2. Работа со структурой.
- •1.3. Вложенные структуры и статические массивы в структурах
- •1.4. Статический массив структур
- •§2. Cтруктуры и указатели
- •2.1. Указатели в структуре.
- •2.2. Указатели на структуру
- •2.3. Динамический массив структур
- •2.4. Ссылка на структуру.
- •2.5. Указатели и вложенные структуры
- •§3. Cтруктуры и функции
- •3.1. Передача полей структуры в функцию.
- •Void MyFun1 (int X, float &y, int *u1, float *u2, char *s);
- •3.2. Передача всей структуры в функцию
- •Void Fun1 (tst s,…);
- •Void Fun2 (tst & s,…);
- •Void Fun3 (tst* s,…);
- •§4. Cтруктуры и классы.
- •§5. Объединения.
- •Представление вещественных чисел в памяти компьютера.
- •§6. Поля битов (битовые поля)
- •Ввод в ы в о д
- •Symbol Code16 Code10 Code2
- •§7. Перечисления
- •Какие из строк (//1 – //9) правильные?
Министерство образования Республики Беларусь
Государственное учреждение образования
“Академия последипломного образования”
Белорусский государственный университет
Н. А. Аленский
ПРАКТИЧЕСКОЕ РУКОВОДСТВО
ПО ЯЗЫКУ С++
Учебное пособие
Минск 2006
УДК 519.682.2(075)
ББК 32.973.26-018.1я7
Р е ц е н з е н т ы :
зав. кафедрой математического обеспечения ЭВМ ФПМ Белгосуниверситета, кандидат технических наук, доцент Л. Ф. Зимянин;
доцент Минского института управления, кандидат технических наук Е. М. Демидович.
Аннотация
Книга содержит теоретический и практический материалы по наиболее сложным для изучения темам языка С++, связанным, прежде всего, с указателями. Кроме этого, рассмотрены структуры и их использование в списках, объединения, поля битов и перечисления, файлы, директивы компиляции и краткая история развития программирования. По каждой теме приведено, как правило, несколько отлаженных программ с подробными комментариями, даны задания на программирование для лабораторных работ, упражнения и тесты для самоконтроля. Задания разделены на два или три уровня сложности и в основном не привязаны к изучаемому языку С++, их можно использовать также при изучении других систем.
Благодаря простому и доступному стилю изложения пособие будет полезным прежде всего тем, кто начинает изучать программирование. Так как материал за редким исключением достаточно сложный, то и профессиональные программисты, желающие освоить новый для них язык, также найдут для себя много интересного Кроме этого, пособие могут использовать преподаватели при разработке лекций, практических занятий, организации самостоятельной работы и, что в литературе обычно отсутствует, для различных форм контроля знаний.
УДК 519.682.2(075)
ББК 32.973.26-018.1я7
Предисловие
Учебное пособие отражает опыт преподавания автором методов программирования на первом курсе механико-математического факультета Белгосуниверситета и в школе юного программиста Академии Последипломного Образования. Большинство тем, рассмотренных в книге, изучаются во втором семестре. Поэтому учебное пособие является продолжением книги [1] этого же автора, содержащей материал первого семестра, обязательный для понимания тем, рассматриваемых здесь.
Так как язык С является подмножеством языка С++, то, изучая его по данному пособию, читатель одновременно осваивает базовые классические средства системного программирования, унаследованные от языка С. В отличие от книг, в которых язык С++ рассматривается как расширение своего предшественника С, настоящее пособие не требует от читателя знакомства со “старым” языком С. Единственное, что необходимо, — это знать материал первого семестра, подробно изложенный, например, в [1] и [2].
Пособие в основном посвящено наиболее сложным методам программирования с использованием указателей. Благодаря этому типу данных язык С++ является более мощным и гибким, а программы — компактными, красивыми и эффективными. В первых двух главах вводится понятие указателей и показан основанный на них метод программирования циклов при работе с одномерными массивами, матрицами и строками. В третьей главе рассматривается использование статического, то есть с фиксированной размерностью в виде константы, и динамического массива указателей в матричных задачах и, как частный случай, при работе с массивом строк. Основное внимание здесь уделяется динамическому распределению памяти.
Четвёртая глава посвящена структурам и их связи с указателями, а также похожим на структуры объединениям, полям битов и перечислениям, которые позволяют некоторые алгоритмы программировать оригинально, не стандартными методами. В пятой главе, являющейся логическим продолжением предыдущей, подробно рассматриваются основанные на структурах и указателях списки и некоторые их разновидности, приведены классические алгоритмы для работы с ними и дано сравнение списков с массивами, показаны их преимущества и недостатки.
В шестой главе изучаются методы программирования с использованием внешней памяти, то есть работа с текстовыми и двоичными файлами. При этом рассматривается как последовательный, так и прямой доступ к данным файла. Кроме решения экономических задач и задач обработки текстовой информации показано, как с помощью файлов можно решать некоторые математические задачи, в частности, матричные, геометрические и другие.
В седьмой главе, являющейся продолжением темы “Функции” из первого семестра, рассматривается такой достаточно сложный вопрос, как связь функций с указателями. Основное внимание уделяется указателям на функции и их массивам. Здесь же показано, как разрабатывать функции с переменным количеством параметров и вводится понятие рекурсивных алгоритмов.
В последних двух главах язык программирования С++ непосредственно не изучается. В восьмой главе показано использование возможностей препроцессорной обработки программ с помощью директив компиляции. В заключительной девятой главе приведена краткая история развития методов и технологий программирования от появления первых ЭВМ до наших дней.
Структура пособия такова, что оно решает одновременно несколько задач. Прежде всего, по каждой теме дан лекционный материал. Вначале каждой главы, как правило, приводится общая характеристика изучаемого элемента языка или метода программирования. Далее в основной части читателю не просто предоставляется фактический материал, набор готовых правил, а изложение вопроса ведётся от примеров. Теоретический материал чаще всего, если это допустимо, рассматривается одновременно с разработкой одной или нескольких программ. Основное внимание уделяется вопросам, недостаточно подробно освещённым в современной литературе, но которые часто используются при разработке реальных проектов. Характерными примерами таких тем являются классификация и анализ строковых функций, списки, указатели на функции и некоторые другие.
В каждой главе можно найти большое количество упражнений и тестов, ответы к которым не приводятся, чтобы инициировать их самостоятельный поиск прежде всего с помощью проведения компьютерного эксперимента. Задания к лабораторным работам для разработки программ в машинном варианте разделены на несколько уровней сложности. Своевременное выполнение заданий самого низкого уровня А оценивается не выше чем на пять баллов, среднего уровня В — на девять баллов. И только решение самых сложных задач из раздела С можно оценить на 10 баллов. Кроме этого, возможны дополнительные критерии оценки (смотри, например, требования к лабораторной работе 2).
Опыт автора показывает, что язык С++ при разумном выборе тем и их последовательности и соответствующей методики изучения можно использовать и при работе со школьниками старших классов. При этом знание другого языка программирования желательно, но не обязательно. Но “планка” при выборе и оценке заданий должна опускаться на один уровень. Основным является простой уровень А, а многие задачи повышенной сложности можно рекомендовать только для работы с особо одарёнными детьми, а также при подготовке олимпиад по информатике.
Таким образом, учебное пособие предназначено прежде всего для студентов высших и средних учебных заведений и школьников, изучающих языки программирования С и С++. Оно будет полезно и профессиональным программистам, несмотря на простой, учебный стиль изложения. Преподавателям пособие поможет подготовить дидактический материал для выполнения лабораторных работ, организации вычислительной практики и самостоятельной работы и различных форм контроля знаний.