- •Понятие алгоритма
- •Изображение алгоритма в виде блок-схемы
- •Программирование на языке
- •5. Представление вещественного числа
- •7. Переменные в vba
- •8. Константы в vba
- •9. Операции и функции языка vba
- •10. Структура программы
- •11. Правила записи операторов
- •14. Ввод и вывод данных с использованием рабочего листа ms Excel
- •17. Ввод и вывод данных с использованием встроенных функций vba
- •18. Условный оператор
- •20. Операторы циклической структуры
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •21. Решение задач с использованием циклов
- •22. Обработка массивов
- •23. Ввод-вывод элементов массива
22. Обработка массивов
Массив – структурированный тип данных, состоящий из фиксированного числа элементов.
Переменную, представляющую собой просто список данных, называют одномерным массивом или вектором.
Для доступа к данным, хранящимся в одномерном массиве, указывают имя массива и порядковый номер (индекс) элемента.
Объявление одномерного массива в VBA имеет следующий синтаксис:
Dim имя (размерность) AS Тип
имя - любое имя для массива, удовлетворяющее правилам VBA для имен переменных.
Размерность массива записывают так:
(нач.знач. To кон.знач)
или
(кон. значене)
нач.знач. и кон.знач - границы допустимых индексов массива.
нач.знач. - определяет нижний предел допустимых индексов.
кон.знач. - верхний предел.
Параметр кон.знач. является обязательным, часть нач.знач. To может отсутствовать. В этом случае элементы массива нумеруются с нуля.
Определение нач.знач. делает программный код более понятным, а также позволяет выявлять ошибки программирования. Кроме того, это дает возможность определения иного начального индекса, отличного от 0.
Размерность массива и тип его элементов определяют объем памяти, который необходим для хранения массива. Следовательно, размерность должна быть определена целыми положительными константными выражениями.
Тип - любой допустимый тип VBA. Если Тип не указан, то все элементы массива имеют тип Variant.
Dim A (1 To 10) As Integer
Dim B (0 To 9) As Single
Dim C (9)
Const N=20
Dim M(1 to N)
Для доступа к элементу массива необходимо указать имя массива, а затем в круглых скобках, значение индекса. Синтаксис обращения к элементу массива имеет следующий вид:
Имя (Индекс)
A(1), В(0), C(8)
Индексом массива может быть любая целочисленная переменная или выражение, имеющее результатом целое число в диапазоне объявленных измерений массива.
Например,
Dim K As Integer
K=2
C(K)=A(K+1)+B(2*K)
Все манипуляции с массивами в осуществляются поэлементно.
Организовывается цикл, в котором происходит последовательное обращение к 1-му, 2-му и т.д. элементам.
Алгоритм обработки массива в общем виде:
При работе с массивами удобно хранить данные в ячейках рабочих листов Excel, а ввод и вывод элементов массива осуществлять при помощи свойства Cells.
23. Ввод-вывод элементов массива
Алгоритм ввода массива:
Фрагмент программы.
Sub inp() Dim i As Integer Dim n As Integer Dim X(1 To 10) As Single n = InputBox("n=", ,10) For i = 1 To n X(i) = Cells(i, 1) Next End Sub
|
Алгоритм вывода массива
Фрагмент программы.
For i = 1 To n Cells(i, 2) = X(i) Next
|
24. Основные алгоритмы обработки массивов
Сумма элементов массива.
Фрагмент программы: |
S = 0 For i = 1 To n S = S + X(i) Next MsgBox "S=" & S |
Произведение элементов массива.
| |
Фрагмент программы: |
|
P = 1 For i = 1 To n P = P * X(i) Next MsgBox "P=" & P |
|
Поиск максимального
элемента и его номера
Max = X(1)
Nom = 1
For i = 2 To n
If X(i) > Max Then
Max = X(i)
Nom = i
End If
Next
MsgBox "Max=" & Max
& Chr(13) & "Nom=" & Nom
Удаление элемента
из массива
Пусть необходимо удалить из массива, состоящего из семи элементов, четвертый по номеру элемент.
Номера элементов |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Исходный массив |
4 |
7 |
3 |
8 |
9 |
2 |
5 |
Полученный массив |
4 |
7 |
3 |
9 |
2 |
5 |
5 |
m = InputBox("n=")
For i = m To n - 1
X(i) = X(i + 1)
Next
For i = 1 To n - 1
Cells(i, 2) = X(i)
Next
Упорядочение
элементов массива
Сортировка методом пузырька
Номер элемента |
1 |
2 |
3 |
4 |
5 |
Исходный массив |
7 |
3 |
5 |
4 |
2 |
Первый просмотр |
3 |
5 |
4 |
2 |
7 |
Второй просмотр |
3 |
4 |
2 |
5 |
7 |
Третий просмотр |
3 |
2 |
4 |
5 |
7 |
Четвертый просмотр |
2 |
3 |
4 |
5 |
7 |
Sub sort()
Dim n As Integer
Dim i As Integer, j As Integer
Dim Y(1 To 10) As Single
n = InputBox("n=", , 10)
For i = 1 To n
Y(i) = Cells(i, 1)
Next
For j = 1 To n - 1
For i = 1 To n - j
If Y(i) > Y(i + 1) Then
b = Y(i + 1)
Y(i + 1) = Y(i)
Y(i) = b
End If
Next i
Next j
For i = 1 To n
Cells(i, 2) = Y(i)
Next
25. Примеры программ
ЗАДАЧА 9. Найти среднее значение положительных элементов в массиве.
Sub prim()
Dim i As Integer
Dim N As Integer
Dim k As Integer
Dim S As Integer
Dim X(1 To 20) As Integer
N = InputBox("N=", , 10)
For i = 1 To N
X(i) = Cells(i, 1)
Next
S = 0
k = 0
For i = 1 To N
If X(i) > 0 Then
S = S + X(i)
k = k + 1
End If
Next
If k <> 0 Then
S = S / k
MsgBox "S=" & S
Else
MsgBox "ERROR!!!"
End If
End Sub
ЗАДАЧА 10. Дан массив А состоящий из k целых положительных чисел. Записать все четные по значению элементы массива А в массив В.
Sub prim_10()
Dim i As Integer
Dim m As Integer
Dim k As Integer
Dim A(1 To 20) As Integer
Dim B(1 To 20) As Integer
k = InputBox("k=", , 10)
For i = 1 To k
A(i) = Cells(1, i + 1)
Next
m = 0
For i = 1 To k
If A(i) Mod 2 = 0 Then
m = m + 1
B(m) = A(i)
End If
Next
If m <> 0 Then
For i = 1 To m
Cells(2, i + 1) = B(i)
Next
Else
MsgBox "ERROR!!!"
End If
End Sub
ЗАДАЧА 11. Удалить из массива X, состоящего из N элементов, наименьший элемент.
Sub prim_11()
Dim i As Integer
Dim N As Integer
Dim nom As Integer
Dim max As Integer
Dim X(1 To 20) As Integer
N = InputBox("N=", , 10)
For i = 1 To N
X(i) = Cells(1, i)
Next
max = X(1)
nom = 1
For i = 2 To N
If X(i) > max Then
max = X(i)
nom = i
End If
Next
For i = nom To N - 1
X(i) = X(i + 1)
Next
For i = 1 To N - 1
Cells(2, i) = X(i)
Next
End Sub
ЗАДАЧА 12. Проверить содержит ли массив X, состоящий из N элементов, хотябы один нулевой элемент. Если содержит, то поменять его местами с последним элементом массива.
Sub prim_12()
Dim i As Integer
Dim N As Integer
Dim nom As Integer
Dim b As Integer
Dim X(1 To 20) As Integer
N = InputBox("N=", , 10)
For i = 1 To N
X(i) = Cells(1, i)
Next
nom = 0
For i = 1 To N
If X(i) = 0 Then
nom = i
Exit For
End If
Next
If nom <> 0 Then
b = X(nom)
X(nom) = X(N)
X(N) = b
For i = 1 To N
Cells(2, i) = X(i)
Next
Else
MsgBox "NO!!!"
End If
End Sub
ЗАДАЧА 13. Вычислить сумму элементов массива X(N) расположенных между минимумом и максимумом.
Sub prim_13()
Dim i As Integer
Dim N As Integer
Dim nMax As Integer
Dim max As Single
Dim nMin As Integer
Dim min As Single
Dim S As Single
Dim X(1 To 20) As Single
N = InputBox("N=", , 10)
For i = 1 To N
X(i) = Cells(1, i)
Next
max = X(1)
nMax = 1
For i = 2 To N
If X(i) > max Then
max = X(i)
nMax = i
End If
Next
min = X(1)
nMin = 1
For i = 2 To N
If X(i) < min Then
min = X(i)
nMin = i
End If
Next
If nMax < nMin Then
b = nMax
nMax = nMin
nMin = b
End If
S = 0
For i = nMin To nMax
S = S + X(i)
Next
MsgBox "S=" & S
End Sub
ЗАДАЧА 14. Вычислить сумму элементов массива X(N) с четными индексами и произведение с нечетными.
Sub prim_14()
Dim i As Integer
Dim N As Integer
Dim P As Integer
Dim S As Integer
Dim X(1 To 20) As Integer
N = InputBox("N=", , 10)
For i = 1 To N
X(i) = Cells(i, 1)
Next
S = 0
For i = 2 To N Step 2
S = S + X(i)
Next
MsgBox "S=" & S
P = 1
For i = 1 To N Step 2
P = P * X(i)
Next
MsgBox "P=" & P
End Sub