Visual Basic

Управление ходом выполнения программ. Примеры типовых алгоритмов

Разбить на страницы
Показывать лекцию целиком

Для управления ходом выполнения программ предоставляется ряд возможностей, ниже рассматриваются некоторые из них.

Условная инструкция If : Then : Else

Необходимость использования инструкции 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

Цикл For : Next предназначен для выполнения определeнного количества действий, когда количество действий известно заранее; синтаксис:

For начальное_значение переменной-счeтчик 
 To конечное_значение переменной-счeтчик [Step величина шага]
инструкции

Next [переменная-cчeтчик]

Сначала инициализируется начальное значение переменной-счeтчик, при каждом выполнении цикла еe значение увеличивается на величину шага, или на 1, если шаг не указан.

Практическая работа 9. Цикл For : Next

9а. Цикл For : Next, формирование массива, вычисление суммы элементов массива, вывод текстовые поля, поля списка и Label1.

Создать требуемые объекты, см. код процедуры 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

стартовать проект, сделать щелчок на командной кнопке.

9b. Цикл For : Next, формирование массива случайных чисел в заданном диапазоне, вычисление суммы элементов массива, вывод в поле списка и Label1.

Используется функция RND, возвращающая псевдослучайное число в диапазоне 0 - 1. Выражение вида: Int(КонецДиапазона - НачалоДиапазона + 1) * RND() + НачалоДиапазона) позволяет получить случайное целое число в заданном диапазоне. Функция Int возвращает целую часть числа.

Создать требуемые объекты, см. код, данный ниже и ввести код:

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

стартовать проект, сделать щелчок на командной кнопке.

9c. Создание массива объектов, использование вложенного цикла For : Next для формирования двумерного массива, вывод элементов двумерного массива в массив поля списка и суммы элементов массива в элемент управления Label1.

Создать на форме элемент управления CommandButton, создать массив полей списка, для этого:

  • щелчком маркировать поле списка,
  • использовать команду Копировать контекстного меню поля списка,
  • использовать команду Вставить того же контекстного меню; на вопрос :"Хотите, чтобы объект стал элементом массива?" ответить : "Да", копия выводится в верхний левый угол формы,
  • повторить копирование, т.к. нужен массив объектов из 3-х элементов; проверить на форме идентификаторы поля списка: List1(0), List1(1), List1(2),рис. 2.1
  • (рис 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 может выполняться бесконечно:

    Do
    повторяющееся действие
    Loop

    Различают 2 варианта цикла Do : Loop с завершением:

  • цикл продолжает повторяться всe время, пока некоторое условие остаeтся истинным:
    Do While условие
    инструкции
    Loop
  • вместо условия продолжения вычислений формулируется условие его завершения:
    Do Until условие
    инструкции
    Loop
  • Практическая работа 10. Циклы Do : Loop

    Создать массивы, вычислить сумму их элементов.

    10а. Do While : , Do Until

  • Создать на форме 2 командные кнопки, 2 элемента управления Label, ввести код, данный ниже:
    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 могут управляться в конце. В примерах, данных ниже расположение условий в начале/конце циклов равноценно.

    10b. Цикл 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 позволяет принять решение при наличии нескольких условий; синтаксис:

    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, пример:
    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 используется инструкция Function и в конце - инструкция End Function. Функция может получать аргументы, передаваемые ей вызывающей процедурой. Если аргументов нет, то скобки пусты. При использовании аргумента должен указываться соответствующий тип данных. За скобками указывается тип возвращаемого значения.

    Вызов функции реализуется в соответствии с синтаксисом:

    Возвращаемое_значение = Имя_функци(Аргумент_1, : Аргумент_к); пример:
    х1 = Func1(20, 30)

    Здесь вызывается функция Func1, в передаются значения 20, 30. Возвращаемое значение присваивается переменной х1.

    Практическая работа 11. Создание функции

    Создадим функцию вычисления факториала числа ( 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
  • в поле (рис 2.2) Создание функции
  • Процедура Sub

    Процедура Sub начинается инструкцией Sub и заканчивается инструкцией End Sub, между ними размещается код. Различают процедуры обработки событий и процедуры общего назначения. Процедуру обработки событий можно отличить по еe имени, содержащему имя события, например: Command1_Click (). Ниже приводится пример создания процедуры Sub.

    Практическая работа 12. Создание процедуры Sub

    Решается задача деления городов на группы в зависимости от соответствующей численности населения, которая задаeтся как набор случайных чисел. Рассматриваются 2 варианта:

  • деление на группы с использованием блока Select Case,
  • в блоках Case используется вызов процедуры ( Call mList(i, k) ).
  • Последовательность действий:

  • создать на форме объекты, данные на рис. 2.3:
  • 2 элемента управления ListBox (слева), содержащие списки названий городов и численности населения. Их идентификаторы: lstName, lstNum. Список из 20 названий, см. рис. 2.3, (Athen - Helsinki) вводится в поле свойства List объекта lstName (окно свойств). После ввода каждого названия использовать клавиши CTRL + Enter, в конце ввода - клавишу Enter. Oбразуется список, индексация проводится с 0,
  • 2 массива (каждый из 4-х элементов) объектов: lstNameGr(0) - lstNameGr(3) и lstNumGr(0) - lstNumGr(3) (справа вверху), в которые будет выводиться результат деления численности населения городов на группы. В поле свойства List каждого объекта - элемента массива нужно ввести несколько нулей (поле списка представляет собой элемент массива и если при обращении к j+1 элементу j элемент не определен, то появится сообщение об ошибке),
  • элемент управления List1 (внизу), в который заносится информация, позволяющая проверить, обработан ли весь исходный список и указывающая, сколько городов содержится в каждом групповом списке,
  • 2 объекта 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
  • стартовать проект, сделать щелчок на командной кнопке Select Case, наблюдать результат.

    Анализ блоков 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
  • ввести код процедуры Command2_Click(),
  • стартовать проект, сделать щелчок на кнопке Call mList(i,k), наблюдать результат, рис. 2.3.
    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

    Процедура Property состоит из последовательности инструкций, позволяющих создавать свойства объектов и работать с ними. Существует 2 типа процедур Property, табл. 2.1

    Типы процедур Property
    Название Назначение
    Property Let Присваивает значение свойству
    Property Get Возвращает значение свойства

    Синтаксис процедур:

    [Public | Private] [Static] Property {Get | Let} имя [(список аргументов)] [As тип]
    инструкция 1
    .
    инструкция к
    End Property

    Здесь

  • Public - процедура доступна для всех процедур во всех модулях,
  • Private - процедура доступна для других процедур только того модуля, в котором она описана,
  • Static - значения локальных переменных процедуры сохраняются в промежутках времени между вызовами процедуры,
  • имя - имя процедуры,
  • список аргументов - список переменных (аргументов), передаваемых в процедуру (Let, Get)) при ее вызове.
  • Обычно процедуры свойств используются попарно.

    Обязательные аргументы при описании процедур и синтаксис вызова процедур представлены в табл. 2.2 и табл. 2.3 соответственно.

    Аргументы описания процедур Property
    Название Синтаксис описания
    Property Let Property Let имя(1, :, к)
    Property Get Property Get имя(1, :, к) As тип
    Синтаксис вызова процедур Property
    Название Синтаксис
    Property Let [oбъект.]свойство[(аргументы)] = аргумент
    Property Get Переменная = [объект.]свойство[(аргументы)]

    Инструкции Property Let описывают текст программы, составляющей процедуру Property Let, которая присваивает значение свойству, аргументы могут передаваться ByRef и ByVal. Инструкции Property Get описывают текст программы, составляющей процедуру Property Get, считывающую значение свойства, аргументы могут передаваться ByRef и ByVal.

    Упрощeнный синтаксис аргументов процедуры Property:

    [ByVal | ByRef] имя_переменной [( )] [As тип]

    Практическая работа 13. Процедуры Property Let, Property Get

    Инструкции Property Let используются для описания процедуры Property Let, предназначеной для изменения значения свойства (здесь цвет волос). Инструкции Property Get используются для описания процедуры, считывающей значение свойства. Процедура возвращает текущий цвет. Последовательность действий:

  • Создать: 2 командные кнопки, значения свойств Caption которых представлены на рис. 2.4 (записи на кнопках 1 и 2 соответственно), · 2 поля меток для вывода возвращаемых значений, рис. 2.4, внизу и 2 поля меток с надписями (рис. 2.4, вверху),
  • Создать процедуры 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.
  • (рис 2.4) Property Let, Property Get

    Примеры типовых алгоритмов

    Ниже приводятся примеры некоторых типовых алгоритмов.

    Практическая работа 14. Краткие примеры: нахождение экстремума, создание признака конца списка, деление элементов массива на группы, сортировка и т.д.

    14а. Нахождение максимального элемента (массива).

  • Создать на форме элементы управления (рис 2.5) Схема формы
    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
  • стартовать проект, сделать щелчок на командной кнопке.
  • 14 в. Нахождение наибольшего из 2-х элементов, условная инструкция If ... Then ... Else

    В университетах 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
  • стартовать проект, сделать щелчок на командной кнопке.
  • 14с. Создание списка данных типа String, создание признака конца списка, вывод списка в массив

    Задание: создать список названий футбольных клубов страны. Переписать список в массив football(j). Последовательность действий:

  • Создать на форме элементы управления: CommandButton, 2 элемента управления 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
  • стартовать проект, сделать щелчок на командной кнопке.
  • 14d. Задача на выбор ветви из набора условий - блок Select Case

    Задание: массив tanker(к) содержит названия танкеров, массив capacity(к) - соответствующую вместимость. Разделить массивы на 3 группы в зависимости от вместимости (до 30 000, 30 000 - 100 000, более 100 000). Вывести результаты в массив поля списка.

    Последовательность действий:

  • Создать на форме, см. рис. 2.6:
  • элементы управления CommandButton, Label для вывода набора символов - условных названий танкеров, см. код ниже,
  • 2 элемента управления ListBox для вывода массивов названий и вместимости танкеров, см. код процедуры Form_Load (),
  • 2 массива элементов управления ListBox: каждый из 3-х элементов для вывода результатов деления объектов на 3 группы:
  • List3(0) - List3(2),
  • List4(0) - List4(2); следует заполнить массивы 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 сравнений. В случае сортировки по убыванию, например, сравнивается к-элемент массива с предыдущим. Если он больше предыдущего, то их меняют местами, затем сравнивается следующая пара и .т.д. Ниже приведены элементарные примеры.

    14е. Сортировка

    Сортировка 1 (по убыванию)

    Создать на форме требуемые элементы управления, см. код, данный ниже, ввести код; пояснения даны под комментариями. Затем стартовать проект.

    (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

    Сортировка 2

    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

    Практическая работа 15. Нахождение максимума (численности населения городов с выводом соответствующего названия города)

    Задание: создать список названий городов, создать список соответствующих численностей населения. Найти максиальную численность населения и соответствующее название города. Последовательность действий:

  • создать на форме:
  • 2 командные кнопки (Command1 и Command2 (Caption = MAX)), рис. 2.7,
  • 2 текстовых поля (txtName, txtNum) для вывода отдельных текущих названий городов и численностей населения городов соответственно, 4 поля Label (2 из них - для вывода всех названий городов и численностей населения городов соответственно и 2 (вверху формы) - для надписей), текстовое поле (Text1) для вывода названий городов, см. процедуры Command1_Click () и Command2_Click () и рис. 2.7
  • ввести код, данный ниже и стартовать программу. Последовательным нажатием первой командной кнопки создать массив названий городов. Cделать щелчок на второй командной кнопке.
    (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) Нахождение максимальной численности населения с выводом соответствующего названия города

    Практическая работа 16. Оператор LIKE - сравнение элементов массивов со строкой, введeнной в диалоговом режиме; элемент управления Timer

    Задание: создать в диалоговом режиме 4 массива национальностей, проживающих в 4-х странах (рис. 2.8, в центре вверху), затем вывести в массив ListBox из 4-х элементов (рис. 2.8, слева в центре). Ввести в диалоговом режиме одну из 10 - 16 национальностей (введeнных ранее), для ввода использовать текстовое поле (рис. 2.8, слева). С использованием оператора LIKE найти страны проживания этой национальности. Обеспечить вывод результатов поиска в поля меток (рис. 2.8, 4 поля метки слева внизу). Обеспечить перемещение (использовать элемент управления Timer ) флага страны проживания после нахождения страны проживания.

    Последовательность действий:

  • Создать на форме элементы управления, данные на рис. 2.8; соответствующие идентификаторы приведены в коде, данном ниже:
  • 3 командные кнопки, см. рис. 2.8:
  • Command1 (Caption = Vergleichen (Muster)),
  • Command2 (Caption = Nationalitaet-Massiv),
  • Command3 (Caption = MassivList),
  • 4 массива элементов TextBox: (Text1(0) - Text1(3)), (Text2(0) - Text2(3)), (Text3(0) - Text3(3)), (Text4(0) - Text4(3)) для ввода национальностей, рис. 2.8 вверху в центре,
  • массив ListBox из 4-х элементов для вывода 4-х масивов национальностей, слева в центре,
  • 4 объекта Image, в качестве значений свойства Picture использовать символы флагов 4-х стран (файлы *. ico),
  • 4 поля Label для вывода результатов, см. рис. 2.8: 2-ой столбец слева внизу,
  • несколько меток для надписей, см. рис. 2.5,
  • элемент управления TextBox (Text5) для ввода искомой национальности, рис. 2.5, выше полей Label (используемых для вывода результатов),
  • ввести код, затем стартовать проект,
  • в диалоговом режиме ввести национальности (для этого созданы 16 текстовых пoлей), сделать щелчок на кнопке "Nationalitaet-Massiv", затем - на кнопке - "Massiv-List",
  • ввести в поле Text5 одну из ранее введённых национальностей, далее сделать щелчок на кнопке "Vergleichen (Muster)". После выполнения поиска стартуют процедуры 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

    Необходимость использования инструкции 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

    Цикл For : Next предназначен для выполнения определeнного количества действий, когда количество действий известно заранее; синтаксис:

    For начальное_значение переменной-счeтчик 
     To конечное_значение переменной-счeтчик [Step величина шага]
    инструкции
    
    Next [переменная-cчeтчик]

    Сначала инициализируется начальное значение переменной-счeтчик, при каждом выполнении цикла еe значение увеличивается на величину шага, или на 1, если шаг не указан.

    Практическая работа 9. Цикл For : Next

    9а. Цикл For : Next, формирование массива, вычисление суммы элементов массива, вывод текстовые поля, поля списка и Label1.

    Создать требуемые объекты, см. код процедуры 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

    стартовать проект, сделать щелчок на командной кнопке.

    9b. Цикл For : Next, формирование массива случайных чисел в заданном диапазоне, вычисление суммы элементов массива, вывод в поле списка и Label1.

    Используется функция RND, возвращающая псевдослучайное число в диапазоне 0 - 1. Выражение вида: Int(КонецДиапазона - НачалоДиапазона + 1) * RND() + НачалоДиапазона) позволяет получить случайное целое число в заданном диапазоне. Функция Int возвращает целую часть числа.

    Создать требуемые объекты, см. код, данный ниже и ввести код:

    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

    стартовать проект, сделать щелчок на командной кнопке.

    9c. Создание массива объектов, использование вложенного цикла For : Next для формирования двумерного массива, вывод элементов двумерного массива в массив поля списка и суммы элементов массива в элемент управления Label1.

    Создать на форме элемент управления CommandButton, создать массив полей списка, для этого:

  • щелчком маркировать поле списка,
  • использовать команду Копировать контекстного меню поля списка,
  • использовать команду Вставить того же контекстного меню; на вопрос :"Хотите, чтобы объект стал элементом массива?" ответить : "Да", копия выводится в верхний левый угол формы,
  • повторить копирование, т.к. нужен массив объектов из 3-х элементов; проверить на форме идентификаторы поля списка: List1(0), List1(1), List1(2),рис. 2.1
  • (рис 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 может выполняться бесконечно:

    Do
    повторяющееся действие
    Loop

    Различают 2 варианта цикла Do : Loop с завершением:

  • цикл продолжает повторяться всe время, пока некоторое условие остаeтся истинным:
    Do While условие
    инструкции
    Loop
  • вместо условия продолжения вычислений формулируется условие его завершения:
    Do Until условие
    инструкции
    Loop
  • Практическая работа 10. Циклы Do : Loop

    Создать массивы, вычислить сумму их элементов.

    10а. Do While : , Do Until

  • Создать на форме 2 командные кнопки, 2 элемента управления Label, ввести код, данный ниже:
    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 могут управляться в конце. В примерах, данных ниже расположение условий в начале/конце циклов равноценно.

    10b. Цикл 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 позволяет принять решение при наличии нескольких условий; синтаксис:

    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, пример:
    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 используется инструкция Function и в конце - инструкция End Function. Функция может получать аргументы, передаваемые ей вызывающей процедурой. Если аргументов нет, то скобки пусты. При использовании аргумента должен указываться соответствующий тип данных. За скобками указывается тип возвращаемого значения.

    Вызов функции реализуется в соответствии с синтаксисом:

    Возвращаемое_значение = Имя_функци(Аргумент_1, : Аргумент_к); пример:
    х1 = Func1(20, 30)

    Здесь вызывается функция Func1, в передаются значения 20, 30. Возвращаемое значение присваивается переменной х1.

    Практическая работа 11. Создание функции

    Создадим функцию вычисления факториала числа ( 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
  • в поле (рис 2.2) Создание функции
  • Процедура Sub

    Процедура Sub начинается инструкцией Sub и заканчивается инструкцией End Sub, между ними размещается код. Различают процедуры обработки событий и процедуры общего назначения. Процедуру обработки событий можно отличить по еe имени, содержащему имя события, например: Command1_Click (). Ниже приводится пример создания процедуры Sub.

    Практическая работа 12. Создание процедуры Sub

    Решается задача деления городов на группы в зависимости от соответствующей численности населения, которая задаeтся как набор случайных чисел. Рассматриваются 2 варианта:

  • деление на группы с использованием блока Select Case,
  • в блоках Case используется вызов процедуры ( Call mList(i, k) ).
  • Последовательность действий:

  • создать на форме объекты, данные на рис. 2.3:
  • 2 элемента управления ListBox (слева), содержащие списки названий городов и численности населения. Их идентификаторы: lstName, lstNum. Список из 20 названий, см. рис. 2.3, (Athen - Helsinki) вводится в поле свойства List объекта lstName (окно свойств). После ввода каждого названия использовать клавиши CTRL + Enter, в конце ввода - клавишу Enter. Oбразуется список, индексация проводится с 0,
  • 2 массива (каждый из 4-х элементов) объектов: lstNameGr(0) - lstNameGr(3) и lstNumGr(0) - lstNumGr(3) (справа вверху), в которые будет выводиться результат деления численности населения городов на группы. В поле свойства List каждого объекта - элемента массива нужно ввести несколько нулей (поле списка представляет собой элемент массива и если при обращении к j+1 элементу j элемент не определен, то появится сообщение об ошибке),
  • элемент управления List1 (внизу), в который заносится информация, позволяющая проверить, обработан ли весь исходный список и указывающая, сколько городов содержится в каждом групповом списке,
  • 2 объекта 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
  • стартовать проект, сделать щелчок на командной кнопке Select Case, наблюдать результат.

    Анализ блоков 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
  • ввести код процедуры Command2_Click(),
  • стартовать проект, сделать щелчок на кнопке Call mList(i,k), наблюдать результат, рис. 2.3.
    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

    Процедура Property состоит из последовательности инструкций, позволяющих создавать свойства объектов и работать с ними. Существует 2 типа процедур Property, табл. 2.1

    Типы процедур Property
    Название Назначение
    Property Let Присваивает значение свойству
    Property Get Возвращает значение свойства

    Синтаксис процедур:

    [Public | Private] [Static] Property {Get | Let} имя [(список аргументов)] [As тип]
    инструкция 1
    .
    инструкция к
    End Property

    Здесь

  • Public - процедура доступна для всех процедур во всех модулях,
  • Private - процедура доступна для других процедур только того модуля, в котором она описана,
  • Static - значения локальных переменных процедуры сохраняются в промежутках времени между вызовами процедуры,
  • имя - имя процедуры,
  • список аргументов - список переменных (аргументов), передаваемых в процедуру (Let, Get)) при ее вызове.
  • Обычно процедуры свойств используются попарно.

    Обязательные аргументы при описании процедур и синтаксис вызова процедур представлены в табл. 2.2 и табл. 2.3 соответственно.

    Аргументы описания процедур Property
    Название Синтаксис описания
    Property Let Property Let имя(1, :, к)
    Property Get Property Get имя(1, :, к) As тип
    Синтаксис вызова процедур Property
    Название Синтаксис
    Property Let [oбъект.]свойство[(аргументы)] = аргумент
    Property Get Переменная = [объект.]свойство[(аргументы)]

    Инструкции Property Let описывают текст программы, составляющей процедуру Property Let, которая присваивает значение свойству, аргументы могут передаваться ByRef и ByVal. Инструкции Property Get описывают текст программы, составляющей процедуру Property Get, считывающую значение свойства, аргументы могут передаваться ByRef и ByVal.

    Упрощeнный синтаксис аргументов процедуры Property:

    [ByVal | ByRef] имя_переменной [( )] [As тип]

    Практическая работа 13. Процедуры Property Let, Property Get

    Инструкции Property Let используются для описания процедуры Property Let, предназначеной для изменения значения свойства (здесь цвет волос). Инструкции Property Get используются для описания процедуры, считывающей значение свойства. Процедура возвращает текущий цвет. Последовательность действий:

  • Создать: 2 командные кнопки, значения свойств Caption которых представлены на рис. 2.4 (записи на кнопках 1 и 2 соответственно), · 2 поля меток для вывода возвращаемых значений, рис. 2.4, внизу и 2 поля меток с надписями (рис. 2.4, вверху),
  • Создать процедуры 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.
  • (рис 2.4) Property Let, Property Get

    Примеры типовых алгоритмов

    Ниже приводятся примеры некоторых типовых алгоритмов.

    Практическая работа 14. Краткие примеры: нахождение экстремума, создание признака конца списка, деление элементов массива на группы, сортировка и т.д.

    14а. Нахождение максимального элемента (массива).

  • Создать на форме элементы управления (рис 2.5) Схема формы
    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
  • стартовать проект, сделать щелчок на командной кнопке.
  • 14 в. Нахождение наибольшего из 2-х элементов, условная инструкция If ... Then ... Else

    В университетах 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
  • стартовать проект, сделать щелчок на командной кнопке.
  • 14с. Создание списка данных типа String, создание признака конца списка, вывод списка в массив

    Задание: создать список названий футбольных клубов страны. Переписать список в массив football(j). Последовательность действий:

  • Создать на форме элементы управления: CommandButton, 2 элемента управления 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
  • стартовать проект, сделать щелчок на командной кнопке.
  • 14d. Задача на выбор ветви из набора условий - блок Select Case

    Задание: массив tanker(к) содержит названия танкеров, массив capacity(к) - соответствующую вместимость. Разделить массивы на 3 группы в зависимости от вместимости (до 30 000, 30 000 - 100 000, более 100 000). Вывести результаты в массив поля списка.

    Последовательность действий:

  • Создать на форме, см. рис. 2.6:
  • элементы управления CommandButton, Label для вывода набора символов - условных названий танкеров, см. код ниже,
  • 2 элемента управления ListBox для вывода массивов названий и вместимости танкеров, см. код процедуры Form_Load (),
  • 2 массива элементов управления ListBox: каждый из 3-х элементов для вывода результатов деления объектов на 3 группы:
  • List3(0) - List3(2),
  • List4(0) - List4(2); следует заполнить массивы 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 сравнений. В случае сортировки по убыванию, например, сравнивается к-элемент массива с предыдущим. Если он больше предыдущего, то их меняют местами, затем сравнивается следующая пара и .т.д. Ниже приведены элементарные примеры.

    14е. Сортировка

    Сортировка 1 (по убыванию)

    Создать на форме требуемые элементы управления, см. код, данный ниже, ввести код; пояснения даны под комментариями. Затем стартовать проект.

    (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

    Сортировка 2

    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

    Практическая работа 15. Нахождение максимума (численности населения городов с выводом соответствующего названия города)

    Задание: создать список названий городов, создать список соответствующих численностей населения. Найти максиальную численность населения и соответствующее название города. Последовательность действий:

  • создать на форме:
  • 2 командные кнопки (Command1 и Command2 (Caption = MAX)), рис. 2.7,
  • 2 текстовых поля (txtName, txtNum) для вывода отдельных текущих названий городов и численностей населения городов соответственно, 4 поля Label (2 из них - для вывода всех названий городов и численностей населения городов соответственно и 2 (вверху формы) - для надписей), текстовое поле (Text1) для вывода названий городов, см. процедуры Command1_Click () и Command2_Click () и рис. 2.7
  • ввести код, данный ниже и стартовать программу. Последовательным нажатием первой командной кнопки создать массив названий городов. Cделать щелчок на второй командной кнопке.
    (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) Нахождение максимальной численности населения с выводом соответствующего названия города

    Практическая работа 16. Оператор LIKE - сравнение элементов массивов со строкой, введeнной в диалоговом режиме; элемент управления Timer

    Задание: создать в диалоговом режиме 4 массива национальностей, проживающих в 4-х странах (рис. 2.8, в центре вверху), затем вывести в массив ListBox из 4-х элементов (рис. 2.8, слева в центре). Ввести в диалоговом режиме одну из 10 - 16 национальностей (введeнных ранее), для ввода использовать текстовое поле (рис. 2.8, слева). С использованием оператора LIKE найти страны проживания этой национальности. Обеспечить вывод результатов поиска в поля меток (рис. 2.8, 4 поля метки слева внизу). Обеспечить перемещение (использовать элемент управления Timer ) флага страны проживания после нахождения страны проживания.

    Последовательность действий:

  • Создать на форме элементы управления, данные на рис. 2.8; соответствующие идентификаторы приведены в коде, данном ниже:
  • 3 командные кнопки, см. рис. 2.8:
  • Command1 (Caption = Vergleichen (Muster)),
  • Command2 (Caption = Nationalitaet-Massiv),
  • Command3 (Caption = MassivList),
  • 4 массива элементов TextBox: (Text1(0) - Text1(3)), (Text2(0) - Text2(3)), (Text3(0) - Text3(3)), (Text4(0) - Text4(3)) для ввода национальностей, рис. 2.8 вверху в центре,
  • массив ListBox из 4-х элементов для вывода 4-х масивов национальностей, слева в центре,
  • 4 объекта Image, в качестве значений свойства Picture использовать символы флагов 4-х стран (файлы *. ico),
  • 4 поля Label для вывода результатов, см. рис. 2.8: 2-ой столбец слева внизу,
  • несколько меток для надписей, см. рис. 2.5,
  • элемент управления TextBox (Text5) для ввода искомой национальности, рис. 2.5, выше полей Label (используемых для вывода результатов),
  • ввести код, затем стартовать проект,
  • в диалоговом режиме ввести национальности (для этого созданы 16 текстовых пoлей), сделать щелчок на кнопке "Nationalitaet-Massiv", затем - на кнопке - "Massiv-List",
  • ввести в поле Text5 одну из ранее введённых национальностей, далее сделать щелчок на кнопке "Vergleichen (Muster)". После выполнения поиска стартуют процедуры 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 (Где проживает национальость : ?)
    Вернуться к учебному плану