- •Издано в рамках Инновационной образовательной программы ннгу: Образовательно-научный центр «Информационно-телекоммуникационные системы: физические основы и математическое обеспечение»
- •Глава 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.
Программа 18. Перегрузка функций
// Файл Module.cpp
#include <iostream.h>
#include <conio.h>
// module: возвращает абсолютную величину целого n
int module(int n)
{
if(n < 0)
return -n;
return n;
}
// module: возвращает абсолютную величину плавающего x
double module(double x)
{
if(x < 0)
return -x;
return x;
}
int main()
{
cout << "module(-3.14) = " << module(-3.14f) << "\n";
cout << "module(-3) = " << module(-3) << "\n";
getch();
return 0;
}
Компилятор различает функции с одним именем по количеству и типам аргументов, а также по типу возвращаемого значения. При выборе подходящей функции из многих перегруженных компилятор ищет такую, которая имеет наилучшее соответствие типов формальных и фактических параметров. Программа печатает:
module(-3.14) = 3.14
module(-3) = 3
Это показывает, что для числа с плавающей точкой -3.14f, имеющего тип float, вызывается функция
double module(double x);
а для целого -3 функция
int module(int n);
7.9.Аргументы функций по умолчанию
У функций общего назначения часто больше аргументов, чем требуется в простых случаях. В программе 19 рассмотрена функция печати целого val. В качестве аргумента функции передается основание системы счисления base, в которой следует печатать целое, но предполагается, что в большинстве случаев целые будут печататься в виде десятичных чисел, поэтому значением по умолчанию для base указано 10.
Программа 19. Аргументы по умолчанию
Функция печати целого print рекурсивная. Если основание системы счисления base <= 10, используются обычные цифры 0, 1, …, 9. Если base > 10, то в качестве цифр используются заглавные латинские буквы A, B, C, D, E, F, G, H,… со значениями: 10, 11, 12, 13, 14, 15, 16, 17,…
// Файл ArgDeflt.cpp
#include <iostream.h>
#include <conio.h>
// print: печать val в системе счисления с основанием base
void print(int val, int base = 10) // 10 – значение для base по умолчанию
{
if(val < 0){
cout.put('-');
print(-val, base);
}
if(val / base > 0) // Если число многозначное,
print(val / base, base); // печатать старшие цифры
int r = val % base; // Остаток от деления
if(r < 10)
cout.put('0' + r);
else
cout.put('A' + r - 10);
}
void main()
{
print(31); cout.put(' '); // По умолчанию base = 10
print(31, 10); cout.put(' ');
print(31, 16); cout.put(' ');
print(31, 2); cout.put('\n');
getch();
}
Программа печатает:
31 31 1F 11111
Для формирования цифр, значения которых больше 9, в функции print использовано выражение:
'A' + r – 10.
Для val = 31 и base = 16 значение остатка r = 31 % 16 = 15. Поэтому
'A' + r – 10 = 'A' + 15 – 10 = 'F'.
Аргументы по умолчанию можно задавать только в конце списка аргументов, например,
int f(int, int = 0, char = 0); // Правильно
int g(int = 0, int = 0, char); // Ошибка
Задачи 70-96. Функции
В приводимых ниже задачах надо написать полностью законченную программу, включающую функцию main, которая должна вызывать функцию, о которой речь идет в задаче.
В задаче 14 приведена формула для величины ежемесячных выплат по кредиту. Напишите функцию, возвращающую в качестве результата величину x. Используя эту функцию, напечатайте таблицу значений выплат x в зависимости от количества месяцев N при некоторой фиксированной величине кредита P и процентной ставке r.
Напишите функцию, возвращающую номер первого элемента массива v, совпадающего с x. Если совпадений нет – возвратить -1.
Напишите функцию, возвращающую номер последнего элемента массива v, совпадающего с x, или -1, если совпадений нет.
Напишите функцию, возвращающую число совпадений x с элементами массива v.
Напишите функцию для нахождения среднего арифметического значения m элементов массива x[] с элементами вещественного типа и функцию для вычисления среднего квадратичного отклонения σ. Формулы следующие:
Напишите функцию, аргументом которой является номер года. Функция должна возвращать 1, если год високосный и 0, если год невисокосный. Год является високосным, если его номер делится на 4 и не делится на 100 или делится на 400. В соответствии с этим правилом 1900-й год был невисокосным, а 2000-й – високосным.
Напишите функцию lower, преобразующую латинские буквы верхнего регистра (заглавные) в латинские буквы нижнего регистра (строчные). Символ, не являющийся буквой, должен возвращаться без изменения. Указание. Используйте тот факт, что как заглавные, так и строчные буквы в кодовой таблице расположены плотно, без разрывов, поэтому разница между кодами одноименных символов одинакова и равна 'a' - 'A'.
Случайные целые числа в диапазоне от -32768 до 32767 можно получить с помощью следующей функции
int casual() // rand: получение псевдослучайных чисел
{ // в диапазоне от -32768 до 32767
static int randx = 1; // Статическая переменная сохраняет свое
// значение между вызовами функции
randx = (randx * 25173 + 13849) % 65536;
return randx;
}
Используя функцию casual(), заполните случайными числами двухмерный массив (квадратную матрицу) размером N * N, где N определите как целую положительную константу. Получите два массива (вектора): вектор, элементы которого равны средним арифметическим значениям строк матрицы, и вектор, элементы которого равны средним арифметическим значениям столбцов матрицы.
Решите предыдущую задачу с использованием библиотечной функции rand, заголовочный файл stdlib.h.
Пусть имеется упорядоченный по возрастанию массив x. Напишите функцию, возвращающую номер элемента массива, имеющего заданное значение y или -1, если такого элемента нет. Используйте метод двоичного (бинарного) поиска: y сравнивается со средним элементом массива; если числа равны, поиск завершается, если y меньше среднего элемента, то y надо искать в левой половине, а иначе – в правой; к выбранной половине применяется тот же алгоритм.
Напишите функцию для вычисления определителя третьего порядка.
Напишите функцию для решения системы линейных уравнений третьего порядка по правилу Крамера.
Напишите функцию вычисления определителя четвертого порядка путем разложения определителя по элементам некоторой строки.
Напишите функцию вычисления определителя четвертого порядка используя разложение определителя по элементам некоторого столбца.
Напишите функцию для решения системы линейных уравнений четвертого порядка по правилу Крамера.
Пусть даны матрица a порядка n и n-мерный вектор b. Напишите функцию, заменяющую заданный столбец матрицы a на вектор b.
Напишите функцию для вычисления обратной матрицы третьего порядка.
Напишите функцию, осуществляющую умножение двух квадратных матриц.
Напишите функцию для вычисления обратной матрицы четвертого порядка.
Напишите функцию, приводящую квадратную матрицу к треугольному виду методом Гаусса. Функция должна возвращать true при успешном выполнении приведения и false, если в процессе приведения встретилось деление на нуль.
Напишите рекурсивную функцию вычисления факториала n!.
Напишите рекурсивную функцию вычисления числа Фибоначчи с заданным номером. Числа Фибоначчи определяются формулами:
f0 = f1 = 1; fn =fn-1 + fn-2 при n = 2, 3,…
Напишите рекурсивную функцию вычисления целой степени целого числа.
Напишите рекурсивную функцию вычисления целой степени вещественного числа.
Напишите рекурсивную функцию нахождения наибольшего общего делителя NOD(m, n) двух целых m, n по алгоритму Эвклида:
пусть m > n, тогда, если n = 0 то NOD(m, n) = m,
если же n > 0, то NOD(m, n) = NOD(m, m – n).
Кроме того, NOD(m, n) = NOD(n, m).
Напишите рекурсивную функцию для нахождения биномиальных коэффициентов, пользуясь их определением:
если
m = 0, n
> 0 или m
= n
0;
если m > n
0;
в остальных случаях.
Напишите рекурсивную функцию вычисления длины строки.
