Uploaded by Jamshid Valiyew

6-mavzu. Dasturlash tillari yordamida dasturlarni ishlab chiqish

advertisement
6-mavzu. Dasturlash tillari yordamida dasturlarni ishlab chiqish
Dasrurlash tilining umumiy ta’rifi.
Dasrurlash tilida ma’lumotlar turlari.
O'zgaruvchilarni e’lon qilish (aniqlash).
O’zlashtirish operatori.
Kiritish va chiqarish operatori.
Shart tekshirish operatori.
Dasturlash tilining boshqaruv tuzilishlari.
Sikl operatorlari. O’tish operatorlari.
Dasrurlash tilining umumiy ta’rifi.
C++ dasturlash tili C dasturlash tiliga asoslangan. C dasturlash tili o`z navbatida B va BCPL
dasturlashgan tillaridan kelib chiqqan. BCPL - 1967 yilda Martin Richards tomonidan o`ylab
topilgan bo`lib, operatsion tizimlarni yaratish uchun mo`ljallangan. Ken Thompson o`zining B
tilida BCPL ning ko`p xossalarini yaratishga harakat qilgan va B dasturlash tilida asosan
operatsion tizimning birinchi variantlarini yozgan. BCPL ham, B ham tipsiz til bo`lgan. Ya`ni
o`zgaruvchilarning ma`lum bir tipi bo`lmagan - har bir o`zgaruvchi kompyuter xotirasida faqat
bir bayt joy egallagan. O`zgaruvchini qanday sifatda ishlatish esa, ya`ni butun sonmi, haqiqiy
sonmi yoki harfmi, dasturchining vazifasi bo`lgan.
C tilini Dennis Ritchie B tiliga asoslanib
yaratdi va ilk bor C tilini 120072 yili Bell Laboratoriyasida, DEC PDP-11 kompyuterida
qo`lladi. C o`zidan oldingi B va BCPL tillarining juda ko`p muhim tomonlarini o`z ichiga olish
bilan bir qatorda o`zgaruvchilarni tiplashtiradi va turli yangiliklar kiritilgan. Boshlanishda C
asosan UNIX tizimlarida keng tarqaldi. C mashina arxitekturasi bilan tez muloqot qiluvchi
dasturlash tilidir. 1983 yilda, C tili keng tarqalganligi sababli, uni standartlash harakati
boshlandi. Buning uchun Amerika Milliy Standartlar Komiteti (ANSI) qoshida X3J11 texnik
komitet tuzildi. 1989 yilda ushbu standart qabul qilindi. Standartni dunyo bo`yicha keng
tarqatish maqsadida 1990 yilda ANSI va Dunyo Standartlar Tashkiloti (ISO) hamkorlikda C ning
ANSI/ISO 9899:1990 standartini qabul qilishdi. Shuning uchun C da yozilgan dasturlar mayda
o`zgarishlar yoki umuman o`zgarishlarsiz juda ko`p kompyuter platformalarida ishlaydi.
C++ 1980 -yillar boshida Bjarne Stroustrup tomonidan C ga asoslangan tarzda tuzildi.
C++ juda ko`p imkoniyatlarni o`z ichiga olgan, lekin eng asosiysi u ob`ektlar asosida
dasturlashga imkon beradi. Dasturlarni tez va sifatli yozishga hozirgi kunda katta ahamiyat
berilmoqda. Buni ta`minlash uchun ob`ektli dasturlash g`oyasi ilgari surildi. Xuddi 120070 yillar boshida strukturali dasturlash kabi, dasturlarni hayotdagi jismlarni modellashtiruvchi
ob`ektlar orqali tuzish dasturlash sohasida inqilob qildi.
C++ dan tashqari boshqa ko`p ob`ektli dasturlashga yo`naltirilgan tillar mavjud. C++ esa
gibrid tildir. Unda C ga o`xshab strukturali dasturlash yoki yangicha, ob`ektlar bilan dasturlash
mumkin. Yangicha deyishimiz ham nisbiydir. Ob`ektli dasturlash falsafasi paydo bo`lganiga
ham yigirma yildan oshyapti.
C++ funksiya va ob`ektlarning juda katta kutubxonasiga ega. Ya`ni C++ tilida dasturlashni
o`rganish ikki qismga bo`linadi. Birinchisi bu C++ ni o`zini o`rganish, ikkinchisi esa C++ ning
standart kutubxonasidagi tayyor ob`ektfunksiyalardan foydalanishni o`rganishdir.
C++ alfaviti. C++ tilida buyruqlar va so`zlar, barcha elementlar C++ tilining alfavitida yoziladi.
Alfavitga quyidagi simvollar kiradi.
Katta va kichiq lotin alfavit harflari (A, B, … Z, a, b, … z), pastga chiziqcha belgisi (_) (harflar
bilan barobar yozilganda);
arab raqamlar: 0 dan 9 gacha;
Maxsus simvollar; masalan, +, *, { , &;
Ko`rinmaydigan simvollar (―Umumlashgan bo`shliq simvollari‖). Leksemalarni o`zaro ajratish
uchun ishlatiladigan simvollar (masalan, bo`shliq, tabulyatsiya, yangi qatorga o`tish belgilari).
1
C++ alfaviti aslida kompyuterdagi barcha belgilarni qabul qiladi. Chunki standartda uning
alfavitini barcha belgilar to`plami deb qabul qilingan. Shuning uchun izohlarda, satrlarda va
simvolli o`zgarmaslarda boshqa literallar, masalan, rus harflarini ishlatilishi mumkin. C++ tilida
olti xil turdagi leksemalar ishlatiladi: erkin tanlanadigan va ishlatiladigan identifikatorlar,
xizmatchi so`zlar, o`zgarmaslar (const), amallar, ajratuvchi belgilar.
Identifikator. Identifikator bu – dastur ob`ektining nomi. Identifikatorlar lotin harflari,
ostki chiziq belgisi va sonlar ketma - ketligidan iborat bo`ladi. Identifikator lotin harfidan yoki
ostki chizish belgisidan boshlanishi lozim. Masalan, a, b, _t, _A. Identifikatorlarning uzunligi
standart bo`yicha chegaralanmagan. Katta va kichiq harflar farqlanadi, shuning uchun oxirgi ikki
identifikator bir biridan farq qiladi. Borland kompilyatorlaridan foydalanilganda nomning
birinchi 32 harfi , ba`zi kompilyatorlarda 8 ta harfi inobatga olinadi. Bu holda
NUMBER_OF_TEST va NUMBER_OF_ROOM identifikatorlari bir biridan farq qilmaydi.
Identifikatorlar tilining maxsus (xizmatchi) so`zlari bilan mos bo`lmasligi lozim.
Identifikatorlarni past chiziq bilan e`lon qilish maslahat berilmaydi.
Xizmatchi so`zlar. Tilda ishlatiluvchi ya`ni dasturchi tomonidan o`zgaruvchilar nomlari sifatida
ishlatish mumkin bo`lmagan identifikatorlar xizmatchi so`zlar deyiladi.
C ++ tilida quyidagi xizmachi so`zlar mavjud:
19.1-jadval. C++ tilining xizmachi so`zlari.
asm
Do
If
return
typedef
auto
double
Inline
short
typeid
bool
dynamic_ cast
Int
signed
typename
break
Else
long
sizeof
union
case
enum
Mutable
static
unsigned
catch
explicit
namespace
static_cast
Using
char
export
New
Struct
virtual
class
extern
Operator
switch
void
const
False
Private
template
volatile
const_cast
Float
Protected
This
wchar_t
continue
For
Public
throw
While
default
friend
Register
True
Amallar. Amallar bir yoki bir nechta belgilar bilan aniqlanadi va operatorlar ustida bajariladi.
Amal orasida bo`sh joy qo`yilmaydi. Amaldagi belgilar maxsus belgilardan (masalan, &&, |, <)
va harflardan (masalan, reinterpret_cast, new) iborat bo`lishi mumkin.
Operandlar soniga qarab amallar uch guruhga bo`linadi: UNARY, BINARY,
TERNARY. Standart amallar qayta aniqlanadi.
O`zgarmaslar. C++ tilida o`zgarmaslar o`zgarmas kattalikdir. Ularning mantiqiy, butun, haqiqiy,
belgili, satrli o`zgarmaslarga bo`linadi. Dasturchi C++ tilida o`zgarmaslarni aniq ifodalay olishi
kerak.
20.1-jadval.
O`zgarmaslar formati.
O`zgarmas
O`zgarmas formati
misol
mantiqiy
True va false so`zlar bilan aniqlanadi
True, False
butun
O`nlik sanoq sistemasi. Birinchi raqami 0 bo`lishi
kerak emas (0,1,2,3,4,5,6,7,8,9)
15, 25, 0, 4
2
Sakkizlik sanoq sistemasi. Birinchi raqami 0 bo`lishi 01, 020, 07155
kerak (0,1,2,3,4,5,6,7)
O`n oltilik sanoq sistamasi. Boshlanishi 0x
(0X) bilan bo`lishi kerak (0, 1, 2, 3, 4, 5, 6,
7, 8, 9, A, B, C, D, E)
0xA, 0x1B8, 0X00FF,
0X00ff
O`nli. [son].[son] ko`rinishda
5.7, .001, 35
Exponensial. [son][.][son]{E|e}[+|-][son]
0.2E6, .11e-3, 5E10,
1.22E-10
Belgili
Tirnoq [`] ichiga olingan bir yoki bir nechta belgi
`A`, `yu`, `*`, `db`, `A`,
`\n`, `\012`,
`\x07\x07`
Satrli
Belgilarning qo`shtirnoqqa olingani
Haqiqiy
"Salom Buxoro",
"\tNatija =\xF5\n"
Satrli o`zgarmas. Satrli o`zgarmaslar orasiga eskeyp simvollarni qo`llash mumkin. Bu simvollar
oldiga [\] belgisi quyiladi. Masalan, ―\n Birinchi satr \n ikkinchi satr \n uchinchi satr‖. Satr
simvollari xotirada ketma-ket joylashtiriladi va har bir satrli o`zgarmas oxiriga avtomatik
ravishda kompilyator tomonidan `\0` simvoli qo`shiladi. Shunday satrning xotiradagi hajmi
simvollar soni+1 baytga tengdir. Ketma-ket kelgan va bo`shliq, tabulyatsiya yoki satr oxiri
belgisi bilan ajratilgan satrlar kompilyatsiya davrida bitta satrga aylantiriladi. Masalan, ―Salom‖
―Buxoro ‖ satrlari bitta satr deb qaraladi. ―Salom Buxoro‖. Bu qoidaga bir necha qatorga
yozilgan satrlar ham bo`ysunadi.
Sanovchi o`zgarmas. C++ tilining qo`shimcha imkoniyatlaridan biri. Sanovchi o`zgarmaslar
ENUM xizmatchi so`zi yordamida kiritilib, butun tipdagi sonlarga qulay so`zlarni mos qo`yish
uchun ishlatiladi. Masalan,
enum{one=1,two=2,three=3}
Agar son qiymatlari ko`rsatilmagan bo`lsa eng chapki so`zga 0 qiymati berilib qolganlariga tartib
bo`yicha o`suvchi sonlar mos qo`yiladi.
Enum{zero,one,two}
Bu misolda avtomatik ravishda o`zgarmaslar quyidagi qiymatlarni qabul qiladi:
Zero=0, one=1, two=2
O`zgarmaslar aralash ko`rinishda kiritilishi ham mumkin:
Enum(zero,one,for=4,five,seeks}
Bu misolda avtomatik ravishda o`zgarmaslar quyidagi qiymatlarni qabul qiladi:
Zero=0, one=1, for=4;five=5,seeks=6;
Enum BOOLEAN {NO, YES};
O`zgarmaslar qiymatlari: NO=0, YES=1.
Nomlangan o`zgarmaslar. C++ tilida o`zgaruvchilardan tashqari nomlangan o`zgarmaslar
kiritilishi mumkin. Bu o`zgarmaslar qiymatlarini dasturda o`zgartirish mumkin emas.
O`zgarmaslar nomlari dasturchi tomonidan kiritilgan va xizmatchi so`zlardan farqli bo`lgan
identifikatorlar bo`lishi mumkin. Odatda nom sifatida katta lotin harflari va ostiga chizish
belgilari kombinatsiyasidan iborat identifikatorlar ishlatiladi. Nomlangan o`zgarmaslar quyidagi
shaklda kiritiladi:
Const tip o`zgarmas_nomi=o`zgarmas_qiymati
Masalan,
Const double Pi=3.1415;
Const long M=99999999;
Const R=2;
Oxirgi misolda o`zgarmas tipi ko`rsatilmagan, bu o`zgarmas int tipiga tegishli deb hisoblanadi.
3
Null ko`rsatkich. NULL - ko`rsatkich yagona arifmetik bo`lmagan o`zgarmasdir. Null
ko`rsatkich 0 yoki 0L yoki nomlangan o`zgarmas NULL orqali tasvirlanishi mumkin. Shuni
aytish lozimki bu o`zgarmas qiymati 0 bo`lishi yoki `0` simvoli kodiga mos kelishi shart emas.
20.2-jadval.
O`zgarmaslar chegaralari va mos tiplari.
O`zgarmas
turi
Ma`lumotlar tipi
Hajm,
bayt
Qiymatlar chegarasi
mantiqiy
Boolean
1
True, false
belgili
signed char
1
-128…127
Unsigned char
1
0…255
Sanovchi
Enum
2
-32768…32767
butun
signed short int
2
-32 768 … 32 767
unsigned short int
2
0…65535
signed int
4
-2 147 483 648 … 2 147 483 647
Unsigned int
4
0 … 4 294 967 295
signed long int
4
-2 147 483 648 … 2 147 483 647
unsigned long int
4
0 … 4 294 967
Float
4
3.4E-32…3.4E+38
Double
8
1.7E-308…1.7E+308
haqiqiy
Long double
10
3.4E-4932…1.1E+4932
O`zgaruvchilar (VARIABLES). O`zgaruvchilar ob`ekt sifatida qaraladi. C++ tilining asosiy
tushunchalaridan biri nomlangan xotira qismi – ob`ekt tushunchasidir. Ob`ektning xususiy holi
bu o`zgaruvchidir. O`zgaruvchiga qiymat berilganda unga ajratilgan xotira qismiga shu qiymat
kodi yoziladi. O`zgaruvchi qiymatiga nomi orqali murojaat qilish mumkin, xotira qismiga esa
faqat manzili orqali murojaat qilinadi. O`zgaruvchi nomi bu erkin kiritiladigan identifikatordir.
O`zgaruvchi nomi sifatida xizmatchi so`zlarni ishlatish mumkin emas.
20.3-jadval.
O`zgaruvchilar tiplari.
Boolean
Mantiqiy
Char
bitta simvol
long char
uzun simvol
short int
qisqa butun son
Int
butun son
long int
uzun butun son
Float
haqiqiy son
double (long float)
ikkilangan haqiqiy son
long double
uzun ikkilangan haqiqiy son
Butun sonlar ta`riflanganda ko`rilgan tiplar oldiga unsigned (ishorasiz) ta`rifi ko`rinishida
bo`lishi mumkin. Bu ta`rif qo`shilgan butun sonlar ustida amallar mod 2n arifmetikasiga
asoslangandir. Bu erda n soni int tipi xotirada egallovchi razryadlar sonidir. Agar ishorasiz k soni
uzunligi int soni razryadlar sonidan uzun bo`lsa, bu son qiymati k mod 2n ga teng bo`ladi.
Ishorasiz k son uchun ga –k amali 2n – k formula asosida hisoblanadi. Ishorali ya`ni signed
tipidagi sonlarning eng katta razryadi son ishorasini ko`rsatish uchun ishlatilsa unsigned
4
(ishorasiz) tipdagi sonlarda bu razryad sonni tasvirlash uchun ishlatiladi. O`zgaruvchilarni
dasturning ixtiyoriy qismida ta`riflash yoki qayta ta`riflash mumkin. Masalan,
Short int a; Short int b1; Short int ac;
int a; int b1; int ac;
O`zgaruvchilar ta`riflanganda ularning qiymatlari aniqlanmagan bo`ladi. Lekin o`zgaruvchilarni
ta`riflashda initsializatsiya ya`ni boshlang`ich qiymatlarini ko`rsatish mumkin. Masalan,
int I=0; char c=`k`;
Typedef ta`riflovchisi yangi tiplarni kiritishga imkon beradi. Masalan, yangi KOD tipini kiritish:
typedef unsigned char KOD;
KOD simbol;
C++ tilida amallar sakkiz guruhga bo`linadi. Ular quyidagi jadvalda keltirilgan.
20.5-jadval.
Amallar.
Razryadli
Arifmetik amallar
Nisbat amallari
Mantiqiy amallar
amallar
[+] qo`shish
[&] va
[==] teng
[&&] va
[-] ayirish
[|] yoki
[!=] teng emas
[||] yoki
[*] ko`paytirish
[^] inkor
[>] katta
[!] inkor
[/] bo`lish
[<<] chapga
[>=] katta yoki teng
surish
[%] modul olish
[-] unar minus
[+] unar plyus
[>>] o`ngga
[<] kichiq
surish
[++] birga oshirish
[<=] kichiq yoki teng
[--] birga kamaytirish
[~] inkor
Qiymat berish va shartli
Manzilli amallar
Imlo amallar
Tipli amallar
amallar
[ () ] – doirali qavs [=] - oddiy qiymat
[(tip)] –
tipni
[&] - manzilni
berish
o`zgartirish
aniqlash
[ [] ] – kvadrat qavs [op=] - murakkab
sizeofhajmni
[*] - manzil bo`yicha
qiymat berish
hisoblash
qiymat
aniqlash yoki joylash
[,] - vergul
[?] – shartli amal
C++ da arifmetik amallar. Ko`p dasturlar bajarilishi davomida arifmetik amallarni bajaradi.
20.6-jadval.
Arifmetik amal.
Arifmetik amal
Qo`shish
Arifmetik operator
+
Algebraik ifoda
A+B
C++ dagi ifodasi
A+B
Ayirish
-
A-B
A-B
Ko`paytirish
*
AB
A*B
Bo`lish
/
A/B
A/B
Modul olish
%
A MOD B
A%B
Ba`zi bir xususiyatlar. Butun sonli bo`lishda, yani bo`luvchi ham, bo`linuvchi ham butun son
bo`lganda, javob butun son bo`ladi. Javob yaxlitlanmaydi, kasr qismi tashlab yuborilib, butun
qismining o`zi qoladi.
Modul operatori [%] butun songa bo`lishdan kelib shiqadigan qoldiqni beradi. x%y ifodasi x ni
y ga bo`lgandan keyin chiqadigan qoldiqni beradi. [%] operatori faqat butun sonlar bilan
ishlaydi. Haqiqiy sonlar bilan ishlash uchun "math.h" kutubxonasidagi fmod funksiyasini
qo`llash kerak.
Qavslar. C++ da qavslarning ma`nosi xuddi algebradagidekdir. Undan tashqari boshqa
boshqa algebraik ifodalarning ketma-ketligi ham odatdagidek. Oldin ko`paytirish, bo`lish va
modul olish operatorlari ijro qilinadi. Agar bir necha operator ketma-ket kelsa, ular chapdan 5
o`nga qarab ishlanadi. Bu operatorlardan keyin esa qo`shish va ayirish ijro etiladi. Masalan, k =
m * 5 + 7 % n / (9 + x); Birinchi bo`lib m * 5 hisoblanadi. Keyin 7 % n topiladi va qoldiq (9 + x)
ga bo`linadi. Chiqqan javob esa m * 5 ning javobiga qo`shiladi. Lekin biz o`qishni osonlashtirish
uchun va xato qilish ehtimolini kamaytirish maqsadida qavslarni kengroq ishlatishimiz mumkin.
Yuqoridagi misolimiz quyidagi ko`rinishga ega bo`ladi.
k = ( m * 5 ) + ( ( 7 % n ) / ( 9 + x ) );
Amallar odatda unar ya`ni bitta operandga qo`llaniladigan amallarga va binar ya`ni ikki
operandga qo`llaniladigan amallarga ajratiladi.
Binar amallar additiv ya`ni qo`shuv [+] va ayirish [–] amallariga , hamda multiplikativ ya`ni
ko`paytirish [*], bo`lish [/] va modul olish[%] amallariga ajratiladi. Additiv amallarining
ustuvorligi multiplikativ amallarining ustuvorligidan pastroqdir. Butun sonni butun songa
bo`lganda natija butun songacha yaxlitlanadi. Masalan, 10/3=3, (-10)/3=-3, 10/(-3) =-3.
Modul amali butun sonni butun songa bo`lishdan hosil bo`ladigan qoldiqqa tengdir. Agar modul
amali musbat operandlarga qo`llanilsa, natija ham musbat bo`ladi, aks holda natija ishorasi
kompilyatorga bog`liqdir.
Binar arifmetik amallar bajarilganda tiplarni keltirish quyidagi qoidalar asosida amalga
oshiriladi:
short va char tiplari int tipiga keltiriladi;
agar operandlardan biri long tipiga tegishli bo`lsa ikkinchi operand ham long tipiga keltiriladi va
natija ham long tipiga tegishli bo`ladi;
agar operandlardan biri float tipiga tegishli bo`lsa ikkinchi operand ham float tipiga keltiriladi va
natija ham float tipiga tegishli bo`ladi;
agar operandlardan biri double tipiga tegishli bo`lsa ikkinchi operand ham double tipiga
keltiriladi va natija ham double tipiga tegishli bo`ladi;
agar operandlardan biri long double tipiga tegishli bo`lsa ikkinchi operand ham long double
tipiga keltiriladi va natija ham long double tipiga tegishli bo`ladi;
Unar amallarga ishorani o`zgartiruvchi unar minus [–] va unar plus [+] amallari kiradi. Bundan
tashqari [++] va [--] amallari ham unar amallarga kiradi.
[++] unar amali qiymatni 1 ga oshirishni ko`rsatadi. Amalni prefiks ya`ni ++i ko`rinishda
ishlatish oldin o`zgaruvchi qiymatini oshirib so`ngra foydalanish lozimligini, postfiks ya`ni i++
ko`rinishda ishlatishdan oldin o`zgaruvchi qiymatidan foydalanib, so`ngra oshirish kerakligini
ko`rsatadi. Masalan, i qiymati 2 ga teng bo`lsin, u holda 3+(++i) ifoda qiymati 6 ga, 3+i++ ifoda
qiymati 5 ga teng bo`ladi. Ikkala holda ham i qiymati 3 ga teng bo`ladi.
[--] unar amali qiymatni 1 ga kamaytirishni ko`rsatadi. Bu amal ham prefiks va postfiks
ko`rinishda ishlatilishi mumkin. Masalan, i qiymati 2 ga teng bo`lsin, u holda --i ifoda qiymati 1
ga, i-- ifoda qiymati 2 ga teng bo`ladi. Ikkala holda ham i qiymati 1 ga teng bo`ladi.
Bu ikki amalni faqat o`zgaruvchilarga qo`llash mumkindir. Unar amallarning ustivorligi binar
amallardan yuqoridir.
Razryadli amallar. Razryadli amallar natijasi butun sonlarni ikkilik ko`rinishlarining har bir
razryadiga mos mantiqiy amallarni qo`llashdan hosil bo`ladi. Masalan, 5 kodi 101 ga teng va 6
kodi 110 ga teng.
6&5 qiyjmati 4 ga ya`ni 100 ga teng.
6|5 qiyjmati 7 ga ya`ni 111 ga teng.
6^5 qiymati 3 ga ya`ni 011 ga teng.
~6 qiyjmati 2 ga ya`ni 010 ga teng.
Bu misollarda amallar ustivorligi oshib borishi tartibida berilgandir. Bu amallardan tashqari
M<<N chapga razryadli siljitish va M>>N o`ngga razryadli siljitish amallari qo`llaniladi.
Siljitish M butun sonning razryadli ko`rinishiga qo`llaniladi. N nechta pozitsiyaga siljitish
kerakligini ko`rsatadi. Chapga N pozitsiyaga surish, ya`ni 5<<0=5 , 5<<1 =10, 5<<2=20 mos
keladi.
Agar operand musbat bo`lsa N pozitsiyaga o`ngga surish chap operandni ikkining N chi
darajasiga bo`lib kasr qismini tashlab yuborishga mosdir. Misol uchun 5>>2=1. Bu amalning
6
bitli ko`rinishi 101>>2=001=1. Agarda operand qiymati manfiy bo`lsa ikki variant mavjuddir:
arifmetik siljitishda bo`shatilayotgan razryadlar ishora razryadi qiymati bilan to`ldiriladi,
mantiqiy siljitishda bo`shatilayotgan razryadlar nollar bilan to`ldiriladi.
Nisbat amallari. Nisbat amallari qiymatlari 1 ga teng agar nisbat bajarilsa va aksincha 0 ga
tengdir. Nisbat amallari arifmetik tipdagi operandlarga yoki ko`rsatkichlarga qo`llaniladi.
Masalan,
1!=0 qiymati 1 ga teng;
1==0 qiymati 0 ga teng;
3>=3 qiymati 1 ga teng; 3>3 qiymati 0 ga teng;
2<=2 qiymati 1 ga teng;
2<2 qiymati 0 ga teng;
Katta [>], kichiq [<], katta yoki teng [>=], kichiq yoki teng [<=] amallarining ustivorligi bir
xildir.
Teng [== ]va teng emas [!=] amallarining ustivorligi o`zaro teng va qolgan amallardan pastdir.
Mantiqiy amallar. Mantiqiy amallar asosan butun sonlarga qo`llanadi. Bu amallarning natijalari
qo`yidagicha aniqlanadi:
x||y amali 1 ga teng agar x>0 yoki y>0 bo`lsa, aksincha 0 ga teng x&&y amali 1 ga teng agar
x>0 va y>0 bo`lsa, aksincha 0 ga teng
!x amali 1 ga teng agar x>0 bo`lsa, aksincha 0 ga teng
Bu misollarda amallar ustivorligi oshib borish tartibida berilgandir. Inkor [!] amali unar
qolganlari binar amallardir.
Qiymat berish amali. Qiymat berish amali [=] binar amal bo`lib chap operandni odatda
o`zgaruvchi o`ng operandi odatda ifodaga teng bo`ladi. Masalan, Z=4.7+3.34;
Bitta ifodada bir necha qiymat berish amallari qo`llanilishi mumkin. Masalan, C=y=f=4.2+2.8;.
Bundan tashqari C ++ tili da murakkab qiymat berish amali mavjud bo`lib, umumiy ko`rinishi
quyidagichadir:
O`zgaruvchi_nomi amal= ifoda;
Bu erda amal quyidagi amallardan biri bo`lishi mumkin: *,/,%,+,-, &,^,|, <<,>>.
Masalan,
X+=4 ifoda x=x+4 ifodaga teng kuchlidir;
X*=a ifoda x=x*a ifodaga teng kuchlidir;
X/=a+b ifoda x=x/(a+b) ifodaga teng kuchlidir;
X>>=4 ifoda x=x>>4 ifodaga teng kuchlidir;
Shartli amal. Shartli amal ternar amal deyiladi va uchta operanddan iborat bo`ladi: <1ifoda>?<2-ifoda>:<3-ifoda>. Shartli amal bajarilganda avval 1- ifoda hisoblanadi. Agar 1-ifoda
qiymati 0 dan farqli bo`lsa 2- ifoda hisoblanadi va qiymati natija sifatida qabul qilinadi, aks
holda 3-ifoda hisoblanadi va qiymati natija sifatida qabul qilinadi. Masalan, modulni hisoblash:
x<0?-x:x yoki ikkita son kichigini hisoblash a<b?a:b .
Shuni aytish lozimki shartli ifodadan har qanday ifoda sifatida foydalanish mumkin. Agar F
FLOAT tipga, N – INT tipga tegishli bo`lsa, (N > 0) ? F : N ifoda N musbat yoki manfiyligidan
qat`iy nazar DOUBLE tipiga tegishli bo`ladi. Shartli ifodada birinchi ifodani qavsga olish shart
emas.
Tiplar bilan ishlovchi amallar. Tiplarni o`zgartirish amali quyidagi ko`rinishga ega: (tip_nomi)
operand; Bu amal operandlar qiymatini ko`rsatilgan tipga keltirish uchun ishlatiladi. Operand
sifatida o`zgarmas, o`zgaruvchi yoki qavslarga olingan ifoda kelishi mumkin. Misol uchun
(long)6 amali o`zgarmas qiymatini o`zgartirmagan holda operativ xotirada egallagan baytlar
sonini oshiradi. Bu misolda o`zgarmas tipi o`zgarmagan bo`lsa, (double) 6 yoki (float) 6 amali
o`zgarmas ichki ko`rinishini ham o`zgartiradi. Katta butun sonlar haqiqiy tipga keltirilganda
sonning aniqligi yo`qolishi mumkin.
sizeof amali operand sifatida ko`rsatilgan ob`ektning baytlarda xotiradagi hajmini hisoblash
uchun ishlatiladi. Bu amalning ikki ko`rinishi mavjud: sizeof ifoda sizeof (tip) Misol uchun:
Sizeof 3.14=8
7
Sizeof 3.14f=4
Sizeof 3.14L=10 Sizeof(char)=1
Sizeof(double)=8
20.7-jadval.
Amallar ustivorligi
Rang
1
Amallar
[ () ], [ [] ], [->], [::], [.]
Yo`nalish
Chapdan o`ngga
2
[!], [~], [+], [-], [++], [--], [&], [*], [(tip)], sizeof, new,
delete, tip()
3
[.], [*], [->*]
Chapdan o`ngga
4
[*], [/], [%] (multiplikativ binar amallar)
Chapdan o`ngga
5
[+], [-] (additiv binar amallar)
Chapdan o`ngga
6
[<<], [>>]
Chapdan o`ngga
7
[<], [<=], [>=], [>]
Chapdan o`ngga
8
[=], [!=]
Chapdan o`ngga
9
[&]
Chapdan o`ngga
10
[^]
Chapdan o`ngga
11
12
[|]
[&&]
Chapdan o`ngga
Chapdan o`ngga
13
[||]
Chapdan o`ngga
14
[?:] (shartli amal)
Chapdan o`ngga
15
[=], [*=], [/=], [%=], [+=], [-=], [&=], [^=],
[|=], [<<=], [>>=]
16
[,] (vergul amali)
O`ngdan chapga
Chapdan o`ngga
Chapdan o`ngga
C++ dasturlash tilining asosiy konstruktsiyalari, ulardan foydalanish xususiyatlari. Operatorlar,
toifalar, protseduralar.
Tayanch so’z va iboralar: operator, kalit so’zlar, izoh, identifikator, cin, cout, main, namespace,
iostream.
C++ algoritmik tilining alifbosi quyidagilardan iborat:
katta va kichiq lotin harflari:
0 dan 9 gacha raqamlari;
maxsus belgilar (+,-,*,/,=,>,<,{,},[,],’) o’zichiga oladi.
C++ tilida so’z deb bir nechta belgilar ketma - ketligi tushuniladi. Xizmatchi so’z deb C++
tilidagi standart nom tushuniladi. Bu nom maxsus ma’noni anglatadi va uni ma'lumotlarga berib
bo’lmaydi. Masalan: int, float, for, while va hokazo.
C++ tilida ma’lumotlarninig elementlari bo’lib o’zgaruvchilar, o’zgarmaslar, izohlar xizmat
qiladi.
O’zgaruvchi. Xotiraning nomlangan qismi bo’lib, o’zida ma’lum bir toifadagi qiymatlarni
saqlaydi. O’zgaruvchining nomi va qiymati bo’ladi. O’zgaruvchining nomi orqali qiymat
saqlanayotgan xotira qismiga murojaat qilinadi. Programma ishlash jarayonida o’zgaruvchining
qiymatini o’zgartirishi mumkin. Har qanday o’zgaruvchini ishlatishdan oldin, uni e'lon qilish
lozim.
Quyida butun sonlardan foydalanish uchun b, haqiqiy sonlardan foydalanish uchun h
o’zgaruvchisi e’lon qilingan:
8
Int b;
Float h;
O’zgarmaslar (const)
Hisoblash jarayonida qiymatini o’zgartirmaydigan kattaliklarga aytiladi.
Float const pi=3.14;
Izohlar. Programmaning ma’lum qismini tavsiflash uchun ishlatiladi va bu qatorda hech qanday
amal bajarilmaydi, ya’ni programmaning biror qismini yaxshiroq tushuntirish uchun xizmat
qiladi. Izoh “/*” va “*/” simvollari orasida beriladi.
/* Bu erga izoh yoziladi */
Bundan tashqari bir satrli izohlardan ham foydalanish mumkin. Buning uchun izoh boshiga “//”
belgisi qo’yiladi.
Operator. Tilning yakunlangan jumlasi hisoblanadi va ma’lumotlar tahlilining tugallangan
bosqichini ifodalaydi. Operatorlar nuqtali vergul “;” bilan ajratiladi. Ya’ni “;” operatorning
tugallanganligini bildiradi. C++ da operatorlar programmada keltirilgan ketma-ketlikda
bajariladi.
Identifikator. Programmist tomonidan programma elementlari (funksiya, o’zgaruvchilar,
o’zgarmaslar…) uchun ixtiyoriy tanlangan nom.
Identifikator tanlanganda quyidagilarga ahamiyat berish kerak:
Identifikator lotin harflaridan boshlanishi shart;
Ikkinchi simvoldan boshlab raqamlardan foydalanish mumkin;
C++ da kata kichiq harflar farq qiladi. Ya’ni quyidagilarning har biri alohida identifikator
hisoblanadi: KATTA, kata, KaTTa, kAttA, Katta, kATTA, …
Probel C++ da so’zlarni ajratish uchun ishlatiladi. Shuning uchun identifikatorda probeldan
foydalanib bo’lmaydi;
Xizmatchi (int, float, for, while kabi) so’zlardan identifikator sifatida foydalanib bo’lmaydi;
C++ tilining kalit so’zlariga quyidagilar kiradi:
asm, auto, break, case, catch, char, class, const, continue, default, delete, do, double, else, enum,
explicit, extern, float, for, friend, goto, if, inline, int, long, mutable, new, operator, private,
protected, public, register, return, short, signed, sizeof,, static, struct, switch, template, this,
throw, try, typedef, typename, union, unsigned, virtual, void, volatile, while.
Protsessor registrlarini belgilash uchun quyidagi so’zlar ishlatiladi:
_AH, _AL, _AX, _EAX, _BH, _BL, _BL, _BX, _EBX, _CL, _CH, _CX, _ECX, _DH, _DL,
_DX, _EDX, _CS, _ESP, _EBP, _FS, _GS, _DI, _EDI, _SI, _ESI, _BP, _SP, _DS, _ES, _SS,
_FLAGS.
C++ da programma funksiya yoki funksiyalardan tashkil topadi. Agar programma bir nechta
funksiyadan iborat bo’lsa, bir funksiyaning nomi main bo’lishi shart. Programma aynan main
funksiyasining birinchi operatoridan boshlab bajariladi.
Funksiyaning aniqlanishi quyidagicha bo’ladi:
Qaytariluvchi_qiymat_toifasi funksiya_nomi ([parametrlar])
{
Funksiya tanasini tashkil qiluvchi operatorlar
}
Qoida bo’yicha funksiya qandaydir bir qiymatni hisoblash uchun ishlatiladi. Shuning uchun
funksiya nomi oldidan, funksiya qaytaradigan qiymat toifasi yoziladi. Agar funksiya hech
qanday qiymat qaytarmaydigan bo’lsa, void toifasi yoziladi. Agar funksiya qaytaradigan qiymat
toifasi yozilmagan bo’lsa, int (butun) toifali qiymat qaytariladi deb qabul qilinadi.
Funksiyalar bilan keying mavzularda batafsil tanishamiz.
Dastur loyihasi tuzilmasi.
9
C++da oddiy matnni ekranga chiqaruvchi programmani ko’rib chiqamiz
1 // Muallif Andijon Mashinasozlik institute
2 // Sana 22-avgust 2019-yil
3 // Maqsad: Matnni ekranga chiqruvchi programma
4
5 #include <iostream> // ekranga ma’lumot chiqarish uchun
6
7 int main ()
8{
9 std:cout << “Salom Dunyo!”
10
11 return 0;
12 }
Har bir satrni o’rganib chiqamiz:
1,2,3 – satrlar izoh hisoblanadi. Malakali programmistlar har qanday programma muallif,
programmaning tuzilish sanasi va maqsadini ifodalovchi izoh bilan boshlanishini maslahat
berishadi.
4,6,10 – satrlar bo’sh satrlar hisoblanadi. Bosh satrlar programma qismlarini bir-biridan ajratib
qo’yish uchun ishlatiladi. Programma qismlarining bir-biridan ajralib turishi, programma
o’qilishini osonlashtiradi.
5-satrda, klaviaturadan ma’lumotlarni kiritish va ekranga chiqarish uchun <iostream> sarlavha
fayli programmaga qo’shilyapti. Bu satr klaviatura orqali ma’lumot kirituvchi va ekranga
nimadir chiqaruvchi har qanday programmada bo’lishi shart. Aks holda xato sodir bo’ladi.
Agar sizning kompilyatoringiz eski bo’lsa, unda <iostream.h> yozishingiz lozim bo’ladi.
“// ekranga ma’lumot chiqarish uchun” yozuvi bir satrli izoh hisoblanadi.
7-satrda butun toifadagi qiymat qaytaruvchi main funksiyasi berilgan. Int xizmatchi so’zi butun
toifadagi ma’lumotlarni e’lon qilishi uchun ishlatiladi.
8-satrdagi ochuvchi figurali {funksiya tanasining boshlanganini bildiradi.
12-satrdagiu yopiluvchi figurali} funksiya tanasining tugaganini bildiradi.
9-satrdagi std::cout << orqali ma’lumotlar ekranga chiqariladi. Qo’shtirnoq (“_”) orasida
yozilgan ma’lumotlar satr deyiladi. Qo’shtirnoq orasida nima yozilsa, hech qanday o’zgarishsiz
ekranga chiqariladi.
9-satr oxiridagi nuqtali vergul (;) std::cout operatori tugallanganligini bildiradi; operatorlarni birbiridan ajratish uchun xizmat qiladi. Ya’ni operator tugallanganligini bildiradi. 5-satrdagi kabi
preprotsessor amalidan keyin; qo’yilmaydi.
11-satrdagi return xizmatchi so’zi orqali funksiya 0 qiymat qaytaradi va programma
muvaffaqiyatli yakunlanadi.
O’zgaruvchilarni e’lon qilish. Programmada ishlatiladigan barcha o’zgaruvchilarni qaysi toifaga
tegishli ekanligini e’lon qilish kerak. Ma’lumotlarni e’lon qilishning umumiy ko’rinishi
quyidagicha:
Toifa_nomi o’zgaruvchi;
Agar bir nechta o’zgaruvchi bir toifaga mansub bo’lsa, ularni vergul bilan ajratib berish mumkin.
Butun sonlarni ifodalash uchun int va haqiqiy sonlarni ifodalash uchun float xizmatchi
so’zlaridan foydalaniladi. Bu ma’ruzada shu 2 tasini bilish bizga kifoya qiladi. Keying mavzuda
butun va haqiqiy sonlar haqida batafsl gaplashamiz.
Int x,y; // butun toifadagi o’zgaruvchilarni e’lon qilish
10
Float a,b,c; // haqiqiy toifadagi o’zgaruvchilar e’lon qilish
Kiritish va chiqarish operatorlari. Programmada klaviatura orqali ma’lumot kiritish va ekranga
chiqarish uchu preprotsessor direktivasini, ya’ni #include <iostream> ni programmaga qo’shish
shart. Ma’lumotlarni kiritish std:cin >>, ma’lumotlarni chiqarish std::cout << operatori orqali
amalga oshiriladi.
Std::cin >>a;
Bu operator bajarilganda ekranda kursor paydo bo’ladi. Kerakli ma’lumot klaviatura orqali
kiritilgandan so’ng Enter tugmasi bosiladi. Cout orqali ekranga ixtiyoriy ma’lumotni chiqarish
mumkin. Satrli ma’lumotlarni ekranga chiqarish uchun, ularni qo’shtirnoq orasida yozish kerak.
Quyida a va b sonlarining yiьindisini chiqaruvchi programma berilgan:
#include <iostream>
// standart nomlar fazosidan foydalanishni e’lon qilish
Using namespace std;
Int main ()
{
Int a,b,c;
Cout << “a=”; cin >>a;
Cout << “b=”; cin >>b;
C=a+b;
Cout<<c<<endl;
Return 0;
}
Ba’zi matematik funksiyalar:
Matematik funksiyalardan programmada foydalanish uchun math.h faylini programmaga
qo’shish kerak.
#include <math.h>
Funksiyaning C++ da ifodalanishi
Funksiyaning matematik ifodalanishi
Abs(x) – butun sonlar uchun
|x|
Fabs(x) – haqiqiy sonlar uchun
Pow(x,y)
xy
Sqrt(X)
√𝑋
Matematik funksiyalardan foydalanish
// Muallif Andijon Mashinasozlik instituti
// Sana 22-avgust 2019-yil
// Maqsad: Kiritilgan son ildizini ekranga chiqaruvchi programma tuzish
#include <iostream>
#include <math.h>
Using namespace std;
int main ()
{
Float a;
Cout << “a=”; cin>>a;
A=sqrt(a);
Cout<<a<<endl;
return 0;
}
Tayanch so’z va iboralar: o’zgaruvchi, tur, int, float, char, chiziqli dastur, stdio.h, scanf, printf..
11
Dastur bajarilishi mobaynida berilganlarni saqlab turish uchun o’zgaruvchilar va
o’zgarmaslardan foydalaniladi.
O’zgaruvchi−dastur obekti bo’lib, xotiradagi bir nechta yacheykalarni egallaydi va berilganlarni
saqlash uchun xizmat qiladi. O’zgaruvchi nomga, o’lchamga va boshqa atributlarga – ko’rinish
sohasi, amal qilish vaqti va boshqa xususiyatlarga ega bo’ladi. O’zgaruvchilarni ishlatish uchun
ular albatta e’lon qilinishi kerak. E’lon natijasida o’zgaruvchi uchun xotiradan ma’lum adresga
ega soha zahiralanadi, soha o’lchami esa o’zgaruvchining turiga boьliq bo’ladi. Shuni qayd etish
zarurki, bitta turga tegishli o’zgaruvchiga turli apparat platformalarda xotiradan turlicha joy
ajratilishi mumkin.
O’zgaruvchi e’loni uning turini aniqlovchi kalit so’z bilan boshlanadi va ‘=’ belgisi orqali
boshlanьich qiymat beriladi (o’zgaruvchiga boshlanьich qiymat berilmasa ham bo’ladi). Bitta
kalit so’z bilan bir nechta o’zgaruvchilarni e’lon qilish ham mumkin. Buning uchun
o’zgaruvchilar bir-biridan ‘,’ belgisi bilan ajratiladi. O’zgaruvchilar e’loni ‘;’ belgisi bilan
tugallanadi. O’zgaruvchi nomi 255 ta belgidan oshmasligi kerak.
Quyida C++ tilining tayanch turlari, ularning baytlardagi o’lchamlari va qiymatlarining
chegaralarini keltiramiz:
22.1-jadval. Tayanch turlar.
Tur nomi
Unsigned short int
Short int
Unsigned long int
Long int
int(16 razryadli)
Int (32 razryadli)
Unsigned int (16 razryadli)
Unsigned int (32 razryadli)
Unsigned char
Shag
Float
Double
Long double
(32 razryadli)
Bool
Void
Baytlardagi
o’lchami
2
2
4
4
2
4
2
4
1
1
4
8
10
Qiymat chegarasi
1
2 yoki 4
true yoki false
-
0..65535
-32768..32767
0..42949667295
-2147483648. .2147483647
-32768.. 32767
-2147483648. .2147483647
0..65535
0..42949667295
0..255
-128.. 127
1.2YE-38..3.4YE+38
2.2YE-308..1.8YE+308
3.4E-4932..-3.4E+4932
Endi 1.1-jadvalda keltirilgan turlar tavsifini keltiramiz:
Butun son turlari. Butun son qiymatlarni qabul qiladigan o’zgaruvchilar int (butun), short
(qisqa), va 1ong (uzun) kalit so’zlari bilan e’lon qilinadi. O’zgaruvchi qiymatlari ishorali bo’lishi
yoki unsigned kalit so’zi bilan ishorasiz son sifatida qaralishi mumkin.
Belgi turi. Belgi turidagi o’zgaruvchilar char kalit so’zi bilan e’lon qilinadi va ular o’zida
belgining ASCII jadvalidagi kodini saqlaydi. Belgi turidagi qiymatlar nisbatan murakkab bo’lgan
tuzilmalar – satrlar, belgilar massivi va hokazolarni hosil qilishda ishlatiladi.
Haqiqiy son turi. Haqiqiy sonlar float va double kalit so’zlari bilan e’lon qilinadi. Bu turdagi
o’zgaruvchilar uchun mos ravishda xotiradan 4 va 8 bayt joy ajratiladi, hamda sonni saqlash
<ishora><tartib><mantissa> qolipida bo’ladi. Agar kasrli son juda katta (kichiq) qiymatlarni
qabul qiladigan bo’lsa, u xotiradan 10 bayt joy egallaydi va ikkilangan aniqlik ko’rinishida
saqlanadi. U long double kalit so’zi bilan e’lon qilinadi.
12
Mantiqiy tur. Bu turdagi o’zgaruvchi bool kalit so’zi bilan e’lon qilinadi va u xotiradan bir bayt
joy egallaydi, hamda 0(yolьon) yoki 1(rost) qiymatlaridan birini qabul qilishi mumkin.
Void turi. Void turidagi dastur obekti hech qanday qiymatga ega bo’lmaydi va bu turdan
qurilmaning til sintaksisiga mos kelishini ta’minlash uchun ishlatiladi. Masalan, C++ tili
sintaksisi funksiya qiymat qaytarishini talab qiladi. Agar funksiyaning qiymat qaytarishi talab
etilmasa, u void kalit so’zi bilan e’lon qilinadi.
O’zgaruvchilarning e’lon qilinishiga doir misollar:
Int a=-5, A=15;
float abs=36.7, d;
double kasr_son;
bool b,t;
char BELGI=’@’;
Void mening_funksiyam(); /*funksiya qaytaradigan qiymat inobatga olinmaydi */
Kompyuter uchun tuzilgan algoritm ijrochisi-bu kompyuterdir. Biror dasturlash tilida yozilgan
algoritm kodlashtirilgan oddiy ko’rsatmalar ketma-ketliliga o’tadi va mashina tomonidan
avtomatik ravishda bajariladi. Metodik nuqtai–nazardan qaraganda algoritmning birinchi
ijrochisi sifatida o’quvchi (talaba) o’zini tanlashi mumkin. O’quvchi tomonidan biror masalani
echish algoritmi tuzilganda bu algoritmning to’ьri natija berishini tekshirish juda muhimdir.
Buning yagona usuli o’quvchi tomonidan algoritmni turli boshlanьich berilganlarda qadamma qadam bajartirib (ijro etib) ko’rishidir. Algoritmni bajarish natijasida xatolar aniqlanadi va
bartaraf etiladi. Ikkinchi tomonidan, masalani echishga qiynalayotgan o’quvchi uchun tayyor
algoritmni bajarish – masalani echish yo’llarini tushunishga xizmat qiladi.
Algoritmlarni shartli ravishda quyidagi turlarga ajratish mumkin:
- chiziqli algoritmlar;
- tarmoqlanuvchi algoritmlar;
- takrorlanuvchi yoki siklik algoritmlar;
- ichma-ich joylashgan siklik algoritmlar;
- rekurrent (rekursiv) algoritmlar;
- takrorlanishlar soni oldindan noma’lum algoritmlar;
- ketma-ket yaqinlashuvchi algoritmlar.
Algoritmda amallar bajarilish tartibi navbat bilan, ketma-ket tarzda amalga oshsa − bunday
algoritmga chiziqli algoritm deyiladi.
Chiziqli algoritmlarning blok-sxemasini tasvirlashning umumiy ko’rinishi quyidagicha bo’ladi:
13
22.1-rasm. Chiziqli jarayon algoritmi.
C++ tilida o’zgaruvchilarga qiymat berish yoki ifodalarni qiymatlash uchun “=” amalidan
foydalaniladi. Uning sintaksisi quyidagicha:
<o’zgaruvchi>=<qiymat yoki ifoda>;
O’zgaruvchilarga klaviaturadan qiymat kiritish va natijani ekranga chiqarish uchun mos ravishda
“iostream.h” kutubxonasida joylashgan “cin” va “cout” oqimli o’qish vayozish funksiyalaridan
foydalaniladi. Ularning sintaksislari quyidagicha:
cin>>o’zgaruvchi;
cout<<o’zgaruvchi yoki ifoda;
O’zgaruvchilar soni nechta bo’lsa, “>>” (“get”), “<<” (“put”) amallari ham shuncha
marta qo’llaniladi.
Bulardan tashqari C++ tilida oqimdan formatli o’qish va yozishni amalga oshirishga
mo’ljallangan funksiyalar ham mavjud. Quyida ular bilan tanishamiz.
Bu funksiyalar − scanf() va printf() lar bo’lib, C tilidan vorislik bilan olingan. Ulardan
foydalanish uchun «stdio.h» sarlavha faylini dasturga qo’shish kerak bo’ladi.
Formatli o’qish funksiyasi scanf() quyidagi,
int scanf(const char *<format>[<adres>,…]);
prototipga ega. Formatlash satri − <format> belgilar satri bo’lib, u uchta toifaga bo’linadi:
1. To’ldiruvchi belgilar — bu 'bo’sh joy', ‘\t’,’\n’ belgilari. Bu belgilar formatlash satridan
o’qiladi, lekin o’zgaruvchilarda saqlanmaydi.
2. To’ldiruvchi belgilardan farqli belgilar − bu ’%’ belgisidan tashqari, qolgan barcha ASCII
belgilari hisoblanadi. Bu belgilar ham formatlash satridan o’qiladi, lekin o’zgaruvchilarda
saqlanmaydi.
3. Format aniqlashtiruvchilar − oqim maydonidagi belgilarni ko’rib chiqish, o’qish va adresi
bilan berilgan o’zgaruvchilar turiga mos ravishda almashtirish jarayonini boshqaradi. Har bir
format aniqlashtiruvchisiga bitta o’zgaruvchi adresi mos kelishi kerak. Agar format
aniqlashtiruvchilari soni o’zgaruvchilardan ko’p bo’lsa, natija qanday bo’lishini oldindan aytib
bo’lmaydi. Aks holda, ya’ni o’zgaruvchilar soni ko’p bo’lsa, ortiqcha o’zgaruvchilar inobatga
olinmaydi.
14
Format aniqlashtiruvchisi quyidagi ko’rinishga ega:
%[*][<kenglik>][F|N][h|1|L]<tur belgisi>
Format aniqlashtiruvchisi ‘%’ belgisidan boshlanadi va undan keyin 1.2-jadvalda keltirilgan
shart yoki shart bo’lmagan komponentalar keladi:
22.2-jadvad. Format aniqlashtiruvchilari va ularning vazifasi.
Bo’lishi
Vazifasi
Komponenta
shart yoki
yo’q
[*]
yo’q
Navbatdagi ko’rib chiqilayotgan maydon qiymatini
o’zgaruvchiga o’zlashtirmaslik belgisi. Kirish oqimidagi
maydon ko’rib chiqiladi, lekin o’zgaruvchida saqlanmaydi.
[<kenglik>]
yo’q
Maydon kengligining aniqlashtiruvchisi. O’qiladigan
belgilarning maksimal sonini aniqlaydi. Agar oqimda
to’ldiruvchi belgi yoki almashtirilmaydigan belgi uchrasa
funksiya nisbatan kam sondagi belgilarni o’qishi mumkin.
[F|N]
yo’q
O’zgaruvchi ko’rsatkichining (adresining) modifikatori: Ffar pointer; N - near pointer.
[h|1|L]
yo’q
Argument turining modifikatori. <tur belgisi> bilan
aniqlangan o’zgaruvchi-ning qisqa (short - h ) yoki uzun
(long -1,L) ko’rinishini aniqlaydi.
[*]
yo’q
Navbatdagi ko’rib chiqilayotgan maydon qiymatini
o’zgaruvchiga o’zlashtirmaslik belgisi. Kirish oqimidagi
maydon ko’rib chiqiladi, lekin o’zgaruvchida saqlanmaydi.
[<kenglik>]
yo’q
Maydon kengligining aniqlashtiruvchisi. O’qiladigan
belgilarning maksimal sonini aniqlaydi. Agar oqimda
to’ldiruvchi belgi yoki almashtirilmaydigan belgi uchrasa
funksiya nisbatan kam sondagi belgilarni o’qishi mumkin.
[F|N]
yo’q
O’zgaruvchi ko’rsatkichining (adresining) modifikatori: Ffar pointer; N - near pointer.
[h|1|L]
yo’q
Argument turining modifikatori. <tur belgisi> bilan
aniqlangan o’zgaruvchi-ning qisqa (short - h ) yoki uzun
(long -1,L) ko’rinishini aniqlaydi.
<tur belgisi>
ha
Oqimdagi belgilarni almashtiriladigan tur belgisi.
Oqimdagi belgilarni almashtiriladigan tur belgisining qabul qilishi mumkin bo’lgan belgilari
quyidagi jadvalda keltirilgan:
22.3-jadval. Almashtiriladigan tur belgilari.
Berilganlar
Kutilayotgan qiymat
turi
Son turidagi argument
d,D
O’nlik butun
YE,e
Suzuvchi nuqtali son
f
Suzuvchi nuqtali son
G,g
Suzuvchi nuqtali son
O
O
Sakkizlik son
Sakkizlik son
Argument turi
Butunga ko’rsatkich
(int * arg yoki long * arg)
float turiga ko’rsatkich
(float * arg)
float turiga ko’rsatkich
(float * arg)
float turiga ko’rsatkich
(float * arg)
Butunga ko’rsatkich (int *arg)
Butunga ko’rsatkich (long *arg)
15
I
I
U
U
O’nlik, sakkizlik va o’n
oltilik butun son
O’nlik, sakkizlik va o’n
oltilik butun son
Ishorasiz o’nlik son
Ishorasiz o’nlik son
X
X
Belgilar
s
c
O’n oltilik son
O’n oltilik son
%
‘%’ belgisi
Satr
Belgi
Ko’rsatkichlar
n
int ko’rsatkich (int * arg)
p
YYYY:ZZZZ yoki ZZZZ
ko’rinishidagi o’n oltilik
Butunga ko’rsatkich ( int *arg)
Butunga ko’rsatkich (long *arg)
unsigned int turiga ko’rsatkich (unsigned int * arg)
unsigned long turiga ko’rsat-kich (unsigned long *
arg)
Butunga ko’rsatkich (int *arg)
Butunga ko’rsatkich (int *arg)
Belgilar massivga ko’rsatkich (char *arg)
Belgiga ko’rsatkich (char *arg).
Belgi uchun maydon kengligi berilishi mumkin
(masalan, %4). N belgidan tashkil topgan belgilar
massiviga ko’rsatkich (char arg[N]).
Hech qanday almashtirishlar bajarilmaydi, ‘%’
belgisi saqlanadi.
%n argumentigacha muvaffa-qiyatli o’qilgan belgilar
soni aynan shu int ko’rsatkichi bo’yicha adresda
saqlanadi.
Obektga ko’rsatkich (far*yoki near*)
Formatli yozish funksiyasi printf() esa quyidagi,
int printf(const char * <format>[<argument>,...]);
prototipga ega bo’lib, bu funksiya standart oqimga formatlashgan chiqarishni amalga oshiradi.
Funksiya argumentlar ketma-ketligidagi har bir argument qiymat qabul qiladi va unga <format>
satridagi mos format aniqlashtiruvchisini qo’llaydi va oqimga chiqaradi. Har bir format
aniqlashtiruvchisiga bitta o’zgaruvchi adresi mos kelishi kerak. Agar format aniqlashtiruvchilari
soni o’zgaruvchilardan ko’p bo’lsa, natija nima bo’lishini oldindan aytib bo’lmaydi. Aks holda,
ya’ni o’zgaruvchilar soni ko’p bo’lsa, ortiqcha o’zgaruvchilar inobatga olinmaydi. Agar oqimga
chiqarish muvaffaqiyatli bo’lsa, funksiya chiqarilgan baytlar sonini, aks holda EOF qiymatini
qaytaradi.
printf() funksiyasining <format> satri argumentlarni almashtirish, formatlash va chiqarish
jarayonini boshqaradi va u ikki turdagi obyektlardan tashkil topgan.
− oqimga o’zgarishsiz chiqariladigan oddiy belgilar;
− argumentlar ro’yxatidan tanlanadigan argumentga qo’llaniladigan format aniqlashtiruvchilari.
U quyidagi ko’rinishga ega:
% [<bayroq>][<.kenglik>] [.<xona>][F|N|h|1|L] <tur belgisi>;
Format aniqlashtiruvchisi ‘%’ belgisidan boshlanadi va undan keyin 1.4-jadvalda keltirilgan
shart yoki shart bo’lmagan komponentalar keladi:
22.4-jadval. Format aniqlashtiruvchilari va ularning vazifasi.
Komponenta
Bo’lishi
Vazifasi
shart yoki
yo’q
[bayroq]
yo’q
Bayroq belgilari. Chiqarilayotgan qiymatni chapga yoki o’nga
tekislashni, sonning ishorasini, o’nlik kasr nuqtasini, oxirdagi
nollarni, sakkizlik va o’n oltilik sonlarning alomatlarini chop
etishni boshqaradi.
16
[<kenglik>]
yo’q
[.<xona>]
yo’q
[F|N|h|l|L]
yo’q
<tur belgisi>
ha
Maydon kengligining aniqlashtiruvchisi. Chiqariladigan
belgilarning minimal sonini aniqlaydi. Zarur bo’lsa qiymat
yozilishidan ortgan joylar bo’sh joy bilan to’ldiriladi.
Aniqlik. Chiqariladigan belgilarning maksimal sonini
ko’rsatadi. Sonlar uchun−chiqariladigan raqamlarning minimal
miqdorini.
O’lcham modifikatori. Argumentning qisqa (short-h ) yoki uzun
(long-1,L) ko’rinishini, adres turini aniqlaydi.
Argument qiymati almashtiriladigan tur belgisi
Almashtiriladigan tur belgisining qabul qilishi mumkin bo’lgan belgilari quyidagi jadvalda
keltirilgan:
22.5-jadval. Print() funksiyasining almashtiriladigan tur belgilari.
Berilganlar turi Kutilayotgan qiymat
Chiqish formati
Son qiymatlari
d
i
o
u
x
Butun son
Butun son
Butun son
Butun son
Butun son
X
Butun son
f
e
Suzuvchi nuqtali son
Suzuvchi nuqtali son
g
Suzuvchi nuqtali son
E,G
Suzuvchi nuqtali son
Belgilar
s
Satrga ko’rsatkich
c
%
Ko’rsatkichlar
n
Belgi
Hech narsa
p
Ko’rsatkich
int ko’rsatkich(int *
arg)
Ishorali o’nlik butun son
Ishorali o’nlik butun son
Ishorasiz sakkizlik butun son
Ishorasiz o’nlik butun son
Ishorasiz o’n oltilik butun son
(a,b,c,d,e,f belgilari ishlatiladi)
Ishorasiz o’n oltilik butun son
(A,B,C,D,E,F belgilari ishlatiladi)
[-]dddd.dddd ko’rinishidagi suzuvchi nuqtali son
[-]d.dddd yoki e[+/-]ddd ko’rinishidagi suzuvchi
nuqtali son
Ko’rsatilgan aniqlikka mos e yoki f shaklidagi
suzuvchi nuqtali son
Ko’rsatilgan aniqlikka mos e yoki f shaklidagi
suzuvchi nuqtali son. e format
uchun
'YE'
belgisi chiqariladi.
o-belgisi uchramaguncha yoki ko’rsatilgan aniqlikka
erishilmaguncha belgilar oqimga chiqariladi.
Bitta belgi chiqariladi
‘%’ belgisi oqimga chiqariladi
%n argumentigacha muvaffaqiyatli chiqarilgan
belgilar soni, aynan int ko’rsatkichi bo’yicha adresda
saqlanadi
Argumentni YYYY:ZZZZ yoki ZZZZ ko’rinishidagi
o’n oltilik songa aylantirib oqimga chiqaradi.
Endi berilganlar qiymatlarini oqimdan o’qish va oqimga chiqarishda scanf() va prinf()
funksiyalaridan foydalanishga misol keltiramiz:
#include <stdio.h>
int main()
{
int son,natija;
17
float hson;
char belgi, satr[60];
printf(“\nButun va suzuvchi nuqtali sonlarni,”);
printf(“\nbelgi va satrni kiriting\n”);
natija=scanf(“%d %f %c %s”, &son, &hson, &belgi, satr);
printf(“\nOqimdan %d ta qiymat o’qildi ”,natija);
printf(“va ular quyidagilar:”);
printf(“\n %d %f %c %s \n”, son, hson, belgi, satr);
return 0;
}
Dastur foydalanuvchidan butun, suzuvchi nuqtali son, belgi va satrni kiritishni so’raydi. Bunga
javoban foydalanuvchi tomonidan
«8 17.07 F Salom» qiymatlari kiritilsa, ekranga, Oqimdan 4 ta qiymat o’qildi va ular quyidagilar:
«8 17.07 F Salom» lar alohida-alohida satrlarda chop etiladi.
Masala. Kubning qirrasi a berilganda, uning hajmi va to’la sirtini hisoblovchi algoritm va dastur
tuzilsin.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ int a;
/*Kub qirrasi uzunligini kiritish*/
//Kubning hajmini hisoblash
int V=a*a*a;
cin>>a;
/*Kubning to’la sirtini hisoblash*/
int S=6*a*a;
/*Natijalarni ekranga chiqarish*/
cout<<"V="<<V<<"\t S="<<S;
system("PAUSE");
return EXIT_SUCCESS; }
22.2-rasm. Chiziqli jarayon.
Mantiqiy tur − mantiqiy ifodalarning qiymatlarini qabul qiluvchi o’zgaruvchilarni e’lon qilishda
ishlatiladi. Bu turga tegishli o’zgaruvchilar 0 (yolьon) yoki 1 (rost) qiymatlardan birini qabul
qiladi.
Dasturlash tillarida tuzilgan mantiqiy ifodalar to’liq matematik mantiq qonuniyatlariga
asoslanadi.
Matematik mantiq − fikrlashning shakli va qonuniyatlari haqidagi fan. Uning asosini
mulohazalar hisobi tashkil qiladi. Mulohaza – bu ixtiyoriy jumla bo’lib, unga nisbatan rost yoki
yolьon fikrni bildirish mumkin. Masalan «-5>-25», «11–juft son», «Toshkent-Hindistonning
poytaxti», «Samarqand−tarixiy shahar» va hokazolar. Lekin «78 987 256 katta son» jumlasi
to’ьri mulohaza hisoblanmaydi, chunki «katta son» tushunchasi juda ham nisbiy, ya’ni katta son
deganda qanday sonni nazarda tutish aniq emas. Shuning uchun ham yuqoridagi jumlaning rost
yoki yolьonligi haqida fikr bildirish qiyin. Mulohazalarning rost yoki yolьon bo’lishi holatlarga
boьliq ravishda ham o’zgarishi mumkin: Masalan, «hozir soat 13.00» jumlasining rost yoki
yolьonligi qaralayotgan vaqtga boьliq. Xuddi shunday «x>0» ifodaning qiymati x
o’zgaruvchisining qiymatiga bevosita boьliq bo’ladi.
18
C oilasidagi dasturlash tillarida mantiqiy ifodalar qurish uchun quyidagi taqqoslash amallari
kiritilgan “>” (katta), “<” (kichiq), “>=” (katta yoki teng), “<=” (kichiq yoki teng), “==” (teng),
“!=” (teng emas).
C++ tilida mantiqiy tur «Bul algebrasi” asoschisi, Angliyalik matematik Jorj Bul sharafiga bool
kalit so’zi bilan ifodalangan.
“Bul algebrasi” da mantiqiy mulohazalar ustida uchta amal aniqlangan:
Inkor – A mulohazaning inkori deganda A rost bo’lganda yolьon, yolьon bo’lganda rost qiymat
qabul qiluvchi mulohazaga aytiladi. C++ tilida inkor – ‘!’ belgisi bilan ifodalanadi. Masalan, A
mulohazaning inkori «!A» ko’rinishida yoziladi;
Konyunksiya − ikkita A va B mulohazalar konyuksiyasi yoki mantiqiy ko’paytmasi «A && B»
ko’rinishida yoziladi. Bu mulohaza qiymati A va B mulohazalarning har ikkalasi rost
bo’lgandagina rost bo’ladi, aks holda esa yolьon bo’ladi («&&» amali «va» deb o’qiladi).
Masalan, «bugun oyning 8-kuni va bugun payshanba» mulohazasi oyning 8-kuni payshanba
bo’lgan kunlar uchungina rost bo’ladi;
Dizyunksiya – ikkita A va B mulohazalar dizyunksiyasi yoki mantiqiy yiьindisi «A || B»
ko’rinishida yoziladi. Bu mulohaza rost bo’lishi uchun A yoki B mulohazalardan hech
bo’lmaganda bittasi rost bo’lishi etarli. («||» amali «yoki» deb o’qiladi). Masalan, bugun
“dushanba yoki chorshanba” mulohazasi haftaning dushanda yoki chorshanba kunlari uchun rost
hisoblanadi;
Yuqorida keltirilgan fikrlar asosida mantiqiy amallar uchun rostlik jadvali aniqlangan:
Mulohazalar
Mulohazalar ustida amallar
A
V
!A
A&&V
A||V
0
0
1
0
0
0
1
1
0
1
1
0
0
0
1
1
1
0
1
1
23.1-jadval. Rostlik jadvali.
Mantiqiy tur qiymatlari ustida mantiqiy ko’paytirish, qo’shish va inkor amallarini qo’llash orqali
murakkab mantiqiy ifodalarni qurish mumkin. Misol uchun, «x–manfiy va y ning qiymati [-1..3]
sonlar oraliьiga tegishli emas» mulohazasining mantiqiy ifodasi quyidagicha bo’ladi: (x<0) &&
(u<-1) || (y>3).
Masala. Tekislikda markazining koordinatalari x, y , radiusi r bo’lgan aylana, hamda nuqta
x ,y
0 0 koordinatalari bilan berilgan. Berilgan nuqtaning aylanaga tegishli ekanligini aniqlovchi
algoritm va dastur tuzilsin.
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char *argv[])
{ float x,y,r,x0,y0;
/*Aylana markazining koordinatalari va radiusini
kiritish*/
cin>>x>>y>>r;
/*Berilgan nuqta koordinatalarini kiritish*/
cin>>x0>>y0;
/*Berilgan nuqtaning aylana ichida yotishlik shartini
tekshirish*/
bool b=r>=sqrt(pow(x-x0,2) +pow(y-y0,2));
//Natijani chiqarish
cout<<"b="<<b;
system("PAUSE");
19
return EXIT_SUCCESS;}
23.1-rasm. Funksiy algoritmi.
Berilgan masalalar uchun mantiqiy mulohazalar bajarilganda 1 (rost), aks holda 0 (yolьon)
qiymat qaytaruvchi algoritmlar va dasturlar tuzilsin:
Ko’pgina masalalar yuzaga keladigan turli holatlarga boьliq ravishda qaror qabul qilishni talab
etadi. Bu borada C++ tili dasturning alohida bo’laklarining bajarilish tartibini boshqarishga
imkon beruvchi qurilmalarning etarlicha katta majmuasiga ega. Masalan, dastur bajarilishining
birorta qadamida qandaydir shartni tekshirish natijasiga ko’ra boshqaruvni dasturning u yoki bu
bo’lagiga uzatish mumkin (tarmoqlanuvchi algoritm). Bunday tarmoqlanishni amalga oshirish
uchun shart operatorlaridan foydalaniladi.
if operatori: if operatori qandaydir shartni rostlikka tekshirshi natijasiga ko’ra dasturda
tarmoqlanishni amalga oshiradi:
if (<shart> )<operator>;
Bu erda <shart> mantiqiy turga tegishli o’zgaruvchi yoki mantiqiy ifoda bo’lishi mumkin.
Agar shart 0 qiymatidan farqli, ya’ni rost bo’lsa, <operator> bajariladi, aks holda, ya’ni shartning
qiymati 0(yolьon) bo’lsa, hech qanday amal bajarilmaydi va boshqaruv if operatoridan keyingi
operatorga o’tadi (agar u mavjud bo’lsa).
C++ tilining qurilmalari operatorlarni blok ko’rinishida tashkil qilishga imkon beradi. Blok – ‘{‘
va ‘}’ belgilar oraliьiga olingan operatorlar ketma-ketligi bo’lib, u kompilyator tomonidan yaxlit
bir operator deb qabul qilinadi. Blok ichida o’zgaruvchilar e’lonlari ham bo’lishi mumkin va
blokda e’lon qilingan o’zgaruvchilar faqat shu blok ichida (ko’rinadi) amal qiladi, blokdan
tashqarida (ko’rinmaydi) amal qilmaydi. Blokdan keyin ‘;’ belgisi qo’yilmasligi mumkin, lekin
blok ichidagi har bir ifoda ‘;’ belgisi bilan yakunlanishi shart.
If – else operatori: Shart operatorining if – else ko’rinishi quyidagicha:
if (<shart>) <operator1>; else <operator2>;
Bu erda <shart> 0 qiymatidan farqli, ya’ni rost bo’lsa <operator1>, aks holda <operator2>
bajariladi. If-else shart operator mazmuniga ko’ra algoritmning tarmoqlanuvchi blokini
ifodalaydi.
?: shart amali: Agar tekshirilayotgan shart nisbatan sodda bo’lsa, shart amalining ‘?:’
ko’rnishini ishlatish mumkin:
<shart> ? <ifoda1> : <ifoda2>;
20
Ushbu shart amali if shart operatoriga o’xshash ko’rinishda ishlaydi: agar <shart> 0 qiymatidan
farqli, ya’ni rost bo’lsa, <ifoda1>, aks holda <ifoda2> bajariladi. Odatda ifodalarning qiymatlari
biror o’zgaruvchiga o’zlashtiriladi.
Goto operatori va nishonlar: Nishon – bu davomida ikkita nuqta (‘:’) qo’yilgan identifikator.
Nishon bilan qandaydir operator belgilanadi va keyinchalik dasturning boshqa bir qismidan unga
shartsiz o’tish amalga oshiriladi. Nishon bilan har qanday operator belgilanishi mumkin, shu
jumladan e’lon operatori va bo’sh operatorlar ham. Nishon faqat funksiyalar ichida amal qiladi.
Nishonga shartsiz o’tish goto operatori yordamida bajariladi. Goto operatori orqali faqat uning
o’zi joylashgan funksiya ichidagi operatorlarga o’tish mumkin. Goto operatorining sintaksisi
quyidagicha:
goto <nishon>;
Ayrim hollarda, goto operatorining «sakrab o’tishi» hisobiga xatoliklar yuzaga kelishi mumkin.
Masalan,
int i=0;
i++; if(i) goto m;
int j;
m: j+=i;
operatorlarining bajarilishi xatolikka olib keladi, chunki j o’zgaruvchisining e’loni chetlab
o’tilgan.
Shartsiz o’tish operatori dastur tuzishdagi kuchli va shu bilan birga xavfli vositalardan biri
hisoblanadi. Kuchliligi shundaki, u yordamida algoritmning «boshi berk» joylaridan chiqib
ketish mumkin. Ikkinchi tomondan, bloklarning ichiga o’tish, masalan, takrorlash
operatorlarining ichiga «sakrab» kirish kutilmagan holatlarni yuzaga keltirishi mumkin. Shu
sababli, imkon qadar goto operatoridan foydalanmaslik kerak, foydalanilgan taqdirda ham
quyidagi qoidalarga amal qilish zarur – blok ichiga, if, if−else va switch operatorlari ichiga,
hamda takrorlash operatorlari tanasiga tashqaridan “sakrab” kirish mumkin emas. Garchi, nishon
yordamida dasturning ixtiyoriy joyiga o’tish mumkin bo’lsa ham, boshlanьich qiymat berish
e’lonlaridan sakrab o’tish man etiladi, lekin bloklardan sakrab o’tish mumkin.
Masalan:
…
goto B3A; \\ xato
float x=0.5;
goto B3A; \\ to’ьri
{int n=10; x=n*x+8;}
B3A: cout<<“x=”<<x;
…
Masala. Berilgan 3 ta a,b,c o’zgaruvchilardagi sonli qiymatlarning eng kattasini aniqlovchi
algoritm va dastur tuzilsin.
21
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ int a,b,c,max;
/*Berilgan 3 ta o’zgaruvchiga sonli qiymatlar
kiritish*/
cin>>a>>b>>c;
/*Dastlabki 2 ta sonning kattasini topib, max
o’zgaruvchisiga qiymatlash*/
if (a>b) max=a;
else max=b;
/*max o’zgaruvchisidagi qiymat bilan 3-sonni
taqqoslash*/
if (max<c) max=c;
//Natijani chiqarish;
cout<<"max="<<max;
system("PAUSE");
return EXIT_SUCCESS;}
23.2-rasm. Tarmoqlanuvchi jarayon algoritmi.
Takrorlanuvchi jarayonlarni dasturlash.
Dastur bajarilishini boshqarishning yana bir kuchli mexanzmlaridan biri – takrorlash operatorlari
hisoblanadi.
Takrorlash operatori «takrorlash sharti» deb nomlanuvchi ifodaning rost qiymatida dasturning
ma’lum bir qismidagi operatorlar (takrorlash tanasi)ning ko’p marta takror ravishda bajarilishini
amalga oshiradi.
Takrorlash o’zining kirish va chiqish nuqtalariga ega bo’lib, ba’zan chiqish nuqtasi
bo’lmasligi ham mumkin. Agar chiqish nuqtasi bo’lmasa cheksiz takrorlanish sodir bo’ladi.
Cheksiz takrorlanish uchun takrorlashni davom ettirish sharti doimo rost bo’ladi.
Takrorlash shartini tekshirish, takrorlanish tanasidagi operatorlarning bajarilishidan oldin
tekshirilishi mumkin (for, while takrorlash operatorlarida) yoki takrorlanish tanasining
operatorlari bir marta bajarilgandan keyin tekshirilishi mumkin (do-while).
Takrorlanishlarni tashkil etishda takrorlanishlar soni va qadami oldindan ma’lum bo’lgan
holatlar uchun for operatoridan, boshqa hollarda esa while hamda do-while operatorlaridan
foydalanish maqsadga muvofiq.
Takrorlash operatorlari ichma-ich joylashishi ham mumkin. Quyida takrorlash operatorlari va
ularning qo’llanilishi bilan batafsil tanishamiz.
for takrorlash operatorining sintaksisi quyidagi ko’rinishga ega:
for (<ifoda1>; <ifoda2>;<ifoda3>) <operator yoki blok>;
Bu operator o’z ishini <ifoda1> ifodasining bajarishidan boshlaydi. Keyin takrorlash qadamlari
boshlanadi. Har bir qadamda <ifoda2> tekshiriladi, agar <ifoda2> ning qiymati 0 qiymatidan
farqli, ya’ni rost bo’lsa, takrorlash tanasi − <operator yoki blok> bajariladi, so’ngra <ifoda3>
bajariladi. Agar <ifoda2> ning qiymati 0 (yolьon) bo’lsa, takrorlanish jarayoni to’xtaydi va
22
boshqaruv takrorlash operatoridan keyingi operatorga o’tadi. Shuni ta’kidlash kerakki, <ifoda2>
ifodasi vergul bilan ajratilgan bir nechta ifodalar birlashmasidan iborat bo’lishi ham mumkin, bu
holda vergul bilan ajratilgan ifodalarning oxirgisi takrorlanish sharti hisoblanadi. Takrorlanish
tanasi sifatida bitta operator, jumladan bo’sh operator bo’lishi yoki operatorlar bloki ham kelishi
mumkin.
Quyida for operatori parametrlarining vazifalari bilan tanishamiz:
<ifoda1> − takrorlash sanagichiga boshlanьich qiymat berishga xizmat qiladi va u takrorlash
jarayoni boshida faqat bir marta hisoblanadi. Ifodada o’zgaruvchi e’loni ham bo’lishi mumkin va
bu o’zgaruvchi takrorlash operatori tanasida amal qiladi va takrorlash operatoridan tashqarida
«ko’rinmaydi».
<ifoda2> − takrorlanishning bajarishi yoki bajarilmasligini aniqlab beruvchi mantiqiy ifoda
(shart), agar shart rost bo’lsa, takrorlanish davom etadi, aks holda to’xtaydi. Agar bu ifodaning
o’rni bo’sh bo’lsa, shart doimo rost deb hisoblanadi.
<ifoda3> − odatda takrorlanish sanagichining qiymatini oshirish (kamaytirish) uchun xizmat
qiladi yoki unda takrorlanish shartiga ta’sir etuvchi boshqa amallar ham bo’lishi mumkin.
Takrorlash operatorida qavs ichidagi ifodalar bo’lmasligi ham mumkin, lekin sintaksis ‘;’
bo’lmasligiga ruxsat bermaydi. Shu sababli sodda ko’rinishdagi takrorlash operatori quyidagicha
bo’ladi:
for(;;).
Agar takrorlanish jarayonida bir nechta o’zgaruvchilarning qiymati sinxron ravishda o’zgarishi
kerak bo’lsa, <ifoda1> va <ifoda3> ifodalarida zarur operatorlarni ‘,’ bilan yozish orqali bunga
erishish mumkin:
for(int i=1,j=2;i<=15;i++,j=i+1) { … }
Takrorlash operatorining har bir qadamida i va j o’zgaruvchilarning qiymatlari mos ravishda
o’zgarib boradi.
for operatorida takrorlanish tanasi bo’lmasligi ham mumkin.
Shuni ham ta'kidlash joizki, C++ tilida for operatorining parametrlari haqiqiy turga tegishli
bo’lishi, takrorlanishlar qadami ham ixtiyoriy holatda belgilanishi mumkin. Bu imkoniyatlar
operatorning keng qamrovli ekanligini bildiradi.
Masala. Dastlabki n ta (n>0) natural sonlarning kvadratlari yiьindisini hisoblovchi algoritm va
dastur tuzilsin.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,n;
//Berilgan qiymatni kiritish
cin>>n;
/*Yiьuvchiga boshlanьich qiymat berish*/
int s=0;
/*1 dan n gacha bo’lgan sonlar kvadratlarini
yiьish*/
for (i=1;i<=n;i++)
s+=i*i;
//Natijani chiqarish
cout<<"S="<<s;
system("PAUSE");
return EXIT_SUCCESS;
}
24.2-rasm. Takrorlanuvchi jarayon algoritmi.
23
while takrorlash operatori, operator yoki blokni takrorlanish sharti yolьon (0) bo’lguncha
takrorlashni amalga oshiradi. Uning sintaksisi quyidagicha:
while (<ifoda>) <operator yoki blok>;
Agar <ifoda> qiymati doimo rost bo’lsa, takrorlanish jarayoni cheksiz davom etadi. Xuddi
shunday, <ifoda> takrorlanish boshlanishida rost bo’lib, uning qiymatiga takrorlanish tanasidagi
hisoblash ta’sir etmasa, ya’ni uning qiymati o’zgarmasa, bu holda ham takrorlanish cheksiz
davom etadi.
while takrorlanish shartini oldindan tekshiruvchi takrorlash operatori hisoblanadi. Agar
takrorlanish boshida <ifoda> yolьon bo’lsa, while operatori tarkibidagi <operator yoki blok>
bajarilmasdan cheklab o’tiladi.
Ayrim hollarda <ifoda> qiymat berish operatori ko’rinishida kelishi mumkin. Bunda qiymat
berish amali bajariladi va natija 0 bilan taqqoslanadi. Natija noldan farqli bo’lsa, takrorlanish
davom ettiriladi.
Agar rost ifodaning qiymati noldan farqli o’zgarmas bo’lsa, cheksiz takrorlanish ro’y beradi.
Masalan:
while(1); // cheksiz takrorlanish
Xuddi for operatoridagi kabi bu operatorda ham qavs ichida ‘,’ yordamida ajratilgan bir nechta
ifodalarni yozish mumkin.
Masala. Ikkita natural sonning eng katta umumiy bo’luvchisi (EKUB)ni Evklid algoritmi
yordamida topish masalasi uchun algoritm va dastur tuzilsin.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ int a,b;
/*Berilgan o’zgaruvchilarga qiymat kiritish*/
cin>>a>>b;
/*a va b lar uchun Ekub ni topish*/
while (a!=b)
{ if (a>b) a=a-b;
else b=b-a; }
//Natijani chiqarish
cout<<a;
system("PAUSE");
return EXIT_SUCCESS;}
24.2-rasm. Tarmoqlanuvchi jarayon algoritmi.
Butun turdagi a va b qiymatlari oqimdan o’qilgandan keyin ular qiymatlari toki o’zaro teng
bo’lmaguncha takrorlash jarayoni ro’y beradi. Takrorlashning har bir qadamida a va b
sonlarining kattasidan, kichigi ayriladi va ularning tengligi tekshiriladi. Takrorlashdan keyingi
ko’rsatma vositasida a o’zgaruvchisining qiymati natija sifatida chop etiladi.
do-while takrorlash operatori while operatoridan farqli ravishda oldin operator yoki
blokni bajaradi, keyin takrorlanish shartini tekshiradi. Bu qurilma takrorlanish tanasining kamida
bir marta bajarilishini ta’minlaydi. do-while takrorlash operatori quyidagi sintaksisga ega:
24
do <operator yoki blok> while (<ifoda>);
Bunday takrorlash operatorining qo’llaniladigan holatlari takrorlanishni boshlamasdan turib,
takrorlanish shartini tekshirishning iloji bo’lmagan holatlar hisoblanadi. Masalan, birorta
jarayonni davom ettirish yoki to’xtatish haqidagi so’rovga javob olish va uni tekshirish zarur
bo’lsin. Ko’rinib turibdiki, jarayonni boshlamasdan oldin bu so’rovni berishning ma’nosi yo’q.
Hech bo’lmaganda takrorlanish jarayonining bitta qadami amalga oshirilgan bo’lishi kerak.
Masala. Berilgan a musbat butun sonining barcha musbat butun bo’luvchilari va ularning
miqdorini chop etadigan algoritm va dastur tuzilsin.
#include <cstdlib>
#include <iostream>
#include<stdio.h>
using namespace std;
int main(int argc, char *argv[])
{ unsigned int a;
/*berilgan musbat sonni a o’zgaruvchisiga o’qish*/
scanf("%d",&a);
/*bo’luvchilar soni va bo’luvchini o’zida saqlovchi
o’zgaruvchilar*/
int k=0,i=0;
do { i++;
/*berilgan son bo’luvchilarini topish,ularni miqdorini
hisoblash va chop etish*/
if(!(a%i)){ k++;
cout<<i<<"\n";
cout<<"\n";}}
while(a>=i);
/*son bo’luvchilari miqdorini chop etish*/
cout<<a<<" ning bo’luvchilari soni "<<k<<" ta";
system("PAUSE");
return EXIT_SUCCESS;}
24.3-rasm. Murakkab tarmoqlanuvchi jarayon algoritmi.
25
Download