Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по TURBO PASCAL.doc
Скачиваний:
18
Добавлен:
04.11.2018
Размер:
1.13 Mб
Скачать
    1. Результаты процедуры

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

Чтобы оформить переменную-результат, надо в заголовке процедуры перед описанием переменной-результата приписать слово var. Вот пример полной программы с процедурой Summa, у которой два аргумента и один результат.

Program Procedure_with_arguments_and_result;

Var p, q, r : integer;

Procedure Summa (a, b : integer; var s : integer);

begin

s := a + b;

end;

begin

write (’Введите два числа: ’);

readln (p, q);

Summa (p, q, r ); { p,q - аргументы, r - результат }

Writeln (’Сумма введённых чисел: ’, r);

end.

При вызове процедуры переменные a,b внутри процедуры примут те же значения, что и переменные p,q в основной программе. По окончании работы в глобальную переменную r запишется то число, которое будет в переменной s (результате) процедуры.

Попробуйте ответить на вопрос: почему при вызове процедуры в качестве аргументов можно указывать конкретные числа, а в качестве результатов –­ нет?

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

Вот ещё один пример, который запрашивает координаты концов отрезка и находит координату точки, которая делит этот отрезок в отношении 1:3. Здесь используется процедура Seredina для нахождения середины отрезка, по заданным координатам его концов.

program Geometry;

var ax, ay, bx, by : integer;

cx, cy, dx, dy : real;

Procedure Seredina (x1, y1, x2, y2 : integer;

var x, y : real);

begin

x := (x1+x2) / 2;

y := (y1+y2) / 2;

end;

begin

write (’Введите координаты концов отрезка: ’);

readln (ax, ay, bx, by);

Seredina (ax, ay, bx, by, cx, cy);

{ точка (cx,cy) - середина отрезка ab }

Seredina (bx, by, cx, cy, dx, dy);

{ точка (dx,dy) - середина отрезка bc }

Writeln (’Точка (’, dx, ’, ’, dy,

’) делит отрезок в отношении 1:3’);

End.

Так как процедуры могут возвращать результаты в виде переменных, то отпадает необходимость выводить их на экран внутри процедуры. Мало того, это опасно делать, так как если ваша процедура будет вызываться много раз подряд, то представьте, сколько ненужных промежуточных данных будет выведено на экран!

Запомните: подпрограммы должны только вычислять, и ничего лишнего не выводить на экран!!!

    1. Функции

Другой вид подпрограммы – функция оформляется, в таком виде:

Function <имя> (<параметры>): <тип>;

... ... { секция описаний функции }

Begin

... { раздел операторов }

End;

Отличительные особенности функции:

  1. функция имеет только один результат (но может иметь несколько входных параметров – аргументов);

  2. вызывать функции можно только из выражений;

  3. результат обозначается именем функции и передаётся в вызываемое место.

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

Пример описания функции:

Function min (a, b : integer) : integer;

Begin

If a > b

then min := a

else min := b

end;

Функция находит меньшее из двух целых чисел. Здесь min - имя функции, оно же является одновременно и результатом этой функции – целое число. Формальными параметрами (аргументами функции) являются переменные целого типа a и b. Вызывается функция по своему имени с указанием фактических параметров. При этом вызов функции нужно делать непосредственно внутри выражения, например:

y := min(x,y) + min(k,l);

Нужно иметь ввиду, что при оформлении функции её результату (то есть её имени) можно только присваивать значения и нельзя его использовать как переменную, так как в этом случае компьютер подумает, что вы хотите этой записью снова вызвать функцию!

Например:

Function SummaCifr (a : integer) : integer;

Begin

SummaCifr := a mod 10;

SummaCifr := SummaCifr + a div 10; { Ошибка! }

end;

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

Function SummaCifr (a : integer) : integer;

var c : integer;

Begin

c := a mod 10;

c := c + a div 10;

SummaCifr := c;

end;