Файл: Соловейчик, Р. Э. Программирование на АЛГОЛ-60 учеб. пособие.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.10.2024

Просмотров: 102

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

76

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

ред словом procedure

должно стоять описание типа той пере­

менной, которую она представляет, т.е.

:1-DtaS—

или

Boolean

. Например,

разобранную выше процедуру нахож­

дения большего корня квадратного уравнения можно оформить

в виде процедуры-функции

 

 

 

 

real

procedure

root

(а,Ъ,с)

real

а,Ъ,с ;

 

rooti

= (-Ъ +

sqrt

(ът 2 ~ 4

* a

X c)) (2 * a)

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

Если требуется найти больший корень уравнения Зх^-5х-12= =0, затем прибавить его к величине theta , все это возвы­ сить в квадрат и присвоить в качестве нового значения пере­ менной у , то этого можно добиться , написав

yi = (theta * root (3, -5,.-Х?))1'з ;

В качестве еще одного примера вернемся к рассмотрению вычис­ ления интеграча

Т

dx

I +

х

о

 

по формуле Симпсона и напомним, что основным дефектом состав­ ленной программы являлось неоднократное написание вычислений значений подынтегральной Функции, особенно'неприятное в слу­ чае ее громоздкости.

В тассматрпваеыом примере вычисление подынтегрально!!

ФУНКЦИИ

I

1 ♦ X•1 б


77

можно оформить посредством следующей процедуры-функции:

real procedure F (х) j

Ps = 1 /(1 4.х tl6 ) f

и тогда полная программа, реализующая вычисление интеграла j0 , будет для улучшенного варианте следующей :

begin real

 

а,Ъ,п,вип, h, x, Jo ;

 

real procedure

 

F (x)

;

^

? ! » 1 / ( H xf К ) I

 

ВВОД

(a,b,n

)

t

 

 

 

h 1 » (b - a) / n f

 

 

sum 1 a 0 .0 ;

 

 

 

 

 

for

is

* a atep

2 *

h

until Ъ - 2

x h do

sum j

so*

F(x)

*

4 x F(x * h)4

РСх+г"!!) {

Jo:=

h/3 * auB

;

 

 

 

печать

(Jo)

 

 

 

 

 

end

 

 

 

 

 

 

 

Обращение с подстановкой наименования и

 

 

значения

 

 

 

 

Приведем еще один пример процедуры и на нем познакомим-

ся с некоторыми довольно

тонкими особенностями языка АЛГ0Д-60.

 

Рассмотрим процедуру, которая выполняет суммирование об­

щего вида

I

«

 

 

 

а а

 

 

 

 

1 яИ

 

 

 

где

подразумевается,

что функция £

, подлежащая суммирова­

нию,

зависит от индекса суммирования

i . Црисвоим этой

процедуре наименование вив

и напишем ее 'следующим образом:


 

 

 

78 —

procedure

sum ( 8 ,i,m,n,f ) }

begin s

: =

0 ;

 

for 1

j =

a step 1 _ until n do

8

t =» в

f

end

 

 

 

Предположим, что мы хотим использовать эту процедуру для вы­

числения суммы 1 fn_1 \

i=n- 1

Это может быть сделано с помощью обращения к цроцедуре sum (h,l,n-l, n *(и-1 )-г 2 , 1 1 3) ,

в результате которого тело процедуры примет вид begin h I а О ;

for ii

*

n-1 , step 1 until n * (n -1 )+ 2 do

h i =

h +

if 3

end

Так как в операторе цикла допускается возможность изменения • выражения, стоящего после QPtil ^ t в цроцессе вычисле­

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

vslue

, а

за ним располагаются названия тех параметров,

вместо которых

подставляются соответствующие значения. Тог­

да для рассматриваемого нами случая процедура примет вид

 

procedure

sum (s,i,m,n,f); velue m,n; integer m,n;

begin 8 • = 0 ;


for i » a m step 1 until n

do

в » * a + £

 

 

end

 

 

Тогда при обращении к процедуре

sum

, выражения, являю­

щиеся фактическими параметрами,

соответствующими формальным

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

" Приведем еще один пример процедуры с подстановкой значе­ ния. Рассмотрим приближенное решение обыкновенного дифференци­ ального уравнения первого порядка с помощью одного из вариан­ тов схемы Рунге-Кутта.

Итак, нужно составить процедуру для интегрирования диф­

ференциального уравнения вида

 

у' - * (*»у)

'

при начальном условии у = у0

при х з х0 . В более общей

форме можно сказать, что нам известна точка интегральной кри­

вой с координатами ( xif у*

), а требуется найти точку на

этой кривой, тлеющую абсциссу (х

» х^

-f h .

 

По методу Рунге-Кутта- для определения

у1+1

последо­

вательно используем формулы:

 

 

 

 

^

= hf(xi ,yi ) i

 

 

 

 

k 2

=

hf (x1 +!*3ri+| /1>s '

 

 

 

 

 

=

hf (Xj^+I.yj^+I2) ;

 

 

 

 

k^

= hf(xi+h,y+kj) ,

 

 

 

 

а искомую величину определяем по соотношению

 

 

 

1

 

 

 

 

yi+1

= yi * 6 ^ + 2 k 2

2k3 4

Ч > •

 

Процедура, реализующая эти

вычисления, должна содержать па­

раметры х, у, h и функцию

f , задающую правую часть .диф­

ференциального уравнения. Назовем эту процедуру нк

она