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

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

В этом фрагменте фигурируют два цикла с параметром. Фигурными скобками отмечены их тела. В тело цикла по параметру Х входит цикл по параметру 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 раз по часовой стрелке.

Использование вложенных циклов в решении задач на вычисление

Работу вложенных циклов можно сравнить с работой часов: старший цикл – часовая стрелка, в него вложен цикл по минутам, а в цикл по минутам вложен цикл по секундам. Параметр цикла по секундам пробежит значения от 0 до 59 и содержимое параметра цикла по минутам увеличится на 1.


Задание:  Вывести на экран информацию, которая регистрирует сколько секунд, минут и часов прошло с момента запуска данной программы.
Решение:
Пусть за секунды, минуты и часы отвечают переменные s, m и t, соответственно. Очевидно, они и станут параметрами циклов. Параметры циклов по секундам и минутам должны принимать значения от 0 до 59, а параметр цикла по часам – от 0 до 23. На экран все время работы программы должна выводиться информация, например:
С момента запуска программы прошло:
часов    минут   секунд
    0            1           54
Соответственно, каждую секунду информация о времени должна обновляться. Стирать информацию с экрана позволит нам стандартный оператор CLS. Между обновлениями должна проходить 1 секунда, поэтому мы будем использовать оператор SLEEP 1. Вывод будет осуществляться операторами PRINT.
Программа:
CLS
FOR T = 0 TO 23                 
FOR M = 0 TO 59
FOR S = 0 TO 59
PRINT "С момента запуска программы прошло: "
PRINT "часов", "минут", "секунд"
PRINT T, M, S
SLEEP 1
CLS
NEXT S
NEXT M
NEXT T
END
Если программу не прервать, то она может работать в течение суток. Прервать ее работу можно принудительно, с помощью комбинации клавиш CTRL BREAK.


Задание:  Составить программу к решению задачи: «У мальчика было Х рублей. Он решил на все деньги купить в лавке шарики, хлопушки и свистки. Шарик стоит 3 рубля, хлопушка 10 рублей, а свисток 5 рублей. Какие варианты покупки он может сделать? Останется ли у него сдача, и какая?»
Решение:
Пусть за количество купленных вещей отвечают, соответственно, переменные A – шарики, B – хлопушки, C – свистки, а под сдачу отведем переменную S.
Так как мальчик планирует потратить все деньги, то его сдача, судя по ценам на товары, должна быть менее 3-х рублей. Вычислить сдачу можно вычитая из Х стоимость покупки: S = X - (A * 3 + B * 10 + C * 5).
Так как у мальчика всего Х рублей, то он на них может купить от 0 до Х \ 3 шариков, от 0 до Х \ 10 хлопушек и от 0 до Х \ 5 свистков. Здесь A, B и C могут принимать значения из вышеуказанных диапазонов, т.е. будут параметрами циклов. От количества предметов одного вида, зависит количество предметов другого вида, поэтому циклы не могут работать независимо друг от друга, а должны быть вложенными (не важно в какой последовательности).
Программа:
CLS
PRINT "введите количество денег"
INPUT X
FOR A = 0 TO X \ 3
FOR B = 0 TO X \ 10
FOR C = 0 TO X \ 5
S = X - (A * 3 + B * 10 + C * 5)
IF S < 3 THEN
             PRINT "можно купить:", A,  " шариков ", B, " хлопушек ", C, " свистков"
             PRINT "сдача составит ", S, " рублей"
END IF
NEXT C
NEXT B
NEXT A
END


Задание:  Составить программу к решению задачи: «Сеня, Петя и Миша подбросили игральные кости. Побеждает тот, у кого выпадет больше очков. Петя победил. Известно, что суммарное количество очков на костях равно 12. Напечатайте варианты, которые могли выпасть у ребят».
Решение:
Пусть, соответственно именам ребят, переменные S, P и M отвечают за количество очков, выпавших на игральных костях. По условию задачи, P > S и P > M (так как Петя победил), а также S + P + M = 12. Переменные  S, P и M могут принимать любые значения в диапазоне от 0 до 6 (на грани игральной кости может быть от 0 до 6 точек).
Программа:
CLS
FOR S = 0 TO 6
FOR P = 0 TO 6
FOR M = 0 TO 6
IF (P > S) AND (P > M) AND (S + P + M = 12) THEN PRINT "выпало очков:", S, " у Сени ", P, " у Пети ", M, " у Миши"
NEXT M
NEXT P
NEXT S
END


Задание:  Распечатать все трехзначные числа, у которых первая и последняя цифры равны и в сумме дают среднюю. Например: 242, 363 и т.п.
Решение:
Пусть A, B и C соответствующие цифры трехзначного числа. По условию задачи, A = C и A + C = B.  Переменная  A может принимать любые значения в диапазоне от 1 до 9
(первая цифра числа не может быть равна 0). Переменные  B и C могут принимать любые значения в диапазоне от 0 до 9.
Если будут найдены подходящие цифры, то число из них просто собрать по разрядам: X = A * 100 + B * 10 + C.
Программа:
CLS
FOR A = 1 TO 9
FOR B = 0 TO 9
FOR C = 0 TO 9
IF (A = C) AND (A + C = B) THEN
                                            X = A * 100 + B * 10 + C
                                            PRINT  X
END IF
NEXT C
NEXT B
NEXT A
END


Задания для самостоятельного выполнения
1. Найти сумму цифр всех трехзначных чисел.
2. Найти трехзначные числа, сумма цифр которых равна произведению этих цифр.

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