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