Скачиваний:
11
Добавлен:
30.09.2018
Размер:
69.47 Кб
Скачать

2 2. Лекция: Управление ходом выполнения программ. Примеры типовых алгоритмов: версия для печати и PDA

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

  Условная инструкция 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 ) меню Инструменты Добавить процедуру в поле выведенного диалогового окна ввести имя процедуры в поле Тип сделать щелчок на Sub сделать выбор в поле Район ОК выводятся инструкции описания процедур.

  Процедуры обработки событий (закрытые процедуры) являются процедурами типа 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 ) меню Инструменты Добавить процедуру в поле выведенного диалогового окна ввести имя функции Factor в поле Тип сделать щелчок на Function, в поле Район - щелчок на Public ОК выводятся инструкции 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

в поле txtInput ввести число, например 89, сделать щелчок на командной кнопке, результат выводится во второе текстовое поле, рис. 2.2.  

Рис. 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) будем передавать как аргументы. Создание процедуры Добавить процедуру поле выведенного диалогового окна ввести имя процедуры mList в поле Тип сделать щелчок на 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

  Таблица 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 соответственно.

  Таблица 2.2. Аргументы описания процедур Property Название Синтаксис описания Property Let Property Let имя(1, :, к) Property Get Property Get имя(1, :, к) As тип   Таблица 2.3. Синтаксис вызова процедур 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 в поле Тип сделать щелчок на Property ОК выводятся инструкции 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а. Нахождение максимального элемента (массива). Создать на форме элементы управления CommandButton, поле списка, Label, рис. 2.5 и ввести код, данный ниже. Пояснения даны под комментариями:  

Рис. 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 Label44 = "Grossbritan.": x4 = Label44: x4 = Asc(x4): GoTo 304 Next i Label44.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 (Где проживает национальость : ?)

Соседние файлы в папке INTUIT Лекции Visual Basic