144
PASKAL DASTURLASH TILIDA OPERATORLAR
Reja
1.
Turbo Paskal dasturlash tilida operatorlarning tasnifi.
2.
Tarmoqlanuvchi operatorlar.
3.
Takrorlanuvchi operatorlar.
Tayanch so'z va iboralar: dasturlash, dasturlash tili, operatorlar, sodda
operatorlar, chiziqli, tarmoqlanuvchi, takrorlanuvchi operatorlar, o'zlashtirish
operatori, arifmetik, mantiqiy o'zlashtirish operatori.
КИРИШ
Ҳозирги кунда жуда кўп алгоритмик тиллар мавжуд. Бу тиллар ичида
Паскаль тили универсал тиллардан бири бўлиб, бошқа тилларга қараганда
имкониятлари кенгроқ
тилдир.
Сўнги йилларда
Паскаль
тили
жуда
такомиллашиб, тобора оммалашиб бормоқда. Паскаль тилида программа тузиш
учун Турбо Паскаль ва Дельфи дастурлаш воситалари мавжуд. Бу дастурлаш
воситалари замонавий компьютер технологиясининг ҳамма талабларини ўз
ичига олган ва унда дастур тузувчи учун ҳамма қулайликлар яратилган.
Маърузада Турбо Паскаль дастурлаш тилида операторларнинг таснифи.
Тармоқланувчи ва такрорланувчи операторлар келтирилган.
1. Турбо Паскаль дастурлаш тилида операторларнинг таснифи.
Содда операторлар.
Операторларнинг бўлувчиси, содда операторлар, шартсиз ўтиш опе-
ратори, процедурани чақириш оператори, бўш оператор, ўзлаштириш
оператори, структурали оператор.
Turbo Pascal тилидаги дастурнинг асосий қисми операторлар кетма-
кетлигидан иборат, ҳар битта оператор берилганлар устида амал бажаради.
Операторларнинг бўлувчиси сифатида нуқта вергул белгиси ишлатилади. Turbo
Pascal тилидаги ҳамма операторлар икки гуруҳга бўлинади: содда ва
структурали. Таркибига бошқа операторлар кирмаган операторлар содда
145
операторлар дейилади. Бунга ўзлаштириш оператори, шартсиз ўтиш оператори,
процедурани чақириш оператори ва бўш операторлар киради. Ўзлаштириш
оператори (:=) ўнг томонда берилган ифодани бажаришни ва унинг қийматни
чап томонда турган ўзгарувчига тенглаштиради. Ифода ва ўзгарувчининг
тоифаси бир хил бўлиши керак.
Мисол:
FuneКеy := False;
Ch := ’F’;
Sum:= Х + Y;
Шартсиз ўтиш оператори (goto) "...га ўтиш" деган маънони англатади ва
у бирор оператор бажарилганидан кейин навбатдаги операторни бажаришга
эмас, балки бошқа бирор белги ёрдамида белгиланган операторни бажаришда
фойдаланилади. Эслатиб ўтамиз, белги рақам ёки ҳарф символидан иборат
бўлиши мумкин.
Мисол : GOTO 999;
GOTO END Block; Goto оператори ишлатилганда белги таъсир қиладиган жой
бу фақат шу оператор ёзилган блок бўлиши мумкин. Бошқаришни бошқа блокка
узатиш ман этилади.
Процедуранинг чақириш оператори фойдаланувчи
томонидан белгиланган процедурани ёки стандарт процедурани ишга тушириш
учун
ишлатилади.
Масалан:
СlSer;
{стандарт
процедурани
чақириш}
UnitWоrк(True); {фойдаланувчи процедурасини чақириш} Бўш оператор хеч
қандай амал бажармайди ва унинг таркибида хеч қандай символлар йўқ. Одатда
бўш оператор локал ёки глобал блокнинг охирига ўтишда ишлатилади:
LABEL Metka;
...
BEGIN
... GOTO Metka; {Блок охирига ўтиш}
... Metka: {бўш оператор Metka ёрдамида белгилаб қўйилган}
END;
Структурали операторлар қатиян белгиланган қоидалар бўйича бошқа
операторлардан тузилган операторлардир. Барча структурали операторлар уч
гуруҳга бўлинади:таркибий, шартли, қайтариладиган. Таркибий оператор бу
146
бир-биридан нуқта вергул белгиси ва BEGIN ва END оператори қавслар
ёрдамида ажратилган операторлар гуруҳидир:
BEGIN
<оператор;>
...
<оператор>
END;
Таркибий оператор дастурлаш тилининг синтаксиси рухсат берадиган
исталган қисмида жойлашиши мумкин .
Паскал тилининг операторлари
Программанинг асосий вазифаси бошланғич маълумотларни қайта ишлаб,
қўйилган масаланинг натижасини берувчи амалларни бажаришдан иборат.
Алгоритмик тилларда бирор-бир масалани ечишда маълумотлар устидаги
амалларни бажариш операторлар зиммасига юклатилади. Программалаш
тилларидаги ҳар бир оператор, маълумотларни қайта ишлаш жараёнининг
мустақил босқичи бўлиб, мантиқан якунланган ҳисобланади. Программада
ёзилган операторларни тўғри талқин қилиш учун уларни ёзиш қоидалари
(операторнинг синтаксиси) қатъий аниқланган бўлиши шарт.
Шундай қилиб, айтиш мумкинки программа бу - турли хил вазифаларни
бажарувчи ва ягона мақсадга элтувчи операторларнинг тўпламидир. Ҳар бир
оператор ; (нуқта-вергул) белгиси билан якунланади. Мавжуд программалаш
тили рухсат берган операторлардан унумли ва оқилона фойдаланиб, мукаммал
программалар яратиш дастурчининг билимига, тажрибасига ва санъатига
боғлиқдир.
Қуйида Паскал тилининг асосий операторлари билан тўлиқроқ танишиб,
улардан дастурлашда фойдаланиш йўлларини ўрганамиз.
Ўзлаштириш оператори
Одатда программа натижасини ҳосил қилиш учун жуда ҳам кўп оралиқ
ҳисоб ишларини бажаришга тўғри келади. Оралиқ натижаларни эса маълум
муддатга сақлаб туриш лозим бўлади. Бу ишларни бажариш учун тилнинг энг
асосий операторларидан бири бўлмиш - ўзлаштириш оператори ишлатилади:
147
<ўзлаштириш оператори>:=<ўзгарувчи>:=<ифода>;
Бу ерда := ўзлаштириш белгиси ҳисобланади, бу белгини = (тенглик)
белгиси билан алмаштирмаслик зарур. Ўзлаштириш операторида :=
белгисининг ўнг томонидаги <ифода> қиймати аниқланилиб, сўнг чап
томондаги ўзгарувчига ўзлаштирилади ёки бошқача қилиб айтганда, ифода
қиймати ўзгарувчи номи билан хотирада эслаб қолинади. Ўзгарувчининг
олдинги қиймати эса (агар у бўлса) йўқ бўлиб кетади.
Ўзлаштириш операторини ёзишдаги энг муҳим нарса, бу ифода ва
ўзгарувчиларнинг бир хил типли бўлишлигидир.
Ўзлаштириш белгисининг ўнг томонидаги ифоданинг натижавий типига
қараб, ўзлаштириш операторини уч хил гуруҳга ажратиш мумкин: арифметик
ўзлаштириш оператори, мантиқий ўзлаштириш оператори, белгили
ўзлаштириш оператори.
Арифметик ўзлаштириш оператори
Бутун ёки ҳақиқий типли, сонли натижа берувчи ифодани (одатда бундай
ифодани арифметик ифода деб аталади) ҳисоблаш учун арифметик ўзлаштириш
операторидан фойдаланилади. Арифметик ифодада қатнашувчи барча
ўзгарувчилар ҳақиқий ёки бутун типли бўлиши керак. Арифметик ифода-
сонлар, ўзгармаслар, ўзгарувчилар ва функциялардан ташкил топади, ҳамда +, -
, *, /, div, mod каби амаллар ёрдамида ёзилади. Арифметик амалларни
бажарилиши қуйидаги тартибда бўлади : *, /, div, mod, +, -.
Ифодани бажарилишидаги бу тартибни ўзгартириш учун кичик
қавслардан фойдаланилади. Ифоданинг қавслар ичига олиб ёзилган қисмлари
мустақил ҳолда биринчи галда бажарилади.
Санаб ўтилган арифметик амалларнинг вазифалари бизга математика
курсидан маълум. Лекин, бу рўйхатдаги div ва mod амаллари билан таниш
эмасмиз. Div – бутун бўлишни англатади, бўлинмани бутун қисми қолдирилиб,
қолдиқ ташлаб юборилади. Мисол:
7 div 2 қ 3
5 div 3 қ 1
-7 div 2 қ -3
-7 div –2 қ 3
2 div 5 қ 0
3 div 4 қ 0
148
Мod – бутун сонлар бўлинмасининг қолдиғини аниқлайди. m mod n
қиймат фақат n>0 дагина аниқланган. Агар m≥0 бўлса m mod nқm-((m div n)*n),
m<0 бўлса m mod nқm-((m div n)*n)+n, m mod n нинг натпешщ23гижаси доим
мусбат сондир. Мисол:
7 mod 2 қ 1
3 mod 5 қ 3
(-14) mod 3 қ 1
(-10) mod 5 қ 0
Мантиқий ўзлаштириш оператори
Агар ўзлаштириш операторининг чап томонидаги ўзгарувчи boolean
(мантиқий) типига тегишли бўлса, операторнинг ўнг томонида натижаси true
¸ки false бўлган мантиқий ифода бўлиши шарт.
Яъни мантиқий ифоданинг натижавий қиймати true (рост) ¸ки false
(ёлғон) бўлади.
Мантиқий ифодада амалларнинг бажарилиш тартиби қуйидагича:
1.
Not
2.
*, /, div, mod, and
3.
+,-,or
4.
қ, <, >, <қ, >қ,<>
Мантиқий ифодада ҳам амаллар кетма-кетлигини ўзгартириш учун кичик
қавслардан фойдаланилади.
Мантиқий ифодага доир мисоллар:
1.
x<2*y
2.
true
3.
not not d
4.
(x>y/2)
5.
d and (xқy) and b
6.
(C or D) and (xқy) or not B
Мантиқий ўзлаштириш операторига доир мисоллар:
149
d:қtrue;
b:қ (x>y) and (kқ0);
c:қD or B and true;
VAR Global Flag:Boolean;
FUNCTION GETSQR( x:real );
Const SQRMAX=100;
Begin
X:=x*x;
GlobalFlag:=( x>SQRMAX );
If GlobalFlag then x:=SQRMAX;
GetSQR:=x;
End;
.Муносабат амаллари ва ифодалари.
Муносабат ифодалари натижанинг рост ёки ёлғонлигини аниқлайди.
Муносабат амаллари иккита ифодани бир-бирига солиштириб, ифоданинг
қиймати рост ёки ёлғонлигини аниқлайди. Қуйидагида ШЭҲМ лар учун Pascal
тилининг муносабат амаллари келтирилган. Натижа мантиқий тоифаcида
бўлиб, True(рост) ва False (ёлон) қийматларни қабул қилади.
Муносабат амаллари
Амал
Номи
Ифода
Натижа
=
<>
>
Тенг
тенг эмас
катта
А=Б
А<>Б
А>Б
True, агарда А тенг Б бўлса
True, агарда А тенг эмас Б
True, агарда А катта Б
150
<
>=
<=
in
кичик
катта ёки
тенг
кичик ёки
тенг
алоқадoрлик
А<Б
А>=Б
А<=В
А in М
True, агарда А кичик Б
True, агарда А катта ёки тенг Б
True, агарда А кичик ёки тенг Б
True, агарда А М нинг рўйхатида
турса
Мантиқий ифодалар ва амаллар
Мантиқий (Мантиқий) ифодалар( AND, ОR, NOT,ХОR), кўрсатгични ташкил
этиш амаллари
Мантиқий (Мантиқий) ифода бажарилганидан кейинги натижа Trueёки
False бўлади. Мантиқий ифодаларнинг содда кўринишлари қуйидагича:
- мантиқий константа;
- мантиқий ўзгарувчилар;
- мантиқий тоифадаги массив элементлари;
- мантиқий функция;
- муносабат ифодалари.
Тармоқланиш буйруғи
Шартли буйруқ, шарт, жойлаштирилган буйруқлар.
Turbo Раскал тилида иккита шартли буйруқлар мавжуд: IF ва CASE. IF
шартли буйруғи, буйруқларнинг бажарилиш жараёнининг табиий ҳолатини
ўзгартирадиган энг кўп воситалардан бири. У қуйидаги кўринишлардан бирига
эга бўлиши мумкин:
IF <шарт> THEN <буйруқ1>
ELSE <буйруқ2>;
IF <шарт> THEN <буйруқ>;
Шарт- бу Мантиқий тоифадаги ифода. Биринчи ҳолатда, агар ифода қиймати
ҳақиқий бўлса, <буйруқ1>бажарилади, акс ҳолда <буйруқ2> бажарилади.
Иккинчи ҳолатда - агар ифода натижаси True бўлса, <буйруқ> бажарилади, агар
151
False бўлса - IF буйруғидан кейинги буйруқ бажарилади. IF буйруқлари
жойлаштирилган бўлиши мумкин.
Ҳозиргача келтирилган дастурларимиз чизиқли дастурлар тоифасига
киради. Улардаги буйруқлар кўрсатилган тартибда бажарилади. Бундай ҳолат
ҳар доим ҳам бизни қаноатлантиравермайди.
Кўпинча бирор мантиқий ифоданинг қийматига ("рост" ёки "ёлғон"
бўлишига) қараб, икки ёки ундан ортиқ йўналишлардан бирини танлаб олишга
тўғри келади.
Фараз қилайлик, корхона ўз ходимларига уларнинг бир ойда ишлаган
умумий иш соатларига қараб иш ҳақи тўлашга шартнома тузган бўлсин. Бу
шартномада 200 соатгача ишлаган ходимларга бир хил иш ҳақи, 200 соатдан
ортиқ ишлаган ходимларга эса 200 соатдан ортиқ ишлаган ҳар бир соати учун
икки баробар иш ҳақи тўлаш ҳам кўрсатиб ўтилган бўлсин. Ходимнинг бир
соатлик иш ҳақи haq, бир ойда ишлаган умумий иш соати ish_soati бўлсин. У
ҳолда 200 соатдан кўп ишлаган ходимларнинг маоши
* ;2
200)*
_
(
*200
:
_
haq
soati
ish
haq
haqi
ish
формула билан топилади. 200 ва ундан кам ишлаган ходимнинг иш ҳақини
ҳисоблаш учун бу формуладан фойдаланиб бўлмайди. Чунки, 200 соатдан кам
ишлаган ходим "хақдор" бўлиш ўрнига "қарздор" бўлиб қолиши ҳам мумкин. Бу
ҳолатни олдини олиш учун дастурчи икки ҳолатни ҳисобга олиши лозим. Ушбу
масала қуйидаги алгоритм ёрдамида хал қилинади: дастлаб ходимнинг ишлагагн
умумий иш соати, сўнгра
200"
_
"
soati
ish
мантиқий ифоданинг қиймати
аниқланади. Агар у "рост" бўлса, ходимнинг иш ҳақи
* ,2
200)*
_
(
*200
:
_
haq
soati
ish
haq
haqi
ish
акс ҳолда эса
soati
haq ish
haqi
ish
_
*
:
_
формула билан топилади.
Паскал тилида бундай жараёнларни ифодалаш учун тармоқланиш буйруғи
деб аталадиган буйруқ киритилган. У умумий кўринишда қуйидагича ёзилади:
if мантиқий ифода then 1-буйруқ elsе 2-буйруқ ; .
Бу буйруқни бажаришда ЭХМ дастлаб "мантиқий ифода" нинг қийматини
аниқлайди. Агар у "рост" бўлса 1-буйруқни бажаради, 2-буйруқни эса
бажармайди. Агар "ёлғон" бўлса, аксинча, яъни 2-буйруқни бажариб, 1-ни
бажармайди. (Тармоқланиш буйруғининг бажарилиш тартиби кўрсатилган блок-
152
схемага эътибор беринг.)
Шундан кейингина if дан кейинги буйруқни бажаришга ўтади. Тармоқланиш
буйруғидан фойдаланиб юқоридаги жараённи қуйидагича ёзиш мумкин:
if
200
_
soati
ish
then
*2
200)*
_
(
*200
:
_
haq
soati
ish
haq
haqi
ish
else
soati
haq ish
haqi
ish
_
*
:
_
;
Агар
эхтиёж
бўлса,
тармоқланиш
буйруғининг
қисқартирилган
вариантидан ҳам фойдаланиш мумкин. У умумий ҳолда қуйидагича ёзилади:
if мантиқий ифода then 1-буйруқ; .
Бу ердаги 1-буйруқ мантиқий ифода "рост" қиймат олган ҳолдагина бажарилади.
Акс ҳолда хеч бир амал бажарилмайди ва if дан кейинги буйруққа ўтилади. (Бу
буйруққа мос келадиган блок-схемага каранг.)
Юқоридаги жараён тармоқланиш буйруғининг тўлиқсиз варианти
ёрдамида қуйидагича ифодаланиши мумкин:
soati
haq ish
haqi
ish
_
*
:
_
;
if
200
_
soati
ish
then
*2
200)*
_
(
*200
:
_
haq
soati
ish
haq
haqi
ish
;
Бу буйруқлар кетма-кетлигини қуйидагича изохлаш мумкин: Ходимларнинг иш
хақлари ҳамма учун бир хил, яъни
soati
haq ish
haqi
ish
_
*
:
_
формула билан
ҳисобланади. Қўшимча иш ҳақини эса фақат бир ойда 200 соатдан ортиқ умумий
иш соатига эга бўлган ходимларгина олади.
Икки ва ундан ортиқ мулохазалардан "аnd", "оr" ва "nоt" мантиқий
амалларидан фойдаланиб ифодалар тузиш мумкин. Бунда бир мулохаза қавслар
ичида кўрсатилиши шарт. Қуйидаги мисолларга эътибор беринг:
1-мисол: if
( 2)
x
and
x 5
then write (‘x soni [2, 5] ga tegishli’)
153
else write (‘x soni [2, 5] ga tegishli emas’);
2- мисол: if (‘bugun yakshanba’) or (‘ish vaqti tugadi’)
then writeln (‘dam oling‘) else writeln (‘ish bilan shugullaning‘);
3- мисол: if not
( 2)
x
then write (‘x soni 2 dan katta emas’)
else write (‘x soni 2 dan katta’); .
Юқоридаги барча мулохазаларни жамлаган ҳолда, иш ҳақини ҳисоблаш
дастурини қуйидагича ёзиш мумкин:
program maosh;
var ish_haqi, ish_soati, haq : integer;
begin
writeln(‘hodim nesha soat ishladi ?’); readln(ish_soati);
writeln(‘bir soat ushun qansha haq oladi ?’); readln(haq);
* ;2
200)*
_
(
*200
:
_
200
_
;
*
_
:
_
haq
ish soati
haq
haqi
ish
then
ish soati
if
ish soati haq
haqi
ish
writeln(‘hodim ‘,ish_haqi,’ sum oladi’);
end.
Юқоридаги дастур учун ЭХМ қуйидаги натижаларни беради: (?
белгисидан кейин клавиатура орқали киритилган маълумотлар келтирилмоқда.)
hodim nesha soat ishladi ? 150
bir soat ushun qansha haq oladi? 100
hodim 150000 sum oladi
hodim nesha soat ishladi ? 300
bir soat ushun qansha haq oladi? 100
hodim 400000 sum oladi
Кўпинча then ёки else хизматчи сўзларидан кейинги буйруқлар таркибида
бошка if буйруғи ҳам келиши мумкин. Буни ички тармоқланиш дейилади. Ички
154
тармоқланишда ички if ўзидан аввал келган ва энг яқин турган then (else) га
таъалуқли бўлади. Қуйидаги дастурга эътибор беринг;
program masala;
var x: integer;
s: string;
begin
writeln(‘x ning qiymatini kiriting‘); readln(x);
s : ’x soni 2 dan kichik’);
if x>2 then if x< 5 then s : ’x soni [2, 5] oraliqqa tegishli’
else s : ’x soni 5 dan katta’;
writeln(s)
end.
Бу дастур учун ЭХМ қуйдаги натижаларни беради:
x ning qiymatini kiriting 4
x soni [2, 5] oraliqqa tegishli
x ning qiymatini kiriting 7
x soni 5 dan katta
x ning qiymatini kiriting 1
x soni 2 dan kichik
Агар ички тармоқланишлар кўп бўлса, уларни ёзиш ва ўқиш ишларида
дастурчи учун бир мунча ноқулайликлар келиб чиқиши мумкин. Буни олдини
олиш учун ПАСКАЛ тилига танлаш буйруғи киритилган.
Тамғалар. Шартсиз ўтиш буйруғи.
Айрим бир буйруқларни бошқаларидан бирор белги билан ажратиб
қўйилиши мумкин. Ана шу белгини тамға деб атаймиз.
Тамға сифатида бутун сон ёки лотин алифбосидаги ҳарфларни олиш
155
мумкин. Тамғадан сўнг икки нукта (:) белгиси қўйилади. Масалан:
10: x : 2;
‘s’: d : x*x-4*a*c;
Шундан кейин дастурнинг бирор еридан туриб, шу буйруққа мурожаат
қилиш мумкин. Бунинг учун шартсиз ўтиш буйруғи бўлган goto дан
фойдаланамиз. Бу буйруқ умумий ҳолда
goto тамға ;
кўринишида ёзилади.
Шартсиз ўтиш буйруғи goto дан кейин кўрсатилган тамғали буйруқка
ўтилади.
Дастурда қатнашган барча буйруқлар одатда дастурнинг иккинчи сатрида,
label хизматчи сўзидан кейин келтирилади.
Аввалги бўлимда иш ҳақини ҳисоблаш дастури битта ходим учун ёзилган
эди. Ана шу корхонада 3 та ходим ишлаб, улар 1 дан 3 гача тартиб рақамлари
билан
тартибланган
бўлсин.
Дастурдаги
амаллар
кетма-кетлигини
ходимларнинг ҳаммаси учун бажарилишини таъминлайдиган дастур қуйидагича
ёзилади:
Program utish;
label 2;
var ish_haqi, ish_soati, haq, tab_nom : integer;
begin
tab_nom : 1;
2 : writeln(‘hodim nesha soat ishladi ?’); readln(ish_soati);
writeln(‘bir soat ushun qansha haq oladi ?’); readln(haq);
* ;2
200)*
_
(
*200
:
_
200
_
;
*
_
:
_
haq
ish soati
haq
haqi
ish
then
ish soati
if
ish soati haq
haqi
ish
writeln(tab_nom, ‘-hodim ‘,ish_haqi,’ sum oladi’);
tab_nom : tab_nom 1;
if tab_nom< 3 then goto 2;
156
end.
Бу дастур учун ЭХМ қуйдаги натижаларни беради:
hodim nesha soat ishladi ? 150
bir soat ushun qansha haq oladi? 50
1-hodim 7500 sum oladi
hodim nesha soat ishladi ? 300
bir soat ushun qansha haq oladi? 100
2-hodim 40000 sum oladi
hodim nesha soat ishladi ? 200
bir soat ushun qansha haq oladi? 125
3-hodim 25000 sum oladi
Бу дастур ёрдамида худди шундай тарзда ихтиёрий сондаги ходимларнинг
иш хақларини ҳисоблашни ташкил қилиш мумкин.
Бунинг учун дастурдаги 3 сонини ходимлар сони билан алмаштириш лозим
бўлади.
Case танлаш буйруғи.
Case буйруғи бир нечта имкониятлардан бирини танлаб олиш учун
мўлжалланган буйруқ бўлиб, ички тармоқланишларни чиройли ва тушунарли
қилиб ёзиш мақсадида фойдаланилиши мумкин. Бу буйруқ умумий кўринишда
қуйидагича ёзилади:
Case ифода of
1-тамға: 1-буйруқ;
..... ...... ...... ..... .....
n-тамға: n-буйруқ ;
end;
Case ва of хизматчи сўзлари орасида кўрсатилган ифодани селектор, яъни
танлаш ифодаси деб аталади. Буйруқ қуйидагича бажарилади: дастлаб
157
селекторнинг қиймати ҳисобланади. Сўнгра ана шу қийматга мос келадиган
тамға қидириб топилади ва шу тамға остидаги буйруқлар кетма-кетлиги
бажарилади. Агар изланган тамға топилмаса, Case га тааллукли end буйруғидан
кейин кўрсатилган буйруқлар кетма-кетлиги бажарилади.
Масала: Спортчи мусобақада А - ўринни эгаллади. У қандай медал
олганини аниқланг.
Program sport;
label 1,2,3,4;
var a: integer; s : string[16];
begin
write(‘sportchi nechanchi urinn oldi?’);
readln(a);
s : ’sportchi medal olmagan’
case a of
1: s : ’oltin’;
2: s : ’kumush’;
3: s : ’bronza’;
end;
writeln(s)
end.
Бу дастур учун ЭХМ қуйдаги натижаларни беради:
sportchi nechanchi urinn oldi? 5
sportchi m,edal olmagan
sportchi nechanchi urinn oldi?1
oltin
Селектор ифоданинг қиймати real бўлмаган ихтиёрий скаляр типда
158
бўлиши мумкин. Тамғалар ҳам ана шу типга оид бўлиб, битта тамға битта case..of
буйруғида бир неча марта кетмаслиги керак.
Танлаш буйруғидан одатда бирон бир оралиққа тушмайдиган қийматлар
учун маълум бир буйруқларни бажарилиши ёки битта ифоданинг қиймати бир
нечта маълумотлардан бирига боғлиқ бўлган ҳолатларда фойдаланилса яхши
самара беради.
Program baho;
label 0,1,2,3,4,5;
var a: integer; s: string[9];
begin
write(‘bahoni kiriting‘);
readln(a);
case a of
5: s : ’alo‘;
4: s : ’yaxshi’
3: s : 'qoniqarli' ;
0,1,2: s : 'yomon' ;
end;
wriieln(s)
end.
ЭХМ бу дастур учун қуйдаги натижаларни беради:
Bahoni kiritng 4
yahshi
Bahoni kiritjng 1
уomon
Фармойишлар
1. Ўзлаштириш фармойиши.
Ўзлаштириш фармойишида ўзгарувчидан сўнг «:=» белгиси ёзилади.
159
Бичими: x:=a; бунда x идентификатор, a ифода, хусусий ҳолда сон
бўлиши мумкин.
Масалан, SUM:=SQR(x)+2.
2. Ўқиш фармойишилари.
Клавиатурадан киритилган маълумотларни ўзгарувчиларга ўзлаштириш
учун read ўқиш фармойиши ишлатилади. Бичими READ (x1[, x2[, …]]). Бунда
қавс ичидаги ўзгарувчилар иҳтиёрий сонда бўлиб, улар бир бирлари билан
вергул ёрдамида ажратиб ёзилади. Киритилаётгн ўзгарувчилар қиймати алоҳида
сатрларга ёзилиши керак бўлса фармойиш номига ln қўшимчаси қўшиб ёзилади.
Масалан, Readln(x).
3. Чиқариш (ёзиш) фармойиши.
Бичими: write(s1, s2, s3,…,sn); Бунда write фармойиш номи, s1, s2, s3,…,sn
ойнага чиқарилиши керак бўлган ифодалар. Натижага қўшимча равишда матн
кўринишидаги ахборотни чиқариш учун «'» апостроф белгисидан фойдаланиш
мумкин.
Мисол.
a
y
x
x
x
z
ln
1
sin
cos
ни ҳисоблаш дастури тузилсин.
program sodda_dastur;
var x,y,z,a:real;
begin
read (x,y,z,a);
z:=(cos(x)+sin(x))/(abs(xy)+1)ln(a);
writeln('z=',z)
end.
4. Шартли ўтиш фармойиши.
Шартли ўтиш фармойишининг бажарилиши жараёнида берилган
шартнинг чин ёки ёлғонлигига қараб дастурнинг юажарилиш кетмакетлиги
ўзгартирилади. Ушбу фармойишнинг икки хил кўриниши мавжуд:
1) if e1 e2 then A else B;
2) if e1 e2 then A;
Бунда if (агар) e1 e2 муносабатни текшириш фармойиши, e1 e2
текширилаётган шарт, then (бўлса) ва else (акс ҳолда) ёрдамчи сўзлар, A
дастурнинг текширилаётган шарт чин бўлганда бажарилиши керак бўлган
қисми, B эса ёлғон бўлганда бажарилиши керак бўлган қисми. Иккинчи
кўринишда else ёрдамчи сўз тушириб қолдирилган. Бу ҳолда текширилаётган
160
шарт бажарилса A фармойиш бажарилиб, кейинги фармойишни бажаришга
ўтади, акс ҳолда кейинги фармойишни бажаришга тўғридан тўғри ўтади.
Шартли
ўтиш
фармойиши
ҳам
шартнинг
бажарилиши
ёки
бажарилмаслигига қараб бир марта бажарилади.
Мисол.
1
2
1
sin
2
x
агар
x
a
x
агар
a
x
y
ни ҳисоблаш дастури тузилсин.
program shart;
var a,x,y:real;
begin
read (a,x);
if x>1 then y:=2sin(x)+a else y:=2ax;
writeln('y=',y);
end.
Turbo Pascal муҳитининг менюлар системаси.
Turbo Pascal менюсининг энг асосийлари билан танишиб чиқайлик.
Ойнанинг юқори қисмида жойлашган бош меню қуйидагилардан иборат:
File файллар билан ишлаш;
Edit таҳрирлаш;
Search қидириш;
Run бажариш;
Compile компиляция;
Debug отладка;
Tools инструментал воситалар;
Options параметрлар;
Window ойна;
Help ёрдам.
Ушбу менюлар ҳар бирининг ўз қисм менюлари бўлиб, улар шу меню
функциялари ишини бажаради.
Мураккаб (қўшма) фармойишлар.
Мураккаб фармойиш ёки қўшма фармойиш begin ва end фармойишлари
орасида ёзилади. Бу фармойиш битта фармойишнинг ўрнига бир нечта
фармойиш ёзиш имконини беради.
Масалан if фармойишидаги then (else) ёрдамчи сўзидан кейин фақат битта
фармойиш бажарилади. Агар бу ёрдамчи сўзлардан кейин бир нечта
161
фармойишлар бажарилиши керак бўлса, у ҳолда бу фармойишлар then (ёки else)
сўзидан кейин begin ва end орасига олиб ёзилади.
Бичими:
begin
<1фармойиш>;
<2фармойиш>;
. . .
<nфармойиш>;
end;
Мисол. Квадрат тенглама илдизларини ҳисоблаш дастури тузилсин.
program kvt;
var a,b,c,d,x1,x2: real; s: string[20];
begin
write ('a,b,c=');
readln(a,b,c);
d:=sqr(b)4ac;
if d<0 then begin s:='Илдизлари мавжуд эмас'; writeln(s); end
else begin if d=0 then
begin
s:='ягона илдизга эга: ';
x1:=b/(2a); writeln(s, 'x=',x1);
end
else begin
s:='иккита илдизи мавжуд:'; writeln(s);
x1:=(b+sqrt(d))/(2a);
x2:=(bsqrt(d))/(2a);
writeln('x1=',x1,', x2=',x2);
end;
end;
end.
Белги.
Турбо Паскальда ҳам ҳар бир фармойиш ўз номерига эга бўлиши мумкин.
Турбо Паскальдаги бундай номерлар белгилар деб юритилади. Белгилар бутун
сонлар кўринишида 0 дан 9999 гача рақамлар ёрдамида ёки лотин харфлари
билан бошланган иҳтиёрий сўзлар (масалан one, two, two2, …) орқали ёзилади.
162
Битта белги фақат битта фармойишни белгилаш учун ҳизмат қилади.
Белгиланиши керак бўлган фармойишдан аввал белги номери, сўнгра « : » (икки
нуқта) белгиси ёзилади.
Барча белгилар уларни эълон қилиш сатрида эълон қилиниши шарт.
Бундай эълон қилиш label сўзи ёрдами амалга оширилади. Белги номлари бир
биридан вергул ёрдамида ажратиб ёзилади. Масалан, label 10, 12, one, two;
Шартсиз ўтиш фармойиши.
Шартсиз ўтиш фармойиши дастур бажарилиш тартибини бевосита
ўзгартиради.
Бичими: goto k; — бунда goto (…га ўт) фармойиш номи, k ўтиш керак
бўлган сатр номери. Масалан, goto 10; goto one;
Мисол. a сонини b сонига бўлгандаги қолдиқни ҳисоблаш дастури
тузилсин.
program qoldiqni_hisoblash;
label 1;
var a,b,qoldiq:byte;
begin
write ('a,b '); readln(a,b);
if b=0 then
begin
writeln('0 га бўлиниш содир бўлди');
goto 1;
end;
qoldiq:=a mod b;
writeln('қолдиқ : ',qoldiq);
1: end.
8. Мураккаб шартлар.
Тармоқ фармойишида катталиклар орасида битта муносабат амали
иштирок этган эди. Тармоқ фармойишида икки ёки ундан ортиқ муносабатлар
бирбири билан мантиқий амаллар билан боғланган бўлиши мумкин. Бундай
боғланишлар not унар амали, and, or, xor бинар амаллари билан боғланган
бўлиши мумкин.
163
Масалан, x>1 ва x<5 муносабатлар «ва» амали билан боғланган. Турбо
Паскальда ушбу боғланиш (x>1) and (x<5) каби ёзилади.
Мисол. A нуқта ўзининг x ва y координаталари билан
берилган. Шу нуқтанинг расмдаги текисликка тегишли ёки
тегишли эмаслигини аниқлаш дастури тузилсин.
Киритилган A(x,y) нуқта шу фигурага тегишли бўлиши
учун
нуқтанинг
координаталари
қуйидаги
системани
қаноатлантириши керак.
1
0
0
y
x
y
x
program figura;
var x, y:real;
begin
write('x,y '); readln(x,y);
if (x>=0) and (y>=0) and (x+y<=1) then writeln ('(',x,',',y,') нуқта фигурага
тегишли')
else writeln('(',x,',',y,') нуқта фигурага тегишли эмас');
end.
Стандарт ва ностандарт математик функциялар
Функция
номи
Тилда ёзилиши
Маъноси
Sinx
Cosx
Lnx
ex
x
Arctgx
|x|
x2
ab
SIN(x)
COS(x)
Ln(X)
EXP(x)
SQRT(x)
ARCTAN(x)
ABS(x)
SQR(x)
EXP(b*LN(a))
Int(x)
Round(x)
Str(x)
Val(x)
Chr
Readkey(код)
x нинг синуси
x нинг косинуси
х нинг натурал логарифми
Експонента
Квадрат илдиз
х нинг арктангенси
х нинг модули
х нинг квадрати
a нинг b чи даражаси
ҳақиқий сон бутун қисми
Яхлитланган бутун сон
Сонни матнга ўтказиш
Матнли сонни рақамга ўтказиш
Символни коди билан чиқариш
Мос тугмача белгисини аниқлаш
1
1
1-расм
164
Ностандарт математик функциялар.
180
; 10.
.9
;
1
cos
.8
;
1
1
sec
.7
;
1
cos
.6
;
1
sin
.5
1 ;
.4
;
.3
;
1
sec
.2
1 ;
.1
2
2
2
2
Gradius
Padian
Lna
Lnb
Log b
x
Arctg
ecx
Arc
x
Arctg
x
Arc
x
x
Arctg
x
Arc
x
x
Arctg
x
Arc
Arctg x
Arcctgx
Cosx
Sinx
Tgx
Cosx
x
Co
Sinx
Secx
a
Дастурда арифметик ва мантиқий ифодалар ўзгарувчи, ўзгармас, стандарт
функциялар, қавслар ва амал белгилари орқали ташкил қилинади.
Ифодаларда
ҳисоблашлар
тартиби
қавслар
ичидаги
ифодалар
бажарилгандан кейин қуйидаги тартибда бажарилади:
1.NOT амали;
2. *, /, DIV, MOD, AND;
3.+, -, OR;
4.таққослаш белгилари: <, >, <=, >=, <>, =, IN.
Тармоқ фармойиши ёрдамида циклли алгоритмларга дастурлар
тузиш.
1мисол. Икки хонали, барча 4 га каррали бўлган сонлар рекуррент
боғланиши ва шу сонлар йиғиндисини ҳисоблаш алгоритми тузилсин.
a) икки хонали 4 га каррали сонларнинг энг кичиги 12, кейингилари 16, 20,
… 96. Демак, биринчи ҳади 12 га қолганлари эса ўзидан аввалги сонга 4 ни
қўшиш ёрдамида ҳосил бўлади. Шунинг учун рекуррент боғланишни қуйидагича
ёзиш мумкин. Биринчи ҳад i=12; иккинчи ҳад i=12+4, уни ўзидан аввалги ҳад
билан боғласак, i=i+4; учинчи ҳад i=16+4, бу ҳолда аввалгича фикр юритиб, i=i+4
деган хулосага келамиз ва х.к.
Юқори чегара эса i<100. Демак, кетмакетликнинг ҳар бир ҳади аввалги
ҳади билан i=i+4 кўринишда боғланган.
Уларнинг йиғиндисини топиш учун яна битта рекуррент боғланиш
топилиши керак бўлади. Йиғинди учун бирор S ўзгарувчидан фойдаланайлик.
Аввал йиғинди сақланадиган ўзгарувчи қийматини тозалаш (нолга
тенглаш) зарур. Бунинг учун унинг биринчи қийматини 0 га тенг қилиб оламиз,
S=0. Йиғинди (…((12+16)+20)…) га тенг. Ушбу йиғиндини хосил қилиш учун
кетмакетликнинг ҳар бир кейинги ҳадини аввалги ҳадига қўшишга тўғри
келади.
165
Алгоритм юқоридан i<100 билан чегараланади. Юқоридагича фикр
юритиб, ушбу боғланишни s=s+i кўринишида эканлигига ишонч хосил қилиш
мумкин.
Масала.
Фибоначчи
кетмакетлигининг
охирги
nҳадини
топиш
рекуррент боғланиши ва алгоритми тузилсин.
ai=ai1+ai2 (i>2 бутун сон)
Бу боғланишда кетмакетликнинг учинчи ҳади аввалги иккита ҳадининг
йиғиндисига тенг шунинг учун ҳисоблаш жараёнида аввалги иккита ҳад
қийматини сақлаш зарур. Бу қийматларни a ва b катталиклар билан белгилаймиз,
яъни a=ai1, b=ai2.
Кетма кетликнинг учинчи элементини ҳосил қилиш учун a ни b га қўшиш
кифоя. лекин i катталашганда a ва b ларнинг аввалги қийматларини сақлашга
тўғри келади.
a=ai=ai1+ai2=a+b (i>2 бутун сон) b эса a нинг аввалги қийматига тенг
бўлганлиги учун, ушбу боғланишдан олдин c=a, қийматининг сақланиши талаб
қилинади. Сўнгра асосий боғланиш a=a+b дан сўнг, b=c муносабатни ўрнатиш
билан тўла рекуррент боғланиш ҳосил қилинади.
Демак, рекуррент муносабат a=1, b=1 дан сўнг цикл ичида c=a, a=a+b, b=c
кўринишда бўлади.
Турбо-Паскаль муҳитида ишлаш.
Бугунги
кунда
касб-ҳунар
билим
юртларида
ва
олий
таълим
муассасаларида Турбо Паскальнинг 5.5 – версияси кенг тарқалганлигини ва
ундан фойдаланиш қулайлигини ҳисобга олинган холда қуйида Турбо
Паскальнинг 5.5 – версияси муҳитида ишлаш ўргатилади.
Турбо Паскаль муҳити Turbo.exe файлидан ишга юкланади. Унинг
вазифаси Паскаль тилидаги программани тахрирлаш ва машина кодига
ўтказишдир.
Турбо Паскаль муҳитида юқори меню бўлиб, уни активлаштириш учун
F10 тугмачасидан фойдаланилади.
Такрорлаш буйруқлари. While такрорлаш буйруғи.
Цикл, такрорлаш буйруқлари, цикл сарлавҳаси ва танаси.
WHILE, REPEAT, FOR, такрорлаш буйруқлари ҳар хил тоифали
циклларни яратишда ишлатилади. Кўплаб масалаларни ечиш жараёнида айрим
бир амаллар кетма-кетлигини такрор ва такрор кўрсатишга ва демак бажаришга
тўғри келади. Юқоридаги масалани эсга олинг. У ерда бир нечта буйруқларни 3
та ишчиси бор корхона учун 3 марта бажаришга тўғри келади. Дастурнинг ичида
бир неча марта бажариладиган буйруқлар кетма кетлиги цикл дейилади. While
такрорлаш буйруғи.
166
ТУРБО ПАСКАЛ да циклларни ташкил қилишнинг бир неча усуллари
мавжуд. Улардан бири while буйруғидир. while (инглизча сўз-"токи") буйруғи
умумий кўринишда қуйидагича ёзилади:
while ( мантиқий ифода ) dо
begin
1-буйруқ ; 2-буйруқ ; ... п-буйруқ ;
end ;
Агар цикл битта буйруқдан иборат бўлса, у қуйидагича ёзилади:
while (мантиқий ифода) dо буйруқ ;
While буйруғининг бажарилиш тартиби мана бундай: дастлаб while
буйруғидан кейин қавслар ичида кўрсатилган мантиқий ифода қиймати
ҳисобланади. Агар унииг қиймати "рост" бўлса циклдаги буйруқлар кетма-
кетлиги бир марта бажарилади, сўнгра яна мантиқий ифоданинг қиймати
ҳисобланади. Қиймат яна "рост" бўлса, цикл яна бир марта бажарилади ва
хоказо. Бу жараён токи мантиқий ифоданинг қиймати "ёлғон" бўлиб қолгунча
бажарилаверади. Агар мантиқий ифоданипг қиймати биринчи марта
текширилган пайтдаёқ "рост" қийматини қабул қилмаса, яъни ўринли бўлмаса,
циклдаги буйруқлар кетма-кетлиги бир марта ҳам бажарилмайди.
Program salomlashish;
var marta : integer ;
begin
write('necha marta salomlashamiz ?') ;
readln( marta ) ;
while marta>0 do begin readln('SALOM') ;
marta : marta-1; end ;
writeln( 'HAYR, JANOB!) end.
ЭХМ бу дастур учун қуйдаги натижаларни беради:
Necha marta salomlashamiz 3
SALOM
SALOM
SALOM
HAYR, JANOB
Necha marta salomlashamiz? 0
HAYR, JANOB
Одатда while буйруғидан такрорланишлар сони олдиндан номаълум
бўлган холларда фойдаланиш мақсадга мувофиқ ҳисобланади.
167
Масала-1. А ва В натурал сонлаш берилган бўлсин. Уларнинг энг катта
умумий бўлувчисини топинг.
Eчиш ғояси: Бу масалани эчиш "Евклид алгоритми" асосида амалга
оширилади. Бу алгоритмга кғра токи А ва В сонлари бир-бирига тенг бўлиб
қолмагунча, каттасидан кичиги айрилаверади. Ҳар гал айирма шу сонлардан
каттасини ифодалаб турган ўзгарувчи номи билан белгилаб қўйилади. Бу
жараён А=В бўлганда тўхтайди. Ечим сифатида А ёки В ни олиш мумкин.
Program Yevklid ;
var a,b : integer ;
begin
readln(a,b); while a<>b then a : a-b else b : b-a;
write ( 'EKUB ', а )
end.
Ушбу дастурни а=60 ва b=36 учун бажарган ЭXМ
EKUB 12
кўринишидаги натижани дисплейга чикаради.
Эслатма: Мантиқий ифодани ўринли бўлиш ёки бўлмаслигига қараб, while
цикли бир марта ҳам бажарилмаслиги мумкин.
REPEAT ... UNTIL буйруғи.
Циклларни ташкил қилишнинг бошқа бир усули repeat-until буйруғидир.
У умумий кўринишда қуйидагича ёзилади:
repeat
1-buyruq; 2-buyruq; ...; p-buyruq;
until (mаntiqiy ifodа);
Циклни бу кўринишда ташкил қилинганда мантиқий ифода циклнинг
охирида текширилади. Унинг қиймати "ёлғон" бўлса, цикл яна бир марта
бажарилади, сўнгра яна мантиқий ифода текширилади. Бу жараён токи
мантиқий ифоданинг қиймати "рост" бўлиб колмагунча такрорланаверади. Бй
усулда цикл ташкил қилишниш аввалгисидан фарқи шуки, мантиқий
ифоданинг қиймати циклнинг охирида текширилиши ҳисобига цикл хеч
бўлмаганда бир марта бажарилади. Юқоридаги “salomlashish” дастурини
program salomlashish;
var marta ; integer ;
begin
write('Necha marta salomlashamiz ?') ;
168
readln( marta ) ;
repeat
writeln(‘SAL
OM’) ;
marta : marta-l;
until marta<0 ;
writeln( 'HAYR, JANOB')
end.
тарзида ҳам ёзиш мумкин. Бу дастурни ЭХМ бажарганда, дисплейга қуйидаги
ёзувлар чиқарилади:
Necha marta salomlasnanuz ? 3
SALOM
SALOM
SALOM
HAYR, JANOB
Necha marta salomlashamiz ? 0
SALOM
HAYR, JANOB
FOR такрорлаш буйруғи.
Кўплаб циклларни бирон бир ўзгарувчининг m, m1, ... ,N бўлган
қийматларида бажаришга тўғри келиб қолади. Ана шундай жараёнларни ихчам
қилиб ёзиш мақсадида янги цикл буйруғи for киритилган. Бу буйруқ умумий
кўринишда қуйидагича ёзилади:
for x : xl to x2 do begin
1-буйруқ ; …, n-буйруқ ;
end;
Агар циклда такроран бажарилишн талаб қилинган буйруқ битта бўлса, for
буйруғини мана бундай ёзиш мумкин :
for x : xl to x2 do буйруқ ;
Бу ерда х цикл жараённи бошқарадигаи ўзгарувчи, х1-х нинг бошланғич қиймати,
х2-еса х нинг охирги қиймати. For буйруғи биринчи марта бажарилганда, х-
ўзгарувчига х1 бошланғич қиймат берилади. Сўнгра х-нннг ана шу қиймати учун
цикл бир марта бажарилади. Кейин х ўзгарувчииинг қиймати 1 га орттирилади ва
х нинг янги қийматини х2 билан солиштирилади. Агар х≤ х2 шарт ўринли бўлса,
цикл яна бир марта бажарилади ва хоказо. Бу жараён то х>х2 шарт ўринли бўлиб
қолгунча давом эттирилаверади. For цикли хеч бўлмаганда бир марта бажарилади.
169
Масала: 1+2+3+...+999+1000 йиғиндини топинг.
Eчиш ғояси: Йиғиндини ҳисоблаб бориш учун S ўзгарувчи киритилади. Сўнгра i
нинг 1 дан 1000 гача бўлган қийматлари учун
i
S
S
ифода қийматини
топилади.
Program yigindi ;
var s, i : integer ;
begin
s : 0;,
for i : 1 to 1000 do
i
s
s
:
;
writeln( 'S : ’, s)
end.
Бу дастур учун ЭХМ қуйидаги натижани беради :
S : 500500
Юқоридаги уч хил усул билан ташкил қилинган циклларнинг
бажариш
ёки
бажарилмаслиги
мантиқий
ифода
нинг
қийматига
боғлиқлиги кўриниб турибди.
Такрорлаш учун савол ва топшириқлар
1. Турбо Паскаль дастурлаш тили алифбосини баён қилинг.
2. Турбо Паскаль дастурлаш тилида операторларнинг таснифи.
3. Чизиқли операторларни изоҳланг.
4. Тармоқланувчи операторларни баён қилинг.
5. Такрорланувчи операторлар имкониятини изоҳланг.
6. Такрорлаш буйруқлари деганда қандай буйруқларни тушунасиз?
7. While такрорлаш буйруғининг ишлаш жараёни қандай?
8. REPEAT ... UNTIL буйруғининг ишлаш жараёни қандай?
9. FOR такрорлаш буйруғининг ишлаш жараёни қандай?
10. Структуралаш буйруғи нима?
11. Буйруқларни ёзиш қоидалари нималардан иборат?