Up

8 класс. Оператор цикла

17.1. Оператор цикла с предусловием

Алгоритмическая конструкция повторение (цикл) представляет собой последовательность действий, выполняемых многократно. Саму последовательность называют телом цикла.

Оператор цикла — команда, реализующая алгоритмическую конструкцию повторение на языке программирования.

В С++ существуют разные возможности управлять тем, сколько раз будет повторяться тело цикла. Может быть задано условие продолжения или окончания работы цикла, а также число повторений тела цикла, если мы точно знаем сколько раз нужно повторить действия.

Цикл с предусловием используется в том случае, когда известно условие продолжения работы. Для записи оператора цикла с предусловием используется команда while. Формат команды:

while <условие> {
тело цикла;
}

Пример 17.1

Написать программу для рисования ряда окружностей с радиусом 10 пикселей вдоль верхнего края графического окна.

Этапы выполнения задания I—II. Результатом работы программы, не зависящей от исходных данных, будет рисунок, отображающий ряд окружностей вдоль верхнего края графического окна.
III. Алгоритм решения задачи.
     1. Положение первой окружности. Окружность расположим в верхнем левом углу. Для этого задается радиус r = 10 и координаты центра x = 10, y = 10.
     2. Положение любой другой окружности, удовлетворяющей условию задачи, будет зависеть от координаты x. В цикле будем изменять значение x. Каждое новое значение будет на 20 (на размер диаметра d = 2 * r = 2 * 10 = 20) больше предыдущего.
     3. Цикл должен завершиться, когда значение координаты x станет больше чем 640 — горизонтальный размер окна.
IV. Описание переменных: x, y, r — int.
Программа:
#include<graphics.h>
#include <bits/stdc++.h>

using namespace std;
int main()  {   
int x, y, r;
x = 10;
y = 10;
r = 10;
int gd=DETECT,gm;
initgraph(&gd,&gm,"");

while (x < 640) {
circle(x, y, r);
x = x + 20;
}
getch();
closegraph();
}

Тестирование. Запустить программу. Результат:

#include<graphics.h>
#include <bits/stdc++.h>
//#include <conio.h> 
using namespace std;
int main()

{   
int x, y, r, c;
c = 255;
x = 10;
y = 10;
r = 10;
int gd=DETECT,gm;
initgraph(&gd,&gm,"");

while (x < 640) {
 setcolor(RED);
circle(x, y, r);
floodfill(x+1,y+1,RED);
setfillstyle(SOLID_FILL,RGB(100,0,0));
x += 20;
c -= 5;
}
getch();
closegraph();
}

Можно произвести изменения цвета закраски кружков через остаток от деления:
#include<graphics.h>
#include <bits/stdc++.h> 
using namespace std;
int main()

{   
int x, y, r, c;
c = 255;
x = 10;
y = 10;
r = 10;
int gd=DETECT,gm;
initgraph(&gd,&gm,"");

while (x < 640) 
{
 setcolor(4); //цвет контура 4 - красный
circle(x, y, r);
setfillstyle(SOLID_FILL,c%16); //каждый раз разный остаток, каждый раз новая закраска
floodfill(x+5, y+5, 4);   //цвет контура 4 - красный; внутренняя точка с координатами (x+5, y+5)
x += 20;
c -= 1;  //меняем занчение с, уменьшая на 1
}
getch();
closegraph();
}

17.2. Оператор цикла с параметром

Цикл с параметром используется тогда, когда известно количество повторений. Для записи оператора цикла с параметром используется команда for.

Формат команды:

for (int i:= N1; N1 < N2; i++) {
тело цикла;
}

Или:

for (int i:= N2; N2 > N1; i--) {
тело цикла;
}

В первом варианте параметр цикла i изменяется от N1 до N2, каждый раз увеличиваясь на 1. Во втором — параметр i уменьшается на 1 при каждом выполнении тела цикла от N2 до N1. Если N1 > N2, цикл не выполняется ни разу. Часто первым значением параметра цикла, где i увеличивается, является 0

Изменять значение параметра внутри тела цикла нельзя!!!

Пример 17.2. 

Написать программу для вывода таблицы умножения на заданное число x.

Этапы выполнения задания

I. Исходные данные: x (введенное число).
II. Результат: 9 строк вида a * x = c.
III. Алгоритм решения задачи.
     1. Значение переменной a изменяется в цикле от 1 до 9.
     2. Значение переменной c = a * x.
     3. Так как количество повторений заранее известно, используем цикл for.
IV. Описание переменных: x, c — int.
#include <iostream>
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;
}
Тестирование.
Запустить программу. Ввести x = 7.

Решение с помощью цикла while:
#include <iostream>
using namespace std;
int main() {
int x, c;
cout << "x = "; 
cin >> x;
int a = 1;
while (a < 10)  {
c = a * x;
cout << a << " * " << x << " = " << c << endl ;
a++;
}
return 0;
}

17.3. Решение задач с использованием оператора цикла

Пример 17.3

Нарисовать 20 квадратов с общим центром. Длина стороны самого большого квадрата 400, верхний левый угол расположен в точке (50; 50). Координаты верхнего левого и нижнего правого углов каждого следующего квадрата изменяются на a (a — вводится).

Этапы выполнения задания

I. Исходные данные: 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<graphics.h>
#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();
}

Тестирование.  Запустить программу и ввести значение a = 10. Результат:


Пример 17.4*. 

Вывести на экран наибольшее натуральное число из промежутка [n, m], которое делится на заданное число x.

Этапы выполнения задания

I. Исходные данные: 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.

Программа:

#include <iostream>
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;
}

Тестирование. 
Запустить программу и ввести значения n = 10, m = 20, x = 3. Результат:

Запустить программу и ввести значенияn = 38, m = 45, x = 37. Результат:

Вопросы

1. Что такое оператор цикла?
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. Напишите программу, которая рисует ряд окружностей заданного радиуса, расположенных по диагонали графического окна. Рассмотрите два варианта:

       1. Графическое окно квадратное.
       2*. Графическое окно прямоугольное.

№ 8. Напишите программу, которая рисует концентрические окружности с центром в середине графического окна. Радиус самой маленькой окружности — 10 пикселей. Разница радиусов — 20 пикселей. Используйте изменение интенсивности какого-либо цвета (или двух одновременно) для заливки кругов.

№ 9. В магазине продают конфеты в упаковках по 0.1 кг, 0.2 кг, ... 0.9 кг, 1 кг. Известно, что 1 кг конфет стоит х рублей. Выведите стоимости каждой упаковки в виде:

0.1 кг конфет стоит ... р.;

0.2 кг конфет стоит ... р. ... .

№ 10*. Выведите на экран наименьшее натуральное число из промежутка [n, m], которое является нечетным и не делится на введенное значение x.

Комментариев нет:

Отправить комментарий