Download - Introducere in c++

Transcript
Page 1: Introducere in c++

Introducere in programare

Page 2: Introducere in c++

&$3,72/8/��

���,QWURGXFHUH�

&DOFXODWRDUHOH� HOmecanice de calculat a

- 3DVFDO������±�UHD- /HLEQLW]������±�U- %DEEDJH������±�P

&KLDU� úL� vQ� DFHVPRGHUQH� SRW� IL� J�VLWH��variabilele aflate în cu ea de UHJLVWUX� DFXPXODWRU�� &DDSDUDW� DEVWUDFW� FDUH� SRWHRUHWLF��D�IRVW�LQWURGXV�

&D� úL� vQ� FD]XO�Prespecte acest modelposibil deoarece se dGHFRGDUHD�FRGXOXL�(QLJP

Primul program�������FRPSXWHUHOH�úL�LPQRWRULHWDWH�GHFODUD LD�OXLYUHR�GDW��QHYRLH�GH�PDL�

ÌQ� DQLL� ¶��� D� DS,QWHJUDWLRQ�� FD� WHKQLF��OXFUX� D� FRQGXV� OD� FUHúWHSXWHDX�SHUPLWH�V��OH�DFK

3HULRDGD��������EL L�� FDUH� GHúL� HUDX� VFXVLVWHPXOXL�GH�FDOFXO�� ÌQ�,�����FDUH�SRDWH�IL�FRQVLD�vQFHSXW�V��ILH�GH]YROWDHGLWRDUH�GH�WH[WH��SURJUD

7RW� vQ� DFHDVW��GH]YROWDUHD�VLVWHPHORU�G

6LVWHPXO� GH� RSHUPDúLQ�� D�XQXL�PLFURNHUSHULIHULFHORU�FDUH�vQFHSX

'LQ� ����� SkQ�� vDUKLWHFWXUL�GLQ�FH�vQ�FH�PPXOW�úL�vQ�DOWH�GRPHQLL�1X�HVWH�GH�QHJOLMDW�QLFL�active ale ecranului. sistemului de operare

Introducere in programare HFWURQLFH� DX� DS�UXW� vQ� MXUXO� DQXOXL� ������ 7RWXúL� XQHOH� PDúLQLu fost propuse anterior:

OL]D�QXPDL�DGXQDUH�úL�VF�GHUHHDOL]D�úL�vQPXO LUHDúLQ��DQDOLWLF�

WH� DSDUDWH� SULPLWLYH� XQHOH� GLQ� FRPSRQHQWHOH� XQXL� DUKLWHFWXUL'H� H[HPSOX� XQ� UHJLVWUX� WHPSRUDU� GH� PHPRULH� FDUH� PHQ LQHrs de procesare. Acest registru este cunoscut sub denumirOFXODWRDUHOH� HOHFWURQLFH� DX� IRVW� LQL LDO� SURSXVH� VXE� IRUPD� XQXLDWH� UHDOL]D� VDX� VLPXOD� RULFH� WLS� GH� PDúLQ�� PHFDQLF��� )RUPD�GH�Alan Turing pe la mijlocul anului 1930. XOWRU� DOWH� WHKQRORJLL�� GH]YROWDUHD� SUDFWLF�� D� XQHL�PDúLQL� FDUH� V�

, a fost LQIOHQ DW�� GH� DO� GRLOHD� U�]ERL� PRQGLDO�� $FHVW� OXFUX� D� IRVWorea calcularea traiectoriilor de rachete (&ROORVXV� úL� Eniac) sau D�IRORVLW�GH�*HUPDQLD�SHQWUX�SURWHF LD�PHVDMHORU�

stocat electronic a fost folosit în 1948. În primii ani de dezvoltare SDFWXO�ORU�XOWHULRU�vQ�YLD D�XPDQ���DX�IRVW�PXOW�VXEHYDOXDWH��(�GH�Bill *DWHV��IRQGDWRUXO�0LFURVRIW�FXP�F��QX�YHGH�FXP�DU�SXWHD�ILPXOW�GH�����Ko RAM. �UXW� SDVWLOD� GH� VLOLFLX� úL� WHKQRORJLD� 9/6,� �Very large Scale GH� SURGXF LH� IDSW� FH� DGXV� OD� FRPSXWHUH� LHIWLQH� úL� UDSLGH�� $FHVWUHD� úL� GLYHUVLILFDUHD� UDSLG�� D� FDWHJRULLORU� GH� XWLOL]DWRUL� FDUH� �úLL]L LRQH]H���� FDUH�HVWH� FDUDFWHUL]DW��GH�SULQ� DSDUL LD�microsistemelor pe 8 PSH� SHUPLWHDX� DFFHVXO� VHSDUDW� GH� PDLQ�IUDPH� OD� SRVLELOLW� LOHDFHDVW��SHULRDG��HVWH�GHPQ��GH� UHPDUFDW�DSDUL LD� vQ������ �D� OXLGHUDW��XQ�SXQFW�GH�UHIHULQ ��vQ�GRPHQLX��'LQ�DFHVW�PRPHQW�VRIWXOW�QX�QXPDL�SHQWUX�FDOFXOH�H[WUHP�GH�FRPSOH[H�FL�úL�SHQWUX�MRFXUL�PH�GH�ED]H�GH�GDWH�úL�DOWH�IDFLOLW� L�FHUXWH�GH�SLD ��SHULRDG��� IRU DW�� úL� GH� UXSHUHD� GH� PDLQ�IUDPH�� D� SRUQLW� úLH�RSHUDUH��ORFDOH��&30�úL�DSRL�'26�DUH�06�'26� D� IRVW� UHDOL]DW� SULQ� DGDSWDUHD� OD� QRLOH� LQVWUXF LXQLQHO�GH�81,;� OD� FDUH� V�DX� DG�XJDW� IXQF LLOH� QHFHVDUH� FRQWUROXOXLVHU��V��ILH�DWDúDWH�FDOFXODWRDUHORU�SHUVRQDOH�Q� ������ GHúL� vQF�� IRDUWH� VFXPSH�� DX� vQFHSXW� V�� DSDU�� SH� SLD �DL�SXWHUQLFH�SH��������EL L�LDU�DULD�ORU�GH�IRORVLUH�V�D�H[WLQV�IRDUWH

LPSDFWXO�SURGXV�GH�LQWHUIH HOH�YL]XDOH�úL�GH�FRQWURDOHOH�SULQ�]RQHAceste controale care sunt activate din PRXVH� sunt caracteristice WINDOWS.

1

Page 3: Introducere in c++

Introducere in programare

7RW� vQ� DFHDVW�� SHULRDG��� GLQ� UD LXQL� HFRQRPLFH� úL� SUDFWLFH�� V�D� SURGXV� GLVSDUL LDPLFURFDOFXODWRDUHORU�DFHVWHD�ILLQG�PXOW�GHS�úLWH�GH�FHULQ HOH�SLH LL�

'LQ� ����� VH� SRDWH� VSXQH� F�� V�D� LQWUDW� vQWU�R� QRX�� HU�� vQ� DFHVW� GRPHQLX� SULQLHIWLQLUHD�GUDPDWLF��D�KDUGZDUH�XOXL�úL�DSDUL LD�UH HOHORU�GH�FDOFXODWRDUH�

2�GDW��FX�LHIWLQLrea arhitecturilor de calcul s-a putut GLYHVULILFD�úL�PDL�PXOW�DULD�GHXWLOL]DUH�D�ORU��$FHVW�OXFUX�D�DYXW�FD�UH]XOWDW�R�FUHúWHUH�D�SUH XOXL�VRIWXOXL�

&RQFHSWXO�GH�UH HD�SHUPLWHD�WUDQVIHUXUL�UDSLGH�GH�GDWH���D�F�URU�FDQWLWDWH�D�vQFHSXWV��ILH�GLQ�FH�vQ�FH�PDL�PDUH�

,QL LDO� PDMRULWDWHD� UH HOHORU� GH� FDOFXODWRDUH� HUDX� �vQFKLVH� �� vQ� VHQVXO� F�� QXFRPXQLFDX� vQWUH� HOH�� $SRL� vQ� XOWLPD� SHULRDG�� WHUPHQXO� GH� VLVWHP� �GHVFKLV�� FDS�W�� GLQSXQFW�GH�YHGHUH�SUDFWLF�R�U�VSkQGLUH�GLQ�FH�vQ�FH�PDL�PDUH�OD�QLYHO�JOREDO��'LQ�DFHVW�SXQFWGH�YHGHUH�UH HOH�GH�WLS��Arpanet , Internet ú�D�P�G�VXQW�UHSUH]HQWDWLYH�

ÌQ�XOWLPLL�DQL�vQVXúL�FRQFHSWXO�GH�WUDQVPLVLH�GH�LQIRUPD LH�LQWHUXPDQ�� WLQGH�V��VHVFKLPEH��7HOHYL]LXQHD�GLJLWDO��HVWH�GHMD�LPSOHPHQWDW����LDU�SUH XO�SHULIHULFHORU�GHGLFDWH�DVF�]XW�H[WUDRUGLQDU�DVWIHO� vQFkW�VH�SUHFRQL]HD]��GH]YROWDUHD�FDOFXODWRUXOXL�DVWIHO� vQFkW� HOV��QX�PDL�ILH�VWULFW�RULHQWDW�VSUH�DSOLFD LL�GHGLFDWH�FL�V��ILH�R�OHJ�WXU��GLQDPLF��GH�RULFH�WLS(audio, video, teleworking) a individului cu societatea.

9RP�SUH]HQWD�FkWHYD�GLQ�DSOLFD LLOH�PDL�FXQRVFXWH�DOH�FDOFXODWRDUHORU�vQ�GLYHUVH�GRPHQLL�

- ,QGXVWULH��FRQWURO�úL�DXWRPDWL]DUH�Æ microcontrolere, CAM (Computer Aided Manufactory);

- Economie: gestiune, transferul banilor, "banii electronici" . - 0HGLFLQ���GLDJQR]��DXWRPDW���FHUFHWDUHD�HOHFWURQLF��OD�GLYHUVH�QLYHOH�DOH�

RUJDQLVPXOXL�XPDQ��DQDOL]D�FRGXOXL�JHQHWLF��GLDJQR]��DXWRPDW���UH HOH�QHXUDOH�VWD LL�JUDILFH��VLVWHPH�H[SHUW�

- 3LFWXU��� QRL� UDPXUL� DOH� SLFWXULL� IRORVLQG� FRPSXWHUXO�� UHVWDXUDUH�� KRORJUDILH� UH HOHneurale, procesoare analogice.

- 0X]LF�� úL� WHOHYL]LXQH�� SUHOXFU�UL� GH� LPDJLQL� úL� VXQHWH� SUDFWLF� GH� RULFH� QDWXU��ÆSURFHVRDUH�DQDORJLFH��VWD LL�JUDILFH��DUKLWHFWXUL�00;��

- Proiectare : programele de tip CAD (Computer Aided Design)

Se mai pot da exemple în mulWH�GRPHQLL�� vQV��HVWH�FHUW�F�� OD�RUD�DFWXDO��YLD D�úLVRFLHWDWHD�XPDQ��QX�PDL�SRW�IL�FRQFHSXWH�I�U��FDOFXODWRU�

2

Page 4: Introducere in c++

Introducere in programare

�����3URJUDPDUHD�úL�OLPEDMH�GH�SURJUDPDUH�

Prin SURJUDPDUH�VH�vQ HOHJH�vQ�PRG�JHQHULF�WUDQVSXQHUHD�XQRU�RSHUD LL�UHSHWLWLYH�DVXSUD� XQXL� VHW� GH� GDWH�� vQWU�XQ� OLPEDM� LQWHOLJLELO� GH� F�WUH� XQ� VLVWHP� GH� FDOFXO� FDUHXUPHD]��XOWHULRU�V��OH�H[HFXWH��$FHVW�OXFUX�HVWH�UHDOL]DW�vQ�GRX��HWDSH

- HWDS�� vQ� FDUH� HVWH� LPSOLFDW� RPXO� úL� DQXPH� FHD� GH� WUHFHUH� GH� OD� SUREOHPD� UHDO�� ODtranspunerea într-un limbaj de programare.

- R� D� GRXD� HWDS��� DXWRPDW��� FDUH� WUDQVSXQH� FRGXO��VXUV��� vQúLUXLUHD� GH� LQVWUXF LXQLspecifice limbajului respectiv�� într-un FRG�GLUHFW�H[HFXWDELO��� inteligibil sistemului GH�FDOFXO��OXFUX�GH�FDUH�VH�RFXS��SURJUDPH�VSHFLDOL]DWH�QXPLWH�FRPSLODWRDUH.

5ROXO��SURJUDP�ULL� HVWH� FD� ILH� GDW�� R� DQXPLW�� RSHUD LXQH� VDX� VXLW�� GH� RSHUD LXQLUHSHWLWLY��H�� FDUH� VH� DSOLF�� DVXSUD� XQRU� VHWXUL� GH� GDWH� PHUHX� GLIHULWH� V�� ILH� VFULV� XQSURJUDP� FDUH� V�� FHDU�� VHWXO� GH� GDWH� GH��LQWUDUH�FHOH� FDUH� WUHEXLH� V�� ILH� SUHOXFUDWH�� V�H[HFXWH� DVXSUD� ORU� VXLWD� VWDQGDUG� GH� RSHUD LXQL� úL� V�� OLYUH]H� GDWHOH��GH��LHúLUH�� DGLF�rezultatele).

ÌQ� DFHVWH� FRQGL LL� SURJUDPXO� WUHEXLH� V�� ILH� FRPSXV� GLQ� PDL� PXOWH� LQVWUXF LXQL�� ÌQprimul rând cele care UH]HUY���GHFODU��R�]RQ��GH�PHPRULH�FD�ILLQG�VSHFLDO�GHGLFDW��QXPDLSHQWUX�DQXPLWH�GDWH���R�]RQ��GH�PHPRULH�vQ�FDUH�VH�YRU�FLWL�GDWHOH�GH�LQWUDUH��R�]RQ��GHPHPRULH�vQ�FDUH�VH�YRU�S�VWUD�GDWHOH�LQWHUPHGLDUH�(cele care apar în decursul calculelor GDU�GH�FDUH�XWLOL]DWRUXO�QX�DUH�QHYRLH��úL�GH�DVHPHQL�SH�FHOH�GH�LHúLUH��3URJUDPXO�WUHEXLHV��FRQ LQ��LQVWUXF LXQL�FDUH�V��FLWHDVF��GH�OD�XWLOL]DWRU�GDWHOH�GH�LQWUDUH��XUPDWH�vQ�VIkUúLWGH� LQVWUXF LXQLOH� GH� FDOFXO� SURSULX� ]LV� FD� vQ� ILQDO� V�� FRQ LQ�� LQVWUXF LXQLOH� GH� DILúDUH� DUH]XOWDWHORU��GDWHOH�GH�LHúLUH�

����$UKLWHFWXUD�XQXL�VLVWHP�GH�FDOFXO�

Ca REVHUYD LH� de ED]�: un sistem de calcul este pur úL simplu versiunea mult GH]YROWDW� a unui calculator de buzunar úL deci nu trebuie V� ne DúWHSW�P de la el ca vreo GDW� V� IDF� altceva decât l-a pus cineva, un programator prin intermediul unui program, V� IDF�. “,QWHOLJHQ D´�DSDUHQW��a unui sistem de calcul provine din cantitatea de LQWHOLJHQ �XPDQ��LQYHVWLW��în respectivul program aflat în H[HFX LH�

Hilar, am putea spune F�� omul vQFHDUF�� V�� ³IDF�� pe cineva GXS�� chipul úLDVHP�QDUHD� lui” dar rezultatul este o copie SDOLG�� FDUH�altfel este extrem de XWLO���Din aceste lucruri GHULY� vestitul principiu de aur al primilor programatori GIGO (Garbage In Garbage Out), care într-o traducere SUR]DLF� vQVHDPQ�: “gunoi bagi gunoi VFR L” úL care are meritul, în DIDU� de cel umoristic, de a atrage DWHQ LD oricui care se va apuca de programare F� din nefericire calculatorul face numai ce i se LQGLF� prin diverse metode V�IDF�. De aici UH]XOW�� R� SULP�� DWHQ LRQDUH� YDODELO�� aprope tot timpul în cazul GHSDQ�ULL(H[HFX LHL�SDV�FX�SDV�în scopul J�VLULL�eventualelor defecte în IXQF LRQDUH��unui SURJUDP���&$87�� Ì17Æ,�(52$5($�7$�'(�352*5$0$725�ù,�$32,�'��9,1$PE CALCULATOR.

Desigur H[LVW��un procent cam de 5% din VLWXD LL�în care un program scris corect este executat JUHúLW�� lucru care apare ca rezultat al LQWHUIHUHQ HL� unor programe neautorizate, cum ar fi YLUXúLL�� FX�programul aflat în H[HFX LH�� În cazul în care nu este

3

Page 5: Introducere in c++

Introducere in programare

valabil acest lucru problema este mai FRPSOH[��putând fi implicate GHIHF LXQL�aleatorii ale S�U LL� KDUGZDUH��Oricum ar fi aceste lucruri LQWU�� în sfera de DF LXQH�a unui inginer de sistem, úL�deci nu sunt luate aprioric în FRQVLGHUD LH�fiind de obicei rare.

Pentru a putea vQ HOHJH�arhitectura vom F�XWD�anumite analogii între un om úL�un sistem de calcul.

6�� DQDOL]�P�ce se vQWkPSO�� FX�un om în momentul în care vede o formulare de genul : 2*2=… .

'HúL�ni se pare ceva evident, cu WR LL�DP�vQY� DW�pe de rost tabla vQPXO LULL V�vQFHUF�P�acum o descompunere a SDúLORU�FDUH�sunt H[HFXWD L�În primul rând PHPRU�P� în memoria WHPSRUDU�� �sau de VFXUW��GXUDW���RSHUDQ]LL�datele asupra F�URUD�vom executa o RSHUD LXQH��apoi UHDOL]�P�RSHUD LXQHD�GH�vQPXO LUH�rezultând 4, care este SkQ��OD�comunicarea lui YHUEDO��sau prin scris tot în memoria WHPSRUDU���6HREVHUY��F��operanzii 2,2 úL�RSHUD LXQHD� �DX�fost preluate de pe un suport extern si anume cel scris, rezultatul putând fi UHWXUQDW�trimis F�WUH�HPL �WRUXO�unei cereri de lucru ���GXS�cum am spus tot pe DFHOúL�sistem extern de stocare.

$FHVW�H[HPSOX�QX�D�IRVW�GDW�I�U��XQ�VFRS�úL�DQXPH��UROXO�OXL�HVWH�SULQWUH�DOWHOH�GH�D

Y�� RELúQXL� FX� QLYHOXO� H[WUHP� GH� VF�]XW� OD� FDUH� VH� IDFH� DQDOL]D� úL� GHVFRPSXQHUHD� XQHL

SUREOHPH�UHDOH�vQ�PRPHQWXO�vQ�FDUH�GRUHVF�V��R�WUDQVSXQ�vQWU�XQ�OLPEDM�GH�SURJUDPDUH�

ùi acum V��DQDOL]�P�DUKLWHFWXUD�EORF�(structura IXQF LRQDO���D�unui sistem de calcul. 'XS�� FXP� VH� REVHUY�� GLQ� ILJ�� �� într-un sistem de calcul H[LVW��

ú

' LVSR]LWLY GH 0LFURSURFHVRU

VWRFDUH

+''�)''

0HPRULH ' LVSR]LWLY

7HPSRUDUm ,QWUDUH

5$0 ,H LUH

- un dispozitiv de stocare în PDV��� rolul caietului pe care scrim /citim în cazul nostru. Acest dispozitiv este materializat prin Hard Disk (HDD) F�UXLD� i se mai spune úL�suport fix de date úL�)ORSS\�'LVN(FDD) F�UXLD� i se mai spune úL� suport mobil de date .

)LJ����$UKLWHFWXUD�XQXL - o memorie WHPRUDU��� 5$0� �5DQGRPVLVWHP�GH�FDOFXO Acces Memory) care MRDF�� H[DFW� rolul

memoriei de VFXUW��GXUDW��umane. - dispozitive de Intrare sau de ,HúLUH�prin care sistemul SULPHúWH�sau UHWXUQHD]��GDWH�� În cazul unui sistem de calcul acestea sunt tastatura úL�PRXVH� FD�dispozitive de intrare úLmonitorul sau imprimanta ca dispozitive de LHúLUH�

A mai U�mas de O�PXULW�problema microprocesorului care este “inima” unui sistem de calcul úL� DUH� rolul de a coordona întregul sistem. Desigur F�� DFHDVW�� coordonare se UHDOL]HD]��WRW�prin intermediul unor programe care H[LVW��în ceea cea am putea numi, prin analogie cu omul, partea de reflexe FRQGL LRQDWH�� aceste programe se J�VHVF� într-o memorie ROM (Read Only Memory) deci nu pot fi decât citite.

����)XQF LRQDUHD�XQXL�VLVWHP�GH�FDOFXO�

Sistemul de calcul GXS��FXP�VH�REVHUY��FRPSRUW��destul similitudini cu omul la nivel de DUKLWHFWXU��úL�deasemeni, GXS��FXP�vom discuta, úL�OD�nivel de IXQF LRQDUH�

6��vedem cum se UHDOL]HD]���ELQHvQ HOHV�OD�nivel simplificat, H[HFX LD�unei formule de genul 2*2=… .

4

Page 6: Introducere in c++

Introducere in programare

Se FLWHúWH� GH� pe suportul de stocare programul care FRQ LQH� cererea QRDVWU��� VHvQFDUF�� în memoria WHPSRUDU�� �GH�acest lucru se RFXS��VLVWHPXO�GH�RSHUDUH�programul specializat care se RFXS�� GH� traducerea unor LQVWUXF LXQL� VLPSOH� úL� LQWXLWLYH� DOHutilizatorului în comenzi directe F�WUH�partea de H[HFX LH� D�sistemului�, în urma cererii noastre explicite de lansare a programului) úL� VH� începe H[HFX LD� lui de F�WUH� procesor H[HFX LH�FDUH�XUPHD]��aproximativ sistemul uman de gândire. Pe scurt modul de H[HFX LHla nivelul procesorului poate fi descris ca : • FLWHúWH�datele utile (din RAM în aceast caz) (2,2) • FLWHúWH�RSHUD LD�FDUH�trebuie H[HFXWDW��asupra datelor suspomenite(tot din RAM)(*) • H[HFXW��RSHUD LD��� � ��• returneaz��rezultatul (înnapoi în RAM)(4).

La nivelul sistemului de calcul modul de H[HFX LH�DUDW��FD�mai jos: • FLWHúWH�programul de executat (de pe sistemul de stocare fix/mobil) úL• vQFDUF��O�în RAM • H[HFXW��programul (din RAM) • la terminarea programului DúWHDSW��noua cerere de H[HFX LH

0HPRULD�7HPSRUDU��D�XQXL�VLVWHP�GH�FDOFXO�

'XS��FXP�DP�pomenit în primul capitol, una din componentele de ED]��DOH�unui sistem de calcul este memoria GLQDPLF��5$0�sau memoria WHPSRUDU��

$FHDVW��memorie a fost FRQFHSXW�� LQkQG�cont de faptul F��sistemul de QXPHUD LHfolosit în interiorul unui calculator este ED]�����'H�aici UH]XOW��F��orice fel de GDW��sau LQVWUXF LXQH�efectiv SURFHVDW��sau H[HFXWDW�� OD�nivelul PDúLQLL� trebuie V�� fie SDVWUDW��VXEforma ei ELQDU�� �deci FRUHVSXQ]�WRDUH�bazei 2). Întrucât în baza 2 nu H[LVW��decât dou�numere 0 úL� �� UH]XOW�� F��vom avea UHSUH]HQW�UL� VXE� IRUPD�unor úLUXUL� GH� �� úL� GH� ��� /Dnivelul PDúLQLL�materializarea HIHFWLY�� D� respectivelor numere este UHDOL]DW��� GH�obicei, prin DWDúDUHD� ORJLF�� D� lui “1” la o tensiune de 5 YRO L� iar lui “0” lipsei acestei tensiuni. 7RWXúL�indiferent de nivelul tehnologic este absolut nepractic ca V��FRQVLGHU�P�IL[���9�sau fix 0 V ca valori de FRPSDUD LH�pentru F��acest lucru ar fi dus la QLúWH�echipamente extrem de scumpe úL�GH�lente. Din aceasta FDX]��VH�FRQVLGHU��D�IL���sau 1 logic în jurul valorilor sus PHQ LRQDWH� FX� ±∆V. De aici a rezultat posibilitatea folosirii unui condensator ca element de memorare. Acest lucru este posibil deoarece în cazul unei UHvQF�UF�ULperiodice a acestuia se poate RE LHQH� FD� tensiunea la bornele lui V�� varieze în limitele necesare QRX��GDF�� fac suficient de repede DFHDVW�� UHvQF�UFDUH�� În aceste FRQGL LL foarte simplist putem vedea o memorie GLQDPLF� ca o matrice LPHQV� de condensatoare care pot fi vQF�UFDWH�sau GHVF�UFDWH�în cursul RSHUD LXQLORU�GH�scriere/citire.

Aici mai apare o SUREOHP��úL�anume QXP�UXO�GH�EL L�FDUH�compun datele utile de calcul (ELW��unitate LQIRUPD LRQDO�� FRUHVSXQ]�WRDUH� H[LVWHQ HL� sau a unei tensiuni la intrarea unui dispozitiv digital) care pot fi SURFHVD L�OD�un moment dat de un procesor.

Întrucât memoria RAM este cea care IXUQL]HD]� respectivele date era logic ca ea V� fie RUJDQL]DW� în diviziuni de o P�ULPH HJDO� cu cea a QXP�UXOXL de EL L sus PHQ LRQD L. Aceste JUXS�UL se numesc ORFD LL�GH�PHPRULH�úL pot fi considerate ca minima unitate care poate fi VFULV� sau FLWLW� dintr-o memorie. O GDW�� O�PXULW� acest aspect devine clar F�pentru a P�� putea referi la una sau alta din ORFD LL� trebuie V�� existe o PHWRG�� GHindividualizare VWULFW���6�D�DOHV�cea mai VLPSO��FX�SXWLQ ��úL�anume numerotarea lor QXP�UXO�ORFD LHL�numindu-se DGUHVD�ORFD LHL.

5

Page 7: Introducere in c++

Introducere in programare

�����1R LXQHD�GH�DOJRULWP�

ÌQ�SURFHVXO�GH�UH]ROYDUH�D�XQHL�SUREOHPH�IRORVLQG�FDOFXODWRUXO�H[LVW��GRX��ID]H�

- GHILQLUHD�úL�DQDOL]D�SUREOHPHL�- SURLHFWDUHD�úL�LPSOHPHQWDUHD�XQXL�DOJRULWP�FDUH�UH]ROY��SUREOHPD�

'HILQLUHD�úL�DQDOL]D�SUREOHPHL��SRDWH�IL�OD�UkQGXO�HL�GHVFRPSXV��vQ�- specificarea datelor de intrare; - VSHFLILFDUHD�GDWHORU�GH�LHúLUH�

6SHFLILFDUHD�GDWHORU�GH�LQWUDUH�FRQVW��vQ�

1. Ce date vor fi primite la intrare; 2. Care este formatul (forma lor de reprezentare) a datelor de intrare; 3. Care sunt valorile permise sau nepermise pentru datele de intrare; 4. ([LVW��XQHOH�UHVWULF LL��DOWHOH�GHFkW�OD����SULYLQG�YDORULOH�GH�LQWUDUH�5. &kWH�YDORUL�YRU� IL� OD� LQWUDUH�� VDX�GDF�� QX� VH�SRDWH� VSHFLILFD�XQ�QXP�U� IL[�GH�YDORUL�

FXP�VH�YD�úWL�FkQG�V�DX�WHUPLQDW�GH�LQWURGXV�GDWHOH�GH�LQWUDUH�

6SHFLILFDUHD�GDWHORU�GH�LHúLUH�WUHEXLH�V�� LQ��FRQW�GH�XUP�WRDUHOH�DVSHFWH�

1. &DUH�GLQ�YDORULOH�UH]XOWDWH�vQ�FXUVXO�DSOLF�ULL�DOJRULWPXOXL�GH�FDOFXO��DVXSUD�GDWHORU�GHLQWUDUH��YRU�IL�DILúDWH��QHFHVDUH�XWLOL]DWRUXOXL��� ÌQ�DFHVW�SDV�VH�IDFH�GLIHUHQ LHUHD�FODU�vQWUH�GDWH�LQWHUPHGLDUH�úL�GDWH�GH�LHúLUH�

2. &DUH�YD�IL�IRUPDWXO�GDWHORU�GH�LHúLUH��GH�H[HPSOX�XQ�QXP�U�UHDO�SRDWH�IL�DILúDW�FX�WUHLVDX�FX�FLQFL�]HFLPDOH��VDX�XQ�WH[W��SRDWH�IL�DILúDW�LQWHJUDO�VDX�SDU LDO�

3. 6XQW� VDX� QX� QHFHVDUH� H[SOLFD LL� VXSOLPHQWDUH� SHQWUX� XWLOL]DWRU� vQ� DIDUD� GDWHORU� GHLHúLUH�

4. &DUH�HVWH�QXP�UXO�GH�GDWH�GH�LHúLUH�FDUH�WUHEXLH�WUDQVPLVH�F�WUH�LHúLUH�

2�GHILQL LH�D�QR LXQLL�GH�DOJRULWP�SRDWH�IL��vQO�Q XLUHD�GH�SDúL�VLPSOL��RSHUD LL�GLVWLQFWHFDUH� GHVFULX� PRGXO� GH� SUHOXFUDUH� D� XQRU� GDWH� GH� LQWUDUH� � vQ� VFRSXO� UH]ROY�ULL� XQHLSUREOHPH�� 'HFL�� $/*257,08/� (67(� $&($� 3$57(� '(� &$/&8/� &2081�� Ì1&$=8/�5(=2/9�5,,�81(,�352%/(0(�'(�&$/&8/�

8Q�H[HPSOX�VLPSOX�GH�DOJRULWP�DU�IL�VXLWD�GH�RSHUD LL�PDWHPDWLFH�I�FXW��vQ�UH]ROYDUHDXQHL� HFXD LL� PDWHPDWLFH� GH� JUDGXO� ,,� D;��E;�F ��� FRHILFLHQ LL� D�� E�� F� VH� VFKLPE�� GDUmodul de procesare a valorilor lor, nu. 3URSULHW� LOH�XQXL�DOJRULWP�VXQW�

1. (VWH�FRPSXV�GLQ�LQVWUXF LXQL�VLPSOH�úL�FODUH�2. 2SHUD LXQLOH�VSHFLILFDWH�GH�LQVWUXF LXQL�VH�H[HFXW��vQWU�R�DQXPLW��VHFYHQ ��3. 6ROX LD�WUHEXLH�RE LQXW��vQWU�XQ�QXP�U�ILQLW�GH�SDúL�

'LQ� FHOH� VSXVH�PDL� VXV� UH]XOW�� F��81�$/*25,70�(67(� ,1'(3(1'(17�'(7,38/�'(�/,0%$-� Ì1�&$5(�(67(�75$16386�6$8�'(�7,38/�'(�0$ù,1�� 3(CARE ESTE EXECUTAT.

6

Page 8: Introducere in c++

Introducere in programare

2EVHUYD LH��ÌQ�DFHDVW��FDUWH�VH�YRU�GLVFXWD�QXPDL�$/*25,70,�6(&9(1�,$/,�úLUHVSHFWLY�352*5$0$5($�6(&9(1�,$/��

8Q� DOJRULWP� VHFYHQ LDO� HVWH� DFHO� DOJRULWP� FUHDW� SHQWUX� H[HFX LD� � SH� XQ� FDOFXODWRUVHFYHQ LDO��'HQXPLUHD�GH�VHFYHQ LDO�SURYLQH�GLQ�IDSWXO�F��DFHVWD���QX�SRDWH�H[HFXWD�GHFkWR�VLQJXU��RSHUD LH�OD�XQ�PRPHQW�GDW�

�����5HSUH]HQWDUHD�DOJRULWPLORU�

ÌQ� JHQHUDO�� XQ� DOJRULWP� SRDWH� IL� FRQVLGHUDW� FD� R� GHVFULHUH� D� SUHOXFU�ULL� HIHFWXDWHasupra unui flux de date, prelucrare care are loc cu un scop bine determinat. Ca de obicei, vQ�FD]XO�GH]YROW�ULL�XQHL�QRL� WHRULL�� V�D�F�XWDW� DWkW�R� FDOH�GH� VWDQGDUGL]DUH�D�PRGXOXL�GHGHVFULHUH� D� XQXL� DOJRULWP�� FkW� úL� R� FDOH� GH� D�O� IDFH� LQGHSHQGHQW� GH� XQ� OLPEDM� GHSURJUDPDUH�DQXPH�UH]XOWkQG�GRX��PHWRGH�FODVLFH�

- metoda schemei logice (diagramei de flux (flowchart)); - metoda pseudocodului.

�������0HWRGD�VFKHPHL�ORJLFH�

ÌQ�FDGUXO�DFHVWHL�PHWRGH�VH�IRORVHúWH�XQ�VHW�GH�VLPEROXUL��SUH]HQWDW� vQ�ILJXUD�����SHQWUX�GHVFULHUHD�SDúLORU�FH�WUHEXLH�H[HFXWD L�SHQWUX�FD�SURJUDPXO�UH]XOWDW�V��QH�UH]ROYH�RDQXPLW��SUREOHP��

'HúL�D�IRVW�H[WUHP�GH�IRORVLW���SkQ��QX�GH�PXOW��DFHDVW��PHWRG��SDUH�D�SLHUGH�WHUHQvQ� ID D� UHSUH]HQW�ULL�GH� WLS�SVHXGRFRG��SRDWH� úL� GDWRULW�� WLPSXOXL� VXSOLPHQWDU�SLHUGXW�GHutilizator cu executarea simbolurilor grafice.

6�� DQDOL]�P�XQ�SURJUDP�GH� FDOFXO�D�PHGLHL�SHQWUX� WUHL�QRWH� úL� V��YHGHP�FXP�DUDS�UHD�GHVFULV�SULQ�DFHDVW��PHWRG��

'XS��FXP�VH�REVHUY��vQ�ILJXUD�����VH�GHVFULX�HIHFWLY�SDV�FX�SDV�WRDWH�RSHUD LXQLOHcare trebuiesc urmate.

ÌQ� ILJXUD����� V�D� VSHFLILFDW� úL� vQFHSXWXO� SURJUDPXOXL�� IDSW� FDUH�SDUH� LQXWLO�� GDU� vQFD]XO�GHVFULHULL�XQXL�SURJUDP�IRDUWH�PDUH�VH�SUHD�SRDWH�FD�VFKHPD�ORJLF��V��VH�vQWLQG��SH]HFL�GH�SDJLQL��FD]�vQ�FDUH�GHYLQH�HYLGHQW��QHFHVLWDWHD�GHFODU�ULL�vQFHSXWXOXL�úL�VIkUúLWXOXLde program.

ÌQ�XUP�WRUXO�SDV�VH�GHFODU��YDULDELOHOH��2�YDULDELO��HVWH�XQ�LGHQWLILFDWRU�SURSULX�DOSURJUDPDWRUXOXL�� FDUH� vQ� FD]XO� RSHUD LXQLL� GH� GHFODUDUH� VH� DWDúHD]��� OD� JHQHUDUHDSURJUDPXOXL�� XQHL� ]RQH� GH�PHPRULH� D� F�UHL� GLPHQVLXQH� HVWH� vQ� GLUHFW�� FRQFRUGDQ �� FXWLSXO�GH�GDW��VWRFDW�GH��DFHDVWD�

Se trece apoi la citirea datelor de intrare. În acest caz este vorba de trei note ceea FH� SUHVXSXQH� F�� YDORULOH� GH� LQWUDUH� SRW� DYHD� úL� FX� ]HFLPDOH�� 0DL� WkU]LX� VH� YD� GLVFXWDGHVSUH�DOHJHUHD�WLSXOXL�GH�YDULDELO��IXQF LH�GH�VSHFLILFD LLOH�XWLOL]DWRUXOXL�

6H�H[HFXW��FDOFXOXO�SURSULX�]LV���GXS��FDUH�VH�DILúHD]��UH]XOWDWXO�FX���]HFLPDOH��$PDL� U�PDV� GRDU� PDUFDUHD� VIkUúLWXO� GH� SURJUDP�� &KLDU� GDF�� PHWRGD� DUH� R� LPSUHVLH³DUWLVWLF�´�VSRULW��FkWH�R�GDW��VH�SLHUGH�SUHD�PXOW�WLPS�úL�KkUWLH�vQ�FD]XO�IRORVLULL�HL�úL�GHDFHHD�GLQ�FH�vQ�FH�PDL�PXO L�SUHIHU��FD��PHWRG��GH�GHVFULHUH�pseudocodul.

7

Page 9: Introducere in c++

Introducere in programare

^

6LPERO GH WHUPLQDUH

VDX vQFHSHUH SURJUDP

&XWLH GH FDOFXO

&XWLH GH FRPHQWDULX

&XWLH GH,QWUDUH VDX ,HúLUH 'DWH

)LU GH H[HFX LH D SURJUDPXOXL

)LJ� ���� 6LPEROXUL VWDQGDUG SHQWUX )LJ� ���� 6FKHPD ORJLF� XQXLPHWRGD VFKHPHL ORJLFH SURJUDP GH FDOFXO D PHGLHL SHQWUX

WUHL QRWH

�������0HWRGD�SVHXGRFRGXOXL�

)D ��GH�VFKHPD�ORJLF��DUH�GH]DYDQWDMXO�F��QX�vQWRWGHDXQD�UHG��DEVROXW�WR L�SDúLL�GHFDOFXO�� 7RWXúL� HVWH�PDL� FRPRG�� GH� IRORVLW� vQ� FD]XO� vQ� FDUH� VH� GHVFULX� DOJRULWPL� SHQWUXOLPEDMHOH�GH�SURJUDPDUH�GH�QLYHO�PHGLX�úL�vQDOW�

6FKHPD� ORJLF�� HVWH� FHD�PDL� LQGLFDW�� FD�PHWRG��GH�GHVFULHUH�� vQ� VSHFLDO�� vQ�FD]XOLPSOHPHQW�ULL�XQXL�DOJRULWP�IRORVLQG�OLPEDM�GH�DVDPEODUH��XQGH��GHVFULHUHD�DP�QXQ LW��DILHF�UXL� SDV� HVWH� QHFHVDU�� � SHQWUX� SXWHD� PLQLPL]D� úDQVHOH� DSDUL LHL� XQRU� HURUL� GHimplementare.

DescrierHD�HIHFWLY��D�SDúLORU�FH�WUHEXLH�HIHFWXD L��IRORVLQG�FXYLQWHOH�OLPELL�URPkQHvPSUHXQ�� FX� FXYLQWH� FKHLH� DOH� OLPEDMXOXL� GH� SURJUDPDUH� vQ� FDUH� VH� YD� LPSOHPHQWDDOJRULWPXO� VH� QXPHúWH� SVHXGRFRG�� 6H� REVHUY�� F�� vQ� DFHVW� FD]� � FULWHULXO� LQGHSHQGHQ HLWRWDOH�D�GHVFULHULL�ID ��GH�OLPEDMXO�GH�LPSOHPHQWDUH�QX�HVWH�vQWUX�WRWXO�UHVSHFWDW�

3HQWUX� FRPSDUD LH� YRP� GHVFULH� PDL� MRV� vQ� SVHXGRFRG� SUREOHPD� SUH]HQWDW�� vQfigura 1.2.

YDULDELOH��PD�Q��Q��Q�

FLWHúWH�Q��Q��Q�

PD �Q��Q��Q����

DILúHD]��PD�FX���]HFLPDOH

`

8

Page 10: Introducere in c++

Introducere in programare

CAPITOLUL 2

2. Limbajul C

Limbajele de programare de nivel mediu au fost serios dezvoltate pe la mijlocul anilor ¶���� ,GHLOH� GH� ED]�� IRORVLWH� SHQWUX� SURLHFWDUHD� ORU� GHULY�� GLQ� IRUPXOHOH� IXQF LRQDOH� λ-&KXUFK�FH�IXVHVHU��SURSXVH�SULQ�DQLL�¶����/D�RUD�DFWXDO��VH�HVWLPHD]��F��H[LVW��SHVWH�����GH� OLPEDMH� GH� SURJUDPDUH�� GLIHUHQ HOH� vQWUH� HOH� ILLQG� OHJDWH� vQ� SULQFLSDO� GH� VWLOXO� GHprogramare.

Limbajul FORTRAN (FORmula TRANslator) a fost unul dintre primele limbaje GH� SURJUDPDUH�� (O� HVWH� IRORVLW� úL� DFXP� vQ� LQGXVWULH� VDX� FHUFHWDUH� SHQWUX� D� LPSOHPHQWDDSOLFD LL�VSHFLILFH�FX�YROXPH�PDUL�GH�FDOFXOH�PDWHPDWLFH�FRPSOH[H�

3H� OkQJ�� OLPEDMH� GH� SURJUDPDUH� SHQWUX� PDúLQL� VHFYHQ LDOH�� V�DX� GH]YROWDW� úLOLPEDMH�FDUH�VXSRUW��SURFHVDUH�SDUDOHO���'LQ�QHIHULFLUH�PDMRULWDWHD�QX�VXQW�SRUWDELOH��ILLQGRULHQWDWH� VWULFW� SH� DUKLWHFWXUD�PDúLQLL� SHQWUX� FDUH� D� IRVW� GH]YROWDW� OLPEDMXO�� 'H� DELD� vQXOWLPLL�]HFH�DQL�GH]YROWDUHD�UDSLG��D�UH HOHORU�GH�FDOFXODWRDUH�D�FRQGXV�úL�OD�R�vQFHUFDUH�GHstandardizare a unor limbaje ce pot crea cod executabil simultan pe mai multe sisteme de calcul. $YDQWDMHOH�SURJUDP�ULL�OD�QLYHO�inalt sunt:

−� ascund GLIHUHQ HOH�GH�DUKLWHFWXU��LQWHUQ�

−� sunt XúRU�GH�XUP�ULW�úL�PHQ LQXW��modificare úi depanare XúRDU��−� sunt portabile . De exemplu un cod scris în C poate fi executat úi sub UNIX úL�VXE

DOS −� nu au cel mai eficient FRG��vQ�FRPSDUD LH�FX�FHO�VFULV�LQ�$60�GLUHFWDe obicei sistemele de operare erau dezvoltate in limbaj de ansamblare pentru a fi mai

rapide . Limbajul C, dezvoltat in 1972 este Dennis M.Retchie la Laboratoarele AT&T Bell, este primul limbaj pentru crearea sisteme de operare. Numele limbajului provine din faptul c� este rezultatul îPEXQ�W� LULL�limbajului B, folosit în scrierea UNIX pentru DEC PDP7. Prima GRFXPHQWD LH�despre acest limbaj a fost “The C Programing Language”, scris��GH�5HWFKLH�úL�Brian Kernighan în 1977. Înaintea ei exista doar “The C Reference Manual”, scris� de Retchie. 2� FDUDFWHULVWLF�� LPSRUWDQW�� D� DFHVWXL� OLPEDM� HVWH� IDSWXO� F�SRDWH�IL�FRQVLGHUDW�VLPXOWDQ�úL�XQ�OLPEDM�GH�QLYHO�PHGLX�úL�XQ�OLPEDM�GH�QLYHO�VF�]XW�

2� GDW�� FX� U�VSkQGLUHD� OXL� SULQWUH� SURJUDPDWRULL� SURIHVLRQLúWL� V�D� WUHFXW� úL� ODDGDSWDUHD�FRPSLODWRUXOXL�SHQWUX�VLVWHPXO�GH�RSHUDUH�06�'26��'H�DVHPHQHD�D�DS�UXW�úLDOW��SUREOHP��úL�DQXPH�IDSWXO�F��VWDQGDUGXO�.&R nu mai era satisf�F�WRU��'H�DVHPHQHDGDWRULW��YDULDQWHORU�GH�FRPSLODUH�SHQWUX�3&-uri C începuse V��úL�piard��GLQ�portabilitate.

În acel moment Institutul 1D LRQDO�pentru Standarde al Americii (ANSI), a creat un subcomitet pt. a defini o versiune RILFLDO��SW��limbajul C, rezultând astfel ANSI C.

/LPEDMXO�&� úL� YHUVLXQLOH� VDOH�223� �Object Oriented 3URJUDPPLQJ�� &��� úL�PDLQRXO�9LVXDO�&���VXQW�SULQWUH�FHOH�PDL� IRORVLWH� OLPEDMH�GH�SURJUDPDUH� OD�RUD�DFWXDO���$IRVW� SURLHFWDW� SRUQLQG� GH� OD� GRX�� OLPEDMH� GH]YROWDWH� VSUH� VIkUúLWXO� DQLORU� ¶���� %&3/� úLprima sa versiune B.

8Q� OLPEDM� GH� QLYHO� VF�]XW� HVWH� RULHQWDW� SH� DUKLWHFWXU�� úL� SRDWH� IL� GHILQLW� FD� DYkQGIDFLOLWDWHD�GH�D�VFULH�LQVWUXF LXQL�FH�VH�UHIHU��GLUHFW�OD�HOHPHQWH�DOH�UHVSHFWLYHL�DUKLWHFWXULinterne (ca în cazul limbajului de asamblare).

9

Page 11: Introducere in c++

Introducere in programare

8Q� OLPEDM� GH� QLYHO� vQDOW� VDX� PHGLX� HVWH� RULHQWDW� SH� SUREOHP�� � SHUPL kQGSURJUDPDWRUXOXL� V��úL� VWUXFWXUH]H� SURJUDPXO� FkW� PDL� DSURSLDW� SRVLELO� GH� SUREOHPD� FHWUHEXLH�LPSOHPHQWDW���$FHVW�OXFUX�VFDGH�úDQVHOH�XQHL�HURUL�GH�SURLHFWDUH��OD�QLYHO�ORJLF��DODSOLFD LHL��&KLDU�GDF��SURJUDPXO�YD�IL�PDL�LQHILFLHQW��GLQ�SXQFW�GH�YHGHUH�DO�YLWH]HL�úL�DORFXS�ULL� UHVXUVHORU� �SULQ�FRPSDUD LH�FX�XQ�SURJUDP�VFULV� vQ� OLPEDM�GH�DVDPEODUH��HO� DUHDYDQWDMXO�F��SRDWH�IL�VFULV�UHSHGH�úL�H[WLQV�FX�XúXULQ ��

Limbajul C SHUPLWH� IRORVLUHD� DPEHORU� WHKQLFL�� SURJUDPDUH� VWUXFWXUDW�� úL� DFFHVGLUHFW�OD�PDúLQ���IDSW�FDUH�O�IDFH�V��ILH�IRDUWH�IOH[LELO�

8OWLPXO�úL�SRDWH�FHO�PDL�LPSRUWDQW�PRWLY�SHQWUX�vQY� DUHD�OLPEDMXOXL�&�HVWH�IDSWXOF��SHUPLWH�WUHFHUHD�FX�XúXULQ ���OD�&���VDX�-DYD�

'HúL�limbajul C are o libertate foarte mare in scrierea codului, el acceptând multe forme de scriere care în alte limbaje nu sunt premise, acest lucru ascunde vQV��úL�pericole, în special pentru programatorii I�U��H[SHULHQ ��

����6WUXFWXUD�JHQHULF��D�XQXL�SURJUDP�VFULV�vQ�&�

'H�OD�SULPHOH�SURJUDPH�VFULVH�HVWH�ELQH�V��VH� LQ��FRQW�GH�R�VHULH�GH�UHJXOL�SULYLQGRUJDQL]DUHD�FRGXOXL�VXUV���6WUXFWXUD�JHQHUDO��D�XQXL�FRG�YD�IL�

Apeluri ale directivelor speciale de compilare; 'HFODUD LL�GH�ELEOLRWHFL�IRORVLWH�

'HFODUD LL�IXQF LL�LQ�OLQH�

'HFODUD LL�DOH�SURWRWLSXULORU�IXQF LLORU�SHUVRQDOH�

'HFODUD LL�YDULDELOH�JOREDOH�

Corpul programului principal{GHFODUD LL�YDULDELOH�

DSHOXUL�GH�IXQF LL�

} &RUSXULOH�IXQF LLORU�GH]YROWDWH�GH�SURJUDPDWRU�

([LVW�� FkWHYD� REVHUYD LL� VXSOLPHQWDUH� SULYLQG� WHKQRUHGDFWDUHD� FRGXOXL� VXUV�� GHFDUH�DU�IL�ELQH�V��VH� LQ��VHDPD�

1.� 6��QX�VH�VFULH�LQVWUXF LXQLOH�XQD�GXS��DOWD�FL�XQD�VXE�DOWD�2.� 7RDWH�LQVWUXF LXQLOH�FDUH�IRUPHD]��XQ�EORF�SHQWUX�R�DOW��LQVWUXF LXQH�V��ILH��GHSODVDWH

ID ��GH�vQFHSXWXO�UHVSHFWLYHL�LQVWUXF LXQL�

�����(WDSHOH�JHQHU�ULL�XQXL�SURJUDP�H[HFXWDELO�SRUQLQG�GH�OD�R�SUREOHP��UHDO�

8QD� GLQ� JUHúHOLOH� vQFHS�WRULORU� vQ� SURJUDPDUH� FRQVW�� vQ� IDSWXO� F�� SXQ� SUHD�PXOWDFFHQW� SH� LQWURGXFHUHD� XQRU� SURJUDPH� JDWD� VFULVH�� I�U�� FD� vQ� SUHDODELO� V�� VWXGLH]HSUREOHPD�GH�SRUQLUH�SUHFXP�úL�DOJRULWPXO�JHQHUDW�vQ�XUPD�DQDOL]HL�DFHVWHL�SUREOHPH�ÌQ�PRPHQWXO�JkQGLULL�XQXL�SURJUDP��SH�OkQJ��DOWH�FRQVLGHUHQWH�WUHEXLH� LQXW�FRQW�úL�GHIDSWXO�F��HVWH�R�PDUH�GLIHUHQ ��vQWUH�SURJUDPHOH�bune si cele care merg. Un program bun nu numai c��PHUJH��GDU�HVWH�úL�XúRU�GH�vQ HOHV�úL�PHQ LQXW��0XO L�GLQWUH�vQFHS�WRULL�vQ

10

Page 12: Introducere in c++

Introducere in programare

programarea C-XOXL�DX�WHQGLQ D�GH�D se�OLPLWD�OD�SURJUDPH�FDUH�V��PHDUJ���úL�DFHVW�IDSWconduce la GHSULQGHUL�QHV�Q�WRDVH.

'H� DFHHD� PDL� MRV� YRP� SUH]HQWD� SDúLL� QHFHVDUL� D� IL� XUPD L� vQ� HODERUDUHD� XQHL� DSOLFD LLSRUQLQG�GH�OD�R�SUREOHP��UHDO��

1.� ÌQ HOHJHUHD�SUREOHPHL�2.� 5HDOL]DUHD�PRGHOXOXL�PDWHPDWLF��GDF��HVWH�FD]XO�3.� 9HULILFDUHD�PRGHOXOXL�PDWHPDWLF�FX�XQ�VHW�GH�GDWH�UHDO�VDX�FDOFXODWH�PDQXDO��'DF��VH

REVHUY�� QHFRQFRUGDQ H� VH� YD� UHOXD� YHULILFDUHD� � SXQFWHORU� DQWHULRDUH�� GDF�� QX� VHFRQWLQX��

4.� ,GHQWLILFDUHD� GDWHORU� GH� LQWUDUH�� D� GDWHORU� GH� LHúLUH� SUHFXP� úL� D� YDULDELOHORUintermediare.

5.� $OHJHUHD�WLSXULORU�GH�GDWH�IRORVLWH�SHQWUX�UH LQHUHD�vQ�FXUVXO�SURFHV�ULL�D�UHVSHFWLYHORUdate.

6.� Specificarea modului de LQWHUID DUH�FX�XWLOL]DWRUXO�OD�QLYHO�GH�LQWUDUH�VDX�LHúLUH�7.� Generarea schemei logice sau a pseudocodului ce descrie algoritmul propus pentru

rezolvarea problemei. 8.� Verificarea modelului creat la punctul 7 cu un set date reale sau calculate manual. În

caz de QHFRQFRUGDQ H�VH�UHLD�YHULILFDUHD�SXQFWHORU�DQWHULRDUH��GDF��QX�VH�FRQWLQX��9.� 6FULHUHD�FRGXOXL�VXUV���WUDQVSXQHUHD�vQWU�XQ�OLPEDM�GH�SURJUDPDUH�RDUHFDUH��10.�(OLPLQDUHD�HURULORU�GH�VLQWD[��

3HQWUX�D�H[HPSOLILFD�SDúLL�PHQ LRQD L�DQWHULRU�YRP�OXD�XQ�H[HPSOX�H[WUHP�GH�VLPSOX�“6��VH�UHDOL]H]H�un program care UH]RY��R�HFXD LH�RDUHFDUH�GH�JUDGXO�,,”

Pasul 1 În acest caz este simplu, e clar F��ne referim la o HFXD LH�GH�foma ax�+bx+c=0;

Pasul 2 Modelul matematic este cel studiat în liceu:

�Fie = ∆ b − � ⋅ a ⋅ c atunci :

− E ± E� − � ⋅ D ⋅ F'DF��∆ >0 atunci: [ = .

��� � ⋅ D− E ⋅ ± − E + � ⋅ D ⋅ FL �

'DF��∆ <0 atunci: [ = .��� � ⋅ D

'DF��∆ =0 atunci: [ − = E.

��� � ⋅ DPasul 3 În acest caz poate fi evitat modelul matematic este prea simplu.

Pasul 4 6�� YHGHP� GHFL� FDUH� DU� IL� GDWHOH� FH� WUHEXLHVF� IXUQL]DWH� GH� XWLOL]DWRU�� $YkQG� vQ

YHGHUH�F��VH�GRUHúWH�UH]ROYDUHD�XQHL�HFXD LL�JHQHULFH�GH�RUGLQXO�,,�HVWH�FODU�F���-� a,b,c date de intrare

11

Page 13: Introducere in c++

Introducere in programare

-� x����GDWH�GH�LHúLUH-� ∆�GDW��LQWHUPHGLDU��

Analizând modHOXO� PDWHPDWLF� REVHUY�P� F�� D� WUHEXLW� V�� IRORVLP� XQ� VLPEROVXSOLPHQWDU� IXQF LH� GH� FDUH� VH� IDFH� vQWUHDJD� GLVFX LH�� $FHVW� VLPERO� QX� HVWH� QLFL� GDW� GHXWLOL]DWRU�úL�QLFL�QX�LQWHUHVHD]��SHQWUX�UH]XOWDWXO�ILQDO��GHFL�∆�HVWH�R�GDW��LQWHUPHGLDU��GHcalcul.

Pasul 5 $FXP� WUHEXLH� V�� VSHFLILF�P�WLSXO�GH�GDW�� IRORVLW�SHQWUX� UHSUH]HQWDUHD� LQWHUQ�� �vQ

PHPRULD�FDOFXODWRUXOXL��D�YDULDELOHORU��'HFL�DYHP�FkWHYD�GDWH�VXSOLPHQWDUH�OD�GLVSR]L LHpentru a vedea tipul de reprezentare care trebuie ales: -� VSHFLILFD LLOH�XWLOL]DWRUXOXL-� modelul matematic -� H[SHULHQ D�vQ�SURJUDPDUH

ÌQ� DFHVW� FD]� PRGHOXO� PDWHPDWLF� QH� VSXQH� F�� D�E�F� VXQW� QXPHUH� UHDOH�� )�U�� RVSHFLILFDUH�FODU��D�XWLOL]DWRUXOXL�FDUH�V��vQGLFH�F��HOH�DSDU LQ�DOWXL�LQWHUYDO�HVWH�REOLJDWRULXFD�V�� OX�P�vQ�FRQVLGHUDUH�PRGHOXO�FHO�PDL�H[WLQV��GHFL�FHO�PDL�DGDSWDELO��'HVLJXU�F��QXYRP�DOHJH�FHO�PDL�FXSULQ]�WRU� WLS�GH�GDWH�SXV� OD�GLVSR]L LH�GH�F�WUH�FRPSLODWRU� vQ� OLSVDXQRU�VSHFLILFD LL�H[WHUQH��'HFL�a,b,c vor fi de tipul float.

9DULDELOD� LQWHUPHGLDU�� ∆� HVWH� UH]XOWDW� DO� DSOLF�ULL� XQHL� IXQF LL� OLQHDUH� DVXSUD� XQRUYDULDELOH�GH�WLS�UHDO�GHFL�úL�GHOWD�YD�WUHEXL�V��ILH�float.

'DWHOH� GH� LHúLUH� [����� GXS�� FXP� VH� REVHUY�� VXQW� UH]XOWDWXO� XQHL� vQS�U LUL� úL� GHFLREOLJDWRULX�VXQW�UHDOH�LQGLIHUHQW�GH�WLSXO�GH�GDW��DOHV�SHQWUX�GDWHOH�GH�LQWUDUH�

Pasul 6 ÌQ�OLSVD�XQRU�VSHFLILFD LL�GH�OD�XWLOL]DWRU�YRP�DOHJH�SHQWUX�FLWLUHD�GDWHORU�FHD�PDL

VLPSO��PHWRG��FLWLUHD�GLUHFW��GXS��FXP�DP�I�FXW�úL�SkQ��DFXP��3HQWUX�DILúDUH�vQV��DYHPGRX��PHWRGH�DILúDUHD�GH�WLSXO�5H�[��úL�,P�[��VDX�GLUHFW�UH]XOWDWXO�FD�vQ�FDOFXOXO�PDQXDO�9RP�DOHJH�FHD�GH�D�GRXD�PHWRG��

Pasul 7 3VHXGRFRGXO�YD�DU�WD�FD�PDL�MRV�

FLWHúWH�D�

FLWHúWH�E�

FLWHúWH�F�

FDOFXOHD]��GHOWD�GXS��IRUPXO��GHOWD E E�� D F��

GDF��GHOWD�>=0 atunci{x�=(-b+sqrt(delta))/(2*a);x�=(-b-sqrt(delta))/(2*a);afiDILúHD]��[��[��}altfel{delta=-delta;delta=sqrt(delta)/(2*a)

12

Page 14: Introducere in c++

Introducere in programare

afiúHD]��x1 de forma re+i*im afiúHD]��x2 de forma re-i*im }

CâWHYD�REVHUYD LL�UHODWLYH�OD�FRQVWUXF ia pseudocodului -� VH� REVHUY�� F�� QX� DP� WUDWDW� VHSDUDW� VLWXD LD� GHOWD �� SHQWUX� F�� ]HUR� OD� DGXQDUH� QX

PRGLILF��UH]XOWDWXO-� vQ�D�GRXD�SDUWH�DP�IRORVLW�XQ�DUWLILFLX�GH�FDOFXO�vQ�VHQVXO�F��DP�S�VWUDW�WRW�vQ�YDULDELOD

GHOWD� UH]XOWDWH� SDU LDOH� GH� FDOFXO�� $OWIHO� DU� IL� WUHEXLW� V�� LQWURGXFHP� YDULDELOHVXSOLPHQWDUH�SHQWUX�S�VWUDUHD�S� LL�vQWUHJL�úL�D�S�U LL�UHDOH��&RGXO�DU�IL�IRVW�PDL�FODU�GDUvQ�DFHODúL�WLPS�DP�IL�IRORVLW�PDL�PXOW��PHPRULH��'DF��vQ�FD]XO�DFHVWXL�SURJUDP�FkWHYDYDULDELOH� VXSOLPHQWDUH� QX� QH� GHUDQMHD]��� vQ� FD]XO� XQRU� SURJUDPH� IRDUWH� PDUL� DFHVWOXFUX� SRDWH� ULGLFD� JUHXW� L� FH� QX� SRW� IL� HOLPLQDWH� GHFkW� SULQ� WUHFHUHD� OD� DORFDUHDGLQDPLF��D�PHPRULHL��$FHDVW��PHWRG��YD�IL�SUH]HQWDW��XOWHULRU�

-� VH�REVHUY�� F�� DP� VFULV�PXOW� FRG� VXSOLPHQWDU� FDUH�GLQ�SXQFW�GH�YHGHUH� DO� FDOFXOXOXLbrut nu ne trebuie, dar din punct de vedere al modului în care îi prezint rezultatul uni XWLOL]DWRU�HVWH�HVHQ LDO�SHQWUX�F��HVWH�H[DFW�vQ�IRUPD�PDWHPDWLF��FXQRVFXW��

Pasul 8 Va fi evitat pentru acest exemplu deoarece este prea simplu.

Pasul 9 Codul în cazul limbajului C va DUD�WD�FD�PDL�MRV�

#include <stdio.h> * #inlude <conio.h> // aici eroare de sintax��GHWHFWDELO��GH�interpretor

void main(void){float a,b,c,delta,x1,x2;

clrscr()printf(“Pentru calculul ecuatiei a*x*x+b*x*c=0 dati coeficientii”);printf(“\na=”) ;

** scanf(“%f”,a); //aici eroare de VLQWD[��QHGHWHFWDELO��GH�interpretor printf(“\nb=”); scanf(“%f”,&b); printf(“\nb=”); scanf(“%f”,&b);

** * delta=b*b+4*a*c; // aici eroare de calcul if( delta >=0) { x�=(-b+sqrt(delta))/(2*a); x�=(-b-sqrt(delta))/(2*a); printf(“\nx1=%f”,x1) printf(“\nx2=%f”,x2)

}

13

Page 15: Introducere in c++

Introducere in programare

else {

delta=-delta;delta=sqrt(delta)/(2*a)printf(“x1=%f+i*%f”,-b/(2*a),delta) ;printf(“x2=%f-i*%f”,-b/(2*a),delta) ;}}

Pasul 10 'XS��FXP�VH�REVHUY��DP�LQWURGXV�LQWHQ LRQDW� WUHL� WLSXUL�GH�JUHúHOL��3ULPD��PDUFDW��FX�RVWHD�HVWH�JUHúHDO��GH�VLQWD[��FH�YD� IL�GHWHFWDW��GH�FRPSLODWRU�úL�GHFL�R�SXWHP�FRUHFWD� vQDFHDVW��ID]��

Pasul 11 ÌQ� FDGUXO� UXO�ULL� SURJUDPXOXL� UH]XOWDW� VH� REVHUY�� F�� DFHVWD� QX� IXQF LRQHD]�� FRUHFW�� /DH[HFX LD�SDV�FX�SDV�VH�YD�REVHUYD�F��vQ�YDULDELOD�D�QX�VH�GHSXQH�FHHD�FH�VH�FLWHúWH�GH�ODWDVWDWXU���(VWH�R�JUHúHDO��GH� ORJLF��GH�SURJUDPDUH��SHQWUX�F��scanf� � DúWHDSW��XQ�pointer pentru a returna corect rezultatul, iar a nu este declarat SRLQWHU� WUHEXLH� WUDQVPLV��DGUHVDOXL�D��$FHDVW��HURDUH�QX�SRDWH�IL�GHWHFWDW��GH�interpretor.

'H�DVHPHQHD�FX� WUHL�VWHOH�DP�PDUFDW�R�JUHúHDO��GH� WUDQVSXQHUH�D�DOJRULWPXOXL��RJUHúHDO��VLPSO��GH� WUDQVFULHUH�D�XQHL� IRUPXOH�GH�FDOFXO��'HDELD�GXS�� HOLPLQDUHD�DFHVWRUerori se poate continua testarea programului.

(VWH�ELQH�FD�V��H[LVWH�XQ� comentariu la vQFHSXWXO�RULF�UHL�VXUVHL�&�DYkQG�XUP�WRUXOFRQ LQXW

/*----autor:������GDWD�FUH�ULL/modific�rii------copyright* /

14

Page 16: Introducere in c++

Introducere in programare

CAPITOLUL 3

����1R LXQHD�GH�YDULDELO��úL�WLSXUL�GH�YDULDELOH�

2�YDULDELO� �HVWH�XQ�LGHQWLILFDWRU��QXPH��GDW�GXS��GRULQ ��GH�F�WUH�XWLOL]DWRU�XQHL�]RQHdin memorie cu care se va lucra (stoca sau modifica datele utile programului) pe SDUFXUVXO�VFULHULL�FRGXOXL�VXUV��

ÌQ� OLPEDMXOXL� &� SRW� IDFH� DVHPHQHD� UHIHULUL� GLUHFWH� OD� R� ]RQ�� GH� PHPRULH� �SULQintermediul SRLQWHULORU�� DYkQG� WRWRGDW�� DYDQWDMXO� VLQWD[HL� IDFLOH� D� XQXL� OLPEDM� GH� QLYHOmediu.

3URJUDPXO� VDX� FRGXO� VXUV�� HVWH� WUDGXV� SULQ� LQWHUPHGLXO� FRPSLODWRUXOXL� &� vQWU�XQprogram executabil. În cadrul acestui proces se face identificarea dintre numele variabilei úL� XQ� DQXPLW� QXP�U� GH� ORFD LL� GH� PHPRULH�� 7RW� vQ� VDUFLQD� FRPSLODWRUXOXL� U�PkQH� úLJHQHUDUHD� GH� LQVWUXF LXQL� FDUH� V�� VH� RFXSH� GH� VFULHUHD� VDX� FLWLUHD� vQ� EORF� D�PDL�PXOWRUORFD LL�GH�R�GDW����2�YDULDELO��SRDWH�RFXSD�PDL�PXOW�GH�R�ORFD LH�GH�PHPRULH�Caracteristicile variabilelor sunt :

1. )LHFDUH�YDULDELO��DUH�XQ�QXPH�2. )LHFDUH�YDULDELO��DSDU LQH�XQXL�WLS�GH�GDW��3. )LHFDUH� YDULDELO�� UH LQH� R� YDORDUH� VDX� XQ� VHW� GH� YDORUL� XWLOH� SHQWUX� SURJUDP��$FHVWH

valori pot fi: - GHSXVH�vQ�PHPRULH�SULQ�LQL LDOL]DUH�vQ�SURJUDP- SRW�IL�FLWLWH�GH�OD�WDVWDWXU��VDX�GH�OD�DOW�GLVSR]LWLY�GH�LQWUDUH�

/HJDW�GH�QXPHOH�XQHL�YDULDELOH�VH�SRW�IDFH�FkWHYD�REVHUYD LL�

1. 1XPHOH�XQHL� YDULDELOH� VH� DOHJH�GH�RELFHL� DVWIHO� vQFkW� V�� GHVFULH� FH� vQVHDPQ�� SHQWUXprogramator, din punct de vedere al SVHXGRFRGXOXL� vQWU�R� IRUP�� FDUH� SRDWH� ILSUHVFXUWDW�� VDX� QX� GXS�� SUHIHULQ ��� 'H� H[HPSOX� vQ� FD]XO� SUREOHPHL� GLQ� ILJXUD� ���QXPHOH� XQHL� YDULDELOH� FH� UH LQH� R� QRW�� SXWHD� IL� �� QRWDB�� VDX� Q�� VDX� 1RWDB��� &DREVHUYD LH� OLPEDMXO�&�HVWH�³FDVH� VHQ]LWLY´� �DGLF�� IDFH�GLVWLQF LH� vQWUH� OLWHUHOH�PLFL� úLPDUL� IRORVLWH� vQ� VFULHUHD� FRGXOXL� VXUV��� GHFL� 18� 6(� &216,'(5�� $� ),,1'$&(/$ù,� 180(� '(� 9$5,$%,/�� Ì1� &$=8/� Ì1� &$5(� (67(� 6&5,6� &8LITERE MARI SAU CU LITERE MICI. Mai concret nota_1 ≠ Nota_1≠NOTA_1.

2. &kQG�VH�GRUHúWH�FD�XQ�QXPH�GH�YDULDELO��V��ILH�FRPSXV�GLQ�GRX��FXYLQWH�18�6(�9$/�6$� 63$�,8� Ì175(� (/(� F�FL� YRU� IL� FRQVLGHUDWH� GRX�� FXYLQWH� VHSDUDWH�� HOHWUHEXLHVF�XQLWH�FX�OLQLH�LQIHULRDU���underscore).

3. 1XPHOH�GH�YDULDELOH�VXIHU��úL�GH�XUP�WRDUHOH�UHVWULF LL�− QX�SRW�vQFHSH�FX�XQ�QXP�U�����M��− nu pot începe cu $ ( $ abc ) − nu pot fi cuvinte rezervate ( int ) − nu pot FRQ LQH�caractere speciale ( bab*#*@l ) excep LH�I�F�QG�“underscore”

ex. bad_babe

15

Page 17: Introducere in c++

Introducere in programare

������,QL LDOL]DUHD�YDULDELOHORU

ÌQ�OLSVD�XQHL�LQL LDOL]�UL�H[SOLFLWH��R�YDULDELO��ORFDO��YD�FRQ LQH�R�YDORDUH�RDUHFDUH��DOHDWRDUH��QXPLW�� vQ�PRG�FXUHQW�³JDUEDJH´��$FHDVW��YDORDUH�VH�J�VHD� vQ�PHPRULD�DORFDW�� UHVSHFWLYHLYDULDELOH��OD�ODQVDUHD�vQ�H[HFX LD�D�SURJUDPXOXL

,QL LDOL]DWRULL�H[SOLFL L�VH�SODVHD]��GXS��GHFODUDWRUXO�OD�FDUH�VH�UHIHU���VHSDUD L�GHacesta prin semnul egal (de exemplu nr1=234).

H� H�

OYDOXH UYDOXH

'DF��RELHFWXO�LQL LDOL]DW�HVWH�XQ�DJUHJDW��XQ�FRQJORPHUDW�GH�GDWH�UHFXQRVFXW�VXE�XQQXPH�FRPXQ���SHQWUX�LQL LDOL]DUH�VH�IRORVHúWH�R�OLVW��GH�H[SUHVLL�vQFKLV�� vQ�DFRODGH�XQGH�ODILHFDUH�FRPSRQHQW��FRUHVSXQGH�FkWH�R�H[SUHVLH�7UHEXLH�UHVSHFWDWH�XUP�WRDUHOH�UHJXOL�

1. QXP�UXO� GH� LQL LDOL]DWRUL� QX� SRDWH� IL� PDL� PDUH� GHFkW� QXP�UXO� GH� FRPSRQHQWH� GHLQL LDOL]DW�

2. QX�VH�SRW�LQL LDOL]D�GHFkW�RELHFWH�VDX�WDEORXUL�FX�GLPHQVLXQH�GHILQLW���DGLF��VH�FXQRDúWHQXP�UXO�PD[LP�GH�YDORUL�GH�LQWUDUH�FH�SRW�IL�GDWH�GH�XWLOL]DWRU�SHQWUX�D�IL�SURFHVDWH��

3. H[SUHVLLOH�IRORVLWH�SHQWUX�LQL LDOL]DUH�WUHEXLH�V��ILH�FRQVWDQWH�vQ�XUP�WRDUHOH�VLWXD LL���OD�LQL LDOL]DUHD�XQXL�RELHFW�GH�WLS�VWDWLF��vQ�&����QH�VH�PDL�DSOLF���

��OD�LQL LDOL]DUHD�XQXL�WDEORX��XQHL�VWUXFWXUL sau unei uniuni.4. QX� VH� SRW� LQL LDOL]D� LGHQWLILFDWRUL� FX� YDODELOLWDWH� vQ� LQWHULRUXO� XQXL� EORF�� GDU� FX� OHJDUH

H[WHUQ��VDX�LQWHUQ��5. GDF�� R� OLVW�� vQFKLV�� vQWUH� DFRODGH� DUH� PDL� SX LQH� HOHPHQWH� GHFkW� FRPSRQHQWH� DUH

DJUHJDWXO�LQL LDOL]DW��UHVWXO�FRPSRQHQWHORU�VH�YRU�LQL LDOL]D�DXWRPDW�

2ELHFWHOH�GH�WLS�VFDODU��R�VHULH�GH�GDWH�GH�DFHODúL�WLS��D�F�URU�GHILQL LH�SRDWH�IL�GDW��FDR� vQúLUXLUH� GH� GDWH� FH� SRW� IL� LGHQWLILFDWH� SULQ� SR]L LD� ORU� vQWU�R� vQúLUXLUH�� VH� LQL LDOL]HD]�IRORVLQG�R�VLQJXU��H[SUHVLH��FDUH�SRDWH�IL�HYHQWXDO�vQFKLV��vQ�DFRODGH��8QLXQLOH��JUXS�UL�GHPDL� PXO L� EL L� GH� GLPHQVLXQH� GLYL]LELO�� FX� GRL�� VH� LQL LDOL]HD]�� FX� R� VLQJXU�� H[SUHVLH�corespunzând ca tip primului membru al uniunii.

6WUXFWXULOH��JUXS�UL�GH�GLYHUVH�GDWH�GH�WLSXUL�GLIHULWH�VXE�XQ�QXPH�FRPXQ��úL�XQLXQLOHVH�SRW�LQL LDOL]D�FX�R�H[SUHVLH�GH�WLS�VWUXFWXU��VDX�XQLXQH�FRUHVSXQ]�WRDUH��9DORDUHD�LQL LDO��Dstructurii sau uniunii va fi valoarea obiectului citat.

3UH]HQ D�XQHL�LQL LDOL]�UL�vQWU�R�GHFODUD LH��LQGLF��R�GHFODUD LH�GHILQLWRULH��FH�VSHFLILF�FX�FH�YD�IL�XPSOXW�UHVSHFWLYXO�VSD LX�GH�PHPRULH���0DL�MRV�HVWH�SUH]HQWDW�XQ�H[HPSOX�

int zile [7] = { 1, 1, 1, 1, 1, 1, 1 } ;char name1 [] = { "Costica" } ;char name2 [] = "Dragan" ;struct datep

{int i ; // nr. ani

char str [21] ; //nume double d ; //salar } vas = { 28, "Vasile", 1500000.0 } ;

16

Page 18: Introducere in c++

Introducere in programare

$FHHDúL� YDULDELO�� QX� VH� SRDWH� LQL LDOL]D� FX� GRX�� YDORUL�� GHFkW� vQ� FD]XO� vQ� FDUH� VHUHQXQ ��OD�YDORDUHD�DQWHULRDU��FX�FDUH�D�IRVW�LQL LDOL]DW��

1X�SRW�H[LVWD�GRX��GHFODUD LL�GHILQLWRULL��FDUH�vL�VSHFLILF��FRQ LQXWXO��vQWU-un program.

3.2.Tipuri de variabile

8QD�GLQ� FHOH�PDL� GLILFLOH� SUREOHPH�� FDUH� DSDU� vQ� FDGUXO� vQY� �ULL� XQXL� OLPEDM� GHSURJUDPDUH��HVWH�GHVFULHUHD�XQHL�VLWXD LL�GLQ�OXPHD�UHDO��IRORVLQG�HOHPHQWHOH�UHVSHFWLYXOXLlimbaj.

ÌQ� DIDU�� GH� SURSXQHUHD� XQXL� DOJRULWP� SHQWUX� D� UH]ROYD� R� SUREOHP�� UHDO��SURJUDPDWRUXO� PDL� HVWH� FRQIUXQWDW� úL� FX� XQ� DOW� DVSHFW� GLILFLO�� DOHJHUHD� WLSXOXL� GH� GDW�SHQWUX�R�YDULDELO��WUHEXLH�I�FXW��vQ�FRQFRUGDQ ��FX�YDORULOH�FDUH�OH�SRDWH�OXD�DFHDVWD�

'H� DFHHD� SULPXO� SDV� HVWH� V�� YHGHP� FH� WLSXUL� IXQGDPHQWDOH� GH� GDWH� QH� SXQH� ODGLVSR]L LH� OLPEDMXO�&�SUHFXP�úL�JDPD�GH�YDORUL� vQ�FDUH�HYROXHD]��DFHVWHD��2�GDW�� úWLXWHDFHVWH�OXFUXUL�SXWHP�vQFHSH�V��YHGHP�FDUH�HVWH�OHJ�WXUD�FX�H[HPSOHOH�GLQ�YLD D�UHDO��

'LQ�DQDOL]D�LQIRUPD LHL�FDUH�FLUFXO��FXUHQW�vQWUH�RDPHQL�UH]XOW��F��H[LVW���GLQ�SXQFWGH�YHGHUH�DO�SURFHV�ULL��GRX��WLSXUL�GH�LQIRUPD LH�- LQIRUPD LH� RE LQXW�� SULQ� P�VXU�WRUL� DVXSUD� IHQRPHQHORU� UHDOH�� FDUH� VXQW� H[DFWH� úL

DVXSUD�F�URUD�VH�IDF�SUHOXFU�UL�PDWHPDWLFH�GH�RELFHL�- LQIRUPD LH� VXE� IRUP�� FRQGHQVDW�� FDUH�GH� RELFHL� HVWH� UHFRPSXV�� DVRFLDWLY� vQ�PLQWHD

XPDQ���FXP�DU�IL�OLPEDMXO�VL�LQIRUPD LD�VFULV��

'H�DLFL�UH]XOW��F��vQWU�XQ�OLPEDM�GH�SURJUDPDUH�DYHP�QHYRLH�GH�GRX��WLSXUL�GH�YDULDELOH�FDUH�V��SRDW��IL�IRORVLWH�SHQWUX�

- stocarea unor valori numerice. - VWRFDUHD�XQRU�FDUDFWHUH��LQIRUPD LH�VFULV��

&RQIRUP� DFHVWRU� QHFHVLW� L� OLPEDMXO� &� D� IRVW� SUHY�]XW� FX� XUP�WRDUHOH� WLSXULfundamentale de date:

- int �VWRFKHD]��QXPDL�QXPHUH�vQWUHJL�- float, double�SHQWUX�QXPHUH�]HFLPDOH���FDOFXO�vQ�YLUJXO��PRELO��- char�SHQWUX�D�VWRFD�FRGXO�XQXL�FDUDFWHU�VDX�XQ�QXP�U�vQWUHJ�UHSUH]HQWDW�SH�PD[LPXP

RSW�EL L�LQFOX]kQG�úL�VHPQXO�2EVHUYD LH���char[QU@�YD�UH LQH�XQ�úLU�GH�nr caractere sau întregi.

8QD�GLQWUH�XWLOL]�ULOH�úLUXULORU�GH�FDUDFWHUH�DU�IL�PHVDMHOH�GH�GLDORJ�FX�XWLOL]DWRUXO�XQXLSURJUDP��VDX�PHVDMHOH�GH�HURDUH�� ÌQ�DFHVW�FD]�QX�QH�LQWHUHVHD]��FRQ LQXWXO�GLQ�SXQFW�GHvedere al valorii lor numerice ca atare.

)XQF LH� GH� QHFHVLW� LOH� SURJUDPDWRUXOXL� SXWHP� VSXQH� F�� H[LVW�� GRX�� FODVH� GH� WLS� GHdate care pot fi folosite în cazul unui limbaj de nivel mediu sau înalt:

1. tipuri de date predefinite �� tipuri de date definite de utilizator.

17

Page 19: Introducere in c++

Introducere in programare

CAPITOLUL 4

4. Tipuri de date predefinite

4.1. Date numerice

/LPEDMXO�&� HVWH� SUHY�]XW� FX� XQ� VHW� GH� GDWH�predefinite. Aceste tipuri de date sunt FRQFUHWL]DWH�SULQ� IRORVLUHD�XQXL�QXP�U� GH� ORFD LL� GH�PHPRULH�� SHQWUX� VWRFDUHD�� FRQIRUPXQXL�DOJRULWP�ELQH�GHILQLW�IXQF LH�GH�WLSXO�GH�GDW���D��XQXL�WLS�GH�GDWH�H[LVWHQWH��ÌQ�FD]XOtipului de date FKDU�� GHúL� D� IRVW� LQWURGXV� SHQWUX� VWRFDUHD� GDWHORU� GH� WLS� DOIDQXPHULF�� HOSRDWH�IL�IRORVLW�vQ�FDOFXOH�PDWHPDWLFH�úL�ORJLFH�vQ�LQWHUYDOXO�GH�YDORUL�QXPHULFH�SH�FDUH�OHpoate stoca.

3HQWUX�WLSXULOH�GH�GDWH�FH�VWRFKHD]��YDORUL�QXPHULFH�vQWUHJL��SUHVFXUWDW�LQW��VDX���GXS�

cum am spus FKDU��QXP�UXO�HVWH�VWRFDW�vQ�PHPRULH�GLUHFW�VXE�IRUPD�UH]XOWDW��OD�FRQYHUVLDîn binar.

În cazul datelor de tip real, float, sau GRXEOH�OD�FRQYHUVLD�GLUHFW��D�QXP�UXOXL�vQ�ED]DGRL�V�DU�IL�SLHUGXW�SUHD�PXOWH� ORFD LL�GH�PHPRULH�úL�GH�DFHHD�HOH�VH�S�VWUHD]�� VXE�IRUPDúWLLQ LILF���$FHDVW��IRUP��VH�UHIHU��OD�IDSWXO�F��H[LVW��R�]RQ��GH�PHPRULH�FDUH� LQH�PDQWLVDúL� R� ]RQ�� GH�PHPRULH� FDUH� LQH� H[SRQHQWXO��8Q� H[HPSOX� GH� UHSUH]HQWDUH� úWLLQ LILF�� GLQpunct de vedere matematic ar fi:

123344445455454=1.23344445455454 * 1014 =1.23344445455454E+14

unde mantisa=1,23344445455454 iar exponentul = 14.

0DL�MRV�SUH]HQW�P�R�VHULH�GH�WLSXUL�GH�GDWH�SUHGHILQLWH��GLPHQVLXQLOH�ORU�úL�GRPHQLXOYDORULORU� FDUH� SRW� IL� VWRFDWH�� 6H� REVHUY�� F�� V�DX� IRORVLW� PRGLILFDWRUL� GH� WLS�� 3ULPPRGLILFDWRUL�GH�WLS�VH�vQ HOHJ�FXYLQWH�FKHLH�FDUH�DX�FD�HIHFW��OD�FRPSLODUH��FD�GLPHQVLXQHD�vQ�RFWH L��SH�FDUH�HVWH�UHSUH]HQWDW�XQ�WLS�GH�GDWH�V��FUHDVF���FX�XQ�IDFWRU�FDUH�HVWH���VDX�Rputere a lui doi)).

char ∈{–128, 127} 1 octet unsigned char ∈{0, 255} 1 octet I�U��VHPQsigned char ∈{–128, 127} 1 octet cu semn int ∈{–32768, 32767 } 1 cuvânt (2 octeti) unsigned int ∈{0, 65535} �� FXYkQW� I�U�semn signed int ∈{–32768, 32767} 1 cuvânt cu semn short int ∈{–32768, 32767} 1 cuvânt cu semn unsigned short int ∈{0, 65535} �� FXYkQW� I�U�semn

18

Page 20: Introducere in c++

Introducere in programare

signed short int –32768 to 32767 1 cuvânt cu semn long int ∈{–2147483648, 2147483647} 2 cuvinte signed long int ∈{–2147483648, 2147483647} 2 cuvinte cu semn float ∈{–3.4E–38, 3.4E+38} 2 cuvinte double ∈{–1.7E–308, 1.7E+308} 4 cuvinte long double ∈{–3.4E–4932, 1.1E+4932} 5 cuvinte

2EVHUYD LH�� $FHVWH� LQWHUYDOH� VXQW� GH� RELFHL� VSHFLILFH� VLVWHPXOXL� GH� RSHUDUH� VXE� FDUHOXFUHD]���FRPSLODWRUXO��úL�PDúLQLL�SH�FDUH�DFHVWD�HVWH�H[HFXWDW��'RPHQLLOH�GH�PDL�VXV�VXQWvalabile pentru compilatorul de C++ realizat de Borland.

������2SHUDWRUXO�YLUJXO�a,b �HYDOXHD]��D�HYDOXHD]��E$FHVW�RSHUDWRU�SHUPLWH�HYDOXDUHD�D�GRX��VDX�PDL�PXOWH�H[SUHVLL�GLVWLQFWH�LQ�ORFXULOH�LQFDUH�R�VLQJXU��H[SUHVLH�HVWH�DGPLV��D�IL�IRORVLW���DVWD�H�UD LXQHD�LQWURGXFHULL�OXL��De ex:

for ( j=0,k=100 ; k-j>0 ; j++,k-- ) este chivalent cu j=0 ; k=100; j=0 , k=100 { { … … j++; sau j++; k--; k--; } }

8Q�DOW�H[HPSOX�IXQF LD�break_line: break_line (int interval)

{ int c,j; for (c=getchar(),j=0 ; c!=EOF ; c=getchar (),putchar (c),j++) if (j % interval = = 0 ) printf( “\n” ) ;}

4.2. Date alfanumerice

ÌQ� FDGUXO� SURLHFW�ULL� XQHL� DSOLFD LL� SRW� DSDUH� SH� OkQJ�� FHULQ H� OHJDWH� GH� FDOFXOHQXPHULFH�FRPSOH[H�úL�FHULQ H�SHQWUX��SURFHVDUHD�GH�WH[WH�VDX�D�XQRU�ED]H�GH�GDWH�

ToWDOLWDWHD�FDUDFWHUHORU�FH�SRW�IL�DILúDWH�VDX�OLVWDWH�vQ�FD]XO�OXFUXOXL�VXE�XQ�VLVWHPGH� RSHUDUH� FODVLF� �81,;� VDX� '26��� VH� QXPHVF� FDUDFWHUH� DOIDQXPHULFH� �DOIDEHWLFH� úLQXPHULFH��� )LHFDUH� FDUDFWHU� DUH� R� LPDJLQH� SH� HFUDQ�� $FHDVW�� LPDJLQH� HVWH� VWRFDW�� vQmemoria QHYRODWLO��D�FDOFXODWRUXOXL��úL�DUH�DWDúDW�XQ�FRG�XQLF�OD�FDUH�VH�IDFH�DSHO�FkQG�VHGRUHúWH�DILúDUHD�VDX�OLVWDUHD�HL�

'DWRULW�� QHFHVLW� LL� FD� XQ� WH[W� HGLWDW� � SH� XQ� VLVWHP� IDEULFDW� GH� R� DQXPH� ILUP�� V��úLS�VWUH]H� vQ HOHVXO� V�D� WUHFXW� OD� VWDQGDUGL]DUHD� FRG�ULL� LPDJLQLORU� FDUDFWHUHORU�� $VWIHO� DUH]XOWDW�VWDQGDUGXO�$6&,,�IRORVLW�OD�RUD�DFWXDO��GH�WRDWH�FDOFXODWRDUHOH�GLQ�VHULD�;���

([LVW������GH�FDUDFWHUH� vQ�DFHVW�VWDQGDUG��1X�YRP�IDFH�UHIHULUL� OD�VHWXULOH�H[WLQVH�GHcaractere specifice editoarelor de teste sau sistemelor de operare de tip Windows sau XWindows.

19

Page 21: Introducere in c++

Introducere in programare

3HQWUX�VWRFDUHD�XQXL�úLU�GH�FDUDFWHUH�OLPEDMXO�&�IRORVHúWH�XQ�WDEORX�monodimensional GH� FDUDFWHUH� FDUH� SRDWH� VWRFD� FRGXULOH� D� PD[LPXP� ���� GH� FDUDFWHUH� R� GDW�� vQ� FD]XOGHFODU�ULL�VWDWLFH�

2EVHUYD LD� ���'DF�� V�D� GHILQLW� YDULDELOD� V� FD� DYkQG� FDSDFLWDWHD� GH� VWRFDUH� GH� ��� GHcaractere iar la citirea ei sunt introduse mai mult de 25, atunci numai pentru primele 25 QX�H[LVW�� ULVFXO�SLHUGHULL� ORU�SH�SDUFXUVXO�H[HFX LHL�SURJUDPXOXL�� ÌQ�DFHVW�FD]�SRW�DS�UHDerori mascate în cod.

2EVHUYD LD����ÌQ�FD]XO�vQ�FDUH�QX�DP�GHILQLW�QXP�UXO�GH�FDUDFWHUH�FDUH�SRDWH�IL�VWRFDWvQ� UHVSHFWLYD� YDULDELO��� IXQF LH� GH�PRGXO� GH� FRQVWUXF LH� DO� FRPSLODWRUXOXL�� ILH� VH� DORF�GLPHQVLXQHD�PD[LP�SRVLELO����ILH�OD�SULPD�LQL LDOL]DUH�VH�DORF��H[DFW�FkW�HVWH�QHFHVDU�GDUnu peste maximul definit.

2EVHUYD LD��� 1X�H[LVW��QLFL�R�OHJ�WXU��vQWUH�YDORDUHD�QXPHULF��[�úL�FDUDFWHUXO�[�FDUHapare pe ecran. De exemplu 2 ≠ ‘2’.

,QL LDOL]DUHD�XQHL�GDWH�FX�R�YDORDUH�XWLO��SRDWH�DYHD�ORF�vQ�XUP�WRDUHOH��PRGXUL�- la declararea ei; - la citirea datelor de intrare; - oriunde în program .

4.2.1. Caractere speciale de control

3H�OkQJ��FDUDFWHUHOH�GLUHFW�DILúDELOH�PDL�H[LVW��vQ�OLPEDMXO�&�R�VHULH�GH�FDUDFWHUH�GHFRQWURO��$FHVWHD�SURYLQ�GLQ�QHFHVLWDWHD�GH�FRQWURO�D�XQHL� LPSULPDQWH�úL�VLPXOWDQ�DX�IRVWIRORVLWH�úL�OD�DILúDUHD�SH�WHUPLQDOHOH�DOIDQXPHULFH�

6HFYHQ D Cod Caracter \a 07h BEL (alert produce un semnal sonor) \b 08h BS (backspace) \f 0Ch FF (form feed PXW� FXUVRU OD

XUP�WRDUHD SDJLQ��

\n 0Ah LF \r 0Dh CR (carriage return, salt la inceput de

linie QRX��

\t 09h HT (horizontal tab) \v 0Bh VT (vertical tab) \\ 5Ch \ (backslash) \’ 27h ’ (apostrof) \” 22h ” (ghilimele) \? 3Fh ? (semnul vQWUHE�ULL)

\ooo ooo Caracterul cu codul ooo în octal \xhh hh Caracterul cu codul hh în hexa

3HQWUX� MXVWLILFDUHD� LQWURGXFHULL�DFHVWRU�FDUDFWHUH�GH� FRQWURO� VH�YD�SUH]HQWD�XUP�WRUXOFD]��HUD�LQXWLO��WULPLWHUHD�XQL�QXP�U�IL[�GH�FDUDFWHUH�LGHQWLFH�GH�ILHFDUH�GDW��FkQG�VH�GRUHDXQ� WDEXODWRU� �XQ� DQXPLW� QXP�U� GH� VSD LL� JRDOH�� OD� vQFHSXWXO� XQXL� SDUDJUDI� úL� DWXQFL� V�DFRQYHQLW� V�� VH� IRORVHDVF�� XQ� FDUDFWHU� GH� FRQWURO�� XUPkQG� FD� LPSULPDQWD� V��OUHFRQYHUWHDVF�� LQWHUQ� vQ� VSD LL� JRDOH�� $QWHULRU� V�D� SUH]HQWDW� XQ� WDEHO� FH� FRQ LQH� DFHVWHcaractere.

�����2SHUD LXQL�VLPSOH�GH�FLWLUH�VDX�DILúDUH�D�GDWHORU)

20

Page 22: Introducere in c++

Introducere in programare

/LPEDMXO�&�DUH�OD�GLVSR]L LH�R�VHULH�GH�IXQF LL�SHQWUX�FLWLUHD�GDWHORU�GH�OD�WDVWDWXU�VDX� SHQWUX� DILúDUHD� ORU� SH� HFUDQ�� &HOH� PDL� IRORVLWH� GLQWUH� HOH� VXQW� JUXSDWH� vQ� GRX�

biblioteci conio.h (&21VROH,QSXW2XWSXW�+HDGHU�� úL� �StandardInputOutput.Header) stdio.h.

�������)XQF LL�GH�LQWUDUH�VDX�LHúLUH�FX�XWLOL]DWRUXO)

Pentru a putea discuta primele programe este necesar studierea modului în care un SURJUDP� SRDWH� VFKLPED� GDWH� GLVSR]LWLYHOH� VWDQGDUG� GH� LQWUDUH� VDX� LHúLUH� �PRQLWRU�WDVWDWXU����'LQ�DFHVW�SXQFW�GH�YHGHUH�H[LVW��GRX��FODVH�GH�IXQF LL�

- XQF LL� GH� LQWUDUH�� FX� DMXWRUXO� F�URUD� VLVWHPXO� GH� FDOFXO� SULPHúWH� GH� OD� WDVWDWXU�YDORUL� QXPHULFH�� FRPHQ]L� úL� RULFDUH� DOW� WLS� GH� LQIRUPD LH� FH� SRDWH� IL� IXUQL]DW�� SULQintermediul acelui dispozitiv.

- XQF LL�GH�LHúLUH��FX�DMXWRUXO�F�URUD�VLVWHPXO�GH�FDOFXO�OLYUHD]��UH]XOWDWHOH��DILúHD]��IRORVLQG�XQ�GLVSR]LWLY�VWDQGDUG�GH�LHúLUH��PRQLWRU�VDX�LPSULPDQW���

3HQWUX�D�FLWL�R�GDW��VDX�XQ�úLU�GH�GDWH�GH�OD�WDVWDWXU��DYHP�R�IXQF LH�VSHFLDOL]DW��FDUHpoate citi orice tip SUHGHILQLW�GH�GDWH��)XQF LD�DUH�SURWRWLSXO�SUH]HQWDW�PDL�MRV

int scanf (const char *format [,address, ...]);

7LSXO�GH�GDWH�HVWH�VSHFLILFDW�GH�F�WUH�SURJUDPDWRU�SULQ�PRGLILFDUHD�XQRU�SDUDPHWUL�DLIXQF LHL��0DL�MRV�HVWH�GDW�XQ�VFXUW�H[HPSOX�

#include <stdio.h> #include <conio.h>

void main (void){int a;char c;char b[20];float d;FOUVFU�������úWHUJH�HFUDQXO

VFDQI�³�G´��D������FLWHúWH�XQ�vQWUHJ�úL�O�GHSR]LWHD]��vQ

// variabila a VFDQI�³�F´��F������FLWHúWH�XQ�FDUDFWHU

VFDQI�³�V´��E������FLWHúWH�XQ�úLU�GH�FDUDFWHUH

VFDQI�³�I´��G������FLWHúWH�XQ�QXP�U�]HFLPDO

getch(); }

$FHDVW�� IXQF LH�� OD�DSHODUH��SUHLD� LQIRUPD LD� LQWURGXV��GH� OD� WDVWDWXU�� �GXS�� DS�VDUHDWDVWHL� (17(5�� &D� HIHFW� XWLOL]DWRUXO� YHGH� GRDU� F�� SURJUDPXO� vúL� RSUHúWH� GHUXODUHD� úL

21

Page 23: Introducere in c++

Introducere in programare

DúWHDSW�� FHYD�� GDU� I�U�� D� SULPL� XQ� PHVDM� FDUH� V�� vL� FRPXQLFH� FH� WUHEXLH� V�� IDF�� VDXLQIRUPD LL�GHVSUH�QDWXUD�GDWHORU�FDUH�WUHEXLHVF�OLYUDWH�

0DL�MRV�HVWH�SUH]HQWDW�SURWRWLSXO�XQHL�IXQF LL�GHV�IRORVLW��vQ�DILúDUHD�GLYHUVHORU�WLSXULde date.

int printf (const char *format [, argument, ...]);

SULQWI�³$ILúHD]�Ex: �FHOH���QXPHUH���G��G��G´�QU��QU��QU���

Vom prezenta un prim exemplu despre unele din SRVLELOLW� LH�GH�DILúDUH�DOH�IXQF LHL�printf .

#include <stdio.h>

main() { int a; /*întreg simplu */ long int b; /* întreg lung */ short int c; /* întreg scurt */ unsigned LQW�G������� �vQWUHJ�I�U��VHPQ���������������� �char e; /* caracter simplu */ IORDW�I�������������� QXP�U�]HFLPDO�vQ��VLPSO��SUHFL]LH������������������ �

GRXEOH�J������������� QXP�U�]HFLPDO�vQ�GXE��SUHFL]LH������ �

a = 1023; b = 2222; c = 123; d = 1234;

e = 'X'; f = 3.14159; g = 3.1415926535898;

printf("a = %G?Q��D����� �DILúDUH�IRORVLQG�ED]D����GH�QXPHUD LH������� � printf("a = %R?Q��D��������� �DILúDUH�IRORVLQG�ED]D���GH�QXPHUD LH� � printf("a = %[?Q��D��������� �DILúDUH�IRORVLQG�ED]D����GH�QXPHUD LH� � printf("b = %OG?Q��E�������� �DILúDUH�VSHFLILF��SHQWUX�vQWUHJ�OXQJ������ � printf("c = %G?Q��F��������� �DILúDUH�VSHFLILF��SHQWUX�vQWUHJ�VFXUW� � printf("d = %X?Q��G������� �DILúDUH�VSHFLILF��SHQWUX�vQWUHJI�U��VHPQ� � printf("e = %F?Q��H��������� �DILúDUH�VSHFLILF��SHQWUX�FDUDFWHU� �

printf("f = %I?Q��I��������� �DILúDUH�VSHFLILF��SHQWUX�QXP�U�vQ�VLPSO��SUHFL]LH� �

printf("g = %I?Q��J��������� �DILúDUH�VSHFLILF��SHQWUX�QXP�U�vQ�GXEO��SUHFL]LH� �

printf("\n"); /*salt la line QRX� � printf("a = %G?Q��D��������� �DILúDUH�VSHFLILF��SHQWUX�vQWUHJ� �SULQWI��D� ���G?Q��D�������� �DILúDUH�VSHFLILF��SHQWUX�XQ��vQWUHJ�GDU�DORFkQG��

caractere în dreapta */

22

Page 24: Introducere in c++

Introducere in programare

SULQWI��D� ����G?Q��D������ �DILúDUH�VSHFLILF��SHQWUX�XQ��vQWUHJ�GDU

alocând 7 caractere în stânga */ c = 5; d = 8;

printf("a = %*d\n",c,a); /* folosim un câmp de 5 caractere */ printf("a = %*d\n",d,a); /* folosim un câmp de 8 caractere */ printf("\n"); printf("f = %I?Q��I����� �DILúDUH�SHQWUX�QXP�U�vQ�VLPSO��SUHFL]LH������� �

printf("f = %12f\n",f); /* folosim un câmp de 12 caractere */ SULQWI��I� ������I?Q��I����� �IRORVLP�XQ�FkPS�GH����FDUDFWHUH�GXS�

YLUJXO�� �

SULQWI��I� ������I?Q��I���� �IRORVLP�XQ�FkPS�GH����FDUDFWHUH�GXS�

YLUJXO�� �

SULQWI��I� �������I?Q��I���� �DILúDUH�VSHFLILF��SHQWUX�XQ��QXP�U�vQ

VLPSO��SUHFL]LH�GDU�DORFkQG���FDUDFWHUH�vQ�VWkQJD� �

} 6��UHOX�P�H[HPSOXO�SUH]HQWDW�OD�FLWLUHD�GDWHORU�LQWURGXFkQG�GH�DFHDVW��GDW��úL

mesajele pentru utilizator.

#include <stdio.h>#include <conio.h>

void main (void){int a;char c;char b[20];float d;FOUVFU�������úWHUJH�HFUDQXO

printf(“Introduceti o valoare intreaga”)VFDQI�³�G´��D������FLWHúWH�XQ�vQWUHJ�úL�O�GHSR]LWHD]��vQ��� variabila aprintf(“\nValoarea citita este %d”, a);printf(“\nDati un caracter ”)VFDQI�³�F´��F������FLWHúWH�XQ�FDUDFWHU

printf(“\nCaracterul citit este %c”,c);prinf(“\nDati un sir de caractere ”);VFDQI�³�V´��E������FLWHúWH�XQ�úLU�GH�FDUDFWHUH

printf(“\nS-a citit urmatoarea propozitie %s”,b);printf(“\nDati un numar zecimal”);VFDQI�³�I´��G������FLWHúWH�XQ�QXP�U�]HFLPDO

printf(“\n Sa citi numarul %f”,d)printf(“\nApasa orice tasta pentru a continua”)getch();}

23

Page 25: Introducere in c++

Introducere in programare

CAPITOLUL 5

5. Operatori ai limbajului C

8Q�RSHUDWRU�UHSUH]LQW��GLQ�SXQFW�GH�YHGHUH�DO�SURJUDP�ULL��DFHO�VLPERO�FDUH�DO�WXUDW�ODXQD�VDX�GRX��QXPH�GH�YDULDELOH�VSHFLILF���RSHUD LD�FH�WUHEXLH�UHDOL]DW��DVXSUD�ORU��)XQF LHGH�QXP�UXO�GH�YDULDELOH��GHFL�GH�GDWH��DVXSUD�F�UXLD�VH�DSOLF��RSHUDWRULL�SRW�IL�FODVLILFD LvQ�GRX��PDUL�FDWHJRULL�

- operatori XQDUL��D�F�URU�IRORVLUH�SRDWH�IL�FD�PDL�MRV�- nume_var_i oper_unar nume_var_j; - oper_unar nume_var_i, unde i, j ∈N;

- RSHUDWRUL�ELQDUL�D�F�URU�IRORVLUH�HVWH�FD�PDL�MRV�- nume_var_i=nume_var_j oper_binar nume_var_k, unde i, j, k ∈N.

Limbajul C are mai multe tipuri de operatori:

- RSHUDWRUL�DULWPHWLFL�FDUH�GDX�SRVLELOLWDWHD�UHDOL]�ULL�RULF�URU�FDOFXOH�DULWPHWLFH�- RSHUDWRUL� UHOD LRQDOL� FH� VXQW� IRORVL L� SHQWUX� WHVWDUHD� UHOD LLORU� FH� SRW� H[LVWD� vQWUH

FRQ LQXWXO�D�GRX��YDULDELOH�- RSHUDWRUL�ORJLFL�IRORVL L�SHQWUX�

- D�SXWHD�UHDOL]D�H[SUHVLL�FRPSOH[H�vQ�FDGUXO�WHVW�ULL�UHOD LLORU�GLQWUH�YDULDELOH�- a procesa la nivel de bit variabilele.

5.1. Operatori aritmetici

$FHVW� WLS� GH� RSHUDWRUL� UHDOL]HD]�� FDOFXOH�PDWHPDWLFH� VLPSOH��'HVLJXU� F�� SUHFL]LD� vQFDUH�YD� IDFH�FDOFXOXO� UHVSHFWLYD�DSOLFD LH� LQH�GH� WLSXO�FRQW�GH�GDW�� DOHV��2SHUDWRULL� VXQWSUH]HQWD L�vQ�OLVWD�GH�PDL�MRV��6��FRQVLGHU�P�GRX��YDULDELOH�D�úL�E��FDUH�OD�XQ�PRPHQW�GDWFRQ LQ�YDORULOH�D� ���úL�E� ���DWXQFL- ‘+’ adunare y=a+bÆy=8 - ‘-‘ VF�GHUH y=a-bÆy=-2 - ‘*’ vQPXO LUH y=a*bÆy=15 - ‘/’ vPS�U LUH y=a/bÆy=0.6000000…0 - ‘%’ modulo y=a%bÆ\ ���UHVWXO�vPS�U LULL�OXL�D�OD�E�

5.2 Expresiile2�H[SUHVLH�FRQVW��GLQWU�XQ�FRQJORPHUDW�UHDOL]DW�GLQ�

Æ operanziÆ operatori

vQ�VFRSXO�FDOFXO�ULL�XQHL�YDORUL�%ORFXULOH�GH�ED]��FRQVWUXFWLYH�DOH�H[SUHVLLORU�SRW�IL��

− variabile− constante

24

Page 26: Introducere in c++

Introducere in programare

− DSHOXUL�IXQF LH

([LVW��SDWUX�PDUL�WLSXUL�LPSRUWDQWH�GH�expresii:. 1. Expresii constante�FDUH�UH LQ�QXPDL�YDORUL�FRQVWDQWH�De exemplu 5

5+6*13/30 ‘a’

2. Expresii întregi care VXQW�H[SUHVLL�FDUH�GXS��UHDOL]DUHD�WXWXURU�FRQYHUVLLORU�DXWRPDWHsau explicite de tip, produc un rezultat care este de tip între. Presupunând j,k întregi DWXQFL�XUP�WRDUHOH�H[SUHVLL�vQWUHJL�

jj* kj/k+3k-‘a’3+(int)5.0

3. ([SUHVLL�vQ�YLUJXO��PRELO��FDUH�VXQW�H[SUHVLL�FDUH�GXS��WRDWH�FRQYHUVLLOH�DXWRPDWH�VDXH[SOLYLWH�GH�WLS��SURGXF�XQ�UH]XOWDW�FDUH�HVWH�vQ�YLUJXO��PRELO���'DF��[�HVWH�float sau GRXEOH��DWXQFL�XUP�WRDUHOH�H[SUHVLL�VXQW�GH�DFHVW�WLS�

xx+3x/y*53.03.0-23+(float) 4

4. Expresii de tip pointer FDUH�VXQW�H[SUHVLL�FDUH�vQ�XUPD�HYDOX�ULL�GDX�R�DGUHV���'HH[HPSOX�GDF��S�HVWH�pointer, iar j este întreg:

p, p+1, (char* ) 0x00ffffff, &j, “abc” sunt expresii de tip pointer.

������2UGLQHD�GH�HYDOXDUH�D�XQHL�H[SUHVLL�IXQF LH�GH�SUHFHGHQ D�RSHUDWRULORU�G

8QXO�GLQ�SULPHOH�OXFUXUL�GH�FDUH�WUHEXLH� LQXW�VHDPD��FkQG�VH�VFULX�H[SUHVLL�DULWPHWLFHFRPSOH[H��HVWH� IDSWXO�F�� VSD LLOH�DOEH� �VSD LX�� WDEXODWRU�� VDOW� OD� OLQLH�QRX���QX�DX� vQ HOHV�QX�VXQW�OXDWH�vQ�FRQVLGHUDUH���'H�H[HPSOX�FHOH�GRX��H[SUHVLL�GH�PDL�MRV�VXQW�HFKLYDOHQWH�

y=x*x+2*x-5*x/y ;y=x * x + 2 * x – 5 * x / y;

2DPHQLL� IRORVHVF� FkWHRGDW�� VSD LX� vQ� ORF� GH� SDUDQWH]H� SHQWUX� D� VSHFLILFD�PRGXO� GHHYDOXDUH�D�XQHL�H[SUHVLL��1R LXQHD�GH�HYDOXDUH�VH�UHIHU�� OD�RUGLQHD�vQ�FDUH�VH�YRU�UHDOL]DFDOFXOHOH� GLQWU�R� H[SUHVLH� PDWHPDWLF��� � ÌQ� FDGUXO� XQXL� OLPEDM� GH� SURJUDPDUH� QXPDL

25

Page 27: Introducere in c++

Introducere in programare

SDUDQWH]HOH�MRDF��DFHVW�URO��ÌQ�OLSVD�SDUDQWH]HORU�GLQWU�R�H[SUHVLH�VH�YRU�UHVSHFWD�UHJXOLOHGH�SUHFHGHQ ��LPSOLFLW��

�&D�XQ�H[HPSOX�V��GLVFXW�P�PRGXO�GH�HYDOXDUH�D�H[SUHVLH�GH�PDL�VXV�GDF���VH�YD� LQHVHDPD� QXPDL� GH� SUHFHGHQ HOH� LPSOLFLWH�� 'HRDUHFH� RSHUDWRULL� ^ �� ��� �`� DX� DFHHDúLSUHFHGHQ ��FDUH�vQV��HVWH�PDL�PDUH�FD�D��RSHUDWRULORU�^���`�HYDOXDUHD�H[SUHVLHL�VH�YD�IDFHGH�OD�VWkQJD�OD�GUHDSWD�GXS��FXP�XUPHD]��

1. VH�FDOFXOHD]��YDORDUHD�OXL�x*x; 2. VH�FDOFXOHD]��YDORDUHD�OXL�� [�3. VH�FDOFXOHD]��YDORDUHD�OXL�� [�4. VH�FDOFXOHD]��YDORDUHD�OXL��� [��\�5. se face suma (x*x)+(2*x); 6. VH�IDFH�VF�GHUHD��x*x)+(2*x) - (5*x)/y.

1R LXQHD� GH� SUHFHGHQ �� VH� UHIHU�� OD� PRGXO� vQ� FDUH� LDX� GHFL]LL� vQ� HYDOXDUHD� XQHLH[SUHVLL�GDF��QX�DP�SXVH�SDUDQWH]H��0DL�MRV�HVWH�SUH]HQWDW�WDEHOXO�FX�WRDWH�SUHFHGHQ HOHimplicite:

Operatori 2UGLQHD�GH�SUHFHGHQ �() [] Æ de la stânga la dreapta

! ~ ++ -- + - (unary) & de la dreapta la stânga (type) sizeof

* / % de la stânga la dreapta + - de la stânga la dreapta

<< >> de la stânga la dreapta < <= > >= de la stânga la dreapta

== != de la stânga la dreapta & de la stânga la dreapta ^ de la stânga la dreapta | de la stânga la dreapta

&& de la stânga la dreapta || de la stânga la dreapta ?: de la dreapta la stânga

= += -= *= /= %= &= de la dreapta la stânga ^= |= <<= >>=

, de la stânga la dreapta

5.3. Tipuri aritmetice de date

1XPHUHOH�vQWUHJL�VXQW�UHSUH]HQWDWH�GLIHULW�GH�FHOH� vQ�YLUJXO�� IORWDQW���'H�DFHHD�DSDUHXUP�WRDUHD�SUREOHP���FRQYHUVLD�QXPHUHORU�dintr − un format într-altul.

'DF�� VH�GRUHúWH�FD� UH]XOWDWXO�V�� ILH�VWRFDW� vQWU�XQ�DOW� IRUPDW�PDL�PXOW� VDX�PDL�SX LQFXSULQ]�WRU�DWXQFL�DFHVWD�WUHEXLH�GHSXV�într−R�YDULDELO��GH�UHVSHFWLYXO�WLS�úL�FRQYHUVLD�VHYD�IDFH�DXWRPDW��([LVW��FD]XUL�vQ�FDUH�FRPSLODWRUXO��GHúL�DFFHSW��FRQYHUVLD��G��XQ�PHVDM

26

Page 28: Introducere in c++

Introducere in programare

GH� DWHQ LRQDUH�� $FHDVW�� VLWXD LH� DSDUH� DWXQFL� FkQG� VH� SRDWH� DOWHUD� YDORDUHD� XQRU� GDWHdeoarece formatul în care fac conversia este mai mic.

'DF�� SURJUDPDWRUXO� HVWH� VLJXU� F�� GRUHúWH� UHVSHFWLYD� FRQYHUVLH� DWXQFL� WUHEXLH� V�UHDOL]H]H� R� FRQYHUVLH� H[SOLFLW�� SHQWUX� FD� UHVSHFWLYXO� PHVDM� GH� DWHQ LRQDUH� V�� GLVSDU��'HRDUHFH�OD�FRQYHUVLLOH�LPSOLFLWH�VH�SRDWH�DOWHUD�YDORDUHD�FDOFXODW��SRDWH�DS�UHD��R�HURDUHJUHX�GHWHFWDELO��

S1= (int)((double)z/x+0.5);

ÌQ�H[HPSOXO�GH�PDL�VXV�VH�IRU HD]���WUXQFKLHUHD�GH�OD�R�UHSUH]HQWDUH�GH�WLS�double la o reprezentare în numere întregi.

'DWHOH�QX�SRW�IL�DOWHUDWH�GDF��VH�UHDOL]HD]��R�FRQYHUVLH�GH�WLS� vQWUH�XQ�WLS�GH�GDW��FXGRPHQLX�GH�YDORUL�PDL�PLF�úL�XQ�WLS�GH�GDW��DO�F�UXL�GRPHQLX�HVWH�PDL�PDUH�

5.4. Operatorii unari ++�úL�- -

'XS�� FXP� V�D� PHQ LRQDW� DFHúWL� RSHUDWRUL� VH� QXPHVF� XQDUL� GHRDUHFH� VH� DSOLF�DVXSUD�XQHL�VLQJXUH�YDULDELOH��H[SUHVLL��OD�XQ�PRPHQW�GDW��(L�UHDOL]HD]��LQFUHPHQWDUHD�VDXdecrementarea valorii respective cu o unitate.

/LPEDMXO� &� PDL� DUH� XQ� DYDQWDM�� DFHúWL� RSHUDWRUL� SRW� IL� IRORVL L� SHQWUX� SRVW� VDXpreincrementare. Acest lucru este prezentat în exemplu de mai jos: 'DF��[ ��DWXQFL�

Preincrementare y=++x ÅÆ x=x+1=5 úL�\ [ �Predecrementare y=--x ÅÆ x=x-1=3 úL�\ [ �Postincrementare y=x++ ÅÆ y=x=4 úL�[ [�� �Postdecrementare y=x-- ÅÆ y=x=4 úL�[ [�� �

5.5. Operatorii op=

$X� IRW� LQWURGXúL� SHQWUX� VLPSOLILFDUHD� VFULHULL� FRGXOXL��2� LQVWUXF LXQH� JHQHULF�� GHtipul rez = rez op opd1 ÅÆ UH]�RS� �RSG���$FHúWL�RSHUDWRUL�DSDU LQ�XUP�WRDUHL�FODVH�^+= -= = /= %= &= ^= |= } de exemplu: x=x*7 ÅÆx*=7;

�����2SHUDWRUL�UHOD LRQDOL�úL�ORJLFLG

Pentru a se putea lua decizii într-un program, deci pentru a realiza ramificarea IOX[XOXL� GH� SUHOXFUDUH� D� GDWHORU�� WUHEXLH� V�� H[LVWH� R� PRGDOLWDWH� GH� FRPSDUDUH� DLQIRUPD LLORU� úL� GH� DVHPHQL� GH� FRPELQDUH� � D� H[SUHVLLORU� ORJLFH� SULPLWLY� vQ� H[SUHVLL�PDLcomplexe.

'H�H[HPSOX�GDF��vQ�YDULDELOHOH�[�úL�\�DP�VWRFDW��YDORDUHD���DWXQFL�H[SUHVLD�x==y va fi $'(9�5$7��úL�YD�DYHD�OD�HYDOXDUHD�H[SUHVLHL�YDORDUHD�QXPHULF�����GDF��[ ��úL�\ �atunci expresia [ \�YD�IL�)$/6��úL�GHFL�vQ�XUPD�HYDOX�ULL�YD�IL�vQORFXLW��FX�YDORDUHD���

27

Page 29: Introducere in c++

Introducere in programare

Operatori ([SOLFD LHUHOD LRQDOL

== Egal cu != Diferit de > Mai mare ca < Mai mic ca

>= Mai mare sau egal <= Mai mic sau egal

Operatori logici || SAU

&& ù,! NU

5.7. Expresii logice complexe

'H� RELFHL� HVWH� LQVXILFLHQW�� R� VLQJXU�� H[SUHVLH� ORJLF�� VLPSO��� ÌQ� VFULHUHD� XQXLSURJUDP�HVWH�QHFHVDU��GH�PXOWH�RUL�FRPSXQHUHD�D�PDL�PXOWH�GHFL]LL��8Q�H[HPSOX�FODVLFHVWH�FD]XO�vQ�FDUH�WUHEXLH�YHULILFDW��DSDUWHQH D�YDORULL�VWRFDWH�vQWU�R�YDULDELO��OD�XQ�DQXPLWinterval. De exemplu x∈[5,20] este echivalent cu x≥��úL�[≤20 ceea ce folosind operatori ORJLFL�úL�UHOD LRQDOL�VH�SRDWH�VFULH���[! ���[� ����

7DEHOHOH�GH�DGHY�U�SHQWUX�RSHUDWRULL�ORJLFL�DL�OLPEDMXOXL�VXQW�

X Y X&&Y X||Y !X

0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0

8UPHD]��SUH]HQWDUHD�XQ�SURJUDP�VLPSOX�FDUH�UHDOL]HD]��GLYHUVH�RSHUD LL�ORJLFH�FX�XQVHW� GH� YDORUL� LQL LDOL]DWH� GLUHFW� vQ� SURJUDP�� $FHDVW�� PHWRG�� GH� LQL LDOL]DUHD� DUHGH]DYDQWDMXO�F��SURJUDPXO�QX�SRDWH�SULPL�SHQWUX�FDOFXO�DOWH�YDORUL�GHFkW�GDF��VH�PRGLILF�FRGXO�VXUV��

void main(void){char mask;char number[6];// tablou de 6 elemente de tip charchar and,or,xor,inv,index;QXPEHU>�@� ��[������LQL LDOL]DUH�vQ�FRG

number[1] = 0x11; number[2] = 0x22; number[3] = 0x44; number[4] = 0x88; number[5] = 0xFF;

printf(" numerele asupra carora am aplicat diverse operatii logice folosind omasca sunt: \n");

28

Page 30: Introducere in c++

Introducere in programare

mask = 0x0F; for (index = 0;index <= 5;index++) { and = mask & QXPEHU>LQGH[@����úL�ORJLF or = mask | number[index];//sau logic xor = mask ^ number[index];// sau exclusiv inv = ~number[index];// not bit cu bit printf("%5x %5x %5x %5x %5x %5x\n",number[index],

mask,and,or,xor,inv); }

printf("\n"); mask = 0x22; for (index = 0;index <= 5;index++) { and = mask & number[index]; or = mask | number[index]; xor = mask ^ number[index]; inv = ~number[index]; printf("%5x %5x %5x %5x %5x %5x\n",number[index],

mask,and,or,xor,inv); }

}

3HQWUX�UHVWXO�WLSXULORU�GH�RSHUDWRUL�SUH]HQWD L�YRP�GD�XQ�DOW�H[HPSOX�GH�IRORVLUH�D�ORU�

void main(void) { int x = 0,y = 2,z = 1025; float a = 0.0,b = 3.14159,c = -37.234;

/* incrementare */ ���[� �[������������� ��[�VH�LQFUHPHQWHD]�� �

x++; /* x se SRVWLQFUHPHQWHD]�� � ++x; /* x se SUHLQFUHPHQWHD]��[� � z = y++; /* z = 2, y = 3 */ z = ++y; /* z = 4, y = 4 */

/* decrementare */ ���\� �\������������� �\�VH�GHFUHPHQWHD]�� �

y--; /* y este postdecrementat */ --y; /* y este predecrementat */ y = 3;

z = y--; /* z = 3, y = 2 */ z = --y; /* z = 1, y = 1 */

����������������������������������������������� �RSHUD LL�DULWPHWLFH� �

���D� �D������������� �VH�DGXQ�����OD�D� �

���D�� �������������� �VH�DGXQ��vQF�����OD�D� �

29

Page 31: Introducere in c++

Introducere in programare

���D� �������������� �D�VH�vQPXO HúWH�FX����� �

a -= b; /* se scade b din a */ a /= 10.0; /* se împarte a la 10.0 */

�������������������������������������� �H[SUHVLL�FRQGL LRQDOH� �

���D� ��E�! �����"�������������������� �DFHDVW��H[SUHVLH���� �

LI��E�! ��������������������������� �HVWH�LGHQWLF��FX�WRDW��LQVWUXF LXQHD�if… */ a = 2.0; /* din punct de vedere al rezultatului*/

else a = 10.5;

c = (a > E"D�E����������� �F�SULPHúWH�PD[LPXP�GLQWUH�D�úL�E� � c = (a > E"E�D����������� �F�SULPHúWH�PLQLPXO�GLQWUH�D�úL�E� �}

30

Page 32: Introducere in c++

Introducere in programare

CAPITOLUL 6

���,QVWUXF LXQL�GH�VHOHF LH��GHFL]LH��6

�����,QVWUXF LXQH�VLPSO��GH�GHFL]LH

)LH�XUP�WRDUHD�SUREOHP��FH�WUHEXLH�UH]ROYDW��SULQ�LQWHUPHGLXO�XQXL�SURJUDP���VH�UHDOL]H]H�XQ�SURJUDP�FDUH�IDFH�DXWRPDW�FDOFXOXO�PHGLHL�GH�OLFHQ ��úL�D�PHGLHL6

generale. 3URJUDPXO�SULPHúWH�WUHL�PHGLL�GH�OH�H[DPHQHOH�GH�OLFHQ ��úL�QRWD�SULPLW��OD�VXV LQHUHD

SURLHFWXOXL�GH�VWDW��(O�WUHEXLH�V��FDOFXOH]H�PHGLD�vQWUH�QRWHOH�GH�OD�H[DPHQHOH�GH�OLFHQ ��UH]XOWkQG�R�SULP��PHGLH��FDUH�DSRL�VH�PHGLD]�� �FX�QRWD�GH�OD�SURLHFWXO�GH�VWDW�UH]XOWkQGPHGLD�JHQHUDO��

([LVW��R�OLPLWDUH�DVXSUD�GDWHORU�GH�LQWUDUH�FDUH�WUHEXLH�UHDOL]DW��GH�SURJUDP�úL�DQXPHGDF��XQD�GLQ�PHGLLOH�GH�OD�H[DPHQXO�GH�OLFHQ ��HVWH�PDL�PLF��FD�FLQFL�V��QX�PDL�UHDOL]H]HFDOFXOXO�PHGLLORU�ILQDOH�úL�V��O�GHFODUH�SH�UHVSHFWLYXO�FDQGLGDW�UHVSLQV�

2�VROX LH�GH�UH]ROYDUH�D�SUREOHPHL�OD�QLYHO�GH�SVHXGRFRG�DUDW��FD�PDL�MRV�

LQFOXGH�OLEU�ULLOH�QHFHVDUH�OXFUXOXL�vQ�PRG�WH[W6

void main(void) {//început program GHFODU��YDULDELOHOH�Q��Q��Q��QV�P��P��GH�WLS�UHDO��

úWHUJH�HFUDQXO��

FLWHúWH�QRWD��vQ�YDULDELOD�Q���

FLWHúWH�QRWD��vQ�YDULDELOD�Q���

FLWHúWH�QRWD��vQ�YDULDELOD�Q���

GDF���Q�!���úL��Q�!���úL��Q�!���DWXQFL6

{ FLWHúWH�QRWD�VWDW�vQ�YDULDELOD�ns;

UHDOL]HD]��PHGLD�P� �Q��Q��Q�����6

UHDOL]HD]��PHGLD�P� �P��QV����6

DILúHD]��PHGLD�GH�OLFHQ D�P��6

DILúHD]��PHGLD�JHQHUDO��P��6

} DOWIHO�DILúHD]��³&DQGLGDW�UHVSLQV´��

DúWHDSW��R�WDVW��6 `���VIkUúLW�GH�SURJUDP�

6H�REVHUY�� F�� D� IRVW� QHYRLH�GH�R� UDPLILFDUH� OD� QLYHOXO� SURFHV�ULL� GDWHORU�� UDPLILFDUHFDUH�DSDUH�GLQ�QHYRLOH�XWLOL]DWRUXOXL��(VWH�QHYRLH�FD�OD�XQ�PRPHQW�GDW�V��KRW�UkP�PRGXULPXOWLSOH�GH�SUHOXFUDUH�SHQWUX�DFHODúL��IOX[�GH�GDWH�GH�LQWUDUH�

ÌQ� OLPEDMXO� &� SHQWUX� D� LPSOHPHQWD� DFHVW� WLS� GH� GHFL]LL� D� IRVW� LQWURGXV�LQVWUXF LXQHD�if… cu sintaxa ca mai jos:

31

Page 33: Introducere in c++

Introducere in programare

if (FRQGL LH DGHY�UDW���6 GDF��FRQGL LD�HVWH�DGHY�UDW�

{ H[HFXW�� EORF 6

LQVWUXF LXQL�6

H[HFXW��EORF�LQVWUXF LXQL�6 altfel } H[HFXW��EORF�LQVWUXF LXQL�6

else { H[HFXW��EORF�LQVWUXF LXQL�6

};

6LQWD[D� LQVWUXF LXQLL� HVWH� LGHQWLF�� FX� SVHXGRFRGXO�� ELQHvQ HOHV� F�� VH� IRORVHúWH� OLPEDHQJOH]��

)LJ������D��5HSUH]HQWDUHD�SULQ�VFKHPD�ORJLF��D�LQVWUXF LXQLL�GH�GHFL]LH�

)LJ�����E��5HSUH]HQWDUHD�SULQ�VFKHPD�ORJLF��D�LQVWUXF LXQLL�GH�GHFL]LH�VLPSOH

ÌQ� ILJXULOH����D� úL����E�HVWH�SUH]HQWDW�� UHSUH]HQWDUHD� OD�QLYHO�GH� VFKHP�� ORJLF�� DLQVWUXF LXQLL�GH�GHFL]LH��6SUH�GHRVHELUH�GH�DOWH�OLPEDMH�GH�SURJUDPDUH��FXP�DU�IL�3$6&$/GH�H[HPSOX��OLPEDMXO�&�QX�IRORVHúWH�YDULDELOH�GH�WLS�ORJLF�SHQWUX�UH]XOWDWXO�HYDOX�ULL�XQHLexpresii. Valorile comparate pot rezulta din valoarea UHWXUQDW�� GH� R� IXQF LH�� GLQ� FHDVWRFDW��vQWU�R�YDULDELO��VDX�GLUHFW�GDW��vQ�SURJUDP�

'DF�� vQ� ORFXO�FRQGL LHL�� vQ�XUPD�HYDOX�ULL�H[SUHVLHL�UH]XOW��XQ�QXP�U�GLIHULW�GH�]HUR�DFHVWD�YD�IL�FRQVLGHUDW�FD�FRQGL LH�vQGHSOLQLW��úL�GHFL�VH�YD�H[HFXWD�EORFXO��GH�LQVWUXF LXQL�GDF�� HVWH� ]HUR� FRQGL LD� QX� HVWH� VDWLVI�FXW�� DWXQFL� VH� YD� H[HFXWD� EORFXO�� GH� LQVWUXF LXQL�$FHVW� OXFUX� FRQIHU�� XQ� PDUH� DYDQWDM� SULQ� IDSWXO� F�� VH� SRW� LQWURGXFH� GLUHFW� H[SUHVLLPDWHPDWLFH� VDX� DSHOXUL� GH� IXQF LL� FH� UHWXUQHD]�� UH]XOWDWH� QXPHULFH� vQ� ]RQD� GH� WHVW� DFRQGL LHL�

1X�vQWRWGHDXQD�HVWH�QHYRLH�GH�DPEHOH�S�U L�DOH� LQVWUXF LXQLL��GH�H[HPSOX�FkQG�VHH[HFXW�� R� RSHUD LXQH� QXPDL� GDF�� HVWH� vQGHSOLQLW�� R� DQXPLW�� FRQGL LH��'H� IDSW� VWUXFWXUDORJLF�� GH� FRQWURO� DU� WUHEXL�SUHY�]XW�� úL� FX�R� UDPXU�� GH�else dar acest lucru nu ar duce GHFkW� OD� VXSUDvQF�UFDUHD� FRGXOXL�� FHHD� FH� vQJUHXQHD]�� PXOW� GHSDQDUHD� SURJUDPXOXL�UH]XOWkQG�VLQWD[D�SUH]HQWDW��PDL�MRV�

32

Page 34: Introducere in c++

Introducere in programare

if (FRQGL LH DGHY�UDW��6 GDF��FRQGL LD�HVWH�DGHY�UDW��DWXQFL6

{ e[HFXW�� EORF 6

LQVWUXF LXQL6

H[HFXW��EORF�LQVWUXF LXQL6

};

ÌQ�FD]XO�vQ�FDUH�VXQW�LPSOLFDWH�PDL�PXOWH�GHFL]LL�VLPSOH�FDUH�WUHEXLHVF�OXDWH�IXQF LHGH� GLIHULWH� YDORUL� DOH� XQHL� VLQJXUH� YDULDELOH�� OLPEDMXO� HVWH� SUHY�]XW� FX� LQVWUXF LXQHVSHFLDOL]DW��FDVH«��'LVFX LD�DFHVWHL�LQVWUXF LXQL�VH�YD�IDFH�XOWHULRU�

0DL�MRV�HVWH�SUH]HQWDW�SURJUDPXO�FRUHVSXQ]�WRU�pseudocodului prezentat anterior.

#include <stdio.h> #include <conio.h>

void main(void) { float n1,n2,n3,ns,m1,m2;

clrscr();printf(“Dati prima nota:”) ;scanf(“%f”,&n1);printf(“\nDati a doua nota:”);scanf(“%f”,&n2);printf(“\nDati prima nota:”) ;scanf(“%f”,&n1);if( (n1>5) && (n2>5) && (n3>5) )

{printf(“\nDati nota de la stat:”);scanf(“%f”,&ns);m1=(n1+n2+n3)/3;m2=(m3+ns)/2;printf(“ media de licenta %f”, m1);printf(“ media generala %f”,m2);}

elseprintf(“Candidat respins”);getch();}

2EVHUYD LL�61. ÌQ� DFHDVW�� ID]�� IDSWXO� F�� V�D� IRORVLW� R� UHIHULQ ��� SHQWUX� FLWLUHD� XQHL� YDULDELOH� � �YH]L

Q���QX�SRDWH�IL�H[SOLFDW�VXILFLHQW�úL�YD�WUHEXL�OXDW�FD�DWDUH�vQ�FD]XO�FLWLULL�YDULDELOHORUsimple.

2. Operatorul ‘?Q¶�UHDOL]HD]��XQ�VDOW�OD�OLQLH�QRX��

33

Page 35: Introducere in c++

Introducere in programare

3. 6H� REVHUY�� F�� SH� UDPXUD� GH�else nu s-au introdus delimitatorii de bloc (acoladele) SHQWUX�F��GDF�� DFHúWLD�QX� VXQW�SUHFL]D L� SULPD� LQVWUXF LXQH� HVWH� DXWRPDW� FRQVLGHUDW�DSDU LQkQG�UDPXULL�UHVSHFWLYH�

4. 3HQWUX� SURJUDPDWRULL� PDL� DYDQVD L�� vQ�PRPHQWXO� vQ� FDUH� EORFXO� GH� LQVWUXF LXQL� HVWHIRUPDW�GLQWU�R�VLQJXU��LQVWUXF LXQH�VH�SRDWH�IRORVL�RSHUDWRUXO�"�FD�vQ�H[HPSOXO�GH�PDLjos, unde :

if(a>b) x=25;else yx=34;

poate fi echivalat prin: a>b (x=25) : (y=34);

8Q� DOW� H[HPSOX� GH� IRORVLUH� D� RSHUDWRUXOXL� "� HVWH� R� OLQLH� GH� FRG� FDUH� FDOFXOHD]�PD[LPXO�GLQWUH�YDU��úL�YDU��úL�O�GHSXQH�vQ�YDULDELOD�PD[�

max=(var1>var2) ? var1 : var2;

Mai jos vom prezenta un program simplu cu exemple despre evaluarea unor expresii compuse într-un program:

void main(void){int x = 11,y = 11,z = 11;char a = 40,b = 40,c = 40;float r = 12.987,s = 12.987,t = 12.987;LI��[� �\��]� ��������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�]� ����� ��

LI��[�!�]���D� �$����� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�D� ����� ��

LI����[�!�]���D� �%��� �H[HFX LD�LQVWUXF LXQLL�QX�YD�DYHD�QLFL�XQ�HIHFW� ��

LI��E�� �F��U� ��������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�U� ����� ��

LI��U�� �V��W� �F������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�W� ����� ��

LI��[� ��U�� �V���]� �������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�

IDSWXO�F��[�YD�OXD�YDORUL�SR]LWLYH�LDU�]� ������ ��

LI��[� �\��]� ��������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�

�[� �\�úL�]� ����� ��

LI��[�� ����]� �������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�]� ����� ��

LI��[��]� ������������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD�FD�HIHFW�]� ����� ��

x = y = z = 77; LI���[� �\����[� ������]� ������ �H[HFX LD�LQVWUXF LXQLL�YD�DYHD

ca efect z = 33 */ LI���[�!�\��__��]�!��������]� ������ �H[HFX LD�LQVWUXF LXQLL�YD�DYHD6

ca efect z = 22 */ LI��[��\��]��]� ���������������� �H[HFX LD�LQVWUXF LXQLL�YD�DYHD6

ca efect z = 11 */ LI���[� ������\� ������]� �����U� ��������� �H[HFX LD�LQVWUXF LXQLL6

34

Page 36: Introducere in c++

Introducere in programare

va avea ca efect x = 1, y = 2, z = 3, r = 12.00 */ LI���[� ������\� ������]� �����U� ��������� �H[HFX LD�LQVWUXF LXQLL�QX6

va avea nici un efect */

if (x == x); z = 27.345; /* z se va modifica întotdeauna */ LI��[�� �[���]� ����������� �\�QX�VH�YD�PRGLILFD�QLFL�R�GDW�� ��

LI��[� ������]� ����������� �[�YD�OXD�YDORDUHD�����]�YD�U�PkQH�QHVFKLPEDW� ��

}

�����,QVWUXF LXQH�GH�GHFL]LH�PXOWLSO���VHOHF LH�6

([LVW�� VLWXD LL� vQ� FDUH� UH]ROYDUHD� XQHL� SUREOHPH� LPSXQH� FD� R� GHFL]LH� V�� FRQGXF�� ODH[HFX LD�D�PDL�PXOW�GH�GRX�� UDPXUL�GH�SURJUDP��&D�H[HPSOX�V��FRQVLGHU�P�FD]XO�FHOHLPDL�VLPSOH�IRUPH�GH�PHQLX�FDUH�SRDWH�IL�RIHULW��XQXL�XWLOL]DWRU�

6H�FLWHúWH�XQ�QXP�U�GH�OD� WDVWDWXU���)XQF LH�GH�YDORDUHD�GDW��VH�SRDWH�DOHJH�H[HFX LDXQHLD�GLQWUH�RS LXQLOH�SUH]HQWDWH�XWLOL]DWRUXOXL����0DL�MRV�HVWH�SUH]HQWDW�XQ�PHQLX�VLPSOXfolosind metoda pseudocodului.

úWHUJH�HFUDQ6

DILúHD]��PHVDM�³$SDV��XQD�GLQ�WDVWH�SHQWUX�D�DOHJH�RSHUD LXQHD�GRULW�´6

DILúHD]��PHVDM�³���&LWLUH�GLQ�ILúLHU´6

DILúHD]��PHVDM�³���6FULHUH�LQ�ILúLHU´6

DILúHD]��PHVDM�³���3URFHVDUH�GDWH´6

DILúHD]��PHVDM�³���DILúDUH�JUDILF�UH]XOWDW´6

FLWHúWH�R�WDVW�

IXQF LH�GH�WDVW��FLWLW�

GDF��H������DSHOHD]��IXQF LD�GH�FLWLUH�GLQ�ILúLHU�DSRL�VWRS6

GDF��H�����DSHOHD]��IXQF LD�GH�VFULHUH�LQ�ILúLHU�DSRL�VWRS6

GDF��H�����DSHOHD]��IXQF LD�GH�SURFHVDUH�GDWH�DSRL�VWRS6

GDF��H�����DSHOHD]��IXQF LD�GH�DILúDUH�JUDILF��D�UH]XOWDWH�DSRL�VWRS6

GDF��QX�H�QLFL�XQXO�GLQ�QXPHUHOH�GH�PDL�VXV��6

DILúHD]��PHVDM�³2S LXQH�LQYDOLG�´6

6H� REVHUY�� F�� VH� SRDWH� UHDOL]D� LPSOHPHQWDUHD� úL� FX� LQVWUXF LXQL� if… dar, acest OXFUX�QX�HVWH�MXVWLILFDW�DWkW� WLPS�FkW�DYHP�R�LQVWUXF LXQH�VSHFLDOL]DW��SHQWUX�DFHVW� WLSGH�VLWXD LL��$FHDVWD�HVWH�LQVWUXF LXQHD�FDVH«�FX�XUP�WRDUHD�VLQWD[��

sZLWFK�RSHUDQG����IXQF LH�GH�RSHUDQG6{ FDVH�YDO������GDF��RSHUDQGXO�LD�YDORDUHD���

EORF�GH�LQVWUXF LXQL���

break; // stopcase vDO������GDF��RSHUDQGXO�LD�YDORDUHD���

EORF�GH�LQVWUXF LXQL���

break; // stop

35

Page 37: Introducere in c++

Introducere in programare

...case YDOQ�����GDF��RSHUDQGXO�LD�YDORDUHD�Q�

EORF�GH�LQVWUXF LXQL�Q�

break; // stop GHIDXOW������SHQWUX�RULFH�DOW��YDORDUH�

EORF�GH�LQVWUXF LXQL�FH�WUDWHD]��UHVWXO�YDORULORU�

ce le poate avea operandul} // stop

2�IRUP��GH�UHSUH]HQWDUH�OD�QLYHO�GH�VFKHPD�ORJLF��DU�IL�FHD�SUH]HQWDW��vQ�ILJXUD�����

)LJ�������6FKHPD�ORJLF��SHQWUX�UHSUH]HQWDUHD�XQHL�VWUXFWXUL6

GH�VHOHF LH�PXOWLSO�

0DL� MRV� HVWH� SUH]HQWDW� XQ� SURJUDP� FDUH� FLWHúWH� GRL� RSHUDQ]L� GH� OD� WDVWDWXU�� DSRL� QHSHUPLWH�VHOHF LD�RSHUD LHL�PDWHPDWLFH�FH�WUHEXLH�UHDOL]DW��FD�vQ�ILQDO�V��DILúH]H�UH]XOWDWXO�

#include <stdio.h> #include <conio.h>

void main(void) { int op1, op2; float rez; char oper;

clrscr();printf(“Dati primul operand:”);scanf(“%d”,&op1);printf(“\nDati al doilea operand:”);scanf(“%d”,&op2);printf(“\nSelectionati operatia dorita”);oper=getch();printf(“/n1- Adunare”);printf(“/n2- Scadere”);printf(“/n3- Inmultire”) ;printf(“/n4-Impartire ”) ;switch(oper)

36

Page 38: Introducere in c++

Introducere in programare

{ case ’ 1’:rez=op1+op2;break; case ’ 2’:rez=op1-op2; break; case ’ 3’:rez=op1*op2; break; case ’ 4’:rez=op1/op2; break; default:

clrscr(); printf(“Operatie nepermisa”);

} printf(“\nRezultatul este: %d”, rez);

}

37

Page 39: Introducere in c++

Introducere in programare

CAPITOLUL 7

���,QVWUXF LXQL�GH�FLFODUH��,QWURGXFHUH

6�D�GLVFXWDW�SkQ��DFXP�GHVSUH�VWUXFWXUL�GH�FRQWURO�FDUH�SHUPLW�DOHJHUHD�FRQGL LRQDW�vQWUH�H[HFX LD�PDL�PXOWRU� VHWXUL�GH� LQVWUXF LXQL��6LVWHPHOH�GH�FDOFXO� DX� DYDQWDMXO� F�� SRWUHSHWD��R�GDW��³LQVWUXLWH�FH�úL�FkW´��SURJUDPDWH���XQ�QXP�U�GH�RSHUD LXQL�GH�FkWH�RUL�HVWHQHYRLH�� 2ULFH� OLPEDM� GH� SURJUDPDUH� HVWH� DUH� LPSOHPHQWDW�� DFHDVW�� SRVLELOLWDWH�� ([LVW�GRX��FODVH�GH�LQVWUXF LXQL�GH�FLFODUH��UHSHWDUH��

2�SULP��FDWHJRULH�VH� UHIHU�� OD� LQVWUXF LXQLOH�FDUH� UHSHW��XQ�EORF�GH� LQVWUXF LXQL�SkQ�

FkQG�HVWH�vQGHSOLQLW��R�FRQGL LH��SULQ�FRQGL LH�SXWHP�vQ HOHJH�R�H[SUHVLH�PXOWLSO��FH�YD�ILHYDOXDW�� GH� F�WUH� FRPSLODWRU��� 'H� RELFHL� HVWH� IRORVLW�� SHQWUX� LQWHUDF LXQL� UHSHWLWLYH� FXXWLOL]DWRUXO�VDX�vQ�FDOFXOXO�QXPHULF�SULQ�DSUR[LPD LL�úL�GH�DFHHD�LQVWUXF LXQLOH�UHVSHFWLYHVH�QXPHVF�LQVWUXF LXQL�FX�QXP�U�QHFXQRVFXW�GH�SDúL�

2� D� GRXD� FDWHJRULH� GH� LQVWUXF LXQL� UHSHWLWLYH� HVWH� DFHHD� D� LQVWUXF LXQLORU� FX� QXP�UFXQRVFXW�GH�SDúL��'LQ�SXQFW�GH�YHGHUH�DO�OLPEDMXOXL�QX�DU�IL�VWULFW�QHYRLH�GH�DFHVW�WLS�GHLQVWUXF LXQL�� SHQWUX� F�� VH� SRDWH� UHDOL]D� DFHVW� OXFUX� FX� LQVWUXF LXQLOH� GLQ� SULPD� FODV��7RWXúL�� GXS�� FXP� VH� YD� REVHUYD� PDL� MRV� LPSOHPHQWDUHD� �FX� LQVWUXF LXQL� FX� QXP�UQHFXQRVFXW�GH�SDúL� ��SHQWUX�DFHDVW��D�GRXD�FODV��SUHVXSXQH�XQ�FRG�FDUH�YD� IL� LGHQWLF� ODDEVROXW� WRDWH� LQWHUSUHW�ULOH�� 3HQWUX� D� XúXUD� VFULHUHD� FRGXOXL� úL� D�O� IDFH� PDL� FODU� V�DLPSOHPHQWDW�R�LQVWUXF LXQH�QRX��IRU... .

�����,QVWUXF LXQL�FX�QXP�U�QHFXQRVFXW�GH�SDúL6

�������,QVWUXF LXQHD�while

(VWH�R�LQVWUXF LXQH�FDUH�SHUPLWH�UHSHWDUHD�VDX�QX�D�H[HFX LHL�XQHL�EXF� L�GH�FRG�IXQF LHGH�YDORDUHD�GH�DGHY�U�D�XQHL�H[SUHVLL�

8Q�H[HPSOX�vQ�FDUH�DU�IL�QHFHVDU�DFHVW�WLS�GH�LQVWUXF LXQL�DU�IL�UHVWULF LD�GRPHQLXOXLde valori în cazul datelor care le poate introduce un utilizator. Acest lucru este necesar SHQWUX�F��GH�RELFHL�XWLOL]DWRUXO�QX� LQH�FRQW�GH�WRDWH�UHVWULF LLOH�UHODWLY�OD�LQWHUYDOXO�vQ�FDUHpoate da o valoare de LQWUDUH�VDX� SRDWH� GD� GLQ� JUHúHDO�� R� YDORDUH� LQFRUHFW��� 7RWXúLPRGHOXO�PDWHPDWLF�VSHFLILF��FODU�F��DOJRULWPXO�OXFUHD]��FRUHFW�QXPDL�vQ�LQWHUYDOXO�>a,b].

3HQWUX� XWLOL]DWRU� IDSWXO� F�� SURJUDPXO� G�� XQ� UH]XOWDW� HURQDW� GDWRULW�� XQHL� YDORUL� GHLQWUDUH� LQWURGXV�� JUHúLW� vQVHDPQ�� F�� SURJUDPXO� QX� IXQF LRQHD]�� FRUHFW�� (VWH� QHFHVDU� FDSURJUDPDWRUXO� V�� QX� SHUPLW�� LQWURGXFHUHD� DOWRU� GDWH� GHFkW� FHOH� VSHFLILFDWH� GH� PRGHOXOmatematic.

2EVHUYD LH�� OLPEDMXO�&�VSUH�GHRVHELUH�GH� OLPEDMXO�3DVFDO� QX� JHQHUHD]�� XQ�PHVDM� GHHURDUH� GDF�� WLSXO� GH� GDW�� LQWURGXV� QX� FRLQFLGH� FX� VSHFLILFDWRUXO� GDW� IXQF LHL�scanf. Din DFHVW�PRWLY�vQ�PRPHQWXO�vQ�FDUH�VH�SUHJ�WHúWH�R�YHUVLXQH�EHWD��SULPD�YHUVLXQH�D�DSOLFD LHLFDUH� YD� IL� IRORVLW�� GH� F�WUH� XWLOL]DWRU�� WUHEXLHVF� LQWURGXVH� WRDWH� UHVWULF LLOH� GH� WLSXOPHQ LRQDW�PDL�VXV��/D�QLYHO�GH�SVHXGRFRG�PHWRGD�SRDWH�IL�GHVFULV��FD�PDL�MRV�

FLWHúWH�YDORDUHD�GH�LQWUDUH

atâta�WLPS�FkW�YDORDUHD�GH�LQWUDUH�QX�VH�DIO��vQ�LQWHUYDOXO�>a,b] HPLWH�XQ�PHVDM�GH�DWHQ LRQDUH�F�WUH�XWLOL]DWRU6

38

Page 40: Introducere in c++

Introducere in programare

UHFLWHúWH�YDORDUHD6

3HQWUX�DFHDVWD�VH�SRDWH�IRORVL�LQVWUXF LXQHD�ZKLOH«�D�F�UHL�VLQWD[��HVWH�SUH]HQWDW�mai jos:

while(FRQGLWLH����DWkWD�WLPS�FkW�FRQGL LD�HVWH�DGHY�UDW��H[HFXW�{EORF�GH�LQVWUXF LXQL6

}

� � � LXQLL�

)LJ�������6FKHPD�ORJLF��D6

ÌQ�ILJXUD������HVWH�SUH]HQWDW �VFKHPD�ORJLF �FRUHVSXQ] WRDUH�LQVWUXF while.

LQVWUXF LXQLL�while

ÌQ�H[HPSOXO�GH�PDL�MRV�HVWH�YRUED�GH�FLWLUHD�XQHL�YDORUL�vQWUHJL�FDUH�WUHEXLH�V��DSDU LQ�

intervalului [0,255].

#include <stdio.h> #include <conio.h>

void main(void) { unsigned char value; clrscr(); printf(“Nr1:”); scanf(“%d”,&op1); while((value>255)&&(value<0)) { printf(“Eroare ! Numarul trebuie sa fie intre 0 si 255 ”); printf(“Nr1:”); scanf(“%d”,&op1); } ���XUPHD]��UHVWXO�SURJUDPXOXL6

}

�������,QVWUXF LXQHD�GR«�while

'XS��FXP�V�D�PHQ LRQDW�DQWHULRU�LQVWUXF LXQHD�ZKLOH«�WHVWHD]��PDL�vQWkL�YDORDUHDGH� DGHY�U� D� H[SUHVLHL� GH� HYDOXDW� úL� DSRL�� IXQF LH� GH� DFHDVWD�� H[HFXW�� VDX� QX� EORFXO� GHLQVWUXF LXQL��'H�DFHHD�L�VH�PDL�VSXQH�LQVWUXF LXQH�GH�FLFODUH�FX�WHVW�DQWHULRU�

39

Page 41: Introducere in c++

Introducere in programare

'DF��VH�DQDOL]HD]��H[HPSOXO�GH�PDL�VXV�GLQ�SXQFW�GH�YHGHUH�DO�VLPSOLW� LL�FRGXOXLVH� REVHUY�� F�� EORFXO� GH� LQVWUXF LXQL� SHQWUX� FLWLUHD� YDULDELOHL� D� IRVW� VFULV� GH� GRX�� RUL�3HQWUX��D�HYLWD�VFULHUH�GH�FRG�LQXWLO�vQ�DFHDVW��VLWXD LH�SVHXGRFRGXO�WUHEXLH�V��ILH�FD�PDLjos:

FLWHúWH�YDORDUHD6

YHULILF��GDF��VH�DIO��vQ�LQWHUYDOXO�GRULW6

GDF��GD�FRQWLQX��SURJUDPXO6

GDF��QX�UHLD�Ge la citirea variabilei

3HQWUX�D�SXWHD�UH]ROYD�HOHJDQW�VLWXD LLOH�GH�DFHVW�JHQ�V�D�PDL�LQWURGXV�R�LQVWUXF LXQH�úLanume do…ZKLOH�D�F�UHL�VLQWD[��HVWH�SUH]HQWDW��PDL�MRV�

GR���H[HFXW�

{ EORF�GH�LQVWUXF LXQL�

}ZKLOH�FRQGL LH����DWkWD�WLPS�FkW�FRQGL LD�HVWH�DGHY�UDW�ÌQ�ILJXUD������DYHP�SUH]HQWDW��VFKHPD�ORJLF��SHQWUX�LQVWUXF LXQHD�GR«while.

)LJ�������6FKHPD�ORJLF��D�LQVWUXF LXQLL�GR«while

)RORVLQG�DFHDVW��LQVWUXF LXQH�FRGXO�SUH]HQWDW�PDL�VXV�GHYLQH�

#include <stdio.h>#include <conio.h>

void main(void) {

unsigned char value;clrscr();

do{

printf(“Nr1:”) ;scanf(“%d”,&op1);if( value>255)&&(value<0))

printf(“Eroare ! Numarul trebuie sa fie intre 0 si 255 ”); } while((value>255)&&(value<0));

���XUPHD]��UHVWXO�SURJUDPXOXL6

}

40

Page 42: Introducere in c++

Introducere in programare

'HFL�VH�FLWHúWH�QXP�UXO�úL��GDF��DFHVWD�QX�HVWH�FRUHFW��VH�UHLD�FLWLUHD��3HQWUX�YDOLGDUHDDILú�ULL�PHVDMXOXL�GH�HURDUH�V�D�SUHY�]XW�YHULILFDUHD�FRQGL LHL�SHQWUX�F��GDF��XWLOL]DWRUXOLQWURGXFH�FRUHFW�YDORDUHD�GH�SULPD�RDU���QX�HVWH�SHUPLV��DILúDUHD�PHVDMXOXL�GH�HURDUH�

$FHDVW�� LQVWUXF LXQH�H[HFXW��P�FDU�R�GDW��EORFXO�GH�LQVWUXF LXQL�úL�GH�DELD�DSRL�IDFHHYDOXDUHD�H[SUHVLHL�SHQWUX�D�SXWHD�YHGHD�GDF��DFHVWD�VH�PDL�UHSHW��VDX�QX��'H�DFHHD�L�VHPDL�VSXQH�úL�LQVWUXF LXQH�GH�FLFODUH�FX�WHVW�SRVWHULRU�

�����,QVWUXF LXQL�FX�QXP�U�FXQRVFXW�GH�SDúL���,QVWUXF LXQHD�IRU�6

'LQ�FHOH��SUH]HQWDWH�SkQ��DFXP�UH]XOW��F��VH�SRDWH�UHSHWD�XQ�EORF�GH�LQVWUXF LXQL�SkQ�

FkQG�HVWH�vQGHSOLQLW��R�FRQGL LH��([LVW��FD]XUL�FkQG�VH�FXQRDúWH�GH�OD�vQFHSXW�FkWH�YDORUL�VHGRUHVF�D� IL�SUHOXFUDWH�� ILH�SULQ�VSHFLILFDUHD�GLUHFW��D�XWLOL]DWRUXOXL�� ILH�FD� UH]XOWDW�D�XQRUFDOFXOH�DQWHULRDUH��'H�RELFHL�DFHVW� OXFUX�VH�DSOLF�� OD�FDOFXOXO�YHFWRULDO�VDX�PDWULFLDO�GDUnu numai.

ÌQWUXFkW�QX�V�D�GLVFXWDW�vQF��GHVSUH�DFHVW�WLS�GH�GDWH�VH�YD�OXD�vQ�GLVFX LH�XQ�H[HPSOXPDL� VLPSOX�� FXP� DU� IL� UHDOL]DUHD� XQXL� SURJUDP� FH� YD� ULGLFD� XQ� QXP�U� OD� R� SXWHUH�3VHXGRFRGXO�úL�DSRL�SURJUDPXO�VXQW��SUH]HQWDWH�PDL�MRV�

FLWHúWH�QXP�UXO��nr)FLWHúWH�SXWHUHD�OD�FDUH�YD�IL�ULGLFDW��pw)LQL LDOL]HD]��YDULDELOD�UH]XOWDW��FH�YD�S�VWUD�nr la putere, cu 1 (rez=1)DWkWD�WLPS�FkW�YDULDELOD�FH�D�SULPLW�SXWHUHD�!��I�

rez=rez*nr;pw=pw-1;UHSHW�

DILúHD]��UH]XOWDWXO�

&RGXO�VXUV��FRUHVSXQ]�WRU��

#include <stdio.h> #include <conio.h>

void main(void) { int nr, pw; float rez;

clrscr();printf(“Numarul”) ;scanf(“%d”,&nr) ;printf(“\nPuterea”);scanf(“%d”,&op2);rez=1; //*** *while(pw>0)//**** *{rez=rez*nr;

41

Page 43: Introducere in c++

Introducere in programare

pw=pw-1;//**** *}printf(“Numarul %d la puterea %d este %f”,nr,pw,rez);getch();}

,QVWUXF LXQLOH�PDUFDWH�FX�DVWHUL[�VH�UHSHW��vQ�IRDUWH�PXOWH�VLWXD LL�FkQG�QXP�UXO�GH�SDúLHVWH�FXQRVFXW��'H�DFHHD�V�D�LPSOHPHQWDW�LQVWUXF LXQHD�IRU«�DYkQG�XUP�WRDUHD�VLQWD[�

for(FRQWRU YDORDUHLQL LDO��FRQWRU�VDX!YDORDUHILQDO�� contor=contor+sau -pas)

{ EORF�GH�LQVWUXF LXQL6

}

� LD�LQVWUXF LXQLL� for �/D�QLYHO�GH�VFKHPD�ORJLF �H[HFX HVWH�SUH]HQWDW ��vQ�ILJXUD�����

)LJ��������6FKHPD�ORJLF��LQVWUXF LXQLL�for

$FXP� VH� REVHUY�� F�� DFHDVW�� LQVWUXF LXQH� VFXWHúWH� SURJUDPDWRUXO� GH� D� VFULH� FRGsuplimentar. Programul anterior UHVFULV�IRORVLQG�DFHDVW��LQVWUXF LXQH�HVWH�GDW�PDL�MRV�

#include <stdio.h> #include <conio.h>

void main(void) {

int nr, pw,i;float rez;

clrscr();printf(“Numarul”) ;scanf(“%d”,&nr) ;printf(“\nPuterea”);scanf(“%d”,&op2);for(i=0;i<pw;i=i+1 )

rez=rez*nr;��FRGXO�PDL�SRDWH�IL�VFULV�úL�FD�LQ�]RQD�FRPHQWDWD�FH�XUPHD]�

// for(i=pw;i>0;i=i-1 )// rez=rez*nr;printf(“Numarul %d la puterea %d este %f”,nr,pw,rez);

42

Page 44: Introducere in c++

Introducere in programare

getch();}

([LVW��XQ�FRQWURO�WRWDO�DVXSUD�GHVI�úXU�ULL�EXFOHL�H[DFW�FD�úL�vQ�FD]XO� while dar codul scris este mult mai succint. 2EVHUYD LD����'DF��EORFXO�GH�LQVWUXF LXQL�FRQVW��vQWU�R�VLQJXU��LQVWUXF LXQH�SDUDQWH]HOH�QXmai sunt necesare 2EVHUYD LD� ��� � 'DF�� VH� SXQH� ³�´� GXS�� IRU� DFHVWD� YD� FRQVLGHUD� F�� DUH� R� EXFO�� YLG��FRPSLODWRUXO� QX� YD� UDSRUWD� HURDUH� VLQWDFWLF��� GDU� FHHD� FH� HVWH� VFULV� vQ� EORFXO� GHLQVWUXF LXQL�YD�IL�GRDU�R�VLQJXU��GDW��H[HFXWDW�

�����$OWH�LQVWUXF LXQL6

�������,QVWUXF LXQHD�break

(IHFWXO�LQVWUXF LXQLL�EUHDN�FRQVW��vQ�S�U�VLUHD�LPHGLDW��D�FHOHL�PDL�DSURSLDWH��WH[WXDO�LQVWUXF LXQL�switch, ZKLOH��GR��IRU�vQFRQMXU�WRDUH�

�������,QVWUXF LXQHD�FRQWLQXH

,QVWUXF LXQHD� FRQWLQXH� QX� VH� SRDWH� XWLOL]D� GHFkW� vQWU-un ciclu while, do sau for. (IHFWXO�LQVWUXF LXQLL�FRQWLQXH�FRQVW���

- într�XQ�VDOW�OD�HYDOXDUHD�FRQGL LHL�GH�FLFODUH��GDF��FHD�PDL�DSURSLDW���WH[WXDO��LQVWUXF LXQHGH�FLFODUH�vQFRQMXU�WRDUH�HVWH�while sau do.

- într�XQ�VDOW� OD�HYDOXDUHD�H[SUHVLHL�GLQ�D� WUHLD�SR]L LH� ��GDF�� FHD�PDL�DSURSLDW�� �WH[WXDO�LQVWUXF LXQH�GH�FLFODUH�vQFRQMXU�WRDUH�HVWH�IRU�

3UH]HQW�P�PDL�MRV�XQ�H[HPSOX�VLPSOX�GH�IRORVLUH�D�LQVWUXF LXQLL�EUHDN�úL�FRQWLQXH�

void main(void){int xx;

for(xx = 5;xx < 15;xx = xx + 1){if (xx == 8) break;printf("In bucla oprita fortat , xx are valoarea %d\n",xx);

}

for(xx = 5;xx < 15;xx = xx + 1){if (xx == 8) continue;printf("Prin aplicarea continue in bucla, xx devine %d\n",xx);

}}

�������,QVWUXF LXQHD�goto QXPHBHWLFKHW�

(IHFWXO�LQVWUXF LXQLL�JRWR�FRQVW��vQWU�XQ�VDOW�QHFRQGL LRQDW�OD�LQVWUXF LXQHD�FX�HWLFKHWDFLWDW��vQ�LQVWUXF LXQHD�GH�VDOW��FDUH�WUHEXLH�V��VH�DIOH�vQ�DFHHDúL�IXQF LH�

43

Page 45: Introducere in c++

Introducere in programare

�������,QVWUXF LXQHD�return

(IHFWXO� LQVWUXF LXQLL� UHWXUQ� FRQGXFH� OD� WHUPLQDUHD� LPHGLDW�� D� H[HFX LHL� IXQF LHLFXUHQWH�úL�OD�UHYHQLUHD�OD�IXQF LD�DSHODQW���'DF��H[SUHVLD�HVWH�SUH]HQW���HD�WUHEXLH�V��ILH�GH�XQWLS� FDUH� SRDWH� IL� FRQYHUWLW� OD� WLSXO� IXQF LHL� vQ� FDUH� DSDUH� LQVWUXF LXQHD� return. Valoarea H[SUHVLHL�HVWH�YDORDUHD�vQWRDUV��GH�IXQF LH�7.3.5. Constante simbolice

Cu ajutorul directivei "#define" se pot defini la începutul programului nume sau FRQVWDQWH��VLPEROLFH�FDUH�VXQW�XQ�úLU�SDUWLFXODU�GH�FDUDFWHUH�� � �'XS��DFHHD��FRPSLODWRUXOYD� vQORFXL� WRDWH�DSDUL LLOH��QHSXVH� vQWUH�JKLOLPHOH�� DOH�QXPHOXL��SULQ� úLUXO� FRUHVSXQ]�WRU�ÌQORFXLUHD�HIHFWLY��D�QXPHOXL�SRDWH�IL�RULFH�WH[W��HD�QX�VH�OLPLWHD]��OD�QXPHUH�

#GHILQH�0,1���������YDORDUHD�PLQLP��DGPLV�

#GHILQH�0$;���������YDORDUHD�PD[LP��DGPLV�

# define AND &&

void main(void) { int x; printf(“Dati un numar”);scanf(“%d”,&x)if((x>=MIN)AND(x<=MAX))printf(“\nNumarul este in interval”);

else printf(“Numarul nu este in interval”);getch();}

&DQWLW� LOH� �0,1� úL�0$;� � VXQW� � FRQVWDQWH�� � DúD� vQFkW� HOH� � QX� � DSDU� � vQ� GHFODUD LL�1XPHOH�VLPEROLFH�VH�VFULX��vQ��PRG�QRUPDO�FX��OLWHUH�PDUL���DúD�F��SRW�IL�XúRU�GLVWLQVH�GHQXPHOH�GH�YDULDELOH�FDUH� VH� VFULX�FX� OLWHUH�PLFL��/D� VIkUúLWXO�XQHL� �GHILQL LL�18�VH�SXQHSXQFW�úL�YLUJXO��

44

Page 46: Introducere in c++

Introducere in programare

CAPITOLUL 8

8. Masive de date. Tablouri

ÌQ�PDMRULWDWHD�FDOFXOHORU�úWLLQ LILFH�VH�IRORVHúWH�QR LXQHD�GH��YHFWRU��PDWULFH��OXFUXO�vQVSD LL� Q�GLPHQVLRQDOH�� /LPEDMXO� &� D� IRVW� SUHY�]XW� DUH� SRVLELOLWDWHD� GH� D� OXFUD� FX� XQPDVLYH�GH�GDWH�GH�DFHODúL�WLS��PDVLYH�FH�SRW�IL�UHFXQRVFXWH�VXE�XQ�QXPH�XQLF��/L�VH�PDLVSXQH�úL�WDEORXUL�GH�GDWH��([LVW��SRVLELOLWDWHD�GHILQLULL�VWDWLFH�GH�WDEORXUL�FX�PD[LPXP�WUHLGLPHQVLXQL��'HFODUDUHD�XQXL�WDEORX�VH�UHDOL]HD]��FD�PDL�MRV�

- tablou monodimensional: WLS�GDW��QXPH�WDEORX>nr-elemente]; (ex: char s[10])

- tablou bidimensional: WLS�GDW��QXPH�WDEORX>nr-linii][nr-coloane]; (ex: int m[20][20])

- tablou tridimensional: WLS�GDW��QXPH�WDEORX>coord x][coord y][coord z];

(ex: float punct[10][10][10]).

$FHVWH�GHFODUD LL�DX�FD�HIHFW�UH]HUYDUHD�XQXL�VSD LX�GH�PHPRULH�SHQWUX�GHSR]LWDUHD���caractere sau 100 de întregi sau 1000 de valori reale pentru cazurile prezentate ca exemplu. $FFHVXO� OD� ILHFDUH�]RQ�� � D� WDEORXOXL�VH� IDFH�SR]L LRQDO��(OHPHQWHOH�VXQW�GHSXVH�XQXO�GXS�DOWXO�úL�DWXQFL�UHIHULUHD�VH�IDFH�SULQWU�XQ�LQGLFH�FDUH�VSHFLILF��SR]L LD�HOHPHQWXOXL�UHVSHFWLY�DO�FkWHOHD�HVWH�vQ�úLU���'HFL�SRW�H[LVWD�UHIHULUL�GH�JHQXO�

s[3]=’2’ sau m[2][2]=30 sau punct[0][0][0]=0.233445.

Indicele poate fi furnizat prin intermediul unei variabile. Acest lucru permite IRORVLUHD� XQRU� LQVWUXF LXQL� FLFOLFH� SHQWUX� SUHOXFUDUHD� GDWHORU� GLQ� FDGUXO� XQXL� WDEORX� GHGDWH�� 2� VLWXD LH� PDL� VSHFLDO�� HVWH� vQ� FD]XO� WDEORXULORU� PRQRGLPHQVLRQDOH� �úLUXULORU�� GHcaractere. Cum, în general, prelucrarea acestora nu se face caracter cu caracter, ele fiind GH�RELFHL�IRORVLWH�vQ�PDQLSXODUHD�LQIRUPD LHL�VFULVH��OLPEDMXO�&�D�IRVW�SUHY�]XW�FX�R�VHULHGH�IXQF LL�VSHFLDOL]DWH�vQ�SUHOXFUDUHD�JOREDO��D�ORU�

8.1. Tablouri monodimensionale

'XS�� FXP� DP� VSXV� WDEORXULOH� PRQRGLPHQVLRQDOH� SRW� IL� IRORVLWH� úL� SHQWUX� FDOFXOHPDWHPDWLFH� vQ� VSD LL� Q�GLPHQVLRQDOH�� XQGH� VH� OXFUHD]�� FX� XQ� VHW� GH� Q� FRRUGRQDWH�� 9RPSUH]HQWD�FkWHYD�LPSOHPHQW�UL�DOH�RSHUD LXQLORU�VLPSOH�FX�YHFWRUL�

�������3UHOXFU�UL�VLPSOH�FX�YHFWRUL6

ÌQ� FD]XO� GHFODU�ULL� XQXL� YHFWRU� VH� UH]HUY�� XQ� VSD LX� � SHQWUX� QXP�UXO� PD[LP� GHHOHPHQWH� FDUH� V�DU� SXWHD� V�� DLE�� QHYRLH� XWLOL]DWRUXO� SURJUDPXOXL�� 'H� H[HPSOX� FD]XO� XQXLSURJUDP� VSHFLDOL]DW� SHQWUX� FDOFXOH� DVXSUD� XQXL�QXP�U� GH�P�VXU�WRUL�� XWLOL]DWRUXO� SRDW�� V�IDF��vQWU�XQ�FD]����P�VXU�WRUL��R�HVWLPDUH�PDL�JURVLHU���úL�vQ�DOWXO������'HFL�VH�YD�GHILQL�XQYHFWRU� FX����� GH� HOHPHQWH� GDU� vQ� DFHODúL� WLPS� WUHEXLH� FD�SURJUDPXO� V�� FHDU�� VSHFLILFDUHDQXP�UXOXL�GH�YDORUL�FH�WUHEXLH�LQWURGXVH�úL�V��IDF��SURFHVDUHD�QXPDL�DVXSUD�ORU��9D�WUHEXL�V�IRORVLP�R�LQVWUXF LXQH�IRU«�GHRDUHFH�DUH�QXP�UXO�GH�SDúL�FXQRVFXW��ÌQ�FD]XO�vQ�FDUH�VH�SRDWHVSHFLILFD�QLFL�R�OLPLW��SHQWUX�QXP�UXO�GH�YDORUL�FH�WUHEXLHVF�VWRFDWH�VDX�SUHOXFUDWH�QX�VH�PDLSRW� IRORVL� WDEORXUL� GHILQLWH� VWDWLF� FL� OLVWH� vQO�Q XLWH�� 0DL� MRV� SUH]HQW�P� XQ� SURJUDP� FDUH

45

Page 47: Introducere in c++

Introducere in programare

FLWHúWH�GRL�YHFWRUL�GH�DFHHDúL�GLPHQVLXQH�GH�OD�WDVWDWXU���úL�UHDOL]HD]��R�VHULH�GH�RSHUD LXQLVLPSOH�FX�HL�DILúkQG�GH�ILHFDUH�GDW��UH]XOWDWHOH�

#include <stdio.h> #include <conio.h>

void main (void) { int v1[100], v[100],v2[100],i,j,n; clrscr(); printf(“Dati dimensiunea vectorilor n=”); scanf(“%d”,&n);

for(i=0;i<n;i++ ){printf(“V[%d]=”,i) ;scanf(“%d”,v[i]) }//citirea vectorului v

for(i=0;i<n-1;i++ )for(j=i+1;j<n;i++ )if(v[i]>v[j] )

{t=v[i] ;v[i]=v[j] ;v[j]=t ;}

printf(“\nVectorul ordonat:\n”)for(i=0;i<n;i++) printf(“%d ”,v[i]);// afisarea vectorului vfor(i=0;i<n;i++ )

{printf(“V1[%d]=”,i) ;scanf(“%d”,v1[i]) ;}

for(i=0;j=0;i<n;i++;j++ ){v2[j]=v1[2*i] ;v2[j+1]=v[2*i+1] ;}

printf(“\nVectorul v interclasat cu v1 este:\n”)for(i=0;i<n;i++) printf(“%d ”,v[i]) ;for(i=0;i<n;i++) v2[i]=v1[i]+v[i] ;printf(“\nVectorul v sumat cu v1 este:\n”)for(i=0;i<n;i++) printf(“%d ”,v[i]) ;getch();}

0DL�MRV�HVWH�SUH]HQWDW�FRGXO�FDUH�LPSOHPHQWHD]��DOJRULWPXO�³PHUJe sort”, bazat pe WHKQLFD�³vPSDUWH�úL�VW�SkQHúWH´��vQWU�R��PDQLHU��UHFXUVLY��

#include <stdio.h>

int a[100],n; // variabile globale vizibile úL�în main úL�în interiorul//RULF�UHL�IXQF LL�GHILQLWH�GH�utilizator

46

Page 48: Introducere in c++

Introducere in programare

merge_sort(int st,int dr); // prototipurile IXQF LLORU�propriimerge(int st,int mij,int dr);void main(void)

{ int i; printf("\n introd dimensiunea sirului de sortat : "); scanf("%d",&n); for(i=0;i<n;i++) { printf(“\nV[%d]=”,i);

scanf("%d",&a[i]); }

merge_sort(0,n-1); printf("\n sirul ordonat este :\n"); for(i=0;i<n;i++ ) printf("%3d ",a[i]);}

merge_sort(int st,int dr) { int mij; if(st<dr){mij=(st+dr)/2;merge_sort(st,mij);merge_sort(mij+1,dr);merge(st,mij,dr);}}

merge(int st,int mij,int dr) { int h,i,j,k; int b[100]; h=st; i=st; j=mij+1 ; while(h<=mij && j<=dr) {if(a[h]<=a[j]) {b[i]=a[h];h++; }else {b[i]=a[j];j++; }i++ ;} if(h>mij)for(k=j;k<=dr;k++ )

{b[i]=a[k];i++; } else for(k=h;k<=mij;k++)

{b[i]=a[k];i++; } for(k=st;k<=dr;k++) a[k]=b[k] ;

47

Page 49: Introducere in c++

Introducere in programare

}

�������ùLUXUL�GH�FDUDFWHUH

6�D�GLVFXWDW�GHVSUH�VHWXO�GH�FDUDFWHUH�$6&,,�úL�VHWXO�GH�FDUDFWHUH�GH�FRQWURO��$FHVWHDVXQW�LQWURGXVH�SHQWUX�PDQLSXODUHD�XQHL�LQIRUPD LL�FDUH�SRDWH�IL�GRDU�DILúDW��SH�HFUDQ�VDX�ODLPSULPDQW���6SHFLILF�DFHVWHL�LQIRUPD LL�HVWH�F��GH�RELFHL�PDQLSXOHD]��vQ�SDFKHWH�GH�PDL�PXOWGH�XQ�FDUDFWHU��ÌQ�DFHVWH�FRQGL LL�WUHEXLH�IRORVLW�XQ�WDEORX�GH�FDUDFWHUH���$FHVWD�HVWH�GHQXPLWúLU�GH�FDUDFWHUH��(O�DUH�vQ�SOXV�ID ��GH�XQ�YHFWRU�DG�XJDW�vQWRWGHDXQD�OD�VIkUúLWXO�GDWHORU�XWLOHun caracter special ‘\0’� QXPLW� WHUPLQDWRU� GH� úLU�� $� IRVW� LQWURGXV� SHQWUX� D� XúXUD� VFULHUHDIXQF LLORU��GH�ELEOLRWHF��VDX�XWLOL]DWRU��IRORVLWH�vQ�SUHOXFUDUHD�XQXL�úLU�GH�FDUDFWHUH�

ùLUXULOH� GH� FDUDFWHUH� DX� H[DFW� DFHOHDúL� FDUDFWHULVWLFL� FD� RULFDUH� WDEORXmonodimensional.

IQL LDOL]DUHD�XQL�úLU�GH�FDUDFWHUH�VH�SRDWH�IDFH�SULQ�PDL�PXOWH��PHWRGH�

- OD�GHFODUDUH��I�U��GHILQLUHD�GLPHQVLXQLL�WDEORXOXL

char s[]=”.doc”

vQ�DFHVW�FD]�GLPHQVLXQHD�WDEORXOXL�YD�IL�H[DFW�QXP�UXO�GH�FDUDFWHUH�FX�FDUH�H�LQL LDOL]DWúLUXO�

- la declarare cu definirea dimensiunii tabloului

char s[20]=”doi”

- direct în program : s=”Dati valoarea” - SULQ�FLWLUH�GH�OD�WDVWDWXU�

FX�SURFHGXU���gets(s) FX�IXQF LH��scanf(“%s”,s);

- SULQ�LQL LDOL]DUH�FDUDFWHU�FX�FDUDFWHU�vQ�FD]XO�XQHL�SUHOXFU�UL�vQ�SURJUDP

for(i=0;i<strlen(s1);i++)s2[i]=s1[i]+0x25;

ÌQ�XOWLPXO�FD]�DSDUH�R�SUREOHP��� vQ�FD]XO�úLUXOXL�V��QX�HVWH�SXV�DXWRPDW�FDUDFWHUXOµ?�¶�úL�GHFL�WUHEXLH�2%/,*$725,8�LQWURGXV�H[SOLFLW��ÌQ�H[HPSOXO�GH�PDL�VXV�DFHVW�OXFUX�VHUHDOL]HD]��SULQ�DG�XJDUHD�LQVWUXF LXQLL�

s[i]=’\0’;

3UH]HQW�P�PDL�MRV�XQ�SURJUDP�VLPSOX�FH�LQL LDOL]HD]��vQ�FRG��HOHPHQW�FX�HOHPHQWXQ�úLU�GH�FDUDFWHUH�DSRL�DILúHD]��GLYHUVH�SR LXQL�GLQ�HO�

#include <stdio.h>

void main(void) { FKDU�QXPH>�@��������� �GHILQHVF�XQ�úLU�GH�FDUDFWHUH� �

nume[0] = 'M'; nume[1] = 'i'; nume[2] = 'h'; nume[3] = 'a';

48

Page 50: Introducere in c++

Introducere in programare

���QXPH>�@� ��������� �FDUDFWHUXO�FH�PDUFKHD]��VIkUúLWXO� �

printf("Numele este %s\n",nume); printf("O litera din el este %c\n",nume[2]); printf("O parte din nume este %s\n",&nume[1]); getch(); }

�����7DEORXUL�ELGLPHQVLRQDOH��,PSOHPHQWDUHD�QR LXQLL�GH�PDWULFH

3HQWUX�FDOFXOH�PDWHPDWLFH� WDEORXULOH�ELGLPHQVLRQDOH� LPSOHPHQWHD]�� H[DFW� FRQFHSWXOGH�PDWULFH�úL�SRW�IL�PDQLSXODWH�vQ�FRG�DSURDSH�OD�IHO�FD�vQ�PDWHPDWLF��

Apare aceeaúL� SUREOHP�� UHODWLY� OD�PRGXO� vQ� FDUH� DOHJHP�GLPHQVLXQHD�PD[LP�� Dunei PDWULFL�FD�úL�vQ�FD]XO�YHFWRULORU���([LVW��FHOH�GRX��FD]XUL�- 8WLOL]DWRUXO�úWLH�H[DFW�FkW�HVWH�GLPHQVLXQHD�PD[LP��D�matricilor care vor fi folosite,

acesta este cazul ideal care este relativ rar. - 8WLOL]DWRUXO� DUH� QLúWH� FHULQ H� YDJL� úL� SURJUDPDWRUXO� SULQ� GLVFX LH� GLUHFW�� SRDWH� DIOD

DFHVW� PD[LP� VDX� SRDWH� V��úL� IDF�� R� LGHH� GHVSUH� HO� FD]� vQ� FDUH� YD� OXD� R� YDORDUHacoperitoare.

ÌQ�RULFH�FD]�RULFDUH�DU�IL�GLPHQVLXQHD�XQXL� WDEORX�HO�DUH�XQ�QXP�U� WRWDO�GH�HOHPHQWHFDUH�YD�IL�DORFDW�VWDWLF��$FHVW�QXP�U�VH�SRDWH�DIOD�FRQIRUP�IRUPXOHORU�GH�PDL�MRV�

- tablou monodimensional: Nr_elem=dim_vect*sizeof(tip_data); - tablou bidimensional: Nr_elem=dim_x*dim_y*sizeof(tip_data); - tablou tridimensional Nr_elem = dim_x* dim_y *dim_z * sizeof(tip_data).

'HMD�DSDUH�R�SUREOHP��UHODWLY�OD�VSD LXO�PD[LP�FDUH�SRDWH�IL�RFXSDW�GH�WRWDOXO�GDWHORUGHILQLWH�VWDWLF��DGLF��FXP�DP�YRUELW�SkQ��DFXP���úL�DQXPH�IDSWXO�F��FKLDU�VXE�PRGHOXO�GHFRPSLODUH�+8*(� QX� VH� SRDWH� DORFD�PDL�PXOW� GH� �0R ���� ����� RFWH L� � SHQWUX� GDWH�Deci implicit apare automat o limitare asupra dimensiunii maxime care o poate lua un tablou.

'HFL� LQGLIHUHQW� GH� FHULQ HOH�XWLOL]DWRUXOXL� QX� VH� SRDWH� GHS�úL� DFHDVW�� GLPHQVLXQH�� ÌQFD]XO�vQ�FDUH�VSHFLILFD LLOH�GHS�úHVF�DFHVWH�GLPHQVLXQL�H[LVW��GRX��PHWRGH�

- metoda swap-ului; - PHWRGD�OLVWHORU�GH�RUGLQ�Q��XQGH�Q�HVWH�FRQIRUP�QHFHVLW� LORU�

ÌQ�JHQHUDO� DFHVWH�PHWRGH� VXQW�PL[DWH� FKLDU� úL� OD� QLYHOXO� DSOLFD LLORU� DFWXDOH��0HWRGDVZDS�XOXL� VH� FRQFUHWL]HD]�� SULQ� VFULHUHD� vQWU�XQ� ILúLHU� D� GDWHORU� FH� GHS�úHVF� DFHVWHdimensiuni maxime. Practic dispozitivul de stocare devine un fel de prelungire a PHPRULHL�RSHUDWLYH��DYkQG� vQV��GH]DYDQWDMXO�F�� WLPSLL�GH�DFFHV�VXQW�FDP�GH����RUL�PDLPDUL�GHFkW� vQ�FD]XO� OXFUXOXL�FX�5$0��FHHD�FH�YD�GXFH� OD�VF�GHUHD�YLWH]HL�GH�H[HFX LH�DUHVSHFWLYHL� DSOLFD LL�� 0HWRGD� OLVWHORU� VH� ED]HD]�� SH� DORFDUHD� GLQDPLF�� FDUH� QH� SHUPLWHDFFHVXO�OD�WRDW��PHPRULD�IL]LF��5AM QHRFXSDW��GH�DOWH�SURJUDPH�

Mai jos vom prezenta un scurt exemplu de folosire a tablouri pentru implementarea de RSHUD LXQL�VLPSOH�FX�matrici.

49

Page 51: Introducere in c++

Introducere in programare

#include <stdio.h> #include <conio.h>

void main(void) { int m1[5][5],m2[5][5],m3[5][5],m4[5][5],i,j,k,m,n,p; clrscr(); printf(“n=”); scanf(“%d”,&n);// se poate scrie úL�DúD�vQ�FRGprintf(“m=”); scanf(“%d”,&m);// dar nu este recomandat printf(“p=”); scanf(“%d”,&p);// am citit dimensiunile matricilor for(i=0;i<n;i++)

for(j=0;j++;j<m ){printf(“\nA[%d,%d]=”,i,j) ;scanf(“%d”,&m1[i][j]) ;}// am terminat de citit prima matrice

// se observ��FD�QXPHOH�VXE�FDUH�R�FLWHVF�QX�DUH�OHJ�WXU��FX//modul în care o denumesc în program.for(i=0;i<m;i++ )

for(j=0;j++;j<p ){printf(“\nB[%d,%d]=”,i,j) ;scanf(“%d”,&m2[i][j]); }// se poate scrie úL�DúD�în cod

// deci am citit cele dou��matrici, acum vom începe procesarea. for(i=0;i<n;i++ )

for(j=0;j++;j<p ){m3[i][j]=0 ;for(k=0;k++;k<m )

m3[i][j]+=m1[i][k]*m2[k][j]; }// vQPXO LUHD�D�GRX��matrici

printf(“Matricea Cnp=Amn*Bnp este:”)for(i=0;i<n;i++ )

{printf(“\n” )for(j=0;j++;j<p)printf(“%d ”,m3[i][j]) ;}

for(i=0;i<n;i++ )for(j=0;j++;j<p )m4[i][j]=m3[j][i] ;

printf(“Transpusa lui C este ”); for(i=0;i<p;i++ )

{printf(“\n” )for(j=0;j++;j<n)printf(“%d ”,m4[i][j]) ;}

getch();}

Deoarece tablourile bidimensionale de caractere nu sunt folosite uzual, nu le vom trata.

50

Page 52: Introducere in c++

Introducere in programare

CAPITOLUL 9

9. Tipuri de date definite de utilizator

6�D�GLVFXWDW�SkQ��DFXP��GHVSUH�WDEORXUL�GH�GDWH�PRQR�VDX�PXOWLGLPHQVLRQDOH�FDUH�vQV�FRQ LQHDX�QXPDL�GDWH�GH�DFHODúL�WLS��6XQW�PXOWH�FD]XUL�vQ�FDUH�HVWH�QHYRLH�FD�GDWH�GH�WLSXULGLIHULWH�V��ILH�JUXSDWH�VXE�XQ�QXPH�FRPXQ�

$FHDVW��SUREOHP��V�D�UH]ROYDW�SULQ�LQWURGXFHUHD�QR LXQLL�GH�VWUXFWXU��GH�GDWH��FDUHSHUPLWH� XWLOL]DWRUXOXL� V��úL� FUHH]H� QRL� WLSXUL� GH� GDWH� FkW�PDL� DSURSLDWH� GH� RELHFWHOH� GLQOXPHD�UHDO���$FHVW�OXFUX�VH�PDL�QXPHúWH�DEVWUDFWL]DUHD�GDWHORU�

/D�IHO�FXP�IXQF LLOH�SHUPLW�GHVFRPSXQHUHD�FRPSOH[LW� LL�XQXL�SURJUDP�vQ�WHUPHQLGH�RSHUD LXQL�SH�GDWH��VWUXFWXULOH�VXQW�IRORVLWH�SHQWUX�DEVWUDF LXQL.

9.1. Declararea unei structuri

2�VWUXFWXU��HVWH�XQ�WLS�GH�GDW��JHQHUDOL]DW�GHILQLW�GH�XWLOL]DWRU��care poate fi folosit pentru gruparea diferitelor tipuri de date într-un nou concept. De exemplu un tip de date FH�VH�UHIHU��OD�XQHOH�GLQ�FDUDFWHULVWLFLOH�XQXL�VWXGHQW�HVWH�SUH]HQWDW�PDL�MRV�

struct Student { char name[20]; // numele studentului unsigned short int age; // virsta unsigned char n_lab; // nota la laborator unsigned char n_ex; // nota la examen }

([LVW��R�FRQYHQ LH�FRPXQ��OHJDW��GH�QXPHOH�XQHL�VWUXFWXUL�úL�DQXPH�DFHVWD�V��vQFHDS�

FX�OLWHU��PDUH��8Q�H[HPSOX�GH�GHFODUD LL�FX�DFHVW�WLS�GH�GDWH�HVWH�GDW�PDL�MRV�

struct Student tmp, an99[20];

9.2. Operatorul typedef

Comanda W\SHGHI�FDUH�HVWH�IRORVLW��OD�redenumirea unor variabile HQXPHUDWH�� SRDWH� IL� IRORVLW�� úL� vPSUHXQ�� FX� FXYkQWXO� FKHLH� VWUXFW�� 3HQWUX� R� VWUXFWXU�WUHEXLH�V��DSDU���GXS��FH�HVWH�GHILQLW��� úL� vQDLQWH�GH�RULFH�GHFODUD LH�GH�YDULDELOH��8]XDOnoul tip de date se UHGHQXPHúWH��L�VH�DWDúHD]��R�HWLFKHW��HFKLYDOHQW���FD�PDL�MRV�

typedef struct Student { char name[20]; // numele studentului unsigned short int age; // virsta unsigned char n_lab; // nota la laborator unsigned char n_ex; // nota la examen } stud;

51

Page 53: Introducere in c++

Introducere in programare

Deci noul tip de date a fost redenumit ca VWXG��vQ�DFHVWH�FRQGL LL�GHFODUD LL�UHODWLYH�OD�HOdevin: 8Q�DOW�H[HPSOX�GH�GHILQLUH�ù

Stud tmp,an99[20];

� Definesc noul tip de datestruct my_data{char name[19];secol[11];short month,day,year;}

� Folosesc noua defini iestruct my_data test,tab[100],*ptab;

Deoarece my_data nu este un tip predefinit de date ,ci este un conglomerat definit de programator trebuie specificat úi cuvântul cheie struct.

Creearea unui nou tip de date se face astfel:

typedef struct { char name[19]; secol[11]; short month,day,year;

}pers;

Începând de acum pers se va folosi direct f�r��DOWH�VSHFLILFD LL�vQ�GHILQLUHD�XQRU�HOHPHQWHde acest tip.

pers test,tab[100],*ptab;

IQL LDOL]DUHD�XQHL�VWUXFWXUL6&D�úL�vQ�FD]XO�WDEORXULORU�VDX�DOWRU�WLSXUL�GH�GDWH��SRDWH�IL�UHDOL]DW��DVWIHO:

: La declararea unui element Ex: pers eu={“MIKE”, “354263”,3,5,1978}; : Oriunde in cadrul programului Obs: Ini LDOL]DUHD�XQHL�VWUXFWXUL�QX�SRDWH�IL�UHDOL]DW��OD�GHILQLUHD�QRXOXL�WLS�GHGDW��(cu typedef)�(YLGHQW��H[LVW� o diferen ��FODU��LQWUH�GHILQLUHD�XQXL�QRX�WLS�GH�GDW�úL�GHILQLUHD�XQHL�YDULDELOH�GH�XQ�DQXPLW�WLS�

9.3. Accesarea membrilor unei structuri

'HRDUHFH� DFHVW� WLS� GH� GDWH� HVWH� FUHDW� GH� SURJUDPDWRU� FRPSLODWRUXO� VDX� IXQF LLOHH[LVWHQWH�QX�úWLX�V��OXFUH]H�GHFkW�FX�WLSXULOH�predefinite de date. De aceea este necesar ca

52

Page 54: Introducere in c++

Introducere in programare

SUHOXFUDUHD� V�� VH� IDF�� WRW� OD� QLYHO� GH� PHPEUL� �FkPSXUL��� 3HQWUX� DFHDVWD� WUHEXLHVFFRQVWUXLWH�IXQF LL�VSHFLDOL]DWH�vQ�RSHUD LXQLOH�FX�QRXO�WLS�GH�GDWH�

ÌQ�FD]XO�GHFODUD LHL�XQXL�HOHPHQW�GH�WLSXO�UHVSHFWLY�RSHUDWRUXO�GH�DFFHV�OD�RULFDUHdin membri este ‘.’. Accesul se face prin referire la numele global urmat de numele PHPEUXOXL� FD� vQ� H[HPSOXO� GH�PDL� MRV� XQGH� HVWH� UHDOL]DW�� FLWLUHD� GH� OD� WDVWDWXU�� D� XQXLtablou de elemente de tip student.

… for(i=0;i<10;i++ )

{clrscr();printf(“Nume”) ;scanf(“%s”, an99[i].nume);printf(“\n Nota la laborator:”);scanf(“%d”,an99[i].n_lab);printf(“\n Nota la examen:”);scanf(“%d”,an99[i].n_ex); }

�����2�VWUXFWXU��vQ�LQWHULRUXO�DOWHL�VWUXFWXUL��nested structures)

([LVW��FD]XUL�FkQG�HVWH�QHFHVDU�FD� LQIRUPD LD�V�� ILH�FkW�PDL� LHUDUKL]DW��RE LQkQGX�VHDVWIHO� XQ� FRG� FkW�PDL� FODU�� ÌQ� FD]XO� GLQ� H[HPSOXOXL� DQWHULRU�� GDF�� GRUHVF� V�� UHDOL]H]� RDSOLFD LH�SHQWUX�XQ�VHFUHWDULDW��DP�QHYRLH�úL�GH�QXP�UXO�JUXSHL��([LVW��GRX��PHWRGH�GH�DUH]ROYD�SUREOHPD��8QD�DU�IL�LQWURGXFHUHD�D�vQF��XQXL�FkPS�FDUH�V��UH LQ��QXP�UXO�JUXSHL�GDU� PRG� GH� UH]ROYDUHD� SRDWH� GXFH� SH� P�VXU�� FH� WRW� PDL� DGDXJ� FDUDFWHULVWLFL� QRL� vQVWUXFWXU��OD�XQ�FRG�JUHX�GH�XUP�ULW��$OW��FDOH�DU�IL�FUHDUHD�XQHL�QRL�VWUXFWXUL�GXS��FXP�HVWHprezentat mai jos.

typedef struct Grupa { int nume; // numarul grupei int an; // an de studii stud t[35]; grupa contine maximum 35 de studenti }gr;

gr temp;

Accesul la membri în acest caz se face prin compunere ca mai jos

temp.nume //umele grupeitemp.t[3].name ����QXPHOH�FHOXL�GH�DO�WUHLOHD�VWXGHQW�GLQ�JUXS6���

0DL�MRV�SUH]HQW�P�vQF��XQ�H[HPSOX

typedef struct {char name[19],snum[11]; struct

{short day;short month;

53

Page 55: Introducere in c++

Introducere in programare

short year; }birth_date

}pers; O referire la day se va face pentru persoana eu: eu.birth_date.day

Element VXEVWUXFWXU��������F�PSVWUXFWXU�mare

Obs: numele c�PSXULORU�XQHL�VWUXFWXUL�QX�VXQW�Y�]XWH�GLUHFW�vQ�DIDU��úL�GHFL�R�UHIHULUH: struct x {int x; ) x; este legal��OD�DFFHVDUH�x.x=5.

Aten LH���ÌQFHS�WRULL�V��HYLWH�DFHVW�OXFUX�GHRDUHFH�FUHD]��R�DPELJXLWDWH�QHUHFRPDQGDW��vQcod.

9.5 Structuri autoreferite 2�VWUXFWXU��18�SRDWH�FRQ LQH�LQVWDQ LHUL�DOH�DOH�HL��GDU�SRDWH�FRQ LQH�SRLQWHUL�F�WUH

LQVWDQ LHUL�DOH�HL�struct p struct p

{int a,b; {int a,b; float c; float c; struct p next; struct p* next;

} }

la analiza lexical��VH�LQWU��vQ�FLFOX�LQILQLW OK!!Acest lucru este posibil deoarece pointerul este o YDULDELO��FDUH�UH LQH�DGUHVDaltei variabile

����7UDQVIHUXO�VWUXFWXULORU�FD�DUJXPHQWH�GH�IXQ LL6: transfer chiar structura (prin valoare) : transfer un pointer c�WUH�HD�(prin referin �)

Ex: pers om; func1 (om)func2 (&om)

7UDQVIHUXO�SULQ�YDORDUH�VH�UHFRPDQG��LQ�XUP�WRDUHOH�FD]XUL: − structura este mic�− JDUDQWDUHD�IDSWXOXL�F��IXQ LD�DSHODQW��QX�PRGLILF��VWUXFWXUD�DSHODW�

La apelul prin valoare compilatorul JHQHUHD]��R�copie a respectivei structuri (IXQF LDDSHODQW��poate deci modifica doar DFHDVW��copie). Dac��DP�GRUL�V��VSHFLILF�P�WUDQVIHUXO�SULQ�UHIHULQ ��LQ�FODU�(vezi func2(&om)) este suficient ca s��GHFODU�P�SHUV* om úL�DWXQFL�IXQF��RP��HVWH�FRUHFW�Atunci în acest caz func1(om) nu ami este corect pentru c��RP�HVWH�XQ�SRLQWHU�úL�QX�Rvaloare.

9.7 Returnarea unei structuri

K&R nu permite returnarea unei structuri dar ANSI permite acest lucru.

54

Page 56: Introducere in c++

Introducere in programare

Deci: pos by value pers f(….)

{ pers x; … return x;

}

pos by reference pers* f1(…..) {

static pers* p; … return &p;

}

�����&kPSXUL�GH�EL L6

Membrii unei structuri de tip int sau XQVLJQHG�SRW�IL�DORFD L�vQ�FkPSXUL�GH���SkQ��OD���EL L��%L LL�VXQW�DORFD L�vQFHSkQG�FX�FHO�PDL�SX LQ�VHPQLILFDWLY�ELW�DO�ILHF�UXL�FXYkQW�GH���EL L��6LQWD[D�HVWH�

WLS�>LGHQWLILFDWRU@�����O�UJLPH����

/�UJLPHD�FkPSXOXL�WUHEXLH�V��ILH�R�H[SUHVLH�vQWUHDJ��FRQVWDQW��FXSULQV��LQWUH���VL������vQVHDPQ��DOLQLHUH�OD�XUP�WRDUHD�OLPLW��GH�FXYkQW���'DF��QX�VH�VSHFLILF��XQ�QXPH�SHQWUXFkPSXO�GH�EL L��FkPSXO�HVWH�DORFDW�GDU�QX�HVWH�DFFHVLELO��VH�IRORVHúWH�SHQWUX�DOLQLHUL��

struct special_word {LQW�������L���������YD�IL�UHSUH]HQWDW�SH�EL LL�E��E��XQVLJQHG��M���������YD�IL�UHSUH]HQWDW�SH�EL LL�E��SkQ��OD�E��LQW�����������������YD�IL�UHSUH]HQWDW�SH�EL LL�E��SkQ��OD�E��6int k :1 ; // va fi reprezentat pe bitul b11 XQVLJQHG��P���������YD�IL�UHSUH]HQWDW�SH�EL LL�E���SkQ��OD�E��

} ;

2�UHVWULF LH� LPSRUWDQW��DVXSUD�RSHUD LLORU�FDUH�VH�SRW� IDFH�FX�FkPSXULOH�GH�EL L�HVWHDFHHD�F��QX�OL�VH�SRDWH�DIOD�DGUHVD�FX�DMXWRUXO�RSHUDWRUXOXL���DGUHVD�XQXL�ELW�QX�DUH�VHQV��

9.9. Uniuni

8QLXQLOH� FRUHVSXQG� FX� vQUHJLVWU�ULOH� FX� YDULDQWH� GLQ� DOWH� OLPEDMH� GH� SURJUDPDUH(Pascal, Modula-2, etc.); o uniune este un tip “hibrid”, valoarea variabilei uniune fiind YDORDUHD�PHPEUXOXL�DFWLY�DO�XQLXQLL�� FHLODO L�PHPEUL� ILLQG�QHGHILQL L��'LQ�SXQFW�GH�YHGHUHVLQWDFWLF� GHILQL LD� XQXL� WLS� XQLXQH� VHDP�Q�� FX� GHILQL LD� XQXL� WLS� VWUXFWXU�� FX� GLIHUHQ D� F�indicatorul VWUXFW�VH�vQORFXLHúWH�FX�XQLRQ��VXQW�SHUPLVH�úL�FkPSXUL�GH�EL L��Ca implementare sunt similare cu structurile, cu diferen D�F��PHPEULL�VXQW�VXSUDSXúL�XQXOGXS�� DOWXO� vQ� PHPRULH�� 6SD LXO� GH� PHPRULH� HVWH� IRORVLW� OD� PD[LPXP� vQ� UDSRUW� � FX

55

Page 57: Introducere in c++

Introducere in programare

VWUXFWXULOH��'H� IDSW��SHUPLW�FD� DFHHDúL� ]RQ��GH�PHPRULH� V�� ILH� LQWHUSUHWDW�� GLIHULW� I�U�� Dfolosi cast.

'LPHQVLXQHD�VSD LXOXL�GH�PHPRULH�DORFDW�XQLXQLL�HVWH�HJDO��FX�GLPHQVLXQHD�VSD LXOXLalocat celui mai mare membru. Accesul la membrii uniunii se face sub forma unor componente selectate, foloVLQG� DFHLDúL� RSHUDWRUL� úL� DFHOHDúL� UHJXOL� FD� vQ� FD]XO� VWUXFWXULORU�1XPHOH�GH�XQLXQL�UHVSHFW��DFHOHDúL�UHJXOL�FD�úL�QXPHOH�GH�XQLXQL��VSD LX�GH�QXPH��XWLOL]DUHetc.). ÌQUHJLVWU�UL�YDULDELOH

În cazurile în care se poate ca într-o ba]��GH�GDWH��GRX��VDX�PDL�PXOWH�F�PSXUL�V�se DXWRHOLPLQH�UHFLSURF���IXQF LH�GH�GDWHOH�LQWURGXVH�vQ�HD���VH�SRDWH�RE LQH�RSWLPL]DUHDVSD LXOXL�JUXSDW�vQ�PHPRULH�GH�XQ�HOHPHQW�DO�VWUXFWXULL�SULQ�JUXSDUHD�DFHORU�F�PSXULîntr-R��XQLXQH�FH�DSDU LQH�VWUXFWXULL�

Ex.: typedef union {

struct{char c1,c2;} s

long j; float x;

} u

1000 1001 1002 1003 C1 C2

J

X

&RPSLODWRUXO�DORF��VXILFLHQW��PHPRULH�SHQWUX�D�SXWHD�UH LQH�FHO�PDL�PDUH�PHPEUX�úL�WR LPHPEULL�vQFHS�OD�DFHHDúL�DGUHV���'DWHOH�VWRFDWH� într-o uniune depind de care membru aluniunii se va utiliza.pas.s.c1=’a’pas.s.c2=’b’

1000 1001 1002 1003 a b ... Unused

pas.j=5 VXSUDVFULH�FHOH���FDUDFWHUH�úL�GHSXQH���SH�WR L�FHL���RFWH L��WLS�long int) 1000 1001 1002 1003

0 0 0 5

6XSRUW��DFHOHDúL�UHJXOL�VLQWDFWLFH�FD�VWUXFWXULOH�

56

Page 58: Introducere in c++

Introducere in programare

([LVW����DSOLFD LL�GH�ED]��SHQWUX�XQLXQL: 1. FUHHD]��VWUXFWXUL�IOH[LELOH��YDULDQWD�UHFRUGV�vQ�FDUH�SRW�UH LQH�GLIHULWH�WLSXUL�GH

date) 2. interpretea]��DFHHDúL�PHPRULH�vQ�PRGXUL�GLIHULWH

Exemplu pentru cazul 1:

Union myunion {int i ;

double d ; char c ; } mu ;

sizeof ( myunion ) --> 8 sizeof ( mu ) --> 8 sizeof ( mu .i ) --> 2 sizeof ( mu .c ) --> 1 sizeof ( mu .d ) --> 8

5HVSHFWkQG�FRQYHUVLLOH�QHFHVDUH��SXWHP�VSXQH�F���XQ�SRLQWHU�F�WUH�R�XQLXQH�HVWH�XQSRLQWHU�F�WUH�RULFDUH�GLQWUH�PHPEULL�HL�

(double *) & mu == & mu .d

O uQLXQH� QX� SRDWH� IL� LQL LDOL]DW�� GHFkW� SULQ� LQWHUPHGLXO� SULPXOXL� V�X� PHPEUXGHFODUDW�� 9RP� SUH]HQWD� PDL� MRV� XQ� SURJUDP� FDUH� FLWHúWH� FXYLQWXO� VSHFLDO� FDUH� UH LQHFRPSRQHQWHOH�KDUGZDUH�GH�ED]��LQVWDODWH�vQWU�XQ�VLVWHP�GH�FDOFXO��$FHVWD�HVWH�LQL LDOL]DW�vQurma DXWRGHWHF LHL� I�FXWH� vQ� VHFYHQ D� GH� SRUQLUH� FH� DUH� ORF� OD� SXQHUHD� VXE� WHQVLXQH� Dsistemului.

#include<stdio.h> #include<conio.h> #include<dos.h>

union { unsigned w; struct bit_field { unsigned fd :1;unsigned dimR :2;unsigned modV :2;unsigned nrF :2;unsigned DMA :1;unsigned nrRS :3;unsigned game :1;unsigned serP :1;unsigned nrLpt :2;

57

Page 59: Introducere in c++

Introducere in programare

} b;} eqp;

void main(void) { unsigned far *ptr;

clrscr(); ptr=MK_FP(0,0410); eqp.w=*ptr;// urmeaz��DILúDUHD�ILHF�UXL�HOHPHQW�DO�uniunii conform// cu vQ HOHVXO�dat…getch();}

Cazul 2 Interpretarea GLIHULW��D�datelor Ca un exemplu V��FRQVLGHU�P�problema FRPXQLFD LHL�seriale, unde datele vin

octet cu octet. Uniunile permit o modalitate de grupare, a RFWH LORU��vPSUHXQ��astfel vQF�W�V��SRDW�

fi reconstruite în forma lor RULJLQDO���'H�exemplu, V��presupunem F��get_byte( ) este o func LH�FDUH�vQWRDUFH�XQ�RFWHW�FLWLW�dintr-un device de comunica LH�

O valoare GRXEOH��SH���RFWH L���SRDWH�IL�H[WUDV��GLQ��device prin 8 apeluri recursive DOH�IXQF LHL�GXS��FXP�VH�YHGH:

union double {

char c[];double val;

}

double get_double( ) {

extern char get_byte( ); //optimal – depinde de modul de structurare a //fiúLHUXOXL

int j;union double d;for (j=0; j<8 ; j++)

d.c[j]=get_byte( );return d.val;

}Aten LH!!! (VWH�R�GLIHUHQ ��PDMRU��vQWUH�DFHVW�PRG�GH�LQWHUSUHWDUH�úL�FRQYHUVLLOH�SULQ�cast.

,QL LDOL]DUHD�XQLXQLL��VSHFLILF��$16,��: union ex

{int I ;float f;

58

Page 60: Introducere in c++

Introducere in programare

}; union ex test={1};

sau vQ�FD]XO�XQLXQL�FH�UH LQH�úL�R�VWUXFWXU�union n

{struct {int i; float f;}s;char ch[6];}

union n test1 = {1, 1.10}

������(QXPHU�UL6

Tipurile de date enumerate sunt folosite în principal pentru a da nume mnemonice unor constante întregi. În exemplul de mai jos

enum zile { luni,marti,miercuri,joi,vineri,simbata,duminica } oricezi ;

VH�GHILQHúWH�XQ�QRX� WLS� vQWUHJ��QXPLW�HQXP�]LOH��XQ�QXP�U�GH�FRQVWDQWH�GH�DFHVW� WLS� �OXQL�PDU L�������FX�YDORUL�GH�DFHVW�WLS��úL�VH�GHFODU��R�YDULDELO��GH�WLS�HQXP�]LOH��QXPLW��oricezi.

ÌQ� SUH]HQWD� RS LXQLL� �E� �VDX� D� FRPHQ]LL� FRUHVSXQ]�WRare din mediul integrat) FRPSLODWRUXO� DUH� OLEHUWDWHD� VD� DORFH��� VDX���RFWH L� SHQWUX�R�YDULDELOD�GH� WLS� HQXPHUDUH� �LQIXQF LH�GH�YDORULOH�FRQVWDQWHORU�GHILQLWH���YDORULOH�FRQVWDQWHORU�GHILQLWH�VXQW�GH�WLS�unsigned FKDU�VDX�LQW��ÌQ�&��XQHL�YDULDELOH�GH�WLS�HQXPHUDUH�L�VH�SRDWH�DWULEXL�RULFH�YDORDUH�vQWUHDJ��

enum days this_day ; // legal si in C si in C++days another_day ; // legal numai in C++

Constantele de enumerare au implicit valori începând cu 0 care cresc din 1 in 1 (luni ����PDU L� ���������GXPLQLFD� �����/D�GHILQL LD�WLSXOXL��RULFH�FRQVWDQW��GH�HQXPHUDUH�SRDWH�ILHYHQWXDO�XUPDW��GH�XQ�LQL LDOL]DWRU��VXE�IRUPD�XQHL�H[SUHVLL� vQWUHJL�FRQVWDQWH� �SR]LWLYH�VDXQHJDWLYH���FDUH�VWDELOHúWH�YDORDUHD�FRQVWDQWHL��&RQVWDQWHOH�GH�HQXPHUDUH�XUP�WRDUH�FDUH�QXDX�R�YDORDUH�H[SOLFLW��FUHVF�GLQ���LQ����6XQW�SHUPLVH�YDORUL�GXSOLFDWH��1XPHOH�FRQVWDQWHORUGH�HQXPHUDUH�VH�DIO�� vQ�DFHODúL�VSD LX�GH�QXPH�FD�úL�QXPHOH�GH�YDULDELOH�� IXQF LL�úL� WLSXUL�Valori de tip enumerare pot apare oriunde sunt permise valori de tip întreg.

enum coins {

penny = 1, // 1tuppence, // 2

nickel = penny + 4, // 5 dime = 10, // 10 quarter = nickel * nickel // 25 } ;

Tipuri enumerative

Se folosesc atunci cand se doreste creerea unui set mic de valori care pot fi asociate cu o variabila .Compilatorul va genera o eroare daca se incearca asigurarea unei valori care nu face parte din multimea valorilor specificate in declaratii.

59

Page 61: Introducere in c++

Introducere in programare

De ex.: enum { red,blue,green,yellow } my_colorsenum { bright,medium,dark } my_intensity

color = yellow OKcolor = bright ERROR

Aceste valori numerice pot fi si direct specificat ,caz in care compilatorul aplica sumareaFX���SR]L LH�QXPDL�OD�FHOH�nespecificate.De ex.:

enum { apple,arong=10,lemon,grope=-5,melon } va avea ca rezultat urmatoare atribuire de catre compilator:

apple=0;orange=10;lemon=11;grape=-5;

melon=-4;

60

Page 62: Introducere in c++

Introducere in programare

CAPITOLUL 10

����1R LXQHD�GH�IXQF LH

'HILQL LH��2�IXQF LH�&�HVWH�R�FROHF LH�GH�RSHUD LL�VSHFLILFH�OLPEDMXOXL6

3kQ��DFXP�V�D�GLVFXWDW�GHVSUH�SURJUDPH�H[WUHP�GH�VLPSOH��'H�DVHPHQHD�V�DX�IRORVLWDSHOXUL�GH�IXQF LL�SUHGHILQLWH��DO�F�UXL�FRG�HVWH�JDWD�VFULV��6H�SRDWH�VSXQH��F��R�IXQF LH�HVWHR�EXFDW��GH�SURJUDP�VHSDUDW����VXESURJUDP��FDUH�HVWH�IRORVLW��vQ�PDL�PXOWH�VFRSXUL�

�� 5HDOL]DUHD�XQXL�FRG�VXUV��FkW�PDL�FODU��� 6LPSOLILFDUHD�SURLHFW�ULL�XQHL�DSOLFD LL��SULQ�VWUXFWXUDUH���� 5HDOL]DUHD�GH�ELEOLRWHFL�GH�IXQF LL��GHFL�FUHúWHUHD�YLWH]HL�GH�GH]YROWDUHD�D�DSOLFD LLORU

XOWHULRDUH

3HQWUX�LQWURGXFHUHD�DFHVWXL�FRQFHSW�vQ�PRG�FRUHFW�WUHEXLH�GLVFXWDWH�vQWkL�XQ�PLQLP�GHWHKQLFL� GH� SURLHFWDUHD� D� XQHL� DSOLFD LL� úL� DFHDVWD� GHRDUHFH� R� IXQF LH� QX� VH� LQWURGXFH� vQFDGUXO�XQXL�SURJUDP�GLQ�PRWLYH�³DUWLVWLFH´�FL�DUH�R�MXVWLILFDUH�OD�QLYHO�ORJLF�IRDUWH�FODU��

&D�WHKQLFL�GH�SURLHFWDUH�H[LVW��GRX��PHWRGH��WRS�GRZQ��GH�VXV�vQ�MRV���úL�ERWWRP�XS�GH�MRV�vQ�VXV���3URLHFWDUHD�XQHL�DSOLFD LL�FRQVW��vQ�GHVFRPSXQHUHD�ORJLF��SH�VXEPRGXOH�

)XQF LH� GH� FRPSOH[LWDWHD� DFHVWHL� DSOLFD LL� GHVFRPSXQHUHD�SRDWH� FRQWLQXD� UHFXUVLY� ODQLYHOXO�ILHF�UXL�PRGXO�UH]XOWDW�SkQ��FkQG�

� DFHVWD�HVWH�H[WUHP�GH�VLPSOX�GH�UHDOL]DW� HVWH�GHMD�LPSOHPHQWDW��UHVSHFWLYD�SDUWH�vQWU�R�ELEOLRWHF���D�FRPSLODWRUXOXL� HVWH�GHMD�GH]YROWDW��DQWHULRU� GDWRULW��VLPSOLW� LL�SURJUDPXOXL��QX�PDL�DUH�VHQV�

ÌQ� FD]XO�PHWRGHL� GH� SURLHFWDUH� WRS�GRZQ�SURLHFWDUHD� GHFXUJH� H[DFW� FXP� DP� GHVFULVPDL� VXV�� 8]XDO� vQ� SURJUDPDUHD� &� VH� IRORVHúWH� DFHDVW�� PHWRG��� ÌQ� FD]XO� ERWWRP�XS� VHSRUQHúWH�GH� OD�XQ� VHW� GH� IXQF LL� úL� RSHUD LXQL� H[LVWHQWH� úL� VH� FRQVWUXLHVF�PRGXOH� FDUH� ODUkQGXO�ORU�YRU�FRQVWUXL�UHFXUVLY�DOWH�PRGXOH��SkQ��FkQG�UH]XOW��DSOLFD LD��$FHDVW��PHWRG�

HVWH�IRORVLW��X]XDO�vQ�FD]XO�SURLHFW�ULL�DSOLFD LLORU�SHQWUX�ED]HOH�GH�GDWH�7RWXúL�HVWH�JUHX�GH�LPSXV�XQ�DQXPLW�WLS�GH�JkQGLUH�FkQG�VH�UHDOL]HD]��SURLHFWDUHD�XQHL

DSOLFD LHL�� ([LVW�� R� WHRULH� IRDUWH� ELQH� IXQGDPHQWDW�� úL� GRFXPHQWDW�� SULYLQG� DFHVWHSUREOHPH��ÌQWU�R�SULP��ID]��HVHQ LDOH�VXQW�H[SHULHQ D�DYXW��vQ�SURLHFWDUHD�XQXL�DQXPLW�WLSGH�DSOLFD LH��úL�DSRL�H[SHULHQ D�GH�SURJUDPDUH�

'HMD� SHQWUX� DSOLFD LL� IRDUWH� PDUL� VH� OXFUHD]�� vQ� HFKLSH� FX� PHPEUL� H[WUHP� GHVSHFLDOL]D L� vQ� FkWH� R� ID]�� D� SURFHVXOXL� GH� SURLHFWDUH�� LPSOHPHQWDUH�� WHVWDUH�� ÌQV�LQGLIHUHQW�FkW�GH�FRPSOLFDW��DU�IL�GLVWULEX LD�XQHL�HFKLSH�SURJUDPDWRUXOXL�SURSULX�]LV�L�VHGDX� ILH� VSHFLILFD LLOH� UHODWLY� OD�FH�YD� WUHEXL� V�� IDF�� SDUWHD�GH� FRG� FDUH�R�GH]YROW�� ILH� vQDQXPLWH� FD]XUL� DOJRULWPXO�� ÌQ� DPEHOH� VLWXD LL� PRGXO� vQ� FDUH� vúL� GHVFRPSXQH� DSOLFD LDSHQWUX�D�R�SXWHD� UHDOL]D�QX�SULYHúWH�SH�QLPHQL��/D�VIkUúLW�DFHDVWD� WUHEXLH�V�� IXQF LRQH]HFRUHFW�úL�DWkW�

3DVXO�LPHGLDW�XUP�WRU�vQ�DSOLFDUHD�PHWRGHL�WRS�GRZQ�HVWH�UDILQDUHD�SDúLORU([HPSOX��&XP�V�DU�SURLHFWD�XQ�SURJUDP�FDUH�V��³1XPHUH�FXYLQWHOH�GLQWU�XQ�ILúLHU´�"

61

Page 63: Introducere in c++

Introducere in programare

^

`

^

`

Descriere în pseudocod 'HVFKLGH�ILúLHUXODWkWD�WLPS�FkW�PDL�VXQW�FXYLQWH�LQ�ILúLHU�I�

FLWHúWH�XQ�FXYkQWFUHúWH�QXP�UXO�GH�FXYLQWH�FX���

ÌQFKLGH�ILúLHUXO�$ILúHD]��QXP�UXO�GH�FXYLQWH

5DILQDUHD�SDúLORU6

'HVFKLGH�ILúLHUXO$WkWD�WLPS�FkW�PDL�VXQW�FXYLQWH�LQ�ILúLHU

FLWHúWH�FDUDFWHUH�SkQ��VH�vQWkOQHúWH�XQ�FDUDFWHU�GLIHULW�GH�¶�¶FLWHúWH�FDUDFWHUHOH�SkQ��J�VHVF�XQ�µ�µLQFUHPHQWHD]���QUBFXY��

ÌQFKLGH�ILúLHUXO$ILúHD]����QUBFXY��

������'HFODUDUHD�úL�GHILQLUHD�IXQF LLORU6

)XQF LD� PDLQ��� D� IRVW� IRORVLW�� vQ� WRDWH� H[HPSOHOH� GH� SkQ�� DFXP�� 'H� FkWH� RUL� XQSURJUDP�&�HVWH�H[HFXWDW�HO�vQFHSH�FX�SULPD�LQVWUXF LXQH�GLQ�IXQF LD�PDLQ����%LEOLRWHFLOH�&QH� SXQ� OD� GLVSR]L LH� R� VXP�� YDULDELO�� GH� UXWLQH� SUHFRPSLODWH�� 7RWXúL� SHQWUX� D� SXWHDUH]ROYD� SUREOHPH� PDL� FRPSOH[H� HVWH� QHFHVDU� V�� VH� SURLHFWH]H� �GHFODUDUH� úL� GHILQLUH�SURSULLOH�IXQF LL�

��������'HFODUDUHD�IXQF LLORU6

2� IXQF LH� HVWH� GHFODUDW�� H[DFW� FD� R� YDULDELO��� LDU� WLSXO� GH� GDW�� SH� FDUH�O� UHWXUQHD]�WUHEXLH�VSHFLILFDW��ÌQ�&�WUHEXLH�DYXW�JULM��FD�QXPHOH�XQHL�IXQF LL�SURSULL�V��QX�FRLQFLG��FXQXPHOH�XQHL� IXQF LL� GH�ELEOLRWHF��� ÌQ� FD]� FRQWUDU� OLQN�HGLWRUXO� QX�YD� úWL� OD� JHQHUDUHD�GHOHJ�WXUL� vQWUH� ILúLHUHOH� RELHFW�� GDF�� DSHOXO� � UHVSHFWLYHL� IXQF LL� VH� UHIHU�� OD� UXWLQDSUHFRPSLODW��H[LVWHQW��GHMD�VDX�OD�FRUSXO�IXQF LHL�SURSULL��6H�SRDWH�FKLDU�PDL�U�X�V��QX�VHJHQHUH]H�XQ�PHVDM�GH�HURDUH��DFHVW�OXFUX�VH�vQWkPSO��FkQG�SURWRWLSXULOH�FHORU�GRX��IXQF LLVH�SRWULYHVF��LDU�DFHVW�WLS�GH�HURDUH�HVWH�H[WUHP�GH�JUHX�GH�GHWHFWDW�

'H�DVHPHQHD�WUHEXLH�VSHFLILFDWH�úL�DUJXPHQWHOH�FH�YRU�IL�WUDQVPLVH�IXQF LHL�OD�DSHO�WLSXO��RUGLQHD�ORU���2�IRUP��JHQHUDO��SHQWUX�GHFODUDUHD�XQHL�IXQF LL�HVWH�

�WLSBGDW�!�QXPHBIXQF LH��OLVW�BDUJXPHQWH!��XQGH��

�OLVW�BDUJXPHQWH! ^WLSBGDW�� QXPHBDUJ��� WLSBGDW�� QXPHBDUJ��� «� WLSBGDW�QXPHBDUJQ`�

62

Page 64: Introducere in c++

Introducere in programare

«

«

«

)XQF LLOH� VXQW� GHFODUDWH� vQDLQWH� GH� IXQF LD� PDLQ���� $FHVW� OXFUX� SHUPLWH� FD� RULFDUHIXQF LH�V��ILH�DSHODW��GH�RULFDUH�DOWD�LQFOXVLY�GH�HD�vQV�úL��FD]XO�IXQF LLORU�UHFXUVLYH��

�6H�SRW�GHFODUD�IXQF LL�úL�vQ�LQWHULRUXO�DOWRU�IXQF LL�GDU�vQ�DFHVW�FD]�HOH�QX�SRW�IL�DSHODWHGHFkW�vQ�LQWHULRUXO�IXQF LHL�XQGH�DX�IRVW�GHFODUDWH��'H�DFHHD�PHWRGD�GH�GHFODUDUH�JOREDO��DORU�HVWH�FHO�PDL�GHV�IRORVLW��

(VWH� QHFHVDU�� V�� VH� UHDOL]H]H� VSHFLILFDUHD� WLSXOXL� GH� GDW�� SHQWUX� DUJXPHQWH� úLYDORDUHD� UHWXUQDW��� $FHVW� OXFUX� SHUPLWH� FRPSLODWRUXOXL� V�� YHULILFH� GDF�� IXQF LLOH� VXQWDSHODWH�FRUHFW�úL�V��UHDOL]H]H�RULFH�FRQYHUVLH�LPSOLFLW��DU�IL�QHFHVDU�

'H�H[HPSOX�XQ�DSHO�GH�IXQF LH�FD�PDL�MRV�

�LQFOXGH��PDWK�K!

GRXEOH�[�

[ VTUW����

SRDWH� IL� FRQVLGHUDW� FD� LQFRUHFW� GHRDUHFH� IXQF LD� UDGLFDO� DUH� FD� SDUDPHWUX� GH� LQWUDUH� RYDULDELO�� GH� WLS� GRXEOH�� 'DWRULW�� IDSWXOXL� F�� IXQF LD� HVWH� GHFODUDW�� vQ� FDGUXO� ELEOLRWHFLLPDWK�K�FDUH�HVWH�LQFOXV��vQ�SURJUDP��FRPSLODWRUXO�YD�IDFH�FRQYHUVLD�GH�OD�vQWUHJ�OD�GRXEOHD�YDORULL���DVWIHO�vQFkW�OD�DSHO�IXQF LD�UDGLFDO�YD�SULPL�R�YDORDUH�FRUHFW��������

��������'HFODUD LL�LPSOLFLWH

'DF��QX�HVWH�VSHFLILFDW�QLFL�XQ�WLS�GH�GDW��OD�YDORDUHD�SH�FDUH�WUHEXLH�V��R�UHWXUQH]H�RIXQF LH� DWXQFL� FRPSLODWRUXO� YD� FRQVLGHUD� F�� IXQF LD� UHWXUQHD]�� XQ� vQWUHJ�� 6LPLODU� GDF�IXQF LD� QX� HVWH� GHFODUDW��� FRPSLODWRUXO� YD� FRQVLGHUD� F�� UHWXUQHD]�� XQ� vQWUHJ� úL� YD� GDHURDUH�GDF��vQ�SURJUDP�HVWH�IRORVLW��DOWIHO�

7RWXúL� GDF�� VH� LQH� FRQW� QXPDL� SH� WLSXO� LPSOLFLW� FRPSLODWRUXO� QX� YD� úWL� V�� IDF�FRQYHUVLLOH�GH�WLS�OD�DSHO�

������'HILQLUHD�IXQF LHL6'HILQLUHD�XQHL�IXQF LL�VH�UHIHU��OD�R�EXFDW��GH�FRG�&�FDUH�UH]ROY��R�DQXPLW��SUREOHP�

�DFHHD�SHQWUX�FDUH�V�D�LQWURGXV�IXQF LD���$FHDVW��GHILQL LH�VH�IDFH�vQ�DIDUD�FRUSXOXL�IXQF LHLPDLQ���VDX�DO�DOWHL�IXQF LL�úL�DUH�IRUPD�JHQHUDO��GDW��PDL�MRV�

63

Page 65: Introducere in c++

Introducere in programare

VDX�

^

`

6WUXFWXUD�JHQHULF��D�XQHL�IXQF LL�&

LHL 1 LHL �� �

^

'HFODUD LL

`

7LSXO IXQF XPHOH IXQF /LVW DUJXPHQWH

LQVWUXF LXQL

([HPSOX�

FRUSXO�IXQF LHL

WLS ����QXPH

LQW��������������SZ������������������LQW�QXP��^

LH�YDULDELO� �

�����LQVWUXF LXQL�&`

�GHFODUD LH�DUJXPHQW

QXPH�DUJXPHQW�LQW�UH]� �GHFODUD �ORFDOUH]� �QXP� �QXP�UHWXUQ�UH]�

�WLSBGDW�!��QXPHBIXQF LH��OLVW��DUJXPHQWH!�

�GHFODUD LL�YDULDELOH�ORFDOH!

�LQVWUXF LXQL!

UHWXUQ��YDULDELO��H[SUHVLH!

3ULPD� OLQLH� WUHEXLH� V�� ILH� LGHQWLF�� FX� FHD� GLQ� GHFODUD LH�� *UXSXO� GH� YDULDELOH� ORFDOH�DXWRPDWH��FDUH�SRW�IL�IRORVLWH�vQ�LQWHULRUXO�XQHL�IXQF LL�FRQVW��vQ�FHOH�GHFODUDWH�vQ�OLVWD�GHDUJXPHQWH�VDX�OD�vQFHSXWXO�IXQF LHL�

64

Page 66: Introducere in c++

Introducere in programare

^

^

`

`

^

GR

^

`

&D�úL� vQ�FD]XO� IXQF LHL�PDLQ���YDULDELOHOH� WUHEXLHVF�GHFODUDWH� LPHGLDW� GXS�� SDUDQWH]DGHVFKLV��úL�vQDLQWH�GH�DOWH�LQVWUXF LXQL�

&D� XQ� H[HPSOX� GH� IXQF LH� V�� OX�P� FD]XO� FDOFXOXOXL� U�G�FLQLL� S�WUDWH� GDU� FXVSHFLILFDUHD� SUHFL]LHL� GRULWH�� 6H� YD� IRORVL�PHWRGD�1HZWRQ�5DSKVRQ� SHQWUX� DSUR[LPDUHDU�G�FLQLL�

�LQFOXGH��VWGLR�K!

�LQFOXGH��FRQLR�K!

�LQFOXGH��PDWK�K!

GRXEOH�UDGLFDO�GRXEOH�[�IORDW�SUHFL]LH��

YRLG�PDLQ�YRLG�

IORDW�QU��SUHF�

GRXEOH�UH]XOWDW�

FOUVFU���

SULQWI�³'DWL�QXPDUXO´��

VFDQI�³�I´�QU��

SULQWI�³?Q'DWL�SUHFL]LD�´��

VFDQI�³�I´�SUHF��

VZLWFK��UH]XOWDW UDGLFDO�QU�SUHF���

FDVH�±�����SULQWI�³(URDUH��1XPDU�1HJDWLY´���EUHDN�

FDVH�±����SULQWI�³(URDUH��3UHFL]LD�HVWH�LQWUH���VL���´��EUHDN�

GHIDXOW��SULQWI�³?Q5DGLFDOXO�HVWH��OI´�UH]XOWDW��

SULQWI�³?Q�3UHVV�DQ\�NH\�WR�FRQWLQXH�´��

JHWFK���

GRXEOH�UDGLFDO�GRXEOH�[�IORDW�SUHFL]LH�

GRXEOH�[BYHFKL��[BLQLWLDO [�

LI�[�����UHWXUQ�±��

LI��[�UHWXUQ�[�

LI��SUHFL]LH!��__�SUHFL]LH����UHWXUQ�±��

[BYHFKL [�

[ ��� �[�[BLQLWLDO�[��

`ZKLOH�IDEV��[�[BYHFKL��[�!SUHFL]LH��

UHWXUQ�[�

65

Page 67: Introducere in c++

Introducere in programare

^

`

6H�REVHUY��F��DSURDSH�MXP�WDWH�GLQ�FRUSXO�IXQF LHL�WUDWHD]��HURULOH�FH�SRW�DS�UHD��'HúLOD�SULPD�YHGHUH�DFHVW� OXFUX�DSDUH�FD�XQ�HIRUW�VXSOLPHQWDU��QHMXVWLILFDW� vQ�SURJUDPDUH�� vQPRPHQWXO�vQ�FDUH�HVWH�FD]XO�XQHL�DSOLFD LL�FX�SHVWH����IXQF LL�FDUH�VH�DSHOHD]��XQHOH��SHDOWHOH�FRGXO�HVWH�UHODWLY�JUHX�GH�XUP�ULW�úL�GHSDQDW�vQ�FD]�FRQWUDU�

ÌQ� FRQGL LLOH� vQ� FDUH� V�D� SUHY�]XW� ILHFDUH� IXQF LH� GH� OD� vQFHSXW� FX� DFHVWH� YHULILF�ULDWXQFL� HVWH� H[WUHP� GH� XúRU� FD� V�� VH� SRDW�� GHSLVWD� HURULOH�� 'DF�� DFHDVW�� SROLWLF�� HVWHDSOLFDW��OD�RULFH�QLYHO�DO�SURJUDPXOXL�YD�FRQGXFH�OD�VFULHUHD�XQXL�FRG�VWDELO��6WDELOLWDWHDVH�UHIHU��OD�IDSWXO�F��GDF��DSDUH�XQGHYD�vQ�FXUVXO�H[HFX LH�R�HURDUH�GDWRUDW��ILH�FRQGL LLORUH[WHUQH� �LQWU�UL� JUHúLWH�� ILH� FRQGL LLORU� LQWHUQH� �GH� H[HPSOX� HURDUH� GH� SURJUDPDUH� VDXYLUXV��DFHDVWD��YD�IL�VHPQDODW��XWLOL]DWRUXOXL��(D�VH�YD�SURSDJD�SH�FDOH�LHUDUKLF��GLQ�DSHOvQ�DSHO�GH�IXQF LH��I�U��FD�SURJUDPXO�V��LDV��GLQ�SDUDPHWUL�QRUPDOL�GH�IXQF LRQDUH��QX�VHSLHUGH�FRQWUROXO�DVXSUD�DSOLFD LHL�

3HQWUX�UHDOL]DUHD�XQRU�SURJUDPH�FDUH�V��SULPHDVF��SDUDPHWUL�GH�LQWUDUH�GLQ�OLQLD�GHFRPDQG��IXQF LD�PDLQ���SRDWH�SULPL�XQ�VHW�GH�SDUDPHWUL�FDUH�V��FRQ LQ��H[DFW�VLUXULOH�GHFDUDFWHUH�GLQ�OLQLD�GH�FRPDQG���0DL�MRV�HVWH�GDW�XQ�H[HPSOX�VLPSOX�GH�IRORVLUHD�D�DFHVWHLIDFLOLW� L�úL�DQXPH�XQ�SURJUDP�FDUH�YD�DILúD�SDUDPHWULL�SULPL L�SULQ�OLQLD�GH�FRPDQG��

�LQFOXGH��VWGLR�K!

YRLG�PDLQ�LQW�DUJF��FKDU� DUJY�

�����LQW�L�

�����SULQWI��DUJF� ��G?Q?Q��DUJF��

�����IRU��L ��L�DUJF���L�

������SULQWI��DUJY>�G@���V?Q��L��DUJY>L@��

6H�REVHUY��F��SULPXO�DUF� VSHFLILF�� �QXP�UXO�GH� OHPHQWH�GLQ�FDUH�HVWH�FRPSXV�� OLQLD�GHFRPDQG��� LDU� DUJY� UH LQH� DGUHVD� GH� vQFHSXW� D� ]RQHL� GH� PHPRULH� vQ� FDUH� VXQW� VWRFDWHDFHVWHD�

������7LSXO�GH�GDW��void Geneza pointerului void �$�IRVW�LQWURGXV�GH�VWDQGDUGXO�$16,�SHQWUX�D�UH]ROYD�XUP�WRDUHD�DPELJXLWDWH�GH�VLQWD[����ùWLP�F��DYHP�SRVLELOLWDWHD�GH�D�DORFD�PHPRULH���)XQF LD� vQWRDUFH� XQ� SRLQWHU� F�WUH� vQFHSXWXO� ]RQHL� GH� PHPRULH� DORFDW�� �LQGLIHUHQW� F�VXQWHP�VXE�'26��:,1'2:6�VDX�81,;���ÌQWUHEDUHD�HVWH�GH�FH�WLS�HVWH�DFHVW�SRLQWHU�VDX�WUDGXV��FXP�YD�IL�LQWHUSUHWDW��]RQD�FRQWLJXD�GH�PHPRULH�UH]HUYDW����������&D�ILLQG�JUXSDW��vQ�HOHPHQWH�GH�OXQJLPH���RFWHW��VLJQHG��VDX�XQVLJQHG���VDX�FKDU���� &D�ILLQG�JUXSDW��vQ�HOHPHQWH�GH�OXQJLPH���RFWH L��VLJQHG��VDX�XQVLJQHG���

ú�D�P�G���3HQWUX� D� UH]ROYD� DFHDVW�� VHPLDPELJXLWDWH� G�S�G�Y�� DO� FRPSLODWRUXOXL� úL� QX� QXPDL�� V�DGHFLV�FD�SRLQWHUXO�UHWXUQDW�V��ILH�GH�WLS�YRLG��8Q�WLS�LQH[LVWHQW��GDU�FRQYHUWLELO�ILH�H[SOLFLWSULQ�FDVW��.5�VWDQGDUG���ILH�LPSOLFLW�SULQ�DVLJQDUH��$16,��OD�WLSXO�YDULDELOHL�FDUHLD�L�VHDVLJQHD]��

ÌQ� OLPEDMXO� &� R� IXQF LH� WUHEXLH� V�� UHWXUQH]H� XQ� WLS� GH� GDWH� OD� WHUPLQDUHD� H[HFX LHL�7RWXúL�H[LVW��FD]XUL�FkQG�QX�VH�IDF�FDOFXOH�GLUHFWH�FL�VH�UHDOL]HD]��DQXPLWH�DF LXQL�FXP�DU

66

Page 68: Introducere in c++

Introducere in programare

`

IL� GH� H[HPSOX� DILúDUHD� XQXL� PHVDM�� ÌQ� DFHVWH� FD]XUL�� WRWXúL� WUHEXLH� VSHFLILFDWFRPSLODWRUXOXL�IDSWXO�F��IXQF LD�QX�UHWXUQHD]��QLPLF�

([LVW�� úL� FD]XO� LQYHUV� DGLF�� R� IXQF LH� FDUH� QX� SULPHúWH� QLFL� XQ� SDUDPHWUX� � GDUUHWXUQHD]��UH]XOWDWH��FD]XO�FLWLULL�XQXL�SRUW�GH�GDWH���3HQWUX�D�SXWHD�VSHFLILFD�DFHVWH�VLWXD LLVH�IRORVHúWH�WLSXO�GH�GDW��YRLG�FDUH�vQ�WUDGXFHUH�vQVHDPQ���OLSVLW�GH�FRQ LQXW��QLPLF�

Transferul Argumentelor $UJXPHQWHOH� XQHL� IXQF LL�� UHSUH]LQW�� F�LOH� GH� WUDQVIHU� D� GDWHORU� F�WUH� IXQF LH�

0XOWH� OLPEDMH�GH�SURJUDPDUH� WUDQVIHU�� DUJXPHQWHOH�SULQ� UHIHULQ H�� FHHD� FH� vQVHDPQ�� F�WULPLW� XQ� SRLQWHU� F�WUH� DUJXPHQW�� ÌQ� &� DUJXPHQWHOH� VXQW� WULPLVH� SULQ� YDORDUH� FHHD� FHvQVHDPQ��F��R�FRSLH�D�DUJXPHQWXOXL�HVWH�WULPLV��IXQF LHL��)XQF LD�SRDWH�PRGLILFD�YDORDUHDFRSLHL��GDU�QX�SRDWH�PRGLILFD�YDORDUHD�FDUH�R�DUH�DUJXPHQWXO�vQ�UXWLQD�DSHODQW��

)LJXUD�DUDW��GLIHUHQ D�� VH�REVHUY�� F�� V�JH LOH�GH� OD� WUDQVIHUXO�SULQ� UHIHULQ ��� VXQWELGLUHF LRQDOH��FHHD�FH�VSHFLILF��IDSWXO�F��PRGLILF�ULOH�ORFDOH�VH�UHSHUFXWHD]��GLUHFW�

$UJXPHQWXO� WULPLV� HVWH� GH� RELFHL� QXPLW� DUJXPHQW� DFWXDO�� vQ� WLPS� FH� FRSLDUHFHS LRQDW��HVWH�QXPLW��DUJXPHQW�IRUPDO�VDX�SDUDPHWUX�IRUPDO�

'HRDUHFH�&�WUDQVIHU��DUJXPHQWHOH�SULQ�YDORDUH��R�IXQF LH�SRDWH�DVLJXUD�QRL�YDORULOD�DUJXPHQWHOH�IRUPDOH�I�U��D�OH�DIHFWD�SH�FHOH�DFWXDOH��'H�H[HPSOX�

�LQFOXGH�VWGLR�K!YRLG�PDLQ�YRLG�

^H[WHUQ�YRLG�I����LQW�D ��I�D��SULQWI�³\ �G�?Q�³��D��H[LW����

67

Page 69: Introducere in c++

Introducere in programare

^

`

^

`

^

`

YRLG�I��LQW�DUJ�

DUJ ��

YD� DYHD� FD� UH]XOWDW� DILúDUHD� YDORULL� ��� PRGLILFDUHD� FRSLHL� QHPDLDIHFWkQG� YDORDUHD� GLQIXQF LD�DSHODQW���'DF��VH�GRUHúWH�FD�IXQF LD�V��SRDW��VFKLPED�YDORDUHD�XQXL�RELHFW��DWXQFLWUHEXLH�FD�DFHDVWD�V��SULPHDVF��DGUHVD�RELHFWXOXL��GHFL�V��L�VH�WULPLW��XQ�SRLQWHU�OD�RELHFW�FD�vQ�H[HPSOXO�XUP�WRU�

YRLG�VZDS�LQW� �[�LQW �\�

UHJLVWHU�LQW�WHPS�WHPS [�*x=* \� \ WHPS�

YRLG�PDLQ�YRLG�

LQW�D ��E ��VZDS��D��E��SULQWI�³D ��G���E �G?Q´�D�E��

XQGH�VH�YD�DILúD�D ��úL�E ��&X�WUDQVIHUXO�SULQ�UHIHULQ ��QH�DP�vQWkOQLW�GH�OD�SULPHOH�OHF LL��VFDQI��³�G´�QU���

'HFODUD LL�úL�DSHOXUL6)XQF LLOH�SRW�DS�UHD�vQWU�XQ�SURJUDP

: 'HILQL LH� R�GHFODUD LH�FDUH�GHILQHúWH�FH�IDFH�IXQF LD�SUHFXP�úL�QXP�UXO�úL�WLSXODUJXPHQWHORU�HL�

: )XQFWLRQ�DOOXVLYH�����VH�GHFODU��R�IXQF LH�GHILQLW��vQ�DOW��SDUWH��$FHVW�OXFUX�VSHFLILF�FH� WLSXUL� GH� YDORUL� vQWRDUFH� IXQF LD�� SUHFXP� úL� FH� WLSXUL� GH� YDORULSULPHúWH

: $SHOXO�IXQF LHL�� DSHO�SURSULX�]LV�OD�vQWkOQLUHD�OXL�vQ�FRQWH[WXO�H[HFX LHL�SURJUDPXOXL6DUH� OD� ]RQD� FRUSXOXL� IXQF LHL� H[HFXW�� FH� HVWH� DFROR� úL� DSRL� VHUHvQWRDUFH�OD�ORFXO�DSHOXOXL�

Declararea argumentelor 'HFODUDUHD� DUJXPHQWHORU� VH� VXSXQH� OD� DFHOHDúL� UHJXOL� FD� RULFDUH� GHFODUDUH� GH

YDULDELOH�FX�XUP�WRDUHOH�H[FHS LL��� VLQJXUD�FODV��GH�VWRFDUH�SHUPLV��HVWH�UHJLVWHU�� FKDU� úL� VKRUW� VXQW� FRQYHUWLWH� OD� vQWUHJL�� IORDW� VXQW� FRQYHUWLWH� OD� GRXEOH�

1RLOH�IDFLOLW� L�$16,�&�SHUPLW�GH\DFWLYDUHD�DFHVWRU�FRQYHUVLL�DRWRPDW�� XQ� DUJXPHQW� IRUPDO� GHFODUDW� FD� IXQF LH� HVWH� FRQYHUWLW� OD� SRLQWHU� F�WUH

IXQF LH�� VH�SRDWH�V��QX�LQFOXG�XQ�LQL LDOL]DWRU�vQWU�R�GHFODUD LH�GH�DUJXPHQWH

68

Page 70: Introducere in c++

Introducere in programare

^

^

`HOVH

^

``

&RUSXO�IXQF LHL&RUSXO�XQHL�IXQF LL�HVWH�GHOLPLWDW�GH�XQ�VHW�GH�SDUDQWH]H�^`��(O�SRDWH�IL�JRO��IDSW�FH

HVWH�IRORVLWRU�vQ�GLYHUVH�SHULRDGH�D�GH]YROW�ULL�XQXL�SURJUDP�8QXO�GLQ�SULPHOH�OXFUXUL�vQ�FD]XO�SURLHFW�ULL�XQHL�DSOLFD LL�PDUL��HVWH�GHILQLUHD�XQXL

VHW�GH�RSHUD LL�GH�QLYHO�vQDOW�FH�FRUHVSXQG�FD�IXQF LRQDUH��ÌQ�DFHVWH�VWDJLL�HVWH�IRORVLWRU�V�DP�XQ�SURJUDP��IXQF LD��GHFODUD LL��SDUDPHWULL�VSHFLILFD L��GDU�FRUSXO�JRO��/D�DSHO�HD�QX�YDH[HFXWD�QLPLF��8OWHULRU�DFHVWH�FRUSXUL�YRU�IL�FRPSOHWDWH�

9DORULOH�UHWXUQDWH��vQWRDUVH�2�IXQF LH�SRDWH�UHWXUQD�R�VLQJXU��YDORDUH�SULQ�LQWHUPHGLXO�FXYkQWXOXL�FKHLH�UHWXUQ�

$FHDVW��YDORDUH�SRDWH�IL�XQ�SRLQWHU�SHQWUX�WDEORX�YDORUL�PXOWLSOH��VDX�R�IXQF LH�� ,QGLUHFWvQV��úL�DFHVWHD�SRW�IL�vQWRDUVH��GDF��VH�IRORVHúWH�XQ�SRLQWHU�OD�DFHVWHD�FD�YDORDUH�DWLQV���2VWUXFWXU�� VDX�XQLXQH�SRW� IL� UHWXUQDWH�GLUHFW��GHúL�DFHVW� OXFUX�QX�HVWH� UHFRPDQGDW�GDWRULW�GLPHQVLXQLORU�PDUL�DOH�ORU�

&RUSXO� XQHL� IXQF LL� SRDWH� FRQ LQH� RULFkWH� DSHOXUL� GH� UHWXUQ�� /D� SULPXO� vQWkOQLW�H[HFX LD�IXQF LHL�HVWH�vQFKHLDW���vQ�OLSVD�WRWDO��D�XQXL�UHWXUQ��vQWRUFHUHD�vQ�IXQF LD�DSHODQW��VH�IDFH�DWXQFL�FkQG�VH�vQWkOQHúWH�PDUFDWRUXO�GH�VIkUúLW�GH�EORF�³�`�³�

9DORDUHD� vQWRDUV�� WUHEXLH� V�� ILH�FRPSDWLELO�� FX� WLSXO� IXQF LHL��([��GH�FD]� vQ� FDUHYDORDUHD� vQWRUV�� HVWH�GLIHULW��� HVWH�GDW�PDL� MRV��GDU� vQ� DFHVW� FD]� FRQYHUVLD� OD�YDORDUHD� ODYDORDUHD�UHWXUQDW��VH�IDFH�DXWRPDW�$7(1�,(��� $FHVW�OXFUX�SRDWH�FUHD�R�JURD]��GH�QHSO�FHUL�ILLQG�R�HURDUH�H[WUHP�GH�JUHX

GH�J�VLW�

)ORDW�I�YRLG�

LQW�D�FKDU�F�IORDW�I��

LI���D�!��F��[����

I� D�������D�FRQYHUWLW�OD�IORDWUHWXUQ�D�

I� F�����F�FRQYHUWLW�OD�IORDWUHWXUQ�F�

/LPEDMXO� &� HVWH� IRDUWH� ULJXURV� UHODWLY� OD� SRWULYLUHD� WLSXULORU� GH� SRLQWHUL�� ÌQH[HPSOXO�XUP�WRU� I�� ��HVWH�GHFODUDW��FD�R� IXQF LH�FH� vQWRDUFH�XQ�SRLQWHU�F�WUH�FKDU�� VXQWSUH]HQWH�XQHOH�SRVLELOLW� L�OHJDOH�VDX�LOHJDOH�GH�vQWRDUFHUH�GH�UH]XOWDW�

69

Page 71: Introducere in c++

Introducere in programare

^

LQW�

&KDU �I���

FKDU� FP�� FY�� FY���FD>��@�LQW� LS�� LS��FY FY��������DGPLV��DX�DFHODúL�WLSUHWXUQ�FY������DGPLV��FY��HVWH�FKDU

sau FY� � FP�������DGPLV��DX�DFHODúL�WLSUHWXUQ� FP�����DGPLV�� FP�HVWH�FKDU

sau FY FD������DGPLV��DX�DFHODúL�WLSUHWXUQ�FD����DGPLV��FD�HVWH�FKDU

sau FY FY�����HURDUH��FY�HVWH�FKDU ��LDU� FY��HVWH�FKDU UHWXUQ� FY�����HURDUH�GLQ�DFHVW�PRWLY

sau FY� LS�����HURDUH�FKDU � ≠ �LQW UHWXUQ��������$WHQ LH����3URGXFH�XQ�FRPSRUWDPHQW�LPSUHGLFWLELO��VH�DúWHDSW���R

�����YDORDUH�V��ILH�vQWRDUV�

$OX]LL�OD�IXQF LL62�DOX]LH� OD�IXQF LH�UHSUH]LQW��R�GHFODUD LH�D�XQHL�IXQF LL�FDUH�HVWH�GHILQLW�� vQ�DOW�

SDUWH��GH�RELFHL�vQWU�XQ�ILúLHU�VXUV��GLIHULW��,PSOLFLW�WRDWH�IXQF LLOH�VXQW�SUHVXSXVH�D�UHWXUQD

6FRSXO�SULQFLSDO�DO�UHGHFODU�ULL�HVWH�GH�D�LQGLFD�SURWRWLSXO��FD�FRPSLODWRUXO�V��úWLHFXP�V�� WUDQVPLW�� YDULDELOHOH� OD� DSHOXO� HL� ��� SUHFXP�úL� FODVD�GH� VWRFDUH�� ÌQ� FD]XO� vQ� FDUHFODVD� GH� VWRFDUH� QX� HVWH� SUHFL]DW��� HD� HVWH� FRQVLGHUDW�� H[WHUQ� LPSOLFLW�� $FHVW� OXFUXvQVHDPQ��F��GHILQL LD�IXQF LHL�SUHFXP�úL�FRUSXO�HL�SRW�DS�UHD�vQ�RULFDUH�GLQ�ILúLHUHOH�VXUV�D�DSOLFD LHL�� LQFOXVLY� vQ�FHO� FXUHQW��'DF�� VH�RPLWH� úL� VSHFLILFDUHD� WLSXOXL�� DWXQFL� LPSOLFLWHVWH�LQW�

6FRSXO� vQ� FD]XO� XQHL� DOX]LL� OD� IXQF LH� HVWH� WLSLF� FD� OD� RULFDUH� DOW�� YDULDELO��DSHOXULOH�vQ�EORF�DX�VFRS�EORF��UHVWXO�DX�VFRSXO�ILúLHU�

Conversiile automate de argument ÌQ� DEVHQ D� SURWRWLSXOXL� �� DOW�PRWLY� SHQWUX� DOX]LLOH� OD� IXQF LL� �� WRDWH� DUJXPHQWHOH

PDL�PLFL�FD�LQW�VXQW�FRQYHUWLWH�OD�LQW��LDU�WRDWH�DUJXPHQWHOH�IORDW�VXQW�FRQYHUWLWH�OD�GRXEOH�'HFL�SRDWH�IL�R�VXUV��ELQH�DVFXQV��GH�HURUL�

3RLQWHUL�OD�IXQF LL66XQW� LQVWUXPHQWH� SXWHUQLFH� SHQWUX� FD� QH� SHUPLW� R� PRGDOLWDWH� HOHJDQW�� GH� DSHO

SHQWUX�GLIHULWH�IXQF LL��ED]kQGX�VH�SH�GDWHOH�GH�LQWUDUH�ÌQDLQWH�GH�D�GLVFXWD�SRLQWHULL�OD�IXQF LH��WUHEXLH�YRUELW�SX LQ�GHVSUH�PRGXO�vQ�FDUH

FRPSLODWRUXO�LQWHUSUHWHD]��GHFODUD LLOH�IXQF LLORU�SUHFXP�úL�DSHOXULOH�DFHVWRUD�6LQWD[D�SHQWUX�GHFODUDUHD� úL� LQYRFDUHD� IXQF LLORU� HVWH� IRDUWH� DSURSLDW�� GH� VLQWD[D

IRORVLW�� vQ� FD]XO� WDEORXULORU�� 'H� H[�� vQ� GHFODUD LD� LQW� Y>�@�� Y� HVWH� SRLQWHU� F�WUH� SULPXO

70

Page 72: Introducere in c++

Introducere in programare

I��

([��

«

���

HOHPHQW�DO�WDEORXOXL��$WXQFL�FkQG�VLPEROXO�HVWH�XUPDW�GH�XQ�QXPH�QXP�U�vQWUH�SDUDQWH]H�SRLQWHUXO� HVWH� LQGH[DW� FX� DFHO� QXP�U� DSRL� UHIHULW�� 8Q� SURFHV� VLPLODU� DSDUH� úL� vQ� FD]XOIXQF LLORU�

)LH�GHFODUD LD�LQW�I�����vQ�DFHVW�FD]�I�HVWH�XQ�SRLQWHU�OD�IXQF LH��&kQG�HO�HVWH�XUPDWGH�R�OLVW��GH�DUJXPHQWH�LQFOXV�� vQWUH�SDUDQWH]H��HO�HVWH�UHIHULW� ��DOW�PRG�GH�D�VSXQH�F��RIXQF LH�HVWH�DSHODW����'H�DVHPHQHD��GDF��LQW�Y>�@�VH�UHIHU��OD�XQ�SRLQWHU�FRQVWDQW�OD�IHO�úLvQ�FD]XO�LQW�I�����I�HVWH�WRW�XQ�SRLQWHU�FRQVWDQW��vQV��HVWH�LOHJDO�V��VH�DVLJQH]H�R�YDORDUH�OXL

3HQWUX� D� GHFODUD� R� YDULDELO�� SRLQWHU� F�WUH� R� IXQF LH�� QXPHOH� SRLQWHUXOXL� WUHEXLHSUHFHGDW�GH� ��GH�H[HPSOX�LQW�� SI�����HVWH�XQ�SRLQWHU�F�WUH�R�IXQF LH�FH�vQWRDUFH�XQ�vQWUHJ�'H�IDSW��VH�GHFODU��R�YDULDELO��GH�WLS�SRLQWHU��FDUH�HVWH�FDSDELO��V��UH LQ��XQ�SRLQWHU�F�WUH�RIXQF LH�FH�vQWRDUFH�XQ�vQWUHJ�

3DUDQWH]HOH�VXQW�QHFHVDUH��GHRDUHFH�vQ�OLSVD�ORU�SI��DU�IL�FRQVLGHUDW��R�IXQF LH�FDUHvQWRDUFH�XQ�SRLQWHU�OD�vQWUHJ�

$VLJQDUHD�XQHL�YDORUL�SHQWUX�SRLQWHULL�OD�IXQF LL�VH�UHDOL]HD]��DVWIHO��ILH�IXQF LD�LQWIDWBER\�� �� úL� SRLQWHUXO� OD� R� IXQF LH� FH� vQWRDUFH� XQ� vQWUHJ� LQW� � SI�� �� ��� $VLJQDUHD� VHUHOL]HD]��GLUHFW�SI IDWBER\��'HYLQ�DVWIHO�FODUH�XUP�WRDUHOH�HURUL�

�� SI I�����XQGH�SI�HVWH�SRLQWHU�OD�IXQF LH�LDU�I�����HVWH�XQ�vQWUHJ�� SI I��� �� QX� VH� SRDWH� RE LQH� DGUHVD� UH]XOWDWXOXL� XQHL� IXQF LL

GHRDUHFH�WUDQVIHUXO�VH�IDFH�SULQ�VWLY�

�� SI� �I��XQGH�SI�HVWH�SRLQWHU�OD�LQW�LDU�I��HVWH�SRLQWHU�OD�SRLQWHU

&RQYHQ LL�GH�WLS�vQ�FD]XO�GH�vQWRDUFHUH�SDUDPHWULL6

1X�WUHEXLH�XLWDW�F��WLSXO�GH�GDWH�vQWRUV�GH�IXQF LH�WUHEXLH�V��ILH�vQ�FRLQFLGHQ ��FXWLSXO�GH�SRLQWHU�OD�IXQF LH�GHFODUDW�

'H�H[��ILH�GHFODUD LLOH�LQW�LI�������LI�������� SLI�����IORDW�II�������� SII�����FKDU�FI�������� SFI�����

úL�VHFYHQ D�GH�DVLJQ�UL��SLI� �LI������OHJDO��WLSXULOH�VXQW�LGHQWLFHSFI FI�������LOHJDO��QHSRWULYLUH�GH�WLSSII LI��������LOHJDO��QHSRWULYLUH�GH�WLSSFI FI�������OHJDOLI� LI���������LOHJDO��VH�vQFHDUF��DVLJQDUHD�XQHL�QRL�YDORUL�OD�R�FRQVWDQW�

$SHOXO�XQHL�IXQF LL�IRORVLQG�pointeri

LQW�I�����LQW�� SI�����LQW�UH]�

SI I������DP�DVLJQDW�SI�OD�IXQF LH

UH] �� SI��D�������DP�DSHODW�IXQF LD�I��FX�D�FD�SDUDPHWUX

71

Page 73: Introducere in c++

Introducere in programare

^«`

^

`

Obs:�� SI��D��HVWH�(&+,9$/(17�FX�� SI���6LQWD[D�$16,�SHUPLWH�FD�vQ�ORF�GH� SI��D��V��IRORVHVF�SI�D���3HQWUX�SRUWDELOLWDWHD�XQXL�SURJUDP�HVWH�LQGLFDW�V��VH�IRORVHDVF�SULPD�IRUP��

Întoarcerea ca rezultat de SRLQWHU�OD�IXQF LL62�IXQF LH� SRDWH� vQWRDUFH�XQ�SRLQWHU� OD� DOW�� IXQF LH�� GDU� WUHEXLH� DYXW� JULM�� GHVSUH

PRGXO�vQ�FDUH�VH�YD�IDFH�GHFODUDUHD�DFHVWHL�IXQF LL��'H�H[HPSOX�,QW�� I�IORDW�[��IORDW�\�����sau LQW�� I�[�\�����IORDW�[�\�

GHFODU��R�IXQF LH�FH�DUH�YDULDELOH�GH�LQWUDUH�[�\�úL�FDUH�vQWRDUFH�XQ�SRLQWHU�F�WUH�R�IXQF LHFH�vQWRDUFH�XQ�vQWUHJ�

6��OX�P�XQ�H[HPSOX�PDL�FRQFUHW�GH�IRORVLUH�D�DFHVWRU�IDFLOLW� L�úL�DQXPH�R�IXQF LHGH�VRUWDUH��RSWLPDO��GLQ�SXQFW�GH�YHGHUH�DO�YLWH]HL�

6�� DQDOL]�P� SX LQ� SUREOHPD�� ([LVW�� PDL� PXO L� DOJRULWPL� GH� VRUWDUH�� ILHFDUH� FXDYDQWDMH�úL�GH]DYDQWDMH�4XLFNVRUW

: IRDUWH�UDSLG�SHQWUX�GDWH�DOHDWRU�DUDQMDWH: LQHILFLHQW�GDF��GDWHOH�VXQW�SDU LDO�VRUWDWH�SH�JUXSXUL

0HUJHVRUW: XQXO�GLQWUH�FHL�PDL�HILFLHQ L��GDU�FHUH�PHPRULH

+HDSVRUW: FHO�PDL� LQGLFDW� SHQWUX� DULL�PDVLYH�GH�GDWH�� GHRDUHFH�QHFHVLW�� FHD�PDL�SX LQ�

PHPRULH3S�� F�� vQ� XUPD�XQRU� DQDOL]H� SXWHP�GHFLGH� FDUH� GLQWUH� FHL� WUHL� DOJRULWPL� YRU� IL� XWLOL]D L�3RDWH�IL�VFULV��XUP�WRDUHD�IXQF LH�

9RLG�� P\BVRUW��IORDW�LQBGDWD����

H[WHUQ�YRLG�TXLFNBVRUW������PHUJHBVRUW�������KHDSBVRUW��������KHDSBVRUW�SRDWH�OLSVL��� VH� UHDOL]HD]�� DQDOL]D� GDWHORU� �� 6�� SUHVXSXQHP� F�� GHFL]LD� YD� IL��GHSXV��vQWU�XQ�IODJVZLWFK���IODJ��

FDVH����UHWXUQ�TXLFNBVRUW�FDVH����UHWXUQ�PHUJHBVRUW�FDVH����UHWXUQ�KHDSBVRUW�GHIDXOW��SXWV�´�(UURU�XQNQRZQ�´��

H[LW����EUHDN�

OD�DSHO���P\BVRUW��OLVW�����OLVW���

72

Page 74: Introducere in c++

Introducere in programare

^

`

`

Recursivitatea 2�IXQF LH�UHFXUVLY��HVWH�XQD�FDUH�VH�DXWRDSHOHD]���'H�H[��

^VWDWLF�FRQW ��

FRQW���

`YRLG�PDLQ��YRLG�^

`

YRLG�UHFXUV��YRLG�

SULQWI�³�G�?Q�³��FRQW��

UHFXU����

UHFXU���

YRLG�UHFXU��YRLG�^ /D� ILHFDUH

VWDWLF�FRQW �� DSHO� GH� IXQF LH� vQ

LI��FRQW�!�����UHWXUQ� VWLY�� VXQW� VDOYD L

HOVH R� VHULH� GH

^ SDUDPHWULL�

SULQWI�³��G�?Q�³��FRQW�� 3URJUDPXO�GH�PDL

FRQW��� VXV� YD� DXWRDSHOD

UHFXU���� IXQF LD� OD∞ ������������ GDU

` VWLYD� 3&� HVWHILQLW��� DYkQG� FDUH]XOWDW� R� EORFDUH

JHQHUDO���'H�DFHHD�RULFH�IXQF LH�UHFXUVLY��WUHEXLH�V��DLE��R�FRQGL LH��QXPLW��FD]�GH�ED]��FDUH�V��SHUPLW��VWRSDUHD�DFHVWXL�SURFHV��8Q�H[HPSOX�VLPSOX�DU�IL�vQ�FD]XO�QRVWUX�OLPLWDUHDFRQWRUXOXL��'HFL�ÌQWUHE�UL�

��&H�VH�vQW�PSO��GDF��úWHUJHP�HOVH�úL�FHOH�GRX��DFRODGH�GH�GXS��HO�"��&H�VH�vQW�PSO��GDF��FRQW�QX�H�GHFODUDW�VWDWLF�"

)RORVLUHD� YDULDELOHORU� IL[H� HVWHR� FDOH� GH� D� FRQWURODUHFXUVLYLWDWHD� �� GXS�� FXP� DPY�]XW� DQWHULRU�� ÌQ� H[HPSOXO� GH

PDL� MRV� VH� FDOFXOHD]�� ∑ L �L=�

L∈1��UHFXUVLY�,QW�VXP�LQW�Q�

LI��Q� ���UHWXUQ�Q�HOVH�UHWXUQ��Q�VXP��Q�����

3W�� Q �� V�� YHGHP� FXP� VHH[HFXW��SDV�FX�SDV

Q

73

Page 75: Introducere in c++

Introducere in programare

«`

(Clase de stocare) Storage classes

0DMRULWDWHD� DSOLFD LLORU� PDUL� VXQW� VFULVH� GH� HFKLSH� GH� SURJUDPDWRUL�� 'XS�

SURLHFWDUHD� �VFKL DUHD�� DSOLFD LHL� vQ� FRPXQ� ILHFDUH� SURJUDPDWRU� SOHDF�� úL� UHDOL]HD]�� REXFDW��L]RODW��GH�SURJUDP��,]RODUHD�VH�UHIHU��OD�IDSWXO�F��OD�UHDOL]DUHD�DFHOXL�SURJUDP�QXVH� LQH� FRQW� GH� FHLODO L�� FL� OD� � IXQF LLOH� FDUH� WUHEXLH� V�� OH� vQGHSOLQHDVF�� SURJUDPXO�� /DVIkUúLW�DFHVWH�SURJUDPH�VXQW�XQLWH��OLQNHG��vPSUHXQ��SHQWUX�D�IRUPD�DSOLFD LD�GRULW��

3HQWUX� FD� vQ� DFHDVW�� ID]�� V�� QX� DSDU�� SUREOHPH� PDMRUH� WUHEXLH� V�� H[LVWH� XQPHFDQLVP�FH�DVLJXU��FD�YDULDELOHOH�GHFODUDWH�GH�XQ�SURJUDPDWRU�V��QX�LQWUH�vQ�FRQIOLFW�FXYDULDELOHOH�FX� �DFHODúL�QXPH�IRORVLWH�GH�XQ�DOW�SURJUDPDWRU� �GH�H[��YDULDELOHOH�GH�FRQWRUDOH�XQHL�EXFOH��L�M�N���3H�GH�DOW��SDUWH�HVWH�QHFHVDU�FD�DQXPLWH�GDWH�V��ILH�FRPXQH��YL]LELOHúL�VDX�PRGLILFDELOH�GH�F�WUH�PDL�PXOWH�VXUVH�FH�SURYLQ�GH�OD�DXWRUL�GLIHUL L��'HFL�WUHEXLH�V�H[LVWH� XQ�PHFDQLVP� FDUH� V�� DVLJXUH� F�� QXPHOH� YDULDELOHL� GHFODUDWH� vQ� GLYHUVH� ILúLHUH� VHUHIHU��OD�DFHOHDúL�ORFD LL��PHPRULH�ÌQ�&�VH�GHILQHúWH

: &DQG�WUHEXLH�V��ILH�R�YDULDELO��FRPXQ��VDX�vPSDU LW���VKDUHG�: ÌQ�FH�SDUWH�GH�FRG�HVWH�YDODELO�DFHVW� OXFUX�SULQ�DWULEXLUHD�XQXL�VFRS��VFRSH��XQHL

GHFODUD LL³6FRSH´� HVWH� XQ� WHUPHQ� WHKQLF� FDUH� GHQRW�� UHJLXQHD� WH[WXOXL� VXUVHL� &� vQ� FDUH� QXPHOH�GHFODUDW��DO�XQHL�YDULDELOH�HVWH�DFWLY�H[LVW���$OW�� SURSULHWDWH� D� YDULDELOHORU� HVWH� GXUDWD� FDUH� VH� UHIHU�� OD� �GHVFULH�� GXUDWD� GH� YLD �� vQPHPRULH�D�XQHL�YDULDELOH�9DULDELOHOH�FX�GXUDW�� IL[��VXQW�JDUDQWDWH�F��úL� UH LQ�GDWHOH�FKLDU�GXS�� FH�úL�DX� vQGHSOLQLWVFRSXO�ÌQ�VFKLPE�vQ�FD]XO�YDULDELOHORU�FX�GXUDW��DXWRPDW��DFHVW�OXFUX�QX�PDL�SRDWH�IL�JDUDQWDW�

'HILQL LH�3ULQ�6 FODV��6 GH�6 VWRFDUH�6 �storage FODVV��6 VH�6 vQ HOHJH�6 VFRSXO�6 úL�6 GXUDWD�6 XQHL6

variabile.

)LH�XUP�WRUXO�VHJPHQW�GH�SURJUDP�YRLG�I��YRLG�^LQW�M�VWDWLF�LQW�YHFW>@ ^�������`�

6H� REVHUY�� F�� H[LVW�� GRX�� YDULDELOH�� M� úL� YHFW�� (OH� DX� XQ� VFRS� GH� EORF� GHRDUHFH� VXQWGHFODUDWH� vQ� LQWHULRUXO� DFHVWXLD�� 9DULDELOHOH� FX� VFRS� GH� EORF� VXQW� GH� RELFHL� QXPLWHYDULDELOH�ORFDOH��,PSOLFLW��YDULDELOHOH�ORFDOH�DX�GXUDWD�DXWRPDW���ÌQ�FD]XO�OXL�M��HO�YD�DYHDDWULEXLW��R�QRX��DGUHV��GH�PHPRULH� OD�ILHFDUH�H[HFX LH�D� UHVSHFWLYXOXL�EORF�� ÌQ�FD]XO� OXLYHFW�GDWRULW��IRORVLULL�FXYkQWXOXL�FKHLH�VWDWLF�DWULEXLUHD�XQHL�DGUHVH�GH�PHPRULH�VH�IDFH�RVLQJXU��GDW��úL�VH�S�VWUHD]��SH�WRDW��GXUDWD�H[HFX LHL�SURJUDPXOXL�

74

Page 76: Introducere in c++

Introducere in programare

^

`

^

`

([�

^ ^

`

'XUDWD�IL[��ID ��GH�FHD�DXWRPDW�'XS��FXP�R�SUHFL]HD]��úL�QXPHOH��R�YDULDELO��IL[��HVWH�XQD�VWD LRQDU���vQ�WLPS�FH

SHQWUX�R�YDULDELO��DXWRPDWLF���]RQD�GH�VWRFDUH�vQ�PHPRULH�HVWH�DOHDV��DXWRPDW�vQ�WLPSXOH[HFX LHL�SURJUDPXOXL��'HFL�R�YDULDELO�� IL[��DUH�PHPRULH�DORFDW���PHPRULD� OD� vQFHSHUHDH[HFX LHL�SURJUDPXOXL�úL�úL�S�VWUHD]��DFHDVW��DORFDUH�SH�WRDW��GXUDWD�H[HFX LHL�DFHVWXLD�

9DULDELOD�DXWRPDWLF��VH�UHIHU�� OD�]RQD�GH�PHPRULH�DWDúDW��HL�GRDU�DWkWD� WLPS�FkWFRGXO� vQ�FDUH�úL�DUH�VFRSXO�HVWH�H[HFXWDW��2�GDW�� vQFKHLDW�VFRSXO��]RQD�XQGH�HUD� IL[DW�� �FRPSLODWRUXO�DVLJXU��HOLEHUDUHD�]RQHL�GH�PHPRULH�RFXSDW��GH�DFHDVWD�

9DULDELOHOH� ORFDOH� �FX� VFRSXO� OLPLWDW� OD� QLYHO� GH� EORF� �� VXQW� LPSOLFLW� DXWRPDWLFH�(OH�SRW�IL�IRU DWH�V��OXFUH]H�VWDWLF�SULQ�IRORVLUHD�FXYkQWXOXL�FKHLH�VWDWLF�

,QL LDOL]DUHD�YDULDELOHORU6'LIHUHQ D�GLQWUH�YDULDELOHOH�IL[H�úL�FHOH�DXWRPDWH�HVWH�LPSRUWDQW��vQ�VSHFLDO�SHQWUX

YDULDELOHOH�QHLQL LDOL]DWH��ÌQ�FD]XO�FHORU�DXWRPDWH��HOH�YRU�IL�UHLQL LDOL]DWH�OD�ILHFDUH�WUHFHUHSULQ�]RQD�ORU�GH�H[LVWHQ ��

YRLG�PF�YRLG�

LQW�M ��VWDWLF�LQW�N ��M���N���SULQWI�³M �G�?W�N �G�?Q´�M�N��

YRLG�PDLQ�YRLG�

������������������������������������PF��� M � N �PF��� M � N �PF��� M � N �

$OW��GLIHUHQ ��DSDUH�OD�LQL LDOL]DUHD�LPSOLFLW��D�YDULDELOHORU�: YDULDELOHOH�DXWRPDWH�QX�VXQW�LQL LDOL]DWH: YDULDELOHOH�VWDWLFH�VXQW�LPSOLFLW�LQL LDOL]DWH�FX��

YRLG�PF��YRLG� YRLG�PDLQ�YRLG�

LQW�M� PF���VWDWLF�LQW�N� PF���M���N��� PF���SULQWI�³M �G�?W�N �G�?Q´�M�N�� `

&X�UH]XOWDWXO� �M ������� N �M ������� N �M ������� N �

$OW�� GLIHUHQ �� vQWUH� YDULDELOHOH� FX� GXUDW�� IL[�� úL� FHOH� DXWRPDWH� VH� UHIHU�� OD� WLSXULOH� GHH[SUHVLL�FH�SRW�IL�IRORVLWH�vQ�XWLOL]DUH�

75

Page 77: Introducere in c++

Introducere in programare

^

^

`HOVH

``

'H�H[��XUP�WRDUHOH�GHFODUD LL�VXQW�OHJDOH�LQW�M ��N ��LQW�P M�N�IORDW�[ ����� ����

vQ�WLPS�FH�XUP�WRDUHOH�QX��GHRDUHFH�M�úL�N�DSDU�vQ�H[SUHVLL�vQDLQWH�GH�D�IL�GHFODUDWH�LQW�P M�N�LQW�M ��N ��

5HJXOLOH� GH� LQL LDOL]DUH� D� YDULDELOHORU� FX� GXUDW�� IL[�� VXQW� IRDUWH� VWULFWH�� ,QL LDOL]DUHD� VHSRDWH�IDFH�QXPDL�FX�R�H[SUHVLH�FRQVWDQW���GHFL�18�SRDWH�FRQ LQH�QXPH�GH�YDULDELO���

)RORVLUHD�YDULDELOHORU�FX�GXUDW��IL[�8Q�H[HPSOX�FODVLF�GH�IRORVLUH�D�DFHVWRUD�HVWH�FRQWRUL]DUHD�QXP�UXOXL�GH�H[HFX LL

DOH�XQHL�IXQF LL�SHQWUX�D�L�SXWHD�PRGLILFD�H[HFX LD�OD�LQWHUYDOH�UHJXODWH�'H�H[��V��SUHVXSXQHP�F��DYHP�XQ�SURJUDP�FDUH�IRUPDWHD]��XQ�WH[W�FLWLW�GLQWU�XQ

ILúLHU� úL� VFULH� UH]XOWDWXO� vQ� DOW� ILúLHU��8QD�GLQ� IXQF LL� HVWH� HVWH� SULQWBKHDGHU� ��� DSHODW�� ODvQFHSXWXO� ILHF�UXL� SURJUDP� QRX�� (YHQWXDO� DFHDVWD� SRDWH� IL� GLIHULW� IXQF LH� GHSDULWDWHD�LPSDULWDWHD�QXP�UXOXL�GH�SDJLQL�

�GHILQH�2''����GHILQH�(9(1��SULQWBKHDGHU��FKDU �FKRSBWLWOH�

VWDWLF�FKDU�SDJHBW\SH� 2''�LI��SDJHBW\SH 2''�

SULQWI�³?W?W?W?W��V?Q?Q´�FKRSBWLWOH��SDJHBW\SH (9(1�

^SULQWI�³�V?Q?Q´�FKRSBWLWOH��SDJHBW\SH 2''�

“Scopul” unei variabile (Scope) ÌQ�FDGUXO�SURLHFW�ULL�XQXL�SURJUDP�WUHEXLH� LQXW�FRQW�GH�IDSWXO�F��H[LVW����WLSXUL�GH

UHJLXQL�ILHFDUH�FX�XQ�VFRS�ELQH�GHILQLW�� vQ�FDUH�VH�SRDWH�DFFHVD�R�YDULDELO��SULQ�QXPH�úLDQXPH��SURJUDP��IXQF LH��EORF��ILúLHU�

La nivel de program (program scope)�vQVHDPQ��F��YDULDELOD�HVWH�DFWLY��vQWUH�GLIHULWHOHILúLHUH�VXUV��FH�FRUHVSXQG�SURJUDPXOXL�H[HFXWDELO��9DULDELOHOH�GH�DFHVW�WLS�VXQW�FXQRVFXWHGH�RELFHL�VXE�QXPHOH�GH�YDULDELOH�JOREDOH�

/D�QLYHO�GH�ILúLHU��ILOH�scope)�VH�UHIHU��OD�IDSWXO�F��UHVSHFWLYD�YDULDELO��HVWH�DFWLY��GH�ODSXQFWXO�GH�GHFODUD LL�SkQ��OD�VIkUúLWXO�ILúLHUXOXL�VXUV��FH�R�FRQ LQH�

/D�QLYHO�GH�IXQF LH��function scope) YDULDELOD�HVWH�DFWLY��GRDU�vQ�FDGUXO�IXQF LHL�

76

Page 78: Introducere in c++

Introducere in programare

([��

«

^

/D�6 QLYHO�6 GH�6 EORF�6 GH�6 LQVWUXF LXQL�6 �block scope)� YDULDELOD� H� DFWLY�� GH� OD� SXQFWXO� GHGHFODUD LH�SkQ��OD�GHOLPLWDWRUXO�GH�VIkUúLW�GH�EORF.

ÌQ�JHQHUDO�VFRSXO�XQHL�YDULDELOH�HVWH�GHWHUPLQDW�GH�ORFXO�vQ�FDUH�VH�UHDOL]HD]��GHFODUDUHDDFHVWHLD�

3URJUDP 6FRSH

)LOH 6FRSH

)XQFWLRQ 6FRSH

%ORFN 6FRSH

LQW�,� �������� �3URJUDP�6FRSH� �VWDWLF�LQW�M����� �)LOH�6FRSH� �IXQF�LQW�N����� �3URJUDP��6FRSH� �^LQW�P� ��������� �%ORFN�6FRSH� �VWDUW� ��������� �)XQFWLRQ�6FRSH� �

$FHDVW��LHUDUKL]DUH�SHUPLWH�FD�vQ�GRX��IXQF LL�GLIHULWH�V��DYHP�YDULDELOH�FX�DFHODúL�QXPHVDX�GH�H[��LQW�M ���PDLQ��

LQW�M�IRU��M ��M�����M�

SULQWI�³M �G?Q´�M�� OXFUHD]��QRUPDO�GDU�GSGY�DO�DOWXL` ILúLHU�VXUV��M ���

10.5. Variabile globale (program sau file scope)

3kQ�� DFXP� V�D� GLVFXWDW� QXPDL� GHVSUH� YDULDELOH� ORFDOH�� ([LVW�� WRWXúL� FD]XUL� FkQG� VHGRUHúWH� FD� R� YDORDUH� GHSR]LWDW�� vQWU�R� YDULDELO�� V�� ILH� YL]LELO�� VDX� PRGLILFDELO�� GLQLQWHULRUXO� RULF�UHL� IXQF LL�� 3HQWUX� DFHDVWD� HVWH� VXILFLHQW� FD� UHVSHFWLYHOH� YDULDELOH� V�� ILHGHFODUDWH�vQ�DIDUD�FRUSXOXL�RULF�UHL�IXQF LL�úL�HOH�YRU�F�S�WD�DVWIHO�XQ�FDUDFWHU�JOREDO��$FHVWWLS�GH�YDULDELOH�VXQW�DXWRPDW�LQL LDOL]DWH�FX�YDORDUHD�]HUR�

ÌQ� JHQHUDO� vQ� SURJUDPDUHD� VWUXFWXUDW�� VH� UHFRPDQG�� HYLWDUHD� H[FHVXOXL� GH� YDULDELOHJOREDOH��vQWUXFkW�QX�VXQW�QHDS�UDW�QHFHVDUH�GHFkW�HYHQWXDO�FD�V��VFULHP�PDL�UHSHGH�úL�XúRUXQ� FRG�� GDU� DFHVW� FRG� QX� HVWH� QHDS�UDW� FHO� PDL� EXQ� VDX� FHO� PDL� VWDELO�� �0DL� MRV� YRPSUH]HQWD�XQ�H[HPSOX�VLPSOX�UHODWLY�OD�IRORVLUHD�YDULDELOHORU�JOREDOH�

77

Page 79: Introducere in c++

Introducere in programare

^

`

�LQFOXGH��VWGLR�K!

�LQFOXGH��FRQLR�K!

LQW�JOREDOBY��

LQW�RULBGRL�LQW�[��

YRLG�PDLQ�YRLG�

LQW�ORFDOBY��

FOUVFU���

SULQWI�³9DULDELOD�JOREDOD�DUH�YDORDUHD��G?Q´��JOREDOBY���

SULQWI�³9DULDELOD�ORFDOD�DUH�YDORDUHD��G?Q´��JOREDOBY���

ORFDOBY� RULBGRL�ORFDOBY���

SULQWI�³9DULDELOD�JOREDOD�DUH�YDORDUHD��G?Q´��JOREDOBY���

SULQWI�³9DULDELOD�ORFDOD�DUH�YDORDUHD��G?Q´��JOREDOBY���

LQW�RULBGRL�LQW�[�

��������^

���������LQW�UHWYDO�

���������UHWYDO� �[� ���

�JOREDOBY���

�UHWXUQ�UHWYDO�

��������`

Tematica claselor de stocare ANSI ORFXO XQGH ÌQ DIDUD vQ LQWHULRUXO DUJXPHQWHVH GHFODU� IXQF LHL IXQF LHL IXQF LH6SHFLILFDWRUGH FODV�DXWR 1(3(50,6 6FRS�EORFN 6FRS� EORFVDX UHJLVWHU 'XUDWD �DXWRPDWLF 'XUDWD�DXWRPDWLF6WDWLF 6FRS�ILúLHU 6FRS� EORF 1(3(50,6

'XUDWD�IL[� 'XUDWD� IL[�

([WHUQ 6FRS� SURJUDP 6FRS� EORF 1(3(50,6'XUDWD� IL[� 'XUDWD� IL[�

1LFL XQ 6FRS� SURJUDP 6FRS� EORF 6FRS� EORFVSHFLILFDWRU 'XUDWD� IL[� 'XUDWD� GLQDPLF� 'XUDWD� DXWRPDWLF�SUH]HQW

10.6. Macrouri

ÌQ�PRG�QRUPDO�FkQG�R�IXQF LH�HVWH�DSHODW��� VH�FUHHD]�� VHWXO�GH�YDULDELOH� ORFDOH��DSRLDFHVWHD� VH� LQL LDOL]HD]��� $FHVW� OXFUX� GXUHD]��� vQ� XQHOH� FD]XUL�� PDL� PXOW� GHFkW� H[HFX LDFRUSXOXL�IXQF LHL��$SDUH�vQWUHEDUHD�FXP�SRDWH�HYLWD�SLHUGHUHD�GH�YLWH]��úL�WRWXúL�V��UH]XOWHXQ�SURJUDP�VWUXFWXUDW�

78

Page 80: Introducere in c++

Introducere in programare

VDX

/LPEDMXO� &� HVWH� SUHY�]XW� FX� PDFURXUL� �PDFURGHILQL LL�� FDUH� SHUPLW� LPSOHPHQWDUHDUDSLG��GH�RSHUD LL�VLPSOH�I�U��GH]DYDQWDMHOH�GH�WLPS�GLQ�FD]XO�IXQF LLORU�

'DF�� VH� GRUHúWH� GHFODUDUHD� XQHL� YDORUL� FRQVWDQWH� VH� SRDWH� IRORVL� GLUHFWLYDSUHSURFHVRU��GHILQH��FD�PDL�MRV�

�GHILQH�SL�������

/D�vQWkOQLUHD�UHVSHFWLYHL�GLUHFWLYH�SUHSURFHVRUXO�YD�vQORFXL�ILHFDUH�PHQ LRQDUH�vQ�FRG�DOXL�SL�FX�vQV�úL�YDORDUHD���������6LPLODU�VH�YD�vQWkPSOD�úL�FX�FRUSXO�XQXL�PDFUR�

2EVHUYD LH��R�YDULDELO��SRDWH� IL�GHFODUDW�� IL� GHFODUDW�� FD� ILLQG� VWDWLF��� DGLF�� QX�úL� YDPRGLILFD�YDORDUHD�SH�SDUFXUVXO�H[HFX LH�FX� DMXWRUXO� FXYkQWXOXL� FKHLH� VWDWLF�SXV� vQDLQWHDVSHFLILFDWRUXOXL�GH�WLS�

)LH�H[HPSOHOH�GH�PDL�MRV�XQGH�VXQW�SUH]HQWDWH�GRX��PDFURXUL��XQXO�FDOFXOHD]��[�� LDUDOWXO�UHDOL]HD]��PD[LPXP�GLQWUH�GRX��QXPHUH�

�GHILQH�P\BPD[�[�\������[�!�\��"�[���\���

�GHILQH�P\BVTU�[�����[� �[��

'DF��VH�YRU�IRORVL�DFHVWH�PDFURXUL��vQ�ORFXO�DSHOXOXL�XQHL�IXQF LL��VH�YD�LQVHUD�GLUHFW�FRGXOFRUHVSXQ]�WRU�LPSOHPHQW�ULL�GHILQL LLORU�GLQ�GUHDSWD�

7RWXúL� IRORVLUHD� PDFURXULORU� DVFXQGH� XQ� PDUH� SHULFRO� SHQWUX� FLQHYD� FDUH� QX� DUHVXILFLHQW��H[SHULHQ ���'DF��vQ�FD]XO�XQHL�IXQF LL�VH�UHDOL]HD]��vQWkL�HYDOXDUHD�SDUDPHWULORU�OD� DSHOXO� XQXL�PDFUR� DFHVW� OXFUX� QX� VH�PDL� IDFH�� $SDU� SUREOHPH� GH� RUGLQH� D� H[HFX LHLRSHUD LLORU�FD�vQ�H[HPSOHOH�GH�PDL�MRV�

UH] P\BVTU�[��������HYDOXDUHD�HVWH�UH] [�� [���vQ�ORF�GH

���[��� �[���

UH] ]�P\BVTU�[�����HYDOXDUHD�HVWH�UH]� ��]�[� [�vQ�ORF�GH�]��[ [�

'LQ�DFHVW�PRWLY�OD�FRPSLODWRDUHOH�GH�223�V�D� LQWURGXV�QR LXQHD�GH� IXQF LH�³LQ�OLQH´FDUH�HOLPLQ��GH]DYDQWDMHOH�PDFURXULORU�GDU�VH�FRPSRUW��FD�DFHVWHD�

7UHEXLH�PHQ LRQDW�F��OD�GHSDQDUHD�SDV�FX�SDV�VH�SRDWH�LQWUD�vQ�LQWHULRUXO�XQXL�DSHO�GHPDFUR�FHHD�FH�IDFH�FD�HURULOH�GH�WLSXO�SUH]HQWDW�PDL�VXV�V��ILH�JUHX�GHSLVWDELOH�

10.7 Macrouri predefinite

10.7.1. ASSERT

)RORVLUHD�DFHVWHL�PDFURGHILQL LL�HVWH�LQGLFDW��GLQ�XUP�WRDUHOH�PRWLYH�

� FUHúWH�IRDUWH�PXOW�YLWH]D�GH�GHSDQDUH�D�XQXL�SURJUDP� SURJUDPDUHD�vQ�&�OD�RUD�DFWXDO��HVWH�UHDOL]DW��VXE�FRPSLODWRDUH�GH�&���FDUH�DFFHSW��úL

FRG�&�FODVLF��FRPSLODWRDUH�FDUH�R�DX�SUHGHILQLW��

79

Page 81: Introducere in c++

Introducere in programare

^

`

(VWH�XQ�PDFUR�FDUH�IXQF LRQHD]��H[DFW�FD�R�LQVWUXF LXQH�LI�GDU��VSUH�GHRVHELUHD�GHDFHDVWD�� vQ� PRPHQWXO� vQ� FDUH� FRQGL LD� GH� HYDOXDW� LD� YDORDUHD� ]HUR� EORFKHD]�� H[HFX LDSURJUDPXOXL� DSHOkQG� IXQF LD� DERUW�� /D� VWRSDUHD� H[HFX LHL� VH� WULPLWH� F�WUH� GLVSR]LWLYXOVWDQGDUG�GH� LHúLUH�XQ�PHVDM� VSHFLILF� FDUH�SUHFL]HD]�� QXPHOH� ILúLHUXOXL� VXUV�� úL� OLQLD� GLQFDGUXO�DFHVWXLD��FDUH�D�JHQHUDW�HURDUHD�

'DF�� YDORDUHD� HYDOXDW�� HVWH� GLIHULW�� GH� ]HUR� DVVHUW� QX� DUH� QLFL� R� LQIOXHQ �� DVXSUDH[HFX LHL�SURJUDPXOXL��3URWRWLSXO�HVWH�GHILQLW�vQ�ELEOLRWHFD�$66(57�+�úL�DUDW��FD�PDL�MRV�

YRLG�DVVHUW��LQW�WHVW��

'H�RELFHL�HVWH� IRORVLW�SHQWUX�D� WHVWD�GDF��R� vQFHUFDUH�GH�DORFDUH�GLQDPLF��D�XQHL�QRL]RQH�GH�PHPRULH�D� UHXúLW� VDX�QX��'XS�� FXP�DP�VSXV�HO� HVWH� IRORVLW� vQ�FDGUXO�GHSDQ�ULLXQHL�DSOLFD LL��2�GDW�� WHUPLQDW�� DFHDVW�� ID]�� VH�SRDWH� IDFH� FD�SUHSURFHVRUXO�&�V�� LJQRUHOLQLLOH� GLQ� FRGXO� VXUV�� FH� FRQ LQ� DSHOXUL� GH� DFHVW� WLS� SULQ� LQFOXGHUHD� vQ� FRGXO� VXUV�� DGLUHFWLYHL

�GHILQH�1'(%8*

vQDLQWHD� GLUHFWLYHL� FH� LQFOXGH� ELEOLRWHFD�$66(57�+��8Q� H[HPSOX� VFXUW� GH� IRORVLUH� HVWHSUH]HQWDW�PDL�MRV����DLFL�VH�YD�LQFOXGH��GHILQH�1'(%8*�LQFOXGH��DVVHUW�K!

�LQFOXGH��DOORF�K!

YRLG�PDLQ�YRLG�

FKDU� V�

V ��FKDU� �PDOORF��� VL]HRI�FKDU���

DVVHUW�V��

V 18//�

DVVHUW�V��

/D� H[HFX LD� DFHVWXL� SURJUDP� VH� YD� RE LQH� DFWLYDUHD� DVVHUW� GH�DELD� vQ� FH�D� GH�D� GRXDVLWXD LH�

10.7.2. Macrouri specializate în clasificarea caracterelor.

$X�IRVW�LQWURGXVH�SHQWUX�D�XúXUD�JkQGLUHD�úL�VFULHUHD�FRGXOXL�vQ�FD]XO�vQFDUH�VH�IDF�SUHOXFU�UL�SH�úLUXUL�GH�FDUDFWHUH��$FHVWH�SUHOXFU�UL� VXQW�GHVHRUL� vQWkOQLWH��6�DSUHIHUDW� LPSOHPHQWDUHD�FD�PDFURXUL�SHQWUX� D�RE LQH�R�YLWH]��PD[LP��GH�H[HFX LH��9RPSUH]HQWD�PDL� MRV� FHOH�PDL� IRORVLWH�PDFURXUL� SXVH� OD� GLVSR]L LH� GH� ELEOLRWHFD�&7<3(�+�7RDWH� DFHVWH� PDFURXUL� UHWXUQHD]�� R� YDORDUH� GLIHULW�� GH� ]HUR� vQ� FD]XO� vQ� FDUH� VLUXO� GHFDUDFWHUH�HYDOXDW�DUH�UHVSHFWLYD�FDUDFWHULVWLF��WHVWDW��GH�PDFURX�VDX�]HUR�vQ�FD]�FRQWUDU�

80

Page 82: Introducere in c++

Introducere in programare

LQW�LVORZHU�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�GLQ�FDWHJRULD�OLWHUHORU�PLFL���F∈>D«]@�

LQW�LVDOSKD�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�OLWHU���F∈>D«]@�VDX��F∈>$«=@�

LQW�LVXSSHU�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�OLWHU��PDUH�F∈>$«=@�LQW�LVSULQW�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�WLS�ULELO�F∈>�[��«�[�H@

LQW�LVDVFLL�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�RFWHWXO�ORZ�DO�OXL�F�H[WH�vQ�LQWHUYDOXO�>�«���@�

LQW�LVSXQFW�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�XQ�FDUDFWHU�GH�SXQFWXD LH�

LQW�LVVSDFH�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�VSD LX��WDE��&5��VDOW�OD�OLQLH�QRX����WDE�YHUWLFDO�VDXIRUPIHHG�DGLF��F∈>�[��«�[�G���[��@

LQW�LVGLJLW�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�HVWH�FLIU���F∈>�«�@�

LQW�LVJUDSK�LQW�F��

6LPLODU��FX�LVSULQW�QXPDL�F��VH�HOLPLQ��VSD LLOH�

LQW�LV[GLJLW�LQW�F��

7HVWHD]��GDF��FDUDFWHUXO�F�DSDU LQH�ED]HL�����F∈>�«�@�VDX�F∈>D«I@�VDX�F∈>$«)@�

10.7. 3.0DFURGHILQL LL�predefinite

8QXO�GLQ�XUP�WRDUHOH�VLPEROXUL�HVWH�SUHGHILQLW�� vQ� IXQF LH�GH�PRGHOXO�GH�PHPRULHDOHV�SHQWUX�FRPSLODUH�

BB&203$&7BB����BB0(',80BB�����BB+8*(BB

81

Page 83: Introducere in c++

Introducere in programare

BB/$5*(BB������BB60$//BB������BB7,1<BB

$OWH�PDFURGHILQL LL�LPSOLFLWH�

BBFSOXVSOXV����GHILQLW�GDF��VH�FRPSLOHD]��XQ�SURJUDP�&��BB'$7(BB�������GDWD�FRPSLO�ULL��FD��PPP�GG�\\\\�BB),/(BB�������QXPHOH�ILúLHUXOXL�VXUV��FXUHQW��DIHFWDW�GH��OLQH���FD�XQ�úLU�GH�FDUDFWHUHBB/,1(BB�������QXP�UXO�OLQLHL�FXUHQWH��DIHFWDW�GH��OLQH���FD�XQ�QXP�U�vQWUHJBB06'26BB������vQWRWGHDXQD�GHILQLW����BB29(5/$<BB�����GHILQLW�GDF��HVWH�DFWLYDW��RS LXQHD�GH�OXFUX�FX�UHDFRSHULUL��RS LXQHD��<DFWLY��BB3$6&$/BB������GHILQLW�GDF��RS LXQHD��S�HVWH�DFWLY�

BB67'&BB��������GHILQLW�GDF��VH�FHUH�FRPSDWLELOLWDWH�FX�VWDQGDUGXO�$16,��RS LXQHD��$��VDXGLQ�PHGLXO�LQWHJUDW�BB7,0(BB�������RUD�FXUHQW���KK�PP�VV�BB785%2&BB�YHUVLXQHD�FRPSLODWRUXOXL��FD�R�FRQVWDQW��KH[D]HFLPDO��

82

Page 84: Introducere in c++

Introducere in programare

CAPITOLUL 11

11. 3RLQWHUL�úL�DORFDUHD�GLQDPLF�

11.1. Introducere.

Primele PLQLVLVWHPH� FX� PLFURSURFHVRDUH� SH� �� EL L� DYHDX� ��� ko memorie RAM. $FHDVW�� GLPHQVLXQH� HUD� DOHDV�� GLQ� FDX]D� XQHL� OLPLW�UL� GDWRUDWH� QXP�UXOXL� Q� GH� EL Lnecesari pentru construirea adresei 2�� = 2�� * 2� = 2� ko = 64 NR�GHFL����EL L�GH�DGUHV��ÌQWUXFkW�SURFHVRUXO�OXFUD�SH���EL L�SHQWUX�D�DYHD�DFFHV�OD�R�GDW��RDUHFDUH�GLQ�PHPRULH�HOWUHEXLD� V�� IDF�� XQD� VDX� GRX�� RSHUD LL� �GHSLQ]kQG� GH� FRQVWUXF LD� LQWHUQ���� 6LVWHPHOH� FXSURFHVRDUH� SH� ��� EL L� �� ����� �9��� ������ �� DYHDX� XQ� � QRX� VHW� GH� LQVWUXF LXQL�� HUDX�PDLUDSLGH�úL�DFFHVDX�PDL�PXOW��PHPRULH�5$0��

3UREOHPD�HUD�F��GHMD�VH�FKHOWXLVH�IRDUWH�PXOW�WLPS�úL�EDQL�SHQWUX�D�GH]YROWD�SURJUDPHSHQWUX� VLVWHPHOH� DQWHULRDUH��0XOWH� DSOLFD LL�PDL� LPSRUWDQWH� WUHEXLDX� UHVFULVH� FX� XQ� SUH PLQLP��ÌQ�WRDWH�SURJUDPHOH�VH� LQXVH�FRQW�vQ�OXFUXO�FX�GDWHOH�GLQ�PHPRULH�GH�OLPLWDUHD�GH64 ko.

&HO�PDL�PLF�HIRUW�GH��SURJUDPDUH�VH�I�FHD�GDF��VH�SURLHFWD�XQ�VLVWHP�GH�RSHUDUH�FDUHV�� ³YDG�� ³� PHPRULD� 5$0� � FD� ILLQG� DOF�WXLW�� � GLQ� EXF� L� �� VHJPHQWH� �� GH� FkWH� ��� ko. $FHDVWD�D�IRVW�LGHD�GH�ED]��D�VLVWHPXOXL�GH�RSHUDUH�06�'26�XQGH�DGUHVD�GH�PHPRULH�DRULF�UHL�GDWH�HVWH�FRPSXV��GLQ�GRX��S�U L��

- DGUHVD�GH�VHJPHQW��DUDW��D�FkWD�ORFD LH�GLQ�FHOH���� ORFD LL�DOH�XQXL�VHJPHQW�HVWH�GDWDXWLO��

- adresa de RIIVHW�� DUDW�� vQ�DO� FkWHOHD� VHJPHQW� �� GLQ� FHOH�Q segmente din memorie, ne DIO�P��XQGH�

� [ ] .GLP NR5$0PHPQ =

��[ ]NR

ÌQ�SURJUDPDUHD�GH�QLYHO� vQDOW� �� OD� DFHD�GDW�� �� YH]L�&��3DVFDO��%DVLF��&RERO� ú�D�P�G��DFWXDO� QXPLWH� OLPEDMH� GH� QLYHO�PHGLX�� V�D� LQWURGXV� QR LXQHD� GH�pointer. Aceasta este o YDULDELO��FDUH� vQ� ORF�V�� UH LQ�� �R�GDW��XWLO��GLUHFW� vQ�FDOFXOH�� UH LQH�DGUHVD� vQ�PHPRULH� Dunei date utile.

��������1R LXQHD�GH�pointer

8QD�GLQ�FHOH�PDL�³SXWHUQLFH´�PRGDOLW� L�GH�DFFHV�OD�GDWH�VH�ED]HD]��SH�SRVLELOLWDWHD�GHa avea acces direct la adresa de memorie a unei date stocate acolo. 2�YDULDELO��FDUH�VWRFKHD]��DGUHVD�DOWHL�YDULDELOH�VH�QXPHúWH�pointer.

$YDQWDMXO�IRORVLULL�GH�F�WUH�SURJUDPDWRU�D�XQXL�DVHPHQHD�FRQFHSW�HVWH�DFHOD�F��vQFD]XO�PDQLSXO�ULL�XQRU�PDVLYH�GH�GDWH�GH�PDUL��FDUH�OD�UkQGXO�ORU�FRQ LQ�HOHPHQWH�GH�PDULGLPHQVLXQL� �YH]L� FD]XO� XQHL� VWUXFWXUL� �� QX� VH� YD� PDL� WUDQVIHUD� WRDW�� ]RQD� GH� PHPRULHRFXSDW��GH�R�GDW��FL�QXPDL�FX�DGUHVD�HL�GH�vQFHSXW��$FHVWHD�VH�YRU�REVHUYD�úL�vQ HOHJH�PDLclar din exemple.

83

Page 85: Introducere in c++

Introducere in programare

^�

^�

^�

`�

^�

Pentru a vedea mai clar folosirea conceptului de SRLQWHU�V��FRQVLGHU�P�SURJUDPXOGH�PDL�MRV��$FHVW�SURJUDP�GHFODU��XQ�YHFWRU�GH�HOHPHQWH�vQWUHJL��GHFL�UHSUH]HQWDWH�SH��RFWH L�ILHFDUH��SUHFXP��úL�XQ�SRLQWHU�OD�XQ�vQWUHJ��$FHDVWD�vQVHDPQ��F��FRPSLODWRUXO�YD�úWLvQ�FD]XO�PDQLSXO�ULORU�PDWHPDWLFH�FX�DGUHVD�FDUH�R�FRQ LQH�V��IDF��FDOFXOHOH�FRUHFW��GXS�

cum vom vedea mai jos.

Geneza operatorului &op Se traduce prin “adresa lui” aplicat�� XQXL� RSHUDWRU� RS�� HVWH� R� PRúWHQLUH� GLQ� YUHPHDDECPDP11 care folosea acest sistem. ��(VWH�QHSO�FXW�F�� WHUPLQRORJLD�V-a p�VWUDW� ��GHRDUHFH�DPELJXLWDWHD�DSDUH�vQ�IDSWXO�F��QXúWLP�FRQFUHW� GHVSUH� FH� DGUHV�� HVWH� YRUED�� � /D� FH� QH� UHIHULP: cea ce poate reprezenta o DGUHVDUH�SHUIHFW�QRUPDO��SHQWUX�SURFHVRUXO�;�SRDWH�V��ILH�LPSRVLELO� pentru controllerul SURGXV�GH�<�SHQWUX�R�PDúLQ��GH�VS�ODW�FDUH�IRORVHúWH�DGUHVDUHD�GH�17 EL L . Deci problema SRUWDELOLW� LL� DEVROXWH� V-a S�VWUDW� SHQWUX� F�� D� LQYHQWD�XQ� QRX� WHUPHQ� DU� IL� EXOYHUVDW�PDLPXOW�VLWXD LD�Un SRLQWHU�HVWH�IRORVLWRU�GDF��HVWH�R�FDOH�GH�DFFHV�OD�YDORDUHD�D�F�UHL�DGUHVD�R�UH LQH�/LPEDMXO�&�IRORVHúWH�SHQWUX�DFHDVWD�RSHUDWRUXO�*.

� vQFHSH�]RQD�LQFOXGHUL�GH�ELOLRWHFL� �

�LQFOXGH��VWGLR�K!

�LQFOXGH��FRQLR�K!

� VIkUúLW��]RQD�LQFOXGHUL�GH�ELOLRWHFL� �

���QX�DP�IXQF LL�SURSULL

���QX�DP�YDULDELOH�JOREDOH

� �LQFHSH�]RQD�SURJUDPXOXL�SULQFLSDO �

YRLG�PDLQ�YRLG�

LQW� S����SRLQWHU�OD�R�YDULDELO��GH�WLS�vQWUHJ�

LQW�Y>��@�����WDEORX�GH����HOHPHQWH�GH�WLS�vQWUHJ�

LQW�Q�L����YDULDELOH�QHFHVDUH�SUHOXFU�ULL�PDVLYXOXL�GH�GDWH�

FOUVFU������úWHUJ�HFUDQ�

SULQWI��GDWL�GLPHQVLXQHD�YHFWRUXOXL�1 ����

VFDQI���G��Q����FLWHVF�GLPHQVLXQHD�YHFWRUXOXL�

IRU�L ��L�Q�L����

SULQWI��?Q9>�G@ ��L���

VFDQI���G��Y>L@���

`���FLWHVF�YHFWRUXO�

S Y����GHSXQ�DGUHVD�GH�vQFHSXW�D�PDVLYXOXL�Y�vQ�YDULDELOD�S

IRU�L ��L�Q�L����

SULQWI��?Q&RQWLQXWXO�OXL� Y��G �G��L� �Y�L����

SULQWI��?Q$GUHVD�OXL�9>�G@�HVWH��S��L�Y�L���

IRU�L ��L�Q�L����

84

Page 86: Introducere in c++

Introducere in programare

`�

`

SULQWI��?Q&RQWLQXWXO�OXL� S��G �G��L� �Y�L����

SULQWI��?Q$GUHVD�OXL�S��G�HVWH��S��L�S�L���

JHWFK���

� VIkUúLW�]RQD�SURJUDP�SULQFLSDO �

���QHDYkQG�IXQF LL�SURSULL�QX�DP�DLFL�QLPLF

,HúLUHD�DFHVWXL�SURJUDP�vQ�FD]XO�H[HFX LHL�SHQWUX�XQ�YHFWRU�GH� WUHL�HOHPHQWH�DUDW��FDmai jos:

GDWL�GLPHQVLXQHD�1 ��

9>�@ ��

9>�@ ��

9>�@ ��

&RQWLQXWXO�OXL��Y��� ��

$GUHVD�OXL�9>�@�HVWH��&�(��)'�

&RQWLQXWXO�OXL� Y�� ��

$GUHVD�OXL�9>�@�HVWH��&�(��)'��

&RQWLQXWXO�OXL� Y�� ��

$GUHVD�OXL�9>�@�HVWH��&�(��)'��

&RQWLQXWXO�OXL� S�� ��

$GUHVD�OXL�S���HVWH��&�(��)'�

&RQWLQXWXO�OXL� S�� ��

$GUHVD�OXL�S���HVWH��&�(��)'��

&RQWLQXWXO�OXL� S�� ��

$GUHVD�OXL�S���HVWH��&�(��)'���

���������2SHUD LL�DULWPHWLFH�FX�pointeri

2SHUD LLOH�DULWPHWLFH�SHUPLVH�VXQW�

- adunarea unui pointer cu un întreg - VF�GHUHD�XQXL�vQWUHJ�GLQWU-un pointer - VF�GHUHD�D�GRL�pointeri - compararea unui SRLQWHU�FX�FRQVWDQW��18//��YDORDUHD�vQWUHDJD���- compararea a doi pointeri.

�6LQJXUD�RSHUD LH�DULWPHWLF��SHUPLV��DVXSUD�SRLQWHULORU�F�WUH�IXQF LL�HVWH�FRPSDUDUHD�FXconstanta NULL.

85

Page 87: Introducere in c++

Introducere in programare

Adunarea unui pointer cu un întreg are ca rezultat un SRLQWHU�GH�DFHODúL�WLS��ÌQ�FD]XOîn care SRLQWHUXO�DUH�FD�YDORDUH�DGUHVD�XQXL�HOHPHQW�GH�WDEORX�UH]XOWDWXO�DGXQ�ULL�HVWH�DGUHVDHOHPHQWXOXL�DO�F�UXL� LQGLFH�HVWH�HJDO�FX�VXPD�GLQWUH� LQGLFHOH�HOHPHQWXOXL�F�WUH�FDUH� LQGLF�pointerul, plus valoarea întregului.

'LQ� PRWLYH� OHJDWH� GH� PRGXO� GH� JHQHUDUH� D� DGUHVHORU� IL]LFH� GH� F�WUH� SURFHVRU�UH]XOWDWXO�QX�HVWH�YDOLG�GHFkW�GDF��LQGLFHOH�UH]XOWDW�GLQ�FDOFXO�HVWH�PDL�PDUH�VDX�HJDO�FX�]HURúL�PDL�PLF�VDX�HJDO�FX�QXP�UXO�GH�HOHPHQWH�GLQ�WDEORX�

6F�GHUHD6unui întreg dintr-un SRLQWHU�� 6H� IDFH� FD� úL� FXP� V-ar aduna la pointer YDORDUHD�vQWUHDJ��UHVSHFWLY��FX�VHPQ�VFKLPEDW�

6F�GHUHD a doi pointeri. Cei doi SRLQWHUL� WUHEXLH�V�� LQGLFH�F�WUH�GRX��HOHPHQWH�GLQDFHODúL�WDEORX��UH]XOWDWXO�HVWH�XQ�vQWUHJ�HJDO�FX�GLIHUHQ D�LQGLFLORU�FHORU�GRXD�HOHPHQWH�

Compararea a doi pointeri. Cei doi SRLQWHUL� WUHEXLH�V�� LQGLFH�F�WUH�GRXD�HOHPHQWHGLQ�DFHODúL�WDEORX��UH]XOWDWXO�FRPSDUD LHL�HVWH�HJDO�FX�UH]XOWDWXO�FRPSDUD LHL�LQGLFLORU�FHORUdoua elemente de tablou.

9DORULOH�DSDU LQkQG�XQXL� WLS�SRLQWHU�SRW� IL� FRQYHUWLWH�F�WUH�RULFH�DOW� WLS�pointer prin folosirea unei conversii explicite.

11.1.3 Modele de memorie

Structura procesoarelor 80x86 a determinat maniere diferite de generare a codului de F�WUH�FRPSLODWRDUH��LQ�IXQF LH�GH�PRGXULOH�GH�DGUHVDUH�XWLOL]DWHSHQWUX�DFFHVXO�OD�GDWH��VDX�GH��PRGXO��GH�UHDOL]DUH�D�DSHOXULORU�GH�IXQF LL�

'DF��SURJUDPDWRUXO�FXQRDúWH�FRPSOH[LWDWHD�aplicatiei si volumul de date manipulat, el poate impune o anumita modalitate de generare a codului, astfel incit el sa fie optim. $úD��D��DS�UXW�QR LXQHD�GH��PRGHO�GH�PHPRULH��VSHFLILF�PDMRULWDULL��FRPSLODWRDUHORU�GH�SH�RPDúLQ��FRPSDWLELO��,%0-PC.

Pentru manipularea datelor se folosesc, adesea, SRLQWHUL�� ÌQ� IXQF LH� GH� PRGXULOH� GHadresare utilizate, ei pot avea atributele:

- near pointer�SH����EL L��UHSUH]HQWkQG��GH�IDSW��XQ��offset in interiorul unui segment; - far pointer �SH����EL L��UHSUH]HQWkQG�R�FRPELQD LH��VHJPHQW�RIIVHW��DGLF��R��DGUHV���UHDO�FRPSOHW�����XQ�pointer "far" poate avea orice valoare (in limita a 1 MB de memorie), dar în calcule, segmentul nu poate fi modificat; - huge pointer este similar pointerului "far", dar în calcule segmentul poate fi modificat, astfel LQFkW� V�� SRDW�� IL� DGUHVDW�� WRDW��PHPRULD�� I�U�� VFKLPEDUHD� H[SOLFLW�� D� VHJPHQWXOXL�$FHDVW�� FDUDFWHULVWLF�� HVWH� GDW�� GH� RSHUD LD� GH� QRUPDOL]DUH� OD� FDUH� VXQW� VXSXúL� pointerii "KXJH��vQ�RULFH�RSHUD LL�GH�FDOFXO�

2EVHUYD LH�� ÌQF�OFDUHD� UHJXOLORU� GH� PDL� VXV� QX� HVWH� VHPQDODW�� vQWRWGHDXQD� SURPSW� GHcompilator. Rezultatele pot fi incerte. Modelele de memorie, utilizate de Turbo C, sunt: 7,1<��60$//��0(',80��&203$&7��/$5*(�úL�+8*(��'LIHUHQ LHUHD��ORU��HVWH��GDW�GH�PRGXO�GH�XWLOL]DUH�D�]RQHORU�GH�FRG��GDWH�VL�VWLYD��SUHFXP�úL�GH�DWULEXWHOH�LPSOLFLWH�DOHSRLQWHULORU�XWLOL]D L�vQ�PRGHOXO��UHVSHFWLY��9RP�IDFH�GLVWLQF LH�vQWUH�]RQHOH�GH�GDWH�VWDWLFH�úLzonele de date alocate dinamic (KHDS���&D�UHJXOL��JHQHUDOH��SHQWUX��DORFDUHD�GDWHORU�VH� LQHFRQW�GH�XUP�WRDUHOH�

86

Page 88: Introducere in c++

Introducere in programare

���GDWHOH�VWDWLFH�VH�DORF��vQ�VHJPHQWXO�GH��GDWH���'6���úL��VXQW�OLPLWDWH�OD�FHO�PXOW����kB; ��GDWHOH�DORFDWH�GLQDPLF�VH�SODVHD]��ILH�vQ�VHJPHQWXO��GH��GDWH��OD�PRGHOHOH�7,1<��60$//�MEDIUM), fie in "heap" (la modelele COMPACT, LARGE, HUGE); ��GDWHOH�DXWR�VH�DORF��vQ��VHJPHQWXO��GH��VWLY����66��úL��VXQW�OLPLWDWH�OD�FHO�PXOW����kB.

������$ORFDUH�GLQDPLF��6

11.2.1. Introducere

3kQ�� DFXP�V�D�GLVFXWDW� GHVSUH� FHHD� FH� VH�QXPHúWH� DORFDUH� VWDWLF�� ��$FHVW� WHUPHQ� VHUHIHU�� OD� IDSWXO� F�� R� GDW�� DORFDW�� R� YDULDELO�� vQ� SURJUDP�� PHPRULD� FRUHVSXQ]�WRDUH� HLnumai poate fi UHIRORVLW�� GDF�� OD� XQ� PRPHQW� GDW� QX� DU� IL� QHYRLH� GH� HD� SH� SDUFXUVXOH[HFX LHL�SURJUDPXOXL��'HRDUHFH�IRDUWH�PXOWH�RUL�PHPRULD�5$0�HUD�H[WUHP�GH�VFXPS��LDU�QHFHVLW� LOH�GH�PHPRULH�IRDUWH�PDUL�V�D�vQFHUFDW�UH]ROYDUHD�DFHVWXL�FRQIOLFW�

3ULPD� PHWRG�� HUD� FD� DWXQFL� FkQG� QX� DMXQJHD� PHPRULD� 5$0� VH� IRORVHD� R� XQLWDWHH[WHUQ�� GH� VWRFDUH� FX� SRVLELOLW� L� GH� VFULHUH� � VDX� � FLWLUH�� $FHDVW�� PHWRG�� HVWH� úL� DFXPIRORVLW���6LQJXUXO�GH]DYDQWDM�DO�DFHVWHL�PHWRGH�HVWH�IDSWXO�F��RSHUD LLOH�FX�GLVFXO�VXQW�PXOWmai lente decât cu memoria RAM.

De aceea s-a pus problema folosirii cât mai optime a acestei memorii. În acest scop SURLHFWDQ LL� XQXL� VLVWHP� GH� RSHUDUH� DX� SUHY�]XW� vQ� FDGUXO� DFHVWHL� IXQF LL� VSHFLILFH� GHgestionare a memoriei. 3ULQWUH�IDFLOLW� LOH�GH�ED]��DOH�DFHVWRU�IXQF LL�VXQW��

- alocare de memorie;- dealocare de memorie;- YHULILFDUHD�VSD LXOXL�GH�PHPRULH�U�PDV�nealocat .

Alocarea memoriei�� 3ULQ� WHUPHQXO� GH� DORFDUH� VH� vQ HOHJH� UH]HUYDUHD� XQHL� ]RQH� GHPHPRULH�GH�R�DQXPLW��GLPHQVLXQH��DFHDVW��]RQ��GH�PHPRULH�³GLVSDUH´�SUDFWLF�GLQ�]RQDGH� PHPRULH� vQ� FDUH� VLVWHPXO� FLWHúWH� � VDX� VFULH� I�U�� UHVWULF LL�� /D� DORFDUH� VH� UHWXUQHD]�adresa de început a acestei zone. Dezalocarea memoriei. Prin termenul de GH]DORFDUH� VH� vQ HOHJH� IHQRPHQXO� LQYHUVDORF�ULL��6H�WULPLWH�F�WUH�VLVWHP�DGUHVD�GH�vQFHSXW�D�XQXL�EORF�DORFDW��UH]HUYDW��úL�L�VH�FHUHHOLEHUDUHD� OXL� DGLF�� UHLQWHJUDUHD� vQ� VSD LXO� GH�PHPRULH� FH� SRDWH� IL� DFFHVDW� GH� RULFH� DOWprogram. 9HULILFDUHD�VSD LXOXL�GH�PHPRULH�nealocat��'XS��XQ�QXP�U��RDUHFDUH�GH�DORF�UL��I�U��DPDL� IDFH� úL� GH]DORF�UL� VSD LXO� U�PDV� OLEHU� WLQGH� F�WUH� ]HUR�� )XQF LLOH� GH� DORFDUH� vQPRPHQWXO� vQ�FDUH� OL� VH� FHUH� V�� DORFH�R� DQXPLW�� ]RQ�� ��Q�RFWH L� �� úL� QX�PDL� DX� VXILFLHQWVSD LX� OLEHU� UHWXUQHD]��18//��SHQWUX�D�VHPQDOL]D�DFHDVW�� LPSRVLELOLWDWH��7RWXúL� DFHDVWDUHSUH]LQW��R�VLWXD LH�FULWLF��úL�QX�VH�PDL��SRDWH�IDFH�PDUH�OXFUX��'H�DFHHD��FD� WHKQLF��GHSURJUDPDUH�� VH� SRDWH� IDFH� GLQ� FkQG� vQ� FkQG� vQ� SXQFWHOH� FKHLH� YHULILFDUHD� VSD LXOXL� GHPHPRULH�U�PDV�OLEHU�SHQWUX�D�FDOFXOD�DXWRPDW�GDF��SURJUDPXO�SRDWH�FRQWLQXD�VDX�QX�

87

Page 89: Introducere in c++

Introducere in programare

(URDUH�GH�JkQGLUH�D�vQFHS�WRUXOXL�UHODWLY�OD�RSHUDWRUXO�sizeof ��$FHVW� RSHUDWRU� úWLH� V�� vQWRDUF�� QXP�UXO� GH� RFWH L� SH� FDUH� HVWH� VWRFDW� XQ� WLS� GH� GDW�DEFINIT�ILH�LPSOLFLW��WLSXULOH�GH�GDW��LPSOLFLWH���char , int , long, double) fie cele definite de utilizator (structurile). Dar, NU POATE�FDOFXOD�GLPHQVLXQHD�XQHL�]RQH�GHVSUH�FDUH�QX�DUH�LQIRUPD LL�FODUH�vQPRPHQWXO�FRPSLO�ULL� Exemplu clasic :

char S[10]; ....... gets(S); n=sizeof(S) // eroare

// S poate avea fie 255 caractere (caz � vQ� FDUH� VH� S�VWUHD]�� sigur numai // primele 10, fie nici un caracter // deci nu poate fi aplicat.

�'H�DFHHD�V�D�LQWURGXV�IXQF LD�strlen(S) în acest caz. O versiune de strlen(S) ar fi nr_cars=0; while ( *S[i++]!=’\0’) nr_cars++; return nr_cars;

0DL�MRV�SUH]HQW�P�R�DOW��FODVLILFDUH�D�WLSXULORU��GH�GDWHù

��������$ORFDUHD�GLQDPLF�

2ULFH�WLS�GH�GDW��predefinit sau definit de utilizator poate fi alocat static VDX� GLQDPLF�� )XQF LD� GH� ED]�� vQ� OLPEDMXO� &�� IRORVLW�� SHQWUX� DORFDUHD� GLQDPLF�� DUHXUP�WRUXO�SURWRWLS�

88

Page 90: Introducere in c++

Introducere in programare

YRLG� PDOORF�VL]HBW�VL]H��

YRLG�IDU� IDUPDOORF�XQVLJQHG�ORQJ�QE\WHV��

�����$ORFDUHD� GLQDPLF�� D� XQXL� � EORF� � GH� �PHPRULH� � GH� � OXQJLPH� � GDW�� �size, sau nbytes). "malloc" permite alocarea din segmentul de date a cel mult 64 kB, iar "farmalloc" permite alocarea din "heap" a cel mult 1 MB (de fapt in limitele memoriei ramase GLVSRQLELOH���)XQF LLOH�UHWXUQHD]��SRLQWHU�18//��GDF��QX�PDL� �H[LVW�� �VXILFLHQW��PHPRULHpentru alocare.

YRLG� FDOORF�VL]HBW�QHOHP��VL]HBW�HOVL]H��

YRLG�IDU� IDUFDOORF�XQVLJQHG�ORQJ�QXQLWV��XQVLJQHG�ORQJ�XQLWV]��

������$ORFDUHD�GLQDPLF��D�XQXL�EORF�GH�PHPRULH�SHQWUX�XQ��QXP�U��GDW�GH�HOHPHQWH���nelem, QXQLWV�� � GH� � GLPHQVLXQH� � FXQRVFXW�� � �elsize, XQLWV]��� 'LPHQVLXQHD� WRWDO�� DORFDW�� HVWHprodusul celor doi parametri. "malloc" permite alocarea din segmentul de date a cel mult 64 kB, iar "farmalloc" permite alocarea din "heap" a cel mult 1 MB (de fapt în limitele PHPRULHL� U�PDVH� GLVSRQLELOH��� � )XQF LLOH� � returneaza SRLQWHU�18//�� GDF�� QX�PDL� H[LVW�VXILFLHQW��PHPRULH��SHQWUX�DORFDUH�

YRLG� UHDOORF�YRLG� EORFN��VL]HBW�VL]H��

YRLG�IDU� IDUUHDOORF�YRLG�IDU� ROGEORFN��XQVLJQHG�ORQJ�QE\WHV��

Modificarea dimensiunii unui bloc de memorie deja alocat. Pointerul block (ROGEORFN�� WUHEXLH� V�� IL� IRVW� RE LQXW� FX� R� IXQF LH� GH� DORFDUH�� DSHODW�� � DQWHULRU�� �malloc" ("farmalloc"), "calloc" ("IDUFDOORF����'DF�� UHGLPHQVLRQDUHD�QX�VH� � SRDWH� � IDFH�� � IXQF LLOHUHWXUQHD]��18//��(VWH�SRVLELO�FD�QRXO�SRLQWHU�UH]XOWDW�V��ILH��GLIHULW�GH�SRLQWHUXO�LQL LDO�

YRLG�IUHH�YRLG� EORFN��

YRLG�IDUIUHH�YRLG�IDU� EORFN��

(OLEHUHD]��XQ�EORF�GH�PHPRULH�GHMD��DORFDW���Pointerul EORFN�WUHEXLH�V��IL�IRVW�RE LQXWFX� R� IXQF LH� GH� DORFDUH�� DSHODW�� � DQWHULRU�� �malloc" ("farmalloc"), "calloc" ("farcalloc"). ÌQFHUFDUHD�GH�D�DSHOD�XQD�GLQ�IXQF LLOH�GH�PDL�VXV�FX�XQ�SRLQWHU��RE LQXW��SH�DOWH�F�L��SRDWHduce la rezultate imprevizibile. �����ÌQ� SURJUDPHOH� FH� XWLOL]HD]�� DORFDUH� GLQDPLF��� VH� UHFRPDQG�� FD� RULFH� ]RQ��� DVWIHOREWLQXW���V��ILH�HOLEHUDW��GXS��XWLOL]DUH�2EV��&RPSLODWRUXO�QX�VHVL]HD]��HURUL�GH�WLSXO�FHORU�PHQ LRQDWH�PDL�VXV��GHSDQDUHD�HVWH��GHDVHPHQHD��GLILFLO��

XQVLJQHG�FRUHOHIW�YRLG��

XQVLJQHG�ORQJ�IDUFRUHOHIW�YRLG��

(YDOXHD]��GLVSRQLELOXO�GH�PHPRULH�SRVLELO�GH�D�IL�IRORVLW�vQ��DORFDUHD�GLQDPLF���)XQF LD"coreleft" UHWXUQHD]�� PHPRULD� � OLEHU�� � GLQ� VHJPHQWXO� GH� GDWH�� LDU� �farcoreleft" memoria OLEHU��GLQ��heap".

89

Page 91: Introducere in c++

Introducere in programare

)XQF LLOH� GH� DORFDUH� SULPHVF� QXP�UXO� H[DFW� GH� RFWH L� FH� VH� GRUHVF� D� IL� DORFD L� úLUHWXUQHD]��DGUHVD�GH�vQFHSXW�D�UHVSHFWLYHL�]RQH��'LQ�PRWLYH�GH�portabilitate a programului QX�HVWH�LQGLFDW�V��VH�FDOFXOH]H�GLPHQVLXQHD�]RQHL�GH�DORFDW�FX�IRUPXOD�

1UBHOHPHQWH �QUBRFWH LBRFXSDWBGHBUHVSHFWLYXOBWLSBGDW�

ùL�DFHVW�OXFUX�GHRDUHFH�IXQF LH�GH�DUKLWHFWXUD�VLVWHPXOXL�GH�FDOFXO�QXP�UXO�GH�RFWH L�SHFDUH�HVWH�UHSUH]HQWDW�DFHODúL�WLS�GH�GDWH�SRDWH�GLIHULW��'HFL�SURJUDPXO�DU�WUHEXL�PRGLILFDWîn cazul UHFRPSLO�ULL�VXE�DOW��SODWIRUP��

Portabilitatea unui program 6H� UHIHU�� OD� PRGXO� GH� VFULHUH� D� XQXL� FRG� VXUV�� DVWIHO� vQFkW� OD� recompilarea sau la

H[HFX LD�OXL��VXE�GLIHULWH�SODWIRUPH�KDUGZDUH�VDX�VRIWZDUH��PRGLILF�ULOH�FH�WUHEXLH�I�FXWHSHQWUX�D�O�IDFH�IXQF LRQDO�V��ILH�PLQLPH�VDX�LQH[LVWHQWH�

Pentru a asigura SRUWDELOLWDWHD�GLQ�SXQFW�GH�YHGHUH�DO�DORF�ULL�GLQDPLFH�VH�YD�IRORVLXQ� RSHUDWRU� VSHFLDO� DO� OLPEDMXOXL� &� úL� DQXPH� sizeof(WLSBGDW���� 1XPHOH� VH� WUDGXFH� SULQ³P�ULPHD�OXL´��(O�UHWXUQHD]��QXP�UXO�GH�RFWH L�SH�FDUH�HVWH�UHSUH]HQWDW�UHVSHFWLYXO�WLS�GHGDW���ÌQ�DFHVWH�FRQGL LL�UH]XOW��FODU�F��]RQD�GH�PHPRULH�FH�VH�GRUHúWH�D�IL�DORFDW��WUHEXLHFDOFXODW��FX�XUP�WRDUHD�IRUPXO��

1UBRFWH LBGHBDORFDW� �nr_elemente*VL]HRI�WLSBGDW��

$FHVW�RSHUDWRU�úWLH�V��IDF��FDOFXOXO�QXP�UXOXL�GH�RFWH L�RFXSD L�úL�vQ�FD]XO�XQXL�WLS�GH�GDW�definit de utilizator.

��������$ORFDUHD�GLQDPLF��D�WDEORXULORU�GH�GDWH

'XS��FXP�úWLP�vQ�FD]XO�WLSXULORU�GH�GDWH�DORFDWH�VWDWLF�VH�SRW�GHILQL�WDEORXUL�FDUH�V�DLE��SkQ��OD�WUHL�GLPHQVLXQL��([LVW��vQ�UHVSHFWLYXO�FD]�R�OLPLWDUH�D�]RQHL�GH�PHPRULH�FDUHSRDWH�IL�DVWIHO�DORFDW��úL�DQXPH�vQWUH����NR�úL���0R�IXQF LH�GH�PRGHOXO�GH�PHPRULH�DOHVSHQWUX�FRPSLODUH��'DF��vQ�FD]XO�GHFODU�ULL�VWDWLFH�FRPSLODWRUXO�VH�RFXS�� �GH�WRW�SURFHVXOvQ�FD]XO�DORF�ULL�GLQDPLFH�DFHVW�SURFHV�GHYLQH�FHYD�PDL�FRPSOLFDW��([LVW��GRX��PHWRGH�GHalocare:

Metoda I

$ORFDUHD� VH� IDFH� R� VLQJXU�� GDW�� SHQWUX� WRDWH� HOHPHQWHOH� úL� HVWH� R� VLQJXU�LQVWUXF LXQH��0HWRGD�DUH��SHQWUX�WDEORXULOH�D�F�URU�GLPHQVLXQL�VXQW�! ����GH]DYDQWDMXO�F�accesul la un element se poate face numai prin intermediul unui SRLQWHU� úL� WUHEXLH� V�IRORVHVF�R�IRUPXO��GH�FDOFXO�D�DGUHVHL�HOHPHQWXOXL��$FHDVW��IRUPXO�� WUHEXLH�V�� LQ��FRQWGH�DGUHVD�GH�vQFHSXW�D�PDVLYXOXL��GH�LQGLFLL�HOHPHQWXOXL�úL�GH�QXP�UXO�GH�RFWH L�SH�FDUHHVWH� UHSUH]HQWDW�� $úD� VH� OXFUD� OD� QLYHOXO� OLPEDMXOXL� GH� DVDPEODUH� XQGH� QX� DYHDP� DOWHSRVLELOLW� L�

)RUPXOD��GH�HFKLYDOHQ ��ar[i] ↔ *(av+i).

90

Page 92: Introducere in c++

Introducere in programare

^

`

Vom prezenta un scurt exemplu de folosire a primei metode în cazul unui tablou monodimensional de caractere.

#include <string.h> #include <stdio.h>

YRLG�PDLQ�YRLG�

FKDU�VWUJ>��@� WKHUH�RQH�WZR�

LQW� SW�OLVW>���@�LQGH[�

���VWUFS\�VWUJ��$FHVWD�H�XQ�VLU�GH�FDUDFWHUH����

���RQH� �VWUJ>�@���������������������� �RQH�úL�WZR�VXQW�LGHQWLFL�FD�YDORDUH� �

���WZR� � VWUJ�

���SULQWI��RQH��WZR ��F��F?Q��RQH�WZR��

���RQH� �VWUJ>�@��������������������� �RQH�úL��WZR�VXQW�LGHQWLFL� �

���WZR� � �VWUJ����

���SULQWI���RQH��WZR �F��F?Q��RQH�WZR��

���WKHUH� �VWUJ���������������� �VWUJ����HVWH�LGHQWLF�FX��VWUJ>��@� �

���SULQWI��VWUJ>��@ ��F?Q��VWUJ>��@��

���SULQWI��WKHUH ��F?Q�� WKHUH��

���IRU��LQGH[� ���LQGH[�������LQGH[���

������OLVW>LQGH[@� �LQGH[�������

���SW� �OLVW������

���SULQWI��OLVW>��@ ��G?Q��OLVW>��@��

���SULQWI�� SW ��G?Q�� SW��

JHWFK���

Metoda II

3RUQHúWH� GH� OD� REVHUYD LD� F��� FRPSLODWRUXO� IDFH� DXWRPDW� FDOFXOXO� DGUHVHLHOHPHQWXOXL� vQ� úLUXO� GH� HOHPHQWH� vQ� FD]XO� GHFODU�ULL� VWDWLFH�� 6H� SRDWH� IRORVL� úL� vQ� FD]XODORF�ULL� GLQDPLFH� DFHDVW�� IDFLOLWDWH� D� FRPSLODWRUXOXL� FX� FRQGL LD� FD� PRGXO� vQ� FDUH� VHUHDOL]HD]�� DORFDUHD� � V�� UHVSHFWH� PRGDOLWDWHD� LQWHUQ�� IRORVLW�� GH� FRPSLODWRU� vQ� FD]XODORF�ULL�VWDWLFH��$FHVW�OXFUX�SHUPLWH�FD��GHúL�VH�YD�DORFD�GLQDPLF�XQ�WDEORX��XOWHULRU�vQ�FRGDFFHVXO� OD� RULFDUH� HOHPHQW� V�� SRDW�� IL� UHDOL]DW� IRORVLQG�PHWRGD� LQGLFHDO�� WLSLF�� FD]XOXLDORF�ULL�VWDWLFH�

11.2.3.1. Alocarea tablourilor monodimensionale

În acest caz alocarea se face conform formulei de mai jos:

91

Page 93: Introducere in c++

Introducere in programare

^

`�

Nume_tablou=(tip_elem_tablou)malloc(nr_elem_tab *sizeof(tip_el_tablou))

Un exemplu de aplicare în program a acestei formule YRLG�PDLQ�YRLG�

LQW�Y �

«

Y �LQW� )PDOORF��� VL]HRI�LQW���«�

6H�REVHUY��F��YDORULL�returnate de “PDOORF´�vL�DSOLF�P�XQ�RSHUDWRU�GH�FDVW��ÌQ�PRGQRUPDO�FRQYHUVLD�GH�WLS�VH�IDFH�DXWRPDW��WRWXúL�vQ�FD]XO�DORF�ULL�HVWH�LQGLFDW�V��ILH�I�FXW�explicit.

9HFWRUXO�YD�SXWHD�IL�IRORVLW�FRQIRUP�FHORU�GRX��PHWRGH�FD�PDL�MRV�

1. *(v+4*sizeof(int))=0x32; 2. v[4]=0x32;

8Q� FD]� VSHFLDO� HVWH� FD]XO� DORF�ULL� GLQDPLFH� DO� XQXL� WDEORX� monodimesional de FDUDFWHUH�� 2ULFH� úLU� GH� FDUDFWHUH� HVWH� SUHY�]XW� FX� XQ� WHUPLQDWRU� VSHFLDO� µ?�¶�� $FHDVWDSURYLQH� GLQ� OLPEDM� GH� DVDPEODUH�� DYkQG� vQ� YHGHUH� IDSWXO� F�� IXQF LLOH�'26� GH� OXFUX� FXúLUXULOH�GH�FDUDFWHUH�VXQW�JkQGLWH�V��SULPHDVF��DGUHVD�GH�vQFHSXW�GLQ�]RQD�GH�PHPRULH�úLV�� SUHOXFUH]H� HOHPHQW� FX� HOHPHQW� úLUXO� SkQ�� FkQG� HVWH� vQWkOQLW� WHUPLQDWRUXO� µ�¶�� 'DF�LQL LDOL]DUHD� VH� YD� IDFH� HOHPHQW� FX� HOHPHQW� vQ� SURJUDP� ‘\0’ trebuie depus explicit. )RORVLUHD� IXQF LLORU� GH� ELEOLRWHF�� G�� DYDQWDMXO� F�� WHUPLQDWRUXO� HVWH� SXV� DXWRPDW� GHUHVSHFWLYHOH�IXQF LL�

11.2.3.2. Alocarea tablourilor bidimensionale

Formula de HFKLYDOHQ ��ar[m][n] ↔ *(ar[m]+n) ↔ *(*(ar+m)+n)

DaF��DU�HVWH�GH�vQWUHJL�int ar[m][n] atunci ar[i][j] este echivalent cu

*(int*)((char*)ar + (i*a*sizeof(int) + j*sizeof(int))

Cast-urile trebuiesc puse pentru F��VH�REVHUY��F��FDOFXOHOH�GH�GHSODVDPHQW�� LQkQG�FRQW�GHGH�VSD LXO�RFXSDW�GH�XQ�HOHPHQW�GLQ�WDEORX��DX�IRVW�I�FXWH�H[SOLFLW�

ÌQ�DFHVW�FD]�DORFDUHD�HVWH�PDL�FRPSOLFDW���vQV��XOWHULRU�H[LVW��DYDQWDMXO�GH�D�VH�SXWHDOXFUD�úL�SULQ�VSHFLILFDUHD�SR]L LHL�HOHPHQWXOXL�

92

Page 94: Introducere in c++

Introducere in programare

^

^�

`�

`

^�

`�

LQW�IDU� WBDOORF�LQW�OLQ��LQW�FRO�

LQW�L�

UHJLVWHU�LQW�IDU� SOLQ�� SGDWD�

SGDWD �LQW�IDU� �IDUFDOORF�OLQ FRO�VL]HRI�LQW�IDU ����

LI�SGDWD �LQW�IDU �18//�HUU��������1X�H[LVWD�VSDWLX����

SOLQ �LQW�IDU �IDUFDOORF�OLQ�VL]HRI�LQW�IDU ����

LI�SOLQ �LQW�IDU �18//�HUU��������1X�H[LVWD�VSDWLX����

IRU�L ��L�OLQ�L����

SOLQ>L@ SGDWD��

SGDWD� FRO��

UHWXUQ�SOLQ�

� �

YRLG�WBIUHH�LQW�IDU� SD�

IDUIUHH� SD���

IDUIUHH�SD���

([HPSOXO�GH�PDL�VXV�QH�SHUPLWH� V��SRW�DFFHVD� vQ�SURJUDP�XQ�HOHPHQW�GLQ� WDEORX� vQmaniera m[i][j] ceea face codul mai clar.

11.2.3.3. Tablouri tridimensionale 6H� WUDWHD]�� GXS�� DFHHDúL� JkQGLUH� FD� úL� FHOH� ELGLPHQVLRQDOH�� PDL� MRV� YRP� SUH]HQWD� XQexemplu de tranfer de parametru în cazul tablou tridimensional. fie

void main(void){int m [5][6][7];…f2(m, x, y, z);}

void f2 ( int *** argm, dim1, dim2, dim3){int x ;…

atunci x=2 + *((int x) argm + i*dim3*dim2 + j*dim2 + k) (echivalent cu argm[i][j] )

93

Page 95: Introducere in c++

Introducere in programare

^

^

11.3. Pointeri la structuri

$YkQG� vQ� YHGHUH� GHILQL LD� SRLQWHUXOXL� QX� H[LVW�� QLPLF� FDUH� V�� vPSLHGLFH� GHFODUDUHDunor SRLQWHUL� OD�R� VWUXFWXU��� � ÌQ�DFHVWH�FRQGL LL� WLSXO�GH�GDWH�JUXS�� úL� VWXGHQW�SUH]HQWDWHanterior se vor rescrie ca mai jos.

W\SHGHI�VWUXFW�6WXGHQW

FKDU� QDPH�

XQVLJQHG�VKRUW�LQW�DJH�

XQVLJQHG�FKDU�QBODE�

�XQVLJQHG�FKDU�QBH[�

`�VWXG�

W\SHGHI�VWUXFW�*UXSD

LQW�QXPH�

LQW�DQ�

VWXG� W�

`JU�

JU� S�,*S��

11.3.1. Accesarea membrilor

'H�DFHDVW��GDW��VH�YD�IRORVL�Æ�vQ�ORF�GH�SXQFW��UHVWXO�UHJXOLORU�GH�DFFHVDUH�U�PkQkQGidentice. Acest nou operator de acces a fost introdus doar pentru a scrie cod cât mai clar GHRDUHFH�GDF��DYHP��VWXG� S; atunci SÆQXPH este perfect echivalent cu � S��QXPH� din punct de vedere sintactic. 11.3.2. Alocarea structurilor de date

7UHEXLH�DYXW�JULM��FD�WRW�VSD LX�GH�FDUH�HVWH�QHYRLH�V��ILH�DORFDW��([LVW��GRX��QLYHOH�GHDORFDUH��SULPXO�VH�UHIHU�� OD�DORFDUHD�GH�VSD LX�SHQWUX�QRXO� WLS�GH�GDW���DO�GRLOHD�QLYHO�VHUHIHU��OD�DORFDUHD�GH�VSD LX��XQGH�HVWH�FD]XO��SHQWUX�PHPEULL�QRXOXL�WLS�GH�GDW��

Alocarea la primul nivel: *U� S���

S� �JU� �PDOORF��� VL]HRI�JU����

1LYHOXO�GRL�GH�DORFDUH�HVWH�FODU�GH�DELD�vQ�ID]D�GH�LQL LDOL]DUH�D�XQHL�VWUXFWXUL�

��������,QL LDOL]DUH�úL�GLVWUXJHUH�VWUXFWXUL6

'DF�� DORFDUHD� GLQDPLF�� SHQWUX� WLSXULOH� GH� GDWH� SUHGHILQLWH� H� UHODWLY� VLPSO�� vQPDMRULWDWHD� FD]XULORU� vQ� FD]XO� VWUXFWXULORU� GH� GDWH� WUHEXLH� FD� SURJUDPDWRUXO� V��úLFRQVWUXLDVF��SURSULLOH�IXQF LL�GH�LQL LDOL]DUH���HOLEHUDUH�D�GDWHORU�

94

Page 96: Introducere in c++

Introducere in programare

^�

`�

^

`

^

`

^

`

6H�YRU�SUH]HQWD�IXQF LLOH�GH�LQL LDOL]DUH�SHQWUX�XQ�RELHFW�GH�WLS�JUXSD��6H�REVHUY�

F��XQ�RELHFW�GH�WLS�JUXSD�FRQ LQH�XQ�WDEORX�GH�RELHFWH�GH�WLS�VWXGHQW�úL�GHFL�WUHEXLH�vQWkLVFULV��IXQF LD�FDUH�LQL LDOL]HD]��SH�DFHVWD�

6WXG� LQLWBVWXG�FKDU� QDPH�XQVLJQHG�VKRUW�LQW�DJH�

XQVLJQHG�FKDU�QBODE�QBH[��

VWXG� S��

LI���S �VWXG� �PDOORF�VL]HRI�VWXG����HUURU�³1RW�HQRXJK�PHPRU\´���

LI���S�!QDPH �FKDU� �PDOORF�VWUOHQ�QDPH� VL]HRI�FKDU�����

HUURU�³1RW�HQRXJK�PHPRU\´���

VWUFS\�S�!QDPH�QDPH���

S�!DJH DJH��

S�!QBODE QBODE��

S�!QBH[ QBH[��

UHWXUQ� S��

�YRLG�IUHHBVWXG�VWXG� S�

IUHH�S�!QDPH��

IUHH�S��

JU� LQLWBJU�LQW�QXPH��VWXG� VW��FKDU�QDPH��LQW�DJH��Q��Q��

JU� S�

LI���S �JU� �PDOORF�VL]HRI�JU�����HUURU�³1RW�HQRXJK�PHPRU\´��

S�!QXPH QXPH�

S�!DQ DQ�

S�!VWXG VW�

UHWXUQ�S�

YRLG�HUU�FKDU� V�

FOUVFU���

SXWV�V��

H[LW����

'XS��FXP�VH�REVHUY��FHOH�GRX��IXQF LL�DORF��FkWH�XQ�HOHPHQW��$ORFDUHD�SHQWUX�WDEORXOGH� VWXGHQ L� DO� F�UXL� pointer este primit în LQLWBJU� QX� D� IRVW� SUH]HQWDW��� SHQWUX� F�� VHIRORVHúWH�IXQF LD�GH�DORFDUH�D�XQXL�VWXGHQW�SHQWUX�ILHFDUH�GLQ�HOHPHQWH�úL�HOH�SRW�IL�GHSXVHvQWU�XQ�WDEORX�DORFDW�VWDWLF�VDX�GLQDPLF�VDX�vQWU�R�OLVW��vQO�Q XLW��

95

Page 97: Introducere in c++

Introducere in programare

����'HFODUD LL�FRPSOH[H�vQ�&6

3HVWH� XQ� DQXPLW� QLYHO� GH� H[SHULHQ ��� H[LVW�� WHQGLQ D� IRORVLULL� XQRU� GHFODUD LLFRPSDFWH�� GDU� FRPSOH[H�� úL� DFHDVWD� FRPSLODWRUXO� OH� DFFHSW��� DFHVW� OXFUX� FRQGXFH� ODVF�GHUHD� FODULW� LL� FRGXOXL�� GH� DFHHD� UHFRPDQG�P� HYLWDUHD� SH� F�W� SRVLELO�� 'H� H[HPSOXXUP�WRDUHD�GHFODUD LH�GHFODU��SH�[�FD�ILLQG�XQ�SRLQWHU�OD�R�IXQF LH�FDUH�vQWRDUFH�XQ�pointer F�WUH�DO�FLQFLOHD�HOHPHQW�GLQWU�XQ�WDEORX�GH�pointeri la întregi. Complicat , NU?

int *(*(*x)()[5]; Mai IRV�SUH]HQW�P�R�PHWRG��VLPSO��SHQWUX�HYLWDUHD�DFHVWXL�WLS�GH�FRPSOLFD LL�

typedef int *AP[5] //al 5-lea element dintr-un tablou de pointeri la întreg W\SHGHI�$3� )3������IXQF LD�FH�YD�returna un pointer la al 5-lea element al unui

tablou de SRLQWHUL�F�WUH�vQWUHJLFP *x // pointer la......

0RWLYXO� SULQFLSDO� SHQWUX� FDUH� GHFODUD LLOH� GH� WLSXO� FHORU� SUH]HQWDWH� PDL� VXV� VXQW� DúDFRPSOLFDWH� vQ�&�� HVWH�GDWRUDW� IDSWXOXL� F�� RSHUDWRUXO�pointer { * } este de tip prefix, iar RSHUDWRULL�GH�IXQF LH�úL�WDEORX�VXQW�GH�WLS�postfix.

3HQWUX� D� GHVFLIUD� GHFODUD LL� FRPSOH[H�� WUHEXLH� SULYLW� GLQ�XQWUX� vQVSUH� DIDU��DG�XJ�QG�� �vQ�VW�QJD�úL�����VDX�>�@�vQ�GUHDSWD�

'HVFLIUDUHD�GHFODUD LLORU�FRPSOH[H�vQ�&6

&HD�PDL�EXQ��VWUDWHJLH�vQ�GHVFLIUDUHD�GHFODUD LLORU�FRPSOH[H��HVWH�V��SRUQLP�GH�ODQXPHOH�YDULDELOHL�úL�DSRL�V��DG�XJ�P��V�� LQHP�FRQW�GH�HIHFWXO���ILHFDUH�SDUWH�RSHUDWRU��DLH[SUHVLH�SRUQLQG�FX�RSHUDWRULL�FHL�PDL�DSURSLD L�GH�QXPHOH�YDULDELOHL�

În liSVD�SDUDQWH]HORU��VH�YD� LQH�FRQW� vQW�L�GH�RSHUDWRULL�GH� WLS� IXQF LH�VDX� WDEORX�GLQ� GUHDSWD� YDULDELOHL�� GHRDUHFH� DX� SULRULWDWH�PDL�PDUH�� úL� GH�DELD� OD� VI�UúLW� VH� YD� LQHcont de efectul operatorilor de tip prioritar) De exemplu:

FKDU� >�@��YD�IL�GHVFLIUDW��vQ�XUP�WRULL�SDúL�1. x[ ] este un tablou 2. **[ ] este un tablou de pointeri 3. char *x[ ] este un tablou de SRLQWHUL�F�WUH�FDUDFWHUH�

3DUDQWH]HOH� SRW� IL� IRORVLWH� ILH� SHQWUX� FODULWDWH�� ILH� SHQWUX� VFKLPEDUH� D� SUHFHGHQ HL�� 'Hexemplu:

LQW�� >�@�������YD�IL�GHVFRPSXV�GXS��FXP�XUPHD]��1. x[ ] este un tablou 2. ( **[ ] ) este un tablou de pointeri 3. ( **[ ] ) ( ) este un tablou de SRLQWHUL�F�WUH�IXQF LL4. int ( (*x [ ] ) ( ) este un tablou de SRLQWHUL�F�WUH�IXQF LL�FH�UHWXUQHD]��XQ�vQWUHJ

&RPSXQHUHD�GHFODUD LL�FRPSOH[H3HQWUX�D�FRPSXQH�GHFODUD LL�FRPSOH[H�SURFHVXO�HVWH� LGHQWLF�FD�OD�GHVFRPSXQHUH�

'H� H[HPSOX� GDF�� VH� GRUHúWH� GHFODUDUHD� XQXL� SRLQWHU� F�WUH� XQ� WDEORX� GH� SRLQWHUL� F�WUHIXQF LL� FDUH� vQWRUF� SRLQWHUL� OD� WDEORXUL� GH� VWUXFWXUL� FX� QXPHOH�6�� VH� YRU� IRORVL� XUP�WRULLSDúL�

1. ( *x) este un pointer 2. ( *x)[ ] este un pointer la un tablou

96

Page 98: Introducere in c++

Introducere in programare

3. ( *(*x[ ])) este un pointer la un tablou de pointeri 4. ( *(*x[ ])) ( )este un pointer la un tablou de SRLQWHUL�OD�IXQF LL5. ( *( *(*x[ ])) ( ) )este un pointer la un tablou de SRLQWHUL� OD� IXQF LL� FH� vQWRUF

pointeri 6. ( *( *(*x[ ])) ( ) ) [ ] este un pointer la un tablou de SRLQWHUL� OD�IXQF LL�FH� vQWRUF

pointeri catre tablouri 7. struct S ( *( *(*x[ ])) ( ) ) [ ] este un pointer la un tablou de SRLQWHUL�OD�IXQF LL�FH

întorc pointeri catre tablouri de structuri cu numele S

ÌQ� VFRSXO� XúXU�ULL� vQ HOHJHULL�� VH� YD� SUH]HQWD� XQ� WDEORX� FX� diverese expresii complexe X]XDOH�vQ�FRGXULOH�&��úL�DQXPLWH�JUHúHOL�FRPXQH�

• int i; un întreg • int* p; pointer la întreg • int a[ ]; tablou de întregi • LQW�I�����IXQF LH�FH�vQWRDUFH�XQ�vQWUHJ• int **p; pointer la SRLQWHU�F�WUH�vQWUHJ• int ( *pa ) [ ]; pointer la tabloul de întregi • int ( *pf ) ( ); SRLQWHU�OD�R�IXQF LH�FH�vQWRDUFH�XQ�vQWUHJ• int *ap [ ]; un tablou de SRLQWHUL�F�WUH�vQWUHJL• int aa [ ] [ ] un tablou de tablou de întregi • int DI�>�@������XQ�WDEORX�GH�IXQF LL�FH�vQWRUF�vQWUHJ NEPERMIS • int *IS�����R�IXQF LH�FH�vQWRDUFH�XQ�pointer la întreg • LQW�ID�����>�@��R�IXQF LH�FH�vQWRDUFH�XQ�WDEORX�GH�vQWUHJL NEPERMIS • LQW�I�����������R�IXQF LH�FH�vQWRDUFH�R�IXQF LH�FH�vQWRDUFH�XQ�int NEPERMIS • int ***p; pointer la pointer la pointer la int • int ( **ppa) [ ]; pointer la SRLQWHU�F�WUH�XQ�WDEORX�GH�int • int ( **ppf) [ ]; pointer la SRLQWHU�F�WUH�R�IXQF LH�FH�vQWRDUFH�int • int * ( *pap) [ ]; SRLQWHU�F�WUH�XQ�WDEORX�GH�pointeri la întregi • int (* paa) [ ] [ ]; pointer la un tablou de SRLQWHUL�FH�UH LQ�vQWUHJL• int (* paf) [ ] ( ); SRLQWHU�OD�XQ�WDEORX�GH�IXQF LL��FH�vQWRUF�vQWUHJL NEPERMIS • int *( *pfp) ( ); un SRLQWHU�OD�R�IXQF LH�FH�vQWRDUFH�vQWUHJ• int (* pfa ) ( ) [ ]; SRLQWHU�OD�R�IXQF LH�FH�vQWRDUFH�XQ�WDEORX�GH�vQWUHJL

NEPERMIS• int IDI����>�@������IXQF LH�FH�vQWRDUFH�XQ�WDEORX�GH�IXQF LL�FH�vQWRUF�vQWUHJL

NEPERMIS• int *IIS���������IXQF LH�FH�vQWRDUFH�R�IXQF LH�FH�vQWRDUFH�XQ�pointer la int

NEPERMIS• int (* pff) ( ) ( ); un SRLQWHU�OD�R�IXQF LH�FH�vQWRDUFH�R�IXQF LH�FH�vQWRDUFH�XQ�vQWUHJ

NEPERMIS • int **app[ ]; un tablou de pointeri la SRSLQWHUL�F�WUH�vQWUHJL• int ( *apa[ ] ) [ ]; un tablou de SRLQWHUL�F�WUH�XQ�WDEORX�GH�vQWUHJL• int (*apf[ ] ) ( );un tablou de SRLQWHUL�F�WUH�IXQF LL�FH�vQWRUF�vQWUHJL• int *aap[ ] [ ];un tablou de tablouri de pointeri la întregi

97

Page 99: Introducere in c++

Introducere in programare

• int aaa[ ] [ ] [ ]; un tablou de tablouri de tablouri de întregi • int DDI�>�@�>�@������XQ�WDEORX�GH�WDEORXUL�GH�IXQF LL�FH�vQWRUF�vQWUHJL NEPERMIS • int *DIS>�@������XQ�WDEORX�GH�IXQF LL�FH�vQWRUF�pointeri la întregi • int DID�>�@�����>�@��XQ�WDEORX�GH�IXQF LL�FH�vQWRUF�WDEORXUL�GH�vQWUHJL NEPERMIS • int DII�>�@����������XQ�WDEORX�GH�IXQF LL�FH�vQWRUF�IXQF LL�FDUH�vQWRUF�vQWUHJL

NEPERMIS• int ** ISS������R�IXQF LH�FH�vQWRDUFH�XQ�pointer la pointer de întregi • int ( *ISD�������>�@���R�IXQF LH�FH�vQWRDUFH�XQ�SRLQWHU�F�WUH�WDEORXUL�GH�vQWUHJL• int ( * ISI������������IXQF LH�FH�vQWRDUFH�XQ�SRLQWHU�F�WUH�R�IXF LH�FH�vQWRDUFH�XQ�vQWUHJ• int IDD�����>�@�>�@���IXQF LH�FH�vQWRDUFH�XQ�WDEORX�GH�WDEORXUL�GH�vQWUHJL

NEPERMIS• int *IDS�����>�@��IXQF LH�FH�vQWRDUFH�XQ�WDEORX�GH�SRLQWHUL�F�WUH�vQWUHJL�

NEPERMIS

Câteva tehnici de FUHúWHUH�D�vitezei de H[HFX LH�D�unui cod

Propagarea copiei (se pune la asignare) Fie urm�WRDUHD�VHFYHQ ��GH�FRG:

x=y z=1.+x corect este: x=y z=1.+y (elimin��LQWHUGHSHQGHQ HOH�GLQWUH�FHOH�GRX��UHOD LL��

Reducerea puterii Ex: y = pow (x,2) -> ia foarte mult timp

ÌQORFXL L�FX�y=x*x sau j=k*2 -> ia mult timp vQ�FRPSDUD LH�FX�DGXQDUHD�M=k+k sau cu deplasarea la st�QJD�j=k<<2

Redenumirea variabilelor CâWHRGDW���F�QG�VH�YUHD�YLWH]��PD[LP����HVWH�PDL�ELQH�V��HYLW�P�refolosirea variabilelor x=y*z q=r+x+z x=a+b A x=y*z q=r+x+z x=a+b

b x0=y*z q=r+x0+x0 x=a+b

Compilatorul reali]HD]��DXWRPDW�DFHVWH�OXFUXUL��GDU�SHQWUX�FDOFXOH�GH�ILQH H�HVWH�ELQH�V�facem personal optimizarea codului. Deoarece a) P�Q�QF��WLPS�GH�FDOFXO�LDU�E��P�Q�QF�PHPRULH��vQ�RS LXQLOH�FRPSLODWRUXOXL�H[LVW�:

1. optimi]DUH�SHQWUX�YLWH]���VWLO�E��2. optimizare pentru dimensiune (stil a)

98

Page 100: Introducere in c++

Introducere in programare

Eliminarea subexpresiilor comune

Ex. D=C*(A+B) t=A+B E=(A+B)/2 -----> D=C*t F=sqr(A+B) E=t/2

F=sqr(t) Aten LH�OD�RUGLQHD�vQ�FDUH�VH�VFULX�subexpresiile deoarece pt. compilator a+b+c

poate fi diferit de %�&�D�FKLDU�FkQG�VH�IDFH�RSWLPL]DUH�DXWRPDW��

Eliminarea codurilor constante din bucle

for (i=0;i<u;i++){A[i]=B[i]+C*D ;E=G[k];}

Se observ��F��& '�HVWH�FDOFXODW��GH�1�RUL�úL�QX�HVWH�R�IXQF LH�GH��L) . Absurd! /D�IHO�úL�(�= G[k] este un transfer de memorie realizat de n ori úL�QX�HVWH�R�IXQF LH�GH�L�deci corect bucla este :

temp=c*d;for(i=0;i<n;i++) A[i]=B[i]+t ;E=G[k];

6LPSOLILFDUHD�SULQ�LQGXF LH

Ex. for (i=0;i<n;i++)k=i*4+M

Dup��R�VFXUW��DQDOL]��PDWHPDWLF���WHP��DFDV���UH]XOW��R�VHFYHQ ��HFKLYDOHQW��GDU�VHVFXWHVF�Q�vQPXO LUL�

k=mfor(i=0;i<n;i++) k=k+4;

Se IRORVHúte când referim direct tablouri

adresa = adresa_de_baza(A)+(i-1)*sizeof(data)

adresa = adresa_de_baza(A)-sizeof(data) adresa = adresa+sizeof(data)

dac��DSOLF�úL�HOLPLQDUHD�FRQVWDQWHORU��FRGXO�GHYLQH��temp = sizeof(data)adresa = adresa_de_baza(a)-temp

99

Page 101: Introducere in c++

Introducere in programare

adresa = adresa+temp

/XFUXO�FX�ILúLHUHOH�GH�GDWH��,�2�),/(��Streamuri (streams) &�QX�IDFH�GLVWLQF LH�vQWUH�GLYHUVH�GLVSR]LWLYH�FXP�DU�IL�WHUPLQDO��=,3��+''�

În toate cazurile I/O este realizat prin aceste VWUHDP�XUL�FDUH�VXQW�DVRFLDWH�FX�ILúLHUH�VDX�FXdispozitive.

'HI: Un stream�FRQVW��GLQWU�R�vQúLUXLUH�RUGRQDW��GH�RFWH L��3RDWH�IL�J�QGLW�FXPYDFD�XQ�YHFWRU��QXPDL�F��vQ�DFHVW�FD]�QX�DP�DFFHV�SDUDOHO�FL�VHULDO�OD�ILHFDUH�HOHPHQW�

Pentru a realiza accesarea unui stream trebuie declarat un SRLQWHU�OD�R�VWUXFWXU��VWDQGDUGQXPLW��),/(�GHILQLW��LQ�stdio.h.(D�FRQ LQH�

– ,QIRUPD LL�GHVSUH�QXPHOH�ILúLHUXOXL– Modul de acces – Un SRLQWHU�F�WUH�XUP�WRUXO�FDUDFWHU�GLQ�stream

$FHVWH� LQIRUPD LL� VXQW� QHFHVDUH� VLVWHPXOXL� GH� RSHUDUH�� GLQ� SXQFWXO� GH� YHGHUH� DOprogramatorului accesul se face prin intermediul unui SRLQWHU� OD�DFHDVW�� VWUXFWXU��QXPLWSRLQWHU�OD�ILúLHU��ILOH�pointer).

Un program poate avea unul sau mai multe streamuri deschise simultan. Unul din câmpurile din FILE este indicatorul dH�SR]L LH�vQ�ILúLHU�FDUH�VH�UHIHU��OD

XUP�WRUXO�RFWHW�FH�YD�IL�VFULV���FLWLW��vQ���GLQ�ILúLHU�'XS�� ILHFDUH� RSHUD LH� 5�:� 6�2� PRGLILF�� DXWRPDW� DFHVW� pointer. Accesarea se

SRDWH� IDFH� GLUHFW� GDU� DFHVW� FD]� SDUWLFXODU�� GH� FDUH� WUHEXLH� LQXW� VHDPD�� YD� IDFH� FD� XQSURJUDP�V��QX�PDL�ILH�SRUWDELO�

$WHQ LH: A nu se confunda SRLQWHUXO� OD� ILúLHU� FX� LQGLFDWRUXO� GH� SR]L LH� ����8QXO� HVWH� XQpointer altul este un deplasament.

Streamuri standard ([LVW�� �� streamuri care sunt deschise automat pentru fiecare program. Ele se

numesc stdin, stdout, VWGHUU��ÌQ�PRG�QRUPDO�HOH�VH�UHIHU��OD�WHUPLQDO�GDU�PXOWH�VLVWHPH�GHoperare permit redirectarea lor. ([���XQ�PHVDM�GH�HURDUH�SRDWH�IL�VFULV�vQWU�XQ�ILúLHU�vQ�ORF�GH�WHUPLQDO��SULQWI���úL�scanf() folosesc streamurile VWGLQ�úL�VWGRXW��$FHVWH�IXQ LL�SRW�IL�IRORVLWH�SHQWUX�OXFUXO�FX�ILúLHUHOHprin redirectarea VWGLQ� úL� VWGRXW� F�WUH� UHVSHFWLYHOH� ILúLHUH� IRORVLQG� BBBBBB� �� 'DU� PDLFRPRG�HVWH�IRORVLUHD�IXQF LLORU�IVFDQI���úL�fprintf().

)RUPDW�WH[W�úL�IRUPDW�ELQDU6

Datele pot fi accesate îQ� XQXO� GLQ� FHOH� GRX�� IRUPDWH� VWDQGDUG� $16,� ±WH[W� VDXbinar. Un VWUHDP�GH�WLS�WH[W�FRQVW��GLQWU�R�VHULH�GH�OLQLL��XQGH�ILHFDUH�OLQLH�HVWH�WHUPLQDW�FX�XQ�FDUDFWHU�GH�VDOW�OD�OLQLH�QRX��µ\n’. 2ULFH�6�2�SRDWH�DYHD�DOW��SROLWLF��GH�VWRFDUH�D� OLQLLORU�SH�GLVF�GHFL� WHUPLQDWRUXO� µ\n’ nu este obligatoriu. Dar din punct de vedere al programatorului este ca mai sus, restul fiind DVFXQV�GH�FRPSLODWRUXO�&��7RWXúL�OXFUXO�vQ�PRG�WH[W�QX�JDUDQWHD]��R�SRUWDELOLWDWH�WRWDO��D

100

Page 102: Introducere in c++

Introducere in programare

XQXL�SURJUDP��ÌQ�IRUPDWXO�ELQDU�FRPSLODWRUXO�QX�UHDOL]HD]��QLFL�R�LQWHUSUHWDUH�D�EL LORU���vLFLWHúWH�VDX�VFULH�H[DFW�FXP�DSDU�

Bufferarea (folosirea unei zone de memorie ca tampon) 'HRDUHFH�FRPSDUDWLY�FX�PHPRULD��GLVSR]LWLYHOH�GH�VWRFDUH�vQ�PDV��VXQW�H[WUHP�GH

vQFHWH�VH� vQFHDUF�� UHGXFHUHD�QXP�UXOXL�GH�RSHUD LL�GH� ,�2�FX�GLVFXO��Bufferarea este cea PDL�VLPSO��PHWRG��SHQWUX�D�UHDOL]D�DFHDVWD�

Un EXIIHU� HVWH� R� ]RQ�� XQGH� VXQW� VWRFDWH� WHPSRUDU� GDWHOH� vQDLQWH� GH� D� IL� WULPLVHF�WUH�GHVWLQD LD�ORU�ILQDO���7RDWH�6�2�IRORVHVF�buffere pentru a citi/scrie din dispozitivele ,�2�QXPDL�F���vQ�DFHVW�FD]��EXIIHUXO�DUH�GLPHQVLXQH�IL[���'H�RELFHL��HVWH�GH������VDX�����RFWH L��$FHVW�OXFUX�vQVHDPQ��F���FKLDU�GDF��VH�GRUHúWH�FLWLUHD�XQXL�VLQJXU�FDUDFWHU�GLQWU�XQILúLHU��6�2�FLWHúWH�WRW�EORFXO�FDUH�FRQ LQH�UHVSHFWLYXO�FDUDFWHU�

%LEOLRWHFD�&�FRQ LQH�XQ�VWUDW�DGL LRQDO�GH�bufferare care apare în 2 forme: – buffere de linie – buffere de bloc

La EXIIHUDUHD�vQ�OLQLH��VLVWHPXO�VWRFKHD]��FDUDFWHUHOH�S�Q��OD�SULPXO�µ\n’ sau S�Q�

se umple EXIIHUXO� úL� DSRL� WULPLWH� vQWUHDJD� OLQLH� OD� 6�2�SHQWUX� SURFHVDUH��$FHVW� OXFUX� VHvQW�PSO��úL�F�QG�FLWHVF�GDWH�GH�OD�WHUPLQDO��

La EXIIHUDUHD� vQ� EORF�� VLVWHPXO� VWRFKHD]�� FDUDFWHUHOH� S�Q�� F�QG� DFHO� EORF� HVWHumplut.

Implicit VWUHDPXULOH� ,�2� UHODWLY� OD� ILúLHUH� VXQW�bufferate în bloc, iar cele care se UHIHU��OD�WHUPLQDO�stdin, stdout) sunt bufferate în linie.

'H�DVHPHQHD�ELEOLRWHFD�&�LQFOXGH�úL�XQ�PDQDJHU�GH�EXIIHU�FDUH� LQH�DFHO�buffer F�WPDL�PXOW�SRVLELO�vQ�PHPRULH��GHFL�GDF��VH�DFFHVHD]��DFHHDúL�SRU LXQH�GLQWU�XQ�stream de PDL�PXOWH�RUL��H[LVW��PDUL�úDQVH�FD�V��VH�HYLWH�DFFHVXO�OD�GLVSR]LWLYXO�GH�VWRFDUH�

$WHQ LH��$FHVW�OXFUX�SRDWH�FUHD�SUREOHPH�GH�FRQVLVWHQ ���GDF��ILúLHUXO�HVWH�IRORVLWîn comun de mai multe procese. Pentru sincronizarea între procese este nevoie de:

– scrierea în ASM a propriilor IXQF LL– IRORVLUHD�IXQF LLORU�VSHFLILFH�6�2�SH�FDUH�VH�OXFUHD]�

În ambele moduri de bufferare, bufferul poate fi golit la cerere cu ajutorul lui fflush() WULPL �QG��DVWIHO���GDWHOH�GLQ�HO�OD�GHVWLQD LD�ORU�

'HúL� DFHVW� PRG� GH� bufferare este mai eficient GHF�W� SURFHVDUHD� LQGLYLGXDO�� DILHF�UXL�FDUDFWHU��H[LVW��FD]XUL� vQ�FDUH�QH�GHUDQMHD]�� �� úL�DQXPH�F�QG�VH�GRUHúWH�H[SOLFLWSURFHVDUHD�LQVWDQWDQHH�D�XQXL�FDUDFWHU�ILH�OD�LQWUDUH�ILH�OD�LHúLUH��&HO�PDL�VLPSOX�H[HPSOXeste atunci F�QG�VH�GRUHúWH�SURFHVDUHD�FDUDFWHUHORU�LQWURGXVH�GH�OD�.%'�I�U��D�PDL�DúWHSWD‘\n’.

C permite modificarea memoriei bufferului chiar la acest nivel,tocmai pentru a SXWHD�UH]ROYD�úL�SUREOHPHOH�GH�DFHVW�WLS�

&LWLUHD�úL�VFULHUHD�GDWHORU6

2�GDW��FH�V�D�GHVFKLV�XQ�ILúLHU�VH�YD�IRORVL�SRLQWHUXO�OD�ILúLHU�SHQWUX�D�SXWHD�UHDOL]DRSHUD LL�GH�VFULHUH�FLWLUH��([LVW����QLYHOH�GH�JUDQXODULWDWH��ILQH H��

1. la nivel de caracter – FkWH�XQ�FDUDFWHU�RGDW�

2. la nivel de linie − FkWH�R�OLQLH�RGDW�

101

Page 103: Introducere in c++

Introducere in programare

3. la nivel de bloc – FkWH�XQ�EORF�RGDW�

2� UHJXO�� FDUH� VH� DSOLF�� OD� WRDWH� QLYHOHOH� GH� ,�2� HVWH� DFHHD� F�� QX� SRW� FLWL� GLQWU�XQVWUHDP�úL�DSRL�VFULX�vQ�HO�I�U��D�DSHOD�fseek() , rewind() sau IIOXVK����/D�IHO�úL�vQ�FD]XOLQYHUV�� $FHVW� OXFUX� HVWH� QHFHVDU� SHQWUX� F�� WUHEXLH� JROLW� EXIIHUXO� vQDLQWHD� RULF�UHLRSHUD LLL��SHQWUX�D�HYLWD�SUREOHPHOH�GH�LQFRQVLVWHQ ��

1. Lucrul la nivel de caracter JHWF���������PDFUR���FLWHúWH�XQ�FDUDFWHUputc() - macro , scrie un caracter de la stream-ul implicit

fgetc() fputc() identice cu anterioarele lor dar sunt ILQF LL

'HúL�SULPHOH�VXQW�PDFURXUL�GHFL�PXOW�PDL�UDSLGH�SRW�H[LVWD�SUREOHPH�GH�ex:

putc(‘x’, fp[M��@���V�DU�SXWHD�V��QX�PHDUJ��FRUHFW�

'H� DFHHD� HVWH� LQGLFDW� F�� DWXQFL� F�QG� VH� OXFUHD]�� FD� vQ� H[HPSOX� V�� IRORVLP� fputc() sau fgetc();

2. La nivel de linie )XQF LL�IJHWV���úL�ISXWV���úL�VH�VSHFLILF��SDUDPHWUL

s -> pointer la tabloul de caractere n -> nr. Maxim de caractere ce vor fi procesate stream -> VWUHDPXO�FX�FDUH�VH�OXFUHD]�

3. La nivel de bloc Un bloc poate fi J�QGLW�FD�XQ�WDEORX���&�QG�FLWLP�VFULHP�vQ�EORF�WUHEXLH�V��VSHFLILF�P�DW�WQXP�UXO�GH�HOHPHQWH�DO�EORFXOXL�F�W�úL�GLPHQVLXQHD�ILHF�UXL�HOHPHQW�

)XQF LL��IUHDG���úL�IZULWH���FX�XUP�WRULL�SDUDPHWUL�ptr -> SRLQWHU�F�WUH�WDEORXO�FH�VWRFKHD]��FDUDFWHUHOHVL]H��!�P�ULPH�QU��GH�RFWH L�DO�WLSXOXL�GH�GDW��IRORVLW��UHFRPDQG�sizeof() pentru

portabilitatea programului QXP�U�HOHPHQWH�FH�WUHEXLH�SURFHVDWpointer la stream

I/O Nebufferat

$QWHULRU� DP� PHQ LRQDW� IDSWXO� F�� H[LVW�� VLWXD LL� vQ� FDUH� bufferarea datelor nu GHUDQMHD]���([HPSOX�FODVLF�HVWH�HGLWRUXO�GH�WH[W��F�QG�VH�VFULH�XQ�WH[W�úL�VH�DSDV�� WDVWHOHde navigare prin el.

Pentru a elimina buferarea pentru stdin se poate folosi fie setbuf(), fie setvbuf(). Setbuf(stdin,NULL) sau stat= setvbuf (stdin, NULL, IONBUF, O).

102

Page 104: Introducere in c++

Introducere in programare

$FFHVXO�DOHDWRU�vQWU�XQ�ILúLHU6

(VWH�DVLJXUDW�GH�IXQF LD�IVHHN�FDUH�SR]L LRQHD]��SRLQWHUXO�OD�ILúLHU�OD�XQ�GHSODVDPHQW�GRULWID ��GH�vQFHSXWXO�DFHVWXLD�Ftell UHWXUQHD]��YDORDUHD�SRLQWHUXOXL�GH�ILúLHU�

103

Page 105: Introducere in c++

Introducere in programare

CAPITOLUL 12

����)DFLOLW� L�GH�QLYHO�VF�]XW�DOH�OLPEDMXOXL�&

5XWLQHOH� XWLOL]DWH� GH� VLVWHPXO� GH� RSHUDUH� 06�'26� SHQWUX� WUDWDUHD� RSHUD LLORU� GHLQWUDUH�VDX�LHúLUH�úL�JHVWLXQHD�UHVXUVHORU�VLVWHPXOXL�SRW�IL�DSHODWH��úL�GLQWU-un program scris intr-un limbaj GH��QLYHO��vQDOW��FXP��HVWH�&��/LPEDMXO�SHUPLWH�úL�OHJDUHD�FX�PRGXOH�VFULVHin limbaj de asamblare.

Rutinele DOS sunt apelate prin întreruperi software. Întreruperea 21h (INT 21h) este serviciul pentru apelul IXQF LLORU�'26��Pentru apelul unei IXQF LL�aceste registre (nu toate) se SUHJ�WHVF�FX�GLYHUVH�valori:

AH con LQH�QXP�UXO�IXQF LHL AL con LQH�QXP�UXO�VXEIXQF LHL��GDF��este cazul)

Celelalte registre se vQFDUF��diferit de la caz la caz. Se JHQHUHD]���apoi, întreruperea INT 21H.

Similar cu IXQF LLOH�'26�VH�SRW�realiza úL�apeluri de IXQF LL�BIOS preg�WLQG�registrele intr-un mod convenabil. Sunt astfel accesibile majoritatea IDFLOLW� LORU� pe care programatorul le avea numai la nivelul limbajului de asamblare. Vom descrie in continuare câteva din func LLOH� � cuprinse in biblioteca C ale F�URUprototipuri se afla in fisierele dos.h, bios.h, setjmp.h, process.h.

12.1. )XQF LL�pentru acces direct la memorie

unsigned FP_OFF(farpointer);unsigned FP_SEG(farpointer);void far *MK_FP(unsigned seg, unsigned ofs);

Aceste trei macrouri sunt folosite pentru a returna:

-offsetul unui pointer far;-segmentul unui pointer far;-un pointer far cu segmentul seg si ofsetul ofs.

Exemplu:

#include <dos.h> #include <stdio.h>

void main(void) {char far *ptr;

unsigned seg,off;

ptr=MK_FP(0x8000,0); seg=FP_SEG(ptr);

104

Page 106: Introducere in c++

Introducere in programare

off=FP_OFF(ptr); printf("farptr=%Fp, segment=%04x, offset=%04x\n",

ptr,seg,off); }

int peek(unsigned segment,unsigned offset);char peekb(unsigned segment,unsigned offset);void poke(unsigned segment,unsigned offset,int value);void pokeb(unsigned segment,unsigned offset,char value);

Cele patru IXQF LL�GH�mai sus UHDOL]HD]� citirea (peek, peekb) respectiv scrierea (poke, pokeb) unui cuvânt sau caracter de la sau la adresa de memorie segment:offset.

12.2. )XQF LL�pentru accesul la porturile de intrare sau LHúLUH�

int inp(int portid);int outp(int portid, int value);int inport(int portid);unsigned char inportb(int portid);void outport(int portid,int value);void outportb(int portid,unsigned char value);

Toate cele úDVH� IXQF LL� GH�mai sus au drept scop citirea (inport) respectiv scrierea (outport) a unui cuvânt, sau caracter (inp, inportb, outp, outportb) de la, sau la portul de intrare sau LHúLUH�specificat prin variabila portid.

������)XQF LL�SHQWUX�JHVWLXQHD�LQWHUYDOHORU�GH�WLPS

void delay(unsigned miliseconds);

)XQF LD�VXVSHQG��H[HFX LD�programului în intervalul specificat (în milisecunde).

void sleep(unsigned seconds);

)XQF ia suspend��H[HFX LD�programului curent pe durata seconds secunde.

12.4. Functii pentru controlul sistemului de întreruperi

void disable(void);

$FHDVW��IXQF LH�LQYDOLGHD]��întreruperile, O�VkQG�YDOLG� numai întreruperea QHPDVFDELO�NMI. Este echivalent���FX��LQVWUXF LXQHD�&/,�GLQ�limbajul de asamblare.

void enable(void);

105

Page 107: Introducere in c++

Introducere in programare

$FHDVW�� IXQF LH� YDOLGHD]�� întreruperile oferind programatorului controlul flexibil al întreruperilor hardware. Este echivalent��FX�LQVWUXF LXQHD�67,�GLQ�limbajul de asamblare.

12.5. )XQF LL�pentru alocarea memoriei (prin DOS)

int allocmem(unsigned size, unsigned *segp);

)XQF LD�DSHOHD]��'26��[���pentru a aloca o zon�� �GH�memorie OLEHU��GH�dimensiune size*16 RFWH L��Ea UHWXUQHD]��adresa de segment a blocului alocat în ORFD LD� SRLQWDW�� GHsegp. În caz de succes UHWXUQHD]�� -1. În caz contrar se VHWHD]�� Bdoserrno si variabila JOREDO��errno.

int setblock(unsigned segx, unsigned newsize);

$FHVW�� IXQF LH�PRGLILF��dimensiunea DORFDW��unui bloc de memorie, de la adresa de segment segx U�PkQkQG�DORFD L�doar newsize*16 RFWH L��În caz de succes IXQF LD�UHWXUQHD]�-1. )XQF ia face apelul DOS 0x4A.

int freemem(unsigned segx); )XQF LD� HOLEHUHD]��un bloc de memorie alocat cu allocmem. Parametrul segx este

adresa de segment UHWXUQDW� de aceasta din XUP���În caz de succes IXQF ia UHWXUQHD]��-1. )XQF LD�face apelul DOS 0x44.

12.6. Întreruperi software. Accesul la registrele procesorului.

void geninterrupt(int intr_num);

Acest macrou JHQHUHD]� întreruperea software intr_num. Starea registrelor GXS� apel depinde de întreruperea DSHODW�. Accesul la registrele procesorului se face prin variabilele pseudoregistru prezentate mai jos:

_AX, _BX, _CX, _DX, _SI, _DI, _BP, _SP, _DS, _CS, _ES, _SS, _FLAGS

care le copie starea. Aceste variabile trebuie folosite cu precau LH��6H�UHFRPDQG��D�VH�evita alterarea variabilelor _DS, _SS, _CS si _SP. În orice caz, se va XUP�UL�codul generat úL�VHva depana cu DWHQ LH�programul.

int int86(int intno, union REGS *inregs, union REGS *outregs);

Aceasta IXQF LH� H[HFXW�� întreruperea software VSHFLILFDW� în intno. Înaintea H[HFX LHLîntreruperii, se copie în registre valorile specificate în reuniunea SRLQWDW��GH� inregs. 'XS�

execu LH��valorile registrelor sunt copiate în outregs; de asemenea, úL�starea bitului Carry în x.cflag (1=de obicei LQGLF���R�eroare). De notat F��outregs poate pointa pe DFHHDúL�structura ca inregs. )XQF ia UHWXUQHD]��valoarea din AX la terminarea întreruperii. Reuniunea REGS este GHILQLW��astfel:

106

Page 108: Introducere in c++

Introducere in programare

struct WORDREGS { unsigned int ax,bx,cx,dx,si,di,cflag,flags;};

struct BYTEREGS { unsigned char al,ah,bl,bh,cl,ch,dl,dh;};

union REGS { struct WORDREGS x; struct BYTEREGS h; };

int int86x(int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs);

Aceasta IXQF LH� este LGHQWLF�� FD� IXQF LXQH� cu cea DQWHULRDU��� SHUPL kQG� în plus folosirea registrelor de segment pentru transmiterea de parametri (VDOYHD]��si UHVWDXUHD]�automat ES si DS). 5HWXUQHD]��DFHOHDúL�valori ca int86. Structura SREGS este GHILQLW�astfel:

struct SREGS { unsigned int es; unsigned int cs; unsigned int ss; unsigned int ds;};

void intr(int intno, struct REGPACK *preg);

)XQF LD�UHDOL]HD]��R�DOWHUQDWLY��pentru LQWHUID area cu întreruperile software, QXP�UXOîntreruperii fiind specificat în variabila intno. Structura REGPACK este GHILQLW��astfel:

struct REGPACK { unsigned r_ax,r_bx,r_cx,r_dx; unsigned r_bp,r_si,r_di,r_ds,r_es,r_flag;};

void segread(struct SREGS *segp);

)XQF ia returneaz��în structura pointata de segp valorile registrelor de segment.

������)XQF LL�SHQWUX�FLWLUHD�VDX�PRGLILFDUHD�YHFWRULORU�GH�vQWUHUXSHUH

void interrupt (*getvect(int interruptno))();

Fiecare procesor din familia 80x86 include un set de vectori de întrerupere, QXPHURWD Lde la 0 la 255. Valoarea pe 4 RFWH L�GLQ�fiecare vector este o DGUHV��reprezentând adresa rutinei de tratarea a întreruperii. getvect FLWHúWH� valoarea vectorului de întrerupere specificat de interruptno úL�UHWXUQHD]��DFHDVW��valoare ca un pointer far la o UXWLQ��GH�tratare a întreruperii.

107

Page 109: Introducere in c++

Introducere in programare

void setvect(int interruptno, void interrupt (*isr)()); $FHDVW�� IXQF LH�VHWHD]��valoarea vectorului de întrerupere specificat prin interruptno

cu o valoare QRX��� isr, care este un pointer far la adresa altei IXQF LL� GH� tratare a întreruperii. Obligatoriu aceasta QRX��IXQF LH�trebuie sa fie GHFODUDW� de tip interrupt (cu modificatorul interrupt). Exemplu:

#include <stdio.h>#include <dos.h>

void interrupt (*oldvect)();void interrupt get_out();void capture_prtscr(void interrupt (*func)());

int looping=1;

void main(void) {

puts("Pentru a termina apasati <Shift><PrtSc>");capture_prtscr(get_out);

while(looping); puts("Succes");

}

/*noua rutina de tratare intrerupere*/ void interrupt get_out()

{ setvect(5,oldfunc); looping=0;

}

void capture_prtscr(void interrupt (*func)()) {

oldfunc=getvect(5); setvect(5,func);

}

12.8. Apeluri de IXQF LL DOS.

int bdos(int dosfun, unsigned dosdx, unsigned dosal);

)XUQL]HD]��accesul direct la multe IXQF LL�'26���&D�argumente:

dosfun = QXP�UXO�IXQF LHL�'26�dosdx = valoarea registrului DX; dosal = valoarea registrului AL.

108

Page 110: Introducere in c++

Introducere in programare

)XQF ia UHWXUQHD]��valoarea registrului AX. Exemplu:

#include <stdio.h>#include <dos.h>

char current_drive(void);

main() {

printf("DRIVERUL %c\n",current_drive()); getch();

}

char current_drive(void) {char drive;

drive = bdos(0x19,0,0); return ('A'+drive);

}

int bdosptr(int dosfun, void *argument, unsigned dosal);

)XQF LD�IXUQL]HD]��accesul la IXQF LLOH�'26�prin argumentele sale:

dosfun = QXP�UXO�IXQF LHL�'26�argument = pointer cerut de IXQF LH�LQ�registrul DS:DX;dosal = valoarea registrului AL.

5HWXUQHD]��DFHOHDúL�valori ca bdos.

int intdos(union REGS *inregs, union REGS *outregs); )XQF LD� DSHOHD]�� întreruperea INT 21h pentru a realiza func LD� sistem VSHFLILF�� în

registrul AH (inregs->h.ah). Structura outregs este DFWXDOL]DW��setându-se in caz de eroare indicatorul carry.

int intdosx(union REGS *inregs, union REGS *outregs,struct SREGS *segregs);

Este VLPLODU�� IXQF LHL� intdos, SHUPL kQG� în plus úL� transmiterea parametrilor prin registrele de segment (DS,ES). Aceste registre sunt restaurate la terminarea apelului. Exemplu:

#include <stdio.h>#include <dos.h>

109

Page 111: Introducere in c++

Introducere in programare

int delete_file(char far *filename);

main() {

int err; err=delete_file("Temp1.$$$");

printf("S-a sters fisierul Temp1.$$$:%s\n",(!err)?"DA":"NU"); }

int delete_file(char far *filename) {

union REGS regs; struct SREGS sregs; int ret;

regs.h.ah=0x41; /*delete file*/ regs.x.dx=FP_OFF(filename); sregs.ds=FP_SEG(filename); ret=intdos(&regs,&regs,&sregs); return(regs.x.cflag?ret:0);

}

������)XQF LL�SHQWUX�WHUPLQDUHD�VDX�ODQVDUHD�SURJUDPHORU

void exec(int code); )XQF LD� GHWHUPLQ�� terminarea QRUPDO�� D�programului úi furnizarea unui cod de retur

(code) la LHúLUH�� Acest cod poate fi interpretat ulterior în ILúLHUHOH de comenzi. Este HFKLYDOHQW��FX�IXQF ia DOS 0x4C.

void abort(void);

3URYRDF��terminarea DQRUPDO��D�programului, cu DILúarea unui mesaj FRUHVSXQ]�WRU�pe consola sistemului.

void keep(unsigned char status,unsigned size);

Apelul acestei IXQF LL� permite terminarea programului curent cu transmiterea VW�ULLprocesului S�ULQWH��în variabila status, precum úL�setarea lui ca program TSR (Terminate and Stay Resident) de dimensiune size paragrafe. Restul memoriei este eliberat. )XQF ia este VLPLODU��apelului DOS 0x31.

int system(const char *cmd);

/DQVHD]��&200$1'�&20�úL�H[HFXW�� R� FRPDQG�� LQWHUQ���sau o comand�� H[WHUQ��sau un ILúLHU�GH�comenzi. ùirul de caractere, folosit ca parametru, FRQ LQH�numele complet al comenzii úL�toate argumentele necesare H[HFX LHL�

110

Page 112: Introducere in c++

Introducere in programare

unsigned getpsp(void);

)XQF LD�UHWXUQHD]��VHJPHQWXO�SUHIL[��3URJUDP�Segment Prefix) al programului curent. (D� UHDOL]HD]�� IXQFWLD�DOS 0x62. ÌQ� � ORFXO� DFHVWHL� IXQF LL� vQV�� VH� SRDWH� IRORVL� � GLUHFWvaloarea variabilei globale _psp.

int bioskey(int cmd);

Pot fi executate serviciile specifice INT 16h. &X� � DMXWRUXO� DFHVWHL� IXQF LL� VH�SRW� FLWLFRGXULOH�GH�VFDQDUH��FRGXULOH��H[WLQVH�DOH�WDVWHORU��VH�SRW�FLWL�FDUDFWHUH�I�U�� �H[WUDJHUH��GLQbufferul tastaturii, sau se poate afla starea tastelor speciale (SHIFT, CTRL, ALT):

- FPG ��FLWHúWH�FRGXO�GH�VFDQDUH�VL�VFRDWH�FDUDFWHUXO�GLQ�EXIIHUXO�WDVWDWXULL��GDF��QX�PDLVXQW�FDUDFWHUH��VH�DúWHDSW��DS�VDUHD�XQHL�QRL�WDVWH�

- FPG ��FLWHúWH�FRGXO�GH�VFDQDUH�I�U��D�VFRDWH�FDUDFWHUXO�GLQ�EXIIHUXO�WDVWDWXULL��GDF��QXPDL�VXQW�FDUDFWHUH��IXQF LD�UHWXUQHD]����

- FPG ��FLWHúWH��%,26�6KLIW�6WDWH���VWDUHD�WDVWHORU�VSHFLDOH�6+,)7��&75/��$/7��

int biosprint(int cmd, int abyte, int lpt_port);

5HXQHúWH� WRDWH� IXQF LLOH� VSHFLILFH� ,17���K� �DFFHVXO� OD� SRUWXO� SDUDOHO� /37[[���)XQF LDpermite FLWLUHD��VW�ULL���WULPLWHUHD��XQXL�FDUDFWHU��DE\WH���VDX�LQL LDOL]DUHD�LPSULPDQWHL�- FPG �� WULPLWH� FDUDFWHUXO� DE\WH� OD� SRUWXO� SDUDOHO� FX� QXP�UXO� GDW� GH� OSWBSRUW� �� /37��1=LPT2, etc). - FPG ��LQL LDOL]HD]��LPSULPDQWD��FRQHFWDW��SH�OSWBSRUW��FX�YDORULOH�GLQ�DE\WH�- FPG ��FLWHúWH�VWDUHD�LPSULPDQWHL�FRQHFWDWH�SH�OSWBSRUW�

int bioscom(int cmd, int abyte, int com_port);

5HXQHúte toate IXQF LLOH�specifice INT 14h (accesul la portul serial COMxx). )XQF LDpermite citirea VW�ULL���trimiterea unui caracter (abyte) pe FRPXQLFD LH��citirea unui caracter de pe FRPXQLFD LH��sau setarea unor controale úL�parametri de IXQF LRQDUH�

- cmd=0 LQL LDOL]DUHD� portului de FRPXQLFD LH� com_port (0=COM1, 1=COM2) cu parametrii GD L�GH�abyte.

- cmd=1 trimite caracterul abyte pe linia de FRPXQLFD LH�GDWD�GH�com_port. - cmd=2 FLWHúWH�caracterul UHFHS LRQDW�pe linia de FRPXQLFD LH�GDW��GH�com_port. - cmd=3 citeste starea portului de FRPXQLFD LH�com_port.

long biostime(int cmd, long newtime);

)XQF LD�permite citirea (cmd=0), sau modificarea (cmd=1) timpului sistem, exprimat în incrementi de 55ms, de la pornirea sistemului.

111

Page 113: Introducere in c++

Introducere in programare

������'H]YROWDUHD�GH�FRG�vQWU�XQ�OLPEDM�PL[W��&�úL�$60�

(VWH�VSHFLILF��PHGLXOXL�GH�GH]YROWDUH�%RUODQG�&�FDUH�RIHU��SRVLELOLWDWHD� LQVHU�ULL�GHFRG�$60�vQ�SURJUDPH�VXUV��&��)LHFDUH�LQVWUXF LXQH�$60�WUHEXLH�SUHFHGDW��GH�FXYkQWXOcheie DVP�VDX�WUHEXLH�LQFOXV��vQWU�XQ�EORF�GH�WLS�$60��GH�IRUPD�

asm { ��LQVWUXF LXQL�$60

}

Acest model de dezvoltare este foarte comod, deoarece vizibilitatea obiectelor definite în &�VH�H[WLQGH�úL�DVXSUD�EORFXULORU�$60��$VWIHO�SXWHP�IRORVL�QXPH�GH�SDUDPHWUL�IRUPDOL�DLIXQF LLORU�HWF��� I�U��D�PDL�VFULH�FDUDFWHUXO�³B´� vQ� ID D�QXPHORU� UHVSHFWLYH��6H�HYLW��DVWIHOVHFYHQ HOH�GH�LQWUDUH�úL�UHYHQLUH�GLQ�IXQF LL��FDUH�VXQW�UHDOL]DWH�DXWRPDW�GH�FRPSLODWRUXO�&�

([LVW��UHVWULF LL�GH�XWLOL]DUH�D�HWLFKHWHORU��0DL�SUHFLV��HWLFKHWHOH�WUHEXLH�GHILQLWH�FDetichete C, deci în afara blocurilor ASM.

&D� úL� OD� GH]YROWDUHD� SH� PRGXOH� VHSDUDWH�� SURJUDPDWRUXO� WUHEXLH� V�� JHVWLRQH]Hexplicit modelele de memorie, în sesnsul definirii precise a adreselor far sau near. Pentru DFHDVWD��VH�XWLOL]HD]��PRGHOHOH�GH�PHPRULH�&�úL�VDX�FXYLQWHOH�FKHLH�QHDU�úL�IDU�

3HQWUX�H[HPSOLILFDUH� V��GLVFXW�P�LPSOHPHQWDUHD�XQHL� IXQF LL�GH�F�XWDUH� IRORVLQGDWkW�PHWRGD�FODVLF��FkW�úL�PHWRGD�FX�FRG�GH�DVDPEODUH�

)XQF LD�UHVSHFWLY��VFULV��vQ�&�HVWH�SUH]HQWDW��PDL�MRV�

int my_search(int *x, size_t n, int y) {

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

if(y==x[i])return i ;return –1; // nu am J�VLW�vQWUHJXO�\��vQ�WDEORXO�[

}

)XQF LD�UHVFULV��IRORVLQG�OLPEDM�GH�DVDPEODUH��

int my_search(int near *x, size_t n, int y) {

asm { push si push cx

push dx mov si,x mov cx,n jcxz nu mov dx,x sub si,2 }

112

Page 114: Introducere in c++

Introducere in programare

et: asm {add si,2cmp [si], dxloopnz etjnz nu

mov ax,nsub ax,cxdec axjmp m_end

}

}

nu: asm mov ax,-1

m_end:asm {pop dxpop cxpop si}

return _AX}

6H� REVHUY�� F�� LQGLFHOH� J�VLW� D� IRVW� FDOFXODW� FD� GLIHUHQ �� GLQWUH� GLPHQVLXQHD� Q� DWDEORXOXL� úL� YDORDUHD� LQFUHPHQWDW�� D� FRQWRUXOXL� &[� OD� LHúLUHD� GLQ� EXFO��� 5HYHQLUHD� GLQEXFO�� VH� IDFH� IRORVLQG� YDORDUHD� VWRFDW�� vQ� UHJLVWUXO� $;� OD� FDUH� DP� DFFHV� SULQpreudoregistrul _AX.

0HWRGD� DUH� GH]DYDQWDMXO� VF�GHULL� SRUWDELOLW� LL� OD� recompilarea sub alte compilatoare.

12.11 Tratarea dispozitivelor bus asincrone6�� SUHVXSXQHP� F�� VH� GH]YROWD� XQ� FRG� SHQWUX� FRQWUROXO� XQXL� GLVSR]LWLY� KDUGZDUH� �XQdriver de exemplu). Acest lucru este realizat prin depunerea de diverse valori în registre hard la adrese absolute ( existente fizic independent de modul virtual de manipulare a PHPRULHL�SXV�OD�GLVSR]L LH�GH�62������6��SUHVXSXQHP�F��DFHVW�GLVSR]LWLY�DUH���UHJLVWUH��ILHFDUH�fiecare având lungimea de 16 EL L�OD�DGUHVH�GH�PHPRULH�FUHVF�WRDUH����0HWRGD�FODVLF��GH�DFFHVDUH�HVWH�FD�PDL�MRV�:

struct devregs { unsigned short csr // control si stare unsigned short data // portul de date }

113

Page 115: Introducere in c++

Introducere in programare

#define ER 0x1 #define RDY 0x2 #define RES 0x4

// adresa absoluta a dispozitivului

#define DEVADR (( struct dev regs*)ox ffff0000

// QXP�UXO�GH�GLVSR]LWLYH�GH�DFHVW�WLS�GLQ�VLVWHP

#define NDEVS 4

// R�IXQF LH�FH�FLWHúWH�XQ�RFWHW�GLQ�GLVSR]LWLYXO�Q�IRORVLQG�SURWRFRO�GH�WLS�busy/wait.

$úWHDSW��pâna când apare semnal de RDY (ready) sau ER(error); dac��QX�HVWH�HURDUH�úLun UHDG\� DFWLY� vQVHDPQ�� F�� SRW� FLWL� XQ� RFWHW�� DOWIHO� YD� DQXOD� HURDUHD� GDU� YRL� vQWRDUFH0xffff.

unsigned int read_dev ( unsigned devno) { unsigned devregs *dvp=DEVADR + devno; if ( devno >= NDEVS ) return (0xffff)

���QX�H[LVW��XQ�DVHPHQHD�GLVSR]LWLY�vQ�ORW while (( dvp -> csr& (RDY | ER )) == 0);

// EXFOD�YHFWRU�FDUH�DúWHDSW��SULPD�XQD�GLQ�FRQGL LL�HVWH�YDOLGDW� if dvp -> csr & ER // a fot eroare

{dvp -> csr= RES // resetreturn 0xffff;}

return (dvp-> data) & 0xffff; // nu �D�IRVW�HURDUH�úL�GLVSR]LWLYXO�H�JDWD�V��HPLW��RFWHWXO }

114

Page 116: Introducere in c++

Introducere in programare

CAPITOLUL 13

13. Preprocesorul

2ULFH�SURJUDP�&��vQ�ID]D�GH�FRPSLODUH�WUHFH�vQWkL�SULQWU�R�SUHSURFHVDUH�úL�DELD�DSRLVH�YD�JHQHUD� FRGXO�HFKLYDOHQW� vQ� DVDPEODUH��3UHSURFHVRUXO� GXS�� FXP� vL� VSXQH� úL� QXPHOH�IDFH�SULPD�SURFHVDUH�DVXSUD�VXUVHL�&�FRQIRUP�GLUHFWLYHORU�LQFOXVH�GLUHFW�VDX�LQGLUHFW��SULQLQFOXGHUH�GH�ELOLRWHFL��GH�F�WUH�SURJUDPDWRU�

'LUHFWLYHOH�SUHSURFHVRUXOXL�VXQW�OLQLL�VXUV��DO�F�URU�SULP�FDUDFWHU�GLIHULW�GH�VSD LLOHDOEH�HVWH����GLH]���/LQLLOH�FDUH�FRQ LQ�GLUHFWLYH�DOH�SUHSURFHVRUXOXL�VXQW�HOLPLQDWH�GLQ�WH[WXOVXUV��vQDLQWH�FD�DFHVWD�V��ILH�FLWLW�GH�FRPSLODWRU��3UHSURFHVRUXO�vQORFXLHúWH�RULFH�VHFYHQ ��GHVSD LL�DOEH��LQFOXVLY�FRPHQWDULL��FX�XQ�VLQJXU�VSD LX�

������'LUHFWLYD�QXO�

2� OLQLH� FDUH� FRQ LQH� QXPDL� FDUDFWHUXO� �� �vQ� DIDU�� GH� HYHQWXDOHOH� VSD LL� DOEH�� HVWHLJQRUDW��GH�SUHSURFHVRU�

13.2. Directivele #GHILQH�úL��undef

�����GHILQH��LGHQWLILFDWRU�>�>�����OLVWDBDUJXPHQWH�����@�FRUS�@�������XQGHI��LGHQWLILFDWRU

'LUHFWLYD� �GHILQH� GHILQHúWH� R� PDFURLQVWUXF LXQH�� 'DF�� PDFURLQVWUXF LXQHD� DUHDUJXPHQWH�� SDUDQWH]D� VWkQJ�� WUHEXLH� V�� DSDU�� vQ� GHILQL LH� OLSLW�� GH� QXPHOH� GHILQLW�$UJXPHQWHOH�VH�VHSDU��SULQ�YLUJXO���&RUSXO�PDFURGHILQL LHL�QX�SRDWH�DYHD�PDL�PXOW�GH�ROLQLH�VXUV���VH�SRDWH�FRQWLQXD�OLQLD�FX�?��

ÌQ�ID]D�GH�SUHSURFHVDUH��DSDUL LD�QXPHOXL�GH�PDFUR�vQ�WH[WXO�VXUV���HYHQWXDO�XUPDW�GHR� OLVW�� GH� DUJXPHQWH� DFWXDOH� LQ� SDUDQWH]H�� HVWH� vQORFXLW�� FX� FRUSXO� GH� PDFUR�� vQ� FDUHSDUDPHWULL�IRUPDOL�DX�IRVW�vQORFXL L�FX�WH[WXO�SDUDPHWULORU�DFWXDOL�

'XS�� VXEVWLWX LH�� WH[WXO�RE LQXW�HVWH�FLWLW�GLQ�QRX��SkQ�� FkQG�QX�PDL� VXQW�QHFHVDUHVXEVWLWX LL��GLUHFWLYHOH�SUHSURFHVRUXOXL�QX�VXQW�UHFXQRVFXWH�vQ�WH[WXO�SURGXV�SULQ�H[SDQGDUHDXQHL�PDFURLQVWUXF LXQL���1XPHOH�GH�PDFUR�QX� VXQW� UHFXQRVFXWH� vQ� úLUXUL� GH� FDUDFWHUH� VDXFRPHQWDULL��2�PDFURLQVWUXF LXQH�QX�VH�SRDWH�DSHOD�UHFXUVLY�

/D�DSHOXO�XQHL�PDFUR�FX�DUJXPHQWH��QXPDL�YLUJXOHOH�GH�SH�SULPXO�QLYHO�VXQW�OXDWH�FDVHSDUDWRDUH� GH� DUJXPHQWH� �QX� úL� FHOH� FDUH� DSDU� vQ� SDUDQWH]H� VDX� vQWUH� DSRVWURIH� VDXJKLOLPHOH��

ÌQ�FRUSXO�XQXL�PDFUR�VH�SRW� IRORVL�XUP�WRULL�RSHUDWRUL�FDUH�QX� DF LRQHD]��GHFkW� vQID]D�GH�SUHSURFHVDUH�

� �����FDUH�GLVSDUH�WRWDO��QHU�PkQvQG�QLFL�P�FDU�XQ�VSD LX��úL� �� � FDUH�� SODVDW� LQ� ID D� XQXL� DUJXPHQW� IRUPDO�� vO� vQORFXLHúWH� FX� DUJXPHQWXO� DFWXDO

3/$6$7�Ì1�*+,/,0(/(�

'LUHFWLYD��XQGHI�úWHUJH�R�PDFURGHILQL LH�GLQ�WDEHOD�GH�PDFURGHILQL LL�

115

Page 117: Introducere in c++

Introducere in programare

13.3. Directiva #include

#include <nume_fisier> #include "nume_fisier" #include nume_macro

1XPHOH� GH� PDFUR� SkQ�� OD� XUP�� WUHEXLH� V�� VH� H[SDQGH]H� vQ� FHYD� GH� IRUPD�QXPHBILVLHU!� VDX� �QXPHBILVLHU��� (IHFWXO� GLUHFWLYHL� FRQVW�� GLQ� LQVHUDUHD� vQ� XQLWDWHD� GHFRPSLODUH��vQ�ORFXO�GLUHFWLYHL��LQFOXGH��D�WH[WXOXL�GLQ�ILúLHUXO�UHVSHFWLY��7H[WXO�LQVHUDW�SRDWHFRQ LQH�úL�HO�GLUHFWLYH�GH�SUHSURFHVDUH��LQFOXVLY�GLUHFWLYD��LQFOXGH�

'DF��vQ�QXPHOH�GH�ILúLHU�DSDUH�úL�R�FDOH�GH�DFFHV��VH�YD�F�XWD�QXPDL�DFROR��$OWIHO�GDF��V�D�IRORVLW�IRUPD�FX�JKLOLPHOH��VH�FDXW��vQ�GLUHFWRUXO�FXUHQW��8UPHD]���GDF��WRW�QX�V�DORFDOL]DW�ILúLHUXO��V��VH�FDXWH�SH�UkQG�vQ�GLUHFWRDUHOH�GLQ�OLVWD�GDW��OD�LQVWDODUH��VDX�SH�OLQLD�GHFRPDQG���VDX�vQ�PHGLXO�LQWHJUDW�

������'LUHFWLYH�GH�FRPSLODUH�FRQGL LRQDW�

"#" "LI��H[SUHVLHBFRQVWDQW�B� [ text_1 ][ "#" "HOLI��H[SUHVLHBFRQVWDQW� B� text_2 ]...[ "#" "else" text_else ] "#" "endif"

'DF��H[SUHVLDB��QX�HVWH�QXO���DWXQFL�VH�FRPSLOHD]�� WH[WB���DOWIHO��GDF�� H[SUHVLDB�QX�HVWH�QXO���DWXQFL�VH�FRPSLOHD]��WH[WB���HWF���DOWIHO��GDF��HVWH�SUH]HQW��GLUHFWLYD��HOVH��VHFRPSLOHD]��WH[WBHOVH��'LUHFWLYHOH�GH�FRPSLODUH�FRQGL LRQDW��SRW�IL�vPEULFDWH�

([SUHVLD�FRQGL LRQDO��SRDWH�FRQ LQH�RSHUDWRUXO�GH�SUHSURFHVDUH�GHILQHG��$FHVWD�DUHXQ�DUJXPHQW��XQ�QXPH�GH�PDFUR�HYHQWXDO�vQ�SDUDQWH]H��9DORDUHD�H[SUHVLHL�GHILQHG��QXPH�HVWH���GDFD�QXPHOH�HVWH�GHILQLW�FX��GHILQHG��VDX���GDF��QX�H[LVW��R�PDFUR�FX�DFHO�QXPH��8QLGHQWLILFDWRU�GHILQLW�FX�XQ�FRUS�GH�PDFUR�YLG�VH�FRQVLGHU��GHILQLW�

#LIGHI�QXPH�������������HFKLYDOHQW��FX��������if defined (nume)#LIQGHI�QXPH������������HFKLYDOHQW��FX��������if !defined (nume)

13.5. Directiva #line

#line QXP�UBOLQLH�>�nume_fisier"]

(IHFWXO�GLUHFWLYHL�FRQVW��vQ�DFHHD�F��vQ�ILúLHUXO�SURGXV�GH��&��SUHSURFHVRUXO�&�RIHULWFD�XWLOLWDU��VDX�LQ�PHVDMHOH�GH�HURDUH��HWF��OLQLLOH�FDUH�XUPHD]��GXS���OLQH�YRU�IL�UHIHULWH�FD�úLFXP�DU�vQFHSH�FX�OLQLD�QXP�UXO�QXP�UBOLQLH�úL�DU�YHQL�GLQ�ILúLHUXO�QXPHBILúLHU�

116

Page 118: Introducere in c++

Introducere in programare

'H� RELFHL� GLUHFWLYD� �OLQH� QX� DSDUH� vQ� SURJUDPHOH� VFULVH� FX� PkQD�� FL� PDL� DOHV� vQSURJUDPHOH�JHQHUDWH�DXWRPDW��'DF��QXPHOH�GH�ILúLHU�OLSVHúWH�HO�U�PkQH�FHO�YDODELO�vQ�DFHOPRPHQW�

ÌQ�DUJXPHQWHOH�GLUHFWLYHL��OLQH��PDFURLQVWUXF LXQLOH�VXQW�H[SDQGDWH��FD�úL�OD�GLUHFWLYD�LQFOXGH�

13.6. Directiva #error

#error mesaj

(IHFWXO�HL�FRQVW��vQ�JHQHUDUHD�XQXL�PHVDM�GH�HURDUH�GH�IRUPD

(UURU��QXPHBILúLHU�OLQH�QXP�UBOLQLH���(UURU�GLUHFWLYH���PHVDM

&RPSLODUHD� XQHL� GLUHFWLYH� �HUURU� RSUHúWH� FRPSLODUHD�� 'H� RELFHL� DSDUH� vQ� ILúLHUHOH� DQWHW�LQFOXVH�FX�GLUHFWLYD��LQFOXGH���vQ�FDGUXO�XQHL�VHFYHQ H�FRPSLODWH�FRQGL LRQDW��'H�H[HPSOX�

#if !defined ( __cplusplus ) #error Nu se poate compila decit in C++#endif

13.7. Directivele #pragma

#pragma argsused

�����3RDWH� DSDUH� QXPDL� vQ� DIDUD� XQHL� IXQF LL�� $UH� FD� HIHFW� VXSULPDUHD� PHVDMXOXL� GHDYHUWLVPHQW� UHIHULWRU� OD� QHXWLOL]DUHD� XQXL� SDUDPHWUX� IRUPDO�� GDU� QXPDL� vQ� SULPD� IXQF LHFRPSLODW��GXS��DSDUL LD�GLUHFWLYHL�

#pragma exit nume_functie [prioritate] #pragma startup nume_functie [prioritate]

�����,QVHUHD]�� IXQF LLOH�FLWDWH� �GHILQLWH� FD�YRLG�QXPHBIXQFWLH� �YRLG���SHQWUX�DSHO� vQDLQWH�GHPDLQ� �UHVSHFWLY�GXS�� WHUPLQDUHD� IXQF LHL�PDLQ���3ULRULWDWHD� HVWH�XQ� vQWUHJ�GH� OD��� OD�����)XQF LLOH� FX� SULRULW� L� PDL� PLFL� YRU� IL� DSHODWH� PDL� GHYUHPH� OD� ODQVDUH� úL� PDL� WkU]LX� ODWHUPLQDUHD�H[HFX LHL��3ULRULW� LOH�GH�OD���OD����VXQW�UH]HUYDWH�SHQWUX�UXWLQHOH�GLQ�ELEOLRWHFLOH7XUER�� 'DF�� SULRULWDWHD� OLSVHúWH�� VH� LD� ����� )XQF LLOH� FLWDWH� WUHEXLH� GHFODUDWH� vQDLQWHDDSDUL LHL�GLUHFWLYHL�

�SUDJPD�LQOLQH

�����$QXQ �� FRPSLODWRUXO� F�� vQ� SURJUDP� H[LVW�� FRG� LQOLQH� vQ� OLPEDM� GH� DVDPEODUH�� (VWHHFKLYDOHQW�� FX� RS LXQHD� GH� FRPSLODUH� �%�� ÌQWkOQLUHD� GLUHFWLYHL� �SUDJPD� LQOLQH�� GDF�RS LXQHD��%�QX�HVWH�DFWLY���DUH�FD�HIHFW�UHODQVDUHD�FRPSLO�ULL�FX�RS LXQHD��%�DFWLYDW��

#pragma option

117

Page 119: Introducere in c++

Introducere in programare

#pragma option optiune [,optiune]...

�����2S LXQL� GH� FRPSLODUH� FDUH� SRW� DSDUH� vQ� �SUDJPD� RSWLRQ� 180$,� Ì1$,17(� '()2/26,5($� 818,� 180(� '(� 0$&52� &$5(� Ì1&(3(� &8� '28�� /,1,8�(� '(68%/,1,(5(��6$8�Ì1$,17(�'(�$3$5,�,$�35,08/8,�$720�/(;,&$/�&�

�(�QXPHBDVDPEORU�I�RS LXQHBIORWDQW��L�QXP�UBFDUDFWHUHBVHPQLILFDWLYH�P�PRGHOBPHPRULH�Q�GLUHFWRUBLHúLUH�R�QXPHBILVLHUBLHúLUH�X����JHQHUDUH�GH�OLQLX H�GH�VXEOLQLHUH�SHQWUX�JOREDOL��]�QXPHBVHJPHQW

2S LXQL�FDUH�SRW�DSDUH�QXPDL�GDF��DSDU�vQ�DIDUD�RULF�URU�GHFODUD LL�GH�RELHFWH�VDX�IXQF LL�

������LQVWUXF LXQL�������������LQVWUXF LXQL��������D����FRQWUROXO�DOLQLHULL��II���FRQWURO�³UDSLG´�DO�RSHUD LLORU�vQ�YLUJXOD�PRELO���*����RSWLPL]DUH�SHQWUX�YLWH]���N����FRQWURO�QRUPDO�DO�VWLYHL��1����FRQWUROXO�VWLYHL��2����FRQWUROXO�RSWLPL]�ULL��S����VHFYHQ ��GH�DSHO�3DVFDO��U����DORFDUH�UHJLVWUH��Y����FRQWURO�SHQWUX�GHSDQDUH��\����FRQWURO�DVXSUD�QXPHUHORU�GH�OLQLL�vQ�FRGXO�RELHFW�

2S LXQL�FDUH�SRW�IL�GDWH�RULXQGH�VL�DX�HIHFW�LPHGLDW�

�$����VHWXO�GH�FXYLQWH�FKHLH��&����FRPHQWDULL�vPEULFDWH��G����FRQWRSLUHD�úLUXULORU�GXSOLFDWH��J�QXP�U����RSULUH�GXS��QXP�U�DYHUWLVPHQWH��M�QXP�U����RSULUH�GXS��QXP�U�HURUL��.����WLSXO�FKDU�HVWH�I�U��VHPQ�

#pragma warn#pragma warn +xxx $YHUWLVPHQWHOH�[[[�VXQW�DFWLYDWH#pragma warn -xxx $YHUWLVPHQWHOH�[[[�VXQW�LQDFWLYDWH

'XS��FXP�DP�Y�]XW�SUHSURFHVRUXO�SHUPLWH�úL�GHFODUDUHD�DQXPLWRU�]RQH�GH�FRG�DVWIHO�vQFkWHOH�VD�ILH�FRPSLODWH�vQ�DQXPLWH�FRQGL LL�FXP�DU�IL��

ΠQX�VXQW�GHILQLWH�DQXPLWH�FRQVWDQWH�VDX�YDULDELOH�ORFDOHΠFRGXO�HVWH�XWLO��GDU�SHQWUX�GHSDQDUH

118

Page 120: Introducere in c++

Introducere in programare

ΠGRUHVF�V��LPSLHGLF�IRORVLUHD�XQRU�IXQF LL�GLQ�ELEOLRWHF��vQWUX�FkW�VXQW�UHVFULVH�GHRULFLQH�VXSUDvQF�UFDUHD�IXQF LLORU�

6LQWD[D�JHQHUDOD��

([HPSOX����SHQWUX�KHDGHUH�SHUVRQDOH�V��]LFHP�ILúLHUXO�WHVW�K

#ifndef __TEST #define __TEST ....... corpul ....... #endif

Sau pentru depanare #if DEBUG

printf(“.......”); #endif

Sau daca nu am definite ni;te valori speciale #ifndef M_PI #define M_PI 3.1415.... #endif.

119

Page 121: Introducere in c++

Introducere in programare

6FXUW� SUH]HQWDUH D UHJXOLORU GH ED]� GH FDUH WUHEXLH LQXW FRQW OD SURLHFWDUHD XQHL DSSOLFD LL

6WLO GH SURJUDPDUH QHUHFRPDQGDW

3XQHUHD GHFODUD LLORU FX H[WHUQ vQ ILúLHUXO�F

$FFHVXO FRPXQ OD GDWH vQWUH IXQF LL UHDOL]DW SULQ

YDULDELOH JOREDOH

)RORVLUHD GH GDWH JOREDOH F�QG QX H FD]XO

&UHDUHD D QXPHURDVH IXQF LL FX VFRSXUL VSHFLDOH

8WLOL]DUHD QXPHORU GH ILúLHU VDX YDULDELO� I�U�

OHJ�WXU� FX FRQWH[WXO

)RORVLUHD FRQVWDQWH QXPHULFH

)RORVLUHD JRWR

6FULUHD GH FRG UHGXQGDQW

6WLO UHFRPDQGDW

5HIHULULOH OD IXQF LH�YDULDELO� H[WHUQ

6H SXQ vQ ILúLHUHOH KHDGHU�K

$FFHVXO FRPXQ VH IDFH SULQ WUDQVIHU GH DUJXPHQW

6H UH]ROY� SULQ GHFODUDUH GH WLS VWDWLF

&UHHDUHD XQRU SULPLWLYH JHQHUDOH

)RORVLUHD GH QXPH FDUH VH DSURSLH GH SVHXGRFRG

6H GHILQHVF QLúWH QXPH SW� DFHOH YDORUL

)RORVLUHD VWUXFWXULORU GH FRQWURO D IOX[XULORU

6H IRORVHVF IXQF LL vQ FD]XO vQ FDUH VH REVHUY�

DFHODúL OXFUX

120

Administrator
Cross-Out
Administrator
Inserted Text
˙
Page 122: Introducere in c++

Introducere in programare

// calculul randamentului si puterii pentru un fir conectat la un generator de cc#include <stdio.h>#include <conio.h>#include <math.h>

void main(void){// incepe zona declarare variabile

int e,ri,l,s,imax;float r,pext,eta,i,g;//sfirsit zona declarare variabile

// incepe zona citire date de intrareclrscr();printf("\nTensiunea gen. E=");scanf("%d",&e);printf("\nRez. interna gen. ri=");scanf("%d",&ri);printf("\nLungimea fir L=");scanf("%d",&l);printf("\nSectiunea fir S=");scanf("%d",&s);printf("\nCurentul maxim admis Imax=");scanf("%d",&imax);printf("\nConductivitatea gama=");scanf("%f",&g);// sfirsit zona citire date de intrare

//incepe zona de calcul conform algoritmului r=l/(g*s); i=e/(r+ri); pext=r*sqrt(i); eta=pext/(e*i);

// sfirsit zona de calcul conform algoritmului

//incepe zona afisarii rezultatelorprintf("\nPext=%3.8f",pext);printf("\nRandament=%3.8f",eta);if(i<imax) printf("\nI=%3.8f < Imax",i);else printf("\nI=%2.8f >Imax",i);//sfirsit zona afisarii rezultatelor

printf("\nApasati orice tasta ca sa terminati programul");getch();}

121

Page 123: Introducere in c++

Introducere in programare

/********************************************************************** ************************************************************************ **************************** ///exemplu de calcul a unei functii cu mai multe ramuri;#include <stdio.h>#include <conio.h>

void main(void){int x,f;

clrscr();printf("x=");scanf("%d",&x);

if(x<-5)f=x-1;else

if(x==-5)f=-6; else f=2*x+4;

printf("\nf(x)=%d",f);getch();}/********************************************************************** ************************************************************************ **************************** /// repetarea de un numar specificat de ori a calcului// pentr o functie_multipla;#include <stdio.h>#include <conio.h>

void main(void){int x,n,f,i;

beginclrscr;printf("Numarul de repetari a calculului functiei f n=");scanf("%d",&n);

for(i:=0;i<n;i++){clrscr();printf("x=");scanf("%d",&x);

122

Page 124: Introducere in c++

Introducere in programare

if(x<-5)f=x-1; else

if(x==-5)f=-6; else f=2*x+4;

printf("\nf(x)=%d",f);}getch();}

/********************************************************************** ************************************************************************ **************************** /// exemplu de lucru cu sirurile de caractere#include <stdio.h>#include <conio.h>#include <string.h>

void main(void){char s[10],a,c;int i,b,d;

clrscr();printf("Introduceti sirul de prelucrat s=");gets(s);

a=s[0];b=strlen(s);c=s[b-1];

if ((a>='A')&&(a <='Z')) { s[0]+=32; s[b-1]+=32; }

else { s[0]-=32; s[b-1]-=32; }

printf("\nprima litera %c",a); printf("\nultima litera %c",c); printf("\nsirul prelucrat %s",s); getch();

123

Page 125: Introducere in c++

Introducere in programare

//obs programul nu ia in calcul situatia in care in sir de litere apar si cifre}/********************************************************************** ************************************************************************ **************************** /// program care implementeaza functia de stergere a unui caracter#include <stdio.h>#include <conio.h>#include <string.h>

int strdel(char s[], int pos);void main(void){char s[20];int n;clrscr();printf("Dati sirul s=");gets(s);printf("dati pozitia de eliminare ");scanf("%d",&n);if(strdel(s,n))puts("Eroare, pozitia este in afara sirului ");else printf("\n Noul sir este=%s",s);getch();}int strdel(char s[], int pos){if(pos>=strlen(s))return -1;// eroare de apelarepos--;while(s[pos]!='\0')

{s[pos]=s[pos+1];pos++;}

return 0;// functia s-a terminat corect}/********************************************************************** ************************************************************************ **************************** /// program care implementeaza functia de stergere a unui caracter// existenta in pascal#include <stdio.h>#include <conio.h>#include <string.h>

int strdelpas(char s[], int pos, int nrcars);void main(void)

124

Page 126: Introducere in c++

Introducere in programare

{char s[20];int n,nrc;clrscr();printf("Dati sirul s=");gets(s);printf("dati pozitia de eliminare ");scanf("%d",&n);printf("dati nr de caractere ce se vor sterge ");scanf("%d",&nrc);

if(strdelpas(s,n,nrc))puts("Eroare, pozitia este in afara sirului");else printf("\n Noul sir este=%s",s);getch();}int strdelpas(char s[], int pos, int nrcars){if(pos>=strlen(s))return -1;// eroare de apelarepos--;while(s[pos]!='\0')

{s[pos]=s[pos+nrcars];pos++;}

return 0;// functia s-a terminat corect}/********************************************************************** ************************************************************************ **************************** ///program pentru eliminarea caracterelor indentice;#include <stdio.h>#include <conio.h>#include <string.h>void main(void){char s[25];int i=0,j,n,pos;

clrscr();printf("Introduceti sirul de prelucrat s=");scanf("%s",s);

n=strlen(s);

do{

125

Page 127: Introducere in c++

Introducere in programare

j=i+1;do{

if(s[i]==s[j]) {

pos=j; while(s[pos]!='\0')

{ s[pos]=s[pos+1];

pos++; }

n--; }

else j++; }while (j<n);

i++; }while (i<n);

printf("Sirul rezultat este s=%s",s);getch();}/********************************************************************** ************************************************************************ **************************** ///program pentru eliminarea caracterelor indentice folosind functii;// transfer de parametri in vechea maniera de programare#include <stdio.h>#include <conio.h>#include <string.h>

int strdel(char s[], int pos);void main(void){char s[25];int i=0,j,n,pos;

clrscr();printf("Introduceti sirul de prelucrat s=");scanf("%s",s);

n=strlen(s);

do{

126

Page 128: Introducere in c++

Introducere in programare

j=i+1;do{

if(s[i]==s[j] ){strdel(s,j);n--;}

else j++; }while (j<n);

i++; }while (i<n);

printf("Sirul rezultat este s=%s",s);getch();}int strdel(char s[], int pos){if(pos>=strlen(s))return -1;// eroare de apelarewhile(s[pos]!='\0')

{s[pos]=s[pos+1];pos++;}

return 0;// functia s-a terminat corect}/********************************************************************** ************************************************************************ **************************** /

// program pentru ordonarea unui vector// algoritm FOARTE lent pentru valori mari ale lui n#include <stdio.h>#include <conio.h>

void main(void){float v[100],temp;int i,n,j;

clrscr();

printf("Introduceti dimensiunea vectorului n=");scanf("%d",&n);

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

127

Page 129: Introducere in c++

Introducere in programare

{ printf("V[%d]=",i) ; scanf("%f",&v[i]);}

for(i=0;i<n-1;i++) for(j=i+1;j<n;j++)

if(v[i]>v[j] ) { temp=v[i]; v[i]=v[j] ; v[j]=temp; } ;

puts("Vectorul ordonat"); for(i=0;i<n;i++)

printf("%3.3f ",v[i]); } /*********************************************************************** ************************************************************************ ***************************/

//program pentru extragerea unui vector ce contine//elementele mai mari ca 1 dintr-un matrice;// se foloseste validarea input-ului#include <stdio.h>#include <conio.h>

void main(void){int n,m,i,j,k;float a[10][10], b[100];

clrscr();printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);

while ((n<0)||(n>10)||(m<0)||(m>10)) { puts("0<m,n<10"); printf("n="); scanf("%d",&n); printf("m="); scanf("%d",&m); }

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

128

Page 130: Introducere in c++

Introducere in programare

for(j=0;j<m;j++){printf("m[%d,%d]=",i,j);scanf("%f",&a[i][j]) ;} ;

k=0; for(i=0;i<n;i++)

for(j=0;j<m;j++) if(a[i][j]>1)

b[k++]=a[i][j]; if(!k)puts("\nMatricea nu are elemente > 1"); else

{puts("vectorul elem. >1 este:");for(i=0;i<k;i++)printf("%3.2f ",b[i]);} ;

getch();}

/********************************************************************** ************************************************************************ **************************** ///program inmutire matrici Amn x Bpq;#include <stdio.h>#include <conio.h>

void main(void){int m,n,p,q,i,j,k;float a[10][10], b[10][10],c[10][10];

clrscr(); printf("m="); scanf("%d",&m); printf("n="); scanf("%d",&n); printf("p="); scanf("%d",&p); printf("q="); scanf("%d",&q);

while (n!=p) { puts("Date eronate, n trebuie sa fie egal cu p"); printf("m="); scanf("%d",&m);

129

Page 131: Introducere in c++

Introducere in programare

printf("n=");scanf("%d",&n);printf("p=");scanf("%d",&p);printf("q=");scanf("%d",&q);

} for(i=0;i<m;i++)

for(j=0;j<n;j++){printf("a[%d,%d]=",i,j);scanf("%f",&a[i][j]) ;} ;

for(i=0;i<p;i++) for(j=0;j<q;j++)

{printf("b[%d,%d]=",i,j);scanf("%f",&b[i][j]) ;} ;

for(i=0;i<m;i++) for(j=0;j<q;j++)

{c[i][j]=0 ;for(k=0;k<n;k++)

c[i][j]=c[i][j]+a[i][k]*b[k][j]; };

clrscr(); puts("Matricea C=A*B este "); for(i=0;i<m;i++)

{for(j=0;j<q;j++)

printf("%3.2f ",c[i][j]) ;puts("");}

getch();}

/********************************************************************** ************************************************************************ **************************** /// program care generaza vectorul ce contine// suma elem de pe liniile unei matrici;#include <stdio.h>#include <conio.h>

130

Page 132: Introducere in c++

Introducere in programare

void main(void){int n,m,i,j,k;float a[10][10], b[10],s;

clrscr();printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);

for(i=0;i<n;i++)for(j=0;j<m;j++)

{printf("m[%d,%d]=",i,j);scanf("%f",&a[i][j]) ;} ;

for(j=0;j<m;j++) {

s=0;for(i=0;i<n;i++)

s+=a[i][j]; b[j]=s;

} for(i=0;i<n;i++)

{ for(j=0;j<m;j++)

printf("%3.2f ",a[i][j]) ;puts("");}

puts("Vectorul continind suma elementelor pe fiecare linie este"); for(i=0;i<m;i++)

printf("%3.2f ",b[i]); getch(); } /*********************************************************************** ************************************************************************ ***************************/ // program exemplu de functie; #include <stdio.h> #include <conio.h> #include <math.h>

131

Page 133: Introducere in c++

Introducere in programare

#include <values.h>

float rezolv(float x, float y);

void main(void){float a,b,x;clrscr();printf("a=");scanf("%f",&a);printf("b=");scanf("%f",&b);x=rezolv(a,b);printf("\nSolutia este %8.3f",x);getch();}

float rezolv(float x, float y){float fx,fy,fc,c,eps;fx=x*sqrt(x)+5*sqrt(x)+2*x-7;fy=y*sqrt(y)+5*sqrt(y)+2*y-7;if(fx*fy<0) return MAXDOUBLE; // semnalez o eroare de calculdo{

c=(x+y)/2;fc=c*sqrt(c)+5*sqrt(c)+2*c-7;if (fx*fc>0 )

{ fx=fc; x=c; }

else y=c; eps=abs(x-y);

}while(eps>0.001); return c; }

/*program care realizeaza sumarea a doi vectori de aceeasidimensiune, versiune cu for

* /#include <stdio.h>#include <conio.h>

132

Page 134: Introducere in c++

Introducere in programare

void main(void){int i,n;int x[20],y[20],z[20];

clrscr();printf("n=");scanf("%d",&n);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

for(i=0;i<n;i++) { printf("y[%d]=",i); scanf("%d",&y[i]); }

for(i=0;i<n;i++) { z[i]=x[i]+y[i]; }

for(i=0;i<n;i++) { printf("\nz[%d]=%d",i,z[i]); }

getch();}/********************************************************************** ************************************************************************ **************************** /

/*program care realizeaza sumarea a doi vectori de aceeasidimensiune, versiune cu while

* /#include <stdio.h>#include <conio.h>

void main(void){int i,n;int x[20],y[20],z[20];

133

Page 135: Introducere in c++

Introducere in programare

clrscr(); printf("n="); scanf("%d",&n);

i=0; while(i<n)

{ printf("x[%d]=",i); scanf("%d",&x[i]); i++; }

i=0; while(i<n)

{ printf("y[%d]=",i); scanf("%d",&y[i]); i++; }

i=0; while(i<n)

{ z[i]=x[i]+y[i]; i++; }

i=0; while(i<n)

{ printf("\nz[%d]=%d",i,z[i]); i++; }

getch();}/********************************************************************** ************************************************************************ **************************** //*program care realizeaza sumarea a doi vectori de aceeasidimensiune, versiune cu do..whileObservatie nu este o echivalnta perfecta a for.. pentru ca testul fiindposterior bucla se executa macar o data !

* /#include <stdio.h>#include <conio.h>

134

Page 136: Introducere in c++

Introducere in programare

void main(void){int i,n;int x[20],y[20],z[20];

clrscr();printf("n=");scanf("%d",&n);

i=0;do{

printf("x[%d]=",i); scanf("%d",&x[i]);

}while(i++<n); i=0; do {

printf("y[%d]=",i); scanf("%d",&y[i]);

}while(i++<n); i=0; do {

z[i]=x[i]+y[i]; }while(i++<n); i=0; do {

printf("\nz[%d]=%d",i,z[i]); }while(i++<n); getch(); } /*********************************************************************** ************************************************************************ ***************************/ /* program care realizeaza scaderea a doi vectori de aceeasi dimensiune, versiune cu for

* /#include <stdio.h>#include <conio.h>

void main(void){

135

Page 137: Introducere in c++

Introducere in programare

int i,n; int x[20],y[20],z[20];

clrscr(); printf("n="); scanf("%d",&n);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

for(i=0;i<n;i++) { printf("y[%d]=",i); scanf("%d",&y[i]); }

for(i=0;i<n;i++) { z[i]=x[i]-y[i]; }

for(i=0;i<n;i++) { printf("\nz[%d]=%d",i,z[i]); }

getch();}/********************************************************************** ************************************************************************ **************************** //*program care realizeaza produsul scalar a doi vectori de aceeasidimensiune, versiune cu for

* /#include <stdio.h>#include <conio.h>

void main(void){int i,n,s=0;int x[20],y[20];

clrscr();printf("n=");

136

Page 138: Introducere in c++

Introducere in programare

scanf("%d",&n);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

for(i=0;i<n;i++) { printf("y[%d]=",i); scanf("%d",&y[i]); }

for(i=0;i<n;i++) { s+=x[i]*y[i]; }

printf("\nProd scalar este %d",s);getch();}

/********************************************************************** ************************************************************************ **************************** //*program care realizeaza ordonarea descrecatoareprin "Buble sort" a unui vector de aceeasi dimensiune, versiune cu for

* /#include <stdio.h>#include <conio.h>

void main(void){int i,j,n,t;int x[20];

clrscr();printf("n=");scanf("%d",&n);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

137

Page 139: Introducere in c++

Introducere in programare

for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++)

{ if(x[i]<x[j] )

{t=x[i] ;x[i]=x[j] ;x[j]=t ;}

} }

printf("Vectorul ordonat descrescator este: \n"); for(i=0;i<n-1;i++)

{printf(" %d",x[i]) ;}

getch();}/********************************************************************** ************************************************************************ **************************** //*program care realizeaza ordonarea crescatoareprin "Buble sort" a unui vector de aceeasi dimensiune, versiune cu for

* /#include <stdio.h>#include <conio.h>

void main(void){int i,j,n,t;int x[20];

clrscr();printf("n=");scanf("%d",&n);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

for(i=0;i<n-1;i++) {

138

Page 140: Introducere in c++

Introducere in programare

for(j=i+1;j<n;j++){if(x[i]>x[j] )

{t=x[i] ;x[i]=x[j] ;x[j]=t ;}

} }

printf("Vectorul ordonat crescator este: \n"); for(i=0;i<n-1;i++)

{printf(" %d",x[i]) ;}

getch();}/********************************************************************** ************************************************************************ **************************** //*program care realizeaza sumarea a doi vectori dedimensiuni diferite, evident se considera completat cu zero vectorul dedimensiune mai mica

* /#include <stdio.h>#include <conio.h>

void main(void){int i,n,m,dim;int x[20],y[20],z[20];

clrscr();printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

139

Page 141: Introducere in c++

Introducere in programare

for(i=0;i<m;i++) { printf("y[%d]=",i); scanf("%d",&y[i]); }

if(n<m){for(i=0;i<m;i++)

{if(i<n)z[i]=x[i]+y[i] ;else z[i]=y[i];}

dim=m; } else { for(i=0;i<n;i++)

{if(i<m)z[i]=x[i]+y[i] ;else z[i]=x[i];}

dim=n; }

for(i=0;i<dim;i++) { printf("\nz[%d]=%d",i,z[i]); }

getch();}/********************************************************************** ************************************************************************ **************************** //*program care realizeaza scaderea a doi vectori dedimensiuni diferite, evident se considera completat cu zero vectorul dedimensiune mai mica

* /#include <stdio.h>#include <conio.h>

void main(void){int i,n,m,dim;int x[20],y[20],z[20];

140

Page 142: Introducere in c++

Introducere in programare

clrscr(); printf("n="); scanf("%d",&n); printf("m="); scanf("%d",&m);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

for(i=0;i<m;i++) { printf("y[%d]=",i); scanf("%d",&y[i]); }

if(n<m){for(i=0;i<m;i++)

{if(i<n)z[i]=x[i]-y[i] ;else z[i]=-y[i];}

dim=m; } else { for(i=0;i<n;i++)

{if(i<m)z[i]=x[i]-y[i] ;else z[i]=x[i];}

dim=n; }

for(i=0;i<dim;i++) { printf("\nz[%d]=%d",i,z[i]); }

getch();}/********************************************************************** ************************************************************************ **************************** /

141

Page 143: Introducere in c++

Introducere in programare

/*program care realizeaza cautarea unei valori intr-un vector,si anunta prima pozitie pe care este gasita valoarea* /#include <stdio.h>#include <conio.h>

void main(void){int i,n,t,val,pos=-1;int x[20];

clrscr();printf("n=");scanf("%d",&n);

for(i=0;i<n;i++) { printf("x[%d]=",i); scanf("%d",&x[i]); }

printf("Valoarea de cautat:");scanf("%d",&val);i=0;while((x[i]!=val)&&(i++<n)) ;if(i<n)pos=i;if(pos>0)printf("El se gaseste in pozitia a %d a",pos+1);else puts("Nu s-a gasit in vector");getch();}

142

Page 144: Introducere in c++

Introducere in programare

Seturi de teme

SET1 1. Scrie L�XQ�SURJUDP�FDUH�DILúHD]��XQ�PHVDM�2. 6FULH L�R�IXQF LH�FDUH�vQWRDUFH�DUJXPHQWXO�OD�SXWHUHD�D�WUHLD�FX�SURWRWLSXO

int pw3 ( int num ).X= pw3 (y) <-> x = y 3.

3. Scrie L�R�IXQF LH�FH�FDOFXOHD]�� x = y 4 IRORVLQG�IXQF LD�sqrt(double x) 4. Scrie L�XQ�SURJUDP�FDUH�FLWHúWH�GH�OD�WDVWDWXU��XQ�vQWUHJ�úL-l afiúHD]��OD�SXWHUHD�Dtreia prin folosirea pw3. 5. 6FULH L�vQ�SVHXGRFRG�XQ�SURJUDP�FDUH�HOLPLQ��FRPHQWDULLOH�dintr-o surs��&�6. (OLPLQD L�HURULOH�GLQ�XUP�WRDUHD�VHFYHQ �:

main (x) { VFDQI���´�&k L�J�QGDFL�VXQW�"“ , nr_g�QGDFL�); printf ( “ Acest program are %d probleme “, nr_g�QGDFL��ú}

SET2 1. Atunci câQG�VH�DILúHD]��R�YDULDELO��GH�WLS�float sau double folosind specificatorul

de format %f c�WH�FLIUH�]HFLPDOH�VXQW�DILúate ? printf() realizeaz��URWXQMLUHD�VDX�WUXQFKLHUHD�YDORULL�DILúDWH�2. 6FULH L�XQ�SURJUDP�FH�FRQ LQH�XUP�WRDUHOH�GHFODUD LL:

char c;int j;float f;

úL�DILúHD]��DGUHVD�ILHF�UHL�YDULDELOH��9RUEL L�GHVSUH�PRGXO�vQ�FDUH�FRPSLODWRUXODORF��PHPRULH�SHQWUX�YDULDELOH�

3. 6FULH L�HFKLYDOHQWXO�RFWDO��KH[D��]HFLPDO�SHQWUX�XUP�WRDUHOH�QXPHUH�ELQDUH: 1. 0001.0010 2. 0110.0101 3. 0110.1011 4. 1011.1011 5. 0011.1111 6. 0101.1111 7. 0000.0010.0110.0100

în ambele cazuri F�QG�VH�FRQVLGHU��F��QXPHUHOH�VXQW�GDWH�vQa) FRPSOHPHQW�ID ��GH��b) FRPSOHPHQW�ID ��GH��

4. 6FULH L�GHFODUD LLOH�SHQWUX�XUP�WRDUHOH�IRUPDWH:a) ÌQWUHJ�OXQJ�I�U��VHPQb) 9DULDELO��vQ�YLUJXO��PRELO��FX�GXEO��SUHFL]LHc) Pointer la caracterd) &DUDFWHU�LQL LDOL]DW�FX�‘x ’e) Func ie H[WHUQ��ce întoarce un întreg I�U��semn

143

Page 145: Introducere in c++

Introducere in programare

5. 6FULH L�XUP�WRDUHOH�QXPHUH�vQ�ELQDU�vQ�FRPSOHPHQW�ID ��GH���VDX�vQ�FRPSOHPHQWID ��GH��: 1, -1, 255, 256, 511, 512, 513, 128, -128, 0xFF, 0x7F.

SET3 1. )LHFDUH�FDOFXODWRU�HVWH�OLPLWDW�vQ�SUHFL]LD�PD[LP��FDUH�R�SRDWH�IRORVL�vQUHSUH]HQWDUHD�QXPHUHORU�vQ�YLUJXO��PRELO���'LQ�DFHVW�PRWLY�SHQWUX�XQ�HSVLORQVXILFLHQW�GH�PLF�XUP�WRDUHD�H[SUHVLH�YD�IL�DGHY�UDW��

1.0 = 1.0 + epsS��VH�VFULH�XQ�SURJUDP�FDUH�J�VHúWH�FHD�PDL�PDUH�YDORDUH�SHQWUX�eps pe computerul pe care e executat. Obs.: aceast��YDORDUH�GLIHU��vQWUH�IORDW�úL�GRXEOH��6H�YD�IRORVL�����SHQWUX�WHVWH�úL�QX����SHQWUX�F��PDMRULWDWHD�FDOFXODWRDUHORU�QX�DX�LQVWUXPHQWH�GH�OXFUX�VSHFLILFH�SHQWUXmanipularea aritmeticii lui 0. 2. 6��VH�UHVFULH�XUP�WRUXO�SURJUDP�I�U��D�VH�IRORVL�LQVWUXF LXQLOH�EUHDN��FRQWLQXH�úLgo to.

� �SURJUDPXO�QXP�U��FDUDFWHUXO�‘a’ din intrare#include <stdio.h>#include <ctype.h>void main (void){

int nr_a=0;char c;c=getch();while(1){

if(c== ’\n’) breakif (isdigit(c)) continueif (c==’a’) goto add_a;get_ch: c=getchar();goto end;add_a: nr_a++;goto get_ch;end: ;

}}

3. 6FULH L�R�IXQF LH�FDUH�DFFHSW��XQ�vQWUHJ�OD�LQWUDUH�úL�VFULH�XQ�QXP�U�GH�VSD LL�HJDOFX�SDV�GH�LQWUDUH��)RORVLQG�DFHHDúL�IXQF LH�V��VH�VFULH�XQ�SURJUDP�FDUH�FLWHúWHFDUDFWHUH�GH�OD�LQWUDUHD�VWDQGDUG��úL�OH�DILúHD]��GDU�vQORFXLHúWH�WDEXULOH�FX���VSD LL�

4. 0XOWH�SURJUDPH�FDUH�QHFHVLW��WUDQVIHU�GH�FDUDFWHUH�GLQWU�XQ�ORF�vQ�DOWXO�IRORVHVF�XQmecanism de FKHFNVXP��VXP��GH�FRQWURO���SW��D�YHULILFD�FRUHFWLWXGLQHDWUDQVIHUXOXL��$FHDVWD�VH�UHDOL]HD]��SULQ�VXPDUHD�YDORULORU�WXWXURU�FDUDFWHUHORUWUDQVPLVH�úL�WULPLWHUHD�HL�vPSUHXQ��FX�úLUXO�UHVSHFWLY��'DF��VXPD�VH�SRWULYHúWH�H[LVW��R�RDUHFDUH�SUREDELOLWDWH�FD�HOH�V��IL�IRVW�WUDQVIHUDWH�FRUHFW��6FULH L�XQSURJUDP�FDUH�V��IRORVHDVF��R�IXQF LH

144

Page 146: Introducere in c++

Introducere in programare

unsigned int CS (char *s)

care V��calculeze checksum-ul pentru o linie LQWURGXV��GH�OD�WDVWDWXU��5. 6FULH L�un program care FODVLILF��caracterele citite într-una din XUP�WRDUHOH

categorii: white _Space (space, ‘\n’, ‘\r’, ‘\t’) punctuator ( “,!;:()?) alfabet (a-z , A-Z) numeric (0-9) uncknown (oricare alt caracter) Deci la orice WDVW��DWLQV���V��DSDU��pe ecran codul tastei úL�clasa din care face parte. 5.1. 3URJUDPXO�V��ILH�UH]ROYDW�QXPDL�FX�if, HOVH�úL�return 5.2. 3URJUDPXO�V��ILH�UH]ROYDW�QXPDL�FX�VZLWFK�úL�return.

6. 6FULH L�XQ�SURJUDP�FDUH�DILúHD]��OLWHUHOH�PLFL�úL�PDUL�SUHFXP�úL�YDORULOH�ORUzecimale.

SET 4 1. ,QWURGXFH L�paranteze în expresiile de mai jos D�v�V��fie specificat (cu ajutorul lor )

explicit modul de evaluare implicit folosit de compilator.(Se va folosi tabela de preceden ��

a) a=b*c==2b) a=f(x)&&a>100c) a==b&&x!=yd) a=b+=2+f(2)e) a=b>>2+4f) a=s.f+y.xg) a=b&&a>z?x=y:zh) a=*++p*pi) a=b^c&d

2. 6� se construiasca o expresie ce va genera un long int (4 octe L) prin apelul repetat al func LHL�getbt() care întoarce un singur octet. Ordinea de aranjare este ca primul apel al lui getbt() va genera octetul cel mai semnificativ din întreg (nr=Expresie (getbt()).

3. Care este ieúLUHD�XUP�torului program ? void main(void)

{ short i=0;printf (“y.d\n”,(i+1)*(1=1));

}

4. 6��VH�VFULH�R�IXQF LH�unsigned long int circular_shift (unsigned long int a,int n); care face deplasare stanga cu UHFLUFXODUH���FX�Q�SR]L LL�D�QXP�UXOXL�D�

a=0001.0110.0011.1010.0111.0010.1110.0101

145

Page 147: Introducere in c++

Introducere in programare

DSOLF�QG�FLUFXODU_shift (a,5) spre VW�QJD� !1100.0111.0100.1110.0101.1100.1010.0010

5. Folosind <<sau>> s��VH�GHWHUPLQH�FDUH�HVWH�FHO�PDL�PDUH�vQWUHJ�FDUH�SRDWH�ILreprezentat pe calculator.

6. 6FULH L�R�IXQF LH�FDUH�SULPHúWH�XQ�vQWUHJ�úL-O�DILúHD]��vQ�ELQDU��IRORVL L�sizeof (int) pentru a afla nr de bi L�

7. 6FULH L�R�IXQF LH�FDUH�FLWHúWH�XQ�QU�vQ�IRUPD�ELQDU��úL-O�FRQYHUWHúWH�vQ�IRUP��hexa. 8. 6FULH L�R�IXQF LH�pack care compune un long int din 4 caractere de intrare long

int pack (char a,char b, char c, char d)

Bublle sort # define FALSE 0 #define TRUE 1 #include <stdio.h> void bubble_sort (int*v,int n) {

int j,k,temp,sorted=FALSE;while (!sorted){

sorted=TRUE //sc pp vect sortatfor (j=0;j<n-1;j++){

if (v[j]>v[j+1]) {

// cel pu in un element nu este în ordine sorted =FALSE; temp=v[j]; v[j]=v[j+1]; v[j+1]=temp;

}}

}}

int strlen1(char *s) {

int i=0; while (s[i])++i; return i;

}//întoarce nr elemente dintr-un nr mai pu LQ�‘\0’

146

Page 148: Introducere in c++

Introducere in programare

void strcopy1(char *s1, char *s2) {

int i; for (i=0;*(s1+1];++I)*(s2+i)=*(s1+I); s2[++I]=’0’;

} //classical

sauvoid strcopy1(char *s, char *s2){

while (*s2++=*s1++); } //professional

echivalentul func iei pas din Pascal , str str un contor un nr într-altul ….Int strstr1(char *s1,char *s2){

char *p,*q, *subs;for (subs=s1;*subs; subs++){

p=subs;q=s2;while (*q)if(!(*q++!=*p++)) return subs –s1;else break;

} return( –1);

} //de verificat

Set 5 1. 6��VH�H[SOLFH�FH�YD�UH]XOWD�vQ�XUPD�HYDOX�ULL�XUP�WRDUHORU�H[SUHVLL:

Fie static int ar []={10,15,4,25,3,-4} int *p;

p=&ar [2];a) *(p+1)b) p[-1]c) (ar-p)d) ar [*p++]e) *(ar+ar[2])

2. &H�HVWH�JUHúLW�vQ�XUP�WRDUXO�FD]: Int j , v[5]={1,2,3,4,5} ……

for (j=1; j<5; ++j) printf(“x.d\n”,v[j])

147

Page 149: Introducere in c++

Introducere in programare

úL

3. MRGLILFD L�bubble sort D�v��vQ�ORF�V��rearanjeze elementele într-XQ�WDEORX�HO�V�

VWRFKH]H�QXPDL�RUGLQHD�FRUHFW��GH�DUDQMDUH�0 1 2 3 4

Deci v[]={13 , 25 ,11,2 ,14 } vQ�XUPD�DSOLF�ULL�bubble sort modificarea se UHDOL]HD]��vQ�WDEORXO

ord[] = {1,4,0,2,3} 6H�REVHUY���

V[ord[0]]=V[1]=25V[ord[1]]=V[4]=14V[ord[2]]=V[0]=13

.

. 4. Scrie L�R�IXQF LH

void sort_concat(double *a, double *b, double *c) care ia a,b dou��WDEORXUL�VRUWDWH�úL�OH�GHSXQH�vQ�F�FDUH�WUHEXLH�V��ILH�úL�HO�VRUWDWdeasemenea.

5. 0RGLILFD L�IXQF LD�GH�PDL�VXV�DVWIHO�vQFkW�V��HOLPLQH�YDORULOH�HJDOH�6. 6FULH L�R�IXQF LH

char * plussir (char *a, char *b); care concatenea]��SH�D�FX�E�

7. 'HFODUD LLOHchar S[10]

char *S sunt la fel dac��QX�DU�WD L�GLIHUHQ HOH�VFULLQG�XQ�SURJUDP�vQ�FDUH�HOH�QX�SRW�ILînlocuite.

8. 6FLH L�R�IXQF LH�FDUH�VRUWHD]��XQ�WDEORX�GH�úLUXUL�GH�FDUDFWHUH�vQ�RUGLQH�DOIDEHWLF��ex. : S[][] = {{mike},{oana},{lili},{dana}} în urma apelului IXQF LHL���6>@>@� �^^dana},{lili},{oana},{mike}}.

9. Fiind date urm�WRDUHOH�GHFODUD LL�:static int a[2][3]={{-3,14,5},{1,-10,8}};static int *b[]={a[0],a[1]};int *p=b[1];

Cum vor fi evaluate urm[toarele expresii :a) *b[1]b) *(++p)c) *9*(--p-2)

10. Care din XUP�WRDUHOH�H[SUHVLL�HVWH�HFKYDOHQW��FX�a[j] ? : 1. *(a[j]+k) 2. **(a[j+k]) 3. (*a+j))[k] 4. (*(a+k))[j] 5. *((*a+j))+k) 6. **(a+j)+k 7. *(&a[0][0]+j+k)

148

Page 150: Introducere in c++

Introducere in programare

Set 6 1. Scrie i o IXQF LH�FDUH�DILúHD]��pe ecran din 20 în 20 de apeluri , de câte ori a fost

apelata în total. 2. 6��VH�scrie 2 IXQF LL��¾ conversie integer -> BCD¾ conversie BCD -> integer

folosindu-se ckPSXULOH�GH�EL L��ELW�field). 3. 2�VWLY��HVWH�R�OLVW��PDL�SDUWLFXODU��vQ�VHQVXO�F��:

¾ DG�XJDUHD�VH�SRDWH�IDFH�GRDU�OD�FDS�WXO�OLVWHL��RSHUD LH�QXPLW��push) ¾ úWHUJHUHD�PDL�WRW�GLQ�FRDGD�OLVWHL��RSHUD LH�QXPLW��SRS�

6FULH L�XQ�SURJUDP�FDUH�: ¾ crea]��R�OLVW��GH�DFHVW�WLS�IRORVLQG�FHOH���IXQF LL

SXVK�SHQWUX�DG�XJDUHSRS�SHQWUX�úWHUJHUH�

7UHEXLHVF�LPSOHPHQWDWH�úL�DFHVWH�IXQF LL�

Set7 1. 6��VH�VFULH�XQ�SURJUDP�FDUH�V��SULPHDVF��vQ�OLQLD�GH�FRPDQG��R�IUD]��SUHFXP�úL

switch-XULOH�±F�VDX�±&�IXQF LH�GH�DFHVWHD��SURJUDPXO�Y��RIHU��IUD]D�GLQ�OLQLD�GH�LQWUDUH�FXOLWHUH�PLFL�VDX�PDUL��'DF��switch nu este precizat se va considera implicit –c adic�

DILúDUHD�FX�OLWHUH�PLFL�2. 6FULH L�R�YHUVLXQH�UHFXUVLY��D�IXQF LHL�strlen. Este UHFXUVLYLWDWHD�PDL�EXQ��FD

YHUVLXQHD�QRUPDO���$UJXPHQWD L�3. 6FULH L�R�IXQF LH�UHFXUVLY��FDUH�FDOFXOHD]��FHO�PDL�PDUH�GLYL]RU�FRPXQ�D�GRX��QU�

pozitive întregi. 4. 6FULH L�úL�R�YHUVLXQH�LWHUDWLY��SHQWUX�SXQFWXO���5. 6FULH L�R�IXQF LH�UHFXUVLY��FDUH�DFFHSW��XQ�pointer la string ca argument,

WUDQVIRUP��UHVSHFWLYXO�úLU�într-R�OLVW��vQO�DQ XLW��GH�FDUDFWHUH�úL�vQWRDUFH�SRLQWHUXO�F�WUHSULPXO�HOHPHQW�GLQ�OLVW��

6. 6FULH L�R�IXQF LH�UHFXUVLY��FDUH�QXP�U��HOHPHQWHOH�dintr-o�OLVW��vQO�Q XLW��$UJXPHQWXO�WUHEXLH�V��ILH�SRLQWHUXO�F�WUH�SULPXO�HOHPHQW�GLQ�OLVW���(YLGHQW�F��YDORDUHDUHWXUQDW��YD�IL�vQWUHDJ��

7. 6FULH L�R�IXQF LH�UHFXUVLY��FDUH�DILúHD]��YDORULOH�ILHF�UXL�HOHPHQW�dintr-R�OLVW�vQO�Q XLW��

8. 9HULILFD L�OHJDOLWDWHD�XUP�WRDUHORU�GHFODUD LL: a. *(*( ) ) [ ] b. * (** ) [ ] c. (*(*(*x( ) ) [ ] ) ( ) ) d. **x[ ] ( ) e. * ( x[ ] ) [ ] f. * ( * (x ( ) ) ( ) )

Set8 1. Explica L�HIHFWHOH�(úL�WUDGXFHUHD�) urm�WRDUHORU�PDFURXUL:

1.1. #define BS 1024int buf [BS+1]

149

Page 151: Introducere in c++

Introducere in programare

1.2. #define a[b] b+1…a(1) + 1

1.3. # define a(b) b+1…a(1) +1

1.4. #define cos(x) *cos(x)…cos(x) + cos ( cos(y) + 1)

1.5. #define min(x,y) ((x) >= (y) ? x:y) min (1,min (a,b))

Set9 1. Scrie L�XQ�SURJUDP�FDUH�V��LPSOHPHQWH]H�comanada

# include “nume_fiúLHU” 2. Scrie L�R�IXQF LH�FDUH�HOLPLQ��WRDWH�VSD LLOH�VXSOLPHQWDUH�dintr-o surs��&3. 6FULH L�XQ�SURJUDP�FDUH�V��YHULILFH�LQFKLGHUHD�FRUHFW��D�SDUDQWH]HORU�într-R�VXUV��&�

,QGLFD LH: stiva. 4. Scrie L�XQ�SURJUDP�FDUH�QXP�U��FDUDFWHUHOH��FXYLQWHOH�úL�OLQLLOH�XQXL�ILúLHU�5. 6FULH L�XQ�SURJUDP�FDUH�SULPHúWH�FD�DUJXPHQWH�PDL�PXOWH�ILúLHUH�úL�OH�DILúHD]��SH

ecran (un fel de type cu mai multe inturi )

150

Page 152: Introducere in c++

Introducere in programare

151

Page 153: Introducere in c++

Introducere in programare

152

Page 154: Introducere in c++

Introducere in programare

153

Page 155: Introducere in c++

Introducere in programare

154

Page 156: Introducere in c++

Introducere in programare

155

Page 157: Introducere in c++

Introducere in programare

156

Page 158: Introducere in c++

Introducere in programare

157

Page 159: Introducere in c++

Introducere in programare

158

Page 160: Introducere in c++

Introducere in programare

159

Page 161: Introducere in c++

Introducere in programare

160

Page 162: Introducere in c++

Introducere in programare

161

Page 163: Introducere in c++

Introducere in programare

162

Page 164: Introducere in c++

Introducere in programare

163

Page 165: Introducere in c++

Introducere in programare

164

Page 166: Introducere in c++

Introducere in programare

165

Page 167: Introducere in c++

Introducere in programare

166

Page 168: Introducere in c++

Introducere in programare

Cuprins Capitolul 1 1 Introducere...................................................................................................1 1.1 Programarea si limbaje de programare.....................................................3 1.2 Arhitectura unui sistem de calcul…………………………………..……3

1.3 Functionarea unui sistem de calcul ………………………………..……4 1.4 Notiunea de algoritm ………………………………...……………..6 1.5 Reperezentarea algorimilor…………………………..………………….7 1.5.1 Metoda shemei logice………………………………………….……...7 1.5.2 Metoda pseudocodului………………………………………………...8

Capitolul 2 2 Limbajul C……………………………………………………………….9 2.1 Structura generica a unui program scris in C………………………….10 2.2 Etapele generarii unui program prornid de la o problema reala……….10

Capitolul 3 3 Notiunea de variabila si tipuri de variabile……………………………....15 3.1 Initializarea variabilelor………………………………………………..16 3.2 Tipuri de variabile……………………………………………………...17

Capitolul 4 4 Tipuri de date predefinite………………………………………………...18 4.1 Date numerice………………………………………………………….18 4.1.1 Operatorul virgula …………………………………………………...19 4.2 Date alfanumerice……………………………………………………...19 4.2.1 Caractere speciale de control…………………………………….......20 4.3 Operatiuni simple de citire sau afisare a datelor……………………….20 4.3.1 Functii de intrare sau iesire cu utilizatorul…………………………...21

Capitlul 5 5 Operatori ai limbajului C………………………………………………...24 5.1 Operatori aritmetici…………………………………………………….24 5.2 Expresiile ……………………………………………………………...24 5.2.1 Ordinea de evaluare a expresiei……………………………………...25 5.3 Tipuri aritmetice de date ………………………………………………26 5.4 Operatorii unari ++ si -- ……………………………………………….27 5.5 Operatorii op=………………………………………………………….27 5.6 Operatorii relationari si logici………………………………………….27 5.7 Expresii logice complexe………………………………………………28

Capitolul 6 6 Instructiuni de selectie(decizie)………………………………………….31 6.1 Instructiune simpla de decizie…………………………………………31 6.2 instructiune de decizie multipla………………………………………..35

Capitolul 7 7 Instructiuni de ciclare. Introducere………………………………………38 7.1 Instructiuni cu un numar necunoscut de pasi…………………………..38

Page 169: Introducere in c++

Introducere in programare

7.1.1 Instructiunea while…………………………………………………...38 7.1.2 Instructiunea do .. while ……………………………………………..39 7.2 Instructiuni cu numar cunoscut de pasi ………………………………..41 7.3 Alte instructiuni………………………………………………………..43 7.3.1 Instructiunea break…………………………………………………..43 7.3.2 Instructiunea continue……………………………………………….43 7.3.3 Instructiunea goto nume_eticheta……………………………………43 7.3.4 Instructiunea return…………………………………………………..44 7.3.5 Constante simbolice………………………………………………….44

Capitolul 8 8 Masive de date. Tablouri…………………………………………………45 8.1 Tablouri monodimensionale…..……………………………………….45 8.1.1 Prelucrari simple cu vectori………………………………………….45 8.1.2 Siruri de caractere……………………………………………………48 8.2 Tablouri bidimensionale. Matrici………………………………………49

Capitolul 9 9 Tipuri de date definite de utilizator………………………………………51 9.1 Declararea unei structuri……………………………………………….51 9.2 Operatorul typedef……………………………………………………..51 9.3 Accesarea membrilor unei structuri……………………………………52 9.4 O structura in interiorul altei structuri…………………………………53 9.5 Structuri autoreferite…………………………………………………...54 9.6 Transferul structurilor ca argumente de functii………………………..54 9.7 Returnarea unei structuri……………………………………………….54 9.8 Campuri de biti………………………………………………………...55 9.9 Uniuni………………………………………………………………….55 9.10 Enumerari…………………………………………………………….59

Capitolul 10 10 Notiunea de functie…………………………………………………….61 10.1 Declararea si definirea functiilor…………………………………….62 10.1.1 Declararea functiilor……………………………………………….62 10.1.2 Declaratii implicite…………………………………………………63 10.2 Definirea functiilor…………………………………………………...63 10.3 Tipul de data void…………………………………………………….66 10.4 Recursivitatea………………………………………………………....73 10.5 Variabile globale……………………………………………………...77 10.6 Macrouri………………………………………………………………78 10.7 Macrouri predefinite………………………………………………….79 10.7.1 ASSERT……………………………………………………………79 10.7.2 Macrouri specializate in clasificarea caracterelor………………….80 10.7.3 Macrodefinitii predefinite………………………………………….81

Capitolul 11 11 Pointeri si alocare dinamica……………………………………………83 11.1 Introducere…………………………………………………………...83 11.1.1 Notiunea de pointer………………………………………………...83 11.1.2 Operatii aritmetice cu pointeri……………………………………...85 11.1.3 Modele de memorie………………………………………………...86

Page 170: Introducere in c++

Introducere in programare

11.2 Alocare dinamica……………………………………………………..87 11.2.1 Introducere………………………………………………………….87 11.2.2 Alocarea dinamica………………………………………………….88 11.2.3 Alocarea dinamica a tablourilor de date……………………………90 11.2.3.1 Alocarea tablourilor monodimensionale………………………….91 11.2.3.2 Alocarea tablourilor bidimensionale……………………………...92 11.2.3.3 Alocarea tablourilor tridimensionale……………………………..93 11.3 Pointeri la structuri……………………………………………………94 11.3.1 Accesul membrilor………………………………………………….94 11.3.2 Alocarea structurilor de date………………………………………..94 11.3.3 Initializare si distrugere structuri…………………………………...94 11.4 Declaratii complexe in C……………………………………………..96 11.5 Descifrarea declaratiilor complexe in C……………………………...96 11.6 Lucrul cu fisierele de date (I/O FILE) Streamuri……………………100 11.6.1 Citirea si scrierea datelor………………………………………….101 11.6.2 Lucrul la nivel de character………………………………………..101

Capitolul 12 12 Facilitati de nivel scazut ale limbajului C……………………………..104 12.1 Functii pentru accesul direct la memorie……………………………104 12.2 Functii pentru accesul la porturile de intrare sau iesire……………..105 12.3 Functii pentru gestionarea intervalelor de timp……………………..105 12.4 Functii pentru controlul sistemului de intreruperi…………………..105 12.5 Functii pentru alocarea memoriei(prin DOS)……………………….106 12.6 Intreruperi software. Accesul la registrele procesorului…………….106 12.7 Functii pentru citirea sau modificare vectorilor de intrerupere……..107 12.8 Apeluri de functii DOS……………………………………………...108 12.9 Functii pentru terminarea sau lansarea programelor………………...110 12.10 Dezvoltarea de cod in limbaj mixt(C si ASM)…………………….112 12.11 Tratarea dispozitivelor bus asincrone……………………………...113

Capitlul 13 13 Preprocesorul………………………………………………………….115 13.1 Directiva nula……………………………………………………….115 13.2.Directivele #define si #undef……..…………………………………115 13.3 Directiva #include…………………………………………………...116 13.4 Directiva de compilare conditionata………………………………...116 13.5 Directiva line………………………………………………………..116 13.6 Directiva #error……………………………………………………...117 13.7 Directiva #pragma…………………………………………………..117

Exemple…………………………………………………………………………121 Seturi de teme…………………………………………………………………..143 Sintaxa ANSI……………………………………………………………………151


Top Related