Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Параметры процедур и функцийПараметры служат для передачи в процедуры и функции исходных данных и для приёма результатов. В зависимости от назначения они описываются в заголовке подпрограммы тремя основными способами: Первый способ предполагает указание списка параметров и их типа, например: 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.
|