Файл: Соловейчик, Р. Э. Программирование на АЛГОЛ-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 , а |
т |
обозначает опера- |