Оператор присоединения With
Этот оператор не изменяет порядок выполнения операторов и не вызывает циклического выполнения группы операторов. Однако он часто используется в циклах для облегчения восприятия текста при непосредственной работе со свойствами и методами объекта или переменными пользовательского типа (записями), не повторяя каждый раз их имя. Как и любой составной оператор, оператор With может иметь вложенные конструкции. Синтаксис его следующий:
With объект
[<.Метод> [<Параметры>]] [<.Свойство>=<Значение> ]
………….
End With
Пример. Ввести в поле некоторый текст и поменять
его свойства с помощью оператора With.
Private Sub Command1_Click()
Static i As Integer With Text1
.ForeColor = CLng(Rnd * 16777215)
.BorderStyle = i Mod 2
.BackColor = CLng(Rnd * 5000000 + 10000000) With .Font
.Bold = i Mod 2
.Italic = i Mod 2
.Size = CInt(Rnd * 18 + 6) End With
End With i = i + 1
End Sub
Private Sub Form_Load()
' Text1.ScrollBars = 2 и Text1.MultiLine = True Caption = "Смена параметров поля" Command1.Caption = "With"
MsgBox "Введите в поле текст и понажимайте кнопку"
Text1 = "" : Text1.TabIndex = 0
End Sub
Массивы
Массивом называют набор однотипных элементов (переменных, объектов), объединенных одним именем. Каждый элемент массива доступен через общее имя и свой порядковый номер (индекс) в наборе. По умолчанию нумерация индексов массива начинается с нуля, но возможно объявление массива с единицы или с указанием нижней и верхней границы изменения индекса. В последнем случае нижняя граница индекса может быть отрицательным числом.
Массивы могут быть статическими (фиксированной длины) и динамическими (нефиксированной длины). Рассмотрим описание массивов фиксированной длины.
Dim mm(5) As Integer 'Объявлен массив из 6 целых 'чисел с именем mm. Здесь элементы массива
'занимают ячейки памяти, начиная с mm(0) Dim ms(-10 to 10) 'Объявлен массив элементов с 'имени ms типа Variant. Здесь элементы массива 'занимают ячейки с ms(-10) и до ms(10)
Option Base 1
'Установка нижней границы индекса, равной 1 Dim m(5) as Double
'Объявлен массив m из 5 вещественных чисел. 'Здесь элементы массива занимают ячейки 'памяти, начиная с m(1)
Пример. Сформировать одномерный массив из 6 случайных чисел.
Поскольку количество элементов массива зафиксировано, то проще всего для их формирования воспользоваться счетным циклом.
Private Sub Command1_Click()
Dim A(5) as Double
For i=0 To 5 'Шаг равен 1
A(i) = Rnd 'Случайные вещественные числа от 0…1 S = S & Format(A(i), “#0.000”) & Space(2)
Next Text1=S
'Результат: 0,706 0,533 0,580 0,290 0,302 0,775
End Sub
Функция Format(A(i), "#0.000") возвращает элемент массива, преобразованный в строку по формату #0.000 с тремя разрядами после точки и хотя бы с одним разрядом под целую часть. Здесь 0 – это обязательный символ числа или нуль, а # – необязательный символ числа. Функция Format может возвращать результат в экспоненциальной или в процентной форме. Например,
Format(A(i), “00.00е-”) |
'экспоненциальная форма |
Format(A(i), “#0.00%”) |
'процентная форма |
Функция Space(2) добавляет два пробела в конец строки.
Массив, объявленный без указания размера,
называется динамическим. Размерность динамического массива указывается перед его использованием. Например,
Dim mtr() As Integer
'Объявлен динамический массив с именем mtr
……………
k = 10 'Задаем верхнюю границу массива (k >0) ReDim mtr(k) 'Определить массив mtr в памяти 'длиной в 11 элементов
……………
Если при повторном использовании оператора ReDim применить ключевое слово Preserve, то прежние значения элементов массива
сохраняются. Например,
……………
k = 15
ReDim Preserve mtr(k)
……………
Возможно объявление и многомерных статических и динамических массивов в пределах объема ОЗУ. Например, объявление двумерного массива типа Byte и пятимерного массива типа String выглядит следующим образом:
Option Base 1
Dim mtr1(9, 9) as Byte
Dim mtr2(3, 5, 4, 4, 4) as String *10
Мерность массива определяется количеством его индексов, а размер всего массива в памяти получается перемножением диапазонов каждого индекса на количество байт типа данных элемента массива. Например, двумерный массив mtr1 занимает в памяти 9×9×1 байт = 81 байт, а массив mtr2 занимает 3×5×4×4×4×10 байт =9600 байт.
При работе с массивами удобно использовать функции:
UBound(<Имя массива>[,<Размерность>]), LBound(<Имя массива>[,<Размерность>])
Первая функция возвращает верхнюю границу массива, а вторая – нижнюю. Размерность – это целое число, указывающее порядковый номер индекса массива, верхнюю или нижнюю границу, которой будет возвращать функция. Для первого индекса следует указать 1, для второго – 2 и т.д. Если аргумент Размерность опущен, подразумевается значение 1. Например,
Print LBound(mtr2, 1)
'Нижняя граница 1-го индекса массива mtr2=1 Print UBound(mtr2, 2)
'Верхняя граница 2-го индекса массива mtr2=5
Для повторной инициализации (обнуления)
элементов массива удобно использовать метод
Erase СписокМассивов. В СпискеМассивов
массивы указываются через запятую.
Массивы, также как и переменные, могут быть объявлены с ключевыми словами: Public (доступен всему приложению), Private (доступен только в текущем подпрограмме), Dim (доступен внутри модуля, если был объявлен в области GD, или только в подпрограмме).
Действия, которые можно выполнить над массивами.
•Ввод элементов массива.
•Вывод элементов массива.
•Поиск заданного элемента в массиве.
•Поиск максимального и минимального элемента в массиве.
•Сортировка элементов массива.
Элементы массива удобно вводить через диалог
InputBox или текстовое поле с последующим выделением из него элементов функцией Split, а вывод осуществлять в текстовое поле строкой, в которой предварительно объединены все элементы массива.
Пример. Заполнить случайными элементами двумерный динамический массив и вывести их в текстовое поле.
Option Base 1
Private Sub Command1_Click()
Dim A() As Double
n% = Rnd * 8 + 2 'Количество строк от 2 до 10 m% = Rnd * 8 + 2 'Количество столбцов от 2 до 10 ReDim A(n, m) 'Объявим массив в памяти
For i% = 1 To n 'Сформируем элементы массива
For j% = 1 To m
A(i, j) = Rnd * 100 - 50
s = s + Format(A(i, j), "#0.00") & vbTab
'Вместо константы vbTab можно применить функцию
'Space(8)
Next
s = s & vbCrLf Next
Text1 = s
End Sub
Private Sub Form_Load()
'Text1.MultiLine=True и Text1.ScrollBars=Vertical Command1.Caption=”Запуск”
Caption=”Динамический массив”
End Sub
Константа vbTab – проставляет символ табуляции между числами в строке.
Пример. Найти позиции заданного элемента в массиве.
Алгоритм поиска заданного элемента в одномерном массиве может быть описан в следующем виде.
•Формируют элементы массива в памяти.
•Вводят заданное значение с клавиатуры.
•Запрашивают условие глобального или локального (например, только один раз) вхождения заданного элемента в набор.
•Сравнивают последовательно элементы массива с заданным значением и при равенстве запоминают местоположение каждого элемента в наборе.
Например, сформируем элементы массива в процедуре Form_Load, используя функцию InputBox. Далее при нажатии на кнопку Command1 выведем их в текстовое поле Text1, а позиции заданного элемента в массиве – в текстовое поле Text2.
Option Base 1
Dim A(10) As Single 'Массив описан, как глобальный
Dim n As Single
'Заданный элемент описан, как глобальный
Private Sub Form_Load()
'Установить свойство MultiLine=True Caption = "Поиск заданного элемента" Command1.Caption = "Поиск" : Text2 = "" For i% = 1 To 10
Msg$ = "A(" & CStr(i) & ")"
A(i) = InputBox(Msg, "Массив из 10 элементов") s = s & Format(A(i), "##0.0") & vbTab
Next Text1 = s
End Sub
Private Sub Command1_Click()
n = InputBox("Введите заданное число") S="Локальный поиск (введите 1) или глобальный (0)" d% = InputBox(S)
For i% = 1 To 10 If A(i) = n Then
S = S & CInt(i) & Space(2) If d = 1 Then Exit For
End If
Next
Text2 = "Заданный элемент " & Format(n, "##0.0") & _ " Позиции: " & S
End Sub
Пример. Найти максимальный и минимальный элементы в одномерном массиве.
Алгоритм поиска максимального и минимального элемента в массиве может быть описан в следующем виде.
• Есть список элементов и есть 2 ячейки (max, min), в которых следует запомнить любые элементы массива (проще запомнить в них первый элемент массива).
•Последовательно сравнивают каждый элемент
массива со значениями, хранящимися в ячейках max, min. Если окажется, что очередной элемент набора больше значения, хранящегося в ячейке max, то значение ячейки max обновляют. Если очередной элемент набора будет меньше значения, хранящегося в ячейке min, то обновляют ячейку min. Цикл повторяют до конца набора.
•Элементы массива сформируем в процедуре Form_Load случайно с выводом их в текстовое поле Text1. После щелчка по кнопке в текстовое поле Text2 выведем максимальный и минимальный элементы массива.
Dim A(9) as Integer
'Объявляем глобальный массив из 10 элементов
Private Sub Form_Load()
For I% = 0 To 9
A(i) = Rnd * 100 - 50
S = S & Format(A(i), "##0") & Space(2)
Next i
Text1 = S
End Sub
Private Sub Command1_Click()
Dim Max As Integer, Min As Integer
Max = A(0) : |
Min = A(0) |
For i% = 0 To 9 |
|
IF A(i) > Max |
Then Max = A(i) |
IF A(i) < Min |
Then Min = A(i) |
Next i
Text2 = "Max: " & Max & vbCrLf & "Min: " & Min
End Sub
Методов сортировки элементов массива много. Рассмотрим из них лишь два: метод выбора и метод перебора. Сортировка элементов одномерного массива выполняется всегда в двух циклах.
Пример. Упорядочить элементы одномерного массива по возрастанию индексов элементов методом выбора.
Алгоритм метода выбора можно описать в следующем виде.
•В наружном цикле по порядку определяется индекс (местоположение) выбранного элемента, который становится указателем на экстремальный элемент. Далее при поиске экстремального элемента массива он будет изменяться.
•Во внутреннем цикле осуществляется поиск экстремального элемента и перемещение на него указателя путем сравнения элемента (по условию больше или меньше), на который указывает указатель и элемента в оставшемся наборе, начинающегося со следующего по порядку после выбранного элемента и до конца набора.
•В результате проведенного сравнения во внутреннем цикле определится истинное местоположение (индекс) экстремального элемента.
•По выходу из внутреннего цикла осуществляется перестановка выбранного элемента и экстремального элемента массива.
•Наружный цикл повторяется выбором очередного элемента массива.
Option Base 1
Dim A(10) As Integer
'Объявление одномерного массива из 10 элементов
Private Sub Command1_Click()
Dim m As Integer 'm – указатель на экстр-й элемент Dim n As Integer 'n – ячейка для перестановки For i% = 1 To 9 'i – индекс выбранного элемента m = i
For j% = i + 1 To 10
IF A(j) < A(m) Then m = j Next j
If m<>i then n = A(i) : A(i) = A(m) : A(m) = n Next i 'Перестановка элементов For i = 1 To 10 'Собираем элементы в строку s = s & Format(A(i), "##0") & Space(2)
Next i
Text2 = s
End Sub
Private Sub Form_Load()
For i = 1 To 10
A(i) = Rnd * 100 - 50
S = S & Format(A(i), "##0") & Space(2) Next i
Text1 = S
End Sub
Сортировка по убыванию значений элементов массива отличается от сортировки по возрастанию значений элементов массива (при возрастании индексов массива) лишь заменой знака «<» на «>»
в условии A(j) < A(m).
Пример. Упорядочить элементы одномерного массива по возрастанию индексов элементов методом перебора.
Алгоритм метода перебора можно описать в следующем виде.
•В наружном цикле задается значение логической переменной, равной True, которая определяет упорядоченность массива.
•Во внутреннем цикле осуществляется поиск экстремального элемента (по условию больше или меньше) сравнением двух рядом расположенных элементов набора, и если условие сравнения выполняется, то происходит перестановка этих элементов, при этом значение логической переменной становится равной False, определяя, что массив еще не упорядочен.
•Далее происходит проверка условия на выход из
наружного цикла. Если значение логической переменной осталось равным True, то наружный цикл завершается. Если же она изменилась во внутреннем цикле, то вновь выполняется наружный цикл.
Option Base 1 |
|
Dim A(10) As Integer |
'Массив |
Dim f As Boolean |
'Флаг упорядоченности набора |
Private Sub Command1_Click() |
|
Do |
'Наружный цикл |
f = True |
|
For I% = 1 To 9 |
'Внутренний цикл |
IF A(i) > A(i + 1) Then f = False
n% = A(i) a(i) = A(i + 1)
A(i + 1) = n
End If
Next i
Loop Until f
For i = 1 To 10
S = S & Format(A(i), "##0") & Space(2)
Next i
Text2 = S
End Sub
Private Sub Form_Load()
For i = 1 To 10
A(i) = Rnd * 100 - 50
S = S & Format(A(i), "##0") & Space(2)
Next i
Text1 = S
End Sub
