Для
Необходимость использования инструкции If : Then : Else возникает, если имеются альтернативные пути выполнения программы; при еe использовании проводится проверка условий и в зависимости от их истинности выполняются определeнные действия. Используется простой и полный синтаксис. Простой синтаксис:
If условие Then инструкция [Else инструкция]
- если условие, стоящее после If истинно ( True ), то выполняется инструкция, следующая за Then, если условие ложно ( False ), то выполняется инструкция, следующае за Else.
Полный синтаксис:
If условие 1 Then инструкция 1 . [инструкция m] [ElseIf условие 2 Then инструкция k] [Else инструкция n] End If
Во втором случае синтаксиса инструкция 1 : инструкция m,: записываются на новых строчках, присутствует инструкция End If. Наличие ElseIf позволяет анализировать дополнительные условия. Добавлением нескольких инструкций ElseIf можно анализировать дополнительное количество условий. Else используется для обработки противоположных ситуаций. Если нужно проверить некоторое условие при наличии другого условия, то используются вложенные инструкции, пример:
If условие 1 Then If условие 2 Then инструкция 1 . Else инструкция m End If Else инструкция n End If
Для демонстрации различия синтаксиса рассмотрим пример нахождения максимального из 2-х чисел.
Dim max As Integer If Val(txt1.Text) > Val(txt2.Text) Then max = Val(txt1.Text) Else max = Val(txt2.Text) lblMax.Caption = max или: If Val(txt1.Text) > Val(txt2.Text) Then max = Val(txt1.Text) Else: max = Val(txt2.Text) End If lblMax.Caption = max
Цикл For : Next предназначен для выполнения определeнного количества действий, когда количество действий известно заранее; синтаксис:
For начальное_значение переменной-счeтчик To конечное_значение переменной-счeтчик [Step величина шага] инструкции Next [переменная-cчeтчик]
Сначала инициализируется начальное значение переменной-счeтчик, при каждом выполнении цикла еe значение увеличивается на величину шага, или на 1, если шаг не указан.
Создать требуемые объекты, см. код процедуры Command1_Click(), данный ниже, очистить свойство Text текстового поля, а его свойству Multiline присвоить значение Тrue, тогда в процессе выполнения будет проводиться перенос строк в текстовое поле. Ввести код:
Private Sub Command1_Click() Dim mass(15) As Integer, i As Integer Rem переменная для хранения суммы элемeнтов массива Dim summ As Integer For i = 0 To 14 mass(i) = i ' вывод элементов массива в поле списка lst1.List(i) = mass(i) ' вывод значений i в поле TextBox txt1.Text = txt1.Text " " i Next i summ = 0 For i = 0 To 14 ' суммирование элементов маcсива summ = summ + mass(i) Next i lbl1.Caption = summ ' вывод суммы элементов End Sub
стартовать проект, сделать щелчок на командной кнопке.
Используется функция RND, возвращающая
Создать требуемые объекты, см. код, данный ниже и ввести код:
Private Sub Command1_Click() Dim mass(15) As Integer, I As Integer, A As Integer, В As Integer Dim Summ As Integer A = -5: B = 5: Summ = 0 For I = 0 To 14 mass(I) = Int(Rnd * (B - A + 1) + A) lst1.List(I) = mass(I) Summ = Summ + mass(I) Next I lbl1.Caption = Summ End Sub
стартовать проект, сделать щелчок на командной кнопке.
Создать на форме элемент управления CommandButton, создать массив полей списка, для этого:
(рис 2.1) Схема формы
ввести код:
Private Sub Command1_Click() Dim mass(15, 3) As Single, i As Integer, j As Integer Dim A As Integer Dim B As Integer, Summ As Single A = -5: B = 5: Summ = 0 For j = 0 To 14 For i = 0 To 2 mass(j, i) = Rnd * (B - A) + A ' вывод элементов в поля массива списка List1(i).List(j) = mass(j, i) ' суммирование элементов двумерного массива Summ = Summ + mass(j, i) Next i, j Label1.Caption = Summ ' вывод суммы элементов массива End Sub
стартовать проект, сделать щелчок на командной кнопке.
Цикл Do : Loop используется, если точное количество повторений действий заранее неизвестно или нужно дождаться выполнения некоторого условия. Цикл Do : Loop может выполняться бесконечно:
Do повторяющееся действие Loop
Различают 2 Do : Loop с завершением:
Do While условие инструкции Loop
Do Until условие инструкции Loop
Создать массивы, вычислить сумму их элементов.
Private Sub Command1_Click() Dim sum As Integer, mas(5) As Integer, к As Integer mas(0) = 5: mas(1) = 6: mas(2) = 7: mas(3) = 6: mas(4) = 7 к = 0: sum = 0 ' здесь цикл повторяется до тех пор, пока значение ' переменной остается < 5 Do While к < 5 sum = sum + mas(к) к = к + 1 Loop lbl1.Caption = sum End Sub Private Sub Command2_Click() Dim sum As Integer, mas(5) As Integer, к As Integer mas(0) = 5: mas(1) = 6: mas(2) = 7: mas(3) = 6: mas(4) = 7 sum = 0: к = 0 Do Until к = 5 sum = sum + mas(к) к = к + 1 Loop lbl2.Caption = sum End Sub
Цикл Do : Loop часто применяется при считывании записей из файла:
Do While Not EOF #номер файла EOF (End of File) - признак конца файла.
Циклы Do :Loop могут управляться в конце. В примерах, данных ниже расположение условий в начале/конце циклов равноценно.
Создать необходимые объекты, очистить свойства Caption элементов управления Label, ввести код, cтартовать проект, выполнить оба цикла.
Private Sub Command1_Click() Dim i As Integer i = 0 Do While i < 7 lbl1.Caption = lbl1.Caption " " i i = i + 1 Loop End Sub Private Sub Command2_Click() Dim i As Integer i = 0 Do lbl2.Caption = lbl2.Caption " " i i = i+ 1 Loop While i < 7 End Sub
Использование блока Select Case позволяет принять решение при наличии нескольких условий; синтаксис:
Select Case переменная_выбора Case 1 значение 1 инструкция 1 Case 2 значение 2 инструкция 2 . ' Case Else выполняется, если не выполнено ни одно из ' предыдущих условий Case Else инструкция k End Select
Синтаксис Select Case разрешает использование условий < > =, при этом используется ключевое слово Is, пример:
Select Case people Case Is < 100000 инструкция 1 Case Is < 500000 инструкция 2 End Select
В качестве значения для Case можно указывать не одно значение, а несколько через запятую. Пример использования:
Dim A As Single A = Val(Text1.Text) Select Case A Case Is < 0: lbl1.Caption = "<0" Case Is = 0: lbl1.Caption = "0" Case Else: lbl1.Caption = ">0" End Select
Инструкция безусловного перехода - это GoTo. Безусловный переход выполняется без анализа условий. Часто используется совместно с инструкцией On Error в обработчиках ошибок, см. ниже, праkтическая работа 50.
Вызов Call в процедуре временно передаeт управление другой процедуре, после завершения которой управление снова передаeтся той процедуре, из которой последовал вызов. Вызов процедуры может выглядеть так: Call имя_вызываемой_процедуры
при этом инструкция Call может отсутствовать. Часто требуется передавать процедуре значения параметров, необходимых для еe выполнения.
Примеры:
' процедура Sub Peter() вызывает процедуру Sub FrZeit(Zeit), ' передавая ей значение 7 для еe аргумента; после ' завершения процедуры Sub FrZeit(Zeit) управление ' ' возвращается к Sub Peter(). Далее Sub Peter() вызывает ' процедуру Sub Message(); после щелчка пользователя ' на кнопке окна, выводимого функцией MsgBox, управление ' возвращается к Sub Peter(), которая завершается. Sub Peter() FrZeit 7 Message End Sub Sub FrZeit(zeit) For i = 1 To zeit . Next End Sub Sub Message() MsgBox "Es ist zu frueh" ' слишком рано End Sub ' два способа вызова процедуры с несколькими аргументами Sub Paul() KlPause 15, 25 Call KlPause(11, 30) End Sub Sub KlPause(zeit As Integer, Dauer As Integer) If zeit >= 12 Then Dauer = Dauer*2 End If End Sub
Процедура есть последовательность инструкций, объединeнных для выполнения. Различают процедуры обработки событий и процедуры общего назначения: процедуры Sub, Function, Property, Event.
Для создания процедуры общего назначения нужно использовать область окна кода ( General ) ( Declarations ) $$\to$$ меню Инструменты $$\to$$ Добавить процедуру $$\to$$ в поле выведенного диалогового окна ввести имя процедуры $$\to$$ в поле Тип сделать щелчок на Sub $$\to$$ сделать выбор в поле Район $$\to$$ ОК $$\to$$ выводятся инструкции описания процедур.
Процедуры обработки событий (закрытые процедуры) являются процедурами типа Private; их можно вызвать только внутри формы. Процедуры являются общими (открытыми), если они могут быть вызваны процедурами другой формы/модуля; используется ключевое слово Public. Общая процедура должна содержаться в модуле.
Вызов процедуры из другой процедуры можно выполнить одним из следующих способов:
If kkKK > 70 Then Proc1 End If
Call Proc1
Proc1 44, 56 ' два числа - это передаваемые аргументы,
или: Call Proc1(44, 56)
Список аргументов процедуры, при необходимости с указанием типа, размещают в скобках в строке имени процедуры, при этом в процедурах обработки событий список аргументов определeн событием и не может быть изменeн пользователем.
При программировании необходимо контролировать передачу аргументов.
Передача аргументов типа значение (хранятся в стеке; пример - тип Integer, Single ) и ссылочного типа (хранятся в динамически распределяемой памяти; пример - Object, массив) между вызывающей и вызываемой процедурой может вызывать модификацию данных. |
Передача аргументов может проводиться: по значению - ByVal ( в этом случае процедуре передаeтся копия этого значения) и по ссылке - ByRef (в этом случае вызванная процедура получает адрес памяти передаваемой переменной).
Инструкция в процедуре Sub/Function может передавать значения вызываемой процедуре, при этом могут использоваться именованные аргументы, которые можно перечислять в произвольном порядке. Именованный аргумент состоит из:
Private Sub Command1_Click() Dim x1 As Variant MsgBox Title:="отпуск", Prompt:="Едем в отпуск в Испанию" или x1 = MsgBox(Title:="отпуск", _ Prompt:=" Едем в отпуск в Испанию", Buttons:=4) End Sub
Особенностью процедур Function является то, что результатом их работы является возвращаемое значение. При создании процедуры Function используется инструкция Function и в конце - инструкция End Function. Функция может получать аргументы, передаваемые ей вызывающей процедурой. Если аргументов нет, то скобки пусты. При использовании аргумента должен указываться соответствующий тип данных. За скобками указывается тип возвращаемого значения.
Вызов функции реализуется в соответствии с синтаксисом:
Возвращаемое_значение = Имя_функци(Аргумент_1, : Аргумент_к); пример: х1 = Func1(20, 30)
Здесь вызывается функция Func1, в передаются значения 20, 30. Возвращаемое значение присваивается переменной х1.
Создадим функцию вычисления факториала числа ( Factor ), используем тип вводимых данных - Integer, возвращаемых - Double, тогда максимальное возвращаемое значение ограничивается числом 1.80Е308. Примем факториал равным нулю, если значение аргумента превышает 170 (факториал 170 соответствует максимальному значению принятого типа данных). Последовательность действий:
txtInp - для ввода числа, факториал которого нужно вычислить, txtOut - для вывода результата и командную кнопку, рис. 2.2.,General ) ( Declarations ) $$\to$$ меню Инструменты $$\to$$ Добавить процедуру $$\to$$ в поле выведенного диалогового окна ввести имя функции Factor $$\to$$ в поле Тип сделать щелчок на Function, в поле Район - щелчок на Public $$\to$$ ОК $$\to$$ выводятся инструкции Function и End Function.В качестве аргумента функции используется вводимое в поле TextBox (после старта проекта) число, оно описывается "As Integer" (ввести это в скобки, относящиеся к инструкции Function ). Тип возвращаемого функцией значения нужно описать "As Double" (ввести это за скобками в строке Function ): Public Function Factor(x As Integer) As Double
Private Sub Command1_Click() ' проводится преобразование вводимых данных в ' числовые значения, вычисляется факториал введeнного ' числа, результат преобразуется в тип String и выводится ' в поле txtOut txtOut.Text = Str(Factor(Val(txtInp.Text))) End Sub ' указание типа данных аргумента и типа данных ' возвращаемого фунцией значения Public Function Factor(x As Integer) As Double Dim i As Integer ' i - переменная-счeтчик If x > 0 And x < 171 Then Factor = 1 For i = 2 To x Factor = Factor * i Next i Else Factor = 1 End If End Function
Процедура Sub начинается инструкцией Sub и заканчивается инструкцией End Sub, между ними размещается код. Различают процедуры обработки событий и процедуры общего назначения. Процедуру обработки событий можно отличить по еe имени, содержащему Command1_Click (). Ниже приводится пример создания процедуры Sub.
Решается задача деления городов на группы в зависимости от соответствующей численности населения, которая задаeтся как набор случайных чисел. Рассматриваются 2 варианта:
Select Case,Case используется вызов процедуры ( Call mList(i, k) ).Последовательность действий:
ListBox (слева), содержащие списки названий городов и численности населения. Их идентификаторы: lstName, lstNum. Список из 20 названий, см. рис. 2.3, (Athen - Helsinki) вводится в поле свойства List объекта lstName (окно свойств). После ввода каждого названия использовать клавиши CTRL + Enter, в конце ввода - клавишу Enter. Oбразуется список, индексация проводится с 0,lstNameGr(0) - lstNameGr(3) и lstNumGr(0) - lstNumGr(3) (справа вверху), в которые будет выводиться результат деления численности населения городов на группы. В поле свойства List каждого объекта - элемента массива нужно ввести несколько нулей (поле списка представляет собой элемент массива и если при обращении к j+1 элементу j элемент не определен, то появится сообщение об ошибке),List1 (внизу), в который заносится информация, позволяющая проверить, обработан ли весь исходный список и указывающая, сколько городов содержится в каждом групповом списке,CommandВutton ; свойствам Caption присвоить значение Select Case и Call mList(i,k),Переменная j используется для индексации элемeнтов списков названий городов и численностей населения, а переменные i1, i2, i3, i4, i5 - для индексации численностей населения и названий городов в списках групп. 5-я группа создана для списка названий городов и соответствующих численностей населения, не попавших в предыдущие 4 группы.
Во второй строке кода Form_Load () проводится проверка названий городов: "If lstName.List(j) >= "A" Then : ". Код буквы А - наименьший и для всех названий городов задаeтся численность населения; если список названий закончился, то численности присваивается значение -1.
(General) (Declarations) Dim j As Integer Private Sub Form_Load() ' задать численность населения For j = 0 To 29 If lstName.List(j) >= "A" Then lstNum.List(j) = Int(Rnd ^ 3 * 2000000 + 100000) Else lstNum.List(j) = -1 End If Next j End Sub Private Sub Command1_Click() Dim i1 As Integer, i2 As Integer, i3 As Integer Dim i4 As Integer, i5 As Integer j = 0: i1 = 0: i2 = 0: i3 = 0: i4 = 0: i5 = 0 Do Until Val (lstNum.List(j)) <= 0 Select Case Val(lstNum.List(j)) Case Is < 100000: i5 = i5 + 1 lst1.List(5) = "i5=" i5 Case Is < 500000 lstNameGr(0).List(i1) = lstName.List(j) lstNumGr(0).List(i1) = lstNum.List(j): i1 = i1 + 1 lst1.List(1) = "i1=" i1 Case Is < 1000000 lstNameGr(1).List(i2) = lstName.List(j) lstNumGr(1).List(i2) = lstNum.List(j): i2 = i2 + 1 lst1.List(2) = "i2=" i2 Case Is < 1500000 lstNameGr(2).List(i3) = lstName.List(j) lstNumGr(2).List(i3) = lstNum.List(j): i3 = i3 + 1 lst1.List(3) = "i3=" i3 Case Is < 2000000 lstNameGr(3).List(i4) = lstName.List(j) lstNumGr(3).List(i4) = lstNum.List(j): i4 = i4 + 1 lst1.List(4) = "i4=" i4 Case Is >= 2000000: i5 = i5 + 1 lst1.List(5) = "i5=" i5 End Select j = j + 1 Loop End Sub
Анализ блоков Case показывает, что код аналогичен; при организации работы блоков используются переменные j, i1, i2, i3, i4, i5 и индексы элементов массивов к(0, 1, 2, 3) элементов управления ListBox, например: lstName(0).List(i1) = lstName.List(j)
Создадим процедуру Sub mList(i As Integer, k As Integer), переменные i (i1, i2, i3, i4, i5) и k(0, 1, 2, 3) будем передавать как аргументы. Создание процедуры $$\to$$ Добавить процедуру $$\to$$ поле выведенного диалогового окна ввести имя процедуры mList $$\to$$ в поле Тип сделать щелчок на Sub, в поле Район - щелчок на Public а ОК а выводятся инструкции Sub и End Sub, ввести аргументы процедуры: ( i As Integer, k As Integer ). Создаваемая процедура Sub представлена ниже, а обращение к ней, например для блока Case Is<500000 будет иметь вид: Call mList(i1, 0) - здесь i1 - индекс элемeнта в списке группы, а 0 - индекс элемента массива, (i - индекс элемента в списке группы, к - индекс элемента массива).
Public Sub mList(i As Integer, k As Integer) lstNameGr(k).List(i) = lstName.List(j) lstNumGr(k).List(i) = lstNum.List(j): i = i + 1 lst1.List(k + 1) = "i = " i End Sub
Private Sub Command2_Click() Dim i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer Dim i5 As Integer j = 0: i1 = 0: i2 = 0: i3 = 0: i4 = 0: i5 = 0 Do Until lstNum.List(j) <= 0 Select Case Val(lstNum.List(j)) Case Is < 100000: i5 = i5 + 1: lst1.List(5) = "i5=" i5 Case Is < 500000: Call mList(i1, 0) Case Is < 1000000: Call mList(i2, 1) Case Is < 1500000: Call mList(i3, 2) Case Is < 2000000: Call mList(i4, 3) Case Is >= 2000000: i5 = i5 + 1: lst1.List(5) = "i5=" i5 End Select j = j + 1 Loop End Sub
(рис 2.3) Деление городов на группы в зависимости от соответствующей численности населения
Процедура Property состоит из последовательности инструкций, позволяющих создавать свойства объектов и работать с ними. Существует 2 типа процедур Property, табл. 2.1
| Название | Назначение |
| Property Let | Присваивает значение свойству |
| Property Get | Возвращает значение свойства |
Синтаксис процедур:
[Public | Private] [Static] Property {Get | Let} имя [(список аргументов)] [As тип]
инструкция 1
.
инструкция к
End Property
Здесь
Обычно процедуры свойств используются попарно.
Обязательные аргументы при описании процедур и синтаксис вызова процедур представлены в табл. 2.2 и табл. 2.3 соответственно.
| Название | Синтаксис описания |
| Property Let | Property Let имя(1, :, к) |
| Property Get | Property Get имя(1, :, к) As тип |
| Название | Синтаксис |
| Property Let | [oбъект.]свойство[(аргументы)] = аргумент |
| Property Get | Переменная = [объект.]свойство[(аргументы)] |
Инструкции Property Let описывают текст программы, составляющей процедуру Property Let, которая присваивает значение свойству, аргументы могут передаваться ByRef и ByVal. Инструкции Property Get описывают текст программы, составляющей процедуру Property Get, считывающую значение свойства, аргументы могут передаваться ByRef и ByVal.
Упрощeнный синтаксис аргументов процедуры Property:
[ByVal | ByRef] имя_переменной [( )] [As тип]
Инструкции Property Let используются для описания процедуры Property Let, предназначеной для изменения значения свойства (здесь цвет волос). Инструкции Property Get используются для описания процедуры, считывающей значение свойства. Процедура возвращает текущий цвет. Последовательность действий:
Property (см. выше), ввести имя процедуры - hairColor $$\to$$ в поле Тип сделать щелчок на Property $$\to$$ ОК $$\to$$ выводятся инструкции Property Let, End Property и Property Get, End Property,(General) (Declarations) Dim CurrentColor As Integer Const BLACK = 0, RED = 1, GREEN = 2 Private Sub Command1_Click() Rem задать цвет волос с помощью процедуры Property Let Rem (синтаксис: свойство = аргумент) hairColor = BLACK lbl1.Caption = CurrentColor End Sub Rem процедура изменяет значение свойства цвет волос Property Let hairColor(ByVal Color As Variant) Select Case Color Case RED: CurrentColor = 1 Case GREEN: CurrentColor = 2 Case Else: CurrentColor = 0 End Select End Property Rem процедура возвращает текущий цвет волос Property Get hairColor() As Variant Select Case CurrentColor Case Is = 1: hairColor = 1 Case Is = 2: hairColor = 2 Case Is = 0: hairColor = 0 End Select End Property Private Sub Command2_Click() Rem определить цвет волос с помощью процедуры Property Rem Get (синтаксис: переменная = свойствo) Dim Color As Variant Color = hairColor lbl2.Caption = Color End Sub
(рис 2.4) Property Let, Property Get
Ниже приводятся примеры некоторых типовых алгоритмов.
Private Sub Command1_Click() Dim m(25) As Integer ' описание массива ' описание переменной для хранения максимального значения Dim max As Integer Dim j As Integer, i As Integer 'описание переменныx-счeтчик ' создание массива и вывод его элементов в поле списка For i = 0 To 24 m(i) = Int(Rnd * 40 + 1) lst1.List(i) = m(i) Next i max = m(0) ' пусть m(0) будет максимальным элементом For j = 1 To 24 ' поиск максимального элемента ' если текущий элемент массива больше текущего ' максимального, то сделать его максимальным элементом If m(j) > max Then max = m(j) Next j lbl1.Caption = max ' вывод результата в поле lbl1 End Sub
В университетах M и N число студентов x1 и x2 соответственно, стоимость обучения каждого за весь период обучения равна st1 и st2; обучение длится ja1 и ja2 лет соответственно. Определить где выше стоимость обучения за 1 год. Последовательность действий:
CommandButton и TextBox, ввести код, данный ниже:Private Sub Command1_Click() Dim st1 As Single, st2 As Single, ja1 As Integer, ja2 As Integer Dim x1 As Integer, x2 As Integer x1 = 2000 ' ввод исходных данных x2 = 3000: ja1 = 4: ja2 = 5: st1 = 250.5: st2 = 300.7 If x1 * st1 / ja1 > x2 * st2 / ja2 Then txt1.Text = "Университет M:" x1 * st1 / ja1 Else txt1.Text = "Университет N:" x2 * st2 / ja2 End If End Sub
Задание: создать список названий футбольных клубов страны. Переписать список в массив football(j). Последовательность действий:
ListBox, поле метки. Ввести код, данный ниже, пояснения даны под комментариями:(General) (Declarations) Dim football(20) As String ' описание массива названий клубов Private Sub Form_Load() Dim j As Integer, i As Integer, Аr As String ' Аr - условное название клуба For j = 0 To 14 ' формирование списка названий клубов Ar = "C" ' часть условного названия клуба ' формирование условных названий клубов For i = 0 To 2 Ar = Ar Int(Rnd * 10 + 1) Next i lst1.List(j) = Ar ' вывод названий в поле ListBox Next j ' создание признака конца списка. После инструкции ' Next значение переменной-счётчик увеличивается на 1 lst1.List(j) = "-1" End Sub ' переписывать список в массив football(20) до тех пор, пока не ' появится признак конца списка Private Sub Command1_Click() Dim j As Integer j = 0 Do Until lst1.List(j) = "-1" football(j) = lst1.List(j) lst2.List(j) = football(j) j = j + 1 Loop lbl1.Caption = j ' определить, сколько элементов переписано End Sub
Задание: массив tanker(к) содержит названия танкеров, массив capacity(к) - соответствующую вместимость. Разделить массивы на 3 группы в зависимости от вместимости (до 30 000, 30 000 - 100 000, более 100 000). Вывести результаты в массив поля списка.
Последовательность действий:
CommandButton, Label для вывода набора символов - условных названий танкеров, см. код ниже,ListBox для вывода массивов названий и вместимости танкеров, см. код процедуры Form_Load (),ListBox: каждый из 3-х элементов для вывода результатов деления объектов на 3 группы:ListBox несколькими нулями, для этого использовать их свойство List,
(рис 2.6) Схема формы
(General) (Declarations) Dim tanker(24) As String ' описание массива названий танкеров ' описание массива вместимостей танкеров Dim capacity(24) As Long Private Sub Form_Load() Dim j As Integer, i As Integer, ch As String ' ch - символ - условное название танкера ch = "A" ' формирование названий и вместимости танкеров, вывод ' данных For j = 0 To 21 Label1.Caption = ch tanker(j) = ch ' массив условных названий танкеров, ' формирование случайных чисел, характеризующих ' вместимость capacity(j) = Int(Rnd ^ 3 * 1000000 + 1) List1.List(j) = tanker(j) ' вывод в поле List1 названий List2.List(j) = capacity(j) ' вывод в поле List2 ' вместимостей ' изменить символ - название танкера. Функция Asc() ' возвращает значение типа Integer, представляющее ' код символа для первого символа строки, функция ' Chr() возвращает значение типа String, содержащее ' символ, соответствующий указанному коду (набор ' символов ANSI) ch = Chr(Asc(ch) + 1) ' вывод в поле Label1 символов - условных названий ' танкеров Label1.Caption = Label1.Caption ch Next j capacity(j) = -1 ' создание признака конца массива End Sub Private Sub Command1_Click() Dim j As Integer ' переменные i1, i2, i3 определяют позиции элементов в ' массивах объектов Dim i1 As Integer, i2 As Integer, i3 As Integer j = 0: i1 = 0: i2 = 0: i3 = 0 ' деление элементов массивов на 3 группы Do Until capacity(j) = -1 Select Case capacity(j) Case Is < 30000: List3(0).List(i1) = capacity(j) List4(0).List(i1) = tanker(j): i1 = i1 + 1 Case Is < 100000: List3(1).List(i2) = capacity(j) List4(1).List(i2) = tanker(j): i2 = i2 + 1 Case Is >= 100000: List3(2).List(i3) = capacity(j) List4(2).List(i3) = tanker(j): i3 = i3 + 1 End Select j = j + 1 Loop End Sub
Сортировка. Сортировка выполняется попарным сравнением сортируемых элементов (например, элементов массива). В общем случае для сортировки массива из N элементов требуется N*(N-1)/2 сравнений. В случае сортировки по убыванию, например, сравнивается к-элемент массива с предыдущим. Если он больше предыдущего, то их меняют местами, затем сравнивается следующая пара и .т.д. Ниже приведены элементарные примеры.
Создать на форме требуемые элементы управления, см. код, данный ниже, ввести код; пояснения даны под комментариями. Затем стартовать проект.
(General) (Declarations) Dim i As Integer, j As Integer, bu As Long ' bu - переменная для временного хранения сортируемых ' данных Dim m(25) As Long, mas(25) As Long ' создание массива случайных чисел и вывод их в поле List1 Private Sub Form_Load() For j = 1 To 25 m(j) = Int(Rnd * 100000) List1.List(j - 1) = m(j) Next j End Sub Private Sub Command1_Click() ' выполнить сортировку For i = 1 To 24 For j = i + 1 To 25 ' если следующий элемент больше предыдущего, то ' поменять их местами If m(i) < m(j) Then bu = m(i): m(i) = m(j): m(j) = bu Next j, i For j = 1 To 25 ' результат вывести в поле List2 List2.List(j - 1) = m(j) Next j End Sub
Private Sub Command2_Click() For j = 25 To 1 Step -1 mas(j) = Int(Rnd * 100000): List1.List(25 - j) = mas(j) Next j For j = 2 To 25 ' выполнить сортировку For i = 2 To 25 - j + 2 If mas(i - 1) > mas(i) Then bu = mas(i - 1): mas(i - 1) = mas(i): mas(i) = bu End If Next i Next j ' результат вывести в поле списка в обратном порядке For j = 25 To 1 Step -1 List2.List(25 - j) = mas(j) Next j End Sub
Задание: создать список названий городов, создать список соответствующих численностей населения. Найти максиальную численность населения и соответствующее название города. Последовательность действий:
Command1_Click () и Command2_Click () и рис. 2.7(General) (Declarations) ' описание массива названий городов; здесь - целых чисел Dim citiesName(20) As String ' описание массива численностей населения городов Dim citiesNum(20) As Long Dim k As Integer ' переменая к используется в процедуре Command1_Click(), ' поэтому не должна описываться как Static Private Sub Form_Load() Dim j As Integer ' создание массива численностей; здесь название города - это ' значение переменной-счетчик For j = 1 To 9 citiesNum(j) = Int(Rnd * 10000000 + 1) txtNum = citiesNum(j): txtName = j ' вывод численностей населения в поле Label3 Label3 = Label3 " " citiesNum(j) Label4 = Label4 " " j ' вывод названий городов в поле ' Label4 Next j citiesNum(j) = -1 ' признак конца маcсива txtNum = citiesNum(j) txtName = j End Sub ' последовательным нажатием командной кнопки создать ' массив названий городов citiesName(k) Private Sub Command1_Click() k = k + 1 ' если численность населения больше 0, то заполнить массив ' названий городов и вывести данные в текстовые поля If citiesNum(k) > 0 Then txtNum.Text = citiesNum(k): citiesName(k) = k txtName.Text = citiesName(k) Else ' иначе вывести сообщение: "Список городов исчерпан" txtName.Text = "Список городов исчерпан" txtName.BackColor = vbGreen End If ' название города, в котором нет населения ( 10) вывести в ' текстовое поле Text1.Text = "k = " k End Sub ' с помощью поцедуры Command1_Click() созданы названия ' городов, ранее созданы соответствующие численности ' населения: масивы - citiesNum() и citiesName(). Процедура ' Command2_Click() обеспечивает поиск максимума ' численности населения и названия соответствующего ' города Private Sub Command2_Click() ' maxNum - переменная для хранения максимальной ' численности населения Dim maxNum As Long ' maxName - переменная для хранения названия города с ' максимальной численностью населения Dim maxName As String If citiesNum(1) <= 0 Then txtName = "Массив пуст": GoTo 100 ' пусть максимальным будет первый элемент массива maxNum = citiesNum(1) maxName = citiesName(1) ' начиная с к = 2 проводится сравнение элементов массива с ' максимальным значением k = 2 ' если масcив численности населения не пуст, сравнить ' (последовательно) текущий элемент с максимальным. Если ' он больше текущего максимума, то сделать его ' максимальным; в текстовое поле вывести ' соответствующее значение 20 If citiesNum(k) > 0 Then If citiesNum(k) > maxNum Then maxName = citiesName(k): maxNum = citiesNum(k) Text1.Text = "k=" k: k = k + 1: GoTo 20 Else ' вывод максимальной численности, вывод названия ' города с максимальной численностью населения txtNum.Text = maxNum txtName.Text = maxName End If 100 End Sub
(рис 2.7) Нахождение максимальной численности населения с выводом соответствующего названия города
Задание: создать в диалоговом режиме 4 массива национальностей, проживающих в 4-х странах (рис. 2.8, в центре вверху), затем вывести в массив ListBox из 4-х элементов (рис. 2.8, слева в центре). Ввести в диалоговом режиме одну из 10 - 16 национальностей (введeнных ранее), для ввода использовать текстовое поле (рис. 2.8, слева). С использованием оператора LIKE найти страны проживания этой национальности. Обеспечить вывод результатов поиска в поля меток (рис. 2.8, 4 поля метки слева внизу). Обеспечить перемещение (использовать элемент управления Timer ) флага страны проживания после нахождения страны проживания.
Последовательность действий:
Command1 (Caption = Vergleichen (Muster)),Command2 (Caption = Nationalitaet-Massiv),Command3 (Caption = MassivList),TextBox: (Text1(0) - Text1(3)), (Text2(0) - Text2(3)), (Text3(0) - Text3(3)), (Text4(0) - Text4(3)) для ввода национальностей, рис. 2.8 вверху в центре,TextBox (Text5) для ввода искомой национальности, рис. 2.5, выше полей Label (используемых для вывода результатов),TimerК_Timer (), см. код и рис. 2.8(General) (Declarations) Option Compare Text Dim res As Boolean Dim muster As String ' описание шаблона для оператора Like ' zeile - описание вводимой строки для сравнения с шаблоном ' (оператор Like) Dim zeile As String Dim i As Integer, j As Integer ' х1 - х4 - переменные, обеспечивающие старт процедур ' TimerК_Timer(), Dim x1 As Variant, x2 As Variant, x3 As Variant, x4 As Variant Dim deu(4) As String ' deu(4) - grossb(4) - массивы национальностей, проживающих в ' соответствующих 4-х странах Dim oest(4) As String, span(4) As String, grossb(4) As String ' создание массивов национальностей, проживающих в 4-х ' странах: deu(4) - grossb(4) (кнопка Nationalitaet-Massiv) Private Sub Command2_Click() For i = 1 To 4 deu(i) = Text1(i - 1).Text: oest(i) = Text2(i - 1).Text span(i) = Text3(i - 1).Text: grossb(i) = Text4(i - 1).Text Next i End Sub ' вывод в массив элементов ListBox элементов массивов ' национальностей, см. рис. 5.4: командная кнопка Caption = ' MassivLIST Private Sub Command3_Click() For j = 1 To 4 List1(0).List(j - 1) = deu(j): List1(1).List(j - 1) = oest(j) List1(2).List(j - 1) = span(j): List1(3).List(j - 1) = grossb(j) Next j End Sub ' выполнение поиска - использование оператора Like; старт ' процедур, обеспечивающих перемещение флагов Private Sub Command1_Click() ' ввод в диалоговом режиме искомой национальности zeile = Text5.Text For i = 1 To 4 ' в качестве шаблона используется массив, ' просматриваемый в цикле muster = deu(i) ' переменной типа Boolean присваивается возвращае- ' мое значение res = zeile Like muster ' если переменная res есть True, то вывести название ' страны, где проживает национальность "zeile", вводимая в ' диалоговом режиме; далее определяется код х1: (Asc(x1)), ' что обеспечивает выполнение процедуры Timer1_Timer() (см. ' ниже), иначе - просматривать массив далее If res Then Label11 = "Deutschland": x1 = Label11: x1 = Asc(x1): GoTo 301 Next i ' если res всегда есть False, то вывести поясняющий текст: ' " Deutschland - Nein" - "В Германии не проживает" Label11.Caption = "Deutschland - Nein" ' блоки 301 - 303 работают аналогично вышеописанному 301 For i = 1 To 4 muster = oest(i): res = zeile Like muster If res Then Label12 = "Oesterreich": x2 = Label12: x2 = Asc(x2): GoTo 302 Next i Label12.Caption = "Oesterreich - Nein" 302 For i = 1 To 4 muster = span(i): res = zeile Like muster If res Then Label13 = "Spanien": x3 = Label13: x3 = Asc(x3): GoTo 303 Next i Label13.Caption = "Spanien - Nein" 303 For i = 1 To 4 muster = grossb(i): res = zeile Like muster If res Then Label14 = "Grossbritan.": x4 = Label14: x4 = Asc(x4): GoTo 304 Next i Label14.Caption = "Grossbritanien - Nein" 304 End Sub ' 4 процедуры ниже обеспечивают перемещение флагов стран ' проживания национальности, вводимой в диалоговом режи- ' ме (cм. процедуру Command1_Click()). Процедуры стартуют ' после того, как определены переменные х1 - х4, т.е. найдена ' страна Private Sub Timer1_Timer() Image1.Left = Int(80 * Rnd * x1): Image1.Top = Int(90 * Rnd * x1) End Sub Private Sub Timer2_Timer() Image2.Left = Int(80 * Rnd * x2): Image2.Top = Int(90 * Rnd * x2) End Sub Private Sub Timer3_Timer() Image3.Left = Int(80 * Rnd * x3): Image3.Top = Int(90 * Rnd * x3) End Sub Private Sub Timer4_Timer() Image4.Left = Int(80 * Rnd * x4): Image4.Top = Int(90 * Rnd * x4) End Sub
(рис 2.8) Оператор LIKE (Где проживает национальость : ?)
Для
Необходимость использования инструкции If : Then : Else возникает, если имеются альтернативные пути выполнения программы; при еe использовании проводится проверка условий и в зависимости от их истинности выполняются определeнные действия. Используется простой и полный синтаксис. Простой синтаксис:
If условие Then инструкция [Else инструкция]
- если условие, стоящее после If истинно ( True ), то выполняется инструкция, следующая за Then, если условие ложно ( False ), то выполняется инструкция, следующае за Else.
Полный синтаксис:
If условие 1 Then инструкция 1 . [инструкция m] [ElseIf условие 2 Then инструкция k] [Else инструкция n] End If
Во втором случае синтаксиса инструкция 1 : инструкция m,: записываются на новых строчках, присутствует инструкция End If. Наличие ElseIf позволяет анализировать дополнительные условия. Добавлением нескольких инструкций ElseIf можно анализировать дополнительное количество условий. Else используется для обработки противоположных ситуаций. Если нужно проверить некоторое условие при наличии другого условия, то используются вложенные инструкции, пример:
If условие 1 Then If условие 2 Then инструкция 1 . Else инструкция m End If Else инструкция n End If
Для демонстрации различия синтаксиса рассмотрим пример нахождения максимального из 2-х чисел.
Dim max As Integer If Val(txt1.Text) > Val(txt2.Text) Then max = Val(txt1.Text) Else max = Val(txt2.Text) lblMax.Caption = max или: If Val(txt1.Text) > Val(txt2.Text) Then max = Val(txt1.Text) Else: max = Val(txt2.Text) End If lblMax.Caption = max
Цикл For : Next предназначен для выполнения определeнного количества действий, когда количество действий известно заранее; синтаксис:
For начальное_значение переменной-счeтчик To конечное_значение переменной-счeтчик [Step величина шага] инструкции Next [переменная-cчeтчик]
Сначала инициализируется начальное значение переменной-счeтчик, при каждом выполнении цикла еe значение увеличивается на величину шага, или на 1, если шаг не указан.
Создать требуемые объекты, см. код процедуры Command1_Click(), данный ниже, очистить свойство Text текстового поля, а его свойству Multiline присвоить значение Тrue, тогда в процессе выполнения будет проводиться перенос строк в текстовое поле. Ввести код:
Private Sub Command1_Click() Dim mass(15) As Integer, i As Integer Rem переменная для хранения суммы элемeнтов массива Dim summ As Integer For i = 0 To 14 mass(i) = i ' вывод элементов массива в поле списка lst1.List(i) = mass(i) ' вывод значений i в поле TextBox txt1.Text = txt1.Text " " i Next i summ = 0 For i = 0 To 14 ' суммирование элементов маcсива summ = summ + mass(i) Next i lbl1.Caption = summ ' вывод суммы элементов End Sub
стартовать проект, сделать щелчок на командной кнопке.
Используется функция RND, возвращающая
Создать требуемые объекты, см. код, данный ниже и ввести код:
Private Sub Command1_Click() Dim mass(15) As Integer, I As Integer, A As Integer, В As Integer Dim Summ As Integer A = -5: B = 5: Summ = 0 For I = 0 To 14 mass(I) = Int(Rnd * (B - A + 1) + A) lst1.List(I) = mass(I) Summ = Summ + mass(I) Next I lbl1.Caption = Summ End Sub
стартовать проект, сделать щелчок на командной кнопке.
Создать на форме элемент управления CommandButton, создать массив полей списка, для этого:
(рис 2.1) Схема формы
ввести код:
Private Sub Command1_Click() Dim mass(15, 3) As Single, i As Integer, j As Integer Dim A As Integer Dim B As Integer, Summ As Single A = -5: B = 5: Summ = 0 For j = 0 To 14 For i = 0 To 2 mass(j, i) = Rnd * (B - A) + A ' вывод элементов в поля массива списка List1(i).List(j) = mass(j, i) ' суммирование элементов двумерного массива Summ = Summ + mass(j, i) Next i, j Label1.Caption = Summ ' вывод суммы элементов массива End Sub
стартовать проект, сделать щелчок на командной кнопке.
Цикл Do : Loop используется, если точное количество повторений действий заранее неизвестно или нужно дождаться выполнения некоторого условия. Цикл Do : Loop может выполняться бесконечно:
Do повторяющееся действие Loop
Различают 2 Do : Loop с завершением:
Do While условие инструкции Loop
Do Until условие инструкции Loop
Создать массивы, вычислить сумму их элементов.
Private Sub Command1_Click() Dim sum As Integer, mas(5) As Integer, к As Integer mas(0) = 5: mas(1) = 6: mas(2) = 7: mas(3) = 6: mas(4) = 7 к = 0: sum = 0 ' здесь цикл повторяется до тех пор, пока значение ' переменной остается < 5 Do While к < 5 sum = sum + mas(к) к = к + 1 Loop lbl1.Caption = sum End Sub Private Sub Command2_Click() Dim sum As Integer, mas(5) As Integer, к As Integer mas(0) = 5: mas(1) = 6: mas(2) = 7: mas(3) = 6: mas(4) = 7 sum = 0: к = 0 Do Until к = 5 sum = sum + mas(к) к = к + 1 Loop lbl2.Caption = sum End Sub
Цикл Do : Loop часто применяется при считывании записей из файла:
Do While Not EOF #номер файла EOF (End of File) - признак конца файла.
Циклы Do :Loop могут управляться в конце. В примерах, данных ниже расположение условий в начале/конце циклов равноценно.
Создать необходимые объекты, очистить свойства Caption элементов управления Label, ввести код, cтартовать проект, выполнить оба цикла.
Private Sub Command1_Click() Dim i As Integer i = 0 Do While i < 7 lbl1.Caption = lbl1.Caption " " i i = i + 1 Loop End Sub Private Sub Command2_Click() Dim i As Integer i = 0 Do lbl2.Caption = lbl2.Caption " " i i = i+ 1 Loop While i < 7 End Sub
Использование блока Select Case позволяет принять решение при наличии нескольких условий; синтаксис:
Select Case переменная_выбора Case 1 значение 1 инструкция 1 Case 2 значение 2 инструкция 2 . ' Case Else выполняется, если не выполнено ни одно из ' предыдущих условий Case Else инструкция k End Select
Синтаксис Select Case разрешает использование условий < > =, при этом используется ключевое слово Is, пример:
Select Case people Case Is < 100000 инструкция 1 Case Is < 500000 инструкция 2 End Select
В качестве значения для Case можно указывать не одно значение, а несколько через запятую. Пример использования:
Dim A As Single A = Val(Text1.Text) Select Case A Case Is < 0: lbl1.Caption = "<0" Case Is = 0: lbl1.Caption = "0" Case Else: lbl1.Caption = ">0" End Select
Инструкция безусловного перехода - это GoTo. Безусловный переход выполняется без анализа условий. Часто используется совместно с инструкцией On Error в обработчиках ошибок, см. ниже, праkтическая работа 50.
Вызов Call в процедуре временно передаeт управление другой процедуре, после завершения которой управление снова передаeтся той процедуре, из которой последовал вызов. Вызов процедуры может выглядеть так: Call имя_вызываемой_процедуры
при этом инструкция Call может отсутствовать. Часто требуется передавать процедуре значения параметров, необходимых для еe выполнения.
Примеры:
' процедура Sub Peter() вызывает процедуру Sub FrZeit(Zeit), ' передавая ей значение 7 для еe аргумента; после ' завершения процедуры Sub FrZeit(Zeit) управление ' ' возвращается к Sub Peter(). Далее Sub Peter() вызывает ' процедуру Sub Message(); после щелчка пользователя ' на кнопке окна, выводимого функцией MsgBox, управление ' возвращается к Sub Peter(), которая завершается. Sub Peter() FrZeit 7 Message End Sub Sub FrZeit(zeit) For i = 1 To zeit . Next End Sub Sub Message() MsgBox "Es ist zu frueh" ' слишком рано End Sub ' два способа вызова процедуры с несколькими аргументами Sub Paul() KlPause 15, 25 Call KlPause(11, 30) End Sub Sub KlPause(zeit As Integer, Dauer As Integer) If zeit >= 12 Then Dauer = Dauer*2 End If End Sub
Процедура есть последовательность инструкций, объединeнных для выполнения. Различают процедуры обработки событий и процедуры общего назначения: процедуры Sub, Function, Property, Event.
Для создания процедуры общего назначения нужно использовать область окна кода ( General ) ( Declarations ) $$\to$$ меню Инструменты $$\to$$ Добавить процедуру $$\to$$ в поле выведенного диалогового окна ввести имя процедуры $$\to$$ в поле Тип сделать щелчок на Sub $$\to$$ сделать выбор в поле Район $$\to$$ ОК $$\to$$ выводятся инструкции описания процедур.
Процедуры обработки событий (закрытые процедуры) являются процедурами типа Private; их можно вызвать только внутри формы. Процедуры являются общими (открытыми), если они могут быть вызваны процедурами другой формы/модуля; используется ключевое слово Public. Общая процедура должна содержаться в модуле.
Вызов процедуры из другой процедуры можно выполнить одним из следующих способов:
If kkKK > 70 Then Proc1 End If
Call Proc1
Proc1 44, 56 ' два числа - это передаваемые аргументы,
или: Call Proc1(44, 56)
Список аргументов процедуры, при необходимости с указанием типа, размещают в скобках в строке имени процедуры, при этом в процедурах обработки событий список аргументов определeн событием и не может быть изменeн пользователем.
При программировании необходимо контролировать передачу аргументов.
Передача аргументов типа значение (хранятся в стеке; пример - тип Integer, Single ) и ссылочного типа (хранятся в динамически распределяемой памяти; пример - Object, массив) между вызывающей и вызываемой процедурой может вызывать модификацию данных. |
Передача аргументов может проводиться: по значению - ByVal ( в этом случае процедуре передаeтся копия этого значения) и по ссылке - ByRef (в этом случае вызванная процедура получает адрес памяти передаваемой переменной).
Инструкция в процедуре Sub/Function может передавать значения вызываемой процедуре, при этом могут использоваться именованные аргументы, которые можно перечислять в произвольном порядке. Именованный аргумент состоит из:
Private Sub Command1_Click() Dim x1 As Variant MsgBox Title:="отпуск", Prompt:="Едем в отпуск в Испанию" или x1 = MsgBox(Title:="отпуск", _ Prompt:=" Едем в отпуск в Испанию", Buttons:=4) End Sub
Особенностью процедур Function является то, что результатом их работы является возвращаемое значение. При создании процедуры Function используется инструкция Function и в конце - инструкция End Function. Функция может получать аргументы, передаваемые ей вызывающей процедурой. Если аргументов нет, то скобки пусты. При использовании аргумента должен указываться соответствующий тип данных. За скобками указывается тип возвращаемого значения.
Вызов функции реализуется в соответствии с синтаксисом:
Возвращаемое_значение = Имя_функци(Аргумент_1, : Аргумент_к); пример: х1 = Func1(20, 30)
Здесь вызывается функция Func1, в передаются значения 20, 30. Возвращаемое значение присваивается переменной х1.
Создадим функцию вычисления факториала числа ( Factor ), используем тип вводимых данных - Integer, возвращаемых - Double, тогда максимальное возвращаемое значение ограничивается числом 1.80Е308. Примем факториал равным нулю, если значение аргумента превышает 170 (факториал 170 соответствует максимальному значению принятого типа данных). Последовательность действий:
txtInp - для ввода числа, факториал которого нужно вычислить, txtOut - для вывода результата и командную кнопку, рис. 2.2.,General ) ( Declarations ) $$\to$$ меню Инструменты $$\to$$ Добавить процедуру $$\to$$ в поле выведенного диалогового окна ввести имя функции Factor $$\to$$ в поле Тип сделать щелчок на Function, в поле Район - щелчок на Public $$\to$$ ОК $$\to$$ выводятся инструкции Function и End Function.В качестве аргумента функции используется вводимое в поле TextBox (после старта проекта) число, оно описывается "As Integer" (ввести это в скобки, относящиеся к инструкции Function ). Тип возвращаемого функцией значения нужно описать "As Double" (ввести это за скобками в строке Function ): Public Function Factor(x As Integer) As Double
Private Sub Command1_Click() ' проводится преобразование вводимых данных в ' числовые значения, вычисляется факториал введeнного ' числа, результат преобразуется в тип String и выводится ' в поле txtOut txtOut.Text = Str(Factor(Val(txtInp.Text))) End Sub ' указание типа данных аргумента и типа данных ' возвращаемого фунцией значения Public Function Factor(x As Integer) As Double Dim i As Integer ' i - переменная-счeтчик If x > 0 And x < 171 Then Factor = 1 For i = 2 To x Factor = Factor * i Next i Else Factor = 1 End If End Function
Процедура Sub начинается инструкцией Sub и заканчивается инструкцией End Sub, между ними размещается код. Различают процедуры обработки событий и процедуры общего назначения. Процедуру обработки событий можно отличить по еe имени, содержащему Command1_Click (). Ниже приводится пример создания процедуры Sub.
Решается задача деления городов на группы в зависимости от соответствующей численности населения, которая задаeтся как набор случайных чисел. Рассматриваются 2 варианта:
Select Case,Case используется вызов процедуры ( Call mList(i, k) ).Последовательность действий:
ListBox (слева), содержащие списки названий городов и численности населения. Их идентификаторы: lstName, lstNum. Список из 20 названий, см. рис. 2.3, (Athen - Helsinki) вводится в поле свойства List объекта lstName (окно свойств). После ввода каждого названия использовать клавиши CTRL + Enter, в конце ввода - клавишу Enter. Oбразуется список, индексация проводится с 0,lstNameGr(0) - lstNameGr(3) и lstNumGr(0) - lstNumGr(3) (справа вверху), в которые будет выводиться результат деления численности населения городов на группы. В поле свойства List каждого объекта - элемента массива нужно ввести несколько нулей (поле списка представляет собой элемент массива и если при обращении к j+1 элементу j элемент не определен, то появится сообщение об ошибке),List1 (внизу), в который заносится информация, позволяющая проверить, обработан ли весь исходный список и указывающая, сколько городов содержится в каждом групповом списке,CommandВutton ; свойствам Caption присвоить значение Select Case и Call mList(i,k),Переменная j используется для индексации элемeнтов списков названий городов и численностей населения, а переменные i1, i2, i3, i4, i5 - для индексации численностей населения и названий городов в списках групп. 5-я группа создана для списка названий городов и соответствующих численностей населения, не попавших в предыдущие 4 группы.
Во второй строке кода Form_Load () проводится проверка названий городов: "If lstName.List(j) >= "A" Then : ". Код буквы А - наименьший и для всех названий городов задаeтся численность населения; если список названий закончился, то численности присваивается значение -1.
(General) (Declarations) Dim j As Integer Private Sub Form_Load() ' задать численность населения For j = 0 To 29 If lstName.List(j) >= "A" Then lstNum.List(j) = Int(Rnd ^ 3 * 2000000 + 100000) Else lstNum.List(j) = -1 End If Next j End Sub Private Sub Command1_Click() Dim i1 As Integer, i2 As Integer, i3 As Integer Dim i4 As Integer, i5 As Integer j = 0: i1 = 0: i2 = 0: i3 = 0: i4 = 0: i5 = 0 Do Until Val (lstNum.List(j)) <= 0 Select Case Val(lstNum.List(j)) Case Is < 100000: i5 = i5 + 1 lst1.List(5) = "i5=" i5 Case Is < 500000 lstNameGr(0).List(i1) = lstName.List(j) lstNumGr(0).List(i1) = lstNum.List(j): i1 = i1 + 1 lst1.List(1) = "i1=" i1 Case Is < 1000000 lstNameGr(1).List(i2) = lstName.List(j) lstNumGr(1).List(i2) = lstNum.List(j): i2 = i2 + 1 lst1.List(2) = "i2=" i2 Case Is < 1500000 lstNameGr(2).List(i3) = lstName.List(j) lstNumGr(2).List(i3) = lstNum.List(j): i3 = i3 + 1 lst1.List(3) = "i3=" i3 Case Is < 2000000 lstNameGr(3).List(i4) = lstName.List(j) lstNumGr(3).List(i4) = lstNum.List(j): i4 = i4 + 1 lst1.List(4) = "i4=" i4 Case Is >= 2000000: i5 = i5 + 1 lst1.List(5) = "i5=" i5 End Select j = j + 1 Loop End Sub
Анализ блоков Case показывает, что код аналогичен; при организации работы блоков используются переменные j, i1, i2, i3, i4, i5 и индексы элементов массивов к(0, 1, 2, 3) элементов управления ListBox, например: lstName(0).List(i1) = lstName.List(j)
Создадим процедуру Sub mList(i As Integer, k As Integer), переменные i (i1, i2, i3, i4, i5) и k(0, 1, 2, 3) будем передавать как аргументы. Создание процедуры $$\to$$ Добавить процедуру $$\to$$ поле выведенного диалогового окна ввести имя процедуры mList $$\to$$ в поле Тип сделать щелчок на Sub, в поле Район - щелчок на Public а ОК а выводятся инструкции Sub и End Sub, ввести аргументы процедуры: ( i As Integer, k As Integer ). Создаваемая процедура Sub представлена ниже, а обращение к ней, например для блока Case Is<500000 будет иметь вид: Call mList(i1, 0) - здесь i1 - индекс элемeнта в списке группы, а 0 - индекс элемента массива, (i - индекс элемента в списке группы, к - индекс элемента массива).
Public Sub mList(i As Integer, k As Integer) lstNameGr(k).List(i) = lstName.List(j) lstNumGr(k).List(i) = lstNum.List(j): i = i + 1 lst1.List(k + 1) = "i = " i End Sub
Private Sub Command2_Click() Dim i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer Dim i5 As Integer j = 0: i1 = 0: i2 = 0: i3 = 0: i4 = 0: i5 = 0 Do Until lstNum.List(j) <= 0 Select Case Val(lstNum.List(j)) Case Is < 100000: i5 = i5 + 1: lst1.List(5) = "i5=" i5 Case Is < 500000: Call mList(i1, 0) Case Is < 1000000: Call mList(i2, 1) Case Is < 1500000: Call mList(i3, 2) Case Is < 2000000: Call mList(i4, 3) Case Is >= 2000000: i5 = i5 + 1: lst1.List(5) = "i5=" i5 End Select j = j + 1 Loop End Sub
(рис 2.3) Деление городов на группы в зависимости от соответствующей численности населения
Процедура Property состоит из последовательности инструкций, позволяющих создавать свойства объектов и работать с ними. Существует 2 типа процедур Property, табл. 2.1
| Название | Назначение |
| Property Let | Присваивает значение свойству |
| Property Get | Возвращает значение свойства |
Синтаксис процедур:
[Public | Private] [Static] Property {Get | Let} имя [(список аргументов)] [As тип]
инструкция 1
.
инструкция к
End Property
Здесь
Обычно процедуры свойств используются попарно.
Обязательные аргументы при описании процедур и синтаксис вызова процедур представлены в табл. 2.2 и табл. 2.3 соответственно.
| Название | Синтаксис описания |
| Property Let | Property Let имя(1, :, к) |
| Property Get | Property Get имя(1, :, к) As тип |
| Название | Синтаксис |
| Property Let | [oбъект.]свойство[(аргументы)] = аргумент |
| Property Get | Переменная = [объект.]свойство[(аргументы)] |
Инструкции Property Let описывают текст программы, составляющей процедуру Property Let, которая присваивает значение свойству, аргументы могут передаваться ByRef и ByVal. Инструкции Property Get описывают текст программы, составляющей процедуру Property Get, считывающую значение свойства, аргументы могут передаваться ByRef и ByVal.
Упрощeнный синтаксис аргументов процедуры Property:
[ByVal | ByRef] имя_переменной [( )] [As тип]
Инструкции Property Let используются для описания процедуры Property Let, предназначеной для изменения значения свойства (здесь цвет волос). Инструкции Property Get используются для описания процедуры, считывающей значение свойства. Процедура возвращает текущий цвет. Последовательность действий:
Property (см. выше), ввести имя процедуры - hairColor $$\to$$ в поле Тип сделать щелчок на Property $$\to$$ ОК $$\to$$ выводятся инструкции Property Let, End Property и Property Get, End Property,(General) (Declarations) Dim CurrentColor As Integer Const BLACK = 0, RED = 1, GREEN = 2 Private Sub Command1_Click() Rem задать цвет волос с помощью процедуры Property Let Rem (синтаксис: свойство = аргумент) hairColor = BLACK lbl1.Caption = CurrentColor End Sub Rem процедура изменяет значение свойства цвет волос Property Let hairColor(ByVal Color As Variant) Select Case Color Case RED: CurrentColor = 1 Case GREEN: CurrentColor = 2 Case Else: CurrentColor = 0 End Select End Property Rem процедура возвращает текущий цвет волос Property Get hairColor() As Variant Select Case CurrentColor Case Is = 1: hairColor = 1 Case Is = 2: hairColor = 2 Case Is = 0: hairColor = 0 End Select End Property Private Sub Command2_Click() Rem определить цвет волос с помощью процедуры Property Rem Get (синтаксис: переменная = свойствo) Dim Color As Variant Color = hairColor lbl2.Caption = Color End Sub
(рис 2.4) Property Let, Property Get
Ниже приводятся примеры некоторых типовых алгоритмов.
Private Sub Command1_Click() Dim m(25) As Integer ' описание массива ' описание переменной для хранения максимального значения Dim max As Integer Dim j As Integer, i As Integer 'описание переменныx-счeтчик ' создание массива и вывод его элементов в поле списка For i = 0 To 24 m(i) = Int(Rnd * 40 + 1) lst1.List(i) = m(i) Next i max = m(0) ' пусть m(0) будет максимальным элементом For j = 1 To 24 ' поиск максимального элемента ' если текущий элемент массива больше текущего ' максимального, то сделать его максимальным элементом If m(j) > max Then max = m(j) Next j lbl1.Caption = max ' вывод результата в поле lbl1 End Sub
В университетах M и N число студентов x1 и x2 соответственно, стоимость обучения каждого за весь период обучения равна st1 и st2; обучение длится ja1 и ja2 лет соответственно. Определить где выше стоимость обучения за 1 год. Последовательность действий:
CommandButton и TextBox, ввести код, данный ниже:Private Sub Command1_Click() Dim st1 As Single, st2 As Single, ja1 As Integer, ja2 As Integer Dim x1 As Integer, x2 As Integer x1 = 2000 ' ввод исходных данных x2 = 3000: ja1 = 4: ja2 = 5: st1 = 250.5: st2 = 300.7 If x1 * st1 / ja1 > x2 * st2 / ja2 Then txt1.Text = "Университет M:" x1 * st1 / ja1 Else txt1.Text = "Университет N:" x2 * st2 / ja2 End If End Sub
Задание: создать список названий футбольных клубов страны. Переписать список в массив football(j). Последовательность действий:
ListBox, поле метки. Ввести код, данный ниже, пояснения даны под комментариями:(General) (Declarations) Dim football(20) As String ' описание массива названий клубов Private Sub Form_Load() Dim j As Integer, i As Integer, Аr As String ' Аr - условное название клуба For j = 0 To 14 ' формирование списка названий клубов Ar = "C" ' часть условного названия клуба ' формирование условных названий клубов For i = 0 To 2 Ar = Ar Int(Rnd * 10 + 1) Next i lst1.List(j) = Ar ' вывод названий в поле ListBox Next j ' создание признака конца списка. После инструкции ' Next значение переменной-счётчик увеличивается на 1 lst1.List(j) = "-1" End Sub ' переписывать список в массив football(20) до тех пор, пока не ' появится признак конца списка Private Sub Command1_Click() Dim j As Integer j = 0 Do Until lst1.List(j) = "-1" football(j) = lst1.List(j) lst2.List(j) = football(j) j = j + 1 Loop lbl1.Caption = j ' определить, сколько элементов переписано End Sub
Задание: массив tanker(к) содержит названия танкеров, массив capacity(к) - соответствующую вместимость. Разделить массивы на 3 группы в зависимости от вместимости (до 30 000, 30 000 - 100 000, более 100 000). Вывести результаты в массив поля списка.
Последовательность действий:
CommandButton, Label для вывода набора символов - условных названий танкеров, см. код ниже,ListBox для вывода массивов названий и вместимости танкеров, см. код процедуры Form_Load (),ListBox: каждый из 3-х элементов для вывода результатов деления объектов на 3 группы:ListBox несколькими нулями, для этого использовать их свойство List,
(рис 2.6) Схема формы
(General) (Declarations) Dim tanker(24) As String ' описание массива названий танкеров ' описание массива вместимостей танкеров Dim capacity(24) As Long Private Sub Form_Load() Dim j As Integer, i As Integer, ch As String ' ch - символ - условное название танкера ch = "A" ' формирование названий и вместимости танкеров, вывод ' данных For j = 0 To 21 Label1.Caption = ch tanker(j) = ch ' массив условных названий танкеров, ' формирование случайных чисел, характеризующих ' вместимость capacity(j) = Int(Rnd ^ 3 * 1000000 + 1) List1.List(j) = tanker(j) ' вывод в поле List1 названий List2.List(j) = capacity(j) ' вывод в поле List2 ' вместимостей ' изменить символ - название танкера. Функция Asc() ' возвращает значение типа Integer, представляющее ' код символа для первого символа строки, функция ' Chr() возвращает значение типа String, содержащее ' символ, соответствующий указанному коду (набор ' символов ANSI) ch = Chr(Asc(ch) + 1) ' вывод в поле Label1 символов - условных названий ' танкеров Label1.Caption = Label1.Caption ch Next j capacity(j) = -1 ' создание признака конца массива End Sub Private Sub Command1_Click() Dim j As Integer ' переменные i1, i2, i3 определяют позиции элементов в ' массивах объектов Dim i1 As Integer, i2 As Integer, i3 As Integer j = 0: i1 = 0: i2 = 0: i3 = 0 ' деление элементов массивов на 3 группы Do Until capacity(j) = -1 Select Case capacity(j) Case Is < 30000: List3(0).List(i1) = capacity(j) List4(0).List(i1) = tanker(j): i1 = i1 + 1 Case Is < 100000: List3(1).List(i2) = capacity(j) List4(1).List(i2) = tanker(j): i2 = i2 + 1 Case Is >= 100000: List3(2).List(i3) = capacity(j) List4(2).List(i3) = tanker(j): i3 = i3 + 1 End Select j = j + 1 Loop End Sub
Сортировка. Сортировка выполняется попарным сравнением сортируемых элементов (например, элементов массива). В общем случае для сортировки массива из N элементов требуется N*(N-1)/2 сравнений. В случае сортировки по убыванию, например, сравнивается к-элемент массива с предыдущим. Если он больше предыдущего, то их меняют местами, затем сравнивается следующая пара и .т.д. Ниже приведены элементарные примеры.
Создать на форме требуемые элементы управления, см. код, данный ниже, ввести код; пояснения даны под комментариями. Затем стартовать проект.
(General) (Declarations) Dim i As Integer, j As Integer, bu As Long ' bu - переменная для временного хранения сортируемых ' данных Dim m(25) As Long, mas(25) As Long ' создание массива случайных чисел и вывод их в поле List1 Private Sub Form_Load() For j = 1 To 25 m(j) = Int(Rnd * 100000) List1.List(j - 1) = m(j) Next j End Sub Private Sub Command1_Click() ' выполнить сортировку For i = 1 To 24 For j = i + 1 To 25 ' если следующий элемент больше предыдущего, то ' поменять их местами If m(i) < m(j) Then bu = m(i): m(i) = m(j): m(j) = bu Next j, i For j = 1 To 25 ' результат вывести в поле List2 List2.List(j - 1) = m(j) Next j End Sub
Private Sub Command2_Click() For j = 25 To 1 Step -1 mas(j) = Int(Rnd * 100000): List1.List(25 - j) = mas(j) Next j For j = 2 To 25 ' выполнить сортировку For i = 2 To 25 - j + 2 If mas(i - 1) > mas(i) Then bu = mas(i - 1): mas(i - 1) = mas(i): mas(i) = bu End If Next i Next j ' результат вывести в поле списка в обратном порядке For j = 25 To 1 Step -1 List2.List(25 - j) = mas(j) Next j End Sub
Задание: создать список названий городов, создать список соответствующих численностей населения. Найти максиальную численность населения и соответствующее название города. Последовательность действий:
Command1_Click () и Command2_Click () и рис. 2.7(General) (Declarations) ' описание массива названий городов; здесь - целых чисел Dim citiesName(20) As String ' описание массива численностей населения городов Dim citiesNum(20) As Long Dim k As Integer ' переменая к используется в процедуре Command1_Click(), ' поэтому не должна описываться как Static Private Sub Form_Load() Dim j As Integer ' создание массива численностей; здесь название города - это ' значение переменной-счетчик For j = 1 To 9 citiesNum(j) = Int(Rnd * 10000000 + 1) txtNum = citiesNum(j): txtName = j ' вывод численностей населения в поле Label3 Label3 = Label3 " " citiesNum(j) Label4 = Label4 " " j ' вывод названий городов в поле ' Label4 Next j citiesNum(j) = -1 ' признак конца маcсива txtNum = citiesNum(j) txtName = j End Sub ' последовательным нажатием командной кнопки создать ' массив названий городов citiesName(k) Private Sub Command1_Click() k = k + 1 ' если численность населения больше 0, то заполнить массив ' названий городов и вывести данные в текстовые поля If citiesNum(k) > 0 Then txtNum.Text = citiesNum(k): citiesName(k) = k txtName.Text = citiesName(k) Else ' иначе вывести сообщение: "Список городов исчерпан" txtName.Text = "Список городов исчерпан" txtName.BackColor = vbGreen End If ' название города, в котором нет населения ( 10) вывести в ' текстовое поле Text1.Text = "k = " k End Sub ' с помощью поцедуры Command1_Click() созданы названия ' городов, ранее созданы соответствующие численности ' населения: масивы - citiesNum() и citiesName(). Процедура ' Command2_Click() обеспечивает поиск максимума ' численности населения и названия соответствующего ' города Private Sub Command2_Click() ' maxNum - переменная для хранения максимальной ' численности населения Dim maxNum As Long ' maxName - переменная для хранения названия города с ' максимальной численностью населения Dim maxName As String If citiesNum(1) <= 0 Then txtName = "Массив пуст": GoTo 100 ' пусть максимальным будет первый элемент массива maxNum = citiesNum(1) maxName = citiesName(1) ' начиная с к = 2 проводится сравнение элементов массива с ' максимальным значением k = 2 ' если масcив численности населения не пуст, сравнить ' (последовательно) текущий элемент с максимальным. Если ' он больше текущего максимума, то сделать его ' максимальным; в текстовое поле вывести ' соответствующее значение 20 If citiesNum(k) > 0 Then If citiesNum(k) > maxNum Then maxName = citiesName(k): maxNum = citiesNum(k) Text1.Text = "k=" k: k = k + 1: GoTo 20 Else ' вывод максимальной численности, вывод названия ' города с максимальной численностью населения txtNum.Text = maxNum txtName.Text = maxName End If 100 End Sub
(рис 2.7) Нахождение максимальной численности населения с выводом соответствующего названия города
Задание: создать в диалоговом режиме 4 массива национальностей, проживающих в 4-х странах (рис. 2.8, в центре вверху), затем вывести в массив ListBox из 4-х элементов (рис. 2.8, слева в центре). Ввести в диалоговом режиме одну из 10 - 16 национальностей (введeнных ранее), для ввода использовать текстовое поле (рис. 2.8, слева). С использованием оператора LIKE найти страны проживания этой национальности. Обеспечить вывод результатов поиска в поля меток (рис. 2.8, 4 поля метки слева внизу). Обеспечить перемещение (использовать элемент управления Timer ) флага страны проживания после нахождения страны проживания.
Последовательность действий:
Command1 (Caption = Vergleichen (Muster)),Command2 (Caption = Nationalitaet-Massiv),Command3 (Caption = MassivList),TextBox: (Text1(0) - Text1(3)), (Text2(0) - Text2(3)), (Text3(0) - Text3(3)), (Text4(0) - Text4(3)) для ввода национальностей, рис. 2.8 вверху в центре,TextBox (Text5) для ввода искомой национальности, рис. 2.5, выше полей Label (используемых для вывода результатов),TimerК_Timer (), см. код и рис. 2.8(General) (Declarations) Option Compare Text Dim res As Boolean Dim muster As String ' описание шаблона для оператора Like ' zeile - описание вводимой строки для сравнения с шаблоном ' (оператор Like) Dim zeile As String Dim i As Integer, j As Integer ' х1 - х4 - переменные, обеспечивающие старт процедур ' TimerК_Timer(), Dim x1 As Variant, x2 As Variant, x3 As Variant, x4 As Variant Dim deu(4) As String ' deu(4) - grossb(4) - массивы национальностей, проживающих в ' соответствующих 4-х странах Dim oest(4) As String, span(4) As String, grossb(4) As String ' создание массивов национальностей, проживающих в 4-х ' странах: deu(4) - grossb(4) (кнопка Nationalitaet-Massiv) Private Sub Command2_Click() For i = 1 To 4 deu(i) = Text1(i - 1).Text: oest(i) = Text2(i - 1).Text span(i) = Text3(i - 1).Text: grossb(i) = Text4(i - 1).Text Next i End Sub ' вывод в массив элементов ListBox элементов массивов ' национальностей, см. рис. 5.4: командная кнопка Caption = ' MassivLIST Private Sub Command3_Click() For j = 1 To 4 List1(0).List(j - 1) = deu(j): List1(1).List(j - 1) = oest(j) List1(2).List(j - 1) = span(j): List1(3).List(j - 1) = grossb(j) Next j End Sub ' выполнение поиска - использование оператора Like; старт ' процедур, обеспечивающих перемещение флагов Private Sub Command1_Click() ' ввод в диалоговом режиме искомой национальности zeile = Text5.Text For i = 1 To 4 ' в качестве шаблона используется массив, ' просматриваемый в цикле muster = deu(i) ' переменной типа Boolean присваивается возвращае- ' мое значение res = zeile Like muster ' если переменная res есть True, то вывести название ' страны, где проживает национальность "zeile", вводимая в ' диалоговом режиме; далее определяется код х1: (Asc(x1)), ' что обеспечивает выполнение процедуры Timer1_Timer() (см. ' ниже), иначе - просматривать массив далее If res Then Label11 = "Deutschland": x1 = Label11: x1 = Asc(x1): GoTo 301 Next i ' если res всегда есть False, то вывести поясняющий текст: ' " Deutschland - Nein" - "В Германии не проживает" Label11.Caption = "Deutschland - Nein" ' блоки 301 - 303 работают аналогично вышеописанному 301 For i = 1 To 4 muster = oest(i): res = zeile Like muster If res Then Label12 = "Oesterreich": x2 = Label12: x2 = Asc(x2): GoTo 302 Next i Label12.Caption = "Oesterreich - Nein" 302 For i = 1 To 4 muster = span(i): res = zeile Like muster If res Then Label13 = "Spanien": x3 = Label13: x3 = Asc(x3): GoTo 303 Next i Label13.Caption = "Spanien - Nein" 303 For i = 1 To 4 muster = grossb(i): res = zeile Like muster If res Then Label14 = "Grossbritan.": x4 = Label14: x4 = Asc(x4): GoTo 304 Next i Label14.Caption = "Grossbritanien - Nein" 304 End Sub ' 4 процедуры ниже обеспечивают перемещение флагов стран ' проживания национальности, вводимой в диалоговом режи- ' ме (cм. процедуру Command1_Click()). Процедуры стартуют ' после того, как определены переменные х1 - х4, т.е. найдена ' страна Private Sub Timer1_Timer() Image1.Left = Int(80 * Rnd * x1): Image1.Top = Int(90 * Rnd * x1) End Sub Private Sub Timer2_Timer() Image2.Left = Int(80 * Rnd * x2): Image2.Top = Int(90 * Rnd * x2) End Sub Private Sub Timer3_Timer() Image3.Left = Int(80 * Rnd * x3): Image3.Top = Int(90 * Rnd * x3) End Sub Private Sub Timer4_Timer() Image4.Left = Int(80 * Rnd * x4): Image4.Top = Int(90 * Rnd * x4) End Sub
(рис 2.8) Оператор LIKE (Где проживает национальость : ?)
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.