Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator nr. 1
Varianta: 8
Chişinău 2011
1 Scopul şi sarcina lucrării
Scopul lucrării:
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];};
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.
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:
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.
Î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:
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:
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;
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.
gets(a.name); gets(a.group);
scanf(“%d%d”,&a.ex1,&a.ex2);
a.med=(a.ex1+a.ex2)/2;
printf(“media=%f”,a.med);}
3 Realizarea sarcinii
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
6
Anexa A
Imagini din programa (a)
******************************************************************************************
7
Anexa B
Imagini din programa (b)
8
Figura B.3 – Modulul vectorului
9
Figura B.5 – Setarea/Modificarea vectorilor V1, V2
******************************************************************************************
10
Anexa C
Codul sursă (a)
#include <iostream>
#include <math.h>
/*
*/
struct Complex {
void afisare()
if(Im != 0)
11
{
if(Im > 0) cout << " + "; else if (Im < 0) cout << " - ";
Re = r;
Im = i;
double modulul()
};
double r, i;
r = a.Re + b.Re;
i = a.Im + b.Im;
if(r != 0)
12
cout << r;
double r, i;
r = a.Re - b.Re;
i = a.Im - b.Im;
if(r != 0)
cout << r;
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;
else i = 0;
j1 = a.Re*b.Re-a.Im*i;
j2 = a.Im*b.Re+a.Re*i;
if(j1 != 0)
cout << k;
14
}
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 << "Introduceti partea Reala pentru al doilea numar complex: ";
15
cin >> r;
cout << endl << "Introduceti partea Imaginara pentru al doilea numar complex: ";
cin >> i;
// 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 << endl << "2: Numarul complex W = "; w.afisare(); // (2)
16
cout << "Numarul complex Z este ";
comparare(z, w);
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>
struct Vector {
int *p;
int nr;
p = NULL;
nr = 0;
void freeMem(){
delete[] this->p;
this->p = NULL;
this->nr = 0;
int get(int i)
18
{
return this->p[i];
// Afisarea vectorului
void AfisV()
int tmp, i;
tmp = this->nr;
} else
19
for(i=0; i<newsize; i++) newp[i] = this->get(i);
delete[] this->p;
this->p = newp;
this->nr = newsize;
this->p[id] = value;
double modulul()
double sum = 0;
return sqrt(sum);
};
{
20
int i = 0, max = 0;
newp[i] = 0;
newp[i] = V1.p[i];
newp[i] += V2.p[i];
void menu()
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;
char k;
Vector *tmp;
k = '0';
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 << "2. Modificarea valorii unui element din vector" << endl << endl;
k = '0';
23
while(k != '1' && k != '2')
k = getch();
switch(k)
case '1':
int newsize;
tmp->SetSize(newsize);
getch();
main();
break;
case '2':
if(tmp->nr > 0)
24
{
cout << "Pentru modificare a oricarui element din vector tastati ENTER, iar pentru a va reintoarce in meniul
principal ESC";
char c;
c = '0';
c = getch();
int r;
switch(c)
int d, l;
d = 0; char o;
while(d == 0)
d = 1; c = 0;
while(c == 0)
25
{
c = 1;
cin >> r;
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);
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;
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 << "Selectati vectorul pentru vizionarea modulului (1, 2): ";
char k;
Vector *tmp;
k = '0';
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 << "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