- •Издано в рамках Инновационной образовательной программы ннгу: Образовательно-научный центр «Информационно-телекоммуникационные системы: физические основы и математическое обеспечение»
- •Глава 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.5.Перечисления
Перечисление – это список целых констант, например,
enum Boolean {NO, YES};
Первая константа NO в перечислении enum имеет значение 0, у следующей костанты YES значение 1. Можно явно указывать значения констант в перечислении, например,
enum escapes {BELL = ’\a’, BACKSPACE = ’\b’, TAB = ’\t’, NEWLINE = ’\n’, VTAB = ’\v’, RETURN = ’\r’};
Если не все константы заданы явно, они продолжают прогрессию, начиная с последнего заданного значения, например,
enum months {JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
Здесь значение FEB есть 2, значение MAR есть 3 и т.д.
Имена констант в различных перечислениях должны отличаться друг от друга.
Значения констант в одном перечислении могут быть одинаковыми.
Константы, объявленные в перечислении, могут участвовать в любых выражениях, где допустимо вхождение целых типов.
Перечисление является типом данных, поэтому можно объявлять переменные типа перечисления. Компилятор не контролирует, входят ли значения, присваиваемые таким переменным, в их тип. В следующей программе использовано перечисление months.
Программа 38. Использование перечислений
// Файл Enum.cpp
enum months {JAN = 1, FEB, MAR, APR, MAY, JUN, JUL,
AUG, SEP, OCT, NOV, DEC};
#include <iostream.h>
#include <conio.h>
int main()
{
months m, nextm, m1; // Три переменные типа months
m = MAR;
nextm = m + 1;
m1 = -1;
cout << "m = " << m << endl;
cout << "nextm = " << nextm << endl;
cout << "m1 = " << m1 << endl;
getch();
return 0;
}
При компиляции строк:
nextm = m + 1;
m1 = -1;
выдается предупреждение:
Warning: Assigning int to months
которое переводится как:
Предупреждение: присваивание целого months.
На рис.67 показано окно просмотра в процессе выполнения программы. Видно, что отладчик показывает значения из диапазона в числовом и символьном представлении.
Рис.68. Значения переменных типа перечисления
Программа выдает:
m = 3
nextm = 4
m1 = -1
14.6. Объединения
Объединение – это структура, для всех полей которой отводится один и тот же участок памяти. Объединения описываются с использованием ключевого слова union. Объединения аналогичны записям с вариантами в Паскале. Использование объединений иллюстрируется приводимой далее программой.
Программа 39. Внутреннее представление float
Программа позволяет исследовать внутреннее представление чисел с плавающей точкой, которое было описано в параграфе 13.7.
Чтобы получить значения отдельных двоичных разрядов внутреннего представления, следует использовать побитовые операторы, однако их нельзя применять непосредственно к числам с плавающей точкой. Поэтому используется объединение, включающее поле типа float, поле типа массив из 4-х символов и целое поле long, которое, как и float, имеет размер 4 байта.
// Файл InnPrsnt.cpp
typedef union{ // Объединение можно рассматривать
float f; // или как float
char str[sizeof(float)]; // или как массив символов
unsigned long l; // или как long
}float_chars_long;
С помощью typedef объединению присвоено имя float_chars_long. Отводимые объединению 4 байта можно рассматривать либо как число с плавающей точкой, либо как массив символов, либо как длинное целое. Получая, например, двоичное представление длинного целого, мы получим одновременно представление float.
Функция prn_long_bin выводит двоичные цифры для целого числа типа long.
// Продолжение файла InnPrsnt.cpp
#include <iostream.h>
// prn_long_bin: печать двоичного представления long
void prn_long_bin(unsigned long x)
{
int i,
n = sizeof(unsigned long) * 8; // n – число двоичных разрядов в long
unsigned long h;
h = 1L << n - 1; // В старшем разряде у h 1 и 0 в остальных
for(i = 1; i <= n; i++){
cout << ((x & h) != 0) << (i % 8 ? "" : " ");
x <<= 1;
}
}
Длинная целочисленная константа 1L представляется в памяти единичкой в младшем правом разряде. После ее сдвига на n-1 разряд влево, получается величина h, у которой имеется только одна единичка в старшем левом разряде, остальные разряды нулевые. Результат побитового сравнения
x & h
будет отличен от нуля, если x также имеет в старшем разряде 1. В этом случае на экран выводится 1, в противном случае выводится 0. После каждого сравнения x сдвигается влево. Для большей наглядности содержимое одного байта отделяется от другого пробелами путем печати выражения
(i % 8 ?"" : " "),
в котором i есть номер разряда. Когда остаток от деления номера i на 8 равен нулю, выводится пробел, в остальных случаях пустая строка.
Программа вводит число с плавающей точкой, печатает его, а также печатает содержимое 4-х байтов, отводимых под него, в шестнадцатеричной и в двоичной форме.
// Продолжение файла InnPrsnt.cpp
#include <conio.h>
void main()
{
float_chars_long var;
char c, i;
clrscr();
cout<<"\n Внутреннее представление чисел с плавающей точкой \n";
cout << "\nЧисло As hex As bin\n";
while((cin >> var.f) != NULL){ // Пока вводятся числа
gotoxy(1, wherey() - 1); // Перевод курсора в начало
// предыдущей строки экрана
// wherey() возвращает номер строки, в которой находится курсор
cout << var.f << '\t'; // Печать числа
for(i = 1; i <= sizeof(float); i++){ // Печать содержимого байтов,
c = var.str[sizeof(float) - i]; // отведенных числу
cout << hex << ((c & 0Xf0) >> 4) << (c & 0X0f) << ' ';
}
cout.put('\t'); // Вывод табуляции для выравнивания
prn_long_bin(var.l); // Печать двоичного представления
cout << endl;
}
getch();
}
При печати шестнадцатеричного представления объединение рассматривается как массив символов. Так как старшие разряды двоичного представления чисел располагаются в байтах с большими адресами, печать производится, начиная с символа массива с наибольшим индексом. Содержимое каждого байта печатается в виде двух 16-разрядных цифр, начиная со старшего полубайта. В выражении
(c & 0Xf0) >> 4
из символа с вырезаются 4 старших разряда и прижимаются к правому краю. С помощью выражения
c & 0X0f
получаются 4 младших бита символа c. После печати содержимого каждого байта выводится пробел. Эти действия обеспечивают печать внутреннего представления числа в принятой форме записи слева направо.
Входной поток настраивается на печать целых в шестнадцатеричном виде благодаря посылке в него величины
hex,
определенной в iostream.h. Сделанная настройка действует до явного ее изменения. Величина hex является манипулятором. Так называются специальные функции, которые позволяют управлять форматом выводимых чисел. Кроме hex, имеется еще манипуляторы:
dec – использование десятичной системы при вводе и выводе;
oct – использование восьмеричной системы при вводе и выводе.
После того как число набрано, следует нажать Enter, что приводит в переводу курсора на следующую строку. Чтобы диалог с программой выглядел более аккуратно, курсор переводится в начало той строки, где набиралось вводимое число с использованием функции
int wherey(),
возвращающей номер строки, в которой расположен курсор. Позицию курсора в строке выдает функция
int wherex().
Для завершения работы с программой следует нажать Ctrl+Z и Enter.
Далее приводится листинг, выданный программой:
Печать внутреннего представления чисел с плавающей точкой
Число As hex As bin
1 3f 80 00 00 00111111 10000000 00000000 00000000
2 40 00 00 00 01000000 00000000 00000000 00000000
5.3 40 a9 99 9a 01000000 10101001 10011001 10011010
0.1 3d cc cc cd 00111101 11001100 11001100 11001101
0.3 3e 99 99 9a 00111110 10011001 10011001 10011010
10 41 20 00 00 01000001 00100000 00000000 00000000
-1 bf 80 00 00 10111111 10000000 00000000 00000000
-2 c0 00 00 00 11000000 00000000 00000000 00000000
-4 c0 80 00 00 11000000 10000000 00000000 00000000
4.5 40 90 00 00 01000000 10010000 00000000 00000000
Из листинга видно, что число 5.3 округлено с избытком, так как старший отброшенный разряд мантиссы есть 1.
