Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги из ГПНТБ / Соловейчик, Р. Э. Программирование на АЛГОЛ-60 учеб. пособие

.pdf
Скачиваний:
26
Добавлен:
19.10.2023
Размер:
3.78 Mб
Скачать

50 ~

чннается с описания типа элементов массива, т.е. reel,integer

или

Boolean

(т.е. все элементы массива имеют один и

тот

же тип!),

затем следует слово

a r r a y

, за ним иденти­

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

ней с шагом единица. Если

перед словом

array

тип массива

не указан, то этот массив'

относится к

типу real

(заме­

тим, что это условие распространяется только на

массивы).

Цри написании нескольких массивов одного и

того же

типа,

МОЖНО не

повторять СЛОВ arrev. real array, in teger array

*дя

Ял п Ь а д

я т • Пр» описании нескольких массивов одного и

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

Теперь приведем примеры описаний различных массивов:

a r r a y

rau

 

L1 : 2<3

;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a r r a y

laabda

[

- 2 : 3 ] ;

 

 

 

 

a rra y

io ta

 

t

-24 : -б] ;

 

 

 

 

r e a l

чггву

L

 

[1:6,0:24];

 

 

 

 

 

 

 

 

 

 

 

 

r i a l

array

A

[ l : 5 Э] ,

в

[l:200]

,

с

[l:I0,1:10,1:^;

a rra y

D,

E,

P,

G, H

[I : 20 , I : 2С(

 

 

in teger

array

data

[-8

: -3,

-2

: 3,

27 : 5э] ;

Boolean array

Quine

 

[ I

: 30, I : б]

;

Boolean array

j , k, ш

:

2б ],

n [ i

:

16^ ,р ,а [о :б ]

\

— 51

агга£

*

[l:IO,I:IoJ

, у ljD :49j; integer

 

вггат

I

[-1

0 :0 ] ;

boolean array N

[iO

2 2oj

J array А. В,

С

[1:9,

0:l6j

5

Integer

array

i .1 к

: 5, 0 : 5, 0

: 5, I

; ioj ;

array

B C D

 

[i :

2, I : 50]

 

 

 

 

 

 

Как уже указывалось,

в большинстве

случаев граничные па­

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

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

если элемент массива характеризуется

А [2.4, 5.8,

6 .б] ,

то этот элемент эквивалентен тому, который характеризуется

А • [2,6,7]

и аналогично в

[-2.84,

1.89, -7,б]

эквивалещ-

. тен в

[-3.2, -7] .

 

 

 

Приведенные выше примеры использования индексных выра­

жений не объясняют, почему они имеют большое значение в

МГ0Л-60. Можно думать, что это еще один способ обозначений

переменных и

только, однако

это не так.

 

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

Приведем примеры програш такого рода. Пусть требует­

ся составить программу,

вычисляющую с у ш у квадратов двадца­

ти чисел:

20

 

' Зд =

i =1

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

52

любое из этих чисел можно сослаться посредством переменной с

индексом, т.е.

х

[Ч]

, если принять,

что

этот индекс имеет

значение от I до 20.

 

 

 

 

 

 

 

Тогда искомая программа будет иметь вид

 

 

begin real

 

Sq ;

Integer

1 ;

array

я £4

:

2o] ;

 

 

.

ВВОД

(

X.

) ;

 

 

 

 

 

 

 

<30

* =

0 .0

;

 

 

 

 

 

for t:

=

1

step

t

un til

?0

do

 

 

 

3o:

=

Sq *

x [ i j f

2

; ' печать

( x,

So

)

end

Рассмотрим теперь почти аналогичную задачу. Пусть тре­ буется составить программу для нахождения скалярного произве­ дения двух десятикомпонентных векторов а и ъ :

9

 

ab = 3L= 0

О

 

 

 

 

 

е8 £

 

 

 

Соответствущая программа будет

 

 

 

b eg in r e e l

 

Integer

а ;

array

А ,В О'э]

ВВОД ( А , Ч ) ;

 

 

 

 

 

 

 

 

ab

: ^

С .г .

 

 

 

 

 

for

3 :

=

о step i

until

9

d_o

 

eb

• =

ab

Вт [s]

* b

[a]

;

f

 

 

 

 

 

 

 

 

 

 

печать

( A,

В,

ab

)

 

 

end -

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

(и * п ) и вектор - столбец ( п * "1 ), так что проверять воз­

можность этого умножения не нужно.

 

 

53

 

г--У

 

° 1 г

 

Г

В11

в1п

Ъ1

°1

821

822

‘'* &2п

>

°2

П1.8n2

, ъ =

С 3 -

®пп

ъп

°п

Тогда

 

 

вЪ = о

,

где

п

 

 

ог =

S jj

l>f

1

j=1 0

J

 

В этом случае можно ограничиться приведением программы, так как она легка в чтении, но громоздка для объяснения. Это просто цикл в цикле.

begin

array

a

f l :5 0 ,'1 s50|>

^ *

c [^: 5o]j integer i , j , я;

 

ДВОД

( а, Ъ, П ) ;

 

 

 

 

for

it =

1

Ftep

1

until

n

do

 

 

begin

о

fi]

: =

C.O ;

 

 

 

 

 

 

fo r

 

 

=

1

step

1

until

n

do

 

•Tfi]

:

= C

 

[i]

♦ a

[1,3]

*

Ъ [3]

end ;

 

 

 

 

 

 

 

 

 

 

 

печать ( 0 )

end

Выбор граничных пар 1:50 позволяет использовать программу для умножения матрицы порядка не выше 50.

Составить программу для определения медианы заработной

.платы на предприятии на основании следующих данных:

Месячная

Количество

Месячная

Количество

зарплата.

рабочих.

зарплата,

рабочих.

руб.

чел.

руб.

чел.

0-68,88

17

88,00-88,98

129

60,00-88,88

■ 48

100,00-108,88

142

70,00-78,88

70

110,00-119,89

82

80,90-84,98

53

120,80-128,89

85

№ ,00-89,88

67

180,00-1S9,89

38

00,00-04,89

94

140,00-180,00

34

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

1.Разделим общее число рабочих на 2, что даст нам чис­ ло рабочих, расположенных по обе стороны от медианы.

2.Начиная с первой строки таблицы складываем числен­ ность рабочих, содержащихся в последовательных классах, до тех пор, пока не. достигнем класса, содержащего медиану.

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

4.Разделим этот добавок на численность класса, содер­

жащего медиану.

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

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

Кроме того, введем два одномерных массива для указания

верхней

границы классов (d e n s

) и соответствующих частот

( freq

). Здесь существенно,

чтобы классы шли в возрастаю­

щем порядке и чтобы мезду ними не было зазора (т.е. m o m ял граница следующего класса на 0 Г01 больше верхней границы предыдущего).

Далее введем переменную number > которой присвоим значение; равное числу классов (в рассматриваемом конкретном случае оно не больше 100). Программа, находящая медиану,при­ водится ниже:

begin Integer

i , ], number; real

sum,

midpoint, med len;

array

olass,

freq fo : IOo] ;

 

 

 

 

ДИОД

(

number,: class,

freq

) .

 

 

 

 

aum ; =

0*0 ;

 

 

 

 

 

 

 

 

 

for

i

: =

1

step

1

until

number

do

 

sumt

=

sum +

freq

 

 

 

;

 

 

 

 

 

midpoint :

=

sum /

2

;

 

 

 

 

 

 

sum :

-

0 .0

;

 

 

 

 

 

 

 

 

 

for

i :

=0,1

♦ 1

while

sum + freq [ i ]

< midpoint do

begin

sum;

=

sum freq [ ij

;

J i

=

i end ;

median: =

(midpoint

-

sum) /

freq

 

ij|

*

 

 

x (cla ss

[ j * i ] - c l a s s [ j ]

)+

e l e s s j j j

+0.0Tr

цечать

( median,

j ♦ 1 )

 

 

 

 

 

end

 

 

 

 

 

 

 

.

 

 

 

 

 

»B качестве последнего примера использования переменных с индексами рассмотрим программу решения системы линейных алгебраических уравнений по методу Зайделя .

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

56

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

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

В качестве меры этой близости можно рассматривать так называемую норму, которая #ч?еделяется формулой

где Si

- значение

i -г* неизвестного на предыдущем шаге;

-

значение

1-г* ивизвестного на текущем шаге.

Программу построим для числа уравнений не свыше 50 и при условии окончания процесса вычислений, если два последо­ вательных шага отличаются по норме не более чем на заданную величину, Идентификатор этой величины пусть будет teat Кроме того, введем идентификатор для текущего значения не­ известной, а именно teorox . Очевидно, что нужно ввести массивы начального приближения, свободных членов и коэффи­ циентов.

Программа, реализующая метод Зайделя, будет следующей:

begin real sum, norm, tempx,test;

Integer

i , j,

n;

array

a jjr'SO,

T:So]

,

b,x

[ l :5o]

;

 

ВВОД

(a, b,

x,

n, test

)

;

 

 

agein; norm; = 0.C ;

 

 

 

 

 

 

for i; = 1 step 1 until n do

 

 

 

begin

sum: = 0.0

;

 

 

 

 

for i :=1

step

1

until 1~1 , 1 -fri 'step 1

until n

 

 

do

H

* * w

 

 

sum:

sum ♦ 8

 

 

tempxi

(b [ i j

- gum) / a

£ 1,1

 

normt

norm + abs ( tempx - x

 

 

tempx

 

 

end

 

 

 

if

norm ^ test

then

печать (x)

else go to again.

%

end

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

Переключатели

Это аппарат, обобщающий в А Ж Ш - 6 0 идею условной пере­ дачи управления. Переключатель позволяет передавать управле­ ние одному из нескольких операторов в зависимости от тех зна­ чений, которые прикиыает некоторое арифметическое выражение.

Если требуется передать управление одному из операторов

с метками bl, 8 , 67 , 43

и 1

3

в зависимости от того,

какое значение примет целое

число

1

- единицу, двойку,

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

if 1 =

1

then go

to

I 1

else

i f

1 =

2

then £0

to

3 else

 

_if

i

= 3

then £0

to 67 elsa ■

if 1 =

4- then £0

43

else

i f

1 = 5 then ££

to

1 3 j

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

Несколько короче ето можно сделать с помощью оператора перехода, за которям стоит условное выражение

go to if

i =

1

then

L

1 else

 

tt

1 =

2 then

3

else

 

 

i f

i =

3

then

67

else

 

 

• if

i =

4

then

43

else

 

 

 

if

i =

5

then

b 3 |

но к эть конструкция достаточно громоздка. Существенно коро­ че ето можно сделать с помощью переключателя. При атом в блоке среди описали! типа, массива и других должно стоять описание переключателя. В нашем случае оно имеет вид

switch q: = 1 I, 8 , 67 , 43, Ь 3 .

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

£о to q[i] »

Здесь - идентификатор переключателя, а за ним в квадрат­ ных скобках ставится некоторое арифметическое выражение, ко­ торое определяет t-ю метку переключателя, где _ 1 - целое число, ближайшее к значению арифметического выражения (в слу­ чае, если значение арифметического выражения оканчивается 0,5, округление производится в большую сторону). Однако в большинстве случаев на месте арифметического выражения стоит просто целая переменная.

В качестве примера использования переключателя рассмот-

рим следующую задачу. Пусть требуется вычислить один из пер­ вых пяти полиномов Лежандра при заданных значениях я 'и .*:

О, то

Р0

(х)' = 1 ;

то

 

(*) =

х ;

то

Р ? (х) =2 ( 3 X2 - 1 ) ;

.если

Pi (х) =V ( 5 X3 - 3* ) •

то

4, то

Р4

(х)

=5 (35 X4 - ЗОх2 + 3 ) .

Дня решения задачи введем переключатель

poly

с метками ГО,

PI, Р2, РЗ и Р4, соответствующими пяти операторам присваива­

ния для переменной с идентификатором

legendre

Единственная особенность этой "программы"

состоит в вы­

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

Описание

переключателя будет

 

естitch

poly» = РО,

PI,

Р2, РЗ, Р4 ;

а обращение к

нему имеет вид

 

 

 

go

to poly

«• ij

;

причем в тексте полной программы должны быть метки:

v

РО

: le g e n d re

:

=

1.0 ;

 

 

P I

: le ge n d re : = х ;

 

 

Р2

:

le ge n d re

:

=

1.5 * xf2 -

Ь.5 ;

 

РЗ

:

le g e n d re

:

=

2.5 *_х f 3

- 1. 5* х ;

Р4 :

le g e n d re

: =

4. 375* * f 4 - 3. 75* x f 2+0.375 j

Полная программа для этой задачи не приводится из-за искусст­ венности ее постановки.

Блоки и их использочвание

Начнем с выяснения значений терминов локализованная и глобальная переменные величины.

Переменная величина называется локализованной в том бло-

Соседние файлы в папке книги из ГПНТБ