
книги из ГПНТБ / Соловейчик, Р. Э. Программирование на АЛГОЛ-60 учеб. пособие
.pdf—40
да мы имеем дело с равноотстоящими значениями переменной, т.е. с "шаговой" таблицей. В этом случае нужно задать только на
чальное значение, шаг и конечное |
значение переменной. Полный |
|||
|
__ |
|
|
for |
оператор цикла со списком цикла такого рода имеет вид |
-— |
|||
переменная: = начало step |
цриращение until |
конец |
do |
|
оператор. Заметим, что оператор, |
следующий после |
do |
, вы |
полняется до тех пор, пока значение переменной не превзойдет значения "конец", т.е. until понимается здесь как "пока включительно". Такая формулировка точна в случае положитель ного цриращения, а в случае отрицательного приращения вычис ления продолжаются до тех пор, пока переменная не станет мень ше значения "конец". Все это хорошо иллюстрирует ранее разоб ранный пример разветвляющейся программы. Эта программа может быть теперь записана проще:
begin r e e l |
R, 3 ; |
|
|
|
|
|
||
f o r |
Rj |
=20 |
step 5 |
u n t il |
200 |
d о |
|
|
beg in |
3i |
= |
I f R< 120 then |
17000-0.485 |
* |
Rf 2 |
||
|
e ls e |
1ЯООО / |
(1 + |
Rf2 |
/ 18000) |
; |
|
печать ; ч.ч )
end
\
end
Существует еще один вариант оператора цикла, дающий большую гибкость при определении числа повторений оператора. Такой вариант используется при циклах с незаданным заранее числом повторений, например при итерационных циклах или в циклах, находящих сумму ряда; в этих случаях окончание цикла определяется выполнением требований по точности.
В качестве примера оператора цикла такого рода приведем нахождение корня квадратного из числа А по формуле
(р'/еУ"х+рrev |
» Prev х:=х . |
Это осуществляется повторным вычислением по этой формуле до тех пор, пока не будет получена заданная близость значений *
и p re v х . Если разность между ними достаточно мала, то вычис
ление окончено, |
в противном случае prev х |
присваивается но |
||
вое значение, равное |
х , и вычисление продолжается и т.д. |
|||
Этот процесс описывается следующим образом: |
|
|||
|
prev х t |
= 1 |
; |
|
fo r х» |
= 0. 5х (A/prev |
x + p re v х ) w hile |
||
|
аЪэ (x -p re v x ) > ~ 6 do prev |
x«=x ; |
||
|
|
|
10 |
|
Оператор цикла подобного рода встречается в двух разновид ностях. В.одной из них начальное значение управляющей пере менной присваивается вне цикла, а в другой - внутри него.
Как видно, приведенный выше пример относится к первому
случаю. |
Заметим, |
что в АЛГОЛ-60 такое вычисление корня квад |
|
ратного |
не применяется; там предусмотрено использование стан |
||
дартной функции |
sqrt |
. Изложенное можно рассматривать как |
введение в построение циклических программ, которое заверша ется формальным оцределением оператора цикла.
Элементом списка цикла могут быть: |
|
|||
1) |
арифметическое выражение |
, |
|
|
2) |
арифметическое выражение |
step |
арифметическое вы |
|
ражение |
u n t i l |
арифметическое выражение |
, |
|
3) |
арифметическое выражение |
whlla |
булевское выражение* |
|
Список цикла состоит из одной или нескольких конструк |
||||
ций такого рода, отделенных одна от другой запятой. |
||||
Заголовок цикла имеет следующий вид: |
|
|||
|
for |
переменная: = список цикла do |
Оператор цикла состоит из заголовка цикла, за которым следу ет любой оператор (возможно составной), оператор может иметь метку. Полный вид оператора цикла будет таким:
fo r переменная : = список цикла do |
оператор |
42
Ввиду валкости оператора цикла, приведем еще несколько приме ров.
Требуется составить программу, вычисляющую функцию
и > x f |
е -У |
|
для значений х0(ьх )х |
и yQ(h ) у |
, т.е. шаговую |
таблицу значений функции двух переменных с разными шагами по
этим переменным. |
|
|
|
|
|
||
Строим эту программу в виде цикла по переменной у , |
|||||||
как бы вложенной в цикл по переменной * |
: |
||||||
begin reel хО, xinc, xlest, х, уо, yinc, ylset, у, z ; |
|||||||
ВВОД (хО, |
x l n c , x l e s t , |
у о , |
y i n c , у |
l a s t ) ; |
|||
f o r |
xt |
= |
xO step |
x l n c |
u n t il |
x l e s t |
do |
f o r |
yi |
= |
y f ) step |
y ln c |
u n t il |
y l e s t |
do |
begin z: = x t 2 * exp ( - y ) •
печать (x.y.z )
end
end
Заметим, что внутренний оператор цикла не нужно заключать в операторные скобки begin и end , так как действие слова
ао_ наружного оператора распространяется на один оператор - это и есть внутренний оператор цикла; тот факт, что этот опе
ратор может быть составным, не имеет значения. |
|
|
|||||||
Требуется составить |
программу, вычисляющую функцию |
||||||||
|
|
т (со) = |
|
к |
|
|
|
|
|
|
|
------------------------- |
> |
|
|||||
|
|
|
|
110(1+1^ 0) ) (1+ 1 |
TgftJ) |
|
|
||
где ^ |
и |
Т2 |
- постоянные; к |
- коэффициент пропорцио |
|||||
нальности; |
СВ |
- переменная угловая частота; |
I |
- переда |
|||||
точная функция; |
1 - |
|
. |
|
|
|
|
||
Поставим требование составить программу так, чтобы она |
|||||||||
вычисляла значение |
т |
как самую обычную шаговую таблицу и |
|||||||
вместе |
с тем вычисляла таблицу значений |
т |
для |
значений |
аргумента таких, что каждое последующее "болите" предыду щего в одно и то же число раз. При этом надо иметь в виду, что в механизме оператора цикла увеличение значений управляю щей переменной возможно только на шаг, который, однако, мы можем конструировать сами; за счет конструкции этого шага
он может быть сделан как постоянным, |
так и |
непостоянным. В |
||
первом |
случае возьмем шаг равным |
ь. |
, а |
во втором случае - |
равным |
Ь u) - W |
|
|
|
Прежде чем составлять програюау, |
нужно преобразовать ис |
ходную формулу, потому что в. нее входят комплексные величины, и разделить вещественную и мнимую части:
|
|
-к |
+ Та) |
" _ |
- |
___*(1 |
|
А |
||
т ы |
(1+^-12^ |
25(i +t|(jJ2) |
и ) (и -ш12л '2)(1+ |
|
|
|||||
Все это реализовано в следующей программе:- |
|
|
||||||||
•begin real |
K,W ,T2,omegastart, omega |
last,omega ,h,I,D, |
|
|||||||
|
|
T real, T imag |
; |
|
|
|
|
|
||
I |
ВВОД |
(K,Ti ,T2,omegastartt omega |
lest, h, b )j |
|
|
|||||
|
for omega«=omegastart step If J,sO then h |
else |
||||||||
|
|
|||||||||
|
|
h * omega-omega until omegalast do |
|
|
||||||
|
begin Di=(1+(T1 |
* omega )f 2)* (1+(T2 * omega)f |
2) |
» |
||||||
|
|
T real«= -k |
* (21 ♦ |
T2) |
/ H ; |
|
|
|||
|
|
ф imags= -к *(1-T1 * |
T2 |
* omega f 2)/(omege |
ж |
D)f |
||||
|
печать |
(к, W,T2, |
omegB.T reel,- 2 lmag) |
|
|
end
end
Если требуется, чтобы эта программа давала обычную шаго вую таблицу, то нужно ввести ь = 0, а в противном случае - ь 4 0. Отметим, что введен специальный идентификатор для
44
знаменателя |
т real |
|
|
Требуется составить программу для нахождения суммы ряда |
|||
ч (}>,&)• ^ [ ( ^ г ) |
B in d - ^ 2 ( w f sin3® + |
sin5® •••]'» |
|
причем f |
и 6 |
ограничены о ^ / ’^ ю и о 4 |
2J7". |
Сподобным рядом сталкиваемся в теории теплопроводности.
Впервом варианте составляемой программы мы примем "на глаз"» что можно ограничиться суммированием сорока членов ряда, но, по всей вероятности, этого более чем достаточно.
Тогда |
- |
40 |
|
|
|
|
|
|
|
|
|
800 |
V |
( - 1 ) |
i*1‘ |
1 _ |
Р 21-1 |
л |
, |
||
Т (р е )= 5 тГ |
L |
( 2i |
-i'}2 |
(Х |
) |
aln(2 i - i ) 6>' |
||||
|
” |
j_; |
|
|
|
Го |
|
|
|
|
причем так как нас интересует |
значение |
|
т (f,$) |
в конкрет |
||||||
ной точке, то будем считать заданными |
значения / |
и |
0 |
Поскольку на вид этот ряд знакопеременный (если не обращать внимания на то, что эту знакопеременность может нарушить член с синусом, то вводится специальная величина, которая бу дет обеспечивать соответствующее изменение знака. Этот прием рекомендуется применять в подобных случаях, так как он выгод
нее, чем возведение |
_ 1 |
в степень. |
|
|
|||||
Решение будет давать следующая программа: |
|||||||||
begin real rho, |
thete .slgnfaetor, |
sum, |
temp; Integer 1 ; |
||||||
ВВОД |
(rho, |
theta |
|
) |
; |
|
|
|
|
signfactor s = i ; |
|
|
|
|
|
|
|||
sum s = 0 ; |
|
|
|
|
|
|
|
|
|
for |
i:= 1 |
step 1 |
until |
4 0 |
4o |
|
|||
begin sum; = sum + slgnfector |
/ |
(2 * |
i —1 |
2* |
|||||
*(rh o/10 )t |
(2 |
* 1 -1 |
) |
x |
sin ( (2 x |
i~ l)* theta) ; |
i
S i q n f a c t o r : = ” signiaotor
end ;
temp s = 800 / 9«8692 “ sum f
печать ( rho, thete, temp )
snfl
Во втором варианте составляемой программы мы постараем ся построить более экономное решение с точки зрения затраты машинного времени. Преаде всего нужно ограничить число сум мируемых членов ряда необходимой точностью. При этом следует суммировать только те члены ряда, у которых коэффициент у
синуса, например, больше |
10 . Затем можно упростить опера |
|||
цию возведения |
7ГГ |
в |
степень, что легко осуществляется |
|
|
|
______ |
||
в операторе цикла, |
если |
заметить, что соответствующие степе |
ни у двух последовательных членов ряда отличаются на (»£ )2 Аналогично можно поступить и с углом, задав его начальное
значение |
6 |
и затем последовательно прибавляя к нему |
|||||||||
по 2 Q . Такой же прием можно применить при вычислении мно |
|||||||||||
жителя ( 2jZ T f2 |
|
' *Ф°ме Torot полезно специально обозна |
|||||||||
чить некоторые промежуточные величины. |
|
|
|
|
|||||||
Тогда можно написать |
|
|
|
|
|
|
|
||||
•begin reel |
rho, |
theta, |
signfactor, |
sum, x , |
x 2 , angle,deno* |
||||||
|
|
test, |
temp j |
|
|
|
|
|
|
. |
|
ВВОД |
( rho, |
theta |
) ; |
|
|
|
|
|
|
||
signfactor: |
=1 ; |
sums |
= О ; |
xs |
= r h o / |
10.0 |
{ |
||||
x2t |
= |
x >« |
x |
; angle': = |
theta |
; |
denom: |
= |
1.0 |
j |
46
f o r te n t: |
x/1enom t 2 wh lie test < |
-4 .1 o |
begin sur1* =sura + signfactor * test x sin (pngle) •
x: = x * x2 •
angles = angle + 2 * theta ; denoms = denom + 2 ; '’Ingfector: = “ sthgfector
enfl •
temp; = Я00 / 9.°696 * sum ;
печать ( rh o , th e ta , temp )
end
В качестве последнего примера применения оператора цикла рассмотрим вычисление определенного интеграла и приведем два варианта этой программы. При этом будем исходить из формулы Симпсона
f (x)dxSJcsfз |
[I f (a )+4f (a ♦ h)+ |
2f(et2h)*....*2f(b-2h) + |
|||
|
Ъ |
- |
л |
♦4fO>-h) + |
f(hjj , |
где |
|
|
|||
h= |
n |
, a n |
- четное число, |
и применим |
|
ее к |
вычислению интеграла |
|
|
||
|
|
|
= |
1т . |
|
°" 4
Впервом варианте программы мы будем находить в одном цикле слагаемые, умножаемые на'4 и на 2. Но при этом возни
кает трудность, заключающаяся в том, что первых на единицу больше, чем вторых. Это можно обойти, добавляя к суммам, найденным в цикле, уже после выхода из него начальное и ко нечное значения функции, а также последнее из значений функ ции с коэффициентом 4, т.е.
f ( а ) + f ( h ) + 4 f ( b - h ) .
4 7 --
Цвкл проще всего организовать, каждый раз прибавляя |
?h |
к |
||||||
управляющей переменной, начиная со |
значения а + h |
. В |
этом |
|||||
случае |
х |
будет определять слагаемое, |
которое умножается |
|||||
на 4 и |
суммируется в sum 4 |
, a i t h |
будет определять |
|
||||
слагаемое, которое умножается на 2 |
и суммируется в |
sum 2 . |
||||||
Нужно обратить внимание на нахождение последнего значения в |
||||||||
цикле. Так как вначале находится |
sum 4 |
, а затем |
sum |
г |
, |
|||
то последнее интересующее нас |
значение аргумента будет |
ъ-зь . |
Тогда, программа, реализующая предлагаемую последовательность вычислений, будет следующей:
begin real |
|
е , |
Ъ, |
n, |
sum 4, |
sum 2, |
h, |
х , |
Jo; |
|
|
||
ВВОД |
|
( а, Ь, n ) ; |
|
|
|
|
|
|
|
||||
h; = |
(Ъ - а ) |
/ |
n |
j |
|
|
|
|
|
|
|
||
sum 4: = |
sum 2: |
= |
О ; |
|
|
|
|
|
|
|
|||
fo r |
X! |
= |
а + |
h |
step 2 * h until |
b |
- 3 |
* h |
do |
|
|||
begin |
sum 4s |
= |
sum 4 4 1 . 0 / |
(1 |
|
t 16) |
; |
|
|||||
|
|
sum 2» |
= |
sum 2 t |
1 .0 / |
(1 |
* |
(x |
+ h )t |
16 |
) |
||
end |
; |
|
|
|
|
|
|
|
|
|
|
|
|
,t„ . =h/3 |
* (4 |
* |
sum 4f2 |
* sum 2 |
+1 .0 / |
( 1 + a f |
16) |
||||||
|
|
|
♦4 . 0 / |
(1 > ( b - h ) f l 6) |
+ |
1 . 0 / |
(1+ |
b f |
16)) ; |
||||
печать |
|
(,То) |
|
|
|
|
|
|
|
|
|
||
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
Серьезным осложнением в этой программе является то, что приходится пять раз выписывать подынтегральную функцию. Этого можно избежать, если преобразовать формулу Симпсона
f |
t(a )4 4 f(s+ h )t f(a t 2h)] + . . . t |
|
« |
Тогда легко образовать цикл, начиная со значения управляю
щей переменной, |
равного а |
, с шагом 2h |
и конечным |
зна |
чением ъ - 2h |
. В этом случае мы избежим |
вычислений |
эн»- |
48
чений подынтегральной функции вне цикла. Соответствующей программой будет
begin real |
а, Ъ, n, sum, h, |
я, |
J0 ; |
|
|||
ВВОД |
( а , Ъ , п ) |
|
|
|
|||
hj = ( Ъ-е) / п |
• |
|
|
|
|||
sums = |
О ( |
|
|
|
|
|
|
for я* = a step |
2 w h until |
b - 2 д h do |
|
||||
sumt=sum +1 |
/ |
(h o c ? 16 Ж |
/ |
(1*(x t h)fl6) |
♦ |
||
|
|
|
|
* |
l |
/ (1 -p(x -fr2 * |
h) f 16 ) ; |
j0 s = |
h / |
3 * |
|
sum . |
|
|
|
печать |
( J0 ) |
|
|
|
|
- |
end
Ниже будет показало, что и эта программа может быть уп рощена.
Переменные с индексами
Эти переменные позволяют использовать один и тот же идентификатор для обозначения многих величин. Совокупность всех величин, описываемых одним идентификатором, называется массивом, а отдельные величины - его элементами. Элементы мож но найти в массиве по их индексам. Количество индексов может быть любым; они записываются в квадратных скобках и отделяют ся друг от друга запятыми.
В качестве цримера использования переменных с индекса ми, приведем систему двух линейных алгебраических уравнений,
записанных в виде
а11я1 •* в: 2 х 2 = Ъ1 ;
4
е?1 *1 * s2? *2 = ъ 2 •
—49 -
Для решения ее воспользуемся формулами Крамера;
х1 |
Ъ1в?г ~ sl2b? |
|
а'|1аор - |
В12.Н21 |
|
|
-_11Ь5 - Ъ1-а21 |
|
|
В11а ?2 “ |
®1 2 а21 |
и приведем программу, |
вычисляющую решение системы, причем |
описание и процедуру ввода пока опустим. Кроме того, присво им идентификатор знаменателю и предусмотрим, что если этот знаменатель меньше Ю -^, То значит допущена ошибка и вычис ления прекращаются.
Тогда алгоритм вычисления будет иметь следующий вид:
demon: =а [1 , ij * а [2,Щ - а |
[1, ^*а [2, ij |
} |
|
|
||||||
If |
еЬв |
(Депош) < ^ -5 then |
stop |
; |
|
|
|
|
||
х |
[l] |
: |
= |
(b[lj a a [2,1 |
- e [1 ,2j |
x |
h [ 2] |
) / |
denom f |
|
x |
[ 2] |
s.= |
(a [l,ij x b f 8] - b [ f ] |
* |
b ^2,ij |
) / |
denom ; |
При использовании в АЛГОЛ-60 переменных с индексами не обходимо сообщать следующую информацию:
1.Какие из переменных являются переменными с индексами
2.Сколько индексов имеет каждая из переменных с индек
сами.
3.Сколько элементов в каждом массиве..
4.Как пронумерованы элементы массива.
Ответ на все эти вопросы дает описание массива. Оно ставится в начале того блока, в котором используется массив. Но прежде чем-переходить к тому, как строится описание мас сива, сформулируем два определения._
Граничная пара состоит из двух арифметических выраже ний, разделенных двоеточием (большей частью это просто целые числа). Список граничных пар состоит из одной или более гра ничных пар, разделенных запятыми.•
Теперь можно дать понятие об описании массива. Оно на-