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

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

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

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

Добавлен: 31.10.2024

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

Скачиваний: 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