Файл: Соловейчик, Р. Э. Программирование на АЛГОЛ-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 , задающую правую часть .диф |
|
ференциального уравнения. Назовем эту процедуру нк |
она |