91
раторы, continue процедурасы немесе тармақталу операторының
көмегімен іске асыруға болады. Соңғы тармақталу операторын
пайдалану тəсілі құрылымды нұсқа болып табылады.
5.5-сурет. 50-ден аспайтын 10 санның қосындысын анықтайтын
алгоритмнің схемасы
Айтылған нұсқаларды қарастырайық.
Goto операторының көмегімен шығарылған нұсқа:
Program ex;
Var i,s,a:integer;
Label cycl;
Begin
i:=1; s:=0;
while i<=10 do
begin
92
Read(a);
if a>50 then
begin
WriteLn('Енгізілген сан 50-ден аспауы ке-
рек');
goto cycl; {басқаруды цикл соңына беру}
end;
s:=s+a; {айналып өтетін операторлар тобы}
i:=i+1;
cycl: end;
WriteLn(s);
End.
Continue процедурасының көмегімен шығарылған нұсқа:
Program ex;
Uses crt;
Var i,s,a:integer;
Begin
i:=1; s:=0;
while i<=10 do
begin
Read(a);
if a>50 then
begin
WriteLn(‘Енгізілген сан 50-ден аспауы
керек’);
continue;{басқаруды келесі қадамға
береміз}
end;
s:=s+a;
i:=i+1;
end;
WriteLn(s);
End.
Құрылымды нұсқа:
Program ex;
93
Uses crt;
Var i,s,a:integer;
Begin
i:=1;
while i<=10 do
begin
Read(a);
if a>50 then WriteLn(‘Енгізілген сан 50-ден
аспауы керек’)
else
begin
s:=s+a;
i:=i+1;
end
end;
WriteLn(s);
End.
Бұл мысалда құрылымды алгоритм ең қарапайым түр болып
сана лады. Мұнда goto операторы мен continue процедурасын
қолдану тиімді емес. Continue процедурасын қолдану тек айналып
өтетін операторлар саны көп болған жағдайда ғана тиімді.
Практикалық есептерді шығаруда тəжірибесі аз программа-
лау шылар goto операторын жиі қолданатын алгоритм түрін тө-
мендегі мысал арқылы көрсетейік.
5.3-мысал. Тұтынушы енгізген аргумент мəні бойынша
функция мəнін бірнеше рет есептейтін программа құру қажет.
Нəтиже алынған нан кейін программа “Жалғастыру керек пе?”-
деп сұрайтын болсын. Егер жұмысты жалғастыру керек болса,
тұтынушы пернетақ тадан “Y”, кері жағдайда “N” əрпін енгізуі
керек. Сəйкесінше бірінші жағдайда програм
ма жұмысын
жалғастырады, ал екінші жағдайда – тоқтатады.
Программа негізінде циклдік процесс жатыр. Көп жағдайда
мұны “цикл-дейін” (5.6-сурет) операторы жəне goto операторы
көмегімен жазуға тырысады. Бұл қатені қайталамас үшін, мына
жағдайды есте сақтау керек: егер алгоритм схемасында орын-
далып кеткен программа фрагментіне басқаруды қайта беру керек
болса, онда жеке цикл қарастырып, бұл циклден шығу шартын
анықтау керек.
94
Төменде осы алгоритмді “цикл-дейін” көмегімен шығару
програм масы келтірілген.
Program ex;
Var x:real; ch:char;
Begin
repeat
Write(‘ x-ті енгізіңіз:’);
ReadLn(x); {еш уақытта Read қолданылмайды,
себебі
ары қарай символ енгізіледі}
WriteLn(‘Нəтиже ‘,sin(x):8:4);
WriteLn(‘Жалғастыру керек пе? (y/n)’);
ReadLn(ch);
until ch=’n’;
End.
5.6-сурет. Функция мəнін есептеу алгоритмінің схемасы
95
Жоғарыда айтылғандардың барлығынан мынадай қорытын ды
шыға руға болады.
1. Goto шартсыз көшу операторын жалпы Pascal программа-
ларында мүлдем қолданбаған жөн. Егер goto операторын қолдану
барысында алгоритм құрылымсыз болып шықса, онда оны
құрылымды алгоритмге түрлендіруге тырысу қажет. Бұндай
шектеу goto операто
рын қолданған жерде көп қате кездесетін
болғандықтан, қойылып отыр.
2. Break жəне continue құрылымсыз басқаруды беру процеду-
раларын қолдануға болады, бірақ бұларда басқарылудың қай
жерге берілетіндігін нақты анықтап алу керек. Циклдің осы про-
цедуралар қолданылған жерінде қате жиі кездеседі, сондық тан
программаны арнайы тестіден өткізіп отыру қажет.
Halt жəне Exit процедуралары программаны немесе ішкі прог-
рам ма
ны арнайы тоқтату үшін қолданылады. Сондықтан бұл
проце дура лар программа құрылымына онша əсерін тигіз бейді.
Бақылау сұрақтары
1. Шартсыз көшу операторын қолданудың келеңсіз жағдайларын
атаңыз.
2. Белгі дегеніміз не? Ол қалай сипатталады жəне қолданылады?
3. Бос оператор дегеніміз не?
Тапсырмалар
1. Таңдау бойынша негізгі төрт арифметикалық амалдың бірін
орындайтын «калькулятор» программасын жазыңыз. Программа
жұмыстың аяқталған-аяқталмағандығы жайлы сұрайтын бол-
сын.
2. Пернетақтадан енгізілген үш санның ең үлкенін таңдап ала-
тын программа құрыңыз. Программа жұмыстың аяқталған-
аяқталмағандығы жайлы сұрайтын болсын.
3. Пернетақтадан енгізілген санның квадрат түбірін есептейтін
программа құрыңыз. Программа жұмыстың аяқталған аяқтал-
мағандығы жайлы сұрайтын болсын.
4. Пернетақтадан енгізілген апта күнінің нөміріне байланысты сəй-
кес күннің атын экранға шығаратын программа құрыңыз. Прог-
рамма жұмыстың аяқталған-аяқталмағандығы жайлы сұрай-
тын болсын.
5. Пернетақтадан енгізілген нақты санды 2-ден 9-ға дейін дəре-
желейтін программа құрыңыз. Программа жұмыстың аяқталған-
аяқталмағандығы жайлы сұрайтын болсын.
96
6. a-дан b-ға дейінгі бүтін сандардың квадратын экранға шығаратын
программа құрыңыз.
7.
2
16
32
y
x
x
= −
+
функциясының мəнін 1-ден 10-ға дейінгі
аралықта 0,25 қадаммен есептейтін программа құрыңыз.
8.
3
2
0
2
0
x
егер x
y
x
егер
x
x
баска жагдайда
⎧⎪⎪
⎪⎪
=
− ≥ ≥
⎨⎪
⎪⎪⎪⎩
функциясының мəнін –5-тен 5-ке
дейінгі аралықта 0,5 қадаммен есептейтін программа құрыңыз.
9.
2
4
16(
2)
( )
2
x
x
f x
x
+
+
=
функциясының х а-ден b-ға дейін d қадаммен
өзгергендегі мəнін есептейтін программа құрыңыз.
10. Апталардың реттік нөмірі бойынша жыл мезгілін анықтайтын
программа құрыңыз. Программа жұмыстың аяқталған-аяқтал-
мағандығы жайлы сұрайтын болсын.
5.2 Шартты оператор
Шартты оператор программадағы шарт логикалық өрнек
ретінде берілгенде тармақталу əрекетін атқару үшін қолданылады.
Оның жазылуы:
IF <логикалық өрнек > THEN <1-ші оператор >
[ELSE <2-ші оператор >];
<келесі оператор >;
Оператордың орындалу ережесі: егер логикалық өрнек нə-
тижесі АҚИҚАТ ( TRUE) болса, онда <1-ші оператор > орын-
далады, одан кейін <келесі оператор> орындалады; егер –
ЖАЛҒАН ( FALSE) болса, онда <2-ші оператор > орындалады
да, содан кейін барып <келесі оператор> орындалады. 1-ші жəне
2-ші операторлар жəй немесе құрама оператор болуы мүмкін.
Егер оператордың ELSE-ден басталатын бөлігі жоқ болса, онда
логикалық өрнек нəтижесі ЖАЛҒАН ( FALSE) болған жағдай-
да, бірден <келесі оператор> орындалады. Шартты операторлар
қабаттасып келіп, ELSE сөзі бірнеше рет кездесетін болса, оның
əрқайсысы өзінің алдындағы IF операторында жазылған шарт-
қа байланысты атқарылады. Шартты оператордың қабаттасқан
түрінің сатылары санын өте көбейтпеген дұрыс, өйткені мұндайда
программа көрнектілігі жоғалып, қате кетуі жиіленеді.
97
Мысалы,
...IF A>0 THEN P:=P+1
ELSE
IF A<0 THEN L:=L+1
ELSE N:=N+1; ...
...IF A>0 THEN
BEGIN
S:=S+A; K:=K+1
END;...
Шартты көшу операторы (5.7-сурет) тармақталуды, яғни
белгілі бір шарт бойынша түрлі іс-əрекеттер орындауды програм-
малау үшін қолданылады. Шарт логикалық өрнек түрінде жа-
зылады да, өрнек нəтижесіне байланысты: нəтиже ақиқат (true)
болса then түйінді сөзінен кейінгі оператор, кері жағдайда else
түйінді сөзінен кейінгі оператор орындалады.
Əр тармақта бір оператор (сонымен бірге басқа if операто-
рын) немесе құрама оператор жазуға болады.
Құрама оператор дегеніміз – begin...end операторлық жақ-
шалары ішіне алынған операторлар тізбегі. Тізбектегі оператор-
лар бір-бірінен нүктелі үтір «;» арқылы ажыраты лады. Еlse сөзінің
алдына нүктелі үтір еш уақытта қойылмайды, себебі мұндайда
шарт ты оператордың жазылуы ары қарай жалғастырылады.
5.7-сурет. Шартты көшу операторының синтаксистік диаграммасы
Бұл оператордың else тармағын қолданбауға да болады. Кей-
де шартты оператордың қысқа түрлерін қабаттастыра қолдану
есептің айқындылығын көрсете алмайды. Мысалы, мына програм-
ма фрагменті алгоритм схемасының (5.8-сурет) екі нұсқасының
қайсына сəйкес екендігі түсініксіз:
if <1 шарт> then
if <2 шарт> then
7–1618
98
<1 оператор>
else
<2 оператор>;
Мұндайда “кірістіру ережесі” қолданылады: else тармағы əр
уақытта соңғы if түйінді сөзінде жазылған шартқа тиісті бола-
ды. Бұл 5.8, а-суретіндегі алгоритмге сəйкес келеді. Егер 5.8,
ə-суреттегі алгоритмді іске асыру керек болса, онда операторлық
жақшаларды қолдану керек:
if <1 шарт> then
begin
if <2 шарт> then
<1 оператор>
end
else <2 оператор >;
5.4-мысал. Төменде көрсетілген функция мəнін есептейтін
программа жазу қажет:
, егер
1;
2, егер 1
2;
4, егер
2.
x
x
y
x
x
x
⎧⎪
≤
⎪⎪⎪
⎪
=
<
≤
⎨⎪
⎪
>
⎪⎪⎪⎩
5.8-сурет. Алгоритмдер фрагменттері
99
Бұл программаны аргумент мəнін енгізуден бастау керек.
Енгізіл ген мəннің қандай аралықта жатқанына байланысты функ-
ция мəнін берілген өрнектің бірі бойынша есептейміз. Бұл есепті
шешу алгоритмі 5.9-суретте көрсетілген. Программа мəтіні
төменде берілген.
Program ex;
Var x,y:real;
Begin
WriteLn('Аргумент мəнін енгіз:');
ReadLn(x);
if abs(x)<=1 then y:=abs(x) {бірінші аралық}
else
if (abs(x)>1) and (abs(x)<=2)
then y:=sqr(x) {Екінші аралық}
esle y:=4; {Үшінші аралық}
WriteLn(' x=',x:8:5,' болғанда y=',y:8:5)
End.
5.9-сурет. Берілген аралықта функция мəнін есептеу алгоритмінің схемасы
100
Бақылау сұрақтары
1. Шартты оператор не үшін керек?
2. Шартты оператордың жазылуының екі формасының айырмашы-
лығы неде?
3. Шартты оператордың ішінде басқа шартты операторды жазуға
бола ма?
4. Құрама оператор қайда жəне қалай қолданылады?
5. Шартты оператордың блок-схемасының орындалуын түсіндіріңіз.
Тапсырмалар
1. M(x,y) нүтесі орналасқан квадранттың нөмірін анықтап, экранға
шығарыңыз.
2. X, Y нақты сандары берілген. Сандардың кішісін олардың жарты
қосындысымен, ал үлкенін олардың екі еселенген көбейтіндісімен
алмастырыңыз. Есептеулер нəтижесін экранға шығарыңыз.
3. Үш нақты сан берілген. Осы сандардың ішіндегі оң сандарды ква-
драттап, экранға шығарыңыз.
4.
*
0
2
4
2
0
0
x x
егер
x
y
x
егер
x
баска жагдайларда
⎧⎪⎪
⎪⎪
=
+
−
≤
⎨⎪
⎪⎪⎪⎩
≺ ≺
≺
функциясының мəнін есептейтін
программа жазыңыз.
5. Үш санның ең үлкенін анықтайтын программа құрыңыз.
6. x, y сандары берілген. Егер x жəне y теріс сан болса, онда оларды
модульдерімен алмастырыңыз; егер тек біреуі ғана теріс сан бол-
са, олардың екеуін де 0.5-ке өсіріңіз; егер екеуі де оң сан болса, онда
оларды 10 есе өсіріңіз.
7. M(x,y) нүктесі радиусы r, центрі a,b нүктесінде орналасқан дөң-
гелектің ішінде жататындығын анықтаңыз.
8. M(x,y) нүктесі центрі координаталар жазықтығының басын-
да орналасқан, сыртқы радиусы R1, ішкі радиусы R2 шеңберге
жататындығын анықтайтын программа құрыңыз.
9. a, b, c үш саны берілген. a
«Дұрыс» немесе «Дұрыс емес» деген түрде экранға шығарыңыз.
10. Ең жақын бүтін санға дейін дөңгелектелген a жəне b сандарының
бөліндісі жұп сан екенін анықтаңыз.
5.3 Таңдау операторы
Жоғарыда біз тармақталу операторын да белгілі бір шарттың
орындалу немесе орындалмауына байланысты алгорит м нің 1-ші
немесе 2-ші операторы орын
далатынын қарастырдық. Алайда,
көбінесе мүмкін болатын жағдай екеу емес, одан да көп бола
береді, яғни процесс көп тармақты бо ла ды.
101
CASE таңдау операторы алгоритм құрамындағы екіден көп
тармақтың бірін таңдау керек болған кезде шартты оператордың
орнына қолданылады.
Тармақталу берілген логикалық мəнге ие бо латын өрнек тү-
ріндегі шартты тексеруден басталады, өр нек (селектор) мəндері
таңдап алынған типтердің бірі болатын бүтін, символдық, логика-
лық типтердің бірінде жазылады. Бұл өрнек оператор орындалар
кезде белгілі бір мəнге ие болуы тиіс. Сол мəн оған байланысты
орын да латын оператордың белгісі рөлін атқарады. Егер өр нектің
есептелген мəні көрсетілген мəннің біріне сəйкес келсе, сол
қатардағы оператор орындалады.
CASE таңдау операторы көп тармақты алгоритмдерді барынша
қарапайым жəне көрнекі түрде жазуға мүмкін дік береді. Оның
құрамында селектор ( selector – таңдау) деп аталатын өрнек жəне
параметрлер тізімі болуы тиіс, əрбір параметрге сəйкес таңдау
тұрақтылары болуы қа
жет. CASE операторының синтаксистік
диаграммасы (5.10-сурет) бы лай кескінделеді:
Ал, оның жалпы жазылу түрі:
CASE < селекторлық өрнек > OF
<белгі> ,<белгі> :<1
оператор>;
,<белгі>..<белгі>
<белгі>
,<белгі>
:<2 оператор>;
,<белгі>..<белгі>
<белгі>
,<белгі>
: ;
,<белгі>..<белгі>
[ELSE <оператор>]
END
5.10-сурет. Таңдау операторының синтаксистік диаграммасы
102
Селекторлық өрнек (селектор, ауыстырғыш) пен белгі тү-
ріндегі тұрақты (белгі нұсқалар, таңдау белгісі) бір типті болуы
керек. Белгі-тұрақты программадағы белгілер тəрізді белгілер
бөлімінде сипаттауды талап етпейді. Белгі-тұрақтыларға GOTO
операторында сілтеме жасауға болмайды. Белгілер саналатын не-
месе интервалды түрде берілуі тиіс.
Диаграммаға сəйкес таңдау операторы төмендегідей ықшамды
түр де де жазылады:
case <селектор-өрнек > of
<1-белгі>: <1-оператор>
<2-белгі >: <2-оператор>
. . .
<
n - белгі >: < n-оператор>
else <
n+1-оператор>
end;
Таңдау операторы төмендегідей ереже бойынша орындалады:
алдымен селекторлық өрнек есептеледі; сонан кейін белгі нұсқасы
селектордың ағымдағы мəніне сəйкес оператор орындалады;
бұдан кейін CASE операторынан кейін орналасқан операторға
көшу атқарылады. Егер селектор мəні белгі нұсқаларының
ешқайсысымен сəйкес келмесе, онда ELSE түйінді сөзінен кейін
орналасқан оператор орындалады. ELSE тармағы жоқ болған
жағдайда, CASE операторы нан кейін орналасқан оператор
атқарылады.
Мысалы, төмендегі функцияны есептеу қажет болсын делік:
cos ,
3
sin ,
2
,
1
ln ,
0
0,
x
x
егер k
x
егер k
Z
e
егер k
x
егер k
⎧
=
⎪⎪⎪
⎪
=
⎪⎪⎪⎪
=
=
⎨⎪
⎪
=
⎪⎪⎪
⎪⎪⎪⎩
басқа жағдайда
мұндағы k мəніне сəйкес белгілер жазып, соларға төмендегідей
түрде көшу əрекеттерін орындаймыз:
… CASE K OF
0: Z:= LN(X);
1: Z:= EXP(X);
103
2: Z:= SIN(X);
3: Z:= COS(X)
ELSE
Z:= 0
END; …
Бұл мысалда k параметрінің мəніне байланысты стандартты
функциялардың бірі есептеледі. k параметрінің мəні таңдау
операто р ларына дейін белгілі болуы тиіс.
Келесі мысалда JAUAP айнымалысы V символдық айныма-
лысының енгізілген мəніне байланысты YES немесе NO мəн-
дерінің біріне ие болады. Бұл жерде белгілер үтір арқылы бөлініп,
тізбек түрінде берілген.
… VAR V: CHAR;
JAUAP: STRING;
…
CASE V OF
‘D’, ‘d’, ‘Д’, ‘д’: JAUAP:=‘YES’;
‘N’, ‘n’, ‘Н’, ‘н’: JAUAP:=‘NO’
ELSE
JAUAP:=‘ ’
END; …
Келесі мысалда белгі нұсқалары интервалмен берілген.
… VAR V:CHAR;
JAUAP:STRING;
…
CASE V OF
‘A’..‘Z’,’a’..‘z’:JAUAP:=‘əріп’;
‘0’..‘9’:JAUAP:=‘цифр’
ELSE
JAUAP:=‘арнайы символ‘
END; …
Таңдау операторы бірнеше нұсқалар ішінен қандай да бір
параметрдің мəніне тең нұсқаны іске асыру үшін қолданылады.
5.5-мысал. Көрсетілген нүктеде берілген функция мəнін есеп-
тейтін программа жазу керек.
104
Тұтынушыға функцияны қарапайым менюден таңдауға мүм-
кіндік берейік. Əр функцияға қандай да бір сан (код) сəйкес келеді:
Функция кодын енгізіңіз:
1 – y=sin(x)
2 – y=cos(x)
3 – у=ехр(х)
Енгізілген кодқа сəйкес функция таңдалып алынады. 5.11-су-
ретте программа алго рит мінің схемасы берілген.
Төменде құрастырылған алгоритмді іске асыратын программа
мəтіні берілген.
Program ex;
Var x,y:real; Kod:byte; key:boolean;
Begin
WriteLn(‘ Функция кодын енгіз:');
WriteLn(‘1 – sin(x)’);
WriteLn(‘2 – cos(x)’);
WriteLn(‘3 – exp(x)’);
ReadLn(Kod);
Write(‘Аргумент мəнін енгіз’);
ReadLn(x);
Key:=true; {код дұрыстығының белгісі}
case Kod of
1: y:=sin(x);
2: y:=cos(x);
3: y:=exp(x);
else Key:=false; {код функцияға сəйкес емес}
end;
if Key then
WriteLn(‘ x=’,x:12:6,’y=’,y:12:6)
else
WriteLn(‘Функция коды дұрыс
енгізілмеген.’);
End.
5.6-мысал. Апта күндерінің реттік нөмірі бойынша олар дың
аттарын анықтайтын программа құру керек.
105
PROGRAM DAY;
VAR kyn: іnteger;
{Бұл программада бірден}
BEGІN
wrіte(‘
күннің реттік нөмірі:’);
readln(kyn);
{жетіге дейінгі кез кел-
ген}
{сан енгізіліп, егер ол}
case kyn of
1: wrіteln ('дүйсенбі');
2: wrіteln ('сейсенбі');
3: wrіteln ('сəрсенбі');
4: wrіteln ('бейсенбі');
5: wrіteln ('жұма');
6: wrіteln ('сенбі');
7: wrіteln ('жексенбі');
end
else wrіteln('1..7аралы-
ғындағы сан енгізу керек')
END.
{1-ге тең
болса,»дүйсенбі»}
{2-ге тең
болса,»сейсенбі»}
{3-ке тең
болса,»сəрсенбі»}
{4-ке тең
болса,»бейсенбі»}
{5-ке тең болса,»жұма»}
{6-ға тең болса,»сенбі»}
{7-ге тең
болса,»жексенбі»}
{деген сөз жазылып
шығады.}
5.7-мысал. Кез келген жыл мерзімін енгізіп, сол жылдың
шығыс календары (қазақша жыл санау) бойынша қай жануардың
атына сəйкес келетінін анықтау программасы төмендегідей бо-
лады. Алгоритм негізіне 12-ге қалдықсыз бөлінетін жыл мешін
жылы болатыны алынған.
PROGRAM GУL1;
VAR
gуl: іnteger;
BEGІN
wrіte ( ' Керекті жылды енгіз: ' ) ;
readln (gуl);
wrіte (gуl:4, ' жыл ' );
case (gуl mod 12) of
0: wrіte (' мешін ' );
1: wrіte (' тауық’ ) ;
2: wrіte (' ит ' ) ;
3: wrіte (' доңыз ' ) ;
4: wrіte (' тышқан ' ) ;
5: wrіte (' сиыр ' ) ;
106
6: wrіte (' барыс ' ) ;
7: wrіte (' қоян ' ) ;
8: wrіte (' ұлу ' ) ;
9: wrіte (' жылан ' ) ;
10: wrіte (' жылқы ' ) ;
11: wrіte (' қой ' )
end;
wrіteln(‘ жылы болды ‘ )
END.
5.8-мысал. Кез келген айдың бірінші жұлдызы аптаның
қай күні екені белгілі болғанда, сол айдың енгізілген кез келген
күнінің аптаның қандай күні болатынын анықтау программасын
құру қажет.
PROGRAM case1;
Label 10;
const
k=1; {айдың бірі дүйсенбі болған}
{егер айдың бірі сейсенбі
болса,
k==2, егер айдың бірі
сəрсенбі болса k=3 т.с.с. }
VAR den,
n: іnteger; t: char;
BEGІN
10: wrіte(‘айдың күнін енгіз:’);readln (den);
n:= den mod 7+k-1; іf n>7 then n:=n-7;
wrіte (‘айдың’, den: 3,’күні’);
CASE
n of
1: wrіte (‘дүйсенбі’);
2: wrіte (‘сейсенбі’);
3: wrіte (‘сəрсенбі’);
4: wrіte (‘бейсенбі’);
5: wrіte (‘жұма’);
6: wrіte (‘сенбі’);
7: wrіte (‘жексенбі’)
end;
wrіteln(‘болады’);
wrіteln(‘тағы енгізесің бе? (иə=”
y”, жоқ=”n”)’);
readln (
t);
іf
(t=’Y’) or (t=’y’) then goto 10
END.
2>1>2>1>2>1>2>1>2>1>0> Достарыңызбен бөлісу: |