Programarea in limbajul C++ Moştenirea multiplă (V2)

1 Scopul lucrării:
·         Studierea regulilor de determinare a moştenirii multiple;
·         Studierea avantajelor şi neajunsurilor moştenirii multiple;
·         Probleme legate de utilizarea moştenirii multiple;
·         Studierea rezolvării problemelor;

Sarcina lucrari:
            Să se creeze, o ierarhie de moştenire: animale - mamifere, reptile – ornitorinc.


2 Indicatii teoretice
   Moştenirea multiplă, reprezintă prin sine moştenirea de la două sau mai multe clase. Pentru a înţelege pentru ce ne trebuie moştenirea multiplă trebuie să ne amintim, că moştenirea simplă nu rezolvă toate problemele, aşa cum câteodată ne obligă să alegem dintre două clase de bază potrivite.
Este interesantă părerea lui Buch referitor la acest mecanism: „Moştenirea multiplă este ca o paraşută: de regulă, nu ne trebuie, dar, când întâmplător o să ne trebuiască, o să ne pară rău dacă nu o să fie la îndemână”
  Ca şi orice alt instrument puternic şi frumos, moştenirea multiplă are neajunsurile sale, care au devenit motivul de eliminare a moştenirii multiple din multe limbaje moderne. Problemele apar din motivul apariţiei неоднозначностей. Presupunem, că în ambele clase de bază există câmpuri cu unul şi acelaşi nume.

class A{
public:
  int x;
};
class B{
public:
  int x;
};

class C: public A, public B{

};
void main(){
 C c;
 c.x = 10;
}

În aşa fel clasa C conţine două variabile cu unul şi acelaşi nume, aşa cum se moştenesc ambele, deoarece pentru fiecare clasa de bază variabila poate să aibă un sens propriu. Compilatorul nu poate decide, cărei din variabilele moştenite sa-i atribuie valoarea nouă. Aceiaşi situaţie are loc şi cu funcţiile.
Rezolvarea acestei neechivalenţe constă în utilizarea precizării numelui variabilei. Numele variabilelor pot coincide, dar numele claselor nu coincid. Aşa că, pentru indicarea variabilei care este utilizată  trebuie de indicat clasa, de la care este moştenită variabila:

c.A::x = 10;
c.B::x = 5;

Mai dificil este cînd clasele A şi B sunt înrudite, adică provin de la aceleaşi clase, aşa cum este prezentat în figura 1, cu toate că poate exista un caz mai dificil. În această configurare există două variabile identice, cu unul şi acelaşi sens. Se pot deosebi, aşa cum este prezentat mai sus. Dar problema constă în aceia, că ele şi după sens sunt identice, iar funcţiile definite în nivelul doi al ierarhiei, vor lucra în propriile copiii ale variabilelor, care des duc la greşeli semantice greu de găsit. Mai mult ca atât, în acest caz, constructorul clasei de bază este chemat de două ori. Pentru rezolvarea acestei probleme se utilizează ultima formă de moştenire: virtuală.

class A{
public:
  int x;
  A(int x){this->x=x;}
};
class B: virtual public A{
public:
  B(int x):A(x){}
};
class C: virtual public A{
public:
  C(int x):A(x){}
};
class D: public B, public C{
public:
  D(int x):A(x),B(x),C(x){}
}

Aşa cum se vede clasele B şi C trebuie ambele să moştenească clasa A. Imediat se rezolvă problema despre existenţa a două variabile identice. Mai mult ca atât, în acest caz este necesar de chemat constructorul clasei de bază manual, aşa cum este arătat în exemplu. Deoarece nu întotdeauna ierarhia este proiectată de un dezvoltator, şi unele clase deja pot fi compilate, în asemenea cazuri rezolvarea problemei este practice imposibilă.

3 Realizarea sarcinii:


  Programul dat a fost compus din două fişiere cu numele şi „File1.cpp”(vezi anexa A) „File2.h”,(vezi fig.1)  în care se conţine funcţia „pause()” care este folosită pentru vizualizarea programului mai comod şi functia de afisare a unei linii, şi definirea unor culori. Conţinutul fisierului “File2.h”:
Fig. 1
3.1  Explicarea clasei de baza „animale”:
           
class animale{
 public:   //declararea variabilelor ca fiinde publice, pentru a pute accesa din alta parte a progam.
char *gen;                     //m - masculin, f - femenin
char *med_trai;             //mediu de trai: terestru, acvatic, subterestru etc.
char *denumire;                    //denumirea animaluli. Ex. lup
float masa;                                 //masa (kg) 2-3 norma

   animale():gen(NULL),med_trai(NULL),denumire(NULL),masa(0){}; //CONSTR. IMPLICID
   animale(char *denum,char *med_trai,char *gen,int m){    // CONSTR. EXPLICIT
    gen = new char;  strcpy(gen,gen);    //alocarea de memorie p/u un char
    med_trai = new char[strlen(med_trai)+1];  //alocare p/u char: mediu de trai
               strcpy(med_trai,med_trai);                            //copie din med_trai(parametru) in med_trai
    denumire = new char[strlen(denum)+1]; //alocare p/u denumire
               strcpy(denumire,denum);                              //copie din denum in denumire
                masa=m;           //”masa” i se atribui „m”
    };
   animale(animale &obj){ //CONSTR. DE COPIERE
    gen = new char;         strcpy(gen,obj.gen);
    med_trai = new char[strlen(med_trai)+1];   strcpy(med_trai,obj.med_trai);
    denumire = new char[strlen(denumire)+1];  strcpy(denumire,obj.denumire);
    masa=obj.masa;
   };
   ~animale(){                                                                            // DESTUCTOR
delete gen;  gen=NULL;                               //sterge pointerul gen;
                                       delete med_trai;  med_trai=NULL;              //sterge pointerul med_trai    
                                       delete denumire; denumire=NULL; 
                                       masa=0;                                                         //masa i se atribuie (zero)
                                       };
//supraincarcarea functiilor „prietene” de intrare/iesire:
friend ostream & operator<<(ostream &, animale &);          
friend istream & operator>>(istream &, animale &);
 };
//*****SUPRAINCARCAREA OPERATORULUI COUT <<**"class animal"****
 ostream & operator<<(ostream &out, animale &obj){
 out<<"Denumirea: "<<obj.denumire<<endl;
 out<<"Mediu de tram: "<<obj.med_trai<<endl;
 out<<"Genu: "<<obj.gen<<endl;
 out<<"Greutatea: "<<obj.masa<<endl;
    return out;
    }; 

istream & operator>>(istream &in, animale &obj){
    char buf[100];
    cout<<"Denumire: ";    in>>buf;
    obj.denumire = new char [strlen(buf)+1];
    strcpy(obj.denumire,buf);
    cout<<"Mediu de trai: ";  in>>buf;
    obj.med_trai = new char [strlen(buf)+1];
    strcpy(obj.med_trai,buf);
    cout<<"Gen: ";      obj.gen = new char;
    in>>obj.gen;
    cout<<"Greutatea: ";  in>>obj.masa;
    return in;
    };

3.2 Explicarea clasei derivata „mamifer”:

class mamifer: public animale{
char *col_blan;    //culoarea blani
public:
    mamifer(){ col_blan=NULL; };                                //constructorul implicit
    mamifer(char *den,char *med_trai,char *gen,int gre,char *col_blan){   //construct. explicit
   animale::denumire = new char[strlen(den)+1];         //alocare de memorie p/u denumire
               strcpy(animale::denumire,den);
   animale::med_trai = new char[strlen(med_trai)+1];
               strcpy(animale::med_trai,med_trai);
   animale::gen = new char;
               strcpy(animale::gen,gen);
   animale::masa=gre;
   col_blan = new char[strlen(col_blan)+1];
    strcpy(col_blan,col_blan);
   };
friend istream & operator>>(istream &in, mamifer &obj);
friend ostream & operator<<(ostream &out,mamifer &obj);
};

//*****SUPR. OPERAT INTRARE CIN >> *******************************clasa mamifer
istream & operator>>(istream &in, mamifer & obj){
char buf[50];
yellow; cout<<"Denumirea:       ";  white; in>>buf;
obj.denumire = new char[strlen(buf)+1];
    strcpy(obj.denumire,buf);
yellow; cout<<"Mediu de trai:   ";  white; in>>buf;
obj.med_trai = new char[strlen(buf)+1];
    strcpy(obj.med_trai,buf);
yellow; cout<<"Gen m/f:         ";           white; in>>buf;
obj.gen = new char;
    strcpy(obj.gen,buf);
yellow; cout<<"Greutatea:       ";  white; in>>obj.masa;
yellow; cout<<"Culoarea blanei: ";  white;  in>>buf;
obj.col_blan = new char[strlen(buf)+1];
    strcpy(obj.col_blan,buf);
return in;
};
ostream & operator<<(ostream &out,mamifer &obj){
linie();
yellow;  out<<"Denumirea:       ";          white; out<<obj.denumire<<endl;
yellow;  out<<"Mediu de trai:   ";          white; out<<obj.med_trai<<endl;
yellow;    out<<"Gen m/f:         ";          white; out<<obj.gen<<endl;
yellow;  out<<"Greutate kg:     ";           white; out<<obj.masa<<endl;
yellow;  out<<"Culoarea blanei: ";        white;out<<obj.col_blan<<endl;
linie();
return out;
};

3.3 Explicarea clasei derivata „reptile

class reptile: public animale{
char *col_piel;
public:
    reptile(){col_piel=NULL;  };
    reptile(char *den,char *med_trai,char *gen,int gre,char *col_piel){
     animale::denumire = new char[strlen(den)+1];
               strcpy(animale::denumire,den);
     animale::med_trai = new char[strlen(med_trai)+1];
               strcpy(animale::med_trai,med_trai);
     animale::gen = new char;
               strcpy(animale::gen,gen);
     animale::masa = gre;
     col_piel = new char[strlen(col_piel)+1];
     strcpy(col_piel,col_piel);
               };
friend istream & operator>>(istream &in, reptile &obj);
friend ostream & operator<<(ostream &out,reptile &obj);
};
//*********SUPRAINCARCAREA OPERATOR DE INTRARE CIN >>  *********reptile
istream & operator>>(istream &in,  reptile &obj){
char buf[50];
yellow; cout<<"Denumirea:      "; white; in>>buf;
    obj.denumire = new char[strlen(buf)+1];
    strcpy(obj.denumire,buf);
   yellow; cout<<"Mediu de trai:  "; white; in>>buf;
    obj.med_trai = new char[strlen(buf)+1];
    strcpy(obj.med_trai,buf);
   yellow; cout<<"Gen m/f:        "; white; in>>buf;
    obj.gen = new char[strlen(buf)+1];
    strcpy(obj.gen,buf);
yellow; cout<<"Greutatea (kg): "; white; in>>obj.masa;
yellow; cout<<"Culoarea pielei:"; white; in>>buf;
    obj.col_piel = new char[strlen(buf)+1];
    strcpy(obj.col_piel,buf);
return in; };

//*********SUPRAINCARCAREA OPERATOR DE IESIRE COUT <<  *********reptile
ostream & operator<<(ostream &out, reptile &obj){
linie();
yellow; out<<"Denumire:        "; white; out<<obj.denumire<<endl;
yellow; out<<"Mediu de trai:   "; white; out<<obj.med_trai<<endl;
yellow; out<<"Gen m/f:         "; white; out<<obj.gen<<endl;
yellow; out<<"Greutatea:       "; white; out<<obj.masa<<endl;
yellow; out<<"Culoarea pielei: "; white; out<<obj.col_piel<<endl;
linie();
return out;
};

3.4 Explicarea clasei derivata „ornit:

    class ornit: public animale{
float lat_cioc;   // latimea ciocului ornitorinc
public:
    ornit(){lat_cioc=0;};
    ornit(char *den,char *med_trai,char *gen,int gre, int lat_coic){
    animale::denumire = new char[strlen(den)+1];
               strcpy(animale::denumire,den);
    animale::med_trai = new char[strlen(med_trai)+1];
               strcpy(animale::med_trai,med_trai);
    animale::gen = new char;
               strcpy(animale::gen,gen);
    animale::masa = gre;
    lat_cioc = lat_cioc;
     };
friend istream & operator>>(istream &, ornit &);
friend ostream & operator<<(ostream &, ornit &);
};
istream & operator>>(istream &in, ornit &obj){
char buf[50];
yellow;    cout<<"Denumirea:       "; white; in>>buf;
    obj.denumire = new char[strlen(buf)+1];
               strcpy(obj.denumire,buf);
yellow; cout<<"Mediu de trai:   "; white; in>>buf;
    obj.med_trai = new char[strlen(buf)+1];
               strcpy(obj.med_trai,buf);
yellow; cout<<"Gen m/f:         "; white; in>>buf;
    obj.gen = new char;
               strcpy(obj.gen,buf);
yellow; cout<<"Greutatea (kg):  "; white; in>>obj.masa;
yellow; cout<<"Latimea ciocului:"; white; in>>obj.lat_cioc;
yellow; cout<<"Culoarea blanei: "; white; in>>buf;
    obj.col_blan = new char[strlen(buf)+1];
    strcpy(obj.col_blan,buf);
return in;
};
ostream & operator<<(ostream &out,ornit &obj){
linie();
yellow;    out<<"Denumirea:       "; white; out<<obj.denumire<<endl;
yellow; out<<"Mediu de trai:   "; white; out<<obj.med_trai<<endl;
yellow; out<<"Gen m/f:         ";white; out<<obj.gen<<endl;
yellow; out<<"Greutatea:       ";white; out<<obj.masa<<endl;
yellow; out<<"Latimea ciocului:"; white; out<<obj.lat_cioc<<endl;
yellow; out<<"Culoarea blanei: "; white; out<<obj.col_blan<<endl;
linie();
return out;
};

3.5 Functia „main”
            Codul sursa:

void main(){
sus:del;
yellow; cout<<"1 "; white; cout<<"- Introdu un mamifer"<<endl;
yellow; cout<<"2 "; white; cout<<"- Introdu o reptila"<<endl;
yellow; cout<<"3 "; white; cout<<"- Introdu Ornitorinc"<<endl;
white;  cout<<"Esc "; cyan; cout<<"- Iesire"<<endl;
switch (getch()) {
            case '1': {        del; mamifer a; cin>>a; del; cout<<a; getch();          break;};
            case '2': {        del; reptile b; cin>>b; del; cout<<b; getch();             break;};
            case '3': {        del; ornit c;   cin>>c; del; cout<<c; getch();              break;};
            case  27 : { pause(); exit(1);};

}
goto sus;
getch();}
           
Meniul main (vezi Fig. 2)
Fig. 2
Introducerea unui mamifer este asemanator cu introducerea unei reptile sau unui ornitoric (vezi Fig. 3),
 afisarea se efectuiaza imediat dupa ca am terminat de introdus datele.

Fig. 3
Concluzi:
    In urma efectuarii lucrarii date am determinat ca mediul de prgramare C++   este cu mult flexibil ca C, care ne permite sa manipulam cu informatia intr-un mod rapid si eficient fara a induce erori grosolane, si am aflat ca utilizarea claselor este cu mult mai comod si mai rapid in eleborarea unui program.
Am aflat ca moştenirea multiplă, reprezintă prin sine moştenirea de la două sau mai multe clase, si ca acest mecanism este foarte necesar. Dar, el nu se foloseşte în toate limbajele, dar este realizat în C++.

Bibliografie
1 TOTUL DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE PROGRAMARE IN C SI C++)[RO][Kris Jamsa][Lars Kland]  
2 PROGRAMARE IN C_C++ CULEGERE DE PROBLEME Valiriu Iorga
3 Initiere in C++, Programarea orientata pe obiecte (Editie Prevazuta) Cluj-Napoca 1993




Anexa A
Fişierul „File1.cpp”
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include "File2.h"
//***********************************__CLASA ANIMALE
class animale{
 public:
char *gen;                     //m - masculin, f - femenin
char *med_trai;
char *denumire;
float masa;                                 //masa (kg) 2-3 norma

   animale():gen(NULL),med_trai(NULL),denumire(NULL),masa(0){}; //CONSTR. IMPLICID
   animale(char *denum,char *med_trai,char *gen,int m){    // CONSTR. EXPLICIT
    gen = new char;
               strcpy(gen,gen);
    med_trai = new char[strlen(med_trai)+1];
               strcpy(med_trai,med_trai);
    denumire = new char[strlen(denum)+1];
               strcpy(denumire,denum);
    masa=m;
    };
   animale(animale &obj){                                 //CONSTR. DE COPIERE
    gen = new char;                                                                                          strcpy(gen,obj.gen);
    med_trai = new char[strlen(med_trai)+1];   strcpy(med_trai,obj.med_trai);
    denumire = new char[strlen(denumire)+1];  strcpy(denumire,obj.denumire);
    masa=obj.masa;
   };
   ~animale(){     delete gen;gen=NULL;                          // DESTUCTOR
                                       delete med_trai; med_trai=NULL;
                                       delete denumire; denumire=NULL;
                                       masa=0;
                                       };
friend ostream & operator<<(ostream &, animale &);
friend istream & operator>>(istream &, animale &);
 };
//*****SUPRAINCARCAREA OPERATORULUI COUT <<**"class animal**
 ostream & operator<<(ostream &out, animale &obj){
 out<<"Denumirea: "<<obj.denumire<<endl;
 out<<"Mediu de tram: "<<obj.med_trai<<endl;
 out<<"Genu: "<<obj.gen<<endl;
 out<<"Greutatea: "<<obj.masa<<endl;
    return out;
    };

istream & operator>>(istream &in, animale &obj){
    char buf[100];
    cout<<"Denumire: ";    in>>buf;
    obj.denumire = new char [strlen(buf)+1];
    strcpy(obj.denumire,buf);

    cout<<"Mediu de trai: ";  in>>buf;
    obj.med_trai = new char [strlen(buf)+1];
    strcpy(obj.med_trai,buf);
    cout<<"Gen: ";           obj.gen = new char;
    in>>obj.gen;
    cout<<"Greutatea: ";  in>>obj.masa;
    return in;
    };
//****************************__CLASA MAMIFERE__
class mamifer: public animale{
char *col_blan;    //culoarea blani
public:
    mamifer(){ col_blan=NULL; };
    mamifer(char *den,char *med_trai,char *gen,int gre,char *col_blan){
   animale::denumire = new char[strlen(den)+1];
               strcpy(animale::denumire,den);
   animale::med_trai = new char[strlen(med_trai)+1];
               strcpy(animale::med_trai,med_trai);
   animale::gen = new char;
               strcpy(animale::gen,gen);
   animale::masa=gre;
   col_blan = new char[strlen(col_blan)+1];
    strcpy(col_blan,col_blan);
   };
friend istream & operator>>(istream &in, mamifer &obj);
friend ostream & operator<<(ostream &out,mamifer &obj);
};

//*****SUPR. OPERAT INTRARE CIN >> ***************clasa mamifer
istream & operator>>(istream &in, mamifer & obj){
char buf[50];
yellow; cout<<"Denumirea:       ";  white; in>>buf;
obj.denumire = new char[strlen(buf)+1];
    strcpy(obj.denumire,buf);
yellow; cout<<"Mediu de trai:   ";  white; in>>buf;
obj.med_trai = new char[strlen(buf)+1];
    strcpy(obj.med_trai,buf);
yellow; cout<<"Gen m/f:         ";           white; in>>buf;
obj.gen = new char;
    strcpy(obj.gen,buf);
yellow; cout<<"Greutatea:       ";  white; in>>obj.masa;
yellow; cout<<"Culoarea blanei: ";  white;  in>>buf;
obj.col_blan = new char[strlen(buf)+1];
    strcpy(obj.col_blan,buf);
return in;
};
ostream & operator<<(ostream &out,mamifer &obj){
linie();
yellow;  out<<"Denumirea:       ";          white; out<<obj.denumire<<endl;
yellow;  out<<"Mediu de trai:   ";         white;  out<<obj.med_trai<<endl;
yellow;    out<<"Gen m/f:         ";          white; out<<obj.gen<<endl;
yellow;  out<<"Greutate kg:     ";           white; out<<obj.masa<<endl;
yellow;  out<<"Culoarea blanei: ";        white;out<<obj.col_blan<<endl;
linie();
return out;
};

//*****************__CLASA REPTILE__
class reptile: public animale{
char *col_piel;
public:
    reptile(){col_piel=NULL;  };
    reptile(char *den,char *med_trai,char *gen,int gre,char *col_piel){
     animale::denumire = new char[strlen(den)+1];
               strcpy(animale::denumire,den);
     animale::med_trai = new char[strlen(med_trai)+1];
               strcpy(animale::med_trai,med_trai);
     animale::gen = new char;
               strcpy(animale::gen,gen);
     animale::masa = gre;
     col_piel = new char[strlen(col_piel)+1];
     strcpy(col_piel,col_piel);
               };
friend istream & operator>>(istream &in, reptile &obj);
friend ostream & operator<<(ostream &out,reptile &obj);
};
//*SUPRAINCARCAREA OPERATOR DE INTRARE CIN >>  *********reptile
istream & operator>>(istream &in,  reptile &obj){
char buf[50];
yellow; cout<<"Denumirea:      "; white; in>>buf;
    obj.denumire = new char[strlen(buf)+1];
    strcpy(obj.denumire,buf);
yellow; cout<<"Mediu de trai:  "; white; in>>buf;
    obj.med_trai = new char[strlen(buf)+1];
    strcpy(obj.med_trai,buf);
yellow; cout<<"Gen m/f:        "; white; in>>buf;
    obj.gen = new char[strlen(buf)+1];
    strcpy(obj.gen,buf);
yellow; cout<<"Greutatea (kg): "; white; in>>obj.masa;
yellow; cout<<"Culoarea pielei:"; white; in>>buf;
    obj.col_piel = new char[strlen(buf)+1];
    strcpy(obj.col_piel,buf);
return in; };

ostream & operator<<(ostream &out, reptile &obj){
linie();
yellow; out<<"Denumire:        "; white; out<<obj.denumire<<endl;
yellow; out<<"Mediu de trai:   "; white; out<<obj.med_trai<<endl;
yellow; out<<"Gen m/f:         "; white; out<<obj.gen<<endl;
yellow; out<<"Greutatea:       "; white; out<<obj.masa<<endl;
yellow; out<<"Culoarea pielei: "; white; out<<obj.col_piel<<endl;
linie();
return out;
};
//******************************__CLASA ORNITORINC
class ornit: public animale{
float lat_cioc;   // latimea ciocului ornitorinc
public:
    ornit(){lat_cioc=0;};
    ornit(char *den,char *med_trai,char *gen,int gre, int lat_coic){
    animale::denumire = new char[strlen(den)+1];
               strcpy(animale::denumire,den);
    animale::med_trai = new char[strlen(med_trai)+1];
               strcpy(animale::med_trai,med_trai);
    animale::gen = new char;
               strcpy(animale::gen,gen);
    animale::masa = gre;
    lat_cioc = lat_cioc;
     };
friend istream & operator>>(istream &, ornit &);
friend ostream & operator<<(ostream &, ornit &);
};
istream & operator>>(istream &in, ornit &obj){
char buf[50];
yellow;    cout<<"Denumirea:       "; white; in>>buf;
    obj.denumire = new char[strlen(buf)+1];
               strcpy(obj.denumire,buf);
yellow; cout<<"Mediu de trai:   "; white; in>>buf;
    obj.med_trai = new char[strlen(buf)+1];
               strcpy(obj.med_trai,buf);
yellow; cout<<"Gen m/f:         "; white; in>>buf;
    obj.gen = new char;
               strcpy(obj.gen,buf);
yellow; cout<<"Greutatea (kg):  "; white; in>>obj.masa;
yellow; cout<<"Latimea ciocului:"; white; in>>obj.lat_cioc;
yellow; cout<<"Culoarea blanei: "; white; in>>buf;
    obj.col_blan = new char[strlen(buf)+1];
    strcpy(obj.col_blan,buf);
return in;
};
ostream & operator<<(ostream &out,ornit &obj){
linie();
yellow;    out<<"Denumirea:       ";        white; out<<obj.denumire<<endl;
yellow; out<<"Mediu de trai:   ";          white; out<<obj.med_trai<<endl;
yellow; out<<"Gen m/f:         ";             white; out<<obj.gen<<endl;
yellow; out<<"Greutatea:       ";                        white; out<<obj.masa<<endl;
yellow; out<<"Latimea ciocului:";        white; out<<obj.lat_cioc<<endl;
yellow; out<<"Culoarea blanei: "; white; out<<obj.col_blan<<endl;
linie();
return out;
};
//############MAIN PRINCIPAL###############
void main(){
sus:del;
yellow; cout<<"1 "; white; cout<<"- Introdu un mamifer"<<endl;
yellow; cout<<"2 "; white; cout<<"- Introdu o reptila"<<endl;
yellow; cout<<"3 "; white; cout<<"- Introdu Ornitorinc"<<endl;
white;  cout<<"Esc "; cyan; cout<<"- Iesire"<<endl;
switch (getch()) {
    case '1': {        del; mamifer a; cin>>a; del; cout<<a; getch();          break;};
    case '2': {        del; reptile b; cin>>b; del; cout<<b; getch();             break;};
    case '3': {        del; ornit c;   cin>>c; del; cout<<c; getch();              break;};
    case  27 : { pause(); exit(1);};

}
goto sus;
getch();}

Fişierul „File2.h”
# define   white SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11)  //alb
# define   yellow SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10) //galben
# define   cyan SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8)    //cyan
# define  del  clrscr();         //curata ecranul
//**********************************MENU PAUZA
linie(){
for (int i = 0; i < 51; i++) cout<<"-";
cout<<endl;
};
void pause(){
yellow;
cout<<endl<<endl<<"Apasati orice tasta...";
getch();
white;
};



Niciun comentariu: