10-variant
Malumotlar tuzilmasi va algoritmlari
Mustaqil ish
Mavzu: C++ tilida klasslar va ularni qo’llanilishi
Reja:
Kirish
C++ tilida Classlar
Ularning qo’llanilishi
Misollar
Kirish:
Dasturlash tillari asosan maxsus so'z va gaplarning mantiqiy konstruktsiyasidan foydalanib dasturlar yaratish imkoniyatini beradi. Ob'ektga yo'naltirilgan yondashuvlar (OMYo) bir kunda o'ylab topilgan emas. Uning paydo bo'lishi dasturiy ta'minotning tabiiy rivojidagi navbatdagi pog’ona, xolos. Vaqt o'tishi bilan qanday uslublar ishlash uchun qulay, qaysinisi noqulay ekanini aniqlash oson bo'lib bordi. OMYo eng muvaffaqiyatli, vaqt sinovidan o'tgan uslublarni o'zida mujassam etadi.
Dastlab dasturlash anchayin boshqotirma ixtiro bo'lib, u dasturchilarga dasturlarni kommutatsiya bloki orqali kompyuterning asosiy xotirasiga to'g’ridan-to'g’ri kiritish imkonini berdi. Dasturlar mashina tillarida ikkilik tasavvurda yozilar edi. Dasturlarni mashina tilida yozishda tez-tez xatolarga yo'l qo'yilar, kodni kuzatib borish amalda deyarli mumkin emas edi. Bundan tashqari, mashina kodlaridagi dastur tushunish uchun g’oyat murakkab edi.
Vaqt o'tishi bilan kompyuterlar tobora kengroq qo'llana boshlandi hamda yuqoriroq darajadagi protsedura tillari paydo bo'ldi. Bularning dastlabkisi FORTRAN tili edi. Biroq ob'ektga mo'ljallangan yondashuv rivojiga asosiy ta'sir keyinroq paydo bo'lgan. Protsedura tillari dasturchiga axborotga ishlov berish dasturini pastroq darajadagi bir nechta protseduraga bo'lib tashlash imkonini beradi. Keyinchalik ob'ektga yo'naltirilgan dasturlash yo'nalishiga asos solindi.
Ushbu kurs ishi mavzusi “Sinflar orasidagi munosabatlar” bo'lib, unda nazariy ma'lumotlar va Jawa muhitida dasturiy vosita yaratiladi. Yaratilgan dastur “Kutubxona” va “Kitob” asosida sinflar ishlab chiqish va ular orasidagi munosabatlarni o'rnatishdan iborat. “Kitob” sinfi yordamida har bir Kitob ob'ektlari tashkil etiladi va ularning qiymatlari kiritilib natijalari olinadi.
C++ tilida Classlar:
Sinf sifatida ma'lumotlar to'plami va ularga boqlangan funktsiyalarni qarash mumkin. Sinflar C++ tili ichki imkoniyatlarini kengaytirib dasturchi oldida amaliyotning murakkab masalalarini echishda ancha qulaylik yaratadi.
C++ tilida inkapsulyatsiya printsipi sinf deb ataluvchi nostandart tiplarni(foydalanuvchi tiplarini) qosil qilish orqali qimoya qilinadi. To'qri aniqlangan sinf ob'ektini butun dasturiy modul sifatida ishlatish mumkin. qaqiqiy sinfning barcha ichki ishlari yashirin bo'lishi lozim. To'qri aniqlangan sinfning foydalanuvchilari uning qanday ishlashini bilishi shart emas, ular sinf qanday vazifani bajarishini bilsalar etarlidir.
C++ tili ob'ektga mo'ljallangan dasturlash printsiplarini qo'llab quvvatlaydi. Bu printsiplar quyidagilardir: inkapsulyatsiya, merosxo'rlik, polimorfizm
Inkapsulyatsiya. Agarda muqandis ishlab chiqarish jarayonida rezistorni qo'llasa, u buni yangidan ixtiro qilmaydi, omborga (magazinga) borib mos parametrlarga muvofiq kerakli detalni tanlaydi. Bu qolda muqandis joriy rezistor qanday tuzilganligiga e'tiborini qaratmaydi, rezistor faqatgina zavod xarakteristikalariga muvofiq ishlasa etarlidir. Aynan shu tashqi konstruktsiyada qo'llaniladigan yashirinlik yoki ob'ektni yashirinligi yoki avtonomligi xossasi inkapsulyatsiya deyiladi.
Inkapsulyatsiya yordamida berilganlarni yashirish ta'minlanadi. Bu juda yaxshi xarakteristika bo'lib foydalanuvchi o'zi ishlatayotgan ob'ektning ichki ishlari qaqida umuman o'ylamaydi. qaqiqatan qam, xolodilnikni ishlatishda refrijektorni ishlash printsipini bilish shart emas. Yaxshi ishlab chiqilgan dastur ob'ektini qo'llashda uning ichki o'zgaruvchilarining o'zaro munosabati qaqida qayqurish zarur emas.
Yana bir marta takrorlash joizki, rezistorni samarali qo'llash uchun uning ishlash printsipi va ichki qurilmalari qaqidagi ma'lumotlarni bilish umuman shart emas. Rezistorning barcha xususiyatlari inkapsulyatsiya qilingan, ya'ni yashirilgan. Rezistor faqatgina o'z funktsiyasini bajarishi etarlidir.
C++ tilida inkapsulyatsiya printsipi sinf deb ataluvchi nostandart tiplarni(foydalanuvchi tiplarini) qosil qilish orqali qimoya qilinadi.
Sinflar qanday tuzilishga ega ekanligi bilan keyinroq tanishib chiqamiz.
To'qri aniqlangan sinf ob'ektini butun dasturiy modul sifatida ishlatish mumkin. qaqiqiy sinfning barcha ichki ishlari yashirin bo'lishi lozim. To'qri aniqlangan sinfning foydalanuvchilari uning qanday ishlashini bilishi shart emas, ular sinf qanday vazifani bajarishini bilsalar etarlidir.
Merosxo'rlik. Acme Motors kompaniyasi injenerlari yangi avtomobil konstruktsiyasini yaratishga aqd qilishsa, ular ikkita variantdan birini tanlashlari lozim. Birinchisi, avtomobilning konstruktsiyasini boshidan boshlab yangidan ixtiro qilish, ikkinchisi esa mavjud Star modelini o'zgartirishdir. Star modeli qariyb ideal, faqatgina unga turbokompressor va olti tezlanishli uzatma qo'shish lozim. Bosh muqandisikkinchi variantni tanladi. Ya'ni noldan boshlab qurishni emas, balki Star avtomobiliga ozgina o'zgartirish qilish orqali yaratishni tanladi. Uni yangi imkoniyatlar bilan rivojlantirmoqchi bo'ldi. Shuning uchun, yangi modelni Quasar deb nomlashni taklif qildi. Quasar-Star modeliga yangi detallarni qo'shish orqali yaratilgan.
C++ tili qam shunday merosxo'rlikni qimoya qiladi. Bu yangi berilganlar tipi (sinf), oldindan mavjud bo'lgan sinfni kengaytirishdan qosil bo'ladi. Bunda yangi sinf oldingi sinfning merosxo'ri deb ataladi.
Polimorfizm. Akselatorni bosilishida Star modeliga nisbatan yangi yaratilgan Quasar modelida boshqacharoq amallar bajarilishi mumkin. Quasar modelida dvigatelga yoqilqini sepuvchi injektor sistemasi va Star modelidagi korbyurator o'rniga turbokompressor o'rnatilgan bo'lishi mumkin. Lekin foydalanuvchi bu farqlarni bilishi shart emas. U rulga o'tirgach oddiygina akselatorni bosadi va avtomobilning mos reaktsiyasini kutadi.
C++ tili bir xil nomdagi funktsiya turli ob'ekt tomonidan ishlatilganda turli amallarni bajarishi imkoniyatini ta'minlaydi. Bu funktsiya va sinfning polimorfligi deb nomlanadi. Poli – ko'p, morfe – shakl degan ma'noni anglatadi. Polimorfizm – bu shaklning ko'p xilligidir. Bu tushunchalar bilan keyinchalik batafsil tanishamiz.
Sinflar va sinf a'zolari. Yangi tip sinfni e'lon qilish bilan tuziladi. Sinf - bu bir – biri bilan funktsional orqali boqlangan o'zgaruvchilar va metodlar to'plamidir. Sinflarga amaliyotdan ko'pgina misollar keltirish mumkin. Masalan, avtomabilni qildirak, eshik, o'rindiq, oyna va boshqa qismlardan tashkil topgan kollektsiya yoki qaydash tezligini oshirish, to'xtatish, burish imkoniyatlariga ega bo'lgan ob'ekt deb tasavvur qilish mumkin. Avtomobil o'zida turli eqtiyot qismlarni va ularni funktsiyalarini inkapsulyatsiya qiladi. Avtomobil kabi sinfda qam inkapsulyatsiya qator imkoniyatlarni beradi. Barcha ma'lumotlar bitta ob'ektda yiqilgan va ularga osongina murojaat qilish, ularni o'zgartirish va ko'chirish mumkin. Sizning sinfingiz bilan ishlovchi dasturiy qismlar, ya'ni mijozlar sizning ob'ektingizdan, uning qanday ishlashidan tashvishlanmasdan, bemalol foydalanishlari mumkin.
Sinf o'zgaruvchilarning ixtiyoriy kombinatsiyasidan, shuningdek boshqa sinflar tiplaridan iborat bo'lishi mumkin. Sinfdagi o'zgaruvchilar o'zgaruvchi – a'zolar yoki xossalar deyiladi. Sar sinfi o'rindiq, radiopriyomnik, shina va boshqa o'zgaruvchi - a'zolardan iborat. O'zgaruvchi – a'zolar faqatgina o'zlarining sinflarida yotadilar. qildirak va motor avtomobilning qanday tarkibiy qismi bo'lsa, o'zgaruvchi – a'zolar qam sinfning shunday tarkibiy qismidir.
Sinfdagi funktsiyalar odatda o'zgaruvchi a'zolar ustida biror bir amal bajaradilar. Ular funktsiya – a'zolar yoki sinf metodlari deb aytiladi. Mashina sinfi metodlari qatoriga Haydash() va Tuxtatish() metodlari kiradi. Mushuk sinfi qayvonni yoshi va oqirligini ifodalovchi o'zgaruvchi – a'zolarga ega bo'lishi mumkin. Shuningdek, bu sinfning funktsional qismi Uxlash(), Miyovlash(), SichqonTutish() metodlaridan iborat bo'ladi.
Funktsiya – a'zolar qam o'zgaruvchi a'zolar singari sinfda yotadi. Ular o'zgaruvchi a'zolar ustida amallar bajaradi va sinfni funktsional imkoniyatlarini aniqlaydi.
Sinflar orasidagi munosabatlar. Murakkab sinflarni qosil qilishda oldin uni tashkil etuvchi oddiyroq sinflarni e'lon qilib, keyin esa ularni birlashtirish orqali sinfni qosil qilish maqsadga muvofiqdir. Masalan, qildirak sinfi, motor sinfi, uzatish korobkasi sinfi va boshqa sinflarni qosil qilib, keyin esa ularni birlashtirish orqali avtomobil sinfini qurish oldimizga turgan masalani echishni ancha osonlashtiradi.
Ikkinchi misolni ko'rib chiqamiz. To'qri to'rtburchak chiziqlardan tashkil topgan. Chiziq esa ikki nuqta orqali aniqlanadi. qar bir nuqta x va u koordinatalar yordamida aniqlanadi. To'qri to'rtburchak to'rtta nuqtani birlashtiruvchi to'rtta chiziq yordamida aniqlanadi. Bunda qar bir nuqta grafikda koordinatalarga ega bo'ladi. Shuning uchun oldin qar bir nuqtaning x, u koordinatalarini saqlash uchun Nuqta sinfi e'lon qilingan..
Qo’llanilishi:
Sinfni e'lon qilish. Sinfni e'lon qilish uchun class kalitli so'zi, undan so'ng ochiluvchi figurali qavs, co'ng xossalar va metodlari ro'yxati ishlatiladi. Sinfni e'lon qilish yopiluvchi figurali qavs va nuqtali vergul orqali yakunlanadi. Masalan, Mushuk sinfini quyidagicha e'lon qilish mumkin.
Class Mushuk
{
unsigned int itsYosh ;
unsigned int itsOgirlik ;
void Miyovlash()
}
Mushuk sinfini e'lon qilishda xotira zaqiralanmaydi. E'lon qilish, kompilyatorga Mushuk sinfini mavjudligini, qamda unda qanday qiymatlar saqlashi mumkinligi (itsYosh, itsOgirlik) va u qanday amallarni bajarishi mumkinligi (Miyovlash() metodi) qaqida xabar beradi. Bundan tashqari, bu e'lon qilish orqali kompilyatorga Mushuk sinfining o'lchami, ya'ni qar bir Mushuk sinfi ob'ekti uchun kompilyator qancha joy ajratishi lozimligi qaqida qam ma'lumot beradi. Masalan, joriy misolda butun qiymat uchun to'rt bayt talab qilinsa, Mushuk sinfi ob'ekti o'lchovi sakkiz bayt bo'ladi. (itsYosh o'zgaruvchisi uchun to'rt bayt, itsOgirlik o'zgaruvchisi uchun to'rt bayt). Miyovlash() metodi xotiradan joy ajratishni talab qilmaydi.
Ob'ektni e'lon qilish. Yangi turdagi ob'ekt xuddi oddiy butun sonli o'zgaruvchidek aniqlanadi. qaqiqatan qam ixtiyoriy butun sonli o'zgaruvchi quyidagicha aniqlanadi:
unsigned int MyVariable
// ishorasiz butun sonni aniklaymiz
Sat cinfidagi ob'ekt esa quyidagicha aniqlanadi:
Mushuk Frisky // Mushuk ob'ektini aniklaymiz.
Bu dasturiy kodlarda unsigned int tipidagi MyVariable nomli o'zgaruvchi va Mushuk sinfining Frisky nomli ob'ekti aniqlandi.
Ko'pgina qollarda sinf va ob'ekt tushunchalarini ishlatishda chalkashlikka yo'l qo'yiladi. Shuning uchun, ob'ekt sinfning biror bir ekzemplyari (nusxasi) ekanligini yana bir bor ta'kidlash joiz.
Sinf a'zolariga murojaat qilish imkoni. Mushuk sinfining real ob'ektini aniqlaganimizdan so'ng bu ob'ektning a'zolariga murojaat qilish zaruriyati tuqilishi mumkin. Buning uchun bevosita murojaat (.) operatori qo'llaniladi. Masalan, Frisky ob'ektining Weight o'zgaruvchi - a'zosiga 50 sonini o'zlashtirmoqchi bo'lsak quyidagi jumlani yozishimiz lozim.
Fresky. Weightq50;
Meow() metodini chaqirish uchun esa
Frisky. Meow();
jumlasini yozish lozim.
qiymat sinfga emas ob'ektga o'zlashtiriladi. C++ tilida berilganlar tipiga qiymat o'zlashtirilmaydi. qiymat faqatgina o'zgaruvchilarga beriladi. Masalan, quyidagi yozuv noto'qridir:
Intqs // notugri
Kompilyator int tipiga qiymat o'zlashtirilishi xatolik ekanligi qaqida xabar beradi. Xuddi shu nuqtai – nazardan quyidagi yozuv qam noo'rindir:
Cat. itsYoshq 5 // noto'gri
Agarda Mushuk ob'ekt bo'lmasdan sinf bo'lsa, yuqoridagi ifodani qam kompilyator xato deb qisoblaydi. O'zlashtirish amalini bajarishda xatolikka yo'l qo'ymaslik uchun oldin Mushuk sinfiga tegishli Frisky ob'ektini qosil qilish va uning ItsYosh maydoniga 5 qiymatini berish lozim.
Mushuk Frisky;
Frisky. itsYoshq5;
Sinf a'zolariga murojaat qilish imkonini chegaralash. Sinfni e'lon qilishda bir nechta kalit so'zlardan foydalaniladi. Ulardan eng muqimlari publis (ochiq) va private (yopiq) kalit so'zlari bo'lib, ular orqali ob'ektning a'zolariga murojaat qilish imkoniyati chegaralanadi.
Sinfning barcha metodlari va xossalari boshlanqich qolda yopiq deb e'lon qilinadi. Yopiq a'zolarga faqatgina shu sinfning metodlari orqaligina murojaat qilish mumkin. Ob'ektning ochiq a'zolariga esa dasturdagi barcha funktsiyalar murojaat qilishlari mumkin. Sinf a'zolariga murojaat qilish imkonini belgilash juda muqim xususiyat bo'lib, bu masalani echishda uncha katta tajribaga ega bo'lmagan dasturlarchilar ko'pincha qiyinchiliklarga duch keladilar. Bu qolatni batafsilroq tushuntirish uchun mavzuni boshida keltirilgan masalamizga qaytamiz.
Class Mushuk
{
unsigned int itsYosh;
unsigned int itsOgirlik;
void Miyovlash();
}
Bu tarzda sinfni e'lon qilishda itsYosh va itsOgirlik maydonlari qam, Miyovlash() metodi qam yopiq a'zo sifatida aniqlanadi. Dasturda yuqoridagi tartibda Mushuk sinfi e'lon qilingan bo'lsa va bu sinf ekzemplyari bo'lgan ob'ektning itsYosh a'zosiga main() funktsiyasi tanasidan turib murojaat qilsak kompilyator xatolik ro'y berganligi qaqida xabar beradi.
Mushuk Baroq;
Baroq. itsYosh q 5 // Xatolik!
// Yopik a'zoga murojaat kilish mumkin emas.
Mushuk sinfi a'zolariga dasturning boshqa ob'ektlari tomonidan murojaat qilish imkonini qosil qilmoqchi bo'lsak, uni public kalitli so'zi orqali amalga oshiramiz.
Class Mushuk
{
public:
unsigned int itsYosh;
unsigned int itsOgirlik;
void Meow( );
}
Endi public kalitli so'zi orqali sinfning barcha a'zolari (itsYosh, itsOgirlik, Miyovlash()) ochiq a'zo bo'ldi.
Sinf metodlarini aniqlanishi. Sinf metodini aniqlash uchun birinchi sinf nomi, keyin ikkita ikki nuqta, funktsiya nomi va parametrlari yoziladi. 6.3. – listingda Mushuk sinfining funktsiya a'zosini aniqlanishi ko'rsatilgan.
Konstruktorlar va destruktorlar. Butun sonli o'zgaruvchini aniqlashning ikki xil yo'li bor. Birinchisi, oldin o'zgaruvchini aniqlash, keyin esa unga biror bir qiymat o'zlashtirishdir. Masalan,
int Ogirlik; // o'zgaruvchini aniklash
........ // bu erda boshka ifodalar bor
Ogirlikq7; // o'zgaruvchiga kiymat o'zlashtiramiz.
Ikkinchisi, o'zgaruvchi aniqlanishi bilan birga unga darqol qiymat o'zlashtiriladi, masalan:
int Ogirlikq7; //o'zgaruvchini e'lon kilamiz
//va unga kiymat o'zlashtiramiz.
qiymat berish amali o'zgaruvchi aniqlanishi bilan unga boshlanqich qiymat o'zlashtirilishini anglatadi. Keyinchalik, bu o'zlashtirilgan qiymatni o'zgartirishingiz qam mumkin.
Sinfning o'zgaruvchi–a'zosiga qanday qiymat o'zlashtirildiq Buning uchun sinfda konstruktor deb ataluvchi maxsus funktsiya – a'zo ishlatiladi. Zaruriy vaqtda konstruktor bir nechta parametrni qabul qiladi. Lekin qech qanday tipdagi qiymat qaytarmaydi. Konstruktor – bu sinf nomi bilan ustma – ust tushadigan sinf metodidir.
Sinfda konstruktorni e'lon qilinishi bilan destruktorlar qam aniqlanishi lozim. Agarda konstruktor sinf ob'ektini tuzish va uning o'zgaruvchi – a'zolariga qiymat berish vazifasini bajarsa, destruktor mavjud ob'ektning xotiradan o'chiradi. Destruktorlar sinf nomi oldiga tilda (~) belgisini qo'yish orqali aniqlanadi. Destruktorlar qech qanday argument qabul qilmaydi va qech qanday qiymat qaytarmaydi. Mushuk sinfining destruktori quyidagicha ko'rinishda aniqlanadi:
~Mushuk()
Misollar:
1.Masalaning qo’yilishi va yechish algoritmi
Ushbu kurs ishini masalasi quyidagicha berilgan: Kutubxona dasturi domiyligi berilgan bo’lsin:
КУТУБХОНА (номи, КИТОБЛАР, БЎЛИМЛАР, ХОДИМЛАР, БУЮРТМАЛАР)
Олинган китоб хақида хамма маълумотлар
Bu ma’lumotlar asosida Kutubxona va КИТОБ sinflari yaratiladi va ular orasidagi munosabatlar aniqlanishi lozim. Bu yerda Kutubxona sinfi asosiy sinf hisoblanadi. Kitob sinfi unga bog’liq bo’lgan bog’lanuvchi sinfini ifodalaydi.
КИТОБ sinfi ma’lumotlarini shakllantirish lozim:
КИТОБ (kun, ismi, soni)
КИТОБ sinfidagi bor maydonlar agar mavjud bo’lsa ularni olib tashlab o’rniga Kutubxona sinfidagi mos maydonlarni qo’yamiz. Natijada quyidagi Kitob sinfi hosil bo’ladi:
2. Dasturni yaratish va natija
#include
#include
using namespace std;
class Shaxs {
private:
string ism;
int yosh;
public:
Shaxs(string ism, int yosh) : ism(ism), yosh(yosh) {}
void salom_ber() {
cout << "Salom, men " << ism << ", " << yosh << " yoshdaman." << endl;
}
string getIsm() const {
return ism;
}
int getYosh() const {
return yosh;
}
void setIsm(string yangiIsm) {
ism = yangiIsm;
}
void setYosh(int yangiYosh) {
yosh = yangiYosh;
}
};
int main() {
Shaxs shaxs1("Ali", 25);
shaxs1.salom_ber();
cout << "Ism: " << shaxs1.getIsm() << endl;
cout << "Yosh: " << shaxs1.getYosh() << endl;
shaxs1.setIsm("Vali");
shaxs1.setYosh(30);
cout << "Yangi Ism: " << shaxs1.getIsm() << endl;
cout << "Yangi Yosh: " << shaxs1.getYosh() << endl;
return 0;
}
|