Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

ПРОЦЕДУРЫ. СПОСОБЫ ПЕРЕДАЧИ ПАРАМЕТРОВ




Если функции используются в том случае, когда в основную программу должна быть возвращена скалярная величина, то процедуры удобнее использовать в следующих случаях:

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

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

- если в основную программу ничего не должно возвращаться.

Описание процедур имеет следующий вид:

Procedure <имя процедуры> [(<список формальных параметров>)];

<описательная часть>

begin

<тело процедуры>

end;

Обращение к процедуре производится по следующей схеме:

<имя процедуры> [(<фактические параметры>)];

Вызов процедуры осуществляется отдельной командой, то есть вызов внутри операторов присваивания и вывода недопустим.

 

И в процедурах, и в функциях формальные параметры делятся на два типа:

1) параметры, передаваемые по значению,

2) параметры, передаваемые по ссылке.

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

 

Описание параметров, передаваемых по ссылке (параметры-переменные):

Var <список переменных>:<тип>;

Описание параметров, передаваемых по значению (параметры-значения):

<список переменных>:<тип>;

 

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

 

Рассмотрим отличие этих двух способов.

1) Параметры-переменные. При передаче параметров по ссылке (это формальный параметр, перед которым стоит служебное слово Var) изменения формального параметра внутри процедуры приводят к аналогичному изменению фактического параметра. То есть формальный и фактический параметр являются именем одной и той же ячейки памяти (передается адрес фактического параметра, который должен быть обязательно переменной!):

Пример.

Program a;

Var b,c:integer;

 

Procedure Q(Var x,y:integer);

Begin

X:=5;

Y:=10

End;

 

Begin

B:=1; c:=2;

Q(b,c);

Write(b,c)

End.

После выполнения процедуры осуществляется возврат на оператор основной программы, который следует за вызовом процедуры.

При выполнении данной программы на экран будет выведено 5 и 10.

 

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

Пример.

Program a;

Var b,c:integer;

Procedure Q(X,Y:integer);

Begin

X:=5;

Y:=10

End;

 

Begin

B:=1; c:=2;

Q(b,c);

Write(b,c)

End.

При выполнении данной программы на экран будет выведено 1 и 2.

 

Обычно параметры-значения используются для передачи в подпрограмму исходных данных, а параметры-переменные – для возврата результата.

Запишем с использованием процедуры программу вычисления площади четырёхугольника:

 

Program geron;

Var a,b,c,d,e,s1,s2:real;

 

Procedure Square(x,y,z:real; Var s:real);

Var p:real;

Begin

p:=(x+y+z)/2;

S:=sqrt(p*(p-x)*(p-y)*(p-z))

End;

 

Begin

Readln(a,b,c,d,e);

Square(a,b,e,S1);

Square(c,d,e,S2);

Writeln(‘S=’,S1+S2)

End.

 

В качестве параметров-значений можно передавать и переменные, и константы. В качестве параметров-переменных – только переменные. Например, будет ошибочной запись:

Square(5,6,8,10).

 

Задача 1. Написать программу, запрашивающую 5 целых чисел (N<=999999) и выводящих в текстовый файл все цифры этих чисел через запятую в обратном порядке.

Program number;

Var a:longint;

i:byte;

f:text;

 

procedure cifra(x:longint);

var k:byte;

begin

while x<>0 do

begin

k:=x mod 10;

write(f,k,’,’);

x:=x div 10

end;

writeln(f)

end;

 

Begin

assign(f,’f.dat’);

rewrite(f);

for i:=1 to 5 do

begin

read(a);

cifra(a)

end;

close(f)

End.

 

Задача 2. Что получится в результате работы программы:

 

Program example;

Var a,b,c:integer;

 

Procedure One(x,y:integer; Var z:integer);

Begin

X:=y+2; y:=z*3; z:=5;

Write(x,y,z)

End;

 

Procedure Two(x:integer; var z,y:integer);

Begin

X:=y+z; y:=y+10;

Write(x,y,z)

End;

 

Begin

A:=1; b:=2; c:=3;

Two(b,a,c); write(b,a,c);

One(a,b,c); write(a,b,c)

End.

 

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

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

 







Дата добавления: 2015-08-12; просмотров: 60. Нарушение авторских прав

Studopedia.info - Студопедия - 2014-2017 год . (0.007 сек.) русская версия | украинская версия