13 – ma’ruza mavzu: polimorfizm va uning turlari. Virtual funksiya. Abstrakt sinf va funksiyalar
Download 378.34 Kb. Pdf ko'rish
|
9y9byPXmkU5D8noFIWuv6TGva5udl9pc4QtcMYrC
Dinamik polimorfizmni qo‘llash
Dinamik polimorfizm vositasida dastur bajarilishini boshqarishning moslanuvchan boshqarishni amalga oshirish mumkin. Quyida, butun sonlarning bog‘langan ro‘yxati ko‘rinishida amalga oshirilgan stek va navbat tuzilmalari ustida ishlash qaralgan. Ma’lumki, navbat - ”birinchi kelgan - birinchi ketadi”, stek - ”oxirda kelgan - birinchi ketadi” tamoyili bo‘yicha berilganlarni saqlash va qayta ishlashni amalga oshiruvchi tuzilmalar hisoblanadi. Dasturda bog‘langan ro‘yxatni yaratish, unga qiymat joylashtirish va o‘chirishni amalga oshiruvchi Ruyxat tayanch sinfi va uning vorislari sifatida navbat hosil qiluvchi mos ravishda Navbat va Stek sinflari yaratiladi. Garchi bu tuzilmalar bilan ishlash turlicha amalga oshirilsa ham, ularni ishlatishda yagona interfeysdan foydalaniladi. #include #include #include class Ruyxat { public: Ruyxat(){Boshi=Oxiri=Keyingi=0;} virtual void Joylash(int n)=0; virtual bool Olish(int& n)=0; void Qiymat_n(int n){Son=n;} int n_Qiymat(){return Son;} Ruyxat * Boshi; Ruyxat * Oxiri; Ruyxat * Keyingi; private: int Son; }; class Navbat: public Ruyxat { public: void Joylash(int n); bool Olish(int& n); }; void Navbat::Joylash(int n) { Ruyxat * Yangi; Yangi=new Navbat; // Navbatning yangi elementini yaratish Yangi->Qiymat_n(n); Yangi->Keyingi=NULL; if(Oxiri) Oxiri->Keyingi=Yangi; // Elementni navbatning oxiriga joylash Oxiri=Yangi; if(!Boshi) Boshi=Yangi; } bool Navbat::Olish(int& n) { Ruyxat * Element; if(!Boshi){n=0; return false;} n=Boshi->n_Qiymat(); Element=Boshi; Boshi=Boshi->Keyingi; delete Element; return true; } class Stek: public Ruyxat { public: void Joylash(int n); bool Olish(int& n); }; void Stek::Joylash(int n) { Ruyxat * Yangi; Yangi=new Stek; // Stekning yangi elementini yaratish Yangi->Qiymat_n(n); Yangi->Keyingi=NULL; if(Boshi) Yangi->Keyingi=Boshi; // Elementni stek boshiga joylash Boshi=Yangi; if(!Oxiri) Oxiri=Yangi; } bool Stek::Olish(int& n) { Ruyxat * Element; if(!Boshi){n=0; return false;} n=Boshi->n_Qiymat(); Element=Boshi; Boshi=Boshi->Keyingi; delete Element; return true; } int main() { Ruyxat * ruyxat; Navbat navbat; Stek stek; int son; char stek_navbat; cout<<"Sonlarni navbat va stekka joylash:\n"; do { cout<<"Sonni kiriting(0-tamom): "; cin>>son; if(son) { do { cout<<"Joylshtirish? Stekka(S) yoki Navbatga(N):"; cin>>stek_navbat; } while (stek_navbat!='S' && stek_navbat!='s' && stek_navbat!='N' && stek_navbat!='n'); switch(stek_navbat) { case 'S': case 's': ruyxat=&stek; break; case 'N': case 'n': ruyxat=&navbat; } ruyxat->Joylash(son); } } while (son); for(;;) { do { cout<<"O'qish? Stekdan(S) yoki Navbatdan(N):\n"; cout<<"Dasturdan chiqish (Q):\n"; cin>>stek_navbat; } while(stek_navbat!='S' && stek_navbat!='s' && stek_navbat!='N' && stek_navbat!='n' && stek_navbat!='Q' && stek_navbat!='q'); switch(stek_navbat) { case 'S': case 's': ruyxat=&stek; break; case 'N': case 'n': ruyxat=&navbat; break; case 'Q':case 'q': return 0; } if(ruyxat->Olish(son)) cout< } Dastur kirish oqimidan butun sonlarni o‘qiydi va foydalanuvchi tanlagan ro‘yxatga - navbat yoki stekka joylashtiradi. Sonlarni kiritish jarayoni navbatdagi son tariqasida 0 soni kiritilganda to‘xtaydi. Keyinchalik, foydalanuvchi ko‘rsatgan ro‘yxatdan son qiymatlari o‘qiladi va ekranga chop qilinadi. Dinamik polimorfizm ruyxat ko‘rsatkichi navbat yoki stek obyektlariga ko‘rsatishiga mos ravishda virtual Olish() va Joylash() funksiyalarini chaqirishida namoyon bo‘ladi. Download 378.34 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling