- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
64
Глава 5. Управление и циклы
Инструкции программы выполняются последовательно в том порядке, как они написаны. Естественный ход выполнения инструкций можно изменить с помощью управляющих операторов.
5.1. Условный оператор
Условный оператор записывается в виде:
if(выр)
инструкция1 else
инструкция2
причем часть else может отсутствовать. Сначала вычисляется выражение выр. Если оно истинно (не нуль), то выполняется инструкция1, если выр ложно (нуль) и есть часть else, выполняется
инструкция2.
Если имеется несколько вложенных условных операторов, то else- часть связывается с ближайшей if-частью. Например, во фрагменте
if(n > 0) if(a > b)
z = a; else
z = b;
else относится к внутреннему if.
Для выбора одного из многих вариантов можно записывать вложенные условные операторы в виде:
if(выр1)
инструкция1 else if(выр2)
инструкция2 else if(выр3)
инструкция3 else
инструкция4
Как только встретится истинное выражение, выполняется соответствующая инструкция, и проверки завершаются. Последняя инструкция4 выполняется, если ни одно выражение не будет истинным.
Управление и циклы 65
Программа 6. Максимальное из двух чисел
В данной программе оператор if используется для выбора максимального из двух вводимых чисел.
//Файл MaxOfTwo.cpp
//Программа вводит два целых числа и печатает наибольшее из них #include <iostream.h>
#include <conio.h> |
// Для доступа к getch() |
|
int main() |
|
|
{ |
|
|
int x, y, max; |
|
|
cout << "\nВведите первое число: "; |
cin >> x; |
|
cout << "Введите второе число: "; |
cin >> y; |
|
if(x > y) |
|
|
max = x; else
max = y;
cout << "Максимальное число max = " << max << "\n";
getch(); |
// Ожидаем нажатия любой клавиши |
return 0; |
|
} |
|
Далее приведен диалог с программой:
Введите первое число: 32 Введите второе число: 66 Максимальное число max = 66
5.2. Операторы цикла
Операторы цикла дают возможность многократно выполнять один и тот же участок программы, проводя одинаковые вычисления с различными данными. В языке C++ имеются три вида циклов.
Цикл с предусловием while
Данный цикл записывается в виде:
while(выр) |
|
инструкция |
// Тело цикла |
Сначала вычисляется выражение выр. Если оно истинно (не нуль), выполняется инструкция и снова вычисляется выр. Повторения цикла завершаются, когда выр станет ложным (нулем).
Инструкция, выполняемая в цикле, называется телом цикла.
Так как условие повторения проверяется до выполнения тела цикла, данный цикл называют циклом с предусловием.
66 5
Тело цикла может не выполниться ни одного раза, если выр окажется ложным при первом его вычислении.
Программа 7. Суммирование цифр целого
Программа, вводит целое число и формирует другое число, равное сумме десятичных цифр первого.
Алгоритм решения задачи состоит в том, что находится последняя цифра числа, как остаток от деления числа на 10. Например, если исходное число n = 1234, то выражение n % 10 равно 4. Значение этого выражения добавляется к переменной m, начальное значение которой равно 0. Затем у числа n отбрасывается последняя цифра путем присваивания ему значения n / 10. Описанные действия повторяются, пока число n не станет равным нулю. Для организации повторений использован цикл while, а условием повторения является n > 0.
// Файл SumDigit.cpp |
|
#include <iostream.h> |
|
#include <conio.h> |
|
int main() |
|
{ |
|
int n, |
// Заданное число |
sum; |
// Сумма цифр |
cout << "\nВведите целое число: "; |
|
cin >> n; |
// Ввод числа |
if(n < 0){ |
// Если число отрицательное |
cout << "Требуется положительное число \n"; |
|
return 1; |
// Завершение программы |
} |
|
sum = 0; |
|
while(n > 0){ |
// Пока в числе есть цифры, добавляем |
sum = sum + n % 10; // к сумме последнюю цифру числа |
|
n = n / 10; |
// и отбрасываем у числа последнюю цифру |
} |
|
cout << "Сумма цифр числа: " << sum << "\n"; getch();
return 0;
}
После ввода числа n в условном операторе if проверяется, не меньше ли оно нуля. Если результат сравнения есть истина, то есть введено отрицательное число, выводится предупреждающее сообщение и функция main завершается инструкцией return 1; при этом завершается и вся программа.
Возвращаемое функцией main значение может быть обработано внешней программой, например, операционной системой. Принято
Управление и циклы 67
возвращать 0 при нормальном завершении программы и значение, отличное от 0, при возникновении каких-то проблем.
Если введенное число положительно, программа выполняется дальше. Переменной sum присваивается начальное нулевое значение, в ней будет накапливаться сумма цифр. Последняя цифра, получаемая в цикле как остаток от деления числа на 10, добавляется к сумме, затем последняя цифра числа отбрасывается путем его деления на 10. Вот пример работы данной программы:
Введите целое число: 1234 Сумма цифр числа: 10
Цикл for
Конструкция цикла for имеет вид:
for(выр1; выр2; выр3) инструкция
Любое из трех выражений в скобках может отсутствовать, но точки с запятой опускать нельзя. Если отсутствует выр2, то оно считается истинным. Этот цикл эквивалентен конструкции:
выр1; while(выр2){
инструкция
выр3;
}
Выражение выр1 вычисляется единственный раз перед началом работы цикла. Условием повторения цикла является истинность выр2. После выполнения инструкции в теле цикла вычисляется выр3.
Цикл for можно рассматривать как цикл с параметром, обеспечивающий заданное число повторений, например, цикл
for(i = 0; i < n; i++)
…
повторяется ровно n раз. Начальное значение для i равно 0, после каждого выполнения тела цикла i увеличивается на 1 за счет выражения i++. Таким образом, i пробегает последовательность значений: 0, 1, 2,…, n-1, n. После завершения работы цикла его параметр i сохраняет последнее полученное значение i = n, которое можно использовать в дальнейших вычислениях.
68 5
Программа 8. Поиск максимума и минимума
Программа предлагает ввести заданное количество чисел, суммирует их, определяет максимальное и минимальное число и их номера в последовательности. В программе принято, что числа последовательности нумеруются начиная с нуля. Ввод и анализ данных выполняется в цикле for.
//Файл FindMxMn.cpp
//Определение минимального и максимального из вводимых
//чисел, их номеров в последовательности и суммы #include <iostream.h>
#include <conio.h> int main()
{
int n = 5; |
// Количество вводимых чисел |
int x; |
// Вводимое число |
int i; |
// Параметр цикла |
int xmax, xmin; |
// Максимальное и минимальное числа |
int nmax, nmin; |
// Номера максимального и минимального чисел |
int sum = 0; |
// Сумма |
cout << "\nВведите " << n << " чисел: "; // Приглашение к вводу |
|
cin >> x; |
// Ввод первого числа |
xmax = xmin = x; |
// Предполагаем что первое число |
nmin = nmax = 0; |
// и максимальное и минимальное |
sum = sum + x; |
// Добавление числа к сумме |
for(i = 1; i < n; i++){ |
// Цикл для ввода n-1 числа |
cin >> x; |
|
sum += x; |
// Добавление числа к сумме |
if(x > xmax){ |
// Если встретилось большее число, |
xmax = x; |
// запоминаем его и |
nmax = i; |
// запоминаем его номер |
} |
|
if(x < xmin){ |
// Если встретилось меньшее число, |
xmin = x; |
// запоминаем его и |
nmin = i; |
// запоминаем его номер |
} |
|
} |
// Конец цикла for |
// Вывод результатов
cout<< "\n Максимальное число " << xmax << ", его номер " << nmax; cout<< "\n Минимальное число " << xmin << ", его номер " << nmin; cout << "\n Сумма чисел sum = " << sum;
getch(); return 0;
}
Управление и циклы 69
При добавлении очередного числа к сумме использованы две конструкции: sum = sum + x; и sum += x;. Они эквивалентны, но вторая короче.
Пример работы программы:
Введите 5 чисел: 79 65 98 123 64 Максимальное число 123, его номер 3 Минимальное число 64, его номер 4 Сумма чисел sum = 429
Цикл do-while
Данный цикл записывается в виде:
do
инструкция while(выр)
Работа данного цикла состоит в следующем. Сначала выполняется инструкция, затем вычисляется выражение выр и проверяется его значение. Если выр истинно, снова выполняется инструкция. Когда выр становится ложным, цикл прекращает работу. Так как условие повторения цикла проверяется после выполнения тела цикла, он называется циклом с постусловием. Данный цикл целесообразно применять, когда тело цикла должно быть выполнено, по крайней мере, один раз.
Программа 9. Вычисление квадратного корня
Приближенное значение квадратного корня из некоторого положительного числа a можно найти с помощью последовательных приближений:
|
|
|
1 |
æ |
|
|
a |
ö |
x |
n+ 1 |
= |
|
ç x |
n |
+ |
|
÷, n = 0,1, 2,... |
|
|
|||||||
|
|
2 |
ç |
|
|
÷ |
||
|
|
|
è |
|
|
xn ø |
Начальным приближением x0 может быть любое положительное число, например, x0 = 1 или x0 = a . Итерационный процесс следует
продолжать до тех пор пока два последовательных приближения не станут достаточно близки, что можно записать в виде:
xn+1 − xn ≤ ε ,
где ε – заданная малая величина – точность вычисления.
Далее приведен текст программы, реализующий процесс последовательных приближений для вычисления корня.
70 5
//Файл SqrtRoot.cpp
//Вычисление квадратного корня #include <iostream.h>
#include <conio.h>
#include <math.h> |
|
// Для fabs |
int main() |
|
|
{ |
|
|
double a, xn, xn1, eps; |
|
|
do{ |
|
// Ввод и проверка исходных данных |
cout << "Введите число > 0: "; |
||
cin >> a; |
|
|
cout << "Введите точность: "; |
||
cin >> eps; |
|
|
}while(a < 0 || eps <= 0); |
// Повторяем ввод при поступлении |
|
|
// отрицательного числа или неверной точности |
|
xn1 = a; |
|
// Начальное приближение |
cout << xn1 << "\n"; |
|
|
do{ |
|
|
xn = xn1; |
// Следующее приближение делаем предыдущим |
|
xn1 = (xn + a / xn) / 2.0; |
// Новое приближение |
|
cout << xn1 << "\n"; |
|
|
}while(fabs(xn1 - xn) > eps); |
// Пока не достигнута нужная точность, |
|
getch(); |
|
|
return 0;
}
При вычислении 2 программа выдает следующее:
Введите число > 0: 2 Введите точность: 0.0001 2.000000 1.500000 1.416667 1.414216 1.414214
Видно, что уже пятое приближение имеет заданную точность. Обсудим данную программу.
Включение заголовочного файла math.h необходимо, так как в программе имеется обращение к объявленной в этом файле функции
double fabs(double x);
вычисляющей абсолютное значение для числа с плавающей точкой. Число a, два последовательных приближения к квадратному корню
xn, xn1 и точность eps определены как числа с плавающей точкой двойной точности double.