Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


II .10. Вложенные циклы с параметром



 

Рассмотим фрагмент программы:

INPUT R

SCREEN 12

FOR X=R TO 639-R STEP 2*R

FOR Y=R TO 479-R STEP 2*R

Тело цикла по параметру Y
Тело цикла по параметру X
      CIRCLE(X, Y), R, 14

      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 3 4 ………
1

 

2
3
. . . .

Если номера строчки и столбика одинаковой четности, то рисуется фрагмент №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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.025 с.)
Главная | Случайная страница | Обратная связь