17.1. Оператор цикла с предусловием
Алгоритмическая конструкция повторение (цикл) представляет собой последовательность действий, выполняемых многократно. Саму последовательность называют телом цикла.
Оператор цикла — команда, реализующая алгоритмическую конструкцию повторение на языке программирования.
В С++ существуют разные возможности управлять тем, сколько раз будет повторяться тело цикла. Может быть задано условие продолжения или окончания работы цикла, а также число повторений тела цикла, если мы точно знаем сколько раз нужно повторить действия.
Цикл с предусловием используется в том случае, когда известно условие продолжения работы. Для записи оператора цикла с предусловием используется команда while. Формат команды:
тело цикла;
}
Пример 17.1.
Написать программу для рисования ряда окружностей с радиусом 10 пикселей вдоль верхнего края графического окна.
III. Алгоритм решения задачи.
2. Положение любой другой окружности, удовлетворяющей условию задачи, будет зависеть от координаты x. В цикле будем изменять значение x. Каждое новое значение будет на 20 (на размер диаметра d = 2 * r = 2 * 10 = 20) больше предыдущего.
3. Цикл должен завершиться, когда значение координаты x станет больше чем 640 — горизонтальный размер окна.
IV. Описание переменных: x, y, r — int.
Тестирование. Запустить программу. Результат:
17.2. Оператор цикла с параметром
Цикл с параметром используется тогда, когда известно количество повторений. Для записи оператора цикла с параметром используется команда for.
Формат команды:
тело цикла;
}
Или:
тело цикла;
}
В первом варианте параметр цикла i изменяется от N1 до N2, каждый раз увеличиваясь на 1. Во втором — параметр i уменьшается на 1 при каждом выполнении тела цикла от N2 до N1. Если N1 > N2, цикл не выполняется ни разу. Часто первым значением параметра цикла, где i увеличивается, является 0.
Изменять значение параметра внутри тела цикла нельзя!!!
Пример 17.2.
Написать программу для вывода таблицы умножения на заданное число x.
Этапы выполнения задания
II. Результат: 9 строк вида a * x = c.
III. Алгоритм решения задачи.
1. Значение переменной a изменяется в цикле от 1 до 9.
2. Значение переменной c = a * x.
3. Так как количество повторений заранее известно, используем цикл for.
IV. Описание переменных: x, c — int.
using namespace std;
int main() {
int x, c;
cout << "x = ";
cin >> x;
for (int a = 1; a < 10; a++) {
c = a * x;
cout << a << " * " << x << " = " << c << endl ;
}
return 0;
}
17.3. Решение задач с использованием оператора цикла
Пример 17.3.
Нарисовать 20 квадратов с общим центром. Длина стороны самого большого квадрата 400, верхний левый угол расположен в точке (50; 50). Координаты верхнего левого и нижнего правого углов каждого следующего квадрата изменяются на a (a — вводится).
Этапы выполнения задания
II. Результат: рисунок, отображающий квадраты.
III. Алгоритм решения задачи.
1. Первым рисуется самый большой квадрат. Координаты его верхнего левого угла x1 = 50, y1 = 50. Координаты нижнего правого угла x2 = 450, y2 = 450.
2. Для определения положения другого квадрата нужно координаты верхнего левого угла увеличить на a, а нижнего правого — уменьшить на a.
3. Будем использовать цикл for, поскольку задано количество квадратов.
IV. Описание переменных: a, x1, y1, x2, y2 — int.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,x1,y1,x2,y2;
cout << "a = ";
cin >> a;
x1 = 50; y1 = 50;
x2 = 450; y2 = 450;
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
int i;
for (i = 0; i < 20; i++) {
rectangle(x1, y1, x2, y2);
x1 += a; y1 += a;
x2 -= a; y2 -= a;
}
getch();
closegraph();
}
Вывести на экран наибольшее натуральное число из промежутка [n, m], которое делится на заданное число x.
Этапы выполнения задания
II. Результат: искомое число или сообщение «Нет таких чисел».
III. Алгоритм решения задачи.
1. Пусть i — текущее число из промежутка.
2. Поскольку нас интересует наибольшее число из промежутка, то просмотр чисел начнем со значения i = m.
На каждом шаге будем уменьшать i на 1.
3. Цикл завершится, если мы нашли число, делящееся на x без остатка (остаток равен нулю), или просмотрели все числа из промежутка [n, m].
4. Так как количество повторений заранее неизвестно, используем цикл while.
Цикл будет продолжать работу до тех пор, пока условие, сформулированное в пункте 3, будет ложным.
А именно: ложным должно быть условие (i < n) or (i % x == 0). Тогда условие not ((i < n) or (i % x == 0)) будет истинным. Согласно правилам построения отрицаний (см. пример 15.5) это условие можно заменить условием:
(i > = n) and (i % x != 0). Его и будем использовать в качестве условия цикла.
5. Если по окончании цикла i = n – 1, то нет чисел, удовлетворяющих условию задачи.
IV. Описание переменных: n, m, x, i — int.
Программа:
using namespace std;
int main() {
int n, m, x, i;
cout << " n = "; cin >> n;
cout << " m = "; cin >> m;
cout << " x = "; cin >> x;
i = m;
while (i >= n && i % x != 0)
i--;
if (i == n - 1)
cout << "No number";
else
cout << " number = " << i;
return 0;
}
Вопросы
2. Каким образом можно управлять количеством выполнений тела цикла?
3. Как записывается оператор цикла с предусловием?
4. Как записывается оператор цикла с параметром?
Упражнения
№ 1. Измените программу из примера 17.1.
1. Радиусы окружностей равны 20.
2. Окружности располагаются вдоль левого края окна.
3. Радиус окружности вводится пользователем.
4. Окружности образуют рамку вокруг окна.
5*. Пользователь задает границу окна, вдоль которой будут располагаться окружности (например: 1 — верхняя, 2 — левая, 3 — правая, 4 — нижняя).
№ 2. Какие изменения нужно внести в программу из примера 17.1 для того, чтобы рисунок выглядел следующим образом?
№ 3. Внесите изменения в программу из примера 17.2. Пользователь задает значение второго множителя, а также начальное и конечное значения первого множителя.
№ 4. При каком максимальном значении a на экране будут видны все 20 квадратов из примера 17.3? Почему при больших значениях a не видны все квадраты? Измените программу так, чтобы квадраты рисовались от самого маленького к самому большому.
№ 5. Какие изменения нужно внести в программу из примера 17.3, чтобы получить следующее изображение? Функции для изменения интенсивности цвета см. в примере 17.1.
№ 6. Измените программу из примера 17.3. Длина стороны самого большого квадрата 400, а длина стороны каждого следующего квадрата на x меньше (x вводится).
№ 7. Напишите программу, которая рисует ряд окружностей заданного радиуса, расположенных по диагонали графического окна. Рассмотрите два варианта:
2*. Графическое окно прямоугольное.
№ 8. Напишите программу, которая рисует концентрические окружности с центром в середине графического окна. Радиус самой маленькой окружности — 10 пикселей. Разница радиусов — 20 пикселей. Используйте изменение интенсивности какого-либо цвета (или двух одновременно) для заливки кругов.
№ 9. В магазине продают конфеты в упаковках по 0.1 кг, 0.2 кг, ... 0.9 кг, 1 кг. Известно, что 1 кг конфет стоит х рублей. Выведите стоимости каждой упаковки в виде:
0.1 кг конфет стоит ... р.;
0.2 кг конфет стоит ... р. ... .
№ 10*. Выведите на экран наименьшее натуральное число из промежутка [n, m], которое является нечетным и не делится на введенное значение x.
Комментариев нет:
Отправить комментарий