«C# dasturlash tili» O’quv qo’llanma «C# dasturlash tili» O’quv qo’llanma Umumiy o’quv soati –110 s. Shu jumladan: Ma’ruza –32 s. Amaliy mashg’ulotlar –21 s. Laboratoriya mashg’ulotlari –27 s. Mustaqil ta’lim soati –30 s. Annotatsiya Qo’llanmada .NET muhitida yaratilgan yangi C# programmalash tilining asosiy aspektlari, jumladan: berilganlar tipi, operatorlar, boshqaruvchi ko’rsatmalar, sinflar, interfeyslar va C# sinflari kutubxonasining imkoniyatlari oddiy misollar yordamida bayon qilingan. Undan C#da programma tuzuvchilar va xususan axborot texnologiyalari bilan bog’liq bo’lgan mutaxassisliklar talabalari va mustaqil o’rganuvchilar foydalanishlari mumkin. BBK 32.973.26-018.2.75 Tuzuvchilar: f.-m.n.d., prof. Aripov M.M. katta. o’qit. T.Xojiev assistent I.O.Xajiev Taqrizchi: f-m.n.n., dotsent Xakimov M.X. Kerak. 170209. yego glavno’m arxitekto-rom bo’l veduhiy spesialist v etoy oblasti — Anders Xeylsberg (Anders Hejlsberg).C#-— pryamoy potomok dvux samo’x uspeshno’x v mire kompyuterno’x yazo’kov: S i CQQ. Ot S on unasledoval sintaksis, klyuchevo’ye slova i operatoro’. On pozvolyaet postroit i usovershenstvovat ob’ektnuyu model, opredelennuyu v CQQ. Krome togo, S# blizko svyazan s drugim ochen uspeshno’m yazo’kom: Java. Imeya obhee proisxojdenie, no razlichayas vo mnogix vajno’x aspektax, C#i Java — eto skoree "dvoyurodno’ye bratya". Naprimer, oni oba podderjivayut programmirovanie raspredelenno’x sistem i oba ispolzuyut promejutochno’y kod dlya dostijeniya perenosimosti, no razlichayutsya pri etom v detalyax realizatsii. I yehe. Podobno Java yazo’k C# predlagaet sredstva dinamicheskogo obnarujeniya oshibok, obespecheniya bezopasnosti i upravlyaemogo vo’polneniya programm. No, v otlichie ot Java, C# daet programmistam dostup k ukazatelyam. Takim obrazom, C#sochetaet pervozdannuyu moh CQQ s tipovoy bezopasnostyu Java, kotoraya obespechivaetsya nalichiem mexanizma kontrolya tipov (type checking) i korrektno’m ispolzovaniem shablonno’x klassov (template class). Bolee togo, yazo’k C#otlichaetsya tem, chto kompromiss mejdu mohyu i nadejnostyu thatelno sbalansirovan i prakticheski prozrachen (ne zameten dlya polzovatelya ili programmo’). Kitobning strukturasi. Tilning nihoyatda kattaligini hisobga olib, uni ma’lum bir qismlarga bo’lgan holda bayon etish maqsadga muvofiqdir. Jumladan, C# tili to’g’risidagi asosiy tushunchalar, kalit so’zlarning vazifalari, sintaksis va programmalash muhiti, unda dastlabki programmalar yozishni o’rganish kabilar mazkur kitobning tarkibini tashkil etadi. Qolgan qismlari to’g’risidagi ma’lumotlarni bayon etish esa mualliflarning keyingi rejalari bo’lib hisoblanadi. Programma ta’minoti to’g’risida shuni aytib o’tish kerakki, keltirilgan programmalarni kompilyatsiya qilish va bajarish uchun kompyuterda Visual Studio .Net 7 paketi va .NET Framework qobig’i o’rnatilgan bo’lishi kerak. Mundarija Kirish ............................................................................................................. 1-bob. Genealogik daraxt. S tili, yoki programmalashning yangi davrini boshlanishi OYP va SQQ yaralishi to’g’risida............................................................................. Internet va Java tilining paydo bo’lishi............................................................... C# ning paydo bo’lishi va uning .NET Framework qobig’i bilan bog’liqligi....... .NET Framework muhiti to’g’risida. CLR sistemasi. Boshqariladigan kodni boshqarilmaydigan kod bilan taqqoslash ................................................................... Universal tilning Spesifikatsiyasi ....................................................................... 2-bob. Ob’ektga yo’naltirilgan programmalashtirish Inkapsulyatsiya. Polimorfizm. Merosxo’rlik...................................... Oddiy programmalar tuzish. csc.exe buyruq satri kompilyatoridan foydalanish..... Programma tekstini kiritish, kompilyatsiya qilish va bajarishga berish. Visual Studio IDE dan foydalanish Sintaktik xatoliklarni qayta ishlash Oddiy programma tuzishlarga misollar................................. Berilganlarning boshqa tiplari. ....... Boshqarish ko’rsatmalari: if va for ..................................... Kod bloklaridan foydalanish......................... Nuqta vergul va chekinishlardan foydalanish. ..................... C# ning kalit so’zlari................ Identifikatorlar................. C# sinflari kutubxonasi ........... 3-bob. Berilganlarning tiplari, literallar va o’zgaruvchilar.... C# da qiymatlar tipi. Butun qiymatli va suzuvchi nuqtali sonlarni tasvirlash uchun tiplar. decimal tipi. Simvollar. bool tipi. ...................... Berilganlarni bosib chiqarish to’g’risida........ Literallar. O’noltilik literallar. Satrli literallar............ O’zgaruvchilarning oddiy va dinamik initsializatsiyasi ........... O’zgaruvchilarning ko’rinish va mavjudlik vaqti........ Tiplarni oddiy va avtomatik almashtirish variantlari......... 4-bob. Operatorlar. Arifmetik operatorlar................... Inkrement i dekrement......... Munosabat operatorlari va mantiqiy operatorlar. ............ Oddiy va qo’shma o’zlashtirish operatorlari. Razryadli VA,YOKI va EMAS.................... Siljitish operatori .................... Razryadli qo’shma o’zlashtirish operatorlari. ? operatori ..... Probel va kichik qavslardan foydalanish. Operatorlar imtiyozi.... 5-bob. Boshqarish uchun ko’rsatma. If, ichma-ich joylashgan if va if-else-if ko’rsatmalari............... Switch va ichma-ich joylashgan switch ................................. for ko’rinishidagi bir yoki bir necha o’zgaruvchili sikl operatorlari ................... Shartli ifodalar ...................... Cheksiz va tanasiz sikllar ........................ while va do-while sikli ................. foreach sikli ....................... Sikldan chiqish uchun break dan foydalanish Continue, return va goto............... 6-bob. Sinflar, ob’ektlar va usullarning umumiy ko’rinishlari va ta’riflari........ Ob’ektlarni hosil qilish................ Sso’lochnaya tipidagi o’zgaruvchilar va ularga qiymatlar berish .................. Usullar va ularni Building sinfiga qo’shish ................ Usuldan qaytish. Qiymatni qaytarish. Parametrlardan foydalanish. Konstruktorlar va parametrlashgan konstruktorlarni Building sinfiga qo’shish......... new operatoridan foydalanish. "musor"larni yig’ish. Destruktorlar va ulardan foydalanish............ this kalit so’zi................. 7-bob. Massivlar va satrlar. Bir o’lchovli massivlar. Massivlarni initsializa siyalash...... "Chegaraviy rejim"ni saqlash ...... Ikki o’lchovli va ko’p o’lchovli massivlar........ Ko’p o’lchovli massivlarni initsializatsiyalash. Buzilgan massivlar. Length xossasidan foydalanish ................ foreach sikli Satrlar va ularni tuzish. SAtrlar bilan ishlash Satrlar massivi va o’zgarmasligi.............. switch-instruksiyalarda satrlardan foydalanish. ............ 8-bob. C# da ishlash bo’yicha qisqacha ko’rsatma .................................... 9-bob. Ilovalar .................................................................................... Adabiyot ............................................................................. C# da programmalash elementlari .......................................................... C# alfaviti ................................................................................................ Identifikatorlar, kalit so’zlar .................................................. Berilganlar: o’zgarmaslar .............................................................. O’zgaruvchilar ................................................................................... Turlar ............................................................................................... 2-bob. Matematik funksiyalar ................................................................. Ifodalar. ....................................................................................... Arifmetik amallar ........................................................................ 3-bob. Operatorlar. Qiymat berish operatori ..................................... Shartli va shartsiz o’tish operatorlari ..................................... Takrorlash operatori ................................................................... 4-bob. Massivlar: bir o’lchovli va ko’p o’lchovli massivlar ................ 5-bob. Funksiyalar .................................................................................. Kirish Oxirgi yillarda C# tili va u bilan bog’liq bo’lgan muhit, ya’ni .NET platformasi dasturiy ta’minot yaratuvchilar uchun asosiy yangi texnologiya bo’lib kelmoqda. .NET platformasi orqali Windows muhitida hosil qilish mumkin bo’lgan ixtiyoriy dasturlarni yaratish mumkin. C# tili esa yangi til hisoblanib, ushbu muhit uchun maxsus ishlab chiqilgan. C# tilidan foydalanib, dinamik WEB – sahifalarni, tarqatma texnologiya asosida yaratilgan dasturlarni, berilganlar bazasi bilan ishlovchi komponentlarni yoki oynali Windows dasturlarini yaratish mumkin. C#tili yordamida tarmoq yoki Internet dasturlaridan tashqari, Windows platformasida ishlovchi ixtiyoriy dasturni yaratish mumkin. C# tilida .NET platformasi orqali Windows muhitida dasturlar yaratish metodikasini mukammallashtirish ko’zda tutilgan. 1. .NET arxitekturasi .NET (.NET runtime) platformasida kod bajarilishi. Boshqariluvchi kod (managed code). Oraliq til. Tiplarning umumiy tizimi (Common Type System, CTS). Ichki qurilgan .NET klasslari. Tilning umumiy spesifikatsiyasi (Common Language Specification, CLS). Kompilyatsiya JustIn-Time (JIT). Keraksiz ma’lumotlarni yo’qotish (CLR). 2. C# tili va birinchi proekt. C# tili qurilishi. Asosiy qismlari. Konsol va Windows dasturlar xosil qilinishi. Ma’lumki, kompyuter tillari o’z-o’zidan birdaniga yangidan emas, balki o’zaro bir-biriga bog’liqlikda vujudga keladi. Har qanday yaratilgan yangi til u yoki bu shaklda oldinroq yaratilgan mavjud tillarning xossalarini o’ziga meros qilib oladi, ya’ni ketma-ketlik prinsipi amalga oshiriladi. Natijada bitta tilning imkoniyatlari boshqalari tomonidan foydalaniladi va ma’lum bir joylari mukammallashtiriladi. Kompyuter tillarining evolyutsiyasi shunday tarzda ro’y beradi va dasturlash mahorati takomillashtiriladi. C#tili ham yuqoridagilardan istisno emas. U boshqa dasturlash tillarining ko’plab foydali imkoniyatlarini meros qilib oldi va dunyoda eng ko’p qo’llaniladigan ikkita kompyuter tillari – Si va SQQ, shuningdek Java tili bilan uzviy bog’liqdir. C#ni tushunish uchun mazkur bog’liqlik tabiatini aniqlab olish kerak, shuning uchun oldin biz ushbu uch tilning rivojlanish tarixi to’g’risida to’xtalib o’tamiz. C#tilining yaratilishi – dasturlashning zamonaviy davri boshlanishidir C#tili 1972 yilda Nyu-Djersi shtatining Myurrey-xill shahrida Bell Laboratories kompaniyasining tizimli dastur tuzuvchisi Dennis Richi tomonidan yaratilgan. Bu til o’zini shunchalik yaxshi ko’rsatdiki, oxir oqibatda unga Unix operatsion tizimlarining 90% yadro kodlari yozildi. (Ma’lumki, ular oldin past darajadagi til – assemblerda yozishgan). C#ning vujudga kelishidan oldinroq yaratilgan tillardan, Pascal ulardan eng mashhuri hisoblanadi va u yetarli darajada muvaffaqiyatli foydalanilgan. 1960 yillarda dasturlash texnologiyalaridagi strukturaviy dasturlashlarning paydo bo’lishiga olib kelgan katta o’zgarishlar C#tilini yaratish uchun asosiy imkoniyatlarni belgilab berdi. Strukturaviy dasturlashlarning paydo bo’lishiga qadar katta dasturlarni yozish qiyin bo’lgan. Satr kodlari miqdorining oshishi sababli dasturlarning o’tish joylari chalkash masalalarga aylanib ketishiga olib keladi. Strukturaviy tillar dastur tuzuvchisiga shartli operatorlarni, lokal o’zgaradigan tartiblarni va boshqa mukammallashtirishlarni qo’shib bu muammoni hal qildi. Shu tarzda nisbatan katta dasturlarni yozish imkoniyati vujudga keldi. Aynan C#tili kuch, elegantlik va ma’nodorlikni o’zida muvaffaqiyatli birlashtirgan birinchi strukturaviy til bo’ldi. Uning bo’lishi mumkin bo’lgan xatolar mas’uliyatini tilga emas dastur tuzuvchi zimmasiga yuklaydigan prinsiplar bilan inobatga olgan holda sintaksisdan foydalanishdagi qisqalik va osonlik kabi xususiyatlari tezda ko’plab tarafdorlarini topdi. Bugungi kunda biz mazkur sifatlarni o’z o’zidan anglashiladigan deb hisoblaymiz, lekin C#da birinchi marotaba dastur tuzuvchiga zarur bo’lgan ajoyib yangi imkoniyatlar mujassamlashtirilgan. Natijada 1980 yillardan boshlab C#strukturaviy dasturlash tillari orasida eng ko’p foydalaniladiganlaridan biri bo’lib qoldi. Biroq, dasturlashning rivojlantirish choralariga ko’ra bundan ham kattaroq dasturlarni qayta ishlash muammosi kelib chiqmoqda. Loyiha kodi ma’lum bir hajmga yetgan zahoti (uning raqamli ahamiyati dastur, dastur tuzuvchi, foydalanilgan instrumentlarga bog’liq bo’ladi, lekin taxminan 5000 satr kodlari nazarda tutilayapti) S#-dasturlarini tushunish va kuzatib borishda qiyinchiliklar yuzaga keladi. OYD ning vujudga kelishi va SQQ tilining yaratilishi 1970 yillar oxirida ko’plab loyihalar S strukturaviy dasturlash tili yordamida qayta ishlash uchun oson bo’lgan eng yuqori ko’rsatkichga erishgan. Endi bularga yangicha munosabat talab qilina boshlandi va ushbu muammoni hal etish uchun dastur tuzuvchiga katta hajmdagi dasturlar bilan ishlash imkonini beruvchi ob’ektga yo’naltirilgan dasturlash (OYD) yaratildi. Garchi, o’sha vaqtda S eng ommabop til bo’lishiga qaramasdan OYD ni qo’llab-quvvatlamadi. Shu bois uning ob’ektga yo’naltirilgan (keyinchalik SQQ deb atalgan) versiyasini yaratish zaruriyati tug’ildi. Bu versiya o’sha Bell Laboratories kompaniyasining xodimi Byarn Straustrap tomonidan 1979 yil boshida ishlab chiqilgan. Dastlab yangi til “S sinflar bilan” degan nom oldi. Lekin, u 1983 yilda SQQ deb qayta nomlangan. Bo’lib, o’zida S tilini to’la qamrab oladi (ya’ni, S SQQ uchun poydevor bo’lib xizmat qiladi) va ob’ektga yo’naltirilgan dasturlashni qo’llab-quvvatlash uchun mo’ljallangan yangi imkoniyatlarni namoyon qiladi. Aslida SQQ S tilining ob’ektga yo’naltirilgan versiyasi hisoblanadi. Shuning uchun C#ni biluvchi dastur tuzuvchi uchun SQQ da dasturlashga o’tishda yangi tilni emas, balki faqatgina OYD ning yangi konsepsiyasini o’rganish kifoya qiladi. SQQ tili uzoq vaqt mobaynida sifatga etibor bermay, faqat miqdor oshirish, hajmni kengaytirish jihatidan rivojlandi. 1990 yillar boshida u ommaviy ravishda qo’llanila boshlandi va katta yutuqlarga erishdi. O’n yillikning oxirida esa dasturiy ta’minotni qayta ishlashda eng keng foydalaniladigan va bugungi kunda ham peshqadamlik qilayotgan tilga aylandi. Shuni anglash muhimki, SQQ ni ishlab chiqilishi yangi dasturlash tilini yaratishga intilish hisoblanmaydi, balki mavjud tilni faqatgina yetarli darajada muvaffaqiyatli takomillashtiryapti va to’ldiryapti. Bunday qarash, hozirda ham kompyuter tillarini rivojlantirishning yangi yo’nalishlarida ham qo’llanilayapti. Internet va Java tilining vujudga kelishi Dasturlash tillarini rivojlantirishdagi keyingi katta muvaffaqiyatlardan biri Java tili bo’ldi. Dastlab Oak deb atalgan Java ustida ishlash 1991 yilda Sun Microsystems kompaniyasida boshlandi. Djeyms Gosling, Patrik Noton, Kris Vort, Ed Frank va Mayk Sheridan mazkur tilning asosiy ishlab chiquvchilari bo’lgan. Java SQQ tilidan olingan sintaksis va strategiya bilan strukturaviy ob’ektga yo’naltirilgan til hisoblanadi. Java innovatsiyalari axborot texnologiyalarining shiddat bilan rivojlanishi va Internet foydalanuvchilari sonining tez sur’atlarda o’sishi, shuningdek dasturlash texnologiyalarining takomillashtirilishini ta’minladi. Internet ning keng tarqalishigacha yozilgan ko’plab dasturlar aniq protsessorlar va muayyan operatsion tizimlar uchun kompilyatsiya qilindi. Garchi dastur tuzuvchilar muvaffaqiyatli dasturlarni yozishda deyarli har doim koddan takroriy foydalanish savolini bergan bo’lsalar-da, bu savol birinchi navbatdagisi emas edi. Biroq, Internet ning (ya’ni kompyuter tarmog’i orqali turli xildagi protsessorlar va operatsion tizimlarni birlashtirish imkoniyatlarining paydo bo’lishi) rivojlanishi bilan aynan dasturni bir platformadan boshqasiga oson o’tkazish muammosi birinchi rejaga chiqdi. Bu vazifalarni hal etish uchun yangi til zarur edi va u Java bo’ldi. Ta’kidlash kerakki, dastlab Java nisbatan oddiy rol o’ynadi. U til platformasiga bog’liq bo’lmagan, o’rnatilgan kontrollerlar uchun dasturiy ta’minotni yaratishda qo’llash mumkin bo’lgan vosita tarzida yaratildi. 1993 yilda kichik miqyosda (o’rnatilgan kontrollerlar uchun) o’tkazuvchanlik muammolarini hal qilish uchun foydalaniladigan texnologiyalar katta miqyosda (Internet uchun) foydalanilishi mumkinligi ravshan bo’ldi. Java ning eng asosiy imkoniyati – platformalararo o’tkazish kodini yaratish qobiliyati ushbu tilni tez tarqalishiga sabab bo’ldi. Java da o’tkazuvchanlik dasturning boshlang’ich kodlarini bayt-kod deb ataladigan oraliq tilga, keyinchalik Java (Java Virtual Machine, JVM) virtual mashinasi tomonidan bajariladigan translyatsiya qilish vositasi yordamida erishiladi. Shunday ekan, Java-dasturi JVM ga ega bo’lgan ixtiyoriy platformada ishga tushirilishi mumkin. JVM nisbatan oson tatbiq etilishi sababli, u ko’p sonli platformalar uchun mo’ljallangan. Bayt-koddan Java da foydalanish amalda har doim mashina kodlari tomonidan kompillyatsiya qilinadigan S va SQQ tillarida kodlarni qo’llashdan keskin farq qiladi. Mashina kodi muayyan protsessorlar va operatsion tizimlar bilan bog’liq, shunga ko’ra, SG’SQQ-dasturlarini boshqa platformalarda ishga tushirish uchun dasturning dastlabki kodini bu platformalarning (ya’ni dasturning bir nechta ijrochi versiyalari bo’lishi kerak) har birini mashina kodiga qayta kompillyatsiya qilish zarur. Bu ko’p mehnat talab qiladigan va qimmat jarayon ekanligi tushunarli. Java da esa elegant va samarali qaror – oraliq tillardan foydalanish taklif qilingan. Va bu qaror keyinchalik C#ga tatbiq etilgan. YUqorida ta’kidlanganidek, Java mualliflari yangi qarashlari bilan uni S va SQQ (Java sintaksisi S ga asoslanadi, ob’ekt modeli esa SQQ dan shakllantirilgan ) negizida yaratishdi. Garchi Javakod S yoki SQQ bilan o’zaro muvofiq bo’lmasada, uning sintaksisi mazkur tillar sintaksisidan kelib chiqqan. Shuning uchun S va SQQ dan foydalanuvchi dastur tuzuvchilarning katta qismi Java ga ortiqcha qiyinchiliklarsiz o’tishga muvaffaq bo’lishdi. SQQ ishlab chiqishda Straustrap kabi Java mualliflariga ham mutlaqo yangi tilni yaratish zaruriyati bo’lmadi. Ular asos sifatida oldin ma’lum bo’lgan tillardan foydalanishdi va diqqatlarini innovatsion elementlarga jamlay oldilar. Ta’kidlash joizki, Java yaratilganidan keyin S va SQQ tillari yangi kompyuter tillarini yaratish uchun umumqabul qilingan poydevor bo’lib qoldi. C# tilining yaratilish tarixi Garchi Java tili dasturlarni bir platformadan boshqasiga o’tkazishning ko’plab muammosini hal qilgan bo’lsa ham, zamonaviy Internet-muhitida samarali ishlashi uchun unga bir qator xossalar yetmayapti. Ulardan biri bir qancha kompyuter tillarini (ko’p tilli dasturlash) o’zaro aloqa imkoniyatlarini qo’llab-quvvatlash hisoblanadi. Ko’p tilli dasturlash deganda turli tillarda yozilgan kodning birgalikda ishlash qobiliyati tushuniladi. Bu imkoniyat katta dasturlarni yaratishda, shuningdek ko’plab kompyuter tillarida va turli xil operatsion muhitlarda foydalanish mumkin bo’lgan alohida komponentlarni dasturlashda juda muhimdir. Windows platformalarini to’g’ridan-to’g’ri qo’llab-quvvatlashning yo’qligi Java ning jiddiy kamchiligi hisoblanadi (Garchi, Java-dasturlari Windows muhitida installirlashgan JVM mavjudligida bajarishi mumkin bo’lsa ham). Ushbu muammoni hal etish uchun Microsoft kompaniyasi 1990 yillar oxirida bu kompaniyaning umumiy strategiyasi .NET ning tarkibiy qismi hisoblangan C#tilini ishlab chiqdi (tilning bosh me’mori Anders Xeylsberg). Alfa-versiya tili 2000 yil o’rtalaridan muomalaga chiqarila boshlandi. C#tili butun dunyoda keng qo’llanilayotgan va eng ommabop bo’lgan S, SQQ va Java dasturlash tillari bilan to’g’ridan-to’g’ri bog’liqdir. Hozirda amalda barcha professional dastur tuzuvchilar mazkur tilni biladi, shuning uchun ularga asoslangan C#ga o’tish ortiqcha qiyinchiliklarsiz ro’y beradi. Xeylsberg, CQQ va Java tillari muallifi sifatida, “g’ildirak kashf” qilmadi, balki kashf etilgan yo’ldan ketdi – asos sifatida oldin yaratilgan tillardan foydalangan holda e’tiborni yaxshilash va innovatsiyalarga qaratdi. C#ning genealogik tasnifi 1.1. rasmda ko’rsatilgan. C#tili SQQ da aniqlagan ob’ektli modelga qurilgan. Sintaksisi, ko’plab kalit so’zlar va operatorlarni C tilidan meros qilib olgan. Shu sababli dasturlashning ushbu tillarini bilganlar uchun C#ni o’rganishda hech qanday muammo kelib chiqmaydi. C#va Java o’rtasidagi aloqa nisbatan murakkab. Ikkala til ham o’tkazuvchi kodni yaratish uchun ishlab chiqilgan, C va SQQ larga asoslanadi, ularning sintaksisi va ob’ektli modelidan foydalanadi. Biroq, mazkur tillar o’rtasida to’g’ridan-to’g’ri aloqa yo’q, ular ko’proq umumiy ajdodlarga ega, lekin ko’plab belgilari bilan farq qiluvchi amakivachchalarga o’xshaydi. Agarda siz Java da ishlashni bilsangiz, bu C#ni o’zlashtirishingizni yengillashtiradi, va buning teskarisi, Java ni o’rganishda C#ning ko’plab konsepsiyalari bilimlari sizga foydasi tegadi. C#tili mazkur kitobda ko’rib chiqiladigan ko’plab innovatsion xossalarga ega. Birdaniga anglash mumkinki, uning bir nechta eng muhim yangiliklari dasturiy ta’minlash komponentlarini o’rnatilgan qo’llab-quvvatlashga taalluqlidir. YA’ni aslida C#komponentlarga yo’naltirilgan o’zida, masalan, dasturiy ta’minlash komponentlarining tarkibiy qismlarini bilvosita qo’llab-quvvatlovchi elementlarni (xossa, usul va hodisalar kabilar) qamrab oluvchi til sifatida yaratilgan. Lekin, ehtimol, C#ning eng muhim yangi xususiyati – bu uning ko’p tilli muhitda ishlash qobiliyatining mavjudligidir. S SQQ Java C# 1– rasm. C#ning genealogik tasnifi C#ning .NET Framework bilan aloqasi Garchi C#dasturlash tili sifatida alohida o’rganilishi mumkin bo’lsada, lekin uni o’zi ishlaydigan .NET Framework-muhiti bilan o’zaro aloqasini ko’rib chiqish afzalroqdir. Chunki, birinchidan, C#dastlab Microsoft kompaniyasi tomonidan .NET Framework kodini yaratish uchun ishlab chiqilgan, ikkinchidan, .NET Framework C#tili tomonidan foydalaniladigan kutubxonani aniqlab beradi. Modomiki ular bunday chambarchas bog’liq ekan, .NET Framework ning umumiy konsepsiyasini va uning C#uchun ahamiyatini tushunish muhimdir. .NET Framework o’zi nima? Sarlavhada berilgan savolga javob berish, aftidan, .NET Framework deb platforma mustaqil izohlarni rivojlantirish va bajarishni qo’llab-quvvatlovchi muhitni talqin qilsa bo’ladi. U dasturlashning turli tillari izohlarida birgalikda ishlash imkonini beradi, shuningdek Windows uchun umumiy dasturlash modellari va dasturlar o’tkazuvchanligini ta’minlaydi. Ta’kidlash kerakki, .NET Framework Windows platformasi tomonidan chegaralanmagan va ushbu platforma uchun yozilgan dasturlar kelajakda boshqa platformaga o’tkazilishi mumkin. C#tili .NET Framework ning ikki muhim tashkil etuvchilaridan foydalanadi. Birinchi – bu tilning ijro etish muhitiga bog’liq bo’lmagan (Common Language Runtime, CLR), sizning dasturlaringiz ijrosini boshqaruvchi va .NET Framework texnologiyasining bir qismi hisoblanuvchi tizim, qaysiki dasturlarga o’tuvchan bo’lish imkonini beradi, bir qancha tillardan foydalanish bilan dasturlashni qo’llab-quvvatlaydi va ma’lumotlarni uzatish xavfsizligini ta’minlaydi. Ikkinchi tashkil etuvchi - dasturlarga ijro muhitiga kirish imkonini beruvchi .NET sinflar kutubxonasidir, masalan, ma’lumotlarni kiritishG’chiqarish uchun foydalaniladi. Agar siz endigina boshlagan dastur tuzuvchi bo’lsangiz, unda sizga sinf tushunchasi notanish bo’lishi mumkin. Sal quyida biz sinflar to’g’risida batafsil to’xtalib o’tamiz, hozir shunchaki uqtirib o’tamizki, sinflar dasturlarni tashkillashtirishga yordam beruvchi ob’ektga yo’naltirilgan konstruksiya hisoblanadi. Hozircha sizning dasturingiz xususiyatlar, .NET sinflarining muayyan kutubxonasi bilan chegaralangan bo’lsa, u .NET ijro muhiti qo’llab-quvvatlanadigan barcha joyda ishlatilishi mumkin. Bajarilish muhiti tiliga bog’liq bo’lmagan qanday ishlaydi .NET kodi bajarilishi bilan tilga bog’liq bo’lmagan bajarilish muhiti (CLR) boshqaradi. U qanday ishlashini bayon qilamiz. C#dasturini kompilyatsiya qilganda, biz bajariladigan kodni emas, Microsoftning oraliq tili deb ataluvchi (Microsoft Intermediate Language, MSIL) maxsus psevdokoddan tashkil topgan faylni olamiz. MSIL tili konkret protsessorga bog’liq bo’lmagan tashiladigan ko’rsatmalar to’plamini aniqlaydi, ya’ni, mohiyati bo’yicha, MSIL tashiladigan assembler tilini aniqlaydi. Oraliq Microsoft tili mazmunan Java bayt-kodiga o’xshashligiga sizning diqqatingizni qaratmoqchimiz, ammo ularning orasida farq bor. CLR tizimi oraliq kodni bajariladigan kodga dastur ishga tushirilgan vaqtda translyatsiya qiladi. MSILda kompilyatsiya qilingan ixtiyoriy dastur CLR muhiti realizatsiya qilingan ixtiyoriy operatsion tizimda ishga tushirilishi mumkin. Bu .NET Frameworkda dasturlarning tashiluvchanligiga erishilishiga yordam beradigan mexanizmning bir qismidir. Oraliq Microsoft tili JIT kompilyatoridan foydalanilganda bajariladigan kodga aylanadi (ingl. just in time –kerakli vaziyatda) . Jarayon quyidagicha ishlaydi: .NET dasturi bajarilganda CLR tizimi JIT kompilyatorini faollashtiradi, qaysiki u MSIL ni mazkur protsessorning ichki kodiga aylantiradi, u ham bo’lsa dastur qismlarining kodlari ehtiyoj bo’lgandagina imkon darajasida aylantiriladi. Shunday qilib, sizning C# dasturingiz aslida ichki kod sifatida ijro etiladi, garchi u azaldan MSILda kompilyatsiya qilingan bo’lsada. Bu degani, sizning dasturingizni ishga tushish vaqti amalda xuddi uning birdaniga ichki kodga kompilyatsiya qilinganiday, ammo bunda sizda MSILning ustunligi - dasturning tashiluvchanligi paydo bo’ladi. Bundan tashqari, C#dasturini kompilyatsiya qilganda MSILga qo’shimcha siz yana bitta berilganlarni tasvirlaydigan, dasturingiz tomonidan ishlatiladigan va sizning kodingizga boshqa kod bilan o’zaro ta’sir qiladigan-metama’lumot komponentani olasiz. Metama’lumotlar MSIL joylashgan fayllarda saqlanadi. Aslida bu CLR muhiti, MSIL va metama’lumotlar to’g’risidagi bilimlar C#tilida dasturlash masalasining asosiy qismini realizatsiyasi uchun yetarli, qaysiki bu til ishni kerakli tarzda mustaqil ravishda tashkil qiladi. Tilning umumiy spesifikatsiyasi Boshqariladigan kodning barcha ustunliklari CLR tomonidan ta’minlanadi. Agar sizning kodingiz boshqa tillarda yozilgan dasturlar tomonidan foydalanilsa, maksimal mos kelishligi uchun tilning umumiy spesifikatsiyasiga asoslanish zarur(Common Language Specification, CLS). Bu har xil tillar uchun umumiy bo’lgan xususiyatlar to’plamini tasvirlaydi. Umumiy til spesifikatsiyasi kodining mosligi ayniqsa boshqa tillar tomonidan foydalaniladigan dastur ta’minoti komponentalarini hosil qilish uchun kerak bo’ladi. Agar siz kelajakda tijorat kodini yaratmoqchi bo’lsangiz, u holda CLS spesifikatsiyasiga asoslanishingizga to’g’ri keladi. Shuning uchun biz, garchi buning kitobimizga bevosita aloqasi bo’lmasada, bu bo’limda u haqida ma’lumotlar keltirdik. Mutaxassis javoblari Savol. Nima uchun bir nechta tillardan foydalangan holda tashish masalalari, xavfsizlik va dasturlash tomonlarini hal qilish uchun C#kompyuter tilini yaratish kerak bo’ldi? CQQ tilini .NET Framework ni qo’llash uchun soddalashtirish mumkin emasmidi? Javob. Ha, CQQ tilini shunday soddalashtirish mumkinki, natijada u CLR muhiti boshqaruvida ishga tushiriladigan .NET ga mos keladigan kodni hosil qilsin. Dastlab Microsoft kompaniyasi shunday ham qildi, mavjud kodlarni .NET Framework ga o’tkazish imkoniyatini beradigan, hamda boshqariladigan kengaytmalar deb ataladiganlarni CQQ ga qo’shib qo’ydi. Ammo yangi .NET ishlanmasi buni C#da ancha yengil bajarishga imkon beradi. Esingizdami, C# tili aynan .NET platformasi uchun yaratilgan va bu texnologiyaning rivojlanishini qo’llash uchun mo’ljallangan edi. Minutlik amaliyot 1. C#tilining qaysi tillar bilan bevosita aloqasi bor? 2. Tilga bog’liQ bo’lmagan bajarilish muhiti (CLR) nima? 3. JIT-kompilyator nima? Ob’ektga-yo’naltirilgan dasturlash S# tili ob’ektga-yo’naltirilgan dasturlash (OYD) prinsiplariga asoslanadi va barcha Qo’shimcha dasturlar (Soprogrammo’) Qaysidir darajada ob’ektga-yo’naltirilgan bo’lib hisoblanadi. Shuning uchun hattoki, eng oddiy Si – dasturini yozish uchun OYD prinsiplarini bilish lozim. OYD dasturchilar duch keladigan masalalarni yechishning zo’r texnologiyasi bo’lib hisoblanadi. Kompyuter kashf Qilinishi bilan dasturlash usullari sezilarli darajada o’zgardi. Kompyuter fanlarining rivojlanishi mobaynida ____________________________________________________________ 1. S# tili S va CQQ larning avlodi bo’lib hisoblanadi, shu bilan birga Java bilan ham yaQinligi bor. 2. .NET dasturi bajarilishi bilan tilga bog’liQ bo’lmagan bajarilish muhiti (CLR) boshQaradi 3. JIT-kompilyatori MSlL-kodni mazkur protsessorning ichki kodlariga almashtiradi, shuningdek, dastur Qismlarining kodlari ham ehtiyoga ko’ra almashtiriladi. mutaxassislarga asosan dasturlarni murakkabligini oshishi bilan bog’liQ masalalarni hal Qilishga to’g’ri keldi. Masalan, birinchi kompyuterlarda dasturlash ikkilamchi mashina instruksiyalarini o’zgartirish vositasida amalga oshirilgan, shuning uchun kompyuterning oldingi panelini boshQarish elementlari foydalanilgan. Ushbu usul dasturlar hajmi bir necha yuzlab instruksiyalar bilan chegaralangan holatgacha yaxshi ishladi. Foydalaniladigan kodlar hajmi o’sganda assembler tili kashf Qilindi va dastur tuzuvchilar mashina instruksiyalaridan ramziy ma’noda foydalanish Qatorida endi nisbatan murakkab va katta dasturlar bilan ishlash imkoniga ega bo’ldilar. Keyin dasturlar hajmi va murakkabligining o’sishiga mos ravishda dastur tuzuvchilar FORTRAN va COBOL kabi yuQori darajadagi tillarni ishlab chiQishdi. Oldingi tillar o’zlarining imkoniyatlari chegarasiga yetganda esa strukturaviy dasturlash yaratildi. E’tibor bering, dasturlash rivojlanishining har bir bosQichida dastur tuzuvchiga nisbatan murakkab vazifalarni hal Qilish imkonini beruvchi texnologiya va instrumentlar yaratilgan. Bu yo’ldagi har bir Qadamda yangi texnologiyalar oldingilarining eng yaxshi jihatlarini o’ziga olishgan. Vaziyat shu darajaga bordiki, ko’plab loyihalar strukturaviy dasturlash o’sha davr talablariga nomuvofiQ bo’lib Qolgan chegaraga yetib keldi va umuman yangi istiQbolli, Qaysiki ob’ektga-yo’naltirilgan dasturlash bo’lgan texnologiyalarga zarurat tug’ildi. OYD o’zida strukturaviy dasturlashning eng yaxshi g’oyalarini singdirib oldi va ularni oQibatda dasturlarni tashkillashtirishning yangi yo’llari paydo bo’lishiga olib kelgan bir nechta yangi konsepsiyalar bilan birlashtirdi. Masalaga chuQur yondoshmasdan shuni aytish mumkinki, dastur ikkita usuldan bittasi orQali tashkil topadi: o’zining kodi atrofida yoki o’zining ma’lumotlari atrofida. Strukturaviy dasturlash texnologiyalaridan foydalanishda odatda dasturlar kod atrofida tashkillashtiriladi. Bunday usulga “ma’lumotlarga ta’sir etuvchi kod” deb Qarash mumkin. OYD dasturlari boshQacha usullar bilan ishlaydi. Ular ma’lumotlar atrofida tashkillashtirilgan va ularning hal Qiluvchi prinsipini “boshQariladigan ma’lumotlar orQali kodga kirish” deb ifodalash mumkin. Ob’ektga-yo’naltirilgan tillarda siz ma’lumotlarni, shuningdek bu ma’lumotlarga ta’sir etishi mumkin bo’lgan protseduralarni (ya’ni aynan ma’lumotlar tipi ushbu ma’lumotlarga Qo’llanilishi mumkin bo’lgan operatsiyalar shaklini belgilab beradi) aniQlaysiz. OYD ning barcha tillaridagi, S# ham Qo’shib hisoblaganda, ob’ektga-yo’naltirilgan dasturlash prinsiplarini Qo’llab-Quvvatlash uchun uchta umumiy jihatlar mavjud - inkapsulyatsiya, ko’p shakllilik (polimorfizm) va vorislik. Keling, ularni alohida-alohida ko’rib chiQamiz. Inkapsulyatsiya Inkapsulyatsiya —bu kod va berilganlarni bir butun Qilib bog’laydigan, ularni manipulyatsiya Qiluvchi, shu bilan birga ularni tashQi kirishlardan va noto’g’ri Qo’llashdan muofaza Qiluvchi dasturlash mexanizmi bo’lib hisoblanadi. Ob’ektga-yo’naltirilgan tilda kod va barcha zarur ma’lumotlar shunday usul bilan bog’lanishi mumkinki, bunda ob’ekt ko’rinishidagi- avtonom struktura tashkil topadi. BoshQacha Qilib aytganda, inkapsulyatsiyani Qo’llab Quvvatlaydigan strukturaga ob’ekt deb ataladi. Ob’ekt chegarasida kod, ma’lumotlar yoki kod ham, ma’lumotlar ham boshQa ob’ektlar uchun yopiQ (private), yoki ochiQ bo’lishi mumkin (public). Kod va ma’lumotlarni yopilishi faQat shu ob’ektning boshQa Qismidan ma’lum va o’rinli bo’ladi (ya’ni yopiQ kodga va ma’lumotlarga shu ob’ekt tashQarisidan kirish mumkin emas). Qachonki kod va ma’lumotlar ochiQ bo’lsa (biror ob’ekt miQyosida public singari e’lon Qilingan), dasturning boshQa Qismlari ham ular bilan ishlash imkoniyatiga ega bo’ladi. Odatda public sifatida e’lon Qilingan ob’ekt Qismlari, nazorat Qilinadigan interfeysni ob’ektning yopiQ elementlari bilan ta’minlash uchun foydalaniladi. Sinf S# da inkapsulyatsiyada foydalaniladigan, ma’lumotlarni va mazkur ma’lumotlar bilan ishlovchi kodlarni ixtisoslashtiruvchi asosiy struktura bo’lib hisoblanadi. S# tili ob’ektlarning loyihasi uchun sinflarning namunalari hisoblangan tasniflangan sinflarni Qo’llaydi. Shunga ko’ra, sinf aslida ob’ektlar Qanday tashkil etilishi ko’rsatilgan instruksiyalar to’plami hisoblanadi. Kod va ma’lumotlar sinfini tashkil etuvchilar sinf a’zosi deb ataladi, muayyan sinf tomonidan aniQlangan ma’lumotlar esa o’zgaruvchan namunalar deb nomlanadi. Mazkur ma’lumotlar bilan ishlovchi kod fragmentlari sinf a’zosi usullari yoki shunchaki, usullar deb ataladi. S# da usul tushunchasi dasturostilar uchun Qabul Qilingan, Qaysiki SG’S-*-Q da dastur tuzuvchilar funksiya deb ataydi (modomiki S# CQQ ning to’g’ridan-to’g’ri merosxo’ri hisoblanar ekan, ba’zan funksiya tushunchasi ham ishlatiladi). Polimorfizm Polimorfizm (yunonchadan olingan bo’lib, “shakllar to’plami” degan ma’noni anglatadi) bir Qator umumiy xossalarga ega bo’lgan bir necha ob’ektlarga bitta interfeysga kirish va unda nazarda tutilgan usullarni amalga tatbiQ etish imkonini beradigan xususiyat hisoblanadi. Oddiy misol sifatida avtomobil rulini ko’rib chiQamiz. Rul (interfeys) rul mexanizmning Qanday xili Qo’llanilishidan Qat’i nazar o’zgarmasdan Qoladi. YA’ni, rulning ishlash prinsipi garchi avtomobilda Qo’lda boshQarish yoki kuchaytirgichli rul boshQaruvi o’rnatilgan bo’lsa ham har doim o’zgarishsiz Qoladi (masalan, rul g’ildiragining chapga burilishi avtomobilni ham chapga burilishiga olib keladi). Unifikatsiyalangan interfeysning afzalligi shundaki, agarda siz bir marta avtomobil boshQarishni o’rgansangiz, u holda har QanaQa tipdagi avtomobilni boshQara olasiz. Xuddi shu prinsipni dasturlashga ham tatbiQ etsa bo’ladi. Masalan, stek – LIFO (last in, first out) ro’yxat tipi. Siz turli xildagi uchta stek talab Qiladigan (bittasi son bilan ifodalanadigan Qiymatlar uchun, bittasi suzuvchi nuQtali Qiymatlar uchun, va bittasi belgilar uchun) dastur bilan ishlashingiz mumkin. Ushbu holatda har bir stekni tatbiQ etish uchun saQlanayotgan ma’lumotlar har xil bo’lsa ham bitta va o’sha algoritm ishlatiladi. Ob’ektga-yo’naltirilgan tildan tashQarida sizga uchta har bir to’plamga alohida nom bilan turli xil steklar protsedurasi to’plamini yaratish kerak bo’ladi. Shunday yo’l bilan, stekning bir tipidan foydalanish usullarni aniQlash orQali siz uni Qolgan tiplarga Qo’llashingiz mumkin bo’ladi. Polimorfizm konsepsiyasining umumlashmasini Quyidagi ta’riflash mumkin: “bir interfeys – usullar to’plami”. Bu o’xshash jarayonlar guruhlari uchun unifikatsiyalangan interfeys yaratish mumkinligini anglatadi. Polimorfizm dasturlar murakkabligini umumiy harakat sinflari spesifikayasi uchun yagona interfeysdan foydalanish orQali kamaytirish imkonini beradi. Har bir vaziyatga tatbiQan kompilyatorning o’zi sizni bu harakatlarni Qo’lda Qilish zaruratidan xalos Qilgan holda spesifik harakatlar (ya’ni usul)ni tanlaydi. Siz faQat mazkur interfeysda Qaysi usullar nazarda tutilganligini va ularni amalga tatbiQ etishni esdan chiQarmasligingiz kerak. Vorislik - ob’ektiv yo’naltirilgan programmalashni uchta fundamental prinsiplaridan biridir, chunki faqat shu bilan birga ierarxik klassifikatsiya tuzish mumkin. Vorislikdan foydalangan holda o’zaro bog’liq elementlarni harakteristikasini belgilovchi umumiy sinf xosil qilish mumkin. Bu sinf o’ziga xos yagona xususiyatga ega tor mutaxassislashtirilgan sinflar qoldirishi mumkin. S# tilida bu sinf baza sinfi deb ataladi. Baza sinfidan hosila sinfi kelib chiqadi. Binobarin, hosila sinfi – bu baza sinfining maxsus talqinidir. Hosila sinfiga baza sinfidagi mavjud metodlar va indeksatorlardan tashqari o’ziga xos yagona elementlar ham qo’shilishi mumkin. Vorislik asoslari. C# vorislikni qo’llab, bildirilgan sinfni boshqa sinfga o’rnatishga yo’l beradi. Bu baza sinfi masalalarini berilgan hosila sinfi orqali amalga oshirish mumkin. Buni misollar orqali ko’rish qulaydir. Umumlashtirilgan ikki o’lchamli geometrik figuralar (masalan, kvadrat, to’g’ri burchak, uchburchak va boshqalar) atributlarini belgilovchi TwoDShare sinfini ko’rib chiqamiz. G’G’ Klass dvumerno’x ob’ektov. class TwoDShape { public double width; public double height; public void showDim( ) { Console.WriteLine ("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } TwoDShare sinfi ikki o’lchamli ob’eklarning maxsus shakllarini tasvirlashda o’z navbatida boshqa sinflar uchun baza sifatida qo’llanishi mumkin. Masalan, TwoDShare sinfini navbatdagi programmasi Triangle sinfini boshqarish uchun qo’llaniladi. G’G’ Prostaya ierarxiya klassov. using System; G’G’ Klass dvumerno’x ob’ektov. class TwoDShape { public double width; public double height; public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass Triangle vo’voditsya iz klassa TwoDShape. class Triangle : TwoDShape { public string style; G’G’ Tip treugolnika. G’G’ Metod vozvrahaet plohad treugolnika, public double area() { return width * height G’2; } G’G’ Otobrajaem tip treugolnika. public void showStyle() { Console.WriteLine("Treugolnik " Q style); } } class Shapes { public static void Main() { Triangle t1 q new Triangle(); Triangle t2 q new Triangle(); t1.width q4.0; t1.height q 4.0; t1.style q "ravnobedrenno’y"; t2.width - 8.0; t2.height q12.0; t2.style q "pryamougolno’y"; Console.WriteLine("Informatsiya o t1: "); tl.showStyle() ; tl.showDim() ; Console.WriteLine("Plohad ravna " Q t1.area()); Console.WriteLine(); Console.WriteLine("Informatsiya o t2: "); t2. ShowStyle() ; t2. showDim() ; Console.WriteLine("Plohad ravna " Q t2.area()); } } Triangle sinfida TwoDShare sinfiga mansub bo’lgan ob’ektni maxsus shakli tashkil etiladi, masalan, uchburchak. Triangle sinfida TwoDShare sinfidagi elementlardan tashqari Style, area va showstyle elementlarini o’z ichiga oladi. O’zgaruvchan style uchburchak shaklini tasvirlashni saqlaydi, area() usul uning yuzasini aniqlaydi, showStyle() usuli esa berilgan uchburchak shaklini aks ettiradi. Quyida Triangle sinfini TwoDShape sinfidan hosila sifatida qo’llanishi sintaksisi keltirilgan: Class Triangle : TwoDShape Agar bir sinf boshqasini qoldirsa, u holda baza sinfini nomi hosila sinfini nomidan keyin ko’rsatiladi va sinflar nomi ikki nuqta bilan ajratilib ko’rsatiladi. C# da sinflarni sintaksis vorisligi eslab qolish va qo’llash uchun juda oddiydir. Triangle sinfi TwoDShape baza sinfini barcha a’zolarini kiritadi va width va height a’zolarini area () usuli ichida ishlatishi mumkin. Bundan tashqari, Main () usuli ichida t1 va t2 ob’ektlar Triangle sinfini qismi bo’lsa, width va height a’zolarida to’g’ridan-to’g’ri izohlanishi mumkin. Triangle sinfini TwoDShape sinfiga qo’shilishi quyidagi rasmda sxematik tarzda keltirilgan. Width TwoDShape Height ShowDim() Tringle Style Area ShowStyle() TwoDShape sinfi Triangle sinfi uchun baza sinfi bo’lib, bu butunlay mustaqil va avtonom sinfdir. Hosila sinfini yaratishda faqat bitta baza sinfini ko’rsatish mumkin. C# da (C dan farqli) bitta hosila sinfida bir nechta baza sinflari vorislikni ta’minlamaydi. Bu faktni C kodni C# ga o’tkazishda bilish kerak. Bir hosila sinfi boshqa hosila sinfiga baza bo’lganligidan bir ierarxiya vorislikni yaratish mumkin. Lekin bitta sinf o’ziga –o’zi baza sinfi bo’lishi mumkin emas. Vorislikning asosiy xususiyati shundaki,ko’p ob’ektlar uchun umumiy atributlarni aniqlovchi baza sinfini hoxlagan sondagi maxsus hosila sinflarini yaratish uchun qo’llash mumkin. Keyin har bir hosila sinfi uchun xususiy klassifikatsiya yaratish mumkin. Masalan, twoDShape sinfi baza sifatida hosila sinfini yaratishi mumkin. Vorislik va sinf a’zolariga kirish xuquqi Vorislik yopiq kirish xuquqiga bog’liq chegaralarni bekor qilmaydi. Shuning uchun xosila sinf baza sinfni yopiq deb e’lon qilingan a’zolariga kirish xuquqidan maxrum bo’ladi. Masalan, keyingi kodda ko’rsatishicha, agar width va height a’zolari TwoDShape sinfini private a’zosini hosil qilsa, u holda Triangle sinfi unga kirish xuquqiga ega emas. G’G’ Dostup k zakro’to’m chlenam ne nasleduetsya. G’G’ Etot primer ne skompiliruetsya. using System; G’G’ Klass dvumerno’x ob’ektov, class TwoDShape { double width; G’G’ Teper eto private-chlen. double height; G’G’ Teper eto private-chlen. public void showDim( ) { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass Triangle vo’voditsya iz klassa TwoDShape. class Triangle : TwoDShape { public string style; G’G’ Tip treugolnika. G’G’ Metod vozvrahaet znachenie plohadi treugolnika. public double area ( ) { return width * height G’ 2; G’G’ Oshibka, nelzya poluchit G’G’ pryamoy dostup k zakro’to’m G’G’ chlenam. G’G’ Otobrajaem tip treugolnika. public void showStyle( ) { Console.WriteLine ("Treugolnik " Q style); } } width va height – yopiq a’zolardir, ular faqat xususiy sinf a’zolari uchun kirish xuquqiga ega. Hosila sinfida esa bu xuquq tarqalmagan. Shunga qaramay S# da bu muammoni yechish imkoniyatlari mavjud. Bulardan biri – protected a’zolardir, ikkinchisi ochiq usul va turlardan foydalangan xolda yopiq ma’lumotlarga kirishdir: G’G’ Ispolzovanie svoystv dlya zapisi i chteniya zakro’to’x G’G’ chlenov klassa. using System; G’G’ Klass dvumerno’x ob’ektov. class TwoDShape { double pri_width; G’G’ Teper eto private-chlen. double pri_height; G’G’ Teper eto private-chlen. G’G’ Svoystva width i height. public double width { get { return pri_width; } set { pri_width q value; } } public double height { get { return pri_height; } set ( pri_height q value; } } public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass treugolnikov - proizvodno’y ot klassa TwoDShape. class Triangle : TwoDShape { public string style; G’G’ Tip .treugolnika. G’G’ Metod vozvrahaet znachenie plohadi treugolnika. public double area() { return width * height G’ 2; } G’G’ Otobrajaem tip treugolnika. public void showStyle() { Console.WriteLine("Treugolnik " Q style); } } class Shapes2 { public static void Main ( ) { Triangle t1 q new Triangle ( ); Triangle t2 q new Triangle ( ); t1.width q 4.0; t1.height q 4.0; t1.style q "ravnobedrenno’y"; t2.width q 8.0; t2.height q 12.0; t2.style q "pryamougolno’y"; Console.WriteLine("Informatsiya o t1: "); t1.showStyle ( ) ; t1.showDim ( ) ; Console.WriteLine("Plohad ravna " Q t1.area()); Console.WriteLine(); Console.WriteLine("Informatsiya o t2: "); t2.showStyle (); t2.showDim (); Console.WriteLine("Plohad ravna " Q t2.area()); } } Baza va xosila sinflari bu holda superklass va podklass deb ataladi. Bu terminlar Java dasturlash tilidan olingan bo’lib, superklass- bu S# da baza sinfi, podklass- bu C# da hosila sinfi. S da ham «baza sinf hosila sinf» terminlari qo’llaniladi. Ximoyalangan kirish xuquqidan foydalanish. Baza sinfini yopiq a’zolari hosila sinfi uchun kirish xuquqiga ega emas. Agar hosila sinfi baza sinfi a’zolariga kirish xuquqiga ega bo’lsa, u holda u ochiq bo’lishi kerak. Baza sinfini a’zolarini yopiq tutgan xolda, unga xosila sinfiga kirish xuquqini ximoyalangan a’zolar yordamida berish mumkin. Ximoyalangan a’zo o’z ierarxiyasida barcha sinflarga ochiq bo’ladi. Ximoyalangan a’zo protected kirish modifikatori yordamida tashkil etiladi. Protected a’zoda yopiq bo’ladi, lekin himoyalangan a’zo vorislik qoldirsa, bu rad etiladi. Bunday holda baza sinfini himoyalangan a’zosi hosila sinfini himoyalangan a’zosiga aylanadi, natijada hosila sinfi uchun kirish xuquqiga ega bo’ladi. Bunda protected kirish modifikatori yopiq a’zolarni hosil qilishi mumkin, shu bilan birga hosila sinfi uchun kirish imkoniyatini yaratadi. Sinfning himoyalangan a’zolarini qo’llanishini oddiy misolda ko’rib chiqamiz: G’G’ Demonstratsiya ispolzovaniya zahihenno’x chlenov klassa. using System; class V { protected int i, j; G’G’ Zakro’t vnutri klassa V, G’G’ no dostupen dlya klassa D. public void set(int a, int b) { i q a; j q b; } public void show() { Console.WriteLine(i Q " " Q j); } } class D : V { int k; G’G’ Zakro’to’y chlen. G’G’ Klass D poluchaet dostup k chlenam i i j klassa V. public void setk() { k q i * j; } public void showk() { Console.WriteLine(k); } } class ProtectedDemo { public static void Main ( ) { D ob q new D( ); ob.set(2, 3); G’G’ OK, tak kak D "vidit" V-chleno’ i i j. ob.show(); G’G’ OK, tak kak D "vidit" V-chleno’ i i j. ob.setk(); G’G’ OK, tak kak eto chast samogo klassa D. ob.showk( ); G’G’ OK, tak kak eto chast samogo klassa D. } } Konstruktorlar va vorislik. Sinflar ierarxiyasi o’z konstruktorlari mavjud bo’ladi. Shu bilan birga ob’ektni bazaviy qismini baza sinf konstruktori tashkil qiladi, xosila qismini – xosila sinfi konstruktori tashkil qiladi. Chunki baza sinfi hosila sinf elementlariga kirish xuquqiga ega emas. Shuning uchun ularning konstruksiyalari alohida bo’lishi kerak. Agar konstruktor faqat hosila sinfida aniqlansa, ob’ektni hosil bo’lish jarayoni juda sodda: hosila sinfi ob’ekti hosil bo’ladi xolos. Baza sinfiga bog’liq bo’lgan ob’ektni qismi esa konstruktori yordamida avtomatik hosil qilinadi. Masalan, konstruktorni aniqlashda Triangle sinfini qayta ishlangan talqinini ko’rib chiqamiz. G’G’ Dobavlenie konstruktora v klass Triangle. using System; G’G’ Klass dvumerno’x ob’ektov. class TwoDShape { double pri_width; G’G’ Zakro’to’y chlen. double pri_height; G’G’ Zakro’to’y chlen. G’G’ Svoystva width i height. public double width { get ( return pri_width; } set ( pri_width - value; } } public double height { get ( return pri_height; } set ( pri_height q value; } } public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass treugolnikov - proizvodno’y ot klassa TwoDShape. class Triangle : TwoDShape { string style; G’G’ Zakro’to’y chlen. G’G’ Konstruktor. public Triangle(string s, double w, double h) { width q w; G’G’ Initsializiruet chlen bazovogo klassa. height q h; G’G’ Initsializiruet chlen bazovogo klassa. style q s; G’G’ Initsializiruet chlen svoego klassa. } G’G’ Metod vozvrahaet znachenie plohadi treugolnika. public double area ( ) { return width * height G’ 2; } G’G’ Otobrajaem tip treugolnika. public void showStyle ( ) { Console.WriteLine ("Treugolnik " Q style); } } class Shapes3 { public static void Main ( ) { Triangle t1 q new Triangle ("ravnobedrenno’y", 4.0, 4.0); Triangle t2 q new Triangle("pryamougolno’y", 8.0, 12.0); Console. WriteLine ("Informatsiya o t1: "); t1.showStyle ( ); t1.showDim ( ) ; Console.WriteLine ("Plohad ravna " Q t1.area ( ) ); Console.WriteLine (); Console.WriteLine("Informatsiya o t2: "); t2.showStyle ( ); t2.showDim(); Console.WriteLine ("Plohad ravna " Q t2.area ( )); } } Agarda konstruktorlar baza va xosila sinflarida tengdan belgilangan bo’lsa, ob’ektni tashkil etish jarayoni birmuncha murakkabroq kechadi. Bu holda S# base kalit so’zidan foydalanish kerak bo’ladi. Baza sinfini konstruktori chaqirish Xosila sinfi o’zining baza sinfidagi konstruktorni xosila sinfdagi konstruktorni kengaytirilgan shaklidan va base so’zidan foydalangan xolda chaqirishi mumkin. G’G’ Dobavlenie konstruktorov v klass TwoDShape. using System; G’G’ Klass dvumerno’x ob’ektov. class TwoDShape { double pri_width; G’G’ Zakro’to’y chlen. double pri_height; G’G’ Zakro’to’y chlen. G’G’ Konstruktor klassa TwoDShape. public TwoDShape(double w, double h) { width q w; height q h; } G’G’ Svoystva width i height. public double width { get { return pri_width; } set { pri_width q value; } } public double height { get {return pri_height;} set {pri_height q value;} } public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass treugolnikov, proizvodno’y ot klassa TwoDShape. class Triangle : TwoDShape { string style; G’G’ Zakro’to’y chlen. G’G’ Vo’zo’vaem konstruktor bazovogo klassa. public Triangle(string s, double w, double h) : base(w, h) { style q s; } G’G’ Metod vozvrahaet plohad treugolnika. public double area () { return width * height G’ 2; } G’G’ Otobrajaem tip treugolnika. public void showStyle() { Console.WriteLine("Treugolnik " Q style); } } class Shapes4 { public static void Main( ) Triangle t1 q new Triangle ("ravnobedrenno’y", 4.0, 4.0); Triangle t2 q new Triangle ("pryamougolno’y", 8.0, 12.0); Console.WriteLine("Informatsiya o t1: "); t1.showStyle ( ) ; t1.showDim(); Console.WriteLine ("Plohad ravna " Q t1.area ( )); Console.WriteLine ( ); Console.WriteLine ("Informatsiya o t2: "); t2.showStyle ( ); t2.showDim ( ); Console.WriteLine("Plohad ravna " Q t2.area()); } } Bu yerda Triangle konstruktori w va h parametrli base uslubini chaqiradi, xaqiqatda esa bu wight va height xususiyatli TwoDShape konstruktoridir. Ushbu xususiyatlarni Triangle konstruktori TwoDShape konstruktoridan olib o’zi fakat style xususiyatini shakllashtiradi xolos. G’G’ Dobavlyaem v klass TwoDShape konstruktoro’. using System; class TwoDShape { double pri_width; G’G’ Zakro’to’y chlen. double pri_height; G’G’ Zakro’to’y chlen. G’G’ Konstruktor po umolchaniyu. public TwoDShape() { width q height q 0.0; } G’G’ Konstruktor klassa TwoDShape s parametrami. public TwoDShape(double w, double h) { width q w; height q h; } G’G’ Sozdaem ob’ekt, u kotorogo shirina ravna vo’sote. public TwoDShape(double x) { width q height q x; } G’G’ Svoystva width i height. public double width { get { return pri_width; } set { pri width q value; } } public double height { get { return pri_height; } set { pri height q value; } } public void showDim ( ) { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass treugolnikov, proizvodno’y ot TwoDShape. class Triangle : TwoDShape { string style; G’G’ Zakro’to’y chlen. G’* Konstruktor po umolchaniyu. On avtomaticheski vo’zo’vaet konstruktor po umolchaniyu klassa TwoDShape. *G’ public Triangle() { style q "null"; } G’G’ Konstruktor, kotoro’y prinimaet tri argumenta. public Triangle(string s, double w, double h) : base(w, h) { style q s; } G’G’ Sozdaem ravnobedrenno’y treugolnik. public Triangle(double x) : base(x) { style q "ravnobedrenno’y"; } G’G’ Metod vozvrahaet plohad treugolnika. public double area() { return width * height G’2; } G’G’ Otobrajaem tip treugolnika. public void showStyle () { Console.WriteLine("Treugolnik " Q style); } } class Shapes5 public static void Main() { Triangle t1 q new Triangle(); Triangle t2 q new Triangle("pryamougolno’y", 8.0, 12.0); Triangle t3 q new Triangle(4.0); t1 q t2; Console.WriteLine("Informatsiya o t1: "); t1.showStyle(); t1.showDim(); Console.WriteLine("Plohad ravna " Q tl.area()); Console.WriteLine(); Console.WriteLine("Informatsiya o t2: "); t2.showStyle(); t2.showDim(); Console.WriteLine("Plohad ravna " Q t2.area()); Console.WriteLine(); Console.WriteLine("Informatsiya o t3: "); t3.showStyle () ; t3.showDim () ; Console.WriteLine ("Plohad ravna " Q t3.area ( )); Console.WriteLine ( ); } } Ushbu usuldagi dasturni bajarilishi natijasida quyidagi natijaga erishamiz: Informatsiya o t1: Treugolnik pryamougolno’y Shirina i vo’sota ravno’ 8 i 12 Plohad ravna 4 8 Informatsiya o t2: Treugolnik pryamougolno’y Shirina i vo’sota ravno’ 8 i 12 Plohad ravna 48 Informatsiya o t3: Treugolnik ravnobedrenno’y Shirina i vo’sota ravno’ 4 i 4 Plohad ravna 8 Base-mexanizm konsepsiyasini ko’rib chiqamiz. Base- usul hosila sinfi to’g’ridan-to’g’ri baza sinfi konstruktorini chaqiradi. Bu holda, base kalit so’zi doimo chaqiriluvchi sinflar ierarxiyasida turgan baza sinfiga ishlatiladi. Bu yuqori darajali ierarxiya uchun asoslidir. Baza sinfi konstruktori argumentlarini berish uchun base-usul argumentlari sifatida ko’rsatish yetarlidir. Vorislik va ismlarni yashirish Agar xosila sinf a’zosi ismi baza sinfdagi a’zo ismi bilan bir xil bo’lsa, unda baza sinf a’zosi xosila sinfida yashirin a’zoga aylanadi. Agar buni ataylab quyilgan bo’lsa, unda xosila bazadagi a’zo oldiga new so’zi qo’yiladi. G’G’ Primer sokro’tiya imeni v svyazi s nasledovaniem. using System; class A { public int i q 0; } G’G’ Sozdaem proizvodno’y klass. class V : A { new int i; G’G’ Etot chlen i skro’vaet chlen i klassa A. public V(int b) { i q b; G’G’ Chlen i v klasse V. } } public void show() { Console.WriteLine( "Chlen i v proizvodnom klasse: " Q i); } } class NameHiding { public static void Main() { V ob q new V(2); ob.show(); } } YAshirin ismlarga base so’zi yordamida kirish base so’zini this ma’noda ham foydalansa bo’ladi. Bu xolda base co’zi quyidagi ma’noda keladi: base. a’zo Bu shakl asosan yashirin ismlar foydalangan sinflarda foydalanadi: G’G’ Ispolzovanie sso’lki base dlya dostupa k skro’tomu imeni. using System; class A { public int i q 0; } G’G’ Sozdaem proizvodno’y klass. class V : A { new int i; II Eta peremennaya i skro’vaet i klassa A. public B(int a, int b) { base.i q a; G’G’ Tak mojno obratitsya k i klassa A. i q b; G’G’ Peremennaya i v klasse V. } public void show ( ) { G’G’ Eta instruksiya otobrajaet peremennuyu i v klasse A. Console.WriteLine ("i v bazovom klasse: " Q base.i); G’G’ Eta instruksiya otobrajaet peremennuyu i v klasse V. Console.WriteLine ("i v proizvodnom klasse: " Q i) ; } } class UncoverName { public static void Main ( ) { V ob q new V(1, 2) ; ob.show ( ); } } Ushbu dasturni natijasi quyidagicha ko’rinishda bo’ladi: i v bazovom klasse: 1 i v proizvodnom klasse: 2 base izoxi yordamida yana yashirin usulni chaqirish mumkin. Misol ko’ramiz: G’G’ Vo’zov skro’togo metoda. using System; . class A ( public int i q 0; G’G’ Metod show ( ) v klasse A. public void show ( ) { Console.WriteLine ("i v bazovom klasse: " Q i); } } G’G’ Sozdaem proizvodno’y klass. class V : A { new int i; G’G’ Eta peremennaya i skro’vaet G’G’ odnoimennuyu peremennuyu klassa A. public V(int a, int b) { base.i q a; G’G’ Tak mojno obratitsya k G’G’ peremennoy i klassa A. i q b; G’G’ Peremennaya i v klasse V. } G’G’ Etot metod skro’vaet metod show(), opredelenno’y v G’G’ klasse A. Obratite vnimanie na ispolzovanie G’G’ klyuchevogo slova new. new public void show() { base.show(); G’G’ Vo’zov metoda show() klassa A. G’G’ Otobrajaem znachenie peremennoy i klassa V. Console.WriteLine("i v proizvodnom klasse: " Q i); } } class UncoverName { public static void Main() { V ob q new V (1, 2); ob.show(); } } Dastur natijasi quyidagidan iborat: i v bazovom klasse: 1 i v proizvodnom klasse: 2 YUqori darajali ierarxiyani tuzish. Xosila sinf boshqa bir xosila sinfga baza sinfga aylansa bu yuqori darajali ierarxiyaga bo’ladi. Bu xolatda oxirgi xosila sinf o’zidan oldingi barcha sinflarni xususiyatini o’z ichiga oladi. Quyidagi keltirilgan ierarxiyada xosila sinfi bo’lmish Triangle sinfi ColorTriangle sinfiga baza sinf rolini o’ynaydi: G’G’ Mnogourovnevaya ierarxiya. using System; class TwoDShape ( double pri_width; G’G’ Zakro’to’y chlen. double pri_height; G’G’ Zakro’to’y chlen. G’G’ Konstruktor po umolchaniyu. public TwoDShape() ( width q height q 0.0; } G’G’ Konstruktor klassa TwoDShape. public TwoDShape(double w, double h) { width q w; height q h; G’G’ Konstruktor, sozdayuhiy ob’ekto’, u kotoro’x G’G’ shirina ravna vo’sote. public TwoDShape(double x) { width - height q x; } G’G’ Svoystva width i height. public double width { get { return pri_width; } set { pri_width q value; } } public double height { get {return pri_height; } set { pri_height q value; } } public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass treugolnikov, proizvodno’y ot klassa TwoDShape. class Triangle : TwoDShape { string style; G’G’ Zakro’to’y chlen. G’* Konstruktor po umolchaniyu. On vo’zo’vaet konstruktor po umolchaniyu klassa TwoDShape. *G’ public Triangle () { style q "null"; } G’G’ Konstruktor s parametrami. public Triangle(string s, double w, double h) : base(w, h) { style q s; } G’G’ Sozdaem ravnobedrenno’y treugolnik. public Triangle(double x) : base(x) { style q "ravnobedrenno’y"; } G’G’ Metod vozvrahaet znachenie plohadi treugolnika, public double area() { return width * height G’ 2; } G’G’ Metod otobrajaet tip treugolnika. public void showStyle() { Console.WriteLine("Treugolnik " Q style); } } G’G’ Prodoljaem ierarxiyu klassov treugolnikov. class ColorTriangle : Triangle { string color; public ColorTriangle( string c, string s, double w, double h) : base(s, w, h) { color q c; } G’G’ Metod otobrajaet svet treugolnika. public void showColor() { Console.WriteLine("Svet " Q color); } } } class Shapes6 { public static void Main () { ColorTriangle t1 q new ColorTriangle("siniy", "pryamougolno’y", 8.0, 12.0); ColorTriangle t2 q new ColorTriangle("krasno’y", "ravnobedrenno’y", 2.0, 2.0) ; Console.WriteLine("Informatsiya o t1: "); t1.ShowStyle () ; t1.showDim () ; tl.showColor() ; Console.WriteLine ("Plohad ravna " Q t1.area()); Console.WriteLine(); Console.WriteLine("Informatsiya o t2: "); t2.showStyle() ; t2.showDim(); t2.showColor(); Console.WriteLine("Plohad ravna " Q t2.area()); } } Dastur bajarilgandan so’ng quyidagi natijaga erishamiz. Informatsiya o t1: Treugolnik pryamougolno’y Shirina i vo’sota ravno’ 8 i 12 Svet siniy Plohad ravna 4 8 Informatsiya o t2: Treugolnik ravnobedrenno’y Shirina i vo’sota ravno’ 2 i 2 Svet krasno’y Plohad ravna 2 Bunda ColorTriangle sinfi Triangle va TwoDShape xususiyatlaridan tuliq foydalangan xolda o’zining color maydonini qo’shadi. Konstruktorni chaqirish ketma-ketligi Konstruktorlar bajarilishi ketma - ketligi avval baza konstruktorlaridan boshlanib keyin xosila konstruktorlarga o’tiladi. G’G’ Demonstratsiya poryadka vo’polneniya konstruktorov. using System; G’G’ Sozdaem bazovo’y klass. class A { public A() { Console.WriteLine("Sozdanie klassa A."); } } G’G’ Sozdaem klass, proizvodno’y ot A. class V : A { public VO { Console.WriteLine("Sozdanie klassa V."); } } G’G’ Sozdaem klass, proizvodno’y ot V. class S : V { public C( ) { Console.WriteLine ("Sozdanie klassa S."); } } class OrderOfConstruction { public static void Main ( ) { S s q new C ( ); } } Ushbu bajarilishlarning ketma-ketligi quyidagi vaziyat bilan tushuntiriladi. Baza sinfi konstruktori xosila sinfi konstruktoriga bog’liq bo’lmagan xolda o’z vazifasini bajaraveradi, ammo xosila sinfi konstruktori baza sinfi konstruktoriga murojat etish extimolligi bor. Baza sinfiga izoxlar va xosila sinfi ob’ektlari. S# qat’iy turlangan til bo’lib, bir sinf tiplari ikkinchi sinf ob’ektlariga izox bera olmaydi: G’G’ Eta programma ne skompiliruetsya. class X { int a; public X(int i) {a q i;) } class Y { int a ; public Y(int i) { a q i;} } class IncompatibleRef { public static void Main ( ) { X x q new X(10); X x2; Y u q new Y(5); x2 q x; G’G’ OK, obe peremenno’ye imeyut odinakovo’y tip. x2 q u; G’G’ Oshibka, zdes peremenno’ye raznogo tipa. } } Ammo S# tilida baza sinf ob’ekti shu bazadan kelib chiqqan xosila sinfi ob’ektlariga izox bera oladi. G’G’ Sso’lka na bazovo’y klass mojet ukazo’vat na G’G’ ob’ekt proizvodnogo klassa. using System; class X { public int a; public X(int i) { a q i; } } class Y : X { public int b; public Y(int i, int j) : base(j) { b q i; } } class BaseRef { public static void Main() { X x q new X(10) ; X x2; Y u q new Y(5, 6) ; x2 q x; G’G’ OK, obe peremenno’ye imeyut odinakovo’y tip. Console.WriteLine("x2.a: " Q x2.a); x2 q u; G’G’ Vse ravno ok, poskolku klass Y G’G’ vo’veden iz klassa X. Console.WriteLine("x2.a: " Q x2.a); G’G’ X-sso’lki "znayut" tolko o chlenax klassa X. x2.a q 19; G’G’ OK G’G’ x2.bq27; G’G’ Oshibka, v klasse X net chlena b. } } Shu bilan birga bu yerda asosiy rolni izox berilayotgan o’zgaruvchan o’ynaydi va u qaysi ob’ektdagi a’zolarga izox berish imkoniyati mavjudligini aniqlaydi. G’G’ Peredacha sso’lki na proizvodno’y klass G’G’ sso’lke na bazovo’y klass. using System; class TwoDShape { double pri_width; G’G’ Zakro’to’y chlen. double pri height; G’G’ Zakro’to’y chlen. G’G’ Konstruktor po umolchaniyu. public TwoDShape ( ) { width q height q 0.0; } G’G’ Konstruktor klassa TwoDShape. public TwoDShape (double w, double h) { width q w; height q h; } G’G’ Sozdaem ob’ekt, v kotorom shirina ravna vo’sote. public TwoDShape (double x) { width q height - x; } G’G’ Sozdaem ob’ekt iz ob’ekta. public TwoDShape (TwoDShape ob) { width q ob.width; height q ob.height; } G’G’ Svoystva width i height. public double width get { return pri_width; } set { pri_width q value; } } public double height { get { return pri_height; } set { pri_height q value; } } public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); } } G’G’ Klass treugolnikov, proizvodno’y ot klassa TwoDShape. class Triangle : TwoDShape { string style; G’G’ Zakro’to’y chlen. G’G’ Konstruktor po umolchaniyu. public Triangle() { style q "null"; } G’G’ Konstruktor klassa Triangle. public Triangle (string s, double w, double h) : base(w, h) { style q s; } G’G’ Sozdaem ravnobedrenno’y treugolnik. public Triangle(double x) : base(x) { style q "ravnobedrenno’y"; } G’G’ Sozdaem ob’ekt iz ob’ekta. public Triangle(Triangle ob) : base(ob) { style q ob.style; } G’G’ Metod vozvrahaet plohad treugolnika, public double area () { return width * height G’ 2; G’G’ Metod otobrajaet tip treugolnika. public void showStyle () { Console.WriteLine("Treugolnik " Q style); } } class Shapes7 { public static void Main() { Triangle t1 q new Triangle("pryamougolno’y", 8.0, 12.0); G’G’ Sozdaem kopiyu ob’ekta t1. Triangle t2 q new Triangle (t1); Console.WriteLine("Informatsiya o t1: ") ; t1.showStyle() ; t1.showDim(); Console.WriteLine ("Plohad ravna " Q t1.area ()); Console.WriteLine() ; Console.WriteLine("Informatsiya o t2: "); t2.showStyle() ; t2.showDim () ; Console.WriteLine("Plohad ravna " Q t2.area()); } } Virtual usullar va ularning qayta aniqlanishi Virtual usul deb baza sinfida virtual so’zi bilan e’lon kilingan va shu bilan birga bitta yoki bir nechta xosila sinflarda qaytadan anaqlangan usulga aytiladi. Agarda usulni baza sinfda virtual deb e’lon qilish uchun virtual so’zidan foydalansa, uni xosila sinfda qayta aniqlash uchun override so’zidan foydalanadi. Usullarning dinamik nozimlash – bu qayta aniqlangan usulni dastur bajarilish vaqtida chaqirilishi. G’G’ Demonstratsiya virtualnogo metoda. using System; class Base { G’G’ Sozdaem virtualno’y metod v bazovom klasse. public virtual void who ( ) { Console.WriteLine ("Metod who ( ) v klasse Base."); } } class Derivedl : Base { G’G’ Pereopredelyaem metod who ( ) v proizvodnom klasse. public override void who ( ) { Console.WriteLine("Metod who ( ) v klasse Derivedl"); } } class Derived2 : Base { G’G’ Snova pereopredelyaem metod who ( ) G’G’ v drugom proizvodnom klasse. public override void who ( ) { Console.WriteLine("Metod who ( ) v klasse Derived2"); } } class OverrideDemo { public static void Main ( ) { Base baseOb q new Base (); Derivedl dOb1 - new Derived1 ( ); Derived2 dOb2 q new Derived2 ( ); Base baseRef; G’G’ Sso’lka na bazovo’y klass. baseRef q baseOb; baseRef.who ( ); baseRef q dObl; baseRef.who ( ) ; baseRef q dOb2; baseRef.who ( ); } } Dastur bajarilgandan so’ng quyidagi natijaga erishamiz. Metod who ( ) v klasse Base. Metod who ( ) v klasse Derived1 Metod who ( ) v klasse Derived2 Virtual usulni qaytadan aniqlash shart emas. Agar xosila sinf virtual usulda o’z talqinini bermasa, baza sinfda aniqlangan talqindan foydalanadi. G’* yesli virtualno’y metod ne pereopredelen v proizvodnom klasse, ispolzuetsya metod bazovogo klassa. *G’ using System; class Base { G’G’ Sozdaem virtualno’y metod v bazovom klasse. public virtual void who(){ Console.WriteLine("Metod who() v klasse Base"); } } class Derivedl : Base { G’G’ Pereopredelyaem metod who () v proizvodnom klasse. public override void who () { Console.WriteLine("Metod who() v klasse Derived1"); } } class Derived2 : Base { G’G’ Etot klass ne pereopredelyaet metod who ( ). } class NoOverrideDemo { public static void Main ( ) { Base baseOb q new Base ( ); Derived1 dObl q new Derived1( ); Derived2 dOb2 q new Derived2 ( ); Base baseRef; G’G’ Sso’lka na bazovo’y klass. baseRef q baseOb; baseRef.who ( ) ; baseRef q dObl; baseRef.who ( ) ; baseRef q dOb2; baseRef.who ( ); G’G’ Vo’zo’vaet metod who ( ) klassa Base. } } Dastur bajarilgandan so’ng quyidagi natijaga erishamiz. Metod who ( ) v klasse Base Metod who ( ) v klasse Derived1 Metod who ( ) v klasse Base Agar yuqori darajali ierarxiyada xosila sinfi virtual usulda qaytadan aniqlanmasa, unda ierarxiyada eng pastda joylashgan virtual usuldan foydalanadi. G’* yesli proizvodno’y klass ne pereopredelyaet virtualno’y metod v sluchae mnogourovnevoy ierarxii, budet vo’polnen pervo’y pereopredelenno’y metod, kotoro’y obnarujitsya pri prosmotre ierarxicheskoy lestnitso’ v napravlenii snizu vverx. *G’ using System; class Base { G’G’ Sozdaem virtualno’y metod v bazovom klasse. public virtual void who ( ) { Console.WriteLine("Metod who ( ) v klasse Base"); } } class Derivedl : Base { G’G’ Pereopredelyaem metod who () v proizvodnom klasse, public override void who() { Console.WriteLine("Metod who() v klasse Derived1"); } class Derived2 : Derived1 { G’G’ Etot klass ne pereopredelyaet metod who(). } class Derived3 : Derived2 { G’G’ Etot klass takje ne pereopredelyaet metod who(). } class NoOverrideDemo2 { public static void Main() { Derived3 dOb q new Derived3(); Base baseRef; G’G’ Sso’lka na bazovo’y klass. baseRef q dOb; baseRef.who ( ); G’G’ Vo’zo’vaet metod who ( ) G’G’ iz klassa Derived1. } } Dastur bajarilgandan so’ng quyidagi natijaga erishamiz. Metod who ( ) v klasse Derived1 Bu yerda Derived1 sinfini qoldirgan Derived2 sinfi Derived3 sinfini qoldiradi, Derived1 esa o’z navbatida Base sinfini qoldiradi. Bu programmani natijalari who() usuli Derived3 sinfida ham, Derived2 sinfida ham qayta aniqlanmagan, lekin Derived1 sinfida qayta aniqlangan. Virtual usullarning qo’llanishi. Virtual usullar kuchini yanada yaxshiroq sezish uchun uni TwoDShape sinfiga qo’llaymiz. Oldingi misollarda area () usulida aniqlanishi keltirilgan. Figiralar yuzasini hisoblashda TwoDShape sinfida area() virtual usulidan foydalanish qulayroq ekanligi to’g’risida fikr tug’iladi. Buni keyingi keltirilgan programmada ko’rish mumkin. qulaylik uchun TwoDShape sinfiga name xususiyati kiritilgan. G’G’ Ispolzovanie virtualno’x metodov i polimorfizma. using System; class TwoDShape { double pri_width; G’G’ Zakro’to’y chlen. double pri_height; G’G’ Zakro’to’y chlen. string pri_name; G’G’ Zakro’to’y chlen. G’G’ Konstruktor po umolchaniyu. public TwoDShape() { width q height q 0.0; name q "null"; } G’G’ Konstruktor s parametrami. public TwoDShape(double w, double h, string n) { width q w; height q h; name q n; } G’G’ Sozdaem ob’ekt, u kotorogo shirina ravna vo’sote. public TwoDShape(double x, string n) { width q height q x; name q n; } G’G’ Sozdaem ob’ekt iz ob’ekta. public TwoDShape(TwoDShape ob) { width q ob.width; height q ob.height; name q ob.name; } G’G’ Svoystva width, height i name. public double width { get { return pri_width; } set { pri_width q value; } } public double height { get ( return pri_height; } set { pri_height - value; } } public string name { get { return pri_name; } set { pri_name q value; ) } public void showDim() { Console.WriteLine("Shirina i vo’sota ravno’ " Q width Q " i " Q height); public virtual double area() { Console.WriteLine( "Metod area() neobxodimo pereopredelit."); return 0.0; } } G’G’ Klass treugolnikov, proizvodno’y ot klassa TwoDShape. class Triangle : TwoDShape { string style; G’G’ Zakro’to’y chlen. G’G’ Konstruktor po umolchaniyu. public Triangle() { style - "null"; } G’G’ Konstruktor s parametrami. public Triangle(string s, double w, double h) : base(w, h, "treugolnik") { style q s; } G’G’ Sozdaem ravnobedrenno’y treugolnik. public Triangle(double x) : base(x, "treugolnik") { style q "ravnobedrenno’y"; } G’G’ Sozdaem ob’ekt iz ob’ekta. public Triangle(Triangle ob) : base(ob) { style q ob.style; } G’G’ Pereopredelyaem metod area() dlya klassa Triangle, public override double area() { return width * height G’ 2; } G’G’ Metod otobrajaet tip treugolnika. public void showStyle() { Console.WriteLine("Treugolnik " Q style); } } G’G’ Klass pryamougolnikov, proizvodno’y ot klassa TwoDShape. class Rectangle : TwoDShape { G’G’ Konstruktor s parametrami. public Rectangle(double w, double h) : base(w, h, "pryamougolnik"){ } G’G’ Sozdaem kvadrat. public Rectangle(double x) : base(x, "pryamougolnik") { } G’G’ Sozdaem ob’ekt iz ob’ekta. public Rectangle(Rectangle ob) : base(ob) { } G’G’ Metod vozvrahaet true, yesli pryamougolnik - kvadrat. public bool isSquare() { if(width qq height) return true; return false; } G’G’ Pereopredelyaem metod area() dlya klassa Rectangle. public override double area() { return width * height; } class DynShapes { public static void Main() { TwoDShape[] shapes q new TwoDShape[5]; shapes[0] - new Triangle("pryamougolno’y", 8.0, 12.0); shapes[1] q new Rectangle(10); shapes[2] q new Rectangle(10, 4); shapes[3] q new Triangle(7.0); shapes[4] q new TwoDShape(10, 20, "zagotovka dlya figuro’"); for(int iq0; i < shapes.Length; iQQ) { Console.WriteLine("Ob’ektom yavlyaetsya " Q shapes[i].name); Console.WriteLine("Plohad ravna " Q shapes [i].area () ) ; Console.WriteLine(); } } } Ushbu dasur bajarilgandan so’ng quyidagi natijani olamiz: Ob’ektom yavlyaetsya treugolnik Plohad ravna 48 Ob’ektom yavlyaetsya pryamougolnik Plohad ravna 100 Ob’ektom yavlyaetsya pryamougolnik Plohad ravna 40 Ob’ektom yavlyaetsya treugolnik Plohad ravna 24.5 Ob’ektom yavlyaetsya zagotovka dlya figuro’ Metod area() neobxodimo pereopredelit. Plohad ravna 0 Dasturni batafsil ko’rib chiqamiz. Birinchidan, area() usul virtual kalit so’zi qo’llanilgan TwoDShape sinfida bildirilgan va Triangle va Rectangle sinflarida qayta aniqlangan. Har bir qayta aniqlangan area() usul ob’ekt shakliga mos keluvchi yuzani hisoblaydi. Bu holda, agar ellipslar berilgan bo’lsa, area() usuli bu sinfda ellips yuzasini hisoblaydi. Merosxo’rlik Merosxo’rlik – bu bir ob’ekt uning yordamida boshQasining xususiyatlarini o’ziga olishi mumkin bo’lgan xossadir. Shuning uchun yuQoridan Quyiga yo’nalgan ierarxik tasniflash konsepsiyasi Qo’llab-Quvvatlanadi. Masalan, aytish mumkinki, Mazali Qizil olma sinfi o’z navbatida mahsulotlar sinfiga taalluQli mevalar sinfining bir Qismi bo’lgan olma sinfining Qismlaridan biri hisoblanadi. YA’ni mahsulotlar sinfi uning sinfostisi hisoblangan mevalarga ham Qo’llab bo’ladigan muayyan sifatlarga ega (esa bo’ladigan, to’yimli va shunga o’xshashlar). Mevalar sinfining ushbu sifatlariga Qo’shimcha ravishda uni boshQa mahsulotlardan farQlab turuvchi o’ziga xos (sersuvligi, shirinligi va hokazo) xususiyatlari mavjud. Olmalar sinfini faQatgina olmalarga tegishli sifatlar (daraxtda o’sishi, tropik mevalar emasligi va hokazo) belgilab beradi. Mazali Qizil olma sinfi o’z navbatida oldingi sinflarning barcha sifatlarini meros Qilib oladi va faQatgina ularni noyob Qiladigan sifatlarni belgilab beradi. Meros olishni amalga oshirmasdan har bir ob’ekt o’zining barcha xususiyatlarini aniQ belgilashi kerak; meros olayotganda ob’ekt o’zining sinfi chegarasida uni noyob Qiladigan sifatlarni aniQlab olishi lozim. U o’zining ota-onalar sinfidan umumiy atributlarni meros Qilib olishi mumkin. Shunga ko’ra, aynan merosxo’rlik mexanizmi bir ob’ektga o’z sinfining spesifik namunasi bo’lish imkonini beradi. DaQiQali amaliyot 1. OYD tamoyillarini ayting. 2. Nima inkapsulyatsiyaning asosiy elementi hisoblanadi? Savol. Sizningcha, OYD katta dasturlarni boshQarishning samarador usuli hisoblanadi, lekin u nisbatan katta bo’lmagan dasturlarni ortiQcha murakkablashtirishi mumkin, degan fikr ham mavjud. Modomiki siz, barcha S# dasturlar Qaysidir darajada ob’ektga-yo’naltirilgan bo’ladi, deb ta’kidlayapsiz, bu holda katta bo’lmagan S# dasturlarni yozishda noQulaylik kelib chiQmaydimi? Javob. Yo’Q, keyinchalik siz guvohi bo’lasiz, S# da OYD dan foydalanilganda katta bo’lmagan hajmdagi kodlar uchun amalda dasturlarning murakkabligiga ta’sir Qilmaydi. Garchi S# Qat’iy ob’ektli modelga ega bo’lsada, siz uni Qo’llash bosQichini aniQlashda yetarlicha erkinlikka ega bo’lasiz. Katta bo’lmagan dasturlar uchun “ob’ektga yo’naltirilganlik” sal-pal seziladi, dasturlar hajmining o’sish choralariga ko’ra unga katta hajmdagi ob’ektga-yo’naltirilgan xossalarni birlashtirish mumkin. S# tilidagi kalit so’zlar S# tilida 77 ta kalit so’zlar (1.1 jadval) aniQlangan bo’lib, ularni o’zgaruvchilarning, sinflarning va usullarning nomlari sifatida ishlatish mumkin emas. Barcha kalit so’zlar faQat satrli , ya’ni kichik harflar bilan yoziladi. Jadval 1.1. S# ning kalit so’zlari abstract as base bool breack byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in mt interface internal is lock Long namespace new null object operator out override params private protected publick readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using vortual volatile void while Identifikatorlar Identifikator- deb, bir yoki bir necha belgilar ketma-ketligidan iborat bo’lgan nomlashga aytiladi. Odatda bularning birinchi belgilari ixtiyoriy harfdan yoki pastki chiziQcha belgisidan boshlanishi mumkin. Keyingilari esa harf, pastki chiziQcha belgisi yoki raQam kabilardan iborat bo’lishi mumkin. Pastki chiziQcha belgisi o’zgaruvchining nomini o’Qilishini yaxshilash uchun ishlatiladi. Masalan, line__count, Test, x, V'2, MaxLoadup, _top, my_var, sample23. C# kompilyatori yuQori va Quyi registr belgilarini har xil deb Qabul Qiladi. Masalan, lola va Lola nomlari har xil nomlardir. BoshQa algoritmik tillardagi singari, identifikator raQamdan boshlanishi mumkin emas. Ammo, zarur bo’lsa kalit so’zlarning oldiga @ belgisini Qo’yish bilan ularni identifikatorga aylantirish mumkin. Masalan: @for, @Var. Ammo, izoh tarzida shuni ham aytib o’tish kerakki, iloji boricha bunday belgilashlardan foydalanish tavsiya etilmaydi. Ma’lumki, identifikatorlar- S# da usullarning, o’zgaruvchilarning yoki foydalanuvchi tomonidan aniQlangan elementlarning nomlarini ifodalash uchun ishlatiladi. S# kutubxonasi Bu bobda taQdim etilgan dasturlarda, o’rnatilgan ikkita WriteLine () va Write usullaridan foydalanildi. Aytib o’tilganidek, bu usullar System fazosiga mansub bo’lgan Console sinfining a’zolari bo’lib hisoblanadi. Qaysiki System fazosi ham o’z navbatida .NET Framework kutubxonalar sinfida aniQlangan bo’ladi. .NET Framework kutubxonalar sinfi S# da kiritishG’chiQarish amalini Qo’llashni amalga oshirish uchun, satrlarni Qayta ishlash uchun, tarmoQda ishlash va GUI interfeyslarini yaratish uchun foydalaniladi. C# standart .NET platformasi sinflari bilan chambarchas integrallashgan. Ko’ryapsizki, ixtiyoriy C#-dasturda ishlatiladigan kutubxonalar sinfi ko’pchilik funksional imkoniyatlarni ta’minlaydi. S#da dasturchi bo’lish uchun mana shu standart sinflarni o’rganish zarur. Bu kitobda V etoy knige opisano’ razlichno’ye metodo’ i elemento’ biblioteki klassov .NET kutubxonalar sinfining har xil usullari va elementlari tasvirlangan bo’lib, kutubxonaning ancha kattaligi tufayli uning bir Qancha komponentalarini mustaQil o’rganishga to’g’ri keladi. 1. MSIL nima va u S# uchun nega bunchalik zarur? 2. Tilga bog’liQ bo’lmagan bajarish muhiti (CLR) nima? 3. OYDning uchta asosiy tamoyili nimalar? 4. S# da yozilgan dasturning bajarilishi Qaysi usuldan boshlanadi? 5. O’zgaruvchi nima? Nomlar fazosi deb nimaga aytiladi? 6. Quyidagi nomlarning Qaysi birlari S# da to’g’ri emas ? a) j count b) Scount I v) count 27 g) 67count d) @if 7. Bitta satrli izoh Qanday tuziladi? Ko’p satrli izoh Qanday tuziladi? 8. if operatorining sintaksisini yozing. for operatorining sintaksisini yozing . 9. Kod bloki Qanday tuziladi? 10.Har bir S# dasturini using System; operatori bilan boshlash shartmi ? 11. Oy sirtidagi og’irlik kuchi yer sirtidagi og’irlik kuchining taxminan 17 foyizini tashkil etadi Sizning Oydagi og’irligingizni Qanday bo’lishini hisoblaydigan dastur yozing. 12. 1-2 loyihalarni shunday o’zgartiringki, natijada dastur dyuymni metrga aylantirib beradigan jadvalni chiQarsin. Natija 0 dan 100 dyuymgacha bo’lgan oraliQda olingan masofalar to’plami uchun hisoblansin. Dastur har 12 satrdan so’ng bo’sh satrni bosib chiQaradigan bo’lsin. (Bir metr taxminan 39.37 dyuymga teng.) Birinchi oddiy dastur Tilning detallarini chuQur o’rganishdan oldin S# da yozilgan QisQa va oddiy dasturni kompilyatsiya Qilamiz va ishga solamiz. G’* Bu S# da yozilgan oddiy dastur. 1. Inkapsulyatsiya, polimorfizm va merosxo’rlik OYD tamoyillari bo’lib hisoblanadi. 2. Sinf inkapsulyatsiyaning asosiy elementi hisoblanadi. Dasturlar kodini o’z ichiga olgan fayl — Example.cs. using System; class Example { G’G’ S# dasturi Main() usulini chaQirish bilan boshlanadi. public static void MainO i Console.WriteLine(“Oddiy S# - dastur.”); S# - dasturni kompilyatsiya Qilish, ishga tushirish va tahrirlashning ikkita usuli mavjud. Birinchidan, siz kompilyatsiyani buyruQlar satridan csc.exe dasturini ishga tushirish orQali bajarishingiz mumkin. Ikkinchidan, Visual CQQ (Integrated Development Environment, IDE) ishlanmasining birlashtirilgan muhitidan foydalanishingiz mumkin. Bu ikkala usullar Quyida berilgan. BuyruQlar satridan kompilyatsiya Qilish BuyruQlar satridan kompilyatsiya Qilish o’zida garchi siz tijorat loyihalari uchun ehtimol Visual CQQ ishlanmasining birlashtirilgan muhitidan foydalansangiz ham S# dasturlar kitobida keltirilganlarning ko’pi bilan ishlashning nisbatan yengil usulini namoyon Qiladi. S#-dasturini buyruQlar satridan kompilyatsiya Qilish va ishga tushirish uchun sizga uchta harakatni amalga oshirish zarur bo’ladi. 1. Dasturlar kodi mavjud bo’lgan fayllarni yaratish. 2. Dasturni kompilyatsiya Qilish. 3. Dasturni ishga tushirish. Fayl yaratish Mazkur kitobda berilgan dasturlarni Osborne kompaniyasining www.osborne.com Web-tuguni yoki dasturlar kodini Qo’lga kiritish ixtiyori bilan yuklash mumkin. Qo’lga kiritilganda dasturni matn redaktori (masalan, Notepad)dan foydalangan holda faylga yuklang. Matnli ASCII-fayllari formatlashtirish elementlarisiz yaratilishi kerak, modomiki bunday axborot kompilyatsiya Qilishda xatoga olib kelishi mumkin. Dasturni kiritganingizdan keyin faylga Example. ss degan nom bering. Dasturni kompilyatsiya Qilish Dasturni kompilyatsiya Qilish uchun S# csc.exe kompilyatorini buyruQlar satridagi boshlang’ich faylning nomini ko’rsatgan holda ishga tushirish zarur: C:g’>csc Example.cs Esc kompilyatori MSIL-versiya dasturi mavjud Example.exe faylini yaratadi. Garchi MSIL ijro etiladigan kod bo’lmasa ham, unda (exe) ijro etiladigan fayl mavjud. Example.exe faylini ishga tushirishga urinishda ijro muhiti (CLR) tiliga bog’liQ bo’lmagan holda JIT-kompilyator avtomatik tarzda harakatga keladi. Agarda siz kompyuterda installyatsiya Qilinmagan .NET Framework da Example.exe faylini (yoki MSIL mavjud boshQa ixtiyoriy faylni) bajarishga harakat Qilsangiz, dastur CLR yo’Qligi sababli ishlamaydi. Eslatma Css.exe kompilyatorini ishga tushirish oldidan sizga odatda g’Program Filesg’Mic-rosoft Visual Studio.NETg’Vc7g’Bin katalogida joylashgan vcvars32.bat buyruQ faylini ishga tushirish kerak bo’lishi mumkin. Alternativ sifatida masalalar panelidagi Pusk|Dasturlar menyusida joylashgan Microsoft Visual Studio.NET 7.0 menyuostiga o’tkazilgan instrumentlar ro’yxatidagi Visual Studio.NET Command Prompt elementini tanlash orQali buyruQlar satridan kompilyatsiya jarayonlarini harakatga keltirish mumkin. Dasturlarni ishga tushirish Dasturlarni ishga tushirish uchun uning nomini Quyidagi ko’rsatilganidek buyruQlar satriga kiriting: S:g’>Example Qachonki dastur ishga tushsa, ekranda Quyidagi satr paydo bo’ladi: Oddiy S#-dastur. Visual CQQ IDE dan foydalanish Visual Studio 7 versiyasidan boshlab Visual CQQIDE S#-dasturlarini kompilyatsiya Qilishi mumkin. Visual CQQ IDE dan foydalanib S#-dasturini tahrirlash, kompilyatsiya Qilish va ishga tushirish uchun siz Quyida sanab o’tilgan harakatlarni amalga oshirishingiz zarur bo’ladi. (Esli na vashem kompyutere installirovana drugaya versiya, vozmojno, poryadok deystviy budet drugim.) (Agarda sizning kompyuteringizda Visual CQQ ning boshQa versiyasi installyatsiya Qilingan bo’lsa, harakatlar tartibi boshQacha bo’lishi mumkin.) 1. File|New| Project menyu punktlarini tanlash orQali yangi bo’sh S#-loyiha yarating. Keyin 1rasmda ko’rsatilganidek Visual C# Project papkasini, undan so’ng Empty Project piktogrammasini tanlang. :! • -1 Visual Basic Projects ■M Visual CQQ Projects Cj Setup and Deployment Pro)ect5 Sh- £3 Other Projects Cj Visual Studio Solutions ASP.NET Web ASP.NET Web Web Control Application Service Library I C:g’Documents and Settingsg’Pada!kag’Mon dokumento’g’g’ jwj ' for ::y;71{ ^.^g...'"! V Samples Visual Studio Sarrrotes 2. Loyiha yaratilganidan keyin sichQonchaning o’ng tugmachasini Solution darchasidagi loyiha nomi ustida bosing. ChiQQan kontekst menyusidan Add punktini, keyin Add New Item punktini tanlang. Sizning monitoringiz ekranida Quyidagi manzara paydo bo’ladi. V* ProiectZ - Microsoft *)«S1 S* .NET [design] - Start Pag. Hie £}№ SSew Project V* 0*1*3 Irate 3. Add New Item dialog oynasi ochilsa, Local Project Items punktini, undan keyin S# Code File piktogrammasini tanlang. Sizning monitoringiz ekranidagi ko’rinish Quyidagicha bo’ladi. [Add New Item - Projectl 4. Dasturni yuklang va faylni Example.csc nomi ostida saQlang (Mazkur kitobda berilgan dasturlarni Web-tugun www.osborne.com bilan yuklash mumkinligini eslang). Sizning monitoringiz ekranida Quyida ko’rinish paydo bo’ladi. 5. Build menyusidagi Build punktini tanlash orQali dasturni kompilyatsiya Qiling. 6. Debug menyusidagi Start Without Debugging punktini tanlash orQali dasturni ishga tushiring. Qachon dastur ishga tushsa rasmda ko’rsatilgan darcha paydo bo’ladi. Dasturlardagi katta bo’lmagan o’zgarishlar. Ushbu kitobda berilgan dasturlarni kompilyatsiya Qilish va ishga tushirish uchun har doim ham yangi loyiha yaratish shart emas, o’sha S#-loyihadan foydalanish mumkin. Buning uchun shunchaki ishlab turgan faylni o’chiring va yangisini Qo’shing, keyin uni kompilyatsiya Qiling va ishga tushiring. YUQorida ta’kidlanganidek, kitobning birinchi Qismida berilgan QisQa dasturlarni buyruQlar satridan kompilyatsiya Qilish osonroQdir. Garchi ushbu kitobdagi barcha dasturlar using System operatoridan foydalansa ham, lekin aslida birinchi dasturni boshlanishida unga texnik ehtiyoj yo’Q. S# da har doim sinf (yoki usul) tegishli bo’lgan makon nomini ko’rsatish orQali sinf (yoki usul) nomini to’liQ aniQlash mumkin. Masalan, satr Quyidagicha yozilgan bo’lishi mumkin: Console.WriteLine ("Oddiy S#-dastur."); Shunga ko’ra, 1-misolni Quyidagicha yozish mumkin: G’G’ Dasturning bu versiyasida operator ishlatilmaydi G’G’ using System;. class Example ( G’G’ S# dasturi MainO public static void Main() metodining bajarilishidan boshlanadi Console.WriteLme () metodining to’liQ ta’rifi G’G’ Bu yerda Console.WriteLine() metodi to’liQ aniQlangan . System.Console.WriteLine ("Oddiy S#-dastur ") ; Garchi System identifikatorini har gal ko’rsatish Qiyin bo’lsada, Qachonki shu sohaning a’zosi ishlatilganda ko’pchilik S# dasturchilari o’zlarining barcha dasturlarini using System; operatoridan boshlaydilar. Ammo, zarur bo’lganda sinf nomini yoki sinf a’zosini oshkor aniQlashingiz mumkin. Buning uchun mazkur sinf Qaysi sohaga tegishliligi ko’rsatiladi. 3. S# tilidagi aniQlangan tiplar. Qiymati bo’yicha aniQlangan tiplar. Butun tiplar. Suzuvchi nuQtali formatli sonlar. O’nli formatdagi son. Boolean, satriy tip. Uzatma bo’yicha aniQlangan tiplar. Ikkinchi oddiy dastur Balkim, o’zlashtirish operatori dasturlashdagi asosiy operatorlardan biri bo’lib hisoblanadi. O’zgaruvchi –bu xotiraning nomlangan Qismi bo’lib, unga Qiymat o’zlashtiriladi. Bu Qiymat dastur bajarilishi davomida o’zgarishi mumkin. YA’ni o’zgaruvchining Qiymati fiksirlanmagan, o’zgarishi mumkin. Navbatdagi dasturda ikkita x va u o’zgaruvchilari hosil Qilinadi: G’G’ Bu dastur o’zgaruvchilarni ishlatishni namoyish Qiladi using System; class Example2 { public static void Main() (O’zgaruvchilarni e’lon Qilish int x; G’G’ Bu satrda o’zgaruvchi e’lon Qilinadi. int u; G’G’ Bu satrda yana bitta o’zgaruvchi e’lon Qilinadi x q 100; G’G’ Bu satrda x o’zgaruvchiga G’G’ 100 Qiymat o’zlashti riladi . Console.WriteLine("Peremennaya x soderjit znachenie " Q x); U q x G’ 2; Console.WriteLine("Znachenie peremennoy u vo’chislyaetsya"); Console.Write("s pomohyu vo’rajeniya xG’2 i ravno "); Console.WriteLine(u); Dasturni bajarib, siz monitor ekranida Quyidagi xabarni ko’rasiz : O’zgaruvchi x 100 Qiymatga ega. O’zgaruvchi u ning Qiymati xG’2 ifoda yordamida hisoblanadi va 50 ga teng Bu dasturda S# tilining yangi elementlari taQdim etilgan. Ushbu int x; G’G’ Bu satrda x o’zgaruvchi e’lon Qilinadi. operatori x nomli butun tipli o’zgaruvchini e’lon Qiladi. S# da barcha o’zgaruvchilar ishlatilmasdan oldin e’lon Qilinishi shart. O’zgaruvchi Qabul Qilishi mumkin bo’lgan Qiymatlar tipi, aniQlangan bo’lishi shart. Bu o’zgaruvchi tipi ko’rsatiladi, deb Qabul Qilingan. YUQorida keltirilgan dasturda x o’zgaruvchi butun tipli Qiymatlarni Qabul Qiladi. S#da butun tipli o’zgaruvchilarni e’lon Qilish uchun o’zgaruvchi oldiga int kalit so’zini joylashtirish kerak bo’ladi. Navbatdagi satrda ikkinchi u o’zgaruvchi e’lon Qilinadi: int u; G’G’ Bu satrda yana bitta o’zgaruvchi u e’lon Qilinadi. Bu yerda x uchun Qo’llanilgan e’lon Qilish ko’rinishi foydalaniladi, ammo o’zgaruvchi nomi boshQa. Ko’pgina hollarda o’zgaruvchini e’lon Qilish uchun Quyidagi sintaksisli operator ishlatiladi: type var-name; Bu yerda type so’zi e’lon Qilinadigan o’zgaruvchi tipini ko’rsatadi, var-name — esa o’zgaruvchi nomi. S# da int tipidan boshQa bir necha tiplar ham Qo’llaniladi. Quyidagi satrda o’zgaruvchiga 100 Qiymati o’zlashtiriladi: x q 100; G’G’ Bu satrda o’zgaruvchiga 100 Qiymati o’zlashtiriladi. S# da o’zlashtirish operatori tenglik belgisi bilan ifodalanadi. U tenglik belgisining o’ng tomonidagi Qiymatni chap tomonidagi o’zgaruvchi nomiga o’zlashtiriladi. Navbatdagi satr x o’zgaruvchining Qiymatini "O’zgaruvchi x ushbu Qiymatga ega ", degan yozuvdan so’ng bosib chiQaradi . Console.WriteLine("O’zgaruvchi x ushbu Qiymatga ega" Q x); Bu satrning bajarilishidagi Q belgisi "O’zgaruvchi x ushbu Qiymatga ega" satridan so’ng chiQishini ta’minlaydi. Demak, bitta WriteLine () operatorida Q yordamida bir necha elementlarni bog’lash mumkin ekan. Navbatdagi satrda u o’zgaruvchi x yordamida hisoblanadi: u q xG’2; YA’ni, x o’zgaruvchining Qiymati 2 ga bo’linadi va u o’zgaruvchiga joylashtiriladi. Natijada u ning Qiymati 50 ga teng bo’ladi. X o’zgaruvchining Qiymati esa o’zgarmasdan Qoladi. BoshQa dasturlash tillar singari S# ham barcha arifmetik amallarni Qo’llaydi: Q Qo’shish, - Ayirish, * Ko’paytirish, G’ Bo’lish Dastur kodining Quyidagi uchta satrini ko’ramiz: Console.WriteLine("u o’zgaruvchining Qiymati "); Console.Write(" xG’2 ifoda yordamida hisoblanadi va teng "); Console.WriteLine(u); Bu yerda tilning yangi elementi va o’zgaruvchidan foydalanishning yangi varianti uchratiladi. YAngi element –bu o’rnatilgan write () metodi bo’lib, ekranga " xG’2 ifoda yordamida hisoblanadi va teng " degan satrni chiQarish uchun foydalaniladi. Bu satrdan keyin yangi satr Qo’yilmaydi. Bu degani navbatdagi chiQarish amali kelsa, u shu satr oxiriga chiQariladi. Write () metodi WriteLine () metodiga o’xshaydi, ammo u har bir chaQirilganda yangi satrdan chiQarmaydi. O’zgaruvchini Qo’llashning yangi varianti bu- u o’zgaruvchining WriteLine () metodini chaQirishdagi mustaQil ishlatilishidir. S# da ixtiyoriy o’rnatilgan tiplardagi Qiymatlarni chiQarish uchun Write () metodi Qanday ishlatilgan bo’lsa, WriteLine () metodi ham shunday ishlatiladi. Endi o’zgaruvchilarni e’lon Qilishning yana bitta imkoniyatini ko’ramiz. S#da bitta e’lon Qilish operatori yordamida ikki va undan ortiQ o’zgaruvchilarni e’lon Qilish mumkin. Buning uchun faQatgina o’zgaruvchilar bir-biridan vergul bilan ajratib Qo’yish yetarli. Masalan, x va u o’zgaruvchilarni mana bunday e’lon Qilish mumkin: int x, u; G’G’ Har ikkala o’zgaruvchini e’lon Qilish uchun G’G’ bitta operator ishlatiladi . Berilganlarning boshQa tiplari Oldingi dasturda faQat butunsonli Qiymatlarni saQlaydigan int tipidagi o’zgaruvchi ishlatilgan edi, Qaysiki bunda kasr Qiymatli sonlarni saQlash mumkin emas . OldinroQ aytib o’tilgan ediki, C# int tipidan tashQari bir Qancha boshQa tiplarni ham Qo’llaydi. Kasr Qismli sonlar uchun S#da ikkita, float va double tiplari aniQlangan bo’lib, mos ravishda oddiy va ikkilangan aniQlikdagi sonlar ifodalash uchun ishlatiladi. Ko’proQ double tipi ishlatiladi. double tipidagi o’zgaruvchilarni e’lon Qilish uchun sintaksisi Quyidagicha bo’lgan operator ishlatiladi: double result; Bu yerda result so’zi — o’zgaruvchi nomi bo’lib, double tipli, Qo’zg’aluvchan nuQtali sonlar bilan ishlash imkonini beradi (masalan, u 122.23, 0.034, yoki -19.0 kabi sonlarni saQlashi mumkin). Mazkur int va double tiplari orasidagi farQni yanada yaxshiroQ tushunish uchun Quyidagi dasturni bajaring: G’* Bu dasturda int va double tiplari orasidagi farQ namoyish Qilinadi *G’using System; class Example3; public static void Main() ; int ivar; G’G’ Kodning bu satrida ivar o’zgaruvchisi int tipida e’lon Qilinyapti. double dvar; G’G’ Kodning bu satrida dvar o’zgaruvchisi double tipida e’lon Qilinyapti ivar q 100; G’G’ ivar o’zgaruvchisiga 100 Qiymati o’zlashtirilyapti. dvarq100.0; G’G’dvar o’zgaruvchisiga 100.0 Qiymati o’zlashtirilyapti. Console.WriteLine("ivar o’zgaruvchisining boshlang’ich Qiymati: " Q ivar); Console.WriteLine("dvar o’zgaruvchisining boshlang’ich Qiymati: " Q dvar); Console. WriteLine () ; G’G’ Bo’sh satrni chiQaradi . < [Bo’sh satrni chiQarish G’G’ Har ikkala o’zgaruvchining Qiymati 3 ga bo’linadi. ivar q ivar G’ 3; dvar q dvar G’ 3.0; Console.WriteLine("ivar o’zgaruvchisining bo’lishdan so’ngi Qiymati : " Q ivar); Console.WriteLine("dvar o’zgaruvchisining bo’lishdan so’ngi Qiymati: " Q dvar); Quyida shu dastur ishi natijasi keltiriladi: ivar o’zgaruvchisining boshlang’ich Qiymati: 100 dvar o’zgaruvchisining boshlang’ich Qiymati: 100.0 ivar o’zgaruvchisining bo’lishdan so’ngi Qiymati : 33 dvar o’zgaruvchisining bo’lishdan so’ngi Qiymati: 33.3333333333333 Ko’ryapsizki, ivar o’zgaruvchisini 3ga bo’lishdan so’ngi Qiymati natijasi butun 33 soni bo’ladi, ya’ni kasr Qismi yo’Qotildi. Lekin dvar o’zgaruvchisini 3ga bo’lishdan so’ngi Qiymatidagi kasr Qismi saQlanadi. Dasturda ko’rsatilganidek, o’zgaruvchilarning Qiymatini Qo’zg’aluvchi nuQtali ko’rinishda kiritishga zaruriyat bo’lsa, u e’lon Qilingan bo’lishi kerak ekan. Aks holda, Qiymatlar butun tipli deb tushuniladi.Masalan, S# da 100 butun deb, 100.0 esa Qo’zg’aluvchi nuQtali Qiymat deb hisoblanadi. Shuning bilan birga, ekranga bo’sh satrni chiQarish uchun argumentsiz WriteLine () usulidan foydalaniladi. Professional javoblari Savol. Nimaga S#da butun sonli va Qo’zg’aluvchi nuQtali Qiymatlar uchun turli tiplar mavjud? Javob. S# dasturning samaradorligi uchun turli tipdagi berilganlarni Qo’llaydi. Masalan, butun sonli Qiymatlar ustida bajariladigan amallar, Qo’zg’aluvchi nuQtali sonlar ustida bajariladigan amallarga Qaraganda tezroQ bajariladi. Shu sababli, agar sizga sonlarning kasr Qiymatlari kerak bo’lmasa, unda ortiQcha aniQliklar bilan hisoblashlarga, ya’ni float va double tipidagi berilganlarga zaruriyat bo’lmaydi. Bundan tashQari, xotira o’lchami ba’zi bir tipdagi berilganlarni saQlash uchun boshQa bir tipdagilarga Qaraganda kamroQ bo’lishi mumkin. Berilganlarning har xil tiplarini hisobga olgan holda, S# sistemali resurslardan samarali foydalanishga imkon beradi. Ba’zi bir algoritmlarning berilganlarning maxsus tiplarini talab Qilishlarini ham inobatga olishni unutmang (hech bo’lmaganda shunda ancha samarali ishlaydi). Loyiha 1-1. Temperatura Qiymatini almashtirish FtoC.cs Garchi oldingi dasturning misollari S# tilining ba’zi bir zarur xossalarini namoyish Qilsada, amalda bunday dasturlar unchalik foydali emas. Bu bosQichda S# tili bo’yicha sizning bilimlaringiz kam bo’lsada, shunga Qaramasdan siz uni amalga Qo’llay olasiz. Bu loyihada biz Farengeyt shkalasi bo’yicha berilgan temperatura Qiymatini Selsiy shkalasiga almashtirib beradigan dastur tuzamiz. Dasturda double tipidagi ikkita o’zgaruvchi e’lon Qilinadi. Ulardan birida Farengeyt shkalasi bo’yicha berilgan temperatura Qiymati, ikkinchisida esa almashtirishdan hosil bo’lgan Selsiy shkalasidagi temperatura Qiymati saQlanadi. Mumkin siz bilasiz, bunday almashtirishni bajarish uchun Quyidagi formula zarur: S q 5G’9 * (F - 32) bu yerda S — Selsiy shkalasidagi temperatura Qiymati (gradusda), F — Farengeyt shkalasi bo’yicha berilgan temperatura Qiymati (gradusda). Qadamba-Qadam instruksiya 1. FtoC.cs nomli yangi S#-fayl tuzing. (Agar dastur kompilyatsiyasi buyruQ satridan amalga oshirilmasdan, Visual CQQ IDE yordamida bajarilsa, u holda bu faylni oldin tasvirlanganidek S# loyihaga Qo’shib Qo’yish kerak. 2. Quyidagi dasturni faylga kiriting: G’* Loyiha 1-1 Bu dastur Farengeyt shkalasi bo’yicha berilgan temperatura Qiymatini Selsiy shkalasiga almashtirib beradi. FtoC.cs nomli faylni ayting *G’ using System; class FtoC { public static void MainO { double f; G’G’ Farengeyt shkalasi bo’yicha berilgan temperatura Qiymatini saQlaydi double s; G’G’ Selsiy shkalasi bo’yicha berilgan temperatura Qiymatini saQlaydi f q- 59.0; G’G’ f o’zgaruvchi -59 Qiymatini oladi G’G’ (Farengeyt bo’yicha gradusda). G’G’ So’ngra mavjud Qiymatlarni G’G’ Selsiy shkalasiga almashtirish bajariladi s q 5.0 G’ 9.0 * (f - 32.0); Console.Write(f Q " gradus Farengeyt shkalasi bo’yicha teng "); Console.WriteLine(s Q " gradus Selsiy shkalasi bo’yicha"); 3. Visual CQQ IDE dan foydalanib (oldingi ko’rsatmalar asosida) dasturni kompilyatsiya Qiling, yoki buyruQlar satriga Quyidagi buyruQni kiriting: C>csc FtoC.cs 4. Visual CQQ IDE dagi dasturni ishga tushiring, yoki buning uchun buyruQlar satridan, taklif etilgandan so’ng, bosh sinf nomini (mam usuli bo’lgan) kiriting: OFtoC Dasturning bajarilishi natijasida Quyidagi satr chiQadi: Farengeyt shkalasi bo’yicha 59 gradus Selsiy shkalasidagi 15 gradusga. 5. Dastur Farengeyt shkalasidagi temperaturaning bitta Qiymatini (gradusdagi) Selsiy shkalasidagi temperatura Qiymatiga almashtiradi. f o’zgaruvchidagi sonni o’zgartirish bilan siz ixtiyoriy temperatura Qiymatini almashtirishingiz mumkin. Bir daQiQalik amaliyot I. S# da Qaysi kalit so’z butunsonli berilganlar tipi uchun ishlatiladi ? . Chto oboznachaet termin double jumlasi nimani ifodalaydi? 3. S# dasturida using System; operatorini ishlatish majburiymi? Ikkita boshQaruvchi operator Metod ichkarisida operatorlarning bajarilishi yuQoridan Quyiga( ya’ni kod blokida yozilish tartibida) yo’nalishida amalga oshiriladi. Ammo bunday bajarilish tartibini S# Qo’llaydigan har xil boshQaruvchi operatorlar yordamida o’zgartirish mumkin. Garchi boshQaruvchi operatorlar kitobda keyinroQ ko’rilsada, biz bu bo’limda ulardan ikkitasi to’g’risida to’xtalib o’tamiz. Chunki ular keyinchalik dasturlarda ishlatiladi. 4. Tiplarni o’zgartirish. Arifmetik tiplarni almashtirish. Satrli tipga almashtirish. Convert klassi va uning metodlari. Almashtirishlarni tekshirish. 5. O’zgaruvchilar va ifodalar. Identifikatorlar. O’zgaruvchilarni e’lon Qilish. Qiymat berish. Lokal va global o’zgaruvchilar. O’zgarmaslar. Ifodalardagi amallar. Ifodalarning Qurilishi. Bitli amallar. Surish amallari. 6. C# tili operatorlari Qiymat berish operatori. Tuzilma operator. Bo’sh operator. If-operatori. REJASI 1. Operatorlar. 2. VA, YOki kiskartuvchi YOki va YUK razryadli operatorlari. 3. Siljitish operatorlari. 4. Operatorlarning prioriteti. 5. Bir necha siklni boshkaruv uzgaruvchilarini foydalanish. 6. Siklni aniklashda elementlarning yuk bulishi. 7. Cheksiz sikl. Uzlashtirish operatori. Uzlashtirish operatori (q) ordinar belgisi Bilan belgilanadi. Uning axamiyati boshka tillardagidek S# tilida xam shunaka. Uzlashtirish operatorining umuma yozilishi uyidagi turga ega. Uzgaruvchiqifoda. Bu yerda uzgaruvchi element tipi bilan bulish kerak. Uzlashtirish operatorining kiziki shundaki ketma-ket uzlashtirsa buladi. Masalan, kodlashning keyingi kodi Int x, y, z G’G’ Xqyqzq10; G’G’ x, y va z uzgaruvchilariga 100 ma’nosini tenglaymiz. Bu fragmentda x, y, z uzgaruvchilari bitta instruksiyaning uzida 100 ga teng deb olinadi. Uzlashtirish operatori ung tarafdagi ifodaning ma’nosini ketma ket berganligi sababli bu instruksiya ishlaydi. Bu esa z-100 ifodaning ma’nosi 100 soniga tengligini bildirib, u keyinchalik u uzgaruvchisiga uzlashtiriladi, undan keyin k uzgaruvchisiga uzlashtiriladi. Uzlashtiruv ketma ketligining kullanilishi - bita ma’noga teng uzgaruvchilarning gruxini belgilashning oddiy iyuli bulib topiladi. Uzlashtirishning murakkab operatorlari. S# da maxsus murakkab uzlashtirish operatorlari kurilib, ular uzlashtirishning belgili bir kursatmalarining dasturlanishin soddalashtiradi. Avvalo misoldan boshlagan makul. Keyingi kursatmani karab utaylik: IxqxQ10; Murakkab uzlashtiruv operatorini ko’llanibbu misolni ko’yidagicha yozish mumkin: xQq10; Qq jo’ftlik operatori kompilyatorga bo’yrik berib x uzgaruvchisiga x uzgaruvchisining berilgan ma’nosi ikindisini va 10 sonini uzlashtiradi. YAna bir misol. |xqx-100; kursatmasi |x-q100 ga tugri keladi. Bu ikkala kursatma xam x uzgaruvchisiga uning avvalgi ma’nosini uzlashtiradi, 100 ga kamaytirib. 4 – bob. Operatorlar. Uzlashtirish operatorining murakkab versiyasi barcha binar operatorlari uchun mavjud buladi (yani barcha ikkita operandlar Bilan ishlaydigan operatorlari uchun). Ularning umumiy kurinishi kuyidagicha Uzgaruvchi or q ifoda; Bu yerda or elementi konkret arifmetik yoki logik operatori, j uzlashtirish operatori Bilan biriktiriladi. Biriktirish operatorining kuyidagi variantlari mavjud bulishi Qq -q *- G’q %- &q 1q uzlashtirishning murakkab operatorlari uning murakkab emas 1 operatoridan kichik bulib unda murakkab versiyasini kupincha kiskartirilgan uzlashtirish operatori deb aytiladi. Uzlashtirishning murakkab operatori ikkita xususiyatga ega. birinchidan, ular ixcham uzlarining “uzun” ekvivalentlaridan. Ikkinchidan ularning mavjudligi effektivli kodlashni tashkil etishga olib keladi (sababi bu yerda operant bir marotaba xisoblanadi). Shuning uchun xam professional yozilgan dasturlarda siz ko’pincha murakkab uzlashtirish operatorini uchratasiz. Razryadma razryad operatorlari S # tilida razryadma razryad operatorlari terma bo’lib karaladi va ular S# tilini dasto’rlashda soxalarini kengaytiradi. Razryadma razryad operatorlari uzlariring operadlariga tasir ko’rsatadi. Ular fakat butunsonli operandlar uchun anikangan va bool float va double operandlari uchun foydalanilmaydi. Razryadma razryad operatorlari testlash uchun muljanlangan bit(razryadlarini) kuyish yoki siljitish uchun va ulardan butunsonli ma’nolar tashkil etiladi. Razryadma razryad operatorlari ko’pincha dasto’rlashning keng masalalarida sistemli toyfasida foydalaniladi, masalan, uskunalarning xolatlarining axborotni surashtirishda foydalaniladi. Razryadma razryad operatorlari 4 jadvalda keltirilgan. Razryadma razryad operatorlari. Jadval 4. Operator Ma’nolari & 1 l » « Razryadli Va Razryadli YOki Razryadli kiskartiruvchi YOki O’nga siljitish Chapka siljitish 1 ga tuliQtirish ( yuk unar operatori) VA, YOKI kiskarto’vchi YOKI va YUK razryadli operatorlari. Razryadli VA, YOKI kiskarto’vchi YOKI va YUk operatorlari &, |, A va , simvollari bilan beriladi. Ular logik operatorlari kanaka amalni bajarsa ular kam xuddi sho’ amalni bajaradi. Ayirmachili sho’ndaki razryadli amallar bit asosida ishlaydi.Keyingi jadvalda razryadli amallarning barcha ( 0 va 1) bo’lgan natiyjalari keltirilgan. P ya p & z p I q p” 000001 100110 010111 111100 Va razryadli operatorini bitli axborotini maydalab kursatishga buladi. Bo’ deganimiz 0 hoxlagan operandida 0-ni tashkil etadi mos kelo’vchi bit natiyjasida. Masalan 11010011 10101010 & ________ 1000 0010 Keyingi dasto’rda razryadli operatorining jo’ft emas sonlardan jo’ft sonlarni olinishi ko’rsatiladi. Bo’ amalga oshiriladi( nulni ) kichik razryadli sonida. Masalan, 9 soni ikkilik kodida 0000 1001 soni bilan keltiriladi. Kichik razryadini nulga keltirishda 8 sonini olamiz (0000 1000 ikkilik kodida) G’G’ Va operatorini xoxlagan sonni G’G’ jo’ft soniga «aylantirish» da foydalanilishi using System ; class Make Even { public static void Main( ) { ushort num; ushort i; for i q 1; num qi; Console. WriteLine (“ num: “Qnum) ; num – (ushort ) ( num & Ox FFFE) ; G’G’ num & 1111 1110 Console.WriteLine ( “ num kichkina bitni olib tashlangannan kegin :” Q nura Q “g’ n”) ; } } } Bo’ dasto’rning natiyjasi kuyidagi kurinishda bo’ladi: num 1 num kichkina bitni olib tashlangandan so’ng : 0 num 2 num kichkina bitni olib tashlangandan so’ng : 2 num 3 num kichkina bitni olib tashlangandan so’ng : 2 num 4 num kichkina bitni olib tashlangandan so’ng : 4 num 5 num kichkina bitni olib tashlangandan so’ng : 4 num 6 num kichkina bitni olib tashlangandan so’ng : 6 num 7 num kichkina bitni olib tashlangandan so’ng : 6 num 8 num kichkina bitni olib tashlangandan so’ng : 8 num 9 num kichkina bitni olib tashlangandan so’ng : 8 num 10 num kichkina bitni olib tashlangandan so’ng : 10 Bo’ dasto’rda foydalaniladigan OxFFFE ning ma’nosi ikkilik kodida 1111 1111 1111 1110 turida keltiriladi. Shunday kilib, num & OxFFFE amali barcha bitlarni o’zgartirilmagan xolatda koldiradi, kichkinasidan tashkari va unga nul ma’nosi kuyiladi. Shuning uchun xam xoxlagan jo’ft son sho’ « tozalatmadan» utib jo’ft bulib xoladi, a xoxlagan jo’ft emas soni esa undan jo’ft bo’lib chikadi. Va operatori razryad ma’nosi aniklashda xam foydalaniladi Masalan, keyingi dasturda berilgan son jo’ft emasligini aniklaydi. G’G’ VA razryadli operatorining sonni jo’ft G’G’ emasligini aniklashda foydalanilishi using System; class Isodd { public static void Main 0 { usort num; num q10 ; iff ( num & 1 ) num1 ) Console. WriteLine ( « Bo’ tekst kursatilmaydi».) ; Num q11; If (( num & 1) -1) Console.WriteLine ( num Q “ – butun emas son »); Bo’ dasto’rning natiyjasi kuyidagicha 11 – tok son. Ikki xolatda xam if da VA amali bajariladi num o’zgaro’vchisi uchun 1 kuyiladi. Agarda kichik bit num uzgaruvchisiga kuyilgan bulsa ( ya’ni 1 ga teng) num & 1 amalining natiyjasi xam 1 ga teng buladi. Aksi xolda natiyja 0 ga teng bo’ladi. If instruksiya natiyjasi bajariladi fakatkina analizlanayotgan son tok soni bo’lsa. Razryadli testlash imkoniyatlarini, & operatorini dasturlar yaratishda byte tipini ikkilik formatda kursatadi. Shu masalaning yechilgan bir variantini karaymiz. G’G’ baytni tashkil etadigan bit ma’nolarini karaymiz. using System; class ShowBits { public static void Main { int t; byte val; val q 123; fort( t q 128; t > 0; t -tG’2) ( if {( val & t ) 1q0) Console.Write C “1”); if (( val & t ) qq 0) Console.Write C ”0”); Bo’ dasturning natiyjasi kuyidagicha buladi; 1111011 For siklida VA razryad operatori yordamida val o’zgaro’vchisining xar bir ma’nosi testdan utadi. Agarda bo’ bitga mavjo’d bo’lsa unda 1 soni chikadi, aksi x olda 0 – soni chikadi YOKI razryad operatori, VA operatoriga teskarisi bitga 1-ni kuyish uchun kulayli foydalniladi. YOKI amalini bit operandida bajarayotganda 1 ma’nosiga tenng, bo’nga mos ma’nosi xam 1 ga teng bo’ladi. Masalan : 1101 001 1010 1010 &________ 111011 YOKI razryad operatorining yokoridagi keltirilgan dasto’rni tok sonlarni olish uchun xam keltirsa xam buladi. G’G’ YOki razryad operatorini xoxlagan jo’ft sonini tok soniga G’G’ «aylantirish » da foydalanishi using System; class MakeOdd { public static void Main ( ) { ushort num; ushort i; for ( i q 1; i num q i ; Console. WriteLine (“ num: ”Q num); Num q (ushort ) ( “num : “ Q num); num q (ushort ) ( num I 1); G’G’ num| 0000 0001 Console. WriteLine ( “ num ga kichik bitni kuygandan so’ng: “ Q num Q “g’ n”) ; Bu dasto’rning natiyjasi kuyidagicha num 1 num kichkina bitni olib tashlangandan so’ng : 1 num 2 num kichkina bitni olib tashlangandan so’ng : 3 num 3 num kichkina bitni olib tashlangandan so’ng : 3 num 4 num kichkina bitni olib tashlangandan so’ng : 5 num 5 num kichkina bitni olib tashlangandan so’ng : 5 num 6 num kichkina bitni olib tashlangandan so’ng : 7 num 7 num kichkina bitni olib tashlangandan so’ng : 7 num 8 num kichkina bitni olib tashlangandan so’ng : 9 num 9 num kichkina bitni olib tashlangandan so’ng : 9 num 10 num kichkina bitni olib tashlangandan so’ng : 11 Bu dasto’rning ishi YOKI razryad operatorining ketma-ket sonlar orasida va 1 soni ikkilik kodida 0000 0001 turida keltiriladi. Shunday kili, 1- bo’ ma’noda fakat kichik razryad kuyilgan. Agarda, bu ma’no YOKI amalining ba’zi bir ma’nosi bo’lsa, unda bu amalning natiyjasi ikkinchi operand Bilan tuxri keladi uning kichik razryadidan tashkari , ya’ni u 1 teng bo’ladi ( xolgan xammasi o’zgarmiydi). Shunday kilib, xoxlagan jo’ft son YOKI opertoridan « utib» bir soniga kupayadi, ya’ni tok soni bo’ladi. YOKI razryad kiskarto’vchi ( OR) bitga birni ko’yadi fakatgina natiyjasi bir-biridan fark kilsa gina, ya’ni teng emas. Masalan: 0111 1111 1011 1001 ________ 1100 0110 OR operatori o’zgacha bir xossaga ega, va uni kodlashda foydalaniladi. Agarda, OR amalini X ukish va Y ma’nosi orasida bajarsak, va OR amalini birinchi operatsiyasi Bilan Y ma’nosi orasdi foydalansak, unda X ning oldingi ma’nosini olamiz. Bu deganimiz ikkita amalni bajargandan so’ng R1 q X → Y ; R2 q R1 →Y ; R2 ning ma’nosi X ma’nosi bilan barobar bo’ladi. Shunday kilib, ketma-ket OR amalini ishlatgandan so’ng, Y- ning bir xil ma’nolarni foydalangandan so’ng X-ning ma’nosi chikadi. Bu prinsipni oddiy shifrlashda foydalansa bo’ladi, unda ba’zi bir ma’no - kaliti – axborotni kodlash va kodni ochishda yordam beradi. YOKI kiskarto’vchi amali shifrlashda birinchi marotaba foydalaniladi, a kodni ochishda ikkinchi marotaba foydalaniladi. Bu oddiy uslubni kuyidagi dasto’rda ko’rib utamiz: G’G’ OR operatorini axborotni shifrlashda va shifrlanganni ochishda foydalanishi. using System; class Encode { public static void Main( ) { char chl ‘ H1; char ch2 ‘1’ ; char ch3 –‘1’ int key q8.8; Console. WriteLine (“ Oldingi axborot : “ Q chl Q ch2 Qch3 ); G’G’ Axborotni shifrlaymiz. ch1q (char) (ch1 A key); ch2 q (char) (ch2 - key); ch3 q (char) (ch3 A key); Console. WriteLine (“ Shifrlangan axborot : “ Q chl Q ch2 Qch3 ); G’G’ shifrlangan axborotni ochamiz; ch1q (char) (ch1 l key); ch2 q (char) (ch2 A key); ch3 q (char) (ch3 l key); Console. WriteLine (“ Shifrlangan axborotni ochilgani : “ Q chl Q ch2 Qch3 ); } } Bu dasto’rning natiyjasi kuyidagicha: Bor bulgan axborot : Hi! Shifrlangan axborot : > 1y Shifrlanganni ochilgan axborot: Hi! Kurib turganingizdek, OR amalaining ikki marotaba foydalanilishi, bir kalitning ma’nosini ikkalasinda xam foydalanilishida shifrlanganni ochilgan axborotni olamiz. YUK unar operatori ( yoki I gacha to’liktirilgan operator) uzining operandining xamma bitlarining xolatini tekshiradi. Masalan, agarda butunsoni ma’no ( A o’zgaruvchida saklanadigan) ikkilik kodini tashkil etadi 1001 0110, A-amalining natiyjasida ikkilik kodini olamiz 0110 1001. Endigi dasto’rda YUK operatorining ba’zi bir soni 1 ga to’liktirilganincha ikkilik kodida ko’rsatiladi. G’G’ YUK operatorining foydalanilishi using System; class Not Demo { public static void Main( ) { Sbyte to q -34 int t; for ( t-128; t > 0; t q tG’2 ) { if (( b & t ) 1q0) Console.Write C “1”); if (( b & t ) - 0) Console.Write ( ”0”); Console. WriteLine ( ); G’G’ Barcha bitlarni tekshiramiz, bq(sbyte) b; for ( t q 128; t > 0; t q tG’2) { if (( b & t ) 1q0) Console.Write C “1”); if (( b & t ) –i 0) Console.Write ( ”0”); }}} Bo’ dasturning natiyjasi kuyidagicha 110111 10 001000 01 Siljitish Operatorlari. S# da ma’nolarni berilgan son razryadiga ko’ra uni unga va chapka siljitishga bo’ladi. Uning uchun S # da kuyidagi razryadli siljitish operatorlari belgilangan : << chapka siljiish; >> unga siljitish. Shu operatorlarning yozilish umumiy formati kuyidagicha: Ma’no << bitlar^ soni; Ma’no >> bitlar^ soni; Bo’ yerda ma’no - bu siljitish operatorining ob’ekti , a element bitlar^ soni esa kancha raryad soniga siljitishini kursatish kerak. Chapka bir razryadga silijitishda xamma bitlar bir poziiya chapka siljiydi, a eng kichik razryadga nul ma’nosi kuyiladi. Ungda tarafga siljitganda xamma bitlar mos ravishda ungga siljiydi. Agarda ung tarafga siljitganda belgisi yuk ma’nosi tugri kelsa, unda katta razryadga nul ma’nosi yoziladi. Agarda ung tarafga siljitganda belgisi bor ma’nosi tugri kelsa, unda razryadga belgilari saklanib koldiriladi. yeslab kuring: manfiy butun sonlar katta razryadning birga barobar Bilan kursatiladi. Sho’nday kilib, agarda siljitayotgan son ma’nosi manfiy bo’lsa, unda xar bita siljitishda katta razryadga 1 ma’nosi kuyiladi, agarda musbat bo’lsa unda -0 kuyiladi. Unga va chapga siljitishda chetki bitlar yukoladi. Shunday kilib, bu yerda siklli emas sijtish bajariladi va bitningyukolgan ma’nosini bilsa bo’ladi. kuyidagi dasto’rda unga va chapka siljitishi ko’rsatiladi. Siljitishdagi ma’no birga teng deb olinadi, ya’ni fakat kichik razryad ma’nosi « start boshlangandan» 1 ga teng buladi, a kolganlari esa 0 ga teng buladi. Xar bir sakkiz chapka siljitishni bajargandan kegin dasturda kichik sakkiz razryadni kursatadi. Kegin kursatilgan protsess kaytalanadi. Endigi paytda val uzgaruvchisiga 1 kuyilmaydi 128 kuyiladi va u ikkilik kodida 1000 0000 yoziladi. Va albatta siljitish endi chapka emas a unga siljitiladi. G’G’ << VA >> Siljitish operatorining foydalanilishi. using System; class ShiftDemo { public static void Main( ) { int val q 1; int t; int i; for ( i -0; i < 8; iQQ ) { for (tq128; t > 0; t q tG’2 ) { if (( val & t ) 1q0) Console.Write ( “1”); if (( val & t ) qq 0) Console.Write C ”0”}; } Console. WriteLine { ); val - val « 1; G’G’ Chapka siljitish. } Console.Write ( ); Val q128; for ( i q0; i < 8; iQQ ) { for ( tq128; t > 0; t q tG’2 ) { if (( val & t ) 1q0) Console.Write ( “1”); if (( val & t ) qq 0) Console.Write C ”0”); Console.WriteLine ( ); Val q val » 1; G’G’ Ungga siljitish bo’ dasturning natiyjasi Quyidagicha 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001 Ikkilik sonak sonlar razryadlari 2 sonini darajasini tashkil etadi, unda siljitish operatorlarini 2 ga kupaytirish yoki bulishda foydalansa buladi. Albatta bu tugri bo’ladi agarda birinchi yoki ikkinchi tarafdan ( yukoladi) ma’noli bitlar kursatilmasa. Masalan: G’G’ Ciljitish operatorlarini 2 ga kupaytirishda yoki bulishda foydalanilishi. using System; class Mult Div { public static void Main( ) { int n; nq10; Console. WriteLine ( « n o’zgaro’vchining ma’nosi: « Q n); G’G’ 2 ga kupaytiramiz n qn << 1; Console.WriteLine ( “ n o’zgaro’vchisining ma’nosi nqn*2: “ Q n dan kegin); G’G’ 4 ga kupaytiramiz n qn << 2; Console.WriteLine ( “ n o’zgaro’vchisining ma’nosi nqn*4: “ Q n dan kegin); G’G’ 2 ga bo’lamiz n qn << 1; Console.WriteLine ( “ n o’zgaro’vchisining ma’nosi nqnG’2: “ Q n dan kegin); G’G’ 4 ga bo’lamiz; Console.WriteLine ( “ n o’zgaro’vchisining ma’nosi nqnG’4: “ Q n dan kegin); Console.WriteLine ( ); G’G’ Oldingi xolatini keltiramiz; Console.WriteLine ( “ n o’zgaro’vchisining ma’nosi : “ Q n ); G’G’ 30 marotaba 2 ga kupaytiramiz. nqn< Sonsole.WriteLine ( ” n o’zgaro’vchisining ma’nosi 30 razryadga chapka siljitish : “ Q n); bo’ dasturning natiyjasi kuyidagicha n o’zgaro’vchining ma’nosi: 10; n o’zgaro’vchisining ma’nosi nqn*2: dan kegin 20; n o’zgaro’vchisining ma’nosi nqn*4: dan kegin 80; n o’zgaro’vchisining ma’nosi nqnG’2: dan kegin 40; n o’zgaro’vchisining ma’nosi nqnG’4: “ dan kegin 10; n o’zgaro’vchisining ma’nosi : 10; n o’zgaro’vchisining ma’nosi 30 razryadga chapka siljitgandan sung: -214748364 8 Itibor beringki, dasturning oxirgi katori bajarilgannan kegin natiyjasiga. 10 sonini chapka 30 razryadga siljitgandan so’ng ( ya’ni 2 ga kupaytirilgannan kegin) axborotlar yukoladi, sababi int tipiga ajratilgan shu sonning ma’nosi kursatilgan diapazonnan tashkarisida kursatilib turibdi. Xozir siz sonning manfiy ma’nosini krib turibsiz va bu katta razryadga bir kuyilishidan kelib chikadi a bo’ esa int tipii uchun belgi sifatia foydalaniladi. Shuning natiyjasida son manfiy sonbo’lib kabil etilgandek bo’ladi. Bu dasturdan kurinib turibdiki 2 ga kupaytirishda yoki bulishda ixtiyotkorlik bilan siljitishni bajarish. Razryadli uzlashtirish murakkab operatorlari. Barcha binar razryadli operatorlarini uzlashtirish operatorlari bilan biriktirsa bo’ladi. Masalan kuyidagi ikkita instruksiyada x o’zgaruvchisiga YOKI ( OR) kiskaruvchi operandlari bilan x va 127 ni uzlashtiradi. Xqx *127; xl q127; VA ? operatori S# da eng kulay operatorlarining biri bo’ trenar ?- operatori bo’lib xisoblanadi. ? – Operatori kupincha belgilangan konstruksiya tipini almashtirish uchun foydalaniladi if- then – else. ?- Operatori trenar operatori deb aytiladi, sababi u uchta operator Bilan ishlaydi. Uning umumiy format yozilishi kuyidagi turga ega: Ifoda 1 ? Ifoda 2 : Ifoda 3; Bu yerda ifoda 1 bool tipida bulishi kerak. Ifoda2 va Ifoda3 element tiplari bir xil bulishi kerak. Itibor beringki xo’sh nuktaning joylashishi va foydalanishiga ? Ifoda ma’nosi kuyidagicha aniklanadi. Ifoda 1 xisoblanadi. Agarda uning ntaiyjasi xakikiy bo’lsa ifoda2 bajariladi va uning natiyjasi xamma ?-ifoda uchun ma’nosi buladi. Agarda Ifoda1 elementining xisoblash natijasi yolgon bo’lsa, unda barcha ?Ifoda ma’nosi Ifoda3 elementining xisoblash natiyjasi buladi. Masala kurib utamiz abs val uzgaruvchisiga val uzgaruvchisining absolyut ma’nosi kuyiladi. Absvalq val < 0 ? – val; G’G’ val ma’nosining absolyut ma’noni olamiz . Bu yerda absval uzgaruvchisiga val uzgaruvchining ma’nosi uzlashtiriladi, agarda u nuldan ulkan yoki kichik bulsa. Agarda val uzgaruvchisining ma’nosi manfiy bulsa absval uzgaruvchisiga «unar minusi » uzlashtiriladi, va u musbat ma’noga ega. ? operatori foydalanishi tugrisida yana bir masalani kurib utamiz. Bu dasturda 100 sonini xar xil sonlarga bulinishini kurib utamizya, lekin nulga bulishi kuzatilmaydi. G’G’ ? Operatori yordamida nulga bulishni aylanib utish uslubi. Using System; class NoZeroDiv { public static void Main( ) { int i ; for iq-5 ; i < 6; iQQ ) { result >> i1q0? 100G’i : 0 ; if (i 1 -0 ) Console. WriteLine ( “ 100G’ “ Qi “ teng “ Q result ); } } ushbu dasturning bajarilishi natiyjalariga karang. 100. G’ -5 teng – 20 100. G’ -4 teng - 25 100. G’ - 3 teng – 33 100. G’ - 2 teng -50 100. G’ - 1 teng -100 100. G’ 1 teng 100 100. G’ 2 teng 50 100. G’ 3 teng 33 100. G’ 4 teng 25 100. G’ 5 teng 20 Shu dasturdagi keyingi katorga karang I result q I !q 0 ? 100 G’ i : 0; Bu yerda result uzgaruvchisiga 100 sonini i uzgaruvchisining j ma’nosiga bulish natiyjalari uzlashtirilgan. Lekin bu amal i nulga teng bulmagan xoldagina bajariladi. Teskari xolda (agar iq0) result uzgaruvchisiga nul ma’no beriladi. Xakiy xatda ? operatori tamonidan uzgaruviga ma’no berish shart emas. Misol uchun, siz bu ma’noni usunilgan uslubning argumenti sifatida kullanishingiz mumkin. YAna bir shu kabi variant imkoniyati bor. Agar ? operatori tomonidan kabul kilingan ifodalar bool tipiga ega bulsa, unda bu operatorning bajarilish natiyjalarini sikldagi yoki if instruksiyasidagi shartli ifodalar sifatida kullash mumkin. Avvalgi dasturni ancha ixcham turida karab utaylik (uning bajarilish natiyjalari avvalgisiga tugri keladi). G’G’ ? operatori yordamida nulga bulishni aylanib utish. Using System; class NoZeroDiv { public static void Main( ) { int i ; for ( iq-5 ; i < 6; iQQ ) if (i 1qq0 ? true: false Console. WriteLine ( “ 100G’ “ Qi Q“ teng “ Q 100G’i ); > } } if instruksiyasiga itibor bering. Agar i uzgaruvchisining ma’nosi nulga teng bulsa if tekshirish natiyjalari – false ma’nosiga teng buladi, u esa chikarish instruksiyasining bajarilishini uzaga keltirmaydi, demak nulga bulishni xam. Aksi xolda bulish (natiyjani chikarish bilan) uzaga keladi. Probel va kovuslarni foydalanilishi. S# dagi xoxlagan ifodaga kulaylashtirish uchun probel (eki tabulyatsiya simvollarini) kiritsak buladi. Masalan, keiyngi ikkita ifoda bir xil, lekin ikkinchisi ancha kulayrok yozilgan. x q 10G’y*(127G’x); x q 10G’y*(127G’x); Doyra shaklli kovuslar( algebradagidek) amallarning bajarilishini oshiradi. YOrdamchi kovuslarning foydalanilishi xatoga yeki xisoblashni sekinlashtirishga olib kelinmaydi. Bir gap Bilan aytganda ulardan foyda kuprok. Aytingchi, masalan shu ikki ifodadan kaysi birini tushinishi ason x-yG’334* tempQ127 ; Xq(yG’3)-(34*temp) Q127; 11 Operatorlarning prioriteti. 4.2 jadvalda S# operatorlarning bajarilish tartibi keltirilgan( eng kattasidan eng kichigigacha bulgan) 4.2 Jadval S# - operatorlarning prioriteti . ( ) [ ] . QQ( postfiksli) cheked new size of type of unchecked ! Tipni keltirish operatorlari Q{ unar )–( unar) QQ(prefiksli)-( prefiksli) *G’ % Q«» << q >>q is & is || ?: q opq Bu bopta S# tilining dasturlashda bajarilishning boshkarish instruksiyalari karaladi. Boshkarish istruksiyalarning uchta kategoriyalari bor: tanlash instruksiyasi ( if switch ), iteratsion instruksiyalari ( for, while, dowhile va foreach-sikllaridan iborat) va uzatish intsruksiyasi ( beak, continue, goto, return va throw). Throw instruksiyasidan tashkari, sababi u C# tilining kayta ishlash mexanizmining ayrikcha xolati buladi, kolgan yukorida keltirilgan instruksiyalari shu bopda kursatilgan. U if - Instruksiyasi If instruksiyasi 2 bopda keltirilgan edi, lekin bu yerda biz kegrok kurib utamiz. Uning yozilish tulik formati shunday buladi: If ( shart) instruksiya; Else instruksiya; Bu yerda instruksiya elementi deb bitta instruksiya tushilinadi. Else kismi esa shart emas. Instruksiya elementi urninda blok instrukiyasi foydalanilishi mumkin. Bu paytda if instruksiyasining yozilish formati kuyidagicha buladi. If ( shart) | Instruksiyalar ketma- ketligi Else {nstruksiyalar ketma- ketligi ) Agarda shart elementi ya’ni shartli ifodani tashkil etadigan, xisoblashda XAKIYKAT ma’nosini beradigan if- instruksiyasi foydalaniladi, aksi xolda else-instruksiyasi foydalaniladi( agarda u mavjo’d bulsa). Ikkala instruksiyasi birgalikda bajarilmaydi. If – instruksisi bilan bajarilgan boshkarish bool tipida bulishi kerak. Oddiy bir asturni kurib utamiz, unda if-else instruksiyalari sonning manfiy yoki musbat son ekanligin aniklashda foydalaniladi. G’G’ Dasturda berilgan son manfiy yoki musbat son ekanligin kursatadi. Using System; class PosNeg { public static void Main( ) ) int i ; for iq-5 ; i < q5; iQQ ) { Console. WriteLine ( “ testdan utkazish “ Q i Q “: “ ); if i< 0 ) Console. WriteLine ( “ Con manfiy “ ); } Dasturning bajarilishi kuyidagi kurinishda buladi. Testdan utkazish -5: Manfiy son Testdan utkazish -4: Manfiy son Testdan utkazish -3: Manfiy son Testdan utkazish -2: Manfiy son Testdan utkazish -1: Manfiy son Testdan utkazish 0 : Musbat son Testdan utkazish 1 : Musbat son Testdan utkazish 2 : Musbat son Testdan utkazish 3 : Musbat son Testdan utkazish 4 : Musbat son Testdan utkazish 5 : Musbat son Agarda bu mashkda i- uzgaruvchisining ma’nosi nuldan kichik bulsa, if - instruksiyasi bajariladi ( « diagnoz » kiritiladi: Son musbat deb). Ikkita instruksiya birgalikda bajarilmaydi. If ustma ust kuyilgan instruksiyalari . If- ustma-ust kuyilgan nstruksiyalari tashkil etiladi, agarda element intsruksiyasi urniga if – instruksiyasi foydalanilsa. Ustma-ust if –instruksiyasi dasturlashda kengdan foydalaniadi. Eng asosiysi else - intsruksiyasi yakin turgan if instruksiyasiga oyd ekanini bilsangiz va u dasturning shu blokida buladi. Masalan: if ( i -10) { if ( j < 20) a q b; if ( k > 100) c qd; - else aqc; G’G’ Bu else – instruksiyasi G’G’ if –instruksiyasiga tegishli (k>100). } else a q d; G’G’ Bu else- instruksiyasi if- instruksiyasiga tegishli (iqq10). Aytilgandek, else – instruksiyasi if ( j < 20) – instruksiyasi bilan boglik emas, sababi ular bir blokda emas( if- instruksiyasi – yakin turganina karamasdan, u else-jo’ftligiga ega emas). Ichki else-instruksiyasi if ( k >100 )- instruksiyasi bilan bolik, sababi u yaxin joylashgan va shu blokning ichida. G’G’ Dasturda berilgan son manfiy yoki musbat son ekanligin yoki nulga teng ekanligin kursatadi. Using System; class PosNeg { public static void Main( ) { int i ,for iq-5 ; i < q5; iQQ ) { Console. Write ( “ testdan utkazish “ Q i Q “: “ ); if ( I < 0 ) Console. WriteLine ( “ Con manfiy “ ); else if ( i q 0 ) Console. WriteLine ( “ Con belgisi yuk “ ); else Console. WriteLine ( “ Con musbat“ ); } } } Dasturning natiyjasi kuyidagi kurinishda buladi. Testdan utkazish -5: Manfiy son Testdan utkazish -4: Manfiy son Testdan utkazish -3: Manfiy son Testdan utkazish -2: Manfiy son Testdan utkazish -1: Manfiy son Testdan utkazish 0 : belgisi yuk son Testdan utkazish 1 : Musbat son Testdan utkazish 2 : Musbat son Testdan utkazish 3 : Musbat son Testdan utkazish 4 : Musbat son Testdan utkazish 5 : Musbat son If – Else – If Konstruksiyasi Dasturlashda eng kup tarkalgan konstruksiya, va uning asosida ustma- ust if – instruksiyasi « zina» dek if – else – if bor buladi . Uni keyingi dasturda kurib utsak buladi: If ( shart) Instruksiyasi; Else-if (shart) instruksiyasi; Else if { shart) Instruksiyasi; Else Instruksiyasi; Bu yerda shart elementi deb shartli ifodani tushinsa buladi. Shartli ifodalar tepadan pastga xaray xisoblanadi. Fakat kaysi tarafda xakikiy natiyja joylashilgani bilinsa, va bu taraf bilan boglik bulgani aniklansagina, a bosha tarafi «Zina» koldirilib ketiladi. Agarda, bittayam sharti akiykiy emasligi aniklansa, unda oxirgi else-instruksiyasi bajariladi (va uni shartni kursatilmagan xolatda bajarilayabdi deb xisoblasa xam buladi). Agarda oxirgi elseinstruksiyasi berilmagan bulsa, a kolgan instruksiyalari yolgon bulsa u paytda xech bir amal bajarilmaydi. if – else – if «Zina» ning ishi kuyidagi dasturda kurilib utiladi va u berilgan ma’noga eng kichik kupaytiruvchi kiymatini kursatib beradi ( 1dan uzgacha va bir sifradan iborat). G’G’ bir sonidan iborat eng kichik G’G’ kupaytiruvchi kiymatini aniklash Using System; class Ladder { public static void Main( ) { int rmra; for ( num q2; num iff ( num % 2) -0) Console. WriteLine (( “ Eng kichik kupaytiruvchi son “ Q num Q “teng 2. “ ); else iff ( num % 3) qq0) Console. WriteLine (( “ Eng kichik kupaytiruvchi son “ Q num Q “teng 3. “ ); else iff ( num % 5) qq0) Console. WriteLine (( “ Eng kichik kupaytiruvchi son “ Q num Q “teng 5. “ ); else iff ( num % 7) qq0) Console. WriteLine (( “ Eng kichik kupaytiruvchi son “ Q num Q “teng 7. “ ); else Console. WriteLine (( num Q “ 2, 3, 5 yoki 7 ga bulinmaydi “); } } } } Dasturning natiyjasi kuyidagi kurinishda buladi. Eng kichik kupaytiruvchi son 2 teng 2 ga. Eng kichik kupaytiruvchi son 3 teng 3 ga. Eng kichik kupaytiruvchi son 4 teng 4 ga. Eng kichik kupaytiruvchi son 5 teng 5 ga. Eng kichik kupaytiruvchi son 6 teng 6 ga. Eng kichik kupaytiruvchi son 7 teng 7 ga. Eng kichik kupaytiruvchi son 8 teng 8 ga. Eng kichik kupaytiruvchi son 9 teng 9 ga. Eng kichik kupaytiruvchi son 10 teng 2 ga 11 soni 2, 3, 4, 5 yoki 7 ga bulinmaydi Kurib turganingizdek else –instruksiyasi fakatgina ishlatiladi, agarda oldingi xech bir ifinstruksiyalari bajarilmasa. Switch instruksiyasi Ikkinchi tanlash instruksiyasi bulib xisoblanadi. Switch isntruksiyasi kup yunaltirilgan tarmoklanishni ta’minlaydi. U kupchilik alternativadan bittasini tanlashga yordam beradi. Kupyunaltirilgan testdan utkazishda ustma-ust if- instrksiyasida xam bajarsa xam bular edi, lekin switch instruksiyasi yordaminda kupchilik xolatlarda instruksiyasi effektiv yechimi buladi. Bu esa kuyidagicha ishlaydi. Ifoda ma’nosi ketma-ket konstantalar bilan solishtiriladi. Agarda, solishtirishda shartlardan bittasi tugri kelsa shu shart bilan boglik ketma-kteligi bajariladi. Switch instruksiyasining umumiy yozilish formati kuyidagicha: Shwitch (ifoda) { Case konstanta ! : instruksiya ketma - ketligi break ; case konstanta 2: instruksiya ketma - ketligi break ; case konstanta 3: instruksiya ketma - ketligi break; default: instruksiya ketma - ketligi break; } Switch isntruksiyasining ifoda elementi butunsonli tipda bulishi kerak ( masalan, Char, byte, short, yoki int) yoki string ( keyinda bu tugrisida so’z yuritamiz). Suzuvchi nukta Bilan ifodalar foydalanilmaydi. Kupincha Switch ifodasi boshkarish uchun uzgaruvchi foydaliniladi, case – konstantalar literlar bulishi shart, va ularding tiplari berilgan ifodalarning tiplari bilan tugri kelishi kerak. Va shu inobatda ikkita case- konstantalari bir Switch-isntruksiyasi bir xil ma’noga ega bulmaydi. Default-tarmoklari instruksiyasi ketma- ket bajariladi, agarda berilgan case-konstantalarining bittayam natiyjalari switch-ifodasining ma’nolari tugri kelmasa. Default -tarmogi shart emas. Agarda, ifodaning natiyjalari tugri kelmasa case-konstantalari ma’nosi bilan unda xech bir amal bajarilmaydi. Agarda, shunaka ma’nosi tugri kelsa, unda case – instruksiyasi tarmokiga mos instruksiyasi bajariladi, break- instruksiya uchratilmagancha. Switch isntruksiyasi foydalanilishi kuyidagi dasturda kursatiladi. G’G’ Switch isntruksiyasi foydalanilishi kursatamiz. Using System; class ShwitchDemo { public static void Main( ) { int i; for ( iq0 ; i switch ( i ) { case 0: Console. WriteLine (( “ i “ nulga teng “ ); Break; Case 1: Console. WriteLine (( “ i “ nulga teng “ ); Case 2 : Console. WriteLine (( “ i “ ikkiga teng “ ); Case 3: Console. WriteLine (( “ i “ uchga teng “ ); Case 4: Console. WriteLine (( “ i “ turtga teng “ ); Break; default: Console. WriteLine (( “ i “ teng yoki beshtan ulkan “ ); Dasturning natiyjasi kuyidagi kurinishda buladi. Console. WriteLine (( “ i “ nulga teng “ ); Dasturning natiyjasi kuyidagi kurinishda buladi. i nulga teng. i ikkiga teng. i uchga teng. i turtga teng. i teng yoki beshtan ulkan. i teng yoki beshtan ulkan. i teng yoki beshtan ulkan. i teng yoki beshtan ulkan. i teng yoki beshtan ulkan. Kurib turganingizdek siklning xar bir iteratsiyasida instruksiyalar bajariladi, sase-konstantalarga mos ravishda va u i- uzgaruvchisisning ma’nosi bilan tugri keladi. Shu inobatda kolgan barcha isntruksiyalar koldiriladi. Agarda 1ga yoki beshtan ulkan bulsa, default- instruksiyalari bajariladi. Oldingi misolda switch – instruksiyasi int tipidagi uzgaruvchi bilan boshkarilsa. Kurib turganingizdek switch – instruksiyasini bosharish uchun xoxlagan butunsonli tipdagi uzgaruvchini foydalansa buladi, va char tipindagi uzgaruchini xam. Misol case – tarmoklarida shar- ifodani va char- konstantani foydlanilishi. G’G’ Char tipining switch – instruksiyasini boshkarishda foydalanilishi. Using System; class ShwitchDemo2 { public static void Main( ) { char ch; for ( ch q ‘A “; ch switch ( ch ) { case ‘A’: Console. WriteLine ( “ch A dan iborat “ ); break; case ‘ B ’ : Console. WriteLine ( “ ch B dan iborat “ ); Break; case ‘ C: Console. WriteLine ( “ ch S dan iborat“ ); Break; case ‘ D: Console. WriteLine ( “ ch D dan iborat“ ); Break; case ‘ E: Console. WriteLine ( “ ch E dan iborat“ ); Break; Dasturning natiyjasi kuyidagi kurinishda buladi. Ch A dan iborat ch B dan iborat ch S dan iborat ch D dan iborat ch E dan iborat Itibor beringki, bu misolda default-instruksiyasi yuk. Va shart emasligini unutmang. Agarda, bunga zarurot bulmasa uni koldirib ketsada buladi. C # da xato bulibxisoblanar edi agarda, case-tarmogining bittasiga kiradigan bulsa, keyingi ketma - ketlik instruksiyasiga utadi. Bu yerda boshkarishni pastga kuchishi man etilgan koydasi bor bulishi kerak, dasturchilar aytishi buyicha. Shuning uchunda sase-ketma-ketligi break instruksiyasi bilan tugaydi.( «Yukotish» boshka chora bilan kursa xam buladi, masalan goto – instruksiyasi bilan xam, lekin eng kupincha break foydalaniladi). Break- instruksiyasi sase- instruksiyasini yakunlavchi ketma ketlik, switch kostruksiyasidagilarni chikishga olib keladigan, va boshkarish instruksiyasini keyingi instruksiyasiga uzatuvchi, switch konstruksiyasidan tashkarisida joylashuvchi. Default- tarmogi instruksiyasining ketmaketligi «yukolib » ketmasligi kerak va break- instruksyasi bilan yakunlashi kerak. Boshkarishning pastga uzatish « Yukotish» man etilgan koydasi bu S # tilining bir uzgachiligi, boshka tillarga karaganda S, SQ Q va Java. Shu aytilgan uch tillarda « sekin» keiyngi instruksiyaga utish xukkiga ega keingi case-tarmogi instruksiyasiga mos, S # tilini yaratuvchilar « yukotish» chek kuygan ikii sababiga kura. Birinchidan bu kompilyatorga optimizatsiya maksadida case-tarmogining utish tartibini bemalol uzgartsa buladi, agarda, bitta case-ketmaketligi xech kanak tusiksiz keyingiga utishish mumki n emas. Ikkinchidan, case-ktemaketligining anik tugatilishi talabi maxsus instruksiyasi bilan tusatdan « yukotish» imkoniyatini yukotadi dasturchining bilmasdan yaratganligidan. « Yukotish » mann etilaginiga karamasdan boshkarishni case- ketma- ketligidan keiygiga uzatilishi mumkin, keyingi misolda kursatilagandek dasturiy kod tashkil etsak buladi, iikita yoki undan kuprok case- instruksiyalari shu tashkil etilgan kodga yunaltirilsa buladi. G’G’ «Bush » case-instruksiyalari « yukolishi» mumkin . Using System; class EmptyCasesCanFall { t public static void Main( ) { int i; for ( i-1; i Console. WriteLine ( “ i teng 1, 2 yoki 3“ ); break; case 4 : Console. WriteLine ( “ i teng 4 “ ); break; ); ) } Shu dasturning natiyjasi kuyidagi kurinishda buladi. i teng 1, 2 yoki 3 i teng 1, 2 yoki 3 i teng 1, 2 yoki 3 i teng 4 Agarda, bu misolda i uzgaruvchisi 1,2 yoki 3 teng bulsa, unda WriteLine chakirish usuilining birinchi instruksiyasi bajariladi ( >, agarda i ma’nosi 4 ga teng bulsa, unda ikkinchi instruksiyasi bajariladi. Bu yerda kursatilgan case-tarmogi paketlashtirish « yukotish» koydasini yukotmaydi, sababi, xamma case – instruksiyalari bita kodlik ketma – ketligini foydalanadi. Shunday case-paketlashtirish -eng tarkalgan uslub, kodlarni birgalikda foydalanish bir nechcha case – tarmogi bilan, kerak emas kodlangan ketma- ketlikni olib tashlash imkoniyatiga ega. Switch ustma-ust instruksiyalari Switch instruksiyasi case- ketma ketligining bir kismi bulib foylanilishi mumkin tashki Switch instruksiyasining. Bu paytda u ustma- ust Switch instruksiyasi deb ataladi. Aytib utish joyzki ichki va tashki Switch instruksiyasi case-konstantalari bir xil ma’noga ega bulii mumkin, va xech kanaka uzgarish ega bulmaydi. Masalan, kodning keyingi fragmenti mumkin buladi. Shwitch(ch1) { Case ‘A’ : Console. WriteLine ( “Bu A xarfi – switch instruksiyasining bir kismi.”); Shwitch(ch2) { Case ‘A’ : Console. WriteLine ( “Bu A xarfi – ichki switch instruksiyasining bir kismi.”); break; case ‘ B ’ : G’G’… break ; case ‘ B’ : G’G’ … G’G’ switch ichki instruksiyasining yakunlanishi. Ikkinchi bopdan boshlab for siklining oddiy shakilida foydalandik. Shub bopta endi bu siklni maydalab kurib utamiz. For siklining umumiy yozilish formati bitta instruksisini kayta ishlashdagi kuyidagi turda buladi: e for (initsializatsiyalash; shart, iteratsiya ) instruksiyasi; agarda, for sikli dasturiy blokda, kayta ishlash uchun belgilangan bulsa uning umumiy formati kuyidagicha buladi: for (initsializatsiyalash; shart, iteratsiya ) { instruksiyalar ketma- ketligi Initsializatsiya elementi kupincha uzlashtirish instruksiyasini bildiradi, siklni boshkarish uzgaruvchisini belgilaydi, bosh ma’nosiga teng bulgan. Bu uzgaruvchi schetchik xisobida ishlaydi va siklning ishini boshkaradi. Shart elementi esa bool tipidagi uzgaruvchilarni kursatadi Bu testlash natiyjasida for siklni ishlaydi yoki ishlamaydiganini aniklaydi. Iteratsiya elementi esa – bu ifoda sikli boshkaruvchi uzgaruvchining ma’nosi kanaka uzgaradiganini xar bir siklda aniklab beradi. Itibor beringki for siklning xar bir elementi nukta- veyrbul bilan ajralib turibdi. For sikli shart elementi kachon xakiykiy natiyjani bermaganincha bajariladi. Agarda sharti yolgg’on bulsa, dasturning bajarilishi for siklidan keyingi instruksiyaga beriladi. For siklini boshkaruvchi uzgaruvchisi musbat usishi bilan kanday bulsa, unda manfiy ma’nosi bilan xam uzgaradi. Masalan, keyingi dasturda 100 dan 100 dekrementi bilan 5 ga teng diapazonida sonlarni chikaradi. G’G’ For sikli manfiy usishi G’G’ boshkaruvchi uzgaruvchisi bilan. Using System; class DecrFor { public static void Main( ) ( int x ; for x q 100; x> -100; xq-5) Console. WriteLine (x);} } Shuni yodta tutish kerak shartli ifoda for siklining boshida tekshiriladi. Bu deganimiz, agarda birinchi tekshirishimiz YOLgON ma’nosini bersa, unda sikl kodi birdan bajarilmaydi. Masalan: For( count q10; count Bu sikli umuma bajarilmaydi sababi, count uzgaruvchisiga kirish ma’nosi beshtan katta. Bu shartli ifodani ( count For sikli foydali fakat uning takrorlanish soni belgili bulsa. Masalan, keyingi dasturda ikkita For siklini foydalanadi 2 dan 20 gacha bulgan odiiy sonlarini topishda. Agarda son oddiy bulmasa, dastur uning eng katta kupaytiruvchisini kursatadi. G’* Oddiy soni aniklash dasturi. Agarda son oddiy bulmasa, dastur uning eng katta kupaytiruvchisini kursatadi. *G’ Using System; class findPrimes { public static void Main( ) ( int num ; int I ; int factor; bool isprirae; for ( numq2; num isprime q true; factor q0; G’G’ num uzgaruvchisi i ga koldiksiz bulinadi. For (iq2; i G’G’ agarda num uzgaruvchisi i ga kodiksiz bulinadigan bulsa, unda num- oddiy son emas isprime q falser – factor qi; 1 } if (isprime) Console.WriteLine (num Q “ - oddiy son.” ); Else Console.WriteLine (“ sonning maksimal kupaytiruvchisi “ Q num Q “ teng “ Q factor ); }}} bu dasturning natiyjasi kuyidagi turga ega buladi. 2 - oddiy son. 3 - oddiy son. 4 sonning maksimal kupaytiruvchisi 2 ga teng. 5 - oddiy son. 6 sonning maksimal kupaytiruvchisi 3 ga teng. 7 - oddiy son 8 sonning maksimal kupaytiruvchisi 4 ga teng. 9 sonning maksimal kupaytiruvchisi 3 ga teng. 10 sonning maksimal kupaytiruvchisi 5 ga teng. 11- oddiy son 12 sonning maksimal kupaytiruvchisi 6 ga teng. 13 - oddiy son 14 sonning maksimal kupaytiruvchisi 7 ga teng. 15- sonning maksimal kupaytiruvchisi 5 ga teng. 16-sonning maksimal kupaytiruvchisi 8 ga teng. 17- oddiy son 18 sonning maksimal kupaytiruvchisi 9 ga teng. 19- oddiy son For sikli temasining variyatsisi For sikli - C # ning eng yumshok instruksiyalarining biri bulib xisoblanadi, sababi, u katta diapazondagi variatsiyani olishga imkon beradi. Bir nechcha siklni boshkaruv uzgaruvchilarni foydalanish For siklni boshkarish uchun ikki yoki undan kup uzgaruvchilarni foylansa buladi, bu paytda initsializatsiya va ietratsiya instruksiyalari xar bir uzgaruvchi uchun nukta veyrbul Bilan ajratiladi. Masalan, G’G’ For siklida nukta verbulni foydalanish. Using System; { public static void Main( ) { int i, j ; for ( i-0 ; j-10; i< j iQQ, j-) Console. WriteLine (( “ i va j : “ Q i Q “ “ Q j ); Shu dasturning natiyjasi kuyidagicha i va j: 0 10 i va j: 1 9 i va j: 2 8 i va j: 3 7 i va j: 4 6 Bu yerda veyrbul bilan ikkita initsializatsiya instruksiyasi ajratilgan va ikkita iteratsion ifodasi. Siklga kirishda ikkita uzgaruvchi initsializatsiyalanadi I va j. Xar bir iteratsiyani bajargannan kegin I uzgaruvchisi inkrementirlanadi a j uzgaruvchisi dekrementirlanadi. Siklda bir necha boshkarish uzgaruvchilarni foydalanish algoritmlarni kiskartirishga olib keladi. Initsializatsiyalash va iteratsiya bulimida for siklida xoxlagan sonda instruksiyalarni foydalanish mumkin . Eng ulkan va eng kichik kupaytiruvchilarni topish dasturini kurib utamiz ( masalan 100 soni uchun ) Itibor beringki, sikl tugash shartiga u ikki boshkarish uzgaruvchilari uz ichiga oladi. G’For siklida eng kata va eng kichik son kupaytiruvchilarni topishda veyrbuldan foydalinish. Using System; Class Comma { { public static void Main( ) { f int i, j; int smallest, largest i, j ; int num ; Smallest q largest q1; for ( iq 2, j q numG’2 & ( j > -2); iQQ, j - ); { if( (smallest -1 ) & (( num% i) qq0 ) Smallest q i; if( (largest qq1 ) & (( num% j) qq0 ) largest –j ; Console. WriteLine (( “Eng katta kupaytiruvchi : “ Q largest ); Console. WriteLine (( “Eng kichik kupaytiruvchi : “ Q smallest ); ) 1 Shu dasturning natiyjasi kuyidagicha Eng katta kupaytiruvchi : 50. Eng kichik kupaytiruvchi : 2 For siklida ikkita uzgaruvchisini foydalanish, eng katta kupaytiruvchini va eng kichik kupaytiruvchini topishga buladi. Eng kichik kupaytiruvchini topishda biz i uzgaruvchisini foydalanamiz. Avval u 2ga yeng deb olinadi va inkrementirlanadi kachongacha uning ma’nosi berilgan sonining yarmidan oshmagancha( u num uzgaruvchisida saklanadi). Eng katta kupaytiruvchini aniklash uchun j uzgaruvchini foydalanmiz. Avval u berilgan sonining yarmiga teng deb olinadi ( num uzgaruvchisida saklanadigan) va dekrementirlanadi kachongacha uning ma’nosi ikkidan kam bulmagancha. I va j uzgaruvchilari uzlarining ma’nosiga yetmagancha sikl ishlay beradi. Sikl tugagannan kegin ikkita kupaytiruvchilar topiladi. Shartli ifoda. Shartli ifoda bulib xoxlagan for siklni boshkaradigan uzgaruvchisi buladi, bool tipining natiyjasini kelitiradigan. Masalan keyingi dasturda sikl done uzgaruvchisi Bilan boshkariladi. G’G’ bool tipindagi xoxlagan ifoda siklning sharti bulishi mumkin; Using System; class for Demo { public static void Main( ) { int I,j bool done q false; for ( iq0, jq100 ; done I Q Q , j - ) { if ( i*i >q j ) done q true ; Console. WriteLine ( “ I, j: “ Q i Q “ “ Q j “ ); } }} Bu dasturning natiyjalari I, j: 0 100 I, j: 1 99 I, j: 2 98 I, j: 3 97 I, j: 4 96 I, j: 5 95 I, j: 6 94 I, j: 7 93 I, j: 8 92 I, j: 9 91 I, j: 10 90 Bu misolda for sikli takrorlanadi kachongacha bool uzgaruvchisining ma’nosi true bulmagancha. Bu uzgaruvchisiga true kuyiladi, agarda i uzgaruvchisining kvadrat ma’nosi j uzgaruvchining ma’nosidan katta yoki teng bulsa. Sikldi aniklashda elementlarning yuk bulishi. C# da sikl nomida xoxlagan elementni koldirishga buladi ( initsializatsiya-shart- iteratsiya) yoki birdan xammasi. Siklni aniklashda ba’zi bir elementlarning yuk bulishi kizikarli natiyjani berishi mumkin. Keiyngi dasturni kurib utamiz: G’G’ For siklning kismlarini tashkil etadigan kismi bush bulishi mumkin. Using System; class Emptyl { public static void Main( ) { int i; for ( i-0; I < 10; ) { Console. WriteLine ( “Utish № “ Q i ); iQ Q;G’G’ Siklni boshkaradigan uzgaruvchini inkrementirlaymiz} } } Bu yerda for siklning iteratsiya ifodasi yuk. Uning urniga I boshkaruvchi uzgaruvchisi bilan inkrementirlanadi, sikl ichida bor bulgan. Bu deganimiz siklning xar bir takrorlanishida bir amal bajariladi : I uzgaruvchisining ma’nosi 10 soni bilan solishtiriladi. I uzgaruvchisining ma’nosi sikl ichida ikrementirlangani uchun, u u normal funksiyalanadi kuyidagi natiyjalarni kursatib. Utish № 0 Utish № 1 Utish № 2 Utish № 3 Utish № 4 Utish № 5 Utish № 6 Utish № 7 Utish № 8 Utish № 9 Keyngi misolda for siklidan uzgaruvchini boshkaradigan initsializatsiyalash kismi olib tashlangan. G’G’ For siklini aniklash bitta shartdan iborat. Using System; class Emptyl { public static void Main( ) { int i; iq0; G’G’ Sikldan initsializatsiyalash bulimini olib tashlaymiz for (; i < 10; ) { Console. WriteLine ( “Utish № “ Q i ); iQ Q;G’G’ Siklni boshkaradigan uzgaruvchini inkrementirlaymiz} } } bu versiyada i uzgaruvchisi for sikliga kirmasdan oldin initsializatsiyalanadi, a uning nomlanishida emas. Kupincha dasturchilar boshkarush uzgaruvchilarni for sikli ichida initsializatsiyalaydi. Sikldan tashkari initsializatsiyalanadi fakat boshidagi ma’no murakkab protsess bilan almashtirilsa, va uni sikl aniklashida kuyilishi kulaysizliklarni tugdiradi. Cheksiz sikl. For siklining shartli ifodasini bush koldirilib, cheksiz siklini tashkil etsa buladi ( xech kachon tugamaydigan sikl). Masalan, dasturning keying fragmentida C# dasturchilarning kupincha foydalanadigan uslubi keltirilgan. I for(; t) G’G’ maxsus tuzilgan cheksiz sikl. Bu sikl cheksiz ishlaydi. Dasturlashning ba’zi bir masalalariga karamasdan ( masalan, operatsion sistemasining boshkarish protsessorlariga), va u cheksiz siklni bor bulishini talab kiladi, kupchilik «cheksiz sikllar» - bu sikllar fakat tugatish uchun maxsus sikllar.Shu bopning oxirida shunday tipdagi sikllarni kanaka tugatilishi keltirilgan. ( YOrdam: break instruksiyasi yordaminda). Tanasiz sikllar C # da for sikli bilan boglik kismi ( yoki boshka kanakadir sikl bilan boglik), bush bulishi mumkin. Sababi bush instruksiyasi sintaksik yuborilishi mumkin “ tanosiz” sikllari kupincha foydali buladi. Maslan keyingi dasturda “ tanosiz “ sikli foydalanilgan 1 dan 5 ygindini xisoblashda. G’G’ Sikl tanosi bush bulishi mumkin. Using System; class Empty3 { public static void Main( ) { int i; int sumq0; G’G’ 1 dan 5 gacha bulgan ygindini xisoblaymiz. for ( i q1; i Console. WriteLine ( “yigindi teng “ Q sum ); } } Bu dasturdin natiyjasi anik yigindi teng 15. Itibor beringki, ygindi protsessin umuma sikl ichida bajaramiz. Eng kattik dikkatingizni iteratsion ifodaga buling. SumQ q iQ Q Shu instruksiyaga ukshash instruksiyalar bilan almashtirmang. Ular kup tarkalgan va ason tushinarli, agarda ularni kismlarga ajratsak. Bu instruksiya deganimiz sum uzgaruvchisiga yigindi natiyjalarini kuyish shart va i uzgaruvchisining ma’nosini va kegin I uzgaruvchisining ma’nnosini inkrementirlash. Shunday kilib, oldingi instruksiya si keyingidagiga ekvivialent buladi. Stmq sumQI; For siklida uzgaruvchi bilan boshkarishni belgilash. Kupincha for sikli bilan boshkaruvchi uzgaruvchisi fakat shu sikl uchun kerak, va u boshka yerda foydalanilmaydi. Bu paytda siklning initsializatsiyalash bulimida belgilasa buladi. Masalan, keyingi dasturda 1 dan 5 gacha bulgan ygindini kanaka xisoblasa faktorialni xam shunka xisoblaydi. Bu yerda i boshkarish uzgaruvchisi for sikl ichida belgilangan. G’G’ For sikli ichida boshkarish uzgaruvchisini beligilash. Using System; class Forvar { public static void Main( ) { int sumq0; int fact -1; G’G’1 dan 5 gacha bulgan yigindini va faktorialni xisoblaymiz. for ( int i q1; i sum QqI; G’G’ I fakat sikl atrofida belgili. Fact *q; } lekin I uzgaruvchisi belgili emas. Console. WriteLine ( “yigindi teng “ Q sum ); Console. WriteLine ( “faktorial teng “ Q fact ); } for Sikli ichida uzagruvchini belgilashda shuni unutmang: uning kurinish soxasi sikl tugashidan tugaydi. Boshkacha aytganda kurinish soxasi for sikli Bilan cheklangan. Sikldan tashkari bunday uzgaruvchi bor bulishini yukotadi. Agarda siklni boshkaradigan uzgaruvchini dasturning yanada kanadir tomonida foydalanmokchi bulsangiz siz uni for sikli ichida belgilamasliginiz kerak. While siklida While siklining kurinishi kuyidagicha buladi. While [ shart) instrutsiya; Bu yerda instruksiya elementida bittalik yoki instruksiya bloki tushilinadi. Sikl ishi bilan uslovie (shart) elementi boshkaradi, va u bool tipindagi xoxlagan ifoda bulishi mumkin. Instruksiya elementi bajariladi kachongacha shartli ifoda XAKIYKAT ma’nosiga kaytmaganuncha. Bu shart yolgon bulganda boshkarish sikldan keyingi instruksiyaga beriladi. Oddiy misolni karaymiz, va bunda While sikli berilgan sonning tartibin xisoblashda foydalaniladi. G’G’ Butun sonning tartibin xisoblash. Using System; class WhileDemo { public static void Main( ) { int num; int mag ; num q 435679; mag q 0; Console. WriteLine ( “ Son “ Q num ); While (num > 0 ) { Mag Q4- ; num q num G’10 ; }; Console. WriteLine ( “ tartib “ Q mag );}} Bu dasturning natiyjasi kuidagicha Son: 435679 Tartib: While sikli kuyidagicha ishlaydi. Num uzgaruvchisining ma’nosi tekshiriladi, agarda u nuldan katta bulsa, mag schetchigi inkrementirlanadi, a num ma’nosi loflga bulinadi va for sikli num ma’nosi nuldan katta bulmaganuncha takrorlanadi. Num ma’nosi nulga teng bulgan paytda sikl tugaydi, a mag uzgaruvchisi esa shu sonning tartibin kursatadi. For siklidak while siklida shartli ifoda siklga kirishdan oldin tekshiriladi, bu deganimiz sikl tanosi biron marta xam bajarilmaydi. Endigi dasturda siklning bu xossasini sikl boshlanmasdan oldin testdan utkazishni olib tashlaydi. G’G’ 2 Sonining butun darajalarini xisoblash. Using System; class Power { public static void Main( ) { int e; int result ; for (int iq0 ; i< 10; iQQ) { result q1; eqI; while (e > 0) { result *q2; e -; } Console. WriteLine ( “ darajada 2 “ Q iQ “ teng “ Qresult ); Bu dasturning natiyjasi kuidagicha if operatori Siz tanlagan holda dasturning biror Qismini shartli if operatori yordamida bajarishingiz mumkin. Bu operator boshQa ixtiyoriy tildagi if operatoriga juda yaQin. Xususan, sintaksis bo’yicha S, CQQ va Java tillaridagi if operatori bilan bir xil. Uning eng oddiy ko’rinishi Quyida tasvirlangan: if (shart) opera tor ; Bu yerdagi shart—true yoki false Qiymat oluvchi mantiQiy ifoda. Agar shart rost bo’lsa operator bajariladi, agar shart yolg’on bo’lsa unda operator tushirib Qoldiriladi. Shartli if operatorini ishlatilishiga misol keltiramiz: if(10 < 11) Console.WriteLine("10 kichik 11 dan"); Bu holda 10 soni 11 ga Qaraganda kichik (shartli ifoda rost), natijada WriteLine () ; operatori bajariladi. Misol : if(10 < 9) Console.WriteLine("Bu satr ekranga chiQarilmaydi"),1. S# da butunsonli berilganlar tipi uchun int kalit so’zi ishlatiladi 2. double — bu Qo’zg’aluvchi nuQtali ikkilangan aniQlikdagi berilganlar uchun ishlatiladigan kalit so’zi. 3. Yo’Q. Lekin bu Qulay. Bu holda 10 raQami 9 raQamidan katta bo’lganligi sababli WriteLine O; operatoriga murojaat Qilinmaydi. S# da shartli ifodalarda ishlatilishi mumkin bo’lgan taQQoslash operatorlari komplekti mavjud. Quyida shu operatorlar va ularning Qiymatlari tavsiya etiladi. Operator Tasvir < Kichik > Katta >q Katta yoki teng q q Teng !q Teng emas Aytib o’tamizki, teng operatori ikkita tenglik belgisidan tashkil topar ekan. Quyida if operatorining bajarilishini ko’rsatadigan dastur tavsiya etiladi: G’G’ Dasturda if operatorining bajarilishi namoyish etiladi. using System; class IfDemo { public static void Main() { int a, b, c; a q 2; b q 3; if(a < b) Console.WriteLine("a o’zgaruvchining Qiymati "Q " b o’zgaruvchining Qiymatiga Qaraganda kichik."); G’G’ Parametr sifatida keltirilgan G’G’ navbatdagi WriteLineO usulidagi satr ekranga chiQarilmaydi if (a q q b) Console.WriteLine ("Bu satr ekranga chiQarilmaydi."); if operatorining ishlatilishi. Console.WriteLine () ; s q a - b; G’G’ s o’zgaruvchiga -1 Qiymat o’zlashtiriladi. Console.WriteLine("s o’zgaruvchi-1 Qiymatni saQlaydi. "); if(s >q 0) Console.WriteLine("s o’zgaruvchining Qiymati- "Q "manfiy bo’lmagan son."); if(s < 0) Console.WriteLine("s o’zgaruvchining Qiymati- " Q " manfiy son."); Console.WriteLine(); s q b - a; G’G’ s o’zgaruvchiga 1 Qiymat o’zlashtiriladi. Console.WriteLine("s o’zgaruvchi 1 Qiymatni saQlaydi. "); if (s >q 0) Console.WriteLine("s o’zgaruvchining Qiymati- " Q " manfiy bo’lmagan son."); if(s < 0) Console.WriteLine("s o’zgaruvchining Qiymati- " Q " manfiy son."); Bu dastur ishlaganda ekranga Quyidagi satrlar chiQadi: a o’zgaruvchining Qiymati b o’zgaruvchining Qiymatiga Qaraganda kichik. s o’zgaruvchi -1 Qiymatni saQlaydi. s o’zgaruvchining Qiymati –manfiy son. s o’zgaruvchi 1 Qiymatni saQlaydi. s o’zgaruvchining Qiymati –manfiy son emas. E’tibor bering, dasturning satrida bir-biridan vergul bilan ajratilgan uchta o’zgaruvchi e’lon Qilinyapti: int a, , s; Aytib o’tilganidek, agar kerak bo’lsa bir xil turdagi ikki yoki undan ortiQ o’zgaruvchilar bitta operatorda e’lon Qilinishi mumkin. Buning uchun o’zgaruvchilarning nomlarini vergul bilan ajratish lozim. Switch-operatori. O’tish operatorlari. Operator goto. break, continue operatorlari. Sikl operatorlari. operator for, while sikli, foreach sikli. for sikli Siz Qandaydir kod (blok) lar ketma-ketligini bir necha marta bajarishingiz mumkin, va bunga sikl deb aytiladi. Bu bo’limda biz for siklini ko’ramiz. S# da bu sikl xuddi S, CQQ va Java dagiday ishlaydi. for siklining eng oddiy sintaksisi: for(initsializatsiya, shart, iteratsiya) operator; Siklning initsializatsiyasi javob beradigan Qismi umumiy Qabul Qilingan shaklda sikl o’zgaruvchisiga biror boshlang’ich Qiymatni beradi. Shart sikl o’zgaruvchisini tekshiradigan matiQiy ifoda hisoblanadi. Agar mana shu ifodaning natijaviy Qiymati true bo’lsa, sikl bajarilishi davom etadi, agar u yolg’on bo’lsa sikl yakunlanadi. Iteratsion ifoda esa sikl o’zgaruvchisining har bir siklning bajarilishidagi o’zgarishini ifodalaydi. for siklining ishlatilishi Quyidagi QisQa dasturda namoyish Qilinadi : G’G’ for siklining ishlatilishini namoyish Qilinadigan dastur. using System; class ForDemo { public static void Main() { int count; for(count q 0; count < 5; count q countQ1) { int num q count Q1; Console.WriteLine(" Bu siklning " Q num Q "- o’tish."); ) Console.WriteLine("Sikl tugadi."); Quyida bu dasturning bajarilish natijasi ko’rsatilgan: Bu siklning 1- o’tishi. Bu siklning 2- o’tishi. Bu siklning 3- o’tishi. Bu siklning 4- o’tishi. Bu siklning 5- o’tishi. Sikl tugadi."); Bu misolda count sikl o’zgaruvchisi bo’lib hisoblanadi. Dastlab for siklining initsializatsiyasida unga nol Qiymat beriladi. Siklning har bir takrorlanish boshida (birinchisi ham kiradi) count < 5 shartini tekshirish bajariladi. Agar shart rost bo’lsa, u holda writeLir.e() operatori bajariladi, so’ngra siklning iteratsion Qismi a zatem initsializatsiya Qilinadi (ya’ni count o’zgaruvchisiga yangi count Q i ga teng bo’lgan Qiymat beriladi). Bu jarayon toki sikl o’zgaruvchisining Qiymati shartni Qanoatlantirmaguncha takrorlanaveradi. Shu paytdan boshlab siklning bajarilishi to’xtatiladi. Dasturdagi nun o’zgaruvchisi chiQarilayotgan satrlarning sikl bo’yicha o’tishlari raQami noldanmas, birdan boshlanishi uchun kiritilgan. Amalda professional tarzda yozilgan S# dasturda siz oldingi misolda yozilganidek siklning iteratsion Qismini uchratmaysiz. YA’ni, Quyida keltirilganiga o’xshash for siklida juda kam uchraydi. count q count Q 1; Sababi shundaki, S# da, o’zgaruvchining dastlabki Qiymatini birga ancha samarali oshiradigan maxsus inkrement degan operator bor. Bu operator ikkita Qo’shish belgisi (QQ) bilan belgilanadigan operatordir. YUQorida keltirilgan for siklining iteratsion Qismi inkrement operatori yordamida Quyidagicha yoziladi: countQQ; Shunga ko’ra for siklining to’liQ ko’rinishi Quyidagicha bo’ladi: for(count q 0; count < 5; countQQ) U xuddi oldingidek aniQ ishlaydi. Shuning bilan bir Qatorda S# da ikkita minus belgisi (--) bilan ishlatiladigan dekrement operatori ham bor. Bu operator o’z operandini bittaga kamaytirish uchun ishlatiladi. Bir daQiQalik amaliyot. 1. if operatori Qanday aytiladi ? 2. for operatori Qaysi operatorlarga kiradi? 3. S#da Qanday taQQoslash operatorlari bor? Kod bloklaridan foydalanish S# tilining yana bir kalit elementlaridan biri kod bloki bo’lib hisoblanadi. Kod bloki deb, ikki yoki bir necha operatorlarning figurali Qavslarga olib yozilishiga aytiladi. Kod blokini hosil Qilgach, u mantiQiy elementga aylanadi, va uni bitta operator singari ishlatish mumkin bo’ladi. Blok - if va for operatorlarida ishlatilishi mumkin. Quyidagi kod fragmentini ko’ramiz: if (w < h) ( v - w * h; w -q 0; } 1. if — bu shartli operator. 2. for kaliti sikl operatoriga tegishli. 3. S# da Quyidagi taQQoslash operatorlari mavjud: , >q, qq, ■ q. Agar bu if operatorida w ning Qiymati h o’zgaruvchining Qiymatiga nisbatan kichik bo’lsa, u holda blok ichidagi har ikkala operator ham bajariladi. YA’ni modomiki operator tubi blok ichida mantiQiy birni shakllantirar ekan, bitta operator boshQasi bajarilmasdan turib bajarilmaydi. Bu shuni ko’rsatadiki, agar sizga ikkita operator orasida mantiQiy bog’liQlik kerak bo’lsa , siz ularni blokka olishingiz kerak bo’ladi. Kod bloklari ko’pgina algoritmlarni tushunarli va yuQori samaradorlik bilan bajarishlariga imkon beradi. Quyidagi dasturda kod blokidan foydalanib nolga bo’lish imkonlarini yo’Qotish tasvirlangan: G’G’ Dasturda kod blokidan foydalanish namoyish Qilinadi using System; class BlockDerao ( public static void Main() ( int l, j, d; i q 5; j - 10; G’G’ Bu kod bloki if operatoriga tegishli ". if(i !q 0) ( Console.WriteLine("i o’zgaruvchining Qiymati nolga teng emas."); d q j G’ i; Console.WriteLine(" jG’i teng " Q d); Professional javoblari Savol. Kod blokidan foydalanish dasturning samaradorligiga ta’sir Qiladimi (ya’ni uning bajarilish vaQti oshib ketmaydimi)? Javob. Kod blokidan foydalanish dasturning bajarilish vaQtini oshirmaydi. Modomiki ular ma’lum bir algoritmlarning kodlanishini soddalashtirar ekan, ularning ishlatilishi Qoida bo’yicha dasturning bajarilish tezligini va uning samaradorligini oshiradi. Bu dasturning bajarilish natijasi Quyida keltirilgan : i o’zgaruvchining Qiymati nolga teng emas. jG’i teng 2 Dasturdagi if operatoriga bitta operator emas, balki kod bloki to’g’ri keladi. Agar if operatori bilan boshQariladigan shart rost bo’lsa (xuddi hozirgi holatdagidek), unda blokdagi barcha uchta operator ham bajariladi. i o’zgaruvchiga 0 Qiymatni berib, natijaning Qanday bo’lishini ko’ring. Keyinchalik kod bloklarining Qo’shimcha xossalari va Qo’llash usullari borligini ko’rish bilan birga, ularning asosiy vazifasi mantiQiy bo’linmaydigan kod birligini tuzishdan iboratdir NuQta vergul belgisi va pozitsiyalashtirish S# da simvol nuQta vergul belgisi operatorning tamom bo’lganligini ifodalaydi. YA’ni har bir alohida operator nuQta vergul belgisi bilan tugallanishi lozim. Ma’lumki, blok mantiQan bog’liQ bo’lgan figurali Qavs ichiga olingan operatorlarning dastasi bo’lib hisoblanadi, shuning uchun uni nuQta vergul belgisi emas, balki yopiladigan figurali Qavs yakunlaydi. S# satrning tugashini operatorning tugallanishi deb aniQlamaydi, faQat nuQta vergul belgisigina operatorni tugallashi mumkin. Shu sababli nuQta vergulni satrning Qaeriga joylashtirishning farQi yo’Q. Masalan, S# satrlari uchun x q u; u q u Q 1; Console.WriteLine(x Q " " * u); kodi Quyidagi x q u; u q u Q 1; Console.WriteLine(x Q " " Q u); satr bilan bir xil ma’noga ega bo’ladi. Bundan tashQari, operatorning alohida elementlari ham har xil satrlarda joylashishi mumkin. Masalan, Quyidagi joylashish o’rinli: Console.WriteLine("Bu satr chiQarishda ancha ko’p joyni g’p" Q "egallaydi, chunki u berilganlardan tashQari '' Q x Q y Q z Q "g’p yana uchta satrli literlardan ham tashkil topgan."); Bunday uzun satrlarni bo’lish usuli dasturni o’Qilishini yaxshilash uchun ishlatiladi. Shuning bilan birga bu satr chiQrilganda Qanday ko’rinishga ega bo’lishini ko’rish mumkin. Chekinishlardan foydalanish Siz ehtimol payQagan bo’lsangiz kerak, oldingi misollarda ba’zi bir operatorlar chekinishlar bilan yozilgan edi. S# tili kodni kiritishda (operatorlarni kiritishda) har xil chekinishlarning Qo’llanilishi, yoki ularning Qo’llanilmasligi dasturning ishlash Qobiliyatiga ta’sir ko’rsatmaydi. Ammo dastur yozishning umumiy Qabul Qilingan ko’rinishi mavjud ekan, Qaysiki bu kitob ham unga amal Qiladi, sizga ham unga rioya Qilishingizni maslahat beramiz. Buning uchun kodni kiritishda har bir ochilgan Qavsdan so’ng chekinish Qilish kerak (yuQoridagi satr boshiga nisbatan 2-3 ta probel) va aksincha har bir yopilgan Qavsdan so’ng orQaga Qaytish kerak. Qo’shimcha chekinish ko’zda tutilgan operatorlar bundan mustasno bo’lib, ular keyinroQ sanab o’tiladi. Bir daQiQalik amaliyot. 1. Kod blokini Qanday tuzish kerak? 2. S#da operatorlar Qanday yakunlanadi? 1. S#da barcha operatorlar bitta satrda boshlanishi va tugallanishi kerak degan tasdiQ to’g’rimi? 1. Operatorlar ketma-ketligi ochilgan ({) va yopilgan (}) figurali Qavslar ichiga joylashtiriladi. Blok mantiQan kod birligini tashkil Qiladi. 2. S# da operatorlar nuQta vergul belgisi bilan tugallanadi. 3. Yo’Q. 2-Qism. Operatorlar va Qiymatlar tipi. S# Qiymatlar tipi bazasi Literallar va ulardan foydalanish Tuzilgan o’zgarishlarni aniQlash O’zgaruvchilarni ko’rish Qismi Arifmetik operatorlar Logik va taQQoslangan operatorlar O’zlashtirish operatorlari Nusxa keltirish operatsiyasi va aniQ va aniQmas Qiymatlar tipini o’zgartirish. S# ni ifoda Qilish Ma’lumotlar tipi va operatorlar xar kanday dasturlash tillarining asosini tashkil kiladi. Bu elementlar dasturlash tilining imkoniyatlarini va ishlatilishi mumkin bulgan masalalar darajasini belgilab beradi. S# juda kup ma’lumotlar tipi va operatorlarni kabul kiladi, bu esa uni kupchilik dasturlash masalalarini yechishga kulay kiladi. Ma’lumotlar tipii va operatorlarni kurib chikish uchun juda kup vakt talab kilinadi. Bu bobda biz asosiy ma’lumotlar tipi va nisbatan kuprok ishlatiladigan operatorlar xakida, shuningdek uzgaruvchilar va vo’rajeniyalar xakida batafsil ma’lumot beramiz. S# Ma’lumotlar tipilari ustidan kat’iy nazorat S# - ma’lumotlar ustidan kat’iy nazorat urnatilgan dasturlash tili. Bu S# dagi barcha amallar ma’lumotlar tipining mosligiga kompilyator tomonidan nazorat kilinishini bildiradi. Agar amallar mosligi bajarilmasa, ular kompilyatsiya kilinmaydi. Bunday ma’lumotlar tipi ustidan kat’iy nazorat xatolarni oldini olishga yordam beradi. Nazoratni amalga oshirish uchun barcha uzgaruvchilarga, xisob natijalariga va kiymatlarga anik bir tip beriladi(YA’ni anik tipga ega bulmagan uzgaruvchi mavjud emas). Kiymat tipi uning ustidan bajarilishi mumkin bulgan amallarni aniklab beradi. Bir ma’lumotlar tipi uchun ruxsat etilgan amallar, boshkasi uchun takaklangan bulishi mumkin. Ma’lumotlarning oddiy tipi S# kiritiladigan ma’lumotlar tipining ikki turini uz ichiga oladi oddiy(yoki soda) va murojat etuvchi tiplar. Murojat etuvchi tiplar sinfi xakida biz keyinchalik tuxtalib utumiz. S# yadrosiga kiruvchi un uch oddiy tip 2.1 jadvalida kursatilgan Tip Tavsifi Bool Kiymatlari TrueG’False (xakikatG’yolgon) Byte 8 bitli belgisiz butun son Char Belgi Decimal Iktisodiy xisoblashlar uchun sonli tip Double SuzuvchiG’kuchuvchi(S plavayuhey tochkoy) nuktali ikkilangan aniklikdagi son Float SuzuvchiG’kuchuvchi(S plavayuhey tochkoy) nuktali birlamchi aniklikdagi son Int Butun son Long Uzun son Sbyte 8 bitli belgili butun son Short Kiska butun son Uint Belgisiz butun son Ulong Belgisiz uzun butun son Ushort Belgisiz kiska butun son S# da xar bir ma’lumotlar tipi uchun kiymatlar diapazoni va ular ustidan bajarilishi mumkin bulgan amallar katiy muvofiklikda belgilangan. Shunga muvofik kuchish talablari bu muvofikliklarning bajarilishini katiy nazorat kiladi. Masalan, int tipi dasturning ixtiyoriy bajarilish muxiti uchun bir xil, shuning uchun xar bir platformaga muvofiklashtirish uchun kodni boshkatdan yozishning xojati yuk. Katiy muvofiklashtirish kuchishni amalga oshirish uchun kerak, ammo bazi platformalarda uncha katta bulmagan ishlab chikarishdagi yukotishga olib kelishi mumkin. Butun sonlar tipi S# da tukkiz turdagi butun sonlar tipi belgilangan: char, byte, sbyte, short, ushort, int, uint, long va ulong. Char tipi asosan belgilar takdimoti uchun ishlatiladi, va shu bobda keyincha tavsiflanadi. Kolgan sakkiz tip sonlar ustidan amallar bajarish uchun ishlatiladi. Kuyidagi jadvalda ushbu sakkiz tipga mvofik ajratiladigan xotira xajmi va yul guyiladigan kiymatlar diapazoni kursatilgan. Tip nomi Bitlar soni Kiymatlar chegarasi Byte 8 0 dan 255 gacha Sbyte 8 -128 dan 127 gacha Short 16 -32768 dan 32767 gacha Ushort 16 0 dan 65535 gacha Int 32 - 2147483648 dan 2147483647 gacha Uint 32 0 dan 4294967295 Long 64 -9223372036854775808 dan 9223372036854775808 gacha Ulong 64 0 dan 18446774073709551615 gacha Jadvaldan kurinib turibdiki S# da xam belgili, xam belgisiz butun sonlar varianti kursatilgan. Ular orasidagi fark butun sonning yukori bitini interpritatsiya kilish uslubida. Belgili butun son kursatilganda butun sonning yukori bitni belgi bayrogi sifatida interpritatsiyasi kuzda tutilgan kodni generatsiya kiladi. Agar bayrok 0 belgili bulsa, bu musbat son, agar 1 bulsa, bu manfiy son. Manfiy sonlar deyarli xar doim ikkilangan tuldirish metodini ishlatish bilan kursatiladi. Bu metodda sonning barcha bitlari(belgi bayrogidan tashkari) invertlanadi, sung bu songa bir kushiladi, eng sungida belgi bayrogiga 1 kiymati beriladi. Belgili butun sonlar kupgina algartmlar uchun juda muxim, lekin ular mos belgisiz butun sonlarning absolyut kismining fakat yarmigagina ega. Masalan, short 32767 tipidagi soni ikkilik sanok tizimi kurinishida yozaylik: 01111111 11111111 Bu belgili tip bulgani uchun yukori bitga 1 kiymati berilganda -1(agar ikkilangan tuldirish usulidan foydalanilsa) sifatida interpritatsiya kilinadi. Ammo uni ushort tipida e’lon kilinsa, unda yukori bitga 1 kiymati berilganda son 65535 sifatida interpritatsiya kilinadi. Eng kup ishlatiladigan butunsonli tip – bu int. Int tipi uzgaruvchilarini sikllarni boshkarish, massivlarni indeksatsiyasida va turli matematik xisoblashlarda ishlatiladi. S# da Int tipidagi sonlardan katta sonlar unit, long, ulong tiplarida, belgisiz butun sonlar bilan ishlaganda esa unit tipi ishlatiladi. Belgili katta kiymatlar uchun long tipi, undan xam katta musbat sonlar (belgisiz butun sonlar) uchun – ulong tipi ishlatiladi. Kuyida tomoni uzunligi 1 milga teng bulgan kub xajmini xisoblash(dyuymlarda) dasturi kursatilgan. Bu kiymat yetarli darajada katta bulgani uchun uning saklanishga dastur long tipi uzgaruvchisini ishlatadi. G’* dastur tomoni uzunligi 1 milga teng bulgan kub xajmini xisoblaydi(dyuymlarda) (ma’lumot uchun: 1 milda – 5280 fut, 1 futda – 2 dyuym bor) *G’ Using system; class inches { public static void Main {}{ Long ci; Long im; im q 5280*12; ci q im*im*im; Console. WriteLine(“tomoni uzunligi 1 milga teng bulgan kub xajmi” Q ci Q “ga teng.”); } } Kuyida bu dastur natijalari kursatilgan. tomoni uzunligi 1 milga teng bulgan kub xajmi 254358061056000ga teng. Bunday natija int yoki uint tipidagi uzgaruvchiga sigmasligi anik kurinib turibdi. byte va sbyte – eng kichik butun sonlar tipi. byte tipi kiymati 0 dan 255 gacha bulgan oralikda joylashishi mumkin. Byte tipi uzgaruvchilari biror tuzilmada generatsiya kilingan malumotning baytlar okimi kabi kayta ishlanmagan ikkilangan ma’lumotlar bilan ishlashda juda kul keladi. Uncha katta bulmagan belgili butun uzgaruvilarida sbyte tipi ishlatiladi. Kuyida kursatilgan dasturda 1dan 100 gacha bulgan barcha butun sonlarning yigindisi xisoblanayotgan for siklini nazorat kilish uchun byte tipi uzgaruvchisi ishlatiladi. G’G’ byte tipining ishlatilishi Using system; class Use_byte { public static void Main {}{ byte x; int sum; sum q 0; for(x q 1; x 1); sum – sum Qx; Console. WriteLine(“1dan 100gacha bulgan butun sonlar yigindisi” Q sum); } } Bu dasturning natijasi kuyidagicha: 1dan 100gacha bulgan butun sonlar yigindisi 5050 Ushbu dasturda for siklini nazorat kilish uchun byte tipi kiymatlar oraligiga kiruvchi 1dan 100gacha bulgan sonlar ishlatilgani sababli kattarok sonlar bilan ishlash imkonini beruvchi boshka tiplarni belgilashga xojat yuk. Uzgaruvchiga tugri tipni belgilash va tizim zaxirasin tejash maksadida yukorida keltirilgan jadvaldan foydalaning va uzgaruvchi kiymati kanoatlantiradigan tiplarning oraligini tanlang. Suzib yuruvchi nuktali ma’lumotlar tipi 1 bobda aytilganidek suzib yuruvchi nuktali ma’lumotlar tipida kasr kismi mavjud bulgan sonlar kursatiladi. S# da suzib yuruvchi nuktali ikki tip mavjud, float va double, mos ravishda birlamchi va ikkilangan aniklikdagi sonlarni kursatadi. float tipiga 1.5E-45 dan 3.4EQ38 gacha bulgan 32 bit ajratiladi. double tipiga ishlatilishi mumkin bulgan sonlar oraligini 5E-324 dan 1.7EQ308 gacha kengaytiruvchi 64 bit ajratiladi. Kuprok double tipi ishlatiladi. Buning sabablaridan biri S# kutubxonasidagi matematik funksiyalar double tipiga ega bulgan kiymatlarning ishlatishidir. Masalan System. Math. standart sinfida aniklangan Sqrt() usuli double kiymatli argumentni uning kvadrat ildizini xam double kiymatiga kaytaradi. Kuyida misol tarikasida ikki katet uzunligi bilan berilgan gipotinuza uzunligini xisoblash uchun Sqrt() usuli kullangan. G’* Dasturda gipotenuza uzunligini ikki katet uzunligi orkali topish imkonini beruvchi Pifagor teoremasidan foydalanilgan *G’ Using system; class Hypot { public static void Main {}{ double x, y, z; Sqrt() усулининг чакирилишига этибор беринг. Усул номи у тегишли булган номдан нукта билан ажратилган. xq3; yq4; zqMath.Sqrt(x*xQy*y) Console. WriteLine(“Gipotinuza uzunligi ” Q z); } } YUkoridagi dastur natijasi : Gipotinuza uzunligi 5 Bu dasturning yana bir tomonini aytib utish kerak. YUkorida aytilganidek Sqrt() usuli Math. Sinfiga mansub. Usul nomi u tegishli bulgan nomdan nukta bilan ajratilganligiga etibor bering. Bu kabi yozuvni WriteLine() usulidan oldin Console sinfining nukta bilan ajratilganda kurgan edik. Barcha usullarni xam oldin ular tegishli bulgan sinf nomini kursatgan xolda chakirilishi shiart emas, lekin bazilariga aynan shunday murojat kilish shart. Decimal tipi S# ning eng kizikarli sonli tipi pul xisob-kitobida ishlatiladigan decimal tipi bulsa kerak. Decimal tipida 1E-28 dan 7.9EQ28 gacha bulgan oralikdagi kiymatlarga 128 bit ajratiladi. Suzib yuruvchi nutali sonlar ustidan arifmetik xisoblash olib borilganda kiymatlarni birnecha marta yaxlitlash uncha anik bulmagan natijani beradi. Decimal tipi yaxlitlashdagi xatoliklarni tugirlaydi, va sonlarni unning 28 darajasi aniklikda kursatadi. Unlik xonalarni yaxlitlashda bexato kursatish imkoniyati ayniksa iktisodiy xisoblashlarda kul keladi. Misol tarikasida pul xisob-kitobida decimal tipidan foydalangan dasturni kurib chikamiz. Dastur foizlar utkazilganidan sung balans xisobini oladi. Mutaxassis javoblari! Savol: Oldinlari kupkina tillar bilan ishlaganman, lekin xech kaysi birida Decimal tipini uchratmaganman. Bu tip fakat S# ga xosmi? Javob: Xa, bu tip fakat S#ga xos bulib SQQ,S yoki Java tillarida mavjud emas. Shu urinda Decimal tipidagi uzgarmaslardan sung m yoki M kushimcha tarzda yozilishi kerak. Aks xolda ular Decimal tipiga tugri kelmaydigan suzib yuruvchi nuktali uzgarmaslar deb kabul kilinadi. Belgilar Boshka dasturlash tillaridan farkli ravishda (SQQ kabi, belgilarni e’lon kilishda 8 bit ajratiladi, bu esa 255 belgi bilan ishlash imkonini beradi.) S# da butun Dunyu tillarida ishlatiladigan belgilar tuplami kiritilgan Unicode belgilarning standart majmui ishlatiladi. S# da char- 16 bit ajratiladigan belgisiz tip, bu esa 0 dan 65535 gacha bulgan oralikdagi kiymatlar bilan ishlash imkonini beradi(ya’ni, 65535 belgi bilan ishlash). 8 bitli ASCII belgilar majmui Unicode ning tarkibini tashkil kiladi va 0 dan 127 gacha bulgan oralikda joylashgan. Shunday kilib ASCII belgilari Unicode da xam saklanib kolgan. Belgili kiymatni uzgaruvchiga uzlashtirish uchun uzlashtirish operatoridan ungda turgan belgini bittalik kushtirnok ichiga olish kerak. Kuyida ch uzgaruvchiga x kiymat uzlashtirish bajariladigan operatorlar sintaksisi berilgan. Char ch; Ch q ‘x’; Elgili kiymatni chikarish uchun Console.WriteLine() operatoridan foydalaniladi. Keyingi kator ch uzgaruvchining kiymatini chikaradi. Console.WriteLine(“ch uzgaruvchining kiymati - ” Q ch); Butun sonli tipdan shar ga avtmatik ravishda utish mvjud bulmagani uchun, S#da butunsonli tip deb aniklangan shar tipi sonlarni e’lon kilish uchun ishlatiladigan boshka butunsonli tiplar bilan uzaro moslashmaydi. Masalan, kodning keyingi kismi bajarilmaydi: Char ch; Ch q 10;G’G’ kod kismi xato yozilgan Buning sababi 10 butun son va Char tipiga avtomatik ravishda utkazilmaydi. Shundan kelib chikadiki, ushbu jarayonda tiplar uzaro moslashmaydi. Ushbu kodni kompilyatsiya kilganda kompilyator xato deb kursatadi. Keyinchalik shu bobda bu cheklovni kanday xal kilishni kurib utamiz. Mutaxassis javoblari! Savol: Nima uchun S# da Unicode dan foydalaniladi? Javob: S# ni yaratishda ishlab chikaruvchilar uz oldiga butun dunyoda ishlatilishi mumkin bulgan kompyuter tilini yaratishni maksad kilib kuygan. Shuning uchun ishlab chikaruvchilar dunyoning barcha tillari kiritilgan belgilarning standart majmuasi Unicode dan foydalanishgan. Tugri bu tilning ishlatilishi belgilari 8bitda kursatilishi mumkin bulgan ingliz, fransuz, olmon yoki ispan tillarida ishlatilishi uncha samarali emas, lekin bu dasturlarning global mikyosda utishi uchun tulanadigan xak. Bul tipi S#da bool – bul tipi uchun ikki kiymat aniklangan true va false (rost va yolgon) Demak bool tipidagi uzgaruvchi yoki mantikiy masala bu ikki kiymatdan biriga teng buladi. Bundan tashkari bool tipi kiymatlarini butunsonli tipga utkazishning imkoni yuk. Masalan 1 kiymati true yoki 0 kiymati false tarzida shakllana olmaydi. Bool tipi ishlatilishi kursatilgan dastur namunasini keltiramiz: G’G’ dastur bool tipi ishlatilishini kursatad Kuyida ushbu dastur natijasi keltirilgan b uzgaruvchisining kiymati false b uzgaruvchisining kiymati true (10>9) bu true Bul uzgaruchisining bazi bir xususiyatlariga etibor bering. Birinchidan, bool uzgaruvchisi WriteLine() orkali chikarilganda ekranda true yoki false suzlari chikarilmokda. Ikkinchidan, bool uzgaruvisini ishlatish bilan if operatorini boshkarish mumkin. Agar if operatori bajarilish sharti rostlik bulsa, unda if operatorini kuyidagicha yozish shart emas: if(b – true) Kiskarok yozish xam mumkin if (b) Uchinchidan < kabi takkoslash operatorlari natijasi bool tipi kiymatiga ega buladi. Shuning uchun xam 10>9 takkoslanishda ekranga true chikarilmokda. 10>9 yozilgan kushimcha kavuslar juftligi Q operatorining > operatoridan muximrok bulgani uchun kuyilgan. Minutli amaliyot! 1. Unicode nima? 2. bool tipi uzgaruvchisi kanday kiymatlarga ega bula oladi? 3. Char tipi ma’lumotlarining bitlardagi ulchovi kancha? Chikarishlarni formatlash. Ma’lumotlarning keyingi tipini kurib chikishdan oldin kichik tuxtash kilamiz. Shu paytgacha biz chikarilayotgan ma’lumotlar ruyxati kismlarini Q belgisi bilan aeratib kelardik: Console. WriteLine(“Gipotinuza uzunligi ” Q z); Bu kulay, lekin sonli ma’lumotlarni chikarishning bunday usuli ma’lumotlarning ekranda paydo bulishini nazorat kilishga imkon bermaydi. Masalan, suzuvchi nuktali kiymatlar unlik darajalarini nazorat kilish imkonini bermaydi. Keyingi operatorni kurip chikaylik: Console. WriteLine(“10G’3 ” Q100G’30); Mars bilan suhbat Mars bilan yer orasidagi masofa kamida 34 mlion mil. Biz bilan so’zlashish uchun marsga inson joulashtiramiz, maQsad shu masofada so’zlashish uchun Qancha vaQt ketishini bilish dasturini tuzish.yorug’lik tezligi 186000 milG’sek , tqsG’v signalni Qancha vaQtda yetib kelishini aniQlash uchun masofani yorug’lik tezligiga nisbatini olish kerak. VaQt birligi sekund va minutlarda hisoblanadi. Qadamli Qo’llanma 1. yangi fayl tuzing va nomlang.Vfrs. cs. 2. vaQt xabarini Qancha vaQtda kelishini aniQlang double distance; double lightspeed; double delay; double delay in min; 3. boshlang’ich o’zgaruvchi Qiymatini distance ba lightspeed bering distance q 34000000; G’G’34000000mil lightspeed q 186000; G’G’186000milG’sek 4. xabarning Qancha vaQtda kelganini bilish uchun distanceG’1-ghtspeed ni olish kerak. Delay q distance G’ lightspeed; Console. Writelene (Er bilan Mars orasidagi masofa n” Q delayQ “ sekund) 5. Agar natija minutlarda olingan bo’lsa sekundga aylantiring, Quyidagi kod orQali natijani ekranga chiQaring Delay_in_min q delayG’60; Console. Writelene (“Qdelay_in_min ”); Quyida Mars.cs. dasturining to’liQ Qismi keltirilgan G’* Using System; Class Mfrs { Public static void Main ( ) { Double distance; Double lightspeed; Double delay; Double delay_in_min; distance q 34000000; G’G’34000000 mil lightspeed q 186000; G’G’186000 milG’sek Delay q distance G’ lightspeed; Console. Writelene (Er bilan Mars orasidagi masofa n” Q delayQ “ sekund) Delay_in_min q delayG’60; Console. Writelene (“Qdelay_in_min ”); } } 65-bet. 6-7-8 noaniQ o’Qib bo’lmadi. 66-bet 16-birliklar Ba’zi dasturlarda o’nlik sanoQ tizimining o’rnida o’n oltilik tizimi, ya’ni 0 dan 9 va A da F gacha raQamlarni foydalanish Qulaydir. Bunda F va F gacha harfiy belgilaga mos ravishda 10 dan 15 gacha sonli Qiymat Qabul Qiladi. M: o’n oltilikdagi 10 soni o’nlikda 16 ga teng bo’ladi. O’n oltilik sonlarning ko’p ishlatilishini hisobga olgan holda, S# da o’n oltilik sonlarni ustun sonli formasida ishlaydi. O’n oltilik literallari OX velgisidan boshlanishi lozim. Misollarda ko’gib chiQamiz. Count – 0xFF; G’G’ 255 O’nlik sanoQ tizimida Incr – 0xla; G’G’ 26 O’nlikda. Belgili escape – ketma-ketliklar S# dagi ko’pchilik kiritiluvchi usuldagi o’zgaruvchilar Qavs ichiga olinadi. Ammo ayrim belgilarni Qo’llashda muammoli bo’ladi. Bundan tashQari belgi Qismi S# da maxsus Qiymatli bo’ladi. Qruning uchun ularni to’g’ridan- to’g’ri ishlatib bo’lmaydi. Ana shunday sabablarga ko’ra S# da shunday muammolarni hal Qilish uchun 2.2 jadvalda keltirilgan escape – ketma – ketliklar ishlatiladi. Bu ketma-ketliklar ajratilgan belgilar o’rnida Qo’llaniladi. M: tabulyatsiya belgisi Quyidagi o’zgaruvchilar yordamida o’zlashtiriladi. Ch-‘g’t’; Shu urda Ch- o’zgaruvchisi -‘g’t’ , birlik Qo’shtirnoQ ichiga olinadi. 2.1 jadavl. escape – ketma-ketliklar g’a ogohlantirish (Qo’ng’iroQ) g’b bir o’ringa Qaytish (backspace) g’t yangi sahifaga o’tish (formfeed) g’n yangi Qatorga o’tish(linefeed) g’r karetkani Qaytarish(enter) g’t gorizontal tabulyatsiya g’v vertikal tabulyatsiya g’0 nol g’’ birlik Qo’shtirnoQ g’” ikkilik Qo’shtirnoQ g’g’ teskari QiyshiQ chiziQ Matnli literallar S# da yana bir turli literallar- integrali, ya’ni ikkili Qo’shtirnoQ olinadi. Quyuda ularga misollar keltiramiz; “kichik tekshiruv matn” Siz bundau ko’rinishdagi satrli (matinli) WriteLine ( ) byrug’ida ko’rib chiQQansiz. Bundan tashQari matnli literallar bir va birnecha escape – ketma-ketliklardan iborat bo’lishi mumkin. Using System; Class StrDemo Public stat_c vo_d Na n ( ) Console WriteLine (Birinchi Qator , Ikkinchi Qator) Console WriteLine (“Ag’Bg’C”); Console WriteLine (“Dg’Eg’U”); } } Ushbu dastur Quyidagi matn satrlarni chiQaradi. Birinchi Qator Ikkinchi Qator AVS D ye U O’zgaruvchilar va ularni aniQlash O’zgaruvchilar Quyidagi operatorlarda tavsiflanadi: type, var type - o’zgaruvchining turi (tipi) var -har Qanday haQiQiy sonli o’zgaruvchituri. o’zgaruvchilar yordamida imkoniyatga mos keluvchi o’zgaruvchilar tipi yaratiladi. S# dagi varcha o’zgaruvchilar ularning Qo’llashdan oldin yaratilib olinishi lozim. Bizga esa kompyurerga o’zgaruvchilar Qanday imkoniyatli va Qanday Qiymatlar Qabul Qilinishini oldindan ko’rsatish kerak bo’ladi. S# da bir necha har xil tipli o’zgaruvchilar mavjud. O’zgaruvchilarni aniQlab olish (aniQlashtirish). O’zgaruvchilarni ishlatishdan oldin ularni dasturdagi o’rnini aniQlashtirib olish lozim bo’ladi. Dinamik aniQlashtirish S# da dinamik o’zgaruvchan har - Qanday ifodalarni aniQlashtirish mumkin. M: silindr hajmini berilgan radius va balandligi asosida topish dasturini kiritilgan: g’g’ demonstratsiya Qilish dasturi g’g’dinamik o’zgaruvchilarni aniQlashtirish Us_ng Syster; Class Dynlnit Public stalic voia Marn ( ) Doudlic radius -4 , height – 5; g’g’ dinamik o’zgaruvchining aniQlashtirish volure double vo_ume – 3.14.16. rad_us * he_qha; Console. Writeline (silindr hajmi “-volumel”); Ushbu dasturda uchta lokal o’zgaruvchi – radius, height va volumel Qatnashadi.birinchi ikkitasi ani topshiriQlar, silindir hajmi Qatnashgan o’zgaruvchi dinamik aniQlashtiriladi. O’zgaruvchili vaQt hayoti va ko’ginish Qismi Shu vaQtgacha biz ko’rgan hamma o’zgaruvchi metodi bilan berilgan. Lekin S# da o’zgaruvchili lokal va ichki blokni aniQlash mumkin. 1-bo’limdagi blok figunali Qavslar ichida keltirilgan. U berilgan blokning Qism blogidagi elon Qilingan o’zgaruvchilarumumiy ko’rinishini ifodalaydi. S# da aniQlanayotgan maydon parametrlari maydon tarkivida o’z ifodasini topgan. Kuzatish natijasida o’zgaruvchilardan foydalanish malum miQdorda himoyalangan. AniQlanayotgan maydon bo’ysinuvchi bo’lishi mumkin. YAngi yaratilayotgan blok Qism bloklarni o’z ichiga oladi. Bu shuni ifodalaydiki tashg’i blok ichki bloklar xususiyati bilan o’xshash bo’ladi. Bu tushunchalar Quyidagi dasturda o’z aksini topgan. using System clfss ScopeDeno public static vold Main ( ) int x, G’G’ x o’zgaruvchili kod G’G’ Main ( )da Qilinga metod X, LC If(x-10), G’G’ yangi tuzilgan blok Nt (y -20) G’G’ ramkali o’zgaruvchi blok Conso e Woirtelino ( QxQ Qy) X y 2, Consoio WoirLane } } Ko’rsatmalarda ifodalanishicha, o’zgaruvchilar if blogida e’lon Qilingan. U-100 ning o’z blokida xotolik berishi ko’rsatmada keltirilgan. Agar ko’rsatma o’chirilsa kampulyatsiya vaQtida xatolik yuz beradi. If blokida foydalanilgan o’zgaruvchilar ichki aniQlanayotgan maydondan tashQi maydonga foydalanish uchun imkoniyati belgilanishi zarur. AniQlanayotgan maydondan olingan o’zgaruvchilar berilgan maydonda mavjudligiga etibor berish kerak. O’zgaruvchi maydondan chiQayotganda Qiymatni saQlayotganini anglatadi. Shuningdek o’zgaruvchi blokdan chiQayotganda avvalgi Qiymatni yo’Qotadi. O’zgaruvchi navbatdagi blokka kirayotganda Qiymatni o’zgartirilganligini ko’rishi mumkin, Quyidagi dasturda o’z aksini topgan. Using System: Class VarInitDemo { Public static void Main () { int x: for (x-0: x int yq-1; G’G’ o’zgaruvchi blokka kirishdan lodin har safar o’zgartiriladi. Consoie. Writeline (o’zgaruvchining Qiymati “ Q u teng bo’ladi) G’G’ hamma vaQt -1 Qiymat kiradi. U – 100; Console.WriteLine (o’zgaruvchining Qiymati “ Qu ga teng); } } } Quyida ushbu dasturning bajarilishi ko’rsatilgan: O’zgaruvchining Qiymati : 1 teng Endi o’zgaruvchining Qiymati : 100 ga teng O’zgaruvchining Qiymati : -1 teng Endi o’zgaruvchining Qiymati : 100 ga teng O’zgaruvchining Qiymati : 1 teng Endi o’zgaruvchining Qiymati : 100 ga teng For sikli ichida o’zgaruvchining Qiymati 100 ga tenglansa yikl yakunlanganligini anglatadi. S#va S da aniQlanayotgan maydonlar bilan ishlash farQini ko’rish mumkin. Blokda Qism blok va undagi o’zgaruvchi ichki maydonda e’lon Qilingan bo’lsa, u asosiy blok uchun o’zgaruvchi sifatida foydalanilmaydi. Quyidagi dasturda ikki o’zgaruvchini bir noma’lum bilan e’lon Qilingan; Using System; Class NestVar { Public static vold Main ( ) { Int count; For(count – 0; count < 10; count q count Q1); Console. Writeline (sikl nomeri “ Qcount); Int count;G’G’ buni e’lon Qilish shart emas ‘ ! ‘ For (count q 0; count < 2; count Q1) Cjnsole. Writeline (“dasturda xatolik bor”); } } } Operatorlar S# da juda ko’p operatorlar mavjud. Operatorlar spesifik matematik yoki mantiQiy operatsiyani bajarilishi kerakligi to’g’risidagi ma’lumotni kompilyatorga yetkazib beruvchi amal xisoblanadi. S# da to’rtta asosiy operatorlar (arifmetik, pobitli, mantiQiy, va tenglovchi operatorlar) va bir necha Qo’shimcha operatorlar mavjud bo’lib, ular turli xolatlarda Qo’llaniladi. Mazkur bo’limda arifmetik, mantiQiy va tenglovchi operatorlar xaQida so’z yuritiladi. Bulardan tashQari, shuningdek o’zlashtiruv operatorlari xaQida xam ma’lumotlar berilgan. Bitma-bit asosidagi va boshQa operatorlar xaQidagi ma’lumotlar esa keyinroQ beriladi. Arifmetik operatorlar S# da Quyidagi arifmetik operatorlar aniQlangan Operator Ma’nosi Q Qo’shuv - Ayirish (unitar minus) * Ko’paytirish G’ Bo’lish Modul bo’yicha olish (QoldiQ) Q Inkrement - Dekrement Ko’paytirish, ayirish, Qo’shish operatorlari boshQa programmalash tillari kabi S# da xam bir xil ma’noga ega. Arifmetik operatorlarning funksiyasi ma’lum bo’lishiga Qaramay u bir Qancha tafsilotlarni bilishni talab Qiladi. Bo’lish operatorini QoldiQsiz bo’lish xolatida agar 10G’3 bo’lsa natija 3 ga teng bo’ladi. Bu xolatda natijani QoldiQ Qismini modul bo’yicha olish amali orQali olish mumkin. Mazkur operator S# dagi kabi boshQa programmalash tillarida xam bir xil ma’noga ega. S# da modul bo’yicha olishbutun sonlar uchun xam Qo’llanishi mumkin va Quyida modul bo’yicha olish operatorining funksiyasi tasvirlangan. using System class Fodbeto public static void main () int result double result 1 result – 0 G’ 3 rem – 10. 3 cresult – 10.0 G’ 3.0 rem 10.0 G’ 3.0 Programmadan Quyidagi natija olinadi Butunsonli bo’lish natijasi 3 ga teng QoldiQ 1 double asosida bo’lish 10.0 G’3.0 QoldiQ 3.3333333333333333333 ga teng Ko’rinib turibdiki, modul bo’yicha olish operatori butun sonlar bilan ishlash jarayonida natijani 1 gacha Qaytaradi. Inkrement va dekrement operatorlari Inkrement (QQ) va dekrement (--) operatorlari xaQida 1-bo’limda to’xtalib o’tilgan edi. Bu operatorlarning o’ziga xos xususiyati algoritmga pereminon siklini o’zgartirish vazifasi yuklatilganda ularni axamiyatini oshadi. Inkrement va dekrement operatorlarini Qanday ishlashini Quyida ko’rib chiQamiz. Inkrement operatori o’zining operandasiga birlik Qo’shsa, dekrement operatori esa o’zining operandasidan birlik ayirib tashlaydi. O’z navbatida x-xq1 operatori xuddi shu kabi funksiyani bajaradi. va xQ operatori esa xQxq1 xuddi mazkur funksiyaga o’xshash vazifani bajaradi Bu ikki operatorlar prefiks siftida opreandagacha yoki postfiks sifatida opreandadan keyin xam ko’rsatilishi mumkin. Masalan G’ y-2 operatorini Quyidagicha yozish mumkin. -x operator operandagacha ko’rsatiladi yoki x-G’G’ operator operandadan keyin ko’rsatiladi. Mazkur namunada inkrement operatori ikki usul bilan ko’rsatilgan bo’lib, ular orasida farQ yo’Q. Agar inkrement va dekrement operatorlari ifodaning asosiy Qismi sifatida Qo’llanilsa, operatorlar operandaga nisbatan joylashuviga nisbatan blok kod algoritmini bajarilishiga bog’liQ. Agar operator operandaga nisbatan oldinda joylashsa S# aralashma mazmunini kattalashtiradi. Agar operator operandadan so’ng ko’rsatilsa, C# aralashma ifodasini kattalashtiradi va buni Quyidagi misolda ko’rishimiz mumkin. x0 Qu Inkrement va dekrement operatorlarining mazkur xususiyatlari algoritmlar tuzishda Qo’llaniladi. Tenglovchi va mantiQiy operatorlar Tenglovchi operator atamasidagi tenglovchi so’zining ma’nosi bir amalni ikkinchisiga solishtirgan xoldagi berilgan baxo sifatida va mantiQiy so’zi esa ifodadagi amallarni bog’lash usuli deb Qarash mumkin. Tenglovchi operatorlar natijali amal bajarishi bulevo moxiyatli deb xisoblash mumkin va bu operatorlar ko’p xollarda mantiQiy operatorlar bilan birgalikda ishlaydi. Shuning uchun ularni birgalikda ko’rib chiQish mumkin. Quyida tenglovchi operatorlar keltirilgan. Opreator Mazmuni -- Teng -_ Teng emas > Dan katta < Dan kichik >- Katta yoki teng Kichik yoki teng Quyida esa mantiQiy operatorlar keltirilgan Operator Mazmuni & AND (va) ! OR (yoki) ^ XOR (yoki dan mustasno) && Short circuit AND (va tez operatori) !! Short circuit OR ( yoki tez operatori) 1 NOT (yo’Q) Tenglovchi va mantiQiy operatorlar amallarni bajarish natijasi mazmun tipi xisoblanadi. S# da operatorlar barcha ob’ektlar uchun ularni teng va teng bo’lmagan predmet bilan solishtirish uchun xam Qo’llanilishi mumkin. Shuningdek barcha tenglovchi operatorlar barcha turdagi sonli ma’lumotlar uchun Qo’llaniladi. BiroQ bool tipidagi ifodalar faQatgina tenglik va tenglik bo’lmagan predmetlar uchun solishtirilishi mumkin bo’lsada, true va false ifodalari tartiblanmagan. Masalan true > false ifodasi S# da mazmunga ega emas. MantiQiy operatorlar uchun esa operanda bool tipida bo’lishi zarur. &, !,^, 1 operatorlari o’z navbatida AND, OR, XOR, NOT kabi mantiQiy operatsiyalar asoslari Qullab-Quvvatlaydi va u Quyidagi tablitsada tasvirlangan. p q p&q p q p^q false false false false false true true false false true true false false true true true true true false false false true true Tablitsadan ko’rinib turibdiki, amal natijasiga ko’ra XOR operatorining faQatgina bitta operandasi true mazmuniga ega bo’lsa, XOR operatori true mazmuniga ega bo’ladi. Quyida tenglovchi va mantiQiy operatorlar tomonidan bajarilgan dasturni ko’rib chiQamiz. G’G’ Dastur faQat mantiQiy va tenglovchi operatorlar yordamida G’G’Qilingan. using system class Rel.Log.Ops { public static void Main () { int i, j; bool bl, b2; 1-10; j-11; if (1 if (1 if (1 !-j) Console.WriteLine (“1!-j”); if (1--j) Console.WriteLine (“Mazkur Qator kiritilmaydi.”) ; if (1>-j) Console.WriteLine (“Mazkur Qator kiritilmaydi.”) ; if (1>j) Console.WriteLine (“Mazkur Qator kiritilmaydi.”) ; b1-true b2-false if (b1 & b2) Console.WriteLine (“Mazkur Qator kiritilmaydi.”) ; if (b1 & b2) Console.WriteLine (“b1 & b2 ifodasini xisoblash natijasi true Qiymatiga ega bo’ladi.”) if (b1 ! b2) Console.WriteLine (“(b1 & b2) ifodasini xisoblash natijasi true Qiymatiga ega bo’ladi.”) if (b1 ^ b2) Console.WriteLine (“b1 ^ b2 ifodasini xisoblash natijasi true Qiymatiga ega bo’ladi.”) Dasturni bajarilishi Quyidagicha bo’ladi: 1. <j 1. <-j 1 !-j Tez mantiQiy operatorlar S# da mantiQiy operatorlarning boshQa turlari ya’ni tez turi xam mavjud bo’lib, operatsiyalar tezroQ bajarilishiga Qaratilgan. Ularni Qanday ishlashini Quyida ko’rib chiQamiz. Agar AND opetatorining birinchi operandasi false bo’lsa, boshQa operandalar Qanday bo’lishidan Qat’iy nazar natija false bo’ladi. AND tez operatori && belgisi bilan belgilansa, OR operatori esa ! bilan belgilanadi. Odatiy va tez operatorlarining asosiy bittagina farQi shundaki, tez operatorlarda operandani faQatgina birinchisiga yoki zaruriyat tug’ilsagina ikkinchisiga e’tibor beriladi. Quyida AND tez operatorining Qo’llanilishi keltirilgan. Dastur uzlukli d martali ifodani n ekanligini aniQlaydi. Bu amal esa modul bo’yicha olish operatori yordamida amalga oshiriladi. Agar nG’d Qoldig’i nolga teng bo’lsa, uzlukli d ifodasi n ga bo’linadi. Shunga Qaramay modul bo’yicha olish operatori operatsiyada bo’lish amalini bajarsada, AND esa natijani olga tenglashtiradi. Bo’linmani nolga teng ekanligini tekshirishda operator dastlab ifodalarni teng yoki teng emasligini tekshirib ko’radi. Agar teng bo’lsa operator amalni (bo’lishni) to’xtatadi. Dasturda birinchi xolda bo’linuvchi ikkiga teng bo’lsa operatsiya modul bo’yicha olish operatori yordamida amalga oshiriladi. Agar bo’linuvchi nolga teng bo’lsa, operatsiyaning modul bo’yicha olish operatori yordamida amalga oshirilishi to’xtatiladi. Oxirgi uchinchi xolatda AND odatiy operatori Qo’llaniladi va bunda ikkala operanda baxolanadi va natijada nolga bo’lishda xatolik yuz beradi. Proekt 2-2. MantiQiy operatorlar chinligi tablitsasi xulosasi Mazkur proekt mantiQiy operatorlar chinligi tablitsasini ekranga chiQarib beradigan programma yaratishga Qaratilgan. Dasturda S# elementlari xam ishtirok etib, ulardan biri yescape dir. Shuningdek proektda arifmetik va mantiQiy operatorlarning afzallik tomonlari xam ko’rib o’tiladi. BosQichli instruksiya 1. YAngi fayl yarating va uni Logu-alOpTable.cs deb nomlang 2. Tablitsa ustunlarini to’g’irlash uchun yescape dan foydalanib Qatorlarga tabulyatsiya elementlarini Qo’ying. 3. Tablitsaning xar bir yangi Qator uchun tabulyatsiya elementlaridan foydalaning 4. Quyida Logu-alOpTable.cs faylini dastur kodi keltirilgan. G’* 2-2 proekt *G’ 5. Amallarning bajarilishi natijasida Quyidagi tablitsa kelib chiQadi. 6. S# operatorlarini mantiQiy operatorlarga nisbatan afzal ekanligiga e’tibor bering. 7. MustaQil ravishda dasturni o’zgartirishga xarakat Qiling. Professionallar javobi Savol. S# da odatiy operatorlarning axamiyatini nimadan iborat va tez operatorlarning effektiligi nimadan iborat? Javob. Ba’zan operatsiya birinchi va ikkinchi operandlarni talab Qiladigan vaziyatlar xam bo’ladi. Shuning uchun xam odatiy operatorlar Qo’llaniladi va uni Quyidagi programma bilan ifodalash mumkin. DaQiQali amaliyot 1. Modul bo’yicha olish operatori Qanday ishlaydi. Unga Qanday ma’lumotlar Qullanilishi mumkin. 2. MantiQiy operatorlar uchun Qanday ma’lumotlar Qo’llaniladi. 3. Tez operatorlar xar doim xam barcha operandalarni baxolaydimi. O’zlashtiruvchi operatorlar Biz mazkur kitobda o’zlashtiruvchi operatorlardan ko’p marotaba foydalandik va uni xozir to’laroQ o’rganamiz. O’zlashtiruvchi operator tenglikni yakka (bitta) belgi bilan ko’rsatadi. Mazkur operator boshQa dasturlash tillarida bo’lgani kabi C# da xam bir xil ishlaydi va bir xil mazmunga ega. U Quyidagi sintaksis bilan belgilanadi: var- expression; O’zlashtiruvchi operatorning siz bilmagan bitta QiziQarli xususiyati bor. U “o’zlashtirma zanjir” xosil Qiladi. Misol tariQasida Quyidagi kod fragmentini ko’rishimiz mumkin. int x,y,z; x-y-z—100; x,y,z, 100 ga bog’lanmoQda. YUQoridagi kod fragmentda x,y,z, 100 ga bog’lanishini kuzatish mumkin. Bunda operator chapda, natija echa o’ng tomonda joylashadi. O’z navbatida zq100 ifodasi 100 ifodasi bilan bir xil demakdir. “o’zlashtirma zanjir” dan foydalangan xolda bir nechta amallarni bir vaQtning o’zida bajarish imkoniyati mavjud. O’zlashtirishning tarkibli operatorlari SG’SQQ da bo’lgani kabi S# da xamo’zlashtirishning tarkibli operatorlari bo’lib, bunda arifmetik operatorlar o’zlashtiruvchi operatorlar bilan aralashgan bo’ladi. Mazkur operatorlarni Quyidagi misol orQali ko’rishimiz mumkin. x-xQ10; ifodasi o’zlashtirma operatorlari tomonidan xQ-10; Qilib olinishi mumkin. -Q operatorlari shuni ko’rsatadiki, mazkur jarayonda kompilyator x ni xQ10 tarzida o’zlashtirib oladi. YAna bir misol keltirib o’tamiz. xqx-100 ifodasini xq100 tarzida yozish mumkin. Bunda operator x operatorini o’zlashtirib x-100 tarziga olib keladi. Barcha mantiQiy operatorlar uchun o’zlashtirishning tartibli operatorlari mavjuddir. Mazkur operatorlarning sintaksisi Quyidagicha ifodalash mumkin. var op q expression Shunday ekan C# Quyidagi tarkibli o’zlashtiruvchi operatorlarga ega bo’ladi. Qq -q *- G’%- &q !- ^q Tarkibli operatorlarni ularni analoglariga nisbatan ikkita asosiy xususiyatga ega bo’ladi. Birinchidan ular ixcham bo’lib, ikkinchidan ular Qo’llanilayotgan vaQtda kompililanuvchi kod tezligini oshiradi. Shuning uchun tarkibli o’zlashtiruvchi operatorlar C# dasturlashda ko’p Qo’llaniladi. O’zlashtirish operatsiyalarida almashtiruv tiplari Dasturlashda ko’p xollarda bir-biri bilan o’zlashtirilgan Qiymatlar Qo’llaniladi. Bunda dasturlovchi bir tipli Qiymatni ikkinchi tipga o’zlashtirib olishi mumkin. O’zlashtirish operatsiyalarida agar turli tipdagi ma’lumot Qo’llanilsa, tip bo’yicha o’zgaruvchi kattalik operatordan o’ng tomonda joylashadi va chap tomondagi o’zgaruvchi avtomatik tarzda almashtiriladi. C# tilida tiplar QattiQ boshQaruv ostida bo’ladi, lekin bu tiplar bir-biri bilan o’zaro bog’langan aloQada bo’ladi. BiroQ barcha tiplar xam o’zaro mutanosiblikka ega emas. Masalan bool va int tiplari nomutanosibdir. O’zlashtirish jarayonida bir tipga mansub ma’mot ikkinchi tip bilan Quyidagi xolatlarda amalga oshadi. ikkala tiplar mutanosib bo’lsa oxirgi tip (chap) boshlang’ich (o’ng) tipdan katta bo’lsa Mazkur shartlar bajarilgan xolatlarda kengaytirilgan akslantirish amalga oshadi. Shunga Qaramay variabel tipidagi long va doable lar uchun avtomatik akslantirish mavjud bo’lib, bunda teskari avtomatik akslantirish yuz bermaydi va bu dastur noto’g’ri bo’ladi. YUQorida ko’rsatib o’tilgan cheklovlarga to’ldirish maQsadida yana shuni aytish lozimki, decimal yoki float va double tiplarida avtomatik akslantirish yuz bermaydi va o’zgaruvchi tiplar bir-biri bilan nomutanosib bo’ladi. Nomutanosib tipli ma’lumot o’rtasida tartibga keltirish operatsiyalarini bajarish Avtomatik akslantirish juda Qulay bo’lishiga Qaramay, dasturlashning barcha talablariga javob bermaydi. Ularda faQatgina mutanosib tiplar uchun kengaytirilgan akslantirish mavjud. Tiplarni tartiblash – bir tip ma’lumotni ikkinchi tip ma’lumotga akslantiruvchi kompilyator instruksiyasidir. Tiplarni bunday akslantirish juda aniQlik bilan amalga oshadi. Tiplarni tartilash Quyidagicha sintaksisga ega bo’ladi: (target-type) experesion Chekli tip (target-type) ifodani Qay tarzda tartibga keltirish ekanligini ifodalaydi. Agar xG’u ifodasini int ifodasi tarzida akslantirish kerak bo’lsa uni Quyidagicha yozish mumkin. double.e.x.y, G’G’ (int) (xG’y) X va u o’zgaruvchilari double tipiga tegishli ekanligini xisobga olgan xolda, mazkur misolda tipni tartiblash ifodani int tipiga bo’lish orQali natija olingan. x va u uchun Qo’llanilgan yumaloQ Qavs katta axamiyatga ega. Aks xolda tipni tartiblash bo’lish natijasiga emas balki faQatgina x o’zgaruvchisiga tegishli bo’lib Qoladi xolos. Agar tipni tartiblashda jarayonida QisQartirilgan akslantirish yuz bersa ma’lumot oxiriga yetmay Qolishi (yo’Qotilishi) mumkin. Misol tariQasida long va int tipidagi ma’lumotlarni tartiblash jarayonida long tipiga xos ma’lumotlar int tipiga mos Qiymat chegarasidan (diapozon) chiQib ketadi va eski razryadli bitlar o’chib ketadi va ma’lumot o’chib ketadi. Quyida mazkur programmani ishlash prinsipi keltirilgan. Dastur natijalarini Quyidagi ifodalash mumkin Butun x,u ifodasi 00 ga teng Qiymat b 00 ga teng Qiymat b 1 ga teng ch Mazkur natijani tartiblash dasturida bo’lish natijasida ma’lumotni yo’Qotilishini kuzatishimiz mumkin. 257 o’zgaruvchisini o’zlashtirish jarayonida xam ma’lumot yo’Qotiladi, chunki 257 sonli belgilangan tip maksimumidan yuQoridir. DaQiQali praktikum 1. Tiplarni tartiblash operatsiyasi nima? 2. Tiplarni tartiblash jarayonisiz short tipiga mos Qiymatni int tipiga moslab o’zlashtirish mumkinmi? 3. xqxQ23 operatorini boshQa usullar bilan yozib ko’ring. Operatorolar afzalligi 2.3. tablitsada C# da Qo’laniladigan barcha opreatorlar yuQoridan past tomonga Qarab keltirilgan. Shuningdek keyinchalik tanishtiriladigan operatorlar xam ko’rsatib o’tilgan. Tablitsa 2.3. C# operatorlarini afzalligi Eng yuQori () [] QQ (postfiks) -(postfiks) checked new sizeof typeof unchecked ! - (cast) Q (unarli) -(unarli) QQ(prefiks) -(prefiks) * G’ % Q<<>> <> - is q q !q & ^ ! && !! ? q op q Eng pastki Ifoda Operatorlar, o’zgaruvchilar va literallar ifodaning tarkibiy Qismi xisoblanadi. Ifoda C# dasturlash tilida mazkur tarkibiy Qismlarning kombinatsiyasidan kelib chiQadi. Agar siz ozgina bo’lsa xam dasturlash bilan shug’ullangan bo’lsangiz (xech bo’lmaganda algebra bilan) buni sintaksisini keltirib chiQara olasiz. BiroQ ishlash jarayonida Quyida ta’kidlanadigan Qoidalarga amal Qilish zarur bo’ladi. Ifodalarda tiplarni akslantirilishi Ifodalarda ikki va undan ortiQ tipli ma’lumotlarni birgalikda Qo’shish imkoniyati mavjud bo’lib, ular mutanosib xisoblanadi. Masalan siz Q va – son tipli ma’lumotlarni birgalikda Qo’shishingiz mumkin. Akslantirish bevosita S# da Qabul Qilingan ifodalarda tiplarning avtomatik akslatirilishi Qoidasi asosida amalga oshadi. Quyida arifmetik operatsiyalar uchun mazkur Qoida asosidagi algoritm keltirilgan. Agar bir operand decimal tipiga mansub bo’lsa, ikkinchi operand xam avtomatik tarzda decimal tipida akslantiradi. Agar operandlardan biri double tipiga mansub bo’lsa, Qolgani xam avtomatik tarzda shu tipda akslantiriladi. Agar operand float tipiga mansub bo’lsa, ikkinchisi xam avtomatik tarzda shu tipda akslantiriladi Agar operandlardan biri along tipiga mansub bo’lsa, Qolgani xam avtomatik tarzda shu tipda akslantiriladi Agar operand lera tipiga mansub bo’lsa, ikkinchi operand avtomatik tarzda long tipida akslantiriladi Agar operandlardan biri long tipiga mansub bo’lsa, ikkinchi operand sb, te, short bo’lsa, barcha operandlar avtomatik tarzda long tipda akslantiriladi Agar bir operand line tipiga mansub bo’lsa ikkinchi operand avtomatik tarzad int tipida akslantiriladi. Agar yuQoridagi Qoidalardan chetga chiQish xolatlari bo’lsa, ikkala operand xam short tipida akslantiriladi. YUQorida keltirilgan avtomatik tarzda akslantirish Qoidalariga e’tibor Qarating. Barcha tipli ma’lumotlar xam bir-iri bilan mutanosib bo’lavermaydi. Bularga misol Qilib float va decimal tiplarini olish mumkin. Agar oxirgi Qoidaga e’tibor Qaratsangiz, mabodo biror bir Qoidaga mos tushmaydigan vaziyatlarda ikkala operandlar xam avtomatik tarzda int tipiga o’tkaziladi. char, sbyte, short, tipiga mansub Qiymatlar ifodada int tipiga o’tkaziladi. Bu protsess butunsonli tiplarning avtomatik tarzdagi akslantirilishi deb nomlanadi. Bu esa barcha matematik operatsiyalarning natijasi bitdan kam xolda saQlovchi tipga mansub ekanligini anglatadi. Shuni yoddan ko’tarmaslik kerakki, avtomatik akslantirish jarayonida kutilmagan natijalar xam kelib chiQishi mumkin. Masalan byte tiplari o’rtasida o’tkazilayotgan arifmetik operatsiyada natijani int tipiga o’tganligini kuzatish mumkin. Bu esa umuman kutilmagan natijadir. Chunki dasturlovchi o’zgaruvchilar tipini boshQarishi zarurdir. Butunsonlar tiplarini avtomatik tarzda akslantirish Qoidasini Quyidagi dastur orQali ko’rish mumkin. Agar bo’lish ifodasi b * b 1 o’zgartiruvchi bilan o’zlashtirilganda tiplarni tartiblash talab Qilinmaydi. Chunki b o’zgartiruvchisini bo’lish jarayonida avtomatik tarzda int tipiga o’zgartiriladi. Mabodo siz b * b o’zgaruvchisini b tarzida o’zlashtirmoQchi bo’lsangiz mazkur tipni teskari tartibda byte tipiga o’tkazish zarur bo’ladi. Shuni esdan chiQarmaslik kerakki, agar protsess davomida kutilmagan natija olinsa bu ifodadagi tiplarning nomutanosibligidandir. Bu xolat ko’pincha char tipi bilan ishlayotgan paytda yuzaga keladi. Masalan Quyidagi kod fragmentida char tipini natijalarini int tipiga aylantirilishini talab Qiladi. char ch1 – ‘a’, ch2 – ‘b’; (ch1-(char)’ch1’ – ch2); Tipni tartiblashsiz ch1 va ch2 o’zgaruvchilarini ko’paytirish natijasida xosil bo’lgan Qiymat int tipiga aylanadi, lekin o’zgaruvchilar char tipi tarzida o’zlashtirilmaydi. Tiplarni tartiblash faQatgina tiplarni o’zlashtirish jarayonida tiplarni akslantirish uchungina kerak bo’lmaydi. Masalan Quyidagi dasturda ifodani mayda natijalari uning double tipiga o’tkazilishini talab Qiladi. Agar shunday Qilinmasa double tipi int tipiga ega bo’lardi va ma’lumotning yo’Qolishiga olib keladi. G’G’ mazkur dasturda ifodani hisoblash jarayonida tiplarni G’G’ tartiblash keltirilgan using System class UseCastpublic static void Main () { int 1; or (1 – 0; 1 < 5; 1 QQ) Console.WriteLine( ‘ifodaning butunsonli natijasi’ -1Q”G’3: “ Q - G’3 ); Console.WriteLine (‘ifodaning mayda natijasi’) [0:#,##]”, (double) 1G’3; Console.WriteLine (); Quyida mazkur dasturni bajarilishi ko’rsatilgan. Ifodani xisoblash natijasida xosil bo’lgan butun sonli natijasi 0G’3: 0 Ifodani xisoblash natijasida xosil bo’lgan QoldiQ sonli natijasi Ifodani xisoblash natijasida xosil bo’lgan butun sonli natijasi 1G’3: 0 Ifodani xisoblash natijasida xosil bo’lgan QoldiQ sonli natijasi .33 Ifodani xisoblash natijasida xosil bo’lgan butun sonli natijasi 2G’3: 0 Ifodani xisoblash natijasida xosil bo’lgan QoldiQ sonli natijasi .67 Ifodani xisoblash natijasida xosil bo’lgan butun sonli natijasi 3G’3: 1 Ifodani xisoblash natijasida xosil bo’lgan QoldiQ sonli natijasi .1 Ifodani xisoblash natijasida xosil bo’lgan butun sonli natijasi 4G’3: 1 Ifodani xisoblash natijasida xosil bo’lgan QoldiQ sonli natijasi 1.33 Probel (bo’shliQ) va yumaloQ Qavslarning Qo’llanilishi Dasturni tushunarligini oshirish uchun S# da tabulyatsiya va probel amallari ishlatiladi. Masalan Quyidagi ikkita misollar bir xil lekin ularni ichidan ikkinchisini o’Qish osonroQdir. 10G’u*(127G’x); 10 G’ u * (127 G’ x) ; YUmaloQ Qavslar uning ichida joylashgan operatorlar afzalligini oshiradi. Qo’shimcha tarzdagi yumaloQ Qavslar ifodani xisoblash jarayonini sekinlashtirmaydi va xatolikka olib kelmaydi va ifodani aniQligini va tushunarliligini oshiradi. Ko’rinib turibdiki, Quyidagi misollar ichidan ikkinchisini o’Qish birmuncha osonroQdir. x u 3 34*tempQ 2G’ x (y 3) (34*temp)G’2 2-3 Proekt. Kredit bo’yicha to’lov summalarini xisoblash YUQorida ta’kidlanganidek, mazkur tiplar kunlik to’lovlarni xisoblash uchun xam juda Qulaydir. Taklif etilayotgan dastur kredit bo’yicha to’lovlarni xisoblashga Qaratilgan (masalan avtomobil sotib olish uchun). Mazkur proekt tiplarni tartiblash asosida va C# kutubxonasidan foylanilgan xolda amalga oshiriladi. To’lov summasini aniQlash uchun Quyidagi formuladan foydalaniladi. Int Rate* (PrincipalG’PayPerYear) Payment q ------------------------------------------------------1G’ ((IntRateG’PayPerYear)Q1) PayPerNumYear Bu yerda Int Rate o’zgaruvchisi kredit orQali to’lov foizini bildirsa, Principal o’zgaruvchisi esa eski balansni anglatadi. PayPerYear o’zgaruvchilari esa yil davomidagi to’lovni bildiradi va NumYear esa yil xisobidagi to’lov vaQtini anglatadi. BosQichli ko’rsatmalar 1. YAngi fayl yarating va uni RegPay.cs deb nomlang 2. Dasturda Quyidagi o’zgaruvchilarni Qo’llang decimal Principle decimal Pay decimal PayPerYear decimal NumYears G’G’ kreditning Qolgan vaQti decimal Payment G’G’ to’lov miQdori decimal numer, denom; G’G’ yordamchi o’zgaruvchilar double b,e; G’G’ Pow usulining asosiy va chaQiruvining ko’rsatkich darajasi. E’tibor bering, xar bir bosQichdan so’ng xar bir operatsiya uchun tavsiflar berilgan. Bu esa Qaysi o’zgaruvchi Qanday funksiyani bajarishini bilish uchun Qulaylik yaratadi. 3. Dasturning kod Qatoriga kredit to’g’risidagi spesifik informatsiyani kiriting. Dastur uchun Quyidagi Qiymatlarni kiriting: eski balans 10 000 ming dollar, kredit foizi 7,5%, yillik to’lov – 12, kredit uchun ajratilgan vaQt – 5 yil. Principal – 10000 IntRate – 0.075m; PayPerYear – 12.0m NumYears – 5.0m 4. moliyaviy xisob-kitobni amalga oshiruvchi kod Qatorini kirgizing numer q IntRate * Principal G’PayPerYear e – (double) – (PayPerYear * NumYears); r – (double) (IntRate G’ PayPerYear) Q1; denom q 1 – (decimal) Math.Pow.(b,e); Payment – numerG’denom; 5. Dastur operatorini xar oylik to’lov sifatida namoyon Qiladigan Qilib yakunlang. Console.WriteLine (Oylik to’lov xajmi (0:S)”, Payment); 6. Quyida dasturni to’la matni keltirilgan. Proekt 2-3 Dastur kredit asosida oylik to’lovni xisoblash uchun mo’ljallangan. Faylni RegPay.cs deb nomlang *G’ using System; classRegPay Mazkur dasturni ishga tushirish uchun Quyidagi Qator kiritiladi. G’G’G’G’ Mazkur dasturni amaliyotda Qo’llashdan oldin sinovdan o’tkazing. Sinov savollari 1. Nima uchun C# QattiQ tarzda oddiy tiplar uchun mumkin bo’lgan Qiymatlar va tavsiflar uchun spesifiklishini namoyon etadi. 2. C# ning simvolli tipi nima va u boshQa dasturlash tillari simvolli tiplaridan nimasi bilan farQlanadi. 3. O’zgaruvchi tip xoxlagan Qiymatni saQlashish xaQiQatmi, chunki barcha noldan katta Qiymat mavjudku. 4. Bitta kod Qatori va escape dan foydalanib, Quyidagi uch Qatorni to’ldiring Birinchi Ikkinchi Uchinchi 5. Quyidagi kod fragmentida Qanday xatolikka yo’l Qo’yilgan For (- - 0, 1<-0, 1QQ) Int sum Sum – sum Q -; Console.WriteLine (summa teng «Q» sum) 6. Inkrementning postfiks (1QQ) va prefiks (QQ&) formalari o’rtasidagi farQlarni tushuntirib bering 7. N tez operatorini Qo’llash jarayonida 0 ga bo’lish jarayonidagi kod fragmentini yozing 8. Ifodada byte va short tiplari Qanday akslantiriladi. 9. Quyida keltirilgan tiplardan Qaysi biri decimal tipi bilan mutanosib bo’lolmaydi a) float b) int c) short d) byte 10. Qanday xolatlarda tiplarni tartiblash zarur bo’ladi 11. 1 dan 100 gacha bo’lgan diapozondagi dastur tuzing 12. mustaQil xolda proekt 2-2 uchun mo’ljallangan dastur tuzing. Bunda escape ketma-ketligi o’rniga Qatorli kopiyalovchi literallardan foydalaning. Havola tipidagi o’zgaruvchilar va berish operatori Berish operatsiyasini bajarayotgan paytda havola tipidagi o’zgaruvchi odatdagi tipdagi o’zgaruvchiga (masalan int tipidagi) nisbatan boshQacha ishlaydi. Agar siz odatdagi tipdagi o’zgaruvchiga bersangiz bu yerda holat oddiy. Berish operatoridan chap tarafda turgan o’zgaruvchi, ko’rsatilgan o’ngda turgan o’zgaruvchi Qiymatining nusxasini oladi. Havola tipidagi bitta o’zgaruvchi Qiymatini boshQa o’zgaruvchiga berayotganingizda holat bir muncha murakkab bo’ladi, chunki siz o’zgaruvchi havolani boshQa ob’ektga beryapsiz. Masalan, Quyidagi kod fragmentini ko’rib chiQamiz: Vehicle car 1 - new vehicle (); Vehicle car 2 - car 1; car 1 va car 2 o’zgaruvchilari turli xil ob’ektlarga tegishli bo’lib ko’rinishi mumkin, lekin bu unday emas. Aslida ikkala o’zgaruvchi ham aynan bitta ob’ektga havola etiladi. car 2 o’zgaruvsiga car 1 o’zgaruvchining Qiymati berilayotganda, car 2 o’zgaruvchi car 1 havola etilayotgan ob’ektga car 2 o’zgaruvchi havolasi berildai. Demak, ob’ektga kirish car 1 o’zgaruvchi yordamida ham car 2 o’zgaruvchi yordamida ham amalga oshirilishi mumkin. Masalan, car 1 berish operatsiyasi bajarilgandan so’ng ikkala Write line () operatori ham bitta 26 Qiymatini chiQaradi. Console. Writeline (car 1.mpg) Console. Writeline (car 2.mpg) car 1 va car 2 o’zgaruvchilarni bitta ob’ektga havola etilsada hech Qanday bir-biriga bog’liQ emas. Masalan, Quyidagi kod fragmenti bajarilgach car 2 o’zgaruvchisi car 3 havola Qilingan ob’ektga havola oladi. car 1 o’zgaruvchi havola etilayotgan ob’ekt o’zgaruvchisiz Qoladi. Usullar. Aytib o’tilganidek, ekzemplyar o’zgaruvchilar va usulga asosan tashkil etuvchilar ikki sinfdir. Shu vaQtgacha bizning Vehicle sinfdagi dasturlar faQat ma’lumotlar saQlar edi va usul saQlamas edi. Garchi faQat ma’lumot saQlovchi sinflar haQiQiy bo’lsada, ko’pchilik sinflar usul ham saQlashadi. Usullar – kichik dasturlar bo’lib, sinfdagi ba’zi ma’lumotlarni boshQaradi va ko’pchilik hollarda ma’lumotga kirishni ta’minlaydi. Odatda dasturning Qolgan Qismlari sinf bilan uning usullari yordamida o’zaro ta’sirlashadi. Usul bir yoki bir necha operatorga ega bo’lishi mumkin. Professional yozilgan S kodda har bir usul faQat bitta vazifani bajaradi. Usul nomi sifatida har Qanday mavjud identifikatordan foydalanish mumkin. Kalit so’zlar usul nomi bo’lishi mumkin emas, main nomi usul uchun rezerflangan bo’lib, undan dasturni bajarish boshlanadi. Dastur matnida usullar Quyidagicha belgilanadi: metod nomidan keyin bir juft dumaloQ Qavs Qo’yiladi. Masalan, agar usul nomi getvar bo’lsa, uni dasturga chaQirish uchun getvar () ko’rinishida yoziladi. YOzishning bunday formasi dasturda o’zgaruvchi va usul nomini farQlash uchun Qo’llaniladi: Usulning umumiy sintaksisi Quyidagicha ko’rinishda bo’ladi: Bu yerda access so’zi- modifikator bo’lib, dasturiningizning Qaysi Qismlari usulga kirishi mumkinligini ko’rsatadi. Aytib o’tilganidek modifikator albatta bo’lishi shart emas, agar u bo’lmasa usulga e’lon Qilingan sinf chegarasiga kirish mumkin. Hozircha biz barcha usullarni ret sifatida e’lon Qilishimiz mumkin, shuning uchun ham ular dasturning istalgan joyidan kod bilan chaQirilishi mumkin. Sintaksisdagi ret-type Qo’shilmasi usul bilan Qaytariladigan ma’lumot tipini bildiradi. Bular har Qanday tipdagi mavjud ma’lumotlar yoki siz tomoningizdan yaratilgan har Qanday Qiymatni Qaytarmasa u void tipiga ega deb ko’rsatilishi shart. Name so’zining o’rniga usul nomi ko’rsatiladi. Bu har Qanday mavjud identifikator bo’lib, o’sha ko’rinish oblastida mavjud sinflar nomini takrorlamasligi kerak. Usul nomidan keyin parameter-list (parametrlar ro’yxati) ya’ni vergul bilan ajratilgan “tip - identifikator” juftlarining ketma-ketligi keladi. YA’ni parametr yordamida usulga dasturlash tipi albatta ko’rsatilgan Qiymatlar beriladi. Parametrlar asosan o’zgaruvchilar bo’lib, usulni chaQirish paytida unga yetkaziladigan argumentlar Qiymatini Qabul Qiladi. Agar metod parametrga ega bo’lmasa, parametrlar ro’yhati bo’sh bo’ladi. Usulni vehicle sinfiga Qo’yish Biz ilgariroQ aytib o’tganimizdek, sinf usullari odatda ma’lumotlar bilan ishlaydi va o’sha sinfga kirishni ta’minlaydi. YUQorida keltirilgan yoQilg’i baki to’la bo’lgan avtomabilning bosib o’tadigan masofasini o’lchaganda, masofa Qiymatini topish uchun avtomabilning bir gallon yoQilg’i bilan bosib o’tgan masofasini yoQilg’i balon hajmining Qiymatiga ko’paytirganimizni eslaymiz. Garchi texnik jihatdan biz barchasini to’g’ri bajargan bo’lsakda, bunday hisoblashlarni bajarishda ushbu usul optimall usul emas. YUrishning maksimal uzunligini Vehicle sinfiga bosib o’tilgan masofani o’lchash usuli Qo’shilganda sinfning orientirlangan ob’ektni tuzilishi yaxshilanadi. Vehicle sinfiga usul Qo’yilganda, uni sinfni yaratish paytida aniQlash kerak. Masalan, Vehicle sinfiga tegishli versiya range () usulini tutadi, u esa avtomabilning bosib o’tgan yo’lini hisoblab chiQaradi. G’G’ range usuliga Vehicle sinfini kiritish Using system ; Class Vehicle( Public int passengers; G’G’ yo’lovchilar miQdori Public int fuelcap; G’G’ bakdagi yoQilg’ining hajmi Public int mpg ; G’G’ joylashish masofasi G’G’ avtomabillning bir marta yurishi G’G’ yoQilg’i galloni. G’G’ range usulini aniQlash . Public void range ()range usuliga Vehicle sinfini kiritish Console.Write Line (avtomabilning to’la bak bilan yurgan yo’li); Bu dastur ishining natijasi Quyidagicha bo’ladi. Mikro avtobus 7 ta passajirni tashishi mumkin. Bu avtobus to’la yoQilg’i baki bilan 336 mil bosishi mumkin. Sport avtomabili 2 ta passajirni tashishi mumkin. Bu avtobus to’la yoQilg’i baki bilan 168 mil bosishi mumkin. Endi dasturni barcha kalit elementlarini ko’rib chiQamiz Range(1) usulidan boshlaymiz. range (1) usulini e’lon Qilishning boshlanishi. Kodning bu Qatorida parametrga ega bo’lmagan range nomli Using system; Class Vehicle; Public int passegres; G’G’ yo’lovchilar miQdori Public int fuelcap; G’G’ bakdagi yoQilg’ining hajmi Public int mpg ; G’G’ joylashish masofasi G’G’ avtomabillning bir marta yurishi G’G’ yoQilg’i galloni. Avtomabil to’la bakdagi yoQilg’i bilan yurish yo’lini hisoblash Public int range(); Return mpg * fuelcap; YOQilg’i miQdorini hisoblash usuliga berish parametri usulini kiritish. Public double fuelneeded (int miles); Return (double) miles G’ mpg; Class Compfuel ( public ststic void Main()(Vehicle minivan qnew Vehicle (); Vehicle sportscar q new Vehicle(); Double gallons; Int dist-252; G’G’Havola o’zgaruvchilarining minivan ob’ekti . Minivan. Passengers -7; Minivan. Fuelcap q14; minivan . Mpg q12; G’G’ Havola o’zgaruvchilarining sportscar ob’ekti . Sportscar Passengers -7; Sportscar Fuelcap q14 sportscar Mpg q12; gallonsq minivan.fuelneeded(dist); console.Writeline (“borish”Qdist Q “mikroavtobus mili” Q talab etiladi Q “gallons”Q “gallon yoQilg’isi”.); gallonsq sportscar.fuelneeded(dist); console.Writeline (“borish”Qdist Q “mikroavtobus mili” Q talab etiladi Q “gallons”Q “gallon yoQilg’isi”.); console.Writeline (“borish”Qdist Q “sportmashinasi mili” Q talab etiladi Q “gallons”Q “gallon yoQilg’isi”.); Bu programmaning yakuni pastda keltirilgan. Mikroavtobusning 252 mil yurishi uchun 12 gallon yoQilg’i talab etiladi. Sportmashinasining 252 mil yurishi uchun 21 gallon yoQilg’i talab etiladi. Mail () usuli ichidagi minivan range (); operatoriga e’tibor bering. Bu operator minivan ob’ekti uchun range () usulini chaQiradi. YA’ni minivan ob’ekti uchun ob’ekti range () usuli chaQiriladi. Buning uchun nomidan keyin nuQta () operatori keladigan ob’ekt nomi ko’rsatiladi. Usul o’z ishini bajargandan so’ng, boshQaruv dasturining usul chaQirilgan nuQtasiga uzatiladi. Dasturning bajarilishi kodning dasturli chaQirishdan keyingi Qatoridan davom etadi. Bu holda minivan range () usuli chaQirilganda minivan avtomabilning bosib o’tadigan maksimal yo’li haQidagi ma’lumotni chiQaradi. Har gal range () usuli chaQirilganda nuQta () operatoridan chapda joylashgan ob’ekt o’zgaruvchilari bilan ishlaydi. range () usulini aniQlashdagi muhim o’ziga xosligiga e’tibor bering Fuelcap va mpg ekzemplyarining o’zgaruvchilari bevosita ko’rsatilmoQda (o’zgaruvchini ajratishda nuQta () operatori ishlatiladi aniQlatilmayapti va ob’ekt nomi ko’rsatilmayapti). Agar metod o’zi bilan bitta sinfda aniQlangan o’zgaruvchi ekzemplyari bilan ishlaganda u o’zgaruvchiga ob’ektni aniQ ko’rsatmasdan va nuQta () operatorini ishlatmasdan murojaat Qiladi. (YA’ni metod ichiga ob’ekt nomini ikkinchi marta Qaytarishga ehtiyoj yo’Q). Bu ishlatilayotgan fuelcap va mpg o’zgaruvchilari range () usuli chaQiriladigan ob’ektda aniQlangan o’zgaruvchilar nusxasiga noaniQ murojaat Qiladi. Usuldan boshQaruvni Qaytarish BoshQaruv usuldan ikki holda Qaytariladi. Bu birinchidan agar ushbu usulni yopuvchi figurali Qavs duch kelganda, ikkinchidan return operatori bajarilganda. return operatorning 2 ta formasi mavjud. Bitta formasi void tipiga (Qiymatni Qaytarmaydigan) ega bo’lgan usullarda Qo’llaniladi, ikkinchisi Qiymatni Qaytaradigan usullarda ishlatiladi. void tipiga ega bo’lgan usullarga return operatorini bajarilishi usulning tezda ishni to’xtatilishiga olib keladi. Shuning uchun bu usul odatda shartli belgilashdan keyin ko’rsatiladi, chunki ma’lumotnomalarda Qolgan operatorlarning usul bajarilishi ma’noga ega bo’lmay Qolishi mumkin. return operatori Quyidagicha yoziladi return U bajarilayotgan vaQtda boshQaruv dasturining usul chaQirilgan nuQtasiga uzatiladi, bunda usuldagi Qolgan kod tushirib Qoldiriladi. Misol tariQasida Quyidagi usulni ko’rib chiQamiz public void myMeth (){ int i; for ( iq0; i if (iqq5) return; G’G’ Metod o’z ishini I o’zgaruvchi 5 Qiymatini Qabul Qilganda to’xtatadi. G’G’ 5 belgi Qabul Qiladi. console.Writeline () Bu yerda for sikli faQat 5 marta bajariladi, chunki o’zgaruvchi i ning Qiymati 5 ga teng bo’lganda return operatori bajariladi. Bitta usul ichida bittadan ko’p return operatori bo’lishi mumkin. Ko’pincha bunday operatorlar bir necha shartli belgilari bo’lgan usullarda Qo’llaniladi. Masalan, public void myMeth () G’G’ … if (condition_1 ) return; G’G’… if (condition_2) return; G’G’ statements; Bu usuldan boshQaruvni Qaytarish uch holda amalga oshadi:usulning so’nggi operatorlari bajarilib bo’lgach, birinchi shartli belgi keyin ikkinchi shartli belgilash bajariladi. BiroQ usul juda ko’p chiQish nuQtalariga ega bo’lsa, bu kodni destruksiyalaydi, shu sababli return operatorlari keragidan ortiQ ishlatilmaslik kerak. Usul bilan Qiymatni Qaytarish void tipidagi usullar ko’p uchrab tursa ham, S dagi ko’pchilik usullar Qiymatni Qaytaradi. Amalda Qiymatni Qaytarish Qobiliyati usulning muhim xususiyatini bildiradi. Siz usul yordamida Qiymatni Qaytarishga misol ko’rgansiz, buni biz sondan kvadrat ildiz Qiymatni olish uchun math.Sqrt () funksiyasi ishlatilganda, Qaytariladigan Qiymat operatsiyasini muvaffaQiyati yoki muvaffaQiyatsizligini ko’rsatadi. Ba’zan Qaytaradigan Qiymat holat kodini tutishi mumkin.(oldindan aniQlangan -1,0, va hak sonlar Qaytariladi.) Usul bilan Qiymatni Qaytarilgan Qiymatlarni Qo’llash- dasturlashning ajralmas bo’lagidir.Usullar Quyidagi return forma operatorini Qo’llab kod programmaga chaQiriladigan dasturlarni Qaytaradi. return value; Bu yerda Qo’yiladigan value so’zi Qaytariladigan Qiymat. Usullarning Qiymatni Qaytarish xususiyatini bizga tanish bo’lgan range usulini takomillashtirish uchun ishlatish mumkin. Avtomabilning bosib o’tishi mumkin bo’lgan maksimal masofa haQidagi ma’lumot o’rniga range usulining yangi varianti maksimal masofa Qiymatini hisoblaydi va uni dasturga Qaytaradi. Bunday yondashishning ustunliklaridan biri Qaytariladigan Qiymatni boshQa hisoblashlar uchun ishlatish mumkinligidadir. Keyingi dastur variantida modifikatsiyalangan range () usuli ekranga tegishli bo’lgan ma’lumotlarni chiQarmaydi, balki hisoblangan Qiymatni Qaytaradi. G’G’Dasturda Qaytariladigan hisoblangan Qiymatni ishlatish usullari namoyish etiladi. Using system; Class Vehicle; Public int passegres; G’G’ yo’lovchilar miQdori Public int fuelcap; G’G’ bakdagi yoQilg’ining hajmi Public int mpg ; G’G’ joylashish masofasi G’G’ avtomabillning bir marta yurishi G’G’ yoQilg’i galloni. Avtomabil to’la bakdagi yoQilg’i bilan yurish yo’lini hisoblash Public int range(); Return mpg * fuelcap; Class RetMeth{ Range () usuli belgini Qaytaradi. public static void Main () { Vehicle minivanq new Vehicle(); Vehicle sportcarq new Vehicle(); G’G’Havola o’zgaruvchilarining minivan ob’ekti . int range1, range 2; Minivan. Passengers -7; Minivan. Fuelcap q16; minivan . Mpg q21; G’G’ Havola o’zgaruvchilarining sportscar ob’ekti . Sportscar Passengers -7; Sportscar Fuelcap q14 sportscar Mpg q12; G’G’ Avtomobilning hisoblangan maksimal yurish masofasi range1q minivan.range () ; range2q sportcar range (); o’zgaruvchilar range1 va range 2 Qaytish belgilari console.Writeline (“Minivan. Passengers ”Q “mikroavtobusning borib kelishi” Q yo’lovchilarning joylashishi Q “range 1”Q “mil”.); console.Writeline (“Sportscar Passengers” Q “sportmashinasining borib kelishi” Q yo’lovchilarning joylashishi Q “range 2”Q “mil”.); Bu dasturni bajarish natijasi Quyidagicha G’G’Mikroavtobus 7 ta yo’lovchini 336mil masofaga olib borishi mumkin. G’G’Sportmashinasi 2 ta yo’lovchini 168 mil masofaga olib borishi mumkin. Bu dasturda range ( ) usulini chaQirish berish operatoridan o’ngda joylashadi, uning chan tomonda range ()usuli bilan Qaytariladigan Qiymat beriladigan o’zgaruvchi joylashadi. Kod Qatori bajarilgandan keyin, range1q minivan.range () ; o’zgaruvchi range1 havolanuvchi belgisi, o’zgaruvchi minivan ob’ekti ishlatilgandan hisoblanadi. Endi range ( ) int usuli int tipidagi Qiymatni Qaytaradi. Usul Qaytaradigan Qiymat tipini to’g’ri ko’rsatish juda ham muhim (agar tipidagi ma’lumotni usul bilan Qaytarishga to’g’ri kelsa, usulni e’lon Qilishda Qaytariladigan ushbu Qiymat tipini aynan ko’rsatish kerak) yuQorida keltirilgan dastur sintaksisi bexato yozilgan bo’lsada, u juda effektiv yozilgan emas, chunki range 1va range 2 o’zgaruvchilariga kerak emas, chunki range1 usuli bevosita Writeline () operatori bilan Quyida ko’rsatilgan console.Writeline (“Minivan. Passengers ”Q “mikroavtobusning borib kelishi” Q yo’lovchilarning joylashishi Q “range 1”Q “mil”.); Bu holda Writeline operatori bajarishda Minivan usulini dasturning har Qanday joyidan chaQirishimiz mumkin, agar Vehicle sinfidagi ob’ektning maksimal masofa kerak bo’lsa, Masalan Quyidagi kodda range () usuli bilan Qaytariladigan Qiymatlar solishtiriladi. if (v1.range ()>v2.range ()) console.Writeline (“Avtobusning v1to’la yoQilg’i baki bilan borib kelishi” Q v2 avtomabilning joylashishi.); Parametrlarni Qo’llash Usulni chaQirayotganda unga bitta yoki bir necha Qiymat berish mumkin. Aytib o’tilganidek usulga berilayotgan Qiymat argument deyiladi. Parametrlar usuldan keyin keladigan aylana Qavs ichida ko’rsatiladi. Parametr ko’rsatiladigan sintaksis o’zgaruvchi ko’rsatiladigan sintaksisga o’xshash bo’ladi. Parametr o’z usuli ko’rinishi chegarasida mavjud bo’ladi. Parametrning Qo’yilish – usulni bajarish paytida argument Qiymatini Qabul Qilish, lekin u har Qanday boshQa lokal o’zgaruvchi kabi xarakat Qiladi. Bundan keyin oddiy dastur keltirilgan bo’lib, unda usulga Qiymat berish uchun parametr Qo’llaniladi. SqhNum sinfi ichida isEwen () usuli true Qiymatini Qaytaradi, agar unga beriladigan Qiymat juft bo’lsa. Aks holda false Qiymatini Qaytaradi. Usulga Qiymat uchun parametr Qo’llanilishini ko’rsatadigan oddiy dastur. Bu dasturni bajarish natijasida Quyidagi Qatorlar chiQariladi. 10 soni juft 8 soni juft isEwen () usuli 3 marta chiQariladi va unga har gal yangi Qiymat beriladi. Bu jarayonni kengroQ ko’rib chiQvmiz, bunda isEwen () Qavs ichida ko’rsatiladi. isEwen () usuli 1 marta chaQirilganda unga 10 Qiymat beriladi. 2- marta chaQirilganda 9 soni argument bo’ladi. Uchinchi marta chaQirilganda 8 Qiymatni Qabul Qiladi. YAni parametr usuli 8 o’zgaruvchini isEwen () suulini chaQirishda argument sifatida beriladigan Qiymatni Qabul Qiladi. Proekt 4-1. YAratilgan sinf ma’lumotnomasi Sinflar katta bloklardan tashkil topgan programmalardir. Chunki har bir blok funksiyalangan aniQ xarakatlarni bajarishga asoslangan. Sinflar juda kichik va juda katta ham bo’lmasligi kerak. Sinflar berilgan vazifani chalkashtirmasdan va destruksiyalab, kodlab, kamchiliklarsiz funksiyalaydi. Ilmiy programmalarga o’tganda, programma tabiiy ishlay boshlaydi bu uning Qimmatli programmaligini ko’rsatadi. YAratilgan sinf ma’lumotnomasi proek 3-3 dan foydalanamiz. Dastlab yaxshi fikr topamiz. Birinchidan, ma’lumotnoma sistema bitta mantiQiy blok yaratadi. Bir necha topshiriQlar berilganda sitaksis operator S ekranda hosil bo’ladi, blokli fuksiyalar aniQ aniQlanadi. Ikkinchidan, programmistga kerakli ma’lumotnoma sistemalar aniQlanadi va Qo’shimchalar Qo’shish kerak bo’lsa, eski sinfdan bitta ekzemplyar olinadi. BoshQa ma’lumotlar kerak bo’lsa programmaning Qo’shimcha effektidan foydalaniladi. Instruksiyaning ketma-ketmaligi. 1. YAngi fayl yarating va uni Help classdemo.cs. shaklida nomlang. Chunki programmaning kodiga Qaytmasligi uchun va uni help 3.cs. fayli orQali nusxa olinadi. Koddan o’zgaruvchan ekzemplyarga yetshish uchun bu o’zgaruvchan aniQlangan sinfni bir Qismi bo’lgan ob’ektni nomi operator nuQta va o’zgaruvchini ismi ko’rsatilishi zarur. Shu o’zgaruvchan aniQlangan sinfni bir Qismi bo’lgan koddan o’zgaruvchan ekzemplyarga yetishish uchun to’g’ridan-to’g’ri o’zgaruvchanni ismini ko’rstish mumkin. 2. Argument – bu metodni chaQirishda unga beriladigan Qiymat. 3. Metoddan boshQaruvni Qaytarish Return operatori yordamida amalga oshirilishi mumkin. Agar metod void tipga ega bo’lsa, metod chaQirib olinganni Qaytarish yopiQ figurali Qavs bilan amalga oshiriladi. BiroQ (ne- void) tipdagi Qiymatni Qaytarish uchun Return operatoridan foydalanish zarur, ya’ni yopiQ figurali Qavsga erishilganda metoddan boshQaruvni Qaytarish mumkin emas. 1. helpon () usulini yaratish. Public void helpon (char what) (switch (what) ( case ‘1’: Console.Writeline (“operator”if:g’n”); Console.Writeline (“if(condition)ststement;”); Console.Writeline (“else ststement;”); Break; Case ‘2’: Console.Writeline (“operator switch:g’n”); Console.Writeline (“switch expression)(“); Console.Writeline (“ case constant:”); Console.Writeline (“ statement sequence”); Console.Writeline (“break ;”); Console.Writeline (“ G’G’ ”); Console.Writeline (“ (”); Break; Case ‘3’: Console.Writeline (“Sikl for :g’n”); Console.Writeline (“while(condition;iteration)”); Console.Writeline (“statement;”); Break; Case ‘4’: Console.Writeline (“sikl while:g’n”); Console.Writeline (“while (condition) statement;”); Break; Case ‘5’: Console.Writeline (“sikl do-while:g’n”); Console.Writeline (“do (“); Console.Writeline (“ (“statement;”); Console.Writeline (“)while (condition);”); Break; Case ‘6’: Console.Writeline (“operator break:g’n”); Console.Writeline (“Break; or break label;”); Break; Case ‘7’: Console.Writeline (“operator continue:g’n”); Console.Writeline (“continue;or continue label;”); Break; Case ‘8’: Console.Writeline (“operator goto:g’n”); Console.Writeline (“goto label;”); Break; Console.Writeline (); 4. showmenu () usulini yaratish ketma-ketligi: Public void showmenu () ( Console.Writeline (“sintaksisda ma’lumotnoma:”); Console.Writeline (“ 1.Operator if”); Console.Writeline (“ 2.Operator switch”); Console.Writeline (“ 3.Davr for”); Console.Writeline (“ 4.Davr while”); Console.Writeline (“ 5. Davr do-while”); Console.Writeline (“ 6.Operator break”); Console.Writeline (“ 6.Operator break”); Console.Writeline (“ 7.Operator continue”); Console.Writeline (“ 8.Operator gotog’n”); Console.Writeline (Davr yoki operator tartib nomeriga Qaytish:”); Console.Writeline (programmada ishni tugallash uchun q ga Qaytish:”); ) 5. Is valid () usulini yaratish: Public bool isvalid (char ch) ( if (ch ‘1’ I ch> ‘8’ ch Iq ‘q’)return false; Else return true; 6. Help sinfidagi usulni yarating: Class Help Public void helpon (char what) (switch (what) ( case ‘1’: Console.Writeline (“operator”if:g’n”); Console.Writeline (“if(condition)statement;”); Console.Writeline (“else statement;”); Break; Case ‘2’: Console.Writeline (“operator switch:g’n”); Console.Writeline (“switch expression)(“); Console.Writeline (“ case constant:”); Console.Writeline (“ statement sequence”); Console.Writeline (“break ;”); Console.Writeline (“ G’G’ ”); Console.Writeline (“ (”); Break; Case ‘3’: Console.Writeline (“Sikl for :g’n”); Console.Write (“for(init; condition;iteration)”); Console.Writeline (“statement;”); Break; Case ‘4’: Console.Writeline (“sikl while:g’n”); Console.Writeline (“while (condition) statement;”); Break; Case ‘5’: Console.Writeline (“sikl do-while:g’n”); Console.Writeline (“do (“); Console.Writeline (“ (“statement;”); Console.Writeline (“)while (condition);”); Break; Case ‘6’: Console.Writeline (“operator break:g’n”); Console.Writeline (“Break; or break label;”); Break; Case ‘7’: Console.Writeline (“operator continue:g’n”); Console.Writeline (“continue;or continue label;”); Break; Case ‘8’: Console.Writeline (“operator goto:g’n”); Console.Writeline (“goto label;”); Break; Console.Writeline (); Public void showmenu () ( Console.Writeline (“sintaksisda ma’lumotnoma:”); Console.Writeline (“ 1.Operator if”); Console.Writeline (“ 2.Operator switch”); Console.Writeline (“ 3.Davr for”); Console.Writeline (“ 4.Davr while”); Console.Writeline (“ 5. Davr do-while”); Console.Writeline (“ 6.Operator break”); Console.Writeline (“ 6.Operator break”); Console.Writeline (“ 7.Operator continue”); Console.Writeline (“ 8.Operator gotog’n”); Console.Writeline (Davr yoki operator tartib nomeriga Qaytish:”); Console.Writeline (programmada ishni tugallash uchun q ga Qaytish:”); ) Public bool isvalid (char ch) ( if (ch ‘1’ I ch> ‘8’ ch Iq ‘q’)return false; Else return true; 7. Proekt 3-3 dan main usulini yangi help sinfi orQali yozish. Bu asosiy sinfni Main () Help Class Demo .cs. nomi bilan nomlaymiz. Usul to’liQ shaklda pastda keltirilgan. Proekt 4-1. Proekt 3-3 ma’lumotnoma help sinfiga asoslangan. Using System; Class help; Public void helpon (char what) (switch (what) ( case ‘1’: Console.Writeline (“operator”if:g’n”); Console.Writeline (“if(condition)statement;”); Console.Writeline (“else statement;”); Break; Case ‘2’: Console.Writeline (“operator switch:g’n”); Console.Writeline (“switch expression)(“); Console.Writeline (“ case constant:”); Console.Writeline (“ statement sequence”); Console.Writeline (“break ;”); Console.Writeline (“ G’G’ ”); Console.Writeline (“ (”); Break; Case ‘3’: Console.Writeline (“Sikl for :g’n”); Console.Write (“for(init; condition;iteration)”); Console.Writeline (“statement;”); Break; Case ‘4’: Console.Writeline (“sikl while:g’n”); Console.Writeline (“while (condition) statement;”); Break; Case ‘5’: Console.Writeline (“sikl do-while:g’n”); Console.Writeline (“do (“); Console.Writeline (“ (“statement;”); Console.Writeline (“)while (condition);”); Break; Case ‘6’: Console.Writeline (“operator break:g’n”); Console.Writeline (“Break; or break label;”); Break; Case ‘7’: Console.Writeline (“operator continue:g’n”); Console.Writeline (“continue;or continue label;”); Break; Case ‘8’: Console.Writeline (“operator goto:g’n”); Console.Writeline (“goto label;”); Break; Console.Writeline (); Public void showmenu () ( Console.Writeline (“sintaksisda ma’lumotnoma:”); Console.Writeline (“ 1.Operator if”); Console.Writeline (“ 2.Operator switch”); Console.Writeline (“ 3.Davr for”); Console.Writeline (“ 4.Davr while”); Console.Writeline (“ 5. Davr do-while”); Console.Writeline (“ 6.Operator break”); Console.Writeline (“ 6.Operator break”); Console.Writeline (“ 7.Operator continue”); Console.Writeline (“ 8.Operator gotog’n”); Console.Writeline (Davr yoki operator tartib nomeriga Qaytish:”); Console.Writeline (programmada ishni tugallash uchun q ga Qaytish:”); ) Public bool isvalid (char ch) ( if (ch ‘1’ I ch> ‘8’ ch Iq ‘q’)return false; Else return true; ) ) Class HelpClassDemo ( Public static void Main ( ) ( Char choice; Help hlpobj-new Help; For(;;) ( Do ( Hlpobj. Showmenu ( ); Do ( Choiceq(char) Console.Read ( ); )while (choiceqq ‘g’n’(choiceqq ‘g’r’); While (lhlpobj.isvalid(choice) ); If (choice qq ‘q’)break; Console. WriteLine(“g’n”); Hlpobj.helpon(choice); ) ) ) Programmani testdan o’tkazilganda funksiya o’zgarmasdan Qoldi. Bu programma prorammist uchun ma’lumotnoma bazasi sistemasi vazifasini bajaradi. Konstruktorlar. O’tgan misollarda Vehicle sinfidagi har Qaysi ob’ektni Qo’llash uchun operatorlarni Quyidagi ketma-ketligiga asoslangan Qiymatlarni Qo’lda belgilash zarur edi. Minivan. Passengers -7; Minivan. Fuelcap q14; minivan . Mpg q12; Bu usul hech vaQti S professional yozilgan programmalarda Qo’llanilmaydi, chunki bunda birinchidan tasodifiy xato yuzaga kelish ehtimolligi mavjud, ikkinchidan S da konstruktordan foydalanishna asoslangan bu masalani hal etishni boshQa usuli ko’zda tutilgan. Konstruktor sinfi ob’ektni yaratish jarayonida initsiallaydi. U sinf nomiga mos keluvchi nom bilan belgilanadi va usulga (ma’nosiga ko’ra) sintaksis o’xshash bo’ladi. Ammo konstruktorlarda takrorlanuvchi turlar Qiymati aniQ ko’rsatilmaydi. Konstruktorning ma’no jihatidan umumiyligi: class – name ( ) ( G’G’ konstruktorning kodi ) Odatda konstruktorlar ma’lum sinflarning o’zgaruvchan ekzemplyariga boshlang’ich Qiymatni berishda yoki ob’ektni to’liQ shakllantirishda initsiallash jarayonining istalgan bosQichida Qo’llaniladi. Hamma sinflar u aniQlangan yoki yo’Q bo’lishga Qaramasdan konstruktorlariga ega. Teng holatda S da hamma o’zgaruvchan ekzemplyarlariga va hull mavjudligi ko’zda tutilgan. Agar sinf uchun konstruktor aniQ belgilab olingan bo’lsa teng holatni konstruktordan foydalanilmaydi. Oddiy misolni ko’rib chiQamiz. G’G’ Oddiy konstruktorga misol. using System; konstruktor myclass sinfi class my class ( )( xqic; ) (class consdemo { public static void Main ( ) { My class t1-new Myclass ( ); My class t2-new Myclass ( ); console. Writeline (t1.x Q “”Q t2.x.); Ushbu misolda Myclass sinfidagi konstruktordan foydalanilgan. public Myclass x-10; Konstruktor public ko’rinishida aniQlangan deb belgilab olamiz. Bu konstruktorlar kodi myclass t1-new myclass (); Bu konstruktor uning sinfi chegarasidan tashQaridan chiQarilganligi sababli Qilingan. Konstruktor myclass sinfi 10 Qiymatini o’zgaruvchan X ekzemplyarini o’zlashritib oladi. Bu konstruktor ob’ektni yaratishda new operatori deyiladi. Masalan myclass t1kodi Qatorida. Konstruktor t1 ob’ektni yaratishda,X10 Qiymatigi t1 o’zgaruvchini berishda myclass operatori chaQiriladi. Shu narsa t2 ob’ektda ham bo’ladi. O’zgaruvchan konstruktor t2 chaQirilgandan so’ng X10 Qiymatini oladi. Shunday Qilib, programmaning bajarilishi natijasida Quyidagi Qiymatlar keltirib chiQaradi: 10 10. Qiymatli konstruktorlar. Oldingi misolda Qiymatsiz konstruktorlardan foydalanilgandi. Buni ayrim hollarda Qo’llash mumkin, lekin ko’pchilik hollarda bir yoki bir necha parametrli konstruktorlardan foydalaniladi. Qiymatlarni parametrda Qo’llanilishi uni metodda Qo’llanilishidek bo’ladi. Quyidagi misolda Qiymatlarga ega bo’lgan konstruktor myclass sinfi keltirilgan. G’G’ Qiymatlarga ega bo’lgan parametrni Qo’llanilishi. using System; class my class ( public int x; public my class (int 1 ) x-i; (class Parmconsdemo { public static void Main ( ) { My class t1-new Myclass ( ); My class t2-new Myclass ( ); console. Writeline (t1.x Q “”Q t2.x.); Quyida shu programmani bajarilish natijalari keltirilgan. 20 88. Konstruktorga Vehicle sinfini Qo’shish. Konstruktor my class ( )ni my class ( ) sinfida o’zgaruvchan x ekzemplyarga boshlang’ich Qiymatni beruvchi bitta parametr (int tipidagi –i o’zgaruvchi) mavjud. Demak my class t1 q new Myclass (10) operatori bajarilgandan so’ng 10 Qiymat i parametrga uzatiladi va keyin x o’zgaruvchan tomonidan o’zlashtiriladi. G’G’ Vehicle sinfiga konstruktorni Qo’shish. Vehicle sinfini ob’ektni yaratishda avtomatik ravishda o’zgaruvchan passegres ga initsiallanuvchi konstruktorni Qo’shish orQali takomillashtirish mumkin. Kodni Vehicle sifini yaratuvchi Qatoriga e’tiborni Qarating. Programmada Vehicle sinfining konstruktori aniQlangan yangi versiyasidan foydalanilgan. G’G’ Bu programmada Vehicle sinfining yangi turi Qo’llaniladi Using system; Class Vehicle; Public int passegres; G’G’ yo’lovchilar miQdori Public int fuelcap; G’G’ bakdagi yoQilg’ining hajmi Public int mpg ; G’G’ joylashish masofasi G’G’ avtomabillning bir marta yurishi G’G’ Vehicle sinfining konstruktori . Public Vehicle (int p, int f, int m){ passengersqp; Vehicle sinfining konstruktori fuelcapqf; mpgqm; ) G’G’ Metod avtomabil to’la bak bilan bosim o’tish mumkin bo’lgan maksimal masofa Qiymatini Qaytaradi. Public int range (); Return mpg * fuelcap; G’G’ Metod unga parametr sifatida beriladigan masofa Qiymatini bosib o’tish miQdorini hisoblab beradi. public double fuelneeded (int miles) return (double) miles G’mpg; ) ) class vehconsdemo { public static void Main () { G’G’ Vehicle sinfida ikkita ob’ekt yaratish. Konstruktordan foydalanib Vehicle sinfi ob’ekti avtomabili xarakteristikasini uzatish. minivan va sportcar ob’ektlarini yaratishda Vehicle ( ) konstruktor bu ob’ektlarni o’zgaruvchanlariga boshlang’ich Qiymatlarini beradi. Har Qanday ob’ekt ko’rsatiladigan argument bo’yicha initsiallanadi. Masalan kodni Qatorida Vehicle minivan – new Vehicle (7, 16, 21); Vehicle sportcar – new Vehicle (2, 14, 12); double gallons; int distq252; gallonsqminivan.fuelneeded (dist); console.Writeline (“borish”Qdist Q “mikroavtobus mili” Q talab etiladi Q “gallons”Q “gallon yoQilg’isi”.); gallonsq sportscar.fuelneeded(dist); console.Writeline (“borish”Qdist Q “sportmashinasi mili” Q talab etiladi Q “gallons”Q “gallon yoQilg’isi”.); Oldingi versiyadagidek ushbu programmani ham bajarilishda ob’ektni yaratishda ( operatorini bajarishda) 7, 16 va 21 Qiymatlar konstruktorga uzatiladi. Demak, passegres, mpg va fuelcap ob’ekti tegishlicha 7, 16 va 21 Qiymatlarga ega bo’ladi. Minut praktikumi. 1. Konstruktor nima? U Qachon bajariladi? 2. Konstruktorda Qaytariladigan Qiymatini tipi ko’rsatadiladimi? New operatori Sinf va konstruktorlar haQida bilib olganimizdan keyin New operatorini ko’rib chiQamiz. Bu operator Quyidagi sintaksisga ega: slass-var-new class-name (): Bunda slass-var so’z birikmasi – class tipi o’zgaruvchanning nomi oldidan Qo’yilayotgan yaratilayotgan o’zgaruvchanlik, class-name esa nusxasi yaratilayotgan sinfning nomi. (Aytish mumkinki, slass va class-name so’zlari o’rniga nusxasi yaratilayotgan bir sinf nomi ko’rsatiladi. Aylanma Qovuslar bilan tugalanadigan sinf nomi sinf kontstruktori hisoblanadi. Agar sinf o’z konstruktoriga ega bo’lmasa, new operatori S# ko’rinishidagi o’z konstruktorini ishlatadi. Demak, new operatori istalgan sinf ob’ektini ishlatish mumkin. Xotira o’lchami cheklangani sababli, new operatori 2 ta ob’ektga yetarli xotira ajrata olmaydi taxmini bor. Agar bu sodir bo’lsa, programma bajarishning keskin axvoli sodir byuo’ladi. (Keskin axvollar bilan ishlashni 9 glavadan bilib olasiz). Bu kitob programmalari bilan ishlashda xotira sig’imi yetmasligi bilan xavotirlanmasligingiz mumkin, lekin kelajakda o’z programmalaringiz bilan ishlashda buni inobatga olishingiz kerak. Professional javoblari Savol. Nega oddiy tipdagi o’zgaruvchanliklarni yaratishda new operatorini ishlatish zarurligi yo’Qoladi (int yoki float kabi)? Javob. S# da oddiy tipdagi o’zgaruvchanlik o’zi o’z Qiymatini saQlaydi. Ushbu o’zgaruvchanlikni saQlash uchun xotira programmani kompirlashda avtomatik ajratiladi va new operatori orQali xotirani yaQQol ajratish zarur emas. Sso’lkali tipdagi o’zgaruvchanlik esa fakat ob’ektga sso’lka saklaydi. Ob’ekt saQlash uchun xotira dinamik ajratiladi (programma bajarish vaQtida). Oddiy tipdagi o’zgaruvchanliklarni o’zgarishi cso’lkali tipdagi o’zgaruvchanlikka aylanishi programma ishini sezilarli susaytirishi mumkin. Sso’lkali tipdagi o’zgaruvchanlik ishlatilganda Qiymatlarga noto’g’ri Qaraladi, bu programma tezligini pasaytiradi. Eksperiment uchun oddiy tipdagi o’zgaruvchanliklarni new operatori bilan ishlatish mumkin int i q new int (); Bunda int tipi uchun konstruktor chaQiriladi, bu i o’zgaruvchanga boshlang’ich 0 ni beradi. Ammo ta’kidlash kerakki, bunda xotira dinamik ajratilmaydi. Ko’pchilik operatorlar oddiy tipdagi o’zgaruvchanliklarga new operatorini ishlatishmaydi. Destruktorlar va “axlat yig’ish” Siz bilasizki, new operatorini ishlatganda ob’ektlar uchun xotira dinami ajratiladi. Xotira sig’imi chegaralanganligi sababli, kerakli ob’ektni new operatori yordamida noto’g’ri yaratish extimoli bo’ladi. Shuning uchun xotirani dinamik ajratish sxemasini asosiy komponenti – bu ishlatilmayotgan ob’ektlardan xotirani bo’shatish va yangi ob’ektlar uchun belgilash. Ko’p tillarda avval belgilangan xotirani bo’shatish programmasi Qo’lda bajariladi (masalan, SQQ da xotirani bo’shatish uchun delete operatori ishlatiladi). S# buning uchun ancha effektliroQ mexanizmga ega, bu “axlat yig’ish” deyiladi. S# programmada ob’ektga muloQot bo’lmaganda, u ishlatilmaydigan ko’rinishda bo’ladi va sistema programmistdan so’ramasdan avtomatik band bo’lgan va keyinchalik yangi ob’ektlarga ajratish mumkin bo’lgan xotirani bo’shatadi. Butun programma mobaynida “axlat yig’ish” ishlab turadi, bu operatsiyani boshlanishi uchun iki shart – birinchidan, xotiradan bo’shatish mumkin bo’lgan ob’ektlarning mavjudligi, ikkinchidan, ushbu operatsiyaning zarurligi. “Axlat yig’ish” protsessi bir muncha vaQt olgani sababli, programmani bajarish sistemasi faQat zarur vaQtda ishlaydi, programmist bu Qachon amalga oshishini bila olmaydi. Destruktorlar S# da “axlat yig’ish” operatsiyasi yordamida xotiradan ob’ektlarni yo’Qotishdan oldin bajariladigan uslubni yaratish imkoniyati inobatga olingan. Bu uslub «destruktor” deyiladi va ob’ektni xotiradan to’g’ri yo’Qotish uchun garantiya hisoblanadi. Masalan, destruktor yordamida ishonch hosil Qilish mumkinki, Ushbu ob’ektga Qaratilgan fayl yopiladi. Destruktor Quyidagi sintaksisga ega: ~slass-name()G’G’destruktor kodi Bu yerda Class-name so’z birikmasi – sinf nomi. Destruktor konstruktor kabi chaQirtiriladi, faQat destruktorda tilda (~) belgisi sinf nomidan oldin Qo’yiladi. Aytish lozimki, destruktor aniQlanganda Qaytarilayotgan Qiymatning tipii ko’rsatilmaydi. Destruktorni Qo’shish uchun sinfga kod Qo’shiladi (ya’ni destruktor sinfning oddiy bo’lagi hisoblanadi). Destruktor ichida xotira Qaytgandan keyingi harakatlar belgilanadi. Destruktor o’zining sinf ob’ekti xotiradan o’chishida doimo chaQiriladi. Tushunish zarurki, destruktor «axlat yig’ish” operatsiyasi boshlanishidan oldin chaQiriladi. (Sinf ob’ekti ko’rinish darajasidan uzoQda bo’lganda chaQirilmaydi. Bu bilan C# destruktorlari CQQ destruktorlaridan farQ Qiladi). Bu destruktor kodi Qachon bajarilishini aniQlash mikoni yo’Qligidan dalolat beradi. Undan tashQari, programma programma «axlat yig’ish” poeratsiyasi boshlanishidan oldin ishni tugatishi mumkin, bu holda destruktor umuman chaQirilmaydi. Proekt 4-2. Destruktorla ishini ko’rgazmasi. Aytib o’tildiki, agar ob’ektlar programmada boshQa ishlatilmasa, ularni yo’Qotish majburiy bo’lmaydi. “Axlat yig’ish” faQatgina effektiv bajarilishi mumkin bo’lgan holda bajariladi (odatda bir nechta ob’ektlarga bir vaQtda). Shuning uchun destruktor ishini ko’rsatish uchun ob’ektlarning ko’plab sonini yaratish va yo’Qotish zarur. Aynan shunga biz ushbu proektni bag’ishlaymiz. Ketma-ket instruksiya 1. YAngi fayl yarating va uni Destruct.cs deb nomlang. 2. Destruct sinfni pastda ko’rsatilgandek yarating: Class Destruct Int x; Public Destruct (int i) ( x-i G’G’ ob’ekt xotiradan yo’Qotilayotganda chaQiriladi ~Destruct () ( Console.WriteLine(Ob’ektdan xotirani yo’Qotish); G’G’uslub srazu yo’Qotiladigan ob’ektni yaratadi. Public void generator(int i) ( Destruct 0qnew Destruct (i); Konstruktor o’ziga argument sifatida o’tkaziladigan x Qiymatli o’zgaruvchanni o’zlashtiradi. Ushbu programmada destruktor o’zgaruvchan x yordamida ekran yo’Qotiladigan ob’ektning nomerini beradi. Alohida Destruct ob’ektini yaratadigan va shu zaxoti yo’Qotadigan generator () uslubiga ahamiyat bering. Qo’llanmaning keyingi punktida Qanday bajarilishini ko’rasiz. 3. DestructDemo sinfini yarating: Class DestructDemo: Public static void Main () { Int count; Destruct ob – new Destruct (0); G’* so’ngra for sikli yordamida ob’ektlarning ko’p miQdori yaratiladi. Bo’sh xotiraning barchasi ishlatilgandan so’ng «axlat yig’ish” operatsiyasi amalga oshiriladi. Buning uchun kearkli ob’ektlar soni kompyuter xotirasi sig’imiga bog’liQ, shuning uchun siklini shartli ravishda ko’rsatayotgan son ko’paytiriladi (sikl o’tish miQdori) *G’ for (count I; count – 100000’ count QQ) ob.generator(count); } } Boshida eshbu sinfda ob Destruct ob’ekti yaratiladi. So’ngra ushbu ob’ekt va generator uslubi yordamida 100000 ta ob’ekt yaratiladi. Natijada programma bajarilishini ayrim etapida faQatgina yaratilmay, balki yo’Qotilib ham turiladi, shunda turli etaplarda “axlat yig’ish” amalga oshib turadi. Qachon va Qancha tez ushbu bajarilishi bir necha faktorlarga bog’liQ – bo’sh xotiraning boshlang’ich sig’imi, operatsion sistemaning tipi va boshQa. Lekin ma’lum vaQtdan so’ng ekranda destruktor tomonidan xabarlar paydo bo’ladi. Agar bunday xabarlar chiQmasa, yaratilayotgan ob’ektlarni for siklidagi count o’zgaruvchilar yo’li bilan oshirish kerak. 4. Quyida DextructDemo.cs programmasi ketma-ketligi ko’rsatilgan: G’* proekt 4-2. Bu programmada destruktor ishi ko’rsatiladi. G’* using system; class Destruct { public int x; public Destruct (int i) { x-i } G’G’Xotiradan ob’ekt yo’Qotilganda chaQiriladi. ~Destruct () { Console.WriteLine(“Destructing” Q x); } G’G’uslub srazu tozalanadigan ob’ektni yaratadi. Public void generator(int i) ( Destruct 0qnew Destruct (i); } } classDestructDemo{ public static void Main () { int count; Destruct ob – new Destruct (0); G’* so’ngra for sikli yordamida ob’ektlarning ko’p miQdori yaratiladi. Bo’sh xotiraning barchasi ishlatilgandan so’ng «axlat yig’ish” operatsiyasi amalga oshiriladi. Buning uchun kearkli ob’ektlar soni kompyuter xotirasi sig’imiga bog’liQ, shuning uchun siklini shartli ravishda ko’rsatayotgan son ko’paytiriladi (sikl o’tish miQdori) *G’ for (count I; count – 100000’ count QQ) ob.generator(count); } this kalit so’zi Ushbu glava oxirida this asosiy so’zini ishlatilishini ko’rib chiQamiz. Uslub chaQirilganda unga avtomatik ravishda chaQirilayotgan ob’ektga sso’lka sifatida noaniQ argument beriladi (ya’ni uslub ishlaydigan ob’ektga nisbatan). Bu ko’rsatma this deyiladi. This ko’rsatmasi Qanday ishlashini tushunish uchun Pwr sinfi Qo’llaniladigan programmani ko’ramiz. Using system Class Pwr { Public double b; Public int e; Public double val; Public Pwr (double num, int exp) { b – num; e – exp; val – 1; of (expqq0) return; for( ; exp>0; exp--) val – val * b; public double get_pwr () { return val; class DemoPwr { public static void Main () { Pwr x – new Pwr(4.0, 2) Pwr y – new Pwr(2.5, 1) Pwr z – new Pwr(5.7, 0); Console.WriteLine (x.b. Q “ B “ Q x.e. Q “-y stepeni – “ Q x.get_pwr()); Console.WriteLine (y.b. Q “ B “ Q y.e. Q “-y stepeni – “ Q y.get_pwr()); Console.WriteLine (z.b. Q “ B “ Q z.e. Q “-y stepeni – “ Q .get_pwr()); Bilasizki, uslubda ichida boshQa sinf vakillariga ob’ekt yoki nomi bilan amalga oshiriladi. Shuning uchun get_pwr uslubi ichida return val; operatori bajarilganda chaQirilayotgan ob’ekt bilan bog’langan val o’zgaruvchan nusxasi chaQiriladi. Lekin shu operatorni Quyidagicha yozish mumkin: return this.val; Bu yerda this sso’lkasi get_pwr (; uslubi chaQirgan ob’ektga ko’rsatadi. Demak this val o’zgaruvchan ushbu ob’ektda val o’zgaruvchanning nusxasi hisoblanadi. Masalan, get_pwr () uslubi x ob’ektga nisbatan chaQirilgan bo’lsa, unda this sso’lkasi ilgarigi operatorda ob’ekt x ni ko’rsatadi. Aytish mumkinki, operatorni this so’zini ishlatmasdan yozish yozuvning QisQa formasi hisoblanadi. Quyida pwr ni barcha sinfi this kalit so’zi bilan ko’rsatilgan: using system; class pwr { public double b; public int e; public double val; public Pwr(double num, int exp) { this.b – num; this.e – exp; this.val – 1; if(exp—0) return; for( ; exp0; exp--) this.val q this.val this.b; } public double get_pwr() { return this.val; } } Hech Qanday yaxshi programmist C# tilida Pwr sinfini bunday yozmaydi, chunki bu hech Qanday ustunlik bermaydi. Lekin ayrim hollarda this sso’lkasi foydali bo’lishi mumkin. Masalan, C# sintaksisi o’zgaruvchan va ularnig nusxalari uchun bir xil nomni ishlatishni imkonini beradi. Bu sodir bo’lganda, lokal nom o’zgaruvchan nusxasini berkitadi va unga yo’lni faQatgina this sso’lkasi orQali topsa bo’ladi. Masalan, Quyida keltirilgan Pwr () konstruktori sintaksik bor hisoblanadi, lekin bu stilni ishlatish tavsiya etilmaydi. Public Pwr(double b, int e) { This.b – b; This.e – e; Val – 1; if(e- -0) return; for(; e0; e- -) val – val * b; } Ushbu versiyada Pwr() konstruktori parametrlar nomi va nusxalar nomi bir xil, shuning uchun o’zgaruvchanlar berkitiladi. Agar siz this sso’lkasini ishlatayotgan bo’lsangiz o’zgaruvchan nusxasini “ochishiz” mumkin. Kontrol savollar 1. Sinf va ob’ektning farQi nimada? 2. Sinf Qanday aniQlanadi? 3. Har bir ob’ekt nimaning nusxaisga ega bo’ladi? 4. Ikkita alohida operatorni ishlatgan holda Mycounter sinfidagi counter nomli ob’ektni Qanday chaQirish mumkin. 5. double a Qiymatini Qaytaruvchi va ikkita a va b parametrlari bo’lgan myMeth uslubini aniQlashni yozing. 6. Uslub Qiymatni Qaytarsa uslubdan boshQaruv kelib chiQadimi? 7. Kontsruktor Qanday nomga ega? 8. new operatori Qanday funksiyani bajaradi? 9. “axlat yig’ish” bu nima? Bu operatsiya Qanday bajariladi? Destruktor bu nima? 10. this kalit so’zini ma’nosini tushuntirib bering? Glava 5. Ma’lumotlar xillari va operator haQida Massivlar string operatorlari foreach sikli Operator? Bu glavada C# operatori va ma’lumotlar tipiga Qaytish uchun string tipi massivlar va operatorlarni ko’rib chiQamiz, hamda foreach sikli haQida gapiramiz. Massivo’ Massiv – bu bir xildagi o’zgaruvchanlarning kolleksiyasi. Massivga Qaratilganda shu tipning Qiymati berilgan elementning nomi va indeksi ko’rsatiladi. Massivlar ham bir o’lchamli ham ko’po’lchamli bo’lishi mumkin, ko’pincha biro’lchamlilar ishlatiladi. Massivlar ko’p masalalarni xal etishga yordam beradi, chunki bir tipdagi o’zgaruvchanga Qulay muhit yaratiladi. Masalan, siz massivni oy davomida kunlik o’rtacha harorat yoki kursdoshlar haQida ma’lumot va boshQa ma’lumotlar uchun ishlatishingiz mumkin. Massivdagi ma’lumotlar shunday tashkillashtirilganki, ular bilan oson ishlash mumkin, aynan shunda massivning asosiy tarafi ko’rinadi. Masalan, massiv abiturientning baholari haQida axborot saQlasa, imtihon topshiruvchining o’rtacha balini hisoblash mumkin. Bundan tashQari, bu ma’lumotlar oson ajratiladi. C# da massivlarni boshQa programmalarning tillariga o’xshab ishlatish mumkin, faQat bitta yaxshi tomoni bor. Bu shundan iboratki, da massivlar ob’ekt sifatida ko’riladi, shuning uchun ushbu kitobda avval ob’ektlar so’ngra massivlar ko’riladi. Massivlarni bunday ishlatilishining sababi C# -programmalarda Qo’shimcha imkoniyatlar paydo bo’ladi, masalan, “axlat yig’ish” jarayonida ishlatilmaydigan massivlar xotiradan tozalanadi. Bir o’lchamli massivlar Biro’lchamli massiv – bu bir turdagi o’lchamlar ro’yxati. Programmirovaniyada bu ro’yxat teztez uchrab turadi. Masalan, biro’lchamli massivni aktiv ishlatuvchilarning schetlaridagi nomerlarni saQlashga yoki basketbol komandasining Quyidagi reytingini saQlashga ishlatiladi. Bir o’lchamli massivni ishlatish uchun Quyidagi sintaksis ishlatiladi: type: } array-name q new type[size]; Bu yerda type so’zi massivni turini ko’rsatadi, ya’ni massiv tashkil topgan xar bir elementning ma’lumotlar turini. Massiv elementlaridan keyingi kvadrat Qovuslarga axamiyat bering. Bu Qovuslar yordamida biro’lchamli massiv ajratiladi 9bu bobda ikio’lchamli massiv Qanday ajratilishi ko’rsatiladi). Masivga joylashtirilishi mumkin bo’lgan elementlar soni size kattaligi bilan o’lchanadi. Massivlar ob’ektlar sifatida tarQalgani sababli massiv yaratish protsessii iki etapdan iborat. Birinchi etapda masiv nomi ma’lum Qilinadi – sso’lkali o’zgaruvchan turi. Ikinchi etapda massivga xotira ajratiladi va xotira massividagi o’zgaruvchanga sso’lka Qo’yiladi. YA’ni C# da new operatori yordamida massivga xotira dinamik ajratiladi. IZOH Agar sizda S yoki SQQ da programmalashtirish tajribasi bo’lsa, unda C# da masivni chaQirishga axamiyat Bering. AniQrog’i, C# da kvadrat Qovuslar massiv nomini eemas, tipini ko’rsatadigan kalit so’zdan keyin Qo’yiladi. Keyingi kodli Qator 10 ta elementdan iborat int tipidagi massivni yaratadi va unga sso’lka sample tipidagi o’zgaruvchan hisoblanadi: int[] sample q new int[10]; Massiv ob’ekt kabi chaQiriladi. sample o’zgaruvchani xotiradagi adresga new operatori orQali ajratilgan sso’lkani saQlaydi. int tipidagi 10 ta elementni saQlash uchun xotira yetarli. Massivni chaQirish (xuddi ob’ektni chaQirish kabi) ikki operator yordamida bajarish mumkin. Masalan, int[] sample; sample q new int[10]; Bu holda sample massivi o’zgaruvchani Qandaydir fizik ob’ektga Qaratilmaydi. FaQatgina ikkinchi operator bajarilgandan so’ng o’zgaruvchandan massivga Qaratiladi. Massivning alohida elementiga dostup indeks yordamida bajariladi. Bu yordamida elementning pozitsiyasi massiv ichida ko’rsatiladi. Massivning birinchi elementi C# da nol indeksga ega. sample massivi 10 ta elementdan tashkil topganligi sababli, bu massiv elementlari indeksi Qiymati 0 bilan 9 orasida joylashadi. Massivni indeksatsiyasi uchun kvadrat Qovuslarda elementlar sonini ko’rsatish zarur. Shuning bilan, sample massivining birinchi elementi sample[0], oxirgisi esa sample[9] ko’rinishda ko’rsatiladi. Masalan, Quyida ko’rsatilgan programmada sample massiviga 0 dan 9 gacha bo’lgan Qiymatlar joylashtiriladi. G’G’ programmada biro’lchamli massivni ishlatish ko’rsatilmoQda. Using system; Class ArrayDemo { Int[} sample – new int[10]; Int I; For(i-0; i Sample[i] – I; For(i-0; i Console.WriteLine(“sample” elementiga [ “ Q I Q “ ] Qiymati berilgan: “ Q sample[i]); } } Natijada programma ishlash jarayonida Quyidagi 10 Qator ko’rsatiladi: sample [0] elementiga 0 Qiymat berilgan; sample [1] elementiga 1 Qiymat berilgan; sample [2] elementiga 2 Qiymat berilgan; sample [3] elementiga 3 Qiymat berilgan; sample [4] elementiga 4 Qiymat berilgan; sample [5] elementiga 5 Qiymat berilgan; sample [6] elementiga 6 Qiymat berilgan; sample [7] elementiga 7 Qiymat berilgan; sample [8] elementiga 8 Qiymat berilgan; sample [9] elementiga 9 Qiymat berilgan. sample massivi sxematik Quyidagi ko’rinishga ega: 0 1 2 3 4 5 6 7 8 9 sample [0] sample [1] sample [2] sample [3] sample [4] sample [5] sample [6] sample [7] sample [8] sample [9] Bir turdagi o’zgaruvchanlarning kata miQdori bilan ishlashga Qulay bo’lgani uchun massivlar programmalashtirishda keng Qo’llaniladi. Masalan, Quyida ko’rsatilgan for siklidagi nums massividagi elementlarni ishlash programmasi yordamida ushbu masivning maksimal va minimal elementlar Qiymatini topish mumkin. G’G’ programma massiv elementlar Qiymatining maksimal va minimal Qiymatlarini topadi. Using system; Class MinMax { Public static void Main(} { Int {] nums q new int[10]; Int min, max; nums[0] – 99; nums[1] – 10; nums[2] – 100123; nums[3] – 18; nums[4] – 978; nums[5] – 5623; nums[6] – 463; nums[7] – 9; nums[8] – 287; nums[9] – 49; min q max – nums[0]; for(int iq1; I < 10; iQQ) { if(nums[i] < min) min q nums[i]; if(nums[i] < max) max q nums[i]; } Console.WriteLine(“Minimal Qiymat: “ Q min Q “,“ Q max Q “); } Bu programmani bajarish natijasi Quyidagicha: Minimal Qiymat: -978, maksimal Qiymat: 100123 Massiv initsializatsiyasi Avvalgi programmada nums massiv elementlariga Qiymat Qo’lda 10 ta operator yordamida Qilingan edi. Bu operatsiya bajarishni ancha effektiv yo’li mavjud. Masivni initsializatsiyalashni uni yaratilishi bilan boshlash mumkin. Biro’lchamlik massivni umumiy sintaksis initsializatsiyasi Quyidagicha: type[} array-nameq{vall, val2, … , valN; Bu yerda boshlang’ich Qiymatlar vall dan valN gacha ko’rsatilgan. Massiv elementlariga Qiymatlar navbat bilan chapdan o’ngga 0 indeksli elementdan boshlab beriladi. C# da massivga avtomatik xotira sig’imi beriladi, bunda new operatorini yaQol ishlatish zarurligi tug’ilmaydi. Quyida MinMax programmasini ancha Qulay yozish uslubi ko’rsatilgan: Using system; Class MinMax { Public static void Main() ( Int[] nums q { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 ); Int min, max; Minqmax – nums[0]; For(int iq1; i < 10; iQQ) { If(nums[i] < min) min – nums[i]; If(nums[i] < max) max – nums[i]; } Console.WriteLine(“Minimal Qiymat: “ Q min Q “,“ Q max Q “); } } Bunda zaruriyat bo’lmasa ham, eksperiment sifatida massiv initsializatsiyasi uchun new operatorini ishlatishiz mumkin. Masalan, nums initsializatsiyasi uslubi Qoidaga Qarshilik Qilmaydi, new operatori esa shat emas. Int[] nums q new int[] { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49;; Bu holda nums massiv o’zgaruvchani birinchi operatorda chaQiriladi, ikinchisida esa initsializatsiyalanadi. Indekslar chegara Qiymatlari ustidan QattiQ nazorat C# da masiv elementiga murojat etish kuchli nazoratda bo’ladi. Massiv indeks Qiymati chegarasidan oshmaydigan indeks ko’rsatilishi lozim, aksi holda programma bajarilishda xatoga yo’l Qo’yiladi. Bunga ishonch hosil Qilish uchun ataylab mavjud bo’lmagan indeks ko’rsatilgan keyingi programmani tekshirib ko’ring (ya’ni mavjud bo’lmagan elementga murojat etish harakati amalga oshiriladi). using system class ArrayErr { Public static void Main() ( Int[] sample – new int[10]; Int i; for siklini shartli ko’rinishida i o’zgaruvchani sample massivi indeks Qiymati chegarasidan oshadigan indeksni oladi. for {i – 0; i < 100; i - iQ1) sample[i] – 1; } } Programma bajarilishining ma’lum etapida I o’zgaruvchaniga 10 Qiymat beriladi. 10 indeksli elementga murojat etish harakatida programma yopiladi va IndexOutOfRangeException ob’ekti yopiladi. DaQiQali amaliy ish 1. Massiv elementiga nima orQali muroja etiladi? 2. 10 ta elementdan iborat char massivini Qanday chaQirish mumkin? 3. C# programma bajarilishi davomida massiv indekslarining chegara Qiymatlarini bajarilmasligi to’g’rimi? Proekt 5-1. Massiv sortirovkasi Biro’lchamli massivda ma’lumotlar indekslangan to’g’ri ro’yxatda joylashgani sababli, ularni sortirovkalash oson. Ularning ichida tez sortirovkalash algoritmi, havochali algoritm va Shell uslubi yordamidagi algoritm sortirovkasini ajratish mumkin. Eng sosn, soda va tushunarli – bu havochali algoritm hisoblanadi. Uncha effektiv bo’lmasa ham (katta massivlarni sortirovkalash uchun to’g’ri kelmaydi), lekin kata bo’lmagan massivlarga ishlatilishi mumkin. Qo’llash yo’riQnomasi 1. Fayl yarating va uni Bubble.cs deb nomlang. 2. Havochali algoritm sortirovkasi o’z nomiga ishining prinsipi bilan mos ega bo’ldi. Uni yaxshilab ko’rib chiQamiz. Tasavvur Qilamizki, 20 ta elementdan iborat massiv mavjud, ularni o’sishi bo’yicha sortirovkalash kerak. 2ta yonida turuvchi Qiymatlar solishtiriladi. Agar ikkinchi elementning Qiymati birinchisinikidan kam bo’lsa, unda ayrim oraliQ o’tkazuvchanga birinchisining nomi beriladi, birinchisiga esa oraliQning Qiymati beriladi. Aytish mumkinki, elementlar joy almashadi, kam Qiymatli element massivning chap chegarasiga o’tadi. Buni havoning suvda harakatlanishiga taQQoslash mumkin – chuQurlikdan tepaga, shuning uchun algoritm shunday nomlangan. 20 ta elementdan iborat massivda barcha Qo’shni elementlarni taQQoslash uchun (birinchini ikkinchi bilan, ikinchini uchinchi bilan va h.k.) 20 – 1 q 19 taQQoslashni bajarish zarur, bunda eng kichik Qiymat so’nggi elementda (yigirmanchida) Qoladigan bo’lsa, uning massiv boshiga harakatlanishi uchun 19 ta harkatni bajarish zarur. YA’ni ikkita siklni tashkillashtirish zarur – tashQi va ichki, har biri 19 marta bajarilishi zarur. Pastda havochali algoritmi yadrosini tashkil etuvchi kod fragmenti keltirilgan. Elementlar sortirovkasi bajariladigan massiv nums deyiladi. G’G’ havochali algoritm sortirovkasi kodi for (aq1; a < size; aQQ) for(bqsize-1; b > q a; b - -) { if(nums[b-1] > nums[b]) { G’G’ Agar avvalgi element Qiymati keyingisidan katta bo’lsa, ular “joylari bilan almashadi”.G’G’ t q nums[b-1] – nums[b]; nums[b] – t; } } Ushbu abzatsdagi material yaxshi o’zlashtirilishi uchun yana bir bor havochali algoritm prinsipini Qaytarib o’tamiz. Algoritm 2 ta for sikli asosida Qurilgan. Bir biriga yaQin turgan elementlar Qiymati ichki siklda tekshiriladi. O’sib borish asosida turmagan elementlar parasi topilganda, ular joy bilan almashadi.Har bir o’tkazilganda kichik Qiymatli elementlar o’zining Qiymatiga yarasha harakatlanadi. TashQi sikl bu protsesni massivdagi barcha elementlar sortirovkalanishigacha Qaytaradi. 3. Quyida Bubble programmasining barcha kodi keltirilgan. G’* Proekt 5-1. Programmada massiv elementlarining havochali algoritm sortirovkasi ko’rsatilgan. *G’ using System; class Bubble { public static void Main () { int[] nums – { 99,-10, 100123, 18, -978, 5623, 463, -9, 287, 49 } int a, d, t; int size; size q 10; G’G’ Massiv elementlari soni. G’G’ Birlamchi massiv elementlar Qiymatini ko’rinishi. Console.Write(“Birlamchi massiv elementlar Qiymati: G’n”); for(int iq0; i < size; iQQ) Console.WriteLine(); G’G’ Bu havochali algorim sortirovkasi kodi. for(a-I; a < size; aQQ) for(bqsize-1; b>-a; b—{ if(nums[b-1] > nums[b] { G’G’ Agar avvalgi element Qiymati keyingisidan katta bo’lsa, ular “joylari bilan almashadi”.G’G’ t q nums[b-1] – nums[b]; nums[b] q t; } } G’G’ Sortirovkalangan massiv elementlar Qiymatini ko’rinishi. Console.Write(“Sortirovkalangan massiv elementlar Qiymati: G’n”); for(int iq0; i < size; iQQ) Console.WriteLine(“ “ Q nums[i]); Console.WriteLine(); } } Quyida ushbu programani bajarish natijasi ko’rsatilgan. Birlamchi massiv elementlar Qiymati: 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 Sortirovkalangan massiv elementlar Qiymati: -978, -10, -9, 18, 49, 99, 287, 463, 5623, 100213 kata bo’lmagan massivlar uchun havochali algoritm orQali ma’lumotlar sortirovkasi to’g’ri kelsa, katta massivlar bilan ishlashga mo’ljallanmagan. Tez sortirovkalash algoritmi eng yaxshi universal algoritm hisoblanadi. Lekin u C# ning sizga noma’lum bo’lgan tiliga asoslangan, bu algoritm haQida 6 bobda to’xtalamiz. Ko’po’lchamli massivlar Biro’lchamli massivlar programirovaniyada eng ko’p tarQalgan hisoblanadi, lekin ko’po’lchamlilari ham unchalik kam uchramaydi. Ko’po’lchamli bo’lib iki yoki undan ko’p shakllarga ega, alohida elementiga yo’l esa iki va ko’p indekslarni ko’rsatish bilan amalga oshiriladigan masivlarga aytiladi. Ikkio’lchamli massivlar Ko’po’lchamlik massivlarni ichida eng soddasi ikkio’lchamli massiv hisoblanadi. Unda konkret element joylashuvi ikki indeks bilan aniQlanadi. Ikkio’lchamli massivni axborot jadvali sifatida ko’rish mumkin, unda bir indeks Qator nomeri, ikinchisi ustun nomerini ko’rsatadi. Ikkio’lchamli 10x20 katalikdagi table massivi Quyidagicha chaQiriladi: Int[,] table – new int[10, 20]; Axamit Bering, ushbu massiv chaQirilganda masivning ikki xil o’lchami vergul bilan ajratilgan. Operatorning birinchi Qismida kvadrat skobkalar ichidagi vergul yordamida ikio’lchamli massivga sso’lkali o’zgaruvchan yaratiladi. New operatori yordamida massivga xotira ajratish masivni ikinchi Qismini bajarishda chaQiriladi: New int[10, 20] Bunda o’lchami 10, 20 bo’lgan massiv yaratiladi. Axamiyat beringki Qiymatlar o’lchami vergul bilan ajratilgan. Masalan, table[3, 5] massivi elementiga 10 Qiymatni berish uchun Quyidagi operatorni ishlatish zarur: table[3, 5]q10; Quyida elementlariga 1 dan 12 gacha bo’lgan Qiymalar berilgan ikkio’lchamli massiv programmasi ko’rsatilgan va bu Qiymatlar ekranga iQarilgan. G’G’ programmada ikkio’lchamli massiv ishlatilishi ko’rsatilgan. Using system; Class Twod { public static void Main () { int t, i; int[,] table – new int [3, 4); for(t-0; t < 3; QQt); for(iq0; i < 4; QQi) { table[t,i]q(t*4)QiQ1; Console.Write(table[t, i] Q “ “); } Console.WriteLine(); } } } Ushbu programmada table {0, 0}elementi 1 Qiymatga ega, table [0, 1] – 2ga, table[0, 2] – 3 ga va h.k. table[2, 3] elementi 12 ga ega bo’ladi. Quyida massivni sxematik ko’rinishi berilgan. Izoh Agar sizda C, CQQ Java programmalarida ishlash tajribasi bo’lsa, axamiyat berinki, C# da ko’po’lchamli massivlar elementlariga yo’l ushbu tilarga mos bo’lmagan holda chaQiriladi. Ularda massiv va indekslarning har bir o’lchami alohida kvadrat Qovuslarda ko’rsatiladi, C# da esa ko’rsatilgan o’lchamlar vergul bilan ajratiladi. Ikkitadan ko’p o’lchamga ega bo’lgan massivlar C# da ikkidan ko’p o’lchamga ega bo’lgan massivlarni ishlatish mumkin, Quyida ko’po’lchamli massivning umumiy sintaksisi berilgan: type[,….,] name – new type[size1, size2,….,sizeN]; Masalan, keyingi operator bajarilishida butun sonli 3 o’lchamli 4x10x3 o’lchamli massiv yaratiladi: int[,,]multidimqnew int[4, 10, 3]; multidim[2, 4, 1] massiv elementiga 100 Qiymatni berish uchun, Quyidagi operatorni bajarish zarur: multidim[2, 4, 1] q 100; Ko’po’lchamli masivlari initsializatsiyasi Figurali Qovuslarga joylashtirilgan alohida blokdagi Qiymatlar ro’yxatini Qo’ygan holda ko’p o’lchamli massivni initsializatsiyalash mumkin. type[,] array_nameQ; {val, val, val,... val} {val, val, val,... val} { { { {val, val, val,... val}, }; Bu yerda val so’zi berilayotgan Qimatni ajratadi. Har bir ichki blok Qatordagi element Qiymatini beradi. Qator ichida birinchi ko’rsatilgan Qiymat Qatorning 0-chi elementida saQlanadi, ikkinchi Qiymat – birinchi elementda va h.k. Axamiyat bering, Qiymatlar saQlovchi bloklar vergul bilan ajratilgan, blokni yopuvchi figurali skobkadan keyin esa ; keladi. Keltirilgan Quyidagi programmada sqrs masivi initsializatsiyalangan, unda har bir elementga 110 oraliQdagi Qiymat va uning kvadrati beriladi. Using sytem; Class Squares { Public static void Main() { Int[,] sqrsq{ {1, 1}, {3, 9}, {4, 16}, {5, 25}, {6, 36}, {7, 49}, {8, 64}, {9, 81}, {10, 100} }; int i, j; for(iq0; Ii < 10; iQQ) { for(j-0; j < 2; jQQ) Console.Write(sqrs[i,j] Q “ “); Console.WriteLine(); } } } Quyida ushbu programmani bajarish ko’rsatilgan. 1. 1 2. 4 3. 9 4. 16 5. 25 6. 36 7. 49 8. 64 9. 81 10. 100 Tekkislanmagan massivlar Avvalgi programmada ikkio’lchamli massiv, ya’ni to’g’riburchakli massiv yaratilishi ko’rsatilgan edi. Jadvaliy ko’rinishda to’g’riburchakli massiv – bu ikkio’lchamlik massiv, unda Qatorla uzunligi bir xil. Bundan tashQari, C# da ikkio’lchamli massivning maxsus turini yaratish mumkin, u notekis massiv hisoblanadi. Tekislanmagan massiv – bu tashQi massiv, turli o’lchamlardagi massivlardan tashkil topgan. Notekis massivni turli uzunlikdagi Qatorlarni tashkil Qiluvchi jadval yaratish uchun ishlatish mumkin. Notekis massivlar chaQirtirilganda har bir o’lchamni alohida ko’rsatish uchun alohida Qovuslar juftligi ishlatiladi. Masalan ikkio’lchamli notekis massiv Quyidagicha chaQiriladi: Type[][] array-nameqnew type[size][]; Bu yerda Size so’zi massivdagi Qatorlar sonini ko’rsatadi. Qatorlar o’lchami ko’rsatilmaydi va ularga xotira ajratilmaydi. Har bir Qatorga alohida new operatorini ishlatish zarur. Bunday texnologiya turli uzunlikdagi Qatorlarni aniQlashga imkon beradi. Masalan, keyingi kod bilan jagged massivi e’lon Qilinganda xotira faQat tashQi massivga ajratiladi, so’ng esa 3 ta operator bajarilganda xotira har bir ichki massivga ajratiladi: int[] [] jagged – new int[3] []; jagged[0] – new int [2]; jagged[1] – new int [3]; jagged[2] – new int [4]; Bu operatorlar ketma-ket bajarilgandan so’ng notekis massiv Quyidagicha ko’rinishga ega: jagged[0] [0] jagged[0] [1] jagged[1] [0] jagged[1] [1] jagged[1] [2] jagged[2] [0] jagged[2] [1] jagged[2] [2] jagged[2] [3] Bu sxemani ko’rib chiQQandan so’ng nima uchun notekis massiv bunday nom olganini ko’rasiz. Notekis massiv yaratilganda, uning elementlariga yo’lni kvadrat skobkalardagi xar bir indeksni ko’rsatgan holda topish mumkin. Masalan jagged[2] [1] masiviga 10 Qiymatni berish uchun Quyidagi operatorni ishlaish zarur: jagged[2] [1]q10; Eslatma: to’g’riburchakli massiv elementlariga yo’lni topish uchun yozuvning o’zgacha formasi ishlatiladi. Quyidagi programmada notekis ikkio’lchamli massiv ishlatilishi ko’rsatilgan. Massivda aeroportda boish uchun marshrut taksidan foydalanadigan pasajirlar soni haQida ma’lumot saQlanadi. Marshrut taksi xafta kunlari mobaynida bir xil bo’lmagan reyslar sodir etgani sababli ( 10 ta reys begim kunlari va 2 ta dam olish kunlari), ma’lumotlarni saQlash uchun notekis riders masividan foydalanish mumkin. Axamiyat beringki, 2 chi o’lcham birlamchi 5 ta Qatorda 10 Qiymatga ega, Qolgan 2 ta Qatorga – 2. using system{ public static void main() { int[] [] riders – new int [7][]; riders [0] q new int[10]; riders [1] q new int[10]; riders [2] q new int[10]; riders [3] q new int[10]; riders [4] q new int[10]; riders [5] q new int[2]; riders [6] q new int[2]; int i, j; G’G’Massiv elementlariga ayrim Qiymatlar beriladi. For(i-0; I < 5; iQQ) For(jq0; j < 10; jQQ) Riders[i][j] q I Q j Q 10; Length xossasining Qo’llanishi S# da massivlar ob’ektlar sifatida amalga oshirilgan va bu massivlar bilan ishlashda muayyan afzalliklarni beradi. Ulardan biri – Length xossasini Qo’llash imkoniyatidir. Har bir massiv Length xossasi bilan assotsiatsiyalashish xususiyatiga ega. U massivlvrning maksimal miQdordagi elementlari haQidagi axborotlarni o’z ichiga oladi (ya’ni, massivlarda (sinf nazarda tutilgan) massivlarni uzunligi haQidagi axborotlarni Qamrab oluvchi joylar mavjud). Quyida Length xossasini Qo’llash bo’yicha dastur ko’rsatilgan. G’G’ Dasturda Length xossasini Qo’llash namoyish etiladi. using System; class LengthDemo { public static void Main () { int [] list q new int [10]; int [] nums q {1, 2, 3,}; int [] [] table q new int [3] []; G’G’ table tenglashmagan massivi. G’G’ ichki massivlar uchun xotira ajratish. table [0] q new int [] {1, 2, 3}; table [1] q new int [] {4, 5}; table [2] q new int [] {6, 7, 8, 9}; Console.WriteLine (“massiv uzunligi list q “ Q list.Length); Console.WriteLine (“massiv uzunligi nums q “ Q nums.Length); Console.WriteLine (“massiv uzunligi table q “ Q table.Length); Console.WriteLine (“massiv uzunligi table [0] q “ Q table [0] .Length); Console.WriteLine (“massiv uzunligi table [1] q “ Q table [1] .Length); Console.WriteLine (“massiv uzunligi table [2] q “ Q table [2] .Length); Console.WriteLine (); G’G’ list massivini initsializatsiyalash uchun Length xossasini Qo’llash. for (int iq0; i list [i] q i * i; Console.WriteLine (“list massivi elementlarining mazmuni:”); G’G’ list massivi elementlari mazmunini ko’rsatish uchun Length xossasini Qo’llash. for (int iq0; i Console.Write (list [i] Q “”); Console.WriteLine (); } } Quyida bu dasturning bajarilish natijalari keltirilgan. list massivining uzunligi q 10 nums massivining uzunligi q 3 table massivining uzunligi q 3 table [0] massivining uzunligi q 3 table [1] massivining uzunligi q 2 table [2] massivining uzunligi q 4 list massivi elementlarining mazmuni: 0 1 4 9 16 25 36 49 64 81 Length xossasini Qo’llashda asosiy e’tiborni ikki o’lchamli tenglashmagan table massiviga Qaratish kerak. YUQorida aytganimizdek, ikki o’lchamli tenglashmagan massiv – bu massivlar massividir. Shunday ekan, table.Length ifodasini Qo’llashda, biz table massivini tashkil etuvchi (bu yerda miQdor 3 ga teng) massivlar miQdoriga ega bo’lamiz. table tashQi massividagi har bir ichki massiv uzunligi mazmuniga ega bo’lish uchun Quyidagi ifodadan foydalanish zarur: table [0].Length Bu holda biz 0 indeksga tegishli bo’lgan ichki massiv uzunligi mazmuniga ega bo’lamiz. LengthDemo sinfida for bosQichi shartli ifodada list.Length xossasi mazmuni Qo’llanilishiga e’tiboringizni Qarating. Har bir massiv o’z uzunligi haQida Qancha ko’p axborot saQlasa, undan ifodalarda foydalanish mumkin. Bu turli uzunlikdagi massivlar bilan ishlash mumkin bo’lgan kodni yaratish imkonini beradi. Length xossasining mazmuni haQiQatda massivda saQlanayotgan elementlar miQdori bilan umumiylikka ega emas. Length maydoni massiv saQlash mumkin bo’lgan elementlar soni haQidagi axborotni o’z ichiga oladi. Length xossasini Qo’llash massivlar bilan bo’ladigan ayrim operatsiyalarni samarasini oshirib, ko’plab algoritmlarni ishlarini osonlashtiradi. Masalan, navbatdagi dasturda mazmunni bir massivdan boshQasiga nusxa ko’chirishda Length xossasi massiv indekslari mazmunini chegaradan tashQariga chiQish imkoniyatlarini kengaytirishda Qo’llaniladi (dasturni bajarish vaQtida ayrim holatlarga olib kelishi mumkin): G’G’Dasturda bir massivdan boshQasiga nusxa ko’chirishda Length xossasini Qo’llash namoyish G’G’etiladi. using System; class ACopy { public static void Main () { int i; int [] nums1 q new int [10]; int [] nums2 q new int [10]; for (iq0; nums1.Length; iQQ) nums1 [1]qi; G’G’ nums1 massividan nums2 massiviga nusxa ko’chirish. if (nums2.Length >q nums1.Length) for (i q 0; i < nums2.Length; iQQ) nums2 [i] q nums1 [i]; for (i q 0; i < nums2.Length; iQQ) Console.Write (nums2 [i] Q “”); } } Bu yerda Length xossasi ikkita funksiyani bajarilishining tuzilishida kalit bo’lib sanaladi. Birinchidan, Length xossasi mazmuni nums2 massivining o’lchamlari nums1 massivining barcha elementlarini unga ko’chirib o’tkazish imkoniyati bor yoki yo’Qligini tekshirib ko’rishda Qo’llaniladi. Ikkinchidan, Length xossasi nusxa ko’chirishni amalga oshiradigan for sikli shartli ifodasida Qo’llaniladi. Albatta, bu juda oddiy misol, ammo bunday texnologiya ancha murakkab algoritmlarda ham Qo’llanilishi mumkin. DaQiQali amaliyot 1. Massivga sso’lka Qilinayotgan, bitta o’zgaruvchi sso’lka tipi mazmunini o’zlashtirishda, xuddi shunday birinchi massivning o’zgartirilgan elementlarini ikkinchisiga ko’chirishni tasdiQlash to’g’rimi?1 2. Length xossasi o’zi bilan nimani ko’rsatadi?2 Loyiha 5-2. Queue sinfi Qdemo.cs Ma’lumki, ma’lumotlar strukturasi ma’lumotlarni tashkil Qilish usuli bo’yicha farQlanadi. Ma’lumotlarning oddiyroQ strukturasi bo’lib, chiziQli ro’yxatni ko’rsatuvchi massiv sanaladi. Massiv elementlarga dostup berish uchun elementning nomi va indeksi ko’rsatiladi. Massivlar tez-tez stek (stacks) va navbat (queues) singari, nisbatan murakkab tuzilgan ma’lumotlar strukturasi sifatida ham ishlatiladi. Stacks – bu FILO (first in, last out – “birinchi kirib, oxirida chiQdi”) prinsipi bo’yicha elementlarga dostup berishni amalga oshiruvchi ro’yxat. Queues – bu FIFO (first in, first out – “birinchi kirib, birinchi chiQdi”) prinsipi bo’yicha elementlarga dostup berishni amalga oshiruvchi ro’yxat. Stekni tarelkalar taxlamiga o’xshatish mumkin, ya’ni eng pastdagi tarelka eng oxirida ishlatiladi, navbatni esa bankdagi navbatga o’xshatish mumkin – ya’ni, birinchi kelganga birinchi bo’lib xizmat ko’rsatiladi. Steklar va navbatlar shunisi bilan Qulayki, ularda axborotlarni saQlash vositasi, shu axborotlarga dostupni ta’minlovchi uslublar bilan birlashtirilgan. Shunday Qilib, steklar va navbatlar ma’lumotlarni saQlash va chiQarishni ta’minlash dasturning yordamisiz ma’lumotlar strukturasi bilan amalga oshiriladi va ma’lumotlarga dostup berish mexanizmlarini o’zida mujassamlashtiradi. Bunday birlashtirish so’zsiz, sinf konstruksiyasiga muvofiQ keladi. Bu loyida Queuening oddiy sinfiga asos solinadi. Umuman navbatlar ikkita bazali metodni Qamrab olgan – put (joylashtirmoQ) va get (chiQarmoQ). Put metodining har birini bajarishda, navbat oxirida turgan massiv elementi (ya’ni, indeksga ega bo’lgan, navbatning joriy holatiga mos keluvchi) ayrim mazmunlarni Qamrab oladi. Get metodining har birini bajarishda massiv elementlaridan, navbat boshida turgani mazmun hisoblanadi. Element mazmuni faQat bir marta hisoblanishi mumkin. Agar yangi mazmunni to’plash uchun erkin elementlar bo’lmasa va bo’sh deb hisoblansa, hamda navbatdagi barcha elementlar mazmuni hisoblangan bo’lsa, navbat to’lgan bo’lib sanaladi. Navbatning ikki asosiy xili mavjud – doirasimon va doirasimon bo’lmagan navbatlar. Doirasimon navbatda mazmunlarni hisoblashda “bo’sh” elementlar takroran ishlatiladi (Bunda elementlar “bo’shamaydi” – shunchaki algoritm bilan muvofiQ holda doirasimon navbat ishida yangi mazmunlarni o’zlashtirishga “imkon” beriladi). Doirasimon bo’lmagan navbatda bu narsa sodir bo’lmaydi, shuning uchun bu navbat oQibatda o’z elementlari indeks raQamlarini belgilaydi. OddiyroQ bo’lishi uchun berilgan misolda biz doirasimon bo’lmagan navbatni yaratamiz, ammo siz biroz harakat Qilib uni doirasimon navbatga aylantirishingiz mumkin. 1 Йўқ. Фақат ссылка ўзгартирилади. 2 Length – бу ҳар бир массивга тегишли хоссадир. У массивда сақланиши мумкин бўлган элементлар миқдори ҳақидаги ахборотни ўз ичига олади. http://hozir.org