Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.pdf
Скачиваний:
37
Добавлен:
07.06.2015
Размер:
672.16 Кб
Скачать

2.СТРУКТУРИРОВАННЫЕ ОПЕРАТОРЫ

2.1.Составной оператор

Составным оператором называется группа из одного или нескольких операторов, отделенных друг от друга символом «;». Синтаксис составного оператора:

«составной оператор»:=begin<последовательность операторов>end.

Таким образом, на языке Паскаль составной оператор имеет вид:

begin S1; S2;…; Sn end

Используемые здесь begin и end называются операторными скобками. Язык не накладывает ограничений на операторы, входящие в составной оператор. Это могут быть как простые операторы, так и структурированные, которые, в свою очередь, могут содержать составные операторы.

Примеры составных операторов: begin A:=5; end

begin h:=1; x:=y; t:=r end

2.2. Условные операторы

Условные операторы служат для организации ветвлений в программах. Условный оператор на основании истинности одного или нескольких логических выражений выбирает некоторую последовательность операторов. В языке Паскаль принято следующее определение условного оператора:

<полный условный оператор>::=if <логическое выражение> then<оператор>

else<оператор>

<неполный условный оператор>::=if<логическое выражение> then<оператор>

Содержание условного оператора можно представить в виде блок-схем (рис2.1, 2.2):

13

if B then S1 else S2:

Рис 2.1

if B then S1 ;

Рис 2.2

Здесь В – логическое выражение, S1, S2 – операторы. Вторую форму можно рассматривать как сокращенную запись оператора в том случае, когда отсутствует альтернатива S2 .

Пример 2.1. Вычислить значения функции

sin(x)

, если x ≠ 0

 

x

y =

 

1,

 

если x = 0

 

 

 

14

Программа имеет вид:

Program PR;

{ простое ветвление } var x, y : real;

begin

writeln(‘введите значение х,’); readln(x);

if x<>0 then y:=sin(x)/x else y:=1;

writeln(‘x=’,x:6:3,’y=’,y:6:3,)

end.

В условном операторе после символов then и else по синтаксису может присутствовать один оператор. Если же при выполнении (невыполнении) условия необходимо выполнить последовательность операторов, то их надо объединить в единый составной оператор.

Например,

if x<y then begin r:=y; y:=x; z:=k end;

2.3. Селективный оператор

Селективный оператор, или оператор выбора, выполняет одно из перечисленных в программе действий в зависимости от значения выражения – селектора.

Оператор выбора в Паскале имеет следующий формат:

Case i of

L1 :S1 ;

L2 :S2 ;

....

Ln :Sn ; Else S

end;

Содержание оператора CASE можно представить в виде блоксхемы (рис.2.3):

15

Рис. 2.3

Здесь Lk – списки констант выбора , состоящие из произвольного количества значений или диапазонов, отделенных друг от друга запятыми. Выражение (селектор) i имеет значение упорядоченного типа, кроме строкового, i и Lk принадлежат одному типу, Li ≠ Lj при i ≠j . В случае, если выражение i принимает значение Lk, выбирается и выполняется оператор Sk .

Если в списке выбора не будет найдена константа, соответствующая значению селектора, управление передается оператору S.

Структура типа CASE (выбор) представляет интерес, т.к. позволяет довольно естественно описывать логические ветвления программы (например, выбор одной из многих возможностей).

2.4 Операторы цикла

Для описания алгоритмов циклической структуры применяются операторы цикла. Операторы цикла указывают, что определенную совокупность операторов следует выполнить последовательно несколько раз. В общем случае оператор цикла состоит из двух компонентов: заголовка цикла и тела цикла. Заголовок цикла задает правила, определяющие, сколько раз нужно выполнить тело цикла. Применяются различные способы определения заголовка цикла. Тело цикла – это последовательность операторов, ограниченная справа и справа специальными символами языка.

16

1. Оператор цикла с параметром применяется в тех случаях,

когда известно число повторений тела цикла. Оператор имеет следующий формат :

for i:=A1 to A2 do S;

(1)

for i:=A1 downto A2 do S;

(2)

Здесь i – управляющая переменная (параметр цикла) в конструкции оператора цикла своими начальным и конечным значениями, определяемыми соответственно выражениями А1 и А2. Тип управляющей переменной и тип выражений совпадают и относятся к любому скалярному типу, кроме вещественного типа. S – оператор, называемый телом цикла. Оператор S может быть составным.

Значение параметра цикла изменяется от начального до конечного по правилу i:=succ(1) в случае конструкции (1) и i:=pred(1) в случае (2) (если i – целый тип для конструкции (1) параметр i изменяется от А1 до А2 по правилу i:=A1 +1, для конструкции (2) – i:=A1 -1).

Пример 2.2. Вычислить и вывести на экран значения функции

y= sin (kx) cos k при k=1,2,....,50.

x

Для вычисления воспользуемся алгоритмом циклической структуры, число повторений которого известно, т.е. оператором цикла с параметром. Параметр k принимает значения целого типа.

Program PR1; {табулирование функции} const N=50;

var x,y:real; k:integer; begin

writeln(‘введите значение x’); readln(x); writeln(‘k’:15,’y’:15);

for k:=1 to N do begin

17

y:=SIN(x*k) – COS(k/x); writeln(k:15,y:15:5)

end

end.

При анализе последовательностей важную роль играет рекуррентное соотношение между его элементами. Элементы a1 , a2 ,an ,образуют рекуррентную последовательность k-го порядка, если заданы первые k членов последовательности a1 , a2 ,ak , а для n > k

an = F (an1, an2 ,ank )

где F – некоторая функция k аргументов.

Организация вычислительного процесса на основе рекуррентной формулы позволяет сохранять предыдущие значения в полях памяти ЭВМ только до тех пор, пока не будут вычислены заменяющие их последующие значения, в том числе и окончательный результат. Рекуррентные соотношения используются в алгоритмах таких задач, как вычисление сумм конечного числа слагаемых.

Пример 2.3. Вычислить сумму n слагаемых

n

 

= 1+

1

+

1

++

1

S = 1

i=1

i

 

2

 

3

 

n

В общем случае вычисление суммы конечного числа слагаемых описывается рекуррентным соотношением

Si = Si1 + ai , i =1, 2,, n, S = 0

Здесь ai – очередное слагаемое. В нашей задаче оно определяется по формуле ai = 1i a i =1/i . Программа вычисления суммы имеет вид:

program SUM;

{ вычисление суммы конечного числа слагаемых } var S:real;

i,N: integer;

18

begin readln(N); S:=0;

for i:=1 to N do S:=S+1/i;

writeln(S);

end.

2. Операторы цикла с предусловием и постусловием приме-

няются в случае, когда неизвестно число повторений тела цикла. Они имеют следующий вид.

Оператор цикла с предусловием («пока B делать S») while B do S;

Здесь S – оператор, B – логическое выражение.

Оператор S выполняется нуль и более раз до тех пор, пока B имеет значение истина. Очевидно, S должно модифицировать B так, чтобы через конечное число шагов оно приняло значение FALSE (ложь).

Оператор цикла с постусловием («повторять S до тех пор, пока

) repeat S until B

Истина

S

B

Ложь

Здесь S выполняется до вычисления логического выражения B, в результате тело цикла выполняется по крайней мере один раз.

Пример 2.4. Написать оператор цикла для вычисления четных степеней переменной х, начиная с x2 : x2 , x4 ,до тех пор , пока очередное значение степени х не станет больше 108 . Используем оператор цикла с предусловием:

19

..........

readln(x);

while x<=1E08 do begin

x:=SQR(x);

writeln(x)

end;

..........

Если применить оператор с постусловием, то фрагмент программы будет иметь вид:

..........

readln (x); repeat

x:=SQR(x);

writeln(x) until x>1E08;

..........

Операторы с условием применяют в случае, когда условие повторения или окончания цикла задается не по параметру цикла, а по некоторому вычисляемому промежуточному или окончательному результату, то количество повторений такого цикла заранее не известно. Типичным примером служат итерационные циклы.

Операторы while и repeat являются подходящей формой для реализации алгоритмов, в основе которых лежат рекуррентные соотношения, но количество повторений цикла заранее не известно.

Пример 2.5. Вычисление кубического корня.

Пусть дано число А, выберем некоторое начальное приближение

x

0

к 3

А и точность вычислений ε > 0. Известно, что последова-

 

 

 

тельное приближение к точному значению корня определяется рекуррентным соотношением:

xi

=

1

 

A

2xi1

 

, i = 1, 2,

 

 

3

2

 

 

xi1

 

 

 

20

Получим последовательность x0 , x1 ,, xn ,которая неограниченно приближается к значению кубического корня. Новое значение xi вычисляется через предыдущее xi1 до тех пор пока не получится xi xi1 < ε . Тогда приближенное значение xi корня кубического найдено с определенной степенью точности ε.

Program KOR;

{ вычисление кубического корня } const EPS=1E-6;

var A,X0,Xi, Xi_1:real; begin

writeln (“Введите число, из которого извлекается корень”); readln (А);

writeln (“Введите начальное приближение к корню “); readln (X0);

Xi:=X0; Xi_1:=0;

while ABS(Xi – Xi_1) >= EPS do begin

Xi_1:=Xi;

Xi:=(A/SQR(Xi_1) + 2*Xi_1)/3 end;

writeln(“ Значение корня =”, Xi:10:6) end.

Операторы цикла while и repeat можно использовать и для вы-

числения суммы сходящихся рядов S = ai c точностью ε.

i=1

Если задана последовательность членов ряда a0 , a1, a2 ,, то последовательность частичных сумм S0 , S1 , S2 ,определяется так, что

Sk = a0 + a1 + a2 + …ak .

21

При приближенном суммировании сумму сходящегося ряда S заменяют частичной суммой Sk . Другими словами, Sk вычисляется че-

рез Sk1

до тех пор, пока не получится

 

 

 

 

Sk Sk 1

 

=

 

ak

 

< ε .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример 2.6. Вычислить приближенное значение ex = Ak , где

 

 

 

 

 

 

 

 

 

 

k=0

A =

xk

с точностью ε.

 

k

 

k!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рекуррентное соотношение для очередного члена ряда имеет вид:

Ak = Ak1 kx , A0 = 1.

Суммирование вычисляемых последовательно членов ряда производится с помощью рекуррентной формулы

Sk = Sk 1 + Ak , k > 0 S0 = A0 .

Новое значение Sk вычисляется через предыдущее Sk1 до тех пор, пока не получится | Sk Sk 1 = Ak < ε . Как только Ak < ε |, приближенное значение Sk суммы бесконечного ряда найдено с заданной точностью ε.

Program EXP;

{ вычисление приближенного значения exp(x)} const EPS = 1E-7;

var X,A,S: real; k: integer;

begin

writeln(“ Введите х”); readln (X);

A:=1; S:=A; k:=0; while ABS(A) >= EPS do

22