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

Получим на экране изображение зигзага, как представлено на рисунке:

Пусть с – цвет зигзага. Для рисования одного зубца может быть использован следующий фрагмент программы:
x = 0
y = 240
LINE (x, y) - (x + h \ 2, y - h), c
LINE - (x + h, y), c

Для рисования следующего зубца достаточно сдвинуть начальную точку по горизонтальной оси на расстояние h (х = х + h) и повторить те же команды (выделенные жирным шрифтом).
Длина экрана 480 пикселей, ширина одного зубца h пикселей, следовательно, количество зубцов 480 \ h штук. 
Итак, для рисования зигзага потребуется 480 \ h раз повторить команды:
LINE (x, y) - (x + h \ 2, y - h), c
LINE - (x + h, y), c
x = x + h

Когда известно, сколько раз необходимо повторить серию операторов, используют оператор цикла с параметром.


Формат:   FOR  I = a TO b STEP h
                       <тело цикла>
                 NEXT I


FOR, TO, STEP, NEXT – служебные слова.
I, a, b и h – переменные, которые могут иметь и другие имена, но содержать должны только целые значения.
Тело цикла – это операторы, которые будут повторяться.
Переменную I, в данном контексте, называют параметром цикла, так как от того, сколько значений она примет, столько раз и повторится тело цикла.
Значение параметра цикла нельзя изменять в теле цикла, иначе будет нарушена правильная работа оператора!
Дословно команду можно перевести так: для каждого значения переменной I от числа а до числа b с шагом h делай операторы.
Если величина шага равна 1, то фрагмент команды STEP h можно не писать.
Программа:
CLS
PRINT "введи высоту зигзага и цвет"
INPUT h, c
SCREEN 12
x = 0
y = 240
FOR I = 1 TO 480 \ h
LINE (x, y) - (x + h \ 2, y - h), c
LINE - (x + h, y), c
x = x + h
NEXT I
END
Эту же программу можно написать иначе, взяв в качестве параметра переменную х, и взяв величину шага за h.
CLS
PRINT "введи высоту зигзага и цвет"
INPUT h, c
SCREEN 12
y = 240
FOR x = 0 TO 480 STEP h
LINE (x, y) - (x + h \ 2, y - h), c
LINE - (x + h, y), c
NEXT x
END
Внимание: 
- В первом варианте программы, параметр цикла отвечает за количество повторов, и через каждый повтор его значение увеличивается на 1. При этом координата х увеличивается на величину h, чтобы начать рисование очередного зубца (для этого используется оператор x = x + h).
- Во втором варианте программы, параметр цикла отвечает не только за  количество повторов, но и за координату начала рисования очередного зубца (через каждый повтор его значение увеличивается на h автоматически).      

 

Применение оператора цикла с параметром в создании компьютерной анимации.

Компьютерная анимация – это получение движущихся изображений на экране монитора.

Оператор цикла с параметром можно использовать для получения целого ряда графических эффектов.

Разобьем эффекты на группы и рассмотрим примеры программ к каждому из них.


1) Получение единого изображения, путем повторения его детали

Пример был разобран выше (зигзаг). Деталь зигзага – зубец. Повторяя фрагмент рисования зубца определенное количество раз, было получено изображение зигзага.


2) Мигание

Задание:  Нарисовать маячок, лампа которого мигает желтым цветом.

Решение:
Пусть маячок будет расположен в центре экрана (центр окружности, изображающей лампу, совпадает с точкой (320, 240)), линии будем изображать серым цветом, треугольник закрасим синим, высота и основание треугольника имеют величину h, радиус лампы равен h \ 4.
Фрагмент программы, рисующей маячок, будет таков:
X = 320
Y = 240
LINE ( X - H \ 2, Y + H \ 2) - (X, Y - H \ 2), 7
LINE - (X + H \ 2, Y + H \ 2), 7
LINE - (X - H \ 2, Y + H \ 2), 7
PAINT (X, Y), 1, 7
CIRCLE (X, Y), H \ 4, 7
Пусть маячок мигает 10 раз. Необходимо закрасить лампу желтым цветом, задержать на какое-то время, закрасить лампу черным цветом, задержать на какое-то время. Это повторить 10 раз.
Для задержки изображения можно использовать один из двух приемов:
- применить специальный оператор;
- использовать пустой оператор цикла с параметром.
Специальный оператор задержки хода выполнения программы.
Формат:   SLEEP n
Sleep – служебное слово;
n – количество секунд, на которые система заснет.
Если необходимо отсрочить выполнение оператора лишь на доли секунды, то целесообразно использовать пустой оператор цикла с параметром.
Пример: FOR I=1 TO 1000
                NEXT I

Пока система будет выполнять отсчет от 1 до 1000, пройдут доли секунды. Размер этого времени можно изменить, изменив конечное значение параметра. Сам размер нельзя указать точно, т.к. он зависит от характеристик компьютера.
Для решения задачи потребуется реализовать следующий алгоритм:
1. Ввести высоту маячка;
2. Нарисовать маяк;
3. В цикле от 1 до 10:
              а) закашиваем лампу желтым;
              б) задерживаем;
              в) закрашиваем лампу черным;
              г) задерживаем.
Программа:
CLS
PRINT "ввести высоту маячка"
INPUT H
SCREEN 12
X = 320
Y = 240
LINE ( X - H \ 2, Y + H \ 2) - (X, Y - H \ 2), 7
LINE - (X + H \ 2, Y + H \ 2), 7
LINE - (X - H \ 2, Y + H \ 2), 7
PAINT (X, Y), 1, 7
CIRCLE (X, Y), H \ 4, 7
FOR I = 1 TO 10
PAINT (X, Y), 14, 7
SLEEP 1
PAINT (X, Y), 0, 7
SLEEP 1
NEXT I
END


3) Исчезновение и появление объекта
Задание:  Заставить смайлик исчезать и появляться на экране 100 раз.


Решение:
Пусть смайлик будет расположен в центре экрана (центр окружности, изображающей лицо, совпадает с точкой (320, 240)), линии будем изображать серым цветом, лицо закрасим желтым, радиус лица имеет величину R, радиус глаз равен R \ 6, длина линии рта равна R.
Фрагмент программы, рисующей смайлик, будет таков:
X = 320
Y = 240
CIRCLE (X, Y), R, 7
PAINT (X, Y), 14, 7
CIRCLE (X - R \ 2, Y - R \ 2), R \ 6, 7
PAINT (X - R \ 2, Y - R \ 2), 1, 7
CIRCLE (X + R \ 2, Y - R \ 2), R \ 6, 7
PAINT (X + R \ 2, Y - R \ 2), 1, 7
LINE ( X - R \ 2, Y + R \ 2) - (X + R \ 2, Y + R \ 2), 4

Для решения задачи потребуется реализовать следующий алгоритм:
1. Ввести радиус смайлика;
2. В цикле от 1 до 100:
               а) рисуем смайлик;
               б) задерживаем;
               в) закрываем изображение черным квадратом;
               г) задерживаем.
Программа:
CLS
PRINT "ввести радиус смайлика"
INPUT R
SCREEN 12
X = 320
Y = 240
FOR I = 1 TO 100
CIRCLE (X, Y), R, 7
PAINT (X, Y), 14, 7
CIRCLE (X - R \ 2, Y - R \ 2), R \ 6, 7
PAINT (X - R \ 2, Y - R \ 2), 1, 7
CIRCLE (X + R \ 2, Y - R \ 2), R \ 6, 7
PAINT (X + R \ 2, Y - R \ 2), 1, 7
LINE ( X - R \ 2, Y + R \ 2) - (X + R \ 2, Y + R \ 2), 4
FOR W = 1 TO 1000
NEXT W
LINE (X - R, Y - R) - (X + R, Y + R), 0, BF
FOR W = 1 TO 1000
NEXT W
NEXT I
END


4) Увеличение (уменьшение) объекта в определенное количество раз.
Задание:  Превратить жука в точку.

Решение:
Пусть жук будет расположен в центре экрана (центр окружности, изображающей жука, совпадает с точкой (320 , 240)), линии будем изображать зеленым цветом, круг закрасим красным, радиус круга имеет величину R.
Фрагмент программы, рисующей жука, будет таков:
X = 320
Y = 240
LINE ( X - 3 * R \ 2, Y - 3 * R \ 2) - ( X + 3 * R \ 2, Y + 3 * R \ 2), 2
LINE ( X + 3 * R \ 2, Y - 3 * R \ 2) - ( X - 3 * R \ 2, Y + 3 * R \ 2), 2
LINE ( X - 3 * R \ 2, Y) - ( X + 3 * R \ 2, Y), 2
CIRCLE (X, Y), R, 2
PAINT (X, Y), 4, 2
Из фрагмента программы видно, что размер жука зависит от величины R. Если устремить ее к нулю, то и размеры жука начнут уменьшаться до точки.
Для решения задачи потребуется реализовать следующий алгоритм:
1. Ввести радиус круга;
2. В цикле изменять радиус от его начального значения до 1 с шагом -1 (можно величину шага уменьшить, тогда жук будет уменьшаться быстрее):
                   а) рисуем жука;
                   б) задерживаем;
                   в) закрываем изображение черным квадратом;
                   г) задерживаем.
Запись FOR R = R… противоречит программистской этике. Поэтому переменную, в которой будет размещаться первоначальная величина радиуса, назовем R0.
Программа:
CLS
PRINT "ввести радиус круга"
INPUT R0
SCREEN 12
X = 320
Y = 240
FOR R = R0 TO 1 STEP -1
LINE ( X - 3 * R \ 2, Y - 3 * R \ 2) - ( X + 3 * R \ 2, Y + 3 * R \ 2), 2
LINE ( X + 3 * R \ 2, Y - 3 * R \ 2) - ( X - 3 * R \ 2, Y + 3 * R \ 2), 2
LINE ( X - 3 * R \ 2, Y) - ( X + 3 * R \ 2, Y), 2
CIRCLE (X, Y), R, 2
PAINT (X, Y), 4, 2
FOR W = 1 TO 1000
NEXT W
LINE ( X - 3 * R \ 2, Y - 3 * R \ 2) - ( X + 3 * R \ 2, Y + 3 * R \ 2), 0, BF
FOR W = 1 TO 1000
NEXT W
NEXT R
END


5) Перемещение объекта по экрану
Представим, что экран монитора это ночное небо, а на нем перемещается спутник (белая точка). Напишем фрагменты программы, перемещающие спутник по горизонтали слева направо и справа налево, по вертикали вниз и вверх, по диагоналям в ту и другую стороны.
В любом из указанных случаев, фрагмент программы должен реализовать алгоритм:
 В цикле от начального положения до конечного:
            а) рисуем точку;
            б) задерживаем;
            в) стираем точку, наложив на нее черную;
            г) изменяем координаты местоположения точки.


Фрагменты программ могут выглядеть так:

 

Вид движения

Фрагмент программы

Пояснение



Y = 240                                            

FOR X = 0 TO 640

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

NEXT X

При движении вдоль оси х изменяется соответствующая

координата (автоматически, как параметр). Можно добавить

шаг, тогда движение будет скачками.



Y = 240

FOR X = 640 TO 0 STEP -1

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

NEXT X

При движении вдоль оси х изменяется соответствующая

координата (автоматически, как параметр), но в обратном

направлении (шаг отрицательный).



X = 320

FOR Y = 0 TO 480

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

NEXT Y

При движении вдоль оси у изменяется соответствующая

координата (автоматически, как параметр). Можно добавить

шаг, тогда движение будет скачками.



X = 320

FOR Y = 480 TO 0 STEP -1

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

NEXT Y

При движении вдоль оси у изменяется соответствующая

координата (автоматически, как параметр), но в обратном

направлении (шаг отрицательный).



X = 0

FOR Y = 0 TO 480 STEP 2

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

X = X + 3

NEXT Y

При движении по диагонали изменяются обе координаты.

По вертикали экран короче, поэтому ось у удобней

изменять автоматически, как параметр, а х – с помощью

присваивания. Т.к. ширина экрана больше его высоты,

то координату х нужно изменять с большим шагом.



X = 640

FOR Y = 480 TO 0 STEP -2

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

X = X - 3

NEXT Y

Изменяются обе координаты. Ось у автоматически,

как параметр (шаг отрицательный, т.к. движение к 0),

а х – с помощью присваивания (значение координаты

тоже стремится к 0).



X = 640

FOR Y = 0 TO 480 STEP 2

PSET (X, Y), 15

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

X = X - 3

NEXT Y

Изменяются обе координаты. Ось у автоматически,

как параметр, а х – с помощью присваивания

(значение координаты уменьшается).




X = 0

FOR Y = 480 TO 0 STEP - 2

PSET (X, Y), 15 

FOR W = 1 TO 500

NEXT W

PSET (X, Y), 0

X = X + 3

NEXT Y

Изменяются обе координаты. Ось у автоматически,

как параметр (шаг отрицательный, т.к. движение к 0),

а х – с помощью присваивания (значение координаты

увеличивается).


Задание:  Написать программу движения мяча произвольного радиуса, по фиксированной траектории в форме треугольника. Движение осуществляется по часовой стрелке.

Треугольник изображать не нужно.
Решение:
Пусть радиус мяча будет вводиться с клавиатуры и храниться в переменной R.
Мяч движется вначале из точки (80, 400) до точки (320, 160), затем до точки (560, 400) и возвращается в точку (80, 400).
Это движение может реализоваться при последовательном использовании трех циклов с параметром. Данные точки будут центрами окружности, изображающей мяч.
Стирать мяч будем с помощью черного квадрата, описанного около окружности.
В программе будет реализован следующий алгоритм:
1. Вводим значение радиуса;
2. Зафиксируем значение переменной  X = 80;
3. В цикле с параметром Y от 400 до 160 с отрицательным шагом:
               а) рисуем мяч;
               б) задерживаем;
               в) стираем;
               г) увеличиваем координату по оси X с помощью оператора присваивания на величину шага.
4. В цикле с параметром Y от 160 до 400 с положительным шагом:
               а) рисуем мяч;
               б) задерживаем;
               в) стираем;
               г) увеличиваем координату по оси X с помощью оператора присваивания на величину шага.
5.  В цикле с параметром X от 560 до 80 с отрицательным шагом:
               а) рисуем мяч;
               б) задерживаем;
               в) стираем.
Программа:
CLS
PRINT "введите радиус мяча"
INPUT R
X = 80
FOR Y = 400 TO 160 STEP -1
CIRCLE (X, Y), R, 4
PAINT (X, Y), 4, 4
FOR W = 1 TO 500
NEXT W
LINE (X - R, Y - R) - (X + R, Y + R), 0, BF
X = X + 1
NEXT Y
FOR Y = 160 TO 400
CIRCLE (X, Y), R, 4
PAINT (X, Y), 4, 4
FOR W = 1 TO 500
NEXT W
LINE (X - R, Y - R) - (X + R, Y + R), 0, BF
X = X + 1
NEXT Y
FOR X = 560 TO 80 STEP -1
CIRCLE (X, Y), R, 4
PAINT (X, Y), 4, 4
FOR W = 1 TO 500
NEXT W
LINE (X - R, Y - R) - (X + R, Y + R), 0, BF
NEXT Y
END


 Задания для самостоятельного решения


1. Вырастить цветок за 5 секунд,
удваивая его размер каждую секунду.
2. Засадить грядку цветами. 3. Нарисовать взлет ракеты
(ракета движется вверх и улетает
за верхнюю границу экрана).


Применение оператора цикла с параметром в решении математических задач


Задание:  Составить программу к решению задачи: «Штангист поставил перед собой цель: через месяц тренировок (30 дней)  поднять штангу весом в Y кг. В первый день он поднял вес в X кг. На следующий день он увеличил норматив на A% от нормы предыдущего дня. Удастся ли ему достигнуть цели?»
Решение:
Данные Y, X, A – вводятся с клавиатуры. Известно, что начиная со второго дня, значение переменной X увеличивается на A% от старой величины, т.е. работает формула: X = X + X / 100 * A.
Так как в месяце 30 дней, то эта формула будет повторяться 29 раз.
Затем необходимо сравнить полученный результат со значением переменной Y и вывести ответ.
В программе необходимо реализовать следующий алгоритм:
1. Ввести данные;
2. В цикле от 1 до 29 повторить вычисления по формуле X = X + X / 100 * A;
3. В условном операторе сравнить полученное X с Y и, исходя из истинности условия, вывести результат.
Программа:
CLS
PRINT "введите вес, который необходимо поднять"
INPUT Y
PRINT "введите норму первого дня и процент, с которым она будет увеличиваться"
INPUT X, A
FOR I = 1 TO 29
X = X + X / 100 * A
NEXT I
IF X<Y THEN PRINT "цели не достиг"  ELSE PRINT "цель достигнута"
END


Задание:  Дано целое число n. Ввести n произвольных чисел с клавиатуры и найти их среднее арифметическое.
Решение:
Для нахождения среднего арифметического, необходимо сумму чисел разделить на их количество. Количество чисел известно – n. Для нахождения суммы, будем использовать переменную s. По умолчанию, ее значение равно нулю. Будем последовательно вводить числа с клавиатуры и прибавлять к переменной s. Пусть переменная х хранит на данный момент введенное число. Чтобы ввести одно число, необходимо выполнить оператор  INPUT х. После того, как число введено, добавим его к переменной s (s = s + x). Повторив серию операторов  [  INPUT х  :  s = s + x ]   n раз, мы получим сумму. Останется только разделить ее на количество введенных чисел и вывести результат.
В программе необходимо реализовать следующий алгоритм:
1. Ввести количество чисел;
2. В цикле от 1 до n повторить:
               а) ввести число;
               б) добавить к сумме;
3. Найти среднее арифметическое;
4. Вывести результат.
Программа:
CLS
PRINT "введите количество чисел"
INPUT n
FOR I = 1 TO n
INPUT x
s = s + x
NEXT I
p = s / n
PRINT "среднее арифметическое введенных чисел равно ",  р
END


Задание:  Даны целые числа а и b. Найти произведение целых четных чисел, расположенных между числами а и b. 
Решение:
Пусть р – произведение. Чтобы вычислить произведение, необходимо перемножить числа.
Например, если а = 10, а b = 34, то р = 11 * 13 * ... * 33 , но, если а = 25, а b = 6, то р = 7 * 9 * ... * 23. Если a < b, то числа лежат в промежутке от а + 1 до b - 1, а иначе от b + 1 до а - 1.
Очевидно, что в программе можно использовать цикл с параметром, но начальное и конечное значения параметра будут зависеть от истинности условия.
Переменная р по умолчанию будет равна нулю. Если ее на каждом шаге цикла умножать на очередное число, то ее значение не изменится, т.к. сколько ноль не умножай, все равно результат – ноль. Поэтому, в случае с произведением, его первоначальное значение принимают за 1.
Для проверки самого числа на четность, снова потребуется условный оператор, но он уже будет внутри цикла.
В программе необходимо реализовать следующий алгоритм:
1. Ввести числа а и b;
2. Присвоить переменной р значение 1;
3. Сравнить числа:
если а < b, то 
    в цикле от а + 1 до b - 1 найти произведение четных значений параметра,
                иначе
    в цикле от b + 1 до а - 1 найти произведение четных значений параметра;
4. Вывести результат.
Программа:
CLS
PRINT "введите числа"
INPUT a, b
P = 1
IF a < b THEN
            FOR I = a + 1 TO b - 1
            IF I mod 2 = 0 THEN p = p * I
            NEXT I
            ELSE
            FOR I = b + 1 TO a - 1
            IF I mod 2 = 0 THEN p = p * I
            NEXT I
PRINT "произведение четных чисел между заданными числами равно ",  р
END


Задания для самостоятельного выполнения
1. Написать программу к решению задачи: «В 9 часов утра на яблоне сидело 100 пчелок. С этого момента каждый час на яблоню садится по X пчел, а Y пчел улетает.
    Сколько пчел будет на яблоне в 9 часов вечера?
    Внимание: если в процессе вычислений будет получен отрицательный результат, то на экран должно выводиться сообщение «Пчелы разлетелись!» ».
2. Ввести n чисел с клавиатуры. Найти среднее арифметическое тех, которые оканчиваются цифрой 3.
3. Посчитать количество трехзначных чисел, которые являются перевертышами (например, 101, 111, 121, 131…, 202,…).


Адрес: 614039, г. Пермь, ул. Комсомольский проспект, 45
Телефон: +7 (342) 212-80-71
E-Mail: school9-perm@ya.ru
Вопрос администратору сайта