Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
II .10. Вложенные циклы с параметром
Рассмотим фрагмент программы: INPUT R SCREEN 12 FOR X=R TO 639-R STEP 2*R FOR Y=R TO 479-R STEP 2*R
PAINT (X, Y), 4, 14 SLEEP 1 NEXT Y SLEEP 1 NEXT X END В этом фрагменте фигурируют два цикла с параметром. Фигурными скобками отмечены их тела. В тело цикла по параметру Х входит цикл по параметру Y. Цикл, который входит в тело другого цикла, называется вложенным. В тело цикла с параметром Y входят три оператора: 1. CIRCLE(X, Y), R, 14 2. PAINT (X, Y), 4, 14 3. SLEEP 1 А в тело цикла с параметром Х входят два оператора: 1. FOR Y=R TO 479-R STEP 2*R CIRCLE(X, Y), R, 14 PAINT (X, Y), 4, 14 SLEEP 1 NEXT Y 2. SLEEP 1 При работе цикла с параметром Y, будет происходить рисование кружков (с перерывом в 1 секунду). Кружки будут выстраиваться в колонну сверху вниз, во всю высоту экрана. Так как, автоматически будет изменяться переменная Y с шагом 2*R. Но данный цикл вложен в цикл по параметру Х. Значит, таких колонн будет нарисовано столько, сколько кружков можно уместить по горизонтали. Т.е., система нарисует одну колонну и заснет на секунду, затем нарисует вторую колонну и опять заснет, и т.д. В итоге, весь экран будет покрыт кружками, как узором. Задание: Получить на экране следующий узор:
Каждый ромб задается с помощью величины а.
Решение: Здесь элементом узора является не круг, а ромб. Фрагмент программы для его рисования, таков: LINE(X-a, Y)-(X, Y-a), 1 LINE -(X+a, Y), 1 LINE- (X, Y+a), 1 LINE –(X-a, Y), 1 PAINT(X, Y), 1, 1 Достаточно в предыдущей программе внести эту замену и узор готов. Оператор SLEEP писать не обязательно, т.к. в задании не требовалось выводить узор постепенно. Программа: CLS PRINT “ввести размер ромба” INPUT a SCREEN 12 FOR X=a TO 639-a STEP 2*a FOR Y=a TO 479-a STEP 2*a LINE(X-a, Y)-(X, Y-a), 1 LINE -(X+a, Y), 1 LINE- (X, Y+a), 1 LINE –(X-a, Y), 1 PAINT(X, Y), 1, 1 NEXT Y NEXT X END
Задание: Получить на экране следующий узор:
Решение: Весь узор получен из чередования двух маленьких фрагментов: №1. зеленого квадрата и желтого кружка на нем; №2. желтого квадрата и зеленого кружка на нем. Если полагать, что центр окружности будет располагаться в точке (х, у), окружность будет иметь радиус R, а сторона квадрата, соответственно, 2*R, то эти фрагменты можно получить выполняя следующие серии операторов: 1. LINE(X-R, Y-R)-(X+R, Y+R), 2, BF CIRCLE(X, Y), R, 14 PAINT(X, Y), 14, 14 2. LINE(X-R, Y-R)-(X+R, Y+R), 14, BF CIRCLE(X, Y), R, 2 PAINT(X, Y), 2, 2 Будем строить узор вертикальными колонками. При построении одной колонки, координата Х изменяться не будет, а координата Y будет изменяться от R (центр первого фрагмента узора в колонке) до 479-R (центр последнего фрагмента узора в колонке) с шагом 2*R. Рассмотрим внимательно узор, и выясним от чего зависит рисование того или иного фрагмента. Колонки, стоящие на первом, третьем, а, в общем, на нечетных местах – идентичны, и отличаются от колонок, стоящих на четных местах порядком следования фрагментов. Рассмотрим нечетные колонки. В них на нечетных местах стоят фрагменты №1, а на четных – фрагменты №2. В четных колонках – наоборот. На нечетных местах стоят фрагменты №2, а на четных – фрагменты №1. В этой задаче не следует выбирать в качестве параметров циклов переменные, отвечающие за координаты. Пусть параметры циклов отвечают, за положение фрагмента в сетке узора. I – номер колонки, а J- номер клеточки в этой колонке.
Если номера строчки и столбика одинаковой четности, то рисуется фрагмент №1, а иначе - №2. Количество клеточек в узоре зависит от величины радиуса. По горизонтали их 640\(2*R), а по вертикали 480\(2*R). Тогда, колонку с номером I можно нарисовать, реализуя следующий фрагмент программы: FOR J=1 TO 480\(2*R) IF ((I mod 2< > 0) and (J mod 2< > 0)) or ((I mod 2=0) and (J mod 2=0)) THEN LINE(X-R, Y-R)-(X+R, Y+R), 2, BF CIRCLE(X, Y), R, 14 PAINT(X, Y), 14, 14 ELSE LINE(X-R, Y-R)-(X+R, Y+R), 14, BF CIRCLE(X, Y), R, 2 PAINT(X, Y), 2, 2 END IF Y=Y+2*R NEXT J Так как таких колонок несколько, то этот фрагмент программы нужно повторить 640\(2*R) раз, одновременно изменяя координату по горизонтали, т.е. Х. Программа: СLS PRINT “введите радиус” INPUT R SCREEN 12 X=R Y=R FOR I=1 TO 640\(2*R) FOR J=1 TO 480\(2*R) IF ((I mod 2< > 0) and (J mod 2< > 0)) or ((I mod 2=0) and (J mod 2=0)) THEN LINE(X-R, Y-R)-(X+R, Y+R), 2, BF CIRCLE(X, Y), R, 14 PAINT(X, Y), 14, 14 ELSE LINE(X-R, Y-R)-(X+R, Y+R), 14, BF CIRCLE(X, Y), R, 2 PAINT(X, Y), 2, 2 END IF Y=Y+2*R NEXT J X=X+2*R NEXT I END
Задания для самостоятельного решения: 1. Придумать и получить на экране узор. 2. Нарисовать в центре экрана квадрат со стороной 400 пикселей и заставить кружок радиуса R (R< 50) двигаться по его траектории. Кружок должен обежать вдоль сторон квадрата 10 раз по часовой стрелке.
|
Последнее изменение этой страницы: 2019-03-30; Просмотров: 54; Нарушение авторского права страницы