infoarena

infoarena - concursuri, probleme, evaluator, articole => Teme => Subiect creat de: Adriana Maria din Martie 21, 2017, 15:42:53



Titlul: Ierarhie de clase
Scris de: Adriana Maria din Martie 21, 2017, 15:42:53
Salut. Am o problema cu clase:
Sa se scrie un program C++ care tine evident cainilor intr-un cabinet veterniar.
Sunt 2 categorii de caini:
•        Caini cu pete
•        Caini fara pete

Subiecte urmarite:
-        Ierarhia de clase
-        Initializare membrilor
 
Introduc atat cainii cu pete cat si cei fara pete intr-o lista. Trebuie sa fac o functie virtuala de afisare.Am facut asta,dar totusi am erori si nu pot afisa fiecare clasa derivata in parte.Ma puteti ajuta?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdio.h>
#include<string.h>


using namespace std;

class lista;

class caini
{
private:
   char nume[20], rasa[20];
   int an;
    caini*urm;

public:
   caini(char n[20], char r[20], int an1)
   {
      strcpy(nume, n);
      strcpy(rasa, r);
      an = an1;
        urm = NULL;
   }


   virtual void afisare()
   {
      cout << "----------------------\n";
      cout << "nume: " << nume << endl;
      cout << "rasa: " << rasa << endl;
      cout << "an: " << an << endl;
   }
   friend class lista;
};

class cu_pete :public caini
{
private:
   int np;

public:
   cu_pete(char n[20], char r[20], int an1, int np1) :caini(n, r, an1)
   {
      np = np1;
   }

   void afisare()
   {
      caini::afisare();
      cout << "nr pete: " << np << endl;
   }
   friend class lista;
};

class fara_pete :public caini
{
private:
   char culoare[20];

public:
   
   
   fara_pete(char n[20], char r[20], int an1,char c[20]) :caini(n, r, an1)
   {
      strcpy(culoare, c);
   }

   void afisare()
   {
      caini::afisare();
      cout << "culoare: " << culoare << endl;
   }
   friend class lista;
};

class lista
{
public:
   caini*prim;
   void adaugare(caini*a);
   void an2();
       
};


void lista::adaugare(caini*a)
{
   caini*p;
   p = prim;
   if (p)
   {
      if (strcmp(p->nume, a->nume)>0)
      {
         a->urm = prim;
         prim = a;
      }
      else
      {
         while (p->urm &&strcmp((p->urm)->nume, a->nume)<0)
            p = p->urm;
         a->urm = p->urm;
         p->urm = a;
      }
   }
   else
      prim = a;
}

void lista::an2()
{
   caini*c;
   c = prim;
   while(c)
{
   if (c->an == 2)
     c->afisare();
          c=c->urm;
     cout << "-------";
}
}
 

void introdu(lista &l, int x)
{
   caini*c;
   char nume[20]; char rasa[20]; int an; int np; char culoare[20];
   cout << "Dati numele: ";
   cin >> nume;
   cout << "Dati rasa: ";
   cin >> rasa;
   cout << "Dati varsta: ";
   cin >> an;
   
      if (x == 0)
   {
      cu_pete*p;
      cout << "Dati nr pete: ";
      cin >> np;
       p = new cu_pete(nume, rasa, an, np);
      c = p;
      l.adaugare(c);
      
   }
   else
      if (x == 1)
      {
         fara_pete*f;
         cout << "Dati culoarea: ";
         cin >> culoare;
         f = new fara_pete(nume, rasa, an, culoare);
         c = f;
         l.adaugare(c);
      }
}

int main()
{
   int o;
   lista l;
   l.prim = NULL;
   caini *a;
   cu_pete p;
   fara_pete f;
   
   do
   {
      cout << "1.Adauga caini cu pete\n";
      cout << "2.Adauga caini fara pete\n";
      cout << "3.Afisare caini cu pete\n";
      cout << "4.Afisare caini fara pete\n";
        cout << "5.varsta de 2 ani\n";
        cout << "0.iesire\n";
      cin >> o;
      switch (o)
      {
      case 1:introdu(l, 0);
         break;
      case 2:introdu(l, 1);
         break;
      case 3:a=&p;
             a->afisare();
         break;
      case 4:a=&f;
             a->afisare();
         break;
                case 5:l.an2();
         break;
        }
   } while (o != 0);
}