Задача этой книги дать краткое и четкое изложение языка С++ в соответствии со стандар том iso/iec 14882. Она предназначена для студентов, изучающих язык «с нуля»



Download 2 Mb.
bet127/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   123   124   125   126   127   128   129   130   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Создание шаблонов классов


Ðaññìîòðèì ïðîöåññ ñîçäaíèя øaáëîía êëañña ía ïðèìåðå.  ðaçäåëå «Ëèíåéíûå ñïèñêè» (ñ. 115) áûë îïèñaí äâóñâяçíûé ñïèñîê è ïðèâåäåíû aëãîðèòìû ðaáîòû ñ íèì. Ïîñêîëüêó ñïèñêè ÷añòî ïðèìåíяþòñя äëя îðãaíèçaöèè äaííûõ, óäîáíî îïèñaòü ñïèñîê â âèäå êëañña, a òaê êaê ìîæåò ïîòðåáîâaòüñя õðaíèòü äaííûå ðaç- ëè÷íûõ òèïîâ, ýòîò êëaññ äîëæåí áûòü ïaðaìåòðèçîâaííûì.
Cía÷aëa ðaññìîòðèì íåïaðaìåòðèçîâaííóþ âåðñèþ êëañña «ñïèñîê».
Cïèñîê ñîñòîèò èç óçëîâ, ñâяçaííûõ ìåæäó ñîáîé ñ ïîìîùüþ óêaçaòåëåé. Êaæ- äûé óçåë õðaíèò öåëîå ÷èñëî, яâëяþùååñя êëþ÷îì ñïèñêa. Îïèøåì âñïîìîãa- òåëüíûé êëaññ äëя ïðåäñòaâëåíèя îäíîãî óçëa ñïèñêa:
Class NOde{ publiC:

int d; // Äaííûå


NOde *next; // Óêaçaòåëü ía ïîñëåäóþùèé óçåë
NOde *prev; // Óêaçaòåëü ía ïðåäûäóùèé óçåë NOde(int dat = 0){ // Êîíñòðóêòîð
d = dat; next = 0; prev= 0;
}
};
Ïîñêîëüêó ýòîò êëaññ áóäåò îïèñaí âíóòðè êëañña, ïðåäñòaâëяþùåãî ñïèñîê, ïîëя äëя ïðîñòîòû äîñòóïa èç âíåøíåãî êëañña ñäåëaíû äîñòóïíûìè (publiC). Ýòî ïîçâîëяåò îáîéòèñü áåç ôóíêöèé äîñòóïa è èçìåíåíèя ïîëåé. Íaçîâåì êëaññ ñïèñêa List:
Class List{ Class NOde{

};
NOde *pbeg, *pend; // Óêaçaòåëè ía ía÷aëî è êîíåö ñïèñêa publiC:
List(){pbeg = 0; pend = 0;} // Êîíñòðóêòîð
~List(); // Äåñòðóêòîð
vOid add(int d); // Äîáaâëåíèå óçëa â êîíåö ñïèñêa NOde * find(int i); // Ïîèñê óçëa ïî êëþ÷ó
// Âñòaâêa óçëa d ïîñëå óçëa ñ êëþ÷îì key:
NOde * insert(int key, int d);
bOOl remOve(int key); // Óäaëåíèå óçëa
vOid print(); // Ïå÷aòü ñïèñêa â ïðяìîì íaïðaâëåíèè vOid print_baCk(); // Ïå÷aòü ñïèñêa â îáðaòíîì íaïðaâëåíèè
};
Ðaññìîòðèì ðåaëèçaöèþ ìåòîäîâ êëañña. Ìåòîä add âûäåëяåò ïaìяòü ïîä íîâûé îáúåêò òèïa NOde è ïðèñîåäèíяåò åãî ê ñïèñêó, îáíîâëяя óêaçaòåëè ía åãî ía÷aëî è êîíåö:
vOid List::add(int d){
NOde *pv= new NOde(d); // Âûäåëåíèå ïaìяòè ïîä íîâûé óçåë if (pbeg == 0)pbeg = pend = pv; // Ïåðâûé óçåë ñïèñêa
else{
// Câяçûâaíèå íîâîãî óçëa ñ ïðåäûäóùèì:
pv->prev = pend; pend->next = pv;
pend = pv;} // Îáíîâëåíèå óêaçaòåëя ía êîíåö ñïèñêa
}
Ïðè æåëaíèè ïîëó÷èòü îòñîðòèðîâaííûé ñïèñîê ýòîò ìåòîä ìîæíî çaìåíèòü ía ìåòîä, aíaëîãè÷íûé ôóíêöèè ôîðìèðîâaíèя îòñîðòèðîâaííîãî ñïèñêa add_sOrt, ïðèâåäåííîé â ðaçäåëå «Ëèíåéíûå ñïèñêè» ía ñ. 119.
Ìåòîä find âûïîëíяåò ïîèñê óçëa ñ çaäaííûì êëþ÷îì è âîçâðaùaåò óêaçaòåëü ía íåãî â ñëó÷aå óñïåøíîãî ïîèñêa è 0 â ñëó÷aå îòñóòñòâèя òaêîãî óçëa â ñïèñêå:
NOde * List::find( int d ){ NOde *pv= pbeg;

while (pv){


if(pv->d == d)break; pv= pv->next;
}
return pv;
}
Ìåòîä insert âñòaâëяåò â ñïèñîê óçåë ïîñëå óçëa ñ êëþ÷îì key è âîçâðaùaåò óêa- çaòåëü ía âñòaâëåííûé óçåë. Åñëè òaêîãî óçëa â ñïèñêå íåò, âñòaâêa íå âûïîëíя- åòñя è âîçâðaùaåòñя çía÷åíèå 0:
NOde * List::insert(int key, int d){
if(NOde *pkey = find(key)){ // Ïîèñê óçëa ñ êëþ÷îì key
// Âûäåëåíèå ïaìяòè ïîä íîâûé óçåë è åãî èíèöèaëèçaöèя: NOde *pv= new NOde(d);
// Óñòaíîâëåíèå ñâяçè íîâîãî óçëa ñ ïîñëåäóþùèì: pv->next = pkey->next;
// Óñòaíîâëåíèå ñâяçè íîâîãî óçëa ñ ïðåäûäóùèì: pv->prev = pkey;
// Óñòaíîâëåíèå ñâяçè ïðåäûäóùåãî óçëa ñ íîâûì: pkey->next = pv;
// Óñòaíîâëåíèå ñâяçè ïîñëåäóþùåãî óçëa ñ íîâûì: if( pkey != pend) (pv->next)->prev = pv;
// Îáíîâëåíèå óêaçaòåëя ía êîíåö ñïèñêa,
// åñëè óçåë âñòaâëяåòñя â êîíåö: else pend = pv;
return pv;
}
return 0;
}
Ìåòîä remOve óäaëяåò óçåë ñ çaäaííûì êëþ÷îì èç ñïèñêa è âîçâðaùaåò çía÷åíèå true â ñëó÷aå óñïåøíîãî óäaëåíèя è false, åñëè óçåë ñ òaêèì êëþ÷îì â ñïèñêå íå íaéäåí:
bOOl List::remOve(int key){ if(NOde *pkey = find(key)){
if (pkey == pbeg){ // Óäaëåíèå èç ía÷aëa ñïèñêa pbeg = pbeg->next;
pbeg->prev= 0;}
else if (pkey == pend){ // Óäaëåíèå èç êîíöa ñïèñêa pend = pend->prev;
pend->next = 0;}
else { // Óäaëåíèå èç ñåðåäèíû ñïèñêa (pkey->prev)->next = pkey->next;
(pkey->next)->prev= pkey->prev;} delete pkey;
return true;} return false;
}

Ìåòîäû ïå÷aòè ñïèñêa â ïðяìîì è îáðaòíîì íaïðaâëåíèè ïîýëåìåíòíî ïðîñìaò- ðèâaþò ñïèñîê, ïåðåõîäя ïî ñîîòâåòñòâóþùèì ññûëêaì:


vOid List::print(){ NOde *pv= pbeg;
COut << endl << "list: "; while (pv){
COut << pv->d << ' '; pv= pv->next;}
COut << endl;
}
vOid List::print_baCk(){ NOde *pv= pend;
COut << endl << " list baCk: "; while (pv){
COut << pv->d << ' '; pv = pv->prev;}
COut << endl;
}
Äåñòðóêòîð ñïèñêa îñâîáîæäaåò ïaìяòü èç-ïîä âñåõ åãî ýëåìåíòîâ:
List::~List(){
if (pbeg != 0){ NOde *pv= pbeg; while (pv){
pv= pv->next; delete pbeg; pbeg = pv;}
}
}
Íèæå ïðèâåäåí ïðèìåð ïðîãðaììû, èñïîëüçóþùåé êëaññ List. Ïðîãðaììa aía- ëîãè÷ía ïðèâåäåííîé ía ñ. 116: îía ôîðìèðóåò ñïèñîê èç 5 ÷èñåë, âûâîäèò åãî ía ýêðaí, äîáaâëяåò ÷èñëî â ñïèñîê, óäaëяåò ÷èñëî èç ñïèñêa è ñíîâa âûâîäèò åãî ía ýêðaí:
int main(){ List L;
fOr (inti= 1; i<6; i++) L.add(i); L.print();
L.print_baCk();
L.insert(2, 200);
if (!L.remOve(5))COut << "nOt fOund"; L.print();
L.print_baCk();
}
Êëaññ List ïðåäíaçía÷åí äëя õðaíåíèя öåëûõ ÷èñåë. ×òîáû õðaíèòü â íåì äaííûå ëþáîãî òèïa, òðåáóåòñя îïèñaòü ýòîò êëaññ êaê øaáëîí è ïåðåäaòü òèï â êa÷åñòâå ïaðaìåòða.

Cèíòanñèñ îïèñaíèя øaáëîía:



Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   123   124   125   126   127   128   129   130   ...   232




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

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish