Лекция: End Sub 5 страница
2.12.1 Объявление массива
Массивы должны быть объявлены до их использования в программе.
Синтаксис:
Dim | Public | Private Имя_Массива (Размерность_Массива) As Тип_Данных
где
Dim | Public | Private – ключевые слова, декларирующие массив
и область его видимости;
Имя_Массива – идентификатор, определяющий имя массива;
Размерность_Массива – значение нижней и верхней границы значения
индекса (номера) соответствующей размерности.
Допускается описание до 60 размерностей.
As – ключевое слово, предваряющее указание типа
элементов массива;
Тип_Данных – любой, действительный для VBA тип данных
(базовый или созданный пользователем).
Пример 1.
Dim A (7) As Integer
Объявляется одномерный массив (вектор) А из 8 целых чисел, причем по умолчанию первый элемент массива будет А(0), а последний А(7).
При объявлении многомерного массива в поле индекса указывается несколько индексов в соответствии с размерностью массива.
Пример 2.
Dim B (4, 5) As Single
Объявляется двумерный массив В 4 х 5 (матрица), состоящая из 5 строк и 6 столбцов действительных чисел.
По умолчанию значение нижнее границы массива при таком объявлении равно нулю. В этом случае говорят, что 0 – базовый индекс массива. Можно изменить базовый индекс, написав в области описания модуля (General Declarations) инструкцию Option Base 1. После этого индексы массивов А и В будут нумероваться с единицы.
Другим способом изменения базового индекса является использование ключевого слова To при объявлении массива.
Пример 3.
Dim A (1 To 7) As Integer
Dim B (1 To 4, 1 To 5) As Single
В этом примере базовому индексу массива установлено значение 1.
Подобным образом моно устанавливать как положительные, так и отрицательные базовые индексы
Пример 4.
Dim Z (-3 To 7) As Single.
2.12.2 Динамические массивы
Иногда в процессе выполнения программы требуется изменять размер массива. В этом случае первоначально массив объявляют как динамический. Для этого при объявлении массива не надо указывать его размерность.
Пример 1.
Dim R () As Single.
Затем в программе следует вычислить необходимое количество элементов массива и сохранить его в некоторой переменной, например n, а затем изменить размер динамического массива с помощью оператора ReDim.
Пример 2.
ReDim R (1 To 3).
Синтаксическая конструкция переопределения массива:
ReDim [Preserve] Имя_Массива (Размерность_Массива) As Тип_Данных
где
ReDim – ключевое слово, указывающее, что переопределяются размеры массива;
Preserve – необязательное ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности. Если оно не используется, то данные в массиве при изменении размерности не сохраняются.
Имя_Массива – имя массива, удовлетворяющее стандартным правилам именования переменных;
Размерность_Массива — значение нижней и верхней границы значения индекса (номера) соответствующей размерности (до 60). Если отсутствует инструкция Option Base, нижняя граница индекса по умолчанию равна 0.
Тип_Данных – тип данных массива.
Пример 3.
Dim A () As Integer ‘Объявление динамического массива
Dim n As Integer ‘Объявление переменной, для хранения размерности
N = 9 ‘Инициализация значения
ReDim A (n) ‘Одномерный массив из 10 элементов
ReDim A (3 To n, 1 To n) ‘Двумерный массив с базовыми индексами
Примечание. Оператор ReDim изменяет размерность массива, но не тип его элементов.
2.12.3 Действия над массивами
Для работы с массивом как единым целым используется идентификатор массива без указания индекса в круглых скобках. Массив может участвовать в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, то есть иметь одинаковые типы индексов и одинаковые типы компонентов.
Пример 1.
Если массивы А и В описаны как
Dim A (1 To 2) As Byte, B (1 To 2) As Byte,
то применение к ним допустимой операции даст следующий результат:
| Выражение | Результат |
| A = B | Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны |
Пример 2.
Значение одного массива присваивается другому поэлементно в операторе цикла.
Sub primer ()
Dim A (1 To 2) As Byte, B (1 To 2) As Byte
Dim I As Byte
B(1) = 2
B(2) = 4
For I = 1 To 2
A(i) = B(i)
Debug.Print A(i), B(i)
Next i
End Sub
2.12.4 Действия над элементами массива
После объявления массива каждый его элемент можно обрабатывать, указав идентификатор (имя) массива и индекс элемента в круглых скобках.
Пример 1.
Запись
Mas (2), VectorZ (10)
позволяет обратиться к третьему элементу массива Mas и одиннадцатому элементу массива VectorZ.
Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах параметрических и итерационных циклов, входить в качестве параметров в операторы ввода и вывода; им можно присваивать любые значения, соответствующие их типу.
2.12.5 Формирование массива
1 способ.
Формирование массива в программе определяется поэлементно с помощью последовательности операторов.
Пример 1.
Dim B (1 To 2, 1 To 3) As Single
B (1,1) = 2: B (1,2) = 4: B (1,3) = 6
B (2,1) = 1: B (2,2) = 6: B (2,3) = 2
2 способ.
Формирование массива с помощью датчика случайных чисел.
Пример 2.
Sub primer ()
Dim A(1 To 12) As Variant
Randomize
For i = 1 To 10
A(i) = Rnd (40)
Debug.Print A(i)
Next i
End Sub
3 способ
Инициализация элементов массива оператором цикла.
Наиболее эффективно эта операция выполняется с помощью оператора For.
Пример 3.
Dim M (1 To 9, 1 To 9) As Integer
Dim i As Integer
Dim j As Integer
For i = 1 To 9
For j = 1 To 9
M(i, j) = i * j
Next j
Next i
4 способ
Использование функции Array (массив) для задания одномерного массива
Удобным способом определения одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в вектор из этих значений, и присваивающая их переменной типа Variant.
Пример 4.
Sub ShowArray ()
Dim A As Variant
A = Array (10, 20, 30)
Debug.Print A(0) ‘Отобразится: 10
Debug.Print A(2) ‘Отобразится: 30
End Sub
Использование функции Array (массив) для задания многомерного массива
Функция Array позволяет задавать не только одномерные, но и многомерные массивы. Это обеспечивается использованием вложенной конструкции с функциями Array.
Пример 5.
Option Base 1
Sub MultiDim ()
Dim A As Variant
A = Array (Array(“Санкт-Петербург“, “Россия“), Array (“Киев“, “Украина“))
Debug.Print A (1) (1) ‘Отобразится: Санкт-Петербург
Debug.Print A (1) (2) ‘Отобразится: Россия
End Sub
Функция Array позволяет задавать не просто многомерные массивы, а массивы, у которых строки имеют различное число компонентов.
Пример 6.
Private Sub VarArray ()
Dim M As Variant
M = Array(Array(1,2), Array (3,4,5))
Debug.Print M (0) (0), M (1) (2) ‘Отобразится: 1 5
End Sub
2.12.6 Одномерные массивы
Пример 1.
Формирование массива в программе с помощью последовательности операторов.
Постановка задачи. Реализовать на языке VBA алгоритм поиска наибольшего элемента последовательности с определением его местонахождения.
Технология выполнения задания:
1 Набрать в стандартном модуле проекта следующую пользовательскую процедуру:
Sub primer()
Const n = 10
Dim N_max As Integer
Dim i As Integer
Dim Max As Single
Dim B(1 To n) As Single
B(1) = 0.2: B(2) = 1.4: B(3) = 0.6
B(4) = 0.121: B(5) = 0.77: B(6) = 9.45
B(7) = 8.21: B(8) = 0.4: B(9) = 0.3
B(10) = 4.11
Max = B(1)
N_max = 1
For i = 2 To n
If B(i) > Max Then
Max = B(i)
N_max = i
End If
Next i
Debug.Print «Max= » & Max & " N_max= " & N_max
End Sub
2 Вычислить.
Пример 2.
Использование функции Array (массив) для задания одномерного массива.
Постановка задачи. Прежняя.
Технология выполнения задания:
1 Набрать в стандартном модуле проекта следующую пользовательскую процедуру:
Option Base 1
Sub primer()
Dim i As Integer
Dim Max As Single
Dim N_Max As Integer
Dim B As Variant
B = Array(0.1, 1.12, 3.12, 0.45, 101.47, 12.4, 10.12, 10.11, 6.47, 13.4)
Max = B(1)
N_Max = 1
For i = 2 To 10
If B(i) > Max Then
Max = B(i)
N_Max = i
End If
Next i
Debug.Print «Max= » & Max & " N_max= " & N_Max
End Sub
2 Вычислить.
Лабораторная работа № 6
Одномерные массивы
Цель: приобретение навыков программирования обрабатывать последовательности с помощью пользовательской подпрограммы-процедуры. Индивидуальные варианты лабораторной работы № 6 представлены в таблице 22 (2 часа).
Таблица 22
| № В | Варианты индивидуальных заданий |
| Разработать процедуру пользователя для обработки последовательности | |
| Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an являющихся нечётными числами | |
| Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an кратных 3 и не кратных 5. | |
| Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an являющихся квадратами чётных чисел. | |
| Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an удовлетворяющих условию. | |
| Даны натуральные числа n, a1, a2, … ,an. Определить количество ak последовательности a1,a2,…,an удовлетворяющих условию. | |
| Даны натуральные числа n, q1, q2,…, qn. найти те члены qi последовательности q1, q2,…, qn которые являются удвоенными нечётными числами. | |
| Даны натуральные числа n, q1, q2,…, qn. найти те члены qi последовательности q1, q2,…, qn которые при делении на 7 дают остаток 1.2 или 5. | |
| Даны натуральные числа n, q1, q2,…, qn. найти те члены qi последовательности q1, q2,…, qn которые обладают тем свойством, что корни уравнения действительны и положительны. |
Продолжение таблицы 22
| Вычислить, где |
| Дано натуральное число n. Получить сумму тех чисел вида, которые являются удвоенными нечётными. При отсутствии таких чисел искомая сумма равна нулю. |
| Даны целые числа а1,…, а50. Получить сумму тех чисел данной последовательности, которые кратны 5. |
| Даны целые числа а1,…, а50. Получить сумму тех чисел данной последовательности, которые нечётны и отрицательны. |
| Даны целые числа а1,…, а50. Получить сумму тех чисел данной последовательности, которые удовлетворяют условию. |
| Даны натуральное число n, действительные числа a1, a2, … ,an. в последовательности a1, a2, … ,an все отрицательные члены увеличить на 0.5, а все неотрицательные заменит на 0.1. |
| Вычислить, где |
| Даны целые числа a, n, x1,…,xn (n>0). Определить, каким по счёту идёт в последовательности x1,…,xn член, равный а. Если такого члена нет, то ответом должно быть число 0. |
| Даны натуральные числа n, a1, a2, … ,an. В последовательности a1, a2,…,an получить сумму положительных и число отрицательных членов. |
| Даны натуральные числа n, a1, a2, … ,an. Заменить все большие семи члены последовательности a1, a2, … ,an числом 7. Вычислить количество таких членов. |
| Даны целые числа a1, a2, … ,a45. Получить число отрицательных членов последовательности a1, a2, … ,a35 и число нулевых членов всей последовательности a1, a2, … ,a45. |
| Запишите +1 вместо максимального элемента массива (а1, а2, …, а50), а -1 вместо минимального. |
2.12.7 Двумерные массивы. Вложенные циклы.
Пример 1.
Постановка задачи. Даны натуральное число n, действительная матрица размера n x 3. Получить сумму положительных и число отрицательных членов во всей матрице.
Технология выполнения задания:
1 Набрать в стандартном модуле проекта следующую пользовательскую процедуру:
Sub primer()
Const n = 3
Const m = 3
Dim S As Single
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim A(1 To n, 1 To m) As Single
A(1, 1) = -11: A(1, 2) = 0: A(1, 3) = 2
A(2, 1) = 5: A(2, 2) = 45: A(2, 3) = 32
A(3, 1) = -3: A(3, 2) = 14: A(3, 3) = -25
S = 0
k = 0
For i = 1 To n
For j = 1 To m
If A(i, j) >= 0 Then S = S + A(i, j) Else k = k + 1
Next j
Next i
Debug.Print «S= » & S & " k= " & k
End Sub
2 Вычислить.
Пример 2.
Постановка задачи. Дана действительная матрица m x n. Определить числа b1, …, bm, равные наименьшим значениям элементов строк.
Технология выполнения задания:
1 Набрать в стандартном модуле проекта следующую пользовательскую процедуру:
Option Base 1
Sub primer()
Dim i As Integer
Dim j As Integer
Dim M(1 To 3, 1 To 3) As Variant
Randomize
For i = 1 To 3
For j = 1 To 3
M(i, j) = Rnd(20)
Debug.Print («M(» & i & j & ")=" & M(i, j))
Next j
Next i
For i = 1 To 3
Min = M(i, 1)
For j = 2 To 3
If M(i, j) < Min Then Min = M(i, j)
Next j
Debug.Print («Min(» & i & ")= " & Min)
Next i
End Sub
2 Вычислить.
Пример 3.
Постановка задачи. Даны натуральное число n, действительная матрица размера n x 3. Найти среднее арифметическое, каждого из столбцов.
Технология выполнения задания:
1Набрать в стандартном модуле проекта следующую пользовательскую процедуру:
Option Base 1
Sub primer()
Const m = 3: Const n = 4
Dim i As Integer
Dim j As Integer
Dim s As Single
Dim A(1 To m, 1 To n) As Integer
For i = 1 To m
For j = 1 To n
A(i, j) = i * j
Debug.Print «A(» & i & j & ")=" & A(i, j)
Next j
Next i
For j = 1 To n
s = 0
For i = 1 To m
s = s + A(i, j) / m
Next i
Debug.Print «s= » & s
Next j
End Sub
2 Вычислить.
Лабораторная работа № 7
Двумерные массивы. Вложенные циклы
Цель: приобретение навыков программирования обработки табличных данных с помощью пользовательской подпрограммы-процедуры. Индивидуальные варианты лабораторной работы № 7 представлены в таблицах 23, 24 (4 часа)
Таблица 23
| № В | Варианты индивидуальных заданий |
| Построить процедуру пользователя для обработки таблиц | |
| Дана действительная матрица размера m´n. Определить числа b1,…,bm равные суммам элементов строк. | |
| Дана действительная матрица размера m´n. Определить числа b1,…,bm равные произведениям элементов столбцов. | |
| В массиве данных с1, …, с20 определить сумму квадратов отрицательных элементов и сумму положительных. Подсчитать количество положительных, отрицательных и нулевых элементов. | |
| Дана действительная матрица размера m´n. Определить числа b1,…,bm равные наименьшим значениям элементов строк. | |
| Дана действительная матрица размера m´n. Определить числа b1,…,bm равные значениям средних арифметических элементов строк. | |
| Дана действительная матрица размера m´n. Определить числа b1,…,bm равные разностям наибольших и наименьших значений элементов строк. | |
| Даны натуральное число n, действительная матрица размера n´9. Найти средне арифметическое: а) каждого из столбцов; б) каждого из столбцов, имеющих чётные номера. | |
| Даны целые числа а1, а2, а3. Получить целочисленную матрицу, для которой. | |
| Даны действительные числа а, …, а; b, … ,b. Получить действительную матрицу, для которой. | |
| Дано натуральное число n. получить действительную матрицу, для которой | |
| Получить — целочисленную матрицу для которой. |
Продолжение таблицы 23
| Получить действительную матрицу, первая строка которой задаётся формулой, вторая строка задаётся формулой, а каждая следующая строка есть сумма двух предыдущих. |
| Дано натуральное число n. Выяснить сколько положительных элементов содержит матрица, если. |
| Дана действительная матрица n´m, в которой не все элементы равны нулю. Получить новую матрицу путём деления всех элементов данной матрицы на её наибольший по модулю элемент. |
| Дана действительная квадратная матрица порядка 12. Заменить нулями все её элементы, расположенные на главной диагонали и выше неё. |
| Даны действительные числа х1,…, х8. Получить действительную квадратную матрицу порядка 8: |
| Даны натуральное число n, действительная матрица. Получить последовательность элементов главной диагонали а11, а22,…, аnn. |
| Дана действительная матрица размера 6´9. Найти среднее арифметическое наибольшего и наименьшего значений её элементов. |
| Сформировать массив р из 20 элементов, i-ый элемент которого определяется по формуле, где х=0.225. Расставить в порядке возрастания элементы массива. |
| В массиве данных с1, …, с20 определить сумму квадратов отрицательных элементов и сумму положительных. Подсчитать количество положительных, отрицательных и нулевых элементов. |
Таблица 24
| № В | Варианты индивидуальных заданий | |||||||
| Разработать экономическую процедуру пользователя | ||||||||
По данной таблице определить максимальную свободную цену реализации каждого вида продукции молочного комбината на различных рынках сбыта за минувший месяц и вычислить максимальную прибыль от реализации единицы продукции при условии, что в среднем убыток от реализации единицы (1 кг) всех видов продукции (расходы на транспорт, потери и т.п.) составил 500 р. Прибыль от реализации единицы продукции Пр=Цр-С/ед-Уб где Цр — цена реализации 1 кг; C/ед — себестоимость 1 кг продукции (вводим); Уб — убыток на ед.продукции. | ||||||||
| Вывести на экран крупнейшую компанию мира, чистая прибыль которой превышает 1 тыс.дол. | ||||||||
| На трех торговых точках продается 4 вида товаров. Известна цена каждого товара и прибыль, полученная от реализации единицы товара, а также количество каждого товара. Необходимо найти стоимость товара и прибыль с каждой торговой точки по формуле с[i,j]=c[i,j]+a[i,l]*b[l,j]. | ||||||||
| Вычислить, каким был максимальный курс акций фирмы после четырех торгов на бирже. Курс акций = Дивиденд/Ссудный процент*100 (массив — курс акций). | ||||||||
| Динамика ВНП ведущих развитых стран составила (млрд.дол.): в 1993 году: США — 4500; РОССИЯ — 4300 в 1994 году: США — 4460; РОССИЯ — 4390 Вычислить максимальный ВНП. | ||||||||
| Дан курс покупки доллара ($) за 7 дней (неделю). Рассчитать, какова средняя цена покупки $ за неделю. 1день 2день 3день 4день 5день 6день 7день 4500 4520 4600 4750 5000 5120 5100 | ||||||||
| Даны данные о средней зарплате с 1990 по 1993 год (111.4; 100.0; 67.7; 64.8). Найти средне арифметическое наименьшей и наибольшей зарплаты. | ||||||||
| Задан массив, содержащий разряды рабочих завода. Посчитать количество трудящихся, работающих по первому разряду. |
Продолжение таблицы 24
| Дано 6 фирм. Определить, продукция которых из них пользуется наибольшим спросом, если продажа (в единицах товара) составляет: в 1-й фирме — 35, во 2-й — 46, в 3-й — 10, в 4-й — 68, в 5-й — 30, в 6-й — 15 | ||||||||||||||
| Вычислить сальдо (SALD) торгового баланса по формуле: SALD = KR — DB Кредит (KR): нефть сырая 8370; нефтепродукты 3471; природный газ 7443; золото 1284 Дебет (DB): зерно 1576; прочее продовольствие 3912; медикаменты 269; машины и оборудование 9409; гуманитарная помощь 1000 | ||||||||||||||
| Известны кредиты банка для разных предприятий. Посчитать сумму кредитов банка. | ||||||||||||||
| В каком году в период с 1945 по 1985 в США наблюдался максимальный уровень инвестирования. Данные об инвестировании поместить в одномерные массивы. | ||||||||||||||
Определить, в каком месяце 1984 года в Италии темп инфляции был минимальным.
| ||||||||||||||
| Подсчитать сумму прибыли в 3 магазинах за неделю. Для этого введите сумму прибыли, полученной в каждый день недели для каждого из 3 магазинов. | ||||||||||||||
| Предприниматель в течение года каждый месяц вкладывал в банк деньги под проценты. Определить, в какой месяц сумма вклада была минимальной. Вывести на печать минимальную сумму и месяц. Считать, что 1-январь, 2-февраль, 12-декабрь. Вводить данные (в тысячах): январь — 840; май — 830; сентябрь — 560; февраль — 1020; июнь — 720; октябрь — 2000; март — 950; июль — 8015; ноябрь — 3005; апрель — 640; август — 6040; декабрь — 980 | ||||||||||||||
| В результате инвентаризации обнаружено, что у многих запчастей истек срок их эксплуатации и они подлежат списанию со счета 10 ''Материалы''. Определить количество списываемых запчастей. Исходные данные: S[i] — износ каждой детали SROK — предельный срок эксплуатации n-количество запчастей. | ||||||||||||||
| Даны девиденты на акцию за пять лет. Найти максимальные девиденты. | ||||||||||||||
| Даны данные о размерах дохода и расхода предприятия за каждый месяц. Какие месяцы были убыточными. |
Продолжение таблицы 24
| Вычислить налог на заработную плату нескольких сотрудников, учитывая, что до 48000 он составляет 7,51%, а больше 48000 — 3,755%. | ||||
Дан схематичный расчетный баланс за определенный период (1995-2004). Составить программу, позволяющую найти первый отрицательный баланс (платежи превышают поступления) и вывести это число на экран дисплея. Исходными данными является баланс. Расчетный баланс
|