Способы обработки массивов
Ввод и вывод элементов массива
1.Вводи вывод элементов статического массива.
В этом примере осуществляется ввод и вывод массива a(20), состоящего из 21 элемента.
Sub prim1()
Dim a(20), str_a,i
For i = 0 To 20
a(i) = Int(Rnd * 100) + 1 ‘ввод элементов массива
str_a = str_a & a(i) & " " ‘преобразование числовых переменных в
‘строковые и сцепление их один за
Next i ‘другим
MsgBox str_a ‘ вывод элементов массива
End Sub
В этом примере осуществляется ввод и вывод массива a(3 to 10), состоящего из 8 элементов.
Sub prim2()
Dim a(3 To 10), str_a,i
For i = 3 To 10
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
Next i
MsgBox str_a
End Sub
2.Вводи вывод элементов динамического массива.
В этом примере осуществляется ввод и вывод массива a().
Количество элементов массива n+1.
Sub prim3()
Dim a(), str_a, i, n
n = Val(InputBox("введите количество элементов массива n:")) ‘вводится количество элементов
ReDim a(n) ‘указывается количество элементов массива
For i = 0 To n
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
Next i
MsgBox str_a
End Sub
В этом примере осуществляется ввод и вывод массива a(20).
Количество элементов массива 21.
Sub prim4()
Dim a(), str_a, i
ReDim a(20)
For i = 0 To 20
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
Next i
MsgBox str_a
End Sub
В этом примере осуществляется ввод и вывод массива a(1 to 20).
Количество элементов массива 20.
Sub prim5()
Dim a(), str_a, i
ReDim a(1 To 20)
For i = 1 To 20
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
Next i
MsgBox str_a
End Sub
1. Нахождение суммы, произведения, среднего арифметического, среднего геометрического элементов массива.
1.1 Нахождение суммы элементов массива.
Sub prim6()
Dim a(), str_a, i, sum
n = Val(InputBox("введите количество элементов массива n:"))
ReDim a(n)
For i = 0 To n
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
sum = sum + a(i)
Next i
MsgBox str_a & Chr(10) & Chr(13) & _
"sum=" & sum
End Sub
Нахождение суммы четных и нечетных элементов массива.
Sub prim7()
Dim a(4), str_a, i, sumchet, sumnechet
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If a(i) Mod 2 = 0 Then sumchet = sumchet + a(i)
If a(i) Mod 2 <> 0 Then sumnechet = sumnechet + a(i)
Next i
MsgBox str_a & Chr(10) & Chr(13) & _
"sumchet=" & sumchet & "sumnechet=" & sumnechet
End Sub
Нахождение суммы элементов массива, значения которых находятся в интервале от 50 до 100.
Sub prim8()
Dim a(4), str_a, i, sum
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If a(i) >= 50 And a(i) <= 100 Then sum = sum + a(i)
Next i
MsgBox str_a & Chr(10) & Chr(13) & _
"sum=" & sum
End Sub
1.4 Нахождение суммы элементов массива с четными индексами и суммы элементов массива с нечетными индексами.
Sub prim9()
Dim a(4), str_a, i, sum1, sum2
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If i Mod 2 = 0 Then sum1 = sum1 + a(i)
If i Mod 2 <> 0 Then sum2 = sum2 + a(i)
Next i
MsgBox str_a & Chr(10) & Chr(13) & _
"sum1=" & sum1 & "sum2=" & sum2
End Sub
Нахождение суммы индексов четных элементов и произведения индексов нечетных элементов массива. Начальное значение произведения надо задавать равным 1.
Sub prim11()
Dim a(1 To 4), str_a, i, sum, pr
pr = 1
For i = 1 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If a(i) Mod 2 = 0 Then sum = sum + i
If a(i) Mod 2 <> 0 Then pr = pr * i
Next i
MsgBox str_a & Chr(10) & Chr(13) & _
"sum=" & sum & "pr=" & pr
End Sub
2.Нахождение произведения и среднего геометрического элементов массива.
Нахождение среднего арифметического и среднего геометрического элементов массива.
Sub prim12()
Dim a(4), str_a, i, sum, pr
pr = 1
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
sum = sum + a(i)
pr = pr * a(i)
Next i
sa = sum / 5: sg = pr * (1 / 5)
MsgBox str_a & Chr(10) & Chr(13) & _
"sa=" & sa & "sg=" & sg
End Sub
Задан массив а(4), найти индексы тех элементов, значения которых превосходят цифру 50.
Sub prim13()
Dim a(4), str_a, i, str_b, b(4)
pr = 1
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If a(i) > 50 Then
b(i) = i
str_b = str_b & b(i) & " "
End If
Next i
MsgBox "исходный массив:" & str_a & Chr(10) & Chr(13) & _
"массив индексов:" & str_b
End Sub
3 Обработка элементов массива.
3.1 Задан массив а(4), значения элементов которого заданы генератором случайных чисел, заменить единицами, те элементы, значения которых превосходят 50.
Sub prim14()
Dim a(4), str_a, i, str_anew
pr = 1
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If a(i) > 50 Then a(i) = 1
str_anew = str_anew & a(i) & " "
Next i
MsgBox "исходный массив:" & str_a & Chr(10) & Chr(13) & _
"новый массив:" & str_anew
End Sub
3.2 Нахождение максимального и минимального элементов массива и обмен их местами.
Sub prim15()
Dim a(4), str_a, i, str_anew, max, min, imax, imin
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
Next i
max = a(0): imax = 0: min = a(0): imin = 0
For i = 1 To 4
If a(i) > max Then max = a(i): imax = i
If a(i) < min Then min = a(i): imin = i
Next i
a(imax) = min: a(imin) = max
For i = 0 To 4
str_anew = str_anew & a(i) & " "
Next i
MsgBox "исходный массив:" & str_a & Chr(10) & Chr(13) & _
"max=" & max & "imax=" & imax & Chr(10) & Chr(13) & _
"min=" & min & "imin=" & imin & Chr(10) & Chr(13) & _
"новый массив:" & str_anew
End Sub
3.2 Подсчет количества элементов массива, например больших 50.
Sub prim17()
Dim a(4), str_a, i, str_anew, k
k = 0
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
If a(i) > 50 Then k = k + 1
str_anew = str_anew & a(i) & " "
Next i
MsgBox "исходный массив:" & str_a & Chr(10) & Chr(13) & _
"k=" & k
End Sub
3.3 Обработка двух массивов.
Заданы два массива a(4) и b(4) заполнить их случайными значениями и поменять местами четвертые элементы массивов.
Sub prim16()
Dim a(4), b(4), str_a, str_b, i, str_anew, str_bnew, buf
For i = 0 To 4
a(i) = Int(Rnd * 100) + 1
str_a = str_a & a(i) & " "
b(i) = Int(Rnd * 10) + 1
str_b = str_b & b(i) & " "
Next i
buf = a(4)
a(4) = b(4)
b(4) = buf
For i = 0 To 4
str_anew = str_anew & a(i) & " "
str_bnew = str_bnew & b(i) & " "
Next i
MsgBox "исходный массив a:" & str_a & Chr(10) & Chr(13) & _
"исходный массив b:" & str_b & Chr(10) & Chr(13) & _
"новый массив a:" & str_anew & imin & Chr(10) & Chr(13) & _
"новый массив b:" & str_bnew
End Sub
3.3 Обработка элементов массива в блоках разветвления и циклов.
Структура программы:
1. Заголовок.
2. Описание переменных.
3. Ввод элементов массива (или массивов).
4. Условие.
5. Инструкции, если Условие выполняется.
6. Инструкции, если Условие не выполняется.
7. Вывод результата.
Пример: Заданы два массива a(4) и b(4), если количество отрицательных элементов массива a(4) больше количества отрицательных массива b(4), то положительные элементы массива a(4) заменить на 1, а положительные элементы массива b(4) заменить на нули, иначе посчитать сумму элементов массива a(4) и произведение элементов массива b(4).
Sub prim18()
Dim a(4), b(4), str_a, str_b, i, str_anew, str_bnew, k, t, sum, pr
k = 0: t = 0: pr = 1
For i = 0 To 4
a(i) = Int(Rnd * 100) - 50
str_a = str_a & a(i) & " "
b(i) = Int(Rnd * 10) - 5
str_b = str_b & b(i) & " "
If a(i) < 0 Then k = k + 1
If b(i) < 0 Then t = t + 1
Next i
If k > t Then
For i = 0 To 4
If a(i) > 0 Then a(i) = 1
If b(i) > 0 Then b(i) = 0
str_anew = str_anew & a(i) & " "
str_bnew = str_bnew & b(i) & " "
Next i
MsgBox "исходный массив a:" & str_a & Chr(10) & Chr(13) & _
"исходный массив b:" & str_b & Chr(10) & Chr(13) & _
"новый массив a:" & str_anew & imin & Chr(10) & Chr(13) & _
"новый массив b:" & str_bnew & imin & Chr(10) & Chr(13) & _
"k=" & k & "t=" & t
Else
For i = 0 To 4
sum = sum + a(i): pr = pr * b(i)
Next i
MsgBox "исходный массив a:" & str_a & Chr(10) & Chr(13) & _
"исходный массив b:" & str_b & Chr(10) & Chr(13) & _
"sum=" & sum & "pr=" & pr & Chr(10) & Chr(13) & _
"k=" & k & "t=" & t
End If
End Sub
3.4 Просмотр диапазона ячеек рабочего листа с помощью объекта Sheets (рабочие листы) и метода Range для доступа к ячейкам.
Sub pr61()
'Написать программу для заполнения ячеек в любом диапазоне
'вычислить общую сумму введенных чисел
Dim i, n, x, sum, str_x As String
n = Val(InputBox("введите n:"))
i = 1: sum = 0
For i = 1 To n
x = Int(Rnd * 100) + 1
str_x = str_x & x & " "
sum = sum + x
Sheets("лист1").Cells(i, 3).Value = x
Sheets("лист1").Cells(5, 4) = sum
Next i
End Sub
Создание массива и заполнение его элементами ячеек рабочего листа.
Sub pr()
Dim i As Integer,mass(), str_mass 'переменная для элементов массива
ReDim mass(10)
For i = 1 To 10
Sheets("лист1").Cells(1, i).Value = Int(100 * Rnd + 1)
mass(i) = Sheets("лист1").Cells(1, i).Value
str_mass = str_mass & mass(i) & " " 'накопление элементов массива для ‘вывода заполненных значений
Next i
MsgBox str_mass
End Sub
3.5 Заполнение элементов массива значениями рабочего листа и нахождение суммы.
Sub ss1()
Dim sum
For Each c In Sheets("Лист1").Range("a1:a10")
sum = sum + c
Next c
MsgBox "Цикл закончен!" & "sum=" & sum
End Sub
(1,i) – первая цифра строка, вторая столбец.
Формат записи оператора определения функции:
FUNCTION имя [(параметры)] [STATIC]
[блок_операторов]
имя=выражение
[блок_операторов]
END FUNCTION
Где:
Имя - имя функции и возвращаемый ею тип данных, указанный с помощью ключевого слова As.
Параметры - одна или несколько переменных, указывающих параметры, которые передаются в функцию при ее вызове:
перемен[()] [AS тип] [, перем[()] [AS тип]].
Переменная - имя переменной VBA.
Тип - тип данных переменной (INTEGER, LONG, SINGLE, DOUBLE, STRUNG или тип данных, определенный пользователем).
STATIC - Указывает, что значения локальных переменных функции сохраняются между вызовами функции.
Выражение - Возвращаемое значение функции
При вызове функции вы можете указать, что значение аргумента не должно изменяться функцией. Для этого заключите аргумент в круглые скобки.
'Вычисление факториала рекурсия
Sub pфакториала()
Dim n, f
n = Val(InputBox("введите n:"))
f = fuc(n)
MsgBox "f=" & f
End Sub
Function fuc(t)
If t > 1 Then fuc = t * fuc(t - 1) Else fuc = 1
End Function
Процедуры-функции и процедуры
Кроме процедур обработки событий, определяющих событийный принцип работы Windows-приложений, важное место в языке Visual Basic 6.0 занимает общие процедуры. Под процедурами понимается часть программы, peaреализующая вспомогательный алгоритм и допускающая многократное обращение к ней из различных частей программы.
Процедуры помогают значительно упростить коды программ, в которых имеются повторяющиеся действия, возможно, с отличающимися параметрами. Это процедуры-функции Function. . .End Function, позволяющие возвращать определяемые в них значения функций, и процедуры Sub end sub, способные изменять значения нескольких переменных. Кроме Function и sub имеются процедуры Property, используемые для и чтения значений свойств.
Различают процедуры общего назначения на уровне проекта и закрытые процедуры. Процедуры на уровне проекта записываются в отдельных модулях, создаваемых командой главного меню Проект | Добавить модуль. Они доступны для всех процедур всех модулей проекта. Закрытые процедуры записываются в коде модуля (например, модуля формы) и доступны только для процедур своей формы. Процедуры на уровне проекта и закрытые процедуры по области действия можно сравнить с глобальными контейнерными переменными.
Процедуры Sub…End Sub
Синтаксис процедуры Sub.. .End Sub такой:
[Private I Public] [Static] Sub имя [(список)]
[операторы]
[Exit Sub]
[операторы]
End Sub
Слова Private, Public и static играют ту же роль, что и в процедуре-функции Параметр имя — глобальное имя процедуры, ограниченное длиной в 40 символов. Параметр список — список разделенных запятыми имен переменных передаваемых процедуре при ее вызове. В операторе предусмотрен альтернативный выход с помощью оператора Exit sub. В отличие от процедуры-функции Function имя процедуры sub не может быть использовано в выражениях. Процедуры могут быть рекурсивными, т. е. могут вызывать сами себя.
Вызов процедуры sub.. .End sub допускается двумя способами: с оператором Call и без него. Оператор call передает управление процедуре. Вызов имеет два вида синтаксиса.
Синтаксис 1:
Call имя процедуры [(список аргументов)]
Синтаксис 2:
имя процедуры [(список аргументов)]
Пример использования двумерного массива для создания таблицы умножения.
Sub p3()
Dim i, j As Integer
Dim a(1 To 10, 1 To 10), str_a
For i = 2 To 9
For j = 1 To 10
a(i, j) = i & "x" & j & "=" & (i * j)
str_a = str_a & " " & a(i, j) & " "
Next j, i
MsgBox str_a
End Sub
Пример обработки символьных переменных.
Sub p()
Dim AnyString, MyStr
AnyString = "13.05.2006" ' Define string.
MyStr = Right(AnyString, 4) ' Returns "Hello World".
MsgBox MyStr
End Sub
Таблица умножения
Sub p3()
Dim i, j As Integer
Dim a(1 To 10, 1 To 10), str_a
For i = 2 To 9
For j = 1 To 10
a(i, j) = i & "x" & j & "=" & (i * j)
str_a = str_a & " " & a(i, j) & " "
Next j, i
MsgBox str_a
End Sub
Процедуры и функции VBA. Параметры формальные и фактические. Локальные и глобальные переменные.
Модуль VBA — это лист с текстом программы, вставленный в рабочую книгу.
Модуль включает в свой состав функции и процедуры. Важное отличие функции от процедуры заключается в том, что функция возвращает результат вычисления. При этом в теле функции необходимо предусмотреть оператор, который присваивает результат вычисления ячейке памяти, имя которой совладает с именем функции.
При вызове процедуры или функции передают в них некоторые переменные путем замены формальных параметров на фактические. (Фактические параметры берутся при вызове ф-ции. Формальные параметры берутся из задач.) Внутри процедуры этим переменным может быть присвоено какое-нибудь новое значение, которое сохранится в переменной и после возврата из процедуры.
Если объявить переменные внутри процедуры, то оперировать этими переменными можно только внутри процедуры. Такие переменные называются локальными, т.е. область видимости локальных переменных - это код процедуры.
Если объявить переменные в начале программного модуля, то эти переменные будут видимы во всех процедурах модуля. Такие переменные называются глобальными, и в указанном случае область видимости глобальных переменных - это весь модуль.
Подпрограммы. В языке VBA подпрограммы делятся на два вида: подпрограммы-функции и подпрограммы—процедуры, которые подразделяются на две группы: встроенные и определяемые пользователем.
Функции Многократно повторяющуюся часть программы можно оформить подпрограммой - функцией. Функция состоит из описания и ее вызова.
Описание функции.
Общий вид функции пользователя:
Function Имя_Функции(список формальных параметров) As Тип описания функции
Раздел операторов
End Function
Имя функции - это любой идентификатор, определяемый пользователем.
Тело функции представляет собой раздел операторов, где должен находиться хотя бы один оператор, который присваивает имени функции одно значение.
Список формальных операторов с их типом описания заключается в круглые скобки и отделяется друг от друга запятыми.
Если тип описания формальных операторов не указывать (по умолчанию будет тип Variant).
Вызов функции. Общий вид вызова функции:
переменная = Имя Функции (фактические параметры)
Фактические параметры указываются через запятую круглых скобках.
Фактические параметры должны быть объявлены как формальные и количество фактических параметров должно быть равно количеству формальных.
Между формальными и фактическими параметрами должно быть полное соответствие, т.е. формальных и фактических параметров должно быть одинаковое количество; порядок следования фактических и формальных параметров должен быть один и тот же; тип каждого фактического параметра должен совпадать с типом соответствующего ему формального параметра
Фактические параметры бывают параметры - значения и параметры - переменные.
Подпрограммы — процедуры. Кроме функций пользователя, на листе модуля можно записывать процедуры. Процедура, как и функция, состоит из двух частей: описания и вызова функции.
Описание процедуры. Синтаксическая структура описания имеет следующий вид:
Sub Имя_Процедуры (список формальных параметров)
Тело процедуры
End Sub
Sub — ключевое слово (процедура)
End Sub - ключевое слово (конец процедуры)
Процедура начинается с заголовка процедуры Sub
Имя процедуры — это любой идентификатор, который выбирает сам пользователь.
Тело процедуры - это раздел операторов, которые размещаются между заголовком и концом процедуры.
Описание процедуры должно быть правильно синтаксически оформлено. Работать процедура начинает при ее вызове главной программы.
Вызов процедуры.
Имя_Процедуры_Список фактических параметров
Список фактических параметров от имени_Процедуры записывается через пробел, и отделяются друг от друга запятой, в круглые скобки не заключаются. В отличие от функций пользователя, процедуры нельзя вызывать из ячеек рабочего листа.
Функция передаёт в главную программу при её вызове только одно значение, а процедура может передавать одно или несколько значений при её вызове.
Sub процедурысортировка1()
Dim a(6) As Integer, i As Byte, str_a As String, str_b As String, buf As Integer, str_anew As String’ фактические параметры
Call vvod(a, str_a, 6) 'обращение к процедуре ввода массива
Call sortirovka(a, 6, 6) 'обращение к процедуре сортировки массива
Call vivod(a, str_anew, 6)
MsgBox str_a & Chr(10) & Chr(13) & _
str_anew
End Sub
Sub vvod(x, str_x, n) 'процедура ввода элементов массива, список формальных параметров
For i = 0 To n
x(i) = Int(Rnd * 10) + 1
str_x = str_x & x(i) & " "
Next i
End Sub
Sub sortirovka(x, n, m) 'процедура сортировки элементов массива, список формальных параметров
For i = 0 To n - 1
For j = 0 To m - 1
If x(j) > x(j + 1) Then
buf = x(j) 'обмен j и j+1 элементов.
x(j) = x(j + 1)
x(j + 1) = buf
End If
Next j, i
End Sub
Sub vivod(x, str_xnew, n) 'процедура вывода элементов массива, список формальных параметров
For i = 0 To n
str_xnew = str_xnew & x(i) & " "
Next i
End Sub
Option Explicit
Dim x As Integer, y As Integer, p As Integer
Function F(x As Integer) As Single
F = 4*x / (3-2*2)
End Function
Sub My_pr()
Cells(1,1) = “ТАБЛИЦА”
Cells(2,1) = “x”
Cells(2,1) = ”y”
p = 3
For x = 0 To 12
If 3 – 2*x = 0 Then GoTo M
y = F(x)
Cells(p, 1) = x
Cells(p, 2) = y
p = p + 1
M: Next x
End Sub