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