Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AEP_LEKTsII.doc
Скачиваний:
90
Добавлен:
28.03.2015
Размер:
1.27 Mб
Скачать

10.2 Алдынғы шартты цикл операторлары (while)

Алдынғы шартты цикл (while сөзінен басталатын) операторы оператордың (ол құрама оператор да болуы мүмкін) қайталап орындалуын басқаратын өрнекті қамтиды. while операторы кейбір шартты циклдың басында тексеру үшін пайдаланылады.

Ол арқылы оператордың қайталап орындалуын басқару жүзеге асырылатын өрнек бульдік типке ие болуы тиіс. Ол ішкі оператор орындалғанша есептеледі. Өрнек Тruе мәнді қабылдап тұрса ішкі оператор қайталанып орындала береді. Егер өрнек ең басынан False мәнін қабылдаса онда алдынғы шартты цикл операторының ішінде қамтылған оператор орындалмайды. Алдынғы шартты цикл операторының мысалдары: (сонымен қатар, қосымшадағы Р3 және Р10 программалары).

while Data[I] <> X do I := I + 1;

while I > 0 do begin if Odd(I) then Z := Z * X; I := I div 2; X := Sqr(X); end;

while sum<1000 do begin

I := I + 1; sum:=sum+a; end;

while not Eof(InFile) do begin Readln(InFile,Line); Process(Line);end;

while циклының операторы келесі формаға ие:

while шарт do

оператор

Шарт логикалық типтегі өрнек болып табылады, ал do-дан кейінгі оператор цикл тұлғасы деп аталады. Циклдың әр итерациясының алдында шарт есептеледі де егер ол ақихат болса онда цикл тұлғасы орындалады, кері жағдайда циклдан шығу орын алады.

Егер шарт әрдайым ақихат болып қала берсе, онда циклденіп қалу орын алуы мүмкін:

while 2>1 do

write(1);

Циклденіп қалған программаны тоқтату үшін Ctrl-F2 клавиштер комбинациясын немесе кнопкасын басу керек. Pascal ABC-те while циклдың тұлғасы бос болуы мүмкін емес.

while цикл операторының repeat цикл операторынан негізгі ерекшеліктері:

1. while цикл операторының тұлғасында тек жалғыз оператор тұруы мүмкін. Циклде бірнеше операторларды орындау үшін цикл тұлғасы операторлық beginend жақшаларға алынуы тиіс.

repeat операторында операторлық жақшалар қойылмайды, себебі оларды қызметші repeatuntil сөздер алмастырады.

2. while операторында егер логикалық шарт бірден жалған болып табылса цикл тұлғасы бір де бір рет орындалмауы мұмкін.

repeat операторында логикалық өрнек цикл тұлғасынан кейін жазылады. Сондықтан, цикл тұлғасы міндетті түрде кемінде бір рет болса да орындалады.

Блок-схемаларда while цикл операторына 10.2 суретте көрсетілген құрылым сәйкес

Сурет 10.2 - while оператордың жұмыс жасау блок-схемасы

Мысал 10.2 (бұл 10.1 мысал шешімінің екінші нұсқасы). Бір айнымалысы бар функцияны табуляциялау есебін шешу керек, яғни аргументі [-0.5, 2.5] аралықта 0.1 қадаммен өзгеретін функцияның мәндер кестесін есептеу керек. Бұл есепте айнымалы циклдың басқарушы айнымалысы болып табылады.

Алгоритмнің блок-схемасы 10.3 суретте. 10.2 мысалдың программасы:

Program P10_2;

Var a, b, x, y: real;

Begin

writeln(‘Бастапқы деректерді енгізіңіз’); read(a, b);

writeln (‘ x y(x)‘); x := -0.5;

while x <= 2.5 do

begin

y := ln(abs(x))/(a*a - b*b);

writeln(x:8:1, y:8:1)

x := x + 0.1;

end;

End.

Сурет 10.3 - 10.2 мысалға блок-схема

10.3 Параметрлі цикл операторлары (for)

Параметрлі цикл (for сөзінен басталатын) операторы басқарушы айнымалыға мәндердің өспелі тізбектілігі меншіктеліп тұрғанда тұлғасындағы оператордың қайталанып орындалуына әкеледі.

Басқарушы айнымалы ретінде for операторы қамтылған локальды блокта сипатталған айнымалыны белгілейтін идентификатор пайдаланылуы тиіс. Басқарушы айнымалы санақтап шығу типіне ие болуы тиіс. Бастапқы және соңғы мәндері санақтап шығу типімен меншіктеу бойынша үйлесімді болатын типке ие болуы тиіс.

for операторы орындала бастағанда бастапқы және соңғы мәндері жалғыз рет анықталады да сол мәндер for оператордың бүкіл орындалу барысында сақталады.

for оператордың тұлғасында қамтылған оператор бастапқы және соңғы мәндер аралығындағы әр мән үшін бір рет орындалады. Басқарушы айнымалы әрдайым бастапқы мән арқылы инициализацияланады. for оператордың орындалу барысында басқарушы айнымалының мәні әр қайталануда бірлікке өсіп тұрады. Егер бастапқы мән соңғы мәннен асатын болса онда for оператордың тұлғасында қамтылған оператор орындалмайды. Цикл операторында downto кілттік сөзі қолданған жағдайда басқарушы айнымалының мәні әр қайталануда бірлікке азайып тұрады. Егер мұндай оператордағы бастапқы мән соңғы мәннен аз болса онда цикл операторының тұлғасында қамтылған оператор орындалмайды. Егер for цикл операторының тұлғасында қамтылған оператор басқарушы айнымалының мәнін өзгертетін болса, онда ол қате болып саналады. for операторы орындалып аяқталғаннан кейін басқарушы айнымалының мәні анықталмаған болып қалады, егер for оператордың орындалуы өту операторы арқылы үзілмеген болса. Егер осы шектеулерді ескерсек, онда

Оператор:

for V := Expr1 to Expr2 do Body;

оператор:

for V := Expr1 downto Exp2 do Body;

Келесі операторларға эквивалентті:

begin

Temp1 := Expr1;

Temp2 := Expr2;

if Temp1 <= Temp2 then

begin

V := Temp1;

Body;

while V <> Temp2 do

begin

V := Succ(V);

Body;

end;

end;

end;

Келесі операторларға эквивалентті:

begin

Temp1 := Expr1;

Temp2 := Expr2;

if Temp1 >= Temp2 then

begin

V := Temp1;

Body;

while V <> Temp2 do

begin

V := Pred(V);

Body;

end;

end;

end;

мұндағы Temp1 және Temp2 - типтері V айнымалының негізгі типіне сәйкес болатын және олар программаның басқа жерлерінде кездеспейтін қосымша айнымалылар. Параметрлі цикл операторына және мысалдар:

for I := 2 to 63 do

if Data[I] > Max then Max := Data[I]

for I := 1 to 10 do

for J := 1 to 10 do

begin

X := 0;

for K := 1 to 10 do

X := X + Mat1[I,K]*Mat2[K,J];

Mat[I,J] := X; end;

for C := red to blue do Check(C);

Кәдімгі жағдайда кейбір айнымалы (индекстелген айнымалы) көрсетілген аралықтағы мәндерді қабылдай бергенше операторлар жиынтығы белгілі бір рет орындалады. Мысалы, ертерек келтірілген P10 программаны келесі түрде модификациялайық:

program P10A;

var

Count : integer;

begin

for Count := 1 to 10 do

Writeln('Сәлеметсіз бе және сау болыңыз!');

Writeln('Бұл соңы!')

end.

Бұл программаның орындалу барысында қарастырылатын цикл while және repeat циклдары сияқты орындалатынына және ол while циклына тіпті эквивалентті екендігіне көз жеткізуге болады.

for циклы келесі программаға эквивалентті:

index := expr1;

while index <= expr2 do

begin

оператор

Inc(индекс)

end;

Сонымен, for циклының операторы екі форманың біреуіне ие:

for айнымалы:=бастапқы мән to соңғы мән do

оператор

немесе

for айнымалы:=бастапқы мән downto соңғы мән do оператор

for сөзінен бастап do сөзіне дейінгі мәтін цикл тақырыбы деп, ал do –дан кейінгі оператор цикл тұлғасы деп аталады. for сөзінен кейінгі айнымалы цикл параметрі деп аталады. to кілттік сөзі бар циклдың бірінші формасы үшін цикл параметрі әрдайым бірлікке өсіп бастапқы мәннен соңғы мәнге дейін өзгереді, ал downto кілттік сөзі бар циклдың екінші формасы үшін цикл параметрі әрдайым бірлікке азаяды. Цикл тұлғасының бір рет қайталануы цикл итерациясы деп аталады. Цикл аяқталғаннан кейін цикл параметрінің мәні анықталмаған болып саналады.

Егер for ... to циклы үшін цикл айнымалысының бастапқы мәні соңғы мәннен үлкен болса немесе for ... downto циклы үшін цикл айнымалысының бастапқы мәні соңғы мәннен аз болса, онда цикл тұлғасы бір де бір рет орындалмайды. Егер цикл процедурада немесе функцияда пайдаланылатын болса, онда циклдың параметр-айнымалысы локальды ретінде сипатталуы тиіс.

for в Pascal ABC –да цикл тұлғасы бос болуы мүмкін емес. Циклдың параметр-айнымалысын цикл ішінде өзгерту логикалық қате болып табылады. Мысалы, бірінің ішіне бірі салынған for операторы бар келесі фрагмент қате болып табылады:

for i:=1 to 10 do

for i:=1 to 5 do

write(i);

Циклдың параметр-айнымалысы кез келген реттік типке ие болуы мүмкін (бүтін, символдық, санақтап шығу немесе аралық). Бұл кезде бастапқы және соңғы мәндердің типтері цикл параметрінің типіне сәйкес болуы тиіс. Мысалы:

var

en: (red,green,blue,white);

c: char;

...

for en:=red to blue do

write(Ord(en):2);

for c:='a' to 'z' do

write(c);

for циклының негізгі кемшілігі ол цикл параметрін тек 1-ге ғана өсіруге немесе азайтуға мүмкіндік беретіндігінде. Оның негізгі артықшылықтары қатарына ықшамдық және мәндер аралығында символдық және санақтап шығу типтерін пайдалану мүмкіндігі жатады.

Бірнеше мысалдарды қарастырайық.

Блок-схемаларда for цикл операторына 10.4 суреттегі құрылым сәйкес.

Сурет 10.4 - for операторың жұмыс жасау блок-схемасы

Мысал 10.4. Есептегішті ұйымдастыру алгоритмі. Кейбір тізбектілік берілген. Тізбектіліктің оң таңбалы мүшелер санын анықтау керек.

Program P10_4;

Var

a: real;

n, L: integer;

Begin

L := 0;

for n := 1 to 50 do

begin

a := cos(2  n - 1);

if a>0 then L := L + 1;

end;

writeln('L=‘, L);

End.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]