lab4.docx

8
MINISTERUL EDUCAŢIEI AL REPUBLICII MOLDOVA UNIVERSITATEA TEHNICĂ A MOLDOVEI CATEDRA DE MICROELECTRONICĂ ŞI INGINERIE BIOMEDICALĂ RAPORT Lucrarea de laborator Nr.4 la Programarea în C++ Tema: „Moştenirea şi compoziţia” A efectuat: st. gr. ISBM-131 Moroi Ion A verificat: Balan Mihaela

Upload: ion-moroi

Post on 08-Apr-2016

6 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Lab4.docx

MINISTERUL EDUCAŢIEI AL REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICĂ A MOLDOVEI

CATEDRA DE MICROELECTRONICĂ ŞI INGINERIE BIOMEDICALĂ

RAPORTLucrarea de laborator Nr.4

la Programarea în C++

Tema: „Moştenirea şi compoziţia”

A efectuat: st. gr. ISBM-131 Moroi Ion

A verificat: Balan Mihaela

Chișinău, 2014

Page 2: Lab4.docx

Scopul lucrării: studierea moştenirii, avantajele şi dezavantajele; studierea compoziţiei; studierea regulilor de definire a moştenirii şi compoziţiei; studierea formelor de moştenire; studierea iniţializatorilor; principiul de substituţie; moştenirea şi compoziţia – ce să alegem.

Noțiuni teoreticeDefinirea şi utilizarea moştenirii:

Moştenirea se desemnează prin indicarea clasei de bază după numele clasei derivate, după două puncte. Ca de exemplu:

class Animal{int NofLegs;

public:void Say(){ cout<<”!!!”; }

};class Dog: public Animal{ // moştenirea...};void main(){ Dog d; d.Say();}

Din exemplu se vede, că funcţia şi variabila, sunt definite în clasa Animal sunt importate şi pot fi utilizate de obiectul clasei Dog. Starea, ce complică percepţia acestui mecanism, consta din aceia că, clasa derivată poate sa-şi definească comportamentul, primit în clasa de bază. (Struţul şi pinguinul nu zboară, deşi sunt păsări, dar ornitoringul depune ouă, deşi este manifer). Ne vom întoarce la aceasta temă în următoarele lucrări de laborator.Principiul de substituţiei

Adăugând la cele relatate mai sus, putem spune că, moştenirea presupune, că obiectul clasei derivate poate fi utilizat în locul obiectului de bază:

void main(){ Animal *ptr = new Dog;}

Din exemplu se vede că sunt indice la clasa de bază – deci se aşteaptă utilizarea obiectului de bază, dar, indicatorului i se atribuie obiectul derivatei.

Formele moşteniriiÎn relaţiile moştenirii, C++ este un limbaj foarte bogat, aşa cum există cinci forme diferite

de moştenireDiferite forme de moştenire sunt utilizate, pentru a modifica starea accesului pentru

variabilele membre clasei. De exemplu, la utilizarea moştenirii închise, toate care sunt accesibile (deschise şi protejate) variabilele clasei de bază devin închise în derivare. Dar prin utilizarea derivării protejate – protejate. Variabilele închise a clasei de bază prin orice forma de derivare devin inaccesibile. Mai mult ca atât, metodele de moştenire, se deosebesc prin aceia, că moştenirea deschisă creează un subtip de date, adică există principiul de substituţie, dar protejata şi deschisa nu.

Page 3: Lab4.docx

CompoziţiaCompoziţia reprezintă încă un mecanism, legat de programarea orientată pe obiecte, care

reprezintă relaţia dintre obiecte, atunci când moştenirea este relaţia dintre clase.Moştenirea realizează relaţia a fi „is a ”. Dog este mamifer, iar mamiferul – animal.Compoziţia realizează relaţia de a conţine „has a ”. Automobilul conţine motor şi roţi.

Definirea compoziţieiCu adevărat compoziţia este folosită foarte larg, aşa cum variabilele încorporate conţin un

tip şi sunt utilizate la definirea clasei. Dar la folosirea variabilelor încorporate nu apar întrebări, ceia ce nu se poate spune despre clasele utilizatorilor. Definirea nu este grea, însă utilizarea constructorilor creează probleme.

class Car{ Engine e;};

Varianta 10De creat clasa student, care are un nume, specialitate, anul de învăţământ şi balul mediu.

Determinaţi funcţia de definire, schimbare a datelor şi comparare. Pentru sarcina câmpurilor textuale se foloseşte operatorul new. Determinaţi constructorul, destructorul şi alte funcţii necesare. Creaţi clasa grupa, care conţine studenţi (o cantitate nelimitată). Definiţi metodele de adăugare şi eliminare a studenţilor, determinarea balului mediu pe grupă, constructorii, destructorii şi alte funcţii necesare.

#include <iostream>#include <process.h>#include <conio.h>#include <string.h>using namespace std;

int N=0;float media=0;

class Student {char *name;char *spec;int year;float med;

public:Student () : name(NULL), spec(NULL), year(0), med(0) {}

Student (char *n, char*s, int year, float med) : name(new char[strlen(n)+1]), spec(new char[strlen(s)+1]), year(year), med(med) {

strcpy(name, n);strcpy(spec, s);

}

Student (Student &obj) : name(new char[strlen(obj.name)+1]), spec(new char[strlen(obj.spec)+1]), year(obj.year),

med(obj.med) {strcpy(name, obj.name);

Page 4: Lab4.docx

strcpy(spec, obj.spec);}

~Student () {if (name) delete [] name;if (spec) delete [] spec;year=0;med=0;

}

void get_media (Student &obj) {media=media+obj.med;

}

void adaugare (Student &obj) {char n[50],s[50];if (obj.name) delete [] obj.name;if (obj.spec) delete [] obj.spec;cout <<"Name: "; cin>>n;obj.name = new char[strlen(n)+1];strcpy(obj.name, n);cout <<"Specialitatea: "; cin>>s;obj.spec = new char[strlen(s)+1];strcpy(obj.spec, s);cout <<"Anul: "; cin>>obj.year;cout <<"Media: "; cin>>obj.med;

}

friend istream & operator >> (istream & in, Student &obj) {char n[50],s[50];if (obj.name) delete [] obj.name;if (obj.spec) delete [] obj.spec;cout <<"Name: "; in>>n;obj.name = new char[strlen(n)+1];strcpy(obj.name, n);cout <<"Specialitatea: "; in>>s;obj.spec = new char[strlen(s)+1];strcpy(obj.spec, s);cout <<"Anul: "; in>>obj.year;cout <<"Media: "; in>>obj.med;return in;

}

friend ostream & operator << (ostream & out, Student &obj) {if (!obj.name) out <<"Nu-i nume, nu-i student!";out <<"Nume: "<<obj.name<<"\nSpecialitate: "<<obj.spec<<"\nAnul:

"<<obj.year<<"\nMedia: "<<obj.med<<endl;return out;

}};

class Grupa: public Student {

Page 5: Lab4.docx

Student S[50];public:

Grupa ():S() {}

Grupa (Student *s) {for (int i=0; i<N; i++)S[i]=s[i];

}

Grupa (Grupa &obj) {for (int i=0; i<N; i++)S[i]=obj.S[i];

}

~Grupa () {}

friend istream & operator >> (istream &in, Grupa&obj) {cout << "Introduceti informatie despre studenti:\n";for (int i=0; i<N; i++) {cout <<"\tNr."<<i+1<<endl;in>>obj.S[i];

}return in;

}

friend ostream & operator << (ostream &out, Grupa &obj) {for (int i=0; i<N; i++) {cout <<"\tNr."<<i+1<<endl;out<<obj.S[i];

}return out;

}

void bal_mediu () {media=0;for (int i=0; i<N; i++)get_media(S[i]);media=media/N;cout<<"Media grupei: "<<media<<endl;getch();

}

void adaugare_student() {cout <<"\tNr."<<N<<endl;adaugare(S[N-1]);

}};

int main () {int c, x=1;Grupa g;cout <<"Introduceti nr. de studenti: ";

Page 6: Lab4.docx

cin >>N;system ("cls");cin>>g;while (x) {

system ("cls");cout<<"1 - Afisarea informatiei despre studenti\n";cout<<"2 - Media grupei\n";cout<<"3 - Adaugarea unui student\n";cout<<"4 - Stergerea ultimului student\n";cout<<"0 - Iesire\n";cin>>c;switch (c) {

case 1: cout<<g; getch(); break;case 2: g.bal_mediu(); break;case 3: N++; g.adaugare_student(); break;case 4: if (N==0) {cout<<"Nu mai sunt studenti"; getch(); break;}

N--; break;case 0: x=0; break;

}}

return 0;}

Concluzie: Efectuând această lucrare de laborator am acumulat cunoştinţe noi la tema

“Moștenirea și compoziția”. În cadrul programului am creat clasa Student cu variabile de tip real,

întreg și caractere, am creat clasa Grupa cu funcții de a adăuga, elimina și calculul mediei

studenților. Efectuând această lucrare de laborator am însușit modul de lucru cu moștenirea și

compoziția în C++.