Documente Academic
Documente Profesional
Documente Cultură
REFERAT
La Lucrare de laborator nr.2
A efectuat:
Moroi Ion
A verificat:
M. Balan
Chiinu 2014
1. Scopul lucrrii:
2. Sarcina lucrarii:
S se creeze clasa Matrix matrice. Clasa conine pointer spre float, numrul
de rnduri i de coloane i o variabil codul erorii. S se defineasc constructorul
fr parametri (constructorul implicit), constructorul cu un parametru matrice
ptrat i constructorul cu doi parametri matrice dreptunghiular . a. S se
defineasc funciile membru de acces: returnarea i setarea valorii elementului (i,j).
S se defineasc funciile de adunare i scdere a dou matrice; nmulirea unei
matrice cu alta; nmulirea unei matrice cu un numr. S se testeze funcionarea
clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
3. Indicatii teoretice:
Constructori
Constructorii sunt metode speciale care folosesc la crearea si initializarea
instantelor unei clase.
Constructorii sunt apelati de fiecare data cnd se creaza noi instante ale
clasei.
class complex
{public:
float x,y,m; //datele clasei
void display();//metodele clasei
float modul();};
float complex::modul()
{return sqrt(x*x+y*y);
}
void complex::display()
{cout<<x<<"+"<<y<<"*i";}
Clasa nu are definit un constructor prin urmare este generat in mod automat un
constructor implicit care va permite declararea unor instante ale clasei astfel:
void main()
{ complex q1; //constructorul implicit permite
instantiarea clasei complex
complex *q=new complex;
cout<<q1.x<< <<q1.y; //afiseaza valori reziduale
2
Destructori
Destructorii sunt metode ale claselor care actioneaza n sens invers,
complementar, fata de constructori. Constructorii sunt folositi pentru alocarea
memoriei, initializarea datelor membru sau alte operatii (cum ar fi, incrementarea
unui contor pentru instantele clasei). Constructorul este apelat n momentul
declararii obiectelor.
Destructorul elibereaza memoria alocata de constructori. Destructorul este apelat
automat, la iesirea din blocul n care este recunoscut acel obiect.
Proprietatile destructorilor
Destructorul are acelasi nume ca si clasa a caror metoda este;
Numele destructorului este precedat de semnul ~;
O clasa are un singur destructor;
Destructorul nu are parametri si nu returneaza nici o valoare (antetul nu
contine cuvntul cheie void, iar n corpul destructorului nu apare
instructiunea return;);
Daca programatorul nu a definit un destructor, compilatorul genereaza
automat un destructor pentru clasa respectiva;
Destructorii se apeleaza la ncheierea timpului de viata a obiectelor, n
ordine inversa apelurilor constructorilor;
#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
/*
Codurile erorilor:
1 - Insuficienta de memorie
2 - Necorespondenta a dimensiunilor matricelor
3 - Depasirea limitei memoriei utilizate
*/
class Matrix{
int **p;
int x; // Nr. coloanelor
int y; // Nr. rindurilor
int error; // Numarul erorii
public:
// Constructor implicit
Matrix()
{
4
this->error = 0;
this->p = NULL;
this->x = 0;
this->y = 0;
}
// Constructor cu un parametru, matrice patrata
Matrix(int x1)
{
this->x = x1;
this->y = x1;
this->error = 0;
this->p = NULL;
}
// Constructor cu 2 parametri, matrice dreptungiulara
Matrix(int x1, int y1)
{
this->x = x1;
this->y = y1;
this->error = 0;
this->p = NULL;
}
// Functia de copiere
void copy(Matrix &M)
{
this->x = M.x;
this->y = M.y;
error = M.error;
this->setSize(x, y);
this->p = NULL;
p = new int*[x];
for(int i=0; i<y; i++){
p[i] = new int[x];
}
for(int i=0; i<y; i++)
for(int j=0; j<x; j++)
this->p[i][j]=M.p[i][j];
}
// Returneaza 1 daca matricea este ca minim x si y diferit
de 0;
int ok()
{
if(this->x>0 && this->y>0) return 1;
else return 0;
}
// Returnarea valorii (i, j)
int gets(int i, int j)
{
return this->p[i][j];
5
}
//Formarea matricei
void setSize(int n, int m)
{
this->x = n;
this->y = m;
this->p = NULL;
p = new int*[x];
for(int i=0; i<y; i++){
p[i] = new int[x];
}
for(int i=0; i<y; i++)
for(int j=0; j<x; j++)
this->p[i][j]=0;
}
//Setarea valorilor matricei
void setMatrix(int n, int m)
{
int val=0;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
cout<<"Elementul "<<"("<<i <<
j<<")"<<"=";
cin>>val;
this->p[i][j]=val;
}
}
int _x()
{
return this->x;
}
int _y()
{
return this->y;
}
// Modificarea valorii (i, j), nr. linii = i; nr. coloanei =
j
void set(int i, int j, int valoarea)
{
this->p[i][j] = valoarea;
}
// Functia pentru afisarea matricei
void view()
{
for(int i=0; i<_y(); i++)
{
6
int sum;
if(M1->_x() == M2->_y())
{
for(int i=0; i<M1->_y(); i++)
{
for(int j=0; j<M1->_x(); j++)
{
sum = 0;
for(int k=0; k<M1->_x(); k++)
sum += M1->gets(i, k)*M2->gets(k, j);
cout << sum << "\t";
}
cout << endl;
}
} else cout << "Numarul de linii si coloane nu coincide" <<
endl << "Pentru a efectua operatia de inmultire," << " este
nevoie sa coincida numarul liniilor M1 cu numarul coloanelor din
M2";
}
// Functia pentru inmultirea unei matrice cu un numar
void inmultirea_nr(Matrix *M, int nr)
{
for(int i=0; i<M->_y(); i++)
{
for(int j=0; j<M->_x(); j++)
cout << M->gets(i, j)*nr << "\t";
cout << endl;
}
}
Matrix M1, M2;
void menu()
{
cout<<"
"<<endl;
cout << "
Matricea M1:" << endl;
cout<<"
"<<endl;
cout << "
1. M1 - Crearea matricei patratice
n x n" << endl;
cout<<"
"<<endl;
cout << "
2. M1 - Crearea matricei n x m" <<
endl;
cout<<"
"<<endl;
if(M1.ok()) cout << "
3. M1 Afisarea/Redactarea elementelor matricei" << endl;
cout<<"
"<<endl;
cout << "
Matricea M2:" << endl;
8
cout<<"
"<<endl;
cout << "
4. M2 - Crearea matricei patratice
n x n" << endl;
cout<<"
"<<endl;
cout << "
5. M2 - Crearea matricei n x m" <<
endl;
cout<<"
"<<endl;
if(M2.ok()) cout << "
6. M2 Afisarea/Redactarea elementelor matricei" << endl;
cout<<"
"<<endl;
cout << "
Functiile:" << endl;
cout<<"
"<<endl;
cout << "
7. Adunarea si Scaderea matricilor
M1 si M2" << endl;
cout<<"
"<<endl;
cout << "
8. Inmultirea matricei M1 cu M2" <<
endl;
cout<<"
"<<endl;
cout << "
9. Inmultirea unei matrice cu un
numar" << endl;
cout<<"
"<<endl;
cout << "
0. Iesire"<<endl;
cout<<"
"<<endl;
cout << endl << endl << "** Pentru a fi accesate toate
meniurile," << endl << "incarcati cu elemente ambele matrice M1,
M2";
}
int main()
{
system("cls"); //temp();
menu();
char c;
c = getch();
int n, m;
Matrix M;
switch(c)
{
case '1':
system("cls");
cout << "M1 - Crearea matricei patratice n x n" << endl
<< endl;
9
{
case 13: // Enter
system("cls");
cout << "Redactarea elementelor matricei
M1:" << endl << endl;
cout << "Matricea M1: " << endl;
M1.view();
cout << endl << endl;
int i, j, nr;
cout << "Selectati elementul pentru
redactare (i, j):" << endl;
cout << "Linia i=";
cin >> i;
cout << endl << "Coloana j=";
cin >> j;
cout << endl << "Introduceti valoarea
elementului (" << i << ", " << j << ") = ";
cin >> nr;
if(i >= 0 && i < M1._x() && j >= 0 && j <
M1._y())
{
cout << endl << endl << "Valoarea a fost
salvat cu succes!" << endl;
M1.set(i, j, nr);
}
else cout << endl << endl << "EROARE!
Valoarea nu a fost salvata din cauza coordanatelor gresite" <<
endl;
cout << "Matricea arata in felul urmator: "
<< endl;
M1.view();
o = 0;
break;
case 27: // Esc
main();
break;
}
}
main();
} else main();
break;
case '4':
system("cls");
cout << "M2 - Crearea matricei patratice n x n" << endl
<< endl;
cout << "Introduceti valoarea n=";
cin >> n;
11
M2.setSize(n, n);
M2.setMatrix(n, n);
cout << "Matricea patratica M2 a fost creata cu
succes!";
getch();
main();
break;
case '5':
system("cls");
cout << "M2 - Crearea matricei patratice n x m" << endl
<< endl;
cout << "Introduceti nr. de coloane n=";
cin >> n;
cout << "Introduceti nr. de linii n=";
cin >> m;
M2.setSize(n, m);
M2.setMatrix(n, m);
cout << "Matricea " << n << " x " << m << " M2 a fost
creata cu succes!";
getch();
main();
break;
case '6':
if(M2.ok())
{
system("cls");
cout << "Afisarea matricei M2 (" << M2._x() << " x "
<< M2._y() << ")" << endl << endl;
M2.view();
int o;
o = 0;
while(!o)
{
o = 1;
cout << endl << endl << "Pentru redactarea
elementelor tastati ENTER, " << endl << "pentru a reveni in
meniul principal tastati ESC";
int c;
c = '0';
while(c != 27 && c != 13)
c = getch();
switch(c)
{
case 13: // Enter
system("cls");
12
scaderea(&M1, &M2);
getch();
main();
break;
case '8':
system("cls");
cout << "Inmultirea matricelor M1 si M2" << endl <<
endl;
inmultirea(&M1, &M2);
getch();
main();
break;
case '9':
system("cls");
cout << "Inmultirea matricei cu un numar" << endl <<
endl;
cout << "Selectati matricea M1 sau M2 pentru
inmultire (1-2): ";
char l;
l = '0';
while(l != '1'&& l != '2')
l = getch();
switch(l)
{
case '1':
M.copy(M1);
break;
case '2':
M.copy(M2);
break;
}
int nr;
cout << endl << "Introduceti nr. de inmultire a
matricei " << l << ": ";
cin >> nr;
cout << endl << "Matricea " << l << " in urma
inmultirii cu " << nr << " este:" << endl;
inmultirea_nr(&M, nr);
getch();
main();
break;
14
case '0':
exit(1);
break;
default:
main();
break;
}}
Afisarea rezultatelor
Meniul:
Introducerea datelor:
15
Afisarea datelor:
16
ntrebri de control:
17
10.
n ce cazuri se apeleaz constructorul de copiere? Care este
sintaxa apelului?
Daca clasa contine elemente pointeri.In cazul in care dou obiecte diferite
se refera la una i aceeai memorie.
#include<math.h>
#include<iostream.h>
#include<conio.h>
class complex
{public:
float x,y,m; //datele clasei
void display();
float modul(); //metoda clasei
complex(float xx=0, float yy=0)
{cout<<endl<<"mesaj de la constructorul cu parametri impliciti "<<endl;
x=xx;
y=yy;
}
complex(complex &ob)
//constructor de copiere
{ cout<<endl<<"operatie de copiere ";
x=ob.x;
y=ob.y;
}
};
float complex::modul()
{return sqrt(x*x+y*y);
}
void complex::display()
{cout<<endl<<x<<"+"<<y<<"*i";
cout<<endl;
}
void main()
{complex q1(1.2,1.3);
cout<<"q1=";
q1.display();
complex q2=q1; //se apeleaza constructorul de copiere
cout<<"q2=";
q2.display();
complex q3=complex(q1); //se apeleaza constructorul de copiere
cout<<"q3=";
q3.display();
getch();
19
clrscr();
}
11.
Concluzie:
In urma efectuarii acestei lucrari de laborator capatat cunostinte despre
modul de lucru cu clasele in limbajul c++, am capatat cunostinte despre
modul de formare a constructorilor si destructorilor unei clase.
20