Sunteți pe pagina 1din 13

Ministerul Educaiei

Tineretului i Sportului al RM

Universitatea Tehnic a Moldovei

Facultatea IM
Catedra de informatica

Raport
Nr1
TEMA: Structura mecanism de abstractizare
VARIANTA nr.9

A elaborat:
st. gr.TI-142 Tincu M.

___________

A verificat:
Lector universitar Lisnic I.

____________

Chiinu 2015

Tema: Structura mecanism de abstractizare


Scopul lucrrii:

Studierea programrii prin abstractizarea datelor;

Studierea regulilor de definire i utilizare a structurilor de date;

Crearea variabilelor de tip structur, accesarea componentelor unei structuri.


Noiuni de baz
Structura este o mulime de date grupate, conform unei ierarhii, de obicei de tipuri diferite. Structura
poate fi comparat cu tabloul, ns tabloul conine date de un acelai tip, iar elementele tabloului se
acceseaz cu ajutorul indicilor, pe cnd 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 rezolvrii unei probleme se realizeaz un proces de
abstractizare care privete reprezentarea datelor i prelucrarea acestora. Aceasta justific termenul de
programare prin abstractizarea datelor.
Fie definiia de structur:
struct Book{
// definirea elementelor structurii
char *author;
char *title;
int year;
int pages;
};
naintea cuvntului cheie struct uneori se adaug cuvntul cheie
typedef. ns aceast sintax este proprie limbajului C, i nu C++. Elementele structurii pot fi de tip
predefinit sau definit de utilizator, excepie fiind tipul structurii date. Pentru definirea variabilelor este
suficient utilizarea numelui de structur la fel ca tipurile predefinite:
Book b1, b2, bs[10], *bptr;
n acest caz s-au definit dou variabile de tip carte, un tablou din 10 cri i un pointer spre carte.
Referirea la componentele unei structuri se face utiliznd att numele structurii ct i a componentei
respective. Aceasta se realizeaz printr-o construcie de forma:
b1.pages = 153;
bs[i].pages = 24;
n cazul pointerilor:
bptr = new Book;
bptr->pages = 176;

// alocarea memoriei pentru o variabil nou

Dac structura conine componente de tip compus, referirea elementelor este urmtoarea:
Circle1.Center.x = 20;
Circle1.Center.y = 10;
Fie definiia de structur:
struct Date{

int day, month, year;


};
struct Student{
char *name;
Date birthDay;
float media;
};
La definirea tipului de strutur este bine de a preciza funciile care definesc operaii cu datele de tipul
structurii. n acest scop variabilele se transmit funciilor prin parametri. Pentru modificarea variabilei ea se
transmite prin referin.
void setValues(Student* sptr, char* newN,float newM,Date d)
{
sptr->name = new char[strlen(newN)+1];
strcpy(sptr->name,newN);
sptr->media = newM;
sptr->birthDay = d;
}

Funcia de mai sus are un neajuns legat de alocarea memoriei. Deoarece funcia este obinuit, ea poate fi
apelat de cteva ori, ceea ce poate duce la pierderi de memorie. Pentru soluionarea acestei probleme, mai
nti trebuie dezalocat memoria iniial (sau s se nregistreze posibilitatea unui singur apel al funciei,
ceea ce se reflect n denumirea funciei).
void setValues(Student* sptr, char* newN,float newM,Date d)
{
delete[] sptr->name;
sptr->name = new char[strlen(newN)+1];
...
}

Dar i aceast soluie are neajunsurile sale, posibil mai grave dect n primul caz. Pericolul const n
ncercarea de a elimina memoria nealocat la primul apel al funciei. Pot fi cteva soluii. Una const n
utilizarea unui parametru suplimentar, fie cu valoare implicit, care indic dac funcia se apeleaz pentru
prima dat(pentru obiectul dat) sau nu. Aceast variant nu este tocmai reuit, este necesar de a urmri
succesiunea apelurilor, sarcin realizat de ctre programator, n al doilea rnd, funcia trebuie s conin o
condiie ceea ce ncetinete ndeplinirea funciei.
Alt soluie ar fi n setarea valorii iniiale a pointerului. n acest scop, dup crearea obiectului,
componentelor pointer li se atribuie valoarea NULL;
Book b;
b.author = NULL;
setAuthor(&b, Arthur Conan Doyle);
Pentru finisarea exemplului, este necesar de a elibera memoria alocat iniial. Pentru aceasta se creeaz
nc o funcie:
void freeMem(Book* bp){
delete[] bp->author;
bp->author = NULL;
... // analogic pentru restul componentelor pointer
}
NULL i se atribuie pointerului pentru asigurarea unei utilizri repetate reuite a variabilei.

Condiiile problemei:
) S se creeze tipul abstract de date (structura) student, care are nume, specialitate, anul de studii i
balul mediu. S se defineasc funciile de setare, de modificare a datelor, de comparare. Pentru crearea
cmpurilor textuale s se utilizeze operatorul new. S se elibereze memoria. n main s se exemplifice
sortarea studenilor dup specialitate+reuit.
b) S se creeze tipul abstract de date (structura) vector, care are pointer spre long i numrul de
elemente. S se defineasc funciile de iniializare, de eliminare a vectorului, de setare/modificare a
dimensiunii, de acces la elementele vectorului, de calcul a sumei elementelor pare ale vectorului. Ca
exemplu, n funcia main, s se realizeze cutarea poziiei elementului maximal al vectorului.
Listingul programului a:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
struct student
{
int anstudii;
float balmed;
char *nume;
char *specialitate;
};
void setare(student *c, char *Nume, char *Specialitate, int Anstudii, float Balmed)
{
c->anstudii = Anstudii;
c->balmed = Balmed;
c->nume = new char[strlen(Nume) + 1];
c->specialitate = new char[strlen(Specialitate) + 1];

strcpy(c->nume, Nume);
strcpy(c->specialitate, Specialitate);

void sterge_memoria(student *c)


{
delete[] c->nume; c->nume = NULL;
delete[] c->specialitate; c->specialitate = NULL;
}
void afisare(student c)
{
cout << "Nume : " << c.nume << endl;
cout << "Specialitate : " << c.specialitate << endl;
cout << "Anul de studii : " << c.anstudii << endl;
cout << "Balul mediu : " << c.balmed << endl;
}
student *bubbleSort(student *c, int n) {
bool swapped = true;
int j = 0;

float tmp;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < n - j; i++) {
if (c[i].balmed > c[i + 1].balmed) {
tmp = c[i].balmed;
c[i].balmed = c[i + 1].balmed;
c[i + 1].balmed = tmp;
swapped = true;
}
}
}
return c;
}
void comparare(int val1, int val2, char * key)
{
if (val1 < val2)
cout << key << " cu indexul 1 este mai mic!" << endl;
else if (val1 > val2)
cout << key << " cu indexul 1 este mai mare!" << endl;
else if (val1 == val2)
cout << "Studentii sunt egali!" << key << endl;
cout << endl;
}
int main(void)
{
int n, option, q, w;
student C[10];
int anstudii, anul;
float balmed;
int anul1;
char *nume, *specialitate;
char *rezultat1, *rezultat2;
nume = new char[256];
specialitate = new char[256];
rezultat1 = new char[256];
rezultat2 = new char[256];
while (1)
{
cout << "1. Introducere" << endl;
cout << "2. Afisare" << endl;
cout << "3. Modificare" << endl;
cout << "4. Comparare" << endl;
cout << "5. Sortare" << endl;
cout << "6. Exit" << endl;
cout << "Alegeti optiunea : ";
cin >> option;
cout << endl;
switch (option)
{
case 1:
{
cout << "Numarul de studenti: ";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "Introduceti datele pentru studentul " << i + 1 << endl;
cout << "Numele : ";
cin >> nume;

cout << "Specialitatea : ";


cin >> specialitate;
cout << "Anul de studii : ";
cin >> anstudii;
cout << "Balul mediu : ";
cin >> balmed;
setare(&C[i], nume, specialitate, anstudii, balmed);
}

}
system("cls");
break;
case 2:
system("cls");
{
cout << "Afisare:" << endl;
for (int i = 0; i < n; i++)
{
cout << endl;
cout << "Studentul " << i + 1 << " :" << endl;
cout << "Nume : " << C[i].nume << endl;
cout << "Specialitate : " << C[i].specialitate << endl;
cout << "Anul de studii : " << C[i].anstudii << endl;
cout << "Balul mediu : " << C[i].balmed << endl;

case 3:

}
}
system("pause");
system("cls");
break;
system("cls");
{
int i;
cout << "Introduceti numarul studentului care vreti sa il schimbati :

";

cin >> i;
cout << "Introduceti datele noi! " << endl;
cout << "Introduceti numele: ";
cin >> nume;
cout << "Introduceti specialitatea: ";
cin >> specialitate;
cout << "Introduceti anul de studii: ";
cin >> anstudii;
cout << "Introduceti balul mediu: ";
cin >> balmed;
setare(&C[i - 1], nume, specialitate, anstudii, balmed);

case 4:
{

}
system("cls");
break;
do
{
cout << "1. Compararea dupa anul de studii" << endl;
cout << "2. Compararea dupa balul mediu" << endl;
cout << "3. Inapoi" << endl;
cout << "Alegeti optiunea :" << endl;
cin >> w;
switch (w)
{
case 1:
{

int x, y;
cout << "Dati indexu studentului 1: ";
cin >> x;
cout << "Dati indexu studentului 2: ";
cin >> y;
comparare(C[x-1].anstudii, C[y-1].anstudii,"Studentul");
cout << endl;
system("pause");
system("cls");
}
break;
case 2:
{

}
break;
}

int x, y;
cout << "Dati indexu studentului 1: ";
cin >> x;
cout << "Dati indexu studentului 2: ";
cin >> y;
comparare(C[x - 1].balmed, C[y - 1].balmed, "Studentul");
cout << endl;
system("pause");
system("cls");

} while (w != 3);
}
break;

system("cls");

case 5:
{
student *sortat = bubbleSort(C, n);
for (int i = 0; i < n; i++)
{
afisare(sortat[i]);
}
};

break;
case 6:
{

for (int i = 0; i < n; i++)


{
sterge_memoria(&C[i]);
}
return 1;

}
break;
default:
{
cout << "Eroare" << endl;
}
}

}
delete[] C->nume; C->nume = NULL;

delete[] C->specialitate; C->specialitate = NULL;


cout << "Informatia a fost stearsa!" << endl;
return 1;

Listingul programului b:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct Vector
{
int *numar;
int n;
public:

void init(int);

};
void Vector::init(int size)
{
n = size;
numar = new int[n];
}
void setare(Vector *s, int *Numar, int N)
{
s->numar = Numar;
s->n = N;
}
void afisare(Vector S)
{
cout << endl;
cout << "Elementele" << S.numar << endl;
}
int main()
{
int q, n;
int sum = 0;
int sum1 = 0;
int *numar;
numar = new int[30];
int *numar1;
numar1 = new int[30];
Vector *S = NULL;
while (1)
{
system("cls");
cout << "1.Setarea datelor" << endl;
cout << "2.Afisarea datelor" << endl;
cout << "3.Modificarea datelor" << endl;
cout << "4.Suma elementelor pare" << endl;
cout << "5.Elementul maximal" << endl;
cout << "6.Eliminarea vectorului" << endl;
cout << "7.Exit" << endl;
cout << endl;
cout << "Alegeti optiunea : ";
cin >> q;
system("cls");
switch (q)
{
case 1:
{
if (!numar)
return q;
cout << "Introduceti lungimea vectorului: ";

cin >> n;
S = new Vector[n];
for (int i = 0; i < n; i++)
{
cout << "Elementul " << i + 1 << ": ";
cin >> numar[i];
}
system("pause");
}
break;
case 2:
{

}
break;
case 3:
{

}
break;
case 4:
{

}
break;
case 5:
{

maximum<<endl;

cout << "Afisarea rezultatelor" << endl;


for (int i = 0; i < n; i++)
{
cout << "Elementul " << i + 1 << ": " << numar[i] << endl;
}
system("pause");

if (!numar)
return q;
cout << "Introduceti lungimea vectorului nou :";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "Elementul " << i + 1 << ": ";
cin >> numar[i];
}
system("pause");

for (int i = 0; i < n; i++)


{
if (numar[i] % 2 == 0)
{
sum += numar[i];
}
}
cout << "Suma elementelor pare = " << sum << endl;
cout << endl;
system("pause");

int maximum;
int location = 1;
//int i = 0;
maximum = numar[0];// n =size; numar[i]=array[c]
for (int i = 1; i < n; i++)
{
if (numar[i] > maximum)
{
maximum = numar[i];
location = i + 1;
}
}
cout << "Elementul maximal\nPozitia: " << location << "\nValoarea: " <<

}
break;
case 6:
{

}
break;
case 7:
{
}
break;
}

}
return 0;

system("pause");

for (int i = 0; i < n; i++) {


numar[i] = NULL;
}
cout << "Vectorul a fost sters\n";
system("pause");
n = 0;

return 0;

Concluzia:
Efectund aceast lucrare de laborator am luat cunotin de posibilitile utilizrii mecanismului
de abstractizare al limbajului C++. Am observat c acest limbaj ofer posibiliti mari
programatorului. Am neles c putem precuta un obiect din exterior, la general, ca pe o
variabil unic, fr a ine cont de particularitile sale. Utilizarea structurilor ne permite s
definim tipuri noi, create de noi i pe care putem s le utilizm cum se poate mai bine pentru a
realiza scopul pus de sarcin, innd cont i de particularitile ei.