Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Параметры процедур и функций
Параметры служат для передачи в процедуры и функции исходных данных и для приёма результатов. В зависимости от назначения они описываются в заголовке подпрограммы тремя основными способами: Первый способ предполагает указание списка параметров и их типа, например: Procedure MyProc (a,b,c: Integer; d: Real); Function MyFunc (a,b,c: Integer; d: Real):Real; В этом случае в процедуру и функцию передаются значения фактических параметров, указанных при вызове подпрограммы. Такие параметры называются параметрами-значениями. Формальный параметр является переменной, локальной в блоке. Если параметр определен как параметр–значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Изменение значения формальных параметров внутри процедуры или функции не приводит к изменению фактических. Фактический параметр может быть выражением того же типа, что и соответствующий ему формальный параметр. Второй способ. Фактические параметры передаются в процедуру или функцию по ссылке. В этом случае перед списком параметров располагается слово var, например: Procedure MyProc(var a,b,c: Integer; d: Real); Function MyFunc(var a,b,c: Integer; d: Real):Real; Когда параметр передается посредством ссылки, фактический параметр является переменной. Формальный параметр обозначает эту фактическую переменную в течение всего времени активизации блока. Параметры, переданные посредством ссылки, называются параметрами-переменными. Если параметр определен как параметр–переменная, то при вызове подпрограммы передается сама переменная, а не её копия (фактически в этом случае подпрограмме передается адрес переменной). Их характерный признак – любое изменение формального параметра означает изменение фактического параметра. В параметры, передаваемые по ссылке, помещаются результаты работы программы. Третий способ описания основан на использовании параметров – констант, которые задаются с использованием слова const: Procedure MyProc(const a,b,c: Integer; d: Real); Function MyFunc(const a,b,c: Integer; d:Real):Real; В этом случае используется механизм передачи параметров по ссылке, но внутри подпрограммы формальные параметры изменять нельзя. Это означает, что в случае параметра–константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру–константе нового значения в теле подпрограммы. Этот способ используется для передачи в подпрограмму данных большого объема.
Возможен смешанный вариант, когда указываются и посылаемые в подпрограмму данные, и возвращаются результаты, например: Procedure MyProc(a,b,c: Integer; var d: Real); Function MyFunc(a,b,c:Integer; var d:Real):Real;
Нетипизированные параметры–переменные. Существует разновидность ссылочных параметров без типа. Они называются нетипизированными и предназначены для передачи и приёма данных любого типа. Параметр считается нетипизированным, если тип формального параметра–переменной в заголовке подпрограммы не указан, при этом соответствующий ему фактический параметр может быть переменной любого типа. Нетипизированными могут быть только параметры–переменные. Нетипизированные параметры описываются с помощью ключевых слов var и const, при этом тип данных опускается: Procedure MyProc(const y; var x); Function MyFunc(const y; var x):Real; Внутри подпрограммы тип таких параметров неизвестен, поэтому программист должен сам позаботиться о правильной интерпретации переданных данных. В остальном это обычные параметры, передаваемые по ссылке. Параметры–массивы. Для передачи массива фиксированной длины в подпрограмму необходимо предварительно описать его тип. Пример: Type MasType= array [1..10] of Integer; Procedure S (mas:MasType); При передаче подпрограмме массивов переменной длины используются так называемые открытые массивы. Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не определяющий его размерности и границы: Procedure MyProc(OpenArray: array of Integer); Внутри подпрограммы такой параметр трактуется как одномерный массив с нулевой нижней границей. Верхняя граница открытого массива возвращается функцией High. Используя нуль как минимальный индекс и значение, возвращаемое функцией High, как максимальный индекс, подпрограмма может обрабатывать одномерные массивы произвольной длины. Пример. Программа вывода на экран содержимого двух одномерных массивов различной длины.
Program DemoMass; Const A: array[-1..2] of Integer=(0,1,2,3); B: array[5..7] of Integer=(4,5,6); {Процедура обработки открытого массива} Procedure ArrayPrint(Mas:array of Integer); Var i:Integer; Begin For i:=0 to High(Mas) do Write(Mas[i]:8); Writeln; End; Begin {основная программа} ArrayPrint(A); ArrayPrint(B); End. Параметры–строки. Поскольку строка фиксированной длины является фактически своеобразным массивом, её передача в подпрограмму осуществляется аналогичным образом: Пример: Type InType= String [15]; OutType= String [30]; Function St (s:InType):OutType; Для передачи строк произвольной длины можно установить режим компиляции, при котором отключается контроль за совпадением длины фактического и формального параметра–строки. При передаче строки меньшего размера формальный параметр будет иметь ту же длину, что и параметр обращения; передача строки большего размера приведет к её усечению до максимального размера формального параметра. Контроль включается только при передаче строки, объявленной как формальный параметр–переменная. Если соответствующий параметр объявлен параметром–значением, эта опция игнорируется и длина не контролируется. Процедурные типы. Параметры–функции и параметры–процедуры. Процедурные типы позволяют передавать имена процедур и функций в подпрограммы в качестве параметров. Для объявления процедурного типа используется заголовок процедуры (функции), в котором отсутствует ее имя: Type Proc1= Procedure (a,b,c:Real; var d:Real); Proc2= Procedure; Func1= Function (var a:Integer):real; Существуют два процедурных типа: тип-процедура и тип-функция. При передачи имен процедур и функций в качестве параметров, эти подпрограммы должны быть откомпилированы с расчетом на дальнюю модель памяти, т.е. сразу за заголовком процедуры или функции должна быть использована директива компилятора Far. Пример. Вычислить значения функций: f 1=sin(x)+sin(2 x); f 2=cos(x)+cos(2 x). Program DemoProc; Type Func= Function (x:Real):Real; Function sin1(x:Real):Real; far; Begin Sin1:=sin(x); End; Function cos1(x:Real):Real; far; Begin Cos1:=cos(x); End; Procedure Fn(x:Real; f:Func); Var p:Real; Begin p:=f(x)+f(2*x); Writeln ('Значение функции =',p:8:3); End; Begin {основная программа} Clrscr; Fn(3,sin1); Fn(5,cos1); End. В программе могут быть объявлены переменные процедурных типов: Var P1:Proc1; F1:Func1; Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы, например: Program DemoProc1; Type Func= Function (x:Real):Real; Var F1:Func; Function sin1(x:Real):Real; far; Begin Sin1:=sin(x); End; Procedure Fn(x:Real; f:Func); Var p:Real; Begin p:=f(x)+f(2*x); Writeln ('Значение функции =',p:8:3); End; Begin {основная программа} Clrscr; F1:=Sin1; Fn(3,F1); End.
|
||||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 298; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.79.70 (0.013 с.) |