Программалау оқулық Алматы, 012 Қазақстан Республикасы Білім жəне ғылым министрлігінің «Оқулық»



Pdf көрінісі
бет500/642
Дата30.03.2022
өлшемі3,66 Mb.
#29231
түріПрограмма
1   ...   496   497   498   499   500   501   502   503   ...   642
Байланысты:
pavlovskaia-jogargy-dengeili

#include

#include

#include

#include

using namespace std;

enum color {red, green, blue};

class monstr{

 

   int health, ammo;

 

   color skin; 

 

   char *name; 

 public:

 

   monstr(int he = 100, int am = 10); 

      monstr(color sk); 

 

   monstr(char * nam); 

 

   monstr(const monstr &M); 

 

   ~monstr() {delete [] name;} 

 

   operator int(){return health;} 

 

   int get_health(){;return health;} 

 

   friend ostream&

 

      operator <<(ostream & out, monstr & m){ 

 

 

return out << "monstr: " << " ammo = "

            

     << m.ammo << " health = " 

           

     << m.health <

};


370

monstr::monstr(int he, int am):

 

health (he), ammo (am), skin (red), name (0){}

monstr::monstr(const monstr &M){

 

if (M.name){ name = new char [strlen(M.name) + 1];

 

   strcpy(name, M.name);} 

 

else name = 0;

 

health = M.health; ammo = M.ammo; skin = M.skin;

}

monstr::monstr(color sk){ 

 switch 

(sk){ 

 

case red : 

      health = 1; ammo = 10; skin = red; name = 0; break; 

 case 

green: 

      health = 2; ammo = 20; skin = green; name = 0; break; 

 case 

blue: 

      health = 3; ammo = 40; skin = blue; name = 0; break; 

}}

monstr::monstr(char * nam){

 

name = new char [strlen(nam) + 1]; strcpy(name, nam); 

 

health = 200; ammo = 10; skin = red;

}

bool less_health (monstr m1, monstr m2){

 

return m1.get_health() < m2.get_health() ;}

int main(){

 

vector m; 

 

monstr M (10, 30); 

 m.push_back(M);

 m.push_back(monstr("Vasia")); 

   m.push_back(monstr(red)); 

 

cout << " MONSTRY:" << endl;

 

for (int i = 0; i

 

cout << endl;

 

cout << " COUNT_IF: ";

 

cout << count_if(m.begin(), m.end(), 

 

 

  bind2nd(ptr_fun(less_health), 20));

 return 

0;

}


371

Мысалда берілген 



less_health

 бульдік функциясы өзіне берілген 



monstr

 класынаң екі аргументінің 



health

 өрістерін салыстырады. 



health

 

өрісін тұрақтымен салыстыру үшін онымен функцияның екінші аргументін 



байланыстыру керек. 

bind2nd

 байланыстырғышы бірінші аргумент ретінде 



ptr_fun

 адаптерінің көмегімен қалыптастырылатын функционалдық 

объектіні қабылдауы керек. Программа жұмысының нəтижесі (ауру монстрлар 

саны – 2):



MONSTRY:

monstr: ammo = 30 health = 10 

  monstr: ammo = 10 health = 200

  monstr: ammo = 10 health = 1

COUNT_IF: 2

Əдістер адаптерлері

Контейнерлерде мəліметтердің қолданушы анықтаған кластарының 

объектілерін сақтау кезінде контейнердің барлық элементтеріне кластың 

бір ғана əдісін қолдану мəселесі жиі туындайды. Кітапханада контей-

нер элементтерін қарап шығуға арналған 

for_each

 алгоритмі бар. Оған 

контейнердің əрбір қаралатын элементі үшін шақырылуы тиіс функцияға 

нұсқауыш беруге болады, мысалы:



#include

linclude

using namespace std;

void show(int a){ cout << a << endl;}

int main(){

 

int m[4] =   {3, 5, 9, 6};

 

for_each(m, m + 4, show); 

 return 

0;

}

Егер қарапайым жиымның орнына кез келген бір кластың объекті-

лерінен тұратын контейнерді қолданатын болсақ, онда осыған ұқсас про-

граммада 



show

 функциясының орнына класс əдісінің шақырылуын жазу 

мүмкін болмайды, өйткені əдісті нақты класс объектісін көрсету арқылы 

шақыру қажет.

Əдістер адаптерлері кластардың əдістерін стандартты алгоритмдердің 

 

аргументтері ретінде қолдануға мүмкіндік береді. Терістеуіш пен 



байланыстырғыш сияқты, əдіс адаптері де функцияны қабылдап, одан басқа 

функция қалыптастырады. Стандартты кітапханада аргументтерінің саны 

əртүрлі болып келетін əдістер үшін бірнеше адаптер анықталған:





Достарыңызбен бөлісу:
1   ...   496   497   498   499   500   501   502   503   ...   642




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет