1) Цикл с параметром
For var i:=1 to N do
begin
команда1;
команда2;
...
end;
2) Цикл с предусловием
While <условие> do
begin
команда1;
команда2;
...
end;
Написать программу для рисования ряда окружностей с радиусом 10 пикселей вдоль верхнего края графического окна.
Алгоритм решения задачи.
1. Положение первой окружности. Окружность расположим в верхнем левом углу. Для этого задается радиус r = 10 и координаты центра x = 10, y = 10.
2. Положение любой другой окружности, удовлетворяющей условию задачи, будет зависеть от координаты x. В цикле будем изменять значение x. Каждое новое значение будет на 20 (на размер диаметра) больше предыдущего.
3. Цикл должен завершиться, когда значение координаты x станет больше чем 640 — горизонтальный размер окна.
Программа:
uses GraphABC;
var x, y, r, c: integer;
begin
r := 10;
x := 10; y := 10;
c := 255;
while x < 640 do
begin
//Интенсивность красного
SetBrushColor(RedColor(c));
Circle(x,y,r);
x := x + 20;
//Уменьшение интенсивности
c := c-5;
end;
end.
Тестирование
Запустить программу. Результат:
Написать программу для вывода таблицы умножения на заданное число x.
Алгоритм решения задачи.
1. Значение переменной a изменяется в цикле от 1 до 9.
2. Значение переменной c = a x.
3. Так как количество повторений заранее известно, используем цикл for.
Программа:
var x, c : integer;
begin
write('Введите x = ');
read(x);
for var a := 1 to 9 do
begin
c := a * x;
writeln(a,' * ',x,' = ',c);
end;
end.
Тестирование.
Запустить программу. Ввести x = 7.
Решение с помощью цикла while:
var a, x, c : integer;
begin
write('Введите x = ');
read(x);
a := 1;
while a <= 9 do
begin
c := a * x;
writeln(a,' * ',x,'= ',c);
a := a + 1;
end;
end.
Нарисовать 20 квадратов с общим центром. Длина стороны самого большого квадрата 400, верхний левый угол расположен в точке (50; 50). Координаты верхнего левого и нижнего правого углов каждого следующего квадрата изменяются на a (a — вводится).
Алгоритм решения задачи.
1. Первым рисуется самый большой квадрат. Координаты его верхнего левого угла x1 = 50, y1 = 50. Координаты нижнего правого угла x2 = 450, y2 = 450.
2. Для определения положения другого квадрата нужно координаты верхнего левого угла увеличить на a, а нижнего правого — уменьшить на a.
3. Будем использовать цикл for, поскольку задано количество квадратов.
Программа:
uses GraphABC;
var a,x1,y1,x2,y2: integer;
begin
write('Введи a = ');
read(a); write(a);
x1 := 50; y1 := 50;
x2 := 450; y2 := 450;
for var i := 1 to 20 do
begin
Rectangle(x1,y1, x2,y2);
x1 := x1 + a; y1 := y1 + a;
x2 := x2 - a; y2 := y2 - a;
end;
end.
Тестирование.
Запустить программу и ввести значение a=10. Результат:
Вывести на экран наибольшее натуральное число из промежутка [n, m], которое делится на заданное число x.
Алгоритм решения задачи.
1. Пусть i — текущее число из промежутка.
2. Поскольку нас интересует наибольшее число из промежутка, то просмотр чисел начнем со значения i = m. На каждом шаге будем уменьшать i на 1.
3. Цикл завершится, если мы нашли число, делящееся на x без остатка (остаток равен нулю), или просмотрели все числа из промежутка [n, m].
4. Так как количество повторений заранее неизвестно, используем цикл while. Цикл будет продолжать работу до тех пор, пока условие, сформулированное в пункте 3, будет ложным. А именно: ложным должно быть условие (i < n) or (i mod x = 0). Тогда условие not ((i < n) or (i mod x = 0)) будет истинным. Согласно правилам построения отрицаний это условие можно заменить условием: (i >= n) and (i mod x <> 0). Его и будем использовать в качестве условия цикла.
5. Если по окончании цикла i = n – 1, то нет чисел, удовлетворяющих условию задачи.
Программа:
var i, n, m, x : integer;
begin
writeln('Введите границы n, m');
read(n,m);
write('Введи x = ');
read(x);
i := m;
while (i >= n) and (i mod x <> 0) do
i := i - 1;
if i = n - 1 then
writeln('Нет таких чисел')
else
writeln('Искомое число — ',i);
end.
Тестирование.
Запустить программу и ввести значения n = 10, m = 20, x = 3. Результат:
Запустить программу и ввести значения n = 38, m = 45, x = 37. Результат:
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.