Массивы и строки открытого типа
Лекция 18-19 Процедуры и функции 1. Процедура 3.1. Параметры-значения 4. Процедура EXIT Рекурсивные процедуры и функции
В языке Паскаль имеется две разновидности подпрограмм: - процедуры - функции. Структура любой подпрограммы аналогична структуре всей программы. Подпрограмма должна быть описана до того, как она будет использована в программе или другой подпрограмме. Все параметры, которые использует подпрограмма, можно разбить на две категории: -локальные параметры, объявленные внутри подпрограммы и доступные только ей самой, -глобальные - объявленные в основной программе и доступные как программе, так и всем ее подпрограммам. Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных параметров. Подпрограмма может использовать глобальные параметры двояким образом: -непосредственно обращаясь к глобальному параметру по его имени -используя механизм формальных параметров. Подпрограмма может непосредственно использовать любые глобальные параметры за исключением тех, которые имеют те же имена, что и ее локальные параметры. Процедура Подпрограмма-процедура предназначена для выполнения какой-то законченной последовательности действий. Любая процедура начинается с заголовка. В отличие от основной программы заголовок в процедуре обязателен. Он состоит из зарезервированного слова procedure, за которым следует идентификатор имени процедуры, а далее в круглых скобках - список формальных параметров:
procedure <имя процедуры>(<список формальных параметров>); За заголовком могут идти такие же разделы, что и в основной программе. В отличие от основной программы процедура завершается не точкой, а точкой с запятой. Пример. Процедура ввода N целых чисел. Пусть в основной программе определен тип: type tArr = array[1..100] of Integer; Процедура может иметь вид:
Для вызова процедуры из основной программы или другой подпрограммы следует записать оператор, состоящий из имени процедуры и списка фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами процедуры. Например: InpInt(M, К); означает, что вызывается процедура Inplnt для ввода К целых чисел в массив М. Естественно, что в этом случае параметр К целого типа, а М - массив типа tArr. Функция Подпрограмма-функция предназначена для вычисления какого-либо параметра. У этой подпрограммы два основных отличия от процедуры: А) Первое отличие функции в ее заголовке. Он состоит из слова function, за которым следует имя функции, далее в круглых скобках - список формальных параметров, затем через двоеточие записывается тип функции - тип возвращаемого параметра. Функция может возвращать параметры следующих типов: -любого порядкового, -любого вещественного, -стандартного типа string, -любого указателя, в том числе и типа PChar. Б) Второе отличие заключается в том, что в теле функции хотя бы раз имени функции должно быть присвоено значение. Пример. Функция вычисления факториала числа N. function Factorial(N: Byte): Longint;
Если имя функции внутри ее описания используется не в левой части оператора присваивания, то это означает, что функция вызывает себя рекурсивно. Для вызова функции из основной программы или другой подпрограммы следует в выражении, где необходимо использовать значение функции, указать имя функции со списком фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами функции, например: Part:=Sqr(T)/Faktorial(i); В этом операторе: Sqr(T) - вызов стандартной функции возведения в квадрат с фактическим параметром Т; Faktorial(i) - вызов функции, вычисляющей факториал с фактическим параметром i. Формальные и фактические параметры Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории. Все формальные параметры можно разбить на четыре категории: · параметры-значения (эти параметры в основной программе подпрограммой не меняются); · параметры-переменные (эти параметры подпрограмма может изменить в основной программе); · параметры-константы (используются только в версии 7.0); · параметры-процедуры и параметры-функции (т. е. процедурного типа). Для каждого формального параметра следует указать имя и, как правило, тип, а в случае параметра-переменной или параметра-константы - его категорию. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип. Например, нельзя писать function Max(A: array[1..100] of Real): Real; Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке: type tArr = array[1..100] of Real;
function Max(A: tArr): Real; При обращении к подпрограмме формальные параметры заменяются на соответствующие фактические вызывающей программы или подпрограммы. Параметры-значения Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий и, следовательно, собственный параметр программы подпрограммой измениться не может. Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие - типом. Тип параметра-значения может быть любым за исключением файлового. Если параметров-значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать общий тип. Пример. procedure Inp(Max, Min: Real; N: Word); Пример. Функция вычисления максимального элемента в массиве. Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа type Функция в этом случае может иметь вид: function Max(Mas: tArr; N: Byte): Integer; Параметры-переменные При передаче параметров-переменных в подпрограмму фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять. Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var. Действие слова var распространяется до ближайшей точки с запятой, т. е. в пределах одной группы. Пример. procedure MaxMin(A: tArr; var Max, Min: Real; N: Word); Здесь Max, Min - параметры-переменные, А и N - параметры значения. Тип параметров-переменных может быть любым, включая и файловый. Параметры-константы Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить.
Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, не предусматривается защита от его изменения. Использовать параметр-константу можно только в версии 7.0. Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т. е. в пределах одной группы. Пример. function NewString(const S: string): string; Тип параметра-значения может быть любым за исключением файлового.
Параметры без типа В Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста. Пример. function Equal(var Paraml, Param2; Len: Word): Boolean; Здесь Param1, Param2 - параметры-переменные без типа; Len - параметр-значение. Следует иметь в виду, что параметр без типа внутри подпрограммы типа не имеет и его перед использованием следует преобразовать к конкретному типу, применяя идентификатор соответствующего типа. В этом случае в качестве первого передаваемого параметра можно использовать любой массив (и не только массив), так что подпрограмма становится более универсальной.
Массивы и строки открытого типа В версии 7.0 можно в качестве параметров-переменных использовать массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра в этом случае можно использовать массив или строку любого размера, однако массив должен состоять из тех же компонент, что и компоненты j открытого массива. Такие параметры введены для того, чтобы подпрограмма могла обрабатывать массив или строку любого размера. Фактический размер массива в этом случае может быть определен с помощью функции High (высота). Открытый массив задается как и обычный массив, но только без указания типа индекса. Следует иметь в виду, что индексация элементов открытого массива всегда начинается с нуля, а максимальный индекс элемента равен значению функции High.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|