Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_Семестр2_Лекции / Информатика_2 семестр_Тема 06_Функции.pptx
Скачиваний:
20
Добавлен:
05.06.2015
Размер:
229.54 Кб
Скачать

Университет машиностроения

Кафедра «Автоматика и процессы управления»

Дисциплина

Информационные технологии

2 семестр

Тема 06

Функции и процедуры

(Язык VBA for Ms Excel)

Информатика. 2 семестр. Тема 06. Функции

(скрытие реализации)

Иногда часть кода можно использовать

несколько раз…

(подпрограммы)

 

Очень часто несколько копий кода различаются

только именами переменных…

(аргументы)

 

Как правило есть большие фрагменты кода, которые выполняют просто описываемое действие…

Бывают случаи когда нужно повторить действия с изменённым набором параметров… (рекурсия)

Информатика. 2 семестр. Тема 06. Функции

Определения

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

GoSub МеткаПодпрограммы

* * *

МеткаПодпрограммы: Statements

Return

Процедура – особый вид функции, не возвращающий значение.

Sub ИмяПроцедуры( Аргументы ) Statements

End Sub

Вызов процедуры: Call ИмяПроцедуры( x )

Отображение:

«Подпрограмма»

п/п

Предопределенный

процесс

Go(x)

Информатика. 2 семестр. Тема 06. Функции

Определения

 

 

Отображение:

Функция – специально организованный набор

Предопределенный

инструкций, который может быть запущен с

процесс (функция)

использованием имени функции, и возвращающий

 

 

 

 

 

 

итоговое значение, используемое в месте её вызова

 

 

 

 

 

 

 

 

 

Go(x)

 

 

Function ИмяФункции( Аргументы ) As ТипРезультата

 

 

 

 

Statements

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ИмяФункции = Expression

‘ Результат функции

 

 

 

 

 

 

End Function

 

 

 

 

 

 

 

 

Вызов функции: y = ИмяФункции( x )

 

 

 

 

 

 

алгоритм

функция

основной (main)

 

 

вычислитель

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y = f(x)

 

 

 

 

x+1 → ret.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Информатика. 2 семестр. Тема 06. Функции

Последовательность выполнения

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

стек xz

y f ()

результат

параметр B( z )

параметр A (x )

адрес возврата

лок. перемен. D

лок. перемен. C

копия регистров

резерв стека

Function F (A, B As Integer) As Integer Dim C, D As Integer

Псевдокод для y = F ( x, z ):

1 Зарезервировать место под результат

2 Зарезервировать место для аргументов

3 Скопировать значения аргументов

4 Выделить место под локальные переменные

5 Подготовить запуск функции

6 Выполнить код функции и получить результат

F = A + B + C + D ‘ return result

7 Скопировать результат, очистить стек и память 8 Использовать результат для вычисления y

Результат выполнения кода функции используется в основном коде

Информатика. 2 семестр. Тема 06. Функции

Способы передачи параметров

В VBA параметры в функции и процедуры можно передавать

по-значению (byVal) либо по-ссылке (byRef)

По-значению (byVal)

По-ссылке (byRef)

y

x z

Копируются значения

f ()

 

Сохраняются ссылки

значение функц.

A = 1

 

B: значение из z

 

 

 

A: значение из x

Работа с

Работа через

адрес возврата

«копиями»

ссылки с

лок. перемен. D

 

лок. перемен. C

 

исходными

копия регистров

 

ячейками

 

 

«Копии»

 

резерв стека

удаляются

 

y x z

f ()

значение функц.

@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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LibModule

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k = f(z)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y = f(x)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

function f()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

При необходимости, функции одного

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

модуля могут использовать общие

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объекты (переменные) для хранения

 

 

 

 

 

 

 

 

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. Функции