C++ da ko‘rsatkichlar asosida massiv yaratish
MAVZU: C++ da ko‘rsatkichlar asosida massiv yaratish va ularni masalalar yechishga qo‘llash I. Kirish II. Asosiy qism 1. C++ da Ko‘rsatkichlar haqida ma’lumot 2. Massiv tushunchasi 3. C++ da ko‘rsatkichlar asosida massiv yaratish va ularni misollarda qo‘llsh III. Xulosa IV. Foydalanilgan adabiyotlar Kirish
C++ dasturlash tilida ko‘rsatkichlar (pointers) va dinamik xotira boshqaruvi muhim tushunchalar hisoblanadi. Ko‘rsatkichlar yordamida xotira manzillarini boshqarish va dinamik massivlar yaratish mumkin. Bu esa dasturlarga ko‘proq moslashuvchanlik va samaradorlikni ta’minlaydi. Ushbu kurs ishida biz ko‘rsatkichlardan foydalangan holda massivlar yaratish va ularni masalalar yechishga qo‘llashni ko‘rib chiqamiz. Dasturlashda massivlar ma’lumotlarni tartiblangan holda saqlash va ularga tezkor murojaat qilish uchun keng qo‘llaniladi. Statik massivlar oldindan belgilangan o‘lchamga ega bo‘lsa, dinamik massivlar kerakli o‘lchamga ko‘ra xotirada joy ajratadi va shu bilan resurslardan tejamkor foydalanishni ta’minlaydi. Dinamik massivlar dastur ishlashi davomida o‘lchamini o‘zgartirishi mumkin, bu esa katta hajmdagi ma’lumotlarni qayta ishlashda juda qulaydir. Ko‘rsatkichlar yordamida dinamik massiv yaratish va ulardan samarali foydalanish ko‘plab masalalarni yechishda katta ahamiyatga ega. Misol uchun, foydalanuvchidan o‘lchami kiritiladigan massivlar yaratish, ularni teskari tartibda chiqarish, eng katta va eng kichik elementlarni topish kabi vazifalarni bajarish mumkin. Bu kabi masalalarni yechish orqali nafaqat dasturlash tilining imkoniyatlarini chuqurroq o‘rganish, balki dasturiy ta’minot yaratish jarayonida samarali kod yozishni o‘rganish mumkin. Ushbu kurs ishining asosiy maqsadi talabalarni ko‘rsatkichlar va dinamik massivlar bilan ishlash bo‘yicha bilim va ko‘nikmalarini rivojlantirishdir. Kurs ishi davomida talabalar quyidagi vazifalarni bajarishlari kerak bo‘ladi 2
ASOSIY QISM 2.1 C++ da Ko‘rsatkichlar haqida ma’lumot 1.1 Ko rsatkich tushunchasi va uni to‘g’ri qo‘llashʻ C++ tilining eng katta afzalliklaridan biri shundaki, u mashina darajasidan abstraktlash paytida yuqori darajadagi dasturlarni yozish, shu bilan birga kerak bo‘lganda apparatga yaqin ishlash imkoniyatini ham beradi. C++ ilova ishlashini bayt va bit darajasida sozlash imkonini beradi. Ko‘rsatkichlarning qanday ishlashini tushunish tizim resurslaridan samarali foydalanadigan dasturlarni yozishni o rganish bosqichlaridan biridir. ʻ Ko‘rsatkichlar . Ko‘rsatkich bu maydon manzilini xotirada saqlaydigan o zgaruvchidir. int o zgaruvchisi butun qiymatni saqlash uchun ishlatilgandek, ʻ ʻ ko rsatkich o zgaruvchisi xotira maydoni manzilini saqlash uchun ishlatiladi. ʻ ʻ 0x101 manzilidagi ko‘rsatkich 0x558 qiymatini o‘z ichiga oladi Xotiradagi ma’lumotlar 0x558 manzilida 1-rasm 0x558 manziliga ko‘rsatkich Shunday qilib, ko‘rsatkich o zgaruvchidir va barcha ʻ o zgaruvchilar ʻ singari u ham xotiradan joy egallaydi (1-rasmda 0x558 manzilda). Ko‘rsatkichlarni maxsus ko rinishga keltiradigan xususiyat shundaki, ular tarkibidagi qiymatlar (bu ʻ holda, 0x558) xotira maydonlarining manzillari sifatida talqin etiladi. Demak, ko rsatkich bu xotiradagi maydonni ko rsatadigan maxsus o zgaruvchidir. ʻ ʻ ʻ Xotira manzillari odatda o‘n oltilik sanoq sistemasida ko‘rsatiladi, ya’ni 16 xil belgilar yordamida 0-9, so‘ngra A-F. An'anaga ko ra Ox prefiksi o‘n oltilik ʻ sanoq sistemasidan oldin yoziladi. Shunday qilib, OxA o‘n oltilik oltilik sanoq 3
sistemasidagi raqam o‘nlik sanoq sistemasida 10ni ifodalaydi; 0xF - 15; va 0x10 – 16 ni ifodalaydi. Ko‘rsatkichni e'lon qilish . Ko‘rsatkich o zgaruvchi bo lgani uchun uniʻ ʻ boshqa har qanday o zgaruvchi singari e'lon qilish kerak. Odatda, ko rsatkich ʻ ʻ ma’lum bir turdagi qiymatga ishora qiladi (masalan, int tipiga). Bu shuni anglatadiki, ko‘rsatkichda joylashgan manzil butun sonni o‘z ichiga olgan xotiradagi maydonga ishora qiladi. Shuningdek, xotiraning tipga ega bo lmagan ʻ blokiga ko‘rsatkichni belgilashingiz mumkin (void ga ko‘rsatkich deb ham ataladi). Ko‘rsatkich boshqa barcha o‘zgaruvchilar singari e'lon qilinishi kerak: tip_nomi * Ko‘rsatkich_nomi Ko‘pgina o zgaruvchilar bilan bo lgani kabi, agar ko‘rsatkichni ʻ ʻ initsializatsiya qilmasangiz, unda tasodifiy qiymat bo ladi. Tasodifiy xotira ʻ maydoniga kirmaslik uchun ko rsatkich ʻ nullptr¹ qiymati bilan boshlanadi. Ko‘rsatkich qiymati har doim nullptr qiymatiga tengligini tekshirishi mumkin, bu haqiqiy xotira maydonining manzili bo lishi mumkin emas: ʻ tip_nomi * Ko‘rsatkich_nomi = nullptr; Shunday qilib, butun sonli ko rsatkichni e'lon qilish quyidagicha bo‘ladi: ʻ int *pInteger = nullptr; Ko‘rsatkich, shu paytgacha o rganilgan har qanday boshqa ma’lumotlar ʻ turining o zgaruvchisi kabi, initsializatsiyadan oldin tasodifiy qiymatni o‘z ichiga ʻ oladi. Ko‘rsatkich uchun bu tasodifiy qiymat ayniqsa xavflidir, chunki u xotira maydonining ba’zi manzillarini anglatadi. Initsializatsiya qilinmagan ko‘rsatkichlar 4
dasturingizning yaroqsiz xotira maydoniga kirishiga olib kelishi va u dasturni ishdan chiqarishi mumkin. 1 Ushbu qiymat - bo‘sh ko‘rsatkich C ++ da C++11 standartida paydo bo‘ldi. Ilgari, C ga mos keladigan null qiymat ishlatilgan (bu hali ham ishlatilishi mumkin, garchi nullptr faqatgna yangi dasturlar uchun tavsiya etilsa ham). 2.2. Adres oluvchi o zgaruvchilarʻ & adres olish amali. O zgaruvchilar - bu til tomonidan xotirada ʻ ma’lumotlar bilan ishlashni ta’minlaydigan imkoniyat. Agar varName o zgaruvchi bo‘lsa, &varName uning qiymati saqlanadigan ʻ xotira adres o‘rnini qaytaradi. Shunday qilib, agar sintaksisdan foydalangan holda butun o zgaruvchini e'lon qilgan bo lsangiz, sizga tanish bo lgan ʻ ʻ ʻ int age = 30; u holda &age ifodasi belgilangan qiymat 30 joylashtirilgan xotira maydonining manzilini qaytaradi. Yuqorida saqlangan qiymatga kirish uchun foydalaniladigan butun sonli o‘zgaruvchi xotira manzilini olish ko‘rsatilgan tushunchasi ko‘rsatilgan. Misol. O zgaruvchi manzilini olish ʻ #include <iostream> using namespace std; int main() { int age = 15; const double Pi =3.1416; cout <<"age manzili: "<<&age<<endl; cout <<"Pi manzili: "<<&Pi<<endl; return 0; 5