Вы находитесь на странице: 1из 14

ETTI

PROIECT POO

Student: Stan Raluca Petronela


An: III
Grupa: 5305
An Universitar 2011-2012

Tema proiect nr. 6


S se defineasc adecvat o clas abstract cu numele Carte, din care s se deriveze public
clasele Proza i Versuri.
Clasa Carte va avea ca date membru private nr_pagini (int) i autor (ir), clasa Proza va avea
data privat nr_capitole , iar clasa Versuri va avea dat membru privat tip_rima (enum). Tipul de
data ir va fi un tip utilizator (clas separat).
In mod adecvat, pentru clasa de baz i clasele derivate se vor defini constructori,
constructorul de copiere, supraincarcarea operatorilor de insertie i extractie, destructori. S se
construiasc cele doua clase astfel nct s poat fi exploatat polimorfismul.
Sa se scrie un program care s evidentieze comportamentul polimorfic, definind
corespunztor un tablou cu elemente de tip adecvat, creat in funcie de opiunea utilizatorului.
Sa se proiecteze i apeleze adecvat o funcie care are ca argument un obiect din ierahia de
clase i, apeland la funcia de identificare, afieaz un mesaj privitor la clasa careia i aparine. Se va
folosi mecanismul polimorfic astfel nct funcia s poat fi apelat pentru obiecte aparinnd
ambelor clase.

///targetver.h//
#pragma once
// The following macros define the minimum required platform. The minimum
required platform
// is the earliest version of Windows, Internet Explorer etc. that has the
necessary features to run
// your application. The macros work by enabling all features available on
platform versions up to and
// including the version specified.
// Modify the following defines if you have to target
ones specified below.
// Refer to MSDN for the latest info on corresponding
platforms.
#ifndef _WIN32_WINNT
// Specifies that the
platform is Windows Vista.
#define _WIN32_WINNT 0x0600
// Change this to the
target other versions of Windows.
#endif

a platform prior to the


values for different
minimum required
appropriate value to

// stdafx.h//
// : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <conio.h>
#include <limits>
#include <fstream>
///stdafx.cpp///
//
//
//
//

TODO: reference additional headers your program requires here


stdafx.cpp : source file that includes just the standard includes
proiect_tema_6.pch will be the pre-compiled header
stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

///Carte.h///
#pragma once
#includestdafx.h
#include <iostream>
#if !defined CARTE_H
#define CARTE_H
#include Sir.h
using namespace std;
class Carte
{
private:
int nr_pagini;
Sir autor;
public:
Carte(void);
Carte(int, Sir);
Carte(Carte &);
~Carte(void);
void SetNrPag(int);
int GetNrPag();
void SetAutor(Sir);
Sir GetAutor();
virtual void Read(istream &);
virtual void Write(ostream &);
virtual char* Identity();
Carte operator =(Carte const &);
friend istream & operator >>(istream &, Carte &);
friend ostream & operator <<(ostream &, Carte &);

};
#endif
///Carte.cpp///
#include "StdAfx.h"
#include "Carte.h"
Carte::Carte(void)
{
nr_pagini = 0;
Sir autor();
}
Carte::~Carte(void)
{

}
Carte::Carte(Carte & carte)
{
nr_pagini = carte.nr_pagini;
autor = carte.autor;
}
Carte::Carte(int nr_pagini , Sir autor)
{
this->nr_pagini = nr_pagini;
this->autor = autor;
}
void Carte::SetNrPag(int nr_pagini)
{
this->nr_pagini = nr_pagini;
}
int Carte::GetNrPag()
{
return nr_pagini;
}
void Carte::SetAutor(Sir autor)
{
this->autor = autor;
}
Sir Carte::GetAutor()
{
return autor;
}
void Carte::Read(istream &Strin)
{
Strin>>autor;
Strin>>nr_pagini;
}
void Carte::Write(ostream &Strout)
{
Strout<<autor<<"\n";
Strout<<nr_pagini<<"\n";
}
char* Carte::Identity()
{
return "Obiectul apartine clasei Carte";
this->GetAutor();
this->GetNrPag();
}
Carte Carte::operator =(Carte const & carte)
{
Carte temp;
temp.nr_pagini = carte.nr_pagini;
temp.autor = carte.autor;

return temp;
}
istream & operator >>(istream &Strin, Carte &carte)
{
carte.Read(Strin);
return Strin;
}
ostream & operator <<(ostream &Strout, Carte &carte)
{
carte.Write(Strout);
return Strout;
}
///Versuri.h///
#pragma once
#include "Carte.h"
#ifndef VERSURI_H
#define VERSURI_H
class Versuri:public Carte
{
public:
enum tip_rima:int
{
incrucisata, imbratisata, imperecheata, monorima, rima_alba
};
private:
tip_rima rima;
public:
Versuri(void);
Versuri(tip_rima);
~Versuri(void);
void SetRima(tip_rima);
tip_rima GetRima();
void Read(istream &);
void Write(ostream &);
char* Identity();
Versuri operator =(Versuri &);
friend istream & operator >>(istream &, Versuri &);
friend ostream & operator <<(ostream &, Versuri &);
};
#endif

///Versuri.cpp///
#include "StdAfx.h"
#include "Versuri.h"
Versuri::Versuri(void)
{
}
Versuri::Versuri(tip_rima rima)
{
this->rima = rima;
}
Versuri::~Versuri(void)
{
}
void Versuri::SetRima(tip_rima rima)
{
this->rima = rima;
}
Versuri::tip_rima Versuri::GetRima()
{
return rima;
}
void Versuri::Read(istream &Strin)
{
int nr_pag;
Sir autor;
Strin>>nr_pag;
this->SetNrPag(nr_pag);
Strin>>autor;
this->SetAutor(autor);
int r;
Strin>>r;
switch(r)
{
case incrucisata:
rima = incrucisata;
break;
case imbratisata:
rima = imbratisata;
break;
case imperecheata:
rima = imperecheata;
break;
case monorima:
rima = monorima;
break;

case rima_alba:
rima = rima_alba;
break;
}
}
void Versuri::Write(ostream &Strout)
{
int nr_pag;
Sir autor;
nr_pag = this->GetNrPag();
Strout<<nr_pag;
autor = this->GetAutor();
Strout<<autor;
switch(rima)
{
case incrucisata:
Strout<<"0"<<"\n";
break;
case imbratisata:
Strout<<"1"<<"\n";
break;
case imperecheata:
Strout<<"2"<<"\n";
break;
case monorima:
Strout<<"3"<<"\n";
break;
case rima_alba:
Strout<<"4"<<"\n";
break;
}
}
char* Versuri::Identity()
{
return "Obiectul apartine clasei Versuri";
this->GetRima();
}
Versuri Versuri::operator =(Versuri & vers)
{
Versuri temp;
int pag;
pag = vers.GetNrPag();
Sir autor;
autor = vers.GetAutor();
temp.SetNrPag(pag);
temp.SetAutor(autor);
temp.rima = vers.rima;
return temp;
}

istream & operator >>(istream &Strin, Versuri &vers)


{
vers.Read(Strin);
return Strin;
}
ostream & operator <<(ostream &Strout, Versuri &vers)
{
vers.Write(Strout);
return Strout;
}
///Proza.h///
#pragma once
#include "Carte.h"
#ifndef PROZA_H
#define PROZA_H
class Proza:public Carte
{
private:
int nr_capitole;
public:
Proza(void);
Proza(int);
~Proza(void);
void SetNrCap(int);
int GetNrCap();
void Read(istream &);
void Write(ostream &);
char* Identity();
Proza operator =(Proza &);
friend istream & operator >>(istream &, Proza &);
friend ostream & operator <<(ostream &, Proza &);
};
#endif
///Proza.cpp///
#include "StdAfx.h"
#include "Proza.h"
Proza::Proza(void)
{
nr_capitole = 0;
}
Proza::Proza(int nr_capitole)
{
this->nr_capitole = nr_capitole;
}

Proza::~Proza(void)
{
}
void Proza::SetNrCap(int nr_capitole)
{
this->nr_capitole = nr_capitole;
}
int Proza::GetNrCap()
{
return nr_capitole;
}
void Proza::Read(istream &Strin)
{
int nr_pag;
Sir autor;
Strin>>nr_pag;
this->SetNrPag(nr_pag);
Strin>>autor;
this->SetAutor(autor);
Strin>>nr_capitole;
}
void Proza::Write(ostream &Strout)
{
int nr_pag;
Sir autor;
nr_pag = this->GetNrPag();
Strout<<nr_pag;
autor = this->GetAutor();
Strout<<autor;
Strout<<nr_capitole;
}
char* Proza::Identity()
{
return "Obiectul apartine clasei Proza";
this->GetNrCap();
}
Proza Proza::operator =(Proza & proza)
{
Proza temp;
int pag;
pag = proza.GetNrPag();
Sir autor;
autor = proza.GetAutor();
temp.SetNrPag(pag);
temp.SetAutor(autor);
temp.nr_capitole = proza.nr_capitole;
return temp;

}
istream & operator >>(istream &Strin, Proza &proza)
{
proza.Read(Strin);
return Strin;
}
ostream & operator <<(ostream &Strout, Proza &proza)
{
proza.Write(Strout);
return Strout;
}
///Sir.h///
#pragma once
#include<iostream>
using namespace std;
class Sir
{
private:
char *sir;
public:
Sir(void);
Sir(char*);
~Sir(void);
void SetSir(char*);
char* GetSir();
Sir operator =(Sir const &);
friend istream & operator >>(istream &, Sir &);
friend ostream & operator <<(ostream &, Sir &);
};
///Sir.cpp///
#include "StdAfx.h"
#include "Sir.h"
#ifndef SIR_H
#define SIR_H
Sir::Sir(void)
{
sir = new char[50];
}
Sir::Sir(char *sir)
{
this->sir = sir;
}
Sir::~Sir(void)
{
delete []sir;
}

void Sir::SetSir(char *sir)


{
this->sir = sir;
}
char* Sir::GetSir()
{
return sir;
}
Sir Sir::operator =(Sir const &sir)
{
Sir temp;
strcpy(temp.sir,sir.sir);
return temp;
}
istream & operator >>(istream &Strin, Sir &sir)
{
char temp[100];
Strin>> temp;
sir.sir = new char[strlen(temp) + 1];
strcpy_s(sir.sir, strlen(temp) + 1, temp);
return Strin;
}
ostream & operator <<(ostream &Strout, Sir &sir)
{
Strout<<sir.sir<<"\n";
return Strout;
}
#endif
///proiect_tema_6.cpp///
// proiect_tema_6.cpp : Defines the entry point for the console application.
//
#include
#include
#include
#include

"stdafx.h"
"Carte.h"
"Versuri.h"
"Proza.h"

void _tmain(int argc, _TCHAR* argv[])


{
int i = 0;
int ind, op, op1, op2;
int pag;
char* nume;
Carte *obiecte;
Carte carte;
Versuri vers;
Proza proza;
ofstream oFileStr2("Obiecte.txt");
do

{
cout<<"1.Creati un element nou\n2.Vizualizati
elementele\n3.Modificati elementele\n4.Stergeti elementele\n ";
cin>>op;
switch(op)
{
case 1:
{
cout<<"1.Carte\n2.Versuri\n3.Proza\n";
cin>>op1;
switch(op1)
{
case 1:
{
cout<<"Dati numele
autorului si nr de pagini:\n";
cin>>carte;
obiecte[i++] = carte;
oFileStr2<<carte;
}
case 2:
{
cout<<"Dati numele
autorului, nr de pagini si tipul rimei (0 = incrucisata ,1 = imbratisata ,2 =
imperecheata ,3 = monorima ,4 = rima_alba:\n";
cin>>vers;
obiecte[i++] = vers;
oFileStr2<<vers;
}
case 3:
{
cout<<"Dati numele
autorului, nr de pagini si nr de capitole:\n";
cin>>proza;
obiecte[i++] = proza;
oFileStr2<<proza;
}
break;
}
}
case 2:
{
for(int j = 0; j<i; j++)
{
cout<<j<<". ";
cout<<obiecte[j];
//apel fctia identitate
cout<<obiecte[j].Identity();
cout<<endl;
}
break;
}
case 3:
{

cout<<"Introduceti indicele elementului


pe care doriti sa il modificati:\n";
cin>>ind;
while(ind>i)
{
cout<<"Obiectul nu a fost creat\n";
cout<<"Introduceti indicele
elementului pe care doriti sa il modificati:\n";
cin>>ind;
}
cout<<obiecte[ind].Identity();
cout<<"1.Modificati numarul de
pagini\n2.Modificati numele autorului\n";
cin>>op2;
switch (op2)
{
case 1:
{
cout<<"Introduceti noul
numar de pagini: ";
cin>>pag;
obiecte[ind].SetNrPag(pag);
cout<<"Obiectul
modificat este \n"<<obiecte[ind]<<endl;
}
break;
case 2:
{
cout<<"Introduceti noul
nume de autor: ";
cin>>nume;
obiecte[ind].SetAutor(nume);
cout<<"Obiectul
modificat este \n"<<obiecte[ind]<<endl;
}
break;
}
}
break;
case 4:
{
for(int j = 0; j<i; j++)
obiecte[j].~Carte();
}
}
}
while(op<=4 && op>=1);
oFileStr2.close();
getchar();
}