Sunteți pe pagina 1din 13

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

RAPORT
Lucrare de laborator nr.2
la
Programarea orientată pe obiecte

A efectuat: st. gr.TI - 195


Rotaru Dan

A controlat: asistent univer.


Mititelu Vitalie

Chișinău 2020
Lucrare de laborator nr.2

Tema: Constructorul – funcţie de iniţializare a obiectelor clasei


Varianta 1
Sarcina de lucru:
а) Să se creeze clasa Date – dată cu cîmpurile: zi(1-28..31), lună(1-12), an (numere întregi). Să
se definească constructorii; funcţiile membru de setare a zilei, lunii şi anului; funcţiile membru
de returnare a zilei, lunii, anului; funcţiile de afişare: afişare tip „ 6 iunie 2004” şi afişare tip
„6.06.2004”. Funcţiile de setare a cîmpurilor clasei trebuie să verifice corectitudinea
parametrilor primiţi.

b) Să se creeze clasa Matrix – matrice. Clasa conţine pointer spre int, numărul de rînduri şi de
coloane şi o variabilă – codul erorii. Să se definească constructorul fără parametri
(constructorul implicit), constructorul cu un parametru – matrice pătrată şi constructorul cu doi
parametri – matrice dreptunghiulară ş. a. Să se definească funcţiile membru de acces:
returnarea şi setarea valorii elementului (i,j). Să se definească funcţiile de adunare şi scădere a
două matrice; înmulţirea unei matrice cu alta; înmulţirea unei matrice cu un număr. Să se
testeze funcţionarea clasei. În caz de insuficienţă de memorie, necorespondenţă a dimensiunilor
matricelor, depăşire a limitei memoriei utilizate să se stabilească codul erorii.

1. Listingul programului (a)


#include <iostream>
#include <cstring>

using namespace std;

//  Functie de  veficare a  anului bisect


int AnBisect(int year){
    return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}

class date{
    public: 
    int zi = 0, luna = 0, an = 0;

      //Constructor  implicit
    date(){};
    
      //Constructorul  cu parametri
    date(int zi, int luna, int an){
        if(an < 0) cout << "Anul introdus este invalid!\n";
        else this->an = an;

        if(luna < 1 || luna > 12) cout << "Luna introdusa este invalida!\n";
        else this->luna = luna;
        
        
        if(luna == 2){  // Daca  luna ==  februarie
            /*
                  Daca  e an  bisect atunci  data trebuie  sa fie  mai mica  de 29  si mai  ma
re  de 1
                  Daca  nu e  an bisect  atunci data  trebuie sa  fie mai  mica de  28 si  mai 
mare  de 1
            */
            if(AnBisect(an)){
                if(zi < 1 || zi > 29) cout << "Data introdusa este invalida!\n";
                else this->zi = zi;
            }else{
                if(zi < 1 || zi > 28) cout << "Data introdusa este invalida!\n";
                else this->zi = zi;
            }
        }else{
            if(zi < 1 || zi > 31) cout << "Data introdusa este invalida!\n";
            else this->zi = zi;
        }
    };

      //Functia  de setare  a datelor


    void Citire(int read = 1){
            /*
                  read  == 1  => citim  anul
                  read  == 2  => citim  luna
                  read  == 3  => citim  data
            */
        if(read == 1){
            cout << "Introduceti anul: ";
            cin >> this->an;

            if(this->an < 1){
                cout << "Anul introdus este invalid!\n";
                Citire(1);
            }
            else Citire(2);
        }
        else if(read == 2){
            cout << "Introduceti luna: ";
            cin >> this->luna;

            if(this->luna < 1 || this->luna > 12){
                cout << "Luna introdusa este invalida!\n";
                Citire(2);

            }
            else Citire(3);
        }
        else if(read == 3){
            cout << "Introduceti data: ";
            cin >> this->zi;

            if(this->luna == 2){  // Daca  luna ==  februarie


                if(AnBisect(this->an)){
                    if(zi < 1 || zi > 29) {
                        cout << "Data introdusa este invalida (anul este bisect)!\n";
                        Citire(3);
                    }
                    else this->zi = zi;
                }else{
                    if(zi < 1 || zi > 28) {
                        cout << "Data introdusa este invalida (februarie poate avea d
oar 28 zile pentru ca nu-i an bisect)!\n";
                        Citire(3);
                    }
                    else this->zi = zi;
                    
                }
            }else{
                if(zi < 1 || zi > 31) {
                    cout << "Data introdusa este invalida!\n";
                    Citire(3);
                }
                else this->zi = zi;
            }

            this->Afisare();
        }
        
    
    }
    
      //Functia  de afisare  a datelor  introduse
    void Afisare(){
        int type;
        cout << "\nSelectati metoda de afisare a datei: \n1.(dd.mm.yyyy)\n2.(dd MMMM 
yyy)\n>>";
        cin >> type;
                
        if(type == 1){  // dd.mm.yyyy
            string AFzi, AFluna;
            
            if(this->zi < 10) AFzi = "0" + to_string(this->zi);
            else AFzi = to_string(this->zi);
            
            if(this->luna < 10) AFluna = "0" + to_string(this->luna);
            else AFluna = to_string(this->luna);
            
            cout << "Data introdusa: " << AFzi << "." << AFluna << "." << this->an;
        }else if(type == 2){  // dd  MMMM yyyy
            string AFzi, AFluna;
            switch (this->luna){
                case 1: AFluna = "Ianuarie"; break;
                case 2: AFluna = "Februarie"; break;
                case 3: AFluna = "Martie"; break;
                case 4: AFluna = "Aprilie"; break;
                case 5: AFluna = "Mai"; break;
                case 6: AFluna = "Iunie"; break;
                case 7: AFluna = "Iulie"; break;
                case 8: AFluna = "August"; break;
                case 9: AFluna = "Septembrie"; break;
                case 10: AFluna = "Octombrie"; break;
                case 11: AFluna = "Noiembrie"; break;
                case 12: AFluna = "Decembrie"; break;
            }

            if(this->zi < 10) AFzi = "0" + to_string(this->zi);
            else AFzi = to_string(this->zi);
            
            cout << "Data introdusa: " << AFzi << " " << AFluna << " " << this->an;
        }
        else Afisare();
    }

      //Functia  de returnare  a (zilei,  lunei, anului)


    void ReturnDate(int what){
        if(what == 1){  // zi
            cout << "Data de " << this->zi;
            return;
        }
        else if(what == 2){  // luna
            cout << "Luna: " << this->luna;
            return;
        }
        else{  // an
            cout << "Anul: " << this->an;
            return;
        }
    }
};

int main(){
    date d, *d1;

      //  Utilizand constructor
    d1 = new date(19, 10, 2020);
    d1->Afisare();

    cout << endl;

      //  Citire de  la tastiera


    d.Citire();
    
    return 0;
}
2. Rezultatul programului (a)

3.Listingul programului (b)

#include <iostream>
#include <conio.h>
#include <stdlib.h>

using namespace std;
class matrix {
    private:
        int ** p;
    int rows, cols;
    public:
        int error_code;
        matrix();
    matrix(int);
    matrix(int, int);
    ~matrix();

    void citire(int i, int j, int elem) {
        p[i][j] = elem;
    }
    void afisare() {
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++) cout << "     " << p[i][j];
            cout << endl;
        }
    }
    int valoare(int i, int j) {
        return p[i][j];
    }
};
matrix::matrix() {
    p = NULL;
    rows = cols = 0;
};
matrix::matrix(int n) {
    rows = cols = n;
    p = new int * [rows];
    for (int i = 0; i < rows; i++) {
        p[i] = new int[rows];
        for (int j = 0; j < rows; j++)
            p[i][j] = 0;
    }
}
matrix::matrix(int r, int c) {
    rows = r;
    cols = c;
    p = new int * [rows];
    for (int i = 0; i < rows; i++) {
        p[i] = new int[cols];
        for (int j = 0; j < cols; j++)
            p[i][j] = 0;
    }
}

matrix::~matrix() {
    delete[] p;
}
void inmultirea_2matrici() {
    matrix m1;
    int l1, c1, l2, c2, s;
    sus:
        system("CLS");
    cout << "Introdu dimensiunea matricei I:" << endl;
    cout << "Nr de linii: ";
    cin >> l1;
    cout << "Nr de coloane: ";
    cin >> c1;
    cout << "Introdu dimensiunea matricei II:" << endl;
    cout << "Nr de linii: ";
    cin >> l2;
    cout << "Nr de coloane: ";
    cin >> c2;
    if (c1 != c2) {
        m1.error_code = 1;
        cout << "\nNu se poate efectua inmultirea matricilor!\nCodul erorii: " << m1.
error_code << "\nIntrodu alte dimensiuni (Enter)";
        getch();
        goto sus;
    } else {
        matrix mat1(l1, c1);
        matrix mat2(l2, c2);
        cout << "Introdu elementele I matricii: " << endl;
        for (int i = 0; i < l1; i++) {
            for (int j = 0; j < c1; j++) {
                cout << "M1[" << i << "][" << j << "]= ";
                cin >> s;
                mat1.citire(i, j, s);
            }
        }
        cout << "Introdu elementele II matricii: " << endl;
        for (int i = 0; i < l2; i++) {
            for (int j = 0; j < c2; j++) {
                cout << "M2[" << i << "][" << j << "]= ";
                cin >> s;
                mat2.citire(i, j, s);
            }
        }

        system("CLS");
        cout << "Matricea I " << endl;
        mat1.afisare();
        cout << "Matricea II " << endl;
        mat2.afisare();
        matrix matf(l1, c2);
        s = 0;
        for (int i = 0; i < l1; i++){
            for (int j = 0; j < c1; j++) {
                for (int k = 0; k < l1; k++){
                    s += mat1.valoare(i, k) * mat2.valoare(k, j);
                }
                matf.citire(i, j, s);
                s = 0;
            }
        }
        cout << endl << "Iata matricea rezultanta " << endl;
        matf.afisare();
    }
    getch();
}
void inmultirea_numar() {
    int l, c, s, nr;
    system("CLS");
    cout << "Introdu dimensiunea matricii: " << endl;
    cout << "Nr de linii: ";
    cin >> l;
    cout << "Nr de coloane: ";
    cin >> c;
    matrix matr_nr(l, c);
    for (int i = 0; i < l; i++)
        for (int j = 0; j < c; j++) {
            cout << "M[" << i << "][" << j << "]= ";
            cin >> s;
            matr_nr.citire(i, j, s);
        }
    cout << endl << "Matricea dreptunghiulara: " << endl;
    matr_nr.afisare();
    cout << "Inmulteste cu numarul: ";
    cin >> nr;
    matrix matr_rsp(l, c);
    for (int i = 0; i < l; i++) {
        for (int j = 0; j < c; j++) {
            matr_rsp.citire(i, j, matr_nr.valoare(i, j) * nr);
        }
    }
    cout << endl << "Raspuns: " << endl;
    matr_rsp.afisare();

    getch();
}
void adunarea_2matrici() {
    matrix m1; 
    int l1, c1, l2, c2, s;
    sus:
        system("CLS");
    cout << "Introdu dimensiunea matricei I: " << endl;
    cout << "Nr de linii: ";
    cin >> l1;
    cout << "Nr de coloane: ";
    cin >> c1;
    cout << "Introdu dimensiunea matricei II: " << endl;
    cout << "Nr de linii: ";
    cin >> l2;
    cout << "Nr de coloane: ";
    cin >> c2;
    if ((l1 != l2) && (c1 != c2)) {
        m1.error_code = 2;
        cout << "\nNu se poate efectua adunarea matricilor!\nCodul erorii: " << m1.er
ror_code << "\nIntrodu alte dimensiuni (Enter)";
        getch();
        goto sus;
    } else {
        matrix mat1(l1, c1);
        matrix mat2(l2, c2);
        cout << "Introdu elementele I matrici: " << endl;
        for (int i = 0; i < l1; i++) {
            for (int j = 0; j < c1; j++) {
                cout << "M1[" << i << "][" << j << "]= ";
                cin >> s;
                mat1.citire(i, j, s);
            }
        }
        cout << "Introdu elementele II matrici: " << endl;
        for (int i = 0; i < l2; i++) {
            for (int j = 0; j < c2; j++) {
                cout << "M2[" << i << "][" << j << "]= ";
                cin >> s;
                mat2.citire(i, j, s);
            }
        }
        system("CLS");
        cout << "Matricea I" << endl;
        mat1.afisare();
        cout << endl << endl << "Maticea II" << endl;
        mat2.afisare();
        matrix matf(l1, c2);
        for (int i = 0; i < l1; i++)
            for (int j = 0; j < c1; j++) {
                s = mat1.valoare(i, j) + mat2.valoare(i, j);
                matf.citire(i, j, s);
                s = 0;
            }
        cout << endl << "Iata matricea rezultanta " << endl;
        matf.afisare();
    }
    getch();
}
void scaderea_2matrici() {
    matrix m1;
    int l1, c1, l2, c2, s;
    sus:
        system("CLS");
    cout << "Introdu dimensiunea matricei I: " << endl;
    cout << "Nr de linii: ";
    cin >> l1;
    cout << "Nr de coloane: ";
    cin >> c1;
    cout << "Introdu dimensiunea matricei II: " << endl;
    cout << "Nr de linii: ";
    cin >> l2;
    cout << "Nr de coloane: ";
    cin >> c2;
    if ((l1 != l2) && (c1 != c2)) {
        m1.error_code = 3;
        cout << "\nNu se poate efectua scaderea matricilor!\nCodul erorii: " << m1.er
ror_code << "\nIntrodu alte dimensiuni (Enter)";
        getch();
        goto sus;
    } else {
        matrix mat1(l1, c1);
        matrix mat2(l2, c2);
        cout << "Introdu elementele I matrici: " << endl;
        for (int i = 0; i < l1; i++) {
            for (int j = 0; j < c1; j++) {
                cout << "M1[" << i << "][" << j << "]= ";
                cin >> s;
                mat1.citire(i, j, s);
            }
        }
        cout << "Introdu elementele II matrici: " << endl;
        for (int i = 0; i < l2; i++) {
            for (int j = 0; j < c2; j++) {
                cout << "M2[" << i << "][" << j << "]= ";
                cin >> s;
                mat2.citire(i, j, s);
            }
        }
        system("CLS");
        cout << "Matricea I:" << endl;
        mat1.afisare();
        cout << endl << endl << "Maticea II:" << endl;
        mat2.afisare();
        matrix matf(l1, c2);
        for (int i = 0; i < l1; i++)
            for (int j = 0; j < c1; j++) {
                s = mat1.valoare(i, j) - mat2.valoare(i, j);
                matf.citire(i, j, s);
                s = 0;
            }
        cout << endl << "Matricea rezultanta: " << endl;
        matf.afisare();
    }
    getch();
}
int main() {
    while (true) {
        system("CLS");
        cout << "Selectati item-ul dorit:" << endl;
        cout << " 1 - Inmultirea a 2 matrici" << endl;
        cout << " 2 - Inmultirea a unei matrice cu un numar" << endl;
        cout << " 3 - Adunarea a 2 matrici" << endl;
        cout << " 4 - Scaderea a 2 matrici" << endl;
        cout << " Esc - Iesire" << endl;
        char com = getch();
        switch (com) {
            case '1': {
                inmultirea_2matrici();
                break;
            }
            case '2': {
                inmultirea_numar();
                break;
            }
            case '3': {
                adunarea_2matrici();
                break;
            }
            case '4': {
                scaderea_2matrici();
                break;
            }
            case 27: {
                exit(1);
                break;
            }
        }
    }
    getch();
    return 0;
}

2. Rezultatul programului (b)

Înmulțirea 2 matrici:

Înmulțirea matricii cu un numar:

Adunarea 2 matrici:
Adunarea a 2 matrici:

Scaderea a 2 matrici:

Concluzii:

1. Verificarea ne arata ca rezultatele obtinute sunt corecte si programul lucreaza corect.


2. Au fost obtinute cunoștințe în studierea principiilor de definire şi utilizare a
constructorilor și distructurilor, a constructorilor impliciți, de copiere, citire, de conversie
a tipului și constructor general.

S-ar putea să vă placă și