Lab1.bC++
Transcript of Lab1.bC++
-
7/24/2019 Lab1.bC++
1/10
Ministerul Educatiei Republicii MoldovaUniversitatea Tehnica a Moldovei
Facultatea Calculatoare Informatic i MicroelectronicCatedra Automatica si Tehnologii Informationale
RA!RT"isciplina# rogramarea in limba$ul C%%
&ucrare de laborator 'r()
Tema# *tructura + mecanism de abstracti,are
A efectuat #
A verificat#
Chisinau -.)/
-
7/24/2019 Lab1.bC++
2/10
Scopul lucrrii:
)( *tudierea programrii prin abstracti,area datelor0-( *tudierea regulilor de definire i utili,are a structurilor de date01( Crearea variabilelor de tip structur2 accesarea componentelor unei structuri(
Sarcina:
3arianta )
b4 * se cree,e tipul abstract de date 5structura4 + vector2 care se compune dintr6unpointer spre int i din numrul de elemente( * se defineasc func7iile de ini7iali,are2 de eliminarea unui vector0 de setare8 modificare a dimensiunii vectorului0 de acces la elementele vectorului0de calcul a modulului unui vector(9n func7ia main s se reali,e,e adunarea a doi vectori(
Noiuni teoretice*tructura + este o mul7ime de date grupate2 conform unei ierarhii2 de obicei de tipuri diferite(
*tructura poate fi comparat cu tabloul2 :ns tabloul con7ine date de un acelai tip2 iar elementele tablouluise accesea, cu a$utorul indicilor2 pe c:nd accesarea componentelor structurii are o form specific(
*tructura repre,int un tip abstract de date2 un tip definit de utili,ator prin utili,area tipurilor de$ae;istente(
&a stabilirea i implementarea conceptelor necesare re,olvrii unei probleme se reali,ea, un procesde abstracti,are care privete repre,entarea datelor i prelucrarea acestora( Aceasta $ustific termenul de
programare prin abstractizarea datelor(Fie defini7ia de structur#
struct Book{
// definirea elementelor structurii
char *author;
char *title;
int year;
int pages;
};
:naintea cuv:ntului cheiestruct uneori se adaugcuv:ntul cheietypedef( 9ns aceast sinta; este proprie limba$ului C2 i nu C%%( Elementele structurii pot fi de tip
predefinit sau definit de utili,ator2 e;cep7ie fiind tipul structurii date( entru definirea variabilelor estesuficient utili,area numelui de structur la fel ca tipurile predefinite#
Book b1, b2, bs[1!, *bptr;
9n acest ca, s6au definit dou variabile de tip carte2 un tablou din ). cr7i i un pointer spre carte(Referirea la componentele unei structuri se face utili,:nd at:t numele structurii c:t i a componentei
respective( Aceasta se reali,ea, printr6o construc7ie de forma#
b1"pages # 1$%;
bs[i!"pages # 2&;
9n ca,ul pointerilor#
-
7/24/2019 Lab1.bC++
3/10
bptr # ne' Book; // alocarea memoriei pentru o (ariabil) nou)
bptr+pages # 1-;
"ac structura con7ine componente de tip compus2 referirea elementelor este urmtoarea#
.ircle1".enter" # 2;
.ircle1".enter"y # 1;
Fie defini7ia de structur#
struct 0ate{
int day, month, year;
};
struct tudent{
char *name;
0ate birth0ay;
float media;
};
&a definirea tipului de strutur este bine de a preci,a func7iile care definesc opera7ii cu datele de tipulstructurii( 9n acest scop variabilele se transmit func7iilor prin parametri( entru modificarea variabilei ea setransmite prin referin7(
(oid setalues3tudent* sptr, char* ne'4,float ne'5,0ate d6
{
sptr+name # ne' char[strlen3ne'4671!;
strcpy3sptr+name,ne'46;
sptr+media # ne'5;
sptr+birth0ay # d;}
Func7ia de mai sus are un nea$uns legat de alocarea memoriei( "eoarece func7ia este obinuit2 eapoate fi apelat de c:teva ori2 ceea ce poate duce la pierderi de memorie( entru solu7ionarea acesteiprobleme2 mai :nt:i trebuie de,alocat memoria ini7ial 5sau s se :nregistre,e posibilitatea unui singurapel al func7iei2 ceea ce se reflect :n denumirea func7iei4(
(oid setalues3tudent* sptr, char* ne'4,float ne'5,0ate d6
{
delete[! sptr+name;
sptr+name # ne' char[strlen3ne'4671!;
"""
}
"ar i aceast solu7ie are nea$unsurile sale2 posibil mai grave dec:t :n primul ca,( ericolul const :n:ncercarea de a elimina memoria nealocat la primul apel al func7iei( ot fi c:teva solu7ii( Una const :nutili,area unui parametru suplimentar2 fie cu valoare implicit2 care indic dac func7ia se apelea, pentru
prima dat5pentru obiectul dat4 sau nu( Aceast variant nu este tocmai reuit2 este necesar de a urmrisuccesiunea apelurilor2 sarcin reali,at de ctre programator2 :n al doilea r:nd2 func7ia trebuie s con7in ocondi7ie ceea ce :ncetinete :ndeplinirea func7iei(
Alt solu7ie ar fi :n setarea valorii ini7iale a pointerului( 9n acest scop2 dup crearea obiectului2
componentelor pointer li se atribuie valoarea 'U&&0
Book b;
-
7/24/2019 Lab1.bC++
4/10
b"author # 4899;
set:uthor3b,
-
7/24/2019 Lab1.bC++
5/10
4Functiade modificare a dimensiunii
Concluzie:
Efectu:nd aceast lucrare de laborator2 am :nv at cum s fac alocarea memoriei cu a$utoruloperatorului ?ne@( "easemenea2 am lucrat cu o structur i cu c:mpurile ei2 deasemenea amreali,at anumite operatii cu datele acestei structure( Mi6a placut mult sa lucre, la aceasta lucrare delaborator2 deoarece am aflat multe lucruri noi 2 cu a$utorul carora mi6am imbogatit cunostintele sicapacitatile de a lucre cu limba$ul C%%(
Bibliografie:
)( 'otatiile de la curs0-( rogramare2repre,entarea algoritmilor si limba$ul Turbo C%%0 Anexa A
-
7/24/2019 Lab1.bC++
6/10
Listing de program:
8Bb4* se cree,e tipul abstract de date 5structura4 + vector2care se compune dintr6un pointer spre int i din numrul de elemente(* se defineasc func7iile de ini7iali,are2 de eliminare a unui vector0
de setare8 modificare a dimensiunii vectorului0 de acces la elementele vectorului0de calcul a modulului unui vector( 9n func7ia main s se reali,e,e adunarea a doi vectori( B8
include DFunction )(hDint main54 meniu# sstem5DclsD40 cout GG DHn)JInitiali,area vectorilorHnD0 cout GG DHn-JAfisarea vectorilorHnD0 cout GG DHn1J*tergerea unui vectorHnD0 cout GG DHn/JModificarea dimensiunii unui vectorHnD0 cout GG DHnJAdunarea a doi vectoriHnHnKKD0
int b0cin KKb0s@itch 5b4
case )# sstem5DclsD40 Initial540 goto meniu0 breaL0
case -# sstem5DclsD40
sho@540
getch540 goto meniu0 breaL0 case 1# sstem5DclsD40 del5nvect40 getch540 goto meniu0 breaL0 case /#
-
7/24/2019 Lab1.bC++
7/10
sstem5DclsD40 change5nvect40 getch540 goto meniu0 breaL0
case # sstem5DclsD40 int n2m0 cout GG DCare vectori doriti sa adunati #D0 cout GG DHnIntroduceti primul vector #D0 cin KK n0 cout GG DHnIntroduceti al doilea vector #D0
cin KK m0 suma5n2m40 getch540 goto meniu0 breaL0 default # sstem5DclsD40 cout GG D!ptiunea introdusa este gresita(D0 getch540
goto meniu0
return .0
88Functia )(h
include GcstdioKinclude GcstdlibKinclude GiostreamKinclude GcmathK
-
7/24/2019 Lab1.bC++
8/10
include Gconio(hKinclude GcstringKusing namespace std0
struct vector
int B point0int numar0
0vector v
-
7/24/2019 Lab1.bC++
9/10
cin KK vdel0 for 5iNvdel6)0iGnvect0i%%4 viJNvi%)J0 vnvect66J0
88Functia de moduficare a dimensiunei unui vectorvoid change 5int nvect4
int n2i2l0 cout GGDIntroduceti vectoru care doriti sa modificati D0 cin KK n0 nNn6)0 if5nKnvect4cout GG D3ectorul introdus nu e;istaD0 else cout GG DHnIntroduceti lungimea vectorului #D0 cin KK l0 vnJ(numarNl0
void acces54 int n2e2i2$0
cout GG DElementul carui vector doriti sa accesati QHnKKD0 cin KK n0 cout GG DCare element doriti sa accesati QHnKKD0 cin KK e0 cout GG DElementul dorit este #D0 cout GG DElementul # DGG vn6)J(pointe6)JGGDJD0 cout GGendl0
int modul54
int n2i0 double mN)0 cout GG DModulul carui vector doriti sa aflati #D0 cin KK n0 nNn6)0 for5iN.0iGvnJ(numar0i%%4 m%NvnJ(pointiJBvnJ(pointiJ0 mNsrt5m40 cout GG DHnModulul este #DGGm0
-
7/24/2019 Lab1.bC++
10/10
void suma5int n2int m4 nNn6)0 mNm6)0 int i2$0
if 5vnJ(numarKvmJ(numar4v-.J(numar N vnJ(numar0 else v-.J(numar N vmJ(numar0 v-.J(point N ne@ intv-.J(numarJ0
for5iN.0iGv-.J(numar0i%%4
v-.J(pointiJNvnJ(pointiJ%vmJ(pointiJ0 cout GG D3ectorul suma este #D0for5$N.0$Gv-.J(numar0$%%4 coutGGDO DGGv-.J(point$J0 cout GGDODGGendl0