Учебные материалы по математике | Процедуры и функции visual basic | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Процедуры и функции visual basic


Лекция 10
ПРОЦЕДУРЫ И ФУНКЦИИ

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

Виды процедур и функций

В программе на языке VB можно использовать несколько видов процедур и функций. Вот некоторые из них:

*  Событийная процедура – обработчик события. Код этой процедуры выполняется автоматически, если с объектом происходит событие, с которым эта процедура связана.

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

*  Функция во всем подобна пользовательской процедуре, а главное ее отличие от процедуры состоит в том, что функция возвращает значение в ту точку, откуда она была вызвана.

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

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

Рис. 10.1. Иллюстрация порядка выполнения процедур и функций

Выполнение программы может начаться только с событийной процедуры. В этой процедуре могут вызываться другие процеду­ры (процедура А) или функции. После вызова процедуры (функции) выполняются инструкции тела этой процедуры (функции). В свою очередь в вызванной процедуре могут быть обращения к другим процедурам или функциям (функция Б) и т. д.

Прекращение выполнения вызванной процедуры или функции (возврат) означает возвращение в вызывающую процедуру или функцию, выполнение которой продолжается с инструкции, следующей за инструкцией, в которой произошел вызов.

Вызов процедур и функций

Чтобы код функции или процедуры общего назначения был исполнен, она должна быть вызвана.

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

ИмяПроцедуры [Список значений аргументов]

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

Call ИмяПроцедуры [(Список значений аргументов)]

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

X = A + ИмяФункции ([Список значений аргументов])

Чтобы функция могла вернуть значение, ее вызов должен фигурировать в какой-нибудь конструкции, использующей возвращаемое функцией значение (например, в качестве присваиваемой величины в операции присваивания, в качестве условия в конструкции If и т. п.).

Объявление процедур и функций

Процедура (функция) не может быть определена внутри какой-либо процедуры или функции.

Для объявления процедуры используют следующий синтаксис:

[Private/Public][Static] Sub ИмяПроцедуры _

[(Список аргументов)]

[Инструкции]

[Exit Sub]

[Инструкции]

End Sub

Синтаксис объявления функции выглядит несколько иначе:

[Private/Public][Static] Function ИмяФункции _

[(Список аргументов)] [As Тип]

[Инструкции]

[ИмяФункции = Выражение]

[Exit Function]

[Инструкции]

[ИмяФункции = Выражение]

End Function

Пояснения синтаксиса:

*  Public. Этим словом объявляют в стандартном модуле процедуру или функцию, которая должна быть доступна всем процедурам и функциям всех контейнеров проекта. В форме это слово применять нельзя.

*  Private. В этом случае процедура или функция доступна только в пределах того контейнера, где она объявлена. Действует по умолчанию.

*  Static. Все переменные, объявленные в в процедуре или функции станут статическими, то есть сохранят значения после завершения ее работы и выхода из нее.

*  Exit Sub или Exit Function. Эти инструкции осуществляют досрочный выход из процедуры или соответственно функции.

Синтаксис аргументов сам по себе является достаточно развитым:

[Optional] [ByVal / ByRef] [ParamArray] _ ИмяАргумента [()] [As Тип][= ЗначениеПоУмолчанию]

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

Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только переменной длины), Variant, пользовательский тип или Control и Form.

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

Пример объявления процедуры вычисления площади прямоугольника по заданным значениям сторон:

Sub D (Длина As Single, Высота As Single, _

Площадь As Single)

Площадь = Длина * Ширина

End Sub

Пример обращения к процедуре:

D w1, h1, s1

D w2, h2, s2

s = s1 + s2

Пример объявления функции вычисления площади прямоугольника по заданным значениям сторон:

Function Df (Длина As Single, _

Высота As Single) As Single

Df = Длина * Ширина

End Function

Пример обращения к функции:

s = Df(w1, h1) + Df(w2, h2)

Пример процедуры формирования вектора из сумм элементов столбцов матрицы:

Sub MatrVektor (A() As Single, B() As Single, _

MaxI As Integer, MaxJ As Integer)

Dim J As Integer, I As Integer

For J = 1 To MaxJ

A(J) = 0

For I = 1 То MaxI

А(J) = А(J) + B(I, J)

Next

Next

End Sub

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

А вот пример функции для вычисления среднего значения элементов одномерного массива:

Function FunSumVector (A( ) As Single, _

MaxI As Integer) As Single

Dim Sum As Single, I As Integer

Sum = 0

For i=1 To MaxI

Sum = Sum + A(I)

Next

FunSumVector = Sum/MaxI

End Function

В следующем примере функция Celsius пересчитывает градусы Фаренгейта в градусы Цельсия. Когда функция вызывается процедурой Command1_Ckick, переменная, содержащая значение аргумента, передается функции. Результат вычислений возвращается вызывающей процедуре и выводится в окно сообщения.

Sub Command1_Ckick()

Dim t As Single

t = InputBox( _

"Введите температуру в градусах Фаренгейта“)

MsgBox "Температура равна " & _

Celsius(t) & " градусов Цельсия"

End Sub

Function Celsius(ГрадФар As Single) As Single

Celsius = (ГрадФар — 32) * 5 / 9

End Function

Поясним назначение зарезервированных слов, применяемых при определении аргументов:

*  Optional. Это слово должно предшествовать имени того аргумента, который является необязательным. После необязательного аргумента могут следовать только необязательные же аргументы. Нельзя использовать необязательные аргументы совместно с массивом аргументов (ParamArray).

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

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

*  ParamArray. Массив аргументов. Таковым может быть объявлен только последний аргумент в списке, при этом он будет представлять собой переменную типа Variant, содержащую в себе массив. Этим способом можно передавать в процедуру или функцию значительные объемы данных. При использовании массива аргументов нельзя применять свойства Optional, ByVal и ByRef.

*  ЗначениеПоУмолчанию. Допустимо только для необязательного аргумента. Задает значение, которое будет автоматически присвоено аргументу в случае его отсутствия.

Именованные аргументы

При вызове процедур Sub или Function возможна позиционная передача аргументов, т. е. в порядке следования в описании процедуры. Кроме того, аргументы могут передаваться по именам, вне зависимости от позиции в списке аргументов.

ИмяАргумента:= ЗначениеАргумента

Именованный аргумент состоит из имени аргумента, за которым следует двоеточие со знаком равенства (:=) и значение аргумента.

Именованные аргументы особенно полезны при вызове процедуры с необязательными аргументами (Optional).

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

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

Область действия имен процедур и функций

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

В список аргументов процедуры рекомендуется включать все входные и все выходные для этой процедуры данные.

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

Должно выполняться следующее соответствие между списками аргументов при объявлении и при обращении:

Аргумент Аргумент при обращении

при объявлении

Переменная Константа, переменная, элемент массива, выражение.

Массив Массив

Форма Форма

Элемент управления Элемент управления

Пример 1.

Sub Sum (A As Integer, B As Integer, С As Integer)

С = А + В

End Sub

Sub Form_Click ()

Dim X(1 To 3) As Integer

X(1) = 1

X(2) = 2

Sum X(1), X(1) + X(2), X(3)

Print Х(1), Х(2), Х(3)

End Sub

Sub Command1_Click ()

Dim X As Integer, Z As Integer

X = 5

Sum X, 4, Z

Print X, Z

End Sub

Результат при щелчке на форме: 1 2 4

Результат при щелчке на кнопке: 5 9

Пример 2.

Sub Sum (A ( ) As Integer)

A(3) = A(1) + A(2)

End Sub

Sub Form_Click ()

Dim X(3) As Integer

X(1) = 1

X(2) = 2

Sum X

Print X(1), X(2), X(3)

End Sub

Результат: 1 2 3

Если никакое значение не присвоено имени функции, то имя функции принимает значение по умолчанию: числовая функ­ция принимает значение 0, функция, объявленная как String, принимает значение пустой строки нулевой длины (“”), функция, объявленная как Variant принимает значение Empty (значение, которое принимает имя функции, называют возвращаемым значением функции).

Лекция 11

Пример 1

Заданы два одномерных массива a(1), a(2), … , a(k) и b(1), b(2), … , b(l). Центрировать и вывести массив а, если среднее значение его элементов меньше среднего значения элементов массива b. В противном случае центрировать и вывести массив b. Каждый элемент центрированного массива получается как разность значения соответствующего элемента исходного массива и среднего значения его элементов.

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

Перечень подзадач.

1.  Ввод одномерного массива x. Применим уже знакомую нам процедуру: Ввод_вектора (x() As Single).

2.  Вычисление для одномерного массива x, имеющего imax элементов, среднего значения его элементов. Применим функцию:

Среднее(x() As Single, imax As Integer) As _ Single.

3.  Центрирование одномерного массива x, имеющего imax элементов. Применим процедуру:

ЦенирированиеВектора (x() As Single, imax As _ Integer, Вычитаемое As Single).

4.  Вывод одномерного массива x. Применим процедуру: Вывод_вектора (x() As Single).

Рис. 11.1. Укрупненная блок-схема основного алгоритма

Укрупненная блок-схема основного алгоритма

Укрупненная блок-схема основного алгоритма приведена на рис. 11.1. Алгоритмы подзадач 2, 3 и 4 характеризуются простотой, что позволяет обойтись без составления их блок-схем. Основой всех этих трех алгоритмов является простой цикл.

Интерфейс проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примеров, рассмотренных в предыдущих лекциях (подробнее).

Исходный текст программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

Dim k As Integer, l As Integer

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

Cls

k = InputBox("k=?")

l = InputBox("l=?")

Print "k= "; k; " l= "; l

ReDim a(k), b(l)

Print "Ввод вектора а"

Ввод_вектора a

Ввод_вектора b

Dim СреднееА As Single, СреднееВ As Single

СреднееА = Среднее(a, k)

СреднееВ = Среднее(b, l)

If СреднееА < СреднееВ Then

ЦентрированиеВектора a, k, СреднееА

Print "Центрированный вектор а"

Вывод_вектора a

Else

ЦентрированиеВектора b, l, СреднееВ

Print "Центрированный вектор b"

Вывод_вектора b

End If

End Sub

Private Sub Ввод_вектора(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x)

5: i_max = UBound(x)

For i = i_min To i_max

x(i) = InputBox("Элемент вектора (" _

& i & ")=?",”Ввод вектора”)

Print x(i),

Next

Print

End Sub

Private Function Среднее(x() As Single, _

imax As Integer) As Single

Dim sum As Single, i As Integer

sum = 0

For i = 1 To imax

sum = sum + x(i)

Next

Среднее = sum / imax

End Function

Private Sub ЦентрированиеВектора(x() As Single, _

imax As Integer, Вычитаемое As Single)

Dim i As Integer

For i = 1 To imax

x(i) = x(i) — Вычитаемое

Next

End Sub

Private Sub Вывод_вектора(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x, 1)

5: i_max = UBound(x, 1)

For i = i_min To i_max

Print x(i),

Next

Print

End Sub

Лекция 12

Пример 2

Усложним условие примера, рассмотренного на предыдущей лекции. Заданы те же два одномерных массива. Требуется центрировать и вывести массив, у которого меньше среднее значение элементов, величина которых больше h. Новое условие полностью выглядит так:

Заданы два одномерных массива a(1), a(2), … , a(k) и b(1), b(2), … , b(l). Центрировать и вывести массив а, если среднее значение его элементов, имеющих значение больше h, меньше среднего значения элементов массива b, имеющих значение больше h. В противном случае центрировать и вывести массив b. Каждый элемент центрированного массива получается как разность значения соответствующего элемента исходного массива и среднего значения его элементов, имеющих значение больше h.

Изменения в перечне подзадач.

Изменения коснуться только подзадачи вычисления для одномерного массива x, имеющего imax элементов, среднего значения тех его элементов, значение которых больше h. Применим функцию: Function Среднее (x() As Single, imax As Integer, _ h As Single, Сигнал As Boolean) As Single

Новшество состоит в том, что если не окажется ни одного элемента массива x, значение которого больше h, то среднего вообще не существует. Обращение к функции Среднее может привести к двум ситуациям:

а) среднее значение существует (при этом аргумент Сигнал должен получить значение True.

б) среднее значение не существует (при этом аргумент Сигнал должен получить значение False).

Изменению подлежат только текст процедуры Command1_Click и функции Среднее.

Блок-схема алгоритма функции Среднее

Рис. 12.1. Блок-схема алгоритма вычисления среднего значения вектора

Изменения в основном алгоритме

Рис. 12.2. Блок-схема измененного участка основного алгоритма

Здесь sa и sb – переменные типа Boolean вычисляются при обращениях к функции Среднее для вектора a и b соответственно. Их значение говорит о том, существует или не существует среднее значение для соответствующего вектора.

Исходный текст программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

Dim k As Integer, l As Integer, h As Single

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

Cls

k = InputBox("k=?")

l = InputBox("l=?")

h = InputBox("h=?")

Print "k= "; k; " l= "; l; " h= "; h

ReDim a(k), b(l)

Print "Ввод вектора а"

Ввод_вектора a

Print "Ввод вектора b"

Ввод_вектора b

Dim СреднееА As Single, СреднееВ As Single

Dim sa As Boolean, sb As Boolean

СреднееА = Среднее(a, k, h, sa)

СреднееВ = Среднее(b, l, h, sb)

If sa And sb Then

If СреднееА < СреднееВ Then

ЦентрированиеВектора a, k, СреднееА

Print "Центрированный вектор а"

Вывод_вектора a

Else

ЦентрированиеВектора b, l, СреднееВ

Print "Центрированный вектор b"

Вывод_вектора b

End If

Else

Print "Решения нет "

End If

End Sub

Private Sub Ввод_вектора(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x)

5: i_max = UBound(x)

For i = i_min To i_max

x(i) = InputBox("Элемент вектора (" _

& i & ")=?",”Ввод вектора”)

Print x(i),

Next

Print

End Sub

Private Function Среднее(x() As Single, imax As _

Integer, h As Single, Сигнал As Boolean) As Single

Dim sum As Single, kol As Integer, i As Integer

sum = 0

kol = 0

For i = 1 To imax

If x(i) > h Then

sum = sum + x(i)

kol = kol + 1

End If

Next

If kol <> 0 Then

Среднее = sum / kol

Сигнал = True

Else

Сигнал = False

End If

End Function

Private Sub ЦентрированиеВектора(x() As Single, _

imax As Integer, Вычитаемое As Single)

Dim i As Integer

For i = 1 To imax

x(i) = x(i) — Вычитаемое

Next

End Sub

Private Sub Вывод_вектора(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x, 1)

5: i_max = UBound(x, 1)

For i = i_min To i_max

Print x(i),

Next

Print

End Sub

Пример 3

Заданы три одномерных массива a(1), a(2), … , a(k), b(1), b(2), … , b(l) и c(1), c(2), … , c(m). Найти у скольких из этих массивов значения всех элементов больше заданной величины h.

Перечень подзадач

Ввод одномерного массива x. Применим известную по предыдущим примерам процедуру. Проверка для одномерного массива x, имеющего imax элементов, что значение всех его элементов больше заданной величины h. Применим функцию:

Проверка(x() As Single, imax As Integer, h As Single) As Boolean

Блок-схема алгоритма функции Проверка

Рис. 12.3. Блок-схема алгоритма функции Проверка

Здесь r – это локальная переменная типа Boolean.

Интерфейс проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примеров, рассмотренных в предыдущих лекциях (подробнее).

Разработка программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

Dim k As Integer, l As Integer, m As Integer

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

Dim h As Single

Cls

k = InputBox("k=?")

l = InputBox("l=?")

m = InputBox("m=?")

h = InputBox("h=?")

Print "k= "; k; " l= "; l; " m= "; m; " h= "; h

ReDim a(k), b(l), c(m)

Print "Ввод вектора а"

Ввод_вектора a

Print "Ввод вектора b"

Ввод_вектора b

Print "Ввод вектора c"

Ввод_вектора c

Dim Количество As Integer

Количество = 0

If Проверка(a, k, h) Then Количество = _ Количество + 1

If Проверка(b, l, h) Then Количество = _ Количество + 1

If Проверка(c, m, h) Then Количество = _ Количество + 1

Select Case Количество

Case 0

Print "Не удовлетворяет ни один массив"

Case 1

Print "Удовлетворяет один массив"

Case 2

Print "Уудовлетворяют два массива"

Case 3

Print "Удовлетворяют три массива"

End Select

End Sub

Private Sub Ввод_вектора(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x)

5: i_max = UBound(x)

For i = i_min To i_max

x(i) = InputBox("Элемент вектора (" _

& i & ")=?",”Ввод вектора”)

Print x(i),

Next

Print

End Sub

Private Function Проверка(x() As Single, imax As Integer, _

h As Single) As Boolean

Dim i As Integer

Dim r As Boolean

r = True

i = 1

Do While (i <= imax) And r

If x(i) > h Then

Else

r = False

End If

i = i + 1

Loop

Проверка = r

End Function

В функции Проверка вместо инструкции цикла Do While могла бы быть применена инструкция цикла For вместе с инструкцией Exit For:

Private Function Проверка(x() As Single, imax As _ Integer, h As Single) As Boolean

Dim i As Integer

Проверка = True

For i = 1 To imax

If x(i) <= h Then

Проверка = False

Exit For

End If

Next

End Function

Лекция 13

Пример 4

Задана матрица а, имеющая кa строк и la столбцов, а также матрица b, имеющая кb строк и lb столбцов и матрица с, имеющая кc строк и lc столбцов.

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

Перечень подзадач

1.  Ввод матрицы x, имеющей imax строк и jmax столбцов.

Применим процедуру Ввод_матрицы (x() As Single).

2.  Определение максимального элемента матрицы x, имеющей imax строк и jmax столбцов.

Применим функцию:

МаксМатр(x() As Single, imax As Integer, jmax As Integer) As Single

3.  Вывод матрицы x, имеющей imax строк и jmax столбцов.

Применим процедуру:

Вывод_матрицы (x() As Single).

Блок-схема алгоритма функции МаксМатр

Рис. 13.1. Блок-схема алгоритма определения значения максимального элемента матрицы

Интерфейс проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примеров, рассмотренных в предыдущих лекциях (подробнее).

Разработка программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

Dim ka As Integer, la As Integer

Dim kb As Integer, lb As Integer

Dim kc As Integer, lc As Integer

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

Cls

ka = InputBox("ka=?")

la = InputBox("la=?")

kb = InputBox("kb=?")

lb = InputBox("lb=?")

kc = InputBox("kc=?")

lc = InputBox("lc=?")

Print "ka= "; ka; " la= "; la

Print "kb= "; kb; " lb= "; lb

Print "kc= "; kc; " lc= "; lc

ReDim a(ka, la), b(kb, lb), c(kc, lc)

Print "Задайте значения элементов матрицы a"

Ввод_матрицы a

Print "Задайте значения элементов матрицы b"

Ввод_матрицы b

Print "Задайте значения элементов матрицы c"

Ввод_матрицы c

Dim МаксА As Single, МаксВ As Single, МаксС As Single

МаксА = МаксМатр(a, ka, la)

МаксВ = МаксМатр(b, kb, lb)

МаксС = МаксМатр(c, kc, lc)

Dim МаксАВС As Single

МаксАВС = МаксА

If МаксВ > МаксАВС Then МаксАВС = МаксВ

If МаксС > МаксАВС Then МаксАВС = МаксС

Print "Наибольший элемент равен "; МаксАВС

If МаксАВС = МаксА Then

Print "Наибольший элемент содержит матрица a"

Вывод_матрицы a

End If

If МаксАВС = МаксВ Then

Print "Наибольший элемент содержит матрица b"

Вывод_матрицы b

End If

If МаксАВС = МаксС Then

Print "Наибольший элемент содержит матрица c"

Вывод_матрицы c

End If

End Sub

Private Sub Ввод_матрицы(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x)

5: i_max = UBound(x)

Dim j As Integer

Dim j_min As Integer

Dim j_max As Integer

j_min = LBound(x, 2)

10: j_max = UBound(x, 2)

For i = i_min To i_max

For j = j_min To j_max

x(i, j) = InputBox("Элемент матрицы (" _

& i & ", " & j & ") = ?", _

"Ввод матрицы")

Print x(i, j),

15: Next

Print

Next

End Sub

Private Function МаксМатр(x() As Single, imax As Integer, _

jmax As Integer) As Single

Dim i As Integer, j As Integer, МаксХ As Single

МаксХ = x(1, 1)

For i = 1 To imax

For j = 1 To jmax

If x(i, j) > МаксХ Then МаксХ = x(i, j)

Next j, i

МаксМатр = МаксХ

End Function

Private Sub Вывод_матрицы(x() As Single)

1: Dim i As Integer

Dim i_min As Integer

Dim i_max As Integer

i_min = LBound(x)

5: i_max = UBound(x)

Dim j As Integer

Dim j_min As Integer

Dim j_max As Integer

j_min = LBound(x, 2)

10: j_max = UBound(x, 2)

For i = i_min To i_max

For j = j_min To j_max

Print x(i, j),

Next

15: Print

Next

End Sub

В процедурах Ввод_матрицы и Вывод_матрицы применены функции Ubound и Lbound.

Не обязательно передавать в процедуры и функции значения верхних и нижних границ размерностей массива. Их можно вычислять. Для этого можно применить функции Ubound и Lbound соответственно.

Синтаксис обращения к этим функциям:

UBound(ИмяМассива [,Номер измерения])

LBound(ИмяМассива [,Номер измерения])

Параметр НомерИзмерения используют в случае многомерного массива, например:

Dim x() As Single

.

.

.

НаибольшийНомерСтроки = Ubound (x, 1)

НаименьшийНомерСтолбца = Lbound (x, 2)

Если номер измерения опущен, то он подразумевается равным 1.

Передача аргументов по ссылке и по значению

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

Передача по ссылке (ее поясняет рис 13.2) определена по умолчанию.

Рис. 13.2. Пояснение связи по ссылке

Передача значений аргументов при вызове процедуры или функции по значению (в списке аргументов используется ключевое слово ByVal) означает, что для аргумента выделяется дополнительная ячейка или область памяти, в которую записывается значение передаваемого аргумента. Изменения значения аргумента в вызываемой процедуре или в функции не ведут к изменению аргумента в вызывающей процедуре или в функции, так как вызываемая процедура или функция использует для аргумента другую ячейку или область памяти аналогично локальным данным (см. рис. 13.3). Это удобно, если модификация данных необходима только внутри вызываемой процедуры или функции и нет необходимости передавать измененные данные обратно в вызывающую процедуру или функцию.

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

Рис. 13.3. Пояснение связи по значению

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020

А ты боишься COVID-19?

 Пройди опрос и получи промокод