13 – ma’ruza mavzu: polimorfizm va uning turlari. Virtual funksiya. Abstrakt sinf va funksiyalar


Download 378.34 Kb.
Pdf ko'rish
bet6/8
Sana15.12.2022
Hajmi378.34 Kb.
#1007526
1   2   3   4   5   6   7   8
Bog'liq
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<else cout<<"Ro'yxat bo'sh!"<

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:
1   2   3   4   5   6   7   8




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling