Visual Basic. Оператор цикла в 8-ом классе

Э.М. Сухорученко

Москва, школа 211

 

На первом этапе изучения Visual Basic – в 8-ом классе – в курсе алгоритмического программирования особую трудность вызывает программы с алгоритмом повтора, т.е. оператором цикла. Эта работа предназначена тем, кто только начинает преподавать Visual Basic и пока испытывает трудности.

 

В этой работе предполагается, что среда VB детям уже известна и они знают о существовании формы, объектов управления и их свойств.

 

В разделе General формы (Form1) описываем переменные, которые в дальнейшем будут использоваться. Лучше, если мы это будем делать постепенно, по мере возникновения необходимости в новой переменной. В итоге получим такой общий раздел:

Dim   J   As Long

Dim  I, K, N, W, H, StepL  As Integer

 

Private Sub Form_Load()

'Form2.show'этот оператор добавим позже

W=Form1.ScaleWidth  'ширина формы

H=Form1.ScaleHeight  'высота формы

End   Sub

Начало координат формы находится в левом верхнем углу внутреннего поля формы. Ось X – направлена вправо, ось Y – вниз. .

Детям нужно рассказать об основных свойствах формы, которые понадобятся нам сейчас.

Два щелчка по форме вызывают раздел событийной процедуры загрузки Form1. В нём  запоминаем размеры загружаемой формы. Для этого используем свойства формы, перечисленные в окне свойств:

Form1.ScaleWidth – ширина внутреннего поля формы.

Form1.ScaleHeight – его высота.

Form1.DrawWidth = 3 – задаём толщину линий.

Form1.BackColor – цвет фона формы

Позже здесь появится оператор Form2.show.

 

И, наконец, появляется понятие метода – процедуры, которая, как и свойства, привязана к элементам управления, и предназначена для изменения их свойств.

 Line и Circle – методы формы, которые предназначены для рисования на форме линий, прямоугольников, окружностей, эллипсов и дуг.

Из текстов приведённых процедур и комментариев нетрудно понять, как задаются параметры этих примитивов. Это детьми усваивается легко.

Переходим к конкретным примерам, на основе которых очень удобно и результативно даётся тема "Оператор цикла". Все эти примеры основываются на возможности рисования простейших графических образов. В нижней части формы располагаем командные кнопки, как показано на рисунке внизу. Используя их свойство Caption, заменяем их надписи: Command1 – на ВертШтрих, Command2 – на ГоризШтрих, Command3 – на Шарик, Command4 Очистка и т.д. в соответствии с рисунком. Делаем всё это по мере перехода к очередной задаче и появления новых кнопок.

Первые два примера посвящены штриховке формы "в клеточку".

 

Private Sub Command1_Click()

'Вертикальная штриховка формы.

nL=25  'кол-во вертикальных линий

'вычисляется расстояние между линиями:

StepL= Int (Form1.ScaleWidth/25)

For I = 1 To 20

 ' Общий вид оператора: Form1.Line (x1.y1)-(x2,y2)

Form1.Line (StepL * I, 0)-(StepL * I, H)

'на каждом шаге рисуется одна линия, H – высота.

Next I

End Sub

 

После нажатия двух кнопок "ВертШтрих" и "ГоризШтрих" одну за другой получаем такую картинку.

Вторая событийная процедура такова:

Private Sub Command2_Click()

'Горизонтальная штриховка

For I = 1 To 20

' W – ширина формы в любых единицах.

Form1.Line (0, StepL * I)-(W, StepL * I)

Next I

End Sub

Результат видим справа.

 

Следующий пример особенно нравится детям. Приведённая здесь процедура Command3_Click() обеспечивает эффект мультипликации: маленький шарик двигается горизонтально, отражаясь от "стенок" формы Это не просто графика, а анимация, простейший способ её реализации.

 

Обращаемся к методу Circle, рисующему окружности, дуги и эллипсы. Для рисования окружности следует лишь указать координаты (x,y) – центра окружности, её радиус и цвет.

Добиться этого эффекта анимации, как видно из приведённого примера, нетрудно: рисуется окружность и стирается, затем рисуется чуть правее и опять стирается. На каждом шаге цикла центр окружности незначительно сдвигается вправо. Стирание – это повторное рисование, но фоновым цветом. Детям нужно напомнить, что этот принцип стирания заложен и в инструмент "ластик" графического редактора.

Сложность – в подборе паузы между рисованием и стиранием, которая необходима, чтобы наш глаз успел увидеть нарисованный кружок. Сейчас мы добьёмся этого с помощью холостого оператора цикла. В дальнейшем для этой цели будет использоваться будильник.

В приведённой справа процедуре количество шагов холостого цикла – 500000. Число подобрано для мощного компьютера. Для Pentium 133 – это число в диапазоне от 100000 до 50000 Очевидно, что каждый подбирает это число методом проб. Итак, процедура справа.

 

Private Sub Command3_Click()

N=Int(W/20)  ' кол-во шагов цикла анимации

Y=Int(H/2)    'уровень линии движения

' Дважды шарик пробегает туда и обратно (K=1,2)

For K=1 To 2

' Движение вправо:

For I = 1 To N

'Функция QBColor задаёт один из 16-ти цветов

' Рисуем:

Form1.Circle (20*I, Y), 150, QBColor(10)

For J = 1 To 500000 'пауза

Next J

'Стираем:

Form1.Circle (20*I,  Y), 150, Form1.BackColor

Next I

' Движение влево:

For I = 1 To N

Form1.Circle (W – 20*I, Y), 150, QBColor(10)

For J = 1 To 500000  'пауза

Next J

Form1.Circle (W–20*I,Y), 150,Form1.BackColor

Next I

Next  K

End Sub

 

Уже было сказано, что Line и Circleэто методы формы, а к методам принято обращаться с помощью точечной нотации, например, Form1.Circle(…). В данном случае разрешается опустить имя объекта Form1 и использовать такое обращение: Line (I, 0)-(I, H) или Circle (x1, y1), R.  При этом всегда подразумевается та форма, в которой располагается этот оператор.

На одной форме мы нарисовали уже много. Катающийся шарик уже стёр в штриховке полосу. Для дальнейшей работы  совершенно необходима процедура очистки экрана от графики. И это очень полезный опыт. Способ не один.. Я привожу процедуру, привязанную к кнопке Command4, надпись на которой гласит: Очистка.

 

:Private Sub Command4_Click()

For I = 1 To W

Line (I, 0)-(I, H), Form1.BackColor

Next I

End Sub

 

 

Эта событийная процедура стирает все рисунки формы, не затрагивая элементы управления. Вопрос решается просто: форма заполняется вертикальными прямыми линиями фонового цвета (Form1.BackColor).

Приступаем к более эффектной штриховке. Детям, имеющим проблемы с алгеброй, она даётся хуже. Добавляются две кнопки Command5 и Command6, на которых делаем надписи ЛеваяКосая и ПравКосая.

 

На первом шаге рисуется наклонная прямая. Особенность её по сравнению с линией вертикальной штриховки состоит в том, что она почти полностью находится за пределами формы, слева от неё.

Нужно обратить внимание на то, что рисовать за пределами формы можно, но на экране видно только то, что находится внутри формы

Начинается штриховка так, как показано справа.

 

Все остальные линии параллельны 1-ой и расположены правее.

Private Sub Command5_Click()

StepL = 200

nL = Int ((H / 2 + W) / StepL)

For I = 1 To nL

Line (–H/2 + StepL*I, 0)–(StepL*I, H), QBColor(1)

Next I

End Sub   'смотрим рисунок справа.

 

 

Следующая процедура аналогична, только штриховка противоположного наклона.

 Private Sub Command6_Click()

StepL = 200

nL = Int ((H / 2 + W) / StepL)

For I = 1 To nL

Line (–H/2 + StepL*I, H)-(StepL*I, 0), QBColor(1)

Next I

End Sub

После вызова двух последних процедур с помощью кнопок ЛеваяКосая и ПравКосая мы получим красивую штриховку "ромбами". Вид её представлен справа.

 

 

 

Ещё один интересный  и несложный пример изображён слева.

Процедура привязана к кнопке Command7 с надписью Веер, и выглядит так:

Private Sub Command7_Click()

For I = 0 To W Step 150

Line (W / 2, 100)-(I, H - 300)

Next I

End Sub

Цикл реализован несколько иначе. Параметр цикла I является x-координатой нижних точек создаваемого рисунка "веера".

Есть ещё два примера, но 1-я форма перегружена. Добавим 2-ю форму – Form2. Для этого выберем команду Add Form в меню Project.

Форма появляется, но лишь в среде. Этого мало, т.к. после старта проекта её на экране не будет. Вопрос решается следующим образом: в процедуру Form_Load() загрузки 1-ой формы нужно добавить оператор  Form2.show. Существует иной способ решения проблемы, но об этом говорим в старших классах.

Нужные в этой форме переменные придётся описать заново в её разделе General. Правильнее было бы сделать их глобальными, поместив описание в Модуль. Но в 8-ом классе об области видимости переменных мы пока не говорим.

Поэтому описываем I, W и H в общем разделе (General) Form2. А в процедуре загрузки новой формы определяем её ширину и высоту:

Dim  I, W, H As Integer

Private Sub Form_Load()

W = Form2.ScaleWidth

H = Form2.ScaleHeight

End Sub

 

Кроме того, метод Line теперь мы применим для создания прямоугольников. В нашем случае структура оператора такова:

Line (x1, y1)-(x2, y2), [цвет], Bздесь B является признаком того, что строится прямоугольник с указанными координатами левого верхнего и правого нижнего углов.

На форме Form2 размещаем три командных кнопки: Command1 с надписью Прямоуг, Command2 с надписью Круги и Command3 с надписью Очистить. Процедура очистки экрана полностью повторяет процедуру 1-ой формы. Две других приведены ниже.

Эта событийная процедура рисует вложенные прямоугольники зелёного цвета.

Private Sub Command1_Click()

For I = 1 To 9

Line (150 * I, 150 * I)-(W - 150 * I, H - 150 * I),  _¿  

QBColor(2), B

Next I

End Sub

Результатсправа.

Следует обратить внимание на то, что Visual Basic накладывает строгие требования на размещение операторов в строках. Для запрещённой разбивки строки на подстроки используют символы: пробел, знак подчёркивания (_) и Enter. Именно так разбита строка обращения к Line

 

Следующая процедура рисует вложенные окружности. Результат её работы – справа.

Private Sub Command2_Click()

For I = 1 To 9

Circle (W / 2, H / 2), 150 * I, QBColor(12)

Next I

End Sub

А процедура очистки формы от графики можно скопировать из Form1. Но мы для разнообразия сделаем другую: можно заполнить форму прямоугольником с заливкой фоновым цветом. Вот так:

Private Sub Command3_Click()

' очистка формы от рисунков

Line (0, 0)-(W, H), Form2.BackColor, BF

End Sub

И, заметьте, работает такая очистка гораздо быстрее.

 

Благодаря этим примерам, оператор For усваивается хорошо. Теперь можно переходить к теме Массивы и осваивать "оператор For" для создания и вывода на экран массива, а также работы с его элементами.