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

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

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

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.Как пронумерованы элементы массива.

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

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

Теперь можно дать понятие об описании массива. Оно на-

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