Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по Pascal с задачами NEWXP.doc
Скачиваний:
0
Добавлен:
03.01.2020
Размер:
461.82 Кб
Скачать

§ 33 Процедуры с параметрами-переменными

Часто в при написании процедур возникает необходимость передать некоторые результаты во ВНЕ, например, в основную программу. В этом случае используют процедуры с параметрами-переменными. Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после слова VAR.

Описание процедуры с параметрами-переменными начинается с такого заголовка:

P rocedure (список параметров-значений; VAR список параметров-переменных);

Var

Описание локальных переменных

Begin

……………

………………

End;

Например,

Procedure EXAM(m,n:INTEGER;VAR y:Real);

Procedure XAM(VAR y,t:Real);

Procedure AM(VAR y:Real; L:Integer);

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

П ример.

PROCEDURE Line(a,b:Real;VAR c:real);

Begin

C:=a/b;

End;

В основной программе должны быть описаны переменные:

Var T,A:Real;

И вызов процедуры может быть таким:

Line(5,3,T);

Line(4+2,7,А);

Line(T,A,T);

Можно вызывать Line (5+A,6+B,T);

Н ЕЛЬЗЯ: Line(5,6,A+B);

Запомните!!! При передаче информации в процедуру в качестве параметра-значения может быть любое выражение. В качестве параметра-переменной может быть только переменная.

Задача. Треугольник задан координатами своих вершин. Определить сумму длин его сторон. Вычисление длины стороны оформить процедурой.

Что передавать в процедуру? - координаты двух точек (4 числа).

Что передавать в программу? - длину стороны (1 число).

VAR

X1,X2,X3,Y1,Y2,Y3:REAL;

way,way1,way2:real;

PROCEDURE RASS(X_ONE,Y_ONE,X_TWO,Y_TWO:REAL;VAR R:REAL);

BEGIN

R:=SQRT(SQR(X_ONE-X_TWO)+SQR(Y_ONE-Y_TWO));

END;

begin

readln (x1,y1,x2,y2,x3,y3);

rass(x1,y1,x2,y2,way);

rass(x2,y2,x3,y3,way1);

rass(x1,y1,x3,y3,way2);

write(way+way1+way2);

end.

Задание § 33

Написать программу, определяющую является ли слово полиндромом. Программа должна включать две процедуры:

одна из которых удаляет из строк пробелы, а вторая записывает строку в обратном порядке.

§ 33 Функции, определенные пользователем

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

Имя выходного параметра это ИМЯ функции, поэтому необходимо указать его тип.

Описание функции :

Function <ИМЯ> (...;...):<тип>;

begin

.........

<ИМЯ>:=< выражение>;

end;

Вызов функции осуществляется по имени и только в выражениях.

Задача. Вычислить выражение, определив вычисление факториала с помощью функции.

max(a,c)+max(b,c)

------------------

max(a,c)

Решение.

VAR a,b,c:real;

function max(a,b:real):real;

begin

if a>b then max:=a else max:=b;

end;

BEGIN

readln (a,b,c);

writeln((max(a,c)+max(b,c))/max(a,c));

END.

Предупреждение!!! Избегайте рекурсий, т.е. вызова в теле функции самой себя. Они могут "завесить" программу.

Например, нельзя записать в нашей функции max write (max);

Или для функции убирающей из строки пробелы нельзя так:

function delspace(in:string):string;

var i:integer;

delspace:='' ;

for i:=1 to length(in) do

if in[i] <> ' ' then delspace:=delspace+in[i];!!!

end;

Как этого избежать? Завести новую переменную.

В языке мы уже встречались со стандартными функциями:

ABS(X), SQR(X),SIN(X),RANDOM(X),…,

Функциями для построения графических изображений, функциями работы со строками,…

Задания к § 33

1.Треугольник задан координатами своих вершин. Определить сумму длин его сторон. Вычисление длины стороны оформить в виде функции.

2. Написать функцию для вычисления факториала и вычислить

a!в!

-------

(а+в)!