Documente Academic
Documente Profesional
Documente Cultură
Cap07c++ Cursuri
Cap07c++ Cursuri
7.#. $TRU'TURI
-tructurile grupeaz date de tipuri diferite% con"tituind defini ii ale unor noi tipuri de date' Componentele unei "tructuri "e nume"c membrii (cmpurile) "tructurii' La declararea unei "tructuri "e pot preciza tipurile% identificatorii elementelor componente &i numele "tructurii' .orma general de declarare a unei "tructuri+ struct identificator_tip_structura { lista_de_declaratii_membrii; } lista_identificatori_variabile;
n care+
struct e"te un cuv!nt c/eie #obligatoriu$ identificator_tip_structura reprezint numele noului tip #poate lip"i$ lista_de_declaratii_membri e"te o li"t n care apar tipurile &i identificatorii membrilor "tructurii lista_identificatori_variabile e"te o li"t cu identificatorii variabilelor de tipul declarat'
0embrii unei "tructuri pot fi de orice tip% cu e(cep ia tipului "tructur care "e declar' -e admit n"% pointeri ctre tipul "tructur' Identificator_tip_structura poate lip"i din declara ie% n" n ace"t caz% n lista_identificatori_variabile trebuie " fie prezent cel pu in un identificator_varabila' Lista_identificatori_variabile poate lip"i% n"% n ace"t caz% e"te obigatorie prezen a unui identificator_tip_structura' Exemplu: -e define&te noul tip de date numit data% cu membrii zi% luna% an' Identificatorii variabilelor de tipul data "unt data_naterii% data_angajrii'
struct data { int zi;
123
/*4ariabilele data5na"terii &i data5angajarii "unt date de tipul data 67 -e poate omite numele noului tip de date+
struct { int zi; char luna[ !; int an; } data_naterii" data_angajrii;
Ini ializarea variabilelor de tip nou% definit prin "tructur% "e poate realiza prin enumerarea valorilor membrilor% n ordinea n care ace&tia apar n declara ia "tructurii' 8eferirea unui membru al "tructurii "e realizeaz cu ajutorul unui operator de baz% numit operator de selecie% "imbolizat prin . 'Operatorul are prioritate ma(im' 0embrul "t!ng al operatorului de "elec ie precizeaz numele variabilei de tipul introdu" prin "tructur% iar membrul drept)numele membrului "tructurii% ca n e(emplul urmtor+ Exemplu:
struct angajat{ char nume[#$!" prenume[#$!; int nr_copii; double salariu; char loc_nastere[#$!; }; struct angajat a1= {"Popescu", "Vlad", 2, 2900200, "Galati"}; a1.nr_copii = ; strcp%&a
'nume"
()opesco(*;
4ariabilele de acela&i tip pot apare ca operanzi ai operatorului de atribuire' 9n ace"t caz atribuirile "e fac membru cu membru' 9n e(emplul anterior am declarat &i ini ializat variabila a1% de tip angajat' *eclarm &i variabila a#% de acela&i tip' *ac dorim ca membrii variabilei a: " con in acelea&i valori ca membrii variabilei a1 #a1 "i a: de tip angajat$% putem folo"i operatorul de atribuire% ca n e(emplul urmtor+
struct angajat a#; a2=a1;
A&a cum ")a ob"ervat din e(emplul anterior% "tructurile pot avea ca membri tablouri #"tructura angajat are ca membrii tablourile de caractere loc_natere[#$!% nume[#$!% prenume[#$!$' *ea"emenea% variabilele de tip definit prin "tructur pot fi grupate n tablouri' Exemplu:
struct persoana{ char nume[#$!" prenume[#$!; int nr_copii; double salariu; char loc_nastere[#$!; }angajati[ $$!; 76 -)au declarat noul tip numit persoana &i variabila numit angajati% care e"te un vector #cu ma(im 122 de elemente$% ale crui elemente "unt de tipul persoana 67
CAPITOLUL 7
Tipuri de date definite de utilizator cout,,(0umele 1(; cin22angajati[i!'nume; cout,,()renumele 1(; cin22angaja3i[i!'prenume; cout,,(0r' copii1(; cin22 angaja3i[i!'nr_copii; cout,,(Locul naterii1(; cin22 angaja3i[i!'loc_natere;
Limbajul C permite definirea de "tructuri ale cror membri "unt tot "tructuri+ Exemplu:
struct data{ int zi; char luna[ !; int an; }; struct persoana{ char nume[#$!" prenume[#$!; int nr_copii; double salariu; char loc_natere[#$!; struct data data_na!terii; }; struct persoana p +{()opescu("(4asile(" "5$$$$$$"(6alati(" {##"(7ai(" 89:}};
*ac "e dore&te tran"miterea ca parametri ai unor func ii a datelor de tip definit de utilizator prin "tructuri% ace"t lucru "e realizeaz nu)ai cu ajutorul pointerilor "pre noul tipi' *e e(emplu% e"te nece"ar ca variabila p % de tip persoana% " fie prelucrat n func ia f% 9n ace"t caz% func ia va primi ca parametru un pointer "pre tipul per"oana' .unc ia va avea prototipul+
void f&struct persoana "#*;
Apelul func iei "e realizeaz a"tfel+ f&=p *; 9n corpul func iei f% acce"ul la membrii varibilei >% de tip persoana% "e realizeaz a"tfel+ % etc' Pentru a "implifica con"truc iile anterioare% "e folo"e"te operatorul de selecie indirect #$%$+
?@2nume; ?@2prenume; ?@2data_naterii'an &>?*'nume; &>?*'prenume; &>?*'data_naterii'an;
% etc'
-tructurile "unt utilizate n mod frecvent la definirea unor tipuri de date recur"ive #n implementarea li"telor% arborilor% etc'$' Un tip de date e"te direct recur"iv dac are cel pu in un membru care e"te de tip pointer "pre el n"u&i' Exemplu:
struct nod{ char nume[100]; int an; struct nod *urmator; };
Exerciiu: - "e citea"c informa iile de"pre angaja ii unei ntreprinderi% folo"ind o func ie de citire' - "e afi&eze apoi informa iile de"pre angaja i'
Ainclude ,stdio'h2 Ainclude ,conio'h2 struct persoana{ char nume[#$!;int varsta;int salariu; }; &oid cit_pers'struct persoana *ptr_pers( {printf&(0ume angajat1(*; scanf&(Bs("ptr_pers$%nu)e*; 12?
CAPITOLUL 7 Tipuri de date definite de utilizator printf&(4arsta angajat1(*; scanf&(Bd(" =ptr_pers$%varsta*; printf&(Calariu angajat1(*; scanf&(Bd(" *ptr_pers$%salariu*; } &oid )ain'( {struct persoana "p; 77pointer catre date de tip per"oana int nr_ang; clrscr&*; printf&(0r' angajati1(*;scanf&(Bd(" =nr_ang*; p=ne+ persoana,nr_ang-; 77alocare dinamica a memoriei pentru cei nr_ang angajati for &int i+$; i,nr_ang; i--* cit_pers&=p[i!*; printf&(/n/n Datele despre angajati1/n/n(*; for &i+$; i,nr_ang; i--*{ printf&(Engajatul Bd/n 0F7G1 Bs/n 4EHCIE1 Bd/n . 77continuare "ir CELEHIFL1 B'd/n(" i- "p[i!'nume"p[i!'varsta" p[i!'salariu*; printf&(/n/n Epasa o tasta''''/n(*; getch&*; } } A&a cum "e ob"erv din e(emplu% func ia cit_pers prime&te ca parametru pointerul ptr_pers% ctre tipul persoana' Pentru a ace"a membri "tructurii% n corpul func iei% "e folo"e&te operatorul de "elec ie indirect # $' 9n func ia main% "e aloc memorie dinamic #cu ajutorul operatorului neJ$' La afi&are% n func ia printf%
&irul "pecificator de format "e continu pe r!ndul urmtor #folo"irea caracterului @ pentru continuare$'
membrilor' C!mpurile "e aloc de la bi ii de ordin inferior ai unui cuv!nt #: octe i$% ctre cei de ordin "uperior #figura 7'1$' Exemplu:
struct { int unsigned int int } K" %; ' ' ' a1 b1 c1 #; ; ;; ' ' ' c b a
C!mpurile "e refer ca orice membru al unei "tructuri% prin nume calificate+ Exemplu:
K'a + @ ; K'b + ;; K'c + 5;
Utilizarea c!mpurilor de bi i impune urmtoarele re"tric ii+ Tipul membrilor poate fi int "au unsigened int'
12A
CAPITOLUL 7
Lungime e"te o con"tant ntreag din intervalul ;2% 31<, Un c!mp de bi i nu poate fi operandul unui operator de referen iere' Bu "e pot organiza tablouri de c!mpuri de bi i'
*atorit re"tric iilor pe care le impune folo"irea c!mpurilor de bi i% c!t &i datorit faptului c aplica iile care folo"e"c a"tfel de "tructuri de date au o portabilitate e(trem de redu" #organizarea memoriei depinz!nd de "i"temul de calcul$% "e recomand folo"irea c!mpurilor de bi i cu precau ie% doar n "itua iile n care "e face o economie "ub"tan ial de memorie'
77:
t%pedef struct{ double parte_real; double parte_imaginar; } LM7)LGN; LM7)LGN K" %;
7.5. UNIUNI
Aceea&i zon de memorie poate fi utilizat pentru p"trarea unor obiecte #date$ de diferite tipuri% prin declararea uniunilor' Uniunile "unt "imilare cu "tructurile% "ingura diferen con"t!nd n modul de memorare' *eclararea uniunilor+ union identificator_tip_uniune { lista de declaratii_membrii; } lista_identificatori_variabile; -pa iul de memorie alocat core"punde tipului membrului de dimen"iune ma(im' Tipul uniune folo"e&te aceea&i zon de memorie% care va con ine informa ii organizate n mai multe moduri% core"punztor tipurilor membrilor' Exemplu:
union numeric{ int i; float f; double d; } num; num'i + #$; num'f + O':$; cout,,sizeof&num*,,./n.; num'i num'f num'd
:2
?'C2 nu)
77C
.igura 7':' 0odul de alocare a memoriei pentru variabila num #uniune$ ) C octe i
Pentru variabile num "e rezerv C octe i de memorie% dimen"iunea ma(im a zonei de memorie alocate membrilor #pentru int ")ar fi rezervat : octe i% pentru float =% iar pentru double C$' 9n e(emplul anterior% n aceea&i zon de memorie "e p"treaz fie o valoare ntreag # num'i+#$$% fie o valoare real% dubl precizie #num'f+O':$$'
127
CAPITOLUL 7
*ac pentru definirea tipului numeric ")ar fi folo"it o "tructur% modul de alocare a memoriei ar fi fo"t cel din figura 7'3'
struct numeric{ int i; float f; double d; } num; num'i + #$; num'f + O':$; cout,,sizeof&num*,,./n.; num'd num'f num'i ?'C2 :2 nu)
771=
.igura 7'3' 0odul de alocare a memoriei pentru variabila num #"tructur$ ) 1= octe i
7.+. ENU.ER1RI
Tipul enumerare a"ociaz fiecrui identificator o con"atant ntreag' -inta(a declara iei+ enum identificator_tip_enumerare { identif_elem + const " ' ' ' } lista_identif_variabile; *in declara ie pot lip"i fie identificator_tip_enumerare% fie lista_identif_variabile' Pentru fiecare element al enumerrii% con"tanta poate fi a"ociat n mod e(plicit #ca n declara ia anterioar$% fie implicit' 9n modul implicit nu "e "pecific nici o con"tant% iar valoarea implicit e"te 2 pentru primul element% iar pentru re"tul elementelor% valoarea precedent incrementat cu 1' Dnumerrile "e folo"e"c n "itua iile n care variabilele pot avea un numr mic de valori ntregi% a"ociind un nume "uge"tiv pentru fiecare valoare' Exemplu: 771 enum boolean {<ELCG" IHFG}; 77definirea tipului boolean cu elementele .AL-D "i T8UD 77declaratie ec/ivalenta cu enum boolean {<ELCG+$" IHFG+ };
cout,,(<ELCG este (,,<ELCG,,./n.; 77.AL-D e"te 2
77:
t%pedef enum temperatura {mica+@ $" medie+ $" mare+:$}; 77tipul enumerare temperatura% cu elementele mica #de valoare )12$% medie #valoare 12$% mare
#valoare C2$
temperatura t " t#; t +medie; cout,,(t +(,,t ,,./n.;
Exerciiu: - "e citea"c #cu ajutorul unei func ii de citire$ urmtoarele informa ii de"pre elevii participan i la un concur" de admitere+ nume% numrul de n"criere &i cele trei note ob inute' - "e afi&eze% printr)o func ie% informa iile citite' - "e afi&eze o li"t cu elevii participan i la concur"% ordona i alfabetic% notele &i media ob inut #func ie de ordonare% func ie de calculare a mediei$' - "e afi&eze li"ta elevilor n"cri&i la concur"% n ordinea de"cre"ctoare a mediilor' -unt prezentate c!teva modalit i de implementare' 9n ace"te variante apar doar func ia cit_elev #de citire$ &i main' -)a definit tipul elev' -e lucreaz cu vectori de tip elev' 9n func ia cit_elev "e valideaz fiecare not' -e va ob"erva modul de acce" la membri "tructurii n func ia cit_elev' *ezavantajul principal al ace"tui mod de implementare l con"tituie ri"ipa de memorie% deoarece n func ia main "e rezerv o zon de memorie continu% pentru 122 de elemente de tip elev #1226"izeof#elev$$'
Ainclude ,iostream'h2 Ainclude ,conio'h2 t/pede0 struct ele&{ char nume[#$!;int nr_matr;int note[;!; }; 77definirea tipului elev &oid cit_ele&i'ele& a,-, int n( 12C
CAPITOLUL 7 Tipuri de date definite de utilizator {for &int i+$; i,n; i--*{ cout,,(0ume elev1(; cin22a,i-.nu)e; 77citirea numelui unui elev cout,,(0r' insriere1(; cin22a,i-.nr_)atr; for &int j+$; j,;; j--*{ 77 citirea notelor obtinute do{ cout,,(0ota 1(,,j- ,,( +(; cin22a,i-.note,j-; if &a[i!'note[j!,$ PP a[i!'note[j!2 $* 77validarea notei cout,,(0ota incorectaQ''''HepetaQ/n(; }Jhile &a[i!'note[j!,$ PP a[i!'note[j!2 $*; } } } void main&* { int nr_elevi; clrscr&*; cout,,(0r' elevi1(;cin22nr_elevi; ele& p,100-; 77declararea tabloului p% de tip elev cit_elevi&p" nr_elevi*; 77apel functie }
9n varianta urmtoare% "e lucreaz cu pointeri ctre tipul elev% iar memoria e"te alocat dinamic'
t/pede0 struct ele&{ char nume[#$!;int nr_matr;int note[;!; }; 77definirea tipului elev &oid cit_ele&i'ele& "a, int n( { for &int i+$; i,n; i--*{ cout,,(0ume elev1(; cin%%'a1i($%nu)e; 77"au cin%%'"'a1i((.nu)e; cout,,(0r' insriere1(; cin22&a1i($%nr_)atr; for &int j+$; j,;; j--*{ do{ cout,,(0ota 1(,,j- ,,( +(; cin22&a-i*@2note[j!; if &&a-i*@2note[j!,$ PP &a-i*@2note[j!2 $* cout,,(0ota incorectaQ''''HepetaQ/n(; }Jhile &&a-i*@2note[j!,$ PP &a-i*@2note[j!2 $*; } } } &oid )ain'( { int nr_elevi; clrscr&*; cout,,(0r' elevi1(;cin22nr_elevi; ele& "p; 77declararea pointerului p% ctre tipul elev p=ne+ ele&,nr_ele&i-; 77alocarea dinamic a memoriei% pentru un tablou cu nr_elevi elemente cit_elevi&p" nr_elevi*; 77apel functie }
CAPITOLUL 7
Tipuri de date definite de utilizator for &int j+$; j,;; j--*{ med -+&a-i*@2note[j!; med#-+&a-i- *@2note[j!;
CAPITOLUL 7
printf&( Epasa o tasta''''(*; getch&*; } &oid )ain'( { int nr_elevi; clrscr&*; cout,,(0r' elevi1(;cin22nr_elevi; elev >p; p+neJ elev[nr_elevi!; cit_elevi&p" nr_elevi*; afis_elev&p" nr_elevi" .E.*;RRafisarea inscrisilor ord_medii&p" nr_elevi*; afis_elev&p" nr_elevi" .H.*;RRafisarea in ordinea mediilor ord_alf&p" nr_elevi*; RRordonare alfabetica afis_elev&p" nr_elevi" .M.*;RRafisarea in ordinea mediilor }
descrescatoare descrescatoare
a a
-)au implementet urmtoarele func ii+ cit_elevi ) cite&te informa iile de"pre elevii n"cri&i' afis_elevi ) afi&eaz informa iile de"pre elevi' Acea"t func ie e"te folo"it pentru cele trei afi&ri #li"ta n"cri&ilor% li"ta alfabetic &i cla"amentul n ordinea de"cre"ctoare a mediilor$' Afi&area "e realizeaz cu ajutorul func iei printf% care permite formatarea datelor afi&ate' Afi&area "e realizeaz ecran cu ecran #"e folo"e&te variabila lin care contorizeaz numrul de linii afi&ate$% cu pauz dup fiecare ecran' La nceputul fiecrei pagini "e afi&eaz titlul li"tei ) core"punztor caracterului tran"mi" ca parametru func iei ) &i capul de tabel' *ea"emenea% pentru fiecare elev n"cri" "e calculeaz media ob inut #variabila med$' ord_medii ) ordoneaz vectorul de elevi #tran"mi" ca parametru% pointer la tipul elev$% de"cre"ctor% dup medii' -e aplic metoda Gubble-ort% compar!ndu)"e mediile elementelor vecine # med reprezint media elementului de indice i% iar med# ) a celui de indice i- $ ale vectorului' ord_alf ) ordoneaz vectorul de elevi #tran"mi" ca parametru% pointer la tipul elev$% cre"ctor% dup informa ia con inut de membrul nume' Pentru compararea numelor "e folo"e&te func ia strcmp' *eoarece e"te foarte probabil ca vectorul n"cri&ilor " aib multe elemente% pentru ordonri% ar fi fo"t mai eficient metoda TuicUCort, ")a folo"it Gubble-ort pentru a nu complica prea mult problema'
'5e6tiuni pra ti e
1' :' 3' a$ - "e implementeze programele cu e(emplele prezentate' - "e "crie programele pentru e(erci iile rezolvate care au fo"t prezentate' 8ealiza i urmtoarele modificri la e(erci iul prezentat la "f!r&itul capitolului+ Completa i cu o func ie de calcul &i afi&are a mediei notelor tuturor candida ilor pentru fiecare prob #media tuturor elevilor la proba1% media la proba:% etc$' b$ 0odifica i li"ta alfabetic% a"tfel nc!t la elevii cu medie pe"te ?% " apar #alturi de medie$ me"ajul JPromovatJ% iar la ceilal i% me"ajul JBepromovatJ'
111
CAPITOLUL 7
c$ Con"ider!nd c rezultatelor ob inute "unt utilizate la un concur" de admitere% la care e(i"t B locuri #B introdu" de la ta"tatur$% &i de faptul c pentru a fi admi" media trebuie " fie cel pu in ?% " "e afi&eze li"ta admi&ilor &i li"ta re"pin&ilor% n ordinea de"cre"ctoare a mediilor% n limita locurilor di"ponibile' :' - "e "crie un program care " permit memorarea datelor privitoare la angaja ii unei firme mici+ nume angajat% adre"% numr copii% "e(% data na&terii% data angajrii% calificare% "alariul brut' -e vor implementa urmtoarele func ii+ a$ Citirea informa iilor de"pre cei B angaja i #B introdu" de la ta"tatur$, b$ Cutarea ) dup nume ) a unui angajat &i afi&area informa iilor de"pre ace"ta, c$ 0odificarea informa iilor de"pre un anumit angajat, d$ Li"ta alfabetic a angaja ilor% n care vor apare+ nume% adre"% data angajrii% calificare% "alariu, e$ Li"ta angaja ilor n ordone de"cre"ctoare a vec/imii, f$ Li"ta angajatilor cu un anumit numar de copii% C% introdu" de la ta"tatur, g$ Li"ta angaja ilor cu v!r"ta mai mare dec!t 4 #4 introdu" de la ta"tatur$, /$ -alariul minim% "alariul mediu &i cel ma(im din firm, i$ Li"ta de "alarii% n care vor apare+ numele% calificarea% "alariul brut &i "alariul net' La "f!r&itul li"tei vor apare totalurile pentru "alariile brute% impozite% "alarii nete' Pentru calculul "alariului net "e aplic urmtoarele reguli de impozitare+ i'1$ I=15% pentru "alariul brut #-G$KA22222 i':$ I=50000 !0% pentru A22222KE-GK1?22222 #:2L din ceea ce dep&e&te A22222$ i'3$ I=100000 "0% pentru 1?22222KE-GK3222222 i'=$ I=!50000 #0% pentru 3222222KE-GK1?222222 i'?$ I=#5% pentru -GME1?22222
11: