Sunteți pe pagina 1din 15

REFERAT DE LABORATOR Nr.

REFERAT DE LABORATOR NR. 1


TEMA: Tipuri de date definite de utilizator.

NOIUNI TEORETICE
Informaia prelucrat n programe este organizat, n general n ansambluri de date, de diferite tipuri. Pentru descrierea acestor ansambluri (structuri) de date, limbajele de programare de nivel nalt permit programatorului s-i defineasc propriile tipuri de date. Limbajul C ofer posibiliti de definire a unor noi tipuri de date, cu ajutorul: structurilor - permit gruparea unor obiecte (date) de tipuri diferite, referite printrun nume comun; cmpurilor de bii - membri ai unei structuri pentru care se aloc un grup de bii, n interiorul unui cuvnt de memorie; uniunilor - permit utilizarea n comun a unei zone de memorie de ctre mai multe obiecte de diferite tipuri; declaraiilor typedef - asociaz nume tipurilor noi de date; enumerrilor - sunt liste de identificatori cu valori constante, ntregi.

1. Structuri
Structurile grupeaz date de tipuri diferite, constituind definiii ale unor noi tipuri de date. Componentele unei structuri se numesc membrii (cmpurile) structurii. La declararea unei structuri se pot preciza tipurile, identificatorii elementelor componente i numele structurii. Forma general de declarare a unei structuri:
struct [<identificator_tip_structura>] { <lista_de_declaratii_membrii>; } [<lista_identificatori_variabile>];

Membrii unei structuri pot fi de orice tip, cu excepia tipului structur care se declar. Se admit ns, pointeri ctre tipul structur.

REFERAT DE LABORATOR Nr. 1

2. Cmpuri de bii
Limbajul C ofer posibilitatea declarrii i prelucrrii unor date pentru care se aloc un numr specificat de bii (alocare pe bii). Definiie: Un ir de bii adiaceni formeaza un cmp de bii. Cmpurile de bii se pot declara ca membri ai unei structuri, astfel:
struct <identificator_tip_struct> { tip_elem_1 identificator_elem_1:<lungime1>; tip_elem_2 identificator_elem_2:<lungime2>; . . . tip_elem_3 identificator_elem_3:<lungime3>; } lista_identif_var_struct;

3. Declaraii de tip
Limbajul C permite atribuirea unui nume pentru un tip (predefinit sau utilizator) de date. Pentru aceasta se folosesc delcaraiile de tip, cu urmtoarea form general: typedef <tip> <nume_tip>; Nume_tip poate fi folosit la declararea datelor n mod similar cuvintelor cheie pentru tipurile predefinite.

4. Uniuni
Aceeai zon de memorie poate fi utilizat pentru pstrarea unor obiecte (date) de diferite tipuri, prin declararea uniunilor. Uniunile sunt similare cu structurile, singura diferen constnd n modul de memorare. Declararea uniunilor:
union [<identificator_tip_uniune>] { <lista de declaratii_membrii>; } [<lista_identificatori_variabile>];

Spaiul de memorie alocat corespunde tipului membrului de dimensiune maxim. Tipul uniune folosete aceeai zon de memorie, care va conine informaii organizate n mai multe moduri, corespunztor tipurilor membrilor. Uniunile fr nume (specifice limbajului C++) sunt cunoscute i sub numele de uniuni anonime.

REFERAT DE LABORATOR Nr. 1

5. Enumerri
Tipul enumerare asociaz fiecrui identificator o constant ntreag. Sintaxa declaraiei:
enum [<identificator_tip_enumerare>] { <identif_elem1> [= <const1>], . . . } [<lista_identif_variabile>];

Constanta poate fi asociat identificatorului n mod explicit (ca n declaraia anterioar) sau implicit. n modul implicit nu se specific nici o constant, iar valoarea implicit este 0 pentru primul element, iar pentru restul elementelor, valoarea precedent incrementat cu 1. Enumerrile se folosesc n situaiile n care variabilele pot avea un numr mic de valori ntregi, asociind un nume sugestiv pentru fiecare valoare.

PROBLEME REZOLVATE
1. S se implementeze i testeze exemplul urmtor, n care se definete un nou tip de
date, de tipul data calendaristic, Data, cu ajutorul unei structuri.
#include <iostream> #include <string.h> //Declaraii prin care se include fiierele header, //fiiere ce conin declaraii de clase, funcii i constante using namespace std; struct Data { int zi; char luna[11]; int an; }; //Structura prin care cream noul tip de date, Data, are 3 cmpuri: //zi - de tip ntreg //luna - de tip ir de caractere (tablou de caractere) //an de tip ntreg int main() // Funcia main, funcia principal a programului. //Locul unde se execut programul { Data data_nast, d[5]; // Declaram dou variabile de tip Data: //data_nast care va reprezenta data naterii tale //d[5] un tablou numit d, de maxim 5 elemente de tipul Data cout << "Introdu data nasterii tale: \n";
3

REFERAT DE LABORATOR Nr. 1

// Se afieaz pe ecran, cu ajutorul obiectului cout //i a operatorului insertor << irul de caractere //cuprins ntre ghilimele ce urmeaz operatorului // Grupul de caractere \n realizeaz trecerea la linia urmtoare //pe ecran cout << "ziua: "; //Se afieaz pe ecran, cu ajutorul obiectului cout //i a operatorului insertor << irul de caractere //cuprins ntre ghilimele ce urmeaz operatorului cin >> data_nast.zi; // Citim de la tastatur cu ajutorul obiectului cin //i a operatorului extractor >> o valoare ce va fi atribuit //variabilei care urmeaz operatorului, adic o valoare ce va fi //atribuit cmpului zi al variabilei data_nast (data_nast.zi) cout << "luna: "; // Se afieaz pe ecran, cu ajutorul obiectului cout //i a operatorului insertor << irul de caractere //cuprins ntre ghilimele ce urmeaz operatorului cin >> data_nast.luna; // Citim de la tastatur cu ajutorul obiectului cin //i a operatorului extractor >> o valoare ce va fi atribuit //variabilei care urmeaz operatorului, adic o valoare ce va fi //atribuit cmpului luna al variabilei data_nast (data_nast.luna) cout << "anul: "; // Se afieaz pe ecran, cu ajutorul obiectului cout //i a operatorului insertor << irul de caractere //cuprins ntre ghilimele ce urmeaz operatorului cin >> data_nast.an; // Citim de la tastatur cu ajutorul obiectului cin //i a operatorului extractor >> o valoare ce va fi atribuit //variabilei care urmeaz operatorului, adic o valoare ce va fi //atribuit cmpului an al variabilei data_nast (data_nast.an) cout << "Data nasterii tale este: " << data_nast.zi << '.'; // Afim pe ecran cu ajutorul obiectului cout //i a operatorului insertor << irul de caractere //cuprins ntre ghilimele ce urmeaz operatorului, apoi se combin //aceast afiare, cu ajutorul aceluiai operator, <<, //cu afiarea valorii unei variabile (data_nast.zi, adic a cmpului //zi al variabilei data_nast), apoi se afieaz cu ajutorul //aceluiai operator un carater (caracterul . cuprins //ntre apostroafe) cout << data_nast.luna << '.' << data_nast.an << endl; // Afim pe ecran cu ajutorul obiectului cout //i a operatorului insertor << valoarea unei variabile //(data_nast.luna, adic a cmpului luna al variabilei data_nast), //apoi se afieaz cu ajutorul aceluiai operator un carater //(caracterul . cuprins ntre apostroafe). // n continuare cu acelai operator afim valoarea variabilei
4

REFERAT DE LABORATOR Nr. 1

//data_nast.an, adic a cmpului an al variabilei data_nast, iar, //n continuare, dup un nou operator << afim constanta endl //(endline realizeaz trecerea la linia urmtoare pe ecran) // Pn acum am introdus de la tastatur cmpurile variabilei //data_nast, adic ziua luna i anul naterii noastre, iar apoi //le-am afiat pe ecran (ultimele 2 instruciuni) // n continuare, pentru cele 5 elemente ale tabloului d //vom iniializa zilele cu 1, respectiv 2, 3, 4, 5, lunile cu //irul Ianuarie, iar anii cu 2010. for (int i = 0; i < 5; i++) // Structur repetitiv cu contor. Se va repeta de mai multe ori //grupul de instruciuni urmtoare cuprinse ntre acolade. // nainte de prima execuie a grupului de instruciuni se declar //variabila i de tip ntreg care este iniializat la valoarea 0 //(int i=0), aceasta fiind faza de iniializare din cadrul acestei //structuri repetitive. // Dup fiecare executare a grupului de instruciuni, se va //incrementa variabila i (adic se va aduna un 1 la variabil) i++, //aceasta fiind etapa de incrementare. // Execuia repetat a grupului de instruciuni cuprinse ntre //acolade care urmeaz se va opri la pasul la care condiia de //continuare a instruciunii repetitive (i<5)devine fals { d[i].zi = i+1; // Cmpul zi al elementului de pe poziia i din tabloul d de //elemente de tip Data (d[i].zi) ia valoarea i+1. strcpy(d[i].luna,"Ianuarie"); // Funcia strcpy va copia irul de caractere Ianuarie n cmpul //luna (de tip ir de caractere) al elementului de pe poziia i din //tabloul d (d[i].luna) d[i].an = 2010; // Cmpul an al elementului de pe poziia i din tabloul d de //elemente de tip Data (d[i].an) ia valoarea 2010. } // n continuare vom afia elementele tabloului d //(vom afia valorile cmpurilor fiecrui element din tablou) cout << "\nPrimele 5 zile din luna ianuarie: \n"; // Se afieaz pe ecran, cu ajutorul obiectului cout //i a operatorului insertor << irul de caractere //cuprins ntre ghilimele ce urmeaz operatorului // Grupul de caractere \n realizeaz trecerea la linia urmtoare //pe ecran for (int i = 0; i < 5; i++) // Structur repetitiv cu contor. Se va repeta de mai multe ori //instruciunea urmtoare. // nainte de prima execuie a instruciunii se declar //variabila i de tip ntreg care este iniializat la valoarea 0 //(int i=0), aceasta fiind faza de iniializare din cadrul acestei //structuri repetitive.
5

REFERAT DE LABORATOR Nr. 1

// Dup fiecare executare a instruciunii, se va //incrementa variabila i (adic se va aduna un 1 la variabil) i++, //aceasta fiind etapa de incrementare. // Execuia repetat instruciunii care urmeaz se va opri la pasul //la care condiia de continuare a instruciunii repetitive //(i<5)devine fals cout << d[i].zi << '.' << d[i].luna << '.' << d[i].an << endl; // Vom afia valoarea cmpului zi al elementului i din tabloul d //(d[i].zi), apoi caracterul ., valoarea cmpului luna //al elementului i din tabloul d (d[i].luna), din nou caracterul ., //valoarea cmpului an al elementului i din tabloul d (d[i].an), //apoi se trece la o nou linie pe ecran. } // Acolada ce nchide funcia main, sfritul programului

n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.

REFERAT DE LABORATOR Nr. 1

2. S se implementeze i testeze exemplul urmtor, n care se definete tipul

Persoana

caracterizat prin nume, prenume, data naterii i sex i tipul Data, cu datele membre zi, lun i an.
#include <iostream> using namespace std; struct Data { int zi; char luna[11]; int an; }; //Structur prin care cream un nou tip de date, Data, 3 cmpuri: //zi - de tip ntreg //luna - de tip ir de caractere de dimensiune maxim 11 caractere //an de tip ntreg struct Persoana { char nume[25], prenume[25]; Data data_nast; char sex; }; //Structur prin care cream un nou tip de date, Persoana, 4 cmpuri: //nume de tip ir de caractere de dimensiune maxim 25 caractere //prenume tip ir de caractere de dimensiune maxim de 25 //data_nast de tip Data (va conine cele 3 cmpuri ale noului //tip de date realizat cu ajutorul structuriii Data) //sex de tip caracter int main() { Persoana *p; //p variabil pointer de tip Persoana. Va fi utilizat pentru //crearea unui tablou de variabile de tip Persoana int nr_p; //nr_p variabil ntreag, va fi utilizat pentru //memorarea numruli de persoane. cout << "Introduceti numarul de persoane: "; //afieaz irul de caractere ce urmeaz operatorului << cin >> nr_p; //citim o valoare care va fi atribuit variabilei nr_p p = new Persoana[nr_p]; //Alocm memorie dinamic (cu ajutorul operatorului new) pentru //tabloul p. Vom aloca memorie pentru nr_p elemente. //n urmtoarea structur repetitiv vom citi de la tastatur valori //pentru cmpurile fiecrui element al tabloului p de tip Persoana //adic vom citi caracteristicile (atributele) fiecrei persoane for (int i=0; i<nr_p; i++) { cout << "---- Persoana " << i+1 << " ----\n"; //afieaz irul de caractere ce urmeaz operatorului <<, //apoi afim valoarea expresiei i+1, ce urmeaz urmtorului //operator << i irul de caractere ce urmeaz urmtorului //operator << 7

REFERAT DE LABORATOR Nr. 1 cout << "Nume: "; //afieaz irul de caractere ce urmeaz operatorului << cin >> p[i].nume; //citim o valoare (un ir de caractere) care va fi atribuit //cmpului nume al elementului de pe poziia i din tabloul p, //p[i].nume cout << "Prenume: "; cin >> p[i].prenume; cout << "Data nasterii: \nZiua: "; cin >> p[i].data_nast.zi; //Citim o valoare (un ir de caractere) care va fi atribuit //cmpului zi al cmpului data_nast al elementului de pe poziia i //din tabloul p, p[i].data_nast.zi // Deoarece cmpul data_nast este tot o structur, accesul la //cmuprile acesteia se face utiliznd a doua oar operatorul de //acces la membrii sructurii . // p[i].data_nast ne asigur accesul la cmpul data_nast al //variabilei de tip Persoana, iar p[i].data_nast.zi ne ofer accesul //la cmpul zi al cmpului data_nast de tip Data cout << "Luna: "; cin >> p[i].data_nast.luna; cout << "Anul: "; cin >> p[i].data_nast.an; cout << "Sex: "; cin >> p[i].sex; cout << endl; } cout << "\n\nAti introdus " << nr_p << " persoane\n\n"; //n urmtoarea structur repetitiv vom afia valorile cmpurilor //fiecrui element al tabloului p de tip Persoana, adic vom afia //caracteristicile (atributele) fiecrei persoane for (int i=0; i<nr_p; i++) { cout << "---- Persoana " << i+1 << " ----\n"; cout << "Nume: " << p[i].nume << ' ' << p[i].prenume; cout << "\nData nasterii: " << p[i].data_nast.zi; cout << '.' << p[i].data_nast.luna; cout << '.' << p[i].data_nast.an; cout << "\nSex: " << p[i].sex; cout << endl << endl; } } // Acolada ce nchide funcia main, sfritul programului

n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.

REFERAT DE LABORATOR Nr. 1

3. S se citeasc informaiile despre angajaii unei ntreprinderi, folosind o funcie de citire.


S se afieze apoi informaiile despre angajai.
#include <iostream> #include <conio.h> using namespace std; struct persoana { char nume[20]; int varsta; int salariu; }; void cit_pers(persoana *pers) { cout << "\nNume angajat: "; cin >> pers->nume; cout << "Varsta angajat: "; 9

REFERAT DE LABORATOR Nr. 1 cin >> pers->varsta; cout << "Salariu angajat: "; cin >> pers->salariu; } // Funcia cit_pers citete de la tastatur informaiile despre o //persoan, adic cmpurile unei variabile de tip persoana. // Funcia primete ca parametru un pointer ctre un obiect de tip //persoana, i nu returneaz nimic (void). // Deoarece variabila pers este un pointer, accesul la cmpurile //structurii persoana se face utiliznd operatorul de acces pentru //pointeri ->. int main() { struct persoana *p; //p variabil pointer de tip Persoana. Va fi utilizat pentru //crearea unui tablou de variabile de tip Persoana int nr_ang; //nr_ang variabil ntreag, va fi utilizat pentru //memorarea numruli de persoane. cout << "Nr. angajati: "; cin >> nr_ang; //se citete de la tastatur numrul de angajai, cu afiarea un ui //mesaj prealabil citirii p = new persoana[nr_ang]; //Alocm memorie dinamic (cu ajutorul operatorului new) pentru //tabloul p. Vom aloca memorie pentru nr_ang elemente. // Utiliznd contorul i, vom apela (n urmtoarea structur //repetitiv cu contor) funcia de citire a datelor unei persoane //pentru fiecare din cei nr_ang angajai (pentru toate elementele //tabloului de persoane p). for (int i=0; i<nr_ang; i++) pers(&p[i]); cout<<"\n\n Datele despre angajati:\n\n"; // n urmtoarea structur repetitiv vom afia valorile cmpurilor //fiecrui element al tabloului p de tip persoana, adic vom afia //caracteristicile (atributele) fiecrui angajat for (int i=0; i<nr_ang; i++) { cout << "Angajatul " << p[i].nume; cout << " are varsta de " << p[i].varsta << " ani "; cout << " si salariul de " << p[i].salariu << " RON"; cout << "\n\n Apasa o tasta....\n\n"; getch(); // Funcie ce ateapt apsarea unei taste } }

n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.

10

REFERAT DE LABORATOR Nr. 1

4. S se citeasc (cu ajutorul unei funcii de citire) urmtoarele informaii despre elevii
participani la un concurs de admitere: nume, numrul de nscriere i cele trei note obinute. S se afieze, printr-o funcie, informaiile citite. S se afieze o list cu elevii participani la concurs, ordonai alfabetic, notele i media obinut (funcie de ordonare, funcie de calculare a mediei). S se afieze lista elevilor nscrii la concurs, n ordinea descresctoare a mediilor.
#include #include #include #include <iostream> <string.h> <iomanip> <conio.h>

using namespace std; #define FALSE 0 #define TRUE 1 typedef struct elev { char nume[20]; int nr_matr; int note[3]; }; //definirea tipului elev //Funcie ce ordoneaz elevii n ordinea mediilor, utiliznd metoda //Bubble Sort i care primete ca parametri: //*a un pointer ctre tipul elev, de fapt un tablou de elevi //n numrul de elevi din tablou void ord_medii(elev *a, int n) { int gata = FALSE; int i; double med1, med2; elev aux; while (!gata) 11

REFERAT DE LABORATOR Nr. 1 { gata = TRUE; for (i=0; i<=n-2; i++) { med1 = 0; med2 = 0; for (int j=0; j<3; j++) { med1 += (a+i)->note[j]; med2 += (a+i+1)->note[j]; //calculul mediilor pentru elementele vecine } med1 /= 3; med2 /= 3; if (med1<med2) { aux = *(a+i); *(a+i) = *(a+i+1); *(a+i+1) = aux; gata = FALSE; } } } } //Funcie ce ordoneaz elevii n ordinea alfabetic, utiliznd //metoda Bubble Sort i care primete ca parametri: //*a un pointer ctre tipul elev, de fapt un tablou de elevi //n numrul de elevi din tablou void ord_alf(elev *a, int n) { int gata = FALSE; int i; double med1, med2; elev aux; while (!gata) { gata = TRUE; for (i=0; i<=n-2; i++) { if (strcmp( (a+i)->nume,(a+i+1)->nume) >0) { aux = *(a+i); *(a+i) = *(a+i+1); *(a+i+1) = aux; gata = FALSE; } } } } //Funcie ce va citi de la tastatur datele de identificare ale //elevilor (cmpurile structurii elev). Primete ca parametri: //*a un pointer ctre tipul elev, de fapt un tablou de elevi //n numrul de elevi din tablou //Funcia va verifica i dac notele elevilor sunt cuprinse n //intervalul 0 10 void cit_elevi(elev *a, int n) { for (int i=0; i<n; i++) { cout<<"\nNume elev:"; cin>>(a+i)->nume; 12

REFERAT DE LABORATOR Nr. 1 cout<<"Nr. matricol:"; cin>>(a+i)->nr_matr; for (int j=0; j<3; j++) { do { cout<<"Nota :"<<j+1<<" ="; cin>>(a+i)->note[j]; if ((a+i)->note[j]<0 || (a+i)->note[j]>10) cout<<"Nota incorecta!....Repeta!\n"; }while ((a+i)->note[j]<0 || (a+i)->note[j]>10); } } } //Funcie ce va afia informaiile despre elevi. Afiarea va fi //fcut sub form formatat. //Funcia primete caparametri: //*a un pointer ctre tipul elev, de fapt un tablou de elevi //n numrul de elevi din tablou void afis_elev(elev *a, int n) { cout << setiosflags(ios::left); //instruciunea va determina ca la urmtoarele afiri formatate, //textul afiat s fie aliniat n partea stng cout << "Nr.crt.|Nr matricol|" << setw(20) << "NUME"; //setw(20) determin ca urmtoarea afiare s se fac pe 20 de //caractere. Dac textul este mai mic de 20 de caractere, se vor //aduga spaii albe n partea stng (n stnga, datorit //instruciunii setiosflags(ios::left) de mai sus) cout << "|Nota1|Nota2|Nota3|MEDIA|\n"; cout << setfill('-') << setw(65) << '-' << setfill(' ') << endl; //setfill('-') determin ca n loc de spaiile albe adugate pe //lng text (determinate de metoda setw) s se adauge caracterul //primit ca parametru. // Instruciunea de mai sus va determina afiarea de 65 de ori a //caracterului iar apoi caracterul implicit folosit pentru umplere //va fi setat din nou pe caracterul spaiu cout << endl; //Pn acum am afia antetul. n continuare vom afia n //instruciunea repetitiv urmtoare detaliile fiecrui candidat for (int i=0; i<n; i++) { cout << setiosflags(ios::left); cout << setw(7) << i+1 << '|' << setw(11) << (a+i)->nr_matr << '|'; cout << setw(20) << (a+i)->nume << '|'; double med=0; cout << setiosflags(ios::right); //instruciunea va determina ca la urmtoarele afiri formatate, //textul afiat s fie aliniat n partea dreapt for (int j=0; j<3; j++) { cout << setw(5) << (a+i)->note[j] << '|'; med += (a+i)->note[j]; } //Afiarea celor 3 note i calculul sumei lor med /= 3; 13

REFERAT DE LABORATOR Nr. 1 cout << setiosflags(ios::fixed); //va determina ca afiarea numerelor reale s se fac n format //virgul fix cout << setw(5) << setprecision(2) << med << '|' << endl; //setprecision va determina precizia la afiarea numerelor reale //(cte cifre se vor afia dup virgul) cout << resetiosflags(ios::right); //resetarea comenzii dat mai sus ca afirile s fie aliniate la //dreapta //Notele au fost afiate aliniate la dreapta, n timp ce celelalte //informaii au fost afiate aliniate la stnga } cout << " Apasa o tasta...\n"; getch(); } int main() { int nr_elevi; cout << "Nr. elevi:"; cin >> nr_elevi; elev *p; p = new elev[nr_elevi]; //alocare dinamic a memoriei pentru un tabloul p de nr_elevi //elemente de tip elev cit_elevi(p, nr_elevi); cout << "\n LISTA INSCRISILOR \n\n"; afis_elev(p, nr_elevi);//afisarea inscrisilor ord_medii(p, nr_elevi); //ordonare dupa medii cout << "\n LISTA ALFABETICA \n\n"; afis_elev(p, nr_elevi); ord_alf(p, nr_elevi); //ordonare alfabetica cout << "\n LISTA MEDII \n\n"; afis_elev(p, nr_elevi); }

n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.

14

REFERAT DE LABORATOR Nr. 1

PROBLEME PROPUSE SPRE REZOLVARE

1. Realizai urmtoarele modificri la ultima problem rezolvat:


a) Completai cu o funcie de calcul i afiare a mediei notelor tuturor candidailor pentru fiecare prob (media tuturor elevilor la proba1, media la proba2, etc). b) Modificai lista alfabetic, astfel nct la elevii cu medie peste 5, s apar (alturi de medie) mesajul "Promovat", iar la ceilali, mesajul "Nepromovat". c) Considernd c rezultatelor obinute sunt utilizate la un concurs de admitere, la care exist N locuri (N introdus de la tastatur), i de faptul c pentru a fi admis media trebuie s fie cel puin 5, s se afieze lista admiilor i lista respinilor, n ordinea descresctoare a mediilor, n limita locurilor disponibile.

15

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