Лекция 13 Условен оператор



Дата20.07.2018
Размер134.3 Kb.
Лекция 13

Условен оператор

Разклонението на изчислителните процеси в алгоритмите се извършва с помощта на условен оператор. Условен оператор се използва, когато се налага да се направи избор. Изорът може да бъде между две алтернативни възможности или да се избира да се изпълни ли даден оператор или да не се изпълни. В зависимост от вида на избора в език Pascal се използват два варианта на условен оператор: с пълен и непълен формат.

- Условен оператор в пълен формат. Този оператор може да се представи в логическа форма посредством изречението:

Ако С тогава S1 иначе S2 ;

Тук е С логически израз (има логическа стойност), S1 и S2 са оператори, които могат да бъдат прости или съставни (блокове). Схемата на тази конструкция е показана на фиг. 9.8.

Записан като програмен оператор на Pascal, той има вида:



if C then S1 else S2 ;

Действието на условния оператор в пълен формат е следното: проверява се стойността на логическия израз C; ако стойността е истина (true), се изпълнява оператор S1, а ако стойността е неистина (false) - се изпълнява оператор S2.

-Условен оператор в непълен формат. Може да се представи в логическа форма посредством изречението:

Ако С тогава S1;

Стойността на логическия израз С определя дали да се изпълни оператора S1 или да не се изпълни. Ако стойността на С е истина (true), операторът S1 ще бъде изпълнен, а ако е лъжа (false), няма да бъде изпълни. Схемата на тази синтактична конструкция е показана на фиг. 9.9. Като програмен оператор на Pascal той има видът:

if C then S1;

Като пример за използване на условен оператор може да послужи един от най-често използваните примери за съставяне на компютърни програми - програма за решаване на квадратно уравнение. В примера (фиг.9.10) наименованието на програмата е sqr_equation, а в частта за декларации са зададени като реални променливи a,b,c - коефиценти на квадратното уравнение; d - дискриминанта на уравнението и x1 и x2 - корени на уравнението.

Това не е най-добрата програма за решаване на квадратно уравнение, но тя илюстрира възможностите на условния оператор. Тук е използван условен оператор в пълен формат, като роля на логически израз играе проверката за положителна стойност на дискриминантата на уравнението d<0. Както се вижда, в Pascal не е необходимо логическият израз да бъде ограден в скоби, но когато се използват по-сложни изрази и се налага използването на скоби за въвеждане на приоритети за логическите операции, може и целият логически израз да бъде ограден в скоби. В примера ролята на оператор S1 играе процедурата за извеждане на информация writeln (‘Уравнението няма корени !!!’), а на S2 - съставният оператор, състоящ се от четирите оператора, оградени с логическите скоби begin - end.

frame1

Фиг. 9.10. Програма Sqr_equation


Вложение на условни оператори

Всички оператори в частта след then и след else могат да бъдат произволни оператори, включително и други условни оператори. Тогава се получава вложение на условни оператори. Това дава възможност да се направи избор между повече от две възможности. Тъй като всеки от условните оператори може да бъде в пълен или непълен формат, понякога се създават условия за нееднозначно тълкуване. Проблемите, възникващи при вложение на условни оператори, могат да се пояснят с примери:



Пример 1:

Д


{Програма за изчисляване на функция; използване на вложени условни оператори}

Program funct ;

Var x,y : real ;

begin

write (‘Въведете стойност на x :’)

readln (x) ;

if x<0 then if x<-1 then y:=x+1

else y:=x-1

else if x<2 then y:=x*x+1

else y:=25 ;

writeln (‘Стойността на функцията е : ‘,y:8:3) ;



end.

а се състави програма за определяне стойността на следната функция:

Програма за решаване на задачата с използване на условен оператор изглежда по начина показан вляво:

Особенoст в тази програма е вложението на три условни оператора. За по-голяма яснота операторите са записани, като съответните then и else са поставени един под друг, за да се подчертае кой оператор else към кой if се отнася. Ако не е записан така, осмислянето на този оператор би било доста трудно. За компилатора на език Pascal съществува правилото, че оператор else винаги се отнася към най-близкия if, който не е завършен със стоящ по-напред else.

Програмата може да бъде реализирана и без използване на вложени условни оператори.



frame3
Оператор за цикъл.

Предназначението на оператора за цикъл е да организира многократното изпълнение на група команди, които образуват тялото на оператора. В Pascal се използват три различни оператора за цикъл. Всеки от тези оператори е подходящ за определени ситуации в алгоритмите, но почти винаги е възможно да се прилага кой да е от тях за конкретен случай. Поради тази причина, програмистите обикновено предпочитат да използват един от операторите за цикъл в повечето случаи и рядко другите оператори.

Операторите за цикъл имат три основни елемента в организацията на програмния процес:

- Задаване на начални стойности на величини, участващи в управлението на цикъла. Те се наричат инициализиращи елементи и в някои случаи могат да се разполагат преди оператора за цикъл;

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

- Проверка на условие за край на цикъла. Повторението на изпълнение на операциите от тялото на цикъла се контролира от логическо условие. При всяко изпълнение на операторите от тялото трябва да се проверява това условие.


Цикъл с предусловие.

Този цикъл може да се представи логически с помощта на изречението:

Докато С повтаряй S.

Тук С е логически израз, а S е изпълним оператор (група оператори) представляващ тялото на оператора. Схемата на оператора с предусловие има вида (фиг. 9.3).

Синтактическата форма на оператора в Pascal има вида:



while C do S ;

В тази конструкция на оператор за цикъл инициализиращата част се намира извън оператора за цикъл (преди оператора). Условието за проверка за продължаване на цикъла се задава с логическия израз С. Ако стойността на С е истина, се изпълнява тялото на цикъла S, а ако е лъжа цикълът се напуска и управлението се предава на първия оператор, непосредствено следващ оператора за цикъл. След изпълнение на операторите от тялото, управлението се предава в началото на цикъла за нова проверка на условието за продължаване. Цикълът се нарича с предусловие, защото най-напред се проверява условието и ако то е истина, се изпълняват операторите от тялото на оператора. Това означава, че е възможно тялото на цикъла да не се изпълни нито веднъж, ако още при влизането в цикъла условието е неистина. Обновяване на стойността на управляващите променливи трябва да се предвиди в тялото на цикъла.

Примери за използване на цикъл с предусловие:

П
{Пример 1- Цикъл с предусловие}

Program while_operator ;

Var n,s,i : integer ;

begin

i:=10 ; s:=0 ;



while i>0 do

begin

readln (n) ;

s:=s+1 ; i:=i-1 ;

end ;

end.

ример 1
: Програма за определяне сумата на въведени от клавиатурата числа.

В тази програма е използван оператор за цикъл с предусловие за пресмятане на сумата на въведени от клавиатурата цели числа. Инициализиращите оператори са зададени преди цикъла (i:=10 ; s:=0 ;), а обновяването на управлящата променлива е в тялото на цикъла и се задава с оператора i:=i-1 ;. Ако се проследи действието на програмата, може да се установи броят на повторенията в оператора за цикъл. В конкретния случай броят на повторенията е 10.



Пример 2. Програма за определяне на сумата на въведени от клавиатурата числа с управление на цикъла от входния поток (въвежданите стойности).

В


{Пример 2 - Цикъл с предусловие}

Program Summr ;

Var s,a : integer ;

begin

s:=0 ;


read (a) ; {инициализиращ елемент}

while a<>0 do

begin

s:=s+a ;

readln (n) ;

end ;

writeln (‘Сумата на числата е :’,s:10) ;



end.

този пример инициализиращ оператор се явява процедурата за въвеждане на стойност на променливата а преди началото на оператора while. Ако още при първото въвеждане се въведе стойност 0, цикълът няма да се изпълни нито един път. Обновяването на стойността на управляващата променлива се извършва с оператора за въвеждане readln в тялото на цикъла. В този пример не може да се проследи броят на повторенията в цикъла.


Цикъл с постусловие.

Може да се представи логически с помощта на изречението:

Повтаряй S докато С.

С е логически израз, а S е изпълним оператор представляващ тялото на оператора. Алгоритмичната схема на оператора е показана на фиг. 9.4.

Синтактическата форма на оператора в Pascal има вида:

repeat S until S ;
Както се вижда от схемата, проверката на условието за продължаване на цикъла се прави след изпълнение на операторите от тялото на цикъла. Това означава, че тялото на цикъла ще бъде изпълнено поне веднъж. И тук инициализиращата част се намира преди оператора за цикъл, а обновяване на стойността на управляващите променливи се извършва в тялото на цикъла.

П


{Пример - цикъл с постусловие}

program Sqrt2 ;

const eps=0.00001 ;

Var a, x : real ;

begin

write (‘Въведете число а :’) ;

readlen (a) ;

x := 1;


repeat

x:=(x+a/x)/2.0 ;



until abs(a/sqr(x)-1)>eps ;

writeln (‘Sqrt2 = ‘, x:10:4) ;

writeln (‘Sqrt = ‘, sqrt(a):10:4) ;

end .

ример: Да се състави програма за изчисляване на с определена, предварително зададена точност. Да се използва факта, че границата на числовата редица е сходяща и клони към . Нулевият член на редицата е хо=1.0.

Като критерий за точност (условие за прекъсване на изчисленията) се използва условието: , където eе точност на пресмятанията.

В примера инициализиращата част се задава с оператора за присвояване на стойност на х като първи елемент от редицата (x := 1;). В тялото на цикъла се пресмята поредният член от редицата - x:=(x+a/x)/2.0 ;. В проверката на условието за продължаване на цикъла участва последният изчислен член от редицата. Когато отношението на зададеното число и квадрата на поредния член от редицата стане такова, че да се различава от 1 със стойност по-малка от зададената точност e, цикълът може да се прекрати. Последният изчислен член от редицата може да се смята за приблизителна стойност на квадратния корен на въведеното число с точност e.
Цикъл с управляваща променлива.

В много случаи броят на изпълненията на операторите от тялото на цикъл е известен предварително и тогава може да се използва цикъл, управляван с променлива. Той може да се представи с логическата фраза:



за Idnt := S1 до S2 прави S3

където Idnt е идентификатор управляващ цикъла (индекс на цикъла), който представлява проста променлива; S1 е израз чиято стойност е начално значение на Idnt; S2 - крайна стойност на управляващата променлива и S3 - оператор (оператори), който представлява тялото на цикъла.

Синтактическата форма на оператора в език Pascal има вида:

for Idnt := S1 to S2 do S3

В разгледания формат на оператора за цикъл при всяко изпълнение на операторите от тялото на цикъла стойността на Idnt се увеличава автоматично с 1 и цикълът продължава докато стойността на управляващата променлива не стане равна на крайната стойност S2. Естествено изискване при тази организация на циличната процедура е стойността на S1 да е по-малка от S2. Управляващата променлива заема всички стойности в интервала от S1 до S2. Вместо служебната дума to в оператора за цикъл може да се използва downto. Тогава при всяко изпълнение на операторите от тялото на цикъла стойността на управляващата променлива автоматично се намалява с 1. Изискването в този случай е стойността на S1 да е по-голяма от S2.

Типът на променливата Idnt и на изразите S1и S2трябва да е един и същ. Той не може да е реален тип. Допустими типове за управляваща променлива на цикъла са всички целочислени типове, булевите променливи (стойности 0 и 1) и символните типове (като номера от кодовата таблица), както и някои други типове, които ще бъдат въведени по-късно.

Е


{Пример - цикъл с управляваща променлива}

Program Sum_N ;

Var N, i, s, a : integer ;

begin

write (‘Задайте брой на числата:’) ;

readln (N) ;

writeln ; s:=0 ;



for i:=1 to N do

begin

write (‘Въведете число: ‘) ;

readln (a) ;

s:=s+1 ;


end ;

writeln (‘Сумата на числата е: ‘,s:8) ;



end.

то един пример за използване на цикъл с управление с променлива. В случая, първоначално се въвежда стойността на променливата N, която задава броя на числата, които се въвеждат от клавиатурата и се сумират. За управляваща променлива се използва целочислената променлива i, която приема начална стойност 1 и стойността й се увеличава в процеса на изпълнение до N.

В оператора за цикъл, управляван с променлива, частта for i:=1 to N do се нарича заглавие на цикъла, а съставният оператор след служебната дума do е тяло на цикъла. Инициализиращият елемент се намира в заглавието на цикъла (i:=1), а проверка на условието за край на цикъла се извършва автоматично чрез сравняване на стойността на управляващата променлива с крайната стойност (N). Ако въведената стойност за променлвата N е по-малка от началната стойност (в случая 1), операторите от тялото на цикъла няма да се изпълнят нито веднъж.



Вложение на цикли

Всеки оператор от тялото на цикъл може да бъде произволен оператор, включително и оператор за цикъл. Така се получава вложение на цикли. Цикълът, в който се влага друг цикъл, се нарича външен цикъл, а този, който се влага, се нарича вътрешен.



Пример:

for i:=1 to 9 do

for j:=10 downto 1 do

writeln (‘двойка числа: ‘i:5,j:5) ;

Тук има вложение на два цикъла, като вътрешният цикъл (индекс j) се изпълнява за всяка стойност на променливата на външния цикъл. В случая тялото на вътрешния цикъл ще се изпълни 90 пъти. Може да се организира многократно влагане на цикли един в друг.
Оператори за многовариантен избор

При описанието на алгоритми се налага да се избира между няколко възможни варианти на действие на процеса на обработка на данните. Един от начините за решаване на тази задача е използването на условен оператор в пълен или непълен формат и вложение на условни оператори. Когато алтернативните възможности са много, се получава сложна верига от вложени условни оператори, което прави алгоритъма и програмата трудни за анализ и проследяване. В език Pascal съществува оператор за многовариантен избор, който решава задачата за многовариантен избор. Синтактическият запис на оператора за многовариантен избор (оператор case) има вида:



case Sel of

p1: S1 ;


p2: S2 ;

......................



else Sv ;

end ;

където case е ключова дума от език Pascal, идентифицираща оператора за многовариантен избор; Sel е променлива, използвана като селектор. В зависимост от стойността на Sel се изпълнява някой от възможните оператори S1, S2, ..., които се обозначават с етикети р1, р2,....Етикетите р1, р2,... са константи, които могат да бъдат стойности на променливата Sel.

Операторът завършва с думата end. Когато стойността на Sel не съвпада с никоя от стойностите р1, р2,..., се изпълнява операторът, намиращ се след else. Ето един пример за използване на оператор case:


{Пример - оператор case}

Program Day ;

Var N : integer ;

begin

write (‘Задайте номер на ден:’) ;

readln (N) ;

case N of

1: writeln (‘Понеделник’) ;

2: writeln (‘Вторник’) ;

3: writeln (‘Сряда’) ;

..................

else writeln (‘Не ден от седмицата’) ;

end ;

end.

Тук N е целочислена променлива и изпълнява роля на селектор в оператор case. В зависимост от стойността на тази променлива се отпечатва съответен ден от седмицата. Когато въведената стойност за N е по-малка от 1 или по-голяма от 7 (стойности, за които липсват етикети), се изпълнява операторът else. Етикети за възможните оператори при многовариантния избор са числата от 1 до 7.

Допустимите типове данни за селектора оператор case са целочислени, символни, булеви и някои други типове, за които ще стане въпрос по-нататък. В оператора else не се допуска повторение на етикети (етикети с една и съща стойност). Могат да се използват няколко етикета с един оператор, като етикетите се отделят със запетая: 6,7: writeln (‘ Почивни дни’) ;.


Оператор Goto.

Операторът Goto се нарича още оператор за безусловен преход. Той е много мощно и същевременно опасно програмно средство и използването му трябва да бъде внимателно обмислено. По принцип е възможно създаването на програми и без помощта на Goto, но използването му в някои случаи облекчава значително алгоритъма на програмата. Много програмисти смятат употребата на този оператор за признак на недостатъчна квалификация, докато други го смятат за изключително полезен. Опасността от употребата на Goto идва от факта, че когато в алгоритъма на дадена програма се открие грешка, най-лесният начин да се поправи грешката е използване на оператора за безусловен преход, но по този начин се усложнява и обърква структурата на алгоритъма. Общата препоръка към разработчиците на програмни продукти е, когато даден алгоритъм може да се реализира с други средства да не се бърза с използването на оператор Goto.

Операторът Goto предизвиква преход в управлението на програмата на определено място, обозначено със специален етикет. Общият вид на оператора изглежда така:

Goto Lab1 ;

к


{Програма за решаване на квадратно уравнение}

program sqr_equation ;

Var a,b,c : real ; {Коефиценти на уравнението}

d,x1,x2 : real ;



Label lab_end ;

{тяло на програмата}



begin

write (‘Въведете коефиценти a,b,c :’) ;

readln (a,b,c) ;

d := b*b - 4*a*c ;



if d<0 then begin

writeln (‘Уравнението няма корени !!!’) ; goto lab_end ; end ;

d := sqrt (d) ;

x1 := (-b + d)/(2*a) ;

x2 := (-b - d)/(2*a) ;

writeln (‘Корени : х1 = ‘,х1:10:3,’; х2 = ‘,х2:10:3) ;



lab_end: ;

end.

ъдето Lab1 е етикет, се декларира в раздела за декларации на променливи и константи. Програмата за решаване на квадратно уравнение може да бъде написана без използване на пълния формат на условния оператор, но трябва да се използва оператор за безусловен преход. Етикетът lab_end се декларира посредством служебната дума Label. Самият етикет обозначава (именова) определен оператор в програмата, като за целта се използва символът двоеточие ‘:’ след наименованието на етикета. Тъй като в разглегдания пример, операторът за преход goto lab_end прехвърля управлението на програмата в края й, с етикета lab_end е обозначен празен оператор lab_end: ;.


База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница