Sunteți pe pagina 1din 10

Ministerul Educatiei Republicii Moldova

Universitatea Tehnica a Moldovei


Facultatea Calculatoare Informatic i Microelectronic
Catedra Automatica si Tehnologii Informationale

RAPORT
Disciplina: Programarea in limbajul C++
Lucrare de laborator Nr.1

Tema: Structura mecanism de abstractizare

A efectuat :
A verificat:

Chisinau 2014

Scopul lucrrii:
1. Studierea programrii prin abstractizarea datelor;
2. Studierea regulilor de definire i utilizare a structurilor de date;
3. Crearea variabilelor de tip structur, accesarea componentelor unei structuri.
Sarcina:
Varianta 1
b) S se creeze tipul abstract de date (structura) vector, care se compune dintr-un
pointer spre int i din numrul de elemente. S se defineasc funciile de iniializare, de eliminare
a unui vector; de setare/ modificare a dimensiunii vectorului; de acces la elementele vectorului;
de calcul a modulului unui vector.n funcia main s se realizeze adunarea a doi vectori.

Noiuni teoretice
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.
Realizarea sarcinii:
Pentru realizarea cerintei oferite de catre profesor,eu am creat un program in C++,care
contine mai multe functii:initializare,afisare,stergere,modificare,accesare,functia pentru aflarea
modulului unui vector.In functia main am realizat adunarea a 2 vectori.
Rezultatul primit este urmatorul:
1)Meniul principal

2)Functia de initializare a vectorilor

3)Functia de accesare a unui element din vector

4)Functia pentru modul

5)Functia pentru adunarea a 2 vectori

6)Functia pentru stergerea unui vector

7)Functiade modificare a dimensiunii

Concluzie:
Efectund aceast lucrare de laborator, am nvat cum s fac alocarea memoriei cu ajutorul
operatorului new. Deasemenea, am lucrat cu o structur i cu cmpurile ei, deasemenea am
realizat anumite operatii cu datele acestei structure. Mi-a placut mult sa lucrez la aceasta lucrare de
laborator, deoarece am aflat multe lucruri noi , cu ajutorul carora mi-am imbogatit cunostintele si
capacitatile de a lucre cu limbajul C++.
Bibliografie:
1. Notatiile de la curs;
2. Programare,reprezentarea algoritmilor si limbajul Turbo C++;
Anexa A

Listing de program:
/*
b)S se creeze tipul abstract de date (structura) vector,
care se compune dintr-un pointer spre int i din numrul de elemente.
S se defineasc funciile de iniializare, de eliminare a unui vector;
de setare/ modificare a dimensiunii vectorului; de acces la elementele vectorului;
de calcul a modulului unui vector. n funcia main s se realizeze adunarea a doi vectori. */
#include "Function 1.h"
int main()
{
meniu:
system("cls");
cout << "\n[1]Initializarea vectorilor\n";
cout << "\n[2]Afisarea vectorilor\n";
cout << "\n[3]Stergerea unui vector\n";
cout << "\n[4]Modificarea dimensiunii unui vector\n";
cout << "\n[5]Accesarea unui element a vectorului\n";
cout << "\n[6]Calcularea modulului unui vector\n";
cout << "\n[7]Adunarea a doi vectori\n\n>>";
int b;
cin >>b;
switch (b)
{
case 1:
system("cls");
Initial();
goto meniu;
break;
case 2:
system("cls");
show();
getch();
goto meniu;
break;
case 3:
system("cls");
del(nvect);
getch();
goto meniu;
break;
case 4:

system("cls");
change(nvect);
getch();
goto meniu;
break;
case 5:
system("cls");
acces();
getch();
goto meniu;
break;
case 6:
system("cls");
modul();
getch();
goto meniu;
break;
case 7:
system("cls");
int n,m;
cout << "Care vectori doriti sa adunati :";
cout << "\nIntroduceti primul vector :";
cin >> n;
cout << "\nIntroduceti al doilea vector :";
cin >> m;
suma(n,m);
getch();
goto meniu;
break;
default :
system("cls");
cout << "Optiunea introdusa este gresita.";
getch();
goto meniu;
}
return 0;
}
//Functia 1.h
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>

#include <conio.h>
#include <cstring>
using namespace std;
struct vector{
int * point;
int numar;
};
vector v[50];
int nvect;
//Functia de initalizare a vectorilor
int Initial(){
int i,j;
cout << "Introdu numarul de vectori :";
cin >> nvect;
for (i=0;i<nvect;i++){
cout<<"Introduceti nr. de elemente a vectorului "<<i+1<<" : ";
cin>>v[i].numar;
v[i].point = new int[v[i].numar];
for(j=0;j<v[i].numar;j++){
cout<<"Itroduceti nr "<<j+1<<" :";
cin>>v[i].point[j];
};
}
}
//Funtia de afisare a vectorilor
void show(){
int i,j;
for(i=0;i<nvect;i++){
cout<<"Vectorul "<<i+1<<" :";
for(j=0;j<v[i].numar;j++){
cout<<"| "<<v[i].point[j];
} cout <<"|"<<endl;}
}
//Functia de stergere a unui vector
void del (int &nvect){
int vdel,i;
cout << "\nCare vectori doriti sa stergeti:";

cin >> vdel;


for (i=vdel-1;i<nvect;i++){
v[i]=v[i+1];}
v[nvect--];
}
//Functia de moduficare a dimensiunei unui vector
void change (int nvect){
int n,i,l;
cout <<"Introduceti vectoru care doriti sa modificati ";
cin >> n;
n=n-1;
if(n>nvect){cout << "Vectorul introdus nu exista";}
else
{cout << "\nIntroduceti lungimea vectorului :";
cin >> l;
v[n].numar=l;
}
}
void acces()
{
int n,e,i,j;
cout << "Elementul carui vector doriti sa accesati ?\n>>";
cin >> n;
cout << "Care element doriti sa accesati ?\n>>";
cin >> e;
cout << "Elementul dorit este :";
cout << "Elementul : ["<< v[n-1].point[e-1]<<"]";
cout <<endl;}
int modul()
{
int n,i;
double m=1;
cout << "Modulul carui vector doriti sa aflati :";
cin >> n;
n=n-1;
for(i=0;i<v[n].numar;i++){
m+=v[n].point[i]*v[n].point[i];}
m=sqrt(m);
cout << "\nModulul este :"<<m;
}

void suma(int n,int m)


{
n=n-1;
m=m-1;
int i,j;
if (v[n].numar>v[m].numar)v[20].numar = v[n].numar;
else v[20].numar = v[m].numar;
v[20].point = new int[v[20].numar];
for(i=0;i<v[20].numar;i++){
v[20].point[i]=v[n].point[i]+v[m].point[i];}
cout << "Vectorul suma este :";
for(j=0;j<v[20].numar;j++){
cout<<"| "<<v[20].point[j];
} cout <<"|"<<endl;
}

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