Урок 33. Процедуры и функции
В предыдущем уроке рассказывалось о работе с текстовыми файлами.
В этом уроке поговорим о подпрограммах. При разработке сложного алгоритма целесообразно выделить в нем последовательности действий, которые многократно повторяются, оформить как вспомогательные алгоритмы и, по мере необходимости, вызывать их из основного алгоритма.
Программы, реализующие вспомогательный алгоритм, называются подпрограммами. Подпрограмму можно оформить как процедуру или как функцию.
В этом уроке вы узнаете: какие преимущества дает использование подпрограмм, чем отличаются процедуры и функции, как они описываются и как вызываются.
Процедуры и функции предоставляют следующие преимущества:
- Устраняют повторяющиеся строки. Вы можете один раз определить процедуру или функцию и вызывать ее там, где это необходимо.
- Делают программы более читаемыми. Программу, разбитую на несколько частей, воспринимать легче, чем программу, сделанную в виде одного большого фрагмента.
- Упрощают разработку программы. Программы, разделенные на логические единицы, легче разрабатывать, писать и отлаживать.
- Могут повторно использоваться в других проектах и решениях.
- Расширяют возможности языка программирования. Если для решения ваших задач в языке программирования нет готовых, встроенных в язык программирования процедур и функций, можно написать свои процедуры и функции.
Основные отличия функции от процедуры:
1. Функция имеет тип (аналогично переменной) и может возвращать значение через имя функции. Ее можно использовать качестве операнда в выражениях. Процедура возвращает результаты через параметры, ее нельзя использовать в выражениях.
2. Вызов функции осуществляется посредством указания ее имени в каком либо операторе языка программирования. Процедура вызывается с помощью отдельного оператора.
Прежде чем использовать процедуру или функцию в программе, ее нужно объявить (описать).
Подпрограмма типа Sub
При описании процедуры, как и при описании функции, ей дается уникальное название – имя процедуры и устанавливается список параметров. Параметры разделяются между собой запятой и содержат описание типов.
Общий вид описания процедуры:
Sub название_процедуры ([параметры]) операторы_процедуры End Sub
- название_процедуры — имя создаваемой вами процедуры Sub;
- параметры — необязательный список формальных параметров, используемых в процедуре Sub;
- операторы_процедуры — блок операторов, который выполняет работу процедуры.
Вызов процедуры типа Sub
Чтобы вызвать в программе процедуру, нужно указать имя этой процедуры, а затем список фактических параметров, требуемых для этой процедуры.
Общий вид вызова процедуры:
Имя_переменной = название_функции(фактические параметры)
Если в процедуру не передается ни одного аргумента, то требуется наличие пустых круглых скобок.
Передача параметров
При описании процедуры после имени в круглых скобках указывается список параметров с указанием их типов. Эти параметры называются формальными. Они определяют место подстановки фактических параметров.
При вызове процедуры или функции в списке указываются фактические параметры, значения которых должны быть заранее определены.
Параметры можно передавать по значению и по ссылке.
Каждая переменная имеет значение и уникальный адрес, соответствующий положению переменной в оперативной памяти компьютера.
Языки программирования позволяют передавать в процедуру как значение переменной (передача по значению), так и ее адрес в оперативной памяти (передача по ссылке).
При передаче по значению в процедуру передается только копия переменной, т.е. процедура не получает доступ к переменной в памяти и не может изменить ее значение. Для передачи параметров по значению в описании процедуры перед параметром в списке параметров указывают ключевое слово ByVal (от англ. by value – по значению).
При передаче переменной по ссылке процедуре передается ссылка на ее адрес в оперативной памяти, таким образом, процедура получает доступ к переменной в памяти и может ее изменить. Чтобы передавать переменную по ссылке, необходимо в описании процедуры перед соответствующим параметром в списке добавить ключевое слово ByRef (от англ. by reference – по ссылке).
При вызове процедур ключевые слова, определяющие способ передачи параметров и тип параметров, не указываются.
Проект «Передача по ссылке и по значению»
Задание.Создать проект, в котором описывается процедура, один параметр которой передается по ссылке, а другой – по значению. Значения параметров внутри процедуры изменяются. В вызывающей процедуре переменным присваиваются начальные значения, производится вызов процедуры с указанием переменных в качестве фактических параметров. После выполнения процедуры значения переменных выводятся на надписи.
- Разместить на форме:
- текстовые поля TextBox1 и TextBox2 для вывода начальных значений переменных;
- надписи Label1 и Label2 для вывода конечного значения переменных;
- кнопку button1 для создания процедуры-обработчика события;
- четыре надписи для вывода поясняющих текстов.
В программном коде процедуры первый параметр X передается по ссылке, а второй параметр Y передается по значению.
Создадим программный код проекта, в котором:
- объявим переменные;
- создадим процедуру, умножающую значение переменных, передаваемых по ссылке и по значению, на коэффициент 5;
- создадим обработчик, реализующих присваивание переменным начальных значений, вызов первой процедуры и осуществляющий вывод ключевых значений переменных на надписи.
Dim RefA, ValB As Byte Sub refVal(ByRef RefA, ByVal ValB) RefA = RefA * 5 ValB = ValB * 5 End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.Click RefA = Val(TextBox1.Text) ValB = Val(TextBox2.Text) refVal(RefA, ValB) Label1.Text = Str(RefA) Label2.Text = Str(ValB) End Sub
Подпрограмма типа Function
Функции являются подпрограммами, которые возвращают значения и поэтому могут использоваться в выражениях.
Наиболее широко используются встроенные функции: математические, преобразования типов данных, обработки строк, даты и времени и др.
Программист может создавать свои функции.
При описании функции ей дается уникальное название – имя функции и устанавливается список параметров, определяется тип возвращаемого значения. Параметры разделяются между собой запятой и содержат описание типов.
Общий вид описания функции:
Function название_функции ([параметры]) As тип операторы_функции [Return значение] End Function
- название_функции — имя создаваемой вами функции.
- As тип — пара ключевых слов, которые определяют тип возвращаемого функцией значения.
- параметры — необязательный список параметров, используемых в данной функции.
- операторы_функции — это блок операторов, который выполняет работу функции.
- Return — новый оператор Visual Basic .NET. Он позволяет указать, когда нужно выйти из функции, чтобы возвратить значение в вызывающую программу, и каково это возвращаемое значение.В качестве альтернативы можно использовать синтаксис Visual Basic 6 и возвращать значение в вызывающий код, присвоив значение имени функции.
Вызов подпрограммы типа Function
Для вызова функцию в программе, необходимо поместить в оператор программы имя этой функции и все требуемые для нее аргументы (фактические параметры).
Пример вызова функции в операторе присваивания:
Имя_переменной = название_функции(фактические параметры)
Проект «Функция»
Задание. Создать проект, в котором определяется функция (например, умножения двух чисел F = x*y), выводится на надпись значение функции.
- Разместить на форме:
- для вывода значений аргументов два текстовых поля TextBox1 и TextBox20;
- для вывода значений функции надпись label1;
- для создания обработчика события кнопку Button1.
Создать код вызываемой функции:
Function F(ByVal x, ByVal y) As Integer F = x * y End Function
Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.Click Dim x, y As Integer x = Val(TextBox1.Text) y = Val(TextBox2.Text) Label1.Text = Str(F(x, y)) End Sub
В этом уроке было показано применение процедур и функций для реализации вспомогательных алгоритмов. В следующем уроке поговорим о массивах
6.12.3. Подпрограммы в языке Basic
В языке Basic подпрограммы, обладающие значением (возвращающие единственное значение) также называются функциями. Кроме этого используются подпрограммы — процедуры, которые не возвращают значение, а выполняют последовательность операторов.
Определение функции в языке Basic возможно несколькими способами. Функция может быть определена с помощью оператора FUNCTION, имеющего следующий вид:
Более компактные функции можно описать с помощью оператора DEF FN, имеющего следующий вид:
Определение функции в этом случае должно размещаться на одной строке. Имя функции обычно состоит из одной буквы.
Пример определения функции:
DEF FNX(A) = A*B+C ‘Определение функции X(A) с одним
PRINT “Результат = ”; FNX(10) ‘Вызов функции с фактическим
При выполнении этого вызова функции получим сообщение:
С помощью оператора DEF FN кроме однострочных функций, называемых оператор-функция, есть возможность описать функции, состоящие из нескольких строк (однако эта возможность считается устаревшей).
Например, определение функции нахождения N! (N факториал), где N!=N*(N-1)*(N-2) *…*3*2*1:
Функции с именем Fact имеет один параметр –N и две локальные переменные T и I.
Определение процедуры имеет вид:
Особенности передачи параметров. Параметры в подпрограммах на языке Basic можно передавать по значению и по имени (по ссылке). Для передачи параметра по значению, при вызове подпрограммы параметр должен быть заключен в круглые скобки. Для передачи параметра по имени скобок не должно быть.
Опишем процедуру PRSUM с одним параметром X
Возможны два варианта вызова процедуры PRSUM:
Параметр в круглых скобках, т.е. передается по значению. После вызова процедуры PRSUM значение переменной y не изменится.
Параметр без круглых скобках, т.е. передается по имени. После вызова процедуры PRSUM значение переменной y увеличится на 10.
При вызове процедуры оператором CALL все параметры должны быть в скобках. Для передачи по значению фактический параметр должен быть в дополнительных круглых скобках.
Например, в вызове процедуры Pr, параметры X2 и X4 будут переданы по значению, а X1 и X3 – по имени.
При вызове функции также все параметры должны быть в скобках, поэтому параметры, передаваемые по значению, должны быть в дополнительных скобках.
Если параметром является массив, то необходимо после имени массива указать круглые скобки. Все массивы в языке Basic передаются только по имени, поэтому брать их в круглые скобки не нужно.
Область действия переменных. Переменные, описанные в подпрограмме, и ее формальные параметры являются локальными для данной подпрограммы, т.е. доступны только в этой подпрограмме. Их значения после завершения подпрограммы теряются. Справедливо и обратное: в подпрограмме недоступны переменные, описанные в главной программе.
Командой SHARED можно повторить описание переменных из главной программы и сделать их доступными в подпрограмме (переменные становятся доступными и для изменения, их измененные значения передаются в главную программу):
Кроме этого возможно использование глобальных переменных, доступных из всех подпрограмм. Их описание должно содержать ключевое слово COMMON:
Однако, предпочтительным считается обмен входными и выходными данными через параметры.
1. Составить определение и вызов функции подсчета суммы N первых элементов массива вещественных чисел.
Решение задачи на языке Turbo Pascal:
Type Massiv = array [1..100] of real;
Function Sum (M: Massiv, N: Integer): Real;