- •Издано в рамках Инновационной образовательной программы ннгу: Образовательно-научный центр «Информационно-телекоммуникационные системы: физические основы и математическое обеспечение»
- •Глава 1. Основные понятия 13
- •Глава 3. Работа с числовыми данными 42
- •Глава 4. Операторы. Ключевые слова 52
- •Глава 5. Управление и циклы 64
- •Глава 6. Массивы 77
- •Глава 7. Функции 84
- •Глава 8. Символы и строки 102
- •Глава 9. Препроцессор 113
- •Глава 10. Указатели и ссылки 119
- •Глава 11. О файлах и командной строке 133
- •Глава 12. Работа с экраном дисплея 145
- •Глава 13. Внутреннее представление чисел 157
- •Глава 14. Структуры, перечисления, объединения 179
- •Глава 15. Классы 204
- •Глава 16. Программы из нескольких файлов 233
- •Глава 21. Шаблоны, исключения 321
- •Предисловие
- •Глава 1.Основные понятия
- •1.1.Элементы языка программирования
- •Алфавит
- •Лексемы
- •Выражения
- •Функции
- •Комментарии
- •1.2.Процесс создания программы
- •1.3.Первая программа Программа 1. Приветствие
- •1.4.Состав программы
- •Загрузка
- •Работа с окнами
- •Настройка среды
- •Указание каталогов библиотек
- •Подключение графической библиотеки
- •Назначение текущего каталога
- •Работа с блоками текста в редакторе
- •Выполнение программы
- •Отладка программ
- •Программа 2. Деление чисел
- •Синтаксические ошибки
- •Ошибки в процессе работы программы
- •Трассировка программ
- •Просмотр текущих значений выражений
- •Разработка консольных приложений
- •Программа 3. Hello
- •Выполнение и отладка программы
- •Файлы проекта
- •Автоматическая генерация кода
- •Особенности ввода и вывода
- •Глава 3.Работа с числовыми данными
- •3.1.Целые типы
- •Целые константы
- •Программа 4. Операции над целыми
- •3.2.Числа с плавающей точкой
- •Плавающие константы
- •3.3.Ввод и вывод чисел
- •Программа 5. Точность плавающих чисел
- •3.4.Логический тип и логические операции
- •3.5.Математические функции
- •Глава 4.Операторы. Ключевые слова
- •4.1.Операторы
- •Унарные операторы
- •Бинарные операторы
- •Оператор запятая
- •Условное выражение
- •Операторы присваивания
- •4.2.Приоритеты операторов
- •4.3.Ключевые слова
- •Продолжение таблицы 23. Ключевые слова стандарта языка Cи
- •4.4.Структура программы
- •Объявления переменных
- •Объявления и определения
- •Инструкции и блоки
- •4.5.Константы
- •Задачи 1-17 . Простейшие вычисления
- •Глава 5.Управление и циклы
- •5.1.Условный оператор
- •Программа 6. Максимальное из двух чисел
- •5.2.Операторы цикла
- •Цикл с предусловием while
- •Программа 7. Суммирование цифр целого
- •Цикл for
- •Программа 8. Поиск максимума и минимума
- •Цикл do-while
- •Программа 9. Вычисление квадратного корня
- •5.3.Переключатель
- •Программа 10. День недели
- •5.4.Операторы break и continue
- •Программа 11. Сумма положительных чисел
- •Задачи 18-52. Выбор и циклы
- •Глава 6.Массивы
- •6.1.Одномерные массивы
- •Программа 12. Проверка упорядоченности массива
- •6.2.Двумерные массивы
- •Программа 13. Подсчет выручки
- •Задачи 53-69. Одно- и двумерные массивы
- •Глава 7.Функции
- •7.1.Определение функции
- •7.2.Формальные параметры и фактические аргументы
- •Пpограмма.14. Степени целых чисел
- •7.3.Автоматические и статические переменные
- •Программа 15. Автоматические и статические переменные
- •7.4.Прототипы функций
- •7.5.Массивы как аргументы функций
- •7.6.Внешние переменные
- •Программа 16. Сортировка массива
- •7.7.Рекурсия
- •Программа 17. Рекурсивная печать целого
- •7.8.Перегруженные имена функций
- •Программа 18. Перегрузка функций
- •7.9.Аргументы функций по умолчанию
- •Программа 19. Аргументы по умолчанию
- •Задачи 70-96. Функции
- •Глава 8.Символы и строки
- •8.1.Символы
- •Символьные константы
- •Программа 20. Представления символов
- •Ввод и вывод символов
- •Программа 22. Печать текста по словам
- •8.2.Строки символов
- •Строковые константы
- •Ввод и вывод строк
- •Средства работы со строками
- •Программа 23. Реверсирование строк
- •Задачи 97-121. Символы и строки
- •Глава 9.Препроцессор
- •9.1.Директивы препроцессора
- •9.2.Макросы
- •Программа 24. Возможности препроцессора
- •Задачи 122-124. Макросы
- •Глава 10.Указатели и ссылки
- •10.1.Указатели и адреса
- •Программа 25. Расчет треугольника
- •10.2.Указатели и массивы
- •10.3.Адресная арифметика
- •10.4.Символьные указатели
- •10.5.Массивы указателей
- •Программа 26. Названия месяцев
- •10.6.Указатели на функции
- •Программа 27. Поиск максимума функции
- •10.7.Ссылки
- •Программа 28. Использование ссылок
- •10.8.Операторы new и delete
- •Программа 29. Выделение и освобождение памяти
- •Задачи 125-134. Указатели и ссылки
- •Глава 11.О файлах и командной строке
- •11.1.Знакомство с файлами
- •Программа 30. Копирование файлов
- •11.2.Командная строка
- •11.3.Перенаправление стандартного ввода и вывода на файл
- •11.4.Аргументы командной строки
- •Программа 31. Эхо аргументов командной строки
- •Программа 32. Печать строк, содержащих образец
- •Задачи 135-147. Файлы и командная строка
- •Глава 12.Работа с экраном дисплея
- •12.1.Текстовый режим
- •Программа 33. Российский флаг
- •12.2.Графический режим
- •Графические драйверы и режимы
- •Инициализация графики
- •Функции рисования
- •Программа 34. Звезда
- •Задачи 148-158. Работа с экраном
- •Глава 13.Внутреннее представление чисел
- •13.1.Двоичная система счисления
- •13.2.Беззнаковые целые
- •13.3.Двоичный дополнительный код
- •13.4.Двоичный код с избытком
- •13.5.Побитовые операторы
- •Программа 35. Побитовые операторы
- •13.6.Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8.Преобразование типов
- •Значения логических выражений
- •Арифметические преобразования
- •Преобразование при присваивании
- •Явное приведение типа
- •Задачи 159-166. Побитовые операторы
- •Глава 14.Структуры, перечисления, объединения
- •14.1.Объявление структур
- •14.2.Структуры и функции
- •14.3.Указатели на структуры
- •Программа 36. Точки и прямоугольники на экране
- •14.4.Массивы структур
- •Программа 37. Подсчет ключевых слов
- •14.5.Перечисления
- •Программа 38. Использование перечислений
- •14.6. Объединения
- •Программа 39. Внутреннее представление float
- •14.7.Битовые поля
- •14.8.О бинарных файлах
- •Программа 40. Анализ успеваемости
- •Задачи 167-174. Структуры
- •Глава 15.Классы
- •Программа 41. Время как структура
- •15.2.Встроенные функции
- •15.3.Классы. Скрытие данных
- •Программа 42. Класс дат
- •15.4.Конструкторы
- •Программа 43. Конструкторы в классе дат
- •15.5.Статические члены класса
- •Программа 44. Размер класса и объектов класса
- •15.6.Друзья класса
- •Программа 45. Статические члены и друзья класса
- •15.7.Копирование объектов класса
- •Программа 46. Копирование объектов
- •15.8.Управление доступом
- •Структуры и классы
- •Правила доступа
- •15.9.Ссылка на себя
- •Программа 47. Модификация дат
- •15.10.Деструкторы
- •Программа 48. Деструктор в классе дат
- •Программа 49. Многоугольники
- •Задачи 175-185. Работа с классами
- •Глава 16.Программы из нескольких файлов
- •16.1.Работа с проектами
- •16.2.Область действия имен
- •Программа 50. Глобальные и локальные имена
- •Статические имена
- •Программа 51. Сумматор чисел
- •16.3.Заголовочные файлы
- •Страж включения
- •Понятие стека
- •Программа 52. Реализация стека в виде массива
- •16.4.Пространства имен
- •Стандартные пространства имен
- •Задачи 186-189. Работа со стеком
- •Глава 17.Перегрузка операторов
- •Программа 53. Обыкновенные дроби
- •17.1.Правила перегрузки операторов
- •Программа 54. Комплексные числа
- •Задачи 190-196. Перегрузка операторов
- •Глава 18.Конструктор копирования и оператор присваивания
- •18.1.Проблемы при копировании
- •Программа 55. Вектора на плоскости
- •Задачи 197-198. Конструктор копирования
- •Глава 19.Ввод и вывод
- •19.1.Вывод
- •19.2.Ввод
- •19.3.Ввод и вывод определяемых пользователем типов
- •Программа 56. Перегрузка операторов ввода/вывода
- •19.4.Работа с файлами
- •Программа 57. Сравнение текстового и бинарного файлов
- •Задачи 199-202. Ввод и вывод
- •Глава 20.Взаимоотношения классов
- •20.1.Объекты как члены класса
- •20.2.Конструкторы встроенных типов
- •Программа 58. Личные данные
- •20.3.Наследование
- •Пример наследования
- •Программа 59. Наследование
- •Управление доступом при наследовании
- •Наследование и конструкторы
- •Программа 60. Производный класс личных данных
- •20.4. Виртуальные функции
- •Программа 61. Невиртуальные функции
- •Программа 62. Виртуальные функции
- •20.5.Абстрактные классы
- •Программа 63. Абстрактный класс фигур
- •Вызов виртуальных функций
- •20.6. Совместимость типов
- •20.7.Множественное наследование
- •Программа 64. Системы уравнений Класс алгебраических векторов Vector
- •Класс прямоугольных матриц
- •Объявление класса Matrix
- •Реализация класса Matrix
- •Класс систем линейных уравнений
- •Пример использования классов
- •Задачи 203-212. Наследование классов
- •Глава 21.Шаблоны, исключения
- •21.1.Шаблоны
- •21.2.Шаблоны функций
- •Программа 65. Объявление и определение шаблона функции
- •21.3.Классы и шаблоны
- •Программа 66. Шаблон классов векторов
- •Программа 67. Шаблон классов динамических массивов
- •21.4.Обработка исключений
- •Программа 68. Расчет нод
- •21.5.Стандартная библиотека шаблонов
- •Программа 69. Использование шаблона векторов
- •Литература
- •Предметный указатель
- •603950, Н. Новгород, пр. Гагарина, 23
- •603000, Н. Новгород, ул. Б. Покровская, 37.
14.7.Битовые поля
Имеется возможность размещать в одном слове несколько объектов, что позволяет экономить память. Если известен диапазон значений некоторой величины, то нетрудно оценить количество бит для ее кодирования. Совокупность бит, необходимая для кодирования величины, называется полем. Битовые поля используются в качестве элементов структур. При объявлении таких элементов указывается их ширина в битах. Ширина битового поля не может превышать ширину слова, но структура, объединяющая битовые поля, может занимать несколько слов. Безымянные битовые поля служат для пропуска нескольких разрядов. Ширина, равная нулю, используется, когда требуется выйти на границу следующего слова. Битовые поля размещаются в слове, начиная с его младших разрядов. С битовыми полями можно работать как с малыми целыми числами.
14.8.О бинарных файлах
Для того, чтобы открыть файл как бинарный, функцию open следует вызвать с двумя аргументами. Первый аргумент задает имя открываемого файла, а второй определяет режим работы с файлом. Таких режимов может быть три: чтение, запись, чтение и запись (изменение). В файле fstream.h определены специальные константы – флаги, имеющие по одной единичке в своих разрядах, которые можно использовать для указания режима работы с файлами:
ios::in – открыть файл на чтение,
ios::out – открыть файл на запись,
ios::binary – открыть файл как бинарный, а не как текстовый.
Данные флаги можно комбинировать с помощью побитового логического оператора ИЛИ (|).
Для чтения из бинарного потока применяют функцию:
read(char *str, size_t count);
которая читает из потока count байтов и сохраняет их в массиве, начало которого указывает str.
Для записи в бинарный поток служит функция:
write(const char *str, size_t count);
направляющая в поток count байтов из массива, на который указывает str.
Позиции в файле нумеруются с нуля, поэтому поток можно представлять себе как массив. С каждым файловым потоком связан текущий указатель файла, указывающий на байт, который будет прочитан или записан при следующей операции ввода/вывода. Положением текущего указателя в выходном потоке можно управлять с помощью функции:
ostream& seekp(long offs, seek_dir dir);
Текущую позицию во входном потоке можно изменить функцией
istream& seekg(long offs, seek_dir dir);
Первый параметр offs этих функций задает число позиций, на которое надо переместить текущий указатель, а второй параметр dir назначает точку отсчета, от которой надо произвести смещение. Для указания точки отсчета можно использовать перечислимые константы из файла iostream.h:
enum seek_dir { beg, cur, end };
beg – смещаться от начала файла,
cur – смещаться от текущей позиции,
end – смещаться от конца файла.
Например, в программе 40 открывается файловый поток f на чтение и запись. Текущий указатель перемещается в начало файла следующей инструкцией:
f.seekg(0, ios::beg);
Программа 40. Анализ успеваемости
В данном примере речь идет об анализе успеваемости некоторой студенческой группы в одну из экзаменационных сессий. Программа создает файл, содержащий фамилии студентов и их оценки за 4 экзамена. Пусть экзаменационная оценка может иметь 4 значения: неуд, уд, хор и отл, в этом случае для ее кодирования достаточно двух бит, так как с помощью двух бит можно создать 4 комбинации. В программе объявлена структура marks с четырьмя полями шириной по 2 бита, которые могут содержать значения оценок. Таким образом, все 4 оценки студента можно разместить в одном байте.
Для хранения как фамилии студента, так и его оценок используется структура student.
Предусмотрены два режима работы программы. Если первую строку программы записать в виде
# define EXIST_FILE 0 // Нет файла с результатами сессии
то программа попросит ввести имя создаваемого файла, в который будет записывать вводимые данные. Если первая строка имеет вид
# define EXIST_FILE 1 // Имеется файл с результатами сессии
программа работает в предположении, что файл с информацией уже существует. Программу нужно, естественно, перекомпилировать, если изменен вариант ее работы. Эти две возможности реализуются средствами препроцессора и демонстрируют условную компиляцию, когда создаются разные программы в зависимости от значения некоторого макроса. Проверка значения макроса осуществляется директивой препроцессора #if.
Для обоих вариантов работы программы выводится содержимое файла, содержащего результаты сессии, который считается бинарным.
// Файл Progress.cpp
# define EXIST_FILE 0 // Нет файла с результатами сессии
/* Макрос EXIST_FILE устанавливается в нуль,
если создается новый файл, и в единицу, если файл существует */
struct marks {
unsigned ex1: 2; // Целое значение после
unsigned ex2: 2; // двоеточия – это ширина поля в битах
unsigned ex3: 2;
unsigned ex4: 2;
};
struct student{
char fam[20]; // fam - стpока для фамилии
marks rez; // rez - поле с оценками
};
enum numbers{neud = 0, ud = 1, hor = 2, otl = 3};
/* Пеpечисление numbers вводит имена для заданных
целых значений */
#include <iostream.h>
// prn_mrk: печать оценки в словесной форме
void prn_mrk(int mrk)
{
mrk == neud ? cout << "неуд " : mrk == ud ? cout << "уд " :
mrk == hor ? cout << "хор " : cout << "отл ";
}
#include <stdlib.h>
#include <fstream.h>
#include <conio.h>
void main()
{
student st;
int m1, m2, m3, m4, i;
char filename [20]; // Массив для имени файла
fstream f; // Файловый поток
cout << "\n Программа анализа результатов сессии \n";
cout << "Введите имя файла \n";
cin.getline(filename, 20);
#if EXIST_FILE // Если файл существует
f.open(filename, ios::in|ios::binary); // Файл открывается на чтение
// как бинарный
if(!f){ // Если файл открыть не удалось
cerr << " Файл не найден \n";
exit(1); // завершение программы
}
#endif
#if !EXIST_FILE // Если файла пока нет
f.open(filename, ios::in|ios::out|ios::binary); // Файл открывается на
// чтение и запись как бинарный
if(!f){ // Если файл открыть не удалось
cerr << " Ошибка открытия файла \n";
exit(1); // завершение программы
}
cout << "Вводите фамилии студентов и их оценки "
"в виде чисел (2, 3, 4, 5). \n"
"Разделитель - пробел, конец ввода Ctrl+Z.\n";
while(cin >> st.fam >> m1 >>m2 >>m3 >> m4){ // Пока не достигнут
// конец входного потока
st.rez.ex1 = m1 - 2; // Оценки хранятся в виде,
st.rez.ex2 = m2 - 2; // уменьшенном на две единицы,
st.rez.ex3 = m3 - 2; // так как отведенные для них поля
st.rez.ex4 = m4 - 2; // могут хранить значения только от 0 до 3
// Запись информации о студенте в файл
f.write((char*)(&st), sizeof(student));
}
#endif
f.seekg(0, ios::beg); // Переход к началу файла
cout << "\n РЕЗУЛЬТАТЫ СЕССИИ \n";
// Чтение и печать содержимого файла
while(f.read((char*)&st, sizeof(student)) != NULL){
cout << st.fam << ": " << st.rez.ex1 + 2 << ", " << st.rez.ex2 + 2
<< ", "<< st.rez.ex3 + 2 << ", " << st.rez.ex4 + 2;
cout << "(";
prn_mrk(st.rez.ex1); // Печать оценок
prn_mrk(st.rez.ex2); // в словесной форме
prn_mrk(st.rez.ex3);
prn_mrk(st.rez.ex4);
cout << ")\n";
}
f.close();
getch();
}
Далее приведены результаты двух запусков программы. Первый запуск был сделан в предположении, что файл данных не существовал (# define EXIST_FILE 0):
Пpогpамма анализа результатов сессии
Введите имя файла
rezstud.cpp
Вводите фамилии студентов и их оценки в виде чисел (2, 3, 4, 5).
Разделитель - пробел, конец ввода Ctrl+Z.
Иванов 3 4 5 3
Петров 4 4 3 5
Сидоров 4 4 5 4
^Z
РЕЗУЛЬТАТЫ СЕССИИ
Иванов: 3, 4, 5, 3( уд хор отл уд )
Петров: 4, 4, 3, 5( хор хор уд отл )
Сидоров: 4, 4, 5, 4( хор хор отл хор )
Второй запуск был сделан в предположении, что файл данных уже создан (# define EXIST_FILE 1):
Пpогpамма анализа результатов сессии
Введите имя файла
rezstud.cpp
РЕЗУЛЬТАТЫ СЕССИИ
Иванов: 3, 4, 5, 3( уд хор отл уд )
Петров: 4, 4, 3, 5( хор хор уд отл )
Сидоров: 4, 4, 5, 4( хор хор отл хор )
