Печатать книгуПечатать книгу

Основы работы в VBA. Массивы

Изложены основные сведения об использовании и представлении массивов данных. Рассмотрены приемы обработки данных в редакторе Visual Basic for Application (VBA) для Excel.

Сайт: Электронный университет КГЭУ - виртуальная образовательная среда
Курс: Информационные и компьютерные технологии (Бикеева Н.Г.)
Книга: Основы работы в VBA. Массивы
Напечатано:: Гость
Дата: Wednesday, 26 June 2024, 19:05

1. Массивы. Описание массивов

Цель работы 

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

             

 В программировании часто возникает необходимость обработки большого количества однородных данных – массивов (последовательностей чисел, временных рядов, матриц и т.п.). Массив – это множество однотипных элементов, объединенных общим именем и занимающих в компьютере определенную область памяти, доступ к которым осуществляется по индексу. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (или элементом массива). Массив является удобным способом хранения нескольких связанных элементов данных в едином контейнере для большего удобства и эффективности программирования. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип.

             Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Массиву присваивается имя, посредством которого можно ссылаться как на массив данных в целом, так и на любую из его компонент. Индекс (порядковый номер элемента) записывается в скобках после имени массива.

В зависимости от числа индексов массивы могут быть одномерными, двумерными и т.д. Так, например, в записи а = (а1, а2 …, аn) переменные а1, а2 …, аn являются компонентами вектора а и образуют одномерный массив.

 Матрица

 

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

Таким образом, количество индексов у переменной определяет размерность массива, а общее число элементов в массиве – размер.

Для задания индексированных переменных в VBA применяется оператор Dim (от англ. Dimension – размерность), который задает имя массиву и его размер: 

Dim имя массива (измерения массива) As type

имя массива – имя массива, к которому предъявляются такие же требования, как и к именам переменных (см. лабораторную работу «Основы работы в VBA. Линейное программирование»)

измерения массива – данная опция может быть задана следующим образом:

 нижний индекс ТО верхний индекс, нижний индекс ТО верхний индекс, …

 или

 верхний диапазон, верхний диапазон, ....

 

type – один из типов переменных (Integer, Single, Double, и т.д.)

 Следующие примеры являются допустимыми объявлениями массива:

 

Dim str_array(1 To 100) As String

Dim str_Multiplication(0 To 15, 0 To 15) As String

 

Если условия задачи таковы, что размер массива заранее не определен, то поступают так: в начале программы объявляется пустой массив, а когда становится известен его размер, определяют его в помощью оператора ReDim. Как это делается, рассмотрено ниже.

 


1.1. Заполнение массивов данными

Для ввода элементов массива можно использовать следующие способы:

1) функцию InputBox – функция InputBox отображает диалоговое окно, содержащее текст, который запрашивает пользователя ввести некоторое значение и текстовое окно для ввода этого значения.

 – для одномерного массива:

Dim A() As Integer

n = InputBox("Введите размер массива", "Определение размера массива")

ReDim A(n)

For i = 1 To n

'команда в редакторе VB набирается в одну строку

A(i) = InputBox("Введите элемент массива А(" & i & ")", "Заполнение массива")

Next i

 

При своей работе приведенный кусок программы выводит следующие окна:

 


 – для двумерного массива:

Dim A() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim A(n, m)

For i = 1 To n

For j = 1 To m

A(I, j) = InputBox("Введите элемент массива А(" & i & "," & j & ")")

Next j

Next i

 

2) функцию Сells – данные считываются из рабочего листа Excel. В этом случае пользователь перед запуском программы вводит данные элементов массива в ячейки рабочего листа Excel.

 

– для одномерного массива:

Dim a(10) As Integer

For i = 1 To 10

'массив записан в 5-ой строке рабочего листа Excel

a(i) = Cells(5, i)

Next i

 

– для двумерного массива:

 

Dim a(10, 5) As Integer

For i = 1 To 10

For j = 1 To 5

a(i, j) = Cells(i, j)

Next j

Next i

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

3) использование генератора случайных чисел Rnd(), если значение массива не задано. При таком способе заполнения массива надо учесть, что перед использованием функции  Rnd() надо инициализировать генератор случайных чисел, а также то, что он выдает числа в интервале от 0 до 1.

 

для одномерного массива:

Randomize Timer

Dim a() As Single

n = InputBox("Введите размер массива")

ReDim a(n)

For i = 1 To n

a(i) = 50 - Int(Rnd() * 100) / 10

Next i

 

для двумерного массива:

Randomize Timer

Dim a() As Single

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim a(n, m)

For i = 1 To n

For j = 1 To m

a(I, j) = 50 - Int(Rnd() * 100) / 10

Next j

Next i

 

4) с помощью формулы, если массив заполняется по какой-либо закономерности, причем значение элемента массива зависит от его местоположения:

 

– для одномерного массива:

Dim a() As Single

n = InputBox("Введите количество строк)

ReDim a(n)

For i = 1 To n

a(i) = 5 * i / (i + 4)

Next i

для двумерного массива:

Dim a() As Single

n = InputBox("Введите количество строк", "Определение размера массива. Запрос 1 из 2")

m = InputBox("Введите количество столбцов", "Определение размера массива. Запрос 2 из 2")

ReDim a(n, m)

For i = 1 To n

For j = 1 To m

a(i, j) = 5 * i / (j + 4)

Next j

Next i


1.2. Вывод массивов на печать

Вывести массив на печать можно следующими способами:

1) в рабочий лист Excel – для этого используется известная уже функция Cells:

 

для одномерного массива:

для двумерного массива:

For i = 1 To n

‘вывод в 10 строку рабочего

‘листа

Cells(10, i) = a(i)

Next i

For i = 1 To n

For j = 1 To m

‘вывод начинается с

‘5 строки 4 столбца

Cells(i+5, j+4) = a(i, j)

Next j

Next i

 

2) в диалоговое окно. Для этого весь массив переписывается в какую-либо одну текстовую переменную (например Text), которая и выводится в диалоговое окно. При выводе двумерного массива перед выводом необходимо сформировать строки и столбцы. Для этого используется функция Chr(13) – перевод каретки, которая при заполнении строки переводит курсор на начало следующей строки и Chr(9) – вставляет символ табуляции между элементами массива в строке. Здесь также массив предварительно записывается в текстовую переменную, которая выводится в диалоговое окно.

 

Для одномерного массива:

 

Для двумерного массива:

Text = ""

For i = 1 To n

Text = Text & a(i) & Chr(9)

Next i

MsgBox "Массив:"&Chr(13)& Text

 

Text = ""

For i = 1 To n

For j = 1 To m

Text = Text & a(i, j) & Chr(9)

Next j

Text = Text & Chr(13)

Next i

MsgBox "Массив:" & Chr(13) & Text


 


 


2. Динамические массивы

            Иногда бывает трудно заранее определить, сколько элементов нужно будет поместить в список. Для этого используют динамические массивы.

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

            Динамический массив объявляется так же, как и любой другой тип массива – оператором Dim. Единственное отличие состоит в том, что не указывается (в скобках) размер массива. Например: 

Dim A() As Byte

 Этой строкой создается массив, но откладывается решение о том, сколько он будет  иметь элементов. Перед тем, как использовать этот массив, необходимо указать его размер, который во время работы программы можно изменять сколько угодно раз. Это делается с помощью оператора ReDim.

 ReDim A(5)

Следует отметить, что при указании значений для размерностей динамического массива оператором ReDim его тип не может быть изменен.

         При помощи оператора ReDim можно установить любые значения границ и количество размерностей, а также менять любой из установленных параметров как в сторону уменьшения, так и увеличения.

Dim A() As Byte

ReDim A(5)                'Диапазон от 0 до 5

ReDim A(1 To 4)           'Диапазон от 1 до 4

ReDim A(3, 3, 1 To 3)     'Диапазон от 0 до 3,

                                         'от 0 до 3, от 1 до 3

В качестве как верхней, так и нижней границы могут быть использованы не только числа, но и переменные целого типа:

Dim n As Integer

Dim A() As Integer

n = 10

ReDim A(n)

           При каждом выполнении оператора ReDim все значения элементов массива, которые до этого в нем хранились, будут потеряны, так как данный оператор обнуляет все элементы в соответствии с их типом, например числовые массивы принимают значение 0, а символьные "" (пусто). Для того чтобы имеющиеся в массиве значения не пропали при его переопределении, следует использовать служебное слово Preserve:

Пример 1. 

Sub primer_1()

Dim n As Integer

Dim i As Integer

Dim a() As Integer

n = 10

ReDim a(n)

For i = 1 To n

    a(i) = i ^ 2

Next i

ReDim Preserve a(15)

For i = 11 To 15

    a(i) = i ^ 3

Next i

End Sub

 В данной программе требуется заполнить массив из десяти элементов квадратами первых десяти натуральных чисел. Затем следует переопределение размера массива до 15 и заполнение новых элементов (с 11 по 15) кубами следующих натуральных чисел.

Пример 2. Заполнить массив А нечетными членами натурального ряда (1, 3, 5...) до тех пор, пока их произведение не станет  больше произвольного числа М. Найти сумму элементов массива и их число.

Sub primer_2()

Dim a() As Integer

Dim m As Long

m = InputBox("Введите целое положительное число m>>1")

Dim p As Double, z As Integer, n As Integer, s As Integer

'определение размера массива

p = 1: z = 1: n = 0

Do While p <= m

p = p * z

z = z + 2  'рассчитываем значение следующего нечетного числа

n = n + 1  'счетчик количества чисел

Loop

ReDim a(n - 1)

'заполнение массива нечетными числами и вывод на печать

a(1) = 1: Cells(1, 1) = a(1)

For i = 2 To n - 1

a(i) = a(i - 1) + 2

Cells(1, i) = a(i)  

Next i

'определяем сумму элементов и их произведение

s = 0: p = 1

For i = 1 To n - 1

s = s + a(i)

p = p * a(i)

Next i

Cells(2, 1) = "Сумма элементов = " & s

Cells(3, 1) = "Произведение элементов = " & p

Cells(4, 1) = "Количество элементов  = " & n - 1

End Sub

 

Результат выполнения программы: 


Эту же задачу можно решить несколько иным способом:

 Sub primer_2_1()

Dim a() As Integer

Dim m As Long

m = InputBox("Введите целое положительное число m>>1")

Dim p As Double, n As Integer, s As Integer, i As Integer

'заполнение динамического массива

ReDim a(1)

n = 1: a(n) = 1: p = 1

Do While p <= m

n = n + 1

ReDim Preserve a(n)

a(n) = a(n - 1) + 2

p = p * a(n)

Loop

'отсечение последнего элемента массива

'т.к. сначала ищется произведение, затем сравнивается с m

'затем происходит выход из цикла

ReDim Preserve a(n - 1)

'печать массива

For i = 1 To n - 1

Cells(1, i) = a(i)

Next i

'поиск суммы и произведения элементов массива

p = 1: s = 0

For i = 1 To n - 1

p = p * a(i)

s = s + a(i)

Next i

Cells(2, 1) = "Сумма элементов = " & s

Cells(3, 1) = "Произведение элементов = " & p

Cells(4, 1) = "Количество элементов  = " & n - 1

End Sub

 

Пример 3. Задать массив А(n) из членов ряда А(i) = \( \sqrt{i} \). Число элементов массива ограничить по условию А(i) ≤ к, где к >> 1. Найти сумму, произведение и среднее значение элементов массива.

 Sub primer_3()

Dim a() As Single

Dim k As Single

k = InputBox("Введите положительное число k > 1")

Dim p As Double, i As Integer, j As Integer, s As Single

'заполнение динамического массива

i = 1

ReDim a(i)

a(i) = Sqr(i)

Do While a(i) <= k

i = i + 1

ReDim Preserve a(i)

a(i) = Sqr(i)

Loop

'отсечение последнего элемента массива

'т.к. сначала ищется элемент, затем сравнивается с k

'затем происходит выход из цикла

ReDim Preserve a(i - 1)

'печать массива

For j = 1 To i - 1

Cells(1, j) = a(j)

Next j

'поиск суммы и произведения элементов массива

p = 1: s = 0

For j = 1 To i - 1

p = p * a(j)

s = s + a(j)

Next j

Cells(2, 1) = "Сумма элементов = " & s

Cells(3, 1) = "Произведение элементов = " & p

Cells(4, 1) = "Среднее значение элементов = " & s / (i - 1)

Cells(5, 1) = "Количество элементов  = " & i - 1

End Sub

 

Результат выполнения программы:

 

3. Создание новых массивов при решении задач

              Часто при решении практических задач возникает необходимость создания нового массива из выборочных элементов исходного массива. Особенностью этого типа задач является то, что индексы элементов этих массивов не совпадают. Следовательно, в цикле должны изменяться два параметра и необходимо использовать прием организации цикла с несколькими одновременно изменяющимися параметрами. Обычно в блоке решения перед циклом начальные значения индексов новых массивов принимаются равными нулю. Далее в цикле по мере отбора элементов в новый массив вычисляется текущее значение этих индексов, которые и присваиваются соответствующим элементам. 

Пример 1. Дан вещественный массив А(n). Вывести отдельно массив целых положительных чисел (если они есть в исходном массиве) и массив оставшихся.

Решение. Для фиксации текущих  значений индексов в новых массивах введем счетчик k для массива B и счетчик q  для массива D. При нахождении элементов массива соответствующих  первому условию задачи увеличим значение k на единицу и присвоим этот индекс элементу нового массива  B и т.п. Аналогичная процедура повторяется и при выполнении  второго условия задачи, где формируется еще  один массив D.

 Sub task_1()

Dim A(10), B(10), D(10) As Single

Dim k As Byte, q As Byte, i As Byte

'ввод массива

For i = 1 To 10

A(i) = Cells(1, i)

Next i

'обнуление счетчиков новых массивов

k = 0: q = 0

For i = 1 To 10

'определение целого положительного числа

If (A(i) - Int(A(i))) = 0 And A(i) >= 0 Then

'вычисление текущего индекса массива В и запись числа в массив В

k = k + 1

B(k) = A(i)

Else

'запись элемента А(i) в новый массив D

q = q + 1

D(q) = A(i)

End If

Next i

If k = 0 Then

Cells(3, 1) = "В массиве целых чисел нет"

Else

Cells(3, 1) = "Массив целых положительных чисел B:"

For i = 1 To k

Cells(4, i) = B(i)

Next i

End If

If q = 0 Then

Cells(5, 1) = "Массив состоит только из целых положительных чисел"

Else

Cells(5, 1) = "Массив оставшихся чисел  D:"

For i = 1 To q

Cells(6, i) = D(i)

Next i

End If

End Sub

 

Результат выполнения программы:


Пример 2. Ввести массив А(n). Разделить его на два массива. Первый из элементов А(n) с четными индексами, второй – с нечетными. Вывести на печать исходный и вновь образованный массивы.

 Sub task_2()

Randomize Timer

Dim i As Integer, n As Integer, k_chetn As Integer

Dim k_nechet As Integer

Dim str1 As String, str2 As String, str3 As String

Dim a() As Single, b() As Single, c() As Single

n = InputBox("Введите размер массива", "Запрос 1 из 1")

ReDim a(n): ReDim b(CInt(n / 2)): ReDim c(CInt(n / 2))

str1 = "": str2 = "": str3 = ""

'заполнение исходного массива случайными числами

For i = 1 To n

a(i) = Int(Rnd() * 100)

str1 = str1 & a(i) & Chr(9)

Next i

'обнуление счетчиков

k_chet = 0: k_nechet = 0

'разделение исходного массива

For i = 1 To n

'определение четности индекса

If i / 2 = i \ 2 Then

'запись элементов с четными индексами в массив b

k_chet = k_chet + 1

b(k_chet) = a(i)

str2 = str2 & b(k_chet) & Chr(9)

Else

'запись элементов с нечетными индексами в массив с

k_nechet = k_nechet + 1

c(k_nechet) = a(i)

str3 = str3 & c(k_nechet) & Chr(9)

End If

Next i

'Команда MsgBox... записывается в редакторе VB в одну строку

MsgBox "Исходный массив:" & Chr(13) & str1 & Chr(13) & Chr(13) & "Массив с четными индексами:" & Chr(13) & str2 & Chr(13) & Chr(13) & "Массив с нечетными индексами:" & Chr(13) & str3

End Sub

 

Результат выполнения программы:

 


Пример . Ввести массив А(n). Разделить его на два массива. Первый из четных элементов А(n), второй – из нечетных. Вывести на печать исходный и вновь образованный массивы.

 Sub task_3()

Randomize Timer

Dim i As Integer, n As Integer, k_chetn As Integer

Dim k_nechet As Integer

Dim str1 As String, str2 As String, str3 As String

Dim a() As Single, b() As Single, c() As Single

n = InputBox("Введите размер массива", "Запрос 1 из 1")

ReDim a(n): ReDim b(n): ReDim c(n)

str1 = " ": str2 = " ": str3 = " "

'заполнение исходного массива случайными числами

For i = 1 To n

a(i) = Int(Rnd() * 100)

str1 = str1 & a(i) & Chr(9)

Next i

'обнуление счетчиков

k_chet = 0: k_nechet = 0

'разделение исходного массива

For i = 1 To n

'определение четности элемента

If a(i) / 2 = a(i) \ 2 Then

'запись элементов с четными индексами в массив b

k_chet = k_chet + 1

b(k_chet) = a(i)

str2 = str2 & b(k_chet) & Chr(9)

Else

'запись элементов с нечетными индексами в массив с

k_nechet = k_nechet + 1

c(k_nechet) = a(i)

str3 = str3 & c(k_nechet) & Chr(9)

End If

Next i

'Команда MsgBox... записывается в редакторе VB в одну строку

MsgBox "Исходный массив:" & Chr(13) & str1 & Chr(13) & Chr(13) & "Массив с четными индексами:" & Chr(13) & str2 & Chr(13) & Chr(13) & "Массив с нечетными индексами:" & Chr(13) & str3 , , "Ответ"

End Sub

 

Результат выполнения программы:

 


4. Операции с двумерными массивами (матрицами)

         Двумерным называется массив, у которого размерность равна 2. Фактически он представляет собой таблицу состоящую из строк и столбцов. Двумерные массивы, у которых значения индексов одинаковые, т.е. число строк равно числу столбцов, называют квадратной матрицей. При работе с квадратными матрицами используются специальные математические понятия, значение которых рассмотрим на примере матрицы размерами 4х4 – B(4,4):

 


 

j = i – элемент находится на главной диагонали (\( b_{11}, b_{22}, b_{33}, b_{44} \));

j = n - i + 1 (n – размерность матрицы) – элемент находится на побочной диагонали  (\( b_{41}, b_{32}, b_{23}, b_{14} \));

i < j – элемент находится над главной диагональю (\( b_{12}, b_{13},b_{14},b_{23}, b_{24}, b_{34}, \));

i > j – элемент находится под главной диагональю (\( b_{21}, b_{31},b_{32},b_{41}, b_{42}, b_{43}, \)).

Транспонированной матрицей В(n, n) называется такая квадратная матрица, у которой столбцы соответствуют строкам исходной квадратной матрицы А(n, n):

 


 

Элементы главной диагонали у матриц А и В одни и те же. Следовательно операция транспонирования матрицы А сводится к перестановке строк матрицы.

 

Dim a() As Single

Dim b() As Single

n = 5

ReDim a(n, n): ReDim b(n, n)

For i = 1 To n

For j = 1 To n

a(i, j) = Cells(i, j)

b(j, i) = a(i, j)             'транспонирование матрицы

Next j

Next i

For i = 1 To n

For j = 1 To n

Cells(n + 1 + i, j) = b(i, j) 'вывод результата

Next j

Next i

 

Результат программы:

 


5. Примеры решения задач c одномерными мссивами

 Пример 1. Ввести массив А из 10 элементов. Найти сумму и произведение элементов массива.

В этом примере используется характерный прием программирования – метод накопления: к переменной S последовательно прибавляются отдельные элементы массива; в результате при выходе из цикла переменная S будет содержать сумму всех перебранных элементов. Аналогично можно найти произведение всех элементов (в этом случае начальное значение P должно равняться не нулю, а единице (P = 1).

 Sub primer_1()

Dim a(10) As Single

Dim s As Single

Dim p As Double

Dim i As Integer

For i = 1 To 10

a(i) = Cells(1, i)

Next i

s = 0: p = 1

For i = 1 To 10

s = s + a(i)   'вычисление суммы

p = p * a(i)   'вычисление произведения

Next i

Cells(3, 1) = "Сумма элементов массива = " & s

'вывод суммы в 3 строку 1 столбец активного листа Excel

Cells(4, 1) = "Произведение элементов массива = " & p

'вывод произведения в 4 строку 1 столбец

'активного листа Excel

End Sub

 

Результат выполнения программы:

  

Пример 2. Ввести массив А из 10 элементов. Найти максимальный элемент массива и его положение. Если таких элементов несколько, то вывести положение всех.

В этом примере переменная max используется для запоминания текущего максимального элемента с обновлением – в случае необходи-мости – по мере перебора всех элементов, imax – для фиксации положения максимального элемента.

 Sub primer_2()

Dim a(10) As Single

Dim i As Byte, max As Single, imax As String

'заполнение массива числами

For i = 1 To 10

a(i) = Cells(1, i)

Next i

'инициализация переменных max, imax

max = a(1): imax = "1"

'поиск максимального элемента и его местоположения

For i = 2 To 10

    If a(i) > max Then

    max = a(i)

    imax = i

    ElseIf a(i) = max Then

    imax = imax & ", " & i

    End If

Next i

'Команда MsgBox... записывается в редакторе VB в одну строку

MsgBox "Максимальный элемент = " & max & ", его местоположение (ия) " & imax, , "Решение задачи"

End Sub

 

Результат выполнения программы:

 


Программа для решения этой же задачи, но для любого количества элементов в массиве выглядит так:

 Sub primer_2_1()

Randomize Timer

Dim a() As Single

Dim i As Byte, n As Byte, max As Single

Dim imax As String, massiv As String

massiv = " "

n = InputBox("Введите размер массива", "Запрос программы")

ReDim a(n)

'заполнение массива случайными числами

For i = 1 To n

a(i) = 50 - Int(Rnd() * 1000)/10

massiv = massiv & a(i) & Chr(9)

Next i

'инициализация переменных max, imax

max = a(1): imax = "1"

'поиск максимального элемента и его местоположения

For i = 2 To n

    If a(i) > max Then

    max = a(i)

    imax = i

    ElseIf a(i) = max Then

    imax = imax & ", " & i

    End If

Next i

'Команда MsgBox... записывается в редакторе VB в одну строку

MsgBox "Исходный массив:" & Chr(13) & massiv & Chr(13) & "Максимальный элемент = " & max & ", его местоположение (ия) " & imax, , "Решение задачи"

End Sub

 

Результат выполнения программы:

 

6. Примеры решения задач с двумерными массивами

Пример 1. Дан массив А(n, m). Составить программу для подсчета количества положительных элементов массива в каждой строке и количество отрицательных элементов в каждом столбце.

 

Поскольку необходимо получить количество отрицательных элементов в столбцах, то после ввода значений элементов массива, на этапе подсчета отрицательных элементов внешний цикл открывается по индексу столбца, а во внутреннем цикле (индекс по строке) перебираются все элементы сначала первого столбца, затем второго и т.д. При этом определяется количество отрицательных элементов в каждом столбце.

Sub primer_1()

Randomize Timer

Dim a() As Integer

Dim n As Integer, m As Integer, massiv As String

Dim i As Integer, j As Integer

Dim str As String, stolb As String

Dim k_pol As Integer, k_otr As Integer

n = InputBox("Количество строк равно", "Запрос 1 из 2")

m = InputBox("Количество столбцов равно", "Запрос 2 из 2")

massiv = " ": str = " ": stolb = " "

ReDim a(n, m) As Integer

'заполнение массива случайными целыми числами

For i = 1 To n

For j = 1 To m

a(i, j) = 50 - Int(Rnd() * 100)

massiv = massiv & a(i, j) & Chr(9)

Next j

massiv = massiv & Chr(13)

Next i

'инициализация счетчиков положительных и отрицательных

'элементов

k_pol = 0: k_otr = 0

'подсчет положительных элементов в каждой строке

For i = 1 To n

k_pol = 0

For j = 1 To m

If a(i, j) >= 0 Then k_pol = k_pol + 1

Next j

str = str & k_pol & Chr(9)

Next i

'подсчет отрицательных элементов в каждом столбце

For j = 1 To m

k_otr = 0

For i = 1 To n

If a(i, j) < 0 Then k_otr = k_otr + 1:

Next i

stolb = stolb & k_otr & Chr(9)

Next j

'Команда MsgBox... записывается в редакторе VB в одну строку

MsgBox "Исходный массив:" & Chr(13) & massiv & Chr(13) & Chr(13) & "Количество положительных элементов по строкам:" & Chr(13) & str & Chr(13) & Chr(13) & "Количество отрицательных элементов по столбцам:" & Chr(13) & stolb, , "Ответ"

End Sub

 

Результат выполнения программы:

 


Пример 2. Ввести массив А(n, m). Найти номер столбца, сумма элементов которого минимальна.

Sub primer_2()

Randomize Timer

Dim a() As Integer

Dim n As Integer, m As Integer, massiv As String

Dim i As Integer, j As Integer

Dim min As Integer, jmin As String, sum As Integer

n = InputBox("Количество строк равно", "Запрос 1 из 2")

m = InputBox("Количество столбцов равно", "Запрос 2 из 2")

massiv = "": jmin = ""

ReDim a(n, m)

'заполнение массива случайными целыми числами

For i = 1 To n

For j = 1 To m

a(i, j) = 50 - Int(Rnd() * 100)

massiv = massiv & a(i, j) & Chr(9)

Next j

massiv = massiv & Chr(13)

Next i

'вычисление суммы элементов 1-го столбца

sum = 0

For i = 1 To n

sum = sum + a(i, 1)

Next i

min = sum: jmin = "1"

For j = 1 To m

sum = 0

'вычисление суммы в столбце

For i = 1 To n

sum = sum + a(i, j)

Next i

'поиск минимальной суммы

If sum < min Then

min = sum

jmin = j

ElseIf sum = min And jmin <> "1" Then

jmin = jmin & "," & j

End If

Next j

'Команда MsgBox... записывается в редакторе VB в одну строку

MsgBox "Исходный массив:" & Chr(13) & massiv & Chr(13) & Chr(13) & "Минимальная сумма в " & jmin & " столбце(ах). Она равна " & min, , "Ответ"

End Sub

 

Результат выполнения программы:

 


Пример 3. Ввести массив А(n, n). Найти максимальный и минимальный элементы главной диагонали. Заменить все элементы главной диагонали на максимальный элемент, побочной – на минимальный. Если массив содержит нечетное число строк и столбцов, то центральный элемент заменить на 0.

 Sub primer_3()

Randomize Timer

Dim a() As Integer

Dim n As Integer, min As Integer, max As Integer

Dim i As Integer, j As Integer

n = Cells(1, 4)

ReDim a(n, n)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * n

Cells(i + 1, j) = ""

Next j

Next i

'заполнение массива случайными целыми числами

'вывод массива в рабочий лист Excel

Cells(3, 1) = "Исходный массив:"

For i = 1 To n

For j = 1 To n

a(i, j) = 50 - Int(Rnd() * 100)

Cells(i + 3, j) = a(i, j)

Next j

Next i

'поиск максимального и минимального элемента

'главной диагонали

min = a(1, 1): max = a(1, 1)

For i = 1 To n

If a(i, i) < min Then min = a(i, i)

If a(i, i) > max Then max = a(i, i)

Next i

'замена элементов главной диагонали на max

'замена элементов побочной диагонали на min

For i = 1 To n

a(i, i) = max

a(i, n - i + 1) = min

Next i

'замена центрального элемента на 0 при нечетном

'размере матрицы

If Int(n / 2) <> n / 2 Then a(Int(n / 2) + 1, Int(n / 2) + 1) = 0

'вывод на печать преобразованного массива

Cells(n + 5, 1) = "Пребразованный массив:"

For i = 1 To n

For j = 1 To n

Cells(n + 5 + i, j) = a(i, j)

Next j

Next i

End Sub

Результат выполнения программы:

 

Пример 4. Найти сумму элементов, расположенных: над главной диагональю, под главной диагональю, над побочной диагональю, под побочной диагональю квадратной матрицы А(n, n).

 Sub primer_4()

Randomize Timer

Dim a() As Integer

Dim n As Integer, i As Integer, j As Integer

Dim sum As Integer

n = Cells(1, 4)

ReDim a(n, n)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * n

Cells(i + 1, j) = ""

Next j

Next i

'заполнение массива случайными целыми числами

'вывод массива в рабочий лист Excel

Cells(3, 1) = "Исходный массив:"

For i = 1 To n

For j = 1 To n

a(i, j) = 50 - Int(Rnd() * 100)

Cells(i + 3, j) = a(i, j)

Next j

Next i

'сумма элементов над главной диагональю

sum = 0

For i = 1 To n - 1

For j = i + 1 To n

sum = sum + a(i, j)

Next j

Next i

Cells(n+5, 1)="Сумма элементов над главной диагональю равна"& sum

'сумма элементов под главной диагональю

sum = 0

For i = 2 To n

For j = 1 To i - 1

sum = sum + a(i, j)

Next j

Next i

Cells(n+6, 1)="Сумма элементов под главной диагональю равна"& sum

'сумма элементов над побочной диагональю

sum = 0

For i = 1 To n - 1

For j = 1 To n - i

sum = sum + a(i, j)

Next j

Next i

Cells(n+7, 1)="Сумма элементов над побочной диагональю равна"& sum

'сумма элементов под побочной диагональю

sum = 0

For i = 2 To n

For j = n - i + 2 To n

sum = sum + a(i, j)

Next j

Next i

Cells(n+8, 1)="Сумма элементов под побочной диагональю равна"& sum

End Sub

 

Результат выполнения программы:

 

Пример 5. Дана матрица А(n, m). Отсортировать каждую строку в порядке возрастания.

 Для решения задачи:

1) вводим размеры массива А(n, m) и значения его элементов;

2) просматриваем строки массива и упорядочиваем их;

3) выводим матрицу.

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

Второй этап сравнений и перестановок будем производить для (n – 1) элементов строки, начиная с первого. В этом случае предпоследним окажется наибольший из (n – 1) членов строки массива. Уменьшая каждый раз количество рассматриваемых элементов на единицу, операции сравнения и перестановок закончим тогда, когда останется всего один элемент строки массива.

Подобные операции выполняем для каждой строки по отдельности.

Перестановку элементов будем осуществлять с помощью промежу-точной переменной prom.

 Sub primer_5()

Dim a() As Integer

Dim n As Integer, m As Integer, i As Integer

Dim j As Integer, prom As Integer, k As Integer

n = Cells(1, 4)

m = Cells(2, 4)

ReDim a(n, m)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * n

Cells(i + 2, j) = ""

Next j

Next i

'заполнение массива случайными целыми числами

'вывод массива в рабочий лист Excel

Cells(4, 1) = "Исходный массив:"

For i = 1 To n

For j = 1 To m

a(i, j) = 50 - Int(Rnd() * 100)

Cells(i + 4, j) = a(i, j)

Next j

Next i

'сортировка двумерного массива по строкам

For i = 1 To n

'сортировка строки массива

For k = m - 1 To 1 Step -1

For j = 1 To k

If a(i, j) > a(i, j + 1) Then

'перестановка соседних элементов массива

prom = a(i, j)

a(i, j) = a(i, j + 1)

a(i, j + 1) = prom

End If

Next j

Next k

Next i

'вывод на печать массива с отсортированными строками

Cells(n + 6, 1) = "Преобразованный массив:"

For i = 1 To n

For j = 1 To m

Cells(i + n + 6, j) = a(i, j)

Next j

Next i

End Sub

 

Результат выполнения программы:

 


Пример 6. Дана матрица А(n, m). Отсортировать каждый столбец в порядке убывания.

 Sub primer_6()

Dim a() As Integer

Dim n As Integer, m As Integer, i As Integer

Dim j As Integer, prom As Integer, k As Integer

n = Cells(1, 4)

m = Cells(2, 4)

ReDim a(n, m)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * m

Cells(i + 2, j) = " "

Next j

Next i

'заполнение массива случайными целыми числами

'вывод массива в рабочий лист Excel

Cells(4, 1) = "Исходный массив:"

For i = 1 To n

For j = 1 To m

a(i, j) = 50 - Int(Rnd() * 100)

Cells(i + 4, j) = a(i, j)

Next j

Next i

' сортировка двумерного массива по столбцам

For j = 1 To m

'сортировка столбцов массива

For k = n - 1 To 1 Step -1

For i = 1 To k

If a(i, j) < a(i + 1, j) Then

'перестановка соседних элементов массива

prom = a(i, j)

a(i, j) = a(i + 1, j)

a(i + 1, j) = prom

End If

Next i

Next k

Next j

'вывод на печать массива с отсортированными строками

Cells(n + 6, 1) = "Преобразованный массив:"

For i = 1 To n

For j = 1 To m

Cells(i + n + 6, j) = a(i, j)

Next j

Next i

End Sub

 

Результат выполнения программы:

 


Пример 7. Сложить матрицы A(n, m) и B(n, m) с получением матрицы C(n, m).

 Результатом суммы матриц является но­вая матрица той же размерности, каждый элемент которой равен сумме соответствующих элементов исходных матриц. Сложение соот­ветствующих элементов достигается использованием одних и тех же значений счетчиков цикла, т.е. A(1, 2) складывается с B(1, 2) и результат присваивается элементу C(1, 2).

Sub primer_7()

Dim a() As Integer, b() As Single, c() As Single

Dim n As Integer, m As Integer, i As Integer

Dim j As Integer

n = Cells(1, 4)

m = Cells(2, 4)

ReDim a(n, m): ReDim b(n, m): ReDim c(n, m)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * m

Cells(i + 2, j) = ""

Next j

Next i

'заполнение матриц А и В случайными числами

'вывод матриц в рабочий лист Excel

Cells(4, 1) = "Матрица А:"

Cells(4, m + 2) = "Матрица B:"

For i = 1 To n

For j = 1 To m

'матрица А

a(i, j) = 50 - Int(Rnd() * 100)

Cells(i + 4, j) = a(i, j)

'матрица В

b(i, j) = 50 - Int(Rnd() * 1000) / 10

Cells(i + 4, j + m + 2) = b(i, j)

Next j

Next i

Cells(n + 4 + 2, 1) = "Матрица C:"

'сложение матриц

For i = 1 To n

For j = 1 To m

c(i, j) = a(i, j) + b(i, j)

Cells(i + n + 4 + 3, j) = c(i, j)

Next j

Next i

End Sub

 

Результат выполнения программы:

 


Пример 8. Умножить матрицу А(n, m) на матрицу B(m, h).

 Сложность заключается в том, что результатом будет матрица и для формирования ее столбцов нужен еще один цикл.

По правилам математики, можно умножать матрицы только в том случае, если количество столбцов первой равно количеству строк во второй. При этом в результирующей матрице будет строк столько же, сколько было в первой матрице, а столбцов столько же, сколько их было во второй. Это можно показать формулой A(n, m) × B(m, h) = C(n, h).

В ходе умножения матриц использовано три цикла. Первый, со счетчиком i, задает порядок умножения строк матри­цы А. Второй, со счетчиком i2, задает перебор столбцов матрицы В. В третьем цикле, со счетчиком j, происходит подсчет суммы произведений элементов i-й строки матрицы А и i2-го столбца матрицы В. Сумма присваивается очередному эле­менту матрицы C, и переменная sum обнуляется.

 Sub primer_8()

Dim a() As Integer, b() As Single, c() As Single

Dim n As Integer, m As Integer, h As Integer

Dim i As Integer, j As Integer, i2 As Integer

Dim sum As Single

n = Cells(1, 4)

m = Cells(2, 4)

h = Cells(3, 4)

ReDim a(n, m): ReDim b(m, h): ReDim c(n, h)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * m

Cells(i + 3, j) = " "

Next j

Next i

'заполнение матриц А случайными целыми числами

'вывод матрицs в рабочий лист Excel

Cells(5, 1) = "Матрица А:"

For i = 1 To n

For j = 1 To m

a(i, j) = 50 - Int(Rnd() * 100)

Cells(i + 5, j) = a(i, j)

Next j

Next i

'заполнение матриц B случайными числами

'вывод матрицs в рабочий лист Excel

Cells(5, m + 2) = "Матрица B:"

For i = 1 To m

For j = 1 To h

b(i, j) = 50 - Int(Rnd() * 1000) / 10

Cells(i + 5, j + m + 2) = b(i, j)

Next j

Next i

'умножение матриц А и В

For i = 1 To n    'номера строк матрицы A

For i2 = 1 To h   'номера столбцов матрицы B

sum = 0

For j = 1 To m    'элементы строки A

sum = sum + a(i, j) * b(j, i2)

Next j

c(i, i2) = sum    'формируем матрицу C

Next i2

Next i

Cells(n + 5 + 2, 1) = "Матрица C:"

For i = 1 To n

For j = 1 To h

Cells(i + n + 5 + 2, j) = c(i, j)

Next j

Next i

End Sub

 

Результат выполнения программы:

 


Пример 9. Умножить матрицу A(n, m) на вектор V(m).

 Согласно правилам математики, матрицу можно умножить на вектор только в том случае, если вектор имеет количество элементов, равное количеству столбцов матрицы. Результатом умножения матрицы на вектор является новый вектор, который содержит столько элементов, сколько было строк в матрице.

Умножение массивов происходит во внутреннем цикле. В нем подсчитывается сумма произведений каждого элемента i-й строки матрицы со всеми элементами вектора. Затем сумма присваивается i-му элементу результирующего вектора С. Перед расчетом очередной строки переменная sum должна быть обнулена во избежание накопления суммы нескольких строк.

 Sub primer_9()

Dim a() As Single, b() As Integer, c() As Single

Dim n As Integer, m As Integer, i As Integer

Dim j As Integer, sum As Single

n = Cells(1, 8)

m = Cells(2, 8)

ReDim a(n, m): ReDim b(m): ReDim c(m)

'очистка рабочего листа от посторонних надписей

For i = 1 To 10 * n

For j = 1 To 10 * m

Cells(i + 2, j) = ""

Next j

Next i

'заполнение матрицы А случайными числами

'вывод матрицы в рабочий лист Excel

Cells(4, 1) = "Матрица А:"

For i = 1 To n

For j = 1 To m

a(i, j) = 50 - Int(Rnd() * 1000) / 10

Cells(i + 4, j) = a(i, j)

Next j

Next i

Cells(4, m + 2) = "Вектор B:"

'заполнение вектора В случайными целыми числами

'вывод вектора в рабочий лист Excel

For i = 1 To m

b(i) = 50 - Int(Rnd() * 1000) / 10

Cells(5, i + m + 2) = b(i)

Next i

Cells(n + 6, 1) = "Матрица C:"

'умножение матрицы на вектор

'вывод результата в рабочий лист Excel

For i = 1 To n

sum = 0

For j = 1 To m

sum = sum + a(i, j) * b(j)

Next j

c(i) = sum

Cells(i + n + 6, 1) = c(i)

Next i

End Sub

 

Результат выполнения программы:

 


7. Задания на выполнение лабораторной работы

Зaдачи на одномерные массивы

 

1. Ввести массив А(n). Найти среднее геометрическое элементов.

2. Ввести массив А(n). Найти среднее арифметическое элементов.

3. Ввести массив А(n). Найти максимальный элемент и минимальный элемент массива.

4. Ввести массив А(n). Преобразовать его так, чтобы значения элементов являлись суммой элемента массива и его индекса. Вывести на печать исходный и преобразованный массивы.

5. Ввести массив А(n). Все положительные элементы массива заменить на 1, отрицательные – на -1. Вывести преобразованный массив.

6. Ввести массив А из 10 элементов: 1, 5, –3, 8, 12, –8, 8, 9, 23, –5. Четные элементы массива увеличить на 2, остальные оставить неизменными. Вывести полученный массив.

7. Ввести массив А из 10 элементов: 1, 5, –3, 8, 12, –8, 8, 9, 23, –5. Подсчитать количество отрицательных k и количество положительных n элементов.

8. Ввести массив А(n) из положительных и отрицательных элементов. Образовать из него два массива: В(n), состоящий из положительных элементов, С(n) – из отрицательных. Вывести полученные массивы.

9. Заполнить массив А(n) членами натурального ряда, кратным трем
(3, 6, 9...) до тех пор пока сумма членов ряда не станет больше наперед заданного числа М. Найти произведение элементов массива и их число.

10. Ввести массив А(N) из членов ряда А(i) = \( \sqrt[3]{i^2} \). Число членов ряда ограничены по условию А(i) ≤ m, где m » 1. Найти сумму  членов ряда кратных двум и произведение членов ряда кратных трем. 

Зaдачи на двумерные массивы

 1. Ввести массив А(n, m). Найти максимальный (минимальный) элемент матрицы A. Вывести на печать это число и его индексы (номер строки и столбца, на пересечении которых находится этот элемент).

2. Ввести массив А(n, m). Найти максимальный и минимальный элементы матрицы A и  поменять их местами. Вывести на печать исходный и обновленный массивы.

3. Ввести массив А(n, m). В каждой строке поменять местами максимальный и минимальный элементы.

4. Ввести массив А(n, m). Найти:

а) общую сумму всех элементов;

б) по столбцам для каждой строки;

в) по строкам для каждого столбца;

г) сумму элементов, расположенных на главной диагонали.

5. Преобразовать матрицу А и в результате получить новую матрицу В по одному из следующих вариантов:

а) матрица B – транспонированная матрица А;

б) переставить 1-ю и 2-ю строки матрицы А и записать обновленный массив в матрицу В; остальные строки без изменений;

в) 2-я строка матрицы В равна сумме 1 и 2-й строк матрицы А; остальные строки без изменений;

г) 3-й столбец матрицы В равен сумме 1 и 2-го столбца матрицы А; остальные строки без изменений;

д) 3-й столбец матрицы В равен 1-й строке матрицы А; остальные строки без изменений;

е) 2-й столбец матрицы В равен произведению 1-й  и 2-й строк матрицы А; остальные строки без изменений.

6. Ввести массив А(n, m). Заменить элементы строки и столбца, на пересечении которых находится максимальный (минимальный) элемент, на нули. Вывести исходный и обновленный массивы на печать.

7. Ввести массив А(n, m). Найти строку, сумма элементов, которой максимальна. Вывести эту строку на печать.

8. Ввести массив А(n, m). Определить количество положительных и отрицательных элементов.

9. Ввести массив А(n, n). Найти сумму элементов двух главных диагоналей.

10. Ввести массив А(n, n).  Пронормировать ее, т. е. каждый элемент разделить на максимальный элемент матрицы. Вывести на печать исходную и преобразованную матрицу.


8. Контрольные вопросы

1. Что представляет собой одномерный массив данных? Приведите несколько примеров одномерных массивов данных

2. Какой оператор служит для задания индексированных переменных? В чем преимущество использования индексированных переменных для работы с массивами данных?

3. Что такое индекс индексированной переменной?

4. Перечислите некоторые наиболее характерные алгоритмы для обработки массивов данных.

5. Что представляет собой двумерный массив данных? Приведите несколько примеров двумерных массивов данных

6. Как задаются двумерные массивы в языке VBA; какой оператор при этом используется?

7. Сколько индексов у переменной двумерного массива? Для чего необходимо использование вложенных циклов при работе с массивами?

8. Если задан трехмерный массив, сколько циклов FOR необходимо использовать во вложенном цикле для перебора всех элементов этого массива? Запишите фрагмент программы для ввода элементов трехмерного массива.