lab 1 c++

16
Ministerul Educaţiei Tineretului şi Sportului al RM Universitatea Tehnică a Moldovei Facultatea СIM Catedra de informatica Raport Nr1 TEMA: Structura – mecanism de abstractizare VARIANTA nr.9 A elaborat:

Upload: maxim-tincu

Post on 05-Dec-2015

14 views

Category:

Documents


5 download

DESCRIPTION

Lab 1 C++

TRANSCRIPT

Page 1: Lab 1 C++

Ministerul EducaţieiTineretului şi Sportului al RM

Universitatea Tehnică a Moldovei

Facultatea СIM

Catedra de informatica

RaportNr1

TEMA: Structura – mecanism de abstractizare

VARIANTA nr.9

A elaborat: st. gr.TI-142 Tincu M. ___________

A verificat: Lector universitar Lisnic I. ____________

Chişinău 2015

Page 2: Lab 1 C++

Tema: Structura – mecanism de abstractizareScopul 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.

Noţiuni de bazăStructura – este o mulţime de date grupate, conform unei ierarhii, de obicei de tipuri diferite. Structura poate fi comparată cu tabloul, însă tabloul conţine date de un acelaşi tip, iar elementele tabloului se accesează cu ajutorul indicilor, pe cînd 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 rezolvării unei probleme se realizează un proces de abstractizare care priveşte reprezentarea datelor şi prelucrarea acestora. Aceasta justifică termenul de programare prin abstractizarea datelor.Fie definiţia de structură:

struct Book{// definirea elementelor structurii char *author; char *title; int year; int pages; };înaintea cuvîntului cheie struct uneori se adaugă cuvîntul cheie typedef. Însă această sintaxă este proprie limbajului C, şi nu C++. Elementele structurii pot fi de tip predefinit sau definit de utilizator, excepţie 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 cărţi şi un pointer spre carte.Referirea la componentele unei structuri se face utilizînd atît numele structurii cît şi a componentei respective. Aceasta se realizează printr-o construcţie 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 conţine componente de tip compus, referirea elementelor este următoarea:

Circle1.Center.x = 20;Circle1.Center.y = 10;

Fie definiţia de structură:

struct Date{

Page 3: Lab 1 C++

int day, month, year;};struct Student{ char *name; Date birthDay; float media;};

La definirea tipului de strutură este bine de a preciza funcţiile care definesc operaţii cu datele de tipul structurii. În acest scop variabilele se transmit funcţiilor 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;}

Funcţia de mai sus are un neajuns legat de alocarea memoriei. Deoarece funcţia este obişnuită, ea poate fi apelată de cîteva ori, ceea ce poate duce la pierderi de memorie. Pentru soluţionarea acestei probleme, mai întîi trebuie dezalocată memoria iniţială (sau să se înregistreze posibilitatea unui singur apel al funcţiei, ceea ce se reflectă în denumirea funcţiei).

void setValues(Student* sptr, char* newN,float newM,Date d){delete[] sptr->name;sptr->name = new char[strlen(newN)+1];...}

Dar şi această soluţie are neajunsurile sale, posibil mai grave decît în primul caz. Pericolul constă în încercarea de a elimina memoria nealocată la primul apel al funcţiei. Pot fi cîteva soluţii. Una constă în utilizarea unui parametru suplimentar, fie cu valoare implicită, care indică dacă funcţia se apelează pentru prima dată(pentru obiectul dat) sau nu. Această variantă nu este tocmai reuşită, este necesar de a urmări succesiunea apelurilor, sarcină realizată de către programator, în al doilea rînd, funcţia trebuie să conţină o condiţie ceea ce încetineşte îndeplinirea funcţiei. Altă soluţie ar fi în setarea valorii iniţiale 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ă iniţial. Pentru aceasta se creează încă o funcţie:

void freeMem(Book* bp){ delete[] bp->author; bp->author = NULL; ... // analogic pentru restul componentelor pointer}

NULL i se atribuie pointerului pentru asigurarea unei utilizări repetate reuşite a variabilei.

Page 4: Lab 1 C++

Condi ţiile problemei :

а) Să se creeze tipul abstract de date (structura) – student, care are nume, specialitate, anul de studii şi balul mediu. Să se definească funcţiile de setare, de modificare a datelor, de comparare. Pentru crearea cîmpurilor textuale să se utilizeze operatorul new. Să se elibereze memoria. În main să se exemplifice sortarea studenţilor după specialitate+reuşită.

b) Să se creeze tipul abstract de date (structura) – vector, care are pointer spre long şi numărul de elemente. Să se definească funcţiile de iniţializare, de eliminare a vectorului, de setare/modificare a dimensiunii, de acces la elementele vectorului, de calcul a sumei elementelor pare ale vectorului. Ca exemplu, în funcţia main, să se realizeze căutarea poziţiei elementului maximal al vectorului.

Listingul programului a:

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <cstdlib>

using namespace std;

struct student{

int anstudii;float balmed;char *nume;char *specialitate;

};

void setare(student *c, char *Nume, char *Specialitate, int Anstudii, float Balmed){

c->anstudii = Anstudii;c->balmed = Balmed;c->nume = new char[strlen(Nume) + 1];c->specialitate = new char[strlen(Specialitate) + 1];

strcpy(c->nume, Nume);strcpy(c->specialitate, Specialitate);

}

void sterge_memoria(student *c){

delete[] c->nume; c->nume = NULL;delete[] c->specialitate; c->specialitate = NULL;

}

void afisare(student c){

cout << "Nume : " << c.nume << endl;cout << "Specialitate : " << c.specialitate << endl;cout << "Anul de studii : " << c.anstudii << endl;cout << "Balul mediu : " << c.balmed << endl;

}

student *bubbleSort(student *c, int n) {bool swapped = true;

Page 5: Lab 1 C++

int j = 0;float tmp;while (swapped) {

swapped = false;j++;for (int i = 0; i < n - j; i++) {

if (c[i].balmed > c[i + 1].balmed) {tmp = c[i].balmed;c[i].balmed = c[i + 1].balmed;c[i + 1].balmed = tmp;swapped = true;

}}

}return c;

}

void comparare(int val1, int val2, char * key){

if (val1 < val2)cout << key << " cu indexul 1 este mai mic!" << endl;

else if (val1 > val2)cout << key << " cu indexul 1 este mai mare!" << endl;

else if (val1 == val2)cout << "Studentii sunt egali!" << key << endl;

cout << endl;}

int main(void){

int n, option, q, w;student C[10];int anstudii, anul;float balmed;int anul1;char *nume, *specialitate;char *rezultat1, *rezultat2;nume = new char[256];specialitate = new char[256];rezultat1 = new char[256];rezultat2 = new char[256];

while (1){

cout << "1. Introducere" << endl;cout << "2. Afisare" << endl;cout << "3. Modificare" << endl;cout << "4. Comparare" << endl;cout << "5. Sortare" << endl;cout << "6. Exit" << endl;cout << "Alegeti optiunea : ";cin >> option;cout << endl;

switch (option){case 1:{

cout << "Numarul de studenti: ";cin >> n;

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

cout << "Introduceti datele pentru studentul " << i + 1 << endl;

Page 6: Lab 1 C++

cout << "Numele : ";cin >> nume;cout << "Specialitatea : ";cin >> specialitate;cout << "Anul de studii : ";cin >> anstudii;cout << "Balul mediu : ";cin >> balmed;

setare(&C[i], nume, specialitate, anstudii, balmed);}

}system("cls");break;case 2:

system("cls");{

cout << "Afisare:" << endl;for (int i = 0; i < n; i++){

cout << endl;cout << "Studentul " << i + 1 << " :" << endl;cout << "Nume : " << C[i].nume << endl;cout << "Specialitate : " << C[i].specialitate <<

endl;cout << "Anul de studii : " << C[i].anstudii <<

endl;cout << "Balul mediu : " << C[i].balmed << endl;

}}system("pause");system("cls");break;

case 3:system("cls");{

int i;cout << "Introduceti numarul studentului care vreti sa il

schimbati : ";cin >> i;cout << "Introduceti datele noi! " << endl;cout << "Introduceti numele: ";cin >> nume;cout << "Introduceti specialitatea: ";cin >> specialitate;cout << "Introduceti anul de studii: ";cin >> anstudii;cout << "Introduceti balul mediu: ";cin >> balmed;setare(&C[i - 1], nume, specialitate, anstudii, balmed);

}system("cls");break;

case 4:{

do{cout << "1. Compararea dupa anul de studii" << endl;cout << "2. Compararea dupa balul mediu" << endl;cout << "3. Inapoi" << endl;cout << "Alegeti optiunea :" << endl;cin >> w;

Page 7: Lab 1 C++

switch (w){case 1:{

int x, y;cout << "Dati indexu studentului 1: ";cin >> x;cout << "Dati indexu studentului 2: ";cin >> y;comparare(C[x-1].anstudii, C[y-1].anstudii,"Studentul");

cout << endl;system("pause");system("cls");

}break;

case 2:{

int x, y;cout << "Dati indexu studentului 1: ";cin >> x;cout << "Dati indexu studentului 2: ";cin >> y;comparare(C[x - 1].balmed, C[y - 1].balmed, "Studentul");

cout << endl;system("pause");system("cls");

}break;}

} while (w != 3);

system("cls");}break;

case 5:{

student *sortat = bubbleSort(C, n);

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

afisare(sortat[i]);}

};

break;case 6:{

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

sterge_memoria(&C[i]);}return 1;

}break;default:{

cout << "Eroare" << endl;

Page 8: Lab 1 C++

}}

}delete[] C->nume; C->nume = NULL;delete[] C->specialitate; C->specialitate = NULL;cout << "Informatia a fost stearsa!" << endl;return 1;

}

Page 9: Lab 1 C++

Listingul programului b:

Page 10: Lab 1 C++

#define _CRT_SECURE_NO_WARNINGS#include <iostream>

using namespace std;

struct Vector{

int *numar;int n;

public:void init(int);

};

void Vector::init(int size){

n = size;numar = new int[n];

}

void setare(Vector *s, int *Numar, int N){

s->numar = Numar;s->n = N;

}

void afisare(Vector S){

cout << endl;cout << "Elementele" << S.numar << endl;

}

int main(){

int q, n;int sum = 0;int sum1 = 0;int *numar;numar = new int[30];int *numar1;numar1 = new int[30];Vector *S = NULL;

while (1){

system("cls");cout << "1.Setarea datelor" << endl;cout << "2.Afisarea datelor" << endl;cout << "3.Modificarea datelor" << endl;cout << "4.Suma elementelor pare" << endl;cout << "5.Elementul maximal" << endl;cout << "6.Eliminarea vectorului" << endl;cout << "7.Exit" << endl;cout << endl;cout << "Alegeti optiunea : ";cin >> q;system("cls");switch (q){case 1:{

if (!numar)return q;

cout << "Introduceti lungimea vectorului: ";

Page 11: Lab 1 C++

cin >> n;S = new Vector[n];for (int i = 0; i < n; i++){

cout << "Elementul " << i + 1 << ": ";cin >> numar[i];

}system("pause");

}break;case 2:{

cout << "Afisarea rezultatelor" << endl;for (int i = 0; i < n; i++){

cout << "Elementul " << i + 1 << ": " << numar[i] << endl;

}system("pause");

}break;case 3:{

if (!numar)return q;

cout << "Introduceti lungimea vectorului nou :";cin >> n;for (int i = 0; i < n; i++){

cout << "Elementul " << i + 1 << ": ";cin >> numar[i];

}system("pause");

}break;case 4:{

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

if (numar[i] % 2 == 0){

sum += numar[i];}

}cout << "Suma elementelor pare = " << sum << endl;cout << endl;system("pause");

}break;case 5:{

int maximum;int location = 1;//int i = 0;maximum = numar[0];// n =size; numar[i]=array[c]for (int i = 1; i < n; i++){

if (numar[i] > maximum){

maximum = numar[i];location = i + 1;

}}

Page 12: Lab 1 C++

cout << "Elementul maximal\nPozitia: " << location << "\nValoarea: " << maximum<<endl;

system("pause");}break;case 6:{

for (int i = 0; i < n; i++) {numar[i] = NULL;

}cout << "Vectorul a fost sters\n";system("pause");n = 0;

}break;case 7:{

return 0;}break;}

}return 0;

}

Page 13: Lab 1 C++

Concluzia: Efectuând această lucrare de laborator am luat cunoştinţă de posibilităţile utilizării mecanismului de abstractizare al limbajului C++. Am observat că acest limbaj oferă posibilităţi mari programatorului. Am înţeles că putem precăuta un obiect din exterior, la general, ca pe o variabilă unică, fără a ţine cont de particularităţile sale. Utilizarea structurilor ne permite să definim tipuri noi, create de noi şi pe care putem să le utilizăm cum se poate mai bine pentru a realiza scopul pus de sarcină, ţinând cont şi de particularităţile ei.