Sunteți pe pagina 1din 120

&$3,72/8/

,QWURGXFHUH
&DOFXODWRDUHOH HOHFWURQLFH DX DSUXW vQ MXUXO DQXOXL  7RWXL XQHOH PDLQL
mecanice de calculat au fost propuse anterior:
-

3DVFDOUHDOL]DQXPDLDGXQDUHLVFGHUH
/HLEQLW]UHDOL]DLvQPXO LUH
%DEEDJHPDLQDQDOLWLF

&KLDU L vQ DFHVWH DSDUDWH SULPLWLYH XQHOH GLQ FRPSRQHQWHOH XQXL DUKLWHFWXUL
PRGHUQH SRW IL JVLWH 'H H[HPSOX XQ UHJLVWUX WHPSRUDU GH PHPRULH FDUH PHQ LQH
variabilele aflate n curs de procesare. Acest registru este cunoscut sub denumirea de
UHJLVWUX DFXPXODWRU &DOFXODWRDUHOH HOHFWURQLFH DX IRVW LQL LDO SURSXVH VXE IRUPD XQXL
DSDUDW DEVWUDFW FDUH SRDWH UHDOL]D VDX VLPXOD RULFH WLS GH PDLQ PHFDQLF )RUPD
WHRUHWLFDIRVWLQWURGXVGHAlan Turing pe la mijlocul anului 1930.
&D L vQ FD]XO PXOWRU DOWH WHKQRORJLL GH]YROWDUHD SUDFWLF D XQHL PDLQL FDUH V
respecte acest model, a fost LQIOHQ DW GH DO GRLOHD U]ERL PRQGLDO $FHVW OXFUX D IRVW
posibil deoarece se dorea calcularea traiectoriilor de rachete (&ROORVXV L Eniac) sau
GHFRGDUHDFRGXOXL(QLJPDIRORVLWGH*HUPDQLDSHQWUXSURWHF LDPHVDMHORU
Primul program stocat electronic a fost folosit n 1948. n primii ani de dezvoltare
 FRPSXWHUHOHLLPSDFWXOORUXOWHULRUvQYLD DXPDQDXIRVWPXOWVXEHYDOXDWH(GH
QRWRULHWDWHGHFODUD LDOXLBill *DWHVIRQGDWRUXO0LFURVRIWFXPFQXYHGHFXPDUSXWHDIL
YUHRGDWQHYRLHGHPDLPXOWGHKo RAM.
Q DQLL  D DSUXW SDVWLOD GH VLOLFLX L WHKQRORJLD 9/6, Very large Scale
,QWHJUDWLRQ  FD WHKQLF GH SURGXF LH IDSW FH DGXV OD FRPSXWHUH LHIWLQH L UDSLGH $FHVW
OXFUX D FRQGXV OD FUHWHUHD L GLYHUVLILFDUHD UDSLG D FDWHJRULLORU GH XWLOL]DWRUL FDUH L
SXWHDXSHUPLWHVOHDFKL]L LRQH]H
3HULRDGD  FDUH HVWH FDUDFWHUL]DW GH SULQ DSDUL LD microsistemelor pe 8
EL L FDUH GHL HUDX VFXPSH SHUPLWHDX DFFHVXO VHSDUDW GH PDLQIUDPH OD SRVLELOLW LOH
VLVWHPXOXLGHFDOFXO QDFHDVW SHULRDG HVWH GHPQ GH UHPDUFDW DSDUL LD vQ   D OXL
,FDUHSRDWHILFRQVLGHUDWXQSXQFWGHUHIHULQ vQGRPHQLX'LQDFHVWPRPHQWVRIWXO
DvQFHSXWVILHGH]YROWDWQXQXPDLSHQWUXFDOFXOHH[WUHPGHFRPSOH[HFLLSHQWUXMRFXUL
HGLWRDUHGHWH[WHSURJUDPHGHED]HGHGDWHLDOWHIDFLOLW LFHUXWHGHSLD 
7RW vQ DFHDVW SHULRDG IRU DW L GH UXSHUHD GH PDLQIUDPH D SRUQLW L
GH]YROWDUHDVLVWHPHORUGHRSHUDUHORFDOH&30LDSRL'26
6LVWHPXO GH RSHUDUH 06'26 D IRVW UHDOL]DW SULQ DGDSWDUHD OD QRLOH LQVWUXF LXQL
PDLQ D XQXL PLFURNHUQHO GH 81,; OD FDUH VDX DGXJDW IXQF LLOH QHFHVDUH FRQWUROXOXL
SHULIHULFHORUFDUHvQFHSXVHUVILHDWDDWHFDOFXODWRDUHORUSHUVRQDOH
'LQ  SkQ vQ  GHL vQF IRDUWH VFXPSH DX vQFHSXW V DSDU SH SLD 
DUKLWHFWXULGLQFHvQFHPDLSXWHUQLFHSHEL LLDUDULDORUGHIRORVLUHVDH[WLQVIRDUWH
PXOWLvQDOWHGRPHQLL
1XHVWHGHQHJOLMDWQLFLLPSDFWXOSURGXVGHLQWHUIH HOHYL]XDOHLGHFRQWURDOHOHSULQ]RQH
active ale ecranului. Aceste controale care sunt activate din PRXVH sunt caracteristice
sistemului de operare WINDOWS.

7RW vQ DFHDVW SHULRDG GLQ UD LXQL HFRQRPLFH L SUDFWLFH VD SURGXV GLVSDUL LD
PLFURFDOFXODWRDUHORUDFHVWHDILLQGPXOWGHSLWHGHFHULQ HOHSLH LL
'LQ  VH SRDWH VSXQH F VD LQWUDW vQWUR QRX HU vQ DFHVW GRPHQLX SULQ
LHIWLQLUHDGUDPDWLFDKDUGZDUHXOXLLDSDUL LDUH HOHORUGHFDOFXODWRDUH
2GDWFXLHIWLQLrea arhitecturilor de calcul s-a putut GLYHVULILFDLPDLPXOWDULDGH
XWLOL]DUHDORU$FHVWOXFUXDDYXWFDUH]XOWDWRFUHWHUHDSUH XOXLVRIWXOXL
&RQFHSWXOGHUH HDSHUPLWHDWUDQVIHUXULUDSLGHGHGDWHDFURUFDQWLWDWHDvQFHSXW
VILHGLQFHvQFHPDLPDUH
,QL LDO PDMRULWDWHD UH HOHORU GH FDOFXODWRDUH HUDX vQFKLVH  vQ VHQVXO F QX
FRPXQLFDX vQWUH HOH $SRL vQ XOWLPD SHULRDG WHUPHQXO GH VLVWHP GHVFKLV FDSW GLQ
SXQFWGHYHGHUHSUDFWLFRUVSkQGLUHGLQFHvQFHPDLPDUHODQLYHOJOREDO'LQDFHVWSXQFW
GHYHGHUHUH HOHGHWLSArpanet , Internet DPGVXQWUHSUH]HQWDWLYH
QXOWLPLLDQLvQVXLFRQFHSWXOGHWUDQVPLVLHGHLQIRUPD LHLQWHUXPDQWLQGHVVH
VFKLPEH7HOHYL]LXQHDGLJLWDOHVWHGHMDLPSOHPHQWDWLDUSUH XOSHULIHULFHORUGHGLFDWHD
VF]XW H[WUDRUGLQDU DVWIHO vQFkW VH SUHFRQL]HD] GH]YROWDUHD FDOFXODWRUXOXL DVWIHO vQFkW HO
VQXPDLILHVWULFWRULHQWDWVSUHDSOLFD LLGHGLFDWHFLVILHROHJWXUGLQDPLFGHRULFHWLS
(audio, video, teleworking) a individului cu societatea.
9RPSUH]HQWDFkWHYDGLQDSOLFD LLOHPDLFXQRVFXWHDOHFDOFXODWRDUHORUvQGLYHUVHGRPHQLL
-

,QGXVWULHFRQWUROLDXWRPDWL]DUH microcontrolere, CAM (Computer


Aided
Manufactory);
Economie: gestiune, transferul banilor, "banii electronici" .
0HGLFLQGLDJQR]DXWRPDWFHUFHWDUHDHOHFWURQLFODGLYHUVHQLYHOHDOH
RUJDQLVPXOXLXPDQDQDOL]DFRGXOXLJHQHWLFGLDJQR]DXWRPDWUH HOHQHXUDOH
VWD LLJUDILFHVLVWHPHH[SHUW
3LFWXU QRL UDPXUL DOH SLFWXULL IRORVLQG FRPSXWHUXO UHVWDXUDUH  KRORJUDILH UH HOH
neurale, procesoare analogice.
0X]LF L WHOHYL]LXQH SUHOXFUUL GH LPDJLQL L VXQHWH SUDFWLF GH RULFH QDWXU
SURFHVRDUHDQDORJLFHVWD LLJUDILFHDUKLWHFWXUL00;
Proiectare : programele de tip CAD (Computer Aided Design)

Se mai pot da exemple n mulWHGRPHQLLvQVHVWHFHUWF OD RUD DFWXDO YLD D L


VRFLHWDWHDXPDQQXPDLSRWILFRQFHSXWHIUFDOFXODWRU

3URJUDPDUHDLOLPEDMHGHSURJUDPDUH
Prin SURJUDPDUHVHvQ HOHJHvQPRGJHQHULFWUDQVSXQHUHDXQRURSHUD LLUHSHWLWLYH
DVXSUD XQXL VHW GH GDWH vQWUXQ OLPEDM LQWHOLJLELO GH FWUH XQ VLVWHP GH FDOFXO FDUH
XUPHD]XOWHULRUVOHH[HFXWH$FHVWOXFUXHVWHUHDOL]DWvQGRXHWDSH
-

HWDS vQ FDUH HVWH LPSOLFDW RPXO L DQXPH FHD GH WUHFHUH GH OD SUREOHPD UHDO OD
transpunerea ntr-un limbaj de programare.
R D GRXD HWDS DXWRPDW FDUH WUDQVSXQH FRGXO VXUV vQLUXLUHD GH LQVWUXF LXQL
specifice limbajului respectiv  ntr-un FRGGLUHFWH[HFXWDELO inteligibil sistemului
GHFDOFXO OXFUXGHFDUHVHRFXSSURJUDPHVSHFLDOL]DWHQXPLWHFRPSLODWRDUH.

5ROXO SURJUDPULL HVWH FD ILH GDW R DQXPLW RSHUD LXQH VDX VXLW GH RSHUD LXQL
UHSHWLWLY H  FDUH VH DSOLF DVXSUD XQRU VHWXUL GH GDWH PHUHX GLIHULWH V ILH VFULV XQ
SURJUDP 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 LHLUH DGLF
rezultatele).
Q DFHVWH FRQGL LL SURJUDPXO WUHEXLH V ILH FRPSXV GLQ PDL PXOWH LQVWUXF LXQL Q
primul rnd cele care UH]HUY GHFODUR]RQGHPHPRULHFDILLQGVSHFLDOGHGLFDWQXPDL
SHQWUXDQXPLWHGDWH R]RQGHPHPRULHvQFDUHVHYRUFLWLGDWHOHGHLQWUDUHR]RQGH
PHPRULHvQFDUHVHYRUSVWUDGDWHOHLQWHUPHGLDUH(cele care apar n decursul calculelor
GDUGHFDUHXWLOL]DWRUXOQXDUHQHYRLH LGHDVHPHQLSHFHOHGHLHLUH3URJUDPXOWUHEXLH
VFRQ LQLQVWUXF LXQLFDUHVFLWHDVFGHODXWLOL]DWRUGDWHOHGHLQWUDUHXUPDWHvQVIkULW
GH LQVWUXF LXQLOH GH FDOFXO SURSULX ]LV FD vQ ILQDO V FRQ LQ LQVWUXF LXQLOH GH DILDUH D
UH]XOWDWHORU GDWHOHGHLHLUH
 $UKLWHFWXUDXQXLVLVWHPGHFDOFXO
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 DWHSWP de la el ca vreo
GDW V IDF altceva dect l-a pus cineva, un programator prin intermediul unui program,
V IDF. ,QWHOLJHQ DDSDUHQWa unui sistem de calcul provine din cantitatea de LQWHOLJHQ 
XPDQLQYHVWLWn respectivul program aflat n H[HFX LH
Hilar, am putea spune F omul vQFHDUF V IDF pe cineva GXS chipul L
DVHPQDUHD 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
GHSDQULL(H[HFX LHLSDVFXSDVn scopul JVLULLeventualelor defecte n IXQF LRQDUH unui
SURJUDP  &$87 17, (52$5($ 7$ '( 352*5$0$725 , $32, ' 9,1$
PE CALCULATOR.
Desigur H[LVWun procent cam de 5% din VLWXD LLn care un program scris corect
este executat JUHLW lucru care apare ca rezultat al LQWHUIHUHQ HL unor programe
neautorizate, cum ar fi YLUXLL FX programul aflat n H[HFX LH n cazul n care nu este

valabil acest lucru problema este mai FRPSOH[putnd fi implicate GHIHF LXQLaleatorii ale
SU LL KDUGZDUH Oricum ar fi aceste lucruri LQWU n sfera de DF LXQH a unui inginer de
sistem, Ldeci nu sunt luate aprioric n FRQVLGHUD LHfiind de obicei rare.
Pentru a putea vQ HOHJHarhitectura vom FXWDanumite analogii ntre un om Lun
sistem de calcul.
6 DQDOL]P ce se vQWkPSO FX un om n momentul n care vede o formulare de
genul : 2*2= .
'HLni se pare ceva evident, cu WR LLDPvQY DWpe de rost tabla vQPXO LULL V
vQFHUFPacum o descompunere a SDLORUFDUHsunt H[HFXWD L
n primul rnd PHPRUPn memoria WHPSRUDU sau de VFXUWGXUDW RSHUDQ]LL datele
asupra FURUDvom executa o RSHUD LXQH apoi UHDOL]PRSHUD LXQHDGHvQPXO LUHrezultnd
4, care este SkQODcomunicarea lui YHUEDOsau prin scris tot n memoria WHPSRUDU6H
REVHUYFoperanzii 2,2 LRSHUD LXQHD DXfost preluate de pe un suport extern si anume
cel scris, rezultatul putnd fi UHWXUQDW trimis FWUHHPL WRUXOunei cereri de lucru GXS
cum am spus tot pe DFHOLsistem extern de stocare.
$FHVWH[HPSOXQXDIRVWGDWIUXQVFRSLDQXPHUROXOOXLHVWHSULQWUHDOWHOHGHD
Y RELQXL FX QLYHOXO H[WUHP GH VF]XW OD FDUH VH IDFH DQDOL]D L GHVFRPSXQHUHD XQHL
SUREOHPHUHDOHvQPRPHQWXOvQFDUHGRUHVFVRWUDQVSXQvQWUXQOLPEDMGHSURJUDPDUH
i acum VDQDOL]PDUKLWHFWXUDEORF(structura IXQF LRQDO Dunui sistem de calcul.
'XS FXP VH REVHUY GLQ ILJ  ntr-un
sistem de calcul H[LVW
- un dispozitiv de stocare n PDV rolul
caietului pe care scrim /citim n cazul
nostru. Acest dispozitiv este materializat
prin Hard Disk (HDD) FUXLD i se mai
0HPRULH
'LVSR]LWLY
spune Lsuport fix de date L)ORSS\'LVN
7HPSRUDUm
,QWUDUH
(FDD) FUXLD i se mai spune L suport
5$0
,H LUH
mobil de date .
)LJ$UKLWHFWXUDXQXL
- o memorie WHPRUDU 5$0 5DQGRP
VLVWHPGHFDOFXO
Acces Memory) care MRDF H[DFW rolul
memoriei de VFXUWGXUDWumane.
- dispozitive de Intrare sau de ,HLUH prin care sistemul SULPHWH sau UHWXUQHD] GDWH n
cazul unui sistem de calcul acestea sunt tastatura L PRXVH FD dispozitive de intrare L
monitorul sau imprimanta ca dispozitive de LHLUH
A mai Umas de OPXULWproblema microprocesorului care este inima unui sistem
de calcul L DUH rolul de a coordona ntregul sistem. Desigur F DFHDVW coordonare se
UHDOL]HD]WRWprin intermediul unor programe care H[LVWn ceea cea am putea numi, prin
analogie cu omul, partea de reflexe FRQGL LRQDWH aceste programe se JVHVF ntr-o
memorie ROM (Read Only Memory) deci nu pot fi dect citite.
' LV S R ] LW LY G H

0 LF U R S U R F H V R U

VWR FDUH

+ ' ' ) ' '

 )XQF LRQDUHDXQXLVLVWHPGHFDOFXO


Sistemul de calcul GXS FXP VH REVHUY FRPSRUW destul similitudini cu omul la
nivel de DUKLWHFWXULdeasemeni, GXSFXPvom discuta, LODnivel de IXQF LRQDUH
6vedem cum se UHDOL]HD]ELQHvQ HOHVODnivel simplificat, H[HFX LDunei formule
de genul 2*2= .

Se FLWHWH GH pe suportul de stocare programul care FRQ LQH cererea QRDVWU VH
vQFDUF n memoria WHPSRUDU GH acest lucru se RFXS VLVWHPXOGHRSHUDUH programul
specializat care se RFXS GH traducerea unor LQVWUXF LXQL VLPSOH L LQWXLWLYH DOH
utilizatorului n comenzi directe FWUH partea de H[HFX LH D sistemului , n urma cererii
noastre explicite de lansare a programului) L VH ncepe H[HFX LD lui de FWUH procesor
H[HFX LHFDUHXUPHD]aproximativ sistemul uman de gndire. Pe scurt modul de H[HFX LH
la nivelul procesorului poate fi descris ca :
FLWHWHdatele utile (din RAM n aceast caz) (2,2)
FLWHWHRSHUD LDFDUHtrebuie H[HFXWDWasupra datelor suspomenite(tot din RAM)(*)
H[HFXWRSHUD LD   
returneazrezultatul (nnapoi n RAM)(4).
La nivelul sistemului de calcul modul de H[HFX LHDUDWFDmai jos:
FLWHWHprogramul de executat (de pe sistemul de stocare fix/mobil) L
vQFDUFOn RAM
H[HFXWprogramul (din RAM)
la terminarea programului DWHDSWnoua cerere de H[HFX LH
0HPRULD7HPSRUDUDXQXLVLVWHPGHFDOFXO
'XSFXPDPpomenit n primul capitol, una din componentele de ED]DOHunui
sistem de calcul este memoria GLQDPLF5$0sau memoria WHPSRUDU
$FHDVWmemorie a fost FRQFHSXW LQkQGcont de faptul Fsistemul de QXPHUD LH
folosit n interiorul unui calculator este ED]  'H aici UH]XOW F orice fel de GDW sau
LQVWUXF LXQHefectiv SURFHVDWsau H[HFXWDWODnivelul PDLQLLtrebuie Vfie SDVWUDWVXE
forma ei ELQDU deci FRUHVSXQ]WRDUH bazei 2). ntruct n baza 2 nu H[LVW dect dou
numere 0 L  UH]XOW F vom avea UHSUH]HQWUL VXE IRUPD unor LUXUL GH  L GH  /D
nivelul PDLQLL materializarea HIHFWLY D respectivelor numere este UHDOL]DW GH obicei,
prin DWDDUHD ORJLF D lui 1 la o tensiune de 5 YRO L iar lui 0 lipsei acestei tensiuni.
7RWXLindiferent de nivelul tehnologic este absolut nepractic ca VFRQVLGHUPIL[9sau
fix 0 V ca valori de FRPSDUD LHpentru Facest lucru ar fi dus la QLWHechipamente extrem
de scumpe LGHlente. Din aceasta FDX]VHFRQVLGHUDILsau 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 UHvQFUFUL
periodice a acestuia se poate RE LHQH FD tensiunea la bornele lui V varieze n limitele
necesare QRX GDF fac suficient de repede DFHDVW UHvQFUFDUH n aceste FRQGL LL foarte
simplist putem vedea o memorie GLQDPLF ca o matrice LPHQV de condensatoare care pot
fi vQFUFDWHsau GHVFUFDWHn cursul RSHUD LXQLORUGHscriere/citire.
Aici mai apare o SUREOHPLanume QXPUXOGHEL LFDUHcompun 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 LODun moment dat de un procesor.
ntruct memoria RAM este cea care IXUQL]HD] respectivele date era logic ca ea
V fie RUJDQL]DW n diviziuni de o PULPH HJDO cu cea a QXPUXOXL de EL L sus PHQ LRQD L.
Aceste JUXSUL se numesc ORFD LLGHPHPRULH L pot fi considerate ca minima unitate care
poate fi VFULV sau FLWLW dintr-o memorie. O GDW OPXULW acest aspect devine clar F
pentru a P putea referi la una sau alta din ORFD LL trebuie V existe o PHWRG GH
individualizare VWULFW6DDOHVcea mai VLPSOFXSXWLQ Lanume
numerotarea lor QXPUXOORFD LHLnumindu-se DGUHVDORFD LHL.

1R LXQHDGHDOJRULWP
QSURFHVXOGHUH]ROYDUHDXQHLSUREOHPHIRORVLQGFDOFXODWRUXOH[LVWGRXID]H
-

GHILQLUHDLDQDOL]DSUREOHPHL
SURLHFWDUHDLLPSOHPHQWDUHDXQXLDOJRULWPFDUHUH]ROYSUREOHPD

'HILQLUHDLDQDOL]DSUREOHPHLSRDWHILODUkQGXOHLGHVFRPSXVvQ
- specificarea datelor de intrare;
- VSHFLILFDUHDGDWHORUGHLHLUH
6SHFLILFDUHDGDWHORUGHLQWUDUHFRQVWvQ
1.
2.
3.
4.
5.

Ce date vor fi primite la intrare;


Care este formatul (forma lor de reprezentare) a datelor de intrare;
Care sunt valorile permise sau nepermise pentru datele de intrare;
([LVWXQHOHUHVWULF LL DOWHOHGHFkWOD SULYLQGYDORULOHGHLQWUDUH
&kWH YDORUL YRU IL OD LQWUDUH VDX GDF QX VH SRDWH VSHFLILFD XQ QXPU IL[ GH YDORUL
FXPVHYDWLFkQGVDXWHUPLQDWGHLQWURGXVGDWHOHGHLQWUDUH

6SHFLILFDUHDGDWHORUGHLHLUHWUHEXLHV LQFRQWGHXUPWRDUHOHDVSHFWH
1. &DUHGLQYDORULOHUH]XOWDWHvQFXUVXODSOLFULLDOJRULWPXOXLGHFDOFXODVXSUDGDWHORUGH
LQWUDUHYRUILDILDWH QHFHVDUHXWLOL]DWRUXOXL QDFHVWSDVVHIDFHGLIHUHQ LHUHDFODU
vQWUHGDWHLQWHUPHGLDUHLGDWHGHLHLUH
2. &DUHYDILIRUPDWXOGDWHORUGHLHLUH GHH[HPSOXXQQXPUUHDOSRDWHILDILDWFXWUHL
VDXFXFLQFL]HFLPDOHVDXXQWH[WSRDWHILDILDWLQWHJUDOVDXSDU LDO
3. 6XQW VDX QX QHFHVDUH H[SOLFD LL VXSOLPHQWDUH SHQWUX XWLOL]DWRU vQ DIDUD GDWHORU GH
LHLUH
4. &DUHHVWHQXPUXOGHGDWHGHLHLUHFDUHWUHEXLHWUDQVPLVHFWUHLHLUH
2GHILQL LHDQR LXQLLGHDOJRULWPSRDWHILvQOQ XLUHDGHSDLVLPSOLRSHUD LLGLVWLQFWH
FDUH GHVFULX PRGXO GH SUHOXFUDUH D XQRU GDWH GH LQWUDUH  vQ VFRSXO UH]ROYULL XQHL
SUREOHPH 'HFL $/*257,08/ (67( $&($ 3$57( '( &$/&8/ &2081 1
&$=8/5(=2/95,,81(,352%/(0('(&$/&8/
8QH[HPSOXVLPSOXGHDOJRULWPDUILVXLWDGHRSHUD LLPDWHPDWLFHIFXWvQUH]ROYDUHD
XQHL HFXD LL PDWHPDWLFH GH JUDGXO ,, D;E;F  FRHILFLHQ LL D E F VH VFKLPE GDU
modul de procesare a valorilor lor, nu.
3URSULHW LOHXQXLDOJRULWPVXQW
1. (VWHFRPSXVGLQLQVWUXF LXQLVLPSOHLFODUH
2. 2SHUD LXQLOHVSHFLILFDWHGHLQVWUXF LXQLVHH[HFXWvQWURDQXPLWVHFYHQ 
3. 6ROX LDWUHEXLHRE LQXWvQWUXQQXPUILQLWGHSDL
'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.

2EVHUYD LHQDFHDVWFDUWHVHYRUGLVFXWDQXPDL$/*25,70,6(&9(1,$/,L
UHVSHFWLY352*5$0$5($6(&9(1,$/
8Q DOJRULWP VHFYHQ LDO HVWH DFHO DOJRULWP FUHDW SHQWUX H[HFX LD  SH XQ FDOFXODWRU
VHFYHQ LDO'HQXPLUHDGHVHFYHQ LDOSURYLQHGLQIDSWXOFDFHVWDQXSRDWHH[HFXWDGHFkW
RVLQJXURSHUD LHODXQPRPHQWGDW
5HSUH]HQWDUHDDOJRULWPLORU
Q JHQHUDO XQ DOJRULWP SRDWH IL FRQVLGHUDW FD R GHVFULHUH D SUHOXFUULL HIHFWXDWH
asupra unui flux de date, prelucrare care are loc cu un scop bine determinat. Ca de obicei,
vQ FD]XO GH]YROWULL XQHL QRL WHRULL VD FXWDW DWkW R FDOH GH VWDQGDUGL]DUH D PRGXOXL GH
GHVFULHUH D XQXL DOJRULWP FkW L R FDOH GH DO IDFH LQGHSHQGHQW GH XQ OLPEDM GH
SURJUDPDUHDQXPHUH]XOWkQGGRXPHWRGHFODVLFH
-

metoda schemei logice (diagramei de flux (flowchart));


metoda pseudocodului.

0HWRGDVFKHPHLORJLFH
QFDGUXODFHVWHLPHWRGHVHIRORVHWHXQVHWGHVLPEROXULSUH]HQWDWvQILJXUD
SHQWUXGHVFULHUHDSDLORUFHWUHEXLHH[HFXWD LSHQWUXFDSURJUDPXOUH]XOWDWVQHUH]ROYHR
DQXPLWSUREOHP
'HLDIRVWH[WUHPGHIRORVLWSkQQXGHPXOWDFHDVWPHWRGSDUHDSLHUGHWHUHQ
vQ ID D UHSUH]HQWULL GH WLS SVHXGRFRG SRDWH L GDWRULW WLPSXOXL VXSOLPHQWDU SLHUGXW GH
utilizator cu executarea simbolurilor grafice.
6 DQDOL]P XQ SURJUDP GH FDOFXO D PHGLHL SHQWUX WUHL QRWH L V YHGHP FXP DU
DSUHDGHVFULVSULQDFHDVWPHWRG
'XSFXPVHREVHUYvQILJXUDVHGHVFULXHIHFWLYSDVFXSDVWRDWHRSHUD LXQLOH
care trebuiesc urmate.
Q ILJXUD  VD VSHFLILFDW L vQFHSXWXO SURJUDPXOXL IDSW FDUH SDUH LQXWLO GDU vQ
FD]XOGHVFULHULLXQXLSURJUDPIRDUWHPDUHVHSUHDSRDWHFDVFKHPDORJLFVVHvQWLQGSH
]HFLGHSDJLQLFD]vQFDUHGHYLQHHYLGHQWQHFHVLWDWHDGHFODUULLvQFHSXWXOXLLVIkULWXOXL
de program.
QXUPWRUXOSDVVHGHFODUYDULDELOHOH2YDULDELOHVWHXQLGHQWLILFDWRUSURSULXDO
SURJUDPDWRUXOXL FDUH vQ FD]XO RSHUD LXQLL GH GHFODUDUH VH DWDHD] OD JHQHUDUHD
SURJUDPXOXL XQHL ]RQH GH PHPRULH D FUHL GLPHQVLXQH HVWH vQ GLUHFW FRQFRUGDQ  FX
WLSXOGHGDWVWRFDWGHDFHDVWD
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 GLVFXWD
GHVSUHDOHJHUHDWLSXOXLGHYDULDELOIXQF LHGHVSHFLILFD LLOHXWLOL]DWRUXOXL
6HH[HFXWFDOFXOXOSURSULX]LVGXSFDUHVHDILHD]UH]XOWDWXOFX]HFLPDOH$
PDL UPDV GRDU PDUFDUHD VIkULWXO GH SURJUDP &KLDU GDF PHWRGD DUH R LPSUHVLH
DUWLVWLFVSRULWFkWHRGDWVHSLHUGHSUHDPXOWWLPSLKkUWLHvQFD]XOIRORVLULLHLLGH
DFHHDGLQFHvQFHPDLPXO LSUHIHUFDPHWRGGHGHVFULHUHpseudocodul.

6LPERO GH WHUPLQDUH
VDX vQFHSHUH SURJUDP
&XWLH GH FDOFXO
&XWLH GH FRPHQWDULX
&XWLH GH
,QWUDUH VDX ,HLUH 'DWH

)LU GH H[HFX LH D SURJUDPXOXL


)LJ  6LPEROXUL VWDQGDUG SHQWUX
PHWRGD VFKHPHL ORJLFH

 XQXL

)LJ  6FKHPD ORJLF

SURJUDP GH FDOFXO D PHGLHL SHQWUX


WUHL QRWH

0HWRGDSVHXGRFRGXOXL
)D GHVFKHPDORJLFDUHGH]DYDQWDMXOFQXvQWRWGHDXQDUHGDEVROXWWR LSDLLGH
FDOFXO 7RWXL HVWH PDL FRPRG GH IRORVLW vQ FD]XO vQ FDUH VH GHVFULX DOJRULWPL SHQWUX
OLPEDMHOHGHSURJUDPDUHGHQLYHOPHGLXLvQDOW
6FKHPD ORJLF HVWH FHD PDL LQGLFDW FD PHWRG GH GHVFULHUH vQ VSHFLDO vQ FD]XO
LPSOHPHQWULLXQXLDOJRULWPIRORVLQGOLPEDMGHDVDPEODUHXQGHGHVFULHUHDDPQXQ LWD
ILHFUXL SDV HVWH QHFHVDU  SHQWUX SXWHD PLQLPL]D DQVHOH DSDUL LHL XQRU HURUL GH
implementare.
DescrierHDHIHFWLYDSDLORUFHWUHEXLHHIHFWXD LIRORVLQGFXYLQWHOHOLPELLURPkQH
vPSUHXQ FX FXYLQWH FKHLH DOH OLPEDMXOXL GH SURJUDPDUH vQ FDUH VH YD LPSOHPHQWD
DOJRULWPXO VH QXPHWH SVHXGRFRG 6H REVHUY F vQ DFHVW FD]  FULWHULXO LQGHSHQGHQ HL
WRWDOHDGHVFULHULLID GHOLPEDMXOGHLPSOHPHQWDUHQXHVWHvQWUXWRWXOUHVSHFWDW
3HQWUX FRPSDUD LH YRP GHVFULH PDL MRV vQ SVHXGRFRG SUREOHPD SUH]HQWDW vQ
figura 1.2.
YDULDELOHPDQQQ
^
FLWHWHQQQ
PD QQQ 
DILHD]PDFX]HFLPDOH
`

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 &KXUFKFHIXVHVHUSURSXVHSULQDQLL/DRUDDFWXDOVHHVWLPHD]FH[LVWSHVWH
GH OLPEDMH GH SURJUDPDUH GLIHUHQ HOH vQWUH HOH ILLQG OHJDWH vQ SULQFLSDO GH VWLOXO GH
programare.
Limbajul FORTRAN (FORmula TRANslator) a fost unul dintre primele limbaje
GH SURJUDPDUH (O HVWH IRORVLW L DFXP vQ LQGXVWULH VDX FHUFHWDUH SHQWUX D LPSOHPHQWD
DSOLFD LLVSHFLILFHFXYROXPHPDULGHFDOFXOHPDWHPDWLFHFRPSOH[H
3H OkQJ OLPEDMH GH SURJUDPDUH SHQWUX PDLQL VHFYHQ LDOH VDX GH]YROWDW L
OLPEDMHFDUHVXSRUWSURFHVDUHSDUDOHO'LQQHIHULFLUHPDMRULWDWHDQXVXQWSRUWDELOHILLQG
RULHQWDWH VWULFW SH DUKLWHFWXUD PDLQLL SHQWUX FDUH D IRVW GH]YROWDW OLPEDMXO 'H DELD vQ
XOWLPLL]HFHDQLGH]YROWDUHDUDSLGDUH HOHORUGHFDOFXODWRDUHDFRQGXVLODRvQFHUFDUHGH
standardizare a unor limbaje ce pot crea cod executabil simultan pe mai multe sisteme de
calcul.
$YDQWDMHOHSURJUDPULLODQLYHOinalt sunt:
 ascund GLIHUHQ HOHGHDUKLWHFWXULQWHUQ
 sunt XRUGHXUPULWLPHQ LQXW modificare i depanare XRDU
 sunt portabile . De exemplu un cod scris n C poate fi executat i sub UNIX LVXE
DOS
 nu au cel mai eficient FRGvQFRPSDUD LHFXFHOVFULVLQ$60GLUHFW
De 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 PEXQW LULLlimbajului B, folosit n scrierea UNIX pentru DEC
PDP7. Prima GRFXPHQWD LH despre acest limbaj a fost The C Programing Language,
scrisGH5HWFKLHLBrian Kernighan n 1977. naintea ei exista doar The C Reference
Manual, scris de Retchie. 2 FDUDFWHULVWLF LPSRUWDQW D DFHVWXL OLPEDM HVWH IDSWXO F
SRDWHILFRQVLGHUDWVLPXOWDQLXQOLPEDMGHQLYHOPHGLXLXQOLPEDMGHQLYHOVF]XW
2 GDW FX UVSkQGLUHD OXL SULQWUH SURJUDPDWRULL SURIHVLRQLWL VD WUHFXW L OD
DGDSWDUHDFRPSLODWRUXOXLSHQWUXVLVWHPXOGHRSHUDUH06'26'H DVHPHQHDD DSUXW L
DOWSUREOHPLDQXPHIDSWXOFVWDQGDUGXO.&R nu mai era satisfFWRU'HDVHPHQHD
GDWRULWYDULDQWHORUGHFRPSLODUHSHQWUX3&-uri C ncepuse VLpiardGLQportabilitate.
n acel moment Institutul 1D LRQDOpentru Standarde al Americii (ANSI), a creat
un subcomitet pt. a defini o versiune RILFLDOSWlimbajul C, rezultnd astfel ANSI C.
/LPEDMXO & L YHUVLXQLOH VDOH 223 Object Oriented 3URJUDPPLQJ  & L PDL
QRXO 9LVXDO & VXQW SULQWUH FHOH PDL IRORVLWH OLPEDMH GH SURJUDPDUH OD RUD DFWXDO $
IRVW SURLHFWDW SRUQLQG GH OD GRX OLPEDMH GH]YROWDWH VSUH VIkULWXO DQLORU  %&3/ L
prima sa versiune B.
8Q OLPEDM GH QLYHO VF]XW HVWH RULHQWDW SH DUKLWHFWXU L SRDWH IL GHILQLW FD DYkQG
IDFLOLWDWHDGHDVFULHLQVWUXF LXQLFHVHUHIHUGLUHFWODHOHPHQWHDOHUHVSHFWLYHLDUKLWHFWXUL
interne (ca n cazul limbajului de asamblare).

8Q OLPEDM GH QLYHO vQDOW VDX PHGLX HVWH RULHQWDW SH SUREOHP  SHUPL kQG
SURJUDPDWRUXOXL VL VWUXFWXUH]H SURJUDPXO FkW PDL DSURSLDW SRVLELO GH SUREOHPD FH
WUHEXLHLPSOHPHQWDW$FHVWOXFUXVFDGHDQVHOHXQHLHURULGHSURLHFWDUHODQLYHOORJLFDO
DSOLFD LHL&KLDUGDFSURJUDPXOYDILPDLLQHILFLHQWGLQSXQFWGHYHGHUHDOYLWH]HLLDO
RFXSULL UHVXUVHORU SULQ FRPSDUD LH FX XQ SURJUDP VFULV vQ OLPEDM GH DVDPEODUH  HO DUH
DYDQWDMXOFSRDWHILVFULVUHSHGHLH[WLQVFXXXULQ 
Limbajul C SHUPLWH IRORVLUHD DPEHORU WHKQLFL SURJUDPDUH VWUXFWXUDW L DFFHV
GLUHFWODPDLQIDSWFDUHOIDFHVILHIRDUWHIOH[LELO
8OWLPXOLSRDWHFHOPDLLPSRUWDQWPRWLYSHQWUXvQY DUHDOLPEDMXOXL&HVWHIDSWXO
FSHUPLWHWUHFHUHDFXXXULQ OD&VDX-DYD
'HLlimbajul C are o libertate foarte mare in scrierea codului, el acceptnd multe
forme de scriere care n alte limbaje nu sunt premise, acest lucru ascunde vQVLpericole,
n special pentru programatorii IUH[SHULHQ 
6WUXFWXUDJHQHULFDXQXLSURJUDPVFULVvQ&
'HODSULPHOHSURJUDPHVFULVHHVWHELQHVVH LQFRQWGHRVHULHGHUHJXOLSULYLQG
RUJDQL]DUHDFRGXOXLVXUV6WUXFWXUDJHQHUDODXQXLFRGYDIL
Apeluri ale directivelor speciale de compilare;
'HFODUD LLGHELEOLRWHFLIRORVLWH
'HFODUD LLIXQF LLLQOLQH
'HFODUD LLDOHSURWRWLSXULORUIXQF LLORUSHUVRQDOH
'HFODUD LLYDULDELOHJOREDOH
Corpul programului principal
{
GHFODUD LLYDULDELOH
DSHOXULGHIXQF LL
}
&RUSXULOHIXQF LLORUGH]YROWDWHGHSURJUDPDWRU
([LVW FkWHYD REVHUYD LL VXSOLPHQWDUH SULYLQG WHKQRUHGDFWDUHD FRGXOXL VXUV GH
FDUHDUILELQHVVH LQVHDPD
1. 6QXVHVFULHLQVWUXF LXQLOHXQDGXSDOWDFLXQDVXEDOWD
2. 7RDWHLQVWUXF LXQLOHFDUHIRUPHD]XQEORFSHQWUXRDOWLQVWUXF LXQHVILHGHSODVDWH
ID GHvQFHSXWXOUHVSHFWLYHLLQVWUXF LXQL
(WDSHOHJHQHUULLXQXLSURJUDPH[HFXWDELOSRUQLQGGHODRSUREOHPUHDO
8QD GLQ JUHHOLOH vQFHSWRULORU vQ SURJUDPDUH FRQVW vQ IDSWXO F SXQ SUHD PXOW
DFFHQW SH LQWURGXFHUHD XQRU SURJUDPH JDWD VFULVH IU FD vQ SUHDODELO V VWXGLH]H
SUREOHPDGHSRUQLUHSUHFXPLDOJRULWPXOJHQHUDWvQXUPDDQDOL]HLDFHVWHLSUREOHPH
QPRPHQWXOJkQGLULLXQXLSURJUDPSHOkQJDOWHFRQVLGHUHQWHWUHEXLH LQXWFRQWLGH
IDSWXOFHVWHRPDUHGLIHUHQ vQWUHSURJUDPHOHbune si cele care merg. Un program bun
nu numai cPHUJHGDUHVWHLXRUGHvQ HOHVLPHQ LQXW0XO LGLQWUHvQFHSWRULLvQ

programarea C-XOXLDXWHQGLQ DGHD seOLPLWDODSURJUDPHFDUHVPHDUJLDFHVWIDSW


conduce la GHSULQGHULQHVQWRDVH.
'H DFHHD PDL MRV YRP SUH]HQWD SDLL QHFHVDUL D IL XUPD L vQ HODERUDUHD XQHL DSOLFD LL
SRUQLQGGHODRSUREOHPUHDO
1. Q HOHJHUHDSUREOHPHL
2. 5HDOL]DUHDPRGHOXOXLPDWHPDWLFGDFHVWHFD]XO
3. 9HULILFDUHDPRGHOXOXLPDWHPDWLFFXXQVHWGHGDWHUHDOVDXFDOFXODWHPDQXDO'DFVH
REVHUY QHFRQFRUGDQ H VH YD UHOXD YHULILFDUHD  SXQFWHORU DQWHULRDUH GDF QX VH
FRQWLQX
4. ,GHQWLILFDUHD GDWHORU GH LQWUDUH D GDWHORU GH LHLUH SUHFXP L D YDULDELOHORU
intermediare.
5. $OHJHUHDWLSXULORUGHGDWHIRORVLWHSHQWUXUH LQHUHDvQFXUVXOSURFHVULLDUHVSHFWLYHORU
date.
6. Specificarea modului de LQWHUID DUHFXXWLOL]DWRUXOODQLYHOGHLQWUDUHVDXLHLUH
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 HVHUHLDYHULILFDUHDSXQFWHORUDQWHULRDUHGDFQXVHFRQWLQX
9. 6FULHUHDFRGXOXLVXUV WUDQVSXQHUHDvQWUXQOLPEDMGHSURJUDPDUHRDUHFDUH 
10.(OLPLQDUHDHURULORUGHVLQWD[
3HQWUXDH[HPSOLILFDSDLLPHQ LRQD LDQWHULRUYRPOXDXQH[HPSOXH[WUHPGHVLPSOX
6VHUHDOL]H]Hun program care UH]RYRHFXD LHRDUHFDUHGHJUDGXO,,
Pasul 1
n acest caz este simplu, e clar Fne referim la o HFXD LHGHfoma ax+bx+c=0;
Pasul 2
Modelul matematic este cel studiat n liceu:
Fie = b  a c atunci :


E E DF
.
D
E L E + DF
'DF<0 atunci: [ =
.
D
E
'DF=0 atunci: [ =
.
D
Pasul 3
n acest caz poate fi evitat modelul matematic este prea simplu.
'DF>0 atunci: [

 

 

 

Pasul 4
6 YHGHP GHFL FDUH DU IL GDWHOH FH WUHEXLHVF IXUQL]DWH GH XWLOL]DWRU $YkQG vQ
YHGHUHFVHGRUHWHUH]ROYDUHDXQHLHFXD LLJHQHULFHGHRUGLQXO,,HVWHFODUF
- a,b,c date de intrare

- x GDWHGHLHLUH
- GDWLQWHUPHGLDU
Analiznd modHOXO PDWHPDWLF REVHUYP F D WUHEXLW V IRORVLP XQ VLPERO
VXSOLPHQWDU IXQF LH GH FDUH VH IDFH vQWUHDJD GLVFX LH $FHVW VLPERO QX HVWH QLFL GDW GH
XWLOL]DWRULQLFLQXLQWHUHVHD]SHQWUXUH]XOWDWXOILQDOGHFLHVWHRGDWLQWHUPHGLDUGH
calcul.


Pasul 5
$FXP WUHEXLH V VSHFLILFP WLSXO GH GDW IRORVLW SHQWUX UHSUH]HQWDUHD LQWHUQ vQ
PHPRULDFDOFXODWRUXOXL DYDULDELOHORU'HFLDYHPFkWHYDGDWHVXSOLPHQWDUHODGLVSR]L LH
pentru a vedea tipul de reprezentare care trebuie ales:
- VSHFLILFD LLOHXWLOL]DWRUXOXL
- modelul matematic
- H[SHULHQ DvQSURJUDPDUH
Q DFHVW FD] PRGHOXO PDWHPDWLF QH VSXQH F DEF VXQW QXPHUH UHDOH )U R
VSHFLILFDUHFODUDXWLOL]DWRUXOXLFDUHVvQGLFHFHOHDSDU LQDOWXLLQWHUYDOHVWHREOLJDWRULX
FDVOXPvQFRQVLGHUDUHPRGHOXOFHOPDLH[WLQVGHFLFHOPDLDGDSWDELO'HVLJXU FQX
YRP DOHJH FHO PDL FXSULQ]WRU WLS GH GDWH SXV OD GLVSR]L LH GH FWUH FRPSLODWRU vQ OLSVD
XQRUVSHFLILFD LLH[WHUQH'HFLa,b,c vor fi de tipul float.
9DULDELOD LQWHUPHGLDU  HVWH UH]XOWDW DO DSOLFULL XQHL IXQF LL OLQHDUH DVXSUD XQRU
YDULDELOHGHWLSUHDOGHFLLGHOWDYDWUHEXLVILHfloat.
'DWHOH GH LHLUH [  GXS FXP VH REVHUY VXQW UH]XOWDWXO XQHL vQSU LUL L GHFL
REOLJDWRULXVXQWUHDOHLQGLIHUHQWGHWLSXOGHGDWDOHVSHQWUXGDWHOHGHLQWUDUH


Pasul 6
QOLSVDXQRUVSHFLILFD LLGHODXWLOL]DWRUYRPDOHJHSHQWUXFLWLUHDGDWHORUFHDPDL
VLPSOPHWRGFLWLUHDGLUHFWGXSFXPDPIFXWLSkQDFXP3HQWUXDILDUHvQVDYHP
GRXPHWRGHDILDUHDGHWLSXO5H [ L,P [ VDXGLUHFWUH]XOWDWXOFDvQFDOFXOXOPDQXDO
9RPDOHJHFHDGHDGRXDPHWRG
Pasul 7
3VHXGRFRGXOYDDUWDFDPDLMRV
FLWHWHD
FLWHWHE
FLWHWHF
FDOFXOHD]GHOWDGXSIRUPXOGHOWD E E D F
GDFGHOWD>=0 atunci
{
x=(-b+sqrt(delta))/(2*a);
x=(-b-sqrt(delta))/(2*a);
afiDILHD][[
}
altfel
{
delta=-delta;
delta=sqrt(delta)/(2*a)

afiHD]x1 de forma re+i*im


afiHD]x2 de forma re-i*im
}
CWHYDREVHUYD LLUHODWLYHODFRQVWUXF ia pseudocodului
- VH REVHUY F QX DP WUDWDW VHSDUDW VLWXD LD GHOWD  SHQWUX F ]HUR OD DGXQDUH QX
PRGLILFUH]XOWDWXO
- vQDGRXDSDUWHDPIRORVLWXQDUWLILFLXGHFDOFXOvQVHQVXOFDPSVWUDWWRWvQYDULDELOD
GHOWD UH]XOWDWH SDU LDOH GH FDOFXO $OWIHO DU IL WUHEXLW V LQWURGXFHP YDULDELOH
VXSOLPHQWDUHSHQWUXSVWUDUHDS LLvQWUHJLLDSU LLUHDOH&RGXODUILIRVWPDLFODUGDU
vQDFHODLWLPSDPILIRORVLWPDLPXOWPHPRULH'DFvQFD]XODFHVWXLSURJUDPFkWHYD
YDULDELOH VXSOLPHQWDUH QX QH GHUDQMHD] vQ FD]XO XQRU SURJUDPH IRDUWH PDUL DFHVW
OXFUX SRDWH ULGLFD JUHXW L FH QX SRW IL HOLPLQDWH GHFkW SULQ WUHFHUHD OD DORFDUHD
GLQDPLFDPHPRULHL$FHDVWPHWRGYDILSUH]HQWDWXOWHULRU
- VH REVHUY F DP VFULV PXOW FRG VXSOLPHQWDU FDUH GLQ SXQFW GH YHGHUH DO FDOFXOXOXL
brut nu ne trebuie, dar din punct de vedere al modului n care i prezint rezultatul uni
XWLOL]DWRUHVWHHVHQ LDOSHQWUXFHVWHH[DFWvQIRUPDPDWHPDWLFFXQRVFXW
Pasul 8
Va fi evitat pentru acest exemplu deoarece este prea simplu.
Pasul 9
Codul n cazul limbajului C va DUDWDFDPDLMRV
#include <stdio.h>
*
#inlude <conio.h> // aici eroare de sintaxGHWHFWDELOGHinterpretor
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[QHGHWHFWDELOGHinterpretor
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)
}

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
'XSFXPVHREVHUY DPLQWURGXVLQWHQ LRQDWWUHLWLSXULGHJUHHOL 3ULPD PDUFDW FX R
VWHDHVWH JUHHDO GH VLQWD[ FH YD IL GHWHFWDW GH FRPSLODWRU L GHFL R SXWHP FRUHFWD vQ
DFHDVWID]
Pasul 11
Q FDGUXO UXOULL SURJUDPXOXL UH]XOWDW VH REVHUY F DFHVWD QX IXQF LRQHD] FRUHFW /D
H[HFX LDSDVFXSDVVHYDREVHUYDFvQYDULDELODDQXVHGHSXQHFHHDFHVHFLWHWHGHOD
WDVWDWXU (VWH R JUHHDO GH ORJLF GH SURJUDPDUH SHQWUX F scanf  DWHDSW XQ pointer
pentru a returna corect rezultatul, iar a nu este declarat SRLQWHU WUHEXLH WUDQVPLV DGUHVD
OXLD$FHDVWHURDUHQXSRDWHILGHWHFWDWGHinterpretor.
'HDVHPHQHD FX WUHL VWHOH DP PDUFDW R JUHHDO GH WUDQVSXQHUH D DOJRULWPXOXL R
JUHHDOVLPSOGHWUDQVFULHUHD XQHL IRUPXOH GH FDOFXO 'HDELD GXS HOLPLQDUHD DFHVWRU
erori se poate continua testarea programului.
(VWHELQHFDVH[LVWHXQ comentariu la vQFHSXWXORULFUHLVXUVHL&DYkQGXUPWRUXO
FRQ LQXW
/*----autor:
GDWDFUHULL/modificrii
------copyright
*/

CAPITOLUL 3
1R LXQHDGHYDULDELOLWLSXULGHYDULDELOH
2YDULDELO HVWHXQLGHQWLILFDWRU QXPH GDWGXSGRULQ GHFWUHXWLOL]DWRUXQHL]RQH
din memorie cu care se va lucra (stoca sau modifica datele utile programului) pe
SDUFXUVXOVFULHULLFRGXOXLVXUV
Q OLPEDMXOXL & SRW IDFH DVHPHQHD UHIHULUL GLUHFWH OD R ]RQ GH PHPRULH SULQ
intermediul SRLQWHULORU  DYkQG WRWRGDW DYDQWDMXO VLQWD[HL IDFLOH D XQXL OLPEDM GH QLYHO
mediu.
3URJUDPXO VDX FRGXO VXUV HVWH WUDGXV SULQ LQWHUPHGLXO FRPSLODWRUXOXL & vQWUXQ
program executabil. n cadrul acestui proces se face identificarea dintre numele variabilei
L XQ DQXPLW QXPU GH ORFD LL GH PHPRULH 7RW vQ VDUFLQD FRPSLODWRUXOXL UPkQH L
JHQHUDUHD GH LQVWUXF LXQL FDUH V VH RFXSH GH VFULHUHD VDX FLWLUHD vQ EORF D PDL PXOWRU
ORFD LLGHRGDW2YDULDELOSRDWHRFXSDPDLPXOWGHRORFD LHGHPHPRULH
Caracteristicile variabilelor sunt :
1. )LHFDUHYDULDELODUHXQQXPH
2. )LHFDUHYDULDELODSDU LQHXQXLWLSGHGDW
3. )LHFDUH YDULDELO UH LQH R YDORDUH VDX XQ VHW GH YDORUL XWLOH SHQWUX SURJUDP $FHVWH
valori pot fi:
- GHSXVHvQPHPRULHSULQLQL LDOL]DUHvQSURJUDP
- SRWILFLWLWHGHODWDVWDWXUVDXGHODDOWGLVSR]LWLYGHLQWUDUH
/HJDWGHQXPHOHXQHLYDULDELOHVHSRWIDFHFkWHYDREVHUYD LL
1. 1XPHOH XQHL YDULDELOH VH DOHJH GH RELFHL DVWIHO vQFkW V GHVFULH FH vQVHDPQ SHQWUX
programator, din punct de vedere al SVHXGRFRGXOXL vQWUR IRUP FDUH SRDWH IL
SUHVFXUWDW 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 &D
REVHUYD LH OLPEDMXO & HVWH FDVH VHQ]LWLY DGLF IDFH GLVWLQF LH vQWUH OLWHUHOH PLFL L
PDUL IRORVLWH vQ VFULHUHD FRGXOXL VXUV  GHFL 18 6( &216,'(5 $ ),,1'
$&(/$, 180( '( 9$5,$%,/ 1 &$=8/ 1 &$5( (67( 6&5,6 &8
LITERE MARI SAU CU LITERE MICI. Mai concret nota_1 Nota_1NOTA_1.
2. &kQGVHGRUHWHFDXQQXPHGHYDULDELOVILHFRPSXVGLQGRXFXYLQWH186(9$
/6$ 63$,8 175( (/( FFL YRU IL FRQVLGHUDWH GRX FXYLQWH VHSDUDWH HOH
WUHEXLHVFXQLWHFXOLQLHLQIHULRDU underscore).
3. 1XPHOHGHYDULDELOHVXIHULGHXUPWRDUHOHUHVWULF LL
QXSRWvQFHSHFXXQQXPU M
nu pot ncepe cu $
( $ abc )
nu pot fi cuvinte rezervate ( int )
nu pot FRQ LQHcaractere speciale ( bab*#*@l ) excep LHIFQGunderscore
ex. bad_babe

,QL LDOL]DUHDYDULDELOHORU
QOLSVDXQHLLQL LDOL]ULH[SOLFLWHRYDULDELOORFDOYDFRQ LQHRYDORDUHRDUHFDUH DOHDWRDUH 
QXPLWvQPRGFXUHQW JDUEDJH $FHDVW YDORDUH VH JVHD vQ PHPRULD DORFDW UHVSHFWLYHL
YDULDELOHODODQVDUHDvQH[HFX LDDSURJUDPXOXL
,QL LDOL]DWRULLH[SOLFL LVHSODVHD]GXSGHFODUDWRUXOODFDUHVHUHIHUVHSDUD LGH
acesta prin semnul egal (de exemplu nr1=234).
H H
OYDOXH

UYDOXH

'DFRELHFWXOLQL LDOL]DWHVWHXQDJUHJDW XQFRQJORPHUDWGHGDWHUHFXQRVFXWVXEXQ


QXPHFRPXQ SHQWUXLQL LDOL]DUHVHIRORVHWHROLVWGHH[SUHVLLvQFKLVvQDFRODGHXQGHOD
ILHFDUHFRPSRQHQWFRUHVSXQGHFkWHRH[SUHVLH
7UHEXLHUHVSHFWDWHXUPWRDUHOHUHJXOL
1. QXPUXO GH LQL LDOL]DWRUL QX SRDWH IL PDL PDUH GHFkW QXPUXO GH FRPSRQHQWH GH
LQL LDOL]DW
2. QXVHSRWLQL LDOL]DGHFkWRELHFWHVDXWDEORXULFXGLPHQVLXQHGHILQLW DGLFVHFXQRDWH
QXPUXOPD[LPGHYDORULGHLQWUDUHFHSRWILGDWHGHXWLOL]DWRUSHQWUXDILSURFHVDWH 
3. H[SUHVLLOHIRORVLWHSHQWUXLQL LDOL]DUHWUHEXLHVILHFRQVWDQWHvQXUPWRDUHOHVLWXD LL
ODLQL LDOL]DUHDXQXLRELHFWGHWLSVWDWLF vQ&QHVHPDLDSOLF 
ODLQL LDOL]DUHDXQXLWDEORXXQHLVWUXFWXUL sau unei uniuni.
4. QX VH SRW LQL LDOL]D LGHQWLILFDWRUL FX YDODELOLWDWH vQ LQWHULRUXO XQXL EORF GDU FX OHJDUH
H[WHUQVDXLQWHUQ
5. GDF R OLVW vQFKLV vQWUH DFRODGH DUH PDL SX LQH HOHPHQWH GHFkW FRPSRQHQWH DUH
DJUHJDWXOLQL LDOL]DWUHVWXOFRPSRQHQWHORUVHYRULQL LDOL]DDXWRPDW
2ELHFWHOHGHWLSVFDODU RVHULHGHGDWHGHDFHODLWLSDFURUGHILQL LHSRDWHILGDWFD
R vQLUXLUH GH GDWH FH SRW IL LGHQWLILFDWH SULQ SR]L LD ORU vQWUR vQLUXLUH  VH LQL LDOL]HD]
IRORVLQGRVLQJXUH[SUHVLHFDUHSRDWHILHYHQWXDOvQFKLVvQDFRODGH8QLXQLOH JUXSULGH
PDL PXO L EL L GH GLPHQVLXQH GLYL]LELO FX GRL  VH LQL LDOL]HD] FX R VLQJXU H[SUHVLH
corespunznd ca tip primului membru al uniunii.
6WUXFWXULOH JUXSULGHGLYHUVHGDWHGHWLSXULGLIHULWHVXEXQQXPHFRPXQ LXQLXQLOH
VHSRWLQL LDOL]DFXRH[SUHVLHGHWLSVWUXFWXUVDXXQLXQHFRUHVSXQ]WRDUH9DORDUHDLQL LDOD
structurii sau uniunii va fi valoarea obiectului citat.
3UH]HQ DXQHLLQL LDOL]ULvQWURGHFODUD LHLQGLFRGHFODUD LHGHILQLWRULH FHVSHFLILF
FXFHYDILXPSOXWUHVSHFWLYXOVSD LXGHPHPRULH 0DLMRVHVWHSUH]HQWDWXQH[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 } ;

$FHHDL YDULDELO QX VH SRDWH LQL LDOL]D FX GRX YDORUL GHFkW vQ FD]XO vQ FDUH VH
UHQXQ ODYDORDUHDDQWHULRDUFXFDUHDIRVWLQL LDOL]DW
1XSRWH[LVWDGRXGHFODUD LLGHILQLWRULL FDUHvLVSHFLILFFRQ LQXWXO vQWU-un program.
3.2.Tipuri de variabile
8QD GLQ FHOH PDL GLILFLOH SUREOHPH FDUH DSDU vQ FDGUXO vQY ULL XQXL OLPEDM GH
SURJUDPDUHHVWHGHVFULHUHDXQHLVLWXD LLGLQOXPHDUHDOIRORVLQGHOHPHQWHOHUHVSHFWLYXOXL
limbaj.
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
SHQWUXRYDULDELOWUHEXLHIFXWvQFRQFRUGDQ FXYDORULOHFDUHOHSRDWHOXDDFHDVWD
'H DFHHD SULPXO SDV HVWH V YHGHP FH WLSXUL IXQGDPHQWDOH GH GDWH QH SXQH OD
GLVSR]L LHOLPEDMXO& SUHFXP L JDPD GH YDORUL vQ FDUH HYROXHD] DFHVWHD 2 GDW WLXWH
DFHVWHOXFUXULSXWHPvQFHSHVYHGHPFDUHHVWHOHJWXUDFXH[HPSOHOHGLQYLD DUHDO
'LQDQDOL]DLQIRUPD LHLFDUHFLUFXOFXUHQWvQWUHRDPHQLUH]XOWFH[LVWGLQSXQFW
GHYHGHUHDOSURFHVULLGRXWLSXULGHLQIRUPD LH
- LQIRUPD LH RE LQXW SULQ PVXUWRUL DVXSUD IHQRPHQHORU UHDOH FDUH VXQW H[DFWH L
DVXSUDFURUDVHIDFSUHOXFUULPDWHPDWLFHGHRELFHL
- LQIRUPD LH VXE IRUP FRQGHQVDW FDUH GH RELFHL HVWH UHFRPSXV DVRFLDWLY vQ PLQWHD
XPDQFXPDUILOLPEDMXOVLLQIRUPD LDVFULV
'HDLFLUH]XOWFvQWUXQOLPEDMGHSURJUDPDUHDYHPQHYRLHGHGRXWLSXULGHYDULDELOH
FDUHVSRDWILIRORVLWHSHQWUX
-

stocarea unor valori numerice.


VWRFDUHDXQRUFDUDFWHUHLQIRUPD LHVFULV

&RQIRUP DFHVWRU QHFHVLW L OLPEDMXO & D IRVW SUHY]XW FX XUPWRDUHOH WLSXUL
fundamentale de date:
-

intVWRFKHD]QXPDLQXPHUHvQWUHJL
float, doubleSHQWUXQXPHUH]HFLPDOHFDOFXOvQYLUJXOPRELO
charSHQWUXDVWRFDFRGXOXQXLFDUDFWHUVDXXQQXPUvQWUHJUHSUH]HQWDWSHPD[LPXP
RSWEL LLQFOX]kQGLVHPQXO
2EVHUYD LHchar[QU@YDUH LQHXQLUGHnr caractere sau ntregi.

8QDGLQWUHXWLOL]ULOHLUXULORUGHFDUDFWHUHDUILPHVDMHOHGHGLDORJFXXWLOL]DWRUXOXQXL
SURJUDPVDXPHVDMHOHGH HURDUH Q DFHVWFD]QXQHLQWHUHVHD] FRQ LQXWXO GLQ SXQFW GH
vedere al valorii lor numerice ca atare.
)XQF LH GH QHFHVLW LOH SURJUDPDWRUXOXL SXWHP VSXQH F H[LVW GRX FODVH GH WLS GH
date care pot fi folosite n cazul unui limbaj de nivel mediu sau nalt:
1. tipuri de date predefinite
tipuri de date definite de utilizator.



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 QXPU GH ORFD LL GH PHPRULH SHQWUX VWRFDUHD FRQIRUP
XQXLDOJRULWPELQHGHILQLWIXQF LHGHWLSXOGHGDWDXQXLWLSGHGDWHH[LVWHQWHQFD]XO
tipului de date FKDU GHL D IRVW LQWURGXV SHQWUX VWRFDUHD GDWHORU GH WLS DOIDQXPHULF HO
SRDWHILIRORVLWvQFDOFXOHPDWHPDWLFHLORJLFHvQLQWHUYDOXOGHYDORULQXPHULFHSHFDUHOH
poate stoca.
3HQWUXWLSXULOHGHGDWHFHVWRFKHD]YDORULQXPHULFHvQWUHJL SUHVFXUWDWLQW VDXGXS
cum am spus FKDUQXPUXOHVWHVWRFDWvQPHPRULHGLUHFWVXEIRUPDUH]XOWDWODFRQYHUVLD
n binar.
n cazul datelor de tip real, float, sau GRXEOHODFRQYHUVLDGLUHFWDQXPUXOXLvQED]D
GRLVDUILSLHUGXWSUHDPXOWHORFD LLGHPHPRULHLGHDFHHDHOHVH SVWUHD] VXE IRUPD
WLLQ LILF$FHDVWIRUPVHUHIHUODIDSWXOFH[LVWR]RQGHPHPRULHFDUH LQHPDQWLVD
L R ]RQ GH PHPRULH FDUH LQH H[SRQHQWXO 8Q H[HPSOX GH UHSUH]HQWDUH WLLQ LILF GLQ
punct de vedere matematic ar fi:
123344445455454=1.23344445455454 * 1014 =1.23344445455454E+14
unde mantisa=1,23344445455454 iar exponentul = 14.
0DLMRVSUH]HQWPRVHULHGHWLSXULGHGDWHSUHGHILQLWHGLPHQVLXQLOHORULGRPHQLXO
YDORULORU FDUH SRW IL VWRFDWH 6H REVHUY F VDX IRORVLW PRGLILFDWRUL GH WLS 3ULP
PRGLILFDWRULGHWLSVHvQ HOHJFXYLQWHFKHLHFDUHDXFDHIHFWODFRPSLODUHFDGLPHQVLXQHD
vQRFWH L SHFDUHHVWHUHSUH]HQWDWXQWLSGHGDWHVFUHDVF FXXQIDFWRUFDUHHVWHVDXR
putere a lui doi)).
char {128, 127}
unsigned char {0, 255}
IUVHPQ
signed char {128, 127}
semn
int {32768, 32767 }
cuvnt (2 octeti)
unsigned int {0, 65535}
semn
signed int {32768, 32767}
semn
short int {32768, 32767}
semn
unsigned short int {0, 65535}
semn

1 octet
1 octet
1

octet

cu

1
 FXYkQW IU
1 cuvnt cu
1 cuvnt cu
 FXYkQW IU

signed short int 32768 to 32767


semn
long int {2147483648, 2147483647}
signed long int {2147483648, 2147483647}
float {3.4E38, 3.4E+38}
double {1.7E308, 1.7E+308}
long double {3.4E4932, 1.1E+4932}

1 cuvnt cu
2 cuvinte
2 cuvinte cu semn
2 cuvinte
4 cuvinte
5 cuvinte

2EVHUYD LH $FHVWH LQWHUYDOH VXQW GH RELFHL VSHFLILFH VLVWHPXOXL GH RSHUDUH VXE FDUH
OXFUHD]FRPSLODWRUXOLPDLQLLSHFDUHDFHVWDHVWHH[HFXWDW'RPHQLLOHGHPDLVXVVXQW
valabile pentru compilatorul de C++ realizat de Borland.
2SHUDWRUXOYLUJXO
a,b HYDOXHD]DHYDOXHD]E
$FHVWRSHUDWRUSHUPLWHHYDOXDUHDDGRXVDXPDLPXOWHH[SUHVLLGLVWLQFWHLQORFXULOHLQ
FDUHRVLQJXUH[SUHVLHHVWHDGPLVDILIRORVLW DVWDHUD LXQHDLQWURGXFHULLOXL
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--;
}
}
8QDOWH[HPSOXIXQF LDbreak_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 SURLHFWULL XQHL DSOLFD LL SRW DSDUH SH OkQJ FHULQ H OHJDWH GH FDOFXOH
QXPHULFHFRPSOH[HLFHULQ HSHQWUXSURFHVDUHDGHWH[WHVDXDXQRUED]HGHGDWH
ToWDOLWDWHDFDUDFWHUHORUFHSRWILDILDWHVDXOLVWDWHvQFD]XOOXFUXOXLVXEXQVLVWHP
GH RSHUDUH FODVLF 81,; VDX '26  VH QXPHVF FDUDFWHUH DOIDQXPHULFH DOIDEHWLFH L
QXPHULFH  )LHFDUH FDUDFWHU DUH R LPDJLQH SH HFUDQ $FHDVW LPDJLQH HVWH VWRFDW vQ
memoria QHYRODWLODFDOFXODWRUXOXLLDUHDWDDWXQFRGXQLFODFDUHVHIDFHDSHOFkQGVH
GRUHWHDILDUHDVDXOLVWDUHDHL
'DWRULW QHFHVLW LL FD XQ WH[W HGLWDW  SH XQ VLVWHP IDEULFDW GH R DQXPH ILUP VL
SVWUH]H vQ HOHVXO VD WUHFXW OD VWDQGDUGL]DUHD FRGULL LPDJLQLORU FDUDFWHUHORU $VWIHO D
UH]XOWDWVWDQGDUGXO$6&,,IRORVLWODRUDDFWXDOGHWRDWHFDOFXODWRDUHOHGLQVHULD;
([LVWGHFDUDFWHUHvQDFHVWVWDQGDUG1XYRPIDFHUHIHULULODVHWXULOH H[WLQVHGH
caractere specifice editoarelor de teste sau sistemelor de operare de tip Windows sau
XWindows.

3HQWUXVWRFDUHDXQXLLUGHFDUDFWHUHOLPEDMXO&IRORVHWHXQWDEORXmonodimensional
GH FDUDFWHUH FDUH SRDWH VWRFD FRGXULOH D PD[LPXP  GH FDUDFWHUH R GDW vQ FD]XO
GHFODUULLVWDWLFH
2EVHUYD LD  'DF VD GHILQLW YDULDELOD V FD DYkQG FDSDFLWDWHD GH VWRFDUH GH  GH
caractere iar la citirea ei sunt introduse mai mult de 25, atunci numai pentru primele 25
QXH[LVWULVFXOSLHUGHULLORUSHSDUFXUVXOH[HFX LHLSURJUDPXOXL Q DFHVWFD] SRW DSUHD
erori mascate n cod.
2EVHUYD LDQFD]XOvQFDUHQXDPGHILQLWQXPUXOGHFDUDFWHUHFDUHSRDWHILVWRFDW
vQ UHVSHFWLYD YDULDELO IXQF LH GH PRGXO GH FRQVWUXF LH DO FRPSLODWRUXOXL ILH VH DORF
GLPHQVLXQHDPD[LPSRVLELOILHODSULPDLQL LDOL]DUHVHDORFH[DFWFkWHVWHQHFHVDUGDU
nu peste maximul definit.
2EVHUYD LD 1XH[LVWQLFLROHJWXUvQWUHYDORDUHDQXPHULF[LFDUDFWHUXO[FDUH
apare pe ecran. De exemplu 2 2.
,QL LDOL]DUHDXQHLGDWHFXRYDORDUHXWLOSRDWHDYHDORFvQXUPWRDUHOHPRGXUL
- la declararea ei;
- la citirea datelor de intrare;
- oriunde n program .
4.2.1. Caractere speciale de control
3HOkQJFDUDFWHUHOHGLUHFWDILDELOHPDLH[LVWvQOLPEDMXO&RVHULHGHFDUDFWHUHGH
FRQWURO$FHVWHDSURYLQGLQQHFHVLWDWHDGHFRQWURODXQHLLPSULPDQWHLVLPXOWDQDXIRVW
IRORVLWHLODDILDUHDSHWHUPLQDOHOHDOIDQXPHULFH
\a
\b
\f

Cod
07h
08h
0Ch

\n
\r

0Ah
0Dh

\t
\v
\\
\
\
\?
\ooo
\xhh

09h
0Bh
5Ch
27h
22h
3Fh
ooo
hh

6HFYHQ D

Caracter
BEL (alert produce un semnal sonor)
BS (backspace)
FF (form feed PXW FXUVRU OD
XUPWRDUHD SDJLQ

LF
CR (carriage return, salt la inceput de
linie QRX
HT (horizontal tab)
VT (vertical tab)
\ (backslash)
(apostrof)
(ghilimele)
? (semnul vQWUHEULL)
Caracterul cu codul ooo n octal
Caracterul cu codul hh n hexa

3HQWUX MXVWLILFDUHD LQWURGXFHULL DFHVWRU FDUDFWHUH GH FRQWURO VH YD SUH]HQWD XUPWRUXO
FD]HUDLQXWLOWULPLWHUHDXQLQXPUIL[GHFDUDFWHUHLGHQWLFHGHILHFDUHGDWFkQGVHGRUHD
XQ WDEXODWRU XQ DQXPLW QXPU GH VSD LL JRDOH  OD vQFHSXWXO XQXL SDUDJUDI L DWXQFL VD
FRQYHQLW V VH IRORVHDVF XQ FDUDFWHU GH FRQWURO XUPkQG FD LPSULPDQWD VO
UHFRQYHUWHDVF LQWHUQ vQ VSD LL JRDOH $QWHULRU VD SUH]HQWDW XQ WDEHO FH FRQ LQH DFHVWH
caractere.
2SHUD LXQLVLPSOHGHFLWLUHVDXDILDUHDGDWHORU

/LPEDMXO&DUHODGLVSR]L LHRVHULHGHIXQF LLSHQWUXFLWLUHDGDWHORUGHODWDVWDWXU


VDX SHQWUX DILDUHD ORU SH HFUDQ &HOH PDL IRORVLWH GLQWUH HOH VXQW JUXSDWH vQ GRX
biblioteci conio.h (&21VROH,QSXW2XWSXW+HDGHU  L StandardInputOutput.Header)
stdio.h.
)XQF LLGHLQWUDUHVDXLHLUHFXXWLOL]DWRUXO
Pentru a putea discuta primele programe este necesar studierea modului n care un
SURJUDP SRDWH VFKLPED GDWH GLVSR]LWLYHOH VWDQGDUG GH LQWUDUH VDX LHLUH PRQLWRU
WDVWDWXU 'LQDFHVWSXQFWGHYHGHUHH[LVWGRXFODVHGHIXQF LL
-

)XQF LL GH LQWUDUH FX DMXWRUXO FURUD VLVWHPXO GH FDOFXO SULPHWH GH OD WDVWDWXU
YDORUL QXPHULFH FRPHQ]L L RULFDUH DOW WLS GH LQIRUPD LH FH SRDWH IL IXUQL]DW SULQ
intermediul acelui dispozitiv.
)XQF LLGHLHLUHFXDMXWRUXOFURUDVLVWHPXOGHFDOFXOOLYUHD]UH]XOWDWHOH DILHD]
IRORVLQGXQGLVSR]LWLYVWDQGDUGGHLHLUH PRQLWRUVDXLPSULPDQW 

3HQWUXDFLWLRGDWVDXXQLUGHGDWHGHODWDVWDWXUDYHPRIXQF LHVSHFLDOL]DWFDUH
poate citi orice tip SUHGHILQLWGHGDWH)XQF LDDUHSURWRWLSXOSUH]HQWDWPDLMRV
int scanf (const char *format [,address, ...]);
7LSXOGHGDWHHVWHVSHFLILFDWGHFWUHSURJUDPDWRUSULQPRGLILFDUHDXQRUSDUDPHWULDL
IXQF LHL0DLMRVHVWHGDWXQVFXUWH[HPSOX
#include <stdio.h>
#include <conio.h>
void main (void)
{
int a;
char c;
char b[20];
float d;
FOUVFU WHUJHHFUDQXO
VFDQI G D FLWHWHXQvQWUHJLOGHSR]LWHD]vQ
// variabila a
VFDQI F F FLWHWHXQFDUDFWHU
VFDQI VE FLWHWHXQLUGHFDUDFWHUH
VFDQI I G FLWHWHXQQXPU]HFLPDO
getch();
}
$FHDVW IXQF LHOD DSHODUHSUHLDLQIRUPD LDLQWURGXV GH OD WDVWDWXU  GXS DSVDUHD
WDVWHL (17(5 &D HIHFW XWLOL]DWRUXO YHGH GRDU F SURJUDPXO vL RSUHWH GHUXODUHD L

DWHDSW FHYD GDU IU D SULPL XQ PHVDM FDUH V vL FRPXQLFH FH WUHEXLH V IDF VDX
LQIRUPD LLGHVSUHQDWXUDGDWHORUFDUHWUHEXLHVFOLYUDWH
0DLMRVHVWHSUH]HQWDWSURWRWLSXOXQHLIXQF LLGHVIRORVLWvQDILDUHDGLYHUVHORUWLSXUL
de date.
int printf (const char *format [, argument, ...]);
Ex: SULQWI $ILHD]FHOHQXPHUHGGGQUQUQU 

Vom prezenta un prim exemplu despre unele din SRVLELOLW LHGHDILDUHDOHIXQF LHLprintf
.
#include <stdio.h>
main()
{
int a;
/*ntreg simplu
*/
long int b;
/* ntreg lung
*/
short int c;
/* ntreg scurt
*/
unsigned LQWG vQWUHJIUVHPQ 
char e;
/* caracter simplu
*/
IORDWI QXPU]HFLPDOvQVLPSOSUHFL]LH 
GRXEOHJ QXPU]HFLPDOvQGXESUHFL]LH 
a = 1023;
b = 2222;
c = 123;
d = 1234;
e = 'X';
f = 3.14159;
g = 3.1415926535898;
printf("a = %G?QD  DILDUHIRORVLQGED]DGHQXPHUD LH 
printf("a = %R?QD  DILDUHIRORVLQGED]DGHQXPHUD LH 
printf("a = %[?QD  DILDUHIRORVLQGED]DGHQXPHUD LH 
printf("b = %OG?QE  DILDUHVSHFLILFSHQWUXvQWUHJOXQJ 
printf("c = %G?QF  DILDUHVSHFLILFSHQWUXvQWUHJVFXUW 
printf("d = %X?QG  DILDUHVSHFLILFSHQWUXvQWUHJIUVHPQ 
printf("e = %F?QH  DILDUHVSHFLILFSHQWUXFDUDFWHU 
printf("f = %I?QI  DILDUHVSHFLILFSHQWUXQXPUvQVLPSOSUHFL]LH 
printf("g = %I?QJ  DILDUHVSHFLILFSHQWUXQXPUvQGXEOSUHFL]LH 
printf("\n");
/*salt la line QRX 
printf("a = %G?QD  DILDUHVSHFLILFSHQWUXvQWUHJ 
SULQWI D G?QD  DILDUHVSHFLILFSHQWUXXQvQWUHJGDUDORFkQG
caractere n dreapta */

SULQWI D G?QD  DILDUHVSHFLILFSHQWUXXQvQWUHJGDU


alocnd 7 caractere n stnga */
c = 5;
d = 8;
printf("a = %*d\n",c,a); /* folosim un cmp de 5 caractere */
printf("a = %*d\n",d,a); /* folosim un cmp de 8 caractere */
printf("\n");
printf("f = %I?QI  DILDUHSHQWUXQXPUvQVLPSOSUHFL]LH 
printf("f = %12f\n",f); /* folosim un cmp de 12 caractere */
SULQWI I I?QI  IRORVLPXQFkPSGHFDUDFWHUHGXS
YLUJXO 
SULQWI I I?QI  IRORVLPXQFkPSGHFDUDFWHUHGXS
YLUJXO 
SULQWI I I?QI  DILDUHVSHFLILFSHQWUXXQQXPUvQ
VLPSOSUHFL]LHGDUDORFkQGFDUDFWHUHvQVWkQJD 
}
6UHOXPH[HPSOXOSUH]HQWDWODFLWLUHDGDWHORULQWURGXFkQGGHDFHDVWGDWL
mesajele pentru utilizator.
#include <stdio.h>
#include <conio.h>
void main (void)
{
int a;
char c;
char b[20];
float d;
FOUVFU WHUJHHFUDQXO
printf(Introduceti o valoare intreaga)
VFDQI G D FLWHWHXQvQWUHJLOGHSR]LWHD]vQ variabila a
printf(\nValoarea citita este %d, a);
printf(\nDati un caracter )
VFDQI F F FLWHWHXQFDUDFWHU
printf(\nCaracterul citit este %c,c);
prinf(\nDati un sir de caractere );
VFDQI VE FLWHWHXQLUGHFDUDFWHUH
printf(\nS-a citit urmatoarea propozitie %s,b);
printf(\nDati un numar zecimal);
VFDQI I G FLWHWHXQQXPU]HFLPDO
printf(\n Sa citi numarul %f,d)
printf(\nApasa orice tasta pentru a continua)
getch();
}

CAPITOLUL 5
5. Operatori ai limbajului C
8QRSHUDWRUUHSUH]LQWGLQSXQFWGHYHGHUHDOSURJUDPULLDFHOVLPEROFDUHDOWXUDWOD
XQDVDXGRXQXPHGHYDULDELOHVSHFLILFRSHUD LDFHWUHEXLHUHDOL]DWDVXSUDORU)XQF LH
GHQXPUXOGHYDULDELOH GHFLGHGDWH DVXSUDFUXLDVHDSOLFRSHUDWRULLSRWILFODVLILFD L
vQGRXPDULFDWHJRULL
-

operatori XQDULDFURUIRORVLUHSRDWHILFDPDLMRV
- nume_var_i oper_unar nume_var_j;
- oper_unar nume_var_i, unde i, j N;

RSHUDWRULELQDULDFURUIRORVLUHHVWHFDPDLMRV
- nume_var_i=nume_var_j oper_binar nume_var_k, unde
i, j, k N.

Limbajul C are mai multe tipuri de operatori:


-

RSHUDWRULDULWPHWLFLFDUHGDXSRVLELOLWDWHDUHDOL]ULLRULFURUFDOFXOHDULWPHWLFH
RSHUDWRUL UHOD LRQDOL FH VXQW IRORVL L SHQWUX WHVWDUHD UHOD LLORU FH SRW H[LVWD vQWUH
FRQ LQXWXODGRXYDULDELOH
RSHUDWRULORJLFLIRORVL LSHQWUX
- DSXWHDUHDOL]DH[SUHVLLFRPSOH[HvQFDGUXOWHVWULLUHOD LLORUGLQWUHYDULDELOH
- a procesa la nivel de bit variabilele.

5.1. Operatori aritmetici


$FHVW WLS GH RSHUDWRUL UHDOL]HD] FDOFXOH PDWHPDWLFH VLPSOH 'HVLJXU F SUHFL]LD vQ
FDUH YD IDFH FDOFXOXO UHVSHFWLYD DSOLFD LH LQH GH WLSXO FRQW GH GDW DOHV 2SHUDWRULL VXQW
SUH]HQWD LvQOLVWDGHPDLMRV6FRQVLGHUPGRXYDULDELOHDLEFDUHODXQPRPHQWGDW
FRQ LQYDORULOHD LE DWXQFL
- + adunare
y=a+by=8
- - VFGHUH
y=a-by=-2
- * vQPXO LUH
y=a*by=15
- / vPSU LUH
y=a/by=0.60000000
- % modulo
y=a%b\  UHVWXOvPSU LULLOXLDODE
5.2 Expresiile
2H[SUHVLHFRQVWGLQWUXQFRQJORPHUDWUHDOL]DWGLQ
operanzi
operatori
vQVFRSXOFDOFXOULLXQHLYDORUL
%ORFXULOHGHED]FRQVWUXFWLYHDOHH[SUHVLLORUSRWIL
variabile
constante

DSHOXULIXQF LH
([LVWSDWUXPDULWLSXULLPSRUWDQWHGHexpresii:.
1. Expresii constanteFDUHUH LQQXPDLYDORULFRQVWDQWH
De exemplu 5
5+6*13/30
a
2. Expresii ntregi care VXQWH[SUHVLLFDUHGXSUHDOL]DUHDWXWXURUFRQYHUVLLORUDXWRPDWH
sau explicite de tip, produc un rezultat care este de tip ntre. Presupunnd j,k ntregi
DWXQFLXUPWRDUHOHH[SUHVLLvQWUHJL
j
j*k
j/k+3
k-a
3+(int)5.0
3. ([SUHVLLvQYLUJXOPRELOFDUHVXQWH[SUHVLLFDUHGXSWRDWHFRQYHUVLLOHDXWRPDWHVDX
H[SOLYLWHGHWLSSURGXFXQUH]XOWDWFDUHHVWHvQYLUJXOPRELO'DF[HVWHfloat sau
GRXEOHDWXQFLXUPWRDUHOHH[SUHVLLVXQWGHDFHVWWLS
x
x+3
x/y*5
3.0
3.0-2
3+(float) 4
4. Expresii de tip pointer FDUHVXQWH[SUHVLLFDUHvQXUPDHYDOXULLGDXRDGUHV'H
H[HPSOXGDFSHVWHpointer, iar j este ntreg:
p, p+1, (char* ) 0x00ffffff, &j, abc sunt expresii de tip pointer.
2UGLQHDGHHYDOXDUHDXQHLH[SUHVLLIXQF LHGHSUHFHGHQ DRSHUDWRULORU
8QXOGLQSULPHOHOXFUXULGHFDUHWUHEXLH LQXWVHDPDFkQGVHVFULXH[SUHVLLDULWPHWLFH
FRPSOH[H HVWH IDSWXO F VSD LLOH DOEH VSD LX WDEXODWRU VDOW OD OLQLH QRX  QX DX vQ HOHV
QXVXQWOXDWHvQFRQVLGHUDUH 'HH[HPSOXFHOHGRXH[SUHVLLGHPDLMRVVXQWHFKLYDOHQWH
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 GH
HYDOXDUHDXQHLH[SUHVLL1R LXQHDGHHYDOXDUHVHUHIHUODRUGLQHDvQFDUHVHYRUUHDOL]D
FDOFXOHOH GLQWUR H[SUHVLH PDWHPDWLF  Q FDGUXO XQXL OLPEDM GH SURJUDPDUH QXPDL

SDUDQWH]HOHMRDFDFHVWUROQOLSVDSDUDQWH]HORUGLQWURH[SUHVLHVHYRUUHVSHFWDUHJXOLOH
GHSUHFHGHQ LPSOLFLW
&DXQH[HPSOXVGLVFXWPPRGXOGHHYDOXDUHDH[SUHVLHGHPDLVXVGDFVHYD LQH
VHDPD QXPDL GH SUHFHGHQ HOH LPSOLFLWH 'HRDUHFH RSHUDWRULL ^   ` DX DFHHDL
SUHFHGHQ FDUHvQVHVWHPDLPDUHFDDRSHUDWRULORU^`HYDOXDUHDH[SUHVLHLVHYDIDFH
GHODVWkQJDODGUHDSWDGXSFXPXUPHD]
1.
2.
3.
4.
5.
6.

VHFDOFXOHD]YDORDUHDOXLx*x;
VHFDOFXOHD]YDORDUHDOXL [
VHFDOFXOHD]YDORDUHDOXL [
VHFDOFXOHD]YDORDUHDOXL  [ \
se face suma (x*x)+(2*x);
VHIDFHVFGHUHD x*x)+(2*x) - (5*x)/y.

1R LXQHD GH SUHFHGHQ  VH UHIHU OD PRGXO vQ FDUH LDX GHFL]LL vQ HYDOXDUHD XQHL
H[SUHVLLGDFQXDPSXVHSDUDQWH]H0DLMRVHVWHSUH]HQWDWWDEHOXOFXWRDWHSUHFHGHQ HOH
implicite:
Operatori
() []
! ~ ++ -- + - (unary) &
(type) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &=
^= |= <<= >>=
,

2UGLQHDGHSUHFHGHQ 
de la stnga la dreapta
de la dreapta la stnga
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la stnga la dreapta
de la dreapta la stnga
de la dreapta la stnga
de la stnga la dreapta

5.3. Tipuri aritmetice de date


1XPHUHOHvQWUHJLVXQWUHSUH]HQWDWHGLIHULWGH FHOHvQYLUJXO IORWDQW'H DFHHDDSDUH
XUPWRDUHDSUREOHPFRQYHUVLDQXPHUHORUdintr un format ntr-altul.
'DF VH GRUHWH FD UH]XOWDWXO V ILH VWRFDW vQWUXQ DOW IRUPDW PDL PXOW VDX PDL SX LQ
FXSULQ]WRUDWXQFLDFHVWDWUHEXLHGHSXVntrRYDULDELOGHUHVSHFWLYXOWLSLFRQYHUVLDVH
YDIDFHDXWRPDW([LVWFD]XULvQFDUHFRPSLODWRUXOGHLDFFHSWFRQYHUVLDGXQPHVDM

GH DWHQ LRQDUH $FHDVW VLWXD LH DSDUH DWXQFL FkQG VH SRDWH DOWHUD YDORDUHD XQRU GDWH
deoarece formatul n care fac conversia este mai mic.
'DF SURJUDPDWRUXO HVWH VLJXU F GRUHWH UHVSHFWLYD FRQYHUVLH DWXQFL WUHEXLH V
UHDOL]H]H R FRQYHUVLH H[SOLFLW SHQWUX FD UHVSHFWLYXO PHVDM GH DWHQ LRQDUH V GLVSDU
'HRDUHFHODFRQYHUVLLOHLPSOLFLWHVHSRDWHDOWHUDYDORDUHDFDOFXODWSRDWHDSUHDRHURDUH
JUHXGHWHFWDELO
S1= (int)((double)z/x+0.5);
QH[HPSOXOGHPDLVXVVHIRU HD]WUXQFKLHUHDGHODRUHSUH]HQWDUHGHWLSdouble la o
reprezentare n numere ntregi.
'DWHOHQXSRWILDOWHUDWHGDFVHUHDOL]HD]RFRQYHUVLHGHWLSvQWUHXQWLSGHGDWFX
GRPHQLXGHYDORULPDLPLFLXQWLSGHGDWDOFUXLGRPHQLXHVWHPDLPDUH
5.4. Operatorii unari ++L- 'XS FXP VD PHQ LRQDW DFHWL RSHUDWRUL VH QXPHVF XQDUL GHRDUHFH VH DSOLF
DVXSUDXQHLVLQJXUHYDULDELOH H[SUHVLL ODXQPRPHQWGDW(LUHDOL]HD]LQFUHPHQWDUHDVDX
decrementarea valorii respective cu o unitate.
/LPEDMXO & PDL DUH XQ DYDQWDM DFHWL RSHUDWRUL SRW IL IRORVL L SHQWUX SRVW VDX
preincrementare. Acest lucru este prezentat n exemplu de mai jos:
'DF[ DWXQFL
Preincrementare
Predecrementare
Postincrementare
Postdecrementare

y=++x
y=--x
y=x++
y=x--

x=x+1=5
L\ [ 
x=x-1=3 L\ [ 
y=x=4
L[ [ 
y=x=4
L[ [ 

5.5. Operatorii op=


$X IRW LQWURGXL SHQWUX VLPSOLILFDUHD VFULHULL FRGXOXL 2 LQVWUXF LXQH JHQHULF GH
tipul rez = rez op opd1 UH]RS RSG$FHWLRSHUDWRULDSDU LQXUPWRDUHLFODVH^
+= -= = /= %= &= ^= |=} de exemplu: x=x*7 x*=7;
2SHUDWRULUHOD LRQDOLLORJLFL
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 D
LQIRUPD LLORU L GH DVHPHQL GH FRPELQDUH  D H[SUHVLLORU ORJLFH SULPLWLY vQ H[SUHVLL PDL
complexe.
'HH[HPSOXGDFvQYDULDELOHOH[L\DPVWRFDWYDORDUHDDWXQFLH[SUHVLDx==y va fi
$'(95$7LYDDYHDODHYDOXDUHDH[SUHVLHLYDORDUHDQXPHULFGDF[ L\ 
atunci expresia [ \YDIL)$/6LGHFLvQXUPDHYDOXULLYDILvQORFXLWFXYDORDUHD

([SOLFD LH

Operatori
UHOD LRQDOL
==
!=
>
<
>=
<=
Operatori logici
||
&&
!

Egal cu
Diferit de
Mai mare ca
Mai mic ca
Mai mare sau egal
Mai mic sau egal
SAU
,
NU

5.7. Expresii logice complexe


'H RELFHL HVWH LQVXILFLHQW R VLQJXU H[SUHVLH ORJLF VLPSO Q VFULHUHD XQXL
SURJUDPHVWHQHFHVDUGHPXOWHRULFRPSXQHUHDDPDLPXOWHGHFL]LL8QH[HPSOXFODVLF
HVWHFD]XOvQFDUHWUHEXLHYHULILFDWDSDUWHQH DYDORULLVWRFDWHvQWURYDULDELOODXQDQXPLW
interval. De exemplu x[5,20] este echivalent cu xL[20 ceea ce folosind operatori
ORJLFLLUHOD LRQDOLVHSRDWHVFULH [!  [  
7DEHOHOHGHDGHYUSHQWUXRSHUDWRULLORJLFLDLOLPEDMXOXLVXQW
X Y
0
0
1
1

0
1
0
1

X&&Y

X||Y

!X

0
0
0
1

0
1
1
1

1
1
0
0

8UPHD]SUH]HQWDUHDXQSURJUDPVLPSOXFDUHUHDOL]HD]GLYHUVHRSHUD LLORJLFHFXXQ
VHW GH YDORUL LQL LDOL]DWH GLUHFW vQ SURJUDP $FHDVW PHWRG GH LQL LDOL]DUHD DUH
GH]DYDQWDMXOFSURJUDPXOQXSRDWHSULPLSHQWUXFDOFXODOWHYDORULGHFkWGDFVHPRGLILF
FRGXOVXUV
void main(void)
{
char mask;
char number[6];// tablou de 6 elemente de tip char
char and,or,xor,inv,index;
QXPEHU>@ [LQL LDOL]DUHvQFRG
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 o
masca sunt: \n");

mask = 0x0F;
for (index = 0;index <= 5;index++) {
and = mask & QXPEHU>LQGH[@LORJLF
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);
}
}
3HQWUXUHVWXOWLSXULORUGHRSHUDWRULSUH]HQWD LYRPGDXQDOWH[HPSOXGHIRORVLUHDORU
void main(void)
{
int x = 0,y = 2,z = 1025;
float a = 0.0,b = 3.14159,c = -37.234;
/* incrementare */
[ [ [VHLQFUHPHQWHD] 
x++;
/* x se SRVWLQFUHPHQWHD] 
++x;
/* x se SUHLQFUHPHQWHD][ 
z = y++;
/* z = 2, y = 3 */
z = ++y;
/* z = 4, y = 4 */
/* decrementare */
\ \ \VHGHFUHPHQWHD] 
y--;
/* y este postdecrementat */
--y;
/* y este predecrementat */
y = 3;
z = y--;
/* z = 3, y = 2 */
z = --y;
/* z = 1, y = 1 */
 RSHUD LLDULWPHWLFH 
D D VHDGXQODD 
D  VHDGXQvQFODD 

D  DVHvQPXO HWHFX 


a -= b;
/* se scade b din a */
a /= 10.0;
/* se mparte a la 10.0 */
 H[SUHVLLFRQGL LRQDOH 
D  E! "  DFHDVWH[SUHVLH 
LI E!   HVWHLGHQWLFFXWRDWLQVWUXF LXQHDif */
a = 2.0;
/* din punct de vedere al rezultatului*/
else
a = 10.5;
c = (a > E"DE  FSULPHWHPD[LPXPGLQWUHDLE 
c = (a > E"ED  FSULPHWHPLQLPXOGLQWUHDLE 
}

CAPITOLUL 6
,QVWUXF LXQLGHVHOHF LH GHFL]LH 
,QVWUXF LXQHVLPSOGHGHFL]LH
)LHXUPWRDUHDSUREOHPFHWUHEXLHUH]ROYDWSULQLQWHUPHGLXOXQXLSURJUDP
6VHUHDOL]H]HXQSURJUDPFDUHIDFHDXWRPDWFDOFXOXOPHGLHLGHOLFHQ LDPHGLHL
generale.
3URJUDPXOSULPHWHWUHLPHGLLGHOHH[DPHQHOHGHOLFHQ LQRWDSULPLWODVXV LQHUHD
SURLHFWXOXLGHVWDW(OWUHEXLHVFDOFXOH]HPHGLDvQWUHQRWHOHGHODH[DPHQHOHGHOLFHQ 
UH]XOWkQGRSULPPHGLHFDUHDSRLVHPHGLD]FXQRWDGHODSURLHFWXOGHVWDWUH]XOWkQG
PHGLDJHQHUDO
([LVWROLPLWDUHDVXSUDGDWHORUGHLQWUDUHFDUHWUHEXLHUHDOL]DWGHSURJUDPLDQXPH
GDFXQDGLQPHGLLOHGHODH[DPHQXOGHOLFHQ HVWHPDLPLFFDFLQFLVQXPDLUHDOL]H]H
FDOFXOXOPHGLLORUILQDOHLVOGHFODUHSHUHVSHFWLYXOFDQGLGDWUHVSLQV
2VROX LHGHUH]ROYDUHDSUREOHPHLODQLYHOGHSVHXGRFRGDUDWFDPDLMRV
LQFOXGHOLEUULLOHQHFHVDUHOXFUXOXLvQPRGWH[W
void main(void)
{//nceput program
GHFODUYDULDELOHOHQQQQVPPGHWLSUHDO
WHUJHHFUDQXO
FLWHWHQRWDvQYDULDELODQ
FLWHWHQRWDvQYDULDELODQ
FLWHWHQRWDvQYDULDELODQ
GDF Q! L Q! L Q! DWXQFL
{
FLWHWHQRWDVWDWvQYDULDELODns;
UHDOL]HD]PHGLDP QQQ 
UHDOL]HD]PHGLDP PQV 
DILHD]PHGLDGHOLFHQ DP
DILHD]PHGLDJHQHUDOP
}
DOWIHODILHD]&DQGLGDWUHVSLQV
DWHDSWRWDVW
`VIkULWGHSURJUDP
6H REVHUY F D IRVW QHYRLH GH R UDPLILFDUH OD QLYHOXO SURFHVULL GDWHORU UDPLILFDUH
FDUHDSDUHGLQQHYRLOHXWLOL]DWRUXOXL(VWHQHYRLHFDODXQPRPHQWGDWVKRWUkPPRGXUL
PXOWLSOHGHSUHOXFUDUHSHQWUXDFHODLIOX[GHGDWHGHLQWUDUH
Q OLPEDMXO & SHQWUX D LPSOHPHQWD DFHVW WLS GH GHFL]LL D IRVW LQWURGXV
LQVWUXF LXQHDif cu sintaxa ca mai jos:

if (FRQGL LH DGHYUDW 
{
LQVWUXF LXQL
H[HFXWEORFLQVWUXF LXQL
}
else
{
H[HFXWEORFLQVWUXF LXQL
};

GDFFRQGL LDHVWHDGHYUDW
H[HFXW EORF
altfel

H[HFXWEORFLQVWUXF LXQL

6LQWD[D LQVWUXF LXQLL HVWH LGHQWLF FX SVHXGRFRGXO ELQHvQ HOHV F VH IRORVHWH OLPED
HQJOH]

)LJD5HSUH]HQWDUHDSULQVFKHPDORJLFDLQVWUXF LXQLLGHGHFL]LH

)LJE5HSUH]HQWDUHDSULQVFKHPDORJLFDLQVWUXF LXQLLGHGHFL]LHVLPSOH
Q ILJXULOH D L E HVWH SUH]HQWDW UHSUH]HQWDUHD OD QLYHO GH VFKHP ORJLF D
LQVWUXF LXQLLGHGHFL]LH6SUHGHRVHELUHGHDOWHOLPEDMHGHSURJUDPDUHFXPDUIL3$6&$/
GHH[HPSOXOLPEDMXO&QXIRORVHWHYDULDELOHGHWLSORJLFSHQWUXUH]XOWDWXOHYDOXULLXQHL
expresii. Valorile comparate pot rezulta din valoarea UHWXUQDW GH R IXQF LH GLQ FHD
VWRFDWvQWURYDULDELOVDXGLUHFWGDWvQSURJUDP
'DFvQORFXO FRQGL LHLvQXUPDHYDOXULLH[SUHVLHLUH]XOWXQQXPUGLIHULW GH ]HUR
DFHVWDYDILFRQVLGHUDWFDFRQGL LHvQGHSOLQLWLGHFLVHYDH[HFXWDEORFXOGHLQVWUXF LXQL
GDF HVWH ]HUR FRQGL LD QX HVWH VDWLVIFXW DWXQFL VH YD H[HFXWD EORFXO GH LQVWUXF LXQL
$FHVW OXFUX FRQIHU XQ PDUH DYDQWDM SULQ IDSWXO F VH SRW LQWURGXFH GLUHFW H[SUHVLL
PDWHPDWLFH VDX DSHOXUL GH IXQF LL FH UHWXUQHD] UH]XOWDWH QXPHULFH vQ ]RQD GH WHVW D
FRQGL LHL
1XvQWRWGHDXQDHVWHQHYRLHGH DPEHOHSU LDOHLQVWUXF LXQLLGHH[HPSOXFkQGVH
H[HFXW R RSHUD LXQH QXPDL GDF HVWH vQGHSOLQLW R DQXPLW FRQGL LH 'H IDSW VWUXFWXUD
ORJLF GH FRQWURO DU WUHEXL SUHY]XW L FX R UDPXU GH else dar acest lucru nu ar duce
GHFkW OD VXSUDvQFUFDUHD FRGXOXL FHHD FH vQJUHXQHD] PXOW GHSDQDUHD SURJUDPXOXL
UH]XOWkQGVLQWD[DSUH]HQWDWPDLMRV

if (FRQGL LH DGHYUDW
{
LQVWUXF LXQL
H[HFXWEORFLQVWUXF LXQL
};

GDFFRQGL LDHVWHDGHYUDWDWXQFL
e[HFXW EORF

QFD]XOvQFDUHVXQWLPSOLFDWHPDLPXOWHGHFL]LLVLPSOHFDUHWUHEXLHVFOXDWHIXQF LH
GH GLIHULWH YDORUL DOH XQHL VLQJXUH YDULDELOH OLPEDMXO HVWH SUHY]XW FX LQVWUXF LXQH
VSHFLDOL]DWFDVH'LVFX LDDFHVWHLLQVWUXF LXQLVHYDIDFHXOWHULRU
0DLMRVHVWHSUH]HQWDWSURJUDPXOFRUHVSXQ]WRUpseudocodului 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);
}
else
printf(Candidat respins);
getch();
}
2EVHUYD LL
1. Q DFHDVW ID] IDSWXO F VD IRORVLW R UHIHULQ  SHQWUX FLWLUHD XQHL YDULDELOH  YH]L
Q QXSRDWHILH[SOLFDWVXILFLHQWLYDWUHEXLOXDWFDDWDUHvQFD]XOFLWLULLYDULDELOHORU
simple.
2. Operatorul ?QUHDOL]HD]XQVDOWODOLQLHQRX

3. 6H REVHUY F SH UDPXUD GH else nu s-au introdus delimitatorii de bloc (acoladele)
SHQWUX F GDF DFHWLD QX VXQW SUHFL]D L SULPD LQVWUXF LXQH HVWH DXWRPDW FRQVLGHUDW
DSDU LQkQGUDPXULLUHVSHFWLYH
4. 3HQWUX SURJUDPDWRULL PDL DYDQVD L vQ PRPHQWXO vQ FDUH EORFXO GH LQVWUXF LXQL HVWH
IRUPDWGLQWURVLQJXULQVWUXF LXQHVHSRDWHIRORVLRSHUDWRUXO"FDvQH[HPSOXOGHPDL
jos, 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[LPXOGLQWUHYDULYDULOGHSXQHvQYDULDELODPD[
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 LDLQVWUXF LXQLLYDDYHDFDHIHFW]  
LI [!] D 
$
 H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFWD  
LI  [!] D 
%
 H[HFX LDLQVWUXF LXQLLQXYDDYHDQLFLXQHIHFW 
LI E F U  H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFWU  
LI U V W F H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFWW  
LI [  U V ]  H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFW
IDSWXOF[YDOXDYDORULSR]LWLYHLDU]  
LI [ \ ]  H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFW
[ \L]  
LI [  ]  H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFW]  
LI [ ]  H[HFX LDLQVWUXF LXQLLYDDYHDFDHIHFW]  
x = y = z = 77;
LI [ \   [

 ]  H[HFX LDLQVWUXF LXQLLYDDYHD


ca efect z = 33 */
LI [!\ __ ]! ]  H[HFX LDLQVWUXF LXQLLYDDYHD
ca efect z = 22 */
LI [ \ ] ]  H[HFX LDLQVWUXF LXQLLYDDYHD
ca efect z = 11 */
LI [    \    ]  U  H[HFX LDLQVWUXF LXQLL

LI [

va avea ca efect x = 1, y = 2, z = 3, r = 12.00 */


   \    ]  U  H[HFX LDLQVWUXF LXQLLQX
va avea nici un efect */

if (x == x); z = 27.345; /* z se va modifica ntotdeauna */


LI [ [ ]  \QXVHYDPRGLILFDQLFLRGDW 
LI [  ]  [YDOXDYDORDUHD]YDUPkQHQHVFKLPEDW 
}
,QVWUXF LXQHGHGHFL]LHPXOWLSO VHOHF LH
([LVW VLWXD LL vQ FDUH UH]ROYDUHD XQHL SUREOHPH LPSXQH FD R GHFL]LH V FRQGXF OD
H[HFX LDDPDLPXOWGHGRXUDPXULGHSURJUDP&DH[HPSOXVFRQVLGHUPFD]XO FHOHL
PDLVLPSOHIRUPHGHPHQLXFDUHSRDWHILRIHULWXQXLXWLOL]DWRU
6HFLWHWHXQQXPUGHODWDVWDWXU )XQF LHGHYDORDUHDGDWVHSRDWHDOHJHH[HFX LD
XQHLDGLQWUHRS LXQLOHSUH]HQWDWHXWLOL]DWRUXOXL0DLMRVHVWHSUH]HQWDWXQPHQLXVLPSOX
folosind metoda pseudocodului.
WHUJHHFUDQ
DILHD]PHVDM$SDVXQDGLQWDVWHSHQWUXDDOHJHRSHUD LXQHDGRULW
DILHD]PHVDM&LWLUHGLQILLHU
DILHD]PHVDM6FULHUHLQILLHU
DILHD]PHVDM3URFHVDUHGDWH
DILHD]PHVDMDILDUHJUDILFUH]XOWDW
FLWHWHRWDVW
IXQF LHGHWDVWFLWLW
GDFHDSHOHD]IXQF LDGHFLWLUHGLQILLHUDSRLVWRS
GDFHDSHOHD]IXQF LDGHVFULHUHLQILLHUDSRLVWRS
GDFHDSHOHD]IXQF LDGHSURFHVDUHGDWHDSRLVWRS
GDFHDSHOHD]IXQF LDGHDILDUHJUDILFDUH]XOWDWHDSRLVWRS
GDFQXHQLFLXQXOGLQQXPHUHOHGHPDLVXV
DILHD]PHVDM2S LXQHLQYDOLG
6H REVHUY F VH SRDWH UHDOL]D LPSOHPHQWDUHD L FX LQVWUXF LXQL if dar, acest
OXFUXQXHVWHMXVWLILFDWDWkWWLPSFkW DYHPRLQVWUXF LXQHVSHFLDOL]DWSHQWUXDFHVWWLS
GHVLWXD LL$FHDVWDHVWHLQVWUXF LXQHDFDVHFXXUPWRDUHDVLQWD[
sZLWFK RSHUDQG IXQF LHGHRSHUDQG
{
FDVHYDOGDFRSHUDQGXOLDYDORDUHD
EORFGHLQVWUXF LXQL
break; // stop
case vDOGDFRSHUDQGXOLDYDORDUHD
EORFGHLQVWUXF LXQL
break; // stop

...
case YDOQGDFRSHUDQGXOLDYDORDUHDQ
EORFGHLQVWUXF LXQLQ
break; // stop
GHIDXOWSHQWUXRULFHDOWYDORDUH
EORFGHLQVWUXF LXQLFHWUDWHD]UHVWXOYDORULORU
ce le poate avea operandul
} // stop
2IRUPGHUHSUH]HQWDUHODQLYHOGHVFKHPDORJLFDUILFHDSUH]HQWDWvQILJXUD

)LJ6FKHPDORJLFSHQWUXUHSUH]HQWDUHDXQHLVWUXFWXUL
GHVHOHF LHPXOWLSO
0DL MRV HVWH SUH]HQWDW XQ SURJUDP FDUH FLWHWH GRL RSHUDQ]L GH OD WDVWDWXU DSRL QH
SHUPLWHVHOHF LDRSHUD LHLPDWHPDWLFHFHWUHEXLHUHDOL]DWFDvQILQDOVDILH]HUH]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)

{
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);
}

CAPITOLUL 7
,QVWUXF LXQLGHFLFODUH,QWURGXFHUH
6DGLVFXWDWSkQ 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 SRW
UHSHWDRGDWLQVWUXLWHFHLFkW SURJUDPDWH XQQXPUGHRSHUD LXQLGH FkWHRUL HVWH
QHYRLH 2ULFH OLPEDM GH SURJUDPDUH HVWH DUH LPSOHPHQWDW DFHDVW SRVLELOLWDWH ([LVW
GRXFODVHGHLQVWUXF LXQLGHFLFODUH UHSHWDUH 
2SULPFDWHJRULHVH UHIHUODLQVWUXF LXQLOH FDUH UHSHW XQ EORF GH LQVWUXF LXQL SkQ
FkQGHVWHvQGHSOLQLWRFRQGL LH SULQFRQGL LHSXWHPvQ HOHJHRH[SUHVLHPXOWLSOFHYDIL
HYDOXDW GH FWUH FRPSLODWRU  'H RELFHL HVWH IRORVLW SHQWUX LQWHUDF LXQL UHSHWLWLYH FX
XWLOL]DWRUXOVDXvQFDOFXOXOQXPHULFSULQDSUR[LPD LLLGHDFHHDLQVWUXF LXQLOHUHVSHFWLYH
VHQXPHVFLQVWUXF LXQLFXQXPUQHFXQRVFXWGHSDL
2 D GRXD FDWHJRULH GH LQVWUXF LXQL UHSHWLWLYH HVWH DFHHD D LQVWUXF LXQLORU FX QXPU
FXQRVFXWGHSDL'LQSXQFWGHYHGHUHDOOLPEDMXOXLQXDUILVWULFWQHYRLHGHDFHVWWLSGH
LQVWUXF LXQL SHQWUX F VH SRDWH UHDOL]D DFHVW OXFUX FX LQVWUXF LXQLOH GLQ SULPD FODV
7RWXL GXS FXP VH YD REVHUYD PDL MRV LPSOHPHQWDUHD FX LQVWUXF LXQL FX QXPU
QHFXQRVFXWGHSDL  SHQWUX DFHDVW D GRXD FODV SUHVXSXQH XQ FRG FDUH YD IL LGHQWLF OD
DEVROXW WRDWH LQWHUSUHWULOH 3HQWUX D XXUD VFULHUHD FRGXOXL L DO IDFH PDL FODU VD
LPSOHPHQWDWRLQVWUXF LXQHQRXIRU... .
,QVWUXF LXQLFXQXPUQHFXQRVFXWGHSDL
,QVWUXF LXQHDwhile
(VWHRLQVWUXF LXQHFDUHSHUPLWHUHSHWDUHDVDXQXDH[HFX LHLXQHLEXF LGHFRGIXQF LH
GHYDORDUHDGHDGHYUDXQHLH[SUHVLL
8QH[HPSOXvQFDUHDUILQHFHVDUDFHVWWLSGHLQVWUXF LXQLDUILUHVWULF LDGRPHQLXOXL
de valori n cazul datelor care le poate introduce un utilizator. Acest lucru este necesar
SHQWUXFGHRELFHLXWLOL]DWRUXOQX LQHFRQWGHWRDWHUHVWULF LLOHUHODWLYODLQWHUYDOXOvQFDUH
poate da o valoare de LQWUDUHVDX SRDWH GD GLQ JUHHDO R YDORDUH LQFRUHFW 7RWXL
PRGHOXOPDWHPDWLFVSHFLILFFODUFDOJRULWPXOOXFUHD]FRUHFWQXPDLvQLQWHUYDOXO>a,b].
3HQWUX XWLOL]DWRU IDSWXO F SURJUDPXO G XQ UH]XOWDW HURQDW GDWRULW XQHL YDORUL GH
LQWUDUH LQWURGXV JUHLW vQVHDPQ F SURJUDPXO QX IXQF LRQHD] FRUHFW (VWH QHFHVDU FD
SURJUDPDWRUXO V QX SHUPLW LQWURGXFHUHD DOWRU GDWH GHFkW FHOH VSHFLILFDWH GH PRGHOXO
matematic.
2EVHUYD LH OLPEDMXO & VSUH GHRVHELUH GH OLPEDMXO 3DVFDO QX JHQHUHD] XQ PHVDM GH
HURDUH GDF WLSXO GH GDW LQWURGXV QX FRLQFLGH FX VSHFLILFDWRUXO GDW IXQF LHL scanf. Din
DFHVWPRWLYvQPRPHQWXOvQFDUHVHSUHJWHWHRYHUVLXQHEHWD SULPDYHUVLXQHDDSOLFD LHL
FDUH YD IL IRORVLW GH FWUH XWLOL]DWRU  WUHEXLHVF LQWURGXVH WRDWH UHVWULF LLOH GH WLSXO
PHQ LRQDWPDLVXV/DQLYHOGHSVHXGRFRGPHWRGDSRDWHILGHVFULVFDPDLMRV
FLWHWHYDORDUHDGHLQWUDUH
attaWLPSFkWYDORDUHDGHLQWUDUHQXVHDIOvQLQWHUYDOXO>a,b]
HPLWHXQPHVDMGHDWHQ LRQDUHFWUHXWLOL]DWRU

UHFLWHWHYDORDUHD
3HQWUXDFHDVWDVHSRDWHIRORVLLQVWUXF LXQHDZKLOHDFUHLVLQWD[HVWHSUH]HQWDW
mai jos:
while(FRQGLWLH DWkWDWLPSFkWFRQGL LDHVWHDGHYUDWH[HFXW
{
EORFGHLQVWUXF LXQL
}
QILJXUDHVWHSUH]HQWDWVFKHPDORJLFFRUHVSXQ]WRDUHLQVWUXF LXQLLwhile.

LQVWUXF LXQLLwhile

)LJ6FKHPDORJLFD

QH[HPSOXOGHPDLMRVHVWHYRUEDGHFLWLUHDXQHLYDORULvQWUHJLFDUHWUHEXLHVDSDU 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]UHVWXOSURJUDPXOXL
}
,QVWUXF LXQHDGRwhile
'XSFXPVDPHQ LRQDWDQWHULRULQVWUXF LXQHDZKLOHWHVWHD]PDLvQWkLYDORDUHD
GH DGHYU D H[SUHVLHL GH HYDOXDW L DSRL IXQF LH GH DFHDVWD H[HFXW VDX QX EORFXO GH
LQVWUXF LXQL'HDFHHDLVHPDLVSXQHLQVWUXF LXQHGHFLFODUHFXWHVWDQWHULRU

'DFVHDQDOL]HD]H[HPSOXOGHPDLVXVGLQSXQFWGHYHGHUHDOVLPSOLW LLFRGXOXL
VH REVHUY F EORFXO GH LQVWUXF LXQL SHQWUX FLWLUHD YDULDELOHL D IRVW VFULV GH GRX RUL
3HQWUXDHYLWDVFULHUHGHFRGLQXWLOvQDFHDVWVLWXD LHSVHXGRFRGXOWUHEXLHVILHFDPDL
jos:
FLWHWHYDORDUHD
YHULILFGDFVHDIOvQLQWHUYDOXOGRULW
GDFGDFRQWLQXSURJUDPXO
GDFQXUHLDGe la citirea variabilei
3HQWUXDSXWHDUH]ROYDHOHJDQWVLWXD LLOHGHDFHVWJHQVDPDLLQWURGXVRLQVWUXF LXQHL
anume doZKLOHDFUHLVLQWD[HVWHSUH]HQWDWPDLMRV
GRH[HFXW
{
EORFGHLQVWUXF LXQL
}ZKLOH FRQGL LH DWkWDWLPSFkWFRQGL LDHVWHDGHYUDW
QILJXUDDYHPSUH]HQWDWVFKHPDORJLFSHQWUXLQVWUXF LXQHDGRwhile.

)LJ6FKHPDORJLFDLQVWUXF LXQLLGRwhile
)RORVLQGDFHDVWLQVWUXF LXQHFRGXOSUH]HQWDWPDLVXVGHYLQH
#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]UHVWXOSURJUDPXOXL
}

'HFLVHFLWHWHQXPUXOLGDFDFHVWDQXHVWHFRUHFWVHUHLDFLWLUHD3HQWUXYDOLGDUHD
DILULL PHVDMXOXL GH HURDUH VD SUHY]XW YHULILFDUHD FRQGL LHL SHQWUX F GDF XWLOL]DWRUXO
LQWURGXFHFRUHFWYDORDUHDGHSULPDRDUQXHVWHSHUPLVDILDUHDPHVDMXOXLGHHURDUH
$FHDVWLQVWUXF LXQHH[HFXWPFDURGDWEORFXOGHLQVWUXF LXQLLGHDELDDSRLIDFH
HYDOXDUHDH[SUHVLHLSHQWUXDSXWHDYHGHDGDFDFHVWDVHPDLUHSHWVDXQX'HDFHHDLVH
PDLVSXQHLLQVWUXF LXQHGHFLFODUHFXWHVWSRVWHULRU
,QVWUXF LXQLFXQXPUFXQRVFXWGHSDL,QVWUXF LXQHDIRU
'LQFHOHSUH]HQWDWHSkQDFXPUH]XOWFVHSRDWHUHSHWDXQEORFGHLQVWUXF LXQLSkQ
FkQGHVWHvQGHSOLQLWRFRQGL LH([LVWFD]XULFkQGVHFXQRDWHGHODvQFHSXWFkWHYDORULVH
GRUHVFD ILSUHOXFUDWH ILH SULQ VSHFLILFDUHD GLUHFW D XWLOL]DWRUXOXL ILH FD UH]XOWDW D XQRU
FDOFXOH DQWHULRDUH'HRELFHLDFHVWOXFUX VH DSOLF OD FDOFXOXO YHFWRULDO VDX PDWULFLDO GDU
nu numai.
QWUXFkWQXVDGLVFXWDWvQFGHVSUHDFHVWWLSGHGDWHVHYDOXDvQGLVFX LHXQH[HPSOX
PDL VLPSOX FXP DU IL UHDOL]DUHD XQXL SURJUDP FH YD ULGLFD XQ QXPU OD R SXWHUH
3VHXGRFRGXOLDSRLSURJUDPXOVXQWSUH]HQWDWHPDLMRV
FLWHWHQXPUXO nr)
FLWHWHSXWHUHDODFDUHYDILULGLFDW pw)
LQL LDOL]HD]YDULDELODUH]XOWDWFHYDSVWUDnr la putere, cu 1 (rez=1)
DWkWDWLPSFkWYDULDELODFHDSULPLWSXWHUHD!I
rez=rez*nr;
pw=pw-1;
UHSHW
DILHD]UH]XOWDWXO
&RGXOVXUVFRUHVSXQ]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;

pw=pw-1;//*****
}
printf(Numarul %d la puterea %d este %f,nr,pw,rez);
getch();
}
,QVWUXF LXQLOHPDUFDWHFXDVWHUL[VHUHSHWvQIRDUWHPXOWHVLWXD LLFkQGQXPUXOGHSDL
HVWHFXQRVFXW'HDFHHDVDLPSOHPHQWDWLQVWUXF LXQHDIRUDYkQGXUPWRDUHDVLQWD[
for(FRQWRU YDORDUHLQL LDOFRQWRUVDX!YDORDUHILQDO
contor=contor+sau -pas)
{
EORFGHLQVWUXF LXQL
}
/DQLYHOGHVFKHPDORJLFH[HFX LDLQVWUXF LXQLL for HVWHSUH]HQWDWvQILJXUD

)LJ6FKHPDORJLFLQVWUXF LXQLLfor
$FXP VH REVHUY F DFHDVW LQVWUXF LXQH VFXWHWH SURJUDPDWRUXO GH D VFULH FRG
suplimentar. Programul anterior UHVFULVIRORVLQGDFHDVWLQVWUXF LXQHHVWHGDWPDLMRV
#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;
FRGXOPDLSRDWHILVFULVLFDLQ]RQDFRPHQWDWDFHXUPHD]
// for(i=pw;i>0;i=i-1)
//
rez=rez*nr;
printf(Numarul %d la puterea %d este %f,nr,pw,rez);

getch();
}
([LVWXQFRQWUROWRWDODVXSUDGHVIXUULLEXFOHLH[DFWFDLvQFD]XO while dar codul
scris este mult mai succint.
2EVHUYD LD'DFEORFXOGHLQVWUXF LXQLFRQVWvQWURVLQJXULQVWUXF LXQHSDUDQWH]HOHQX
mai 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 GH
LQVWUXF LXQLYDILGRDURVLQJXUGDWH[HFXWDW
$OWHLQVWUXF LXQL
,QVWUXF LXQHDbreak
(IHFWXOLQVWUXF LXQLLEUHDNFRQVWvQSUVLUHDLPHGLDWDFHOHLPDLDSURSLDWH WH[WXDO
LQVWUXF LXQLswitch, ZKLOHGRIRUvQFRQMXUWRDUH
,QVWUXF LXQHDFRQWLQXH
,QVWUXF LXQHD FRQWLQXH QX VH SRDWH XWLOL]D GHFkW vQWU-un ciclu while, do sau for.
(IHFWXOLQVWUXF LXQLLFRQWLQXHFRQVW
-

ntrXQVDOWODHYDOXDUHDFRQGL LHLGHFLFODUHGDFFHDPDLDSURSLDW WH[WXDO LQVWUXF LXQH


GHFLFODUHvQFRQMXUWRDUHHVWHwhile sau do.
ntrXQ VDOWOD HYDOXDUHD H[SUHVLHL GLQ DWUHLD SR]L LH  GDF FHD PDL DSURSLDW WH[WXDO
LQVWUXF LXQHGHFLFODUHvQFRQMXUWRDUHHVWHIRU
3UH]HQWPPDLMRVXQH[HPSOXVLPSOXGHIRORVLUHDLQVWUXF LXQLLEUHDNLFRQWLQXH
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 LXQHDgoto QXPHBHWLFKHW


(IHFWXOLQVWUXF LXQLLJRWRFRQVWvQWUXQVDOWQHFRQGL LRQDWODLQVWUXF LXQHDFXHWLFKHWD
FLWDWvQLQVWUXF LXQHDGHVDOWFDUHWUHEXLHVVHDIOHvQDFHHDLIXQF LH

,QVWUXF LXQHDreturn
(IHFWXO LQVWUXF LXQLL UHWXUQ FRQGXFH OD WHUPLQDUHD LPHGLDW D H[HFX LHL IXQF LHL
FXUHQWHLODUHYHQLUHDODIXQF LDDSHODQW'DFH[SUHVLDHVWHSUH]HQWHDWUHEXLHVILHGHXQ
WLS FDUH SRDWH IL FRQYHUWLW OD WLSXO IXQF LHL vQ FDUH DSDUH LQVWUXF LXQHD return. Valoarea
H[SUHVLHLHVWHYDORDUHDvQWRDUVGHIXQF LH
7.3.5. Constante simbolice
Cu ajutorul directivei "#define" se pot defini la nceputul programului nume sau
FRQVWDQWHVLPEROLFHFDUHVXQWXQLUSDUWLFXODUGHFDUDFWHUH'XSDFHHDFRPSLODWRUXO
YD vQORFXL WRDWH DSDUL LLOH QHSXVH vQWUH JKLOLPHOH DOH QXPHOXL SULQ LUXO FRUHVSXQ]WRU
QORFXLUHDHIHFWLYDQXPHOXLSRDWHILRULFHWH[WHDQXVHOLPLWHD]ODQXPHUH
#GHILQH0,1YDORDUHDPLQLPDGPLV
#GHILQH0$;YDORDUHDPD[LPDGPLV
# 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  DD vQFkW HOH  QX  DSDU  vQ GHFODUD LL
1XPHOHVLPEROLFHVHVFULXvQPRGQRUPDOFXOLWHUHPDULDDFSRWILXRUGLVWLQVHGH
QXPHOH GH YDULDELOH FDUH VH VFULX FX OLWHUH PLFL /D VIkULWXO XQHL  GHILQL LL 18 VH SXQH
SXQFWLYLUJXO

CAPITOLUL 8
8. Masive de date. Tablouri
QPDMRULWDWHDFDOFXOHORUWLLQ LILFHVHIRORVHWHQR LXQHDGHYHFWRUPDWULFHOXFUXOvQ
VSD LL QGLPHQVLRQDOH /LPEDMXO & D IRVW SUHY]XW DUH SRVLELOLWDWHD GH D OXFUD FX XQ
PDVLYHGHGDWHGHDFHODLWLSPDVLYHFHSRWILUHFXQRVFXWHVXEXQQXPHXQLF/LVHPDL
VSXQHLWDEORXULGHGDWH([LVWSRVLELOLWDWHDGHILQLULLVWDWLFHGHWDEORXULFXPD[LPXPWUHL
GLPHQVLXQL'HFODUDUHDXQXLWDEORXVHUHDOL]HD]FDPDLMRV
-

tablou monodimensional:
WLSGDWQXPHWDEORX>nr-elemente]; (ex: char s[10])
tablou bidimensional:
WLSGDWQXPHWDEORX>nr-linii][nr-coloane]; (ex: int m[20][20])
tablou tridimensional:
WLSGDWQXPHWDEORX>coord x][coord y][coord z];

(ex:

float

punct[10][10][10]).
$FHVWHGHFODUD LLDXFDHIHFWUH]HUYDUHDXQXLVSD LXGHPHPRULHSHQWUXGHSR]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
DOWXOLDWXQFLUHIHULUHDVHIDFHSULQWUXQLQGLFHFDUHVSHFLILFSR]L LDHOHPHQWXOXLUHVSHFWLY
DOFkWHOHDHVWHvQLU 'HFLSRWH[LVWDUHIHULULGHJHQXO
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 GH
GDWH 2 VLWXD LH PDL VSHFLDO HVWH vQ FD]XO WDEORXULORU PRQRGLPHQVLRQDOH LUXULORU  GH
caractere. Cum, n general, prelucrarea acestora nu se face caracter cu caracter, ele fiind
GHRELFHLIRORVLWHvQPDQLSXODUHDLQIRUPD LHLVFULVHOLPEDMXO&DIRVWSUHY]XWFXRVHULH
GHIXQF LLVSHFLDOL]DWHvQSUHOXFUDUHDJOREDODORU
8.1. Tablouri monodimensionale
'XS FXP DP VSXV WDEORXULOH PRQRGLPHQVLRQDOH SRW IL IRORVLWH L SHQWUX FDOFXOH
PDWHPDWLFH vQ VSD LL QGLPHQVLRQDOH XQGH VH OXFUHD] FX XQ VHW GH Q FRRUGRQDWH 9RP
SUH]HQWDFkWHYDLPSOHPHQWULDOHRSHUD LXQLORUVLPSOHFXYHFWRUL
3UHOXFUULVLPSOHFXYHFWRUL
Q FD]XO GHFODUULL XQXL YHFWRU VH UH]HUY XQ VSD LX  SHQWUX QXPUXO PD[LP GH
HOHPHQWH FDUH VDU SXWHD V DLE QHYRLH XWLOL]DWRUXO SURJUDPXOXL 'H H[HPSOX FD]XO XQXL
SURJUDP VSHFLDOL]DW SHQWUX FDOFXOH DVXSUD XQXL QXPU GH PVXUWRUL XWLOL]DWRUXO SRDW V
IDFvQWUXQFD]PVXUWRUL RHVWLPDUHPDLJURVLHU LvQDOWXO'HFLVHYDGHILQLXQ
YHFWRU FX  GH HOHPHQWH GDU vQ DFHODL WLPS WUHEXLH FD SURJUDPXO V FHDU VSHFLILFDUHD
QXPUXOXLGHYDORULFHWUHEXLHLQWURGXVHLVIDFSURFHVDUHDQXPDLDVXSUDORU9DWUHEXLV
IRORVLPRLQVWUXF LXQHIRUGHRDUHFHDUHQXPUXOGHSDLFXQRVFXWQFD]XOvQFDUHVHSRDWH
VSHFLILFDQLFLROLPLWSHQWUXQXPUXOGHYDORULFHWUHEXLHVFVWRFDWHVDXSUHOXFUDWHQXVHPDL
SRW IRORVL WDEORXUL GHILQLWH VWDWLF FL OLVWH vQOQ XLWH 0DL MRV SUH]HQWP XQ SURJUDP FDUH

FLWHWHGRLYHFWRULGHDFHHDLGLPHQVLXQHGHODWDVWDWXULUHDOL]HD]RVHULHGHRSHUD LXQL
VLPSOHFXHLDILkQGGHILHFDUHGDWUH]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 v
for(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();
}
0DLMRVHVWHSUH]HQWDWFRGXOFDUHLPSOHPHQWHD]DOJRULWPXOPHUJe sort, bazat pe
WHKQLFDvPSDUWHLVWSkQHWHvQWURPDQLHUUHFXUVLY
#include <stdio.h>
int a[100],n; // variabile globale vizibile Ln main Ln interiorul
//RULFUHLIXQF LLGHILQLWHGHutilizator

merge_sort(int st,int dr); // prototipurile IXQF LLORUproprii


merge(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];

}
LUXULGHFDUDFWHUH
6DGLVFXWDWGHVSUHVHWXOGHFDUDFWHUH$6&,,LVHWXOGHFDUDFWHUHGHFRQWURO$FHVWHD
VXQWLQWURGXVHSHQWUXPDQLSXODUHDXQHLLQIRUPD LLFDUHSRDWHILGRDUDILDWSHHFUDQVDXOD
LPSULPDQW6SHFLILFDFHVWHLLQIRUPD LLHVWHFGHRELFHLPDQLSXOHD]vQSDFKHWHGHPDLPXOW
GHXQFDUDFWHUQDFHVWHFRQGL LLWUHEXLHIRORVLWXQWDEORXGHFDUDFWHUH$FHVWDHVWHGHQXPLW
LUGHFDUDFWHUH(ODUHvQSOXVID GHXQYHFWRUDGXJDWvQWRWGHDXQDODVIkULWXOGDWHORUXWLOH
un caracter special \0 QXPLW WHUPLQDWRU GH LU $ IRVW LQWURGXV SHQWUX D XXUD VFULHUHD
IXQF LLORU GHELEOLRWHFVDXXWLOL]DWRU IRORVLWHvQSUHOXFUDUHDXQXLLUGHFDUDFWHUH
LUXULOH GH FDUDFWHUH DX H[DFW DFHOHDL FDUDFWHULVWLFL FD RULFDUH WDEORX
monodimensional.
IQL LDOL]DUHDXQLLUGHFDUDFWHUHVHSRDWHIDFHSULQPDLPXOWHPHWRGH
-

ODGHFODUDUHIUGHILQLUHDGLPHQVLXQLLWDEORXOXL
char s[]=.doc

vQDFHVWFD]GLPHQVLXQHDWDEORXOXLYDILH[DFWQXPUXOGHFDUDFWHUHFXFDUHHLQL LDOL]DW
LUXO
la declarare cu definirea dimensiunii tabloului
char s[20]=doi

direct n program : s=Dati valoarea


SULQFLWLUHGHODWDVWDWXU

FXSURFHGXUgets(s)
FXIXQF LHscanf(%s,s);
SULQLQL LDOL]DUHFDUDFWHUFXFDUDFWHUvQFD]XOXQHLSUHOXFUULvQSURJUDP
for(i=0;i<strlen(s1);i++)s2[i]=s1[i]+0x25;

QXOWLPXOFD]DSDUHR SUREOHP vQ FD]XO LUXOXL VQX HVWH SXV DXWRPDW FDUDFWHUXO
?LGHFLWUHEXLH2%/,*$725,8LQWURGXVH[SOLFLWQH[HPSOXOGHPDLVXVDFHVWOXFUXVH
UHDOL]HD]SULQDGXJDUHDLQVWUXF LXQLL
s[i]=\0;
3UH]HQWPPDLMRVXQSURJUDPVLPSOXFHLQL LDOL]HD]vQFRGHOHPHQWFXHOHPHQW
XQLUGHFDUDFWHUHDSRLDILHD]GLYHUVHSR LXQLGLQHO
#include <stdio.h>
void main(void)
{
FKDUQXPH>@ GHILQHVFXQLUGHFDUDFWHUH 
nume[0] = 'M';
nume[1] = 'i';
nume[2] = 'h';
nume[3] = 'a';

QXPH>@  FDUDFWHUXOFHPDUFKHD]VIkULWXO 


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();
}
7DEORXULELGLPHQVLRQDOH,PSOHPHQWDUHDQR LXQLLGHPDWULFH
3HQWUX FDOFXOH PDWHPDWLFH WDEORXULOH ELGLPHQVLRQDOH LPSOHPHQWHD] H[DFW FRQFHSWXO
GHPDWULFHLSRWILPDQLSXODWHvQFRGDSURDSHODIHOFDvQPDWHPDWLF
Apare aceeaL SUREOHP UHODWLY OD PRGXO vQ FDUH DOHJHP GLPHQVLXQHD PD[LP D
unei PDWULFLFDLvQFD]XOYHFWRULORU([LVWFHOHGRXFD]XUL
- 8WLOL]DWRUXOWLHH[DFWFkWHVWH GLPHQVLXQHD PD[LP D matricilor care vor fi folosite,
acesta este cazul ideal care este relativ rar.
- 8WLOL]DWRUXO DUH QLWH FHULQ H YDJL L SURJUDPDWRUXO SULQ GLVFX LH GLUHFW SRDWH DIOD
DFHVW PD[LP VDX SRDWH VL IDF R LGHH GHVSUH HO FD] vQ FDUH YD OXD R YDORDUH
acoperitoare.
QRULFH FD]RULFDUHDUILGLPHQVLXQHDXQXLWDEORXHODUHXQQXPUWRWDOGH HOHPHQWH
FDUHYDILDORFDWVWDWLF$FHVWQXPUVHSRDWHDIODFRQIRUPIRUPXOHORUGHPDLMRV
-

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).

'HMDDSDUHRSUREOHPUHODWLYODVSD LXOPD[LPFDUHSRDWHILRFXSDWGHWRWDOXOGDWHORU
GHILQLWHVWDWLF DGLFFXPDPYRUELWSkQDFXP LDQXPHIDSWXOFFKLDUVXEPRGHOXOGH
FRPSLODUH +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 GHSL DFHDVW GLPHQVLXQH Q
FD]XOvQFDUHVSHFLILFD LLOHGHSHVFDFHVWHGLPHQVLXQLH[LVWGRXPHWRGH
-

metoda swap-ului;
PHWRGDOLVWHORUGHRUGLQQXQGHQHVWHFRQIRUPQHFHVLW LORU

Q JHQHUDO DFHVWH PHWRGH VXQW PL[DWH FKLDU L OD QLYHOXO DSOLFD LLORU DFWXDOH 0HWRGD
VZDSXOXL VH FRQFUHWL]HD] SULQ VFULHUHD vQWUXQ ILLHU D GDWHORU FH GHSHVF DFHVWH
dimensiuni maxime. Practic dispozitivul de stocare devine un fel de prelungire a
PHPRULHLRSHUDWLYH DYkQG vQV GH]DYDQWDMXO F WLPSLL GH DFFHV VXQW FDP GH  RUL PDL
PDULGHFkWvQFD]XOOXFUXOXLFX 5$0 FHHD FH YD GXFH OD VFGHUHD YLWH]HL GH H[HFX LH D
UHVSHFWLYHL DSOLFD LL 0HWRGD OLVWHORU VH ED]HD] SH DORFDUHD GLQDPLF FDUH QH SHUPLWH
DFFHVXOODWRDWPHPRULDIL]LF5AM QHRFXSDWGHDOWHSURJUDPH
Mai jos vom prezenta un scurt exemplu de folosire a tablouri pentru implementarea de
RSHUD LXQLVLPSOHFXmatrici.

#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 LDDvQFRG
printf(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 observFDQXPHOHVXEFDUHRFLWHVFQXDUHOHJWXUFX
//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 LDDn cod
// deci am citit cele doumatrici, 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 LUHDDGRXmatrici
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.

CAPITOLUL 9
9. Tipuri de date definite de utilizator
6DGLVFXWDWSkQDFXPGHVSUHWDEORXULGHGDWHPRQRVDXPXOWLGLPHQVLRQDOHFDUHvQV
FRQ LQHDXQXPDLGDWHGHDFHODLWLS6XQWPXOWHFD]XULvQFDUHHVWHQHYRLHFDGDWHGHWLSXUL
GLIHULWHVILHJUXSDWHVXEXQQXPHFRPXQ
$FHDVWSUREOHPVDUH]ROYDWSULQLQWURGXFHUHDQR LXQLLGHVWUXFWXUGHGDWHFDUH
SHUPLWH XWLOL]DWRUXOXL VL FUHH]H QRL WLSXUL GH GDWH FkW PDL DSURSLDWH GH RELHFWHOH GLQ
OXPHDUHDO$FHVWOXFUXVHPDLQXPHWHDEVWUDFWL]DUHDGDWHORU
/DIHOFXPIXQF LLOHSHUPLWGHVFRPSXQHUHDFRPSOH[LW LLXQXLSURJUDPvQWHUPHQL
GHRSHUD LXQLSHGDWHVWUXFWXULOHVXQWIRORVLWHSHQWUXDEVWUDF LXQL.
9.1. Declararea unei structuri
2VWUXFWXUHVWHXQWLSGHGDWJHQHUDOL]DWGHILQLWGHXWLOL]DWRUcare poate fi folosit
pentru gruparea diferitelor tipuri de date ntr-un nou concept. De exemplu un tip de date
FHVHUHIHUODXQHOHGLQFDUDFWHULVWLFLOHXQXLVWXGHQWHVWHSUH]HQWDWPDLMRV
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
}
([LVWRFRQYHQ LHFRPXQOHJDWGHQXPHOHXQHLVWUXFWXULLDQXPHDFHVWDVvQFHDS
FXOLWHUPDUH8QH[HPSOXGHGHFODUD LLFXDFHVWWLSGHGDWHHVWHGDWPDLMRV
struct Student tmp, an99[20];
9.2. Operatorul typedef
Comanda W\SHGHIFDUHHVWHIRORVLWODredenumirea 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]XDO
noul tip de date se UHGHQXPHWH LVHDWDHD]RHWLFKHWHFKLYDOHQW FDPDLMRV
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;

Deci noul tip de date a fost redenumit ca VWXGvQDFHVWHFRQGL LLGHFODUD LLUHODWLYHODHO


devin:
8QDOWH[HPSOXGHGHILQLUH
Stud tmp,an99[20];

Definesc noul tip de date


struct my_data
{
char name[19];
secol[11];
short month,day,year;
}
Folosesc noua defini ie
struct 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 cuvntul cheie struct.
Creearea unui nou tip de date se face astfel:
typedef struct
{
char name[19];
secol[11];
short month,day,year;
}pers;
ncepnd de acum pers se va folosi direct frDOWHVSHFLILFD LLvQGHILQLUHDXQRUHOHPHQWH
de acest tip.
pers test,tab[100],*ptab;
IQL LDOL]DUHDXQHLVWUXFWXUL
&DLvQFD]XOWDEORXULORUVDXDOWRUWLSXULGHGDWHSRDWHILUHDOL]DWDVWIHO:
: La declararea unui element
Ex: pers eu={MIKE, 354263,3,5,1978};
: Oriunde in cadrul programului
Obs:
Ini LDOL]DUHDXQHLVWUXFWXULQXSRDWHILUHDOL]DWODGHILQLUHDQRXOXLWLSGH
GDW(cu typedef)(YLGHQWH[LVW o diferen FODULQWUHGHILQLUHDXQXLQRXWLSGHGDW
LGHILQLUHDXQHLYDULDELOHGHXQDQXPLWWLS
9.3. Accesarea membrilor unei structuri
'HRDUHFH DFHVW WLS GH GDWH HVWH FUHDW GH SURJUDPDWRU FRPSLODWRUXO VDX IXQF LLOH
H[LVWHQWHQXWLXVOXFUH]HGHFkWFXWLSXULOHpredefinite de date. De aceea este necesar ca

SUHOXFUDUHD V VH IDF WRW OD QLYHO GH PHPEUL FkPSXUL  3HQWUX DFHDVWD WUHEXLHVF
FRQVWUXLWHIXQF LLVSHFLDOL]DWHvQRSHUD LXQLOHFXQRXOWLSGHGDWH
QFD]XOGHFODUD LHLXQXLHOHPHQWGHWLSXOUHVSHFWLYRSHUDWRUXOGHDFFHVODRULFDUH
din 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 XQXL
tablou 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); }
2VWUXFWXUvQLQWHULRUXODOWHLVWUXFWXUL nested structures)
([LVW FD]XUL FkQG HVWH QHFHVDU FD LQIRUPD LD V ILH FkW PDL LHUDUKL]DW RE LQkQGXVH
DVWIHO XQ FRG FkW PDL FODU Q FD]XO GLQ H[HPSOXOXL DQWHULRU GDF GRUHVF V UHDOL]H] R
DSOLFD LHSHQWUXXQVHFUHWDULDWDPQHYRLHLGHQXPUXOJUXSHL([LVWGRXPHWRGHGHD
UH]ROYDSUREOHPD8QDDUILLQWURGXFHUHDDvQFXQXLFkPSFDUHVUH LQQXPUXOJUXSHL
GDU PRG GH UH]ROYDUHD SRDWH GXFH SH PVXU FH WRW PDL DGDXJ FDUDFWHULVWLFL QRL vQ
VWUXFWXUODXQFRGJUHXGHXUPULW$OWFDOHDUILFUHDUHDXQHLQRLVWUXFWXULGXSFXPHVWH
prezentat 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 grupei
temp.t[3].name QXPHOHFHOXLGHDOWUHLOHDVWXGHQWGLQJUXS
0DLMRVSUH]HQWPvQFXQH[HPSOX
typedef struct
{char name[19],snum[11];
struct
{short day;
short month;

short year;
}birth_date
}pers;
O referire la day se va face pentru persoana eu: eu.birth_date.day
Element VXEVWUXFWXUFPS
VWUXFWXU
mare
Obs: numele cPSXULORUXQHLVWUXFWXULQXVXQWY]XWHGLUHFWvQDIDULGHFLRUHIHULUH:
struct x {int x; ) x; este legalODDFFHVDUHx.x=5.
Aten LHQFHSWRULLVHYLWHDFHVWOXFUXGHRDUHFHFUHD]RDPELJXLWDWHQHUHFRPDQGDWvQ
cod.
9.5 Structuri autoreferite
2VWUXFWXU18SRDWHFRQ LQHLQVWDQ LHULDOHDOHHLGDUSRDWHFRQ LQHSRLQWHULFWUH
LQVWDQ LHULDOHHL
struct p
struct p
{int a,b;
{int a,b;
float c;
float c;
struct p next;
struct p* next;
}
}

la analiza lexicalVHLQWUvQFLFOXLQILQLW

OK!!Acest lucru este posibil


deoarece pointerul este o
YDULDELOFDUHUH LQHDGUHVD
altei variabile

7UDQVIHUXOVWUXFWXULORUFDDUJXPHQWHGHIXQ LL
: transfer chiar structura (prin valoare)
: transfer un pointer cWUHHD(prin referin )
Ex: pers om;
func1 (om)
func2 (&om)
7UDQVIHUXOSULQYDORDUHVHUHFRPDQGLQXUPWRDUHOHFD]XUL:
structura este mic
JDUDQWDUHDIDSWXOXLFIXQ LDDSHODQWQXPRGLILFVWUXFWXUDDSHODW
La apelul prin valoare compilatorul JHQHUHD]Rcopie a respectivei structuri (IXQF LD
DSHODQWpoate deci modifica doar DFHDVWcopie).
DacDPGRULVVSHFLILFPWUDQVIHUXOSULQUHIHULQ LQFODU(vezi func2(&om)) este
suficient ca sGHFODUPSHUV* om LDWXQFLIXQF RP HVWHFRUHFW
Atunci n acest caz func1(om) nu ami este corect pentru cRPHVWHXQSRLQWHULQXR
valoare.
9.7 Returnarea unei structuri
K&R nu permite returnarea unei structuri dar ANSI permite acest lucru.

Deci:
pos by value

pos by reference

pers f(.)
{
pers x;

return x;
}
pers* f1(..)
{
static pers* p;

return &p;
}

&kPSXULGHEL L
Membrii unei structuri de tip int sau XQVLJQHGSRWILDORFD LvQFkPSXULGHSkQOD
EL L%L LLVXQWDORFD LvQFHSkQGFXFHOPDLSX LQVHPQLILFDWLYELWDOILHFUXLFXYkQWGH
EL L6LQWD[DHVWH
WLS>LGHQWLILFDWRU@OUJLPH
/UJLPHDFkPSXOXLWUHEXLHVILHRH[SUHVLHvQWUHDJFRQVWDQWFXSULQVLQWUHVL
vQVHDPQDOLQLHUHODXUPWRDUHDOLPLWGHFXYkQW 'DFQXVHVSHFLILFXQQXPHSHQWUX
FkPSXOGHEL LFkPSXOHVWHDORFDWGDUQXHVWHDFFHVLELO VHIRORVHWHSHQWUXDOLQLHUL 
struct special_word
{
LQWLYDILUHSUH]HQWDWSHEL LLEE
XQVLJQHGMYDILUHSUH]HQWDWSHEL LLESkQODE
LQWYDILUHSUH]HQWDWSHEL LLESkQODE
int
k :1 ; // va fi reprezentat pe bitul b11
XQVLJQHGPYDILUHSUH]HQWDWSHEL LLESkQODE
};
2 UHVWULF LHLPSRUWDQW DVXSUDRSHUD LLORU FDUH VH SRW IDFH FX FkPSXULOH GHEL L HVWH
DFHHDFQXOLVHSRDWHDIODDGUHVDFXDMXWRUXORSHUDWRUXOXL  DGUHVDXQXLELWQXDUHVHQV 
9.9. Uniuni
8QLXQLOH FRUHVSXQG FX vQUHJLVWUULOH 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 YHGHUH
VLQWDFWLF GHILQL LD XQXL WLS XQLXQH VHDPQ FX GHILQL LD XQXL WLS VWUXFWXU FX GLIHUHQ D F
indicatorul VWUXFWVHvQORFXLHWHFXXQLRQ VXQWSHUPLVHLFkPSXULGHEL L 
Ca implementare sunt similare cu structurile, cu diferen DFPHPEULLVXQWVXSUDSXLXQXO
GXS DOWXO vQ PHPRULH 6SD LXO GH PHPRULH HVWH IRORVLW OD PD[LPXP vQ UDSRUW  FX

VWUXFWXULOH 'H IDSW SHUPLW FD DFHHDL ]RQ GH PHPRULH V ILH LQWHUSUHWDW GLIHULW IU D
folosi cast.
'LPHQVLXQHDVSD LXOXLGHPHPRULHDORFDWXQLXQLLHVWHHJDOFXGLPHQVLXQHDVSD LXOXL
alocat celui mai mare membru. Accesul la membrii uniunii se face sub forma unor
componente selectate, foloVLQG DFHLDL RSHUDWRUL L DFHOHDL UHJXOL FD vQ FD]XO VWUXFWXULORU
1XPHOHGHXQLXQLUHVSHFWDFHOHDLUHJXOLFDLQXPHOHGHXQLXQL VSD LXGHQXPHXWLOL]DUH
etc.).
QUHJLVWUULYDULDELOH
n cazurile n care se poate ca ntr-o ba]GHGDWHGRXVDXPDLPXOWHFPSXULV
se DXWRHOLPLQHUHFLSURF IXQF LHGHGDWHOHLQWURGXVHvQHD VHSRDWHRE LQHRSWLPL]DUHD
VSD LXOXLJUXSDWvQPHPRULHGHXQHOHPHQWDOVWUXFWXULLSULQJUXSDUHDDFHORUFPSXUL
ntr-RXQLXQHFHDSDU LQHVWUXFWXULL
Ex.:
typedef union
{
struct
{
char c1,c2;
}s
long j;
float x;
}u
1000
C1

1001
C2

1002

1003

J
X
&RPSLODWRUXODORFVXILFLHQWPHPRULHSHQWUXDSXWHDUH LQHFHOPDLPDUHPHPEUXLWR L
PHPEULLvQFHSODDFHHDLDGUHV'DWHOHVWRFDWHntr-o uniune depind de care membru al
uniunii se va utiliza.
pas.s.c1=a
pas.s.c2=b
1000
1001 1002
1003
a
b
...
Unused

pas.j=5

VXSUDVFULHFHOHFDUDFWHUHLGHSXQHSHWR LFHLRFWH L WLSlong int)


1000
1001 1002
1003
0

6XSRUWDFHOHDLUHJXOLVLQWDFWLFHFDVWUXFWXULOH

([LVWDSOLFD LLGHED]SHQWUXXQLXQL:
1. FUHHD]VWUXFWXULIOH[LELOH YDULDQWDUHFRUGVvQFDUHSRWUH LQHGLIHULWHWLSXULGH
date)
2. interpretea]DFHHDLPHPRULHvQPRGXULGLIHULWH
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
5HVSHFWkQGFRQYHUVLLOHQHFHVDUHSXWHPVSXQHFXQSRLQWHUFWUHRXQLXQHHVWHXQ
SRLQWHUFWUHRULFDUHGLQWUHPHPEULLHL
(double *) & mu == & mu .d
O uQLXQH QX SRDWH IL LQL LDOL]DW GHFkW SULQ LQWHUPHGLXO SULPXOXL VX PHPEUX
GHFODUDW 9RP SUH]HQWD PDL MRV XQ SURJUDP FDUH FLWHWH FXYLQWXO VSHFLDO FDUH UH LQH
FRPSRQHQWHOHKDUGZDUHGHED]LQVWDODWHvQWUXQVLVWHPGHFDOFXO$FHVWDHVWHLQL LDOL]DWvQ
urma DXWRGHWHF LHL IFXWH vQ VHFYHQ D GH SRUQLUH FH DUH ORF OD SXQHUHD VXE WHQVLXQH D
sistemului.
#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;

} b;
} eqp;
void main(void)
{
unsigned far *ptr;
clrscr();
ptr=MK_FP(0,0410);
eqp.w=*ptr;
// urmeazDILDUHDILHFUXLHOHPHQWDOuniunii conform
// cu vQ HOHVXOdat

getch();
}
Cazul 2 Interpretarea GLIHULWDdatelor
Ca un exemplu VFRQVLGHUPproblema FRPXQLFD LHLseriale, unde datele vin
octet cu octet.
Uniunile permit o modalitate de grupare, a RFWH LORUvPSUHXQastfel vQFWVSRDW
fi reconstruite n forma lor RULJLQDO'Hexemplu, Vpresupunem Fget_byte( ) este o
func LHFDUHvQWRDUFHXQRFWHWFLWLWdintr-un device de comunica LH
O valoare GRXEOH SHRFWH L SRDWHILH[WUDVGLQdevice prin 8 apeluri recursive
DOHIXQF LHLGXSFXPVHYHGH:
union double
{
char c[];
double val;
}
double get_double( )
{
extern char get_byte( ); //optimal depinde de modul de structurare a
//fiLHUXOXL
int j;
union double d;
for (j=0; j<8 ; j++)
d.c[j]=get_byte( );
return d.val;
}
Aten LH!!! (VWHRGLIHUHQ PDMRUvQWUHDFHVWPRGGHLQWHUSUHWDUHLFRQYHUVLLOHSULQcast.
,QL LDOL]DUHDXQLXQLL VSHFLILF$16, :
union ex
{int I;
float f;

};
union ex test={1};
sau vQFD]XOXQLXQLFHUH LQHLRVWUXFWXU
union n
{
struct {int i; float f;}s;
char ch[6];
}
union n test1 = {1, 1.10}
(QXPHUUL
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 GHILQHWH XQ QRX WLSvQWUHJ QXPLW HQXP ]LOH XQ QXPU GH FRQVWDQWH GH DFHVW WLS OXQL
PDU L FXYDORULGHDFHVWWLSLVHGHFODURYDULDELOGHWLSHQXP]LOHQXPLWoricezi.
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 LQ
IXQF LHGHYDORULOHFRQVWDQWHORUGHILQLWH YDORULOHFRQVWDQWHORUGHILQLWHVXQWGHWLSunsigned
FKDUVDXLQWQ&XQHLYDULDELOHGHWLSHQXPHUDUHLVHSRDWHDWULEXLRULFHYDORDUHvQWUHDJ
enum days this_day ;
days another_day ;

// legal si in C si in C++
// legal numai in C++

Constantele de enumerare au implicit valori ncepnd cu 0 care cresc din 1 in 1 (luni


PDU L GXPLQLFD  /DGHILQL LDWLSXOXLRULFHFRQVWDQWGHHQXPHUDUHSRDWHIL
HYHQWXDOXUPDWGHXQLQL LDOL]DWRUVXEIRUPDXQHLH[SUHVLLvQWUHJL FRQVWDQWH SR]LWLYH VDX
QHJDWLYH FDUHVWDELOHWHYDORDUHDFRQVWDQWHL&RQVWDQWHOHGHHQXPHUDUHXUPWRDUHFDUHQX
DXRYDORDUHH[SOLFLWFUHVFGLQLQ6XQWSHUPLVHYDORULGXSOLFDWH1XPHOHFRQVWDQWHORU
GHHQXPHUDUHVHDIOvQDFHODL VSD LXGH QXPH FD L QXPHOHGH YDULDELOH IXQF LLL WLSXUL
Valori de tip enumerare pot apare oriunde sunt permise valori de tip ntreg.
enum coins
{
penny = 1,
// 1
tuppence,
// 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.

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

OK
ERROR

Aceste valori numerice pot fi si direct specificat ,caz in care compilatorul aplica sumarea
FXSR]L LHQXPDLODFHOHnespecificate.
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;

CAPITOLUL 10
1R LXQHDGHIXQF LH
'HILQL LH2IXQF LH&HVWHRFROHF LHGHRSHUD LLVSHFLILFHOLPEDMXOXL
3kQDFXPVDGLVFXWDWGHVSUHSURJUDPHH[WUHPGHVLPSOH'HDVHPHQHDVDXIRORVLW
DSHOXULGHIXQF LLSUHGHILQLWHDOFUXLFRGHVWHJDWDVFULV6HSRDWHVSXQHFRIXQF LHHVWH
REXFDWGHSURJUDPVHSDUDW VXESURJUDP FDUHHVWHIRORVLWvQPDLPXOWHVFRSXUL
 5HDOL]DUHDXQXLFRGVXUVFkWPDLFODU
 6LPSOLILFDUHDSURLHFWULLXQHLDSOLFD LL SULQVWUXFWXUDUH 
 5HDOL]DUHDGHELEOLRWHFLGHIXQF LLGHFLFUHWHUHDYLWH]HLGHGH]YROWDUHDDDSOLFD LLORU
XOWHULRDUH
3HQWUXLQWURGXFHUHDDFHVWXLFRQFHSWvQPRGFRUHFWWUHEXLHGLVFXWDWHvQWkLXQPLQLPGH
WHKQLFL GH SURLHFWDUHD D XQHL DSOLFD LL L DFHDVWD GHRDUHFH R IXQF LH QX VH LQWURGXFH vQ
FDGUXOXQXLSURJUDPGLQPRWLYHDUWLVWLFHFLDUHRMXVWLILFDUHODQLYHOORJLFIRDUWHFODU
&DWHKQLFLGHSURLHFWDUHH[LVWGRXPHWRGHWRSGRZQ GHVXVvQMRV LERWWRPXS
GHMRVvQVXV 3URLHFWDUHDXQHLDSOLFD LLFRQVWvQGHVFRPSXQHUHDORJLFSHVXEPRGXOH
)XQF LH GH FRPSOH[LWDWHD DFHVWHL DSOLFD LL GHVFRPSXQHUHD SRDWH FRQWLQXD UHFXUVLY OD
QLYHOXOILHFUXLPRGXOUH]XOWDWSkQFkQG





DFHVWDHVWHH[WUHPGHVLPSOXGHUHDOL]DW
HVWHGHMDLPSOHPHQWDWUHVSHFWLYDSDUWHvQWURELEOLRWHFDFRPSLODWRUXOXL
HVWHGHMDGH]YROWDWDQWHULRU
GDWRULWVLPSOLW LLSURJUDPXOXLQXPDLDUHVHQV

Q FD]XO PHWRGHL GH SURLHFWDUH WRSGRZQ SURLHFWDUHD GHFXUJH H[DFW FXP DP GHVFULV
PDL VXV 8]XDO vQ SURJUDPDUHD & VH IRORVHWH DFHDVW PHWRG Q FD]XO ERWWRPXS VH
SRUQHWH GH OD XQ VHW GH IXQF LL L RSHUD LXQL H[LVWHQWH L VH FRQVWUXLHVF PRGXOH FDUH OD
UkQGXOORUYRUFRQVWUXLUHFXUVLYDOWHPRGXOHSkQFkQGUH]XOWDSOLFD LD$FHDVWPHWRG
HVWHIRORVLWX]XDOvQFD]XOSURLHFWULLDSOLFD LLORUSHQWUXED]HOHGHGDWH
7RWXLHVWHJUHXGHLPSXVXQDQXPLWWLSGHJkQGLUHFkQGVHUHDOL]HD]SURLHFWDUHDXQHL
DSOLFD LHL ([LVW R WHRULH IRDUWH ELQH IXQGDPHQWDW L GRFXPHQWDW SULYLQG DFHVWH
SUREOHPHQWURSULPID]HVHQ LDOHVXQWH[SHULHQ DDYXWvQSURLHFWDUHDXQXLDQXPLWWLS
GHDSOLFD LHLDSRLH[SHULHQ DGHSURJUDPDUH
'HMD SHQWUX DSOLFD LL IRDUWH PDUL VH OXFUHD] vQ HFKLSH FX PHPEUL H[WUHP GH
VSHFLDOL]D L vQ FkWH R ID] D SURFHVXOXL GH SURLHFWDUH LPSOHPHQWDUH WHVWDUH QV
LQGLIHUHQWFkWGHFRPSOLFDWDUILGLVWULEX LDXQHLHFKLSHSURJUDPDWRUXOXLSURSULX]LVLVH
GDX ILH VSHFLILFD LLOH UHODWLY OD FH YD WUHEXL V IDF SDUWHD GH FRG FDUH R GH]YROW ILH vQ
DQXPLWH FD]XUL DOJRULWPXO Q DPEHOH VLWXD LL PRGXO vQ FDUH vL GHVFRPSXQH DSOLFD LD
SHQWUXDR SXWHD UHDOL]D QX SULYHWH SH QLPHQL /D VIkULW DFHDVWD WUHEXLH V IXQF LRQH]H
FRUHFWLDWkW
3DVXOLPHGLDWXUPWRUvQDSOLFDUHDPHWRGHLWRSGRZQHVWHUDILQDUHDSDLORU
([HPSOX&XPVDUSURLHFWDXQSURJUDPFDUHV1XPHUHFXYLQWHOHGLQWUXQILLHU"

Descriere n pseudocod
'HVFKLGHILLHUXO
DWkWDWLPSFkWPDLVXQWFXYLQWHLQILLHUI
^
FLWHWHXQFXYkQW
FUHWHQXPUXOGHFXYLQWHFX
`
QFKLGHILLHUXO
$ILHD]QXPUXOGHFXYLQWH
5DILQDUHDSDLORU
'HVFKLGHILLHUXO
$WkWDWLPSFkWPDLVXQWFXYLQWHLQILLHU
^
FLWHWHFDUDFWHUHSkQVHvQWkOQHWHXQFDUDFWHUGLIHULWGH
FLWHWHFDUDFWHUHOHSkQJVHVFXQ
LQFUHPHQWHD] QUBFXY
`
QFKLGHILLHUXO
$ILHD] QUBFXY
'HFODUDUHDLGHILQLUHDIXQF LLORU
)XQF LD PDLQ  D IRVW IRORVLW vQ WRDWH H[HPSOHOH GH SkQ DFXP 'H FkWH RUL XQ
SURJUDP&HVWHH[HFXWDWHOvQFHSHFXSULPDLQVWUXF LXQHGLQIXQF LDPDLQ %LEOLRWHFLOH&
QH SXQ OD GLVSR]L LH R VXP YDULDELO GH UXWLQH SUHFRPSLODWH 7RWXL SHQWUX D SXWHD
UH]ROYD SUREOHPH PDL FRPSOH[H HVWH QHFHVDU V VH SURLHFWH]H GHFODUDUH L GHILQLUH
SURSULLOHIXQF LL
'HFODUDUHDIXQF LLORU
2 IXQF LH HVWH GHFODUDW H[DFW FD R YDULDELO LDU WLSXO GH GDW SH FDUHO UHWXUQHD]
WUHEXLHVSHFLILFDWQ&WUHEXLHDYXWJULMFDQXPHOHXQHLIXQF LLSURSULLVQXFRLQFLGFX
QXPHOH XQHL IXQF LL GH ELEOLRWHF Q FD] FRQWUDU OLQNHGLWRUXO QX YD WL OD JHQHUDUHD GH
OHJWXUL vQWUH ILLHUHOH RELHFW GDF DSHOXO  UHVSHFWLYHL IXQF LL VH UHIHU OD UXWLQD
SUHFRPSLODWH[LVWHQWGHMDVDXODFRUSXOIXQF LHLSURSULL6HSRDWHFKLDUPDLUXVQXVH
JHQHUH]HXQPHVDMGHHURDUHDFHVWOXFUXVHvQWkPSOFkQGSURWRWLSXULOHFHORUGRXIXQF LL
VHSRWULYHVFLDUDFHVWWLSGHHURDUHHVWHH[WUHPGHJUHXGHGHWHFWDW
'HDVHPHQHDWUHEXLHVSHFLILFDWHLDUJXPHQWHOHFHYRUILWUDQVPLVHIXQF LHLODDSHO
WLSXORUGLQHDORU 2IRUPJHQHUDOSHQWUXGHFODUDUHDXQHLIXQF LLHVWH
WLSBGDW!QXPHBIXQF LH OLVWBDUJXPHQWH! 

XQGH
OLVWBDUJXPHQWH! ^WLSBGDW QXPHBDUJ WLSBGDW QXPHBDUJ  WLSBGDW
QXPHBDUJQ`

)XQF LLOH VXQW GHFODUDWH vQDLQWH GH IXQF LD PDLQ  $FHVW OXFUX SHUPLWH FD RULFDUH
IXQF LHVILHDSHODWGHRULFDUHDOWDLQFOXVLYGHHDvQVL FD]XOIXQF LLORUUHFXUVLYH 
6HSRWGHFODUDIXQF LLLvQLQWHULRUXODOWRUIXQF LLGDUvQDFHVWFD]HOHQXSRWILDSHODWH
GHFkWvQLQWHULRUXOIXQF LHLXQGHDXIRVWGHFODUDWH'HDFHHDPHWRGDGHGHFODUDUHJOREDOD
ORUHVWHFHOPDLGHVIRORVLW
(VWH QHFHVDU V VH UHDOL]H]H VSHFLILFDUHD WLSXOXL GH GDW SHQWUX DUJXPHQWH L
YDORDUHD UHWXUQDW $FHVW OXFUX SHUPLWH FRPSLODWRUXOXL V YHULILFH GDF IXQF LLOH VXQW
DSHODWHFRUHFWLVUHDOL]H]HRULFHFRQYHUVLHLPSOLFLWDUILQHFHVDU
'HH[HPSOXXQDSHOGHIXQF LHFDPDLMRV
LQFOXGHPDWKK!

GRXEOH[

[ VTUW  

SRDWH IL FRQVLGHUDW FD LQFRUHFW GHRDUHFH IXQF LD UDGLFDO DUH FD SDUDPHWUX GH LQWUDUH R
YDULDELO GH WLS GRXEOH 'DWRULW IDSWXOXL F IXQF LD HVWH GHFODUDW vQ FDGUXO ELEOLRWHFLL
PDWKKFDUHHVWHLQFOXVvQSURJUDPFRPSLODWRUXOYDIDFHFRQYHUVLDGHODvQWUHJODGRXEOH
DYDORULLDVWIHOvQFkWODDSHOIXQF LDUDGLFDOYDSULPLRYDORDUHFRUHFW  
'HFODUD LLLPSOLFLWH
'DFQXHVWHVSHFLILFDWQLFLXQWLSGHGDWODYDORDUHDSHFDUHWUHEXLHVRUHWXUQH]HR
IXQF 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 GD
HURDUHGDFvQSURJUDPHVWHIRORVLWDOWIHO
7RWXL GDF VH LQH FRQW QXPDL SH WLSXO LPSOLFLW FRPSLODWRUXO QX YD WL V IDF
FRQYHUVLLOHGHWLSODDSHO
'HILQLUHDIXQF LHL
'HILQLUHDXQHLIXQF LLVHUHIHUODREXFDWGHFRG&FDUHUH]ROYRDQXPLWSUREOHP
DFHHDSHQWUXFDUHVDLQWURGXVIXQF LD $FHDVWGHILQL LHVHIDFHvQDIDUDFRUSXOXLIXQF LHL
PDLQ VDXDODOWHLIXQF LLLDUHIRUPDJHQHUDOGDWPDLMRV

6WUXFWXUDJHQHULFDXQHLIXQF LL&
7LSXO IXQF LHL

1XPHOH IXQF LHL

/LVW DUJXPHQWH

'HFODUD LL

LQVWUXF LXQL

([HPSOX
WLS
QXPH
GHFODUD LHDUJXPHQW
LQWSZ LQWQXP
^
QXPHDUJXPHQW
LQWUH]
GHFODUD LHYDULDELOORFDO
UH] QXP QXP
UHWXUQUH]
LQVWUXF LXQL&
`
FRUSXOIXQF LHL
VDX

WLSBGDW!QXPHBIXQF LH OLVWDUJXPHQWH!
^
GHFODUD LLYDULDELOHORFDOH!
LQVWUXF LXQL!
UHWXUQYDULDELOH[SUHVLH!
`

3ULPD OLQLH WUHEXLH V ILH LGHQWLF FX FHD GLQ GHFODUD LH *UXSXO GH YDULDELOH ORFDOH
DXWRPDWH FDUHSRWILIRORVLWHvQLQWHULRUXOXQHLIXQF LLFRQVWvQFHOHGHFODUDWHvQOLVWDGH
DUJXPHQWHVDXODvQFHSXWXOIXQF LHL

&D L vQ FD]XO IXQF LHL PDLQ  YDULDELOHOH WUHEXLHVF GHFODUDWH LPHGLDW GXS SDUDQWH]D
GHVFKLVLvQDLQWHGHDOWHLQVWUXF LXQL
&D XQ H[HPSOX GH IXQF LH V OXP FD]XO FDOFXOXOXL UGFLQLL SWUDWH GDU FX
VSHFLILFDUHD SUHFL]LHL GRULWH 6H YD IRORVL PHWRGD 1HZWRQ 5DSKVRQ SHQWUX DSUR[LPDUHD
UGFLQLL
LQFOXGHVWGLRK!
LQFOXGHFRQLRK!
LQFOXGHPDWKK!
GRXEOHUDGLFDO GRXEOH[IORDWSUHFL]LH 
YRLGPDLQ YRLG
^
IORDWQUSUHF
GRXEOHUH]XOWDW
FOUVFU 
SULQWI 'DWLQXPDUXO 
VFDQI I QU 
SULQWI ?Q'DWLSUHFL]LD 
VFDQI I SUHF 
VZLWFK UH]XOWDW UDGLFDO QUSUHF
^
FDVHSULQWI (URDUH1XPDU1HJDWLY EUHDN
FDVHSULQWI (URDUH3UHFL]LDHVWHLQWUHVL EUHDN
GHIDXOWSULQWI ?Q5DGLFDOXOHVWHOIUH]XOWDW 
`
SULQWI ?Q3UHVVDQ\NH\WRFRQWLQXH 
JHWFK 
`
GRXEOHUDGLFDO GRXEOH[IORDWSUHFL]LH
^
GRXEOH[BYHFKL[BLQLWLDO [
LI [ UHWXUQ
LI [ UHWXUQ[
LI SUHFL]LH! __ SUHFL]LH UHWXUQ
GR
^
[BYHFKL [
[  [[BLQLWLDO[ 
`ZKLOH IDEV [[BYHFKL [ !SUHFL]LH 
UHWXUQ[
`

6HREVHUYFDSURDSHMXPWDWHGLQFRUSXOIXQF LHLWUDWHD]HURULOHFHSRWDSUHD'HL
ODSULPDYHGHUHDFHVWOXFUX DSDUHFDXQHIRUW VXSOLPHQWDU QHMXVWLILFDW vQ SURJUDPDUH vQ
PRPHQWXOvQFDUHHVWHFD]XOXQHLDSOLFD LLFXSHVWHIXQF LLFDUHVH DSHOHD]XQHOHSH
DOWHOHFRGXOHVWHUHODWLYJUHXGHXUPULWLGHSDQDWvQFD]FRQWUDU
Q FRQGL LLOH vQ FDUH VD SUHY]XW ILHFDUH IXQF LH GH OD vQFHSXW FX DFHVWH YHULILFUL
DWXQFL HVWH H[WUHP GH XRU FD V VH SRDW GHSLVWD HURULOH 'DF DFHDVW SROLWLF HVWH
DSOLFDWODRULFHQLYHODOSURJUDPXOXLYDFRQGXFHODVFULHUHDXQXLFRGVWDELO6WDELOLWDWHD
VHUHIHUODIDSWXOFGDFDSDUHXQGHYDvQFXUVXOH[HFX LHRHURDUHGDWRUDWILHFRQGL LLORU
H[WHUQH LQWUUL JUHLWH  ILH FRQGL LLORU LQWHUQH GH H[HPSOX HURDUH GH SURJUDPDUH VDX
YLUXV DFHDVWDYDILVHPQDODWXWLOL]DWRUXOXL(DVHYDSURSDJDSHFDOHLHUDUKLFGLQDSHO
vQDSHOGHIXQF LHIUFDSURJUDPXOVLDVGLQSDUDPHWULQRUPDOLGHIXQF LRQDUHQXVH
SLHUGHFRQWUROXODVXSUDDSOLFD LHL
3HQWUXUHDOL]DUHDXQRUSURJUDPHFDUHVSULPHDVFSDUDPHWULGHLQWUDUHGLQOLQLDGH
FRPDQGIXQF LDPDLQ SRDWHSULPLXQVHWGHSDUDPHWULFDUHVFRQ LQH[DFWVLUXULOHGH
FDUDFWHUHGLQOLQLDGHFRPDQG0DLMRVHVWHGDWXQH[HPSOXVLPSOXGHIRORVLUHDDDFHVWHL
IDFLOLW LLDQXPHXQSURJUDPFDUHYDDILDSDUDPHWULLSULPL LSULQOLQLDGHFRPDQG
LQFOXGHVWGLRK!
YRLGPDLQ LQWDUJFFKDU DUJY
^
LQWL
SULQWI DUJF G?Q?QDUJF 
IRU L LDUJFL
SULQWI DUJY>G@V?QLDUJY>L@ 
`
6HREVHUY F SULPXO DUF VSHFLILF  QXPUXO GH OHPHQWH GLQ FDUH HVWH FRPSXV OLQLD GH
FRPDQG LDU DUJY UH LQH DGUHVD GH vQFHSXW D ]RQHL GH PHPRULH vQ FDUH VXQW VWRFDWH
DFHVWHD
7LSXOGHGDWvoid
Geneza pointerului void
$IRVWLQWURGXVGHVWDQGDUGXO$16,SHQWUXDUH]ROYDXUPWRDUHDDPELJXLWDWHGHVLQWD[
WLPFDYHPSRVLELOLWDWHDGHDDORFDPHPRULH
)XQF LD vQWRDUFH XQ SRLQWHU FWUH vQFHSXWXO ]RQHL GH PHPRULH DORFDW LQGLIHUHQW F
VXQWHPVXE'26:,1'2:6VDX81,; QWUHEDUHDHVWHGHFHWLSHVWHDFHVWSRLQWHUVDX
WUDGXVFXPYDILLQWHUSUHWDW]RQDFRQWLJXDGHPHPRULHUH]HUYDW
 &DILLQGJUXSDWvQHOHPHQWHGHOXQJLPHRFWHW VLJQHGVDXXQVLJQHGVDXFKDU
 &DILLQGJUXSDWvQHOHPHQWHGHOXQJLPHRFWH L VLJQHGVDXXQVLJQHG
DPG
3HQWUX D UH]ROYD DFHDVW VHPLDPELJXLWDWH GSGY DO FRPSLODWRUXOXL L QX QXPDL VD
GHFLVFDSRLQWHUXOUHWXUQDWVILHGHWLSYRLG8QWLSLQH[LVWHQWGDUFRQYHUWLELOILHH[SOLFLW
SULQFDVW . 5VWDQGDUG ILHLPSOLFLWSULQDVLJQDUH $16, ODWLSXOYDULDELOHLFDUHLDLVH
DVLJQHD]
Q OLPEDMXO & R IXQF LH WUHEXLH V UHWXUQH]H XQ WLS GH GDWH OD WHUPLQDUHD H[HFX LHL
7RWXLH[LVWFD]XULFkQGQXVHIDFFDOFXOHGLUHFWHFLVHUHDOL]HD]DQXPLWHDF LXQLFXPDU

IL GH H[HPSOX DILDUHD XQXL PHVDM Q DFHVWH FD]XUL WRWXL WUHEXLH VSHFLILFDW
FRPSLODWRUXOXLIDSWXOFIXQF LDQXUHWXUQHD]QLPLF
([LVW L FD]XO LQYHUV DGLF R IXQF LH FDUH QX SULPHWH QLFL XQ SDUDPHWUX  GDU
UHWXUQHD]UH]XOWDWH FD]XOFLWLULLXQXLSRUWGHGDWH 3HQWUXDSXWHDVSHFLILFDDFHVWHVLWXD LL
VHIRORVHWHWLSXOGHGDWYRLGFDUHvQWUDGXFHUHvQVHDPQOLSVLWGHFRQ LQXWQLPLF
Transferul Argumentelor
$UJXPHQWHOH XQHL IXQF LL UHSUH]LQW FLOH GH WUDQVIHU D GDWHORU FWUH IXQF LH
0XOWH OLPEDMH GH SURJUDPDUH WUDQVIHU DUJXPHQWHOH SULQ UHIHULQ H FHHD FH vQVHDPQ F
WULPLW XQ SRLQWHU FWUH DUJXPHQW Q & DUJXPHQWHOH VXQW WULPLVH SULQ YDORDUH FHHD FH
vQVHDPQFRFRSLHDDUJXPHQWXOXLHVWHWULPLVIXQF LHL)XQF LDSRDWHPRGLILFDYDORDUHD
FRSLHLGDUQXSRDWHPRGLILFDYDORDUHDFDUHRDUHDUJXPHQWXOvQUXWLQDDSHODQW

)LJXUD DUDW GLIHUHQ D VH REVHUY F VJH LOH GH OD WUDQVIHUXO SULQ UHIHULQ  VXQW
ELGLUHF LRQDOHFHHDFHVSHFLILFIDSWXOFPRGLILFULOHORFDOHVHUHSHUFXWHD]GLUHFW
$UJXPHQWXO WULPLV HVWH GH RELFHL QXPLW DUJXPHQW DFWXDO vQ WLPS FH FRSLD
UHFHS LRQDWHVWHQXPLWDUJXPHQWIRUPDOVDXSDUDPHWUXIRUPDO
'HRDUHFH&WUDQVIHUDUJXPHQWHOHSULQYDORDUHRIXQF LHSRDWHDVLJXUDQRLYDORUL
ODDUJXPHQWHOHIRUPDOHIUDOHDIHFWDSHFHOHDFWXDOH'HH[HPSOX
LQFOXGHVWGLRK!
YRLGPDLQ YRLG
^H[WHUQYRLGI  
LQWD 
I D 
SULQWI \ G?QD 
H[LW  
`

YRLGI LQWDUJ
^
DUJ 
`
YD DYHD FD UH]XOWDW DILDUHD YDORULL  PRGLILFDUHD FRSLHL QHPDLDIHFWkQG YDORDUHD GLQ
IXQF LDDSHODQW'DFVHGRUHWHFDIXQF LDVSRDWVFKLPEDYDORDUHDXQXLRELHFWDWXQFL
WUHEXLHFDDFHDVWDVSULPHDVFDGUHVDRELHFWXOXLGHFLVLVHWULPLWXQSRLQWHUODRELHFW
FDvQH[HPSOXOXUPWRU
YRLGVZDS LQW [LQW \
^
UHJLVWHULQWWHPS
WHPS [
*x=*\
\ WHPS
`
YRLGPDLQ YRLG
^
LQWD E 
VZDS D E 
SULQWI D GE G?QDE 
`
XQGHVHYDDILDD LE 
&XWUDQVIHUXOSULQUHIHULQ QHDPvQWkOQLWGHODSULPHOHOHF LLVFDQI G QU 
'HFODUD LLLDSHOXUL
)XQF LLOHSRWDSUHDvQWUXQSURJUDP
: 'HILQL LH RGHFODUD LHFDUHGHILQHWHFHIDFHIXQF LDSUHFXPLQXPUXOLWLSXO
DUJXPHQWHORUHL
: )XQFWLRQDOOXVLYHVHGHFODURIXQF LHGHILQLWvQDOWSDUWH$FHVWOXFUXVSHFLILF
FH WLSXUL GH YDORUL vQWRDUFH IXQF LD SUHFXP L FH WLSXUL GH YDORUL
SULPHWH
: $SHOXOIXQF LHL DSHOSURSULX]LVODvQWkOQLUHDOXLvQFRQWH[WXOH[HFX LHLSURJUDPXOXL
6DUH OD ]RQD FRUSXOXL IXQF LHL H[HFXW FH HVWH DFROR L DSRL VH
UHvQWRDUFHODORFXODSHOXOXL
Declararea argumentelor
'HFODUDUHD DUJXPHQWHORU VH VXSXQH OD DFHOHDL UHJXOL FD RULFDUH GHFODUDUH GH
YDULDELOHFXXUPWRDUHOHH[FHS LL
 VLQJXUDFODVGHVWRFDUHSHUPLVHVWHUHJLVWHU
 FKDU L VKRUW VXQW FRQYHUWLWH OD vQWUHJL IORDW VXQW FRQYHUWLWH OD GRXEOH
1RLOHIDFLOLW L$16,&SHUPLWGH\DFWLYDUHDDFHVWRUFRQYHUVLLDRWRPDW
 XQ DUJXPHQW IRUPDO GHFODUDW FD IXQF LH HVWH FRQYHUWLW OD SRLQWHU FWUH
IXQF LH
 VHSRDWHVQXLQFOXGXQLQL LDOL]DWRUvQWURGHFODUD LHGHDUJXPHQWH

&RUSXOIXQF LHL
&RUSXOXQHLIXQF LLHVWHGHOLPLWDWGHXQVHWGHSDUDQWH]H^`(OSRDWHILJROIDSWFH
HVWHIRORVLWRUvQGLYHUVHSHULRDGHDGH]YROWULLXQXLSURJUDP
8QXOGLQSULPHOHOXFUXULvQFD]XOSURLHFWULLXQHLDSOLFD LLPDULHVWHGHILQLUHDXQXL
VHWGHRSHUD LLGHQLYHOvQDOWFHFRUHVSXQGFDIXQF LRQDUHQDFHVWHVWDJLLHVWHIRORVLWRUV
DPXQSURJUDPIXQF LDGHFODUD LLSDUDPHWULLVSHFLILFD LGDUFRUSXOJRO/DDSHOHDQXYD
H[HFXWDQLPLF8OWHULRUDFHVWHFRUSXULYRUILFRPSOHWDWH
9DORULOHUHWXUQDWH vQWRDUVH
2IXQF LHSRDWHUHWXUQDRVLQJXUYDORDUHSULQLQWHUPHGLXOFXYkQWXOXLFKHLHUHWXUQ
$FHDVWYDORDUHSRDWHILXQSRLQWHUSHQWUXWDEORX YDORULPXOWLSOH VDXRIXQF LH ,QGLUHFW
vQVLDFHVWHDSRWILvQWRDUVHGDFVHIRORVHWHXQSRLQWHUODDFHVWHDFDYDORDUHDWLQV2
VWUXFWXU VDX XQLXQH SRW IL UHWXUQDWH GLUHFW GHL DFHVW OXFUX QX HVWH UHFRPDQGDW GDWRULW
GLPHQVLXQLORUPDULDOHORU
&RUSXO XQHL IXQF LL SRDWH FRQ LQH RULFkWH DSHOXUL GH UHWXUQ /D SULPXO vQWkOQLW
H[HFX LDIXQF LHLHVWHvQFKHLDWvQOLSVDWRWDODXQXLUHWXUQvQWRUFHUHDvQIXQF LDDSHODQW
VHIDFHDWXQFLFkQGVHvQWkOQHWHPDUFDWRUXOGHVIkULWGHEORF`
9DORDUHD vQWRDUV WUHEXLH V ILH FRPSDWLELO FX WLSXO IXQF LHL ([ GH FD] vQ FDUH
YDORDUHD vQWRUV HVWH GLIHULW HVWH GDW PDL MRV GDU vQ DFHVW FD] FRQYHUVLD OD YDORDUHD OD
YDORDUHDUHWXUQDWVHIDFHDXWRPDW
$7(1,( $FHVWOXFUXSRDWHFUHDRJURD]GHQHSOFHULILLQGRHURDUHH[WUHPGHJUHX
GHJVLW
)ORDWI YRLG
^
LQWD
FKDUF
IORDWI
LI D! F[
^
I DDFRQYHUWLWODIORDW
UHWXUQD
`
HOVH
^
I FFFRQYHUWLWODIORDW
UHWXUQF
`
`
/LPEDMXO & HVWH IRDUWH ULJXURV UHODWLY OD SRWULYLUHD WLSXULORU GH SRLQWHUL Q
H[HPSOXO XUPWRU I   HVWH GHFODUDW FD R IXQF LH FH vQWRDUFH XQ SRLQWHU FWUH FKDU VXQW
SUH]HQWHXQHOHSRVLELOLW LOHJDOHVDXLOHJDOHGHvQWRDUFHUHGHUH]XOWDW

&KDU I 
^
FKDU FP FY FYFD>@
LQW LS LS
FY FYDGPLVDXDFHODLWLS
UHWXUQFYDGPLVFYHVWHFKDU
sau

sau

sau

sau

FY  FPDGPLVDXDFHODLWLS
UHWXUQ FPDGPLV FPHVWHFKDU
FY FDDGPLVDXDFHODLWLS
UHWXUQFDDGPLVFDHVWHFKDU
FY FYHURDUHFYHVWHFKDU LDU FYHVWHFKDU
UHWXUQ FYHURDUHGLQDFHVWPRWLY
FY LSHURDUHFKDU  LQW
UHWXUQ$WHQ LH3URGXFHXQFRPSRUWDPHQWLPSUHGLFWLELOVHDWHDSWR
YDORDUHVILHvQWRDUV

$OX]LLODIXQF LL
2DOX]LHODIXQF LHUHSUH]LQWRGHFODUD LH DXQHLIXQF LLFDUH HVWHGHILQLWvQDOW
SDUWHGHRELFHLvQWUXQILLHUVXUVGLIHULW,PSOLFLWWRDWHIXQF LLOHVXQWSUHVXSXVHDUHWXUQD
LQW
6FRSXOSULQFLSDODOUHGHFODUULLHVWHGHDLQGLFDSURWRWLSXO FDFRPSLODWRUXOVWLH
FXP V WUDQVPLW YDULDELOHOH OD DSHOXO HL  SUHFXP L FODVD GH VWRFDUH Q FD]XO vQ FDUH
FODVD GH VWRFDUH QX HVWH SUHFL]DW HD HVWH FRQVLGHUDW H[WHUQ LPSOLFLW $FHVW OXFUX
vQVHDPQFGHILQL LDIXQF LHLSUHFXPLFRUSXOHLSRWDSUHDvQRULFDUHGLQILLHUHOHVXUV
D DSOLFD LHL LQFOXVLY vQ FHO FXUHQW 'DF VH RPLWH L VSHFLILFDUHD WLSXOXL DWXQFL LPSOLFLW
HVWHLQW
6FRSXO vQ FD]XO XQHL DOX]LL OD IXQF LH HVWH WLSLF FD OD RULFDUH DOW YDULDELO
DSHOXULOHvQEORFDXVFRSEORFUHVWXODXVFRSXOILLHU
Conversiile automate de argument
Q DEVHQ D SURWRWLSXOXL  DOW PRWLY SHQWUX DOX]LLOH OD IXQF LL  WRDWH DUJXPHQWHOH
PDLPLFLFDLQWVXQWFRQYHUWLWHODLQWLDUWRDWHDUJXPHQWHOHIORDWVXQWFRQYHUWLWHODGRXEOH
'HFLSRDWHILRVXUVELQHDVFXQVGHHURUL
3RLQWHULODIXQF LL
6XQW LQVWUXPHQWH SXWHUQLFH SHQWUX FD QH SHUPLW R PRGDOLWDWH HOHJDQW GH DSHO
SHQWUXGLIHULWHIXQF LLED]kQGXVHSHGDWHOHGHLQWUDUH
QDLQWHGHDGLVFXWDSRLQWHULLODIXQF LHWUHEXLHYRUELWSX LQGHVSUHPRGXOvQFDUH
FRPSLODWRUXOLQWHUSUHWHD]GHFODUD LLOHIXQF LLORUSUHFXPLDSHOXULOHDFHVWRUD
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 FWUH SULPXO

HOHPHQWDOWDEORXOXL$WXQFLFkQGVLPEROXOHVWHXUPDWGHXQQXPHQXPUvQWUHSDUDQWH]H
SRLQWHUXO HVWH LQGH[DW FX DFHO QXPU DSRL UHIHULW 8Q SURFHV VLPLODU DSDUH L vQ FD]XO
IXQF LLORU
)LHGHFODUD LDLQWI  vQDFHVWFD]IHVWHXQSRLQWHUODIXQF LH&kQGHOHVWHXUPDW
GHROLVWGHDUJXPHQWHLQFOXVvQWUHSDUDQWH]HHO HVWHUHIHULW  DOWPRGGHDVSXQH FR
IXQF LHHVWHDSHODW 'HDVHPHQHDGDFLQWY>@VHUHIHUODXQSRLQWHUFRQVWDQWODIHOL
vQFD]XOLQWI  IHVWHWRWXQSRLQWHUFRQVWDQWvQVHVWHLOHJDOVVHDVLJQH]HRYDORDUHOXL
I
3HQWUX D GHFODUD R YDULDELO SRLQWHU FWUH R IXQF LH QXPHOH SRLQWHUXOXL WUHEXLH
SUHFHGDWGH GHH[HPSOXLQW SI  HVWHXQSRLQWHUFWUHRIXQF LHFHvQWRDUFHXQvQWUHJ
'HIDSWVHGHFODURYDULDELOGHWLSSRLQWHUFDUHHVWHFDSDELOVUH LQXQSRLQWHUFWUHR
IXQF LHFHvQWRDUFHXQvQWUHJ
3DUDQWH]HOHVXQWQHFHVDUHGHRDUHFHvQOLSVDORUSIDUILFRQVLGHUDWRIXQF LHFDUH
vQWRDUFHXQSRLQWHUODvQWUHJ
$VLJQDUHDXQHLYDORULSHQWUXSRLQWHULLODIXQF LLVHUHDOL]HD]DVWIHOILHIXQF LDLQW
IDWBER\   L SRLQWHUXO OD R IXQF LH FH vQWRDUFH XQ vQWUHJ LQW SI    $VLJQDUHD VH
UHOL]HD]GLUHFWSI IDWBER\'HYLQDVWIHOFODUHXUPWRDUHOHHURUL
 SI I  XQGHSIHVWHSRLQWHUODIXQF LHLDUI  HVWHXQvQWUHJ
 SI I   QX VH SRDWH RE LQH DGUHVD UH]XOWDWXOXL XQHL IXQF LL
GHRDUHFHWUDQVIHUXOVHIDFHSULQVWLY
 SI  IXQGHSIHVWHSRLQWHUODLQWLDU IHVWHSRLQWHUODSRLQWHU
&RQYHQ LLGHWLSvQFD]XOGHvQWRDUFHUHSDUDPHWULL
1XWUHEXLHXLWDWFWLSXOGHGDWHvQWRUVGHIXQF LHWUHEXLHVILHvQFRLQFLGHQ FX
WLSXOGHSRLQWHUODIXQF LHGHFODUDW
'HH[ILHGHFODUD LLOH
LQWLI  LI   SLI  
IORDWII   SII  
FKDUFI   SFI  
LVHFYHQ DGHDVLJQUL
SLI LIOHJDOWLSXULOHVXQWLGHQWLFH
SFI FILOHJDOQHSRWULYLUHGHWLS
SII LILOHJDOQHSRWULYLUHGHWLS
SFI FIOHJDO
LI LILOHJDOVHvQFHDUFDVLJQDUHDXQHLQRLYDORULODRFRQVWDQW
$SHOXOXQHLIXQF LLIRORVLQGpointeri
([
LQWI  
LQW SI  
LQWUH]

SI IDPDVLJQDWSIODIXQF LH

UH]  SI D DPDSHODWIXQF LDIFXDFDSDUDPHWUX

Obs: SI D HVWH(&+,9$/(17FX SI 6LQWD[D$16,SHUPLWHFDvQORFGH


SI D VIRORVHVFSI D 3HQWUXSRUWDELOLWDWHDXQXLSURJUDPHVWHLQGLFDWVVHIRORVHDVF
SULPDIRUP
ntoarcerea ca rezultat de SRLQWHUODIXQF LL
2 IXQF LH SRDWH vQWRDUFH XQ SRLQWHU OD DOW IXQF LH GDU WUHEXLH DYXW JULM GHVSUH
PRGXOvQFDUHVHYDIDFHGHFODUDUHDDFHVWHLIXQF LL'HH[HPSOX
,QW I IORDW[IORDW\ 
sau
LQW I [\ 
IORDW[\
^

`
GHFODURIXQF LHFHDUHYDULDELOHGHLQWUDUH[\LFDUHvQWRDUFHXQSRLQWHUFWUHRIXQF LH
FHvQWRDUFHXQvQWUHJ
6OXPXQH[HPSOXPDLFRQFUHWGHIRORVLUHDDFHVWRUIDFLOLW LLDQXPHRIXQF LH
GHVRUWDUHRSWLPDOGLQSXQFWGHYHGHUHDOYLWH]HL
6 DQDOL]P SX LQ SUREOHPD ([LVW PDL PXO L DOJRULWPL GH VRUWDUH ILHFDUH FX
DYDQWDMHLGH]DYDQWDMH
4XLFNVRUW
: IRDUWHUDSLGSHQWUXGDWHDOHDWRUDUDQMDWH
: LQHILFLHQWGDFGDWHOHVXQWSDU LDOVRUWDWHSHJUXSXUL
0HUJHVRUW
:
XQXOGLQWUHFHLPDLHILFLHQ LGDUFHUHPHPRULH
+HDSVRUW
:
FHO PDL LQGLFDW SHQWUX DULL PDVLYH GH GDWH GHRDUHFH QHFHVLW FHD PDL SX LQ
PHPRULH
3S F vQ XUPD XQRU DQDOL]H SXWHP GHFLGH FDUH GLQWUH FHL WUHL DOJRULWPL YRU IL XWLOL]D L
3RDWHILVFULVXUPWRDUHDIXQF LH
9RLG P\BVRUW IORDWLQBGDWD 
^
H[WHUQYRLGTXLFNBVRUW  PHUJHBVRUW  KHDSBVRUW  
KHDSBVRUWSRDWHOLSVL
 VH UHDOL]HD] DQDOL]D GDWHORU  6 SUHVXSXQHP F GHFL]LD YD IL
GHSXVvQWUXQIODJ
VZLWFK IODJ
FDVHUHWXUQTXLFNBVRUW
FDVHUHWXUQPHUJHBVRUW
FDVHUHWXUQKHDSBVRUW
GHIDXOWSXWV (UURUXQNQRZQ 
H[LW  EUHDN
`
ODDSHO P\BVRUW OLVW  OLVW 

Recursivitatea
2IXQF LHUHFXUVLYHVWHXQDFDUHVHDXWRDSHOHD]'HH[
YRLGUHFXUV YRLG
^
VWDWLFFRQW 
SULQWI G?QFRQW 
FRQW
UHFXU  
`
YRLGPDLQ YRLG
^
UHFXU 
`

YRLGUHFXU YRLG
^
VWDWLFFRQW 
LI FRQW! UHWXUQ
HOVH
^
SULQWI G?QFRQW 
FRQW
UHFXU  
`
`

/D ILHFDUH
DSHO GH IXQF LH vQ
VWLY VXQW VDOYD L
R
VHULH
GH
SDUDPHWULL
3URJUDPXOGH PDL
VXV YD DXWRDSHOD
IXQF LD
OD
  GDU
VWLYD 3& HVWH
ILQLW DYkQG FD
UH]XOWDW R EORFDUH
JHQHUDO'HDFHHDRULFHIXQF LHUHFXUVLYWUHEXLHVDLERFRQGL LHQXPLWFD]GHED]
FDUHVSHUPLWVWRSDUHDDFHVWXLSURFHV8QH[HPSOXVLPSOXDUILvQFD]XOQRVWUXOLPLWDUHD
FRQWRUXOXL'HFL
QWUHEUL
&HVHvQWPSOGDFWHUJHPHOVHLFHOHGRXDFRODGHGHGXSHO"
&HVHvQWPSOGDFFRQWQXHGHFODUDWVWDWLF"
)RORVLUHD YDULDELOHORU IL[H HVWH
R FDOH GH D FRQWUROD
UHFXUVLYLWDWHD  GXS FXP DP
Y]XW DQWHULRU Q H[HPSOXO GH
PDL MRV VH FDOFXOHD]

L 
L

=

L1UHFXUVLY
,QWVXP LQWQ
^
LI Q  UHWXUQQ
HOVHUHWXUQ QVXP Q 
`
3W Q  V YHGHP FXP VH
H[HFXWSDVFXSDV

(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] R
EXFDWL]RODWGHSURJUDP,]RODUHDVHUHIHUODIDSWXOFODUHDOL]DUHDDFHOXLSURJUDPQX
VH LQH FRQW GH FHLODO L FL OD  IXQF LLOH FDUH WUHEXLH V OH vQGHSOLQHDVF SURJUDPXO /D
VIkULWDFHVWHSURJUDPHVXQWXQLWH OLQNHG vPSUHXQSHQWUXDIRUPDDSOLFD LDGRULW
3HQWUX FD vQ DFHDVW ID] V QX DSDU SUREOHPH PDMRUH WUHEXLH V H[LVWH XQ
PHFDQLVPFHDVLJXUFDYDULDELOHOHGHFODUDWHGHXQSURJUDPDWRUVQXLQWUHvQFRQIOLFWFX
YDULDELOHOHFX DFHODLQXPHIRORVLWHGHXQ DOW SURJUDPDWRU GH H[ YDULDELOHOH GH FRQWRU
DOHXQHLEXFOHLMN 3HGHDOWSDUWHHVWHQHFHVDUFDDQXPLWHGDWHVILHFRPXQHYL]LELOH
LVDXPRGLILFDELOHGHFWUHPDLPXOWHVXUVHFHSURYLQGHODDXWRULGLIHUL L'HFLWUHEXLHV
H[LVWH XQ PHFDQLVP FDUH V DVLJXUH F QXPHOH YDULDELOHL GHFODUDWH vQ GLYHUVH ILLHUH VH
UHIHUODDFHOHDLORFD LLPHPRULH
Q&VHGHILQHWH
: &DQGWUHEXLHVILHRYDULDELOFRPXQVDXvPSDU LW VKDUHG
: Q FHSDUWHGH FRGHVWH 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 DOXQHLYDULDELOHHVWHDFWLY H[LVW 
$OW SURSULHWDWH D YDULDELOHORU HVWH GXUDWD FDUH VH UHIHU OD GHVFULH  GXUDWD GH YLD  vQ
PHPRULHDXQHLYDULDELOH
9DULDELOHOH FXGXUDW IL[VXQW JDUDQWDWH FL UH LQ GDWHOH FKLDU GXS FH LDX vQGHSOLQLW
VFRSXO
QVFKLPEvQFD]XOYDULDELOHORUFXGXUDWDXWRPDWDFHVWOXFUXQXPDLSRDWHILJDUDQWDW
'HILQL LH3ULQ FODV GH VWRFDUH storage FODVV  VH vQ HOHJH VFRSXO L GXUDWD XQHL
variabile.
)LHXUPWRUXOVHJPHQWGHSURJUDP
YRLGI YRLG
^LQWM
VWDWLFLQWYHFW>@ ^`

`
6H REVHUY F H[LVW GRX YDULDELOH M L YHFW (OH DX XQ VFRS GH EORF GHRDUHFH VXQW
GHFODUDWH vQ LQWHULRUXO DFHVWXLD 9DULDELOHOH FX VFRS GH EORF VXQW GH RELFHL QXPLWH
YDULDELOHORFDOH,PSOLFLWYDULDELOHOHORFDOHDXGXUDWDDXWRPDWQFD]XOOXLMHOYDDYHD
DWULEXLWRQRXDGUHVGHPHPRULHODILHFDUHH[HFX LH D UHVSHFWLYXOXL EORF Q FD]XO OXL
YHFWGDWRULWIRORVLULLFXYkQWXOXLFKHLHVWDWLFDWULEXLUHDXQHLDGUHVHGHPHPRULHVHIDFHR
VLQJXUGDWLVHSVWUHD]SHWRDWGXUDWDH[HFX LHLSURJUDPXOXL

'XUDWDIL[ID GHFHDDXWRPDW
'XSFXPRSUHFL]HD]LQXPHOHRYDULDELOIL[HVWHXQDVWD LRQDUvQWLPSFH
SHQWUXRYDULDELODXWRPDWLF]RQDGHVWRFDUHvQPHPRULHHVWHDOHDVDXWRPDWvQWLPSXO
H[HFX LHLSURJUDPXOXL'HFLRYDULDELOIL[ DUH PHPRULH DORFDW PHPRULD OD vQFHSHUHD
H[HFX LHLSURJUDPXOXLLLSVWUHD]DFHDVWDORFDUHSHWRDWGXUDWDH[HFX LHLDFHVWXLD
9DULDELODDXWRPDWLFVHUHIHU OD ]RQD GH PHPRULH DWDDW HL GRDU DWkWD WLPS FkW
FRGXOvQFDUHLDUHVFRSXO HVWH H[HFXWDW 2 GDW vQFKHLDW VFRSXO  ]RQD XQGH HUD IL[DW
FRPSLODWRUXODVLJXUHOLEHUDUHD]RQHLGHPHPRULHRFXSDWGHDFHDVWD
9DULDELOHOH ORFDOH FX VFRSXO OLPLWDW OD QLYHO GH EORF  VXQW LPSOLFLW DXWRPDWLFH
(OHSRWILIRU DWHVOXFUH]HVWDWLFSULQIRORVLUHDFXYkQWXOXLFKHLHVWDWLF
,QL LDOL]DUHDYDULDELOHORU
'LIHUHQ DGLQWUHYDULDELOHOHIL[HLFHOHDXWRPDWHHVWHLPSRUWDQWvQVSHFLDOSHQWUX
YDULDELOHOHQHLQL LDOL]DWHQFD]XOFHORUDXWRPDWHHOHYRUILUHLQL LDOL]DWHODILHFDUHWUHFHUH
SULQ]RQDORUGHH[LVWHQ 
YRLGPF YRLG
^
LQWM 
VWDWLFLQWN 
MN
SULQWI M G?WN G?QMN 
`
YRLGPDLQ YRLG
^
PF 
M 
N 
PF 
M 
N 
PF 
M 
N 
`
$OWGLIHUHQ DSDUHODLQL LDOL]DUHDLPSOLFLWDYDULDELOHORU
: YDULDELOHOHDXWRPDWHQXVXQWLQL LDOL]DWH
: YDULDELOHOHVWDWLFHVXQWLPSOLFLWLQL LDOL]DWHFX
([
YRLGPF YRLG
YRLGPDLQ YRLG
^
^
LQWM
PF 
VWDWLFLQWN
PF 
MN
PF 
SULQWI M G?WN G?QMN 
`
`
&XUH]XOWDWXO M  N 
M 
N 
M 
N 
$OW GLIHUHQ  vQWUH YDULDELOHOH FX GXUDW IL[ L FHOH DXWRPDWH VH UHIHU OD WLSXULOH GH
H[SUHVLLFHSRWILIRORVLWHvQXWLOL]DUH

'HH[XUPWRDUHOHGHFODUD LLVXQWOHJDOH
LQWM N 
LQWP MN
IORDW[  
vQWLPSFHXUPWRDUHOHQXGHRDUHFHMLNDSDUvQH[SUHVLLvQDLQWHGHDILGHFODUDWH
LQWP MN
LQWM N 
5HJXOLOH GH LQL LDOL]DUH D YDULDELOHORU FX GXUDW IL[ VXQW IRDUWH VWULFWH ,QL LDOL]DUHD VH
SRDWHIDFHQXPDLFXRH[SUHVLHFRQVWDQW GHFL18SRDWHFRQ LQHQXPHGHYDULDELO 
)RORVLUHDYDULDELOHORUFXGXUDWIL[
8QH[HPSOXFODVLFGHIRORVLUHDDFHVWRUDHVWHFRQWRUL]DUHDQXPUXOXLGHH[HFX LL
DOHXQHLIXQF LLSHQWUXDLSXWHDPRGLILFDH[HFX LDODLQWHUYDOHUHJXODWH
'HH[VSUHVXSXQHPFDYHPXQSURJUDPFDUHIRUPDWHD]XQWH[WFLWLWGLQWUXQ
ILLHU L VFULH UH]XOWDWXO vQ DOW ILLHU 8QD GLQ IXQF LL HVWH HVWH SULQWBKHDGHU  DSHODW OD
vQFHSXWXO ILHFUXL SURJUDP QRX (YHQWXDO DFHDVWD SRDWH IL GLIHULW IXQF LH GH
SDULWDWHDLPSDULWDWHDQXPUXOXLGHSDJLQL
GHILQH2''
GHILQH(9(1
SULQWBKHDGHU FKDU FKRSBWLWOH
^
VWDWLFFKDUSDJHBW\SH 2''
LI SDJHBW\SH 2''
^
SULQWI ?W?W?W?WV?Q?QFKRSBWLWOH 
SDJHBW\SH (9(1
`
HOVH
^SULQWI V?Q?QFKRSBWLWOH 
SDJHBW\SH 2''
`
`
Scopul unei variabile (Scope)
QFDGUXOSURLHFWULLXQXLSURJUDPWUHEXLH LQXWFRQWGHIDSWXOFH[LVWWLSXULGH
UHJLXQLILHFDUH FXXQVFRSELQH GHILQLW vQ FDUH VH SRDWH DFFHVD R YDULDELO SULQ QXPH L
DQXPHSURJUDPIXQF LHEORFILLHU
La nivel de program (program scope)vQVHDPQFYDULDELODHVWHDFWLYvQWUHGLIHULWHOH
ILLHUHVXUVFHFRUHVSXQGSURJUDPXOXLH[HFXWDELO9DULDELOHOHGHDFHVWWLSVXQWFXQRVFXWH
GHRELFHLVXEQXPHOHGHYDULDELOHJOREDOH
/DQLYHOGHILLHU ILOHscope)VHUHIHUODIDSWXOFUHVSHFWLYDYDULDELOHVWHDFWLYGHOD
SXQFWXOGHGHFODUD LLSkQODVIkULWXOILLHUXOXLVXUVFHRFRQ LQH
/DQLYHOGHIXQF LH function scope) YDULDELODHVWHDFWLYGRDUvQFDGUXOIXQF LHL

/D QLYHO GH EORF GH LQVWUXF LXQL block scope) YDULDELOD H DFWLY GH OD SXQFWXO GH
GHFODUD LHSkQODGHOLPLWDWRUXOGHVIkULWGHEORF.
QJHQHUDOVFRSXOXQHLYDULDELOHHVWHGHWHUPLQDWGHORFXOvQFDUHVHUHDOL]HD]GHFODUDUHD
DFHVWHLD

3URJUDP 6FRSH
)LOH 6FRSH
)XQFWLRQ 6FRSH
%ORFN 6FRSH

([
LQW,  3URJUDP6FRSH 
VWDWLFLQWM )LOH6FRSH 
IXQF LQWN  3URJUDP6FRSH 
^LQWP  %ORFN6FRSH 
VWDUW  )XQFWLRQ6FRSH 

$FHDVWLHUDUKL]DUHSHUPLWHFDvQGRXIXQF LLGLIHULWHVDYHPYDULDELOHFXDFHODLQXPH
VDXGHH[
LQWM 
PDLQ
^
LQWM
IRU M MM
SULQWI M G?QM 
OXFUHD]QRUPDOGDUGSGYDODOWXL
`
ILLHUVXUVM 
10.5. Variabile globale (program sau file scope)
3kQ DFXP VD GLVFXWDW QXPDL GHVSUH YDULDELOH ORFDOH ([LVW WRWXL FD]XUL FkQG VH
GRUHWH FD R YDORDUH GHSR]LWDW vQWUR YDULDELO V ILH YL]LELO VDX PRGLILFDELO GLQ
LQWHULRUXO RULFUHL IXQF LL 3HQWUX DFHDVWD HVWH VXILFLHQW FD UHVSHFWLYHOH YDULDELOH V ILH
GHFODUDWHvQDIDUDFRUSXOXLRULFUHLIXQF LLLHOHYRUFSWDDVWIHOXQFDUDFWHUJOREDO$FHVW
WLSGHYDULDELOHVXQWDXWRPDWLQL LDOL]DWHFXYDORDUHD]HUR
Q JHQHUDO vQ SURJUDPDUHD VWUXFWXUDW VH UHFRPDQG HYLWDUHD H[FHVXOXL GH YDULDELOH
JOREDOHvQWUXFkWQXVXQWQHDSUDWQHFHVDUHGHFkWHYHQWXDOFDVVFULHPPDLUHSHGHLXRU
XQ FRG GDU DFHVW FRG QX HVWH QHDSUDW FHO PDL EXQ VDX FHO PDL VWDELO  0DL MRV YRP
SUH]HQWDXQH[HPSOXVLPSOXUHODWLYODIRORVLUHDYDULDELOHORUJOREDOH

LQFOXGHVWGLRK!
LQFOXGHFRQLRK!
LQWJOREDOBY
LQWRULBGRL LQW[ 
YRLGPDLQ YRLG
^
LQWORFDOBY
FOUVFU 
SULQWI 9DULDELODJOREDODDUHYDORDUHDG?QJOREDOBY 
SULQWI 9DULDELODORFDODDUHYDORDUHDG?QJOREDOBY 
ORFDOBY RULBGRL ORFDOBY 
SULQWI 9DULDELODJOREDODDUHYDORDUHDG?QJOREDOBY 
SULQWI 9DULDELODORFDODDUHYDORDUHDG?QJOREDOBY 
`
LQWRULBGRL LQW[
^
LQWUHWYDO
UHWYDO [ 
JOREDOBY
UHWXUQUHWYDO
`
Tematica claselor de stocare ANSI
ORFXO XQGH

VH GHFODU

Q DIDUD

vQ LQWHULRUXO

DUJXPHQWH

IXQF LHL

IXQF LHL

IXQF LH

6FRSEORFN

6FRS EORF

6SHFLILFDWRU

GH FODV
DXWR

1(3(50,6

VDX UHJLVWHU
6WDWLF

6FRSILLHU

([WHUQ

'XUDWD DXWRPDWLF

'XUDWDDXWRPDWLF

6FRS EORF

1(3(50,6

'XUDWDIL[

'XUDWD IL[

6FRS SURJUDP

6FRS EORF

1(3(50,6

'XUDWD IL[

'XUDWD IL[

1LFL XQ

6FRS SURJUDP

6FRS EORF

VSHFLILFDWRU

'XUDWD IL[

6FRS EORF

'XUDWD GLQDPLF

'XUDWD DXWRPDWLF

SUH]HQW

10.6. Macrouri
QPRGQRUPDOFkQGRIXQF LHHVWH DSHODW VH FUHHD] VHWXO GH YDULDELOH ORFDOH DSRL
DFHVWHD VH LQL LDOL]HD] $FHVW OXFUX GXUHD] vQ XQHOH FD]XUL PDL PXOW GHFkW H[HFX LD
FRUSXOXLIXQF LHL$SDUHvQWUHEDUHDFXPSRDWHHYLWDSLHUGHUHDGHYLWH]LWRWXLVUH]XOWH
XQSURJUDPVWUXFWXUDW

/LPEDMXO & HVWH SUHY]XW FX PDFURXUL PDFURGHILQL LL  FDUH SHUPLW LPSOHPHQWDUHD
UDSLGGHRSHUD LLVLPSOHIUGH]DYDQWDMHOHGHWLPSGLQFD]XOIXQF LLORU
'DF VH GRUHWH GHFODUDUHD XQHL YDORUL FRQVWDQWH VH SRDWH IRORVL GLUHFWLYD
SUHSURFHVRUGHILQHFDPDLMRV
GHILQHSL
/DvQWkOQLUHDUHVSHFWLYHLGLUHFWLYHSUHSURFHVRUXOYDvQORFXLILHFDUHPHQ LRQDUHvQFRGD
OXLSLFXvQVLYDORDUHD6LPLODUVHYDvQWkPSODLFXFRUSXOXQXLPDFUR
2EVHUYD LH R YDULDELO SRDWH IL GHFODUDW IL GHFODUDW FD ILLQG VWDWLF DGLF QXL YD
PRGLILFD YDORDUHD SH SDUFXUVXO H[HFX LH FX DMXWRUXO FXYkQWXOXL FKHLH VWDWLF SXV vQDLQWHD
VSHFLILFDWRUXOXLGHWLS
)LHH[HPSOHOHGHPDLMRVXQGHVXQWSUH]HQWDWHGRXPDFURXULXQXOFDOFXOHD][LDU
DOWXOUHDOL]HD]PD[LPXPGLQWUHGRXQXPHUH
GHILQHP\BPD[ [\  [ ! \ " [  \ 
GHILQHP\BVTU [  [ [
'DFVHYRUIRORVLDFHVWHPDFURXULvQORFXODSHOXOXLXQHLIXQF LLVHYDLQVHUDGLUHFWFRGXO
FRUHVSXQ]WRULPSOHPHQWULLGHILQL LLORUGLQGUHDSWD
7RWXL IRORVLUHD PDFURXULORU DVFXQGH XQ PDUH SHULFRO SHQWUX FLQHYD FDUH QX DUH
VXILFLHQWH[SHULHQ 'DFvQFD]XOXQHLIXQF LLVHUHDOL]HD]vQWkLHYDOXDUHDSDUDPHWULORU
OD DSHOXO XQXL PDFUR DFHVW OXFUX QX VH PDL IDFH $SDU SUREOHPH GH RUGLQH D H[HFX LHL
RSHUD LLORUFDvQH[HPSOHOHGHPDLMRV
UH] P\BVTU [ HYDOXDUHDHVWHUH] [ [vQORFGH
 [ [
VDX
UH] ]P\BVTU [ HYDOXDUHDHVWHUH]  ][ [vQORFGH] [ [
'LQDFHVWPRWLYODFRPSLODWRDUHOHGH223VDLQWURGXVQR LXQHDGH IXQF LHLQOLQH
FDUHHOLPLQGH]DYDQWDMHOHPDFURXULORUGDUVHFRPSRUWFDDFHVWHD
7UHEXLHPHQ LRQDWFODGHSDQDUHDSDVFXSDVVHSRDWHLQWUDvQLQWHULRUXOXQXLDSHOGH
PDFURFHHDFHIDFHFDHURULOHGHWLSXOSUH]HQWDWPDLVXVVILHJUHXGHSLVWDELOH
10.7 Macrouri predefinite
10.7.1. ASSERT
)RORVLUHDDFHVWHLPDFURGHILQL LLHVWHLQGLFDWGLQXUPWRDUHOHPRWLYH



FUHWHIRDUWHPXOWYLWH]DGHGHSDQDUHDXQXLSURJUDP
SURJUDPDUHDvQ&ODRUDDFWXDOHVWHUHDOL]DWVXEFRPSLODWRDUHGH&FDUHDFFHSWL
FRG&FODVLFFRPSLODWRDUHFDUHRDXSUHGHILQLW

(VWHXQPDFURFDUHIXQF LRQHD]H[DFWFDRLQVWUXF LXQHLIGDUVSUHGHRVHELUHDGH


DFHDVWD vQ PRPHQWXO vQ FDUH FRQGL LD GH HYDOXDW LD YDORDUHD ]HUR EORFKHD] H[HFX LD
SURJUDPXOXL DSHOkQG IXQF LD DERUW /D VWRSDUHD H[HFX LHL VH WULPLWH FWUH GLVSR]LWLYXO
VWDQGDUG GH LHLUH XQ PHVDM VSHFLILF FDUH SUHFL]HD] QXPHOH ILLHUXOXL VXUV L OLQLD GLQ
FDGUXODFHVWXLDFDUHDJHQHUDWHURDUHD
'DF YDORDUHD HYDOXDW HVWH GLIHULW GH ]HUR DVVHUW QX DUH QLFL R LQIOXHQ  DVXSUD
H[HFX LHLSURJUDPXOXL3URWRWLSXOHVWHGHILQLWvQELEOLRWHFD$66(57+LDUDWFDPDLMRV
YRLGDVVHUW LQWWHVW 
'HRELFHLHVWH IRORVLWSHQWUXDWHVWDGDFRvQFHUFDUHGHDORFDUHGLQDPLF DXQHLQRL
]RQH GH PHPRULH D UHXLW VDX QX 'XS FXP DP VSXV HO HVWH IRORVLW vQ FDGUXO GHSDQULL
XQHL DSOLFD LL 2 GDW WHUPLQDW DFHDVW ID] VH SRDWH IDFH FD SUHSURFHVRUXO & V LJQRUH
OLQLLOH GLQ FRGXO VXUV FH FRQ LQ DSHOXUL GH DFHVW WLS SULQ LQFOXGHUHD vQ FRGXO VXUV D
GLUHFWLYHL
GHILQH1'(%8*
vQDLQWHD GLUHFWLYHL FH LQFOXGH ELEOLRWHFD $66(57+ 8Q H[HPSOX VFXUW GH IRORVLUH HVWH
SUH]HQWDWPDLMRV
DLFLVHYDLQFOXGHGHILQH1'(%8*
LQFOXGHDVVHUWK!
LQFOXGHDOORFK!
YRLGPDLQ 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 GHDELD vQ FHD GHD GRXD
VLWXD LH
10.7.2. Macrouri specializate n clasificarea caracterelor.
$XIRVWLQWURGXVHSHQWUXDXXUDJkQGLUHDLVFULHUHDFRGXOXLvQFD]XOvQ
FDUHVHIDFSUHOXFUUL SH LUXUL GH FDUDFWHUH $FHVWH SUHOXFUUL VXQW GHVHRUL vQWkOQLWH 6D
SUHIHUDW LPSOHPHQWDUHD FD PDFURXUL SHQWUX D RE LQH R YLWH] PD[LP GH H[HFX LH 9RP
SUH]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 GH
FDUDFWHUHHYDOXDWDUHUHVSHFWLYDFDUDFWHULVWLFWHVWDWGHPDFURXVDX]HURvQFD]FRQWUDU

LQWLVORZHU LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHGLQFDWHJRULDOLWHUHORUPLFLF>D]@
LQWLVDOSKD LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHOLWHUF>D]@VDXF>$=@
LQWLVXSSHU LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHOLWHUPDUHF>$=@
LQWLVSULQW LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHWLSULELOF>[[H@
LQWLVDVFLL LQWF 
7HVWHD]GDFFDUDFWHUXORFWHWXOORZDOOXLFH[WHvQLQWHUYDOXO>@
LQWLVSXQFW LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHXQFDUDFWHUGHSXQFWXD LH
LQWLVVSDFH LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHVSD LXWDE&5VDOWODOLQLHQRXWDEYHUWLFDOVDX
IRUPIHHGDGLFF>[[G[@
LQWLVGLJLW LQWF 
7HVWHD]GDFFDUDFWHUXOFHVWHFLIUF>@
LQWLVJUDSK LQWF 
6LPLODUFXLVSULQWQXPDLFVHHOLPLQVSD LLOH
LQWLV[GLJLW LQWF 
7HVWHD]GDFFDUDFWHUXOFDSDU LQHED]HLF>@VDXF>DI@VDXF>$)@
10.7. 3. 0DFURGHILQL LLpredefinite
8QXO GLQ XUPWRDUHOH VLPEROXUL HVWH SUHGHILQLW vQ IXQF LH GH PRGHOXO GH PHPRULH
DOHVSHQWUXFRPSLODUH
BB&203$&7BBBB0(',80BBBB+8*(BB

BB/$5*(BBBB60$//BBBB7,1<BB
$OWHPDFURGHILQL LLLPSOLFLWH
BBFSOXVSOXVGHILQLWGDFVHFRPSLOHD]XQSURJUDP&
BB'$7(BBGDWDFRPSLOULLFDPPPGG\\\\
BB),/(BBQXPHOHILLHUXOXLVXUVFXUHQW DIHFWDWGHOLQH FDXQLUGHFDUDFWHUH
BB/,1(BBQXPUXOOLQLHLFXUHQWH DIHFWDWGHOLQH FDXQQXPUvQWUHJ
BB06'26BBvQWRWGHDXQDGHILQLW 
BB29(5/$<BBGHILQLWGDFHVWHDFWLYDWRS LXQHDGHOXFUXFXUHDFRSHULUL RS LXQHD<
DFWLY
BB3$6&$/BBGHILQLWGDFRS LXQHDSHVWHDFWLY
BB67'&BBGHILQLWGDFVHFHUHFRPSDWLELOLWDWHFXVWDQGDUGXO$16, RS LXQHD$VDX
GLQPHGLXOLQWHJUDW
BB7,0(BBRUDFXUHQWKKPPVV
BB785%2&BBYHUVLXQHDFRPSLODWRUXOXLFDRFRQVWDQWKH[D]HFLPDO

CAPITOLUL 11
11. 3RLQWHULLDORFDUHDGLQDPLF
11.1. Introducere.
Primele PLQLVLVWHPH FX PLFURSURFHVRDUH SH  EL L DYHDX  ko memorie RAM.
$FHDVW GLPHQVLXQH HUD DOHDV GLQ FDX]D XQHL OLPLWUL GDWRUDWH QXPUXOXL Q GH EL L
necesari pentru construirea adresei 2 = 2 * 2 = 2 ko = 64 NRGHFLEL LGHDGUHV
QWUXFkWSURFHVRUXOOXFUDSHEL LSHQWUXDDYHDDFFHVODRGDWRDUHFDUHGLQPHPRULHHO
WUHEXLD V IDF XQD VDX GRX RSHUD LL GHSLQ]kQG GH FRQVWUXF LD LQWHUQ  6LVWHPHOH FX
SURFHVRDUH SH  EL L   9   DYHDX XQ  QRX VHW GH LQVWUXF LXQL HUDX PDL
UDSLGHLDFFHVDXPDLPXOWPHPRULH5$0
3UREOHPDHUDFGHMDVHFKHOWXLVHIRDUWHPXOWWLPSLEDQLSHQWUXDGH]YROWDSURJUDPH
SHQWUX VLVWHPHOH DQWHULRDUH 0XOWH DSOLFD LL PDL LPSRUWDQWH WUHEXLDX UHVFULVH FX XQ SUH
PLQLPQWRDWHSURJUDPHOHVH LQXVHFRQWvQOXFUXOFXGDWHOHGLQPHPRULHGHOLPLWDUHDGH
64 ko.
&HOPDLPLFHIRUWGHSURJUDPDUHVHIFHDGDFVHSURLHFWDXQVLVWHPGHRSHUDUHFDUH
V YDG  PHPRULD 5$0  FD ILLQG DOFWXLW  GLQ EXF L  VHJPHQWH  GH FkWH  ko.
$FHDVWDDIRVWLGHDGHED]DVLVWHPXOXLGHRSHUDUH06'26XQGHDGUHVDGHPHPRULHD
RULFUHLGDWHHVWHFRPSXVGLQGRXSU L
-

DGUHVDGHVHJPHQWDUDWDFkWDORFD LHGLQFHOH ORFD LLDOHXQXLVHJPHQWHVWHGDWD


XWLO
adresa de RIIVHW DUDW vQ DO FkWHOHD VHJPHQW  GLQ FHOH Q segmente din memorie, ne
DIOPXQGH
Q=

GLP

PHP5$0 [NR] .
[NR ]

Q SURJUDPDUHD GH QLYHO vQDOW  OD DFHD GDW  YH]L & 3DVFDO %DVLF &RERO DPG
DFWXDO QXPLWH OLPEDMH GH QLYHO PHGLX VD 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 D
unei date utile.
1R LXQHDGHpointer
8QDGLQFHOHPDLSXWHUQLFHPRGDOLW LGHDFFHVODGDWHVHED]HD]SHSRVLELOLWDWHDGH
a avea acces direct la adresa de memorie a unei date stocate acolo.
2YDULDELOFDUHVWRFKHD]DGUHVDDOWHLYDULDELOHVHQXPHWHpointer.
$YDQWDMXOIRORVLULLGHFWUHSURJUDPDWRUDXQXLDVHPHQHDFRQFHSWHVWHDFHODFvQ
FD]XOPDQLSXOULLXQRUPDVLYHGHGDWHGHPDULFDUHODUkQGXOORUFRQ LQHOHPHQWHGHPDUL
GLPHQVLXQL YH]L FD]XO XQHL VWUXFWXUL  QX VH YD PDL WUDQVIHUD WRDW ]RQD GH PHPRULH
RFXSDWGHRGDWFLQXPDLFXDGUHVDHLGHvQFHSXW$FHVWHDVHYRUREVHUYDLvQ HOHJHPDL
clar din exemple.

Pentru a vedea mai clar folosirea conceptului de SRLQWHUVFRQVLGHUPSURJUDPXO


GHPDLMRV$FHVWSURJUDPGHFODUXQYHFWRUGHHOHPHQWHvQWUHJL GHFLUHSUH]HQWDWHSH
RFWH LILHFDUH SUHFXPLXQSRLQWHUODXQvQWUHJ$FHDVWDvQVHDPQFFRPSLODWRUXOYDWL
vQFD]XOPDQLSXOULORUPDWHPDWLFHFXDGUHVDFDUHRFRQ LQHVIDFFDOFXOHOHFRUHFWGXS
cum vom vedea mai jos.
Geneza operatorului &op
Se traduce prin adresa lui aplicat XQXL RSHUDWRU RS HVWH R PRWHQLUH GLQ YUHPHD
DECPDP11 care folosea acest sistem.
(VWHQHSOFXWFWHUPLQRORJLDV-a pVWUDWGHRDUHFH DPELJXLWDWHDDSDUHvQIDSWXO F QX
WLP FRQFUHW GHVSUH FH DGUHV HVWH YRUED  /D FH QH UHIHULP: cea ce poate reprezenta o
DGUHVDUHSHUIHFWQRUPDOSHQWUXSURFHVRUXO;SRDWHVILHLPSRVLELO pentru controllerul
SURGXVGH<SHQWUXRPDLQGHVSODWFDUHIRORVHWHDGUHVDUHDGH17 EL L . Deci problema
SRUWDELOLW LL DEVROXWH V-a SVWUDW SHQWUX F D LQYHQWD XQ QRX WHUPHQ DU IL EXOYHUVDW PDL
PXOWVLWXD LD
Un SRLQWHUHVWHIRORVLWRUGDFHVWHRFDOHGHDFFHVODYDORDUHDDFUHLDGUHVDRUH LQH
/LPEDMXO&IRORVHWHSHQWUXDFHDVWDRSHUDWRUXO*.
 vQFHSH]RQDLQFOXGHULGHELOLRWHFL 
LQFOXGHVWGLRK!
LQFOXGHFRQLRK!
 VIkULW]RQDLQFOXGHULGHELOLRWHFL 
QXDPIXQF LLSURSULL
QXDPYDULDELOHJOREDOH
 LQFHSH]RQDSURJUDPXOXLSULQFLSDO 
YRLGPDLQ YRLG
^
LQW SSRLQWHUODRYDULDELOGHWLSvQWUHJ
LQWY>@WDEORXGHHOHPHQWHGHWLSvQWUHJ
LQWQLYDULDELOHQHFHVDUHSUHOXFUULLPDVLYXOXLGHGDWH
FOUVFU WHUJHFUDQ
SULQWI GDWLGLPHQVLXQHDYHFWRUXOXL1  
VFDQI G Q FLWHVFGLPHQVLXQHDYHFWRUXOXL
IRU L LQL
^
SULQWI ?Q9>G@ L 
VFDQI G Y>L@ 
`FLWHVFYHFWRUXO
S YGHSXQDGUHVDGHvQFHSXWDPDVLYXOXLYvQYDULDELODS
IRU L LQL
^
SULQWI ?Q&RQWLQXWXOOXL YG GL YL 
SULQWI ?Q$GUHVDOXL9>G@HVWHSLYL 
`
IRU L LQL
^

SULQWI ?Q&RQWLQXWXOOXL SG GL YL 


SULQWI ?Q$GUHVDOXLSGHVWHSLSL 
`
JHWFK 
`
 VIkULW]RQDSURJUDPSULQFLSDO 
QHDYkQGIXQF LLSURSULLQXDPDLFLQLPLF
,HLUHD DFHVWXLSURJUDPvQFD]XOH[HFX LHL SHQWUX XQ YHFWRU GH WUHL HOHPHQWH DUDW FD
mai jos:
GDWLGLPHQVLXQHD1 
9>@ 
9>@ 
9>@ 
&RQWLQXWXOOXL Y 
$GUHVDOXL9>@HVWH&()'
&RQWLQXWXOOXL Y 
$GUHVDOXL9>@HVWH&()'
&RQWLQXWXOOXL Y 
$GUHVDOXL9>@HVWH&()'
&RQWLQXWXOOXL S 
$GUHVDOXLSHVWH&()'
&RQWLQXWXOOXL S 
$GUHVDOXLSHVWH&()'
&RQWLQXWXOOXL S 
$GUHVDOXLSHVWH&()'
2SHUD LLDULWPHWLFHFXpointeri
2SHUD LLOHDULWPHWLFHSHUPLVHVXQW
-

adunarea unui pointer cu un ntreg


VFGHUHDXQXLvQWUHJGLQWU-un pointer
VFGHUHDDGRLpointeri
compararea unui SRLQWHUFXFRQVWDQW18// YDORDUHDvQWUHDJD
compararea a doi pointeri.

6LQJXUDRSHUD LHDULWPHWLFSHUPLVDVXSUDSRLQWHULORUFWUHIXQF LLHVWHFRPSDUDUHDFX


constanta NULL.

Adunarea unui pointer cu un ntreg are ca rezultat un SRLQWHUGHDFHODLWLSQFD]XO


n care SRLQWHUXODUHFDYDORDUHDGUHVDXQXLHOHPHQWGHWDEORXUH]XOWDWXODGXQULLHVWHDGUHVD
HOHPHQWXOXL DO FUXLLQGLFH HVWH HJDO FXVXPDGLQWUH LQGLFHOH HOHPHQWXOXL FWUH FDUH LQGLF
pointerul, plus valoarea ntregului.
'LQ PRWLYH OHJDWH GH PRGXO GH JHQHUDUH D DGUHVHORU IL]LFH GH FWUH SURFHVRU
UH]XOWDWXOQXHVWHYDOLGGHFkWGDFLQGLFHOHUH]XOWDWGLQFDOFXOHVWHPDLPDUHVDXHJDOFX]HUR
LPDLPLFVDXHJDOFXQXPUXOGHHOHPHQWHGLQWDEORX
6FGHUHD unui ntreg dintr-un SRLQWHU 6H IDFH FD L FXP V-ar aduna la pointer
YDORDUHDvQWUHDJUHVSHFWLYFXVHPQVFKLPEDW
6FGHUHD a doi pointeri. Cei doi SRLQWHULWUHEXLH VLQGLFH FWUH GRX HOHPHQWH GLQ
DFHODLWDEORXUH]XOWDWXOHVWHXQvQWUHJHJDOFXGLIHUHQ DLQGLFLORUFHORUGRXDHOHPHQWH
Compararea a doi pointeri. Cei doi SRLQWHULWUHEXLH VLQGLFH FWUH GRXD HOHPHQWH
GLQDFHODLWDEORXUH]XOWDWXOFRPSDUD LHLHVWHHJDOFXUH]XOWDWXOFRPSDUD LHLLQGLFLORUFHORU
doua elemente de tablou.
9DORULOH DSDU LQkQGXQXL WLS SRLQWHU SRW IL FRQYHUWLWH FWUH 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
FWUHFRPSLODWRDUHLQIXQF LHGHPRGXULOHGHDGUHVDUHXWLOL]DWH
SHQWUXDFFHVXOODGDWHVDXGHPRGXOGHUHDOL]DUHDDSHOXULORUGHIXQF LL
'DFSURJUDPDWRUXOFXQRDWHFRPSOH[LWDWHDaplicatiei si volumul de date manipulat, el
poate impune o anumita modalitate de generare a codului, astfel incit el sa fie optim.
$DDDSUXWQR LXQHDGHPRGHOGHPHPRULHVSHFLILFPDMRULWDULLFRPSLODWRDUHORUGHSHR
PDLQFRPSDWLELO,%0-PC.
Pentru manipularea datelor se folosesc, adesea, SRLQWHUL Q IXQF LH GH PRGXULOH GH
adresare utilizate, ei pot avea atributele:
- near pointerSHEL LUHSUH]HQWkQGGHIDSWXQoffset in interiorul unui segment;
- far pointerSHEL LUHSUH]HQWkQGRFRPELQD LHVHJPHQWRIIVHW DGLFRDGUHVUHDO
FRPSOHW XQpointer "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 IU VFKLPEDUHD H[SOLFLW D VHJPHQWXOXL
$FHDVW FDUDFWHULVWLF HVWH GDW GH RSHUD LD GH QRUPDOL]DUH OD FDUH VXQW VXSXL pointerii
"KXJHvQRULFHRSHUD LLGHFDOFXO
2EVHUYD LH QFOFDUHD UHJXOLORU GH PDL VXV QX HVWH VHPQDODW vQWRWGHDXQD SURPSW GH
compilator. Rezultatele pot fi incerte. Modelele de memorie, utilizate de Turbo C, sunt:
7,1<60$//0(',80&203$&7/$5*(L+8*('LIHUHQ LHUHDORUHVWHGDW
GHPRGXOGHXWLOL]DUHD]RQHORUGHFRGGDWHVLVWLYDSUHFXPLGHDWULEXWHOHLPSOLFLWHDOH
SRLQWHULORUXWLOL]D LvQPRGHOXOUHVSHFWLY9RPIDFHGLVWLQF LHvQWUH]RQHOHGHGDWHVWDWLFHL
zonele de date alocate dinamic (KHDS &DUHJXOLJHQHUDOHSHQWUXDORFDUHDGDWHORUVH LQH
FRQWGHXUPWRDUHOH

GDWHOHVWDWLFHVHDORFvQVHJPHQWXOGHGDWH '6 LVXQWOLPLWDWHODFHOPXOWkB;


GDWHOHDORFDWHGLQDPLFVHSODVHD]ILHvQVHJPHQWXOGHGDWH ODPRGHOHOH7,1<60$//
MEDIUM), fie in "heap" (la modelele COMPACT, LARGE, HUGE);
GDWHOHDXWRVHDORFvQVHJPHQWXOGHVWLY 66 LVXQWOLPLWDWHODFHOPXOWkB.
$ORFDUHGLQDPLF
11.2.1. Introducere
3kQ DFXP VD GLVFXWDW GHVSUH FHHD FH VH QXPHWH DORFDUH VWDWLF  $FHVW WHUPHQ VH
UHIHU OD IDSWXO F R GDW DORFDW R YDULDELO vQ SURJUDP PHPRULD FRUHVSXQ]WRDUH HL
numai poate fi UHIRORVLW GDF OD XQ PRPHQW GDW QX DU IL QHYRLH GH HD SH SDUFXUVXO
H[HFX LHLSURJUDPXOXL'HRDUHFHIRDUWHPXOWHRULPHPRULD5$0HUDH[WUHPGHVFXPS
LDUQHFHVLW LOHGHPHPRULHIRDUWHPDULVDvQFHUFDWUH]ROYDUHDDFHVWXLFRQIOLFW
3ULPD PHWRG HUD FD DWXQFL FkQG QX DMXQJHD PHPRULD 5$0 VH IRORVHD R XQLWDWH
H[WHUQ GH VWRFDUH FX SRVLELOLW L GH VFULHUH  VDX  FLWLUH $FHDVW PHWRG HVWH L DFXP
IRORVLW6LQJXUXOGH]DYDQWDMDODFHVWHLPHWRGHHVWHIDSWXOFRSHUD LLOHFXGLVFXOVXQWPXOW
mai lente dect cu memoria RAM.
De aceea s-a pus problema folosirii ct mai optime a acestei memorii. n acest scop
SURLHFWDQ LL XQXL VLVWHP GH RSHUDUH DX SUHY]XW vQ FDGUXO DFHVWHL IXQF LL VSHFLILFH GH
gestionare a memoriei.
3ULQWUHIDFLOLW LOHGHED]DOHDFHVWRUIXQF LLVXQW
-

alocare de memorie;
dealocare de memorie;
YHULILFDUHDVSD LXOXLGHPHPRULHUPDVnealocat .

Alocarea memoriei 3ULQ WHUPHQXO GH DORFDUH VH vQ HOHJH UH]HUYDUHD XQHL ]RQH GH
PHPRULHGHRDQXPLWGLPHQVLXQHDFHDVW]RQGHPHPRULHGLVSDUHSUDFWLFGLQ]RQD
GH PHPRULH vQ FDUH VLVWHPXO FLWHWH  VDX VFULH IU UHVWULF LL /D DORFDUH VH UHWXUQHD]
adresa de nceput a acestei zone.
Dezalocarea memoriei. Prin termenul de GH]DORFDUH VH vQ HOHJH IHQRPHQXO LQYHUV
DORFULL6HWULPLWHFWUHVLVWHPDGUHVDGHvQFHSXWDXQXLEORFDORFDW UH]HUYDW LLVHFHUH
HOLEHUDUHD OXL DGLF UHLQWHJUDUHD vQ VSD LXO GH PHPRULH FH SRDWH IL DFFHVDW GH RULFH DOW
program.
9HULILFDUHDVSD LXOXLGHPHPRULHnealocat'XSXQQXPURDUHFDUHGHDORFULIUD
PDL IDFH L GH]DORFUL VSD LXO UPDV OLEHU WLQGH FWUH ]HUR )XQF LLOH GH DORFDUH vQ
PRPHQWXO vQ FDUH OL VH FHUH V DORFH R DQXPLW ]RQ  QRFWH L  L QX PDL DX VXILFLHQW
VSD LX OLEHU UHWXUQHD] 18//  SHQWUX D VHPQDOL]D DFHDVW LPSRVLELOLWDWH 7RWXL DFHDVWD
UHSUH]LQWRVLWXD LHFULWLFLQXVHPDLSRDWHIDFHPDUHOXFUX'HDFHHD FDWHKQLFGH
SURJUDPDUH VH SRDWH IDFH GLQ FkQG vQ FkQG vQ SXQFWHOH FKHLH YHULILFDUHD VSD LXOXL GH
PHPRULHUPDVOLEHUSHQWUXDFDOFXODDXWRPDWGDFSURJUDPXOSRDWHFRQWLQXDVDXQX

(URDUHGHJkQGLUHDvQFHSWRUXOXLUHODWLYODRSHUDWRUXOsizeof
$FHVW RSHUDWRU WLH V vQWRDUF QXPUXO GH RFWH L SH FDUH HVWH VWRFDW XQ WLS GH GDW
DEFINITILHLPSOLFLW WLSXULOHGHGDWLPSOLFLWHchar , int , long, double) fie cele definite
de utilizator (structurile).
Dar, NU POATEFDOFXODGLPHQVLXQHDXQHL]RQHGHVSUHFDUHQXDUHLQIRUPD LLFODUHvQ
PRPHQWXOFRPSLOULL
Exemplu clasic :
char S[10];
.......
gets(S);
n=sizeof(S) // eroare
// S poate avea fie 255 caractere (caz  vQ FDUH VH SVWUHD] sigur numai
// primele 10, fie nici un caracter
// deci nu poate fi aplicat.
'HDFHHDVDLQWURGXVIXQF LDstrlen(S) n acest caz.
O versiune de strlen(S) ar fi
nr_cars=0;
while ( *S[i++]!=\0) nr_cars++;
return nr_cars;
0DLMRVSUH]HQWPRDOWFODVLILFDUHDWLSXULORUGHGDWH

$ORFDUHDGLQDPLF
2ULFHWLSGHGDWpredefinit sau definit de utilizator poate fi alocat static
VDX GLQDPLF )XQF LD GH ED] vQ OLPEDMXO & IRORVLW SHQWUX DORFDUHD GLQDPLF DUH
XUPWRUXOSURWRWLS

YRLG PDOORF VL]HBWVL]H 


YRLGIDU IDUPDOORF XQVLJQHGORQJQE\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 LLOHUHWXUQHD]SRLQWHU18//GDFQXPDL H[LVWVXILFLHQWPHPRULH
pentru alocare.
YRLG FDOORF VL]HBWQHOHPVL]HBWHOVL]H 
YRLGIDU IDUFDOORF XQVLJQHGORQJQXQLWVXQVLJQHGORQJXQLWV] 
$ORFDUHDGLQDPLFDXQXLEORFGHPHPRULHSHQWUXXQQXPUGDWGHHOHPHQWH nelem,
QXQLWV   GH  GLPHQVLXQH  FXQRVFXW  elsize, XQLWV]  'LPHQVLXQHD WRWDO DORFDW HVWH
produsul 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 UPDVH GLVSRQLELOH   )XQF LLOH  returneaza SRLQWHU 18// GDF QX PDL H[LVW
VXILFLHQWPHPRULHSHQWUXDORFDUH
YRLG UHDOORF YRLG EORFNVL]HBWVL]H 
YRLGIDU IDUUHDOORF YRLGIDU ROGEORFNXQVLJQHGORQJQE\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 LLOH
UHWXUQHD]18//(VWHSRVLELOFDQRXOSRLQWHUUH]XOWDWVILHGLIHULWGHSRLQWHUXOLQL LDO
YRLGIUHH YRLG EORFN 
YRLGIDUIUHH YRLGIDU EORFN 
(OLEHUHD]XQEORFGHPHPRULHGHMDDORFDWPointerul EORFNWUHEXLHVILIRVWRE LQXW
FX R IXQF LH GH DORFDUH DSHODW  DQWHULRU malloc" ("farmalloc"), "calloc" ("farcalloc").
QFHUFDUHDGHDDSHODXQDGLQIXQF LLOHGHPDLVXVFXXQSRLQWHURE LQXWSHDOWHFLSRDWH
duce la rezultate imprevizibile.
Q SURJUDPHOH FH XWLOL]HD] DORFDUH GLQDPLF VH UHFRPDQG FD RULFH ]RQ DVWIHO
REWLQXWVILHHOLEHUDWGXSXWLOL]DUH
2EV&RPSLODWRUXOQXVHVL]HD]HURULGHWLSXOFHORUPHQ LRQDWHPDLVXVGHSDQDUHDHVWHGH
DVHPHQHDGLILFLO
XQVLJQHGFRUHOHIW YRLG 
XQVLJQHGORQJIDUFRUHOHIW YRLG 
(YDOXHD]GLVSRQLELOXOGHPHPRULHSRVLELOGHDILIRORVLWvQDORFDUHDGLQDPLF)XQF LD
"coreleft" UHWXUQHD] PHPRULD  OLEHU  GLQ VHJPHQWXO GH GDWH LDU farcoreleft" memoria
OLEHUGLQheap".

)XQF LLOH GH DORFDUH SULPHVF QXPUXO H[DFW GH RFWH L FH VH GRUHVF D IL DORFD L L
UHWXUQHD]DGUHVDGHvQFHSXWDUHVSHFWLYHL]RQH'LQPRWLYHGHportabilitate a programului
QXHVWHLQGLFDWVVHFDOFXOH]HGLPHQVLXQHD]RQHLGHDORFDWFXIRUPXOD
1UBHOHPHQWH QUBRFWH LBRFXSDWBGHBUHVSHFWLYXOBWLSBGDW
LDFHVWOXFUXGHRDUHFHIXQF LHGHDUKLWHFWXUDVLVWHPXOXLGHFDOFXOQXPUXOGHRFWH LSH
FDUHHVWHUHSUH]HQWDWDFHODLWLSGHGDWHSRDWHGLIHULW'HFLSURJUDPXODUWUHEXLPRGLILFDW
n cazul UHFRPSLOULLVXEDOWSODWIRUP
Portabilitatea unui program
6H UHIHU OD PRGXO GH VFULHUH D XQXL FRG VXUV DVWIHO vQFkW OD recompilarea sau la
H[HFX LDOXLVXEGLIHULWHSODWIRUPHKDUGZDUHVDXVRIWZDUHPRGLILFULOHFHWUHEXLHIFXWH
SHQWUXDOIDFHIXQF LRQDOVILHPLQLPHVDXLQH[LVWHQWH
Pentru a asigura SRUWDELOLWDWHDGLQSXQFWGHYHGHUHDODORFULLGLQDPLFHVHYDIRORVL
XQ RSHUDWRU VSHFLDO DO OLPEDMXOXL & L DQXPH sizeof(WLSBGDW  1XPHOH VH WUDGXFH SULQ
PULPHDOXL(OUHWXUQHD]QXPUXOGHRFWH LSHFDUHHVWHUHSUH]HQWDWUHVSHFWLYXOWLSGH
GDWQDFHVWHFRQGL LLUH]XOWFODUF]RQDGHPHPRULHFHVHGRUHWHDILDORFDWWUHEXLH
FDOFXODWFXXUPWRDUHDIRUPXO
1UBRFWH LBGHBDORFDW nr_elemente*VL]HRI WLSBGDW
$FHVWRSHUDWRUWLHVIDFFDOFXOXOQXPUXOXLGHRFWH LRFXSD LLvQFD]XOXQXLWLSGHGDW
definit de utilizator.
$ORFDUHDGLQDPLFDWDEORXULORUGHGDWH
'XSFXPWLPvQFD]XOWLSXULORUGHGDWHDORFDWHVWDWLFVHSRWGHILQLWDEORXULFDUHV
DLESkQODWUHLGLPHQVLXQL([LVWvQUHVSHFWLYXOFD]ROLPLWDUHD]RQHLGHPHPRULHFDUH
SRDWHILDVWIHODORFDWLDQXPHvQWUHNRL0RIXQF LHGHPRGHOXOGHPHPRULHDOHV
SHQWUXFRPSLODUH'DFvQFD]XOGHFODUULLVWDWLFHFRPSLODWRUXOVHRFXSGHWRWSURFHVXO
vQFD]XODORFULLGLQDPLFHDFHVWSURFHVGHYLQHFHYDPDLFRPSOLFDW([LVWGRXPHWRGHGH
alocare:
Metoda I
$ORFDUHD VH IDFH R VLQJXU GDW SHQWUX WRDWH HOHPHQWHOH L HVWH R VLQJXU
LQVWUXF LXQH0HWRGDDUHSHQWUXWDEORXULOHDFURUGLPHQVLXQLVXQW! GH]DYDQWDMXOF
accesul la un element se poate face numai prin intermediul unui SRLQWHU L WUHEXLH V
IRORVHVFRIRUPXOGHFDOFXODDGUHVHLHOHPHQWXOXL$FHDVWIRUPXOWUHEXLHV LQFRQW
GHDGUHVDGHvQFHSXWDPDVLYXOXLGHLQGLFLLHOHPHQWXOXLLGHQXPUXOGHRFWH LSHFDUH
HVWH UHSUH]HQWDW $D VH OXFUD OD QLYHOXO OLPEDMXOXL GH DVDPEODUH XQGH QX DYHDP DOWH
SRVLELOLW L
)RUPXODGHHFKLYDOHQ ar[i] *(av+i).

Vom prezenta un scurt exemplu de folosire a primei metode n cazul unui tablou
monodimensional de caractere.
#include <string.h>
#include <stdio.h>
YRLGPDLQ YRLG
^
FKDUVWUJ>@ WKHUHRQHWZR
LQW SWOLVW>@LQGH[
VWUFS\ VWUJ$FHVWDHXQVLUGHFDUDFWHUH 
RQH VWUJ>@ RQHLWZRVXQWLGHQWLFLFDYDORDUH 
WZR  VWUJ
SULQWI RQHWZR FF?QRQHWZR 
RQH VWUJ>@ RQHLWZRVXQWLGHQWLFL 
WZR  VWUJ 
SULQWI RQHWZR FF?QRQHWZR 
WKHUH VWUJ VWUJHVWHLGHQWLFFXVWUJ>@ 
SULQWI VWUJ>@ F?QVWUJ>@ 
SULQWI WKHUH F?Q WKHUH 
IRU LQGH[ LQGH[LQGH[
OLVW>LQGH[@ LQGH[
SW OLVW
SULQWI OLVW>@ G?QOLVW>@ 
SULQWI  SW G?Q SW 
JHWFK 
`
Metoda II
3RUQHWH GH OD REVHUYD LD F FRPSLODWRUXO IDFH DXWRPDW FDOFXOXO DGUHVHL
HOHPHQWXOXL vQ LUXO GH HOHPHQWH vQ FD]XO GHFODUULL VWDWLFH 6H SRDWH IRORVL L vQ FD]XO
DORFULL GLQDPLFH DFHDVW IDFLOLWDWH D FRPSLODWRUXOXL FX FRQGL LD FD PRGXO vQ FDUH VH
UHDOL]HD] DORFDUHD  V UHVSHFWH PRGDOLWDWHD LQWHUQ IRORVLW GH FRPSLODWRU vQ FD]XO
DORFULLVWDWLFH$FHVWOXFUXSHUPLWHFDGHLVHYDDORFDGLQDPLFXQWDEORXXOWHULRUvQFRG
DFFHVXO OD RULFDUH HOHPHQW V SRDW IL UHDOL]DW IRORVLQG PHWRGD LQGLFHDO WLSLF FD]XOXL
DORFULLVWDWLFH
11.2.3.1. Alocarea tablourilor monodimensionale
n acest caz alocarea se face conform formulei de mai jos:

Nume_tablou=(tip_elem_tablou)malloc(nr_elem_tab *sizeof(tip_el_tablou))
Un exemplu de aplicare n program a acestei formule
YRLGPDLQ YRLG
^
LQWY 

Y LQW )PDOORF  VL]HRI LQW 

`
6HREVHUYFYDORULLreturnate de PDOORFvLDSOLFPXQRSHUDWRUGHFDVWQPRG
QRUPDOFRQYHUVLDGHWLSVHIDFHDXWRPDWWRWXLvQFD]XODORFULLHVWHLQGLFDWVILHIFXW
explicit.
9HFWRUXOYDSXWHDILIRORVLWFRQIRUPFHORUGRXPHWRGHFDPDLMRV
1. *(v+4*sizeof(int))=0x32;
2. v[4]=0x32;
8Q FD] VSHFLDO HVWH FD]XO DORFULL GLQDPLFH DO XQXL WDEORX monodimesional de
FDUDFWHUH 2ULFH LU GH FDUDFWHUH HVWH SUHY]XW FX XQ WHUPLQDWRU VSHFLDO ? $FHDVWD
SURYLQH GLQ OLPEDM GH DVDPEODUH DYkQG vQ YHGHUH IDSWXO F IXQF LLOH '26 GH OXFUX FX
LUXULOHGHFDUDFWHUHVXQWJkQGLWHVSULPHDVFDGUHVDGHvQFHSXWGLQ]RQDGHPHPRULHL
V 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 GH
UHVSHFWLYHOHIXQF LL
11.2.3.2. Alocarea tablourilor bidimensionale
Formula de HFKLYDOHQ ar[m][n] *(ar[m]+n) *(*(ar+m)+n)
DaFDUHVWHGHvQWUHJLint 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 FVHREVHUYFFDOFXOHOHGHGHSODVDPHQW LQkQGFRQWGH
GHVSD LXORFXSDWGHXQHOHPHQWGLQWDEORXDXIRVWIFXWHH[SOLFLW
QDFHVWFD]DORFDUHDHVWHPDLFRPSOLFDWvQVXOWHULRUH[LVWDYDQWDMXOGHDVHSXWHD
OXFUDLSULQVSHFLILFDUHDSR]L LHLHOHPHQWXOXL

LQWIDU WBDOORF LQWOLQLQWFRO


^
LQWL
UHJLVWHULQWIDU SOLQ SGDWD
SGDWD LQWIDU IDUFDOORF OLQ FROVL]HRI LQWIDU 
LI SGDWD LQWIDU 18// HUU 1XH[LVWDVSDWLX 
SOLQ LQWIDU IDUFDOORF OLQVL]HRI LQWIDU 
LI SOLQ LQWIDU 18// HUU 1XH[LVWDVSDWLX 
IRU L LOLQL
^
SOLQ>L@ SGDWD
SGDWD FRO
`
UHWXUQSOLQ
`
 
YRLGWBIUHH LQWIDU SD
^
IDUIUHH SD 
IDUIUHH SD 
`
([HPSOXO GH PDL VXV QH SHUPLWH V SRW DFFHVD vQ SURJUDP XQ HOHPHQW GLQ WDEORX vQ
maniera m[i][j] ceea face codul mai clar.
11.2.3.3. Tablouri tridimensionale
6H WUDWHD] GXS DFHHDL JkQGLUH FD L FHOH ELGLPHQVLRQDOH PDL MRV YRP SUH]HQWD XQ
exemplu 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] )

11.3. Pointeri la structuri


$YkQG vQ YHGHUH GHILQL LD SRLQWHUXOXL QX H[LVW QLPLF FDUH V vPSLHGLFH GHFODUDUHD
unor SRLQWHUL OD R VWUXFWXU  Q DFHVWH FRQGL LL WLSXO GH GDWH JUXS L VWXGHQW SUH]HQWDWH
anterior se vor rescrie ca mai jos.
W\SHGHIVWUXFW6WXGHQW
^
FKDU QDPH
XQVLJQHGVKRUWLQWDJH
XQVLJQHGFKDUQBODE
XQVLJQHGFKDUQBH[
`VWXG
W\SHGHIVWUXFW*UXSD
^
LQWQXPH
LQWDQ
VWXG W
`JU
JU S,*S
11.3.1. Accesarea membrilor
'HDFHDVWGDWVHYDIRORVLvQORFGHSXQFWUHVWXOUHJXOLORUGHDFFHVDUHUPkQkQG
identice. Acest nou operator de acces a fost introdus doar pentru a scrie cod ct mai clar
GHRDUHFHGDFDYHPVWXG S; atunci SQXPH este perfect echivalent cu S QXPH din
punct de vedere sintactic.
11.3.2. Alocarea structurilor de date
7UHEXLHDYXWJULMFDWRWVSD LXGHFDUHHVWHQHYRLHVILHDORFDW([LVWGRXQLYHOHGH
DORFDUHSULPXOVHUHIHUODDORFDUHDGHVSD LXSHQWUXQRXOWLSGHGDWDOGRLOHDQLYHOVH
UHIHUODDORFDUHDGHVSD LXXQGHHVWHFD]XOSHQWUXPHPEULLQRXOXLWLSGHGDW
Alocarea la primul nivel:
*U S
S JU PDOORF  VL]HRI JU 
1LYHOXOGRLGHDORFDUHHVWHFODUGHDELDvQID]DGHLQL LDOL]DUHDXQHLVWUXFWXUL
,QL LDOL]DUHLGLVWUXJHUHVWUXFWXUL
'DF DORFDUHD GLQDPLF SHQWUX WLSXULOH GH GDWH SUHGHILQLWH H UHODWLY VLPSO vQ
PDMRULWDWHD FD]XULORU vQ FD]XO VWUXFWXULORU GH GDWH WUHEXLH FD SURJUDPDWRUXO VL
FRQVWUXLDVFSURSULLOHIXQF LLGHLQL LDOL]DUHHOLEHUDUHDGDWHORU

6HYRUSUH]HQWDIXQF LLOHGHLQL LDOL]DUHSHQWUXXQRELHFWGHWLSJUXSD6HREVHUY


FXQRELHFWGHWLSJUXSDFRQ LQHXQWDEORXGHRELHFWHGHWLSVWXGHQWLGHFLWUHEXLHvQWkL
VFULVIXQF LDFDUHLQL LDOL]HD]SHDFHVWD
6WXG LQLWBVWXG FKDU QDPHXQVLJQHGVKRUWLQWDJH
XQVLJQHGFKDUQBODEQBH[
^
VWXG S
LI  S VWXG PDOORF VL]HRI VWXG HUURU 1RWHQRXJKPHPRU\ 
LI  S!QDPH FKDU PDOORF VWUOHQ QDPH VL]HRI FKDU
HUURU 1RWHQRXJKPHPRU\ 
VWUFS\ S!QDPHQDPH 
S!DJH DJH
S!QBODE QBODE
S!QBH[ QBH[
UHWXUQ S
`
YRLGIUHHBVWXG VWXG S
^
IUHH S!QDPH 
IUHH S 
`
JU LQLWBJU LQWQXPHVWXG VWFKDUQDPHLQWDJHQQ
^
JU S
LI  S JU PDOORF VL]HRI JU HUURU 1RWHQRXJKPHPRU\ 
S!QXPH QXPH
S!DQ DQ
S!VWXG VW
UHWXUQS
`
YRLGHUU FKDU V
^
FOUVFU 
SXWV V 
H[LW  
`
'XSFXPVHREVHUYFHOHGRXIXQF LLDORFFkWHXQHOHPHQW$ORFDUHDSHQWUXWDEORXO
GH VWXGHQ L DO FUXL pointer este primit n LQLWBJU QX D IRVW SUH]HQWDW SHQWUX F VH
IRORVHWHIXQF LDGHDORFDUHDXQXLVWXGHQWSHQWUXILHFDUHGLQHOHPHQWHLHOHSRWILGHSXVH
vQWUXQWDEORXDORFDWVWDWLFVDXGLQDPLFVDXvQWUROLVWvQOQ XLW

'HFODUD LLFRPSOH[HvQ&
3HVWH XQ DQXPLW QLYHO GH H[SHULHQ  H[LVW WHQGLQ D IRORVLULL XQRU GHFODUD LL
FRPSDFWH GDU FRPSOH[H L DFHDVWD FRPSLODWRUXO OH DFFHSW DFHVW OXFUX FRQGXFH OD
VFGHUHD FODULW LL FRGXOXL GH DFHHD UHFRPDQGP HYLWDUHD SH FW SRVLELO 'H H[HPSOX
XUPWRDUHDGHFODUD LHGHFODUSH[FDILLQGXQSRLQWHUODRIXQF LHFDUHvQWRDUFHXQpointer
FWUHDOFLQFLOHDHOHPHQWGLQWUXQWDEORXGHpointeri la ntregi. Complicat , NU?
int *(*(*x)()[5];
Mai IRVSUH]HQWPRPHWRGVLPSOSHQWUXHYLWDUHDDFHVWXLWLSGHFRPSOLFD LL
typedef int *AP[5] //al 5-lea element dintr-un tablou de pointeri la ntreg
W\SHGHI$3 )3 IXQF LDFHYDreturna un pointer la al 5-lea element al unui
tablou de SRLQWHULFWUHvQWUHJL
FP *x
// pointer la......
0RWLYXO SULQFLSDO SHQWUX FDUH GHFODUD LLOH GH WLSXO FHORU SUH]HQWDWH PDL VXV VXQW DD
FRPSOLFDWH vQ & HVWH GDWRUDW IDSWXOXL F RSHUDWRUXO pointer { * } este de tip prefix, iar
RSHUDWRULLGHIXQF LHLWDEORXVXQWGHWLSpostfix.
3HQWUX D GHVFLIUD GHFODUD LL FRPSOH[H WUHEXLH SULYLW GLQXQWUX vQVSUH DIDU
DGXJQG vQVWQJDL  VDX>@vQGUHDSWD
'HVFLIUDUHDGHFODUD LLORUFRPSOH[HvQ&
&HDPDLEXQVWUDWHJLHvQGHVFLIUDUHDGHFODUD LLORUFRPSOH[HHVWHVSRUQLPGHOD
QXPHOHYDULDELOHLLDSRLVDGXJP V LQHPFRQWGHHIHFWXO ILHFDUHSDUWH RSHUDWRU DL
H[SUHVLHSRUQLQGFXRSHUDWRULLFHLPDLDSURSLD LGHQXPHOHYDULDELOHL
n liSVDSDUDQWH]HORUVHYD LQH FRQW vQWL GH RSHUDWRULL GH WLS IXQF LH VDX WDEORX
GLQ GUHDSWD YDULDELOHL GHRDUHFH DX SULRULWDWH PDL PDUH L GHDELD OD VIULW VH YD LQH
cont de efectul operatorilor de tip prioritar)
De exemplu:
FKDU >@YDILGHVFLIUDWvQXUPWRULLSDL
1. x[ ] este un tablou
2. **[ ] este un tablou de pointeri
3. char *x[ ] este un tablou de SRLQWHULFWUHFDUDFWHUH
3DUDQWH]HOH SRW IL IRORVLWH ILH SHQWUX FODULWDWH ILH SHQWUX VFKLPEDUH D SUHFHGHQ HL 'H
exemplu:
LQW >@   YDILGHVFRPSXVGXSFXPXUPHD]
1. x[ ] este un tablou
2. ( **[ ] ) este un tablou de pointeri
3. ( **[ ] ) ( ) este un tablou de SRLQWHULFWUHIXQF LL
4. int ( (*x [ ] ) ( ) este un tablou de SRLQWHULFWUHIXQF LLFHUHWXUQHD]XQvQWUHJ
&RPSXQHUHDGHFODUD LLFRPSOH[H
3HQWUXDFRPSXQHGHFODUD LLFRPSOH[HSURFHVXOHVWHLGHQWLF FDODGHVFRPSXQHUH
'H H[HPSOX GDF VH GRUHWH GHFODUDUHD XQXL SRLQWHU FWUH XQ WDEORX GH SRLQWHUL FWUH
IXQF LL FDUH vQWRUF SRLQWHUL OD WDEORXUL GH VWUXFWXUL FX QXPHOH 6 VH YRU IRORVL XUPWRULL
SDL
1. ( *x) este un pointer
2. ( *x)[ ] este un pointer la un tablou

3. ( *(*x[ ])) este un pointer la un tablou de pointeri


4. ( *(*x[ ])) ( )este un pointer la un tablou de SRLQWHULODIXQF LL
5. ( *( *(*x[ ])) ( ) )este un pointer la un tablou de SRLQWHUL OD IXQF LL FH vQWRUF
pointeri
6. ( *( *(*x[ ])) ( ) ) [ ] este un pointer la un tablou de SRLQWHULODIXQF LLFHvQWRUF
pointeri catre tablouri
7. struct S ( *( *(*x[ ])) ( ) ) [ ] este un pointer la un tablou de SRLQWHULODIXQF LLFH
ntorc pointeri catre tablouri de structuri cu numele S
Q VFRSXO XXUULL vQ HOHJHULL VH YD SUH]HQWD XQ WDEORX FX diverese expresii complexe
X]XDOHvQFRGXULOH&LDQXPLWHJUHHOLFRPXQH

int i; un ntreg
int* p; pointer la ntreg
int a[ ]; tablou de ntregi
LQWI  IXQF LHFHvQWRDUFHXQvQWUHJ
int **p; pointer la SRLQWHUFWUHvQWUHJ
int ( *pa ) [ ]; pointer la tabloul de ntregi
int ( *pf ) ( ); SRLQWHUODRIXQF LHFHvQWRDUFHXQvQWUHJ
int *ap [ ]; un tablou de SRLQWHULFWUHvQWUHJL
int aa [ ] [ ] un tablou de tablou de ntregi
int DI>@  XQWDEORXGHIXQF LLFHvQWRUFvQWUHJ
NEPERMIS
int *IS  RIXQF LHFHvQWRDUFHXQpointer la ntreg
LQWID  >@RIXQF LHFHvQWRDUFHXQWDEORXGHvQWUHJL
NEPERMIS
LQWI    RIXQF LHFHvQWRDUFHRIXQF LHFHvQWRDUFHXQint
NEPERMIS
int ***p; pointer la pointer la pointer la int
int ( **ppa) [ ]; pointer la SRLQWHUFWUHXQWDEORXGHint
int ( **ppf) [ ]; pointer la SRLQWHUFWUHRIXQF LHFHvQWRDUFHint
int * ( *pap) [ ]; SRLQWHUFWUHXQWDEORXGHpointeri la ntregi
int (* paa) [ ] [ ]; pointer la un tablou de SRLQWHULFHUH LQvQWUHJL
int (* paf) [ ] ( ); SRLQWHUODXQWDEORXGHIXQF LLFHvQWRUFvQWUHJL NEPERMIS
int *( *pfp) ( ); un SRLQWHUODRIXQF LHFHvQWRDUFHvQWUHJ
int (* pfa ) ( ) [ ]; SRLQWHUODRIXQF LHFHvQWRDUFHXQWDEORXGHvQWUHJL
NEPERMIS
int IDI  >@  IXQF LHFHvQWRDUFHXQWDEORXGHIXQF LLFHvQWRUFvQWUHJL
NEPERMIS
int *IIS    IXQF LHFHvQWRDUFHRIXQF LHFHvQWRDUFHXQpointer la int
NEPERMIS
int (* pff) ( ) ( ); un SRLQWHUODRIXQF LHFHvQWRDUFHRIXQF LHFHvQWRDUFHXQvQWUHJ
NEPERMIS
int **app[ ]; un tablou de pointeri la SRSLQWHULFWUHvQWUHJL
int ( *apa[ ] ) [ ]; un tablou de SRLQWHULFWUHXQWDEORXGHvQWUHJL
int (*apf[ ] ) ( );un tablou de SRLQWHULFWUHIXQF LLFHvQWRUFvQWUHJL
int *aap[ ] [ ];un tablou de tablouri de pointeri la ntregi

int aaa[ ] [ ] [ ]; un tablou de tablouri de tablouri de ntregi


int DDI>@>@  XQWDEORXGHWDEORXULGHIXQF LLFHvQWRUFvQWUHJL
NEPERMIS
int *DIS>@  XQWDEORXGHIXQF LLFHvQWRUFpointeri la ntregi
int DID>@  >@XQWDEORXGHIXQF LLFHvQWRUFWDEORXULGHvQWUHJL
NEPERMIS
int DII>@    XQWDEORXGHIXQF LLFHvQWRUFIXQF LLFDUHvQWRUFvQWUHJL
NEPERMIS
int **ISS  RIXQF LHFHvQWRDUFHXQpointer la pointer de ntregi
int ( *ISD   >@RIXQF LHFHvQWRDUFHXQSRLQWHUFWUHWDEORXULGHvQWUHJL
int ( * ISI     IXQF LHFHvQWRDUFHXQSRLQWHUFWUHRIXF LHFHvQWRDUFHXQvQWUHJ
int IDD  >@>@IXQF LHFHvQWRDUFHXQWDEORXGHWDEORXULGHvQWUHJL
NEPERMIS
int *IDS  >@IXQF LHFHvQWRDUFHXQWDEORXGHSRLQWHULFWUHvQWUHJL
NEPERMIS

Cteva tehnici de FUHWHUHDvitezei de H[HFX LHDunui cod


Propagarea copiei (se pune la asignare)
Fie urmWRDUHDVHFYHQ GHFRG:
x=y
z=1.+x
corect este:
x=y
z=1.+y (eliminLQWHUGHSHQGHQ HOHGLQWUHFHOHGRXUHOD LL
Reducerea puterii
Ex:
y = pow (x,2) -> ia foarte mult timp
QORFXL LFXy=x*x sau j=k*2 -> ia mult timp vQFRPSDUD LHFXDGXQDUHDM=k+k sau
cu deplasarea la stQJDj=k<<2
Redenumirea variabilelor
CWHRGDW FQGVHYUHDYLWH]PD[LP HVWHPDLELQHVHYLWPrefolosirea variabilelor
x=y*z
q=r+x+z
x=a+b
A
b
x=y*z
x0=y*z
q=r+x+z
q=r+x0+x0
x=a+b
x=a+b
Compilatorul reali]HD]DXWRPDWDFHVWHOXFUXULGDUSHQWUXFDOFXOHGHILQH HHVWHELQHV
facem personal optimizarea codului. Deoarece a) PQQFWLPSGHFDOFXOLDUE PQQF
PHPRULHvQRS LXQLOHFRPSLODWRUXOXLH[LVW:
1.
optimi]DUHSHQWUXYLWH] VWLOE
2.
optimizare pentru dimensiune (stil a)

Eliminarea subexpresiilor comune


Ex.

D=C*(A+B)
E=(A+B)/2
F=sqr(A+B)

t=A+B
D=C*t
E=t/2
F=sqr(t)
Aten LHODRUGLQHDvQFDUHVHVFULXsubexpresiile deoarece pt. compilator a+b+c
poate fi diferit de %&DFKLDUFkQGVHIDFHRSWLPL]DUHDXWRPDW
----->

Eliminarea codurilor constante din bucle


for (i=0;i<u;i++)
{A[i]=B[i]+C*D;
E=G[k];
}
Se observF& 'HVWHFDOFXODWGH1RULLQXHVWHRIXQF LHGH L) . Absurd!
/DIHOL(= G[k] este un transfer de memorie realizat de n ori LQXHVWHRIXQF LHGHL
deci corect bucla este :
temp=c*d;
for(i=0;i<n;i++) A[i]=B[i]+t;
E=G[k];
6LPSOLILFDUHDSULQLQGXF LH
Ex. for (i=0;i<n;i++)
k=i*4+M
DupRVFXUWDQDOL]PDWHPDWLF WHPDFDV UH]XOWRVHFYHQ HFKLYDOHQWGDUVH
VFXWHVFQvQPXO LUL
k=m
for(i=0;i<n;i++) k=k+4;
Se IRORVHte cnd referim direct tablouri
adresa = adresa_de_baza(A)+(i-1)*sizeof(data)
adresa = adresa_de_baza(A)-sizeof(data)
adresa = adresa+sizeof(data)
dacDSOLFLHOLPLQDUHDFRQVWDQWHORUFRGXOGHYLQH
temp = sizeof(data)
adresa = adresa_de_baza(a)-temp

adresa = adresa+temp
/XFUXOFXILLHUHOHGHGDWH ,2),/( Streamuri (streams)
&QXIDFHGLVWLQF LHvQWUHGLYHUVHGLVSR]LWLYHFXPDUILWHUPLQDO=,3+''
n toate cazurile I/O este realizat prin aceste VWUHDPXULFDUHVXQWDVRFLDWHFXILLHUHVDXFX
dispozitive.
'HI: Un streamFRQVWGLQWURvQLUXLUHRUGRQDWGHRFWH L3RDWHILJQGLWFXPYD
FDXQYHFWRUQXPDLFvQDFHVWFD]QXDPDFFHVSDUDOHOFLVHULDOODILHFDUHHOHPHQW
Pentru a realiza accesarea unui stream trebuie declarat un SRLQWHUODRVWUXFWXUVWDQGDUG
QXPLW),/(GHILQLWLQstdio.h.
(DFRQ LQH
,QIRUPD LLGHVSUHQXPHOHILLHUXOXL
Modul de acces
Un SRLQWHUFWUHXUPWRUXOFDUDFWHUGLQstream
$FHVWH LQIRUPD LL VXQW QHFHVDUH VLVWHPXOXL GH RSHUDUH GLQ SXQFWXO GH YHGHUH DO
programatorului accesul se face prin intermediul unui SRLQWHU OD DFHDVW VWUXFWXU QXPLW
SRLQWHUODILLHU ILOHpointer).
Un program poate avea unul sau mai multe streamuri deschise simultan.
Unul din cmpurile din FILE este indicatorul dHSR]L LHvQILLHUFDUHVHUHIHUOD
XUPWRUXORFWHWFHYDILVFULVFLWLWvQGLQILLHU
'XS ILHFDUH RSHUD LH 5: 62 PRGLILF DXWRPDW DFHVW pointer. Accesarea se
SRDWH IDFH GLUHFW GDU DFHVW FD] SDUWLFXODU GH FDUH WUHEXLH LQXW VHDPD YD IDFH FD XQ
SURJUDPVQXPDLILHSRUWDELO
$WHQ LH: A nu se confunda SRLQWHUXO OD ILLHU FX LQGLFDWRUXO GH SR]L LH  8QXO HVWH XQ
pointer altul este un deplasament.
Streamuri standard
([LVW  streamuri care sunt deschise automat pentru fiecare program. Ele se
numesc stdin, stdout, VWGHUUQPRGQRUPDOHOHVHUHIHUODWHUPLQDOGDUPXOWHVLVWHPHGH
operare permit redirectarea lor.
([XQPHVDMGHHURDUHSRDWHILVFULVvQWUXQILLHUvQORFGHWHUPLQDOSULQWI Lscanf()
folosesc streamurile VWGLQLVWGRXW$FHVWHIXQ LLSRWILIRORVLWHSHQWUXOXFUXOFXILLHUHOH
prin redirectarea VWGLQ L VWGRXW FWUH UHVSHFWLYHOH ILLHUH IRORVLQG BBBBBB  'DU PDL
FRPRGHVWHIRORVLUHDIXQF LLORUIVFDQI Lfprintf().
)RUPDWWH[WLIRUPDWELQDU
Datele pot fi accesate Q XQXO GLQ FHOH GRX IRUPDWH VWDQGDUG $16, WH[W VDX
binar. Un VWUHDPGHWLSWH[WFRQVWGLQWURVHULHGHOLQLLXQGHILHFDUHOLQLHHVWHWHUPLQDW
FXXQFDUDFWHUGHVDOWODOLQLHQRX\n.
2ULFH 62 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
DVFXQVGHFRPSLODWRUXO&7RWXLOXFUXOvQPRGWH[WQXJDUDQWHD]RSRUWDELOLWDWHWRWDOD

XQXLSURJUDPQIRUPDWXOELQDUFRPSLODWRUXOQXUHDOL]HD]QLFLRLQWHUSUHWDUHDEL LORUvL
FLWHWHVDXVFULHH[DFWFXPDSDU
Bufferarea (folosirea unei zone de memorie ca tampon)
'HRDUHFHFRPSDUDWLYFXPHPRULDGLVSR]LWLYHOHGHVWRFDUHvQPDVVXQWH[WUHPGH
vQFHWHVHvQFHDUFUHGXFHUHDQXPUXOXLGHRSHUD LLGH ,2 FXGLVFXOBufferarea este cea
PDLVLPSOPHWRGSHQWUXDUHDOL]DDFHDVWD
Un EXIIHU HVWH R ]RQ XQGH VXQW VWRFDWH WHPSRUDU GDWHOH vQDLQWH GH D IL WULPLVH
FWUHGHVWLQD LDORUILQDO7RDWH62IRORVHVFbuffere pentru a citi/scrie din dispozitivele
,2QXPDLFvQDFHVWFD]EXIIHUXODUHGLPHQVLXQHIL['HRELFHLHVWHGHVDX
RFWH L$FHVWOXFUXvQVHDPQFFKLDUGDFVHGRUHWHFLWLUHDXQXLVLQJXUFDUDFWHUGLQWUXQ
ILLHU62FLWHWHWRWEORFXOFDUHFRQ LQHUHVSHFWLYXOFDUDFWHU
%LEOLRWHFD&FRQ LQHXQVWUDWDGL LRQDOGHbufferare care apare n 2 forme:
buffere de linie
buffere de bloc
La EXIIHUDUHDvQOLQLHVLVWHPXOVWRFKHD]FDUDFWHUHOHSQODSULPXO\n sau SQ
se umple EXIIHUXO L DSRL WULPLWH vQWUHDJD OLQLH OD 62 SHQWUX SURFHVDUH $FHVW OXFUX VH
vQWPSOLFQGFLWHVFGDWHGHODWHUPLQDO
La EXIIHUDUHD vQ EORF VLVWHPXO VWRFKHD] FDUDFWHUHOH SQ FQG DFHO EORF HVWH
umplut.
Implicit VWUHDPXULOH ,2 UHODWLY OD ILLHUH VXQW bufferate n bloc, iar cele care se
UHIHUODWHUPLQDO stdin, stdout) sunt bufferate n linie.
'HDVHPHQHDELEOLRWHFD&LQFOXGHLXQPDQDJHUGHEXIIHUFDUH LQHDFHObuffer FW
PDLPXOWSRVLELOvQPHPRULHGHFLGDFVHDFFHVHD]DFHHDLSRU LXQHGLQWUXQstream de
PDLPXOWHRULH[LVWPDULDQVHFDVVHHYLWHDFFHVXOODGLVSR]LWLYXOGHVWRFDUH
$WHQ LH$FHVWOXFUXSRDWHFUHDSUREOHPHGHFRQVLVWHQ GDFILLHUXOHVWHIRORVLW
n comun de mai multe procese. Pentru sincronizarea ntre procese este nevoie de:
scrierea n ASM a propriilor IXQF LL
IRORVLUHDIXQF LLORUVSHFLILFH62SHFDUHVHOXFUHD]
n ambele moduri de bufferare, bufferul poate fi golit la cerere cu ajutorul lui fflush()
WULPL QGDVWIHOGDWHOHGLQHOODGHVWLQD LDORU
'HL DFHVW PRG GH bufferare este mai eficient GHFW SURFHVDUHD LQGLYLGXDO D
ILHFUXL FDUDFWHU H[LVW FD]XUL vQ FDUH QH GHUDQMHD]  L DQXPH FQG VH GRUHWH H[SOLFLW
SURFHVDUHDLQVWDQWDQHHDXQXLFDUDFWHUILHODLQWUDUHILHODLHLUH&HOPDLVLPSOXH[HPSOX
este atunci FQGVHGRUHWHSURFHVDUHDFDUDFWHUHORULQWURGXVHGHOD.%'IUDPDLDWHSWD
\n.
C permite modificarea memoriei bufferului chiar la acest nivel,tocmai pentru a
SXWHDUH]ROYDLSUREOHPHOHGHDFHVWWLS
&LWLUHDLVFULHUHDGDWHORU
2GDWFHVDGHVFKLVXQILLHUVHYDIRORVLSRLQWHUXOODILLHUSHQWUXDSXWHDUHDOL]D
RSHUD LLGHVFULHUHFLWLUH([LVWQLYHOHGHJUDQXODULWDWH ILQH H 
1. la nivel de caracter
FkWHXQFDUDFWHURGDW
2. la nivel de linie
FkWHROLQLHRGDW

3. la nivel de bloc
FkWHXQEORFRGDW
2 UHJXO FDUH VH DSOLF OD WRDWH QLYHOHOH GH ,2 HVWH DFHHD F QX SRW FLWL GLQWUXQ
VWUHDPLDSRLVFULXvQHOIUDDSHODfseek() , rewind() sau IIOXVK /DIHOLvQFD]XO
LQYHUV $FHVW OXFUX HVWH QHFHVDU SHQWUX F WUHEXLH JROLW EXIIHUXO vQDLQWHD RULFUHL
RSHUD LLLSHQWUXDHYLWDSUREOHPHOHGHLQFRQVLVWHQ 
1. Lucrul la nivel de caracter
JHWF PDFURFLWHWHXQFDUDFWHU
putc() - macro , scrie un caracter

fgetc()
fputc()

de la stream-ul implicit

identice cu anterioarele lor dar sunt ILQF LL

'HLSULPHOHVXQWPDFURXULGHFLPXOWPDLUDSLGHSRWH[LVWDSUREOHPHGHex:
putc(x, fp[M@ VDUSXWHDVQXPHDUJFRUHFW
'H DFHHD HVWH LQGLFDW F DWXQFL FQG VH OXFUHD] FD vQ H[HPSOX V IRORVLP fputc() sau
fgetc();
2. La nivel de linie
)XQF LLIJHWV LISXWV LVHVSHFLILFSDUDPHWUL
s -> pointer la tabloul de caractere
n -> nr. Maxim de caractere ce vor fi procesate
stream -> VWUHDPXOFXFDUHVHOXFUHD]
3. La nivel de bloc
Un bloc poate fi JQGLWFDXQWDEORX&QGFLWLPVFULHPvQEORFWUHEXLHVVSHFLILFPDWW
QXPUXOGHHOHPHQWHDOEORFXOXLFWLGLPHQVLXQHDILHFUXLHOHPHQW
)XQF LLIUHDG LIZULWH FXXUPWRULLSDUDPHWUL
ptr -> SRLQWHUFWUHWDEORXOFHVWRFKHD]FDUDFWHUHOH
VL]H!PULPH QUGHRFWH LDOWLSXOXLGHGDWIRORVLWUHFRPDQGsizeof() pentru
portabilitatea programului
QXPUHOHPHQWHFHWUHEXLHSURFHVDW
pointer la stream
I/O Nebufferat
$QWHULRU DP PHQ LRQDW IDSWXO F H[LVW VLWXD LL vQ FDUH bufferarea datelor nu
GHUDQMHD]([HPSOXFODVLFHVWHHGLWRUXOGHWH[WFQGVHVFULHXQWH[WLVHDSDVWDVWHOH
de 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).

$FFHVXODOHDWRUvQWUXQILLHU
(VWHDVLJXUDWGHIXQF LDIVHHNFDUHSR]L LRQHD]SRLQWHUXOODILLHUODXQGHSODVDPHQWGRULW
ID GHvQFHSXWXODFHVWXLD
Ftell UHWXUQHD]YDORDUHDSRLQWHUXOXLGHILLHU

CAPITOLUL 12
)DFLOLW LGHQLYHOVF]XWDOHOLPEDMXOXL&
5XWLQHOH XWLOL]DWH GH VLVWHPXO GH RSHUDUH 06'26 SHQWUX WUDWDUHD RSHUD LLORU GH
LQWUDUHVDXLHLUHLJHVWLXQHDUHVXUVHORUVLVWHPXOXLSRWILDSHODWHLGLQWU-un program scris
intr-un limbaj GHQLYHOvQDOWFXPHVWH&/LPEDMXOSHUPLWHLOHJDUHDFXPRGXOHVFULVH
in limbaj de asamblare.
Rutinele DOS sunt apelate prin ntreruperi software. ntreruperea 21h (INT 21h) este
serviciul pentru apelul IXQF LLORU'26Pentru apelul unei IXQF LLaceste registre (nu toate)
se SUHJWHVFFXGLYHUVHvalori:
con LQHQXPUXOIXQF LHL
con LQHQXPUXOVXEIXQF LHL GDFeste cazul)

AH
AL

Celelalte registre se vQFDUFdiferit de la caz la caz. Se JHQHUHD]apoi, ntreruperea


INT 21H.
Similar cu IXQF LLOH'26VHSRWrealiza Lapeluri de IXQF LLBIOS pregWLQGregistrele
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 cteva din func LLOH  cuprinse in biblioteca C ale FURU
prototipuri se afla in fisierele dos.h, bios.h, setjmp.h, process.h.
12.1. )XQF LLpentru 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);

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 LLGHmai sus UHDOL]HD] citirea (peek, peekb) respectiv scrierea (poke,
pokeb) unui cuvnt sau caracter de la sau la adresa de memorie segment:offset.
12.2. )XQF LLpentru accesul la porturile de intrare sau LHLUH
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 cuvnt, sau caracter (inp, inportb, outp, outportb) de la, sau la portul de
intrare sau LHLUHspecificat prin variabila portid.
)XQF LLSHQWUXJHVWLXQHDLQWHUYDOHORUGHWLPS
void delay(unsigned miliseconds);
)XQF LDVXVSHQGH[HFX LDprogramului n intervalul specificat (n milisecunde).
void sleep(unsigned seconds);
)XQF ia suspendH[HFX LDprogramului curent pe durata seconds secunde.
12.4. Functii pentru controlul sistemului de ntreruperi
void disable(void);
$FHDVWIXQF LHLQYDOLGHD]ntreruperile, OVkQGYDOLG numai ntreruperea QHPDVFDELO
NMI. Este echivalentFXLQVWUXF LXQHD&/,GLQlimbajul de asamblare.
void enable(void);

$FHDVW IXQF LH YDOLGHD] ntreruperile oferind programatorului controlul flexibil al


ntreruperilor hardware. Este echivalentFXLQVWUXF LXQHD67,GLQlimbajul de asamblare.
12.5. )XQF LLpentru alocarea memoriei (prin DOS)
int allocmem(unsigned size, unsigned *segp);
)XQF LDDSHOHD]'26[pentru a aloca o zonGHmemorie OLEHUGHdimensiune
size*16 RFWH L Ea UHWXUQHD] adresa de segment a blocului alocat n ORFD LD SRLQWDW GH
segp. n caz de succes UHWXUQHD] -1. n caz contrar se VHWHD] Bdoserrno si variabila
JOREDOerrno.
int setblock(unsigned segx, unsigned newsize);
$FHVW IXQF LH PRGLILF dimensiunea DORFDW unui bloc de memorie, de la adresa de
segment segx UPkQkQGDORFD Ldoar newsize*16 RFWH Ln caz de succes IXQF LDUHWXUQHD]
-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 XUPn caz de succes IXQF ia UHWXUQHD]-1.
)XQF LDface 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 LH6HUHFRPDQGDVHevita
alterarea variabilelor _DS, _SS, _CS si _SP. n orice caz, se va XUPULcodul generat LVH
va depana cu DWHQ LHprogramul.
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 SRLQWDWGHinregs. 'XS
execu LHvalorile registrelor sunt copiate n outregs; de asemenea, Lstarea bitului Carry n
x.cflag (1=de obicei LQGLFReroare). De notat Foutregs poate pointa pe DFHHDLstructura
ca inregs. )XQF ia UHWXUQHD]valoarea din AX la terminarea ntreruperii. Reuniunea REGS
este GHILQLWastfel:

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]DFHOHDLvalori 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 LDUHDOL]HD]RDOWHUQDWLYpentru LQWHUID area cu ntreruperile software, QXPUXO
ntreruperii fiind specificat n variabila intno. Structura REGPACK este GHILQLWastfel:
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 returneazn structura pointata de segp valorile registrelor de segment.
)XQF LLSHQWUXFLWLUHDVDXPRGLILFDUHDYHFWRULORUGHvQWUHUXSHUH
void interrupt (*getvect(int interruptno))();
Fiecare procesor din familia 80x86 include un set de vectori de ntrerupere, QXPHURWD L
de la 0 la 255. Valoarea pe 4 RFWH LGLQfiecare vector este o DGUHVreprezentnd adresa
rutinei de tratarea a ntreruperii. getvect FLWHWH valoarea vectorului de ntrerupere
specificat de interruptno LUHWXUQHD]DFHDVWvaloare ca un pointer far la o UXWLQGHtratare
a ntreruperii.

void setvect(int interruptno, void interrupt (*isr)());


$FHDVWIXQF LHVHWHD]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 QRXIXQF LHtrebuie 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&Dargumente:
dosfun = QXPUXOIXQF LHL'26
dosdx = valoarea registrului DX;
dosal = valoarea registrului AL.

)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 LDIXUQL]HD]accesul la IXQF LLOH'26prin argumentele sale:
dosfun = QXPUXOIXQF LHL'26
argument = pointer cerut de IXQF LHLQregistrul DS:DX;
dosal = valoarea registrului AL.
5HWXUQHD]DFHOHDLvalori 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]DWsetndu-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>

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 LLSHQWUXWHUPLQDUHDVDXODQVDUHDSURJUDPHORU
void exec(int code);
)XQF LD GHWHUPLQ terminarea QRUPDO D programului i furnizarea unui cod de retur
(code) la LHLUH Acest cod poate fi interpretat ulterior n ILLHUHOH de comenzi. Este
HFKLYDOHQWFXIXQF ia DOS 0x4C.
void abort(void);
3URYRDFterminarea DQRUPDODprogramului, cu DILarea unui mesaj FRUHVSXQ]WRUpe
consola sistemului.
void keep(unsigned char status,unsigned size);
Apelul acestei IXQF LL permite terminarea programului curent cu transmiterea VWULL
procesului SULQWHn variabila status, precum Lsetarea lui ca program TSR (Terminate
and Stay Resident) de dimensiune size paragrafe. Restul memoriei este eliberat. )XQF ia
este VLPLODUapelului DOS 0x31.
int system(const char *cmd);
/DQVHD] &200$1'&20 L H[HFXW R FRPDQG LQWHUQ sau o comand H[WHUQ
sau un ILLHUGHcomenzi. irul de caractere, folosit ca parametru, FRQ LQHnumele complet
al comenzii Ltoate argumentele necesare H[HFX LHL

unsigned getpsp(void);
)XQF LDUHWXUQHD]VHJPHQWXOSUHIL[ 3URJUDPSegment Prefix) al programului curent.
(D UHDOL]HD] IXQFWLD DOS 0x62. Q  ORFXO DFHVWHL IXQF LL vQV VH SRDWH IRORVL  GLUHFW
valoarea variabilei globale _psp.
int bioskey(int cmd);
Pot fi executate serviciile specifice INT 16h. &X  DMXWRUXO DFHVWHL IXQF LL VH SRW FLWL
FRGXULOHGHVFDQDUHFRGXULOHH[WLQVHDOHWDVWHORUVHSRWFLWLFDUDFWHUHIUH[WUDJHUHGLQ
bufferul tastaturii, sau se poate afla starea tastelor speciale (SHIFT, CTRL, ALT):
-

FPG FLWHWHFRGXOGHVFDQDUHVLVFRDWHFDUDFWHUXOGLQEXIIHUXOWDVWDWXULLGDFQXPDL
VXQWFDUDFWHUHVHDWHDSWDSVDUHDXQHLQRLWDVWH
FPG FLWHWHFRGXOGHVFDQDUHIUDVFRDWHFDUDFWHUXOGLQEXIIHUXOWDVWDWXULLGDFQX
PDLVXQWFDUDFWHUHIXQF LDUHWXUQHD]
FPG FLWHWH%,266KLIW6WDWH VWDUHDWDVWHORUVSHFLDOH6+,)7&75/$/7 
int biosprint(int cmd, int abyte, int lpt_port);

5HXQHWH WRDWH IXQF LLOH VSHFLILFH ,17 K DFFHVXO OD SRUWXO SDUDOHO /37[[  )XQF LD
permite FLWLUHDVWULLWULPLWHUHDXQXLFDUDFWHU DE\WH VDXLQL LDOL]DUHDLPSULPDQWHL
- FPG  WULPLWH FDUDFWHUXO DE\WH OD SRUWXO SDUDOHO FX QXPUXO GDW GH OSWBSRUW  /37
1=LPT2, etc).
- FPG LQL LDOL]HD]LPSULPDQWDFRQHFWDWSHOSWBSRUWFXYDORULOHGLQDE\WH
- FPG FLWHWHVWDUHDLPSULPDQWHLFRQHFWDWHSHOSWBSRUW
int bioscom(int cmd, int abyte, int com_port);
5HXQHte toate IXQF LLOH specifice INT 14h (accesul la portul serial COMxx). )XQF LD
permite citirea VWULLtrimiterea unui caracter (abyte) pe FRPXQLFD LHcitirea unui caracter
de pe FRPXQLFD LHsau setarea unor controale Lparametri de IXQF LRQDUH
-

cmd=0 LQL LDOL]DUHD portului de FRPXQLFD LH com_port (0=COM1, 1=COM2) cu


parametrii GD LGHabyte.
cmd=1 trimite caracterul abyte pe linia de FRPXQLFD LHGDWDGHcom_port.
cmd=2 FLWHWHcaracterul UHFHS LRQDWpe linia de FRPXQLFD LHGDWGHcom_port.
cmd=3 citeste starea portului de FRPXQLFD LHcom_port.
long biostime(int cmd, long newtime);

)XQF LDpermite citirea (cmd=0), sau modificarea (cmd=1) timpului sistem, exprimat
n incrementi de 55ms, de la pornirea sistemului.

'H]YROWDUHDGHFRGvQWUXQOLPEDMPL[W &L$60
(VWH VSHFLILF PHGLXOXL GH GH]YROWDUH %RUODQG & FDUH RIHU SRVLELOLWDWHD LQVHUULL GH
FRG$60vQSURJUDPHVXUV&)LHFDUHLQVWUXF LXQH$60WUHEXLHSUHFHGDWGHFXYkQWXO
cheie DVPVDXWUHEXLHLQFOXVvQWUXQEORFGHWLS$60GHIRUPD
asm {
LQVWUXF LXQL$60
}
Acest model de dezvoltare este foarte comod, deoarece vizibilitatea obiectelor definite n
&VHH[WLQGHLDVXSUDEORFXULORU$60$VWIHOSXWHPIRORVLQXPHGHSDUDPHWULIRUPDOLDL
IXQF LLORUHWF IU D PDL VFULH FDUDFWHUXO B vQ ID D QXPHORU UHVSHFWLYH 6H HYLW DVWIHO
VHFYHQ HOHGHLQWUDUHLUHYHQLUHGLQIXQF LLFDUHVXQWUHDOL]DWHDXWRPDWGHFRPSLODWRUXO&
([LVWUHVWULF LLGHXWLOL]DUHDHWLFKHWHORU0DLSUHFLVHWLFKHWHOHWUHEXLHGHILQLWHFD
etichete C, deci n afara blocurilor ASM.
&D L OD GH]YROWDUHD SH PRGXOH VHSDUDWH SURJUDPDWRUXO WUHEXLH V JHVWLRQH]H
explicit modelele de memorie, n sesnsul definirii precise a adreselor far sau near. Pentru
DFHDVWDVHXWLOL]HD]PRGHOHOHGHPHPRULH&LVDXFXYLQWHOHFKHLHQHDULIDU
3HQWUX H[HPSOLILFDUH V GLVFXWP LPSOHPHQWDUHD XQHL IXQF LL GH FXWDUH IRORVLQG
DWkWPHWRGDFODVLFFkWLPHWRGDFXFRGGHDVDPEODUH
)XQF LDUHVSHFWLYVFULVvQ&HVWHSUH]HQWDWPDLMRV
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 JVLWvQWUHJXO\vQWDEORXO[
}
)XQF LDUHVFULVIRORVLQGOLPEDMGHDVDPEODUH
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
}

et: asm {
add si,2
cmp [si], dx
loopnz et
jnz nu
mov ax,n
sub ax,cx
dec ax
jmp m_end
}
}
nu:
asm mov ax,-1
m_end:
asm {
pop dx
pop cx
pop si
}
return _AX
}
6H REVHUY F LQGLFHOH JVLW D IRVW FDOFXODW FD GLIHUHQ  GLQWUH GLPHQVLXQHD Q D
WDEORXOXL L YDORDUHD LQFUHPHQWDW D FRQWRUXOXL &[ OD LHLUHD GLQ EXFO 5HYHQLUHD GLQ
EXFO VH IDFH IRORVLQG YDORDUHD VWRFDW vQ UHJLVWUXO $; OD FDUH DP DFFHV SULQ
preudoregistrul _AX.
0HWRGD DUH GH]DYDQWDMXO VFGHULL SRUWDELOLW LL OD recompilarea sub alte
compilatoare.

12.11 Tratarea dispozitivelor bus asincrone


6 SUHVXSXQHP F VH GH]YROWD XQ FRG SHQWUX FRQWUROXO XQXL GLVSR]LWLY KDUGZDUH XQ
driver 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
PHPRULHLSXVODGLVSR]L LHGH62 
6SUHVXSXQHPFDFHVWGLVSR]LWLYDUHUHJLVWUHILHFDUHfiecare avnd lungimea de 16
EL LODDGUHVHGHPHPRULHFUHVFWRDUH
0HWRGDFODVLFGHDFFHVDUHHVWHFDPDLMRV:
struct devregs
{
unsigned short csr // control si stare
unsigned short data // portul de date
}

#define ER 0x1
#define RDY 0x2
#define RES 0x4
// adresa absoluta a dispozitivului
#define DEVADR (( struct dev regs*)ox ffff0000
// QXPUXOGHGLVSR]LWLYHGHDFHVWWLSGLQVLVWHP
#define NDEVS 4
// RIXQF LHFHFLWHWHXQRFWHWGLQGLVSR]LWLYXOQIRORVLQGSURWRFROGHWLSbusy/wait.
$WHDSWpna cnd apare semnal de RDY (ready) sau ER(error); dacQX HVWHHURDUHL
un UHDG\ DFWLY vQVHDPQ F SRW FLWL XQ RFWHW DOWIHO YD DQXOD HURDUHD GDU YRL vQWRDUFH
0xffff.
unsigned int read_dev ( unsigned devno)
{
unsigned devregs *dvp=DEVADR + devno;
if ( devno >= NDEVS ) return (0xffff)
QXH[LVWXQDVHPHQHDGLVSR]LWLYvQORW
while (( dvp -> csr& (RDY | ER )) == 0);
// EXFODYHFWRUFDUHDWHDSWSULPDXQDGLQFRQGL LLHVWHYDOLGDW
if dvp -> csr & ER // a fot eroare
{
dvp -> csr= RES // reset
return 0xffff;
}
return (dvp-> data) & 0xffff; // nu DIRVWHURDUHLGLVSR]LWLYXOHJDWDVHPLWRFWHWXO
}

CAPITOLUL 13
13. Preprocesorul
2ULFHSURJUDP&vQID]DGHFRPSLODUHWUHFHvQWkLSULQWURSUHSURFHVDUHLDELDDSRL
VH YD JHQHUD FRGXO HFKLYDOHQW vQ DVDPEODUH 3UHSURFHVRUXO GXS FXP vL VSXQH L QXPHOH
IDFHSULPDSURFHVDUHDVXSUDVXUVHL&FRQIRUPGLUHFWLYHORULQFOXVHGLUHFWVDXLQGLUHFWSULQ
LQFOXGHUHGHELOLRWHFLGHFWUHSURJUDPDWRU
'LUHFWLYHOHSUHSURFHVRUXOXLVXQWOLQLLVXUVDOFURUSULPFDUDFWHUGLIHULWGHVSD LLOH
DOEHHVWH GLH] /LQLLOHFDUHFRQ LQGLUHFWLYHDOHSUHSURFHVRUXOXLVXQWHOLPLQDWHGLQWH[WXO
VXUVvQDLQWHFDDFHVWDVILHFLWLWGHFRPSLODWRU3UHSURFHVRUXOvQORFXLHWHRULFHVHFYHQ GH
VSD LLDOEH LQFOXVLYFRPHQWDULL FXXQVLQJXUVSD LX
'LUHFWLYDQXO
2 OLQLH FDUH FRQ LQH QXPDL FDUDFWHUXO  vQ DIDU GH HYHQWXDOHOH VSD LL DOEH  HVWH
LJQRUDWGHSUHSURFHVRU
13.2. Directivele #GHILQHLundef
GHILQHLGHQWLILFDWRU>> OLVWDBDUJXPHQWH @FRUS@
XQGHILGHQWLILFDWRU
'LUHFWLYD GHILQH GHILQHWH R PDFURLQVWUXF LXQH 'DF PDFURLQVWUXF LXQHD DUH
DUJXPHQWH 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 R
OLQLHVXUV VHSRDWHFRQWLQXDOLQLDFX? 
QID]DGHSUHSURFHVDUHDSDUL LDQXPHOXLGHPDFURvQWH[WXOVXUV HYHQWXDOXUPDWGH
R OLVW GH DUJXPHQWH DFWXDOH LQ SDUDQWH]H  HVWH vQORFXLW FX FRUSXO GH PDFUR vQ FDUH
SDUDPHWULLIRUPDOLDXIRVWvQORFXL LFXWH[WXOSDUDPHWULORUDFWXDOL
'XS VXEVWLWX LH WH[WXO RE LQXW HVWH FLWLW GLQ QRX SkQ FkQG QX PDL VXQW QHFHVDUH
VXEVWLWX LL GLUHFWLYHOHSUHSURFHVRUXOXLQXVXQWUHFXQRVFXWHvQWH[WXOSURGXVSULQH[SDQGDUHD
XQHL PDFURLQVWUXF LXQL  1XPHOH GH PDFUR QX VXQW UHFXQRVFXWH vQ LUXUL GH FDUDFWHUH VDX
FRPHQWDULL2PDFURLQVWUXF LXQHQXVHSRDWHDSHODUHFXUVLY
/DDSHOXOXQHLPDFURFXDUJXPHQWHQXPDLYLUJXOHOHGHSHSULPXOQLYHOVXQWOXDWHFD
VHSDUDWRDUH GH DUJXPHQWH QX L FHOH FDUH DSDU vQ SDUDQWH]H VDX vQWUH DSRVWURIH VDX
JKLOLPHOH 
Q FRUSXO XQXL PDFUR VH SRW IRORVL XUPWRULL RSHUDWRUL FDUH QX DF LRQHD] GHFkW vQ
ID]DGHSUHSURFHVDUH



FDUHGLVSDUHWRWDOQHUPkQvQGQLFLPFDUXQVSD LXL
  FDUH SODVDW LQ ID D XQXL DUJXPHQW IRUPDO vO vQORFXLHWH FX DUJXPHQWXO DFWXDO
3/$6$71*+,/,0(/(

'LUHFWLYDXQGHIWHUJHRPDFURGHILQL LHGLQWDEHODGHPDFURGHILQL LL

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 GH
FRPSLODUHvQORFXOGLUHFWLYHLLQFOXGHDWH[WXOXLGLQILLHUXOUHVSHFWLY7H[WXOLQVHUDWSRDWH
FRQ LQHLHOGLUHFWLYHGHSUHSURFHVDUHLQFOXVLYGLUHFWLYDLQFOXGH
'DFvQQXPHOHGHILLHUDSDUHLRFDOHGHDFFHVVHYDFXWDQXPDLDFROR$OWIHO
GDFVDIRORVLWIRUPDFXJKLOLPHOHVHFDXWvQGLUHFWRUXOFXUHQW8UPHD]GDFWRWQXVD
ORFDOL]DWILLHUXOVVHFDXWHSHUkQGvQGLUHFWRDUHOHGLQOLVWDGDWODLQVWDODUHVDXSHOLQLDGH
FRPDQGVDXvQPHGLXOLQWHJUDW
'LUHFWLYHGHFRPSLODUHFRQGL LRQDW
"#" "LIH[SUHVLHBFRQVWDQWB
[ text_1 ]
[ "#" "HOLIH[SUHVLHBFRQVWDQWB
text_2 ]...
[ "#" "else"
text_else ]
"#" "endif"
'DF H[SUHVLDBQXHVWHQXO DWXQFLVHFRPSLOHD]WH[WBDOWIHO GDF H[SUHVLDB
QXHVWHQXODWXQFLVHFRPSLOHD]WH[WBHWFDOWIHOGDFHVWHSUH]HQWGLUHFWLYDHOVHVH
FRPSLOHD]WH[WBHOVH'LUHFWLYHOHGHFRPSLODUHFRQGL LRQDWSRWILvPEULFDWH
([SUHVLDFRQGL LRQDOSRDWHFRQ LQHRSHUDWRUXOGHSUHSURFHVDUHGHILQHG$FHVWDDUH
XQDUJXPHQWXQQXPHGHPDFURHYHQWXDOvQSDUDQWH]H9DORDUHDH[SUHVLHLGHILQHG QXPH
HVWHGDFDQXPHOHHVWHGHILQLWFXGHILQHGVDXGDFQXH[LVWRPDFURFXDFHOQXPH8Q
LGHQWLILFDWRUGHILQLWFXXQFRUSGHPDFURYLGVHFRQVLGHUGHILQLW
#LIGHIQXPHHFKLYDOHQWFXif defined (nume)
#LIQGHIQXPHHFKLYDOHQWFXif !defined (nume)
13.5. Directiva #line
#line QXPUBOLQLH>nume_fisier"]
(IHFWXOGLUHFWLYHLFRQVWvQDFHHDFvQILLHUXOSURGXVGH& SUHSURFHVRUXO&RIHULW
FDXWLOLWDU VDXLQPHVDMHOHGHHURDUHHWFOLQLLOHFDUHXUPHD]GXSOLQHYRUILUHIHULWHFDL
FXPDUvQFHSHFXOLQLDQXPUXOQXPUBOLQLHLDUYHQLGLQILLHUXOQXPHBILLHU

'H RELFHL GLUHFWLYD OLQH QX DSDUH vQ SURJUDPHOH VFULVH FX PkQD FL PDL DOHV vQ
SURJUDPHOHJHQHUDWHDXWRPDW'DFQXPHOHGHILLHUOLSVHWHHOUPkQHFHOYDODELOvQDFHO
PRPHQW
QDUJXPHQWHOHGLUHFWLYHLOLQHPDFURLQVWUXF LXQLOHVXQWH[SDQGDWHFDLODGLUHFWLYD
LQFOXGH
13.6. Directiva #error
#error mesaj
(IHFWXOHLFRQVWvQJHQHUDUHDXQXLPHVDMGHHURDUHGHIRUPD
(UURUQXPHBILLHUOLQHQXPUBOLQLH(UURUGLUHFWLYHPHVDM
&RPSLODUHD XQHL GLUHFWLYH HUURU RSUHWH FRPSLODUHD 'H RELFHL DSDUH vQ ILLHUHOH DQWHW
LQFOXVHFXGLUHFWLYDLQFOXGH vQFDGUXOXQHLVHFYHQ HFRPSLODWHFRQGL LRQDW'HH[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 GH
DYHUWLVPHQW UHIHULWRU OD QHXWLOL]DUHD XQXL SDUDPHWUX IRUPDO GDU QXPDL vQ SULPD IXQF LH
FRPSLODWGXSDSDUL LDGLUHFWLYHL
#pragma exit nume_functie [prioritate]
#pragma startup nume_functie [prioritate]
,QVHUHD] IXQF LLOH FLWDWH GHILQLWH FD YRLG QXPHBIXQFWLH YRLG  SHQWUX DSHO vQDLQWH GH
PDLQ 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 OD
WHUPLQDUHDH[HFX LHL3ULRULW LOHGHODODVXQWUH]HUYDWHSHQWUXUXWLQHOHGLQELEOLRWHFLOH
7XUER 'DF SULRULWDWHD OLSVHWH VH LD  )XQF LLOH FLWDWH WUHEXLH GHFODUDWH vQDLQWHD
DSDUL LHLGLUHFWLYHL
SUDJPDLQOLQH
$QXQ  FRPSLODWRUXO F vQ SURJUDP H[LVW FRG LQOLQH vQ OLPEDM GH DVDPEODUH (VWH
HFKLYDOHQW FX RS LXQHD GH FRPSLODUH % QWkOQLUHD GLUHFWLYHL SUDJPD LQOLQH GDF
RS LXQHD%QXHVWHDFWLYDUHFDHIHFWUHODQVDUHDFRPSLOULLFXRS LXQHD%DFWLYDW
#pragma option

#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$81$,17('($3$5,,$35,08/8,$720/(;,&$/&
(QXPHBDVDPEORU
IRS LXQHBIORWDQW
LQXPUBFDUDFWHUHBVHPQLILFDWLYH
PPRGHOBPHPRULH
QGLUHFWRUBLHLUH
RQXPHBILVLHUBLHLUH
X JHQHUDUHGHOLQLX HGHVXEOLQLHUHSHQWUXJOREDOL
]QXPHBVHJPHQW
2S LXQLFDUHSRWDSDUHQXPDLGDFDSDUvQDIDUDRULFURUGHFODUD LLGHRELHFWHVDXIXQF LL
 LQVWUXF LXQL
 LQVWUXF LXQL
D FRQWUROXODOLQLHULL
II FRQWUROUDSLGDORSHUD LLORUvQYLUJXODPRELO
* RSWLPL]DUHSHQWUXYLWH]
N FRQWUROQRUPDODOVWLYHL
1 FRQWUROXOVWLYHL
2 FRQWUROXORSWLPL]ULL
S VHFYHQ GHDSHO3DVFDO
U DORFDUHUHJLVWUH
Y FRQWUROSHQWUXGHSDQDUH
\ FRQWURODVXSUDQXPHUHORUGHOLQLLvQFRGXORELHFW
2S LXQLFDUHSRWILGDWHRULXQGHVLDXHIHFWLPHGLDW
$ VHWXOGHFXYLQWHFKHLH
& FRPHQWDULLvPEULFDWH
G FRQWRSLUHDLUXULORUGXSOLFDWH
JQXPU RSULUHGXSQXPUDYHUWLVPHQWH
MQXPU RSULUHGXSQXPUHURUL
. WLSXOFKDUHVWHIUVHPQ
#pragma warn
#pragma warn +xxx
$YHUWLVPHQWHOH[[[VXQWDFWLYDWH
#pragma warn -xxx
$YHUWLVPHQWHOH[[[VXQWLQDFWLYDWH
'XSFXPDPY]XWSUHSURFHVRUXOSHUPLWHLGHFODUDUHDDQXPLWRU]RQHGHFRGDVWIHOvQFkW
HOHVDILHFRPSLODWHvQDQXPLWHFRQGL LLFXPDUIL
QXVXQWGHILQLWHDQXPLWHFRQVWDQWHVDXYDULDELOHORFDOH
FRGXOHVWHXWLOGDUSHQWUXGHSDQDUH

GRUHVFVLPSLHGLFIRORVLUHDXQRUIXQF LLGLQELEOLRWHFvQWUXFkWVXQWUHVFULVHGH
RULFLQH VXSUDvQFUFDUHDIXQF LLORU
6LQWD[DJHQHUDOD

([HPSOX
SHQWUXKHDGHUHSHUVRQDOHV]LFHPILLHUXOWHVWK
#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.

 SUH]HQWDUH D UHJXOLORU GH ED]

6FXUW

GH FDUH WUHEXLH LQXW FRQW OD SURLHFWDUHD XQHL DSSOLFD LL

6WLO GH SURJUDPDUH QHUHFRPDQGDW

6WLO UHFRPDQGDW

3XQHUHD GHFODUD LLORU FX H[WHUQ vQ ILLHUXOF

 H[WHUQ

5HIHULULOH OD IXQF LHYDULDELO


6H SXQ vQ ILLHUHOH KHDGHUK

$FFHVXO FRPXQ OD GDWH vQWUH IXQF LL UHDOL]DW SULQ

$FFHVXO FRPXQ VH IDFH SULQ WUDQVIHU GH DUJXPHQW

YDULDELOH JOREDOH

 SULQ GHFODUDUH GH WLS VWDWLF

)RORVLUHD GH GDWH JOREDOH F QG QX H FD]XO

6H UH]ROY

&UHDUHD D QXPHURDVH IXQF LL FX VFRSXUL VSHFLDOH

&UHHDUHD XQRU SULPLWLYH JHQHUDOH

 IU

8WLOL]DUHD QXPHORU GH ILLHU VDX YDULDELO

 FX FRQWH[WXO

)RORVLUHD GH QXPH FDUH VH DSURSLH GH SVHXGRFRG

OHJ WXU

)RORVLUHD FRQVWDQWH QXPHULFH

6H GHILQHVF QLWH QXPH SW DFHOH YDORUL

)RORVLUHD JRWR

)RORVLUHD VWUXFWXULORU GH FRQWURO D IOX[XULORU

6FULUHD GH FRG UHGXQGDQW

6H IRORVHVF IXQF LL vQ FD]XO vQ FDUH VH REVHUY


DFHODL OXFUX

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