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

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

 

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