Laborator 1 C

Embed Size (px)

Citation preview

Ministerul Educaiei al Republicii Moldova

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnica a Moldovei

Catedra ATIRaport

LUCRARE DE LABORATOR NR. 1LA DISCIPLINA PROGRAMAREA N LIMBAJUL C++

Tema: Structura mecanism de abstractizareA efectuat: st. gr. TI-122 Cobla Adrian A verificat: lector asist.

Potaru Andrei Chiinu 20131. 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.

2. Formularea problemeia) S se creeze tipul abstract de date (structura) ara, care are denumire, continentul pe care se afl i numrul de locuitori. S se defineasc funciile de setare a denumirii rii i a numrului de populaie, 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 cutarea rilor dup denumire i populaie.

b) S se creeze tipul abstract de date (structura) vector, care are pointer spre int 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 mediei elementelor pozitive ale vectorului. Ca exemplu, n funcia main s se realizeze compararea a doi vectori.

3. Teorie: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

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; // alocarea memoriei pentru o variabil nou

bptr->pages = 176;

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.

4. Textul programului n limbajul C++:a)Prima sarcina

#include

#include

#include

using namespace std;

struct tara {

char *denumire;

char *continent;

int locuitori;

};

void init(tara *t,char *Denumire,char *Continent,int Locuitori){

t->locuitori=Locuitori;

t->denumire= new char[strlen(Denumire)+1];

t->continent= new char[strlen(Continent)+1];

strcpy(t->denumire,Denumire);

strcpy(t->continent,Continent);

}

int output(tara *t,int i){

if((t->denumire)&&(t->continent)&&(t->locuitori)){

cout