Разработка и реализация программ с использованием процедур и функций, страница 4

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

В языке Turbo Pascal имеется директива $M, которая, в частности, служит для задания размера стека. Пример: {$M 1024, 0, 0}

Для контроля переполнения стека перед вызовом каждой подпрограммы используется директива {$S+}. Если задана директива {$S-}, то состояние стека не проверяется.

В языке Turbo Pascal 7.0 поддерживаются две модели вызова процедур и функций – ближняя near и дальняя far. Процедуры, которые созданы с использованием модели near, являются более быстрыми (эффективными), но применение этой модели налагает некоторые ограничения - процедуры типа near могут быть вызваны только из модуля, где они описаны. Процедуры типа far, могут быть вызваны из любого места программы. Недостатком процедур типа far является их медленность.

Задание 6.1. Вычислить значения переменных Х, У после выполнения фрагмета программы.

Фргмент программы.

var A, X, Y:real;

procedyre D(var X, Y:real);

begin

X:=2*X; Y:=A*X+1;

end;

begin

A:=N-10; X:=3; Y:=2;

D(A, Y); Y:=A*X+Y;

end.

Математическая запись.

X→A, Y→Y. A=9, X=3, Y=2.

A=2*A=18. Y=18*9+1=163; Y=18*3+163=217.

Результат. X=3,

Y=217.

Задание 6.2. Оформить задание 3.3 в виде процедуры и функции.

uses crt;

var x,e,e1,el,znam,sum1,sum2,sum3:real;

    i,n,k2,k3:integer;

procedure summa1(el,znam:real);

begin

 znam:=znam*i;

 el:=el*x/znam;

 sum1:=sum1-el;

end;

function summa2(el,znam:real):real;

begin

znam:=znam*i;

 el:=el*x/znam;

 if abs(el)>e then

  begin

  sum2:=sum2-el;

  k2:=k2+1;