Sunteți pe pagina 1din 17

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnica a Moldovei


Catedra ATI

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

Tema: Structura mecanism de abstractizare

A efectuat:

st. gr. TI-122


Cobla Adrian

A verificat:

lector asist.
Potaru Andrei

Chiinu 2013

1. 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 problemei
a) 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<iostream>
#include<conio.h>
#include <string>
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<<endl<<"Tara numarul "<<i+1<<endl;
cout<<"Denumirea:"<<t->denumire<<endl;
cout<<"Continentul:"<<t->continent<<endl;
cout<<"Locuitori:"<<t->locuitori<<endl;
}
}
int compare(int a,int b){
if(a>b)
return 1;
else
return 0;
}
int search_d(tara *t,char *str){
if(strcmp(t->denumire,str)==0)
{
cout<<"Denumirea:"<<t->denumire<<endl;
cout<<"Continentul:"<<t->continent<<endl;
cout<<"Locuitori:"<<t->locuitori<<endl;
return 1;
}
}

int search_locuitori(tara *t,int l){


if(t->locuitori == l)
{
cout<<"Denumirea:"<<t->denumire<<endl;
cout<<"Continentul:"<<t->continent<<endl;
cout<<"Locuitori:"<<t->locuitori<<endl;
return 1;
}
}
void clearmem(tara *t){
delete[] t->denumire; t->denumire=NULL;
delete[] t->continent; t->continent=NULL;
}
int main(){
int n,optiune,k,l,compare,change,v;
tara T[50];
tara *tara;
char *nDenumire,*nContinent; int nLocuitori;
nDenumire= new char[265];
nContinent= new char[265];
char *search_str;
search_str= new char[265];
int search_l;
while(1){
system("cls");
cout<<"1. Introducerea datelor"<<endl;
cout<<"2. Afisarea datelor"<<endl;
cout<<"3. Compararea datelor"<<endl;
cout<<"4. Modificare datelor"<<endl;
cout<<"5. Cautare dupa denumire"<<endl;
cout<<"6. Cautare dupa populatie"<<endl;
cout<<"7. Eliberarea memoriei"<<endl;
cout<<"0. EXIT"<<endl;
cin>>optiune;
switch(optiune){
case 1:{
system("cls");
cout<<"Introduceti numarul de tari:"<<endl;
cin>>n;
for(int i=0; i<n; i++){
cout<<endl<<"Denumirea tarii numarul "<<i+1<<":"<<endl;
cin>>nDenumire;
cout<<"Continentul pe care se afla:"<<endl;
cin>>nContinent;
cout<<"Numarul de locuitori ai tarii:"<<endl;
cin>>nLocuitori;
init(&T[i],nDenumire,nContinent,nLocuitori);
}
}
break;
case 2:{
system("cls");

//if(!tara){cout<<"Nu exista date introduse"<<endl;}


for(int i=0; i<n; i++){ output(&T[i],i); }
getch();
}
break;
case 3:{
system("cls");
for(int i=0; i<n; i++){
cout<<endl<<"Tara numarul "<<i+1<<endl;
cout<<"Denumirea:"<<T[i].denumire<<endl;
cout<<"Locuitori:"<<T[i].locuitori<<endl;
}
cout<<endl<<"Alegeti tarile pe care doriti sa le
comparati:"<<endl;
cin>>k;
cout<<"comparam cu:"<<endl;
cin>>l;
if(T[k-1].locuitori > T[l-1].locuitori)
{cout<<"Tara \""<<T[k-1].denumire<<"\" are mai multi
locuitori."<<endl;}
else if(T[k-1].locuitori < T[l-1].locuitori)
{cout<<"Tara \""<<T[l-1].denumire<<"\" are mai multi
locuitori."<<endl;}
else if(T[k-1].locuitori == T[l-1].locuitori)
{cout<<"Ambele tari au acelasi numar de locuitori"<<endl;}
getch();
}
break;
case 4:{
system("cls");
for(int i=0; i<n; i++){
cout<<endl<<"Tara numarul "<<i+1<<endl;
cout<<"Denumirea:"<<T[i].denumire<<endl;
cout<<"Continentul:"<<T[i].continent<<endl;
cout<<"Locuitori:"<<T[i].locuitori<<endl;
}
cout<<endl<<"Alegeti tara pe care doriti sa o
modificati:"<<endl;
cin>>change;
cout<<"Dati noua denumire:"<<endl;
cin>>nDenumire;
cout<<"Dati noul continent:"<<endl;
cin>>nContinent;
cout<<"Dati numarul de locuitori:"<<endl;
cin>>nLocuitori;
init(&T[change-1],nDenumire,nContinent,nLocuitori);
cout<<"Datele au fost modificate cu succes!"<<endl;
getch();
}
break;
case 5:{
system("cls");
cout<<"Introduceti denumirea tarii:"<<endl;
cin>>search_str;

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


search_d(&T[i],search_str);
}
getch();

}
break;
case 6:{
system("cls");
cout<<"Introduceti numarul de locuitori ai tarii:"<<endl;
cin>>search_l;
for(int i=0; i<n; i++){
search_locuitori(&T[i],search_l);
}
getch();
}
break;
case 7:{
system("cls");
for(int i=0; i<n; i++){ clearmem(&T[i]); }
cout<<"Memoria a fost eliberata cu succes!";
getch();
}
break;
case 0:{
for(int i=0; i<n; i++){ clearmem(&T[i]); }
return 1;
}
break;
default:{
cout<<"Nu exista asa numar in meniu."<<endl;
getch();
}
}
}
delete[] nDenumire; nDenumire=NULL;
delete[] nContinent; nContinent=NULL;
delete[] search_str; search_str=NULL;
getch();
return 1;
}

b)A doua sarcina


#include<iostream>
using namespace std;
struct vector {
int *elem;
int dim;
};
int init(vector *v,int d){

v->dim = d;
v->elem = new int[d];
}
int input(vector *v,int d){
int e;
cout<<"Dati elementele vectorului:"<<endl;
for(int j=0;j<d;j++){
cin>>e;
v->elem[j]=e;
}
}
int output(vector *v,int i){
cout<<"Vectorul: "<<i+1<<endl;
if((v->dim)==NULL){cout<<"Vectorul are dimensiunea egala cu 0
(probabil a fost eliminat). "<<endl; return 0;}
cout<<"Dimensiunea: "<<v->dim<<endl;
cout<<"Elementele:"<<endl;
for(int i=0; i<v->dim; i++) {
cout<<v->elem[i]<<" ";
}
}
int deleteVector(vector *v){
for(int i=0; i<v->dim; i++){
v->elem[i]=NULL;
}
v->dim=NULL;
}
int modVector(vector *v){
int d;
cout<<"Dati noua dimensiune:"<<endl;
cin>>d;
init(v,d);
input(v,d);
}
int

calcMed(vector *v){
int med=0,sum=0,pos_numbers=0;
for(int i=0; i<v->dim; i++){
if(v->elem[i]>=0){sum+=v->elem[i]; pos_numbers++;}
}
med=sum/pos_numbers;
return med;

}
int main() {
int optiune,n,d;
vector V[50];
vector *vector;

while(1){
system("cls");
cout<<"1. Introducerea datelor"<<endl;
cout<<"2. Afisarea datelor"<<endl;
cout<<"3. Eliminarea unui vector"<<endl;
cout<<"4. Modificarea datelor"<<endl;
cout<<"5. Calcularea mediei elementelor pozitive ale
vectorului"<<endl;
cout<<"6. Compararea a doi vectori"<<endl;
cout<<"0. EXIT"<<endl;
cin>>optiune;
switch(optiune){
case 1:{
system("cls");
cout<<"Dati numarul de vectori:"<<endl;
cin>>n;
for(int i=0;i<n;i++){
cout<<"Dati dimensiunea vectorului "<<i+1<<":"<<endl;
cin>>d;
init(&V[i],d);
input(&V[i],d);
}
}
break;
case 2:{
system("cls");
//if (vector=NULL){cout<<"Nu exista date introduse."<<endl;
system("pause"); break;}
for(int i=0;i<n;i++){
output(&V[i],i);
cout<<endl<<endl;
}
system("pause");
}
break;
case 3:{
system("cls");
cout<<"Alegeti vectorul pe care doriti sa-l
eliminati:"<<endl<<endl;
for(int i=0;i<n;i++){
output(&V[i],i);
cout<<endl<<endl;
}
int v_delete;
cin>>v_delete;
deleteVector(&V[v_delete-1]);
cout<<"Vectorul a fost eliminat cu succes!"<<endl;
system("pause");
}
break;
case 4:{
system("cls");
cout<<"Alegeti vectorul pe care doriti sa-l
modificati:"<<endl<<endl;
for(int i=0;i<n;i++){
output(&V[i],i);
cout<<endl<<endl;

}
int v_modified;
cin>>v_modified;
modVector(&V[v_modified-1]);
cout<<"Vectorul a fost modificat cu succes!"<<endl;
system("pause");
}
break;
case 5:{
system("cls");
cout<<"Alegeti vectorul pentru calcularea
mediei:"<<endl<<endl;
for(int i=0;i<n;i++){
output(&V[i],i);
cout<<endl<<endl;
}
int v_calc;
cin>>v_calc;
cout<<"Media elementelor pozitive ale vectorului
"<<v_calc<<" este:"<<endl;
cout<< calcMed(&V[v_calc-1]);
cout<<endl;
system("pause");
}
break;
case 6:{
system("cls");
cout<<"Alegeti vectorii pentru comparare:"<<endl<<endl;
for(int i=0;i<n;i++){
output(&V[i],i);
cout<<endl<<endl;
}
int v_comp1,v_comp2;
cin>>v_comp1;
cout<<"comparam cu:"<<endl;
cin>>v_comp2;
if((V[v_comp1-1].dim) > (V[v_comp2-1].dim)){
cout<<"Vectorul: "<< v_comp1<<" are mai multe elemente
decit vectorul: "<< v_comp2<<endl;
}
else if((V[v_comp1-1].dim) < (V[v_comp2-1].dim)) {
cout<<"Vectorul: "<< v_comp1<<" are mai putine elemente
decit vectorul: "<< v_comp2<<endl;
}
else if((V[v_comp1-1].dim) = (V[v_comp2-1].dim)) {
cout<<"Vectorul: "<< v_comp1<<" are acelasi numar de
elemente ca si vectorul: "<< v_comp2<<endl;
}
cout<<endl;
system("pause");
}
break;
case 0:{
return 1;

}
break;
default:{
cout<<"Nu exista asa numar in meniu."<<endl;
system("pause");
}

system("pause");
return 0;
}

5. Verificarea rezultatelor:
a)Prima sarcina

b)A doua sarcina

6. Concluzii :
n aceasta lucrare de laborator am obtinut deprinderi practice de lucru cu
structurile in limbajul de programare C++ . Am facut cunostinta cu noi
operatorii de intrare si iesire cout<< si cin>> , am aflat cum se aloca
memorie cu ajutorul operatorului new si cum se elibereaza memoria cu
operatorul delete.In final putem spune ca limbajul C++ este mai performant
decit C si ca in C++ este mai usor de programat.

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