Sunteți pe pagina 1din 30

Universitatea Tehnică a Moldovei

Catedra Automatica şi Tehnologii Informaţionale

Disciplina: Programarea C++

RAPORT
Lucrare de laborator nr. 1

Tema: Structura – mecanism de abstractizare

Varianta: 8

A efectuat: student a gr. TI-102 Sîli Gheorghe


A verificat: lector universitar Cojocaru Svetlana

Chişinău 2011
1 Scopul şi sarcina lucrării

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 lucrării

а) Să se creeze; utilizînd structura, tipul abstract de date pentru reprezentarea numerelor complexe. Să
se definească funcţiile de setare/citire a părţii reale şi imaginare a unui număr complex; de adunare,
scădere, înmulţire, împărţire şi de comparaţie( mai mic, mai mare, etc.) a două numere complexe. Să
se definească funcţia ce calculează şi returnează modulul unui număr complex. Să se definească toate
funcţiile ca fiind globale.

b) Să se creeze tipul abstract de date (structura) – vector, care se compune dintr-un pointer spre int şi
din numărul de elemente. Să se definească funcţiile de iniţializare, de eliminare a unui vector; de
setare/ modificare a dimensiunii vectorului; de acces la elementele vectorului; de calcul a modulului
unui vector. În funcţia main să se realizeze adunarea a doi vectori.

2 Indicaţii teoretice

Pînă în momentul de faţă au fost studiate tipurile de date compuse, elementele cărora aparţin
aceluiaşi tip de date(simplu sau compus). În cazul unui masiv, elementele acestuia erau de acelaşi tip:
întreg, real, caracterial etc; fără a fi posibilă atribuirea diferitor elemente ale masivului valori de tipuri
diferite. Însă deseori apar situaţii cînd este necesară prelucrarea şi păstrarea unei informaţii mai
complexe, aşa că orarul lecţiilor, reuşita unui student etc. Dacă precăutăm cazul cu reuşita studentului,
atunci este simplu de presupus că va fi necesară următoarea informaţie: numele studentului, grupa,
notele la examen, balul mediu calculat. Aceste date sînt legate între ele prin faptul că aparţin aceleiaşi
persoane. Ca urmare ar fi justificată tratarea lor ca o singură valoare compusă. Însă tipurile datelor
deferă între ele: numele şi grupa vor fi de tip şir, notele la examen - de tip întreg, iar balul mediu
calculat - de tip real(float). Gruprea acestor componente întro variabilă compusă este posibilă folosind
un tip nou de date numit în limbajul C structură. Primul pas în gruparea componentelor de diferite
tipuri într-o variabilă compusă este declararea şi descrierea structurii. Declarînd o structură, se creează
un tip nou de date a utilizatorului, care pînă în momentul dat n-a fost cunoscut de compilator.
Declararea structurilor se face în partea declarării tipurilor, înainte de începutul funcţiei principale
main().
2
Declararea unei structuri începe cu cuvîntul chee “struct”, după care urmează numele structurii, care
se mai numeşte tip înregistrare. Elementele unei variabile de tip înregistrare sînt înscrise după numele
structurii între acolade. Sintaxa de descriere a elementelor structurii e analogică cu sintaxa declarării
variabilelor: se indică numele şi tipul elementelor din structură despărţite prin simbolul “;”. Descrierea
structurii de asemenea se termină cu simbolul “;”. Sintaxa descrierii unei structuri în caz general este
următoarea: struct nume {tip_1 nume_1; tip_2 nume_2;……; tip_n nume_n;};

Lista elementelor din structură poartă numele de şablon. O structură, ca atare nu declară nici o
variabilă. Elementele unei structuri nu sînt variabile aparte, ele sînt componente ale unei sau a mai
multor variabile. Astfel de variabile se numesc structurale şi trebuie declarate ca fiind de tipul
structurii respective. Şablonul respectiv va descrie aceste componente, astfel va fi determinat volumul
de memorie necesar de rezervat pentru fiecare variabilă structurată de tip înregistrare.

Dacă precăutăm exemplu cu reuşita unui student, declararea unei structuri va fi următoarea : struct
stud {char name [20] ; int ex1, ex2; float med; char grup [10];};

2.1 Declararea variabilelor de tip structură.

Declararea structurii nu rezervează spaţiu de memorii pentru ea. Înainte de a folosi orice tip de date,
e necesar de declarat o variabilă corespunzătoare. Este imposibil de a folosi o structură în program fără
a declara o variabilă de tip înregistrare, fix aşa cum e imposibilă folosirea unei valori de tip float
înaintea declarării variabilei de tip float.

Sintaxa de declararea a unei variabile-structuri e următoarea: struct nume_structura


nume_variabilă; Aici cuvântul cheie struct indică compilatorului faptul că merge vorba despre o
structură, iar tipul înregistrării stud determină şablonul după care va fi compusă variabila.

După tipul înregistrării urmează numele variabilei, care va fi folosit în program.

De exemplu, pentru a primi acces la datele despre reuşita unui student trebuie declarată o variabilă:
struct stud a; Acum avem variabila a compusă din 5 cîmpuri, pentru care a fost rezervată memorie.

Dacă în program trebuie folosite câteva variabile de unul şi acelaşi tip înregistrare, e posibil de
folosit următoarea sintaxă: struct stud a, b, c; Aici sînt declarate 3 variabile de tip înregistrare stud: a,
b, c. În cazul când e necesară folosirea variabililor de tip înregistrare diferit, ele se vor declara aparte.
Există posibilitatea declarării variabilei de tip înregistrare odată cu descrierea structurii. Pentru aceasta
numele variabilei va fi amplasat între acolada de închidere şi simbol “ ; “ la sfârşitul declarării
structurii. Exemplu:

struct stud { char name [20];

char grup [10] ;

int ex1, ex2;


3
float med;}a;

Aici stud este tipul înregistrării şi numele unui nou tip de date numit structură.

Elementele, din care se compune structura se mai numesc cîmpuri structurate, a este numele
variabilei , care va fi folosită în program şi e compusă conform şablonului din 5 componente.

2.2 Iniţierea variabilelor tip înregistrare.

În cazul, cînd valorile iniţiale ale componentelor unei variabile-structuă sînt cunoscute, este posibilă
atribuirea lor în timpul declarării variabilei. În cazul când se declară o simplă variabilă tip înregistrare
iniţierea va fi o parte a declarării structurii:

struct stud { char name [20]; char grup [10];

int ex1, ex2; float med;}

a={“Ivanov”, “SOE-991”, 8,7,7.5};

Aici a fost descrisă structura stud şi concomitent declarată variabila a cu iniţializarea valorilor
pentru componentele sale.

O altă variantă de iniţializare a componentelor structurii este iniţializarea lor în tipul declarării unei
variabile tip înregistrare. Exemplu:

struct stud { char name [20]; char grup [10];

int ex1, ex2; float med;}

main () { struct stud a={“Ivanov”, “SOE-991”, 8,7,7.5}; }

O structură este globală, dacă e declarată înainte de funcţia principală main(), şi este locală dacă e
declarată înăuntru funcţiei main(), sau înăuntru altei funcţii. Însă dacă e necesară iniţializarea unei
structuri ce conţine şiruri, ea trebuie declarată înainte de funcţia main() sau ca variabilă statică: static
struct stud;

2.3 Folosirea structurilor.

O structură poate fi prelucrată în program, numai dacă există declarată o variabilă de tip
înregistrare. Această variabilă e compusă din cîteva elemente fiecare avînd valoare de tip diferit. Însă
adresarea către valorile ce se conţin în cîmpurile structurii este imposibilă folosind nemijlocit numele

4
cîmpului respectiv. De asemenea e imposibilă accesarea valorilor din variabila tip înregistrare folosind
numai numele ei. Conform regulilor de sintaxă a limbajului C++, pentru a accesa un element al
structurii, este necesar de indicat numele variabilei tip înregistrare şi numele cîmpului respectiv
folosind următoarea sintaxă: nume_var.nume_cîmp , unde nume_var este numele variabilei tip
înregistrare, iar nume_cîmp – numele cîmpului respectiv din variabilă.

Notă: La prelucrarea valorilor din cîmpurile structurii se vor folosi toate funcţiile, instrucţiunile şi
operaţiile aplicabile tipului cărui îi aparţin câmpurile structurii.

Exemplu: De alcătuit o structură care ar conţine informaţii despre un student (nume,

grupa) şi ar calcula nota medie după rezultatele la două examene:

struct stud {char name [20], group[10];

int ex1, ex2; float med;};

void main (void) { struct stud a;

puts(“Culege numele şi grupa”);

gets(a.name); gets(a.group);

puts(“Culege notele la două examene”);

scanf(“%d%d”,&a.ex1,&a.ex2);

a.med=(a.ex1+a.ex2)/2;

printf(“media=%f”,a.med);}

3 Realizarea sarcinii

a) - creăm funcţie de setare a numărului complex cu partea imaginară şi reală;

- functie de citire a partilor imaginare si reale;

- functie de adunare a 2 numere complexe;

- functie de scadere a 2 numere complexe;

- functie de inmultire a 2 numere complexe;

- functie de impartire a 2 numere complexe;

- funcţie de comparatie a 2 numere complexe;

- funcţie de calcul a modului unui numar complex.

b) - crearea structurii VECTOR;

- funcţie de eliberare a memoriei a vectorului;


5
- funcţie de acces la un element din vector;

- funcţie de afişare a vectorului;

- funcţie de modificarea dimensiunii vectorului;

- funcţie de modificarea unei valori din vector;

- funcţie de calcul a modului unui vector;

- funcţie pentru adunarea a 2 vectori;

Concluzia

În urma efectuării acestui laborator m-am cunoscut cu structurile în C++, am observat diferenţa dintre
C++ şi C, unde este cu mult mai convenabil structurile în C++. În C++, la structuri este posibil accesarea
funcţiilor, în aşa mod parametrii în funcţie se micşorează şi în acest fel noi lucrăm cu programarea
orientată pe obiecte.

În acest fel, codul sursă vine mai simplu de creat, mai simplu pentru programator de folosit şi mai
sofistificată programa.

Bibliografia

„Iniţializare în limbajele C şi C++”, Sergiu G. Istrati [Resursă electronică]

“Iniţiere în C++, Programare orientată pe obiecte”, Muşlea Ionuţ [Resursă electronică]

6
Anexa A
Imagini din programa (a)

Figura A.1 – imaginea generală a softului

******************************************************************************************

7
Anexa B
Imagini din programa (b)

Figura B.1 – Meniul principal

Figura B.2 – Afişarea vectorilor V1 şi V2

8
Figura B.3 – Modulul vectorului

Figura B.4 – Adunarea şi afişarea vectorilor V1 şi V2

9
Figura B.5 – Setarea/Modificarea vectorilor V1, V2

******************************************************************************************

10
Anexa C
Codul sursă (a)
#include <iostream>

#include <math.h>

using namespace std;

/*

Dupa conditiile problemei trebuie sa:

1. Cream functie de setare a numarului complex cu partea imaginara si reala

2. Functie de citire a partilor imaginare si reale

3. Functie de adunare a 2 numere complexe

4. Functie de scadere a 2 numere complexe

5. Functie de inmultire a 2 numere complexe

6. Functie de impartire a 2 numere complexe

7. Functie de comparatie a 2 numere complexe

8. Functie de calcul a modului unui numar complex

*/

struct Complex {

double Re; // Partea Reala din numarul complex

double Im; // Partea Imaginara din numarul complex

void afisare()

cout << Re;

if(Im != 0)

11
{

if(Im > 0) cout << " + "; else if (Im < 0) cout << " - ";

cout << abs(Im) << "i";

void setare(double r, double i)

Re = r;

Im = i;

double modulul()

return sqrt(pow(Re, 2)+pow(Im, 2));

};

void adunarea(Complex a, Complex b)

double r, i;

r = a.Re + b.Re;

i = a.Im + b.Im;

if(r != 0)
12
cout << r;

if(i != 0 && i < 0) cout << " - ";

else if (i != 0 && i > 0) cout << " + ";

if (i != 0) cout << abs(i) << "i";

void scaderea(Complex a, Complex b)

double r, i;

r = a.Re - b.Re;

i = a.Im - b.Im;

if(r != 0)

cout << r;

if(i != 0 && i < 0 && r != 0) cout << " - ";

else if (i != 0 && i > 0 && r != 0) cout << " + ";

if (i != 0) cout << abs(i) << "i";

void inmultirea(Complex a, Complex b)

double r, i;

r = a.Re*b.Re - a.Im*b.Im;

i = a.Im*b.Re + a.Re*b.Im;
13
if(r != 0)

cout << r;

if(i != 0 && i < 0) cout << " - ";

else if (i != 0 && i > 0) cout << " + ";

if (i != 0) cout << abs(i) << "i";

void inpartirea(Complex a, Complex b)

double r, i, j1, j2, k;

if(b.Im > 0) i = (-1)*b.Im;

else if (b.Im < 0) i = abs(b.Im);

else i = 0;

j1 = a.Re*b.Re-a.Im*i;

j2 = a.Im*b.Re+a.Re*i;

k = pow(b.Re, 2) + pow(i, 2);

cout << "(";

if(j1 != 0)

cout << j1;

if(j2 > 0 && j2 != 0) cout << "+";

if(j2 != 0) cout << j2 << "i)/";

cout << k;
14
}

void comparare(Complex a, Complex b)

if (a.modulul() > b.modulul())

cout << "mai mare";

else if(a.modulul() < b.modulul())

cout << "mai mica";

else cout << "egala";

Complex z, w;

void main()

double r, i;

cout << "Introduceti partea Reala pentru primul numar complex: ";

cin >> r;

cout << endl << "Introduceti partea Imaginara pentru primul numar complex: ";

cin >> i;

cout << endl;

z.setare(r, i); // Functia de setare (1)

cout << "Introduceti partea Reala pentru al doilea numar complex: ";
15
cin >> r;

cout << endl << "Introduceti partea Imaginara pentru al doilea numar complex: ";

cin >> i;

cout << endl;

w.setare(r, i); // Functia de setare (1)

cout << "--------------------" << endl;

// Afisarea/Citirea numarului complex, partea imaginara este vizionata in operatie ca pe linga i. Daca partea
imaginara este egal cu 0, atunci operatia nici nu este afisata

cout << "1: Numarul complex Z = "; z.afisare(); // (2)

cout << endl << "2: Numarul complex W = "; w.afisare(); // (2)

cout << endl << "--------------------" << endl;

// Adunarea a ambelor numere complexe

cout << "Adunarea a numerelor complexe este = ";

adunarea(z, w); // (3)

cout << endl;

cout << "Scaderea a numerelor complexe este = ";

scaderea(z, w); // (4)

cout << endl;

cout << "Inmultirea a numerelor complexe este = ";

inmultirea(z, w); // (5)

cout << endl;

cout << "Impartirea a numerelor complexe este = ";

inpartirea(z, w); // (6)

cout << endl;

16
cout << "Numarul complex Z este ";

comparare(z, w);

cout << " numarul complex W";

cout << endl;

cout << "Modulul numarului complex |";

z.afisare();

cout << "| este egal cu = " << z.modulul() << endl;

***************************************************************************************

17
Anexa D
Codul sursă (b)
#include <iostream>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

// Declararea structurii vectorului

struct Vector {

int *p;

int nr;

Vector(){ // Initializam variabilele

p = NULL;

nr = 0;

// Eliberarea memoriei ocupat de catre un vector

void freeMem(){

delete[] this->p;

this->p = NULL;

this->nr = 0;

// Accesul la un element din Vector

int get(int i)

18
{

return this->p[i];

// Afisarea vectorului

void AfisV()

for(int i=0; i<(this->nr); i++)

cout << this->p[i];

if(i != (this->nr-1)) cout << ", ";

// Setarea dimensiunii a Vectorului

void SetSize(int newsize)

int tmp, i;

tmp = this->nr;

int *newp = new int[newsize];

if(newsize > tmp)

for(i=0; i<tmp; i++) newp[i] = this->get(i);

for(i=tmp; i<newsize; i++) newp[i] = 0;

} else
19
for(i=0; i<newsize; i++) newp[i] = this->get(i);

delete[] this->p;

this->p = newp;

this->nr = newsize;

// Modificarea unui element din vector

void setV(int id, int value)

this->p[id] = value;

// Modulul unui vector.

double modulul()

double sum = 0;

for(int i=0; i<this->nr; i++)

sum += pow(this->p[i], 2);

return sqrt(sum);

};

// Adunarea a doi vectori

void Vsuma(Vector V1, Vector V2)

{
20
int i = 0, max = 0;

if(V1.nr > max) max = V1.nr;

if(V2.nr > max) max = V2.nr;

int *newp = new int[max];

for(i=0; i<max; i++)

newp[i] = 0;

for(i=0; i<V1.nr; i++)

newp[i] = V1.p[i];

for(i=0; i<V2.nr; i++)

newp[i] += V2.p[i];

for(i=0; i<max; i++)

cout << newp[i];

if(i != (max-1)) cout << ", ";

Vector V1, V2;

void menu()

cout << "Selectati optiunea:" << endl;

cout << "1. Setarea/Modificarea vectorilor V1, V2" << endl;


21
cout << "2. Afisarea vectorilor V1, V2" << endl;

cout << "3. Calculul modulului vectorului" << endl;

cout << "4. Adunarea vectorilor V1 si V2" << endl;

cout << "0. Iesire din program" << endl << endl;

if(V1.nr == 0)

cout << "ATENTIE! Meniul 2-4 nu este disponibil din cauza ca nu este setat Vectorul V1" << endl;

if(V2.nr == 0)

cout << "ATENTIE! Meniul 2-4 nu este disponibil din cauza ca nu este setat Vectorul V2" << endl;

cout << endl << "Introduceti optiunea din meniu (1-5): ";

main()

char c;

system("cls");

menu();

c = getch();

switch(c)

case '1':

system("cls");
22
cout << "Setarea/Modificarea vectorilor V1, V2" << endl << endl;

cout << "Selectati vectorul pentru setare (1, 2): ";

char k;

Vector *tmp;

k = '0';

while(k != '1' && k != '2')

k = getch();

switch(k)

case '1':

tmp = &V1;

break;

case '2':

tmp = &V2;

break;

cout << endl << endl << "Vectorul " << k << " este format din " << (tmp->nr) << " elemente" << endl;

cout << "1. Modificarea dimensiunii Vectorului" << endl;

cout << "2. Modificarea valorii unui element din vector" << endl << endl;

cout << "Selectati optiunea (1-2): ";

k = '0';
23
while(k != '1' && k != '2')

k = getch();

cout << k << endl << endl;

switch(k)

case '1':

int newsize;

cout << "Introduceti dimensiunea noua pentru vector: ";

cin >> newsize;

tmp->SetSize(newsize);

cout << endl << endl;

cout << "Elementele vectorului sunt: ";

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

cout << tmp->get(i);

if(i != (newsize-1)) cout << ", ";

cout << endl << "Dimensiunea vectorului a fost salvat cu succes";

getch();

main();

break;

case '2':

if(tmp->nr > 0)
24
{

cout << "Elementele vectorului sunt: " << endl;

for(int i=0; i<tmp->nr; i++)

cout << i << ":" << tmp->get(i);

if(i != (newsize-1)) cout << ", ";

} else cout << "Nu sunt elemente in vector" << endl;

cout << endl << endl;

cout << "Pentru modificare a oricarui element din vector tastati ENTER, iar pentru a va reintoarce in meniul
principal ESC";

char c;

c = '0';

while(c != 13 && c != 27)

c = getch();

int r;

switch(c)

case 13: // Enter

int d, l;

d = 0; char o;

while(d == 0)

d = 1; c = 0;

while(c == 0)

25
{

c = 1;

cout << endl << "Introduceti elementul pentru modificare: ";

cin >> r;

if(r < 0 || r >= tmp->nr)

cout << endl << "*** EROARE. Asa element nu exista! Mai incercati odata.";

c = 0;

} else {

cout << endl << "Introduceti valoarea a elementului " << r << ": ";

cin >> l;

tmp->setV(r, l);

o = getch(); cout << endl;

if(o == 27)

d = 1;

c = 1;

cout << endl << "Modificarile au fost efectuate cu succes! Pentru a edita un element nou tastati E, pentru
continuare tastati ENTER";

c = getch();

if(c == 101) d = 0;

26
if(c == 27) d = 1;

main();

break;

case 27: // Esc

main();

break;

break;

break;

case '2':

if(V1.nr == 0 || V2.nr == 0)

cout << endl << "EROARE! Nu este disponibil acest meniu din cauza unui vector incomplet.";

else {

system("cls");

cout << "Vectorul V1 este format din elementele: " << endl;

V1.AfisV();

cout << endl << "Vectorul V2 este format din elementele: " << endl;

V2.AfisV();

getch();
27
main();

break;

case '3':

if(V1.nr == 0 || V2.nr == 0)

cout << endl << "EROARE! Nu este disponibil acest meniu din cauza unui vector incomplet.";

else {

system("cls");

cout << "Modulul Vectorului" << endl << endl;

cout << "Selectati vectorul pentru vizionarea modulului (1, 2): ";

char k;

Vector *tmp;

k = '0';

while(k != '1' && k != '2')

k = getch();

switch(k)

case '1':

tmp = &V1;

break;

case '2':

tmp = &V2;

break;
28
}

cout << endl << endl << "Modulul vectorului V" << k << " este egal cu: " << tmp->modulul();

getch();

main();

break;

case '4':

if(V1.nr == 0 || V2.nr == 0)

cout << endl << "EROARE! Nu este disponibil acest meniu din cauza unui vector incomplet.";

else {

system("cls");

cout << "Adunarea vectorilor V1 si V2" << endl << endl;

cout << "Vectorul suma are elementele date: " << endl;

Vsuma(V1, V2);

getch();

main();

break;

case '0':

V1.freeMem();

V2.freeMem();
29
exit(1);

break;

default:

main();

break;

******************************************************************************************

30

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