0% au considerat acest document util (0 voturi)
22 vizualizări13 pagini

POO Lab1

Încărcat de

Ion Jalba
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
22 vizualizări13 pagini

POO Lab1

Încărcat de

Ion Jalba
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

MINISTERUL EDUCAŢIEI ȘI CERCETĂRII AL REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICĂ A MOLDOVEI

FACULTATEA CALCULATOARE, INFORMATICĂ ŞI

MICROELECTRONICĂ DEPARTAMENTUL INFORMATICĂ ȘI INGINERIEA

SISTEMELOR

Raport
Lucrarea de laborator nr. 1
la disciplina “Programarea orientată pe obiecte”

A efectuat: Jalba Ion


st. gr. EA-231

A verificat: Mititelu Vitalie


Asistent universitar.

CHIŞINĂU 2024
Lucrarea de laborator nr. 1

Tema: Structura – mecanism de abstractizare

Scopul lucrării:
 Studierea programării prin abstractizarea datelor;
 Studierea regulilor de definire şi utilizare a structurilor de date;
 Crearea variabilelor de tip structură, accesarea componentelor unei structuri.

Sarcina: Elaborarea unui program care determină o clasă listă simplu înlănțuită cu
următoarele funcții:
– membre(l) care determină apartenența elementului x listei L;
– emula(L1,L2) care determină echivalența a două liste L1 și L2;
– print(L) care tipărește toate elementele listei L;
– realist(L, fin) care citește elementele din fișierul fin în lista L.

Partea teoretică și explicativă:


Structura – este o mulţime de date grupate, conform unei ierarhii, de obicei de tipuri diferite.
Structura poate fi comparată cu tabloul, însă tabloul conţine date de un acelaşi tip, iar elementele
tabloului se accesează cu ajutorul indicilor, pe cînd accesarea componentelor structurii are o formă
specifică. Structura reprezintă un tip abstract de date, un tip definit de utilizator prin utilizarea
tipurilor deja existente. La stabilirea şi implementarea conceptelor necesare rezolvării unei
probleme se realizează un proces de abstractizare care priveşte reprezentarea datelor şi prelucrarea
acestora. Aceasta justifică termenul de programare prin abstractizarea datelor.

Listingul programului:
a)Conditia pentru punctul a:
Să se creeze tipul abstract de date (structura) – ţara, care are denumire, continentul pe care se află şi
numărul de locuitori. Să se definească funcţiile de setare a denumirii ţării şi a numărului de
populaţie, de modificare a datelor, de comparare a ţărilor şi de eliberare a memoriei. Să se utilizeze
operatorul new pentru setarea denumirii ţării. În main să se exemplifice căutarea ţărilor după
denumire şi populaţie.
b)Conditia pentru punctul b:
b) Să se creeze tipul abstract de date (structura) – vector, care are pointer spre int şi numărul de
elemente. Să se definească funcţiile de iniţializare, de eliminare a vectorului, de setare/modificare a
dimensiunii, de acces la elementele vectorului, de calcul a mediei elementelor pozitive ale
vectorului. Ca exemplu, în funcţia main să se realizeze compararea a doi vectori.

#include <iostream>
#include <cstring> // pentru fucțiile de manipulare a stringurilor
using namespace std;

// Definirea structurii pentru "Țară"


struct Tara {
char* denumire;
char continent[50];
int populatie;

// Constructor implicit
Tara() {
denumire = nullptr;
strcpy(continent, "");
populatie = 0;
}

// Funcție pentru setarea denumirii țării


void setDenumire(const char* nume) {
if (denumire != nullptr) {
delete[] denumire; // eliberăm memoria veche înainte de a seta denumirea nouă
}
denumire = new char[strlen(nume) + 1];
strcpy(denumire, nume);
}

// Funcție pentru setarea populației


void setPopulatie(int pop) {
populatie = pop;
}

// Funcție pentru setarea continentului


void setContinent(const char* cont) {
strcpy(continent, cont);
}

// Funcție pentru compararea a două țări după denumire


bool comparaDenumire(const char* nume) const {
return strcmp(denumire, nume) == 0;
}

// Funcție pentru compararea a două țări după populație


bool comparaPopulatie(const Tara& alta) const {
return populatie == [Link];
}

// Funcție pentru eliberarea memoriei alocate dinamic


void elibereazaMemorie() {
delete[] denumire;
denumire = nullptr;
}

// Funcție pentru citirea datelor de la tastatură


void citesteDate() {
char nume[100];
cout << "Introdu denumirea tarii: ";
[Link](); // pentru a elimina newline-ul ramas de la o citire anterioara
[Link](nume, 100);
setDenumire(nume);

cout << "Introdu continentul: ";


[Link](continent, 50);

cout << "Introdu numarul de locuitori: ";


cin >> populatie;
}

// Funcție pentru modificarea datelor unei țări


void modificaDate() {
char nume[100];
cout << "Introdu noua denumire a tarii: ";
[Link]();
[Link](nume, 100);
setDenumire(nume);

cout << "Introdu noul continent: ";


[Link](continent, 50);

cout << "Introdu noul numar de locuitori: ";


cin >> populatie;
}

// Destructor pentru eliberarea memoriei la sfârșit


~Tara() {
elibereazaMemorie();
}
};

// Funcție de căutare a unei țări după denumire


Tara* cautaDupaDenumire(Tara tari[], int numarTari, const char* nume) {
for (int i = 0; i < numarTari; ++i) {
if (tari[i].comparaDenumire(nume)) {
return &tari[i];
}
}
return nullptr;
}

// Funcție de comparare a două țări după populație


void comparaDupaPopulatie(Tara tari[], int numarTari) {
if (numarTari < 2) {
cout << "Nu sunt suficiente tari pentru comparare.\n";
return;
}

int index1, index2;


cout << "Introdu indexul primei tari (0 - " << numarTari - 1 << "): ";
cin >> index1;
cout << "Introdu indexul celei de-a doua tari (0 - " << numarTari - 1 << "): ";
cin >> index2;

if (index1 < 0 || index1 >= numarTari || index2 < 0 || index2 >= numarTari) {
cout << "Indexuri invalide.\n";
return;
}

if (tari[index1].comparaPopulatie(tari[index2])) {
cout << "Tara " << index1 + 1 << " are aceeasi populatie ca tara " << index2 + 1 << ".\
n";
} else {
cout << "Tara " << index1 + 1 << " nu are aceeasi populatie ca tara " << index2 + 1 <<
".\n";
}
}

int main() {
Tara* tari = nullptr;
int numarTari = 0;

while (true) {
cout << "\n " ;
cout << "\nMeniu:\n";
cout << "1. Introdu numarul de tari\n";
cout << "2. Introdu datele pentru tari\n";
cout << "3. Cauta tara dupa denumire\n";
cout << "4. Modifica datele unei tari\n";
cout << "5. Compara doua tari dupa populatie\n";
cout << "6. Afiseaza toate tarile\n";
cout << "7. Iesire\n";
cout << "Alege o optiune: ";

int optiune;
cin >> optiune;

if (optiune == 1) {
cout << "Introdu numarul de tari: ";
cin >> numarTari;

// Eliberăm memoria veche dacă există și alocăm un nou array de țări


if (tari != nullptr) {
delete[] tari;
}
tari = new Tara[numarTari];

} else if (optiune == 2) {
if (numarTari == 0) {
cout << "Trebuie sa introduci numarul de tari mai intai.\n";
} else {
for (int i = 0; i < numarTari; ++i) {
cout << "\n " ;
cout <<"Introdu datele pentru tara " << i + 1 << ":\n";
tari[i].citesteDate();
}
}

} else if (optiune == 3) {
if (numarTari == 0) {
cout << "Nu ai introdus nicio tara.\n";
} else {
char nume[100];
cout << "Introdu denumirea tarii cautate: ";
[Link]();
[Link](nume, 100);

Tara* taraGasita = cautaDupaDenumire(tari, numarTari, nume);


if (taraGasita) {
cout << "Tara gasita: " << taraGasita->denumire << ", Continent: " << taraGasita-
>continent
<< ", Populatie: " << taraGasita->populatie << endl;
} else {
cout << "Tara nu a fost gasita dupa denumire.\n";
}
}
} else if (optiune == 4) {
if (numarTari == 0) {
cout << "Nu ai introdus nicio tara.\n";
} else {
char nume[100];
cout << "Introdu denumirea tarii pe care vrei sa o modifici: ";
[Link]();
[Link](nume, 100);

Tara* taraGasita = cautaDupaDenumire(tari, numarTari, nume);


if (taraGasita) {
cout << "Modificam tara: " << taraGasita->denumire << endl;
taraGasita->modificaDate();
} else {
cout << "Tara nu a fost gasita dupa denumire.\n";
}
}

} else if (optiune == 5) {
if (numarTari == 0) {
cout << "Nu ai introdus nicio tara.\n";
} else {
comparaDupaPopulatie(tari, numarTari);
}

} else if (optiune == 6) {
if (numarTari == 0) {
cout << "Nu ai introdus nicio tara.\n";
} else {
for (int i = 0; i < numarTari; ++i) {
cout << "Tara " << i + 1 << ": " << tari[i].denumire
<< ", Continent: " << tari[i].continent
<< ", Populatie: " << tari[i].populatie << endl;
}
}

} else if (optiune == 7) {
cout << "Programul se inchide...\n";
break;
} else {
cout << "Optiune invalida. Te rog sa incerci din nou.\n";
}
}
// Eliberăm memoria pentru array-ul de tari
if (tari != nullptr) {
delete[] tari;
}

return 0;
}

b)Conditia pentru punctul b:


Să se creeze tipul abstract de date (structura) – vector, care are pointer spre int şi numărul de
elemente. Să se definească funcţiile de iniţializare, de eliminare a vectorului, de setare/modificare a
dimensiunii, de acces la elementele vectorului, de calcul a mediei elementelor pozitive ale
vectorului. Ca exemplu, în funcţia main să se realizeze compararea a doi vectori.

#include <iostream>
#include <limits> // pentru std::numeric_limits
using namespace std;

// Structura pentru "Vector"


struct Vector {
int* elements;
int size;

// Constructor implicit
Vector() : elements(nullptr), size(0) {}

// Funcție pentru inițializare


void initialize(int n) {
clear(); // Eliberăm memoria existentă
size = n;
elements = new int[size];
// Inițializare cu valori zero
for (int i = 0; i < size; ++i) {
elements[i] = 0;
}
}

// Funcție pentru eliminarea vectorului


void clear() {
delete[] elements;
elements = nullptr;
size = 0;
}

// Funcție pentru setarea/modificarea dimensiunii


void setSize(int n) {
int* newElements = new int[n];
int minSize = (n < size) ? n : size;
for (int i = 0; i < minSize; ++i) {
newElements[i] = elements[i];
}
for (int i = minSize; i < n; ++i) {
newElements[i] = 0; // Inițializare cu valori zero pentru noile elemente
}
clear(); // Eliberăm memoria veche
elements = newElements;
size = n;
}

// Funcție pentru acces la elementele vectorului


int& operator[](int index) {
if (index < 0 || index >= size) {
throw out_of_range("Indexul este in afara limitelor.");
}
return elements[index];
}
// Funcție pentru calcularea mediei elementelor pozitive
double calculatePositiveAverage() const {
int sum = 0;
int count = 0;
for (int i = 0; i < size; ++i) {
if (elements[i] > 0) {
sum += elements[i];
++count;
}
}
return (count == 0) ? 0 : static_cast<double>(sum) / count;
}

// Funcție pentru compararea a doi vectori


bool compare(const Vector& other) const {
if (size != [Link]) return false;
for (int i = 0; i < size; ++i) {
if (elements[i] != [Link][i]) return false;
}
return true;
}

// Destructor
~Vector() {
clear();
}
};

int main() {
Vector v1, v2;
int choice;

while (true) {
cout << "\nMeniu:\n";
cout << "1. Initializare vector 1\n";
cout << "2. Initializare vector 2\n";
cout << "3. Setare dimensiune vector 1\n";
cout << "4. Setare dimensiune vector 2\n";
cout << "5. Setare valori vector 1\n";
cout << "6. Setare valori vector 2\n";
cout << "7. Comparare vectori\n";
cout << "8. Calculare media elementelor pozitive pentru vector 1\n";
cout << "9. Iesire\n";
cout << "Alege o optiune: ";
cin >> choice;

switch (choice) {
case 1: {
int n1;
cout << "Introdu dimensiunea pentru vectorul 1: ";
cin >> n1;
[Link](n1);
break;
}
case 2: {
int n2;
cout << "Introdu dimensiunea pentru vectorul 2: ";
cin >> n2;
[Link](n2);
break;
}
case 3: {
int newSize;
cout << "Introdu noua dimensiune pentru vectorul 1: ";
cin >> newSize;
[Link](newSize);
break;
}
case 4: {
int newSize;
cout << "Introdu noua dimensiune pentru vectorul 2: ";
cin >> newSize;
[Link](newSize);
break;
}
case 5: {
if ([Link] == 0) {
cout << "Vectorul 1 nu este initializat.\n";
break;
}
cout << "Introdu valorile pentru vectorul 1:\n";
for (int i = 0; i < [Link]; ++i) {
cout << "Element " << i << ": ";
cin >> v1[i];
}
break;
}
case 6: {
if ([Link] == 0) {
cout << "Vectorul 2 nu este initializat.\n";
break;
}
cout << "Introdu valorile pentru vectorul 2:\n";
for (int i = 0; i < [Link]; ++i) {
cout << "Element " << i << ": ";
cin >> v2[i];
}
break;
}
case 7: {
if ([Link] == 0 || [Link] == 0) {
cout << "Asigura-te ca ambele vectori sunt initializati.\n";
break;
}
if ([Link](v2)) {
cout << "Vectorii sunt egali.\n";
} else {
cout << "Vectorii sunt diferiti.\n";
}
break;
}
case 8: {
if ([Link] == 0) {
cout << "Vectorul 1 nu este initializat.\n";
break;
}
cout << "Media elementelor pozitive din vectorul 1: " <<
[Link]() << endl;
break;
}
case 9: {
cout << "Programul se inchide...\n";
return 0;
}
default: {
cout << "Optiune invalida. Te rog sa incerci din nou.\n";
break;
}
}
}

return 0;
}
Testarea și verificarea programelor cu rezultatele obținute:
Punctul a)
1. Meniul principal:

2. Setarea numarului de tari:

3. Introducerea datelor :

4. Cautarea elementului dupa denumire:

5. Modificarea datelor despre o tara aleasa:


6. Compararea a doua tari alese dupa numarul de populatie:3

7. Afisarea tarilor:

8. Iesire din program:


Analiza rezultatelor si concluzii:

1. În rezultatul realizării lucrării de laborator au fost obținute abilități de lucru cu clasele:


implementarea claselor, accesarea membrilor clasei care pot fi privați (accesați doar de
către funcțiile clasei) sau publici (folosiți oriunde in program).
2. Au fost studiate principiile de creare și distrugere a obiectelor, prin intermediul
constructorilor și destructorilor, de utilizare a funcțiilor membre care primesc in mod
implicit adresa obiectului pentru care este apelata și de utilizare a funcțiilor prietene care
nu sunt membre ale clasei, dar au acces la membrii privați ai acesteia.
3. Au fost utilizat clase prietene prin intermediul cărora funcțiile membre ale unei clase sunt
prietene cu o altă clasă, realizând astfel interacțiunea între mai multe clase.

Bibliografie:

1. [Link]

2. [Link]

3. [Link]

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