Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sitkin_Informatika_Programmirovanie_v_DELPHI.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
600.56 Кб
Скачать

Механизмработыподпрограммыиобменапараметрами

Самопосебеописаниеподпрограммыникакихдействийнепроизводит, а формальные параметры не имеют значений. Чтобы вос-пользоваться подпрограммой, её нужно вызвать, задав конкретные,фактическиезначенияпараметров.Вызовподпрограммыимеетвид

имя_функции(фактическиепараметры) илиимя_процедуры(фактическиепараметры);

При вызове подпрограммы значения фактических параметров заме-няют формальные параметры в описании подпрограммы, и для фак-тическихпараметроввыполняютсядействия,которыебылиописаны

дляформальныхпараметров.Важнозапомнить:спискифактическихи формальных параметров должны быть согласованы между собой почислу, порядкуследованияитипузначений.

Параметры подпрограмм можно разделить на входные, которыепередают значения в подпрограмму и выходные, которые передаютрезультаты её работы обратно в вызывающий блок. Входные пара-метрыэто параметры-значения. По умолчанию все параметрыпа-раметры-значения.Онипередаютзначениявподпрограмму,могуттам изменяться, но обратно в вызывающий блок изменения не пере-даются. Выходные параметрыэто параметры-переменные. Они мо-гут передавать значения в подпрограмму, могут там изменяться и мо-гут передавать изменения обратно в вызывающий блок. Перед соот-ветствующимформальнымпараметромвзаголовкеподпрограммынужно поставитьсловоvar,например,

procedureMy_Procedure(x,y:real;varz:real);

здесьxиyпараметры-значения,аzпараметр-переменная,или

procedureMy_Procedure(varx,y:real;z:real);

здесьужеxиyпараметры-переменные,аzпараметр-значение.

Посколькупараметр-переменнаяспособенпередаватьзначенияв обе стороны, возникает соблазн во избежание путаницы «что кудапередаёт»всеформальные параметры сделатьтаковыми

procedureMy_Procedure(varx,y,z:real);

но параметр-переменная (в отличие от параметра-значения) не можетпередать в подпрограмму выражение или константу, а только отдель-ную переменную. Кроме того, передавая значение в подпрограммучерез параметр-переменную, и возвращая значение обратно через не-гоже,следует помнить,чтостароезначениебудетпотеряно.

Функция возвращает значение в вызывающий блок через своёимя, поэтому в описании функции параметры-переменные не вводят(исключения составляют случаи, когда функция должна вернуть бо-лее одного значения, т.к. к её имени можно привязать только одно).Имя процедуры не является носителем значения, поэтому, если про-цедура должны вернуть в вызывающий блок значение, то вводят па-раметр-переменную, если должна вернуть два значения, то вводят двапараметра-переменныхит.д.Такжезначениеввызывающийблокможновернутьизподпрограммычерезглобальнуюпеременную.

Пример3.1

Разработаемпроектыдлявычислениязначениявыражения

za

x25

  • a2

y25

(y2)25

,

гдеxиyпеременные,aконстанта с использованием подпрограмм.Ввыражениивидныповторяющиеся действия,выполняемые вдробях:впервойдробинадпеременнойx,вовторойнадперемен-нойyивтретьейнадвыражениемy2.Чтобымногократнонепро-писыватьвпрограммномкодеодниитежедействия,нодляразныхвеличин,целесообразноразработатьподпрограмму.Онабудетвы-полнятьтиповоедляданноговыражениядействие,аименновычис-

лятьзначениедробивида(t2+5)/( +5),гдеtнекоторыйформаль-

ный (абстрактный) параметр, который показывает, что должно бытьвыполнено над подставленным в подпрограмму реальным, т.е. факти-ческим параметром. Трижды вызвав подпрограмму с фактическимипараметрамиx,затемy,затемy2,вычислимзначения трёхдробей.

Нарис.3.1и3.2представленыблок-схемыалгоритмоввыпол-нениятиповогодействияиосновноговычислениясоответственно.

Рис.3.1 Рис.3.2

Реализуем разработанные алгоритмы в проекте. Форму с компо-нентами и событие, связанное с расчётом, оставим теми же, как и впредыдущей работе. Оформим нашу пользовательскую подпрограммусначалакакфункцию,прописавеёвмодулепроектапослесловаimplementation, но до процедуры обработки события. А в этой про-цедуре процессы вычисления трёх дробей опишем не как в предыду-щейработе,атриждывызвавфункцию.Назовемеё,например,

«drob». Значение дроби, которое будет вычислять функция, относитсяк вещественному типу, как и формальный параметрt, поэтому в заго-ловке функции укажем вещественный тип дляtи для значения, выра-батываемогофункцией(вконцезаголовка),например,«real».

implementation

{$R*.dfm}

functiondrob(t:real):real;//заголовокпользовательскойфункции

constc=5;//объявлениелокальнойконстанты

vart1,t2:real;//объявлениелокальныхпеременных

begin //начало раздела операторов пользовательской функцииt1:=sqr(t)+c; //промежуточные расчёты внутри функцииt2:=sqrt(abs(t))+c; //промежуточные расчёты внутри функцииdrob:=t1/t2;//присвоениеименифункциизначения(результата)

end;//конецпользовательскойфункции

procedureTForm1.Button1Click(Sender:TObject);

consta=3;

varx,y,z,z1,z2,z3:real;

begin

x:=StrToFloat(Edit1.Text);//считываниезначенияxизEdit1y:=StrToFloat(Edit2.Text);//считываниезначенияyизEdit2z1:=drob(x);//вызовыфункциии

z2:=drob(y); //присвоение её значенийz3:=drob(y-2); //промежуточнымпеременнымz:=a*z1+sqr(a)*z2+z3;//итоговыевычисления

Label3.Caption:='z='+FloatToStr(z);//выводзначенияzвLabel3

end;//конецпроцедурыобработкисобытия

end.//конецмодуляпроекта

Имя функцииноситель значения, в данном случае это число. Умно-жить одно число на другое или сложить их допустимо, поэтому мож-но былосразузаписать z:=a*drob(x)+sqr(a)*drob(y)+drob(y-2);.

Оформимтеперьнашуподпрограммукакпроцедуру.

implementation

{$R*.dfm}

proceduredrob(t:real;vard:real);//добавленпараметр-переменнаяd

constc=5;vart1, t2:real;begin

t1:=sqr(t)+c;t2:=sqrt(abs(t))+c;

d:=t1/t2;//результатприсваиваетсятеперьпараметру-переменнойd

end;

procedureTForm1.Button1Click(Sender:TObject);

consta=3;

varx,y,z,z1,z2,z3:real;

begin

x:=StrToFloat(Edit1.Text);y:=StrToFloat(Edit2.Text);

drob(x, z1);//вызовы процедуры отдельными операторамиdrob(y, z2);//без операторов присвоения, т.к. имя процедурыdrob(y-2, z3); //не несёт в себе значения (в данном случае числа)z:=a*z1+sqr(a)*z2+z3;

Label3.Caption:='z='+FloatToStr(z);

end;end.

Отметим отличия в описаниях, все они вытекают из главногоотличия процедуры от функции: с именем процедуры не связываетсязначение, её имя не является носителем значения. Во-первых, в заго-ловкенашейподпрограммынеуказантипзначения,вырабатываемого

процедурой. Введён второй формальный параметрdкак параметр-переменная (перед ним стоитvar) для передачи результатов работыпроцедуры в вызывающий блок, т.к. через имя процедуры его не пе-редать (результат присвоен параметруd, а неdrob). Во-вторых, вызовdrobосуществляется отдельным оператором без присвоений значенийпромежуточным переменным. Фактических параметров стало два, какстало и формальных. Теперь результат работы подпрограммы (число)содержится не в имениdrob(как было с функцией), а в параметреzi.Записьвида«z:=a*drob(x,z1)+sqr(a)*drob(y,z2)+drob(y-2,z3);»или

«z1:=drob(x);»теперьбудутошибками.