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

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

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

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

Добавлен: 31.10.2024

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

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

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

цедуры представляет собой составной оператор. Допустим, из­ вестно, что квадратное уравнение

ах^ + Ьх + о » 0

имеет два вещественных корня (следовательно а / 0) и их надо

найти. Присвоим процедуре, решавдей эту задачу, идентификатор ro o t 2 . Тогда описание" этой процедуры будет сдрдувдим:

prooednre

root 2 (e,b,o,xl ,х2 ); real

a,b,c,xi,x2

j

begin x1 1

a (-b + eqrt

(bf2 - 4

* a x

o)) / (2 x

a)

\

x2i

a (-b - aqrt

(bf2 -4

* a *

o)) / (2

x a)

 

end

 

«

 

 

 

 

'~r~

 

 

 

 

 

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

prooednre

ro o t

2

(а ,Ь ,о ,х 1 ,x 2 )j

re a l

а ,Ъ ,о ,х 1 ,х 2 j

begin re a l

temp

j

 

 

 

 

 

 

 

 

 

tempi

«

aqrt

(b l2 -

4 *

a

no)

;

 

x1i

=

( - b

temp)

/ (2

* a)

;

 

x2i

a

( -b

-

temp)

f

(2

* a)

;

end.

 

 

 

 

 

 

 

ч

 

 

Причем на этом примере явно видна целесообразность представ­

ления тела процедуры в виде блока; кроме того, эта процедура потребует для своей реализации меньше машинного времени.

(Здесь мы поступили не вполне корректно, присвоив двум раз­ личным процедурам одно наименование,т.е. общий для них иден­ тификатор root 2 ; но поскольку оба они выполняют одно и

то же, то нам казалось, что это не очень предосудительно).


68

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

prooadnre bigi

(a .i.n .g ij ,.1 ) ; real

array a, Integer i , n , j

begin integer

k

;

 

 

 

 

real

eij

 

 

 

 

 

 

 

 

 

 

 

«Ц »

=

a

[i,l]

;

 

 

 

 

3

« = 1

:

 

 

 

 

 

fo r

ks

»

2 3tep 1

ont i l

n do

 

 

if

abe

(a

|4

,kJ

) ^

a ij

then

begin

aij

«

=

a

j^i, k^j

;

 

 

 

j

:

-

k

 

 

 

 

 

end

 

 

 

 

 

 

 

 

end

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


69

седьмой строки матрицы 15x15, то это можно сделать с помощью обращения к процедуре.

blgi (matrix, 7, 15, walue, column ) ,

 

 

 

 

в котором использованы идентификаторы: матрицы -

matrix

 

;

искомого элемента -

walue

'

;

столбца

-

column

 

 

Сделаем замечание, имеющее своей целью облегчить понима­

 

ние процедур. До сих пор, когда мы писали заголовок процеду­

 

ры, то в том случае, если он содержал более

чем один формаль­

ный параметр, мы отделяли эти формальные параметры друг от

 

 

друга запятой. Однако можно использовать в качестве раздели­

 

теля вместо запятой следующую конструкцию:

закрывающую скоб­

 

ку, за которой следует строка букв, т.е. любой буквенный текст, служащий душ пояснения, далее следует двоеточие и, наконец, открывающая скобка. Этим способом можно пользоваться всегда, когда это будет казаться целесообразным; он не влияет на ра­ боту программы. Если в описании процедуры мы воспользовались этки приемом, то при обращении к рассматриваемой процедуре можно поступать по своему усмотрению, т.е. писать поясняю­ щий текст, но можно и не писать. Так, в приведенной выше про­

цедуре. ее заголовок был

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

procedure

o l g i

(

s , i , n , c i j , j

)

;

 

и если бы нужно было пояснить

его,

то

можно

сделать это

следующим образом:

 

 

 

 

 

 

 

prooedure

M g i

(а) строке : (х) порядок, (п )

■элемент:

(aij)

столбец;

( j

);

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

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



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

procedure Trane (a,m,n)j array a , Integer

m, гц

t

begin

real p ; Integer

i,k {

 

 

 

for It я e step 1

until n do

 

 

 

for k: я 1 .+

1 step 1 until n

do

 

 

begin p: = a [ i ,

k] t a [i»*J *яв

[^»*]»8

[k»i]*=P

 

end

 

 

 

end

 

 

 

 

К этой процедуре следует дать некоторые пояснения. Преж­

де всего,

транспонируемая матрица квадратная, i n k

- целые

переменные, вводимые для обозначения индексов элемента матри­

цы, а р

- вспомогательная вещественная переменная,

исполь­

зуемая для выполнения процесса транспонирования.

 

Если в программе, содержащей описание процедуры

Irene ,

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

 

array Ъ £l •: 10, I : lo j ^

то для транспонирования матрицы, отвечающей этому массиву, нужнонаписать следующее обращение к процедуре:

Trane ( ъ, 1 , ю ) .

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

 

d = (а^ •* Ъ) * о® ~ Ь^ ,

 

где а,ъ,е

и d - квадратные матрицы

13-го

порядка. Индексы

компонент

пронумерованы от 0 до 1 2 , а

т

обозначает опера-