Информатика_Семестр2_Лекции / Информатика_2 семестр_Тема 06_Функции
.pdfУниверситет машиностроения
Кафедра «Автоматика и процессы управления»
Дисциплина
Информационные технологии
2 семестр
Тема 06
Функции и процедуры
(Язык VBA for Ms Excel)
Информатика. 2 семестр. Тема 06. Функции
Иногда часть кода можно использовать
несколько раз… |
(подпрограммы) |
|
Очень часто несколько копий кода различаются
только именами переменных…
(аргументы)
Как правило есть большие фрагменты кода, которые выполняют просто описываемое действие…
Бывают случаи когда нужно повторить действия с изменённым набором параметров…
Информатика. 2 семестр. Тема 06. Функции
Определения
Подпрограмма – логически обособленный блок инструкций, предназначенный для многократного использования.
GoSub МеткаПодпрограммы
* * *
МеткаПодпрограммы: Statements
Return
Процедура – особый вид функции, не возвращающий значение.
Sub ИмяПроцедуры( Аргументы )
Statements
End Sub
Вызов процедуры: Call ИмяПроцедуры( x )
Информатика. 2 семестр. Тема 06. Функции
Отображение:
«Подпрограмма»
п/п
Предопределенный
процесс
Go(x)
Определения |
Отображение: |
|||
|
||||
Функция – специально организованный набор |
Предопределенный |
|||
инструкций, который может быть запущен с |
||||
процесс (функция) |
||||
использованием имени функции, и возвращающий |
||||
|
|
|
||
итоговое значение, используемое в месте её вызова |
|
|
|
Function ИмяФункции( Аргументы ) As ТипРезультата |
Go(x) |
|||
Statements |
|
|
|
|
|
|
|
|
|
ИмяФункции = Expression |
‘ Результат функции |
|
|
|
End Function |
|
|
|
|
Вызов функции: |
y = ИмяФункции( x ) |
|
|
|
алгоритм |
функция |
основной (main) |
вычислитель |
|
y = f(x) |
|
|
x+1 → ret. |
|
|
|
|
|
Информатика. 2 семестр. Тема 06. Функции
Последовательность выполнения
Выполнение кода функции предваряется операциями по выделению памяти для локальных переменных и результата функции, а также копированию значений параметров (аргументов)
стек |
x |
z |
|
Function F (A, B As Integer) As Integer |
|
|
|
|
|||
|
|
|
|
Dim C, D As Integer |
|
y |
|
f () |
Псевдокод для y = F ( x, z ): |
||
|
|
|
|||
результат |
|
1 |
Зарезервировать место под результат |
||
параметр B ( z ) |
2 |
Зарезервировать место для аргументов |
|||
параметр A ( x ) |
|||||
3 Скопировать значения аргументов |
|||||
адрес возврата |
|||||
|
|
||||
лок. перемен. D |
4 |
Выделить место под локальные переменные |
|||
лок. перемен. C |
5 |
Подготовить запуск функции |
|||
копия регистров |
|||||
6 |
Выполнить код функции и получить результат |
||||
|
|
|
|
|
|
F = A + B + C + D ‘ return result |
резерв стека |
7 |
Скопировать результат, очистить стек и память |
|
|
8 |
Использовать результат для вычисления y |
Результат выполнения кода функции используется в основном коде
Информатика. 2 семестр. Тема 06. Функции
Способы передачи параметров
В VBA параметры в функции и процедуры можно передавать
по-значению (byVal) либо по-ссылке (byRef)
По-значению (byVal) |
||
y |
x |
z |
f () |
|
|
значение функц.
B: значение из z
A: значение из x
адрес возврата
лок. перемен. D
лок. перемен. C
копия регистров
резерв стека
|
По-ссылке (byRef) |
||
Копируются значения |
y |
x |
z |
|
|||
Сохраняются ссылки |
|
|
f () |
|
|
|
|
|
|
|
A = 1 |
|
|
значение функц. |
|
|
|
|
|
|
|
|
|
|
@B: адрес для z |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Работа с |
|
|
@A: адрес для x |
||||
Работа через |
|
|
|||||
«копиями» |
|
адрес возврата |
|||||
|
|
||||||
ссылки с |
|
|
|||||
|
|
|
|
|
|
лок. перемен. D |
|
|
|
|
|
|
исходными |
|
|
|
|
|
|
|
|
лок. перемен. C |
|
|
|
|
|
|
ячейками |
|
|
|
|
|
|
|
копия регистров |
||
|
|
|
|
«Копии» |
|
|
|
|
|
|
|
удаляются |
|
|
резерв стека |
|
|
|
|
|
|
||
|
|
|
|
|
|
По-умолчанию в VBA параметры передаются по-ссылке – так быстрее
Информатика. 2 семестр. Тема 06. Функции
Области видимости и экранирование имён
В VBA функция скрывает свои переменные от «внешнего кода» и экранирует имена «внешних объектов» если они совпадают с локальными переменными и именами параметров
A x z
B C D
результат
параметр B ( z )
параметр A ( x )
адрес возврата
лок. перемен. D
лок. перемен. C
копия регистров
резерв стека
Dim A, B, C, D, X, Z As Integer
Y = F ( X , Z )
Function F ( A , B As Integer) As Integer
Dim C, D As Integer
C = A + X ‘ equal X + X
D = B + Module1.B ‘ equal Z + B
F = A + B + C + D ‘ only internal variables
Хорошим тоном считается написание кода функций с использованием только имён локальных переменных и параметров
Информатика. 2 семестр. Тема 06. Функции
Повторное использование кода Библиотеки функций
Если функция не зависит от «внешних» объектов, её можно вызвать из другого модуля или вынести в отдельный модуль (если она видна)
MainModule |
y = f(x) |
LibModule
function f() |
|
|
k = f(z) |
|
|
|
|
|
|
При необходимости, функции одного модуля могут использовать общие объекты (переменные) для хранения важных значений (настроек)
Такой модуль – это аналог
f1(x) |
f2(z) |
статического класса |
Принцип ООП: |
|
Инкапсуляция – скрытие «реализации» |
Информатика. 2 семестр. Тема 06. Функции |
|
«Расширенные» возможности параметров
В VBA структуры (переменные пользовательских типов – Type) могут использоваться в качестве параметров и результатов функций
Function F ( A, B As NewType) As OtherType Dim Res As OtherType
…smth statements…
F = Res ‘ В VBA нельзя напрямую управлять результатом
End Function
В VBA допускается использование необязательных аргументов
Function F ( Optional S As String = “Default”) As String
…smth statements…
F = S ‘ При вызове функции можно не указывать аргумент
End Function
ВVBA можно указывать аргументы по имени при вызове функции
Res = F (S := “Hello World”) ‘ Если опциональных аргументов несколько
ВVBA можно создавать функции с переменным числом аргументов
Function F (S As String, ParamArray OtherArgs() ) As Integer
F = OtherArgs(1) + OtherArgs(2) ‘ Желательно использовать UBound
Информатика. 2 семестр. Тема 06. Функции
«Полезные» диалоговые функции
Для немедленного сообщения пользователю используется MsgBox
MsgBox (Prompt [, Buttons] [, Title] [, HelpFile, HelpContext])
Res = MsgBox(“Шеф, всё пропало”, vbOKOnly, “Окно ошибки”)
‘ MsgBox возвращает код кнопки как целочисленную константу (vbOK = 1)
Для срочного получения данных от пользователя используется InputBox
InputBox (Prompt [, Title] [, Default] [, XPos] [, YPos] [, HelpFile, HelpContext])
Res = InputBox(“Введите X”, “Запрос данных”, 10)
И ещё кое-что о функциях в VBA:
Функции можно вызывать как процедуры: Call MyFunc(“Hello”)
Функции можно применить как операторы: MyFunc “Hello”
Если Function MyFunc (S As String ) As Variant
Информатика. 2 семестр. Тема 06. Функции