O’zbekiston Respublikasi Axborot Texnologiyalari va Kommunikatsiyalarini Rivojlantirish Vazirligi Muhammad Al-Xorazmiy nomidagi Toshkent Axborot Texnologiyalari Universiteti MUSTAQIL ISH Mavzu: Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati. C++ dastulash tilida ma’lumotlar turlari, ularni e’lon qilish va tasvirlash tushunchalari. Vektorlar va ularning xossalari. Guruh: ________ Bajardi: _____________ Tekshirdi: ____________ Toshkent 2022 Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati. C++ dastulash tilida ma’lumotlar turlari, ularni e’lon qilish va tasvirlash tushunchalari. Vektorlar va ularning xossalari. Reja: 1. Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati. 2. C++ dastulash tilida ma’lumotlar. 3. Vektorlar va ularning xossalari. Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati. Barcha dastur yoki dasturiy mahsulotning asosida ikkita birlik yotadi: ma’lumotlar va ular ustida qandaydir amallar bajaradigan algoritmlar. Algoritmlar ma’lumotlarni biz yoki dastur uchun foydali bo’lgan axborot ko’rinishiga keltirib beradi. Algoritmlar shu ma’lumotlar ustida amallarni (o’qish, yozish, yangilash, o’chirish) samarali va tez bajara olishi uchun biz shu ma’lumotlarni ma’lum bir strukturaga solgan holda saqlashimiz kerak bo’ladi. Demak shunday qilib, Ma’lumotlar tuzilmasi — bu ma’lumotlarni samarali o’qish va o’zgartirish imkonini beruvchi, ma’lumotlarni saqlash va boshqarishning bir formatga solingan shaklidir. Soddaroq qilib aytganda, ma’lumotlar tuzilmasi — bu ma’lumotlarning ma’lum bir strukturaga solingan, ular o’rtasida ma’lum bir bog’lanishlar yaratilgan va ular ustida ma’lum amallar bajaruvchi funksiyalardan tashkil topgan guruh. Eng sodda ma’lumotlar tuzilmasiga misol qilib massiv (array)ni ko’rsatishimiz mumkin. Asosiy ma’lumotlar tuzilmalari Quyida keltirilgan ma’lumotlar tuzilmalari dasturlashda eng ko’p qo’llaniladigan tuzilmalardir. Ularga: 1. Massiv (Array) 2. Bog’langan ro’yhat (Linked List) 3. Navbat (Queue) 4. Stek (Stack) 5. Hash jadvallar (Hash tables) 6. Daraxtlar (Trees) 7. Graflar (Graph) kiradi. Biz bu bo’limda boshidagi 5 ta tuzilma bilan yaqindan tanishib, ularning kuchli va kuchsiz tomonlari va ularni qanday holatlarda ishlatish ma’qulligi haqida gaplashib o’tamiz. Qolgan ikkita tuzilma murakkabroq bo’lib ular o’z ichida yana ko’plab turlarga bo’linib ketadi. Shuning uchun ularni keyinroqqa qoldiramiz. Bundan tashqari barcha tuzilmalarning hamma joyda ingliz tilidagi nomi ishlatilgani va ularning nomi odatda tarjima qilinmaganligi sababli keyingi o’rinlarda men ularning asosan ingliz tilidagi nomlarini ishlataman. Turli xildagi ma’lumotlar tuzilmalari nima uchun kerak? Ma’lumotlar tuzilmalari nimaligi haqida qisman tasavvurga ega bo’ldingiz va ularning asosiy turlari bilan ham tanishib oldingiz. Lekin, shu joyga kelib agar sizda “Nima uchun ma’lumotlarning turli xil tuzilmalari kerak?” “Nima uchun bir turdagi universal ma’lumotlar tuzilmalaridan foydalanib qo’ya qolsa bo’lmaydi?” degan savol tug’ilmagan bo’lsa, bu yaxshi emas.) Keling endi shu savolga javob topishga harakat qilamiz. Undan oldin ma’lumotlar tuzilmalari ustida asosiy bajarilishi mumkin bo’lgan amallarni ko’rib chiqaylik. Bularga ma’lumotlarni Ko’rib chiqish (Traversing) O’qib olish (Retrieving) Kiritish (Insertion) O’chirish (Deletion) Qidirish (Search) Saralash (Sorting) Birlashtirish (Merging)lar kiradi. Turli xildagi ma’lumotlar tuzilmalarida esa yuqoridagi amallar turlicha tezlikda amalga oshadi. Masalan oddiyroq misol olaylik, array uchun ma’lumotni o’qib olish uchun O(1) vaqt sarflansa, uni kiritish yoki o’chirish uchun O(n) vaqt sarflanadi. Linked listda esa bular aksincha. Shuning uchun, masalan, sizning dasturingizda ma’lumotlar ko’p kiritilib, o’chirilsayu lekin kam o’qilsa, bunda ma’lumotlarni saqlashda arraydan foydalangandan ko’ra linked list qulayroq hisoblanadi. Lekin, ko’pincha holatda bir necha ma’lumotlar tuzilmalarini o’zini birlashtirgan gibrid ma’lumotlar tuzilmalaridan ham foydalaniladi. Array (Massiv) Array eng oddiy va eng keng qo’llaniladigan chiziqli ma’lumot tuzilmasi. Ko’p holatlarda array o’lchami oldindan aniqlangan va undagi ma’lumotlar bitta tipga tegishli bo’ladi (int, string, Student, Employee…). Arrayni ishlatishdan oldin quyidagi terminlarni tushunish kerak bo’ladi: Element — arraydagi saqlanayotgan narsalar element deb ataladi Index — elementlarning arraydagi joylashgan tartib raqami Ko’plab dasturlash tillarida indeksatsiya 0 dan boshlanadi va oxirgi element indeksi array hajmidan 1 taga kichik bo’ladi. Bundan tashqari array bir o’lchamli (one dimensional) va ko’p o’lchamli (multi dimensional) bo’lishi mumkin. Yuqoridagilar biroz rasmiyroq ma’lumotlar edi. Endi oddiyroq tilda tushuntirishga harakat qilaman. Biz dasturda array e’lon qilgan paytimiz kompyuter uning uzunligi va bitta element hajmiga qarab xotiradan ketma-ket kelgan joyni ajratadi va elementlarni shu joylarga tartib bilan joylashtiradi. Taxminan quyidagi ko’rinishda Aynan shunday joylashish sababli, dastur faqat birinchi elementning xotiradagi adressini eslab qolsa bo’lgani qolgan istalgan element indeksini bilgan holda uning xotiradagi adressini dastur osongina hisoblab oladi. Shu sababli arrayda ma’lumotni o’qib olish tez amalga oshadi. Lekin, agar bizga birinchi aytilgandan ko’proq element qo’shish kerak bo’lib qolsa, muammo kelib chiqadi. Chunki biz hamma elementlarni boshqa ketma-ket kelgan joyga ko’chirishimiz kerak bo’ladi. Yoki xuddi shuningdek, agar biz array boshiga element qo’shishimiz kerak bo’lib qolsa ham biz hamma elementlarni surib chiqishimiz kerak bo’ladi. Biz birinchi elementning xotiradagi adressini o’zgartira olmaymiz. Shuning uchun, arrayda ma’lumot qo’shish va o’chirish sekin amalga oshadi. C++ dastulash tilida ma’lumotlar. C++ da ma’lumot turlari ikki kategoriyaga bo’linadi: fundamental va murakkab ma’lumot turlari. Quyidagi ma’lumot turlari fundamental turlar hisoblanadi: <void>, Bu tur tugallanmaydigan (ya’ni, bu tur bilan obyekt, massiv va adres (reference, ссылка) lar e’lon qilinmaydi va aniqlanmaydi) ma’lumot turi hisoblanib hech qanday qiymat qabul qilmaydi. Lekin bu tur bilan ko’rsatgichlar e’lon qilinishi va aniqlanishi mumkin. Bundan tashqari bu tur qiymat hosil qilmaydigan funksiyalarni e’lon qilish va aniqlashda foydalanilishi mumkin. Masalan, quyidagilar to’g’ri hisoblanadi: std::nullptr_t (C++ 11 dan boshlab). Bu tur nol ko’rsatgich nullptr ning turi hisoblanadi, ya’ni nullptr std::nullptr_t ma’lumot turiga ega. 0 yoki nullptr qiymatlarini qabul qiladi. Hajmi sizeof(void*) ga teng. Misol: <bool> Mantiqiy ma’lumotlar, o’zgaruvchilar turi. Faqat true va false qiymatlarini qabul qiladi. Hajmi kompillyatorga bo’g’liq, lekin kamida 1 bayt. Misol: char, signed char, unsigned char. Bular belgilar turlari bo’lib, uchchalasi alohida turlar hisoblanadi. Uchchalasi bir xil hajmga ega va 1 baytga teng. char asosan belgilar to’plami, satrlar hosil qilishda foydalaniladi. U kompillyatorga bog’liq ravishda signed char yoki unsigned char bilan aynan bir xil bo’ladi. Shuning uchun -128 dan 127 gacha yoki 0 dan 255 gacha bo’lgan qiymatlarni qabul qiladi. signed char kichik hajmli, ishorali butun sonlar talab qilinganda foydalanilishi mumkin va -128 dan 127 gacha bo’lgan qiymatlarni qabul qiladi. unsigned char kichik hajmli, ishorasiz butun sonlar talab qilinganda foydalanilishi mumkin va 0 dan 255 gacha bo’lgan qiymatlarni qabul qiladi. Misol: char16_t (C++ 11 dan boshlab). Unicode formatidagi belgilar uchun ishlatiladi. Qiymatlari uchun UTF-16 belgilar to’plami foydalaniladi. Hajmi kompillyatorga bog’liq, lekin kamida 2 bayt. Misol: char32_t (C++ 11 dan boshlab). Unicode formatidagi belgilar uchun ishlatiladi va UTF-32 belgilar to’plami foydalaniladi. Hajmi kompillyatorga bog’liq, lekin kamida 4 bayt. Misol: wchar_t. Unicode formatidagi belgilar uchun ishlatiladi va UTF-16 yoki UTF-32 belgilar to’plami foydalaniladi. Hajmi kompillyatorga, ya’ni foydalanilgan belgilar to’plamiga bo’g’liq. Misol: int. Butun sonlarning asosiy (базовый) turi hisoblanadi. Uning hajmi kamida 2 baytga teng. Lekin 32/64 bit arxitekturali tizimlarda uning hajmi kamida 4 bayt. Bu tur o’zgartirgich (модификатор) lar bilan birga ishlatilishi mumkin. Quyidagi o’zgartirgichlar mavjud: signed, unsigned (ishorasini belgilaydi) va short, long, long long (hajmini belgilaydi). Demak, short, short int, signed short, signed short int lar aynan bir xil bo’lib, ishorali butun sonlar turi hisoblanadi. Hajmi kamida 2 bayt va -32768 dan 32767 gacha bo’lgan sonlarni qabul qiladi. unsigned short, unsigned short int lar aynan bir xil bo’lib, ishorasiz butun sonlar turi hisoblanadi. Hajmi kamida 2 bayt va 0 dan 65535 gacha bo’lgan sonlarni qabul qiladi. signed, signed int, int lar aynan bir xil bo’lib, ishorali butun sonlar turi hisoblanadi. Hajmi kamida 4 bayt va -2147483648 dan 2147483647 gacha bo’lgan sonlarni qabul qiladi. Ba’zi 16 bitli tizimlarda uning hajmi 2 bayt (short variantidek). unsigned, unsigned int lar aynan bir xil bo’lib, ishorasiz butun sonlar turi hisoblanadi. Hajmi kamida 4 bayt va 0 dan 4294967295 gacha bo’lgan sonlarni qabul qiladi. Ba’zi 16 bitli tizimlarda uning hajmi 2 bayt (short variantidek). long, long int, signed long , signed long int lar aynan bir xil bo’lib, ishorali butun sonlar turi hisoblanadi. Hajmi kamida 4 bayt va 2147483648 dan 2147483647 gacha bo’lgan sonlarni qabul qiladi. Ba’zi 64 bitli tizimlarda uning hajmi kamida 8 bayt va 9223372036854775808 dan 9223372036854775807 gacha bo’lgan sonlarni qabul qiladi. unsigned long, unsigned long int lar aynan bir xil bo’lib, ishorasiz butun sonlar turi hisoblanadi. Hajmi kamida 4 bayt va 0 dan 4294967295 gacha bo’lgan sonlarni qabul qiladi. Ba’zi 64 bitli tizimlarda buning hajmi kamida 8 bayt va 0 dan 18446744073709551615 gacha bo’lgan sonlarni qabul qiladi. long long, long long int, signed long long, signed long long int lar aynan bir xil bo’lib, ishorali butun sonlar turi hisoblanadi. Hajmi kamida 8 bayt va -9223372036854775808 dan 9223372036854775807 gacha bo’lgan sonlarni qabul qiladi. unsigned long long, unsigned long long int lar aynan bir xil bo’lib, ishorasiz butun sonlar turi hisoblanadi. Hajmi kamida 8 bayt va 0 dan 18446744073709551615 gacha bo’lgan sonlarni qabul qiladi. float. Yagona aniqlikga ega bo’lgan haqiqiy sonlar turi hisoblanadi. Bunday aniqlikga ega sonlar odatda 4 bayt hajmga ega va 1.17E-38 dan 3.4E38 gacha bo’lgan sonlarni qabul qiladi. double. float ga nisbatan ikki karra yuqori aniqlikga ega bo’lgan haqiqiy sonlar turi va odatda 8 bayt hajmga ega. 2.23E-308 dan 1.79E308 gacha bo’lgan sonlarni qabul qiladi. long double. Kengaytirilgan aniqlikga ega bo’lgan haqiqiy sonlar turi va odatda 10 yoki 16 bayt (kompillyatorga bog’liq) hajmga ega. 3.36E4932 dan 1.18E4932 gacha bo’lgan sonlarni qabul qiladi. Quyidagilar murakkab turlar hisoblanadi: Massiv. Misol: Funksiyalar. Funksiyalarning e’lon qilinishi ularning nomi va turini ko’rsatib beradi. Funksiyalarning aniqlanishi esa ularning nomi, turi va “tanasi” ni ko’rsatib beradi. Misol: void, obyekt yoki funksiyalar uchun ko’rsatgichlar (sinflarning statik a’zolari uchun ham). Misol: Obyekt yoki funksiyalar uchun adreslar (reference, ссылка). Ikki turdagi adreslar mavjud: l-ifoda adreslari va r-ifoda adreslari. r-ifoda adres tushunchasi C++ 11 dan boshlab kiritilgan. Misol: Vektorlar va ularning xossalari. Juda oddiy namuna yordamida vector sinfining izchil rivojlanishini tashkil etamiz Guvohi bo’lganingizdek ushbu kod double tipli 4 ta elementdan iborat vector sinf obyektini yaratadi va 0.33, 22.0, 27.2 va 54.2 qiymatlarni o’zlashtirmoqda. Bu to’rt element 0, 1, 2 va 3 tartibi bilan raqamlanadi. C++ standart konteynerlarida elementlarni raqamlash doimo 0 (nol) dan boshlanadi. 0 dan boshlab raqamlash C++ tilida dastur tuzuvchilar o’rtasida universal kelishuv bo’lib, doimo ishlatidi 16. vector obyekt sinfidagi elementlar soni uning o’lchami deb ataladi. Shunday qilib, age vektorining o’lchami 4 ga teng. Vektor elemetlari 0 dan size-1 gacha raqamlanadi (indekslanadi). Masalan age vektori elementlari 0 dan age.size()–1 gacha raqamlanadi. age vektorini quyidagicha tasvirlashimiz mumkin: Ushbu sxemani kompyuter xotirasida qanday amalga oshirish mumkin? Qiymatlarni qanday saqlaymiz va ularga ruxsatni qanday amalga oshiramiz? Shubhasiz, biz sinfni tanlashimiz va uni vector deb nomlashimiz lozim. Shundan so’ng, vektor o’lchamini va elementlarini saqlash uchun bizga alohida-alohida sinf a‘zosi kerak bo’ladi. Elementlar majmuini qanday taqdim qiladi, ularning sonini o’zgartirish mumkinmi? Buni vector standart sinfinidan foydalanib amalga oshirish mumkin, lekin, bu doirada u firibgarlik bo’ladi: biz aynan shu sinfni ishlab chiыaramiz. Shunday qilib, rasmdagi tasvirga o’qni qanday qaratamiz? O’zimizni u emas deb ishontiramiz. Biz shunda ma‘lumotlar tuzulmasining fiksirlangan o’lchamini belgilashimiz mumkin. Quyidagi tasvir kabi belgilarga bog’liq ayrim detallarni hisobga olmasdan xech narsaga erisha olmaymiz Bu oddiy va chiroyli, lekin, faqatgina qiyin vaziyatda push_back() funksiyasi yordamida element qoshishga urinishni amalga oshirishimiz mumkin: Biz element qosha olmaymiz, elementlar soni belgilangan va u to’rtga teng. Bizga fiksirlangan elementlar sonini saqlaydigan ma‘lumotlar tuzilmasiga nisbatan koproq narsalar kerak. vector sinfi obyektida elementlar sonini o’zgartiruvchi push_back() amallarini, agar vector sinfida elementlar soni fiksirlangan bolsa, amalga oshirish mumkin emas. Bizga birinchi elementning manzili kerak. C++ tili ma‘lumotlar toifasining manzilini saqlash qobiliyati ko’rsatkich deb ataladi (pointer). Sintaksik jihatdan u suffiksi bilan belgilanadi, ya‘ni double double tipli obyektga korsatkichni bildiradi. Endi vector sinfining birinchi variantini aniqlashimiz mumkin. Shunday vektorlar biridan nusxa olamiz Nazariy jixatdan v2 obyekt v obyektning nusxasi bo’lishi kerak, boshqacha aytganda barcha i lar [0:v.size()) diapazondagi v2.size()==v.size() va v2[i]==v[i] shartlarni bajarishi kerak. Dastur funksii f() dan chiqqanda barcha foydalanilgan xotira bo’shatilgan bo’lishi kerak. Ammo bu ishni standart kutubxonaga tegishli vector sinfi amlga oshiradi, bizning sinf vector emas. Biznig maqsad vector sinfini mukammallashtirishdan iborat, yuqorida ko’rsatilgan masalalarni to’g’ri yechishi uchun, oldin bu sinfimiz o’zi qanday ishlashi bilan tanishib chiqamiz.Xatolik nimada nima uchun noto’g’ri ishlaydi? Agar buni tushuna olsak, xatolikni to’g’rilay olamiz.Eng muximi shundaki biz bu va shunga o’xshagan muammolarni aniqlay bila olishimiz va shuni amalda boshqa vaziyatlarda xam tatbiq qila olishimizdir. Odatda sinflarda nusxa olish degani sinfning barcha berilgan a‘zolaridan nusxa olishni bildiradi. Masalan Point sinf obyektidan nusxa olish degani nuqtaning koordinatalaridan nusxa olishni bildiradi.Agar sinf a‘zolaridan nusxa olayotganda ko’rsatkich ega obyektlar bo’lsa, ba‘zi muammolar chiqishi mumkin. Xususan vektorlar uchun bizning misoldagi v.sz==v2.sz va v.elem==v2.elem shartlar bajarilsa, vektorlar quyidagicha ko’rinishda bo’ladi: Boshqacha aytganda v2 obyekt v obyektning elementlari nusxasini o’zida ifoda etmagan, ikkalasi xam birgalikda v obyektdan foydalanayapti. Biz boshqa kod yozishimiz mumkin: Xulosa Menga berilgan Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati. C++ dastulash tilida ma’lumotlar turlari, ularni e’lon qilish va tasvirlash tushunchalari. Vektorlar va ularning xossalari mavzusidagi topshiriqdan shuni xulosa qilib aytishim mumkinki Ma’lumotlar tuzilmasi — bu ma’lumotlarni samarali o’qish va o’zgartirish imkonini beruvchi, ma’lumotlarni saqlash va boshqarishning bir formatga solingan shaklidir. Shubhasiz, biz sinfni tanlashimiz va uni vector deb nomlashimiz lozim. Shundan so’ng, vektor o’lchamini va elementlarini saqlash uchun bizga alohidaalohida sinf a‘zosi kerak bo’lishi haqida bilimlarimni mustahkamladim. Foydalanilgan adabiyotlar Алфред В. Ахо., Джон Э. Хопкрофт, Джефри Д. Ульман. Структура данных и алгоритмы//Учеб.пос., М. : Изд.дом: "Вильямс", 2000, — 384 с. Бакнелл Джулиан М. Фундаментальные алгоритмы и структуры данных в Delphi//СПб: ООО «ДиаСофтЮП», 2003. 560с. Роберт Седжвик. Фундаментальные алгоритмы на C++. Анализ, Структуры данных, Сортировка, Поиск//К.: Изд. «ДиаСофт», 2001.- 688 с. Динман М.И. С++. Освой на примерах//СПБ.:БХВ-Петербург, 2006, 384. Шилдт, Герберт. Полный справочник по С#//М. : Изд. дом "Вильямc", 2004, 752 с. Вирт Н. Алгоритмы и структуры программы//М., Мир, 1985.