Файл: Соловейчик, Р. Э. Программирование на АЛГОЛ-60 учеб. пособие.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.10.2024
Просмотров: 96
Скачиваний: 1
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 |
. В этом случае мы избежим |
вычислений |
эн»- |