Процедуры, подпрограммы и функции.ppt
- Количество слайдов: 17
Вариант для 14121 Напишите программу, проверяющую правильность хода конем, который делает пользователь. Т. е. если пользователь вводит значение « 3745» ( «C 7 -D 5» ), то программа должна определить это как правильный ход, если же введено « 5254» ( «E 2 -E 4» ), то ход неверный. Помогите ему осуществить эту проверку! Вариант для 14122 и 14161 Требуется написать программу, определяющую наименьшее общее кратное (НОК) чисел a и b.
Процедуры, подпрограммы и функции Если программа имеет в своем составе блоки, которые предполагают автономную обработку данных, или же в программе неоднократно повторяются некоторые последовательности операторов, рекомендуется разбить программу на ряд процедур, каждая из которых возьмет на себя часть реализации общего алгоритма решения задачи.
Если программа имеет в своем составе блоки, которые предполагают автономную обработку данных, или же в программе неоднократно повторяются некоторые последовательности операторов, рекомендуется разбить программу на ряд процедур, каждая из которых возьмет на себя часть реализации общего алгоритма решения задачи. Процедуры представляют собой логические сегменты программы. Преимущества • При использовании процедур отпадает необходимость дублировать участки программы. • Вызывая несколько раз процедуру, программа выполняет несколько раз одни и те же действия, записанные один раз. • Программы, разбитые на процедуры, легче читаются и легче модифицируются. Легко можно локализовать часть программы, в которой произошла ошибка. Процедура может располагаться на любом процедурном листе, в любом модуле или открытом проекте и может вызываться из любой процедуры. Процедура состоит из некоторого количества операторов, объединенных в группу для решения некоторой задачи, т. е. это последовательность операторов языка, к которым возможно обращение как к связанной группе операторов. Невозможно выполнить часть процедуры - можно выполнить процедуру только целиком.
Важно • Все исполняемые операторы модуля размещаются в процедурах. • Вне процедур в начале модуля могут находиться только опции (например, Option Explicit ), объявления модульных, глобальных переменных и переменных пользовательского типа. Классификация процедур Обычно в составе проекта присутствуют • основная процедура, которая вызывает другие процедуры. Это самостоятельно используемая процедура; • вызываемые процедуры, реализующие конкретные задачи проекта; • процедуры обработки событий. В качестве вызываемых процедур применяются подпрограммы и функции: процедуры-функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают. Замечание Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения процедуре-функции присваивается некоторое значение, которое доступно вызвавшей ее процедуре. Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями. Событие, например, - это нажатие командной кнопки в диалоге, закрытие или активизация окна таблицы. Если установлена связь процедуры с событием объекта приложения, то процедура является событийной. Особенность событийных процедур в том, что они запускаются автоматически, если происходит некоторое событие.
Структура и объявление процедуры Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими двумя операторами, составляют тело процедуры (функции). При вставке новой процедуры с использованием команды Insert-Procedure в окне кода автоматически появляются команды начала и окончания процедуры (функции) - достаточно в диалоге задать название новой процедуры и выбрать ее тип. Выход из процедуры обычно происходит естественным образом - при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции). Запомните • При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры. • Процедуры определяются только на модульном уровне. Внутри процедуры не может располагаться объявление другой процедуры.
Синтаксис объявления процедуры общего типа Оператор объявления процедуры присваивает ей имя и перечисляет формальные параметры процедуры. Синтаксис [Private|Public][Static] Sub name ([arglist]) • Private или Public (указывается одно из двух) определяют область видимости процедуры: • Private определяет, что процедура доступна только в том модуле, в котором она объявлена; • Public объявляет процедуру доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля. Важно • Если в модуле присутствует инструкция Option Private, то процедуры, размещенные в этом модуле, не доступны вне проекта. • Если Private и Public опущены, то процедура считается общедоступной - Public. • Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры. • name - имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля. • arglist - список формальных параметров. В списке перечисляются переменные, которые обозначают параметры, передаваемые процедуре при вызове. Элементы списка разделяются символом запятая ( , ). Список параметров необязателен. При отсутствии параметров после имени процедуры следуют открывающая и закрывающая скобки.
Синтаксис объявления функции Оператор объявления функции присваивает ей имя, перечисляет ее параметры и устанавливает тип возвращаемого значения. Синтаксис [Private|Public][Static] Function name ([arglist]) [As Type] Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным наличием типа Type возвращаемого функцией значения, который является необязательным в объявлении функции. Важно • Определение типа передаваемого значения позволяет повысить эффективность программы. • Если тип возвращаемого значения не указан, то VBA трактует его как Variant. Function имя. Функции (аргумент1, аргумент2, . . . ) оператор. Visual. Basic 1 оператор. Visual. Basic 2. . . имя. Функции = возвращаемое. Значение End Function
Вызов процедуры Процедуры проекта могут быть связаны между собой сложным образом: одни процедуры могут вызывать другие процедуры, которые в свою очередь могут вызывать дополнительные процедуры. Некоторые процедуры могут автоматически выполняться, если случается некоторое событие и для них не требуются команды вызова, но они могут обращаться к процедурам общего типа или к процедурамфункциям. Вызов процедуры общего типа отличается от вызова процедуры-функции. • Чтобы вызвать процедуру общего типа или процедуру-функцию без параметров, достаточно записать ее имя в вызывающей процедуре: proc_A или b=func_b. • Фактические параметры процедуры общего типа (аргументы) отделяются от имени процедуры пробелом и перечисляются через запятую: proc_A arg 1, arg 2. • Аргументы функции перечисляются в скобках после имени функции: func_b(arg 1, arg 2). • Порядок перечисления аргументов соответствует порядку формальных параметров процедуры (функции). • Для вызова процедуры общего типа можно воспользоваться оператором Call, задавая значения аргументов в скобках Call proc_A(arg 1, Arg 2). • Процедура-функция не может быть выполнена командой Сервис-Макросы, а может быть только вызвана другой процедурой или функцией. • Так как процедура-функция возвращает значение, она используется в выражениях, например, в операторе присваивания. • Процедура общего типа не может быть использована в выражениях, но может быть выполнена командой Сервис-Макросы.
Важно • Поиск процедуры производится сначала в текущем модуле, а затем в других модулях проекта или других открытых проектах. • Если имя процедуры не является уникальным (в разных модулях проекта или в разных проектах объявлены процедуры с одинаковыми именами), то при вызове процедуры необходимо уточнить, о какой именно процедуре идет речь. Это производится стандартным способом - в операторе вызова процедуры указывается составное имя процедуры, которое строится из имени проекта, имени модуля и имени процедуры, разделенных точкой: Project. Name. Module. Name. Procedure. Name Например, вызов процедуры Proc_A, расположенной в модуле Module 1 проекта Project 1 можно записать так: Project 1. Module 1. Proc_A. Замечание • Имя проекта не является именем рабочей книги.
Пример Процедура высвечивает приветствие после ввода пользователем своего имени. В результате выполнения операторов 1 -го и 2 -го способов высвечивается приветствие "Hello, Conrad".
Параметры и аргументы Через список параметров осуществляется связь между вызывающей и вызываемой процедурами. Параметр: • описывается при объявлении процедуры; • представляет собой переменную. Значение, которое будет подставлено вместо параметра при вызове процедуры, называется аргументом. Передаваемые аргументы являются позиционными, т. к. своей позицией в списке каждый аргумент должен показать, какой параметр он заменяет. В качестве аргументов процедуре можно передать значения переменных, выражения, константы или массивы, но обязательно тип передаваемого аргумента должен соответствовать типу параметра или корректно преобразовываться к нему.
Пример Для первых пяти натуральных чисел рассчитать квадрат и куб числа Основная процедура Proc_param организует цикл на пять чисел и вызывает процедуру Proc_print для распечатки в окне Immediate самого числа, его квадрата и куба. При вызове процедуры происходит передача аргумента i, который используется в Proc_print уже как значение формального параметра fi. Типы переменных i и fi совпадают. Call Proc_print (i) - альтернативная запись вызова процедуры.
Замечания • Идентификаторы аргументов и параметров процедуры могут совпадать. Синтаксис описания каждого параметра процедуры имеет следующий вид: [[Optional][By. Val|By. Ref][Param. Array] varname[( )] As type][= defaultvalue] • Optional - ключевое слово. Указывает, что параметр может быть опущен. Важно • Необязательные параметры всегда размещаются в конце списка. • Тип необязательного параметра - Variant. • При наличии необязательного параметра в процедуре необходимо предусмотреть использование значения по умолчанию, если значение аргумента не задано. • В процедуре можно проверить, передается необязательный параметр или нет, используя функию Is. Missing(argname). Она возвращает значение True, если значение параметра опущено, и False - в противном случае. • By. Val 1 - передача параметра по значению. Предполагается, что при вызове процедуры передается только значение переменной и, следовательно, в процессе выполнения процедуры оно не может быть изменено. Используйте этот способ передачи аргументов, чтобы избежать случайной модификации передаваемых данных. • By. Ref 2 - передача параметров по ссылке. Предполагается, что процедуре передается адрес переменной. В этом случае вызывающая процедура может не только использовать переданное значение переменной, но и изменить его в процессе выполнения. Используется по умолчанию. • Param. Array означает передачу необязательного аргумента - массива типа Variant с неопределенным количеством элементов.
Важно Ключевое слово Param. Array • используется только для последнего параметра процедуры; • позволяет задавать произвольное количество передаваемых аргументов; • не допускает использование ключевых слов By. Val, By. Ref и Optional для описываемого параметра. • Varname - идентификатор переменной. • type - тип передаваемого аргумента. Если тип данных не указан, то VBA трактует аргумент как Variant. Важно • Разрешены все элементарные типы данных и типы, определенные пользователем. • Aргумент типа String должен иметь переменную длину. • Если для параметра процедуры описан тип данных, то передаваемый аргумент должен иметь тот же тип данных. • Если параметром процедуры является массив, то передаваемый массив должен иметь ту же размерность.
Пример Для сотрудников фирмы (максимально 2000 сотрудников) рассчитать выплаты в соответствии с количеством отработанных часов и ставкой оплаты за час работы. Налог составляет 13%. Если зарплата превышает 300$, то страховой взнос составляет 5%. Процедура salary_employee (основная) запрашивает ввод количества отработанных часов и размер почасовой оплаты максимально для 2000 сотрудников и передает по значению эти данные в процедуру salary_em_proc. Вызываемая процедура salary_em_proc рассчитывает и распечатывает денежную выплату. В вызываемой процедуре salary_em_proc определены три параметра. Это io - код сотрудника, ho - количество часов, ra - ставка почасовой оплаты
Изменим задачу, чтобы показать способ передачи аргументов по ссылке. Пусть дополнительно в вызываемой процедуре будет рассчитываться суммарная выплата, значение которой в измененном виде будет доступно основной процедуре. В основной процедуре salary_employee объявите переменную AC (Dim AC as Double), в которой будет накапливаться суммарная выплата. В вызываемой процедуре четвертый параметр SI - накапливаемая сумма. Этот параметр передается по ссылке, т. к. его значение изменяется в вызываемой процедуре. Оператор вызова процедуры будет выглядеть так: salary_em_sum id, h, r, AC.
Возврат значения функции При написании процедуры-функции сохраняются все возможности, используемые при написании процедур общего типа, но дополнительно процедура-функция может возвращать результирующее значение в своем имени. Пример Создать функцию расчета выплат, учитывая, что налог составляет 13% и, если зарплата превышает 300 $, то в страховой фонд дополнительно взимается 5%. В отличие от процедуры salary_em_proc функция salary_em_ возвращает рассчитанное значение. Возврат значения происходит при помощи операторов присваивания, в которых слева используется имя функции. В вызывающей процедуре salary_employee вместо оператора вызова процедуры salary_em_proc io, h, r записан оператор, распечатывающий рассчитанную выплату как Msg. Box io & " salary " & salary_em(h, r).