
- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.6. Преобразование типов
- •1.7. Константы
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
2.2.2. Цикл «while»
Цикл «while» инициализируется единственным выражением – условным, при этом проверка условия выполняется перед очередной итерацией. Такой цикл называется циклом с предусловием.
Листинг 2.7. Возведение в степень.
#include <iostream>
using namespace std;
int main (void)
{
unsigned int x;
int y, z = 1;
cin >> y >> x;
while (x--)
z *= y;
cout << z << endl;
return 0;
}
2.2.3. Цикл «do – while»
Цикл «do – while» аналогичен циклу «while», за исключением того, что проверка условия выполняется после тела цикла, в связи с чем «do – while» называется циклом с постусловием, т.е. первая итерация выполняется вне зависимости от истинности условия.
Листинг 2.8. Поиск делителей вводимого числа.
#include <iostream>
using namespace std;
int main (void)
{
unsigned int x;
cin >> x;
unsigned int i = x;
do
cout << i << ( x % i ? " no" : " yes" ) << endl;
while (--i);
return 0;
}
2.2.4. Операторы циклов
В ряде случаев, в особенности при критичности времени вычислений, выполнение отдельных итераций не является необходимым, более того, увеличивает общее время выполнеия. Избежать этих итераций помогает оператор «continue». Другой оператор – «break» – вовсе прекращает выполнение текущего цикла, что также позволяет избежать неоправданного увеличения времени исполнения.
Операторы «continue» и «break» могут использоваться в любых циклах, будь то «while», «for» или «do – while». Так следующая программа вычисляет квадраты всех четных чисел в интервале введенных значений, пропуская вычисление квадратов нечетных чисел.
Листинг 2.9. Использование инструкций continue и break.
#include <iostream>
using namespace std;
int main (void)
{
unsigned int x, y;
cin >> x >> y;
while (1) {
x++;
if (x % 2)
continue;
if (x >= y)
break;
cout << x << " : " << x*x << endl;
}
return 0;
}
2.2.5. Вложенность
Любой из приведенных циклов может быть вложен в любой другой, т.е. тело одного одного цикла может содержать другой, при этом все переменные, объявленные в теле цикла верхнего уровня доступны и во вложенных циклах, что справедливо и для инициализирующих эти циклы выражений.
Следующий пример вычисляет
.
Листинг 2.10. Применение вложенности циклов при решении задач нахождения сумм и произведений.
#include <iostream>
#include <cmath>
using namespace std;
int main (void)
{
unsigned int n, m;
cin >> n >> m;
double P = 1;
for (int i = 1; i <= n; i++) { //для каждого сомножителя;
double E = 0;
for (int j = 1; j <= m; j++) //для каждого слагаемого;
E += pow(cos(j), i);
P *= E;
}
cout << P << endl;
return 0;
}
Особое внимание стоит уделить расстановке операторных скобок «{}» с тем, чтобы не возникло путаницы вложенности. Операторы «continue» и «break» выполняются для текущего уровня вложенности.
Следующий пример вычисляет
.
Листинг 2.11. Использование инструкций continue и break.
#include <iostream>
#include <cmath>
using namespace std;
int main (void)
{
int n, m;
cin >> n >> m;
double E = 0;
for (int i = 1; i <= n; i++) {
double P = 1;
for (int j = 1; j <= m; j++) {
if (j %
3) //пропуск итерации при
;
continue;
P *= j - i;
}
E += P;
}
cout << E << endl;
return 0;
}