Вложенные циклы – «Небоскреб»
Мы видим, что ввод в программу переменных величин вместо чисел делает программу более гибкой и способной к развитию. Попробуем в следующей программе использовать переменные пошире.
Задача. Нарисовать небоскреб (см. Рис. 10.4) с заданным числом этажей и подъездов (условимся: один столбец окон – один подъезд).
Рис. 10.4
Начнем с малого – пусть нужно нарисовать одно единственное окно:
Фрагмент 1
Ширина = 5 'Ширина окна
Высота = 10 'Высота окна
y = 30 'Вертикальная координата окна
x = 20 'Горизонтальная координата окна
Граф.DrawRectangle(Pens.Black, x, y, Ширина, Высота)
Пусть этот фрагмент рисует левое верхнее окно небоскреба.
Рисуем этаж. Попробуем заставить компьютер нарисовать верхний этаж. Кстати, мы с вами ведь уже рисовали «квадратную трубу» в 8.5? Это то же самое.
Замечаем, что здесь нам нужно решить несколько элементарных задач на рисование окна, первую из которых решает фрагмент 1. Все задачи очень похожи и различаются лишь значением координаты x. Таким образом, для решения каждой из этих задач подошла бы последняя строчка фрагмента 1, если бы в ней x равнялся не 20, а нужному числу. В данном случае идеально подходит оператор For:
Фрагмент 2
Зазор_х = 4 'Зазор между окнами на этаже
Ширина = 5 : Высота = 10
П = InputBox("Введите количество подъездов")
y = 30
x = 20
For j = 1 To П
Граф.DrawRectangle(Pens.Black, x, y, Ширина, Высота)
x = x + Ширина + Зазор_х 'Вычисляем горизонтальную координату следующего окна
Next
Рисуем весь небоскреб. Следующая ступень усложнения – последняя – нарисовать все этажи небоскреба. Для этого 5 нижних строчек фрагмента 2 должны быть выполнены заданное число раз, каждый раз – с новым значением y. Чтобы этого достичь, «обнимем» эти строчки оператором For:
Программа
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Зазор_х = 4
Зазор_у = 6 'Зазор между окнами соседних этажей
Ширина = 5 : Высота = 10
Э = InputBox("Введите количество этажей")
П = InputBox("Введите количество подъездов")
y = 30
For i = 1 To Э
x = 20
For j = 1 To П
Граф.DrawRectangle(Pens.Black, x, y, Ширина, Высота)
x = x + Ширина + Зазор_х
Next j
y = y + Высота + Зазор_у 'Вычисляем вертикальную координату следующего окна
Next i
Граф.DrawRectangle(Pens.Black, 8, 15, x, y) 'Рисуем контур небоскреба
End Sub
Задание 55.
«Ковер» (Рис. 10.5).
Рис. 10.5
Ковер сделан из пересекающихся окружностей. Если центры соседних окружностей отстоят друг от друга на одинаковое расстояние как по горизонтали, так и по вертикали, и если удачно подобраны размеры, то ковер у вас получится красивым и с аккуратными краями. Дополнение А: Если ковер получился, сделайте, чтобы у него был вырезан правый верхний угол. Дополнение Б: Если и это получилось, сделайте, чтобы у него был вырезан вдобавок и квадрат посередине.
Задание 56.
«Шахматная доска». Нарисуйте шахматную доску (Рис. 10.6).
Рис. 10.6
Указание: Здесь основные трудности возникнут при раскраске клеток в шахматном порядке. У Волчёнкова (См. Список литературы) я встретил следующую идею относительно того, как закрашивать клетки: Те клетки, у которых сумма номеров строки и столбца четная, закрашивать одним цветом, остальные – другим.
Задание 57.
«Таблица умножения». Нарисовать на форме таблицу умножения, как на Рис. 10.3.