Sunteți pe pagina 1din 158

slr.Obse 3400 CIUjr:'~~oniIUi , bl. 051 1 C.P.186 poca fax ' of. Post . tel 0 64.198263' CI uJ-Napoca 1 httP:~64.

438328·

_ www.gmLro

Cartea se ad care doresc sa reseaza unui cer rea limbajelor Cse inltieze in progra c larg de cititori Primele d $1 C++ . marea si utilizaeleme ~o~~~i~1 OU<3. volum t alcesle limb:j:~aliZeaZa
0

introducere

C++ cu aplicatii rei contin e programe di _ la . $1 tehnico-inqu rezolvarea probl verse In C si Sl . merest: . emelor I" - . e _ In scrierea p .' In prelucrari d s iintifice rogramelor de sistem date precum

~I
t

CLUJ-NAPOCA 2001

Reeditare

[10lliLJm&cD~[1~
@ @O
@{?{?
~ n

[;)~~1F[X1QD
fll\nt::::\r,::Ji~

UU\J~I3lf/~

R c-:Jt::::\

U ~lJijU

VOLUMUL

I Partea lOla

CUPRINS
Autor: PREFATA - '. A confruntat cu originalul Irina Mitrov L
1.1. 1.2. 1.3. IA. 1.5.
1.6. 1.6.1.

!
~ ,

7
11 23
23

INTRODUCERE NOTIUNI DE BAZA


Nurne
Cuvinte

1.6.2.
1.6.3.
1.6A. 1.7.

cheic , . . . . Tipuri de date de baza Structura unci functii . Cornentariu . '.. Constante ..... Constante intregi . Constantc flotantc

24

24 26 29
30 30
"')
_)L

Constanta caracrcr Sir de caractere . .


Caractcrc sau spatii albc (white spaces)

1.8.
1.9. 1.10. 1.1t.

1.12. 1.12.1. 1.12.2.

Variabile simple, tahlouri $i structuri Declaratiu de variabila simpla Declaratia de tablou . . . .'. Apolul si prototipul functiilor Prcproccsa rc . . Includeri de Iisicrc ell tcxtc sursa Substituiri de succcsiuni de caractere la prcproccsarc

r _' 36 37 3g
40 41 42

45 46 47

2.
Editura Albastra Director sdltura Smaranda Derve:;;teanu Coordonator serie Codruta Poenaru Coperta Liviu Derve$teanu Tiraj: 1000 exemplare Tlparit EDITURA ALBASTRA comanda 142/2001
Teate drepturile asupra acestei edi\ii sun! rezervate s.c. Casa de Edltura Albastra s.r.1.

INTRARVIESIRI
Functiile

STANDARD

50
50

2.1. 2.2.
2.3.

getch si getehe Functia Futch . . . . . . . . . Exercitii . Macrourile getchar 0i putchar

51
51

53
54

2.4. 2.5. 2.5.1. 2.5.2. 2.5.3. 2.5.4, 2.5.5. 2.5.6.

Exercirii l-unctiilc gets Exercitii ...


Functia printf Litera c Litera s Litera d Litera 0

.
~j

puts

55
56

57

60
6()

Litercle x Si X
Litera II Litera I ....

61 61 62
(l ),:;_,

m
3

2.5.7.

2.5X
2.5.9.

Litera

2.S.IO.
2.5.11.

Litcrclc c si E . l.itcrclc g ;;i (;

62

63 M

3.2.15. 3.2.16.

AJ!i opcratori ai limbajului C Fabela ell prioritatile operatorilor

. limbajului C

112 112

Litera L ....
Exercitii

2.6. 2.6.1.
2.6.2.

2.6.3. 2.(J.4.
2.6.5.

2.6.6. 2.6.7.

z.o.s.

2.6.9.

FUIlC\ia scanf . Litera c Litera s Litera d Litera () Litcrclc x sau X Litera 1I Litera r . Litera 1 . Litera L . Excrcitii

64
69

4.1.

4.

71

4.2.
4.3. 4.4.

71 73 75
75 75

vida .. Instructiunea expresie Excrcitii .


lnstructiunea Instructiunea compusa

INSTRUCTIUNI

113
114
114 115 116 117 118

Instructiunea if Excrcitii

. .

4.5.
4.6.

75 75
75

76
. .

4.7.
4.8.

3.1.
3.2.

3.

EXPRESII
Operand Opcralori

79 79
.
implicite 80 80

Functia standard exit . Exercitii . Instructiunea while . Exercitii .... Instructiunea lor . . Exercitii . Instructiunea do-while
Exercitii .

124 125
126

3.2.1.
3.2.2.

Opcratorii Excrcitii Excrcitii Operatorii


Exercitii

aritmetici

4.9. 4.10.
4.11.

Instructiunea continue Func\iiic standard sscanf si sprintf . break . Exercitii . Instructiunea switch Exercitii . Instructiunea goto . . . Programarea procedurala, functii, apelul si revcnirea din ele Exercitii . Apel prin valoare si ape! prin referinta Exercitii .
Exercitii Instructiunea .

Regula convcrsiilor ell' relarie

82
86

3.2.3. 3.2.4.
3.2.5.

. .
.

3.2.6. 3.2.7.
3.2.8.

3.2.9.
3.2.10.

3.2.11.
3.2.12. 3.2.13.

Opcratorii dc cgalitatc Operatorii logici . Exercitii . Opcratorii logici pc biti Opcratorii de atribuirc . Exercitii . Operatorii de incrernentare ~idecrcmentare Operatorul de fortare a tipului sau de convcrsic explicita (expresie cast) Exercitii . Opcratorul dimensiunc . Operatorul adresa '.
Operatorii parantcza ..

87 89 90
90

4.12.
4.13. 4.14.

127 144 147 150 151 155 156 157 159 159 162
164

91 93
95

166 168
172

4.15.

100 101

179 181

103 104 104


lOS

5.

CLASE DE MEMORIE

...

5.1. 5.3. 5.4.

5.2. 5.5.

Operatorii Exercitii
Operatorul Exercitii

couditionali .....
virgula

107 107
108 109 110 1 II

Variabile globale . Variabile locale . Alocarea parametrilor . . . . . . . . . . . . . . Utilizarea parametrilor si a variabilelor globale . Variabile registrn . Exercitii .....

197
197 199
202 202

203 204 '.

3.2.14.

6.

INITIALIZARE . . . . . . . .
Initiaiizarea variabilelor simple Exercitii . Initializarea tablourilor , . . . .

6.1.

211
211 212
213

6.2.

Exercitii

........

......
MODULARA
.

......
III ......

217

7.
8.
8.1.

PROGRAMAREA
Exercitii

225
226

PREFATA
Anii '90 sint consacrati programarii orientate spre obiecte (In engleza Object Oriented Programming sau preseurtat OOP) la fel cum anii '70 au fost numiti anii programdrii structurate. Prograrnarea orientata spre obiecte este un stil de prograrnare care permitc abordarea eficienta a aplicatiilor cornplexe. Acesta se asigura pe baza: • elaborarii de componente reutilizabile, extensibile ;;i U50r modificabile, tara a reprograma totul de la inceput; •
..

POINTERI

...

8.2.
8.3. 8.4. 8.4.1.
8.4.2.

Exercitii

Declaratia de pointer ~i'ti~ui ;oi~t~r ~ • • • • Realizarea apelului prin r~ferinta utilizind . . . parametri de tip pointer . . . . . . .
..

235
237

8.4.3.

8.4.4. 8.5. 8.6.


8.6.1. 8.6.3. 8.6.4.
8.7.

Legatu~a din;r~ ~oin~e~'i~i't~bio~l;i : ' Operatii ell pointeri . ?~eratii de .inc:ementare (>i decremel~t;r~ ~ I;oi'n;e;i1~; Anunarea ~I scaderea unui intreg dintr-un pointer. Compararea a doi pointeri . . . Diferenta a doi pointeri .......... Exercitii . ModifieatoruI const Fune~ii standa~d ~ltiliz~t~I'a~l:eiu~r~r~a'(l;n~r;l~r~I~~a~a~t~r~ . Lunglmea until sir de caractere .. . Copierea unui sir de earaetere Coneatenarea sirurilor de earac~e;e . Compararea sirurilor de caractere Exercitii . Expresie Ival~l~ . . . . . . . . . Aloearea dinami~~ a'~e~'o;i~i Exercitii . . . .

8.6.2.

8.8.

241 242 250 251 252 253 254 255 255 258 262 263 264 265 266 268 273
275

construirii

de biblioteci

de module extensibile;
cu mediul

implcmentarii simple a interacriunilor programelor prin utilizarea unor clemente standardizate.

de calcul

Pe semi, putern afirrna ca, programarea oricntata sprc obiecte pcrrnitc sa sc irnplementczc sisterne complexe ell ajutorul unor cornponente individualc, standardizatc, rcutilizabilc, extensibile ~i usor rnodificabilc. Aceasta conceptic a influentat dezvoltarea limbajelor de prograrnare. Ea s-a manifestat incepind din anii '60 cind s-a introdus couceptul de obicct in limbajul

Simula.
In principiu, un obicct arc
0

structura

de date hinc prccizata

$i totoduta sint

8.9. 8.10.
8.1 1. 8.12.

Exercitii

Util!za~ea tabl~u~iio~ cie'p~i~t~;i ia 'p;eiu~rfrri de tIP sir de caractere

de' d~t~ .

2n
282 283
286
287

cafe permit programarea orientate sprc obiccte. In cele ce urmeaza vom spline despre un limbaj de programare ca este orientat spre obiectc daca pcrrnite programarca orientate sprc obiecte. 111 anii '70, prograll1arca oricntnta sprc ohicctc s-a utilizat mai ales prin intcnncdiul lirnbajului Stnalltalk. A0<1cum s-a amintit mai SlIS, in accl dcccniu s-au pus bazcle programarii structurale care a avut un succes dcosebit prin utilizarca limbnjului Pascal. In anul 1972 a uparut liinbajul C. Acestn cstc lin limbnj de progrumare care are 0 destinarie universala, Autorii acestui limbaj sint Dennis M. Ritchie si Brian W. Kernighan de In Bell Laboratories. l.imbajul (' a lils! pruitTta! III idee;1 tiL- a asigllr;1 impkillciltarc:t pnrtahila a sisternului de opcrarc UNIX. Un rczultat direct III acesrui Iapt estc acela ca programele scrise in limbajul C au 0 portubilitatc foarte buna. ln mod intuiiiv, spuncm cii lin program estc portabil dacfl el ponte fj trnnsfcrat usor de la uu lip de culcularorla altul. 111 principiu. toatc limbajclc tk' nivcl innlt asigura 0 anurnita portabilitate a prograrnelor. La ora actuala se afirrna cit programcle scrisc in C sint cclc mai porrabile. Prill unii 'gO intcrcsul pcntru prugramarcu nrien!a!;l sprc obicctc a CfCSClIi, ceca ce a condus la aparitia de lirnbajc care SCI permita utilizarca ei in scricrea programclor. l.irnbajul C a IDS! ~i c! dczvoltat in accasta directie. Astfel, in anul 1

definite operatiile care pot utiliza cornponcntele lui. Simula sc considers ell se alb In baza lirnbajclor

..

. .....

Tratar.~~ para~etriio'r ~li~iil~il;(ie'c~l~a~1da' Exercin] . Pointeri spre funetii


Exercitii . .

289
291

TabIouri de pointer]
Exercitii

294 298 .
III '" .. "

9.

RECURSIVITA TE
Exercip]

. . .. .

3(H 304

1980 s-a dat publicitatii limbo/HI C++. Limbajul C++ a fost claborat de Bjarnc Stroustrup de la AT&T. El estc un superset al limbujului C si pcrrnitc utilizarea principalclor conccptc ale programarii orientate sprc obicctc.
l.uubnju! Pascal it lost ~i d du.vollal III aCl'asla dirccjic. La ora actuala, majoritatca limbajclor de programarc modernc au fost dczvoltatc in dircctia programarii orientate sprc obicctc. In prezent, anii '80 sint considerati ca fiind dccada care a lansat programarca orientata spre obiccte, Lirnbajul C++, ca ;;i limbajul C, sc bucura de 0 portabilitatc marc ~i este implcmcntat pc 0 gama largu de calculatoarc incepind cu microcalculatoare ~i pint! la celc mai mari supcrcalculatoarc. lntrc difcritclc implcmcutari ale limbajului C++ cxista dilcrcntc legate de spccificul calculatourclor. dar accste difcrcntc IlU siut cscntialc. . Limbajul C++ a fost implementat pe microcalculatoarele PC in rnai multc variantc, Celc rnai importantc implcmentari pe accstc calculatoarc sint celc rcalizatc de firmclc Microsoft firrne au implementat limbajul C++ pe microcalculatoarele multe vcrsiuni, cornpatibile IBM ale limbajului C++ si Borland. Accstc rcspective in mai

Detlefs D., Herlihy M. si Wing J. Accst limbaj calcul distribuit,

este destinat pentru a suporta

Printre altele, aceste ultime doua cxtensii admit si ele obiecte persistcnte. In prezent, conceptele prograrnarii orientate spre obiecte au aplicatii importuntc nu IIUIllHi in ce privcstc dczvoltarea limbajclor de programarc, ei ~i la
implcmcntarca altor sistcmc complcxc, Celc mai mari realizari obtinute pina in momentul de fata sint legate de implementarea sistemelor de gestiune a bazelor de date si a interfetelor

utilizator.
Limbajul E a fost utilizat, de catre autorii lui, la implementarea proiectului EXODUS care este un sistem de gestiune a unci baze de date "extensibile''. In prezent exista numeroase proiecte de acest rei implementate cu ajutorul conceptelor programarii orientate spre obiccte, Bazele de date respective se

numcsc baze de date orientate spre obiecte. Interfetele utilizator au atins 0 dezvoltarc marc datorita facilitatilor oferite dc cornponcutele hardware ale diferitelor tipuri de calculatoare. In principiu ell' simplifies interactiunea dintre programe si utilizatorii acestora. Astfcl, diferite
comenzi, date de intrare sau rezultate pot fi cxprimate simplu 9i natural utilizlnd diferite standarde care contin ferestre, bare de meniuri, cutii de dialoguri, butoane etc. Un dispozitiv prirnar de seleetarc utilizat foarte frecvcnt si cu mult succes estc asa numitul "soarece" (mouse). Teate accstca couduc la interfctc simple ;;i vizualc, acccsibile pcntru utilizatorii finali, Implementarea intcrfetelor estc mull simplificata prin utilizarea lirnbajelor orientate sprc obicctc. Accasta mai ales datorita posibilitatilor de a utiliza componentc standardizatc aflate in biblioteci specifice, Importanta aplicarii conceptului de reutilizare prin intennediul limbajelor orientate spre obiecte rezulta din faptul ca interfetclc utilizator adesea ocupa 40% din codul total al aplicatiei. Limbajelc utilizatc frecvent la implementarea interfetelor utilizator sint lirnbajele C++ ~i Pascal, Firma Borland comercializeaza 0 biblioteca de componente standardizate care pot fi utilizate la implementarea interfetelor utilizator folosind unul din limbajcle C++ si Pascal, Produsul respectiv se numeste Turbo Vision. Utilizarea lui pentru implementarea de interfere utilizator presupune cunoasterea a eel putin unuia din aceste limbaje de programare. Interfetele utilizator implernentate cu ajutorul limbajelor orientate sprc obiecte le vom numi interfete utilizator orientate spre obiecte. De obicei, interfetele utilizator gestioneaza ecranul in mod grafic, 0 astfelde,

in cnrtca de fill{1 sc prczinta COI11Ul1e diferitclor implemcntari

Iacilitatile de bazu ale limbajului C++ care sint ale sale. Excrcitiilcprezcntatc in cartca de Ella

au lost rulatc Io losind compilatorul TURBO C++ v2.0 (accst compilatcr cste mardi inrcgistrata a firmei Borland). Conccptclc programarii orientate sprc obicctc au inllucnlat in mare masura dczvoltarca limbajclor de programarc din ultimii ani. De obicci, multc lirnbajc au lost cxtinsc asa incit cle sil admits conccptclc mai importantc ale programarii orientate sprc obiectc, Uncori s-au facut chiar mai multo cxtcnsii ale accluiasi limbaj. De excmplu, in prezent asistarn la cxteusiile limbajuluiC++. 0 astfcl de extensie 0 constitue limbajul E ai carui au tori sint Joel E. Richardson, Michael J. Carey si Daniel T. Schuh de la univcrsitatca Wisconsin Madison. Acest limbaj a lost proiectat pentru a pcrmitc exprirnarca simpla a tipurilor si opcratiilor interne sistcrnclor dc gcstiunc a bazclor de date. Printre altele, limbajul E permite crearea si gestiunea obiectclor pcrsistente, lucru dcosebit de important pentru sistcmele de gestiune a bazelor de date. alta extensie a limbajului C++ este limbajul 0 dczvoltat la Bell Laboratories. Cell' doua limbaje (E;;i 0) sint in csenta echivalentc. Despre limbajul E se afirma ell este in principal orientat sprc scricrca programclor sistcm, in particular pentru implcrncntarca sistcmclor de gcstiune a bazelor de date.

intcrfatii urilizator se numeste interfatd utilizator graficd.

Dcsprc limbajul 0 sc spline ca incearca sit imbine Iacilitatilc de nivcl malt


eele ale programarii sistem. o al«j cxtensie a lui C++ estc limbajul Avalon/C++.

Cll

Ea a Ii.lst realizaUl de

Una dintrc cde mai populare interfclc utilizator graficc pentru ealculatoarele cOl1lpatibile IBM PC este produsul Windows oferit de firma Microsoft. Produsul a 1'ost lansat in noiembric 1985 ~i pina acum a fost vindut in cUeva milioane de

exernplare. In prezent este Iansat in exploatare Windows 2000. Windows este un sistem de operare care amplifies fucilitatilc sisternului de operare MS-DOS. Aplicatiile Windows se pot dezvolta folosind diferite medii de dezvoltare ca: Turbo C++ pentru Windows, Pascal pentru Windows, Microsoft C++, 7.0, Microsoft Visual Basic, Visual C si Visual c++. Componentele Visualc permit specificarea in mod grafic a interferei utilizator, a unci aplicatii, folosind soarecele, iar aplicatia propriu-zisa sc prcgrameaza intr-un limbaj de tip Basic, C sau C++. Din cele de mai sus, putem afirma en limbajul C++ sc b~ICUr[1 de 0 popularitate crescuta Hind utilizat in masura mare la implementarca de aplicatii complexe. Daca prin anii '70 se considera ca 0 singura persoana este rezonabil sa sc ocupe cu programe de pma la 4-5 mii de instructiuni, in prezent, in conditiilc folosirii limbajelor de programare orientate spre obiecte, accasra medic este de 25 mii de instructiuni. Cartea de fatii se adreseaza rnturor celor care doresc sa se familiarizczc cu limbajul c++. Din motive de spatiu, in carte nu sint date detaliilc cu privire In notiunile de baza ale programarii, arhitectura sau modul de functionare al unui calculator, considerindu-se ca cititorul este farniliarizat Cll eel putin uu limbaj de programare, Tot din lipsa de spatiu BU este descris mediul de dezvoltare integra: TURBO C++ el fiind foarte asemanator cu mcdiile integrate de dezvolrarc ale celorlalte compilatoare furnizate de firma Borland. Cititorul care !HI este familiarizat cu astfel de medii poatc consulta alte carti care descriu astfcl de medii (vezi de exemplu [17]). In incheiere exprirn multumiri D-nei Irina Mitrov pentru observariile ~i sugestiile care mi le-a facut in legatura ell continutul carrii si al cxcrcitiilor, precum si ell privire la irnbunatatirea claritatii si exprimarii diferitelor notiuni, Mentionez activitatea intensa depusa de D-na Irina Mitrov si fiicu mea, Lavinia Negrescu, in legatura cu munca de introducere pe calculator a textului cartii, Tot pc aceasta calc doresc sa-i multumesc fiului meu, Dan Negrescu, pentru ajutorul pe care mi l-a dat in legatura cu forrnularea t>i rczolvarea unor exercitii care sin! legate de facilitatile sisternului de operare MS-DOS. De asemenea, rnultumesc editurii Casa de Editura Albastra pcntru cfortul depus in vederea publicarii ingrijite a carrii de fal;1.
AUlOI'II!

INTRODUCERE
Limbajul c++ cstc un superset al limbajului C avind 0 utilizarc univcrsala si care pennite scrierca de prograrne orientate spre obicctc. Faptul ca limbajul C++ csre un superset al limbajului C mscarnna ca mice program scris in limubjul C este in acclasi limp 0i un program scris in limbajul C++. Aceasta afirmatie csic adcvarata ClI mici cxceptii, de cxcmplu.compilatorui c++ face uncle controalc suplimcntarc f;*l de compilatorul C. Accstc controalc se rcfera in primul rind In iipurilc paramctrilor Iuncriilor, prccum si 1<1tipurilc valorilor rcturnate de clc. Faptul ca limbaju I C++ pcrmite scricrca de prograrnc orientate sprc obicctc inseamna ca el permitc utilizarca unor conceptc de baza ale acestui stil de prograinare. Acest fapt rcprczinta un salt. calitativ f~qil de lirnbajul C, ceca cc sc exprirna sugestiv si prin numclc limbajului (C++). EJ nu a 1'oSI numit limbajul D deoarece estc () extcnsic a lui C. Tinind scama ca opcratorul "-1+", din limbajul C. rcprczinta opcratia de incremcntare, numelc C++ se ponte citi HC incremental". In principiu, putcrn afirma c{i limbujul c++ cstc un HC mui bun", care okra atit facilitatile Iirnbajului C cit ~iprogrnmnrea oriental a spre obicctc, Faciliratilc principalc ale limbajului C sint:
portabilitatea mare
ill

,I programclor;

flexibilitntca lucrul pe biti;

prngramarc;

programc compactc;
calcul de adresc.

Mcntionam Gil limbnjul C initial a rust proicciat ill i(iL:L':I de a asigura 0 portabilitate buna a programclor. Ca 0 consccinta a accstui dczidcrat arnintim lipsa, din lirnbajul C, a instrucliunilor de intrurc/icsirc. Accstc opcratii se realizeaza prin funcui de biblioteca. Elirninarca din limbaj a instructiunilor de intrarc/icsirc rczulia din faptul en opcratiilc de intrarc/icsirc sint dcpcndcntc de particularitaulc hardware
ale cnlculntoarclor.

dcpistarca unor crori in prngramarc. eli roarc nccxtca, flcxihilu.uc.. in progt'amare obtinuta in accst Icl s-a dovcdit a fi udcsca utilu ~I trchuic considcratn t\ 1;lcililalc in plus a limbajului dccit () p.utc ncg.uiv» a lui. AIle facilitati care marcsc tlcxibilitatcn ill progar.unarc sin: legate de prcll~n!a in limbaj a unor instructiun] care asigurn rcvcnirca sillipia dinir-o fUIlC\ic', ic)irca

Flcxibilitatca in programare rczultu, printrc altclc, din numarul mai redus de controale pc care il face compilntorul C, f<l\il de altc compilatoarc, de cxcmplu ral,) de compilatorul Iimbujului Pascal. Accst {(lPI a provocat 0 scric de discurii, intrucit abscnta unor controulc severe la compilare sc considcru ca ingrcuncaza

10

II

dill cicluri etc.


Cornpilatorul C++ rcalizcaza uncle controalc suplimentarc f~l\{l dc compilatorul C. Cu toatc acestea programarl.'a in limbajul C++ sc bucura de 0 flcxibilitate mare.

Pcntru a icsi din mcdiul inlegral de dczvoltarc TURBO C sc poatc tasta:


<Alt>-X Compilatorul TURBO C++ poate fi si el apelat prin intermediul mediului integrat de dezvoltare TURBO C++ sau printr-o linie de comanda. Mediul integrat de dezvoltare TURBO C++ este asemanator cu eel al compilatorului TURBO C. De exernplu, see venta de mai sus poate fi utilizata si in cnzul compilatorului TURBO C++ v2,O ell singura diferenta ca in loe de te se va tasta be. Mcntionam cd Iisierclc cu programe sursa C au extcnsia .C, iar celc cu prcgramele sursa C++ au extensia .CPP. Programele sursa C din aceasta carte au fost compilatc cu cornpilatorul C++ si elc au extensia .CPP. Limbajul C, alaturi de limbajul Pascal ~icelelalte lirnbaje precedente lor siut

o alUi facilitate importantu a limbajului C cstc posibilitatca de a compacta programclc sursa. Limbajul C pcrmitc 0 compactarc buna a progrumclor sursa pc
xcama unor clll1SlnlC\ii sIK'eilice, CUIll sint: cxprcsi» de uuibuirc, cxprcsia condiuonala, opcratorii de incrcmcntare ~idccrcmcntarc etc, Limbajul C ofcru Iacilitati spccificc limbajclor de usamblarc, cum sint luerul pe biti ~i calculul cu udrcsc. Accst fapt pcrmite adesea scrierca de programe uptime, alit ill ceca cc privcstc memoria, cit ~itimpul de cxccutic, Limbajul C sc considera ca cstc un intcrrncdiar intre limbajele de nivcl inalt si celc de asamblarc . .1::1a ci~tigal 0 popularitatc marc in dccursul unilor datorita 1:leilil;l\ilor umintitc mui sus,
La ora actua la cxista un standard ANSI al limbajului C, dar numcrousclc sale implcmcntari sc abat dc lu uccst standard. in cartea de t~l\'\ IlC vorn rcfcri In vcrsiunca TURBO C v2.0 care cstc marca inrcgistrata it Iinuci BORLAND si cstc implcmcntata pc calculatoarclc compatibilc IBM PC. Compilarorul TURBO C poatc fi apclat prin intermcdiul mediului integral de dezvoltare (Integrated Development Environment) sau printr-o linic de cornanda. Fara a intra in dctalii cu privirc la mcdiul integral de dezvoltare TURBO C, indicarn mai jos 0 sccveuta simpla de corncnzi pcntru a lansa in exccutie lin program C nou: • dupa sctarca pc dircctorul tc; <AIt>-F~ corcspunzator sc tastcaza:

adecvate programdrii procedurale. Programarca procedurala este un model de progpmare


din Iaza initiala de existcn\li a limbajclor de programarc.

utilizat frecvent lnca

La baza acestei programari se ana procedura. Aceasta poate fi considcrata ca un proccs de abstractizare. Accst proccs se realizeaza pe baza parametrilor care permit rcalizarea procedurii facind abstractie de valorile concrete pentru carc sa sc execute procedura, De exemplu, Ia realizarea unci proceduri pcntru calculul functiei sin se face
abstractie de valoarea coucreta a unghiului, Procedura are un parametru care ne

permite sa neglijam valoarea concrete a unghiului. Procedure se defineste in asa fel incit ea sa calculcze valoarea functiei sin in functie de valoarea parametrului . ci, valoare care se concretizeaza In cxccutic in mornentul apelului procedurii respective. Acest proces de abstractizare prin intermediul parametrilor procedurilor se numeste abstractizare procedurald.
Un alt aspect al acestui proces de abstractizare este acela ca procedura poate 0 "cutie neagra", La apelul ci nu se au in vedcre detaliile de realizare ale procedurii. De exemplu, la apelul procedurii de calcul a valorii functiei sin sint neglijate detaliile cu privire la algoritmul de calcul al functiei respective. La aceasta faza intereseaza "tipul" parametrului si eventual precizia de calcul a functiei respective. Abstractizarea procedurala a fost folosita pe scara larga la rezolvarea multor

N.
• • • • sc editcaza se actioncaza programul
tasta F2;

fi privita ca

sursa folosind

editorul

mcdiului

TURBO

C;

se indica numclc

fisicrului

pcntru salvarca programului link-cditarca


~I

sursa pc disc; in cxccutic a

sc rcalizcaza compilarca, progrumului tastind: <Ctrl>-F9

lansarca

..

pcnuu a vizualiza rczultarclc


<Alt>-FS

cxccuiici

programului

sc tastcaza:

sc rcvinc in Icrcusua de cditurc a mcdiului actionind

(astil oarccarc.

probleme aplicative san de sistcm. Importanta ei creste odata eu cresterea complcxitatii problemci de rczolvat. De obicci, problemelc complcxc se descornpun in subprobleme mai simple, Acestea, la rindul lor, pot fi si ell' descompuse in continuare si asa mai departe, pma cind se ajungc la componente sulicicnt de simple. Acest proces de descompunere se realizeaza printr-un proces de abstractizare care permite neglijarea diferitelor detalii. In felul acesta pot fi pusc in evidcnta procese de calcul care prin utilizari de parametri pot fi exprimate

printr-o procedura.
Pasul urrnator programarii proccdurale a fost progratnarea modulard. Dcsi
I1U

Tasta F I ponte Ii actionata pcntru a obtine infonuatii


in !;Iza prcccdcnUI <lqiollind (asta ESC.

suplimcntarc.

Sc rcvine

cxista

definitic

riguroasa

pentru

notiunea

de modul,

citindu-I

pe Bjarne

12

13

Stroustrup, se ponte afirma ca modI/III! cste IIIl set de proccduri inruditc unprcuna ell datele ne care le manevreaza (vezi r 141). Ceca ~e trebuie sa mai preciz<1111 ~st~' faptul c{1 datele manevrate de acesre proceduri, care compun un modul, siru de obicei "ascunsc'' in modulul rcspcctiv, Aceasta inseamna ca in afara modulului nu sc are acecs direct la datcle ascunsc de modul. Se are acces la ele numai indirect, prin intcnnediul proccdurilor modulului respectiv, Limitarea accesului la date prin ascunderca lor inrr-un modul conduce la 0 protejare a lor, ceca ce prezinta importanta mai ales in cazul programelor complexe. Un exemplu simplu de modul este modulul pentru implernentarea unci stive. In forma cea mai simpla, stiva poate fi considerata ca fiind 0 zona de memorie in care pot fi pastrate date, de obicei de un acelasi tip. Datele pot fi scoase din stiva numai in ordinea inversa pastrarii lor. Ultima data pusa in stiva se spune ca este in virful ei. Data scoasa din stiva este totdeauna accea aflata in vi rfu ! stivei. Totodata, dupa scoaterea unei date din stiva, in virful stivei sc va ana data care a fost pusa pe stiva imediat inaintea celei scoase din stiva, In felul acosta, totdeauna se scoate din stiva ultima data pastrata (pusa) In stiva, Se obisnuieste sa se spuna ca stiva este 0 zona de memorie gestionata dupa principiul: ultimul pus pe stiva este primul scos din stiva (last in-first out sau pc SCUtt LIFO). Este important ca acest principiu sa fie respectat. De exemplu, nu este admis sa se scoata din stiva sau sa se aiba acces la un element care nu este in virful stivei. De asernenea, cind se pune un element pe stiva, acesta poate fi pus nurnai dupa eel aflat in virfu! stivei ~iprin aceasta el devine elementu! din virful stivei. Din aceasta cauza, zona de memorie prin care se implementeaza stiva trebuie "ascunsa", accesul la ea realizindu-se numai prin intermediul a doua proceduri: - una care sa puna 0 data pe stiva (procedura care de obicei se numeste push); ~i una care sa scoata pop).
0

I'rllgralllarc,1 modulara COI'l'SplIllde mui binc idcii amintite mai SIIS ell privirc !a dcsc~!11pllnerea problcmclor complcxc 111subprobkme mai simple,.hI pcruutc lin grad mai inalt de abstrnctizare pe scama ascundcrii date lor $i a proccdunlor, Limbuju] C a ('ost prnicctat in a~a l'cl incit sil pcrmita rcalizurca de module ell ascunderca datclor )i a proccdurilor. Asifcl, datclc ~i proccdurile tleclar<lte ell static au 0 valnbilitatc limitata in cadrul fisicrului sursa in care sint declarate. . Programarea modulara are anumiic limite. Asa de cxcmplu, daca estc ncvoic de mai multo stivc, arunci program(ll'(:a modulara cstc 0 soluuc dcstul de complexa pentru a gestiona stivele respective. _. o rezolvare rnai simpla si naturals s-ar obtine daca am putca dcfini date de tip stiva, asa cum putcm defini, de cxernplu, date de tip intrcg, flotant sau
caracter,

Toate limbajele de nivel inalt pun la dispozitia utilizatorului un anumit l1l:milr de tipuri prcdcfinitc, De exernplu, limbajul FORTRAN are ripurile prcdefinitc integer si real. Limbajul Care si el accstc tipuri prcdchtutc (intrcg st [lntant} $1 1!1 plus mai pune la dispozitia utilizatorului tipul caracter. .' Un tip de dale dcscric lin set de date pe care le mai numim .~l obicctc, care au acecasi reprczcntarc, De uscmcnca, cxistn lin numar de opcraru aS~C1al Cll IHl tip de date. De exemplu, Cll tipul intreg sc asociaza cclc palm operant antrncuce $1 eventual si allele. . Ulterior s-a constatat CI\ estc util ca limbnjul sii pcrrnira utilizatorului S1) defincasca el insusi tipuri diferitc de cell' prcdcfinitc in limbaj. In aeest scop, in
lirnbajul Pascal s-a introdus notiunca de inregislf'{lI'C (record) care pcrrrute

data din stiva (procedure

care de obicei se numeste .

definiri de grupc de date care IlU ncnparat all un accla~i tip. 0 ustfcl de grup~1 de date reprezintti un tip nou de date. 0 facilitate analoga cxista ~l in limbajul C. In acest caz se utilizeazil notiuuca de structura (struct). Alit constructia record din Pascal cit si struct din limbajul C definesc reprezcntarea tipului nou de datil. . Utilizatorul definesrc, de ascmeuea, opcratii CH date de aces! tip pnn intermediul unor proceduri sau funcrii. .

De obicei, la aceste prcceduri

se mai adauga

procedura pentru initializarca

stivei, Aceasta procedura are drept scop vidarea stivei. In unna apelului ei, stiva devine vida (aceasta procedura de obicei se numeste clear). Cele trei proceduri amintite mai sus se considera "inrudite'' ~i irnpreuna ell

Tipurilc definite in accst Iel sc nlll11CSC tipuri definite de utilizator Si~U mat scurt tipuri utilizator, Un cxcmplu de tip utilizator folosit frec~ent ponte II tipu! de numar complex. Accst« arc 0 reprezentare care sc dcfincstc .slInphl :n limbajulC folosind construC\ia struct. Nurnarul complex estc 0 grupa Iormata lim

doua numere flotantc, priruul rcprczinta

partea rcala

it

numarului

complex,

tar

zona de memorie utilizata pentru implcmentarea stivei se grupcaza intr-un modul. Utilizatorul nu poate gestiona direct aceasta zona de memorie decit numai prin intennediul celor 3 proceduri amintite mai sus. Un modul similar se poate defini pentru a gestiona 0 zona de memo ric confonn principiului: primu! pus in zona respectivii este ;;i primui seos (first in-first out san pe scurt FIFO). 0 astfel de zona de mCl110rie se spune cit formeaza o coadd. Adcsea, ascunderea datelor In l110dul se extinde ~i asupra proccdurilor, limitlndll-Se accesul din afam modullllui In uncle proceduri din compunerea lui. 14

celalalt partca imaginar:l a lui. , In continuare, se pot defini variubile care sa aiba tipul complex, exact la tel cum se definesc variabilc de tipul intreg, flotant sau caracter. Pentru a rcaliza operatii eu numere complexe, utilizatorul deflneste funqii rorf'snunz[]toare. Oneratiile carc se executfl asupra datelor care all tlpun ~~~d~llt1ite au diferite r.;eilita\i care lipsesc in eazul. tipurilor L1tilizat~r. A~a ~je exemplll, pentru datclc de tip intreg sau flOlant sc utiltzeaza opcrat.Ol:1I Obl$nul\l penlrll openl\iilc arillllL'ticl: (I, -, * ~i I). ACCSI.IllCl'II 1111 cstc poslhJl ~I Iwnlnt nUl11erele de tip complex. Dc ascmenca, 0 sene de controale ~i conversii se 15

rcalizcaza

automat ill cazul utilizarii datclor de tipuri prcdcfinitc. Un alt ncajuns al tipurilor utilizator, definite ca mai sus, estc faptul ca nu sc asigura nici 0 protcctie asupra cornponcntclor unci date. Accstc ncajunsuri rczuliu mai ales din tuptul ca lu dcfinirca tipurilor utilizator de fapt sc deiincsc numai rcprczcntarilc dutclor respective, Nu sc prccizeaza nicaicri operatiilc posibilc asupra datclor respective. Chiar duca astfcl de opcraui sint definite prin proceduri sau functii, cornpilatoarcle nu au informatii in accst scns. De accea, pasul urmator consta in posibilitatea de a preeiza in limbaj proccdurile sau Iunctiilc care au acces la componcntele unci date de tip utilizator, o astfcl de cxtcnsic s-a realizat Ioartc simplu, de exemplu in cazul construcuci struct din limbajul C, alaturi de dcfinirca rcprczcuturii coniponcutclor sc indica si lista Iunctiilor care dcfincsc opcratiilc asupra lor. Aceasta insa, nu inscamna ca numai Iunctiilc respective '!u acccs la datclc componcntc ale structurii, Cu alto cuviutc, priu cmuucrarca f'llIlc\iilor ill cadnlll'oIlSlrllt'\ici struct uu sc okra uici u protcciic a corupoucntclor suucturii respective, ci numai sc indica Iaptul ca datclc componente ale structurii sint prclucratc prin functiile enumerate, dar la cle putcm avca acccssi prin alto functii, Mai tirziu s-a constalal ca adcsca anumitc componcntc date si eventual 9i cornponentc functii atasatc unui tip definit de utilizator cstc bine sa fie protejatc pentru a inlatura acccsul ncautorizat. in felul acosta s-a ajuns la notiunca de tip abstract de data. Accasta notiunc dcpascstc posibilitatilc limbajului C. Tipurilc abstracto de date pot fi definite in limbajul C++ folosind notiunea de clasa. 0 clasa, dcci, dcfincste atit rcprezcntarca datelor tipului rcspcctiv cit $i functiile care au acccs ~i pot prclucra datclc respective. La dcfinirca unci clasc sc indica cornponcutclc data si Iunctic la care au acccs utilizatorii clasci (componente puhlice). Cornponcntclc care nu sint publico permit un acccs limitat ~i in Iclul acosta cle sint protejatc fata de acccsurilc ncautorizatc, Se obisnuicstc sa sc spuna ca, clasclc "incapsulcaza'' datelc. Accst proces de incapsularc estc dcosebit de important permitind dcfinirca de cornponente protejate ;;i reutilizabile. Dcosebirca dintre clasa si constructia struct consta chiar in idcca dc protcctie. Un tip utilizator dcfinit printr-o coustructic struct poatc Ii dcfinit printr-o clasa care arc loate componcntclc data 0i luuctic,
publico. data de un tip abstract (adica tip dcfinit printr-o clasa) se spunc ca cstc un object. De aSeIHCl1ea, se obi;;nuie;;le sa SI.: splilla ca obicclul eslc 0 ill.l'lall(ierc a clasei care definc;;tc tipul sau. Reluind exemplul cu privire la dcfinirea $i gestiunea stivelor, observam ca de data accasta pulem introducc lipul abstract de datil slim prill intermediul unci clase. Zona de mernorie care se orgunizeazil ca stiva esle 0 cOll1poncntii dalii prolejatil a clasei respective. 0 allil componenta data protcjatil este cea eare dcfinq;te virful slivei. Componel1tele rlll1ctic, publice, ale clasei sinl f'unC!iilc push, pop ~i clear. Ele pol Ii apdate din dif'critc f'ullC\ii ale programului. Deoarece componentelc date sint protcjatc, la ele IlU se are acces decit prin

intermediul celor trei functii publice indicate mai sus. Prill instantierea acestei clase se obtine un obiect de tip stiva, In felul acesta se pot obtine atitea obiecte de tip StiV[I, cite sint necesare, exact la fel cum se pot defini atitea date de un tip prcdcfinit, cite sint neccsare, In mod analog, se poate dcfini, printr-o clasa, tipul abstract de data pentru numere complexe. In acest caz sin! necesare doua cornponente data, una pentru partea reala si una pentru partea imaginara. Ambele componente sint protejate, Cele patru operatii aritmetice asupra numerelor complexe se definesc prin patru componente functie care sin! pub lice. Un numar complex este 0 instantiere a accstci clase. Se pot instantia atitea numcrc cornplexe cite sin! necesare. Mai mult decit atit, componentele functie care definesc cdc palm operatii aritmctice cu nurnere de tip complex pot fi definite in a~~ fel incit operatorii accstor opcrutli Sil pouta Ii folositi Btl uumai pcntru date de tipuri prcdefinitc ale limbajului, ci si pcntru datele de tip complex. A~a de exemplu, Iunctia pentru adunarea a doua numere complexe po ate f definite lnasa fel ca expresia x+y sa fie valabila IlU numai pentru cazurile in care x $i y slut de tip intreg sau flotant, ci ~i cind ei sint de lip complex. ell alte cuvinte, este posibil ca valabilitatca de aplicare a unui operator al limbajului sa fie extinsa si pcntru tipuri abstracto de date. Aceasta posibilitate trebuic privita en un mijloc de cxtindcrc a valabilitatii opcratorilor cxistcnti. Acest mijloc il vorn numi in continuare supraincdrcarea operatorilor. Mentionam ca, clasele au de obicei si alte cornponcnte functic care permit realizarea unor operatii spccifice tipurilor abstracto de date. De cxernplu, obiectele pot fi initializatc la instanticrea lor printr-o componenta functie speciala, care se numeste constructor. De ascrncnca, 0 alta components functie speciala realizeaza "distrugerea" obiectului. Ea sc l1U111e:_;te destructor. Alte cornponente functie se definesc pentru a copia obiecte, a face diferite conversii etc. Teate accste Iacilitati apropie mult comportamentul obiectelor instantiate prin clase de ccle care au tipuri predcfinitc. Programarea care utilizeaza tipuri abstracte de date este un stil de programarc superior programarii modulare. Un astfcl de stil de programare se numc~te progralllarc prin abstractizarea date/or. In esenlii, ea consta in dc1inirea de tipuri abstracte de date penttu ficcare concept necesar la rezolvarea unci probleme concrete, concept care nu este prcdefinit in limbajul de programare utilizat (mai sus s-au indica! conceptele de stiva $i num[ll' complex). In felul acesta programarea devine mai simpla ~i ll1ai naturala. De aid ~i pilla la stilul programarii orientate spre obiecte mai esle un singur pas. Dc obicei, diferite tipuri abstracte de date au elemente comune. Prccizarea lor conduce la 0 "lerarhizare" a tipurilor abstracte de date. in virful ierarhiei se alH

16

17

clasa ce contine elcmentele comune cclnrlaltc clase. Fa estc clasa cea mai gencrala. Pe nivelul urmator ai ierarhiei se afla altc clasc care contin elcmentele clasei din virful ierarhiei, precum si alte cornponcntc spccifice tipurilor abstracto pc care le definesc, in general, daca 0 clasa coniine 0i alto componcntc decit ccle care sint cornune pentru una sau mai multe clase, atunci aceasta se afla In un nivel mai inferior al ierarhiei declt clasa care defineste elementele cornunc lor. Ierarhizarea claselor are 0 imporranta mare, dcoarecc atribute1c unci clase ramin valabile pcntru clasele de pe nivelul urrnator ei din icrarhie, Aceasta proprietate se numeste mostenire. Pe scurr, mostenirea perrnite definirea de tipuri abstracte de date noi prin
adaugarea de componente data si/sau functie la un tip abstract de date deja

cod.

Conccptul de conducator dcriva din eel de pcrsouna dl'O;U\~l'L' oricl' conducator nrc toatc atributclc spccificc unci persoane. De accca, conccptul de

existent. Prin aceasta se pot elabora simplu componente extensibilc, o clasa care se defineste adaugind componente noi unci clase date se numcste clasd derivata, iar clasa compusa din elemcntclc cornune (la care S-<1U adaugat componentele noi) se nurneste clasii de baza. Aceasta tcrminologic este utilizata
in C++. Uneori clasa derivate se mai numestc ~i subclasa a clasei de baza, iar clasa de baza sc numeste superclasa a unci clase derivate a ei. Notiunea de mostenire se aplica Ctl succes la prelucrarea conceptelor ierarhice din lumea reala. Modclarea ierarhiilor din lumca reala conduce la 0 ierarhie de tipuri abstracto de date care in limbajul C++ se defincstc printr-o ierarhie de clase bazata pe proprietatea de mostenire, Un exemplu sirnplu de ierarhie din lumen !'eala este 0 coruunitarc de pcrsoanc impreuua Cll conducatorii acestei comunitati. In acest excmplu simplu, exist" doua concepte ~ianurne conceptul persoana si conceptul de conducdtor. . Conccptul de persoana se modclcaza printr-o clasa care confine datele unci

conducator se modclcaza printr-o CI<IS,' care dcriva din clasn pcrsoana. Conccptul de conducator prcsupunc clemente noi, cum ar fi de cxcrnplu cunosrinrc dcsprc conduccrc, specializarc, funcric etc. Un nit cxcmplu simplu cstc ales din geometric 0i sc rcfcra la patrulatcrc Daca sc considcra clasa care dcfincsic conceptul de paralclogram (patrulntcr cu laturilc opusc paralele), atunci conceptul de dreprunghi ponte fi modclat printr-o clasa dcrivata din cca a paralclogramului. Intr-adcvar, drcptunghiul cstc un paralelogram la care rnai adaugam conditio ca sa aibn lin unghi drcpt Dcci clasa dreptunghi cstc 0 clasa dcrivata a clasei paralclogram, iar accasta din urrna cste 0 clasa de baza a clasci dreptunghi. Icrnrhia ponte fi conrinuata ell patratul. lntr- adcvur, patratul esle un drcplllilghi ell tnatc laturilc cgak, dcci clasa corespunzatoarc pntratului cste dcrivuta din cca a drcptunghiului. Dc ascmcnca, clasa pcntru drcpiunghi csic clasa de baza pentru clasa corcspunzaroarc patratului.
Dcoarcce rombul cstc un parulclogram cu ioarc laturilc l'gale, clasa corespunzatoarc accstuia cstc si ca 0 class dcrivata din clasa corcspunzatoarc paralelograrnului. Dcci, clasa pentru paralclogram estc clasa de baza atit pcntru

clasa corcspunzatoare drcpiunghiului cit ~ipcntru cca corcspunzatourc romhului. La rindul ci, clasa corcspunzatoarc paralclograrnului poate ti ~i ca dcrivata dintr-o clasa rnai gcncrala corcspunzatoarc putrulatcrclor. Numarul cxcmplclor ponte fi maril usor, dcoarccc lumen rcalu cstc plina de
icrarhii, Dc aiei dccurgc import.uun man: a couccptului distantcaza substantial stilul progrumnrii orientale sprc de m()~tL'nire care ohiccic de eel nl

pcrsoanc: nume;
prenul11e; data nasterii; localitate;

prograrnarii prin abstractizurca datclor. III concluvic, progralllarea proccdurala cstc ccu mai vcchc ~i ea Sl.' al1:l la nivclul eel rnai de jos din punctul de vcderc al stilului de prograrnarc. La nivclul urrnator sc afla prograrnarca modularn care pcrrnitc ascundcrca datclor ~i n
proccdurilor in module. Ea cstc suficicnra pcntru progrnmarca problcmclor rclativ simple care l1l1 implica utilizari multiple ale conccptclor modclatc prill

domiciliu;
profesiune;

studii; stare civila;


numar copn; incadrare;

vechime in munca;
salarizare;

module. De cxernplu, daca conccptul de stiva cstc realizat printr-un modul, atunci progrnmarca modularn cstc suficicnta dal:il in program nu sc utilize:!z:! ill al:ela~i tiiup mui multc stivc til' fl'lul cclci definite prin mo.lulul rcspcctiv. Ambclc stiluri (programarca procedural,'! 0i cca modularn) sint suporuuc de limbajul C. Nivclul urmator, progralll:lrca prill :!bstractizarea (bklor, illl:!tura incollvl'nientcle program{lrii rnoduiare pe baza modeiarii coneepteior ce intervin in rezolvarea problcmelor prill tipuri abstracte de date. Dc l'Xl'mplll, introdlleind tipul abstract de date "stiva", se pot ddini 0i utiliza sil11plu mai Illultc stivc simultan in acela~i program. Programat'e:! prin abstr:lctizarca datl'lor nlil'stc sliportata dl' lilllhaJl" C.

I~

1<)

r
I
,

Nivclul unu.uor Ii (,()IISllllIic 11Iogl;lllIalc<I miCIII;II<I xprc ohicctc, Accst sli! de programarc, pe Iinga Iaptul ca pcrmite modelarca conceprclor prin tipuri abstractc de dale, cu pcrmiic III plus si altc Iacilirat: dintrc care mai sus s-a arnintit cxprimarcn icrarhiilor dill c.ulrul couccptclur prin tuciliuucu de mostcnirc, Programurca prin nhstractizarca dntclor cste suficicnta pcntru problcme in care intcrvin conccptc individuulc care nu au clemente comunc si care deci nu couduc la cxistcnta unci icr.uhii. Limbajul (' 1 I a (lIst pruiectat pcntru a pcrmitc dcfinirca si utilizarca tipurilor
abstractc mostcnirc. de date, prccum ~i icrarhizarca lor prin folosirea conceptului de

Ahordnrcu
insusirea

programclor

din volumcle

3 ~i 4 este posibilu numai dupa


limbajelor C ~iC++ prezcntate

tcmcinica a cunostintelor in primele doua volume all' cartii.

~ifacilitatilor

Autorul rccornanda prograrnatorilor uiccpatori S1l parcurga volurncle I - 2 de mai multo ori inainte de a trece la studierea prograrnelor din volumele 3 si 4. Limbajele C ~i CI+ avind un caracter universal, volumele 3 ~i 4 contin programe pcntru rezolvari de problemc de sistem, probleme orientate spre calculc stiintificc sau prclucrari de date. Limbajul C se utilizeaza in aplicatii care nu implica clemente specifice
programarii orientale spre obieete:

I'wgr'lIl1<1r\.';1 UII\.'llt;lta sprc ollll'l~k implica ~i altc i'acilita\i care msa 1111sinl suportatc direct de limbujul C++. De altfcl, la ora actuula Illi cxista un lirnbaj care S,l suportc to.uc conccptclc progrumarii orientate spre obicctc. III ell"':! tic 1:1\:1 Sl' \k~nilll·kllll·lll\.·k til' h;(/.a ale liuibajului C+ I ~i tullidaia
se dau cxcmplc de uulizarc a lor ill programme. Cartca "pare ill patru volume intitulatc: Limbajul C - volurnul I;

-- tipuri abstractc mostcnire;


supraincarcarca

de date;
operatorilor etc.

Majoritatca problcmclor de exemplu: - rezolvari de ecuatii; problemc de optimizari

de accst fcl sint orientate

sprc caleule stiintifice, ea

Limbajul C I + - vulumul 2; C ~iCI+ in aplicarii - volumul 3; Problcmc de optimizarc, grafica, programe de sistem -volumul q, ill primul velum sc lucc (1 dcscricrc clcmcutara a limbajului C. Accasta descricre cstc msorita de 0 scrie de exernple (>iprograme simple care permit 0 mai buna intclcgcre $i Iixarc a clcmcntclor Jimbajului C.
Limbajclc Majoritarca cxernplelor au un caructcr didactic. Cu toate accstea, cititorul va intilni uncle cxcmplc si programe sau tunctii care pot intcrveni.in practica de zi cu zi a programarii in limbajul C. Autorul iusista asupra importantci rularii prograrnelor prezentate in carte si propulle ca ell' sa lie rulatc ~i intclcsc pe masura cc sc uvanscaza cu citirea cartii. Programelc din primul volum pot II cornpilatc si executate folosind mediile integrate de dezvoltare Turbo C sau Turbo c++ implernentate .de firma

sistcmc de ecuutii liniurc; ctc. facilitatile

In schimb, aplicatiile de sistcm $i de grafica se abordeaza utilizind programarii orientate sprc obiecte. Volumul I care descrie limbajul C apare impartit in doua parti:

Partea 1 contine: notiuni de baza;


intrari/iesiri standard;

expresii; instructiuni;
c1ase de memorie;

pointeri;
recursivitate.

BORLAND.
in cazul in care sc Ioloscste mcdiul Turbo C se va folosi extensia .C la fisicrclc sursa, iar in cazul lui Turbo C++ extensia .CPP. Programelc din volurnul 2 se pot compila si executa numai sub mediul Turbo C++ sau Borland C++ si fisierclc sursa VOl' uvea extcnsia .Cl'P. in volumul 3 se intilnesc atit programe care nu utilizeaza clemente specifice lirnbajului C++ cit si programe care utilizcaza astfel de clemente. Programele din prima categoric pot f compilate ~i executatc folosind arnbclc medii amintite mai sus. Evident cell' din categoria a doua implies utilizarea mcdiului Turbo C++ sau BorlandCv+ Volumul 2, coutinc 0 dcscriere clerncntara a facilitatilor ofcrite de limbajul C++, carl' cstc insotita de numeroase cxcmplc ~i programe menite sa faciliteze intclcgcrca ~i fixarca cunostintclor respective.

Partea a 2-a contine:


tipul utilizator;

liste; arbori;
tabele;

sortarc;
preprocesare;

I ,
i

intrari iesiri; functii standard; -- gestiunea ecranului

in mod text si grafic,

20

21

1. NOT!UNI DE BAZA .
Un program contine una sau mai multo [unctii. Dintre accstca, una este functia principalti. Fiecare functie arc un Ill/me. Numcle functiei principale estc main. Cclclaltc funcri: au numc definite de utilizator. Programul se pastrcaza intr-un [isicr sal! mai multo. Fisicrclc au cxtcnsia .C penrru lirnbajul C;;i .CPfi pcntru lirnbajul C+t. Un Iisicr care couiinc un program scris in C sat! C 1+ sau cart; contine numai o parte a acestuia se va numiJisier SlIrSII. I'rin compilarea unui fisicr sursa rezulta lin [isier obiect . Acesta arc cxtcnsia .obj. Fi~icre!c stlrs,t care intra in cornpuncrca unui program pot Ii cornpilatc imprcuna sal! scparat. 111urma unci compilari rczulta un Iisicr obicct. Fisicrclc obiect, corespunzatoarc unui program, pot fi reunite intr-un program cxecutabil prin editia de lcgdiliri (link-cditarcv. In urma l ink-cditarii rczulta un fisier executabil. Accsta arc cxtcnsia . ext'.

1.1. Nume
Un 1111111e cste 0 succcsiune de litcrc ~i eventual si cifrc, prirnul caractcr fiind litera. In calitate de litere se pot utilizn litere!c mici ~i marl ale alfabetului englcz, PITClIlll :;;i caraclL'r1l1 sul-linirrr ( ). Numarul de caructcrc care intra III compunerca unui numc nu cste limitat. in mod implicit, numai primelc 32 de caractcrc dintr-un 1111l11e sint luate in scama. Accastu inscnmnn CEI doua numc direr:t intrc clc nurnai daci1 clc difcra in primclc 32 de caractcrc ale lor. Mentionam ca sistcmclc integrate de dczvoltare Turbo C ~i Turbo C++ permit utilizatorului sa modificc accasta limita de 32. Exemple de nume:
x i
d

a_I aIb2c3
lIxY (caructcrul sublinicrc.) 1

a acesta_este_un~nurne
i\Cf:sti'i_ ..Et~t(~ "_'T'ot,

_,UI1_,N(JME

Sc recornanda ca numclc sfl fie sugcstiv, adicn cl Sil sugcrezc scopul alcgerii lui sau a darci pc care 0 rcprczinta.

pe cit posibil 23

La scrierca numclor sc folosesc Irccvcnt litcrc!c mici. Adcseu, cind un nurne sc Iormcaza dill concatcnarca mai multor prescurtari de cuvintc, Iiccaro cuvint inccpc in uumclc rcspcctiv ell 0 litera marc,

(continuare)

Specificarca tipului long

Exemple:
prodSeal prodMat sau ProdSeal sau ProdMat - pcntru prod LIS scalar; - pcntru produsul a doua matricc,

------_.
32 16 32 8

Dimensiune ill hiti

Modul de reprezentare
.... _---

idem intrcg fara scmn idem codul ASCII al caracterului ._.,----_--. -----reprczcntarc flotanta iii simpla precizie ".-~--. ------..-----""._" rcprczcntarc flotanta in dubla prccizic reprczcntarc flotanta in dubla prccizic

unsigned unsigned long

1.2. Cuvinte cheie


Exista un numar de cuvintc imprurnutatc din limba englcza care au 0 utilizare prcdcfinita. Utilizatorul tlU poatc sa dca 0 alta utilizarc acestor cuvinte. Ele se
I1UI11CSC

char
.. -"-"---_'_

----------32
64

float
--

cuvinte cheie.
chcie se scriu cu litere mici, Deci cuvintcle chcie sint nume cu

double

Cuvintcle

destinatii specialc, Excmple:


if while for break class

long double

80

Datcle de tip caracter pot fi specificate


unsigned ctc. char

prin:

sal!
signed char

Sensu] cuvinte!or in carc cle apar,

chcic va f explicat

pc masuru cc sc

VOl'

descrie constructiile

in primul caz, data se presupune

ca cste un lntreg in intervalul

[0,255] (intreg

1.3. Tipuri de date de haza


Orice Iimbaj de programare ofcra progrumatorului un numar de tipuri de date de baza. Tipurile de baza scspccifica prin cuvintc chcie. Accstca, in ordine alfabctica sint:
char double float int long short signed unsigned

eli apartiue intervalului [-128,127J (intrcg ell semn), Datcle specificate numai prin char au 0 interpretare implicita, Aceasta interpretare poate fi definita prin interrnediul mediului integrat de dezvoltare Turbo C sau Turbo C++. In mod normal se considera ca datcle de tip char sint implicit numere fara semn. Pentru a preintimpina aparitia unor erori prin interpretari implicite nedorite ale darelor de tip caracter, se recomanda a se utiliza specificarile explieite unsigned char si signed char.
in tabela 2 se indica intervalele de valori ale tipurilor de baza,

fara sernn). In eel de al doilea caz, data se presllpune

In

tabela de mai jos se indica reprczentarca

tipurilor

de baza,

Reprezentarea tipurilor de baza • Tabela 1

Intervaiele de valor] pentru tipurile de baza - Fabela 2


Speciflcarea int tipului Intervalul de valori

~PCCi~car~--~r-------~m.C~Siu~l--~~i~J~~id~--;::prcz~I1tarc-j
I
tipului int

----------

111

1)1(1 inlrcg rcprczcntat prin complement fll\ii de doi idem

16

[-32768,32767]

short long

r -32768,32767J
[-2147483648,2 147483647J

short

16

24

25

(continuare} Specificarca unsigned unsigned long 1-----unsigned char signed char


t----

tipului

_ .._-

Intervalul [0,65535J

de valnrl

[0,4294967295] [0,255] [-128,127] valoarea absoluta a unci date difcritc d c zcro apartine intcrvalului [3,4 * I 0**( -38);3,4*10**(38)] valoarca absolura a unci date difcritc (Ilc zero apartinc intcrvalului [1,7* I 0**( -308); 1,7*10"(308)] valoarca absoluta a unci datc difcritc (lc zero apartinc intcrvalului [3,4*10* *(-4932); 1,1*' 0'*(4932)1

functiile care la revcnirca din clc rcturncaza o valoarc in punclu] de ape], Tipu] acestei valori se defincste prin tip din antetul functiei, Ccalalta categoric de functii coniine functiile care nu returneaza nici 0 valoare la revenirea din elc. Pentru aceste fuuctii se va folosi euvintul cheie void in calitate de Iii)' EI sernnifica lipsa unci valori returnate la revenirea din functie. o functie poate avca zero sau mai multi pararnetri. Lista dcclaratiilor parametrilor formali este vida in cazul in care funcria nu arc paramcrri Iormali. in aces! caz antetul functici se reduce In: tip numei) Mentionam ca abscnta pararncrrilor ponte f indicara explicit folosind cuvintul cheie void. Astfel, antetul de mai sus po ate fi seris ~i sub forma: tip nume(void)
Exemple:

float

double

long double

1.

void/{void)

I
Functiarnu are pnrarnctri. Ea nu rcturncaza nici
0

Observatie: Tipul predefinit short este identic cu tipul predefinit int la calculatoarelc compatibile IBM PC. La alte calculatoare ele pot fi diferite, de exemplu tipul short ramine reprezentat pe J 6 biti, iar tipul int poate sa fie la Icl ca si tipul long. Tipulullsigned long poate fl scris inversind cuvintele cheic: long unsigned.
2.

valoarc In rcvenirca

din

ca. void/O
{

Format identic cu eel din exernplul precedent. 3. int


(

gO

1.4. Structura unei functli


o functie are urmatoarea structura:
tip numetlista declaratiilor parametrilorformali)

Funcria g nu are pararnetri. intreaga de tip int. 4. double { It(void)

La rcvenirea

din ea se retumeaza

valoarc

declaratii instructiuni

Primul rind din formatul de mai sus reprezinta antetul functiei. Partea inclusa intre acolade, impreuna ell acoladele, formcaza corpul functiei, In cazul tipurilor predefinite, tip din antetul functiei este un cuvint cheie. EI defineste tipul valorii retumate de functie. In limbajul C exista doua categorii de functii, 0 prima categoric contine

Functia flotanta

II nu arc pararnetri. in dubla precizie.

La rcvcnirca

din ea sc rcrurncaza

valoare

In cazul in care functia are pararnerri, dcclaratiile pararnetrilor formali sc includ inrrc pnrantczclc rotundc prczcnrc dupa IlUIllCIe funciic: ~i sc scpara prin virgula daca sint mai multo.

26

Paramctri sc utilizeazil pentru a pcrmitc transfcruri de date la .o functie in morncntul apclului ci. Acest mccanism de transfer al darclor prin interrncdiul paramcirilor nc pcrmitc construirea de lunctii facind abstractie de valorile concrete care vor f prczcntc abia la cxccutia programului, in mornentul cumpilani cxtc ncccsara nurnui cunoustcrca tiputilor valorilor pc care lc VOl' primi paramctri la cxccutie, Accstc tipuri suit definite prin dcclaratiile paramctri lor rcspcctivi, dcclaratii care, asa cum am vazut mui sus, sc indica in antetul functici. Parumctri declarati ill antctul unci functii si care apoi se utilizeaza in corpul Iunctici, sc numcsc [onnali pcntru a sublinia Iaptul ca ei nu rcprezinta valori
concrete, ci numai tin locul acestora pentru a putea exprima procesul de calcul

putcrn indica in parantezele rotunde 0 parte din parametri prin numele lor, iar restul prin declaratiile lor. In conrinunrc se dau declaratiile parametrilor care in parantezele rotunde au fost prezente numai prin nurnele lor. Cu to ate aces tea, se recornanda utilizarea forrnatului in care toate declaratiile paramctrilor sint inclusc in parantczcle rotunde (formatul de la inceputul

puragrafului), 2.
Pentru 1I.111e\ia principal
int main () int roain(void) void main() void main(void) ma i.n l ) main(void)

a se pot

utiliza antetele:

rcalizat prin Iunctic. Ei sc concretizcaza la cxccutic prin apclurile functiei, Valorile pnrumcuilor Iormali xc dcfiucsc la ficcurc upcl al unci Iuuctii prin a~a numiiii paramcui rcali, cfcctivi sau concreti. Utilizarca pnrarnetrilor forrnali la implerncntarca functiilor si atribuirea de valori concrete pcntru ci la cxccutie, rcprczinra uu prim nivcl de abstractizare in
programarc. Aces! mod de programarc cstc eel mai veehi. El 5C uumcste progrwllare procedurald si realizeaza un proccs de abstractizarc prin parametri. Dcclaratiilc pararnctrilor formali sint ascmanatoarc cu cdc ale variabilclor si vor fi definite mtr-un parugruf ulterior.

Prime le doua antete presupun ca functia main returneaza la revcnirea din ea in sisternul de operare, Adesea se obisuuicste utilizarea formatului lara tip:

valoare intreaga

malnf) Amintim ca functia main poate aveasi parametri.

Observarii: 1. Initial antctul unci functii a avut urrnatorul tip nunteilista parametrilorformali) declaratiile paranictrilor [ormali
uncle lip cstc prczcnt numai pcntru Iuncti i care rcturncaza 0 vuloare la rcvcnirea din cle. Cuvintul cheie void a Cost introdus ulterior. De asernenca, cuvintui chcie int nu era nevoic sa fie prczcnt, considcrlndu-sc en orice lunciic GIrl' rcturucazu 0 valoarc a curui tip IlU cstc spccificat, rcturncaza 0 valoarc de tip int. Ulterior S-(1 constatat ca accasta libcrtate in omitcrca tipului este (1 sursa de

Acestia, cind sint prezenti, permit utilizarea de catrc program a unor valori definite la lansarea programului. Ulterior vorn preciza modul de utilizare al acestor parametri,

format:

1.5. Cornentariu
In limbajul C, ca si in alte limbaje de programare se pot folosi comentarii. Un cornentariu incepe cu succesiunea de caractere /*

;;i se termina cu *!
El se compline din orice caracter Evident, in interiorul unui cornentariu adrnis in setul de caraetere nu se va folosi succesiunea al limbajului,

crori ~i de accca sc rccomanda unci Iunctii, in cazul limbajului

cu tipul

sil

tic totdcauua

prczcut in antctul

cornpuuc dintr-un l1UJ11esau mai multe separate prin virgula, in acest caz, dcclaratiilc paramctrilor Iorrnali, dacil ci exist», sc dan imcdiat dupa parantcza inchisa. Aces! format poatc f folosit, atit m limbajul C; cit ~iin limbajul C++, dar compilatorul C++ rernarca printr-un avcrtisrnent ca aces! format
cstc invcchit.

C++ controalclc ell privire la tipul valorii au fost mtarite chiar pcntru a clirnina posibilitatilc de aparitie a crorilor la rcvcuirca din functii. Lisia pararnerrilor forrnali estc fie vida, cind Iunctia I1U arc pararnetri, fie se

*1
care termina

lin cornentariu. In limbajul C++ s-a mai introdus 0 conventie pentru a insera cornentarii, Astfel, in C++ un comentariu poate incepe prin succesiunea II
Un astfel de cornentariu

se termina pc acelasi rind (Ia sfirsitul lui) pc care se

De ascmcnca,

.uuintim ca cdc doua formate pot fi Iolositc imprcuna,

adieu

afla ;;i inccputul lui.

lX

29

Cornentariile

sin! explicatii

pcntru

programatori,

Elc

Ill! all

nici lin cfcct

astfcl de constnnta

sc rcprczinta

pc 1(, hiti daca

III I

asupra compilatorului $i sint omisc la compilarc. Un comentariu se poate insera oriunde in program undc este legal sa apara un spatiu, un tabulator sau caracterul de rind nou. In general, se recornanda introducerea de comenturii dupa antctul functici,

pe 32 de biti in caz contrar. in cazul in care dorim ca 0 constanta semn mai mid) decit 65536 sa se reprezinte pc 32 de biti, constanta va termina prin una din urrnatoarclc succcsiuni de litcrc:

cstc mai marc dccit (,5515 ~i intrcaga ('art\ respective sc

care
..

sa precizeze:
actiunea

sau actiunile

realizate

de functie;

III In

'" • ..

formate Ie datelor de intrare $1 iesire; algoritmii codificati prin functia respectiva daca sint complccsi;

LU UL
Constantele intregi farn semn pot f utilizate pen tru a cconomisi memorie, Astfel, constantele de tip int din intervalul [32768,65535 J se pastreaza pe 32 de biti, in schimb constantele de tip unsigned din acelasi interval se reprezinta pc 16 biti.
Exemple:
40000u 40000U 4294967295 400001\1 40000\11 400()OLU 40000UL constants idem consranta intrcaga de tip unsigned rcprczcntara idem idem idem idem pc 32 de bi!i inrrcaga de tip unsigned rcprczcntara pc !6 hili

diferite limite impuse datelor de intrare etc.

De asemenea, se pot insera comentarii in corpul functiei unde se considera ca sint necesare unele explicatii. Comentariile trebuie sa fie exprimari clare care sa nu conduca la amibiguitati si sa nu cantina afirmatii eronate.

1.6. Constants
are un tip ~i 0 va/oare. Atit tipul, cit si valoarea, sin! determinate de caracterele care intra in compunerea constantei. Valoarea unci constante nu poate fi schimbata in timpul executiei programului in care a fost utilizata.

o constanta

1.6.1. Constanta tntreql


intregi pot fi scrise in sistemul de numeratie cu baza 8, 10 sau 16. constantd zecimald intreagd este un sir de cifre zecimale care are prima cifra diferita de zero. Constantele zecimale se reprezinta prin complement fata de dol pe 16 bit! sau pe 32 de biti daca I1U incap pe 16 biti. Constantele intregi reprezentate pe 16 biti sint de tip ini, iar cele reprezentate pe 32 biti sint de tip long. In cazul in care noi dorim sa reprezentam 0 constanta zecimala pe 32 de biti, chiar daca ea se poate reprezenta pe 16 biti, constanta respectiva trebuie sa 0 terminam prin L sau I. Constantele

o constanui

octald intreaga cste

succesiune de cifre octalc (0 - 7) prcceduta

Exemple:

de un zero nesemnificativ. 0 astfcl de constants sc pastrcaza pc 16 biti daca acestia ii sint suficienti si pc 32 de biti in caz conrrar. in cazul in care 0 constanta octala se termina prin I sau L, ea se pastreaza pc 32 de biti chiar daca sin! suficicnti 16 biti pentru rcprczcntarca ei. Constantele octalc sint de tip unsigned daca se reprczinta pe 16 biti ~i unsigned long daca se rcprczinta pc 32 de biri. o constauui !rc.w::ccillltllti int reaga cste () succcsiunc de c i Ire hcxazcci rna Ie prcccdata de

I Repre~entare
externa 12345 123456789 12345L

Ox
Reprezentare lnterna in binar
0011000000J J JOO! OOOOOIIIOIOIIOIIIIOOII010()OIOI01

sall
{lV
VL~.

OOOOO()O()()OOOOOOOOOI
zecirnala

IO()(){)OOI11001

In rest, ca arc accleasi proprietari ca 0i 0 constunta octala. Cifrcle hcxazccimalc sc obtin cxtinzind cifrclc zccimale ell liicrelc mari de In A In F:

mici san

o constanta
30

are tipul unsigned daca se termina prin litera U sau u. 0

31

{}cirri.

Litera care rcprcztnt a


hcxazccimalu

Vuluar

a**b ISxCl1Ip!C:

:\'[tll/\

b sau H

c sau C
d
,[1\.1

It) II 12
I.l

Cuns(anla 123. 12.u


.25 7Kc4

11"1:1111,,

Vuluare

c snu " r s.tu F

1,\ 15

Excmple:
Cunstunrn

.11:-3 123.456c2 12H567c-'1 Tipul cunstuntci LII I1gilll I'" rcprczcntarf 1(, bili Ii, bili 32 bit: 16 biti idem 32 bili 32 biti 16 biti 32 hili 32 bili

123 123,7 0,25 7X'IO**4 0,1*10"(-3) 12345,6 O.I2l1567

In 012}

4()OOO
040000 ()123456 123L 01231 Oxl23 Oxa Ib2c3 OXABCFL

de lip ill' constunta octal. de tip /lnsigned coustuuta zccirnala de tip IOllg constanta octala de tip unsigned
consLlllfa I.l'Cilllalil idem consranta zccimala dc tip long octala tic tip long hcxazccirnala tic lip

Constantcle flotante se rcprezinta in dubla precizie (64 biti), Pcnrru a rcprczcnta 0 coustnnta flolanta in simpli\ prccizic estc suficicnt sa tcrminum constanta respective prin litcrujsau F. o COI1SlanUlflotanta tcrrninata prin I sau L se rcprczinta pc 80 de biti ;;i are tipullo/lg double.

constanta unsigned constanta unsigned constanta

1.6.3. Constanta caracter


Prclucrarea datclor eu ajutorul calculatoarclor arc in vcdcrc, printrc altelc, posibilitatea lucrului pe caractcre. in accst scop, caracterclc sc codifica lolosind coduri nurncricc. Cclc mai utilizate coduri sin! codurilc EBCDIC (Extended Binary Coded Decimal Interchange Code) si ASCII (American Standard Code for Information Interchange). La calculatoarclc cornpatibile IBM PC se utilizeaza codul ASCI!. Caractcrclc accstui cod Ie impartim in:

hcxazccimala de tip

/(Jug unsigned

consuutta hcxazccimala de tip


UNsigned

1.6.2. Constante flotante

o constantd flotantd
0

rcprczinta un numar rational. Ea se cornpune din: o parte intreaga care poate f ~i vida;
parte fractionara nu pot care poate fi si vida; toate partilc indicate mai sus. La scrierea unci care poate f si vid. fi vide

caractere negra/ice spatiu

- Codul lor cste in intcrvalul 127 (caracterul DEL).


- Are codul 32. cste in intcrvalul
Cll

[0,31]la

care se adauga si codul

un exponent Evident,

caractere grafice - Codullor fie prezcnta fie partea fractionara, fie


Caractercle

[33,126). formeaza setul de caractere pe care-l

constante
cxponcntul

flotantc
precedat

estc ncccsar

sa

graficc
caracter caractcr

impreuna

spatiul

de parte a intrcaga.

imprimabile. reprczinta. Ea are tipul int.

Partea intreagd este 0 constanta zecimala, Partea fractionara sc compune din caractcrul punct dupa care urmeaza 0 succesiune de cifre zccimale, Succesiunea respcctiva poate f vida 1111111ai in cazu! in care partea rntreaga este prezenta. Exponentul incepe eu litera e mica sau marc, dupa care poate fi prczent un
semn optional (plus sau minus) ~i un sir de cifre zccimale. Exponentul defineste un factor care cxprima 0 putcre a lui 10. in exernplelc de mai jos si in continuare vorn folosi notatia * * pentru opcratia de ridicare la putere. Dcci a la puterea b se va nota prin 32

constanta

arc ca valoare corespunzatoare

codul ASCII unui caracter

al caractcrului

o constanta

irnprimabil

sc rcprczinta

prin caracterul rcspectiv inclus intre caractere apostrof. Exemple:


Constanta 'a' 'A' caructer Valoare 97 65
~-----------I-------------j

I
t
!<

33

,-..-.--Constanta '0'

...•-.•-.-..

---~.----.-(continuare) ... -...


Valoare

La aceste noratii
caractcrele
Constanta curactcr
.--------

aciiHlg<lm ~i

utilizarilc

sccvcnrci

escape pcntru a l"l'prCZl'nta

curacter

backslash,

apostrof
COIIIII ASCII

si ghilimelc:
DCllllmirca caructerului ghilimclc apostrof buckslash

48
32 42

'.'

1····-·-----1·-····-··· ··········----1

'I'"~
'\" 0

o exceptie
'\\'

de la regula de mai sus

reprezinta

caracterclc

apostrof

$i bam

'II'

oblica inversa (backslashy. Astfel, caracterul backs/ash caractere backs lash incluse intre caract ere apostrof: La reprezentarea caracrerului urmat de un caracter apostrof:
\' De aceea, constanta '\If caracter apostrof apostrof

se reprezinta

prin doua

Secventa escape ponte f folosita pcnrru a dcfini constantc caractcr pcntru orice caracter al codului ASCII. Accasta sc realizeaza folosind codul caructcrului rcspectiv. Astfel, constructia:
'\ddel' undc:

se utilizeaza

caracterul

backs lash

se ponte rcprezenta

prin:

- Este

cifra octala.

- Rcprczinta constantn caractcr corcspunzarourc codului ASCII cgal cu valoarca intrcgului octal ddd, Exemple: '\n' ~i'\7' \b' Si \10'

Caracterul backslash
pentru caractere corespunzatoare \t Deci '\t' dcfineste constanta

se poate utiliza pentru a defini constantc caracter si negrafice. Asa de exemplu, pentru a defini constanta caractcr tabulatorului se foloseste notaria cu backs lash:

Rcprczintn acccusi constanta ractcrului BEL.


- Rcprczinra constanta caractcr

caructcr

corcspunzntoarc

ca-

backspace eX din sistcmut zccimal nurnarul lOin sistcmul CLI baza opt).

corcspunz.uoarc
,c'

caractcrului
rcprL'zillta

prin

caracter

tabulator

orizontal.Ea

arc valoarea

9,

Sc obscrva prin: automat

In mod analog, constanta


'\n'

caractcr rind nou (1IL'\vliIlC)

sc rcprczinta

S:I ric prccl'dalc'

in cadrul unci sccvcnic escape nurncrelc octalc nu rnai trcbuic ncscmnificativ. III :ll'l'St l':l1 1111111;11111 Sl' ("tIIISIlIl'I;\ in sisrcmul ClI bazn ~\.
ell dl' 1111 Il'lP

Ea are valoarea 10. Se obisnuieste sa se spuna ca backs lash introduce 0 secvcnta escape. Mai jos se indica reprezcntarea unor eonstantc cameter prin sccvente escape.
curacter --

'\"' ~i '\42'

Rcprezinta ghilimclc.

constnnta

caracter

care

corcspundc

caractcrului

c",,';,"
'la'
'\b' V 'In' 'Iv' V
'\r'

\ - Cudul

Utiliznrc Denumlrcn ASCII cnructerului -----f------------j--.-----------------.-. activate sunct 7 BEL 8 13S rcvcnirc ell till spat in (nal'l(SIHj{~[') 9 lIT tabulator orizolltal 10 LF rind nou (Line Feed) tabulator vertical II VT salt de pagina la imprimanta 12 ff (Form Feed) CR rctur de car - pozitioncaza 13 cursorul ill coloana I din rindul curcnt (Carriage Return)

La calculatoarclc cornpatibilc IBM PC sc uiilizcza un cod ASCI! cxtins. Acosta continc 256 de coduri care sint valori in intervaluIIO.2551. Coclurilc din intcrvalul 10, I n I (,()l"l'sp\IIHI (.':II:I('I"l"l'I')1 l'odldlli I\S( 'II obisnuir, iar cell' din intcrvalul 1121:\,2551 corcspund unor caructcrc calc all <l
utilizare spcciala. Consramclc caractcr corcspunzatnarc caructcrclor de cod ASCII din lnln· valul ! 121:\}'i5! Sl' dcfilll'SC prin sccvcnu: escape III care sc indica codu I ;lccslur:1. De cxemplu, constanta caractcr

'\177'
corcspundc maxim. caractcrului cafe arc codul ;\SClJ cga! cu 255, adica codul ;\SCII

34

COIIslalllcic

() C(lllstanl;IC;lJ'aclcr cstc de tip iI/I. ca sc pastrc:tZ:1 pc 16 hili, Pcntru c.u.rctcr 111;11muri declt 127, sc PUIlC problema cxtcusici scrnnului. i'rognllnat()nli ponte opt;1 pcnuu constuntc c.uactcr ell SCl1l11 sau nlrii scmn. Pcntru a role,s I III mod implicit coustantc curactcr Iara scrnn sc va alcgc, in mcdiul integral dc tk/v\llt<lrc Turbo C S<11I Turbo ('I I. altcruutiva Unsigni«! Characters in submcuiul ('ode Generation al submcuiului C0I11{)i/e din mcniul Options. fko;IITCC

1, deoarcce

sirul se terrnina totdeauna

prin caracterul

NUL

Observatii:
L Fie sirul "a\lb"

1.6.4.
()

sn de

caractere
Ik
IL'iO S;1l1 Iliai

SIICl'L'SllInr

multc

car;ll'll'I'e

iuclusc

iutrc

ghilimclc

I<JrI11eaZa 0 C()llstallt<l xir sau un sir de caractcrc.

Acest sir are in compunerea sa: caractcrul a de cod ASCII 97; - caracterul SOIl de cod ASCn 1; caracterul b de cod ASCII 98; curactcrul NUL de cod i\SCII 0, Daca in locul sirului de mai sus sc doreste un sir in care b sa tie inlocuit prin
caracterul 3, atunci scrierea: "a\13"

La scricrca
sccvcntc esc;ljK',

caractcrclor

din cornpuncrca

unui sir de caractere

se pot utiliza

Exemplc:
"Accstu cxrc
1I11

sir de carnctcrc"

"Prill sec\'Cllla cscupc \" s'-~rcprczinta ghililllckle" "Prill sccvcnta escape \\ sc rcprczintn backslnsh" "Apostrolul sc rcprczinta obisnuit'' "s'a" "a ltcvtsccvcn te\1 cscapcxnint r-u n sir" 2,

nu este corecta. lntr-adevar, acest sir are in compunerea sa: caracterul a de cod ASCII 97; - caractcrul VT de cod ASCn 11; - caractcrul NUL de cod ASCI! O. Pentru a rcprezenta caracteru13 in acest caz, va fi nevoie de inca 0 secventa escape. Secventa escape pentru caracterul 3 este \63, deci sirul de caractere rcspectiv se scrie astfel: "a\1 \63" backslash.
in

Lin :;;ir poale fi continuat


accst scnp sc tasteaDI
rindul urrnator (uctionind

pc rindul

Ul'mCltor

folosind caractcrul

back slush la sfir:;;itul rindului care sc continua, sc trccc pe tustn Enter) ~i SL' continua cu tastarca caracterclor pe backslash sc va concatcna cu pril11111caructcr de pe

suului rcspccriv. Curactcrul


nndul urmaior.

care precede

Sirul de caractere "\1751 " are in compunerea sa: caracterul ) de cod ASCII 125 (175 in octal); - caracterul l de cod ASCII 49; - caracterul NUL de cod ASCII O.

EI poate fi scris mal simplu astfel:


"} 1"

Caractcrc lc UIlU i :;;i r de caracrcrc sc pastreaza in mcmoric i ntr-o zona contigua, prin codurilc lor ASCII, DlIP,1 ultimul caractcr al sirului se pastrcaza caractcrul Ntll., adieu valoarca zero, Acosta joacu rolul de marcaj de sflrsit al oricarui 0ir de caractcrc, Din cuuza accstui marcaj, trcbuic sii faccrn distinctie intrc 0 constnutn cuructcr care corcspundc unui caractcr ~i sirul dc curactcrc care cstc format din acclas: caractcr. Astfcl. constanta caractcr 'A' sc pasircaza
in mcmoric

3.

Caracterul

NUL nu poate fi utilizat decit la sfirsitul unui sir de caractere.


un sir de caractere totdeauna se termina la aparitia

Aceasta, deoarece caracterului NUL.

1.7. Caractere sau spatii albe (white spaces)


In cele ce urmcaza, urmatoarele caractere: prin caracter sau spatiu alb vom intelegc unul din

intr-un

octet prin vuloarcu 65, pc cind sind de cuructcrc

ocupa 0 zona de doi ocreti: in primul octet sc pastrcaza valoarca 65, iar in al doilea caractcrul NUL, adica valoarca zero. in concluzic, un sir de curacterc sc p"stn:aza ill mcmoric intr-o succesiunc de octcii al cnrui numar cstc egal cu numarul caructcrclor sirului rcspectiv marit ell

spatiu (' ');


tabulator orizontal

('\t');
('\n').

caracterul de rind nou (newline)

37

Mentionarn c~ setul caracterelor albe difera pentru diferite implementari ale limbajului C. Setul de caractere indicat mai sus este un set minimal comun tuturor implementarilor, Amintirn ca un comentariu poate fi inserat intr-un program, oriunde este legal sa apara un spatiu alb.

Valoarea inferioara a indieilor estc egala cu zero. De excmplu, daca vect cste un rablou unidimensional de 10 clemente, atunci ne refcrim la clcmcmele lui ell ajutorul variabilelor eu indici:
VCCI[O] vcctj l] vcct[9] primul
al doilca ultimul

clement
clement clement

1.8. Variablle simple, tablouri ~i structuri


Intr-un program utilizam alaturi de date constantc si date variabile care isi schimba valorile in timpul executiei programului.· . Daca la 0 data constanta ne putem referi folosind caracterele din compunerea ei, la 0 data variabila trebuie sa ne referim altfel. Cel mai simplu mod este acela de a denumi data respectiva. Numcle datei ne pcrmire accesul la valoarca ci, precum ~i schimbarea valorii daca este necesar. ln cazul in care 0 data nu are legaturi cu alte date (de exernplu de ordine), vom spune ca ea este 0 data izolatd. Numelc unci date izolate se spune ca

Daca mat este un tablou bidimensional care dcfincste 0 matrice de 3 linii a 2 coloane fiecare, atunci clementele acestui rablou pot fi referite prin:
111"1101[0]matlu]] II mat] I HOI mati III II mat[2J[01m<lI[2H II clcmcntclc
clcmcntclc clcmcntclc

prunci linii
cclci de a doua linii cclci de a Ircia Iinii

reprezinta

variabild simpld.

Unci date izolate ii corespunde un tip. In cursul executiei prograrnului se pot schirnba valorile unci date variabile dar nu si tipul ei. Corespondenta dintre numele unei date variabile $i tipul ei se defineste

printr-o declaratie.

Adesea, intr-un program cste util sa considcram grupe de date. Gruparca datelor se poate face in mai multe moduri. Un mod simplu de a gmpa date este accla de a considcra date de acelasi tip, in asa fel incit grupa respectiva sa formeze 0 multime ordonatd de clemente la care sa ne putem referi folosind indici. 0 astfel de grupa se spune ca formeaza un tablou. Unui tablou i se da un nume. Tipul comun al elementelor unui tab lou este si tipul tabloului respectiv. De exemplu, 0 multime ordonata de intregi rcprezinta un tablou de tip intreg. In cazul in care elernenrele care se grupeaza intr-un tab lou sint clc insole tablouri, vom avea nevoie de mai multi indici, pentru a nc referi la ele. In cnzul in care se utilizeaza un singur indice pentru a ne referi la elcmentele tabloului, spunem ca tabloul este unidimensional. Daca se folosesc n indici, se spline ca tabloul este n-dimensional. Exemple simple de tablouri unidirnensionale sint vectorii care au componente de acelasi tip. Asa de exemplu, un vector de componente intregi este un tab lou unidimensional de tip intreg. matrice de clemente intregi este un exernplu de tab lou bidimensional de lip

Un alt mod de a grupa date arc in vcdcrc prczcnta unor rclatii intrc datclc care sc grupcaza. In nccst eaz darclc care sc grupcaza sc spline ca formcaza 0 structurd. Elc nu ncaparat au lin acelasi tip. Prin structurd intclcgem 0 multimc ordonata de clemente "inruditc'', ordonare definite de utilizator in vcderca simpli Iicarii utilizarii grupei de date respective, Unei structuri i sc ataseaza un /II line. De aserncnea, se atascaza cite un numc fiec are i componente ale unei structuri, 1111me care sc utilizcaza la rcfcrirca componcntclor respective. Un exemplu simplu de structura cstc data calcndaristica. Aceasta cstc 0 grupa care sc cornpunc din rrci datc inruditc: - zi;

luna;
an.

intreg,
Referirea la elementele unui tablou se face printr-o variabild cu indici. variabila cu indici se compune din numele tabloului urmat de valorile indicilor, fiecare indice fiind reprezentat printr-o expresie inclusa intre paranteze patrate,

Aceste trei date nu ncaparat au toate trei acclasi tip. De excmplu, ziua si anul pot fi de tip intreg (illl), iar luna ponte fi de tip nenumeric daca en sc rcprczinia prin denumire. Un alt exemplu sirnplu de structura il rcprczinta numcrclc cornplcxc. Un nnmar complex cstc (l multiruc on!(lnata de doua uumcrc, Iiccnrc de lip dOIlN". Primul numar rcprczinta partca rcala a numarului complex, iar eel de aJ doilca, partea lui imaginara. Structura, ca si variabilcle simple ~i tablouri!e, corespundc ?i ea unui tip de: data, Tipul unci structuri nu arc nimic comun cu tipurile compouentclor sale. Ea estc un tip nou, diferit de ccle prcdcfinire in limbaj. Un astfcl de tip se spunc ca este un lip definit de utilizator sau mai scurt tip utilizator. De cxcmplu, data calcndaristica dcfinita mai sus rcprcz inta un tip nou de date, difcrit de cell' prcdcfinitc. De nsemcnca, nurncrc!c cornplcxc rcprczcntatc prin structuri de perechi de numcrc flotanrc in dubla prccizic, dcfincsc tipul complex. Tipurilc utilizator sc dcfincsc printr-o dcclorati« care, a~a cum VOIll vcdca ulterior, a sufcrit mni multc modiiicari. Tot printr-o dcclar.uic se siabilcstc legarura dintre numcle IIDe:i date structurale ~itipul ci. 39

38

in general, prin trp iniclcgcm o multimc de date unprcuna ell opcrutiilc care Ii cfcctuatc cu d.uclc respective. De cxcmplu, tipul ill! SC dcfincstc prin multimca numcrclor intrcgi din intcrvalul 1-3276:),327671 rcprczcntatc prin complement fati\ de cloi pc 16 biti. Asupra uccstor date suit definite 0 sene de opcrutii, CUIll ar Ii cclc 4 opcratii
pot

i,

Prill i lie rcfcrim la valoarca continuta in zona de mcmoric alocata vuriubilci Dc asemenea, tot prin intcrrnediul lui i putem atribui sau modifica valoarea din zona de rnemorie alocata variabilei i.
char c;

2.

aritmcticc, opcr.uii de comparatic etc, In cazul tipurilor prcdcfinitc xint prcdcfinitc atit multimca ~i rcprczcntarca datclor t ipului rcspccriv, cit ~j opcrutiilc Cli accsic date. ill cazul tipurilor uiilizutor sc dclincsc de catre utilizaror, mulumca ~i

Variabila c este 0 variabila simpla de tip char. Ei i se aloca 0 zona de mcmoric de un octet (8 biti), in accasta zona putcm pastra un caracter al codului ASCII cxtius, prin codul lui. Prin C nc putem refcri lu caractcrul respcctiv. 3.
long double x;

rcprczcutarcu datclor tipului rcspcciiv prin intcnncdiul construciici struct. Urilizutorul dcfincstc opcratiilc ClI accstc date prin intcrmcdiul unor tuncjii. De cxcmplu, ill cazul tipului complex 5C dcfinestc reprczeutarca numerelor complexe prinu-o constructic .1'/1'11('/. Opcnuiilc ell numcrclc complcxc s.e pol rcaliza
apclind Iunctii corcspunzatoarc. Tipurilc utilizator pot fi definite ca mai sus prin iutcrmcdiul Iacilitatilor cxistcnte in limbajul C. Un ncajuns al tipurilor utilizator definite in lirnbajul C

Variabila X este 0 variabila simpla de tip long double. Ei i se aloca 0 zona de memorie de 10 octeti in care se pastreaza 0 valoare flotanta.

1.10. Declaratla detablou


Un tablou, ca oriee variabila simp la, trcbuie declarat inainte de a fi utilizat, Dcclarutia de tablou, in forma cea mai simpla, coniine tipul comun clcmcntclor sale, nutnele tabloului ~i limitele superioare pentru fiecare indice, incluse intre parantczc patratc: tip numeilitn I Illim21 ... Ilimn];
unde: lip lim i

cstc Iaptul ca uu sc stabilcstc nici () icg<ltura intrc rcprczcnturca tipului si Iunctiilc care dcfincsc operatiilc cu datclc respective, Acest ncajuns a Iost inlaturat ill C++ prin inrroduccrca notiunii de clasa. Tipurilc definite prin inrcrmcdiul clasclor se numcsc tipur! abstract: de date, ln cazul unui tip abstract de dale sc asigura lcgatura dintrc rcprczcntarilc datclor ;;i functiile care dcfinesc opcratiilc asupra lor. Ca rczultat al accstei lcgaturi sc obtinc protcciia datclor, urilizatorul ncnvind acccs direct la clc dccit numai prin intcrmcdiul functiilor definite ill accst scop. Construciia .1'11'11('/, prccum ~i dcfinirca clasclor sc VOl' prczcnta mai tirziu.

- Estc un cuvint chcic pcntru tipurile predefinite. - Este limita superioara a indicelui al i-lea; aceasta inscamna ca indicele al i-lea poate avea valorile: 0, I ,2,... .limi-I

1.9. Dcclaratia de variabila simpla


in'limba_lld C nu cxista dcclaratii implicite. Accasia inscamna ca once variabila inaiulc de a Ii utilizata trebuie dcclarutu. Dcclaratia unci variabilc simple stabilcste lcgaturu dintrc numclc variabilei si tipul valorilor pe care Ie ponte avea variabila rcspcctiva. ln cca m.u sunplu 111I1lla, () dcclurauc de vurinbiln simpi'l are Iormntul: tip
fiS!il_.dc_llllIllC;

in calitatc de tip putcm Colosi cuvintclc cheic ale tipurilor prcdefinitc.


se compunc separate prin virgule.
Us!u_dc_lIl/11/c

dintr-un

numc de variabila

sunpla sal! mai multc

limi (i= 1,2, .. .,») sin! expresii constante. Prin expresie constanta 0 expresie care po ate fi evaluate la compilare in momentul intilnirii ei de catrc cornpilator. in paragraful precedent am VaZU! ca la clcmentele unui tab lou ne putcm refcri folosind variabile cu indici, in limbajul C, numclc uuui tab lou este un sirnbol care are ca valcarc udrcsa prirnului Salt clement. La intilnirea unci declaratii de tablou, compilatorul aloca 0 zona de rncmorie ncccsara pentru a pastra valorile clernentclor sale. Numcle tabloului rcspectiv ponte f utilizat in difcritc expresii ~i valoarca lui estc chiar adrcsa de inceput a zonci de mcmoric care i-a lost alocata.
intelegcm

Limitele

Exemple:
1.
int
i,j;

Exemple:
alOGI pcntru I.
int vect[lO];

Variabilclc i ~ij sint variabilc simple de tip int. Compilatorul Iiccarc () /()JW (iL' mcmoric til' 1(, hili, 40

Dcclaratia

de I~l!~\ defincstc

labloul

vect

de 10 clemente ;;i cl arc tipul int, 41

Pentru acest tab lou se aloca 10*2=20 octcti. vee! cste un simbol a carui valoarc cste adrcsa primului stili clement, adica adrcsu lui vcctj G], Dcci vcctjtl] arc en valoarc valoarca primului clement :II tabloului, iar veer arc ca vuloare adrcsa ucestui clement, 2.
char tab(lOO];

a - de tip IOl1g;
b - de lip int;

(' - de lip La

/llIsiglli'd

!'clUlllca!.:! 0

valoarc til'

lip

rlouhlc.
0

o funciic
undc:
IlIllJ1C

ponte fi apclata folosind metri IOJ'_.c/i'ct i vi)

constructic

de forma:

Tabloul tab este un tab lou unidimensional de tip char, care arc 100 de clemente. I se aloca 100 de octeti ~itab arc ca valoarc adrcsa clcmcntului
tab[O].

1111me(1 ista .Pt! ret

3.

double

dmatllOJ [50J;

- Estc nurnclc Iunctici care se apclcaza.


- Esic lie vida daca lunctia din unul sau mai multi
IlU

Tabloul dmat este un tablou bidimensional


rnatrice de 10 linii a 50 de coloane fiecare.

de tip double. El rcprezinra 0


Cornpilatorul rczerva pcntru

lis/a

acest tablou
10*50*8=40000cte!i. La elementele acestui tablou ne referim prin: dmat[O][O] dmat[O][1 j dmat[O][49] drnat] III OJ dmat] 1][ l) drnat] 1][ 49] dmat[9HO] dmat[9][ l ] ...dmat[9][49] dmat are ca valoarc adrcsa elcrncntului dmat[O]fO].

parametrilor ('(eeti)'i

arc paramcrri, lie sc cornpunc paramctri «[ectivi scparati prin cxprcsic. cu cci Iormali prin ordinc ~i

virgule.
Un paramctru - Puramctri lip. clcctiv cstc
0

cfectivi

sc corcspund

1.11. Apelui ~i prototipui functiilor


definitic ~i1I11111 snu mai multc upcluri, Am vazut mai sus ca 0 funcrie se dcfinestc prin antet urmat de corpul ei, Antetul, de obicci, are formatul: lutr-un program
0

La apcl sc atribuic paramctrilor formali valorile paramctrilor cfcciivi ~i apni cxccuiia sc continua ClI prima insiructiunc dill corpul Iunctici apclatc, La revcnirea din functic sc ajungc ill funciia din care s-a Iacut apclul ~i cxccutia continua cu construcria unnatoarc apclului. Pcntru a apcla 0 Iunctic putcrn utiliza constructia de mai sus urrnata de
caractcrul PUIlCt ~i virgula. alU\ posibilirutc cstc accca de a f'olosi c()nstl'llqia de Illai sus drcpt operand al unci cxprcsii Un astfi:1 de ape I cxlc posibil numa: pcutru tuncriil« can: rcturncaza 0 valoarc la rcvcnirca din clc. ill aces: caz valoarca rcturnatarlc fuuctie se foloscstc la cvaluarca exprcsici din care s-a facut ape luI. Un pararnctru cfectiv de la upclul unci lunctii ponte Ii numclc unui tablou. In accst caz, in antctul Iunctici respective pararnctrul corcspunzaior il vorn declara ca Iiind tablou. De cxcmplu, tlae;'1 tal, cstc un Iahlou unidimensional dcrlarat ca mai jos:

Iunctie poate avca

tip numetlista

dcclaratiilor

parametrilorformali)

Lista dcclarariilor pararnetrilor forrnali este fie vida, fie contine 0 dcclaratic de parametru formal sau mai multe separate prin virgule. Mentionam ell dcclaratiile parametrilor forma li "nate intr-o lista de felul cclci de sus, I1U sc termina prin punct si virgula ca cele pentru variabile simple si tablouri,

int tab! 1001; tii tab se foloscstc la apclul Iunctici [: f(tab); atunci functiarurc void f(illt xllOOj)
Mcurion.uu en, Iimit» supcrio.iru
Ill! !;>I pal':llllezclc

Exemple: I.
int flint x,double y)

Functiajare X de tip
~l

doi parametri:
in!

antcrul:
1(1) JloalL' fi olllis,l la dl'l:lar;lrl':1

y de lip double. Functia returncaza


2.
double

paral1lClrll· IHlalL' aVL'a

valoarc de tip int .


c)

lui Iunual .I, dar unnatorul antct: void I(in: xl l)

p.uratc.

Ikcl

ilCel'a~1

Iuncuc

df Ilong a, int b, unsigned

Functia dj'are trei parametri:

in cazul paramctrilor 42

Iormali

care sin! tahlouri

ell mai ruultc

dimcnsiuni,

43

numai limita primului

iudice ponte 1'i ornisa.

2.

double

a(void);

Functia

(/ nu are paramctri.

Ea retumeaza

valoare

flotanta

in dubla

prccizie. 3.
duuble II'd!:[·II[i I;

void clint

x,long

y[) ,double

z);

~i apclul
Let
(rn'::1

t );

Functia C IlU rcturncaza nici 0 valoare, Are trei pararnetri: - primul estc de tip int; - al doilea cste un tablou unidimensional de tip long; al treilea este de tip double.

4.
void
Let ( ciou b.l.«: m.r t, [ I [.i III)

V!lirl

c(inl".,

lonqll,r:1o(lbl,,);
CU

Acest prototip cxprima acclasi lucru


ill prcalabil

eel precedent.

o Iunctic ponte II apclata intr-un punct al unui fisicr sursa daca


I(lst dcfinitu Excmplu:
v() i d

ill acclusi

fisicr surs«.

fl I "n i d)

II (ic-lin;lil1

Iunctici

1'1

/* sc apclcuza

functia

fl. ea (sic ill prcalabi 1 dcfinira

*I

rt 0;

/vpclurtlc lunctic: Ill! pot II prcccdatc totdcauna de dcfiniria ei. In astfcl de cazun dcfinitia lunctici apclatc cstc inlocuita printr-un a~a numit prototip al ci.
Prototipul unci lunctii are un format

Cornpilatorul utilizcaza datelc din prototip pcntru a veri fica tipurile paramctrilor de la apcl (paramctri cfcctivi). In cazul in care un pararnctru .efcctiv arc un tip difcrit de tipul corespunzator din prototip, compilatorul C ccnverteste automat valoarea parametrului efectiv spre tipul indicat in prototip. Utilizatorii lirnbajclor C ;;i C++ pot folosi 0 scric de functii aflatc in hibliotccilc standard ale accstor limbajc, Apclul unci luuctii de bibliotcca irnplica si el prezenta prealabila a prototipului Iunctiei respective in tcxtul sursa. Pentru a simplifica inserarea in textul sursa a prototipurilor functiilor de biblioteca, s-au construit Iisicrc cu astfcl de prototipuri. Ele au extcnsia .h (header). Un astfcl de fisier continc prototipuri pcntru functii de bibliotcca "inruditc''. De cxcrnplu, fisierul stdio.h contine prototipuri pentru functiile de biblioteca utilizate frecvent in operatii de intrare/iesirc, fisicrul string.h contine prototipurile pcntru functiile utilizate la prelucrarea sirurilor de caracterc etc. Mcntionarn ca rnediile integrate de dezvoltare Turbo C si Cs+ permit utilizatorului 5~1gaseasca prototipurile functiilor de biblioteca. in aces! scop se

procedcaza astfel:
• • • se tasteaza informatii; numele pe functiei
0

rcprczinta

informauc

pcutru cornpilator
de functic;

ascmanator cu privire la:

ell

untctul

ei. Accsta

pentru

care

se doreste

sa

se gaseasca

tipul vulorii rcturuatc

se fixcaza cursorul

litera arbitrara

a I1UI11l!lui Iunctiei;

• cxistcuta 0i tipurilc paramctrilor functici, Accstc informatii sint prczcutc in antctclc Iuuctiilor. De accca, lin prototip al
unci Iunctii poutc Ii scris ca ~i antctul Iunciici respective, dupu care sc punc punct

se tasteaza <CTRL>-Fl.

::;i virgula. Exista si 0 forma prcscurtata ornitc nurnclc paramctrilor:


iiI) 11lI1IIC!

pcntru prototip ~i anume accea in care se


li):

Se obtine prototipul functici, precurn si fisierul cu extcnsia .11 care-I contine. De asemenea, se afiseaza si alte iuformatii in lcgatura cu functia respectiva, utile pentru apelurile ei.

I is/a tipinilcn' para

III

ctriiorfornia

1.12. Preprocesare
~i care nu
Un program sursa C sau c++ poate fi prelucrat inainte de a fi supus compilarii. 0 astfel de prelucrare se numeste preprocesare, Ea este realizata automat inaintea cornpilarii. Preproccsarea consta, in principiu, in substitutii, Preproccsarca asigura:

Excmple:

I.

v o i d f (vo i d) ;

Prototipul rcturncaza

de fa\~r indica faptul ea(cste nici 0 valoarc,

functie fara pararnetri

44

45

.. .. ..

includeri definitii cornpilare

de fisiere cu texte sursa;


si apeluri de macrouri; conditionata.

prototipurilc pcntru () serie de functii cc rcalizc;ml opcr,qii de intrarc/icsirc. include Iolosind consrructia:
Ilinclude <sLdio.h>

EI sc

Preprocesarea se realizeaza prin prelucrarea unor informutii spccifice care au ca prim caraeter caracterul diez (#). In paragraful de fat a vom aborda constructia tiinclude si partial constructia #dejine utilizata la substituiri de succesiuni de caractere. Ulterior se vor descrie si

Exemple:

I. 2.

.include

·fi31.cpp· curcnt.

Sc include tcxtul fisicrului lis lcpp ana! in dircctorul


linclude

alte facilitati oferite de preprocesarc,

1.12.1. lncluderi de fisiere cu texte sursa


Un fisier cu text sursa

csic prczenta calca fisicrului lis2.c. Sc obscrva ca pcntru a dcscric calca, caractcrul bnckslash sc dublcaza conform convcntici de rcprczcntarc a caractcrului backslash intr-un sir de caractcre. constructiei

in accst cxcmplu

·c:\\tc\\surs5\\fis).c·

Aceasta constructie
sau

poate fi inclus eu ajutorul arc until din urrnatoarelc formate:

#include.

#include "specificator _de _ji"ier" #include <specificator _de _ji.~·ier> undc: specificator _de_ji,~ier - Depinde de sistemul de operate. EI dcfincstc un fisier Cll text SUfs!! pastrat pe disc. In faza de prcproccsare, tcxtul fisicrului rcspectiv sc substituic constructici ilincludc. In Iclul acosta icxtul tl~ierlllili rcspcctiv ia parte la compilurc tmprcuna cu tcxtul in care a fost inclus.

Un text inscrat cu ajutorul construcrici #inclllde la rindul S[IU ponte contine constructii Ilincludc pcntru altc Iisierc. Constructiile #includc sc scriu, de obicei, la inccputul fisierelor sursa, pcntru
ca tcxtclc inseratc sfl fie valabilc in tot fisicrul sursa care sc cornpilcaza.

1.12.2. Substituiri de succeslunl de caractere la preprocesare


Constructia tidcfin« sc poatc folosi la substiuuii accst scop sc utilizcaza Iormatul: de succcsiuni de caructcrc,

in

IIdtf1ut'
undc:
III/III{'

1111111('

sucicsiutu-

dc cunntcn:

1n cazul sisternului de operate DOS, spccificatorul de fisicr trcbuie sa lic un nume de fisier impreuna ClI cxtcnsia lui (.C pentru compilatorul C, .CPP pentru compilatorul C-H-, .H pentru fisiere de tip header (fisicre cu prototipuri ctc.). Dc ascmcnca, in afara de nurnclc ~i cxtcnsia fisicrului, spccificarorul de fi~il'l' pOlite

Fslc prcccdat

~i unn.u de eel pupn lin spalill.

lolosind

1/Il(,_dc_caraCII'I'C

contine ~i0 "calc", duca este ncccsar, pentru localizarca Iisierului. Diferenta dintre cele dOU[1 formate consta in modul de cautare al fisierului de
inclus.

Formatul eu parantczele unghiularc <...> se utilizeaza la ineludereaF>'icrelllr standard, cum sint cele care comin prototipuri pentru functiile de bibliotcca, Directoarele in care se caura aceste fisiere sc dcfincsc in prcalabil Cll ajutorul submeniului Directories al mcniului Options din mcdiul integral de dczvolturc Turbo C sau Turbo C~-I-. Ordinea de cautare in aceste dircctoare corespunde cu ordinea in care au fost definite acestc directoare. In cazul in care fisierul cautat nu este gasit in aceste directoare, sc cia un mcsaj de eroarc. In cazul in care se utilizeaza caracterele ghilimele, fisicrul se cauta in directorul curent sau conform "caii" dad aceasta este prezenta. Un fisier standard care se include frecvcnt cstc fisierul stdio.h care contine

respective, c.uucutariu. Numclc dcfinit printr-o coustrucuc tide/iI/£' substituindu-se prin sccventa de caractcre corcspunzntourc IlU mai csrc prezent hi cornpilare. De ubirci, un astkl de uumc sc scric 1'I1 lucre 111:11'1cutru a sco.uc 111L'vidcn\:1 p Iaptul ca cl cstc dcfiuit priutr-o construcn« !lrlc/illc. Succcsiune _de_came/ere inccpc cu prirnul caractcr care nu este alb. Ea poare fi continuata pc mui mulic linii tcrminind rindul care dorim sil sc continue cu backs lash. #de/inc cstc folosita frccvcnt pcnrru :1dcfini consranrc, De accca, uncori un numc dcfinit priutr-o consuuctic Ildl'line sc spunc ca cstc 0 coustanta sirnbolico, () construcric itdcfin« :tlltori,',l';tz:I slIhstilll\ia pc carl' () dcfincstc dill pUIIl'11I1 ill care en esrc scris;l 0i pinn 1;1 sfirsitul li~ierllllli In care ca csic scrisa S:IU pina la intilnirca unci construcrii IIlIllde(Glre 0 anulcaza. Accasia arc formatul:

<lcc;!sta constructic, prcproccsarc.: substit uic 1111111(' ell .\'11('('('.1'/peste lot in tcxtul sursu care urrncaza constructici #deCll1e cxccptind cazul cind 1111111(' aparL~ intr-un sir de carnctcrc S~\\I intr-un

46

47

#under

doubI.o
1/11/11(, y=A;

y; devine y='3.5;

La intilniroa ci. sc dczactivcaza substituirca lui I1UIllC Cll succcsiunca de caractcrc care i-a ro'st atasuta in prcalabil printr-o constructic fide/Inc, Succcsiuuca de carucicrc dintr-o constructic !file/ille poatc continc 1l1ll11C care au Cost definite 111 prculahil prin alte consuuctii tidefine.

II instructiunca

in excmplelc de mai sus A cste 0 constanta sirnbolica. Ea estc un nurnc atribuit unci constante, nUI11C care insa nu mai este prezent in faza de compilarc,

Excmple:
I,
'Idef:;ne A 100 I~ !\ sc suhstituc prin jOn inccpind din accst PUilcl al fisicrului Hdef ine Udefine char double FI\CT 20 DIMI1AX (A'FACTI

B dcfincste
el. Constantclc

cxpresic constanta,
simbolicc

care cste evaluata de cornpilator la intilnirca


frecvent in locul constantelor Este obisnuite
I11Ult

sc utilizeaza

sursa *!

deoarece ele prezinta urmatoarele avantaje:


.. Permite sugestiv

sa se atribuie nume sa folosim constanta


PI 3.14159 ei.

sugestivc unor eonstante. simbolica PI definita prin:

mai

#definc decit valoarea ..

tabIDnl~lAXJ; matlA) [FACTI;

Dupa prcproccsurc
char double r.ab ] (10()*20) matllOO]

sc obtiu dcclaraiiilc:
..
J;

Permite realizarca de prescurtari. De exemplu, daca valoarca 3.14159 sc foloseste de mai multe ori in program, atunci cste mai simplu sa folosim numclc PI atribuit ci. Permite inlocuirea simpla a unci constante printr-o alta. Daca
0

constanta

[20J;

DIMMAX

s-a substituit

prin (I 00*20) ~;illU prin valoarcu 2000 a produsului

dcoarcce prcproccsorul IlU race calcule ci numai substitutii, Din accusta cauza sc rccomanda en cxprcsiilc utilizutc in constructiile #del1ne sa fie inclusc in parantczc rotundc, 2.
IIdetine "define

se foloseste de mai multe ori intr-un program si ulterior se constata cii va loa rca ei trebuie schirnbata (de cxemplu este 0 constanta flotanta careia trebuie sa-i schimbam precizia), atunci este rnult mai sirnplu sa-i schimbam valoarea 0 singura data in constructia itdefine, dccit sit 0 cautam peste tot in program ~i sa-i schimbam valoarea in mod
corespunzator,

A 123
B A+120

x > 3 * 13;

II sc substituc prin x=J *12,\+ 120:

3.

IideEine "define

A 123
B (A+120)

x= 3 * B;

II sc substituc prin x=3*( 123+120);

4.
Ifdefine A 100

i nt, x [A+ 1J;


Ilundef Ifde fine

II dcclaratia

devine int x] l 00+ 1];

A A 3, 5

4P>

49

2. INTRARI/IESIRI STANDARD .
Prin intrari/ieslri iutclegcm un set de operarii care permit schimbul de date intre un program ~iun periferic. in general, operatia de introduccre a datclor de In un pcriferic sc numeste citire, iar cea de icsire pc uu pcrifcric scrierc. Numim terminal standard terminalul de la care s-a lansat programul. De obicci, tcrminalclc standard sin! de tip display. in accst caz operatia de scricrc sc mai numeste si afisare. Limbajul C· nu dispune de instructiuni specifice pentru operariile de intrare/iesire. Ell' pot f realizate apelind functii construite special pcntru acest scop. Astfel de functii exista in biblioteca limbajului C. Opcratiilc de intrarc/iesire realizate prin intermediul functiilor de biblioteca le numim operatii de intrare/iesire standard. Utilizato;'ul poate el insusi sa construiasca astfcl de functii, in cazul in care nu sint utilizabile ccle standard existente. Functiile de biblioteca, utilizate mai frecvent pentru realizarea operatiilor dc intrare/iesire folosind terminalul standard sint: - pentru intrari: getch; gelche, gets ~iscan]; pentru iesiri: putch, puts ~i rint/ p La acestca mai adaugarn macrourile: getchar pcntru intrari;
;;1

Functia gctchc cstc nnaloga ell tunciia g('/c/i, ell sint~ura dikn:nta C:I C;} realizeaza citircu eli ccou a caractcrului tasuu. Accasia inscamna ell Sl~ ati~~::aza automat pc ecranul terminalului caracicrul tusrat. Ambclc functii 1111 {{II parametri 0i sc pot upcla GI opcranzi III cxprcsii. La apclarca lor sc vizll:tiizcazilji:J"('(/slra utilizutor ~i sc a~tcapta tastarca unui caracter. Programul continua dupa tasrarca caractcrului, Un apcl de forma:
getchO; in cazul in care dorim sa vizualizarn Icrcastra uulizator s: sa blocam pentru a analiza conrinutul curcnt al ecranului. Pcntru a dcbloca se actioncaza 0 tasra corcspunzatoarc unui caractcr til codului ASCII. Caracterul rcspectiv se citcsrc fara CC()U si apoi sc continua cxccutia programului. Functiile gelcli)i gclc/w:tu protoiipurilc in fisicml conio.li, deci utilizarca lor implica includerea accsru i fisicr. se utilizcaza

programul prograrnul

2.2. Functia putch


parametru

FUIlqiaplltc/t aji~caz;"t un caractcr pc ccranul tcrminalului standard. care detcrrninn imagines afi~ata la terminal. Functia putch poatc Ii apclata ustlc]:

Ea arc un

pntch(expresic); Prin accst apcl se ,di0eil/;1 imaginca ddillit<l de Vall);ll"l'iI par.uuctrului cxprcsie. Valoarca puramctrului sc intcrprctcaza ca liind codul ASCII al caracrcrului care se aii(;cazil. Daca valoarea cxpresiei se anil in intcrvalul [32.126\, atunci sc afiscaza un caracter imprimabil a! codului ASCII. Daca valoarca rcspcciiva csrc 111 afara accstui interval, atunci se afiscaza difcritc imagini care pot Ii Io iosuc in diverse scopuri, cum ponte fi de excrnplu trasarca de chcnarc. Functia putch afiseaza caractcrc colorate in conformiuuc cu culoarcn curcnta setata in rnodul text dc Iunctionarc al ccranului. La rcvcnirca din functiu putcl: sc rcturncaza codul imagini i ali::;ale t valoarca paramctrului de la apcl], Prorotipul Iunctici 1!lllch sc alla ill lisicrul conio.h.
Exercitii:

putchar - pcntru iesiri, Aceste macrouri sint definite in fisierul stdio.h si din aceasta cauza utilizarea lor implica includerea acestui fisier.

2.1. Functiile getch !?i getche


Functiile getch ~igctclie sint dcpcndcnte de implemcntare, Mai jos indicarn utilizarile lor sub mediile de programare Turbo C ~iTurbo C++.

Ambele functii permit citirca direct dc la tastatura a unui caractcr. Functia getch citcstc de la tastaturil.1iird ecou, deci caractcrul tastat la display I1U sc afiseaza pc ecranul accstuia. Ea pcrmitc citirea caracterelor de la tastatura atit a celor corespunzatoare codului ASClI, cit si a cclor corcspunzatoare unor functii spcciale cum ar f tastele PI, F2 etc. sau cornbinatii de taste spcciale. La citirea unui caracter al codului ASCll, functia rcrurneaza codul ASCII al caracterului rcspcctiv. in cazul in care se actioneaza 0 tustn cure nu corcspuudc 1I11ui curactcr ASCII, functia getch se apeleaza de doua ori: In pril11111 ape! functia rcturneaza valoarca zero, iar la eel de al doilea apcl se rerumeuza 0 valoare specifics tastei ncrionate. 50

2.1

Sa sc scric un program care citcsic un carnctcr iruprimahil


pc ccran.

si-I ali~eaza apoi

Caractcrul
getch ( )

rcspcctiv

sc citcstc lolosind upclul: sc rciurncaza codul ASCII al carucrcrului


lasta!. 'il

La rcvcnirca

din gelch()

Accst cod unncuza a 11 lolosit la apclul tunctici putch pcntru a a110<1 caractcrul lasla!. I)Cci pcniru a n:zul\'a problcnu. de 1;I\a putcm lolosi constructia:
1",1,'1'('1'" "1,1) I;

2.3

Programul asteapta

BIB realizeaza

acelasi lucru ca si programul

BIl2, ell deosebirea

ca inaintc de a se termini! cxccutia lui, sc afiseaza


actionarea unci taste.

fcrcastra utilizator ~ise

cxprcsic fermata dintr-un singur operand, operand care consta din apclul funciici gctch. Accasta cste posibil dcoarccc oricc lunciic care rctumcazu 0 valoarc poatc f apclata ca operand al
0

in accst cal, pararnctrul

cfcctiv

cstc

PROGRAMUL 8113
#include <conio.h> rnain () /* citcstc fara ccou un caractcr imprimabil ASCII, il afiseaza, trcee cursorul pc linia urrnatoarc, afiscaza fcreastra utilizator si sc astcapta actionarca unci taste; programul sc tcrmina dupa actionurca unci taste */ putch(Cjetch());
put.ch ( , \n' );

unci cxprcsi i.

Mcntionam
car;lclcruilii

ca

Iuncti»

gefcll

rcturncnza
lasll'i ;':11/<'/'.

vulourca

13 (CR)

la citirca

r<:l.lIil;!l din actiunnrca

PROGRAMUL

8111
}

gei::ch() ; ASC[I ,j·i afiscaza

Ill"
I

Nirlclude <conio.ll> in (I ;* circstc lara ccou un caractcr inrpruunhi] I


put.ch (q"t:ch (I) ;

pc ccran

=]

2.3. Macrourile getchar l?i putchar


Accstc mucrouri sint definite in fisierul stdio.h. Ell' sc apeleaza la fcl ca functiile. Macroul getchar perrnite citirea ClI ecou a caracterelor de !a terminalul standard. Se pot citi numai caractere ale codului ASCII, nu si caractere corcspunzatcarc tustclor spcciale. Prin intermediul macroului getchar caracterelo nu se citesc direct de In tastatura. Caractereletastate la terminal se introduc intr-o zona tampon pina la actionarea tastei Enter. 1n acest moment, in zona tampon, se introduce caractcrul de rind nou (newline) si se continua executia lui getchar. Se revine din getchar returnindu-se codul ASCII al caracterului curent din zona tampon. La un nou ape I al lui gctchar se revine cu codul ASCII al caracterului urmator din zona tampon. La epuizarca tuturor caracterelor din zona tampon, apclul lui getchar implies tastarea la terminal a unui nou set de caractere care se reincarca in zona tampon. Un astfel de mod de desfasurare a operatiei de eitire implica 0 anumita organizare a mcmoriei si acccsului la caractere, organizare care conduce la notiunea de fisier. in general, prin fisier se mtelcge 0 multime ordonata de elemente pastratc pc suporturi. Elcmcntele 1111ui isier sc l1Ull1eSC inregistrdri.ii: mod frecvent fisicrele f sint pastrate pc discuri. Cu toatc aces tea, este util sa se eonsidere organizate in fisiere chiar si datele eare se tasteaza sau se afiseaza la terminal. In acest caz inrcgistrarca este un rind afisat la terminal sau succesiunea de caractere tastata la terminal ~i tcrminata prin actionarea tastei Enter. Fisiercle contin 0 inrcgistrare speciala care marcheaza
Accasta inregistrare se .rcalizcaza

Obxervarii: I. 2. Programul cstc incfcctiv daca sc aciioncaza 0 tasta cc nu corcspundc cuructcrclor A SC II. Carucrcrul afisat prin putch se poatc vcdca 111 (crcastra utilizator. Accasta se vizualizcuza tastind: <Alt>-F5 Sc rcvine ill icrenstra utilizator actionind 0 tast;i oarecnre. Sa sc scric un program care circstc fara ccou 1I11 caructcr imprimabil :1 ali~ea/.a la terminal ;_;i apni trccc cursorul pc linin unnatoarc. ASCII,

2.2

Programu I de I~l\~lcstc ascmanator cu eel precedent. in plus se cere trecerea cursorului pc linin urmatoarc. in aces! scop sc apelcaza functia putch cu codul caractcrului 1I(,II'IiI/,':
pul:chllO) ;

rvlcn\iull;II1lC:l putcm inlocui vuloarca 10 prin constautu carnctcr '\n':


put r.h
(i \n');

PROGRAMUL
Ii .i II(_' J u~.l(_'
<;

8112
C,}!}

i \). I}'>

n ()

;* citcstc fara ccou un caructcr imprimabil ASCII, il afiscaza terminal si upoi sc trccc cursorul pc linin urtuarn.rrc */

la

sfirsitul de fisier;

pUI ell )

('I"leh I I I ; pu I:.ch ( . \n' ) ;

limbajclor

la tastatura prin secvente spccialc, Turbo C si Turbo C++, sfirsitul de fisicr sc obtine tastind:

in

cazul

<CTRL>-Z
al carui ecou este:

I\Z 53

52

Maeroul getchar returneaza valoarca constantci simbolice EOF (End or Fi lc) la intilnirea sfirsitului de fisier, Accasta constanta csredcfinita in fisicrul stdio.li. Valoarea ei depinde de implcmcntarc. In cazul mcdiilor de progrumarc Turbo C ~iTurbo C++, ea arc valoarca -I.

Ohscrv.uic:

Macroul getchar ~e apeleaza fara parametri si de obicci cste un operand al unei expresii: getchart) Maeroul putchar afiseaza un caracter al codului ASCTl. EI retumcaza codul earacterului afisat sau -1 la eroare.
Se poate apela prin formatul putchar(expresie); Valoarea expresiei reprezinta codul ASCII al caracterului care sc afiseaza. de rnai jos:

Dcoarccc sc Ioloscxtc ruacroul gefc/wr, opcratoru I va lasla un caructcr ASCI I care trcbuic ~a lie urmat de acuonarca taslL'i Filler. Fara ac(ion;lcea taski Enter, progrumul 1;\l11111C in astcptarc. Dupa uctionarcu tastci Enter se va reveni din gelchar cu codul ASCII al primului caractcr tastat. Daca prima lastfl aciionatu esrc chiar tastu Enter, atunci programul continua in mod automat $i se rcvine din getchar ell valoarea 10 (valoarea corespunzatoarc rastei Enter).
cxccutia

Observatii:
1. Citirea caracterelor prin intermediul zonelor tampon are avantajul ca permite corectarea erorilor Ja tastare. Astfel, operatorul de la terminal poate sa modifiee 0 secventa de caractere tastate, inainte de a actiona rasta Enter. Macroul getchar returneaza valoarea 10 (newline) la citirea caracterului corespunzator actionarii tastei Enter. Apelul
. putchar(lO);

2.4. Functiile gets !?i puts


Functia gets poatc II folosita pcntru a introduce de la tenninalul standard 0 succcsiunc de caractcre tcrminara prin actionarca tastci Enter. Cirirea se face ell ecou . Se pot citi numai caractere ale codului ASCII. Functia are ca pararnerru adresa de inceput a Zone! de memoric in care se pastrcaza caractcrcle cititc. De obicei, aceasta zona de mcmoric cste alocata 11l111i tablou unidimensional de tip char. Deoarecc numcle uuui tab lou arc ca valoare adrcsa de inccput a zonci de mcmorie alocatc, rczulta C~I numcle unui tablou ponte f utilizat ca pararnctru in apclul functici gels. in lclul acosta, caractcrclc cititc sc VOl' pastra in tabloul rcspcctiv. Functia gets rcrurncaza adresa de inccput a zonci de mcrnorie in care s-au pastrat caractcrclc. La intilnirca sfirsitului de fisicr «CTRL>-Z\ sc rcturncaza valoarca zero.
Zero !HI replczinti! (l atiles<l posihila pcntru gets :;;i de accea, ca poatc f"i fnlosita pcutru a scmnala srlr~it\ll de Iisicr. D..: obicci. vulourca rcturnam de gds nu sc Icstea/;\ 1:1\:1 de zero, ci 1~I\ade consianra simholica NUU. dcfinit., in fisicru] stdio.h. .

2. 3.

sau echivalentul
putchar{

sau
'\n')
i

are ca efect treeerea

cursorului

in coloana

lI11U

de pe linin urrnatoare.

Exercttti:
2.4 Sa se scrie un program urmatoare care citcstc un came tel' folosind fereastra utilizator macron I gctchar, il unci taste. Iunctiilor

afiseaza folosind macroul putchar, trcce cursorul in coloana unu din linin
si apoi afiseaza ptna la actionarca Acest exercitiu este analog Cll 2.3. In acest caz sc cere schimburea getch fjiputch cu macrourile getchar (>i respectiv putchar.

Caracicrul
lui se pasrrcazu

/It'II'Ii/l(',

cal'e tcrminn rindul, nu se pastre:tz.l

in mcmorie.

in locul

PROGRAMUL 8114
'include 'include <stdio.h> <conio.h>

formcaza (sccvcnta Din cclc de mai sus rczulra ca daca


char tab{2551;

NUL ('\0'). In Iclul accsra, caractcre!c cititc prin gels un sir de caractcrc in conformitatc cu ccrintclc limbajclor C ~i C++ de caractcrc sc tcrrnina prin caracrcrul NUL). . caractcrul
tith

cstc dcclarnt prin:

main () 1* - citeste un caractcr folosind gctchar; - afiscaza caracterul folosind putchar; - trcce cursorul la inccputul rindului urmator; ~blochcaza programul pina la tastarea unui caractcr *! putchar(getchar()) putchar (,\n' ); getch() ;
}

atunci apclul:
qets (tab) ;

pastrcaza in tah succcsiunc.i de cnracicrc lasta!:! la tcrmiuulul standard ill linia curcnta. Totodatu, newline sc inlocuicsrc ell NUl.. Functi« puts ufiscaza la tcrrninalul standard un ~ir de caracterc ale codului ASCII. Cursorul, dupa afisarca sirului respcctiv, se trcce automat in coloana intii

54

55

de pc linin urrnatoarc cuructcrclc de alisat.

(deei caractcrul

NUL scinlocuicstc

cu newline).

2.6

Functia arc ca puramctru

adrcsu de inccput a zonci de mcmoric care coniine

Sa SC modificc programul precedent asa incit dupa afisarea initialclor sa se afisczc tcxtul: Pcnlru a termina actionati 0 (asta

In cazul in care sind dc carnctcrc care sc aflscuza se pastreaza intr-un tab lou unidimensional de tip char, drcpt pararnetru sc poatc folosi muncie acestui tablou, Functia 1)111.1' rcturncaza codul ultunului curucicr al sirului de caructcrc afisat
(caractcrul cure precede pe NUL) sau ··1 la croare, Daca tab arc dcclaratia de mai sus ~i el pastrcaza apclul
puts (Lall) ;

Accst text sc poate afisa eu ajutorul functiei puts, pe care 0 apclam inaintc de apclul lui gctch. Sc poate utiliza urmatorul apel al functiei puts:
puts("Pentru a termina actionati
0

tasta");

lin sir de caractcre,

atunci

I
i
r

in acest ape! pararnetrul efectiv este oexprcsie redusa la un operand care este o constanta sir, La accst npcl compilatorul paslreazll caractcrclc constuntci sir intr-o zona de rncmoric si apoi realizeaza apclul functiei puts folosind adresa de inceput a zonci respective.

afiscaza In tcrrninalul standard sind rcspcctiv de caractcre si apoi trccc cursorul ill colouna intii de pc rindul unuutor. Fuuctiilc gelS ~ipills au prototipurilc in fisicrul stdio.h. Exercitii: 2.5 Sa sc sene uu program care citcstc de la intrarcn standard uumclc ~i prenumcle unci pcrsoanc, afiscaza initialcle pcrsoanei respective pe un rind, ficcarc initiala cstc urmata de un punct.

PROGRAMUL
'include .include

8116

<stdio.h> <conio.h>

Numclc ~i prcnumclc se lasleaza pc doua rinduri dileritc ;;i apoi sc VOl" ufisa initialcle respective. In final sc trccc cursorul in colouna intii a liniei urmatoare si se afiscaza fcreastra utilizator. PROGRAMUl
#include linclude main ()

main () /*. citestc muncie 5i prcnumclc unci personae tastatc pc dou a linii separate; - atiscaza initialclc pcrsoanci urmatc de punctc pc un acclasi rind; - pe rindul urmator sc afiscaza tcxtul: Pcnuu a tcrmina programul actionati 0 tasta; - sc anscaza Icrcastra utilizutor. +/ char char nume[2.S51; prenume[2S5j;

8115
<stdio.h> <conio.h>

t«: citcstc numclc

si prcnumclc unci pcrsoanc tustatc pe doua linii separate; atiscaza pc un rind initialclc urrnatc de punct; ~ afiscaza fcrcastra utilizator. */
i )

char

nume[255]

gets (nume) ; gets (p.r enumo ) ; putchar(nume[O)) ; pu tebar: ( , . ' ) ; putchar(prenume[O]) ; putchar('.') ; puts ( " \nPentru a te.rmina o tasta"); gel:ch ();

progr:amul

actionati

char

prenume[25S];

ge t s (numo ) ; /1 citcstc prima linie tastata la tcnninal gets (prenume); II citcstc linin a doua tastata la terminal putchar (nume [01 ) ; /1 afiscuza prima iniiiala putchar (, . '); // afiseazn punct dupa prima initiula putchar (p r e nume [01); // afiscazu a doua initiala put.cha r ( , . ' i , /1 punet dupa a doua initialu putchar ( , \n' ); /1 trece in COIOallJ intii din linia urrnatoarc gecch( i; ii se ufiscuza Iercustra utilizator; pcntru a k-fminu programul /1 sc actioncaza 0 tasta oarccare

2.5. Functia printf


Functia print! poatc fi folosita pentru a afisa date pc ecranul terminalului standard sub controlul unor formate. Ea poate fi apelata printr-o constructic de forma: "pdntJ( control.par 1,par2, ....parn ); unde:

control 56

- Este un sir de caractere datclor care se scriu;

care defineste

textele

$i formatele 57

par l.par2 .....pam - Sint expresii.

Valorilc

de format prezenti

lor sc scriu conform in paramctrul de control.

spccificatorilor

1111 sir de cijr« zccimale optional

- Care ddinc01c

Datele gestionate prin print/sint supuse unor transformari, Accasta din CHUZa ca datele au un format extern si unul intern. Parametrul control al functiei print/ defincste aceste transforrnari ale dutelor

care se afiseaza pc ecran, transformari care sc mai numcsc conversii. EI continc


asa numitii specificatori de format care definesc conversiile datclor din format intern in format extern. ln afara acestor specificatori de format, pararnetrul control al functiei prinftpoatc contine succesiuni de caractere care se afiseaza ca atare in pozitii corespunzatoare. In concluzic, paramctrul control are in cornpuncrca sa: - succesiuni de caractere care se afiseaza ca atare; - . specificatori de format care definesc conversiile valorilor pari. par2 .... parn din format intern in format extern. parametrilor

dirncnsiuuca minima a cimpului III care sc afiscaza caractcrclc care intra in compuncrea rOrinailt!ui extern al datci, III cazul in care data necesita un cunp de dirncnsiunc mai marc dccit eel prccizat, ca se va scrie pe atitcu caractcrc cite Ii sint ncccsarc. in cazul in care data ncccsiia un cimp mai mic dccit eel dcfinit in spccilicarorul de format, ca sc va scrie in cimpul rcspcctiv in drcapta sal! in stinga, daca cste prczcnt caracrcrul minus in specificaiorul de torruat corcspunzator ci, De aserncnca, in aces! cal.

cimpul
plicit,

sc complctcaza cu caracrerc ncscmnificativc; imcaracrcrclc ncscmuiflcativc sint spatii, Caractcrclc ncsemnificative VOl' f zerouri daca numarul cc indica
dirnensiunea minima a cimpului iucepe cu un zero ncscmni-

Mentionam ca aeeste constructii nu sin! totdeauna ambelc prezente. De exemplu, daca dorim sa se afiseze un text, atunei parametrul control nu coruine specificatorii de format, decit numai texrul respect iv, iar paramctrii pari. pari, .... pam sint absenti. In mod analog, parametrul control poate sa contina numai specificatori de format. in mod frccvcnt, pararnctrul control coniine atit spccificatori de format, cit ~i altc caractere. Exemplu: Apelul functiei puts folosit in excrcitiul
puts("\nPentru a termina

ficativ (aici zcroul ncscmnificativ nu inscarnna ca numarul cstc in octal, dcoarccc aces! sir de cifrc nu rcprczinta () constanta intrcaga, ci are scmnificatia amintita mai sus).
lin punct optional. urmat de 1111 sir de cifrc zccimal« Sirul de cifrc zccimalc aflate dupa punct dcfincsic prccizia datei care se scric sub controlul spccificatorului rcspcciiv . Daca punctul cstc prczcnt, at unci )i prccizia cstc prczenta. in cnzul ill care data care xc sene cstc flotanta, pn.'cizia dcfincstc numarul de zccimalc cure sc scriu. In cazu] in care data csrc un $ir de caractcrc, prccizia indica numarul de cnractcrc care sc scriu.

2.6.:
actionati
0

programul

tasta");

sa 1/ doua literc
11/ iii

- Care dcfincsc tipul de couvcrxic


SIlS,

aplicat datci care sc scric.


lIll:cpe CII IIIl

ponte Ii inlocuit printr-un apcl al (uucrici print] care coniine metrul de control fara spccificatori de format:
printf("\nPentru a termina programul actionati
0

numni paratasta\n");

Din cell' de mai

rl'/ltlta ca

1111spcci

Iic.uor de format

caractcr

In cazul apelului functiei print] s-a folosit caractcrul newline de la sfusirul sirului de caractere pcntru en dupa afisarca rcxtului, cursorul sil trcnca in coloana unu din linia urmatoare, Acest fapt se realizeaza automat in cazul functiei puts $i deci la apclul ei sirul de caracterc I1U se mai termina csx newline. Specificatorii de format, daca exista, se corcspund cu paramctrii pari. par? . .... pam. Astfel, al k-lea spccificator de format controleaza afisarea valorii parametrului park. Fonnatul extern al unci date consta dintr-o succesiunc de caracterc imprimabile. Ele se afiseaza intr-o zona numita cimp, Un specificator de format incepc cu un caracter procent (01<». In continuarc, mai pot exista caracterele indicate mai jos: 1111 caracter - Implicit datelc se cadrenza in dreapta cimpului in care ele se minus optional scriu. Daca este prezent caracterul minus, atunci data corcspunzatoare lui esre caciratil in stinga.

proccnt ~i sc tenniua Cll o litera. lntrc caractcrul proccut si litera care sfirscstc un spccificator de format 111a 1 pot aparc si altc caructcrc a caror intcrprctarc s-a dat mai sus. ill cazul ill tare dllpa cnrucrcrul proccnt IIrllll'a/a 1111 caractcr difcri: de cde tolositc la dcfinircu spccificutorilor dc format, cuructcrul proccnt rcspcctiv sc ignora ~i se afiscaza caracrerul care urmcaza dupa cl, Aceasta regula pcrmirc

afisarcn insusi

it

caractcrului

proccnt, Astfcl, succcsiunca:

nu rcprczinta un specificator de formal, primul caructcr proccnt sc ignora, iar cel de al doilca caractcr proccn: se va alisa la terminal. FUI1C\ia printf rcturncuza numarul de octcti (caracrcrc) care sc afiscaz.: la terminal sau -I la croarc. Prototipul functiei printfsc afla in fisicrul stdio.h.

In cclc
spccificatorii de format.

cc

urrncaza

vom

indica

principalc!c

couvcrsii

rcalizaic

prin

de format. Elc sint definite de literelc de la sfirsirul spccificatorului

S8

2.5.1. Litera c
Pcunitc afisnrca unui car.ictcr. Valoarca paramctrului corcspunzator cstc intcrprctata ca fiind codul ASCII al unui caracicr ;-;i caractcrul rcspectiv sc afiscaza in cimpul dcfinit de spccificator.
7.

59 afiscaza:
*
Apclul:
printf("*%-10s*",
Ha,bc") ;

abc*

2.5.2. Litera s
Permitc afisarca unui sir de caractcrc. l'arumctrul corcspunzator arc Cil valuarc adrcsa de inccput a zonci de mernorie care continc caractcrclc sirului de afisat. Scafiscaza toatc caractcrcle sirului pina la intilnirca caracrcrului NUL.
Exemplc: I. Sccvcnia

afiscaza: *abc

8.

Apclul:
p r i n t f ( " • % 15 . 10* " , " 1 imba j u 1 C++");

afiseaza:

*
de apcluri:
I; putchar(getchar(1

limbajul C*

2.5.3. Litera d
I;

SC poat..: r..:alizil 2.

ti)losind

l"uIIC\i;I/,,.illftasttl:l:

printf("%c",getchar(1

Sccvcnta de apcluri:
putchar(getchar(1 putchar ('In' I; I;

Datclc de tip int pot f convertite si afisatc in zecirnal folosind un spccificator de format terrninat cu litera d. Valorilc negative se afiseaza precedate de sernnul minus. Exemple: 1. Specificatorul
%d

sc poarc inlocui prin:


p r i. nt: f (" "(;c\n" ,q()Lchar (I I ;

3.

Apclul lui prill//'pcntru


pr
lilt [

a ari!ia un !iir de caractcrc: de format pcntru siruri de caractcrc:


2.

sc foloseste Apclul:

pcntru a afisa, in zccimal,

data de tip int.

(""he"

I;

sc ponte scric folosind spccificatorul


p r i n t.f jvs sv, "abc"l;

printf("*%lOd*",1231;

in ambclc cazuri, cornpilatorul pastrcaza sirul de caracterc "abc" intr-o zona spcciala prevazuta pentru acest rapt ~i apelcaza functia printf folosind ca

afiseaza:

123*
printf("*%-lOd*",1231;

paramctru 4.

adrcsa de inceput a accstci zone de memoric.


(II;

3.

Apelul: afiseaza:

Fie apclul lui print]:


p ri n t f (" *%4c*", getchar

Caractcrul citit prin gctchar sc afiscaza intr-uu cimp de 4 caractcrc, cad rat ill drcapta, De cxcmplu, daca s-a citit caracterul a, atunci apclul de mai sus va afisa: * A*
5.

* 123

4,

Apelul:
printf("*%OlOd*",1231;

afiseaza:

Apclul:
printf("*%-4c*",gctclwr(1 I;

*0000000123*

vu afisu caractcrul citit intr-un cimp de 4 caractcrc, cadrat in stinga. De cxcmplu, daca se citcstc caracicrul A, atunci apclul de mai sus va nfisa: *A * 6.
6()

2.5.4. Litera
specificator

'.

Fie apclul:
p r in t I: ( " ''1,10 s

*",

"a be" I ;

DateJe de tip int sau unsigned pot fi convertite si afisate in octal folosind un de format terminat cu litera d. Fiecarc grupa de trei cifre binare se inlocuieste printr-o cifra octala. Gruparea 61

cifrelor se face de la dreapta spre stinga, adica de la ordinelc

inferioare spre ccle

superioare,

Exemplu:

Apelul:
"

printf('*%10o*",123)

Partca intrcaga cstc un sir de cifre zccimalc minus daca numarul estc negativ, Numarul zccirnalelor sc dcfincstc de precizia format. Daca ca estc abscnta, atunci se afiscaza 6 este rorunjita. Rotunjirca se face prin adaus daca putin egala eu 5 si prin lipsa in caz contrar. Exemple:

care csre prccedat de sernnul indicata in spccificarorul de zccirnale. Ultima citra afisata prima cifra neglijata este eel

afiseaza:

173*

2.5.5. Llterele

~i X

Valoarcu dntui 3.14159265 123.672 3.14159265 123.672 ·123.672 _t2134_.~_;~_26_5 . ._ .. _..

Specificntnr %51' %71' 'Yo7.2f %10.11' %1'0.11'

Afisare 3.141593 123.672000 1~,.·1.47 I -", ·123.7

Datele de tip in! sau unsigned pot fi convertite Si afisate in hexazecimal folosind un specificator de format terminat cu litera x sau X. In acest scop, patru

cifre bin are se inlocuiesc printr-o cifra hexazecimala. Exemplu: Apelul:


printf("*%10x·",123);

~.:.~J::: _. .__.._... !3U ... __...


datclor

afiseaza:
cazul in care se foloseste Iitere mario

2.5.9. Literele e ~i E
ell Aceste formatele: sau literc permit convcrsia

In

7b* litera mare X, cifrele hexa peste 9 se afiseaza

flotante de tip float sau double spre

parte ]n treagd.parte

_ji'C1C( iona rCI

exponen t

2.5.6. Litera u
Litera u este asemanatoare Cli litera d. In acest caz se realizeaza unei date binare de tip unsigned in zeeima!. conversia

parte _intreagti exponent Purtca intrcugu cstc 0 cirra zccimala care estc precedata de xcmnul minlis daca
numarul estc negativ. Numarul zccirnalclor cstc eel dcfinit de prccizie daca aecasta este prczcnta in spccificatorul de format. in cazul in care prccizia cstc abscnra, nurnarul

2.5.7. Litera I
Litera I poate precede pe una din literele d, 0, x, X sau u. In acest caz se fac conversii din tipul long sau long unsigned. Astfel, specificatorul terminat in ld realizeaza conversia din long in zecimal. Spccificatomllu realizeaza conversia din long unsigned in zecimal. Specificatorul lo face conversie din long sau long unsigned in octal. Specificatorul Ix sau IX face conversia din long sau long unsigned in hexazecimal.

zccimalclor

a fisutc cstc ega I Cll 6, U It iIll" ci fra a ti~atil cstc rotunj itil con form

regulei indicate mai sus la descrierca literei./ Exponentul inccpc ell litera e dnca spccificatorul de format se terrnina ell e ;;i cu E datil cl sc tcnnina cu E. Unucuza uu scmn plus sau minus daca accsta cstc ncgativ, Dupa scmn se afla un intreg zecimal de eel putin 2 cifrc. Exponcntul dcfinestc 0 puterc a lui zccc care inmulteste restul reprczenrarii

numarului
Exemple:

pcntru a ohtinc valoarca rcala a accstuiu.

dutci

2.5.8. Litera f
LiteraJpermite conversia datelor de tipfloat sau double spre forrnatcle: parte _in!reag{i.parte _ji'ac(iol/(i/'{i
sau
123.672 123672 0.(,71 12.1.672 %.11' 1.236720c+02 1.2E+02 (,nOOOOF·(l1 11'+02

parte _intreagd

62

2.5.10. Literele 9 !?i G


Spccificatorul de format tcrminat eli litera g S<lU G afiscaza data respective fie ca in cazul spccificatorului tcrrninat cu], fie ca in cazul spccificatorului tcrminat ClI c sau I:. Formatu! de ufisarc cu exponent sau tara, sc alege automat in usa fcl incit ufisarca sa ocupc un numar minim de caractcrc. De asemcnca, spccificatorii 'X,g ~i%G ali:;;e.wl () zccimnlc numni daca uccstcu sin: toatc scmnilicativc, Sc Ioloscstc litera (' la scricrca cxponcntului daca spccificatorul sc tcrminu ell g si E pcntru spccificatorul terminal ClI C.
Observutic: Datclc de tip./loaf au 0 prccizie de 6-7 zccimalc. ncest tip nu sc rccomanda sil sc afisczc un 11l1111,U' Datclc de lip douhl«: au (l prccizic de pina la IS caz, putcm afisa pina lu 15··16 zccimulc. Afisarca zccima!c nu are scns. De accca, pcntru datele de rnai marc.de zccimalc, zccimulc ~i dcci, in accst unui numar mai mare de
)

citit prin getchat sa sc nfisezc intrc doua caracterc proccnt. PROGRAMUL BII8

ffinclude <stdio.h> linclude <conio.h> ma in () /'-citcstc UII caractcr cu gctchnr: - afiscaza pc () linic caructcrul citit, intrc douu caractcrc - trccc cursorul in colouna intii din linia urmatoarc; - afiscaza fcrcastra utilizator. =t printf("%%%c%96\n",getchar(1 I; puts(" Actionati 0 t.asta pentru getch() ;

proccnt;

a cont.inua");

2.9

Prograrnul de mai jos afiscaza spccificatori de formal:

textul "Limbajul

C++", folosind

urmatorii

2.5.11. Litera L
Litera L poate precede una din litcrclcj. «. E, g si G. In accst caz data care se afiscaza cstc de tip IOl1g double. Convcntiilc de afisarc sint accleasi, adica datclc afisatc ell un spccificator de format terminal ell l.fsinl 11\1'[1xponent, cclo cu un e specificator de format terminat cu Lc sau LE sc afiscaza CII exponent, iar cclc afisatc ell un spccificator de format cu Lg sau LG 5e afi~C,1Z<1ell unul din formarcle prcccdcntc care asigura 0 atisarc cu un 1111Il1<lr minim de caracterc.
Exercitii:

%s, %15s, 'Vo-ISs,'%105, %15.105 si %-15.10s


Pentru a pune in evidcnta cimpul aflsat prin specificatorii rcspcctivi, vom

include de fiecare data cimpul intre caractcre asterisc. PROGRAMUL


.include .include .define

8119

<stdio.h> <conio.h> v "Limbajul c++"

2.7

Sil sc scric un program care nliscuza pc 0 linic, intre doua caractcrc astcrisc, caracterul citit de la terminal prin getchar, apoi trcce cursorul in coloana intii de pc linia urmatoarc ;;i afiscaza ecranul utilizator.

main () /'afiscaza, intrc caractcrc astcrisc, tcxtul Limbajul C++ folosind difcrin spccificatori de format =t

PROGRAMUL BII7
#include <stdio.h> .include <conio.h> main () t»: citcstc uu caractcr ell gctchar; - afiscaza pc 0 liuic caractcru l citit, intrc doua caractcrc astcrisc: - trcce eursoru! in coloana intii din linin urmatoarc; - afiscaza fcrcastra utilizator. */ printf("*%c*\n",getchar() l: puts(" Actionati 0 tasta pentru getch(l;
)

printf("*%s*\n", V); printf("*%15s*\n", V); printfl"*%-15s*\n", V); printf("*%lOs*\n", V); printf("*%15.10s*\n", V); printf("*%-15.10s*\n", VI; put.s (" Actionati 0 tasta pentru getch ();
)

a continua");

Rczultatele executiei prograrnului BII9 sint:


*Limbajul c++* Limbajul c++, *Limbajul c++ *Lirnbajul C++* Lirnbajul c' *Lirnbajul C Actionati 0 tasta pentru

a continua");

2 [\

Sa se rnodificc programul

din cxcrnplul

precedent

in asa fcl iucit caractcrul

a continua

64

65

2.10 Sa se serie un program care citestc un caracter cu getcharss afiseaza eodul sau ASCII. PROGRAMUL 8111-0
#include 'include <stdio.h> <conio.h> ell gctchar si afiscaza codul sau ASCll *1

2.13 Sa sc scrie un program care afiscaza constantu si hexazccimal. PROGRAMUL


#include #include #define

123456

n9 in zccimal,

octal

81113

main () 1* citcsrc un caractcr


(

<stdio.h> <conio.h> V 123456789 coustarua 123456789 inzccimal, octal sihcxnzccimnl


*!

printf("%d\n", getchar() ); puts ( "Actionati 0 tasta pentru getch() ;


}

a continua");

main () 1* afiscaza
[

2.11 Sfl se seric un program care citeste un caracter care nu corespunde A;;;CII si afiscuza codul sau rctumat prin Iunctia getch.
Amintim

codului

en

pcntru

a citi caractcrc

care

1111

corcspund

codului

ASCII,se

printf("zecimal %ld\n", V); printf("octal %10\n", V); printf ("I\t·?:'!~"'i.:ci!ll'l] '!.!::-:\ll", V}; puts("Actioflati 0 tasta perltru a conti_Dua"); q,"tch();
}

apcleaza getch de doua ori, La primul apel, getch returneaza valoarca zero. La eel de al doilea ape I sc retumeaza un cod specific caracterului citit. PROGRAMUL BII11

2.14 Programull3fl PROGRAMUL

J4

afiscaza constanta

123 cu di teriti spcci Iicatori dc format.

BII14

#include <stdio.h> ilinclude <conio.h> main (11* citcstc un caractcr care IlU apart inc codului si afiscazn codul caractcrului citit *1 ASCII

#include <stdio.h> #include <conio.h> lidefine V 123 rna i n ()


(

I*' afisl'(lza cOllstanta

12.1 ell difcriti

spl:cilll'<lluri

de forillal

*/

printf("%d\n", getch() I; IlafiscazaO pr i nt.f("%d\n", getch () ); II afiseazn codul caracrerului pUts ("Actionati 0 tasta pentru a continua"); getch() ;
}

printf("*%d'\n", V); printf ("*%7d* \n", V); printf("*%-7d*\n", V); printf("'%07d*\n", V); puts("Actionati 0 tasta pentru getch (); I

a continua");

2.12 Sa se scrie un program hexazecimal, PROGRAMUL 81112


Dihclude Dinclude #define <stdio.h> cconio.h> V 12345

care afiscaza constanta

12345 in zccimal, octal ~i

Rezultatcle
*123* 123* , t.:~.l *0000123' Actionati

cxccuiici

programului

sint:

tasta pentru

a continua dif(>riti '--f- _-_', - _-_._._ -." slwt'ili('al<wi -_ ••.. - .• ;-

main () ;* afiscaza intrcgul 12345 inzccimal, octal sihcxazccirnal *1


{

2.15

Programul format.
'-

131115 afiscaza numcrc ncintrcui folosind


• '-}

- _-

ti,>
---

printf("zecimal %d\n", VI; printf("octal %0\0", VI; printf( "hexazecimal %x\n", V); puts("Actionati 0 tasta pentru a continua"); getch (I;

PROGRAMUL
'include ftinclude

BII15

<stdio.h> <conio.h>

66

67

H0efine
II If l i I 'II
l

A 47.389
~

! )'.1.

.;~ 0

2.6. Functia scanf


I'unctiu scan] ponte Ii Iolosita pcntru a introduce date tastate ia tcnninalul standard sub eontrolul un or formate, Ea poate f apelata printr-o constructie de forma:
i

J.'t i.IILL ("!\··.·I.f\n", pr_intt("/\:~(t,.3f\n", rn: i n t f ( A::; '1~. 2 f \ n"


oj

,\);
ll)i
I }\)

prj.nt:f:("A~%.1f\n", A); p rin t.f ("[\c·". Of\n", A);


p rinr.f ("X:':"~(~\n", X); tit i nt. I' ("X 'I,. Il1'\n", X); p r i nr. l ( " ;\_::;'ti . j I;_~ \ 1\", [) r i n t f ( " x·_:: 'I, . ~~ \ n " ~.-' p r i n t; L (" ?~~;';'?i. .l o v n " X) i
I

scanf( control.par 1,par2, ...,pam);

unde: control

- Este un sir de caractere


evcntualclor

care defineste formate le date lor ;;i a textc aflate la intrarea de la tastarura. lor externe in formate

X); X);

par l.purl, ....parn - Sint adrcsclc zonelor in care se pastreaza datele citite dupa
ce au lost convertite din formatele interne corespunzatoare, Caracterele albe din compunerea parametrului caracterelor, care nu fac parte dintr-un specificator

1')rilltf(NA=%g X=lG\n"J A, X); IH i n it ("'! .._:UL\I\'/,_:Ot'\I\'r",:LhJ\ti", I.:~!), 1.,;*), 1..:::.)); p ri n r f ("%20f\n~;20,"\n%20g\n", .25, .2:0, .25); printf("%20f\n%20e\n%20g\n",123e-l,123e-l,123e-l); printf("%20[\n%20e\n%20g\n", 12.3e4,12.3e4,12.3e4); printt('%30.20Le\n",356.782143657891213891) ; printf('%40.30Le\n',31415926535897932384526434e-251);

intrare in pozitii corespunzatoare.

control sint neglijate. Restul de format, trebuie sa existe la Acestea se folosesc in vedcrea efectuarii de
se atribuie variabilei x, atunci data

Rczultatclc

cxccutici

programului

sint:

controalc asupra datclor citite, De excmplu, daca 0 data care se citcste respectiva poate fi precedata de textul:

[\,,47.389000 A;47.389
/\,,17 . :3 II '4,/ . '1
!\'.i~

x= In acest caz parametrul trebuie sa contina in pozitia corespunzatoare:


de caractere albe care se neglijeaza,

ii'/,

x=specificatorul de format al datei care se citeste


Textele de la intrare pot fi precedate Specificatorii de format controleaza introducerea datelor care au diferite formate externe reprezentate prin anumite succesiuni de caractere. De asernenea, speeifieatorii de format definesc conversiile din formate externe (ale datelor) in cele interne.

Xc

. L :;()()0",·,2
j.'~ ~

/>=,·1. ;~350(~+22 ;.:, l . ~! r) J :1, '/. L. 24f:!+)2 Xc·-l.2e·'2

A=47.389
~I.

X= 1.23SE+22
1 )'iOOOO
ijn()OOf"'

no

1.25 0.250000
. 50()OOOe-Ol

u.

:lS

Specificatorii de format sint asemanatori ell eei inrilniti la functia print}: Ei incep cu un caracter proccnt si se termina eu 1-2 literc, Literele definesc tipul conversiei . lntre procent si litere, intr-un spccificator de format mai putern utiliza, in
ordine: un caracter asterisc optional;

.300000 .230000e+01
'.1 :.:3000 12.3 .OOO()UCI 123000
I

1.230000e+OS 5678)]43657891214000e+02 ;. 1 ,11 ') ~l:) (;'i\ ',H 'li 'J3::;i OOOOOOOilO

un sir de cifre optional, care defincstc lungimea maxima a cimpului din care se citestc data sub controlul formatului respectiv. de un specificator de format incepe eu primul caracter: -

11()()Il'"

on

Cimpul controlat
a. b.

eurent care nu este alb si se termina:

fie la caractcrul dupa care urmcaza un earaeter alb; ric ..Ia. caeactcnrl dtipiicare urrncaza un caracter care spccificatorului de format care controleaza accl cimp;

nu corespundc

69

fie la caracterul prin care se ajungc la lungimca maxima a cimpului, in specificatorul de format. Conditia e. este absenta daca in spccificatorul de format nu estc indicata lungimea maxima a cirnpului, Mentionam ca aceasta regula nu se aplica la citircn de caracrcrc. In cazul in care specificatorul de format contine caractcrul astcrisc, data din cimpul respectiv va fi prezenta In intrare dar en nu se atribuic niei unci variabilc si deci nu-i va corespunde un parametru, sprc deosebire de ccilalti spccificatori care nu con tin caracterul asterise. Functia scanf citeste toate cimpurile care corespund spccificatorilor de format, inclusiv eventualele texte prezentc in parametrul control. In cazul unci erori, citirea se intrerupe in locul in care s-a intilnit eroarca, Eroarea poate proveni: .. din necorespondenta textulni curent din parametrul de control cu eel din fisierul de intrare;
indicata .. din neconcordanta dintre data din cimp si specificatorul

c.

zonci de mcmoric

alocata tubloului

rcspcctiv.

2.6.1. Litera c
Spccificatorul de formal

se folosestc pcntru a citi, ClI ajutorul lui scan]; caractcrul curent din zona tampon corespunzatoare datclor iutroduse de la tastatura. In aces! caz nu se face avans pina ln prirnul caracter care nu este alb, ci pur ~I simplu sc citcsic caract crul curcnt (unul singur). Codul S[\\1 ASCll sc pastrcaza in zona de mcmoric definite de paramctrul efectiv corcspunzator. Exernplu: Fie declararia:
char carj

de format sub

controlul caruia se face citirea.


Aparitia unei erori po ate fi pusa usor in evidenta deoarece SC{[I1/,retumcaza, la revenirea din ea, numarul cimpurilor citite corect. In felul acesta, valonrea retumata de scan! poate fi testata si se poate stabili cite cimpuri au fest citite la fiecare ape! a lui scan! Functia scanf citeste date din zona tanlpon atasata rastaturii, la fel ca si getchar. De aceea, datele se citesc efectiv dupa cc s-a actionat tasta Enter. La intilnirea sfusitului de fisier «CTRL>-Z la mediile Turbo C Bi Turbo C++) se returneaza valoarea EOF. Se recornanda ca sfirsitul de fisier sa fie precedat de un caracter alb pentru a nu pierde data tasrata inainte de sfirsitul de fisier, De asernenea, dupa sfirsitul de fisier se actioneaza tasta Enter pentru a termina inregistrarea curenta. Functia scanf, ca si fUl1etiaprint!are prototipul in fisierul stdio.h, Asa cum s-a aratat mai sus, pararnetrii pari, par2, ..,' pam sin! ndrescle zone lor de memorie in care se pastreaza datele citirc de la tastatura in urma eonversiilor in format intern. Adresa unei zone de memorie se exprimaadesea folosind operatorul unar &. Asa de exernplu, daca i este 0 variabila simpla oarecare, atunci
&i

Apelul:
s can f {
u

(l5c

II

&car)

citesre caracterul
accstuia
p ri.n t f

eurent din zona tampon


car) ;

Si pastreaza
car.

codul ASCII

al

in zona de mernoric alocata variubilci Apelind in continuare tuncria printf:


(lI!liCII,

se va afisa, la tcrminalul
lui scan],

standard, caractcrul

citit prin apelul de mui sus a

2.6.2. Litera s
Spccificatorii de format tcnninati prin s sc foloscsc pcntru a citi siruri de caractere. La citirca cu un asrfcl de spccificntor de format, data sc considcra ca facind parte dintr-un cimp care inccpc cu un caractcr care nu cstc alb ~i care sc tcrmiua lie In curactcrul dupn care urmcaza un cnracter alb, fie In cnructcrul prin care sc ajunge la lungimca maxima de caracterc indicata in specificarorul de format. Caracterclc cirire sc pOI pastra intr-o zona de mcmorie organizata ca lin tablou de caractcrc. 111accst caz pnmmctrnl corcspuuzator spccificntorului de format poatc fi chiar nurncle accstui tablou.
Mcntionum ca dupa ultimul spccific.uor de format sc p,btreazil carnctcr citit sub controlul unui astfcl in mod automat caractcrul NUL ('\0'), de

reprezinta adresa zonei de mernorie alocata variabilei i. In general, daca nllllle este numele unci variabile simple, atunci adresa de inceput a zonei de mernorie alocata variabilei numc se exprima eu ajutorul expresiei:
&nume

Exemple:
1.

Fie tcxtul Limbajul C++ tastat pc lin acelasi rind la tcrminalul standard,
71

Amintim ca daca Ill/me este numele unui tab lou, atunci nu vom mai folosi operatorul &, deoarece in acest caz nurne are ca valoare chiar adresa de inccput a 70

Daca tab l 0i tah l siut dcclarutc ca Illai jos:

I ,

char char

tab1 (10 J; tab2(4);


,

ill

atuuci tcx tul de mai sus poate Ii citit foiosind npclurilc:


scan f ( "~jS"
tabl ); // sc citcstc tcxtul: Limbajul // cirnpul inccpc ClI litera L 5i sc termina /1 dcoarccc dupa I urrncaza spatiu // sc cucsl c tcxtul: ell
ell

concluzic, dupa apclul de mai tab I [01 -> 'n' tab 1[I] -> 'e' tabll2] -> '\0' tab2[ 0 1 -> 'c'
tabzj l] -> 'U'

SlIS,

vom avcu:

SCall I; ( "9,s" , Lal>2);

1/ cimpul inccpc ell litera C si sc tcrmiua eu eel de al doilca II caractcr + deoarccc dupa cl urmcaza newline

tab2f7! -> 't' tab2[ 81 -> '\0'


},

I\cda~i lucru sc pnate reaiiza spccificatori de format:


s can f ("1;" ~;s", t a b l , tab2)

Iolusiud IIIl singur apcl a lui

.I'('(//I(

cu doi Spcciflcatorul
%ls

; nu

Mcutionam
ncglijeaza.

ca sputiu! dintrc xpccificatorii de lonnat Dcci acelasi ape! ponte fi scris si sub forma
;

cstc cscntial, cl sc

scanE("'s%s',tabl,tab2)

I )alt:k ritllC ASCII ustlcl:


tabll0] >'V, tilbll:lJ >'b', tablI6)-->'u', tab2[O)->'c', tab2(3)->'\O'.

priu

aCl':;!L'

upcluri

Sl'

p:tslrl':t/.a

III IlH~1l10nl~

priu coduri le lor

perrnite citirea unui singur caracter. 0 prima deosebire dintre accsta $i specilicatorul %c consta in accca ca, in limp ce '1ols citeste primul caractcr care nu este alb, specificatorul %c citeste caracterul curent, indiferent daca acesta este alb SHLI nu, Deci cei doi spccitleatori citesc acelasi lucru numai daca, caracrcrul curcnt Ill! cstc alb,

tablll]->'i', tabLI1)->'il', tabl[7)-->'1', tClb2[1]->'+',

tabl[2]->'rn', labl(5)->'j', LClbl[8]-->'\O', tab2[2j->'+',

o alta dcoscbiro din Ire eel doi spcci Iicalori consta ill accca ca, specilicalorlll 'Yo1s implica mcmorarea caractcrului NUL dupa caractcrul citit, ceca ce nu arc loc in cazul speeificalorului 'X,c, De acccn, sccventa:
char car; ; s oa n f ( "%c" ,&car)

2.

Fie dcclaratiilc:
char char
tabl[lOJ; tab2 [10);

se modifica
char

daca folosim spccificatorul

% J 5, astfel:

car [2 J ;

0i apclul:
scanf("'2s%9s",tabl,tab2);

s carif ("%1s", car);

Presupuncm ca la terminal s-a tastat cuvintulnccullOscul prccedat si unnat de eel {Julin un caractcr alb. in accst caz lunctia sClln(realizeaz,\ urmatoarclc: - Primul spccificator de format asigura citirea cuvintului: ne Accasta dcoarccc cimpul arc lunguuca maxima de 2 caractcre. El lncepe spec! ficatoru! de format; . AI doilca spccilicator de I(Hlllat asigura citirca in cominuarc, 111accst caz cimpul inccpc cu litera "c" ~i sc icnuina cu litera "I" dcoar~ee dupa t urmcazn un caractcr alb, iar numarul lolal allitcrclor cuvintului CUI10SCU( estc K, care cstc 111;1i nic deeil lUlIgilllea maxima admisn: 9. r
72 Cll litera "n" (primul curaclcr care Ill! cstc alb) ~i sc tcrmiua cu litera "c'' la care s-a ajuns sa sc citcasca doua caractcrc, cit s-a specificat in

2.6.3. Litera d
conversia

Speeificatorii terrninati pnn lor spre tipul int.

litera d permit

citirca

intregilor

zecimali intervalului

~l

Numaru] poatc f precedat de un scmn. El trebuic sa apartina [-32768,32767J. in caz contrar, rezultatul va fi imprevizibil.

Cimpul din care sc citeste intrcgul se defineste indicate mai sus. Exemple: I. Fie dcclnmria
int
ni

COnf0l111

rcgulci generale

~iapclul
s can f (" %d", &n) ;

------------.-~----.

--_,.,;..,----------------------~
73

Daca in cimpul curent din zona tampon de intrare se aflii intrcgu! 123 precedat si urmat de eel putin un caracter alb, atunci dupa acest apcl se va pastra, in zona de memorie alocata lui 11, valoarea in binar a intregului zecimal 123. La rcvenire functia scmif'returncaza valoarca 1 (un cimp citit corect). 2. Fie declaratiile
int il.i2,i3;

2.6.4. Litera

Litera 0 sc utilizcaza en $i litera d. dcoscbirea consra In accca en III loc sa se citcasca un intrcg zecimal, se va ciri un intrcg octal. in accst caz ficcarc cifra octala se inlocuicstc cu trei cifre binarc care dcfincsc acccasi valoarc ca ~i citra respcctiva,

2.6.5. Literele
de cifre

sau X

si apelul:
scanf'"%2d %3d %2d",&il,&i2,&i3);

Daca in zona de intrare se afla succesiunea 1234567

prccedata ~i urmata de caractere albe, atunci dupa apel variabilcle i l , i2 si i3 au respcctiv valorile 12, 345 ~i 67. Intr-adevar, primul specificator de format asigura citirca cifrelor dintr-un cimp de 2 cifre, al doilea specificator dintr- un cimp de 3 cifre, iar al treilea dintr-un cimp de 2 cifre. La revenire functia scanf retumeaza valoarea 3 (3 cirnpuri citite corect). 3. Fie declaratia
int n;

Arnbele literc se utilizcaza la fcl ca si litera d. dcosebirca consta in accca ca in loc sa sc citeasca un intreg zccimal, SL' va eiti un intrej; hcvu iccinurl. In aces! caz fiecare cifra hexazecimala se inlocuicstc Cll 4 cifrc binare care defincsc acccasi valoare ca ~icifra respective. . Cifrclc hcxazccimalc mai muri dccit \) pot Ii rcprczcnlatc prin liicrc mici sau mario

2.6.6. Litera u
Se utilizeaza pcntru a citi intregi zccirnali ~iau tipullillsiglled.
care sc pasircza

convcrtiti in binar

si apelul
s can f I "%<:1", &n) ;

2.6.7. Litera f
curenta cstc

Daca, la intrarc, coustructiu


i23

Litem I PCI'IIlilc citircu numcrclor vecuualc care pot 1'1 l'L'pl'l'!Clltatc alit ell exponent, cit si fara exponent ~i pastrarcu lor in format jlotunt sill/phi prccizic deci date de tip float.

atunci constructia respectiva se considera eronata, deoarece ea nu este un intreg zecimal. in acest caz scanftvs cireste nimic si se revine din ea cu valoarea zero. Constructia respect iva varamine curenta, deci ea poate fi citita apelind in COl1-

2.6.8. Litera I
Litera I poate precede pc oricarc dill litcrclc d. 0.. Y, .\'. /I sail [. Dacill precede pe una din lircrelc d, 0, x suu X, atuuci data eitita spre tipul long in loc de int.
Spccificarorul tcrminat
Cll
SIC

tinuare functia scanfcu un alt specificator getchar. 4.

de format (de exemplu %s) sau macroul

va couvcrti

Considerarn declaratia ;;1ape luI lui scant' din exempIul precedent. Daca la intrarc se afla constructia 23i

Spccificatorul It rcalizcazn prccizie, deci spre tipul double.


0

11/

rcalizcaza

conversia

convcrsia

numarului

sprc unsignc»! IOllg. citi: 111 [lotanto

til/hilt

Cimpul incepe cu cifra 2 si se sfirseste cu cifra 3, deoarece dupa ea urmeaza litera, adica un caracter care nu intra in compunerea intregilor zecimali. La un nou apel a! fi\ncliei scanfse va incerca citirca Jiterei i.

atunci se va citi intregul 23.

2.6.9. Litera L
Litera L se foloscsrc la scricrca spccificnrorilor tcrminat: prin 1/ Ea pcrmiic zccimale alit cu exponent, cit ~i 1:lril exponent, III format flotant de tip long double.

Dupa citirea intrcgului 23 se va reveni din scanfca valoarea 1.

conversia numerelor

74

75

Ext'rcitii:

prin tft vs o Yn :",

printf("%x\n",

iii i);

:' I h S-a SIC xeric un progralll care citcs!c Ull caracicr ajutorul 1"1I11C\iei _\c(/II(~i ;lri~L';IDIcodul ;\SCII PROGRAMUL 81116
/1
II

de la tcrminalul standardcu al caracrcrului rcspcctiv.

Observarie: La cxecutia acestui program nu se mai afiseaza fereastra utilizator cu

111"1 Ill'!I'
II

:;t di

1,I,ll
II I

rczultutclc.
*/

Pcutru vizualizarca

ei lie tastcaza

(lId ill

i II' I \ !I' . (', II I I j () clll':--,Il' Ull c.uactcr j"ulo:;illd lunctia scan]: - "Iisc"!,, co<l\lI/\5CII :11cnractcrului rcspcctiv.
(',II';

<AlL>-F5
Se revinc in fercastra 2.19 de cditarc actionind
0

tasta oarecare.

{'II,tl

scarlt(II%C",
Pi. intf (1I{t'id\n"
I)UI,~;{"f\('t.il)lh\Ll

&car);
I

celr); u l:"l~;Ld p(~r\L:.lu d CUllLi"nUi"l.");

Sii se scric un program care citcste un intreg zecimal de eel rnult 9 cifre si-l afiseaza in zecimal, octal ~ihexazecimal.

qcl:ch ();
)

PROGRAMUL BII19
.include <stdio.h> main () /* citcstc un intrcg zecimal de ccl mult 9 cifrc si-l afiscaza in zccirnal, octal si hcxazccimal long i; scanf ("%ld", &i); printf("%ld\n%lo\n%lx\n",i,i,i)
}

') 17 Sa sc xeric uu program carl' citcstc numc lc ~i prcnumclc unci pcrsounc separate prin spatii albc, apoi ufiscaza prcnumclc pe un rind ;;i muncie pe rindul urrnator.

*/

PROGRAMUL 81117
Ninclude <stdio.h> Rinclude <conio.h> HId in ( ) Ii! ·ci!c~tc numclc si PiCiHB11Ck unci pcrsoanc separate prin spalii albc: - ufiscaza prcnumclc pc un rind si 1l11111clc pc rindul urmaror */
chdr char nUincl 5:JJ; premJl1\<c[2S5);
(tiS",

2.20

Sa se scric un program care:


citeste
0

data calendaristica

tastata sub forma:

zzllaa; afiscaza data respcctiva


nurne. p rerunnel:

sub forma:

sCdnf(<I'~!:3
j::)uts

19aa/llIzz unde:
;:l

(prenUllle),'

pu L ~,; (llUlllQ) ; put,s (",\('tlunilt. 'I':;lch


)

ic

\:,,1;';1.:';1

pcntru

c ou ti nuovl

zz
:

- Doua cifrc ce reprezinta - Doua cifre ce reprezinta - Doua cifrc calcndaristic

ziua din luna: 01,02, numarul lunii: 01,02, doua cifre

. , 12. ale unui an

(I ;

II aa

2.1 X Sa se scric un program


ali~caza
111

zccimal

Gilt: citcsic un intrcg zccirnal de ccl mult 4 cifrc si-l octal ~i hcxazccimul.

ce reprezinta ultimele care incepe cu 19.

PROGRAMUL 81118
~I

Programul are la intrare 0 succesiune de 6 cifre care pot fi preeedate si urmate de spatii albe. Ell' pot f citite cite dou a folosind de trei ori specificatorul de format %2d.

i no i ud-.
i n ()

<:;:tdin.

h> in zccimal,
·i

PROGRAMUL BII20
#include <stdio h> main () /* - citestc 0 data calcndarisiica sub forma: zzllaa, - 0 afiscaza sub forma: !9aa/ll/zz_ */ int zi; int luna;

ffl/\

/- cucsrc

un Ifl!rq; /('("il1lal de cc! Inull 4 cilrc !'i-l aliscnza

octal S! hcxa/t·t'tlll~li .i nr.


print

i:
.'. i I ; I {'<>'~,d\n", i):

"(',, tl [ ( .. "i"

76

77

int an; scanf("%2d %2d %2d", &zi,&luna,&an); printf("19%02d/%02d/%02d\n",an,luna,zi);


)

3. EXPRESII
o expresie, in limbajul C, este fermata dintr-un operand sau mai multi legati prin operatori.
in fata, Deci cifrcle 1,2,...,9

Observatle: La afisare s-a folosit specificatorul de format: %02d Acesta afiseaza cifrele cu un zeronesemnificativ se afiseaza ea 01,02, ...,09.

3.1. Operand
Un operand po ate fi:
0 0

constanta;

2.21 Sa se scrie un program care citeste datele de mai jos ~iapoi afiscaza tipul operatiei citite pe un rind, iar celelalte date pe rindul urmator:
Tip operatic dcnumirc UM cod prot cantitatc

REZISTENTA

OIOKO

123456789

15

1000

PROGRAMUL

BII21

#include <stdio.h> #define MAXDEN 30 main () 1* citcste un rind de date de la intrarca standard si Ie afiscaza astfcl: - tip operatic pc un rind; - cclclaltc date pc rindul urmator. "! char den[MAXDEN+l]; char tip[2]; int val; char unit[3]; long cod; float pret,cantitate; scanf("%ls%30s %3d %2s lId If %f",tip,den,&val,unit,&cod, &pret,&cantitate); printf ("%s\n", tip); printf("%s %03d%s %ld %f %f\n",den,val,unit,cod,pret, cantitate) ;

constants simbolica; numele unei variabile simple; numele unui tablou; numele unei structuri; numele unui tip; numele unci functii; referirea la elementul unui tablou (variabila eu indici); referirea la clementul unci strucruri; apelul unci functii; expresie inclusa In paranteze roiundc. Unui operand li corespunde un lip si 0 valoare. Daca tipul operandului este bine precizat In compilarc, valoarea operandului se dctcrmina fie la cornpilare, fie
-

la cxccuric.

Exemple: 1.
1234
0 consiarua iutrcaga constant de tip info ESIC

zccimaln

de tip int, Reprczinta

un operand

2.

Oxalb2

[sic 0 constunta unrcaga hcxuzccimala operand constant de tip unsigned. Fie dcclnratia
t loat
d

de tip unsigned. Rcprczinta

un

1))2;

Observatie: Tipul este un caracter: I (intrare); E (iesire); T (transfer) etc. Citirea lui se face folosind specificatorul '%ls. Acesta permite eliminarea eventualelor caractere albe care ar putea precede litera ce defineste tipul. 4.

Numele
alb2

cste numelc unci varinbile simple, dcci reprczinta float. Fie dcclaratia
in t; t"b I I (l J ; tab[2]

un operand.

EI arc tipul

Este

rcfcrire 1<1lementul al trcilea al tabloului lab. Reprezinta c

un operand

78

79

de tip int. Numclc


tid,

e.

opcratorii binari aditivi + ~i -. Operatorii unari sint mai prioritari dccit cei binari, iar operatorii multiplicativi

1111111de unui tablou ~i dcci cl rcprczintu un operand. [I cslc de tip "adrcsa de intrcgi de tip int" (poin/er /(1 iII!), adieu arc ca valoarc ndrcsa unci zone dc mcrnoric care contincintrcgi de lip int, Sc utilizcaza in mod lrccvcnt ca paramctru in apclul functiilor. cstc

5.

sum(n,x)

Estc un apcl al functici .1'11111. Rcprczinta un operand ul carui tip coincide cu tipul valorii rcturuatc de Iuuctia .1'11111. Functia .1'11111 ponte f npclata cu operand daca rciurucaza 0 valoarc.
6. ( oxp r cs i e )

Opcratorii unari au acccasi prioritatc. Ei se asociaza de la dreapta spre stinga, Opcratorii multiplicativi au acecasi prioritate. De asemenea, operatorii aditivi au acccasi prioritatc. Operatorii binari se asociaza de la stinga la dreapta. Opcratorul unar + nu arc nici un cfcct, Operatorul unar - are ca erect negativarea valorii operandului pe care-l precede. Opcratorul * reprezinta opcratorul de irunultire al operanzilor la care se
aplica.

Lstc un operand
parantczc,

al carui

tip coincide

cu tipul cxprcsici

inclusa

intrc

3.2. Operatori
Opcratorii pot fi 11I1(1ri sau binari, Un opcrutor uuar sc aplica uuui singur operand. Un operator binar sc aplica la doi opcranzi. Opcrutorul binar sc aplicu la opcrandul cure il precede imcdiat 0i lu cure il lII'IllCaZ,1 imcdiut. Operatorii . !imbaju!ui C nu pol avca ca opcranzi constante sir (siruri (I~ caractcrc). De ascrncnca, cxista limite III aplicarca operatorilor lu anumi]t
opcranzr.

Operatorul / rcprezinta operatorul de impartire a valorii operandului care il precede la valoarca opcrandului care il urmcaza. In cazul in care ambii operanzi sint intregi tint, unsigned sau long), se realizcaza 0 impartire intreaga, adica rezultatul irnpartirii este partea intreaga a citului. Operatorul % se aplica numai la operanzi intregi si are ca rczultat restul impartirii intregi a valorilor operanzilor sai. Opcratorii binari + ~i - reprczinta opcratiilc obisnuite de adunarc ~i scaderc definite in matcmutica,
Excmple:

1.

Mai jos, sc dcscriu opcratorii lirubajului C. Mentionam C,I limbajul C~-~ couunc si al\i operator]. Ei VOl' fi dcscrisi ulterior, pe masura cc sc VOl' dcfini consiructiilc spccificc limbajului C++. Opcratorii limbajului C pot fi grupa\i in mai multc clasc: operatori aritrnctici, operator: de relatic, opcr.uori Illgici etc. La scricrca unci cxprcsii sc pot folosi opcraiori din acccasi clasa sau din clase difcritc. in principia, sc pot dcfini cxprcsii complcxc 111 care sit se utilizeze operator! din toatc clasclc. La cvaluarca unci astfcl de cxprcsii cstc ncccsar S[I se tina scama de prioritaulc opcrutorilor care apuriin dilcritclor clasc de opcratori, de asociativitatca opcratorilor de acccasi prioritatc ~i dc regula conversiilor
itnplicite.

1234 si +1234 sint cxpresii care au acccasi valoare ~i tip. Prima se reduce la operandul 1234 care este 0 constanta de tip int. A doua se compune din operandul 12341a care se aplica operarorul unar +. Cum acesta nu are nici un elect, ccle dOU~1 expresii au aceeasi valoare ~itip.
-1234

2.

estc 0 cxpresie care sc compunc opcratorul unar de ncgarivarc,


3.
7/3

din operandul

1234 la care se aplica

Deoarece

opcranzii sin! intrcgi, sc rcalizeaza Se obtine valoarea 2 de tip into


7%3

impartirca

intreaga a lui 7 la 3.

4.

Expresia arc ca valoare restul impartirii lui 7 la 3, deci 7%3= I.

3.2.1. Operatorii aritmeticl

5.
calculclor cu date de difcrite

-7%3

II

Opcratorii aritmctici sc utilizcazu la cfcctuarca tipuri predefinitc. Accstia suu: a. operatori i unari + ~i-; b. operatorii binari multiplicntivi * /;;i 'Y..;

Expresia arc eft valoare rcstul nnpartirii lntr-adcvar, -7/3=-2 si -7=(-2)*3+(-1), dcci restul impartirii cste -I.

lui -7 la 3, deer -7(~"O3=-1.

xo

81

Exercitii: 3.1 Sa se scrie un program care citestc valoarea lui .r, calculcaza valoarea polinomul p(x)=3x**2-8x+7 si afiscaza rczultatul, Variabila x este de tip intreg. Mentionam ca aici ~iin continuare prin a**b notam ala puterea b. BIII1

Ohservatie: Constantclc flotante 3.3 3.5, 9.8 .:;i J 7 sc considcrn de tip double.

PROGRAMUL

S,\ sc scrie un program care circstc vnloarca lui x, calculeaza valoarca polinornului a(x)=3x**20-6x**16+XX**9 7x**5-f-l 0' a 1.: iscaza " rczu Itatu I. , , . " -. .. Calculcle sc fac III flotanta dubla prccizic.
!)\IICI·'" 11"),'\1·1·

~include <stdio.h> main () /* - citestc valoarea lui x; - calculcaza valoarea polinomului 3x**2 - 8x + 7; - afiscaza rczultatul. */ int
Xi

In acest exemplu intcrvin expresii de forma: x*x* ... *x

ale 1· ur

.r.

I)c aceca, pcntru a cvita

printf("tastati valoarea scanf("%d", &x); printf{"x=%d\tp(x)=%d\n",


)

lui x="); x, 3'x'x - 8*x


+

l~ndc x sa se repete de 20 de ori, vom apcla functia pow care rcalizcazit ridicarca 10\putcre. Ea arc prototipul dcfinit mfisicrul niath.h ~iacesta csrc:
7 );

double pow( douhle x, double y): La revenire se relurncaza x**y, rezulraurl fiind de tip douhlc. PROGRAMUL partial
#include #include

Observatie: Rezultatul calculului este incorect daca eel putin un rezultat depaseste intervalul valorilor de tip int ([-32768,32767]).

BIII3

<stdio.h> <math.h> lui x:

In general, daca operanzii unui operator binar au acelasi tip f, atunci rezultatul aplicarii operatorului arc tipul f. in cazul in care rezultatul este in afara intervalului de valori corespunzator tipului I, rezultatul aplicarii operatorului este eronat. Daca un operator binar se aplica la operanzi de tipuri diferite, se aplica regula conversiilor irnplicite (vezi mai jos). 3.2
Sa se scrie un program care citeste valoarea lui x, calculeaza valoarca polincmului f(x)=3,5x**3-9,8x+3,7 si afiseaza rezultatul. Calculele se fac in flotanta dubla precizie.

main () /* - citcstc valoarca

- calculcaza si atlseaL:I valourca pnlillon1ului: a(x)~3x"2()-(,x"li'l Xx**9-7x" 5+1" */ double x;

printf("tastat:i valc)urea ]\.Ii x .. } ; scanf("%lf",&x); printf("x=%Q\talx)=%g\n",x, 3.0·powlx,20.0) 6.0·pnw(x,160} 8 . (J' I)(M ( X • Y . () ) 't , U* I'''''! ( ;-: " . 0 ) ,
+

.l. 0) ;

PROGRAMUL

BIII2

3.4

Hnclude <stdio.h> main () f* - citcstc valoarca lui x; - calculcaza si afiscaza valoarca poliuomului 3,5x**3 - 9,8x + 3,7. */

polinornului-

Sa sc scrie un program care cilc'5le valoarca

variabilci

x si a cocficicntilor ..

q(x)'='c4 *x **4+c3 *x ** 3+c2 *x**21 c 1"x+ctl,


calculcaz',"i valo',lrca polinomului "11 .
til

double

Xi

otanta clubb prccizic.

qfx) -, si

alisc·1Z'!
..(.<.

rC711!t·\'111 (-"11 II .u . d_ ell C C


-,

,t· ~c 'Ie .,

printf("tastati valoarea lui x = "); scanf("%lf", &x); printf("x=%g\tf(x)=%g\n",x, 3.S·x·x·x


}

- 9.S·x

+ 3.7);

C',llcltlul valorii unui polinorn sc ponte face '·1')1("),"1·111·1 ' . , 11I1lC(ia de bibliolcca 1'0 IP. hi arc prototipul dcfinit in 1;0il~rlll 1I/1I1!J.IJ:;;i ('sIc:
double poiy(dollble .v, illl
II,

double

eli);

NelllrJ1Cllzri

valoarcn

polinotnului

c!1'

.V,I"I/I/

II,

pcntru

vnloarca

lui .r,

82

cocficicntii polinomului fiind cIOI,clll, ... cl n]: clUI estc tcrmcnul liber: e[ 11 estc cocficicntul lui .v; In general, c] i] cstc cocficicntul lui .v fa putcrca i.

lit-32 arc en valoare codul ASCII al acelceasi litere, dar mario De obicci, difcrcnta 32 dintrc codurile ASCII all' aceleeasi litere, se exprima mai sugcstiv prin exprcsia:
'a'-'A'

PROGRAMUL
II
itl(']1It!\· .

BI1I4
:;l (li(l.ll··

llinclud(~

<f!\d.Lh.Il>

main

(I

it.

circstc valoarcu lui x si cocficicmii ([01,clll, ... ,c[41 ui polinomulu: q(x)"'C14 I'x **4+c[Jj*x* *3+c[21*x* *2+cll J*x+cl OJ . calcnlcaza vnloarca polinornului qtx):
ar"Ca/;\ 10ll\I;\llIl. 'j

Aceasta exprcsie are doi opcranzi care sint constante caracter, deci fiecare are tipul into lnseamna ca tipul cxpresiei de mai sus este int. in acest fel, eodul ASCII al literei mari se obtine ell ajutorul expresici: lit-('a'-'A') care se scric mai simplu:

(juul)1.c

x , C i. S j;
1111 K ");

pr-illtf("v,,'lJodrt'd "Ciltl

t ( "'1, if " , & x I ; p r in t; ("co{;,f: i c i.en r.Li

lit-'a'+'A' PROGRAMUL BIII5


#include <conio,h> main () /* citcstc ell ccou de 13tastatura 0 litera mica si 0 afiscaza ca litera marc OJ
(

po Li nomulu i \n");

p r i n t.I ("'c'O "I; s c o n f ("'1,] f", ".c [OJ); pt"int[("cl " "I; s c a n f ("%U" ,&c [ L] I; printf("c2 "I; scanf("'I;lf",&c[2J I; pri.nlf("c] "I; sc"nf("~,lf",&c[31) ;

putchlgetche()

- 'a' +

'A'I;

printf("c4" "I; scanf("%lf",&c[4J I; printf("x=%g\tq(x)=%g\n",x,poly(x,4,c))


}

Observatie:
;

in acest program se presupune ca se tasteaza la terminal 3.6

litera mica.
0

3.5

Sa sc scric lin program care citcstc cu ccou de In tastatura afiscazu en litera marc,

litera mica si

Sa se serie un program care citeste cu ecou de la tastatura aflseaza ea litera mica.

litera mare ~i 0

I
I
~.

Couvcrsiilc litcrclor rnici in litere mari sc rcalizcaza simplu in cazul utilizarii codului ASCII. lntr-adcvar, codurilc ASCII ale litcrclor mici sc alb in intcrvalul 197,1221, iar ale iitcrclor mari in intcrvalul 165,901· Accstc coduri corespund litcrclor in ordinc alfabctica:
CudulASC11 a b 97
(IX ')9

In acest caz codul Iiterei mari se aduna cu valoarea 32, adica eu diferenta 'a'-'A', PROGRAMUL BIII6

#include <conio,h> rna in () f* citcstc ell CCOll e la tastatura 0 litera marc si 0 afiscaza ea litera mica • f d
{

putchlgetchell }

'a' -'A');

I I!

A
II C

(,5 (,6 (,7


')0
-

3.7

'-~--~.-----.('udull\SCII al unci lucre man sc obtinc dill codul ASCII nl ucclccasi lucre mici, scuziud vulourca 32. Dcci, clara v.u iahilu iii are ca valoare codul ASCII al unci lucre mici, atunci cxprcsia:

122

!.

Sa se scrie un program care citeste un numar ce reprezinta aria unci suprafete exprimata in jugare. Se cere sa se exprime aria respectiva in hectare, prajini patrate si stinjeni' patrati. Avcm: l jugar == 576 prajini patrate 1600 stinjeni patrati
=

5754,6415 metri patrat].

85

PROGRAMUL

BIll7
aria unci supralctc in jugarc:

float. Altfel, daca unul din opcranzi estc de lip unsigned long, atunci celalalt operand se convertcste sprc unsigned long ~i rezultarul nplicarii operarorului estc de tip unsigned long, 5. Altfel, daca unul din operanzi cste de tip long, atunci celalalt operand se convertcstc sprc tipul long ~i rczultatul aplicarii opcratorului esre de tip
long. Altfel, unul din operanzi trebuie sa fie de tip unsigned, celalalt de tip int $i spre unsigned, iar rezulratul aplicarii operatorului cstc

.include <stdio.h> main () /.- circstc un nurnar cc cxprirna - afiscaza aria rcspcctiva ill: - prajini patratc: - stinjcni patrati; - hectare. 0/ double aria;

scanf("%lf", &aria); printf ("aria=%g jugare\n", aria); printf ("aria=%g praj ini patrate\n", aria *576) ; printf("aria=%g stinjeni patrati\n",aria*1600); printf,"aria=%g hectare\n",aria*O.57546415);

6.

acesta se convcrtcstc de tip unsigned.

Aplicind regula de mai sus, In ficcare operator curent, in procesul de evaluare a unci expresii, se determina in final tipul expresiei respective.
Exemple:

3.2.2. Regula conversfllor impllcite


Aceasta regula se aplica la evaluarea expresiilor. Ea actioneaza atunci cind un operator binar se aplica la doi opcranzi de tipuri diferite. In cazul in care un operator se aplica la doi operanzi de tipuri diferite, operandul de tip "inferior" se converteste spre tipul "superior" al celuilalt
operand si rezultatul este de tipul "superior".

1.

int c;
c- 'a'· ...A' '

Consrantele caracter 'a' Si 'A' sint de tip int, dcci toti operanzii sint de tip int, Nu este necesara niei 0 conversie pentru evaluarea cxpresici.
2.
int i; 12345"i

Regula conversiilor implicite arc in vedere si niste conversii genera Ie independente de operatori. Ea sc aplica in mai multi pasi, in ordinca indicata mal jos. Inainte de toate se convertesc operanzii de tip char ~i entun (acest tip va f definit mai tirziu) in tipul into Daca operatorul curent se aplica la operanzi de acelasi tip, atunci se executa operatorul respectiv, iar tipul rezultatului coincide cu tipul COl11nl1 al operanzilor. Daca rezultatul aplicarii operatorului reprezinta 0 valoare in afara limitelor tipului respectiv, atunci rezultatul este eronat (are loc 0 "dcpasire"), Daca operatorul binar curent se aplica la operanzi diferiti, atunci sc face 0 conversie inainte de executia operatorului, conform pasilor de mai jos: I. Daca unul din operanzi esre de tip long double, atunci cclalalt operand sc converteste spre tipul/ol1g double si rezultatul aplicarii operatorului estc de tip long double. Altfel, daca unul din operanzi este de tip double, atnnci celalalt.operand se converteste spre tipul double ~irezulratul aplicarii operatorului este de tip
double.

Opcranzii 3.
int ii

sin! de tip int, cxprcsia cste de tip int; rczultatul cronat daca este in afara intervalului [-32768,32767].
long double a*3+i a;

inrnultirii estc

Tinind seama de prioritatea operatorilor, adunarea; expresia se evalueaza astfel:


e

intii se executa

inmultirea,

apoi

I'C

convcncstc

sprc long double (regula I), se rcalizcaza

inmultirca

~i

rezultatul

este de tip long double;

.. Exercitli: 3.8

2.

la rezulratul inrnultirii se aduna i dupn ee, in prealabil, i se converteste spre long double, deci expresia este de tip long double.

3.

Altfel, daca unul din operanzi este de tip float, atunci celalalt operand se converteste spre tipul float si rezulratul nplicarii opcrarorului cstc de lip

Sa sc scric un program care citeste doi intregi de In intrarea standard si afiseaza media lor cu 0 zecimala,

86

87

PROGRAMUL BII18
II!"

.include i II () /' int


(1,

<stdio.h>
,'il,',I\'

limbajclor C si C++. f'rototipul ei estc:


,1I1111Ic'i1,'" "11" ;1,'(1111"):1 "'/

,I." II II lc·r.1 ""1',,,,'''''11111'<1[;11,,1'


,\,1, "h) ;

double siuulouhlc); ;;i sc alb in fisierul math. h. Paramctrul functiei este masura unghiului in radiani pentru care se calculeaza valoarca tunctici sill. Convcrsia rnasurii unghiului din grade scxagesimale in radiani se rcalizcaza folosind exprcsia: (g+m/60.0+s!3600.0)*PIII80.0

h: ('''1,0 'I,d",

!;C;lI1 f )

In ill t l ( "",

'I.d\ t IF 'L d \ t "!l'ci i d '", I l. \ II " , ,I, I J, (d I III / .. . ()L) ; ~

Observatii: 1. Pcntru calculul medici sc Ioloscstc cxprcsia:


(a+b)/2,Of

unde
PI'" 3.14159265358979 PROGRAMUL ambii 81119

I ~;I sc

"V;I

lucazu as( Id:

Sc culculcaza suma a+b: rczuliatul cstc de tip int, deoarccc opcranzi sint dc tip into Dnca surna nu apart inc intervalului

.include <stdio.h> lIinclude <math.h> jjdefine PI 3.14159265358979 main () I" citcstc masura unui unghi in grade scxagcsimalc si afiscaza valoarca functici sin pcntru unghiul rcspcctiv .• / int
9,nl,S;

• 2.

1-3276~J27671, rczultatul csic "ronal. Rczultatul adunarii se convcrtcstc spre/loal, dcoarccc cclalalt operand estc de tip/loal, apoi sc face impartirca si rczultatul cstc de tip/loat.

Daca s-ur 11uti lizat cxprcsia (a+b)/2.0 suma a+b 5-a1' fi convcrtit sprc douhlc dcoarccc double; in acest cal. rczultatul cstc de tip double, unpartitorul cstc de tip
)

scanf("%d %d %d", &g,&m,&s); printf("grade:%d\tminute:%d\tsecunde:%d\n",g,m,s); printf("sin=%.13f\n",sin((g+m/60.0 + s/3600.0)*PI/180.0));

3.

Exprcsia
(a+b)/2

3.2.3. Operatorii de relatie


impartirca
II

realizeaza

de accca, pcntru rczult.uul coree I.

intreaga dintrc opcranzii a+b si 2 care sint de tip int; ;;i h de parituti dilcritc, cxprcsia de mai sus IlU da

Opcratorii
< <= >
>=

de relatie sint 4:
mic; mic sau cgal;
marc;

3.9

Sa sc scric Ull program care ciicstc rnasura unui unghi in grade scxagcsimalc si aflscaza valoarca lunctici sinus pcntru unghiul rcspcctiv, Masura unghiului
I; illS

- mai - rnai - mai - mai

marc sau ega I.

ill grade scxugcsimalc

sc tastcaza sub forma:

o expresie
unde:

Ei au acccasi prioritatc, care estc mai mica decit a operatorilor de forma relatie £2 - Sin! expresii, arc una din valorile 0 sau I.

aditivi.

£1 operator jie lntrcg cc rcprczinta


-

unde: g
/II

gradclc.

£1 si £2

'.

Intrcg cc rcprczinta Iuncuci sinus

miuutclc, functia
sill aflata

s Pentru culculul

- lntreg cc rcprczinta sccundelc, sc apclcaza ill biblioteca

Astfel, cxpresia arc valoarca 1, daca valorile celor doua expresii satisfac relatia prin care acestea sint legate si 0 in caz contrar. De obicci, se spune des pre 0 expresie relationala ca ea arc valoarca adevdrat daca subexprcsiilc ci satisfac operatorul relational prin care sint legate; in caz 89

88

-~.,--~-,,,,,.--,-,---,-,-.,, .~

contrar se spune ca cxpresia arc valoareaJitls. in limbajele C si C++ nu exista valori logice spcciarc. Valoarea fals se reprezinra prin valoarca 0 (zero), iar valoarea at/eve/rat printr-o valoare diferita
de zero.

EI operatorilc unde: E I si E2

__ cgu!i/([te F;2

- Sint cxpresii,

are una din valorile

0 sau I.

Exercltii:
3.10

Sa se scrie un program care citeste doua numere, primul este de tip int, iar al doilea este de tip double. Programul afiseaza valoarea 2 daca numarul flotant este mai marc decit eel intreg si 1 in eaz contrar.
numar se atribuie variabilei i, iar eel de al doilea

Astfcl, cxpresia de mai sus arc valoarea I, daca valorilc cxprcsiilor E I ~i E2 satisfac opcratorul de egalirarc prin care sint legale si zero in caz corurar. in primul CIIZ, sc obisnuiestc s:i sc spuna C{I cxprcsia de rnai SlIS cstc culcviiratc}, iar in eel de al doilca caz, ca ('<I csicfals«.
Exemple: I.
int a; long b;

Presupunem ca primul variabileij.


Atunci expresia f>i

Expresia

bco"a*a
arc valoarca adcvarat vnloarca E\ls (0). .( I) daca II cstc egal ell patratul

lui a; altkl

ca are

are valoarea I daca numarul flotant este mai mare decit eel intreg ~i 0 in caz contrar, Pcntru evaluarea relatiei de mai sus, valoarea variabilei i se convertcste spre double ;;i abea apoi se executa operatorul de relatie, Tipul cxpresici cstc into Programul de fata trebuie sa afiseze valoarea aeestei expresii marite cu I, ceca ce se obtine folosind expresia

2.

int

x:

Exprcsia x%A==O are valoarca adevarat


3.
int x;

daca x

('SiC

multiplu

de 4 ~i lids in

C<lZ

contrur.

(f> i)+ I Parantezele sint necesare deoarece operatorul + este mai -prioritar decit > . in lipsa lor, se compara valoarea lui/cu valoarca sumci i+ I. PROGRAMUL Bill 1 0

Exprcsia
x')!" I (j()1
()

arc valoarca
4. Exprcsia

adcvurat daca x
I

IIlI

cste lIlultiplu de I 00

~i ;.oC1()111(';11

coutrur.

'include <stdio.h> main () /. - citcstc pc i si f; - afiscaza 2 daca f csrc mai marc dccit i si I ill caz contrar */ int i; double

qr'! ('It,ll I) r:cw arc valourca udcvurat sfirsitul de Iisicr.

<.Iaca macroul

~~('/c1Ii1" a cit it

UII

curactcr

ditcrit

de

f;

5.
> i)

inc

x;
I

scanf("%d %If', &i,&f); printf("i=%d\tf=%f\t%d\n",i,f,(f 1

scanf {"'tid"

x)

+1);

Aceasta

cxprcsie
1111

arc valoarca

adcvarat

duca scanfn citit de la tcrrninalul


cililc Ill!
Sl'

standard tcuuinalul

intreg (.1·C(JIl!' rcturncaza uurrrarul cirnpurilor st:11Id:1nI). III Cil/. ('01111'<11', adica daca 1:1 intran'

de la alb 1111

3.2.4. Operatorli de egalitate


Operatorii != relatie, de egalitate sint doi:
egal: - difcrit.

mtrcg, cxprcsiu de mai sus arc vuloarca litis.

3.2.5. Operatorii logici


Accstia sint:
~ negatia lugica
L~& - ~i logic; ~ sat! logic,

Ei au aceeasi priori tate care estc imediat mai mica decit cca a opcrarorilor

de

(opt'J'alnJ'

IIIwr);

o expresie

de forma:

90

lJl

J. --.-----.--

.... ., ..--------.------

•.. --------,.-.-

.. ----------r--.--------

,..------

Neg;q.ia logica arc acccasi priori tate ca ;;i ceilal\i operator: unari ai limbajului C. De altfcl, roti operator: i unari au acccasi prioritatc care cstc irncdiat .mai marc

lJ!a

!a&&b 0

!1J&&a 0

!lI&&IJII!b&&~ 0

dccit cca a opcratorilor Exprcsia


ioperan«

multiplicativi,

-----+---'-----f---.----!-----.----I------.---t--------~

diferit de zero
(//J(>lwld

diferit de zero

o o

o o

'!~'c vuloarca zero (his) !laca


UIlU

arc

II

vn lome difcrita de zero ~i valonrca


0 cxprcsic

(adcvarar ) daca operand arc valoarca zero. Opcraiorul && arc prioritatca mai mica dccit cci de egalitate. forma: f:'/&&E2

diferit de zero

de

f-------------I·· ... ------I---I---

------------------------- .-------1 () ()
L- .. --'-_

o
!a&&nll

_L.•_.

difcrit de zero

-'L

arc valoarea I, daea cxprcsiilc E I si E2 sin! am be Ie diferite de zero. in rest, cxprcsiu de mui sus arc valoarca zero. Opcrutorul II arc prioritatcn imcdiat mai mica dccit npcratorul &&. Exprcsia
ElIiU

Din cele de mai sus rezulta ca expresia


!b&&a

arc valourca zero, daca .unbclc cxprcsii E I ~i E2 la care sc aplica opcratorul ll au valoarca zero. in rest, cxprcsia de mai SlIS arc valoarca llllll. Opcratorii logici binari (&&;;i II) se evalucaza de la stinga la drcapta. Daca la cvaluarca unci expresii 5e njungc intr-un punet in care se cunoastc valoarea de
adcvar (fals sau adcvarat) a intrcgii exprcsii, atunei drcupta punctului rcspcctiv, nu sc mai cvalucaza. rcstul cxprcsiei, aflata in

realizcaza sail logic exclusiv intre (/ si b. Pentru a=O t>i b diferit de zero, cxpresia de mai sus se evalueaza astfel: 1. Se evalueaza !a ~ise obtine valoarea unu. 2. Sc aplica opcratorul si logic la !a si b si sc obtine unu. Deoarece !a&&b este legat de restul expresiei prin operatorul sau logic, rezulta ca in aeest moment se poate afirma ca intreaga expresie este adevarata (arc valoarea unu). De aceea, in aeest eaz nu se mai evalueaza restul expresiei, adica termenul !b&&a. Exercitii: 3.11 Sa se serie un program care citeste un numar si afiseaza unu daca numarul respcctiv apartine intcrvalului [-1000,1 000) si zero in caz contrar, Daca notarn eu a nurnarul citit, atunci el trebuie a >= -1000 si a <= 1000 Acest fapt se poate exprima cu ajutorul expresiei: a >= -1000 && a<=1000. PROGRAMUL BIII11
#include <stdio.h> main () /* citcstc pc a si afiscaza 1I1lU daea numarul citit apartinc intcrvalului [-1000,1000] si zero in caz contrar */ double a;

Exemple:
1.
! (J&{~b

Daea it arc valoarca zero ~i b cstc difcrit de zero, atuuci cxprcsia de mai sus arc valoarca unu (adcvarat). lntr-udcvar, daca a arc valourca zero, atunci 'a arc valoarca Ul1U. Daca h cstc difcrit de zero, alunci ambii opcranzi ai opcratorului && sint eli lcriti de zero \ii dcci intrcaga cxprcsic arc valoarca unu. 2. II b Accastu cxprcsic arc valoarcu zero daca (/ arc valoarcu difcrita de zero, iar b arc vuloarca zero. in accst caz !a arc valourca zero ~ideei arnbii operanzi ai opcratorului II all valourcu zero. Conform dcfinitici opcratorului II, rczulta ca intrcaga cxprcsic arc valoarca zero.
!a

sa satisfaca

simultan relatiile:

3.

!.l&l.bll

!b,\&il

Accasta cxprcsic arc valoarca zero daca a ~i b au ambii valoarca zero sau amhii sinl difcriti de zero. in caz coutrar, cxpresia are valoarea unu, Acest lucru rczulta din tubcla de mai lOS:

scanf("%lf~,&a); printfl"a=%g\t%d\n",
}

a, a >= -1000 && a <= 1000);

92

93

3. I 2 Sa se scrie un program care citestc un intrcg din intcrvalul [1600,49001, ce reprezinta lin an calendaristic, afiseaza unu daca anul estc bisect ~izero in caz contrar sau daca anul nu apartine intcrvalului indica: mai sus. Un an, din calendarul gregorian, este bisect daca estc multiplu de patru ;;i nu de 0 suta sau daca este multiplu de patru sure, Accasta regula este valabila pentru anii care nu sint anteriori anului !600. Calendarul gregorian a fost introdus datorita faptului ca anul iulian a fost prea lung. Conform calendarului iulian, un an era bisect, daca era divizibil cu patru. Din aceasta cauza la 133 de ani se inregistrcaza 0 diferenta de 0 zi fata de anul tropic. In felul acesta, in anul 1582 s-a eonstatat 0 difercnta de 10 zile intirzicre si s-a hotarit corectarca difercntci respective convcnind ca dupa ziua de joi 4octombrie 1582 sa urmeze ziua de vineri 15 ocrombrie 1582. De ascmcnea, s-a stabilit ca durata unui an calendaristic sa fie:

este adcvarara.Ticci

anul csrc bisect daca cstc adcvaraia


cxprcsia:

cxprcsia (I) sau (2),

adica daca estc adevarata

an'y.>4==O&&<1n%.1 OO!=Ollan%4()()=O "0


PROGRAMUL
#include

811112
<strlio.h>

este multiplu

main () !* citcsrc lIll intrcg care rcprczinta un an calcndaristic din intcrvalul [1600.490111 si afiscuza t daca anul cstc bisect si zero daca nu csrc sau nu apartinc intcrvalului indica! */ int an; scanf("%d", &an); printf('an=%d\t%d\n",an, ~n>~1600'&an <= ~900&&(nn'4 an%100 r, 0 II an'/,40() 0»);

0 &&

365+ 1/4- 11100+ 1/400=365,2425 365 - Numarul Adaosul

zile
3.13

ln aceasta expresie termenii au sernnificatia:


de zile ale anului iulian.
0

sa se scric un program care citcstc un intrcg din intervalul 11600.4900! cc reprezinta UI1 an calendaristic ~i afiscaza mnnarul de zilc din anul rcspcctiv,
811113
lin an calcndaristic
rcspccriv
+/

114-

de un sfert de zi, adica de calcndarului julian.

zi la patru ani, conform

PROGRAMUL

lIlOO
/1400

- Eliminarca unci zilc In ficcarc 0 sura de ani. Deei un astfcl de an nu mai cste bisect, desi el estc multiplu de patru,
- Adaugarea unci zile la ficcarc 400 de ani. in (clul acosta, un an multiplu de 400 arc 0 zi in plus, deci este bisect.

#include <stdio.h> rna i n () !* citcsu: lin inlrcg care rcprcvintu


ilfiseaza
(

din intcrvalul

r I (,()(),~90()15i

numurul

de zilt:: dinanul

int ani scanf ('%d', &an); printf('anul %d are %d zile\n", 365 + (an%4 0 &&
an%100 !

Calendarul gregorian, avind durata anului egala cu 365, 2425, arc 0 eroare de aproximativ 26 de secunde. Accasta inseamna ca regula indicata mai sus pentru a stabili anii bisecti (care au 366 de zile) este valabila pentru anii unnatori anului 1582 si care nu sint ulteriori anului 4900. Intr-adevar, eroarea de 26 de secunde dintr-un an gregorian devine o zi abea la aproximativ 3323 de ani, deci dupa anul 4900 (1582+3323=4905). De accca, regula de mai sus se ponte aplica pentru anii din intervalul [1600,4900J. Daca notam ell all anul calendaristic, atunci el este bisect daca de excmplu: an%4=0 (an estc multiplu de 4) an%IOO!=O (an nu este rnultiplu de Deci anul este bisect daca expresia (I) an%4==0
0

an,

II

an%400

==

0));

Ohservatie:

In accst program sc considers ca anul tastat In terminalul intcrvalului [1600,4900]. 3.2.6. Operatorii logici pe biti
Opcratorii
« »
1\

standard apartinc

suta).

logici pc biti sint:


unar):

&& an%JOO!=O anul cstc bisect ~i in cazul in care cxprcsia (an este multiplu de 400)

-. complement E!t[1 de U!lU (operator - dcplasurc stln,gn; - dcplasarc drcapta:

este adevarata. De asemenea,


(2) an%400=0

s:

- ~ilogic pc hi! i:
- S:tll cxclusiv logic pc bi!i; - sal! logic pc hili.

94

95

Accsri opcratori

sc ap lica la opcrauzi de tip intreg. Ei sc executa bit ell bit ~i

oncranzii sc extind In 16 bin daca cstc ncccsar. . Complcmcntul 1:I\a de \;11l1 arc acceasi prioritate en ceilal\i opcratori uuari. Ei schimba ficcarc bit i al opcrundului Cll zero :;;i liccarc bit zero ul uccstuia Cll I. Exemple:

ell lin numar de pozitii binare egal cu valoarea Ac~asla operatic este echivalenta Cll inmultirea

celui de-al doilea operand cu puteri ale lui 2.

al sau.

I.

~1234 1234 sc reprezinta 10011010010 in binar astfcl:

In mod analog, operatorul » realizeaza 0 deplasare la dreapta. a valorii primului sau operand Cll un numar de pozirii binarc cgal cu valoarea celui de-al doilc,~ operand al 5,tU. Accasta operatic cste echivalenta cu 0 impartire cu puteri ale lUI 2.

Example: 1. 1;t!~1 I: de 2.
int a;

Se cxtindc 1'1 1(1 hili: 0000010011010010


apoi sc aplic<l opcraiorul de complcrncuturo

a«3
arc aceeasi valoare ca :;;1 a*8 adica se inmulteste
int
ai

[ I 1 I 10 I 1001 ()I 101


sau in octal:

a cu 2 la puterea 3.

0175455 2. ·--1234
Operatorii unan au acccasi priori talc 0i sc asociaza de la thcapta la sunga, deei intii sc rcalizcaza ncgntivarca ~i upoi complemcntarea Etta de l . Numarul 1234 sc rcprczinta ill binar: 100 I 10100 I()

a»4 arc aceeasi valoare ca si


a/16 adica a se irnparte la 2 la puterea 4.

3.

~0«3
Aceasta expresie se evalueaza a.Se extinde zero pc 16 biti: astfel:

sc ncgativcaza: 1111101100101110
apoi sc complcrncntcnza I 00 I I 0 I 000 I sau in octal:

1;1\;\ dc I:

0000000000000000
b. Sc aplica operatorul de complementare fata de unu:

02321
3. -~1234 in accst caz, inti! sc dctcrmina complcmcntul
I~l\il de I, apoi se ncgariveaza

1111111111111111 c. Se fac 3 deplasari spre stinga: 1111111111111000


sau in octal:

1111111'lrul. 1234 III binar cstc:


1001 I 0 I 00 I () sc cornplcmcntcazn lil\il de I: I I 1 I 101 I 00 1() I I () I sc ncgativcnza:

177770 4.
~H)«3)
Rczultatul din cxernplul precedent sc complemel1teaza fatii de unu:

0000000000000111

100 I 10I 00 I I sau in octal:


02323

Opcratorul
1&1=1 1&0=0 O&I={) 0&0=0

jr logic pe bui se executa

bit cu bit, conform

tabelei de mai jos:

Opcratorii tic dcplasare siut operator! binari. Fi all acccasi prioritatc, care cstc imcdiat mai mica dccit a opcratorilor aditivi :;;iimcdiut mai marc dccit prioritatca
opcratorilor Opcratorul rclationali.

Operatorul & are prioritatea imediat mai mica decit operatorii utilizcaza In anulari de bili.

de egalitate, ~

Se

« rca lizcnzn () dcplasnrc I"

stingll

:.1valorii primului

sau operand

96
97

Excmple: l.
int a;

a&0377

I. mai plI!in scmnificativ


octala 0377la 16 biti:

int

i:1;

are ca valoarc, valoarca ocrctului


iI.

al valorii variabilei

nAn are valoarca O. illtr-adevar. c,-i doi opcrunvi Iiind i(iL:lltici. xc executa opcratorul « pcntru hili iLil'lltici. ori in accst caz c] ;1\'(: ca rczultnt pe zero. 2.
int n;

lntr-adcvar, sc cxtinde constanta 0000000011111111

apoi se face si logic pe hili intre accasta

constanta

si valoarea

variabilei

a.

a"l arc 0 valoaro care dcpindc de pari tate a lui a. i nrr-adcvar, at unci ultimul sail bit cstc zero. daca
i/

Se pastreaza 2.
int a;

ultimii 8 biti ai lui a, primii 8 biti anulindu-sc.

cstc par.

a&OI77400

are ea valoare,

Aceasta valoarca: 1]1]111100000000

valoarea lui a dupa ce S-I\U anulat ultirnii rezulta din faprul eli, constanta ocrala 0177400

8 biti ai sai,
arc in binar

Expresia

a"l setcaz[~ la.valoarca unu IIlti mu I bit a lui a. In felul acosta, rczulratul cel mai nne nurnar 1I11par care-t dcpasestc pc a. DaC;1 a cstc impar, atunci ultimul hit are valoan:a unu.
Exprcsia n"l care nu-l deniiscstc
111"'1 110=1
011"1 OI(H)

cstc cgal ell

3.

int

a;

a&0177776 arc ca valoare

cel mai marc

11l1111{1['

par cure

1111-1

dcpascstc

pc a.

Diferenta dintre operatorul si logic (&&) $1 operatorul si logic pe bit; (&) consta in aceea C{i primul se rcalizcazn global, fat::t de al doilea care se realizeaza
pc

anuleazn

ultimul bit a lui a. Deci, rezultatllicstc


DC

biti.

cgnl ell ccl mai marc

1I111ll[lr

par

. ;\'~a de cxcmplu, dacu arnbii opcranzi sint difcrir:

lntr-udcvar,

de zero. In schimb, x&y are valourca in accst eaz sc realizcaza 1111si P'' hili ell valorilc:

x=2

Z;i

y= 1,

atunci

x&&y

arc valoarca

1, dcoarecc zero.

Opcrato~lIl·.w;1I

iOgi(,'I/('

hi(i so executa hit cu bit. conlorm

tabelci de mai jos:

y=OOOOOOO()OOOOOOOI - ------- ..-"e'--- _----- __-_- - _ x& y=OOOOOOOOOOOOOOOO Operatorul


lOS:
1"1=0 1"0"" I 0"1=1

x=ooooooooooooooro

~ee~t op~ratol: nrc prioritatca imediat mai mica decit opcratorul pe bit! ( );;1 imcdia: mai marc dccit operatorul si logic (&&). Operatorul I se foloscstc la setari de biri,

SOli

exclusiv

sau exclusiv pe hili se executa bit ell bit, conform

tabclei de mai

Exemple: 1.
int
i'l;

all a:e. 0 vak~are a carui ultim bit este unu, indifcrcnr de valoarcu vari,lbilci a. Ccdal!~ bt.p coincid cu cci ai lui a. Dc acccu, valoarea an:slei cxprcsi, cstc eel mal rmc numar irnpar care I1Il cstc mai rnic dccu ».

l)"O""O

Operatorul ,\ are prioritatea imediat mai mica decit opcratorul zz. Se urilizeuza pentru a anula san pozitiona difcriri biti.

2.

int a;

alOlOOOOO arc 0 valnarc CII bitul eel mai scmnific.ui» sciut, indifL'rcnt de valoarca variabilei a. Ccilnlii hiti coincid CII cci ai lui a,

98

3.2.7. Operatorii de atribuire


Opcratorul de atrihuirc, in forma cca rnai simpla, sc notcaza prin caracterul """. El se utilizcuza ill cxprcsii de forma:
v=iexprcs Ie) uudc: v - Estc
0

din opcratorii: !%

* -+«

»&

1\

I sc foloscstc pcntru a face prcscurtari.

Accasta constructie Expresia v 01'= expresie cste echivalenta

variabila
Cll

simpla,

rcferentiaza

un element de:·tablou

eu expresia de atribuire:

(variabila

indici) sau de structura.

v=v op(expresie) Exprcsiilc de atribuire pot it tolositc peste lot in program undc cste legal sa apara 0 expresie. Acest Iapt permite adesc a sa se faca compactari in programul sursa, Exemple: 1.
int a;

Operatorul dc alriililirl' arc 0 prioruntc mui IIlICa dccit lo\i opcrutori: pe care i-am intilnit pina III prczcnt. De accea, parautezcle din constructia illdic,~:tilmai SlIS, de obicci Ill! sint neccsarc. " Opcrutorul de atrihuirc arc 'ca elect atribuircu valorii cxprcsici a!1at{\ ill drcapta scmnului de atribuire variabilci v, Ulterior 0 sa vedem ca in-stinga scmnului de atribuire se poate afla chiar a cxpresie care defineste a adresa. La 0 atribuirc sc face si 0 convcrsic daca cste ncccsar, Astfel, valoarea expresici din dreapta sernnului de atribuire se va converti spre tipul variabilei din stinga lui inainte de a se face atribuirea, daca cele doua tipuri sint diferite.
Expresia v=exprest e

a=10 variabilei a i se atribuie valoarea 10. 2.


int i;

i=i+3 valoarea variabilci i sc marcste eu 3. Ea arc ca valoare valoarea care se atribuie, iar ea tip, de forma: 4. 3.
int
j

este

0 expresie de atribuire. tipul variabilei v. Rezulta efl 0 constructie

ii

+=3 arc acelasi efect ca si expresia de la exernplul precedent. Expresia de atribuire: a[i*3+ 1OJU*2-3}=a[i*3+ 1OlU*2-3J*x se scrie prescurtat astfel: a[i*3+ 1OlU*2-3]*=x

v l=tv=expresie)

estc corccta si reprczinta tot 0 exprcsie de atribuire: lui vl i se atribuie valoarea atribuita in prcalabil lui v, facindu-se ~i conversie daca este necesar. Deoarece operatorii de atribuire se asociaza de la dreapta spre stinga, exprcsia de rnai sus se ponte scric fiirfl parantczc: v l=v=expresie In general,
0

Exercitli: 3.14 Sfl se serie un program expresiilor: 4x*x+3x 4x*x+3x+l eare citeste valoarea lui x, calculeaza valorile

cxpresic de atribuirc arc forma:

VII = .,.= v I = v= expresie

Valoarea expresici aflatc in partea dreapta se atribuie intii lui v, apoi lui v 1 si asa mai departe si in final se atribuic lui 1'11. Atribuirile sint precedate de conversii in cazul in care valoarca care se atribuie cstc de un tip diferit decit tipul variabilei la earc se face atribuirea. Pentru operatorii de atribuirc, in afara semnului = sc mai poate folosi ~l succesiunea de caractcrc: op= undo op este lin operator binar aritmctic sau logic pe biti. Dcci op poate fi unul
100

(4x*x+ 3x-l )/(4x*x+ 3x+ 1) si afiseaza valorile respective. PROGRAMUL BIII14

~include <stdio.h> main () /* citcstc pe x si afiseaza valorilc cxprcsiilor: 4x'x + 3x

4x·x+3x+l

101

(4x'x double x,y;

+ 3x - I )/(4x'x -} 3x + I)

*;

lx/
Ix}

Notcaza

partcu intrcngu a lui I' ([xl..:~x).


it

NO!L'az:1 partcaliaqionara

lui x ( [x j =x-] xl).

scanf("%lf", &xl; printf("x=%g\ty=4x*x + 3x=%g\n",x,y=4'x'x + 3*x ); printf("4x*x+3x+l = %g\t (4x*x+3x-l)/(4x'xt3x+l)\ %g\n",y+l, (y-l)/(y+l));

PROGRAMUL 811116
#include <s t.d io . l i > main j ) ;*-cilcsIL'Jl~x: - "IIS,'''/:I pc x , [x ], [x }; - calculcavn si afisclI/a vnlorilc cxprcsnlor: si

Observatie: Pararnetrul: y=4*x*x+3*x


din prirnul ape! al functiei printf estc 0 expresie intermediul ei se atribuie lui y valoarea exprcsiei de atribuire. Prin

71\1*1\1·3Ix]

+ 10

4*x*x+3*x Valoarea expresiei de atribuire coincide cu valoarea atribuita lui y. Tipul expresiei de atribuire coincide cu tipul lui)" dcci tipul ci cste double.
3.15

lnt i; double x,y; scanf("%lf", &x); printf ("x=%q\t" ,x); printf("[xJ~%d\t",i


printf("(x} printf("7{x){x) %f\n",y -

x);
=x
i);

Sa se scrieun
valorile

program expresiilor:

care citeste

valoarea

lui x, calculcaza

si afiseaza
I

printf ("7 l x l [x ] - 3 l x ] ;- lO"'td\n", 7*i'j


3(x)
+

10=%g\n",7'y'y

3*i
-l*y

+10); +10);

x**IO, x**20, x**30 si x**40. PROGRAMUL


#include #include

811115

3.2.8. Operatorll

de incrementare

sl decrementare

<stdio.h> <math.h>

main () 1* citcstc pc x si atiscaza valorilc cxprcsiilor:

x·OIO

x··20 x *"'3 0
x··40 *; double x,y,z;

Accsti operator! sint unari 0i au acccasi prioritarc ca ~i ccilalti operator: unari ai limbajului C. Opcratorul de incrcmentnre sc noteaza cu ++, iar eel de decrementare cu __. Opcratorul de incrcmcntarc marcstc valoarca opcrandului sau ell 1. iar eel de dccrcmcntarc Illiq;ureaza valourca opcrandului sail ell I. Acesti operatori pot Ii folositi prefixati: +roperand
-r-U

scanf("%lf", &x); printf("x=%g\tx**lO =%g\n", x, y printf("\tx**20 =%g\n", Z= y*y); printf("\tx**30 =%g\n", y'z); printf("\tx**40 =%g\n", z*z);
)

J J am J( I

pow (x ,10 .0) I ;

sal! postfixati:
(JJ!I'I'III

ul+r

operand--

3.16

Sa se serie un program care citeste valoarea lui x, afiscaza vulorile lui x, [x],

Ix},

calculeaza

si afiscaza

valorile

expresiilor:

7[x]*[x] ..3[x]+ I 0

in cazul sc rolosc~le In cazul sc foloscstc


Exemplu:

in care 1111 operator de incrcmcntnre sau dccrcmcntare csrc prcfixat, valuurca opcrandului la can: s-a aplicat npcralorlll respcctiv. in care un operator de incrcrncntarc sal! dccrcmenrare cste postfixal, valourca opcrandului dinaintca uplicnrii opcratorului respcctiv,

7 {x)
unde: 102

* [xj-J

{x )+10

Presupunern

ca .v arc valoarea

3.

Dnc11 consideram

cxprcsia

de atribuire Ifn

y=++x
atunci lui y

PROGRAMUL i sc atribuic .
cxprcsiu de atribuire valoarea 4 (la atribuire sc foloscste valoarca
#include #include

BI1I17

incrcmcntata) yo=x++

<stdio.h> <maLh.h>

Duca utilizam

main () !*. citcstc pc 11;


- calculcaza si afiscaza radacina patrata

din

11

*1

pcntru x=J, atunci lui y i sc atribuie vuloarca 3 (Ia airibuirc dinaintea incremcntarii). in ambclc cazuri valoarca lui x s-u marit cu J.

sc Ioloscstc

valoarca

long n' scanf("%ld", &n); printf("n=%ld\tsqrt(n)=%g\n",n,sqrtt(double)n))


}

3.2.9. Operatorul de fortare a tlpului sau de conversie expllcita (expresie cast)


Adcsca dorim sa spccificam Acest lucru cstc posibil Iolosind (lip) operand Printr-o astfel de constructic valoarea opcrandului se converteste spre tipul indicat in paranteze. in constructia de mai sus (tip) se considera ca este un operator unar. T! vom numi operator defortarc a tipului sau de conversie explicitd. Construcria de mai sus 0 VOIll numi expresic cast. Excmplu: Prcsupuncm
int
ni

Observatic:
sprc un tip dat. in accst program Ea are prototipul:
double

s-a utilizat

functia sqrt pentru extragerea

radacinii

patratc.

convcrsia valorii unui operand 0 constructic de forma:

sqrt(double);

Accst prototip 2.18

este definit in fisicrul math.h.

Sa se scric un program care citcste pe 11 de tip intreg ~i afiscaza valoarea expresiei /1/(11+ 1) eu 15 zecimale, BIII18

PROGRAMUL

'include <stdio.h> main () /* - citcstc pc n;

ca functiararc

un par.unctru

de tip double. Fie declaratia:


long n;

. calculcaza

si afiscaza

pc 11/(n+l) cu 15 zccima1c

*j

Atunci, pcntru a apelafcu


double
f (x=n);

paramctrul

II,

cstc ncccsar ca, in prealabil,

/1

sa se

converteasca sprc double. Accst lucru se poatc rcaliza printr-o atribuirc:


x;

scanf("%ld", &n); printf("n=%ld\tn/(n+l)=%.15g\n", (double)n/(n+l) );

n,

Observatie:
a parametrului intreg spre tipul double Exprcsia /1/(11+ 1) realizcaza impartirea intrcuga a lui 11 la /1+ J. Pcntru a obtinc citul impartirii cu 15 zeeimalc este ncccsar sa sc cfcctueze irnpartirca ncmtreaga. ln acest scop s-a convertit operandul /l sprc tipul double. in felul acosta, conform regulci conversiilor irnplicite, se convcrtestc sprc double ~i cel de al doilea operand ~i apoi sc face irnpartirea celor doi opcranzi 110Ian\i.

Un alt mod mai simplu dc convcrsie estc utilizarea unci expresii cast:
f t t doub l e j n l ,

Operatorul (tip) fiind unar, are acecasi prioritatc ai limbajului C.

ca si ccilalti opera tori unari

Excrcitii:
3. J 7 Sa se scrie un program numarul respectiv. care citcstc un intreg si afiseaza radacina patrata din

3.2.10. Operatorul dimensiune


Dimensiunca In octcti a unci date sau al unui lip se poate determina operatorul sizeof. E1 poatc Ii folosit sub forma: folosind

104

105

sizeol'dolif
StlU

sizcof Y
arc

S izeo fltlj))

\!~dOlli\.';i
(Cl\C!l!

70.

(k:O;jj'L'l'l;

Lildl.iid ;!rC

"1

L'ICl1h:IHl' III 10t:l1.

unde:

dahl

3. - Ponte fi:

i:~eut

..

lip

rcfcrircu la un clement de tablou (variabila cu indici); .. rcferirca la clerncntul unci srrucruri, Peate fi:

.. ..

un nurnc de variabila lin numc de tablou;


un nume de srrucrurn:

simpla;

3.2.11. Operatnru] adre sa


Opcratorul
:llirL:S:1 C'SIL' lII1:I1si sc IllliL':I/a prin CIr<lcll'rlii &, LI sc aplica

peuuu
Cl'a

u lietcnnina :ldn:S;1(ic- 111'-"'1'111 :1/(1l1l'l dl' In<.'llllitiL' ak)c:II:lu[I,'i lLill', III l'llmil 1lI:li simplel, <lCL'slljiL'l':II\11~c' I[I:\I/L\I/:I 1[1l'UIlSlrll\'\il dL' 1'0 !; [ [ I'll &n/lillc

..
Expresia
sizeof data

..

un cuvint sau cuvinrclc cheie ale \lI1\1i tip prcdcfinit: o construcric care definesrc un tip,

undc:
1/11111('

LSie numclc
C:I ill l'll'Iul

uncr 1':lri:lhilc simple sau al unci xtructur].


:1

tvknlion:llt1

11\eire' u unu» L'sIL' uumclc unui inhlou, .uunci :Iccsla dc' IIlCc'l'lii
/(lilci dL' lllc'lIl(lriL' :tlneill:1

poatc fi scrisa $i sub forma sizcof(datn). En arc ea valoarc dimcnsiunea operandului "data", Astfcl, daca data estc: numele unei variabilc simple numelc unui tahlou numel« unei
structuri etc.

in octeti a

arc

ca

valoarc

chiar

ildrl':;:1

rcspccriv. Dcci,
Aces! operator

ill nL'l'st cal

II\! -'l' tIl:li 1IIill/l':II:1 01lL'I'illllnti :1l!t\.'S:1 &,


SCi/lit

1;1i,llllillli

a I()st 1Ilili/:11 dc'jil li·L'l:VCIlI 1:1;lpc'llil i'unclic'i

- Atunei rezulrarul respective.

va f numarul

de octeri alocati variabilci de ocrcti al zonei de


!11C!110ric

Arunci rczultatul va f nurnarul alocatc tahloului rcspcctiv,

Mai i irz iu 0 S:I vcdcm ~I :illc' 1Ililil:ll'i .ilc :Iccs\ili \\pcl'alor, Fiind un opcrarorunar. l'l ,11'e' ;lCCl',ISipriorit.uc ('II si ceilalli UpLTllto!'i unnr: :Ii limbajului C.

mai

Opcratorlll tiF/ill,

unar & ;IIL' III lill1h:ljuH'i

i ,S! [) :tll:l lItili/ilrc

,IS:: CUIl1 sc

\:1

vc',il':1

- Atunei rczulratul va f IlU11lill'1I1 ocrcti al zonci de mcmoric de alocatc suucturii respective,

3.2.12. Operatorii parantoza


Par:!Illezek {'unqiilor. rotunde Sl' Ulili/C,I/;1 lil' ]lc'litnl:1 Inl'iudc' () l'\ple'Sic', til' 1:1 <IJ1l'llIl

Expresin
sizeof(tip)

are ca valoare numarul de ocreti alocari pcntru rcprezeutarca unci date Operatorul dimcnsiunc (siz('of) estc unar 0i are acecasi prioritate operatorilor unari ai limbajului C, Exemple: 1.
int
Xi

de

tip lip, en restul

Amintirn C{l 0 l'xpresil' inclusa in p:II';lnleZL' roiuudc i(ll'tllL'a/!l lin o pl.TIl I Itl , In fclul aces!;1se !In:liL' illljlllllL' (\ ;;lla llidilh' 1[ll'I~'l'IIIJlll'a '\I1L'r;ltitlul', dL'l'll \'C';IL'arC' rczulta din prinril<llca;;i asoci:IlIVllaiL';1 opcratorilor. Opcrunzii
unuruirc niJlillllli

priu IlIl'ltldc[l'll

1IIIc.'i L',\:pl,;sil nun.

1';lrllll!c/c' adrl'sil.

inljlllil

limi!e :ISlIPI':1 ()jlcrllllllilol',

Ik e'\l'ltlplll,

Ii! 1[11 1\.:1 de "Jll'r;lltd list


S:llI lI]ln:i1lillll

1111 ]lui sc '\stkl

aplicn (\pcr:ltl/il constructi ilr: (i+10)++


SIIlI c!'Onate,

(it:

illl'll'llll'llIlIlt:
&(\

s[ dl'L'IL'llh'lllall'

sizeof x arc valoarca 2, deoarccc pcntru variabila x sc aloca 2 octcti. 2,


long double
y[7J;

--(Xiy)

sizcofy[31 are valoarca ocreti.


106

La upelul UIlL'i Iuncu]. list:! pilr:ltllc'lrilor

clCClivl Se'im:ludc' Illtrc

11:Ir:lll\l'/l' siut

10, dcoarccc

pcntru

data de tip long double

sc aloca 10

rotundc. OI)l'ralor!
O/}(,I'<IfU/'1

in aces: ca:: xc ()hisllltiL'.~IL' ,-;11 SPUIl:t Cil sc lie' II/W/ tI" luncu.'.

p:lmI1IL'lelc- rol!llllic'

r\lntIIlC/l'k'

de

p:tlr:liL' iuclu.]

l'\jl['L'si[

(,:[1\' [L'jlll'/illl:1

indi,:

I.k

"'C' 1\11111\'\,'

111.1,'.1/11'",

107

Parallk'/cic xiut opcr.itori de Fiorit;ilc priorit.ucu imCl"al Illai nuca dccrt paruuczclc.

ma x im.t. Opcr.itorii

unari

au

" . Ei se Iolosesc eOll~~!iollalc..


, ,f~l

totdcauna . .

impr,cuna .. ,'

s;

.rdinea

indicata in formatul

expresiei

.. iecit prioritatca
1~1opcratorilor

au pnoritatea imediatmai

operatorului sau logic (II) de atribuirc. Tinind seama de


din expresia pentru

3.2.13. Operatorii conditiorali


Opcrutorii conditional: permit oustruirca de e,\jlrcsii a carer valoare sa depinda de valoarca unci conditii. Prill conditie iutelcgcm () cxprcse care ponte ave: doua valori: adcvtirat sau lids, in limbajul C', 0 conditio sc rqirczinta printr-. cxprcsic ourccarc. Ea arc vulourca (,ci('I'<lr<l/ daca cstc dilcrita (C /,eru si ia!s lI'ca/ cnnuur.
cxprcsi« conditionala, 0 cxprcsic ;' carei valoarc si tip este de valoarca unci conditi i Un cxcmplu simplu de cxprcsic conditionnla 'ftc accca care arc ca valoarc maximul dintrc dOlI~1 nurncrc. Astbl, daca a ~ilb sint doua numerc, atunci valourca cxprcsici carl' calculcuza naximul dilliri a b dcpindc dc valoarca cOlldi!iei a>h. lutrudcvur. daca a bare vulo.rcu adcvurut, ~l\Hlci cxprcsia rcspcctivu arc valourca (I, ill caz contrar (adica ,>h arc val()a~a Ials) cxprcsia de calcul a max unului va avca valoarca b, ' cxprcsic condiuoualu arc fornutul: Numim dcpcndcntu

(ll ,lIned)at mal marc dccitHf':i_9.l;i'se pot omite parantezele pnontarca operatorilor, r{)zlilf

calculul rnaximului a>b?a:b

dil1lt,~l;
o(":,:~?~-,,~) ,

.I.

. , , /;ij"este un caz particular Exprcsia conditior . ,.. tili .. '1 ."gal sa apara, 111 program, U I Izata onunc e est/ De cxcmplu:

"

de expresie si deci ea poate f '

expresie.

exprcsie ~('e·. 'ltribuire este mai putin prioritar dccit operatorii condi\ionali. opcratoru' , ..... . . ." . opc.!Orii COl,lditionali se asociuza de la dreapta la snnga la fel ea ~I operatoru .unari .de atribuirc.

v = (El 'rE7 £3) ," ide atribuire: in partca dreapta a sernnului de atribuirc cste . 0 .;ltlOnaia. exple~ . . t Ea poatel fi sensa- mal..,simp 1 lara parancze, u "..

se afla 0 de 0 arece

)19

Ex(ci~ii: Sa se scrie un program cleo


611119

earl' citestc doua numere si afiseaza

maximul dintre

1;'f'!E2:E3 undc: EI,£2\'1 E3 - Sint cxpresii, sc cvalucaza ast lcl: valoarca cxpresici El.

PROGRAMUL

Accustu cxprcsic .. Sc dctcrrnina

#include<stdio.h> ma i n (l /* citcstc doua numcrc si afiscaza rnaximul dintrc de"/


(

..

double

<l,b; a,b,a
>b ?a

Daca LI arc 9 valoarc diferiia de zero (src vulourca adcvarat), atunci valoarca si tipul cxprcsici condirionalc coincide cu va loa rca ;;1 tipu)" cxprcsici 1::2, Altfcl (adieu E:I arc valoarca zero) valoarca si tipul cxprcsici condiiionalc coincide ell valoarca si iipul cxprcsici E3. ~itipul cxprcsici condiiionalc
dcpindc de valoarca .

sC<lnf('%lf %If', &a,&bl; printf('a=%g\tb=%g\tmax(<l,bl=%g\n',


)

b I;

De aiei rezulta ca valoarca cxprcsici EI.

3.20 Sa se scrie un program absoluta,


PROGRAMUL 611120

care citeste

un numar

si afiseaza

valoarea

lui

Folosind Iounutul de mai sus, calculul maximului ajutorul cxprcsici conditioualc:


(a>b)'!a:h undc: (£I > h)
II

dintrc a ~iII sc cxprirna

cu '

.include <stdio.h> ma i nI l f* citcste un Hilmar si afiscaza valoarca lui absoluta *f


{

double

a; a );

Estc cxprcsia
ESIC

E! (conditia).

cxprcsia E2.
cxprcxiu U sint:

scanf("%lf", &a); printf('a=%g\t<lbs{a)=%g\n',a,

<

0 ? -a

h
Opcratorii '!

hIe conditionali

SI :

i08

109

3.2 J Sa se serie un prfJ!Jn1111 care ~ vnlorilc lor abs()ll1tc. ,_ . ."' ' 'Ie doi inlr(lui .. ~i afiseaza PROGRAMUL
#include mai n ()
(

I maximu

j'

Cnitre

BIII21
'I
'HII dintrc valorilc lor a )sn

(expi,('\p2),e\,3
('SIc corccia si en 'Sle: 0 noua ('xme;ic. 'tnlr-ndcvilr, es p }, £'xp2 fiind cxpresii. (('\pi,C'xp2) (:SIl' llll!)r~'.r<lnd, deei 'ioln expresie, a::;a c,ullipa ea ponte It scrisa (l

<stdio.h> I
t
II C

!* cites!c doun numen, intrcgi si aliscaz(! nr.


-

*.
I

int arb,c,d;
scanf("%d printf %d", &a,&b),

vin.'.llia unuarn de \l Jfa cxprcsic. tkt(ill'l.'lT o{lcr:tlond virglilil arc pnorumca cca mai mid, rOll!t,1 l'al'a\~IIl!t:zetc plTt ! omisc, dcci cxpresia de mat sus sc poate scric asrfcl: . exp J ,exp2,exp3

( "a=%d\ i:o=%d\ tabs

(a I =¥:d\ tabs

(b I =%d \1

c =a<O ? -a: a. d=b cO? printf("maX(abs(a),abs(b»:%d\n",c>

-b : bl;
d ?c

a,b(
:1 I,

In general,
e:rp / ,(',\jl2, valoarca
CLi

cOl1sluqie de fonb,tl: exprcsic a carci valoarr ,'"


vq "~'.

... .expn 0

3.22

se,scrie un p~o~ram ear~ cite::;tc valoaren variabilei x 0Lljseazii funettel j(X) dciIl1lt~\ca mat J05: .
~<,j

undc ('xpJ,exp_.,7 .. cxjn: ~nt expresu ...,esc valoarea Si t ipu] lui e,YJ/l,
<lSi ("j C (C I

si tip coincide ,
_ de I" "
H .......

[3x* I'(X)""l2

,'+ 7x-IO pentru x< 0:


l,cntl'll\c;;.I().

Inrr-o • drcapta.

COI1SI1I,;!IC', eXt/fell 1 C Si.: '·"1"

cv,',11c,' 1 "\7'\ pc s ,

, ".' "'11,(1

t.. ,11110,1

l~)

4x'" \

pcntn,

x > 10

PROGRAMUl
#include main( I

811122
<stdio,h> Jx+x + 7x • 10 B
pc x si nl]scnzll "[;Io,,r('a tl!nCliCi i\x) ddlnira pClltru x < 0; peltfr;o xr= 0; pcnti'\!)( > () *!

Opcrarorut virguln sCllJilIzcazft in situarii in care intr-un anumit punc: al unui program in care ('SIc !cg:l Sil fo!osim ~ expresic, cstc necesar S[l sc rcalizcz« \\)1 calcul complex eXJ1rimatprin mai Hll.tlU;cxpresii. Exercitii:
tI,iicl:

/* citcSk 2

3.23 Sa se sene un l1rO}ml'fJ care cncsc (01. intrcu..'I' si :l'/'I,S,'C,'lZ:\ maxirnul "' . '1 ' valorilo lor absolul.:,
Aces! cxcrcitiu a fosrrczolvar PROGRAMUL 811123
lincludp <stdin,h'
doi iOTt'gi:-\1 atisea:ra nuxunu! {iintrl' valorilc lor ah:-\o)u(c */ lHil i n ( ) 1* tilt·s!c

dintre
I,)

4x·x· double X;

~i ill [laragral'u! precedent

(cxcrei(iull?

scanE ("'Hf", x<O


?

&x),

printf("x=%9\tf(XI=%g\n",x,

3·x*x+7*x-IO

: x>O

int
SCcrnf
P

u h,c,cl;
1

3.2.14. Operatorul virgufa


mai Operatoru1 virguhi1eag,1 jos: expJ,exp2 Operaiorul virgula are cea rnai mica priori tate dimre toti Opora!orii limbnjuil!i C. Prioritatea lui este imediat mai mica decir a opcratorilor de atribuirc, Constmctia de mai sus este 0 expresie, Vuloarea si tipul accsrei cxpresii coincide ell valoaren si tipul ultimei expresii, deci in cazul de fat:) cu a lui exp2, o construetie de forma: tl(J doua expresii in una :;ingura conform IOl'fl1!l(ului de

('l~i;d'f_';Cl",
"d

&a, &1)) i
1,1'.

r in t f. (

'i.. I \ t

'i.,( i\ Uh.IX .,J;,: b),

(d I);:; (d , (e

I , d lXl (t \ f) '?
c;

'Lei \

1\ " ,

a,b,((C~i,<O'" a r a j
(d=b<O

> d))

d);

Ohscrvajie:

Exprcsia:
(c:a<(),! -a:;ll.( d :h<O?-b:h).( cd) se compline din (rei cxprcsf care sc evalucaza de la stinga in dreapta, Prima alribuie lui c vaioarca absolul;\ a lui a, a doua atribuic Ill! d valoarca absolum a lui b, inr it rrcia testcaza rclatia c=d. Valoarca intrcgii expresii coincide ell I dad c>d ~i cu zero in caz conirar.

III

3.2.15. Alti operator! ai lirnbajului C


In limbajul C sc utilizcaza
operatorul

4. INSTRUCTIUNI .
Am vazut ca
0

si al\i opcrutori

0i anumc:
functic are structura:

unar;

antet pcntru a Iacc acccs 1<1 cOII\illulltiullCi zone de mcmorie dcfinita prin adresu ei de inccput. Se obisnuicstc sa se spuna ca opcratorul adrcsa (& unar) este operator de I'cti'I'CII{icre, iar opcrntorul * unar cstc opcrato: de dcrc/('/'('II/i('l'c. Accst operator va Ii studiat llller~or nnprcuna Cl~ datelc de tip adrcsa (poilltcr). El arc ucccasi priori tate ca si ccilalti opera ton unan ni limbnjului C. Opcratorii . ~i _. (aces! siuibol esk eumpus dill scmnul .
"lI1ll1l1S"

- operatorii.;;i ->. Opcratorul '" unar sc uulizcaza

('011'

de

Corpul unci functii coniine, succesiune de instructiuni:

intre acolade,

succesiune

de dcclaratii

unnatc

declaratii instructiuni

urmat d~
Corpul poate contine numai instruqiuni sau numai declaratii, sau se poate reduce la cclc doua acoladc (acoladele VOl' fi totdeauna prezente). Declattuii!« permit urilizatorului sa dctlncasca dale de difcritc tipuri (prcdefinitc sau definite de uti!izator).Dc asemenea, datele pot fi initializate cu ajutorul declaratiilor. Prclucrarca dutclor se rcalizcaza ell ajutorul iustructiunilor. Ordinea ill care se cxccutainstructiunile unui program defineste asa numita

scrnnul "mai marc") se utilizcaza pcutru a sc face acccs la componclllclc une~ structuri. Ei smt de prioritatc maxima, avind acccasi prioritatc cu parantczcle. Ei
\'01'

Ii studiati

in Glpil()lul cu privirc la structuri.

3.2.1.6.Tabela cu prioritatile operatorilor Ilmbajului C


in tabcla de mai jus sc indica opcratorii limbajului C in ordiuca descrcscutourc a prioritatjlor lor. Opcratorii din acccasi lillie au acccasi prioritate. Ei sc asociaz'\ de la stinga spn: drcapta, cxccpuud uperalorii unuri, couditionali ~i de alribuire, care sc asociala
(

structurd de control a programului.


Cea mai simpl" structura de control cstc structura secventiala. 0 astfcl de structura de control sc compuuc dintr-o succcsiuue dc instruetill'ni care sc executa LIlla dupa alta, in ordinca in care sint scrisc in program. .

de la drcupla spre stiug«. II


-(ullar) / -(hillar) >~
<r'> ->

+(1111:1')

'(hinar) +(hinar) <~:: < .'I.:(hillar)

&(Ullar) ~~II

'(unar)

++

(lip)

si7tH!'

De obicci, la dcscricrca unui proces de calcul cstc ncvoic sa se utilizezc si 'lite tipuri de structuri. Astfcl, C. Bohm ;;i G. Jacopini au ararat in lucrarea [i L ca pcntru cxprimarca proccsclor de calcul sint suficicnte trci structuri de control ~i
anumc:

structura

sccvcntiala;

l=

structura -- structura
Acest rezultal A=

altcrnativa; repetitive (ciclica) conditionata


anterior .

•'\.&

.,
«0::»:"-+~

*"""

l=

%=

&=

1=

Ulterior accasta tabcla va it cOinplctat~, ClI.

~ieli alti opcratori specific! lin1bajului

s-a aflat la baza ideii care a condus in anii '70 la conceptul de progratnare structuratd. Acest concept a fost dezvoltat de E.W. Dijkstra in lucrarile sale, iar ultcrior si de alti specialisti, ca de exemplu, N. Wirth ;;i C.A.R. Hoare. EI reprezinta un stil in programme care sc impune ~iin prezent, Un efect imediat al programarii strueturate este ridicarea productivitatii in prograrnare ~(' crcsterca fiabilitatii programelor. Prill program structurat intelegem LIn program care arc 0 structura de control

rcalizata numai ell ajutorul celor trci structuri amintite rnai sus.
Ulterior s-au adrnis inca doua structuri

!?i anume:
113

112

>.,-"---"-,,,;

structura

selcctiva; posterior.

instructiunc de ape! a Iunctici respective.


ExemplI.':

structura repetitive (ciclica) conditionata

Introducerea acestor structuri permite 0 flcxibilitate mai marc in programare. in acest fcl, programarea structurara rcprezinta un stil in prograrnarc care contribuie la realizarea de programe care au 0 structura clarn ;;i care pot f usor dcpanate si intretinute, Limbajul C a fost prevazut cu instructiuni rncnitc 5,\ pennilIl rcalizarea sirnpla a structurilor proprii programarii structurale. Structura sccventiala se realizeaza cu ajutorul instructiunii compuse, srructura nlrcrnariva cu ajurorul insrructiunii it; structura repetitiva conditionata anterior, prin interrnediul instructiunilor 'while si for, structura selectiva se realizeaza cu ajurorul instructiunii switch, iar structura repetitiva conditionata posterior cu njutorul instructiunii do-while. Lirnbajul C arc si alte instructiuni care rcprczinta clemente de baza in
construirea structurilor amintite mai sus. Astfel de instructiuni sint: instructiunca expresie si instructiunea vida. Alte instructiuni prezente in limbaj asigura 0 flexibilitate mare in programarc, Acestea sint instructiunile: refilm, break, continue si goto.

1.

i nt. x ,

x=lO;

Este 2.

instructiuuc
y;
sau y+=4;

de atribuirc,

Variabilci

.v i sc utribuic valoarcu

10.

double
y=y+4;

Este 0 instructiune 3. 4.
putch(c-'a'+'l\');

de atribuiro,

care marestc ell 4 valoarca

lui ,I'.

Este

instructiunc
a;

de upcl a funcuci putcli,

double
a++j

Este 5.

instructiune
a;

cxpresic,

care marcsrc valoarca lui

1/

ell

1I1lU.

double
++ai

Mai jos se dcscriu aceste instructiuni

Si se dau exemplc simple de utilizarc,

4.1. Instructiunea vida


Instructiunea
efect,

Arc acelasi efcct en ~i inslrllC!illile~1 cxpresie Ohscrvntie:

din cxcrnplu!

precedent.

vida se reduce la caracterul punct si virgula (;). Ea nu are nici un

Nu orice expresie urmata de punct ~i virgule expresie efectiva, Dc cxcmplu, constructia:


ai

formcaza

instructiune

Instructiunea vida se utilizeaza in constructii in care se cere prezentu unci instructiuni, dar nu trebuie sa se execute nimic in punctul respectiv. Astfel de situatii apar frecvent in cadrul strucrurii alternative ~i repetitive, asa cum se va vcdca in continuarc.

desi esre Excrci!ii: 4.1

instructiune

exprcsie,

en nu arc nici un cfcct.

4.2. lnstructiunea expresie


Instructiunea expresie se obtinc
Deci, instructiunea expresie scriind arc formatul: punct
~!

Sa se scrie un program

care citcstc trei intrcgi si afiscaza

maximul

dintrc ci,

PROGRAMUL
virgule dupa
0

BlV1
max imul dinirc ci *1

expresic.

#include <stdio.h> main () 1* citcsrc Irei intrcgi si afiscazn


(

expresie;
in cazul in care expresia din compunerea expresie de atribuirc, se spune ca instructiunea unei instructiuni exprcsie
0

este

respectiva este
expresia

instructiune de
}

atribuire.
Un alt caz utilizat frecvent reprezinta apelul unci functii, este acela

In aecst caz,

cind

este un operand ce instructiunea expresic este 0

scanf("%d ~ic1 'l,d", &d,&h,'<;c); = a > b ? a : b; Ild=l1lax(a,b) printf("a='l,d\tb='l,d\tc=%d\tmAX(a.b,c)=%d\n·,A,b,c,d~c


d

? d:

c);

114

115

4.2

dflilhlc~i

Sa se scric un program care c itcstc valori}c variabilclor an~eaza valoarcu cxprcsici:

a,

b, c, d. x de tip

int
t=ai

daca numirorul PROGRAMUL

cstc dilcrit de zero 0i zero

111

caz contrar,

a=b; be t :
)

BIV2
si x , calculcazu si afiscazu valoarca cxprcsici:

Ninclude <strlio.h> main () /* citcstc pc a.b.c.d


d<lL',lllunlllonlll'sll'

(a" x "x + b*x+ c)l( a *x'x "x+ b* x+d)

dik'rit

dL~ I.l'rll xi I.ero III C;\lCHlllr:1I "'/

double
doubl.o

a,b,c,d,%;
,/,Z.,I.1; (lIa·:::") i

printf

scanf ( "% 1 f " , &a) ; p r i nt f ("b="); ,wanf("'l;'lf", &b); p r in t t tvc e ") ; scanE (''%If'' ,&c); p r i.n t f ("do"); ~;c"n[ ("'1,1 f", p r in t Lt "x "); s c a n f ("1,1 f", &x); y :::: a*xlrx; z:;:b"x;

Variabila t cstc dcflnita de indata ee controlul programului ajunge la prima instructiune din instructiunea compusa (t=a;). Dupa executia ultimei instructiuni a instructiunii compuse, variabila t nu mai este definita. Instructiunea compusa se utilizcaza undc este necesara prezenta unci instructiuni dar proccsul de ealeul din punctul respeetiv estc mai complex ~i se cxprima prin rnai multe instructiuni, in aces! caz instructiunile respective se includ intre acolade pentru a forma 0 instructiune compusa, Acest proccdcu de a forma 0 instructiunc cornpusa din mai multe instructiuni, se utilizeaza frecvent in construirea structurilor alternative si eiclice.

4.4. Instructiunea
forrnat l
if(expresie)

if

s.n .

Instructiunea if are urmatoarele formate:

u:::.::yl<x+z+d;

pr i n t f (" (al<x*x+b*x+c) u '! (y+z+cl/u

/ (a'~x*x*x+b*x+d) : 1.1);

::::%g\n",

instructiune fonnat2
if(expresie)

instructiunel else

4.3. lnstructlunea
11I.\11'lI('(/I/I/('<I

cornpusa
\.'slL' () succcsiunc de instructiuni 0i de dcclaratii: inclose inlrc ncoladc,

instructiuuc Z La intilnirea iustructiuuii ij'intii sc cvalucaza exprcsia din paranteze. Apoi, in cazul formatului l , daca expresia are valoarea diferita de zero (adica are valoarea adevarat), atunci se executa instructiune; altfel se trece in secventa Ia instructiunca urrnatoare instructiunii if in cazul formatului 2, daca expresia are 0 valoare diferita de zero, atunci se executa instructiune 1 $1 apoi se trece in secventa (adica la instructiunea aflata dupa instructiune 2); altfel se executa instructiune 2. in mod normal, in ambele formate dupa executia instructiunii if se ajunge la instructiunea urmatoare ei, Cu toate acestea, este posibila ~i 0 alta situatie cind instrucjiunile din COll1pUl1CrCa lui if, definesc ele insele un alt mod de continuare a executiei programului. Dcoarece 0 instructiunc cornpusa este considerate ca fiind un caz particular de instructiune, rezulta ca instructiunile din cornpunerea lui if" pot f1 instructiuni
117

('0111/1111,1

succcsiunc

care ponte I-I prcccd.ua

dcclaratii

instructiuni Daca dcclara\iilc sinl prczcntc, aiunci de dcfincsc variabilc alit timp cit controlul prograillului sc all,\ la 0 instructiunc
instructiunii compusc.

care sint definite din compunerea

Exernplu: Prcsupuncm ca intr-un permute valorilc variahilclor


1:6

anumit punct al prograrnului cste necesar IlIlregi u si b. Accasia sc poatc rcaliza astfcl:

sa

se

compuse.
Exercitii: 4.3

De

asernenea,

instructiunile

respective

pot f

chiar

instructiuni if. In

acest caz se spune ca instructiunilc (j'sint imbricate.

y=4 "x **3+5 *x *x-2* y=iO()


y=2*x*x+8*x-l

XII

pcutru x<O;
pentru x=Il; pentru x>O. alternative:

Se da functia:
y=3*x*x+2*x-IO pentru x>O

Aeest proccs de calcul implica unniltoarele ultfcl

y=5*x+lO pentru x<=O Sa se scrie un program care citeste valoarea lui x, calculeaza si afiscaza valoarea lui y. Acest proces de calcul implica doua alternative, in functie de valoarea lui x: daca x>O, atunci y=3*x*x+2*x-IO aItfel (adica x<=O), atunci y=5*x+ Aeeasta instructiunjj

daca x < 0 atunci Y=4*x**3+5*x*x-2*xt


daca x=O at unci y= 100 altfel y=2*x*x+8*x-1

lO.
C, folosind formatul 2 al

EI se transcrie imediat printr-o insrrnctiunc


1* x<() cstc cxprcsic din forrnatul 2 *1 Y;::4*'x'~'*3+5*x*x-2*x+li I/in;~trllclillnc I else . II inslfllqiullc 2 cstc instruC(iUtlc if if (x==O)
y=100;

ifimhriccllti:

if:

se

transcrie

imediat,

in

limbajul

if (x<O)

if (x» 0) 1* x>O cstc cxprcsic din formatul 2 *1 y=3*x*x+2 *x-10; I' instructiune I =]

else
y=5*x+10; 1* instructiunc 2 '!

else y=2*x*x+8*x-]j

Acelasi proces de calcul se poate realiza eu ajutorul expresiei y=x>O?3*x*x+2*x-1 care utilizeaza mai compacta, O:5*x+ 10; Aceasta

de atribuire:

. Acclasi jos:

proccs de calcul sc ponte dcscric prin instructiunon I x==()'I! OO:2*x*x+8*x-l;

cxprcsie

de mai

in partea dreapta 0 expresie conditionala. dar nu atit de evidenta, ell ~j instructiunea

este

seriere

y=x<O?4*x**3+5*x*x~2*x+

ifae mai sus.

PROGRAMUL BIV4
#include rna in () <stdio.h> /* citcstc pe x, (',!lenk-aza,;i a!i';l'"za pc y dcfinir aSlfel: y=4*x*x*x+5*x*x·2*x+1 daca x<():
)' 100 y ,= l'x'x + X·x -I (bc;) altfc] X"O: 0/

PROGRAMUL
#include

BIV3

<stdio.h>

main () /* citcsrc pc x, calculcaza si afiscaza valoarcn lui y dcfinita astfcl: y=3x·x+2*x-IO daca x>O y = 5x + to daca x <= 0 */ float x,y; scanf ("%f", &x);

float x,y,a; scanf("%f", a ;::;: x*x;


if(x<O)

&x);

if(x>

0) y=

3*x·x

+ 2*x -10;

else y= 5·x + lO, printf("x= %f\ty=


)

y "lse x,y);

iJ

A).:

~'

;:1

~')A

4I

%f\n",

if ( x == 0)
Y Y printf
)

100;
'I A,! f

4.4

Sa se scrie un program care citeste valoarea valoarea lui y definita ea mai jos:

lui x, calculeaza

si afiseaza

H ~x x , y);

("}:=%f\ty=%f\n",

4.5 Si\ se scric un program care citcsre calculeaza radacina ccuariei: 118
ax+b=O

valorile

variabilclor

nCintregi

a ~i b,

119

~iafiscaza rczultatul. Proccsul de calcul al radacinii ccuatiei de mai


cr: duca
II

culculcaza
SLIS

cu rclatia:
J detcrrninantul obtinut din dCI prin inlocuirea primei coloanc tcrmenului libel' $1 Cli del2 detcrminantul obrinut din del prin coloanci a doua ell coloana terrncnului libel'. Atunci:
Cll del

trcbuic s,j verificc cxistcnta

det=ae-bd

cstc dilcrit

de zero

Notam cu .coloana
inlocuirea

atunci x=b/a alllcl daca /1= IJ


atunci ccuatia cstc nedeterminata; altfcl ccuatia nu arc solutie.

dct I =cc-bf ~idcI2=al~cd, Proccsul


JOs:

de calcul al valorilor
coeficicntilor

lui x :;;1 se desfasoara y a, b, c, d, e.].


I1U

conform

pasilor de rnai

1.

PROGRAMUl
lIiIW]II<J.,

BIV5
Sf

2.
3.
'1Iise"," lalianlla enllli le'I

Se citesc valorile det=ae-bd. incnmpatibi I). Se ,:fi~caza


Altfcl
Ull

I1Idi \I

()

<,;Idio.h', /+ citcstc pc a si h. "'1le-lIka!;! ax I b o. 0 ./


d,

Daca det=i), arunci sistcmul

arc solutie unica (estc ncdctcrminat


si se intrcrupe cxecuiia programului,

sau

mesaj corespunzator
cu puuctul-t.

sc conunua

.Jou b lo

b;

if (,;( 'dill (·"I.! I '1. I '". u,«,» hi! I ;') pri n t t ("coel icienti er ona ti \n"l;
else

4. 5. 6. 7.

det 1=ce-bf
dctz=af-cd.

if ( a

! = 01 pri n t.f ("a=1;q\tb=%<J\tx=%g\n", a, b , -b/a);

x=dct i Idee y=det2/det.


Se afiseaza valorilc lui x si y.

8.

it

b'c () I p ri n r f ('fpcu.::tt:ie
IJI,-jlltl.("r_::CUdtid

PROGRAMUl
nf':!det.c'rrninatn\n");
IlU

BIV6

-r

t:

:;()I\jI,ir~\I)");

Obscrvatii: I. 2. Programul de rata confine 0 insuuctiunc ij'illlbrieata, Pcntru a mari claritatca programclor sc obisnuicsic S,I sc dccalczc sprc drcapia (cu un tabulator) iustructiunilc din compuncrca unci instructiuni if ill accst program s-a rcalizat test rclativ la vulorilc tastutc pcntru II 0i b. Daca Iunctia scan] nu rctumcuza valoarca 2, inscamna (;<1 IlU s-au iastat doua numcrc la terminal. De accca. iutr-o astfcl de sitll<l\ie sc ari~c<lZil rncsajul:

linclude <stdio.h> main () 1* citcstc pc a.b.c.d.c.I, dcrcrmina siafiscaza solutia sistcmului: ax + by c dx + cy f ill cazul in care arc solutio unica +/ double a,b,c,d,e,[,x,y,det,detl,det2;

3.

"cocficicnti
4.6

crouuti". u. b. c, d, e.], ai unui sistcm determine] si afiscaza solutia

if(sca~f("llf %If %If Ilf %If %If",&a,&b,&c,&d,&e,&fJ pr1ntf("coeficienti eronati\n"); else if«(det a*e bed) 0) printf("sistemul are determinantul nu Lvn vI , else

==

Sa sc scric lin program care citcstc cocficicntii de douu ccuutii liniarc cu doua nccuuoscutc, accstuia cind are (1 solutio unica.

detl c*e b*f; deL2 = a*E cOd; x cletl/det; y = det2/clet; printf("x=%g\ty~%g\n",x,y);

Fie sistcrnul de ccuatii Iiniarc:


ax+by=c

dx+cy=f
Notam 120
ell

del dctcnninantul

cocficicntilor

nccunoscutclor.

Acosta

sc

121

Observatii: I. Expresia
(I) (det=n*e-b*d)==O se evalucaza astfel:
"

care se calculc~IZi\ nithlCina patruta). Se dctermina $1 se afiseaza radacinilo: x I=(-o+dclta)!d;

a.

Se calculeaza
a*e-b*d

7.

x2,,-'(-b-de Ita)/d; apoi sc intrel11pe execuiia programului: Daca dclta=O, atunci sc dctermin<l ;;i sc afi;;eaza radacina dubla:
x=b/d; se intrerupe cxecutin programutui.

2.

si valoarea respect iva se atribuie lui del. b. Sc compara valoarca atribuita lui del ell zero. Daca valoarea lui det este zero, atunci cxpresia (1) arc valoarea adevdrat; in caz contrar, cxpresia (1) are valoarea zero, adicajals. Parantezcle din expresia (l) sint obligatorii. in lipsa lor, expresia (I) devine:
(2) det=a*e-b*d==O. Aceasta se evalueaza astfel:

8.

Altfcl, ccuatia arc radacini complcxc conjugate.


Se calculeazn: delta=sqrt( -de Ita). Se dctermina si se afiscazn rildilcinile: x I=-b/d+i*deltald' x2=-b/d-i*delta/d. '. Se intrerupe executia programului.

a.
b.

Se calculcaza valoarca expresiei:


a*e-b*d; Deoarece operatorul == este mai prioritar decit =, se compara valoarea expresiei respective Cll zero. Daca expresia respectiva are valoarea zero, atunci expresia (3) a*e-b*d===O are valoarea 1 todevdrats, altfel are valoarca zero (thIs). Se atribuie lui det valoarea expresiei 3, adieu 0 sau 1,

PROGRAMUL BIV7
.include .include ma in () <stdio.h> <math.h> II fisicrul contino prototip pcntru sqn

1* citc~tc pc a.h,c, calculcazn si afisCHZt1 radacinilc ccuntioi. a x'x + b'x + c = 0 '1 a.b.c,d,delta;

c.

double

4.7

Sa se scrie un program care citeste valorilc variabilclor nfiseaza radacinile ccuatiei de gradul 2: a*x*x+b*x+c=O

a, b, c, calculcaza

si

I.

Pusii procesului de calcul sinr: Se citesc valorile variabilelor

2. 3.
4.

a, b, c. Daca a=b=c=O, ecuatia estc ncdeterrninata. Se afiseaza un mesaj corespunzator si se intrerupe exccutia prograrnului, Daca a=b=O ~ic este diferit de zero, ccuatia l1U are solutio. Se afiseaza un rnesaj corespunzator $i se iutrerupe executia programului, Daca a=O si h este diferit de zero, ccuatia sc reduce la 0 ccuatie de gradul intii a carei solutie este: x=-e/b;

p ri n t f ("co,'!UCiCllLuJ lui if(scanf("%lf",&al '= II printf{"coeficientul lui x patrat eronat\n"l; else { 1* 1*1 printf('coeficient~] lui x:" I; if(scanf("%lf",&bl' != 11 printf("coeficientul lui x eronat\n"l; else ( 1* 2 */ print.f:("Lc,rmenulliher:"I;
if(scant:("'61f", &c)
!=

1)

printf("termenul else [ r s=, I' aflscaza cocticicmii cititi */

liber eronat\n");

p r i n t. I ( "i. = '1,9 \ r. b, tq \ l If( a== 0 && b 0

C'=

&&

'{,q\ n " • a , b. (' I ; c == 01

se afiseaza un mesaj corespunzator, mului,


5.

solutia x si se intrerupe

executia

progra-

else

printf("ecuatie

nedeterminata\n"I'

if( a
el.sl~

Daca a este diferit de zero, sc calculeaza: delta=b*b-4 *a*c

==

print

0 && b f ("c:cuat

==

'

01

in

si
d=2*a.

if ( a ==

0){
("c·c1..1atie ('X'=%9\n",
(h.,..)

6.

Daca delta> 0, atunci delta=sqrtfdelta);

(sqrt este functia de bibliotcca

prin

l'lrintf print!

qradul

1 \1\");

-('/b);

122

r:n

c:l:::;c{

/*i·l*//1<a!·····tJi-i \ 1! ' \ I , I I) . )) d ;.~ ·'d;

'l .~,I

..
;{

se vidcaza zonele tampon (buffcrele) ale fisierelor deschise in seriere; se inchid toate Iisierelc deschise;
se intrerupe executia

..
..

iEI deltM > 0 I ( pri,rltf("ecu8tia are 2\ ri1dacini t'eale 5i distincte\n"); (:ll?lta sqrL(Jelta); ! " ;, \ \ 1 ( " "I '/,'1 \ 1 x .: 1\ \ i " ,
I b
I

programului.

d'.:ll,1)

id,

Ii>

dc>ild)

Ill):

; f ( ,kl \ iI
1)1

II I
i nt f
(",'('11,11

(
,

I ,I

,I I.. ~\ (

Paramctrul acestci functii defincste starca programului la momentul apelului. Valoarca zero dcfincste () terminarc normala a cxecutiei programului, iar 0 valourc elileril;1 de zero scmnalcaza prczcnta unci crori (tcrrninarea anormala U executici prograrnului). in concluzie, putem apcla functia exit pentru a term ina executia unui program, indi Icrcnt de faptul cii acesta 5C termina normal sau din cauza unci
cron. Exercitii:

I"dddCilllJ

print:
:=; -.

E (",,:.

%q\n",

dubla\n") ··b/d):

p r i.n t I ( vr adaci n i complexe\n"); delta sqrL(~delta)/d; d -bid;


l'l
illl! (";,;] ',I,i) I

4.X

Sa sc modifice programul
contina instructiuni

din cxercitiul

4.7 in asa fel incit el sa nu mai

((imbricate.

i ('!,q)\I\"/d,t!C'\t'II);

PROGRAMUL BIVa
#include #include .include <stdio,h> <math.h> <stdlib.h>
II fisicrul conunc

pr.inttl"x,'cc'!,q )1* $llrs;I"5**1 ) l*sfirs;1 *4**1 }/* sllrsil*l*"'1 ")/*slirsil }/*sllrsi!* 1/*,lirsil I **1 pr()gralll"l *2**/

i.I'{,q)\n",d,deltd);

prototip pcntru sqrt

II fisicrul coniine prototip pcntru exit

rna in () 1* citcstc pc a.b,c, calculcaza si afiscaza radacinilc a*x*x + b'x + c ~ 0 */ double a,b,c,d,delta;

ccuatici:

Observntic:

Prourarnul de rata uiilizcazn instructiunca Ill.lI:', Pro~ralllele l',IIT loloscsc instructiuni


sill! urcu

sc r~eOl11al1(l<l rcduccrca pc eli posibil a nivclurilor de imbricate ale instructiunilor if: ln multc cuzuri, nivclul de imbricarc al unci instructiuni if' sc po.itc reduce Iolosind luucua cxi! (vczi paragrai'lIl unnntur).

(Ie unnarit.

il ell nivcl de irnbricarc rclativ /fell nivcluri mari de imbricarc


uuuror acoladclor. Dc uccca

/vdcsca sc uita inchidcrca

printf('coeficientul lui x patrat:"); if(scanf("%lf",&a) != 1) ( printf("coeficientul Lu i x patrat ex it (1) ; 1"' tcrminarc In croarc "/

eronat\n");

printf("coeficientul lui x;"); i£(scanf("%lf",&b) != 1) ( print£('coeficientul lui x eronat\n'); exi t (1) ; /* tcrminarc In eroare */ printf("termenul liber:"); if(scanf("%lE', &c) != 1) ( ,printf("tennenul Li.be r eronat\n"); e x i. t (1) ; 1* tcrminarc la eroare */

4.5. Functia standard exit


Funclia exit arc prototipu]:
cod)

void exit(int

si el sc alb in fis icrcle de tip h:


SlUIIU.1I
..._ll~L 1_

~I

/* afiscaza cocficicntii cititi "I printf("a=%g\tb=%g\tc=%g\n",a,b,c); if, a== 0 && b =;:: 0 && c == O} ( printf('ecuatie nedeterminata\n"); ex i t (0) ; t* tcrminare fara erori */
)

pruccss.h

La apclul accsici funciii au loc urm.uoarclc


124

actiuni:

if( a

==

0 && b

==

0) (

125

printf("ecuatia ex i.t.tO) i if

nu are

solutie\n");

( a == 0 ) printf("ecuatie de gradul printfl'x=%g\n',-c/b); exit (0);

l\n");

delta = bOb 4*a*c; d = 2*a; if I delta> 0)( printf('ecuatia are 2 radacini reale si distincte\n'); delta = sqrt(delta); printf ('xl=%g\tx2=%g\n", (-b + delta) Id, (-b -delta) Id); exit (0); HI delta' == 0 ) [ printf["ecuatia printfl'x=%g\n', exit (0);

Corpul instructiunii while ponte Il () all<\ instruciiunc \\'/11/1' sau sa ric () instrucriuue cornpusa care sa conuna instructiuni while. In accst caz xe spunc cit instructiunilc while respective sint imbricate. Mcntionam ca insuuctiunea din corpul unci instructiun! while poate sa dcfineasca un alt mod de cxccuiic a insrructiunii while dccit eel indicat mai sus. Astfel, ca poatc rcaliza tcrrninarca instructiunii while nn'a a se mai ajuuge la cvaluarca cxprcsici din antctul ci. De cxcmplu, daca in corpul unci instructiuni while sc apclcaza functia exit, atunci sc va tcrmiua cxccutia ciclului while, dcoarecc se intrcrupc chiar cxecutia prograrnului. Dcsprc instructiunca while se spune adcsca ca estc 0 instructiune ciclica. Amintim cu ca dcfincsic 0 structura rcpctitiva conditionata anterior.
Exercitii:

are radacina -bid);

duhla\n');

4.9

printf ("radacini complexe\n'); delta = sqrt(-delta)/d; d " -bid; printfl'xl=%g+i(%g)\n",d,delta); printf('x2=%g-i(%g)\n",d,delta);


}

S;I sc scric un progr:iln care calcuicnzu p(x)=3 "x *x-7*x-1 0 pentru x=l , 2, ..., 10

~i ari~e:a7:1 valoarca

polinoruului

Programul de rap rcalizcaza afisarca valorii cxprcsici:

un proccs de calcul care consta din cvaluarca .

~i

3*x*x-7*x-IO pentru cele 10 valori all.' lui .Y. Pcnuu prin intermedin! insiructiunii de apcl:
printf("xcc'td\tp(x)c'hl\n",x,i'X'x 0

valoarc a lui x, acest lucru sc realizcaza


'/'x 10);

4.6. lnstructlunea while


Instructiunea

while are formatul:

whilc(e.xpresie) instructiune Primul rind din acest instructiune este corpul ei.
La intilnirea acestei format

RCZllWI ca, accasra instructiunc trcbuic sa sc execute rcpctat pcntru x= 1,2, ... , 10. In aces! scop, in!ial YOIll .uribui lui .v valoarcu I:

x=l ; constituie
antetul

instructiunii
expresia

while, iar

instructiuni

intii se evalueaza

din parantezc.

Daca ea are valoarea adevdrat (este diferita de zero), atunci se executa instructiune. Apoi se revine la punctul in care se evalueaza din nou -valoarea
expresiei din paranteze. In felul acesta, corpul ciclului se executa alit timp cit expresia din antetul ei este diferita de zero. In momentul in Care expresie are valoarea zero, se trece Ja instructiunea urmatoarc instrucriunii while. Corpul instructiunii while poate sa nu sc execute niciodata, lntr-adevar linea expresie are valoarea zero de la inceput, atunci se trece la instructiunea urmatoarc instructiunii while fiu'a a executa niciodata corpul insrructiunii respective. Corpul instructiunii while este 0 singura instructiune, care poate fi compusa. tn felul acesta, avern posibiliratca sa executarn repetat mai multe instructiuni grupate intr-o instructiune cornpusa, 126

Apoi, vom utiliza 0 instrucriunc while care sa permits cxccutia rcpctata a instruciiunii dc :\j11.'1a fUl1qiei /)}'illl((\e: mai sus. Dcoarccc lui x i s-a atribuit deja valoarea I, rczulia ca la prima cxccuric a accstci instrucriuni se calculeaza prj). Pcntru ca ln a doua executic a ei $,i sc
calculczc x++; p(2), cstc ncccsar sa sc mnrcasca valoarca lui .v ell I. Accasta se ponte

rcaliza folosind instructiuncu

cxprcsic sc execute rc'pl'1al SCCV('I\\a de insnuctiuni:

C'lI ultc cuvintc, cstc suficicut


p r j n t f ( "x
xir:

Sit

~,d \ t P (x) . 1.<1 ri " , x ,I' \

co' x 7' x ~1 (i) ;

x avind initial valoarea

I. ACC:ls1l1 secvcnta fOl'llleaz:I corpul ciclului. ea va fi inclusa intrc acolade pentru a forma 0 singura instructiune.

De accca,

127

Dcoarecc ultima cxccutic a sccvcnici de mui sus arc loc cind

X""

cu sc va executa rcpctat atita limp cit x <= 10. Dc <lCCCH, ntctul ciclului u

10, rezulta ca while va

in caz contra!' se incheic cxccuria ciclului while ~iprin aceasta se termina si executia prograrnului. in accst caz se va schimba atribuirca x=1 cu

in concluzic,

proccsul

de ca lcul co urmcaza

a Ii rcalizat

il puicm

dcscric

astlcl: l. 2. 2.1.
2.2.

x='l
Cit x<0=10 se Afiscaza pc .v '$i ptx}. lncrcmcntcaza pc x.

x=O
CXCCU!il:

Atit (imp

deoarece
cuvintc,

executia corpului ciclului incepe dupa ineremelltarea programul BIV9 poate fi rescris astfcl:

lui x.

ell

alte

PROGRAMUL
.include
lila in ()

BIV9
vnlorilc polinoruului
»]

x=O; While(++x<=10}

<stdio.h> p(x)·~}·x·x· 1·x· 10 pcntru x ,,_1,2, .... 10

i* alisctli'.a

) ;* sfirsit main "/

printf("x=%d\t

p(x)=%d\n·,x,3~x'x-7'x

10);

Mcntiol1illn ca cxprcsia

int x;

x++ <= 10 utilizata in antetul ciclului nu realizeaza acclasi lueru.


Intr-adevar,
x,3*x'x .. 7'x -10);

x 1; while ( x <= 10) ( printf("x=%d\tp(x)=%d\n",


x++ ;

in cazul expresiei

++x <= 10 luix. In cazul cxpresiei


atit cornparatin, cit si corpul ciclului while sc executa cu valoarea incremcnmm a

} t= sfirsit while */ }/* sfirsit main'/

Observatic: Lirnbaju! C pcrrnitc scricrca de prograrnc compactc. mai sus poatc fi compactata inlocuind cxpresia
X Cll

De cxernplu,

sccvcnta de

x++ <= 10 comparatia se face cu valoarca neincrcmenmm a lui x, iar corpul ciclului while se executa cu valoarea incrementata a lui .r. De aceea, daca x= to, atunci ++x <= 10 este falsa, deci corpul ciclului nu se mai executa, in schimb x++ <= 10
arc valoarea adevarat si se va executa corpul ciclului si pentru x= II. De aceea, se va obtine aoelasi lucru daca in antetul ciclului vorn tolosi cxpresia . x++<10

<=, 10

++x <"" 10
In fclul acosta sc climina
x+f:

instructiunca

cxpresic

din corpul ciclului. Tinind scarna de ordiuca opcrauilor, ++x <= 10

cxprcsia

se evalucaza as! Icl: 1. Se incrcmcntcaza .r. 2. Se cornpara valoarca incremcntata a lui x cu 10. Daca accasta nu-l dcpascsto pc 10, atunci sc executa corpul ciclului, care acum consta nurnai dill apclul Iunctici print].
128

4.10

Sa se scrie un program care tabelcaza valorile functici sini'x] cu pasul de un grad sexagesimal, x apartinind intcrvalului [0,360).

Functia sinus, ponte fi apclata ca functie standard ~iare prototipul double sill( double x);

129

in ·fi$ierulmath.h.

Pararnetrul x cste in radiani. Daca a este un unghi in grade sexagesimalc, atunci el se rcprezinta daca se inmulteste cu factorul Pill 80 (Pl=3.14159265 ... ): a*Pl/180
Tabelarca functiei sinus sc va realize conform pasilor de mai jos:

in radiani

La apclul funcrici getch prograrnul sc blochcaza deoarece acnonarea unci taste. Totodatfl SC afiscaz» automat fcreast .. aqi?narea unci taste onrecaro, programul se dcblocil~a7.a. ~ ~u."",
q

sc astcapta
'd;l;'":'.lIj.:",.~

I,. 'I

""'"u"

rr, ,.u

') h~ c.~emp~ul d,c Eqa V(~1Jlapclu fllnqi:l gctch ori de cue ori programlll a al1~at ... .de valcri ale functici SInUS. Accstc valon ocupa 23 de linii ale ccranului. Pe J linin 24 se va afisa rcxtul:
pentru a continua acrionuri o tasla

1. 2.
3.

3.1.
3.2.

f=PI/180 x=O Atit limp cit x<=359, se executa: Calculeaza si afiseaza sin(x *f). Incremeuteaza pe x. Pasul 3 de mai sus este analog cu pasul 2 din exemplul precedent.
lui vom

Fun~tia getch sc apelcaza in corpul lui while de indata cc sin! afisatc 2) de valori, In acest seep utiliz.{1111valorile lui x care cresc de In 0 1'1 ~59' Ecn I b . bl ' ,). ccranu tre uic ocat dupa apclu l Iuncrici printjs; in morncnrul in care x+ 1 are vnlorilc:
23,46,69, ...

el se realizeaza printr-un ciclu while asemanator. La realizarea cornpactarea indicata in observatia de la exernplul respcctiv.

De aceca, face

adica atunci cind x+ 1 estc mulriplu de 23. Aceasta se exprima prin expresia: (x+l)%23===0
Dcci fU:1Qiagetch sc apclcaza cind cxprcsir; de mai sus csu- adl'l'lirafti. i nuintc de a apela functia getch va trcbui apclata Iunctia prilll(pcntru a afisa pc linin ')4 tcxtul: . .,

PROGRAMUL
#include 'include #define

BIV10

<stdio.h> <math.h> PI 3.14159265358979

,~,

pentru a continua

aetionati

0 lasla

main () /* calculcaza si afiscaza valorilc functici sintx) din grad in grad scxagcsirnal, x apartiniud intcrvalului [0,3591 0/ int x; double f; f = PI/1SO.O; x = -1; while(++x <= 359 printf("sin(%d)=%.16f\n",

Tinind searna de aces[e obscrvani, PROGRAMUL BIV10A


#include linclude #include .define <stdio.h> <math.h> <conio.h> PI 3.]4159265358979

lI10dilicam

prograrnul de

(;1\(1

ca mai jos.

x,sin(x*f));

Observatie: Valorile afiscaza cite una pc 0 linie. De aceea, progrnmul 360 de linii, Utilizatorul arc posihilitatca de a vcdca pc ccrun, ill fereastra utilizator (tastind <Alt>-F5), numai ultimele 25 de valori, Aceasta din cauza ca un ecran, in mod text, se compune din 25 de linii a 80 de coloane. se pune problema blocarii execurici unui program dupa cc de rezultate, Dupa analiza datelor de pc ecran, utilizatorul exccutia programului actionind 0 Insta oarccarc. a bloca executia unui program cstc accla de a apcla functia care se dorestc sa sc analizeze dale Ie afisate in fercastra
funcrici sinus se afiseuza

main () /*.calcuiean si atis<:'l7a valorilc iunctici sin(x) dill grad In grad sexagesllnal. x apartinind intcrvaluini [0 ,1'i9J */ ( .in t; Xi double
f;

I'll 1!l1l.(I;
Xl;

while( .+x

<=

359

){ 0) (
x,si.n(x'f»);

printE("sin(Cl;d),,%.16f\n",

In astfcl de situatii acesta a afisat un ecran urmeaza sa deblochezc Un mod simplu de getch in momentul in uti lizator,

if((xtl)',;23

pcintf(Upentru getch ();

a continua

act.ionaLi

)/* sfirsil while ,; /* sfirsit main.;

130
131

4.11

Sa sc serie un program care citc~tc un 0ir dcinrrcgi separa\i prin caracicrc albe si arise"!.,, sum;l lor. !)upa ultimu! uumur sc va tasta un caractcr alb

Cousidcrarn
I~r*i; Cum f*i=2!, calcula pc 3!. lntr-udevar

instructiunea

de atribuirc:

umiat de \;11 caractcr ncnumcric (de cxcmplu sl'Ir0itui de fisier: <Ctrt=-z. litera etc), iar dupu nccsta sc va actionu tasta linter. l'rogral11ul de f'~l\~1 o parte care sc executa arc
a.

rezulta

ca F=2!' Putem

folosi

aceeasi

instructiune

pentru

rcpctnt:
a,;c:sta
SL' adunu

b,

eilL'slC: coustructia curcnta dc: la intrurc. I)<lC;1 1<1 intrurc ,-,I alla! lIll mtrcg. utuuci

3!=2!*3=f*3
ln vulourca

unci

v.uiahilc ,I ~i sc rcvinc la punctul Altlcl sc mtrcrupc ciiircu.

a, ,. curcia
I

dcci cxprcsia: l'I<i=3! daca, in prcalabil, i se marcstc cu 0 unitatc, Rczulta alaturi de instructiunea de mai sus, este nccesar sf) consideram :.)i instructiunca incrcmcntarc a lui i: a. b. f=f"i; i=i+l;

ca de

De aici rczulta ca initial s trcbuic sa aiba valoarca zero. ,..,". l ln mtrc]; sc: ciicstc ~Ipelilld t'ullc\ia scan]. [)aca notarn cu i variabilu 'alribuic intrcgul citit, atunei la eitirea unui intrcg, cxprcsra:
SCJoE("%d",&i)==l

se

Accasta secvcnta se executa repetat, intii a apoi b si apoi din nou a si apoi b $i asa mai dcpartc. Luifi se atribuie succesiv valorile:

I 'J' u: II Dcci valoarca lui i ucbuic adun.ua la s alit limp art: va 1narca <I( ( l l·. .~ ~ . .' . tilizcazi cxpresia de mai sus cste adcvaratu . Dcci cxprcsia dc mal S,tlS 5C U 1 anictul insiructiunii while, iur eorpul ciclului se compunc dill msu ucnunca:
5::;:S+

l:~:lza

cit in

2L 3!, 4!" .. Penta! a calcula

execute rcpetat alit timp cit


i<=n estc adevarata. Aces! proces de calcul

pe n! (n> I), sccventa de instructiuni a-b trcbuie sa se i nu-l dcpaseste pe 11, adica atit timp cit cxpresia:

i:

PROGRAMUL BIV11
tI i nc l ucle

5C

realizcaza

simplu

prin insuuctiunea

while de mai

rnn

.i 1 f,

t)

I'

oitcstc """

"':stclio.
,111

sir de intrcui :::'cI)arati prin caractcrc c-

h>

albc

.
51

afiscaza surna lor

*1

jos:
while(i<=n) f= f* i;
i+-t;

i nt;

i IS,.

c:

-+.

L;

lnstructiunea
'Hi\n", sl;

cornpusa

poate fi compactata

astfel:

f:=f*i++;

4.12

S'I "

·C "C'I'I'C S"

\111program
b

care ciicstc

UI1

intrcg

II,

calculcaza

~iaflscaza

pc nl.
I

Inrr-adevar,
inrnulteste

operatorul

cu valoarea

neincrementata

de incrementare sc aplica postfixat, deci f se a lui i, ca ~iin cazul instructiunii compuse

initiate. I)Cntr\lIl>O~i()!scconsidcmcgalcu ciclic, L PROGRAMUL BIV12


Ninclude Binclude <stdio,h> <stdlib,h> [I ,170J, calculcaza si afiscaza pc n! "/

;\ vern:
'=1*"'.~ 11."
_J ,..

*(11-1)*11 _,
till

Aces: culcul implica


[ntr-adcvar, fie

proccs

main () /* citcstc pc n din intcrvalul


(

F= I Atuuci:

01 1==2

int n ,i; double t; printf("valoarea


if(scanf("'l3d",&n)

f*i= I *2=2!

lui n:");
! 1) {

132

133

ex i t

printf("nu t Ll :

s-a tastat

un intreg\n");

printf("x[~dl\tYI%dJ;
p r in tf (Hnumaru] prin t f ("produsul

",j

'I, i.l); vc~ctorilor::~f)d\nU


I

if ( n < 0 II n > 170 ) ( printf("n nu apartine exit(1) ; f 1.0; i 2; while ( i <= n ) f " f*1++; printf("n=%d\tn!=%g\n".n,f);
}

('ornp()n(~nt,'l()r
,;(,d),I1''''l,q

i )i

Jl",proclscal);

intervalului

[O,170]\n');

4.14 S,I sc scrie un program care citcstc tim) ccou caractere imprimabile afiseaza ca si caracterc minus. Prograrnul sc intrerupe la tustarea caracter care nu apartinc codului ASCII.

si lc unui

4.13 Sa se scrie un program care citeste componentele a dol vectori calculeaza si afiseaza-valoarea produsului lor scalar.
Daca vectorul x are componentele:

x $i y,

La realizarca prograrnului vorn folosi functiile getch si putch, Functia getch rcturncaza codul ASCll al caracterului citit sau zero daca sc citcsrc un caracter care nu apartine codului ASCII. Expresia
c=getch ()

atribuic variabilci c codul ASCII al caractcrului citit.Se vor recodifica prin minus nurnai caracterele imprimabile, adica de cod ASCII eel putin egal ell 32 ;;i eel
mult 126. Rcstul caracterelor se ncglijcaza. Daca care ca valoarc codul ASCII '11

xl , x2 ..... xn iar y: yl,y2, .... yn


atunci produsuI lor scalar se defineste prin suma de produse:

caractcrului

cirit, atunci insrructiunca

(x,y)=xl *yl +x2*y2+ ...+xn*yn Componenrele xl yl x2 y2 celor dol vectori se tasteaza In urmatoarea ordine:

pcrrnite afisarca caructcrului respcctiv ca ~i carnctcr minus, daca accsta csrc un caracter irnprimabil: altfel cl cstc ncglijat, Accasta instructiunc sc executa repctat, cit timp sc tastcaza un caracter care apartinc cudului /\.SCII. {')c aceca, ca va forma corpul unui ciclu while. in antetul accsrui ciclu vom folosi cxprcsia
c=getch ()

xn yn
Pe rindul care urrneaza dupa ultima pereche se poate tasta 0 litera, un caractcr special care nu intra in compunerea unui numar sau sfirsitul de fisier.

care cstc difcritu (IL' I.cru (adevarat,l) (falsa) pentru resin I caractcrclor. PROGRAMUL BIV14
#include <conio.h> main () ;* citcstc curactcrc
(

pcutru

caractcrclc codului

ASCII

~l

ll'lll

PROGRAMUL

BIV13

imprimabilc

tarn ccou si Ie afiscaza

ell si caractcr

minus

"!

#include <stdio.h> main () j* citcstc componcntclc vcctorilor x si y, culculcaza si afiscaza valoarca produsului lor scalar OJ double x.y.prodscal; int i; prodscal = 0.0; printf("componentele lui x 51 y\n"); i = 0; printf('x[%d]\ty[%d] :', i+l,i+1); wh11e(scanf("%lf %If". &x.&y) == 2) prodscal += x'y;
i++;

int

c;
Cjf,tdl (I )2 I
C' <

while ( c it ( c

lrx,X

J;':~()}

pul.t:.'h('

');

4.15

S[I

sc scric un program

care apelcaza

funcria putclt

Cll

valorilc

codului

ASCII extins. Codul ASCIl cxrins cuprindc valorile intrcgi din intcrvalul
coclulu:

[0,255].

Pc

lillie sc va afi~a valo.rrca

urm.ua de imagine» corcspunzuiourc

134

us

afisata prin Iunciia putch. Ecranul sc blochcaza dupa 23 de linii afisatc sub forma indicuta mai sus ~idupa ce pc linin 24 sc afiscnzu mcsajul: pClllru a continua actiollati () lasla
Dupa acuounrca unci tasIc eeranul xc dcblochcaza de imagini ,_;i a~a mai dcpartc,

pcntru a se afi~a un nou set

PROGRAMUl
• include tlil)clucle

BIV15
<stdio.h> <c.ou io . II.> luuctia putch ell valorilc codului ASCII cxtins ./

Dcoarcce pentru calculul abutcrii patraticc cstc ncvoic de l1l~lsuratorile x I. x2, cit ~ide media lor aritmetica, programul va trcbui siJ pastreze ll1aSliralorile respective !nIH!!! \i!bJDU unidimcnsionaL pc C;ll'C i! no!mll cu .v, Yom prcsupunc ca cx ista eel rnult SOO de masuratori (n<~~500). Media gcomctrica sc ealculeaza prin cxtragcrca radileinii de ordinul ng din produsul cclor ng masuratori pozitive dintrc ce]c n milSltnltori citite. Sctul de masuratori stru dale tlotuntc in sil11plil prccizic, Sctul de masurmor: sc considers terminal duca sc taslcaza un cuructcr care IlU intra in COllmUllerea unci date nUl11eriec.. •
... , Xl1,

rnain I) ;, apclcaz»
{

Programul lisleazii programul sc blochcaza PROGRAMUl BIV16

11111suriltoriic citirc, cite 5 IlC un rind. dupa afisarca a 23 de linii cu masuratori.

De ascrncnca,

oint
(::;;:

c;
1.;

while

I ++c <= 255 ) ( printfl"cod:%4d\t",c); putch (c ) ; putcll,,!: \'1') ; I' ifll c+1) % 22 0) printfl"pentru a continua qetch I) ;

«Jofina MAXMAS SOD ffdefine LIMNUMIT 30 lklefine APEL print£I"rnasuratoarea llinclude Ninclude #include Ilinciude rna in I) <stdio.h> <rnath.h> <conio.h> <s t d.l . h» ib a %d-a:", n+l)

actionati

tasta\n");

/* citcstc un set de masuraton, calculcazn si afiscaza media lor aritmcticn, gCOInctrica si nbatcrca patratica

"]

4.16

Sa se scric x I, xZ, calculcaza • media - media Zil

un program

... , XI1 ~iafiscaza:

care citcstc rczuliatclc

ul101'

masuratori:

float X[MAXMASj; double meda,medg,api int D,ng, i; n=ng=O; meda=O. 0; medg=1.0; APEL;

ariimetic{t a ruasuratorilor: gcornctrica a lor;

-r :

- abaterea patratica.
Daca 1101[1111 cu meda media aritmctica patratica cstc radacina patrata din cxprcsia: a masuratorilor, atunci abatcrca

/* - sc citcsc mHsnratorilc; ~sc insumcaza: - sc inmultcsc cclc pozitivc ,,/ whilelscanfl"%£", &x[n] meda += x [n] ; ifl x[n]:> 0) ( medg *= x ln l , ng++;
n++;
1)(

l(x l-rncda)" *2+(x2-mcda)* *2+ ...+Ixn-mcda)" *2F "Times New Roman" liN
uncle:
N

- Estc Nurnitorul N=n-i pentru


11

11 sau 11-1. 11

sc ia egal ell n-I cind < 30

cstc rclativ mic, De obicei:

APEL;
}

~i N=n pcntru n >= 30


Evident !36 11 >= 2.

if{n<1){ print£("nu exi t (l) ; s-a tastat nici


0

rnasuratoare\n");

.-.-~---.--~~------------------137

meda

/=

n;

/* calculcaza media gcomctrica */ if ( ng < 2 ) ( printf("nu exista nici medg else medg if (
11

2 masuratori

pozitive\n");

al masuratori i curentc. Paramctrul corcspul1z{ltor lui masuratorii curcnte. Dupa spccificatorul urmcazu
dcfincstc caractcrul care sc afiscaz»

cstc

x]

i I ~i

rcprcziuta

chiar

valoarL'a

spccificatorul
dupn valoarca

"i«;

<I

carui

par.uncrru
Accst

-1.0;

caracrcr poate f spatiu (' ') sau caractcrul Pe primul rind sc afiscaza valorilc: xj O] xj l ] x[21 x13] xl41

rnasuratorii de rind nou ('\n').

curcntc.

= pow(medg,l.O/ng); (

> 1)

/* calculcaza abatcrca palralica '/ ap = 0.0; i 0; while ( i < n ) meda)*(x[i) ap += (x li ]


i;-+ i

deci, dupa masuraiorilc de indice (J, I, 2 ~i 3 sc afiseal<l urmcaza caractcrul de rind !lOU. Analog, pc rindul al doilca sc afiscaza valorilc:
- medal;

un spatiu,

iar dupa xl41

xl51 xl()1 xl71 xiX] xl91 dcci, dupa masuraiorilc de indite 5, 1I1Tllcazi\ caractcrul de rind nou.
In general, pc un rind sc afiscaza
(l.

if ( n < LIMNUMI'r) ap /= n-1; else ap /= n; else

7 ~i ~ sc afiscaza

lin sp.uiu, iar dupu xl91

valorilc. xlSki41
de indicc :lk 14 urmcazn caractcrul
((;le;1

xl5kl xl5k+11
nici
2 masuratori\n");

x15k+21 xl5kf31

printf("nu ap = -1;

exista

Se obscrva
nou,

ca dupil o masuratoarc

de rind

iar in rest urmcaz:1 lin spaiiu. Un indicc i cstc de forma 51\ 14, adieu, daca cxprcsia: i%5==4
cste adcvurata. Dc asemcnca,

rcstul nnpanirii

lui

la :1 cstc cgaicli

4,

/* listcaza masuratorilc, cite 5 pc lin rind */ i = 0; while(i < n) ( printf("x[%d)=%g%c",i+1,x[.iLi%5==4


i++;

II

i==n-1?

'\n':'

'j;

dllpa

ultima

mnsur.uoarc

sc va alis:! caractcrul

de nnd nou.

if(i%(5*23) == 0 printf("pentru getch ();

a continua

actionati

tasta\n');

adieu dac;1
arc valoarea

adevarat . Rczulra ca afisarcu caractcrului

de rind nou

Sl' V;I EICL'

.uunri

CIIIt!

cxprcsi.: sitllali(~

;* afiscaza mcdiilc si abatcrca patrarica *1 printf{"media aritmetica=%g\n', meda); i f (medg ! = - 1. . 0 ) pr i n t.f ("Inc;dia Ot'i>omnt r .lca:d~i~J\nH .If\(~d\n ;
H(

i%5==4I1i'~'=n-l
cstc

n>

1)

leproillta

adcvurattt . in rest sc :di::;c;lla tin suuplu PIIIIl'~pll'sia c!llllll\itlll;tia:

carncrcr

spa\iu.

Accasta

sc

printf("abaterea

patratica=%g\n',sqrt(ap)j;

i'Y.,5==41Ii~"=n-I·)'\n':' , cxpresic cc corcspunde spccilicarorului de Iormat %c. Acest cxcmplu dcmonstrcaza ()dala III pillS bci Iltatj lc mari (l tcrirc de cxpresiile condirionalc la cornpactarca programclor, " Accasia metod;", de nfisare a fost indicata de autorii limbajului C in lucrarca

Observatii: I. Pentru a afisa masuratorile cite 5 pe un rind s-a apelat functia print] folosind trei spccillcatori de format in paramerrul de control: . "x[%d] = °!t,g'Yoc" Parametrul corespuuzator 138 lui (X,dcstc i+ 1. Acosta dcfincstc numarul de ordinc

121
Pcntru
;1

calcul.:

r.ulicalu!

de ordinul

!l!~ dill

/I/("'([!

Sl'

apeiL-ala

rUIlL·lia I)UI'·

lY)

cu p:\ral1lclrLlIII/('dg~i
1'\1111'11,1/'(111'

l.(iin,!.!.

spariului,

al tabulatoruilli ,

sau al caractcrului

de rind nou. Expresia

.uc proioupul: (duub lc .v.do uhlc


r):

(c=gctchar()}=='

duuhle
~I rcturncuzn

PO\Y

pC ,\ la putcrca .1', in GIZlIl de 1;1\<11 ,(lill,!.! me upul double: dcoarcce 1.0 cstc 0 «()nstallta de lip daubl,'. i\!cI1\iUIl,111l ca e\presia ling arc valoarca zero (unpartirc de imrcgi ell Ilg> I) clcci cstc I1l'l'\'"lr<l utilizarca consrantc: I,O. Apclul Iuuctici /'(1\\' 111 programul de mai SliS rclurllC;JI;I pc lII('dg la putcrca I,Olng. adica radi\';Jl illdic,' '1.1; dinlllcd,l;.

compara codul caructcrului citit ell eel al spatiului s-« eitit un spatiu fjoi./ci/s in caz contrar. in mod analog, cxpresia e=='\t' cstc adevaruta e"'='\n'

~iarc valoarea adevarat, daca

daca

S-(l

eitit earaeterullabulator,

iar expresia

4.17

Sil

sc xeric

dil'crile
IIlSU~1.

UII prugralll C;\Ie cill'~le de caructcrclc alhc) ~i afiscazu

UII

CIIVIIlI

(sllcccsiullc. 0i sufixclc
lUI

prcfixclc

de caractcrc dilcritc de cl

cstc adcvaratn daca s-a citit caraetcrul newline; Rezulta ca, daca se citeste un caracrcr alb, atunci cstc adeY}lratfl una dintrc cele trci exprcsii de mai sus, ceca ce conduce In faptul ell cxpresia:

Fie
c1t'r

cuviruul:

(1) (e=getehar())=='

'1Ie=='\t'lIc=='\n'

estc adcY[lrata daca ~i numai daca se citestc un caracter alb, accstui cuvuu, difciitc de cl insus: suu: De aici, rczulta ca pcntru a avansa peste caraeterele albe vom utiliza un ciclu atit timp cit expresia (I) este adevarata. Deci antetul ciclului cstc:

atunci prcfixclc c cl c+t


c+t "

while care sc va executa


wh i Lo ( (co'(Jetchar

() )

"llc"~

'\t '1Ic== '\n' )

in mod 'll1alo,!.!, sufixclc

accluiasi

cuvuu

sint:

*1'
t*

1 I * I'

decit sa avanseze peste albe, corpu l lui se compline din instructiunea vida, caraeterelor cuvintului de la intrare sc rcalizeaza tot printr-o instrllC\iunc while, Dc data accasta, ciclul while se executa atita timp cit expresia (1) cstc falsa, nu s-a intilnit sfirsitul de fisier si nici nu s-au citit inca 70 de caracterc, caractercle Citirca Prima conditio sc cxprima deja caracrcrul curent,
i

Deoarecc acest ciclu nu are de realizat altceva

prin negatia cxpresici

(1), presupunind

ca c contine

Sc prcsupuuc

(;1

un

CU\'11l1 llli

dcpa~c;;lc

7() de carnctcrc.

Prouramul ;IV;II1Scal.a peste e\'CI1111,t!e!c cnructcrc ulbc cure prcccd cuvuitul prclucrat. Apui cilc~le caructcrcle din compuncrca cuviniului ~i lc pastreaza clemente ale tabloului tab. Cuvintul sc tcnnina 1<1:
intiluirca
1I1l1li

de ea

(2) !(c==' 'lIc=='\t'lle=='\n')

Tinind scarna de Iaptul Gil cxpresia


'(allb) estc cchivalenu; !a&&!b cxpresia (2) se poate pune sub forma:

curactcr alb;

cu:

iruiluirca
-

sfirsitului

de fisicr: macroul
gctcluir.

dupa cc S-;\lI eitit 70 de caractcrc care I1Usint albc.

Caractcrclc sc citcsc folosind cxprcsia de atribuirc:


c::.:·qetcha:r ()

Accsta se apclcaza

prin

(3) !(c==' ')&&!(c=='\t')&&!(C=='\I1') Deoarccc expresia:

care atribuie lui c codul ASCII al curacrcrului cirit.Pcntru caracierclc albc cstc IlCCCS,lr sa stabilim daca eodul atribuit
140

lUI

a avansa peste c csre codul

!(a==b) cste echivalenta cu:

141

al=b expresia (3) se po ate pune sub


(4) cl=' '&&cl='\t'&&cl='\I1' A doua conditio pentru continuarea ciclului while este ea sfirsitul de fisier. Aceasta mseamna ca expresia:
0

forma mai simpla:

sa

while(j<i) ( k~ [); /* punctul 2.1. "! while (k-c j ) { I" pUllcluI2.2. */ pu t cha r (t; [k] ); I" punctul 2.2.1. "l k++; /* PUIlCllIl 2.2.2. "]

nu se citeasca

pu t ch a r ( '\n'

);

f* puncI1l12.3. */
*'/

j + +; /* pUllcluI1.4.

(5) c!=EOF
trebuie sa fie adevarata.

Daca notam ell i numaratorul de caractere citite, difcrite de caracterelc albe, atunci eiclul while continua daca pe linga conditiile (4) si (5) de mai SlIS, estc adevarata ~i conditia exprimata prin expresia: (6) i<70 (se presupune ca initial i a fost 0).
ca ciclul while pentru citirea caracterelor cuvintului aflat la . intrare se continua atit limp cit expresiile (4), (5) ~i(6) sint adevarate, ceca ce se exprima conectind expresiile respective prin operatorul "si logic". tn corpul ciclului se pastreaza codul caracterului citit in rabloul t de tip caracter, se incrementeaza numaratorul de caractere si apoi se citeste caracterul urmator, Acestea se realizeaza prin instructiunile de atribuire: De aici rezulta t[i++}=e;

Sufixele se pot dctcrrnina printr-o secvcnta analoga. Daca in cazul prcfixclor acestca toate inccp ell t[O I, in cazul sufixelor, caracterul de inceput esrc variabil, Asrfcl, sufixul de lungirnc 1 contine numai ultimul caracter al cuvinrului deci este tli-I]. Sufixul de lungime'2 se cornpunc din ultiruelc 2 caracterc ale cuvintului: tli-2J

$1 tfi-Il.
3 se cornpune din caracterele: tli-I].

Sufixul de lungime t[i-3], tli-2);;i

In general, sufixul de lungime j se compune din caracterele: tli-j], t[i-j+l], ..., t[i-l]. De accea, in accst caz variabila k Ill! sc mai initializcaza CII 0, ci ell i-j. Dcoarece toate sufixele all ea ultim caracter pc t] i-l ], rezulta ca variabila k variazil eli pastil 1 de In i-j pin£l In i-I. In rcst~ secvcnta pcntru dctcrminarea sufixelor este aceeasi cu cea pentru detenninarea prefixclor. PROGRAMUL BlV17
linclude #define linclude
main
(

Si c=getchan); Pentru determinarea prefixelor cuvintului urmam pasii de mai jos unde: - Are ea valoare lungimea cuvintului.
j - Are ca valoare lungimea - Numara caracterele

<stdio.h> HAX 70 <stdlib.h>


lin cuvint

prefixului curent,

unui prefix.

1. j= 1 - primul prefix are lungimca I. 2. Cit timp j<i se executa: 2.1. k=O, 2.2. Cit tirnp k<j se executa: 2.2.1. Se afiseaza t[kl. 2.2.2. Se rnareste k cu 0 unitate, 2.3. Se afi~eaz,ll1ewlil1e deoarccc s-an afi~at tonto caracrcrclc prcfixului
2.4. Se mareste jell 0 unitate pentru a afisa prcfixul urrnator.

()

/* citcstc

si afiscaza

prcfixclc

si sufixclc

lui '/

int c,iJj,k; char t [MAX] ; /* avans peste cvcntualclc caractcrc albc care prcccd cuviniul de prclucrat ./ while(c'" getchar() ) == ' 'II c== '\t'll c == '\n')

curent.

iI

(c

l':(lF

printf ("cllviIlL exit(l);

v i d vn=j .

Pasul 2 sc rca lizcaza prin doua cicluri while imbricate:


l" sc citcsc caractcrclc

cuvintului de la intrarc ./ .i = 0; /* numerator de caracrere v whi Ie (c ! ",' , && c ! = '\ t' && c ! =

'\n'

142

143

[,Ix

c:

EOF' C; t)

,,,'. i

.i

<;

70)

tli'+]
C ::

2.

qet.char

/*

arlse;\:;a
) I;

prclixclc
(

('\1\'1111111111 dl' illll.t',illll' i


Itlll!.'JIIIl'1I

*/

wh i.l EO

/1' 1 an.: (:I \,,11);1)(' j -; .i ) (

pll.'ii\\Ill11l·\III.'1I1

-iI
de I" 0 luj- I */

Sc evalue,mi cxpresia exp ), Dac{l arc 0 valoare diferita de zero (c.ste adcvaratav; atunci se executa instrt!c~iun('a care formcaza corpul ciclu lui, Altf'c[ (cxprcsia arc valoarca zero adidl./ids) se icrrnina cxccutia instruciiunii tor 0i sc treel' la instruqiullca urmntonrc de exp S, Apoi sc rcia cxccuria dcfinita
UUjJ<l C:Xcc'utan:a corpului ciclului :ie'
executa .scCVCIJ\;1

k" 0; /" "'"1UlI;.>lol 1ll'111111 caraclcrck wh i l e I k < j I

prcfixului:

3.

de rClllipaliLarc

putchar(t[k++]) ; putchar (' \n'); /* dura prcfixul


j
,I· I

de lu pasul 2.

afisut "~I

/* sfirsil

ulisarc prcfixe ')


iu] "]

/*' afiscaza sutixclc cuvintuluir j"

1; /" lungillll'<l sufixului curcnt *'/ wh i 1" ( j < i ) ( k =:: i - j,. I'" numarntor pcntru carncfereic sufixului: dc la i-j 111i-I =t while( k<i ) putchar(tlk++] ); putchar('\n');
j ++ /'
) )

Ca ~i ill cazul instructiunii while, instruc\iunea din corpul ciclului (or nu sc daca eXfJ2 are vulourea zero chiar de la inceput. Exprcsiilc dillul1lctul luifbl' pOL fi 01 vide. Caraclcrele punct si virgula vor fi totdcauna prczcntc.
CXCCUl<l niciodata

Exemplu:

Secvenra de insumare a c1cmcntelor


s=tab] U'[+tab] Ij+ ... +tabl n- I I sc rcnlizcaza
I

tabloului lab:
compusa:

cxecutind
;

rcpctat iusuucriunca

""8 tal, r i]
i-t-+ ;

4.7. Instructlunea for


lnstructiunca for, en ~i instructiunca while, se utilizcaza structura repctitiva conditionata anterior.

pcntru a rcaliza

inSlntetiunii./i)/'

un de

initial

5=0 0i i=O, de rnai jos:

alit

limp

cit

i<l1. Ea

sc poatc

rcaliza

eu

ajutorul

Formatul ci cstc: ror(exp I ;exp2;exp3) instruciiune undc: exp l , cxp? si


cxp s

for(s=O,i=O;i<n;i++) s=s+tab[i};

In accst caz cxprcsia exp l este formara dill doua atribuiri: s=O, i=O
eXI)2 este rcprczcntnt., i<n

- Sint cxprcsii.
cstc:

de conditia

Antctul iar

instruqiuniijin'

iar exp3 cstc exprcsia


i++

fortcxp I ;exp2;exp3)

II

cstc corpul ci ~i ca sc executa rcpctat. Exprcsia exp / sc I1Ul11c~te partca de illi(ia/izo/'c a ciclului for; iar exp3 cstc n;lI-tClI de reinttializare a lui. Exnrcsia cxo? cstc conditia de continuarc a ciclului ;()/~~-ica joaca ;leela~i 1'01CII cxprcxin din'cielul while. /II.I'II'IIC(IIIII(,

Conform dcfinitici executa ntribuirile s=O i=O Sc cvalucaza

instructiuuii

for, la inccput

se evalucaza

cxpI , dcci sc

Instruc!iullcajiJ/,

sc executa astfcl:

I.
144

Sc executa sccvcnta

de initializar«

dcfinita de exp /.

cxp2, adieu sc dctermina

valoarea conditici

145

i<n Daea ea este adevarara, s=s+tabji] Apoi se evalucaza i++; Dupa incrementarea lui i se rev inc la evaluarea conditici exp2. in felul acesta, ciclul continua pinEl cind conditia i<11 devine faI5[1, adica in momentul in care i devine egal cu n. Deci ciclul se intrcrupe dupa ee elernentele: tabl O], tab] I], ... , tab[n-l] au fost adaugate la s. Secvcnra de mai sus poate s=O; i=O;
while(i<n) ( s=s+tab[i] ;
i+,t;

atunci se executa corpul instructiunii

for, adica suma

o instrllqiullc/hr
f'or(;;)
instructiun«

de forrnr:

exp3, adica se executa incrcmentarea

csre valida ~i en csre cchivah:lltil


while(l) instructiim«

ell insirucuunca

II'''i/(' de mai jos:

Un astfel de ciclu se poare tcrrnina prin alte mijloace decit eel obisnuit, CUm ar fl instructiullca de rcvcuirc dintr-o funcric, un salt la 0 ctichcta etc. (vczi mai jos).
Din cell' de mai sus rezulta echivalcnta cclor doua cicluri. Autorii rccomanda in ciclurile in care sint prezcnte partite de initializarc ~i rcini(ializare. De obieei, accstc cicluri sinr asa nunutcle cicluri ell pas.

fi

....
sensa cu ajutcrul

..
instructiunii

..
while astfel:

utilizarcn inSll'ut(iuniijor

ExerCitii:
4.18

calculcaza

Sa se scric

~iafi(,caza pc 111.

un program

care

cite~te intregul

n din intervalul

10,170],

in general,

instructiunea

ror:

for( exp l ;exp2; exp 3) instructiune


poate f sensa cu ajutorul exp l ; while(exp2) { instructiune unci sccvcntc in care se urilizeaza instructiunea while:

Acest excrcitiu a fost rczolvat cu ajutorul instructiunii while. Propullem cititorului sf, rcscric cxercitiilc rezolvarc cu ajutorul instructiunii Ivhileinlocuindo pc aceasra cufor.

PROGRAMUL BIV18
.include #include
(

<stdio.h> <stdlib.h>
11

main () /* citcstc pc intn,i; double f;

din intcrvalul

fO,170J, calculcaza

si afiscaza pc n' */

e.xp3; Aceasta echivalare nu are loe intr-un singur caz si anume atunci ciud, in corpul instructiunii se utilizeaza instructiunea cOI1_tiJ1ue (vezi mai JOS.): .. Reciproc, orice instructiune while poate fi sensa ell ajutorul unei mstrucnum jar in care expJ si exp3 sin! vide.
Astfcl, instructiunea while de mai jos:

printf("valoarea lui n:"); if: (scanf ("'tel" ,&n) !" 1) ( printf("nu s-a tastat un intreg\n"); exi t (1) ; if(
n< 0

II

n> nu

170

( int.exvdlului. (O,l,)O)\n");

p r Ln t I t vn ex i t (l) ;

i.'Piu·tin,'

'vhilc(ex]J)

instructiune
este echivalenta
Cll

for! f=1.0, i=2; i <= n; i ••) f' printf("n ='tcl\tn! oo'Lq\n", n.Ci;

i;

instructiunearor

for(;exp;)
instructiune

4.19 Sa sc scric un program care citc~te pc 11 ~i a, calculcaza lui a In puterca a /1-a (n**n). II esrc intrcg ncncgativ,
ourecnre. Ca!cnlck SL' Iac ill fllliallta
IOllg dill/hit'.

;;,1'

si afiscazn valoarca a csrc lin I1l1l11;11'

146
147

() 1l1L'I(ld~1

suuplupcntru [3IV'l~
.,

!'lcilCd

pc

II

l.t

Jllllnl';I;1

Ihl.

pcnlru

» natural, cstc de

;1 1I11111lili pc If cu l'IIIISW,1

dl' 1/ \111,

PROGRAMUL
i;It'11

pc U, d,ICI II csic impar. AccSI lucru rczulta din Iaptul ca oricc numar natural pozitiv, sc ponte cxprirna ca () surna de puteri ale lui 2. intr- adevar, nu avem dec it S;l reprC7C!1!i1!11 numarul !? ill binur 0i sf! iusumam putcrilc lui doi din sirul: (2) I ,2,4,tI,1 6,J 2,64, .. , care corcspund cilrclor I dill accasta rcprezcntarc,
CLI

ro . r, Ii iil

Corcspondcuta

dintrc tcrmcnii sirului (2) si cifrele reprczentarii

, 1;

de la dreuptu sprc stinga udica I sc punc in corespondcnta rcprczcnrarii binarc, 2 Cll pcnultima, 4 cu antepenultima etc.
I"
,l,

binare sc face ultima cifra a

1 d"lil

I',

1('\.''''t~lnlll·
J

,,"~·K.II'J

I ••

")

if

(::;cn;1f

(" u

I'
vnu

!I

{
Illl (1t!ftlnr\l,");

Fie n=43. in binar 11=10101.1 Rezulta ca


/I

/I

se rcprezinta

astfcl:

p ri

trt

;:; ,.,~ ld::~(-,1;:

";';i t. I i I ; p ri L' \
1.1]
H

j_

t)

"I:

iI I
i 111 I' (
j,

\ II
11\ I ,[ I,l:·~t<lt 11[1

cifrclor
)

1 din rcprezentarea

esrc suma termenilor 1,2, 8 si 32 alesi din sirul (2) conform binara a lui:

(
I II "t\1 "q1.1 I iV\11<l);

illll(_~·q

11'""1+2+8+32=43 Pcntru a calcula pc a**n va f suficicnt sa realizam produsul factorilor a**2, a**8, $i a**32, factori alesi din sind (I) $i a, Din cole de rnai sus rezu Itil ca pentru a reduce numarul mmultirilor la calculul lui n**n cste suficicnt sa generam factorii sirului (I) si s,\-i alegcm pc cci ai carer cxponenti insurnati nc dau pe n, Selectarea lor se poate face simplu pornind de ln reprczcntarca binara a lui 12. Astfel, daca ultima cifra binara a lui /l este I, atunci se sclccteaza en prim factor chiar a. Apoi, facmd 0 deplasare spre dreapta a lui 11 cu a pozitie binara, se alcge sau nu factorul a**2, dupa cum ultima cifra binara <I lui 11, dupa ce s-a facut deplasarea, este 1 sau nu. Procedeul continua pina cind 11 devine cgal cu zero, Proccsul de calcul se dcfinestc astfcl:
1.

i \_ i) (
(,] P pr iu t 0P
I

1, 0 fJ;
-i :

i<

il"

1-

r(

\ n"

I,"'!

!\

{,)

l:

Ohscrvnrii: I. Fuuctia
I)()II',

de prorotip: v.duublc .\·L


cl'icicllla pcntru

do uhle po\\'( double


,

scuti lizcavu pcutru date de lip double, i\lcl\lda lI\ il iv.u a III prm!r~lnllil de Lila 1111 csk dcourccc ucccs itu I1\\lJ\C inmuluri. Numarul
I'!\lcl'\!ind l';1 1ll;1Ijos.

lor

poetiC

rclativ marc, II reclus substantial


/l

Ii
I I

p=J

Ftc
rO"d

2. 3. 3.1.

f=a
Cit timp 11 cste diferit de zero se executa: Daca ultima cifra binara a lui II este egala cu 1, atunci p=p*f Se gcnereaza termenul urmator din sirul (1): f=f*f II se deplaseaza spre dreapta cu 0 pozitie binara,

3,2.
3.3,
l'epc\aIIIlS\J'lIC\ilIJ1C<I de

Lxccuuud

auibuirc

sc gCl1crcaza

putcri lc:

Sc observe ca punctul 3.2. este necesar numai daca n> l,lntr-adevar, daca 11= 1 atunci proccsul de calcul se termina, deoarcce prin deplasarea lui 11 la dreapta cu o pozitie binara acesta devine egal eu zero si deci ciclul nu se mai reia. Avind in vedere Iaptul C{I terrnenii sirului (I) cresc rapid, este important ca sa suprimam calculul lui ponte conduce 3.2, se schimba ell

adieu cxponcnrii lui If sint puicri ale lui 2. Tcrmcnii sirului ( I ) ,Sl' gCIlL'll';I;;1 priutr-un 1111/11;11' rclativ mic de opcratii de mmultirc. <l**ll sc po.uc cxprima loiusllld uuiuai Iactori din sirul (I);;i eventual ~i
!4i)

tcrrncuul care s-ar genera pentru n= 1, dcoarece eli toate en cl BU este necesar, la 0 depasire flotanta superioara. In acest fel, punctul

[49

daca n> 1 arunci sus. PROGRAMUL


#include #include

f=P'f

Programul BIV 19A ridica pe a III 11 folosind procesul de calcul descris mai BIV19A

programare. Ea are fortuatul: do instructiune


while(expresie);

<stdio.h> <stdlib.h>
11

lnstructiunca do-while se executa in fclul urmator: I.


2.

main () 1* citcstc pc
(

si a. calculcaza si afiscaza pc a**n *1

Se executa instructiune
Se evalueaza expresie; daca aceasta arc 0 valoare diferita de zero, atunci se revine la punctul I, pentru 11 executa din nou instructiune; altfel (expresia are valoarea zero) se trece in sccventa, adica la instructiunea urrnatoare instructiunii do-while.

int n i r long double


i

a,p,f;

printf("Baza a "Ii H(scanf("%Lf", &a) != 1) ( printf("nu s-a tastat un numar\n"); printf("Exponentul n = "Ii if(scanf("%d", &n ) != 1. printf("nu s-a tastat

exit(1.);

Sc obscrva ca in cazul acestci instructiuni


se testcaza conditia de repctare a executiei Instrucriunea do-while este echivalenta
exit(l);

intii sc executa instructiune

~i apoi

II

n<O ) ( un intreg nenegativ\n");

ei. cu secvcnta:

instructiune

i n; 1. ) ( for(p=l.OL,f = a; n ; n »= if ( n & 1. ) P * = f; t* factor selectat din sirul (I) "! * = f; t* genereaza termenul urmator din simi (I) */ H(n>1.)f
)

while(expresie) instruct iune Consideram ~i in accst caz ca, instructiune rcprezinta eorpul ciclului
do-while. In cazul instructiunii do-while dcosebirc de cazul instructiunilor niciodata.

printf("a=%Lg\tn=%d\ta**n=%Lg\n",a,i,p
}

);

corpui ciciuiui sc executa cei rutin 0 data, spre while ~i or, cind cstc posibil sit nu se execute f

Observatii:
1.

2.

3.
4.

expl realizeaza initializarile de la punctele 1 :;;i2 din descrierca de rnai sus: p=l.OL, f=a exp2, conditia de eontinuare a ciclului s-a redus la II; deci ciclul continua atit timp cit n este adevdrat, adica este diferit de zero. Punctul3.3 este partea de reinitializare a cicluluijor si ea consta din cxpresia n »>= 1 care deplaseaza pe 11 cu un ordin binar spre dreapta. Expresia n&1 are valoarea 1, daca ultimul ordin binar al lui 11 este egal cu 1. In acest caz factorul generat in variabilaJse selecteaza, deci se inrnulteste cu p.

Exercitii:
4.20 Sil sc scric un program care cik~1l' 1I1l11111llar ncncgativ, subunitar, calculcuza si afiseaza radacina patrata din numarul respectiv cu 0 croare rnai mica decit 0,000000000 I.

Programul de fata nu foloscste functia sqrt din biblioreca standard. Pentru a extrage radacina patrata dinrr-un numar a din intervalul ponte Colosi metoda itcrat iV{1 :1lui Newton de mai jos.
Fie sirul: x[O], xII], .... x]n], ...

(0,1), se

undc:
(I) x[n+ 1 ]=0,5(xln]+a/x[ 11)) pentru 11=0.1,2 •...

4.8. lnstructlunea do-while


Instructiunea do-while realizeaza structura ciclicd conditionatd posterior. Aceasta instructiune poate fi realizara cu ajutorul celorlalte instructiuni definite pina in prezent. ClI toate acestea, prezenta ei in limbaj mareste flexibilitatea in 150

Se demonstreaza ca sirul de mai sus este convergent si arc lirnita cgala cu radacina patrata din a. Convcrgcnia este Ioarrc rapida pcntru a subunitar. In acest caz sc poate lua x[O)= I. Pentru a obtine radacina parrata cu precizia ceruta, este suficicnt ca diferenta,
151

In valoarc ubsoluta, dintrc dui Ef'S=(),OOOOOO()OO I

tcrrncni

C()l\SCCllIIVI ;11<irului Sil I'lc Illai

mica

decit

elsu i £ I a ,,=
x2 = 1) 1; I" radacina patrata din I eSIC I */ ( /* a CSiC dilcrit de () sau 1"'/ x2 l; do xl = x2; x2

S'I obscrvam ca pcntru a rczolva problema cu metoda indic.ua ficcarc pas al calculului, sint ncccsuri numai dOl tcrrncni iii sirului:
a,

mai sus, Ia

eIsEe

b.

Dill x l n ] sc dctcnuinn xl n: II cu rclutia (I). Sc comp.rr.. ;lI)s(:-;II1\-,\111 Illl'u LI'S: Daca valoarcu absoluta rcspcctiv.i nu csic mai mica dccit EPS, atunci sc ca lculcaza x In+'21 Iolos: lid rclatia ( I ), in care xj n] sc inlocuicstc eu xlll+ I J, i)cci sc poutc rcvcui Iii PUI1Cllli if dc mai sus, dup" cc lui x] 111i sc atribuic valoarca xln+ II, Dcci, in loc sii uulizam tubloul .r. cstc suficicnt su lolosim doua variabilc x I 0i ,y'? care pastrcaz{1 in Iiccnrc moment doi tcrmcni consccutivi ai ~iruhli, de
mai
SIIS,

i f ((
Y

0,5*(x] z; x.l

+ "/xI):

xl.)"

-Y; /* y abstx l-x2)'/ while( Y >= EPS ); I"~sfirsit else */


)

printf('a=%,11g\tsqrt(a)=%,11g\n',a,X2)

Tcrmcnii

sirului sc ohtin cx ccutind rcpctat sccvcnta


I);

de atribuiri:

Observatii: I, inslruqiullea
do xI ·.~x:::; x2dl. ':1* (xl'ln/xl); Jwhilelly:xl-x2)<O?_y;y,y>=EPS)

x Ix2;

x.2=O,S*(x I! .i/x

c/o-while ponte f scrisa mai compact

astfcl:

I )Uj1;I i'il'G!1'C l'Xl'Cl1\il' :I ;lCl':-;ll'i :,\'('\,(I1\c. \ I ,~i\2 ;1\1 ca v;!inri <ini il'rIlll'.lli consccurivi ai sirulu, cautat. ,. Sccvcuta sc va rcpcta atit timp cit (2) abst x l-x2) >=' CPS, test care il tacem dupii ficcarc cxccutie a sccvcntci de atribuiri, Daca cl sc confirma, atuuci sc rcpcta sccven\a rcspccnva, a I uc I va 1oarCH val' I'a bile 1'\',1 aproximcaza , ,_ , '. f raducina patruta din (/ cu o croarc mai mien dccit t-:I'S,

2,

Accst proccs de calcul xc rcaJizeaza imcdiat printr-o instnlqiuncdu-Illhi/c , Sccvcnta de alribuiri cste corpul ciclului, iar cxprcsia (2) rcprczmta conditia de coutinuarc a lui, lntrucu primul tcrmcn al suulu: arc vuloarca I, instructjunc» dO-lVII/Ie cstc prcccclaia de auibuirca: x2 I;
00

Pentru numere supraunitarc sc ponte ap lica acecasi metoda. In acest caz sc poatc lua ca prim tennen al ~irlllui chiar numarul din care se extrage riid,)cina patrata. 0 alta posibilitate estc de a extrage radacina patrata din invcrsu] numarulu], Accasta dcoarccc metoda cstc rapid convcrgcnia pcntru nurncrc subunitarc, Fie 0> L Atunei x= !la, Daca y estc radacina patrata din x, atuuci 1Iy cste radacina patrata din a,

PROGRAMUL BIV20
Hirlclude ».irlc],ude

4,21

<st~Jlil).I'i>

t(iio.tl>

Sa se scrie un program care citeste un intreg pozitiv ce reprezinta 0 suma cxprimata in lei, Se cere sa so afiscze numarul minim de bancnote si moncdc de J 000 lei, 500 lei, 200 lei etc, necesare pcntru a exprirna suma respcctivg.

ma i 11I)
I

I' citcstc

pc a din intcrvalullt),

II. cnlcuicaz.i 0; afiscaza ralinc;na

patrnta din a */

lei.

clou n l o d,xl,x),:/;

Proccsul de calcul inccpc cu dctcrrninnre., numarului de bancnote de 1000 de in acest scop se imparte suma respectiva s la ,I 000: s/lOOO

prirltf("1'astali
ifisc"tll("Uf",&il)

valoaren
! s-a

1.!!

lui

it

=
0

II);

il <

II ;,

>

I)

ox it
'I "
cz c:

printfl"Nu
( 1) ;

ta';\:dt

un numa r in inteJ:vdlul [0,1)\n");

Pentru a determina numaru] bancnotclor de 500 de lei se determina restui imparririi lui s la 1000 si acest rest se imparte la 500 ~iasa mai departe, Se obtin pasii urmatori: I. 2. 3, q=sl 1000; afiseazd q s=s% 1000; q=s/500; afiseaza q

0
(j;

) I'" rad;lc1na pallala

:.,:>.

din !L'Wl'slc

zero''!

152

4.

s=s%500;

5.
6. 7. 8.
"

q=s/200; aiiscaza q
s=s%200; q=s/l 00; afiseaza q s=5%100;

int monl9]; Ions; 51 qi int ii printf("Tastat"i suma: if(scanf("%ld",'\'s) !=


print:f{"nu
S··a

-1
II)

9.
10.

q=s/50;af(~ea::d q
s=5%50; q=s/20; afiseaza £j s=s'%20; q=sll 0; afiseaza q s=s'Yo I 0;

Is
un

<=

r.a s t a

exit(1) ; monlO] mon[4]


monl7] i :::: 8j

0) intrr'g po zi r iv vnrj

I 1. 12.
13.

= =
=

1; monll) 50; monlS]


')()o;

14. 15. 16.


17.

""Jnlnl

5; mori [2] ,010; 100; mon[6]

[finn 200;

III

.c

!0 ;

10(j0;

q=s/5; afiseaz{i q
5=s%5; q=s/I; afiseaza 5=5%1. Se observa s=s%n;

do
q

s/mon[i.I; ) /* utisarcn se face daca q estc dilCril de zero "! i f ( i < () ) /'1: monede "!

if (q

18.

if(
elSE:

q i[( i

1.

ca secvcnra:
q

) I" o moncd ...d<~I I"" "1 printf("o moneda de 1 ].eU\r1");


v

==

/* C'xistn (} singura
0

ItlOIlL'da

"I

q=s/n; afiseaza

p ri nt.tt

lflonedi:'l

a. :t;d

le

i vne,

rnori [ i I ) ; e Ls e l" mai I11Ultc ruoncdc 'il

se repcta pcntru valorilc

lui

11 egale

ell

i 000, 500, 200, i 00, 50, 20, 10, 5 Si 1 Pentru a putca executa repetat accasta secventa esrc ncvoie de simpla prin care sa sc atribuie lUI 11 valorilc corcspunzatoare. Aceasta rcaliza daca pastram datelc respective intr-un tablou de tip int, Fie:
0

metoda se ponte

i f ( i" = 0 ) I"~mone.le de I len "1 prinrf("%Irl monede de I 10u\n",q); (else 1" moncdc a 1l1onlillci "'/ prj,htf("%ld monede a %d lei\n", else /',. 11:1I1l'11I){C') if (q
q, mon [i]);

111on[01= I, m0I1[31=20, mont 6]=200,


Atunci
IJ

l11onI11=5, 111011[41=50,
111011[7}=500,

111onI21=10, mon[51=100, 1110n[8]= I 000.


la

1) /". o sing"ra hancnota "! printE("o bancnota a %d lei\n",lnonli]); el se I" nuii multe hancnore *1

) while
}

printf{"{t1d bancnot() mont .i I I; ( s %= mon[i--j);

("I 'l-,d 1t",i\nU,i"l,

fiecarc pas al ciclului.

poate fi inlocuit prin monli], unde initial i=8 si se decrernenreaza Dcci urmeaza a se executa rcpetat secvenra:

q=s/mouli]:
i=i-l ; Aceasta

afiseaza q s=s'zsmonj i];


secventa se va executa repetat pina cind s devine zero.

4.9. Instructlunaa
Accasta abandonarea
continue;

continue
unui ciclu. hi pl'rIlIite

inslruqiullc se ponte utili/a numui ill curpu] iteratici curcntc Forrnatul ci csrc:

PROGRAMUL
#include #include

BIV21

Efectul instrucriunii

continue cstc

urrnatorul:

<stdio.h> <stdlib.h>
0

a.
de lei in bancnorc si moucdc de 1000 lei, 500 lei etc, */

rna in () /* cxprima
(

sum"

In corpul instrucuunilor while ~ido-while: La intilnirea instrucuunii continue sc abanc!oncaz[\ itcratin curcnta si sc trccc In cvaluarca cxprcsie! care stabilcsic continuarca sau"tcrlllil1;m;;; ciclului rcspcctiv (cxpresia inclusa intrc paranrczc rorundc ~i care lIrme;\/<I dllpa cuvintul chcic while).
155

154

h.

111 corpu]
la cxccuiia

instructiunii
instrllC\llll1li

r.»: continiu: xc abalJ(ioIlCdZ<lliLTd\i<l de rcinitinlizarc.


curcnta si sc trccc

I.a inulnircu

pasului

lnsuuctiuuca continue Ilcx ihilitatcu III scricrcu


uivcluiilor dc' imhricarc

nu cstc (l instruciiunc obligatoric. Prczcnta ci marcstc programclor C. La conduce adcsca la diminuarca


ale instruruunilor i/utili/:ill'
III COIj1l1l

corcspunzatoare tastaturii, ci ell' provin dintr-o zona de mcrnoric a carci adrcsa cste definite de primul parametru al functiei sscan]. Accste caracterc pot provcni in zona respective in urma apclului functiei gets. In Iclul acosta, apclul functiei SC(lIl/poate fl inlocuit prin apclul functiei gets urrnat
eventualelc

cititc din zona tampon

ciclurilor.

4.10. Functiile standard sscanf ~i sprintf


carl'

Hibliotcca standard <l liuibajclor C :jl (_'I I conrinc lunciiilc ,1'S(,(/1I/01 sprint]' s int analogc fllnC\iilor\(,(/II/,~i rcspccriv print]. Elc au UI1 pararnctru ill plus la apl'i ~i.uuunv pruuul lor l'ar;llll\.'ll'Ill'siL' allresa unc: Zllnc de mciuoric ill care sc put pastru carucicrc ale codului /\SCII. Cl'ilal\i par.unctrii sin: indcniici cu cci
intilniti in corcspondcntclc lor, sC(/II/'~i rcspcctiv prin It: Primul pururnctru al nccstor lunctii po.ue Ii numclc unui tablou de tip char, lk'll:Il\'I',' 1111 a~t kl til' IIII I Ill' ;\1\' l';1 \,;\IO;lIl' chi.u: atllt'sa (k Illn'IHlt a lOlll:i tie mcmoric care II cstc alocnt:r. FUI1C\ia snrintf«: foloscstc, ca ;;i functia print], pcntru a rcaliza convcrsii ale datdm dL' dilcritc iipuri din Ionuatclc lor interne, in 1(1I'I11<1(c cxicruc rcprczcntatc prin succcsiuni de caractcrc. Di!'cren\a const« III uccca ca. de data accasta caructcrclc respective nu sc afi0eflz;1 pctcrminalul standard, ci sc pastrcaza in 1.01la ,\I: mcutoric delilliia de pll11111! paramctru :11 Iunctici sprint]. Fie sc pastreaz:i suh Iouna unui :;;11' de c.uactcrc ~I put 1'1 ali~alL' UI{CIIOI' din zona respective cu ajutorul luuctic i IJIIIS, Dc acccn, un ape] al luncuci print] ponte Ii iotdcauua II11UCllit cu till ape! al Iunctici sprint], urm.u de till ape! al l'tll1C\ieiJ!llls. 0 astfcl de inlocuuc cstc utila ciud dorun sa alis.nn de mai mulrc ori ucclcasi date, in accst t:1I sc dpeleal.a Iunciia .I/1/'illl(o sillgur<I data pcuuu a face convcrsiilc ncccsarc dill format intern 111 format extern, rczuliatclc convcrxiilor pasuiudu-sc intr-un tablou de tip curncicr. ill cuntinuarc sc pnt ali:;;:! darclc respective apclind functia IJIIIS (\Ii de cite uri cstc ncccsura afi~area lor. FUllctia sprint], en 0i lunctiu print] rC(lII'l1e<1I.;1 numarul octetilor sirului de caructcrc rczultat 1Il urma conversiilor
cfcctuaic.

de apelul functici sscanf. Astfel de inlocuiri sint utile cind dorim sa eliminam erori aparutc la tastarca datelor. Functin S.I·('{IIl!: ca ~i functiu .1'C(fIl/;relurncaz[1 numarul cimpurilor convertite corect conform spccificatorilor de format prczcnti in pararnetrul de control. La intilnirca unci crori, ambclc functii i~i intrcrup exccutia si se revine din ele ell nurnarul cirnpurilor tratate corect. Analizind valoarea returnata, se poate stabili daca all fost.prclucratc corcct toutc cimpurilc sal! a survcnit a croarc. in caz de eroarc sc poate rcvcni pcntru a introduce corcet datele respective, in accst scop cste ncccsar sf] se climine caracterelc incepind ell eel din pozitia cronata. in cazul in care sc utilizcaza sccvcnta:
gets
[:;;:;CZHlf

abandonarca caracterclor respective sc face automat reapclindu-sc Iuncria gels. In cazul utilizarii functiei scanfeste ncccsar s,i se avanseze pina Ia caracterul newline aflat in zona tampon nta~ati\ tastaturii sau S;t so videzc zona respectiva prin functii spccialc, in cxcrcitiilc care urmcaza vorn folosi sccventelc formate din apelurile tunctici gels urinate de apclurilc lui sscanf. 0 astfel de sccvcnta se apeleaza rcpctat in cazul in care se intilncse crori in datele dc intrarc. _ Exemplu:
char tabi255j; in t z i ,luna} an qets(tab) ; "%d ~d %d",&zi,&luna,&an);
i

SSCDIlt{tab,

Exemplu:
chin

inL zi,luna,an; da t a .._caLendll11; "%02d!%02d/O"d", z i , luna, on);

s p r i.n t.f (data,,_calend, pu ts (da ta"ea 1end) ; puts {data .. calend) _


i

Amintim cit functia gets returneaza valoarea NULL la intilnirea fisier. FUI1C\iilc sscanfc: sprintfe» prototipurilc in fi~ieruI5tdjo.h, Exercitii:

sfirsitului de

4,22 Sa se scrie un program care citcste un intreg pozitiv de tip long, stabileste

daca acesta este prim ;;i afiseaza un mesaj corespunzator. PROGRAMUL B!V22
'include #include <stdio.h> <stdlib.h>

Functia sscanj'rcalizeaza, format intern. Dcoscbirca 156

ca ~i funcria scan], convcrsii din format extern in consta 111 Iaptul C<I de data aceasta caractcrele nu sint

157

main () /* citcstc un intrcg pozitiv de lip long, stabilcsrc si afiscaza un mcsaj corcspunzaior Il<j long n: long i; int j; char tab[255]: do (

daca accsta cstc un numar

prim

Expresia: i*i<=n rezulta din faptul ca. penrru a stabili en un numar cste prim, este suficient sit inccrcam divizibilitatcn lui priu numerc al carol' patrat 11\1-1 dcpascstc pc II. o alta posibilitate cstc accca de a inlocui cxprcsia i*i<=11 cu i<=sqrt(n) in accst caz cstc uti] sa sc calculcze raducina patrala
long q; q=sqrt(ldouble)n); for{j=1.i=2;j&&ic=q;i++) if(n%i==O) j=O;

printf("tastati un intreg pozitiv:"); if (gets (tab) == NULL ) ( printf('s-a tastat EOF\n",: exit (1); if(sscanf(tab,"%ld",&n) != 1 II n<= 0) ( printf("nu s-a tastat un intreg pozitiv\n"); j = 1; cont inue; /* se va relua ciclul dcoarece se trece la evaluarca expresici j care cstc difcrita de zero */
j = 0; J* ciclul se intrerupe deoarece s-a citit corcct un intreg pozitiv */ ) while (j); fort j = 1, i = 2; i*i <= n && j; i++) if (n%i == 0) 1* numarul nu este prim */ j = 0; printf("numarul: %ld", n); if ( j == 0 ) printf (,j nu"); printf(" este prim\n"); j

1Il alara cicluluiro»:

o alta simplificarc fill" cu:


j=n'1.,i;

posibila este schimbarca

inslructiunii

ij"diB corpul ciclului

Observatii: I. Utilizarca instructiunii alternativa else:


if (sscanf ( ... ) j=l; else j=O;

4.11. Instructtunca break


continue sc ponte omite folosind
! 0

instructiunc

if'c»

!nstruc\iul1ca

break cste inrudita cu instructiunen

continue,

Ea arc formatul:

brenk:

=111

n<=O) (

2.

Ciclul for continua at it timp cit expresia: i*i<=n&&j este adevarata. Aceasta expresie se evalueaza de la stinga sprc dreapta ~i din aceasta cauza expresia i*i<=n sc evalueaza si atunci cind j=O. De aceea cxpresia respcctiva este mai eficienta sub forma: 5&&i*i<=11 In aces! caz, pentru j=O nu se mai evalueazn rcstul cxprcsiei.

Peate fi utilizata in corpul unui ciclu. In acest caz, 1'1intilnirea instructiunii break se termina exccutia ciclului in al carui corp csre inclusa ~i cxecutia continua ell instruqilillca urmatonrc instructiuni] ciclicc respective. Instruc\illnca break, la let ca ~i instructiunea continue, marcste flcxibilitarca la scrierca programclor in limbajcle C $i C++. Excl'ciOi: 4.23 Sa se serie un program care citesre masurile a, b. c ale laturilor unui triunghi, calculcaza si afiseaza aria triunghiului respcctiv. Pentru dctcrminnrca arici sc va folos: formula lui Heron. Daca notarn cu p scmiperimclrlll triunghiului, atunci aria sc calculca?:{l ClI ajutorul cxprcsici: aria=sqrt( p* (p-a) * (p-b)" (p-c)) Amintim en rnasurilc larurilor triunghiului satisfac rclatiilc . p-a > 0, p-b > 0, si p-c > O

158

dcci xe va testa condiu» p-a. () && p-h () 8.:& p-e ()

care trcbuic sa lie adcvarata.

prinlfl"a= %g\Lb =%g\tc= '5(1\n",a,b,c); printf("nu pot reprezenta masurile laturilor unui triun(1lii\n"); wh ilo 11); %(1\n",!,Qrt(p'(p-a)'lp-b)'(p'c)) );

PROGRAMUL BIV23
1Ii.11Cllldc· ll inc ludo <;.;l:di,n.!:
<,,:I ..ell

ill.li>

»include !!1d i n t )
rl()u b 1e
/"1<

<mnth.h>
Clll'sll' musurilc
tl
I

4.24 S,j sc scrie un program care citcsic doua numerc naturale $i pozrnvc, calculcaza ~iafiseaza ccl mai marc divizor cornun u l lor (c.m.ll1.d.e.).
l.uurilor II110i Irillllghi si afISC:l/,:1 aria lui "!

b, c, 1'> ;

Calculul cclui rnai marc divizor COl11lil1 a doua numcre se poate face folosind ulgoritmul lui Euclid. Pasii accstui algoritm sint:
I. Se citesc cell' dOU1i nurncre.

cho r ti)bl7.S'ij; du ;' cil~'IC Ill;tsunk blUlilollliuligiliulul


do ( l" cil~SI~pc a '/ 1" i 1)1..1 ( "" p r I n t'
)

'/

Fie accstca a ~ib.


2. Se imparte a la b; lie (j a=q*b+r. a=b si b=r

"i ;

;;i r

citul, respectiv

restul acestci imparuri:

iElgets(t"hi

r ( "s - a

==

NUL~
Ld
S

i
L (]
I

EOF' \

n" ) ;

3.

Daca r este direril de zero, se fac atribuirile: ~isc rcvine fa pasul 2.

exit: (1); == 1. && a>O) l" xe icxc tlin ciclul pcntru ciurca lui a */ printf("nu s-a tastat lln nUlnax' pozit"iv\tl"); J,)rjntL{"~::;f~ r e ia c i tLro a lu i il\n"); wh.i.]:" 11); do ( /* circstc pc h *1 printf{"b= "); if{gets(tab) == NULL)
ifU,scan[(tab,"%lf",&i)) brl'"l k;
print:.[{"s-·a t.a s t.a t EOF\n");

Altfel algoritmul

se inrrerupe

si eel mai marc divizor comun al lor este b.

PROGRAMUL BIV24
'include #include main I)
(

<stdio.h> <stdlib.h> ;* CilCSIC doua 111111lCrcinlrcgi si pozuivc si afiscaza c.m.m.d.c al lor *1

exi
)

t (1)

if(sscanl(tab,"'nf",&b)
broa k , f,)l"-int f ("rlu
I).t.illtl.(":~it~

.
0.=:[

long long
,'.,Ix

m,D; a,b;
r,

b>())
lui b *1

Loriq

Ii' sc icsc dill ciclul do-while dcoarccc s-a citit vuloarca So-i) to s t a t un nurnar po zi.t iv\n"); r(}.i,\ citi_!_Cd l ui \,1\11");

char do

tab[255];

whi 1"

11); ");

p r .in t f I "p.r i mu!

do

(
pritltf:("c'

it(gets(t~b)
pritlLE("s-a

==

NULL)
t.a s t.a t. EOF\n");

if((1ets(tab) =, printfl"s-a ex i t (1) ; if(sscanfltab,


break;

num'-1J:" NULL)

"); (

tastat

EDf\n");

ex it Ii) ; if(sscanf(tab.
bu,ak; o r i nt.f ("nu pr:tnt'f{"s.c;

"%1d",&m) tastat Un

==

1 &Ix m

>

0)

"%1(",&c

=:

1 && c>O) lui c *1 do

/' sc icsc dill ciclul do-while dcourccc s-" citit valoarca :;;-(1 t.a s t.a t; un numar po zi t i v vn vi . r(~id (~i.Lic-c:('l Ju i c\n"}; I 2;

printf("nu while(l);

sea

intreg

pozitiv\n");

wh i 1 e
p
(a

(1.)

pr.intf("al + c)

if

I p-a

> 0 && P -b > 0 && P c >() ) brei!k; I" sc iest: dill iclul i-whilc cxtcnnr dcuarccca.b.c c <I, p(li Ii IIW.SlIlik lal lin lur uuui Irilillgiti "I

do i Lea numo r+ fiJi ifl(1ets(tab) == NULL) printf('s-n tastat EOF\n"); exit(l);

iflsscanf(tab,

"%ld",&n)

1 && n > 0 )

160 l(if

b.rea k i p ri n t f ("nu

s-a

LdStC1.t

un intrew

po z i t i v vn")

while(l); a = m; b = n; do r a % b; if (r ) ( a = b; b while(r); printf(" (%ld.%ld)


}

Instruqiunea 1.

switch cu Iormutu] iudicar mni sus sc executa ;\slll:l:

2.

r:

Se cvalucaza cxprcsia din parantezele rotundc. Se compare pc rind valoarea cxprcsici Cli valorilc constanlclor c I, c2 ..... en. _ Daca valoarca cxprcsici coincide ell una din constantc sa ziccm ClI ri. alunci se executa sccvcnta sir). apoi sc trcce In instruqiunea Unll<ltoare instruc] iunii SlFilch, adica la instruc!illllCll aflata dupa acolada inchisa care termina instruqillnea. Daca valonrea respccuvn IlU coincide cu nici una din constantclc c I, e2, ... , en, atunci se executa suecesiunea de instruqiuni sir ~i apoi sc ajungc la instl1lqiullea ullnfltoarc inst ruct iun ii switch.

%ld\n",

m,n.b);

4.12. lnstructlunea switch


lnstructiunea switch permite realizarea structurii selective. Aceasta este 0 . f . 'a eneralizare a structurii alternative ~l . aost 111t ro d us'. de CAR '..Hoare Ea ponte .: '.' ~ realizara prin instructiuni i/'imbricnte. Utilizarca mstrucnunu s.wltch f~ce. c~f' programu 1 sa fie mai clar decit daca sc utilizcaza vananta Cll mstrucnuni / , , .1 imbricate. . " Structura selectiva , .111 forma '. care a fast ea accep tata dc catre .,adeptii In . ~,,,-.: en progranlanl •• structurate, a 1"- "",,,' in lirnbajul C etl ajutorul urrnatorului lz"",,,,~a format al instructiunii switch:
,;n .. "A H ...

MCll!iollillll Cit cste posibil sa nu sc ajllnga In instruc(illnen urmntoarc instructium: switch in cazul in care sliecesiunea de instruc(iuni sclccrara pcntru cxccutir, (.\"ir_i sail sir) Vii <lellni ca insn~i lin alt mod de continuarc a cxccutici programulu] (de cxcmplu, cxcclI\ia instructiuni] de rcvcnire dintr-o functic, saltul la a instruqiunc eticherata etc.) Succesiunile sir. sir_I, .... =:» sc IHlIl1CSC a!ternalive!e instruc(iunij swiu-li, Alternativ., sir cstc optionala, dcci intr-o instruqiunc switch, secvcnia default: sir ponte f abscntil.

switch(expresie){ case cl: sir ] break; case c2: sir_2 break; case
ell:

In accst caz, daca vnioarc<t cxprcsici Illl coincide cu valoarcn nici uncia dintrc COllstantele cl.c2, .... cll,<ltullci instrllC\iul1ca switrh iu: are nici un cl(.'(;! 0 Sl' trccc i la exccuria instrllc(iullii urm{llo<tre.
irnbricata
fnstl"uc(illl1ea

switch
)

de mai sus cste cchivalenta

ClI urmaroaron

instruC(j une if"

if(expresie=-c=cl

sir._11
break; default:
sir

else il'( I'.\"/ 1/"1'.I·il':=::O:(2) sir_2 else


if(1'.1/)f"('.I·il' ('.,')

sir.!

sir_.3 else if else - Sint constante. - Sint succesiuni de instructiuni. ir(e.lprc.lic==I·1I )


.1/1"...//

uncle: c l , (:2•... , en sir_I, .I'il"_2 .... ,


sir

»r.».
162

eise

si,. I(d

sir '" =:». IlLT!1lik C;\ 1;\ inulnirea c i sa sc trcaca la cxccuria instructiunii urmatourc iusuucuuui: switch. Sc obisuuicsic sa sc spuna ca instructiunca break pcrrnite icsirca din insrrucuunca switch. Amintim ca illSlruc\iul1c<l/J/nt/.; ponte Ii ulilizat« numai III corpurilc ciclurilor ~I in altcmativclc instrucuunii switclt, i'rcZl'n!a ci 1<1sltrsitul Iiccarci alternative a unci instrucuuu: switch, 1111cstc obligutoric. in cazul in care instrucuunca break cstc ubscnta lit sfirsitu] unci alternative, dupn cxccutia succcsiunii de instructiuni dill compuncrca altcmativei respective sc va trccc la cxeclI[ia succcsiuni: lk instructiuni dill altcmativn
urmutourc Astfcl, a acc lccasi insiructiuni ssvitcl), daca () instrucuunc switch arc lormatul:

lnstructiuncn

lneak

de la sl'lr~ilul

ficcarci

alternative.

dupa secvcntclc

sir~/,

puts("s-a

tastat

EOP");

exitll);

swit ch( ('.':pres it'){ case cl :

rase ('2:

sir.J
sir~2
}

i t t s s c anf t t , "'lid", &i) == 1 && i > 0 && i < 8 ) break; puts("nu s-a tastat 0 ci f ra din intervalul [1,7J"); while(l) ; sw i t ch t i ) ( CaSf? 1: puts("luni"l; break; case 2: puts ("marti"l; break; case 3: puts(I'lniercuri11); break; case 4: puts("joi"); break; case 5: puts I "v i.rie r i.vj . break; case 6: putsl"siffibata"); break; Case 7:
puts } ("duminica");

atunci ca cstc cchivalcnta

cu urrnatoarca

sccvcnta: 4,26 Sa sc scrie un program care citeste constructii de forma:

if(expresie== sir~1 sir~2

c /){

[else if(e.\'{iresic= =(2)( sir .. !

op l op op2 unde: - opl ~iop2 sint intrcgi de tip long, - op este unul din caractcrele: +, -, "' sau I. ~iafiseaza valoarca expresiei citite.

Excrcitil: 4.25 Sa sc scric un pWt!ram care citcsic n cili'a dill intcrvalul II ,7] ~i afi~cazii dcuumirca zi lei din saptamina corcspunzatoarc cifrci respective (I -luni,
2-mHr\i etc),

Operatia de irnpartirc este impartirca intreaga. Accst exernplu este intilnit freevent in diferite lucrari relativ la limbajul C. De cxernplu, autorii limbajului C, in lucrarea [2] propun acest exemplu pentru a simula un calculator rudirnentar de birou. PROGRAMUL ~IV26
#include .include <stdio.h> <stdlib,h>

PROGRAMUL
ninclude ninc·lude
rna i n ()

BIV25

<stdio.h> <F,tdlih.h>
/* ciicsrc o citra din intcrvalul corcxpunzatoarc

saptamin«

cifrc:

] !Jl sj aliscaza dcuumirca respective *i

I.itci din

main () ;.citcstc 0 cxprcsic de forma: oplopop2 undo opl si op2 sint intregi de tip long, iar op cstc unul din opcratorii +, -, ", f afiscaza valoarca cxprcsici respective of long opl,op2,rez; char OPt char t[255J: for (;;){ do { printf("tastati expresia:op1opop2: "I;

i nt char
do {

1..

t(25S1;
t.-)uts("ttl.stdti 1. f (9':_~tE-: ( r :
i_' ==

c i f ra
){

din

i n t er valu I

[1,'7]");

I'-lUL,L,

\6.1

165

iEI gGtslt)

"'= I'JULL) exiLIO);


eronata\n");

prinLf("expresie while (1) ; switeh(op) [ case '+' rez=opl


case
I I :

+ op2;

break;

uriliza: in definirca unci L'licitclc csrc IIUIllCIc ctichctci respective. Dupa o ctichcta urmcaza 0 instructiun«. Sc obisnuicste sa se spuna ca etichctn prcfixcu:« insrructiunea care urmcaza dup:i en, Etichctc!c sint locale III corpul lunctici III care slnl definite, lnstructiuncu g% arc fonnatul:
/lII/II£'

go to
unde:

I1l1l11e;

rez=opl case
1*'

- op2; break;

rez= opl * op2; break; ease 'I' : if(op2 == 0 ) { printf ("divizor nul \n"); rez = 0; else

nume

- Este numcle unci ctichctc definita in corpul acclceasi functii in care sc afla instructiunea goto ,

op1/0p2; rez break; default: printf("operaior eronat\n"); rez = 0; /~ sfirsir switch*/ printf("opl= %Id op= %e op2= opl,op,op2,rez); 1* sfirsit for =] sfirsit main *1 %ld rez=%ld\n",

La intilnirea instructiunii goro, sc rcalizeaza un salt la insrructiunca prcfixata de eticheta al carei numc sc alla dupa cuvintul cheie goto. Dcoarece 0 eticheta este locala In corpul unci Iunctii rczulta ca ea estc ncdefinita in afara corpului Iunctici respective. in fclul acesta, 0 instructiunc goto poare realiza un salt numai la 0 instrucriune din corpul aceleeasi fUI1C\ii in care este ea utilizata, Deci, 0 instructiune goto nu poate face salt din corpul unci functii la 0 instructiunc din corpul alrei functii, Mentionam cit IlU se .i usti ficii lit i1izarca abuzi va it acestei instruct iuni. Se recornanda a f utilizatf] pcntru a simplificu icsirca din cicluri imbricate,
Exemplu: Presupuncm ca intr-un punct al programului, ail a! in intcriorul mai multor cicluri, se depisteaza 0 croarc si se dorcstc sa se continue exccutia programului cu o secvcnta de tratare a crorii respective. In aces! caz, vom folosi 0 instructiune

}r

Observatie:
ProgramuI

de fata perrnite sa se evalueze mai mulre expresii separate prin caractere albe, EI i~intrerupe cxecutia la intilnirea sfirsitului de fisicr. i

goto ca mal JOS.


for (... I(

4.13. lnstructiunea
Instructiunea

goto

while( ... )( do( for (... ) (


ii(i~'o())

programelor cazuri, Autorii limbajului recomanda utilizarea ei in cazul in cure se doreste sa se iasa din mai multe cicluri imbricate. Astfel de situatii apar adesca la intilnirca unci erori. In astfel de situatii, de obicei, sc doreste sa se faca un salt in afara ciclurilor in care a intervenit eroarea, pentru a se ajunge la 0 secventa exrcrna lor de tratare a erorii respective. lnainte de a indica formatul instructiunii goio sft prccizam notiuuca de

goto nu cste 0 instructiune absolut necesara la scrierca in limbajul C. Cu toate acestea, ea se dovedeste utila in anumitc

goto

divzero;

x=y/i;

etichetd. Prin etichetd intelegem un nume urmat de doua puncte:


nllme:

lwhile( ... );

166

167

d !_v:,.:,(;(o:

ncagra, la care i sc uunsfcra date la apcl, iar accasta Iurnizcaza rczultatele la rcvcnirea din ca. in momentul apelului, se face abstractic de metoda de prelucrare a datclor de inirarc in rezultate care sc mai JHUllCSC ~i date de iesirc. In toatc limbajclc de programare se considcra doua categorii de proccduri:
,); inslntc(lIllill

printft"
ill allSl'll\a

a. , "
,1:(//(/ Sl' PO;I ('

Proeeduri

care dcfinesc

0 valoare
0

rl'a

11'/'1 ,'1(',('1:1,,,, i lucru ,

fllillsind

nn

h.

Proccduri

care

Ill!

dcfincsc

de rcvcnirc. valoarc de rcvcnirc,

indicator ~i0 scric de teste n:alizalc

asupru lui,

4.14. programarea procndurala, functii, apelul !?i revenirea din ele


inccpuul
cu prilllck limbujc I (c programare de nivcl inalt s-a utiliza: progralIIarca procedu/'a/ii, '" _ _. ,., .. " ~\ccasta s-a Jcz\,oltal din necesitatca de a utiliza mtr-un plogldl1l. acceasi sccvcnta de calcul de mai mulic ori. Pcnuu a cvita 0 asU<:1dc rcpcnuc, sc.cven\a
de inst;ucllUlli cllrcSpUllzatuarc sc urg;ull/xaza C;I 0 p.utc dlSlIllCt:1 ::;1sc lace Ull salt In ca. 'ori de cite ori cstc ncvoie in program de proccsu! de calcul respe~tlv, Accst salt cstc cu revcnirc la instruC\iUllea urmatoarc instrucuunn car~ ~l, 1<:ClI.t saltul si de accca el difcra de salturilc rcalizatc ]Inn tnstrlle\IUIl~a go/n. SceVen!.'1

Proccdurilc din catcgoria a, de obicei se l1uJ1lesc/iIllC{ii. Valoarea de revenirc se mai numeste ~ivaloare de intoarcere sau valoarea returnata de functic, Procedura pcnrru calculul ridicarii In putere estc.un cxcmplu de functic. Ea

arc ca paramctrii buzu Si cxpoucntul, iar ca valourc de intoarccrc sau returnata, rezultatul ridicarii valorii bazei la valoarea cxponentului, valori care sint definite la upcl, . in limbajcle C ~iCt+ atit procedurile din catcgoria a., cit si ccle din categoria b. se numcsc functii. Deci, in aceste limbaje distingem functii care rerurncaza 0 valoarc la revenirea din ele, precum $i functii care nu returneaza nici 0 valoare. o functic are 0 definitie ~iatitca ape/uri intr-un program, cite sin! ncccsarc. o dcfinitic de functie arc Ionnatul: antet corp
unde: an tet - Arc forrnatul:

de insirLletiuni organizata programarc: subl;rogram, dcnumirca


Uucori

111

accst Icl arc diferitc dcnurniri III diverse lirubajc de subrutina, proccdura etc. PCIlIru inceput considcrarn
sii cxpriruc

acclasi proccs de calcul ~ar calc se realizeaz,] ell date difcrite. in accst caz, procedure trcbuic lealtzala gcncrala facind nbstractic de datclc respective. De cxemplu, pcntru a cvalua cxprcsia: proccdura trcbuic

de procedure

tip nume (lista declaratiilor parametrilor formali) corp


Este
0

instructiunc

compusa.

(I) 4** 10-3**20 putern construi 0 proeedu[',i pcntru ridicarca la putcrc, care sa fic ge~ler:tla ~,is~ f:\C~1abstractie de valorilc elective pcutru baza ~I exponent: 4 ~I 1() penn U pnrna ridicare la putcrc , 3 ~i 20 pcntru cea de a doua. Accastii generallzare se rcalizcaza considerind ca Iiind variabilc ant baza cit si cxponcrttul, rar valorile lor se prccizcaza la ficcare apcl al proccdurii implumcntatc in uccst le.l: _; " ... .: Accstc vuriabilc utilizatc pcntru a putca implcmcnta 0 proccdui u genu <11,1 ,~I
care se concrctizcaz~1la ficcarc apcl ul procedurii, se numcsc paramctl'ljor/ll(/Ii: In fclu! acosta, procedure apare ca un rczultut al unui proces de gcneralizme ncccsar implcmcntarii ci. en orice proccs de gencrallzarc ca prcsupunc

Amintim ca tip este cuvintul eheie void pentru functii care nu returneaza nici o valoare la revenirea din ele. Pentru alte detalii vezi paragraful 1 A. Apelul unci functii trebuie sa fie precedat de definitia sau de prototipui ei. Prototipuiunei functii coniine informatii asemanatoare ell cele din antetul ei:

tipul valorii returnate; numele functiei; tipurile parametrilor.

abstraetizarc care sc rcalizcaza prin utilizarca paramctrilor lormall... ' .. Valorilc de la apcl ale paramctrilor forrnali sc 1111111eSe parametru e!ectivi. Prouramarea pJ'ocedurafd arc la baz[l utilizarca proccdurilor, tar acestca ia rindull~r realizcaza 0 abstractizarc prin parametri. ...,. in Iucrarca 1141 sc subliniaza ~i Ull alt aspect al abstrucuzarn rcalizalc pnn utilizarea proeedurilor ~i ailtlille aeela ca u procelllml sc poate ascmaml ell 0 curlC

EI poatc avea acelasi format ca si antetul functiei, in plus cste urmat de punet si virgula. Peutru altc detalii vezi paragraful 1.11. Limbajul C se livreaza eu 0 serie de functii care au 0 utilizare frecventa in prograrne. Ele se pastreaza intr-un Iisier special in format OBJ, adica compilat si se adauga la fiecare program in faza de editare. Aceste functii sint numite}illlclii standard de bibliotecd. Ele au prototipurile in diferite flsiere de extensie .h, Exemple de astfel de functii sint functiile ell ajutorul carora se realizeaza operatii de intrarc/iesire (printf, scanf, puts, gets, getch, putch etc.), functiile pentru ealculul funetiilor c1cmentare (sgrt, sin, cos, alan, log, pow cle.), fUllctii de eonvcrsii (.I·SCal!!; sprintj'etc.) etc,
169

!68

j
Prototipurile functiilor standard se includ in program ,inaintea ~1~e.ll~ril~r lor folosind constructia #illeilide tratata prin preproccsor (vezi paragratut I, 12,),

I !

I
!

Exemple de fisiere ell prorottpuri: stdio.h conio.h math.h


Mentionarn standard. pentru functiile printf, scanf gels. puts erc.; pcntru functiile putch, getch, getche etc.; pentru functiile elementarc

functici apclatc. efecriv difcra de ripul paramctrului C sc convcrtcstc automat valoarea paramctrului efcctiv spre tipul paramctrului formal rcspcctiv. ill limbajul C-It sc utilizcaza 0 regula mai cornplcxa pcntru apclul functiilor 0i de accca se recomanda sa nu sc Ioloscasca nici in limbajul C, regula de convcrsie automata
formal care-i corcspunde, ill limbajul

in cant!

in care ripul unui paramctru

sqrt, sin. cos etc.


au fost apelate numai functii

ca pina in prezent in toate exercitiile


0

amintita mai sus. in accst scop se ponte urilizu opcratorul «tip)), adica folosind asu 11lll11iteie exprcsii cast.
De cxernplu, daca functiaj'nrc de tip int, atunci in locul apclului:
f (n) ;

de convcrsic

cxpliciia

un paramctru

de tip double ~i 11 cstc 0 variabila

Apelul unei functii care nu retumeaza instructiune de apel. Aceasta are fonnatul: flume (lista parametrilor efectiviy;
unde:
Ill/me

valoare, se rcalizeaza printr-o

so rccornandn

a Colosi apclul

Cll

convcrsic

cxplicira

a lui

1/

sprc iipul double:

f ( (doub l e ) n);

- Este numele functiei cafe se apcleaza.

lista parametrilor efectivi

- Estc fie vida, cind functia nu are parametri, mai multe separate prin virguld,

fie

expresie sau

Deci un parametru efectiv este 0 expresie. . .. . ..' Parametrii efectivi de la ape I se corespund cu eel formali pnn ordine. PIII_nul parametru efectiv corespunde primului ~arametru formal, eel de al doilea parametru efectiv corespunde celui de .~!~Ol!ea ~aral11ctru ~ormal s.a.rn.d. ,.' Amintim ca parametrii unci functii (formali sal! efectivi) se mat numesc ~I

Acest al doilca ape! sc rcalizcnzu identic in ambclc limbajc. La rcvcniren dintr-o funcjic apela!;t printr-o instructiunc de apel se va continua cu exccutia insrruciiunii urrnatoarc cclci care a Iacu: npclul. In cavul If1 care 0 functie este upclata ca un operand al unci cxprcsii, la rcvcnirca din ca se continua cucvaluarca cxprcsici respective. Revenirea dintr-o funciic sc ponte realiza in unu] din urmatoarclc doua moduri:

argumente.
printr-o

o functie

care returneaza

de apel, fi~ ca operand al unci expresii. apeleaza


instructiune ca operand

poate fi apclata fie pnntr-o tnstructiune In cazul in care ~unc~ia se ape~eazll de apel, sc pierde valoarca returnuta. Cmd ~l~nc\la se al unci expresii, valoarca rctumara de ea se utilizcaza la
0

valoarc,

..

a. b.

Dupfl cxccuiiu ult imci illstrllqillni dill corpul inchisn care tcrrnina corpul Iuncuci). La imilnirca instructiunii return.
lnstrucuunca
1'('/1//'11

Iunctici

(S";I ;ljU!lS

!a aculada

cstc

instructiuuca

til' rcvcnirc:

dintr-o

luucuc.

hi arc

formatclc:
l. 2.

evaluarea expresiei respective. Sprc exernplificare sa consideram


c=getch( )

functia getch, Not am apelat Iunctie atit ca operand in expresii de arribuire de forma: cit si printr-o instructiunc
getch() ;

aceasta

return;
salt

return cxprcsic;

de apcl de forma:

<ltrihll;"

~~;;~t~l1li~'j'

codului Ascn al caractcrului citit de la .tastatura se vm'inbilei c. La eel de al doilea apcl, valoare codului ASCll al '~'i;i~ la tastatura nu este utilizata. in acest eaz apelul s~ fa.c~ -de scopul de a afisa ecranul utilizaror si de a bloca cxecutia prograrnului pma la actionarca unci taste oarecarc, corespunzatoare carncterclor A~CI~. . ' . La apelul unci functii, valorile parametrilor efcctivi se atribuie par~Hnctnlor formali corespunzatori, apoi executia continua eu prima instructiunc din corpul

in primul caz, valoarca

ell

Cel de al doilca format sc Ioloscstc in corpul unci functii care rcturncaza () valoarc la rcvcnin-a dill ea. Valoarca vxprcsici din ittSIIlIL'(iullca "l'Iltl'lll'stt'citiar valoarea rcturnara de Iunctic, ln cazul in care tipul accstci exprcsii difcra de tipul care precede muncie din antcrul functici, valoarca cxprcsici sc convcrtcstc automat sprc tipul din antct,

Formatul
funcrii care

I al instructiunii
I1U

de revcnirc
0

sc utilizcazn

numai in corpul unci


pOlite

rcturneaza nici

valourc. Dinrr-o astfcl de fuuciic sc

rcvcni

~iin modul indica! 1:1punctul iI de mai sus . Faptul ca instructiunca return (in arnbclc formate) poarc Ii scrisa ill mice punct al corpnlui unci tunctii, permite 0 rnai mare Ilexibiluarc ill prograrnarca in 171

170

limbajclc Excrci\ii: 4.27

C ~i C

H.

main ()
(

/* afiscaza

pc 111! pcntru

111 ~

0, J ,2, ...• 170 */

int m; un intrcg
/I

Sa sc scric o lunctic carl' arc ca pararnctru calculcuza si rcturncaza pc 11'

din intcrvalul

[0,170],

Numilll./i/c/ori(// aceasl~1 tunciic. :a rcturncaza prccizic. Rczult.: ca flll1c\ia arc antctul:


doub lo ft:1ctor1.iJl(-ltit
n)

U vulo.irc llotanta

ill dubla

for(m=O; m<171; m++) ( printf("m=%d\tm!=%g\n",m,factorial(m) if((m+l)%23 == 0) ( printf("actionati 0 tasla pentru Qetch (); /* sfirsit if"'/ /* sfirsit for */ /* sfirsit main *1 double factorial lint n) /* calculcaza si rcturncaza n! pcntru n in intcrvalul altfcl rcturncaza -I *1 double f; int i;

); a continua\n');

La mccput rUI1C\ia vcritica daca /I apartinc intcrvalului 10, 170j. in cazul in care 11 IlU apurtinc uccstui interval, fUI1C\ia va rcturna valoarea -I. Metoda de calcul cslc ucccusi l'Ul'L';1 utili!ata ill e:\erci\iuI4.12.

[0,170];

FUNCTIA BIV27
dOllble
I"" clktlkaz;l

fact()ria
si rcturncnva ., '/

(i.ot n) pL' 11' pcntru

n in inicrvalul

1'0,1701:

nlttc! rctumcaza dou o l e f:;

if I n < 0 fori i=2, return f;

In> £=1.0;

170) i <=

return
n; i++)

1.0; f*

ii

in
itt

} /* sfirsit factorial */

1.;

n < () ret.urn
j ['< ,

Ii
f I. ;

n> 1.70) 1.0;


L,e);

Observatli:
I.
n;~'I-+)

tort

i -:

ro t u ell

f:

4.2X

S;I

sc scric

Ull

program

care calculcaza

;;i listcaza

pe

111'

pcntru

111=0, 1, 2, ... , 17().


Acest plOgl;lI11 apclcaza
0

f"unC\iafilc!oria/
/II.

delillita

rnai sus pcntru

a-l calcula

pc m! pcntru

vuloare

data a lui

Dcfiniiia functici [uctori«! ~i Iunctia principala care 0 apclcaza pot fi cditatc in accla~i 'fi~icr sursa. Cclc doua Iuncrii pol Ii cditatc ill oricc ordine, in cazul in care dcfinitia Iunctici foctoria! sc atla in fisicrul sursa dupa fUI1C\ia principala,
apclul prototipul flln~\iei ci. [actori«! din Iunctin principala, trebuic
S~\ fie

prcccdat

de

2.

Functiafclctoria! este apelata ca parametru efectiv in apelul functiei printf. La apelul fUllqici./aclorial, valoarea pararnetrului ei efectiv III se atribuie paramctrului formal 11. Aceasta valoare este apoi folosita in corpul functiei factorial pcntru a-I calcula pe n! tii deci si pc m!. Valoarea respectiva se obtine ea valoare a lui! La revenirea din functic se returncaza valoarea lui./; adica chiar m!, care se afiseaza folosind specificatorul de format %g. Cele doua functii pot fi editate in fisiere separate. De exernplu, presupunem ca func\iafi1ctorial se editeaza in fisierul BIV27,CPP, iar functia principala in fisierul BIV28A.CPP. In acest caz putcm include fisierul BIV27.CPP folosind constructia ttinclude pentru a compila impreuna cele doua functii. Includerca se poatc face inainte de dcfinitia functiei main sau dupa ea. In cazul in care Iacem includerea in fata functiei main, nu mai este necesar sa indicant prototipul functiei factorial deoarece apelul ei este precedat chiar de definitia functiei. Procedind in acest fel se obtine varianta de mai jos,
"

PROGRAMUL BIV28
r:k~uble fal·'tot in!
(j

PROGRAMUL BIV28A
nr l:
i+

prototipu!

luncuci

rac(oriai

*1

linclude <stdio.h,
#include
<COl"lio.}l>

Ninclude #include .include

<stdio.h> <conio.h> 'biv27,cpp' pc m! pcntru m ~ 0,1,2, ... ,170 */

main I) /"afiscaza
{

i72

173

int m; for(m=O; m<:171; m++) a printf("mc%d\tm!=\g\n",m,factorial(m)) if((m+1)%23 == 0) ( printE("actionati 0 tasta pentru getch () ;
} }

1
; a continua\n");

I
int
ii

if(x -c 1 II if(y < 1 II a = 1.0; i =x-y+ while( i <= return a,'

x " 170 ) return 1.0; yo. A) rot.u rn 1.0;


1; x )a

*=

i++;

3.

0 alta posibilitate

de cornpilare si link-editare a funcriilor unui program, editate in mai mulre fisiere, este aceea de a utiliza un fisier de tip Project (cu extensia .prj). Un astfel de fisier, contine numele ficcarui fisier (impreuna ell extensia lui) care se compileaza :;;i link-editeaza in vcderea obtinerii fisierului exccutabil al programului, In aces! fisicr pot fi indicate nu numai fisiere de tip sursa (ell extensia .CPP), ci ~i fisiere de tip object (cu exrensia .OBJ) sau chiar fisiere cu bibliotcci de Iunctii, altele decit cdc ale sistcmului.

4.30

Sa se scrie un program care calculcaza si afiscaza numarul de n obiecte luate cite k, pcnrru n= 1,2, ... ,170 si k= 1,2, ...,n. de fata apcleaza functia

aranjamentelor

Programul precedent.

aranjamente

definita

in exercitiul

PROGRAMUL BIV30
.include cstdio.h> linclude <conio.h> llinclude "biv29. cpp" /.continc functia nranjamcntc v/ ma in () /.calculcaza si afiscaza numarul aranjamcnrclor de n obicctc luatc cite k , pcntru n in inlcrvallllll,170] si kin intcrvalul [1,n1"; int k,n;
t or t n

Fislerele de tip project pentru limbajele Turbo C (il C++ 11lI sin! cornpatibilc. Ele se construiesc folosind meniul Project al celor doua sistemc intregate de dezvoltare, A vantajele fisierelor de tip Project constau in aceea ca, la fiecurc lansarc se cornpileaza In mod automat nurnui sursclc in care s-an facut modi ficari. De aceea, in cazul programelor sursa mari sc rccornanda impartirea lor in mai rnulrc fisiere sursa ~i compilarca lor prin uriliznrca fisierclor de tip Project. De obicci. intr-un fisier sursa se grupeaza functii "inruditc", adica functii care prclucrcaza in com un subseturi de date sau sin! logic legate intre elc, Intrucit exercitiile pe care Ie prezentarn nu sint de dimensiuni mari, vom utiliza freevent includerile de fisiere folosind construcria itincludc a preprocesorului,

1;

n<

170;

print,f("dctinndti "etch ( ) ; printf("\nn=


for(k=l;

n++) ( () 1,'I:~~t'l

IIPlllnt.1

C'(lllll!lUd\n")i

%d\n",n);
k++) (

k <= n ,

4.29 Sa se scric
returneaza

numarul

functie care are ca parametri doi intrcgi x ~iy, calculeaza si aranjamentelor de x obiecte luate cite y. [1,170], iar y
luate cite y, valoarea -I. de x obiecte

La inceput functia testeaza daca x apartine intervalului


intervalului [l ,x], ln caz de eroare, functia returneaza Daca notam eu A(x,y) nurnarul aranjamentelor

printf("k=%d\tA(n,k)=%g\n".k,aranjamente(n,k) ); if(k%23 == 0) ( printfl"actionati 0 tasta pentru a continua\n"); getch () ; /* sfirsit if"/ /* sfirsit for interior */ /* sfirsit for exterior "] /* sfirsit main" /

atunci:
A(x,y)=x*(x-l )*(x-2)* ... *(x-y+ I)

4.31 Sa sc scrie returneaza

1111111[lru!

functic care are ca paramctri doi inlrcgi .r "i y, calculcaza combinarilor de .r clemente luate cite y.

~i

FUNCTIA BIV29
double aranjamente ( int x, int y) f* calculeaza si rctumcaza numarul aranjamcntclor de x obicctc luatc cite y Of
(

double

a;

intcrvalului t 1,1701, iar y intcrvalului [O,xJ. valonrca - i. Pentru calculul numarului cornbmurilor de .v clemente luatc eire )' sc derermina raportul dintrc numarul aranjarnentclor de x clemente luate cite y ~iyl. in aces! scop, functia de nlla apeleaza lunctiilc aranjantente ;;i factorial definite in excrcitiilc 4.29. si respectiv 4.27. Functia testcaza dad x npartinc
In caz de croarc, funcria rcturncaza

174

175

FUNCTIA BIV31
j~irlclude "biv27.cpp" #include "biv29.cpp"
double: c on.b i na r i (int.
-'r

l'rogramul

utif izcaza Iunctia BlY31 A.

PROGRAMUL BIV32
in r. y
) de x obiccic luatc cite y '"'-I

/* culculcazu

si rciurncava numnrul

combinarilor

.include Hinclude Hinclude

<stdio.h> <conio.h> "biv31a.cpp"

.i f I
jC

<1 x > ]70 I return -1.0, " 0 II y > x i return -1. (J; -r f ( x: x I return 1. ts : Y ~" 0 II y ro ru rn ,l)"',)n j .unc-nr » (x, '1') / Ia c r o rial ('l)
.',

iI

Iy

main () /* afiscaza numnrul combinarilor de n obicctc luate cite k pcntru n in intcrvalul [1,17()] si k in intcrvalul [0,11]·/
;

int k , n; [or Inco·l, 11<=' 170; n++) ( printf{"actionati 0 tasta pentru a continua\n"); getch () ; printf("\nn=%d\n",n); fori k=O, k <=n ; k++) printfl"k=%d\tC(n,k,=%g\n", k, combinari(n,k)); if((k+1)%23 == 0) ( ri ("actionati 0 t ta ru t 'I,'tcb ( ) ; /* sfirsit if */ /* sfirsit tor interior */ 1 /* stirs;t lor exterior "/ ) /* slirs;t nuun OJ
p nr.f a s por.t a c ori iriua

Observutli: I.

Un culcul mai rapid sc rcalizcaza daca sc line sc.una de rda!ia


c(x,y)=c(x,x-y) undc prin e(x,y) s-a notat numarul combinarilor de x obiccte ;\ccast:l re l.uic cstc ut il sa sc aplicc pcutru y> in accst scop ultima instructiunc sc inlocuicstc cu: luatc cite y.

.r:

vn

vj ;

ifly else!

> x/2\ ro t.u rn i)f"dlljalT\(:nt.(;

( x , X..V} / L.lct()t-jdl

{z-y};

2,

o alta variantn pcntru calculul numarului cornbinarilor cstc rclatia:


C(X,y )=(xl J )"'( (x-l )/2)"'( (x-2)/3)* ... *«x-y+ i )/y) in accst caz sc cvitu calculul valorilor A(x,y) si y! care cresc rapid odata cu crcstcrca valorilor lui x si y. Accasia sc rcalizcaza Cll ajuiorul tunctiei de rnai jos.

return

aranjamente

Ix,yl/factorial(y);

4.33

Sit se scrie 0 functic care ridica la flotant de tip long double.

puterc intreaga ncncgativa

un nurnar

Functia utilizcaza

metoda cxpusa in excrcitiul

d.Iv.

FUNCTIA BIV31A
clo\Jble cornb i riari (_:~nt x, I nt. y ) til; x ohiccic lu.uc cite y */ /* (akuica/a:-.i I\JumL',\I;t nuru.uul

FUNCTIA BIV33
long double 1drp( long double /* ridica pe x la putcrca n *1
(

x, int n)

comluuarilor

int

ii

long double

f,p;
1) (

dou o l.e c;

i (( x

< <

iE( Y
if{y

II II Oily

x
y

>

170

>x

} return - 1. .0; r o t u r n - 1. 0; x ) return 1.0,


iH) C

for(p=x,foo1.0L; n; n»= if ( n& 1) f * = p; if( n > 1) p * p; return


/ f;

c = 1. 0, 1; for ( i return Ci

cc

Y'

Ic • (x - i + 1))

i;

4.34 Sil se scrie un program care tabeleaza puteriJe intrcgi ale unui numar flotant de tip long double, exponcntul variind, Cll pastil l, intre doua limite 111 si 11." de PROGRAMUL BlV34
linclude finclude cSldio.h> <stdlib.h>

4.32 Sa sc scric un program care calculcaza ~iafiscaza numarul combinarilor II obiccte luate cite k, pcutru IF 1,2, ... , 170 ~i k=O, 1,2, ....n,

176

177

lfinelude "biv33.cpp" main () 1* tabclcaza putcrilc in!rcgi ale unui numar*1


{

char t[255}; long double f,g; int i/ffi/nj do ( printf{"tastati numa ru I care se r i d i ca la puteri: if ( gets (t ) == NULL) ( printf("s-a tastat EOF\n"); exi t (1) ;
}

4.15. Apel prin valoare ~i apel prin referlnta


In lirnbajul C, la apclul unci Iunciii, ficcarui paramctru Ionnal i se atribuic valoarea parametrului cfectiv carc-i corcspundc Dcci, la apclul unci lunciii sc transfera valorile paramctrilor cfcctivi. Din accasta cauza. sc spunc ca apelul cstc prin valoare (cal/ hy valuev.
Excmplll:

");

iflsseanflt, "%Lf",&f) 1 ) break; pr i nt.ft vnu s-a tastat un numar vnvj : while(1); do { do ( printf("tastati limita inferioara if (gets It) == NULL) ( printfl"s-a tastat EOF\n"); ex i t t j r ,
}

Fie fUl1qiajilc/orial

(It: prototip: doublcj{lctorial(int 11);

definita in exercitiul 4.27. La apclul: j~lct~~factorial( I0);


a exponentului: ");

sc ntribuie parametrulu] formal /I valoarca 10. AccaSI{1 atribuirc sc face inaintc de exectqia prirnci instruqiuni a funciici [actorin], Dc accca, prin aces! apcl functia factorial calcuka/a pc 101. in uncle limbaje de programarc, la ape! nu sc transiCra
in

if(sseanflt, "%d",&m) printfl"nu s-a tastat while (1); do {

==

1) break; un intreg\n");

valorile

parametrilor
csrc

ci adrcsele accstor reji'l'in/li (CIIlf hI' I'1'/;'}'('I/('('),


");

efcctivi,

valori.

accst cnz, sc spline ca npclul


0

pnn

lntrc cell' doua tipuri de apeluri

exista

difcrcnta

cscntiala

~i anumc:

p.r int f (" tastati 1i m i ta superioara if(gets(t) NULL) I

==

a exponentului:

.. "

in cazul
parnmctr]

apelului
clccuvi

prin

valonrc,

dill lilllqia

(lpelatil !HI ponte modi fica carl' a lucut apl'lul. nc.rvn«! acccs la ci;
apclnra,

Iuncua

printf("s-a ex i t (1) ;
)

tastat

EOF\n");

in cazul apclului prin refcrirua, runC\in paraillctrilor ell-clivi. ii ponte moclilicn. in cazullimbajului

dispuilind

de adrcsa

if(sscanf(t, "Id" , &n ) ~= 1 ) break; printf("nu s-a tastat un intreg\n"); wh iLe I L) ; if (m -c s: n ) break; printf("limita inferioara:%d 0 depaseste superioara:%d\n", m,n); } while (1); if ( f == 0 && m < 0 ) ( printfj"putere negativa pentru zero\n"); exit(l) ;
}

prin rcfcrinta,

A0:l sc im impla, de cxcmplu,

FORTRAN,

undc upclul cstc

pe eea\

De aici, rezulta c;'i la apclul prin valourc transfcrul d.uclor cstc IIlIidircCliol1l1l, adica valorilc sc transfera prin paraml'!ri numai de 1<1 t'lIllqin care 1;le~'apclul sprc cca care a fost apclata, nu ~i invcrs,
Exist:l siluH(ii cind sc dorcstc Pascal.

paramctrilor
cxcrnplu,

clccuvi.
cuzul

Uncle lirnbajc

rransfcra

prin rclcrinta.

1imbajului

en i'unqia apelala S:I Illoditll'l' valorilc permit umbclc tipuri de npchui. A~a csrc, de Parall1elri dcc!ar;qi ill l'asc;iI prin 1'(/1' sc

for ( L=rn: i <= n r i++) ( if(i<O) 9 1.0 Ildrp (f, - i) ; else 9 = Idrp(f, i); printf("'Lg la puterea %d este:

in limbajul C++. sprc dl'osebirc de limbajul Iirnbajul Pascal.


.

C. exista allllwic apcluri. ca

~i in

%Lg\o",£,l,g);

Apclul prin valoaro cste uti! in cazul ill carl' fill1C\ia apcl.ua nu trcbuie sa modifice valorile parnmelrilor efectivi, dcoarccc in fclul acosta paramctri] efcctjvi sin! protejan nl!i\ de cvcntualclc Illodific{lri care ur purca 'apare din grcscala.

178

179

"

' /\

(:c'I"1 ,

' "d

I' I1SC<11111,1;[ In"c1i1IC;lI'l,';1

e,1 U I'UIlC\IC ,

pO(lic "iI modificc


,"I 11111IIl'llll'/l'

partuncuii

ci Ionnuli 1;11'

n'l:1'

(';1

pnn

Il'SJI'L'l'IIV;t

\;I'uriic
~ci!1ila

11;ll;IIIK'lri!ul

COILSJ:lIll/ilIOr!.

modifica V;du;llca, paraillctiului lormal Ii Iii zero. ell to.uc aCL'stca.' valoarc paramctrului elect IV corcspunzator lui n IlU sufcru ~.ici () modificarc avn ;ICCC<l01 valoarc I:t rcvcnircu din Illllcqc C<I c;i ill momcnnl apclului. 'c
_ lip Iii;'
/I

i\~Cl

de

c;.;cmplu,

!ll!1C\ia !dll!,

in

cxcrcitiul

cfcctiv 4Y

111.1111111;11\11 (',1111

P;II;llllL'lnl

clcctiv

JH1;11l'

Ii

1l1l1IICic

1I111li tablou.

De
uiiui

CXCIllI',
labJOlc

scUsa ill corpul luuctici .I'll/II arc CLi elect atribuirea valorii 100 clcmcntului at3]. In concluzic, in limbajul C, apclul cste prin valoare. Acest apel devine prin referiuta ill cazul in care paramctrul cfectiv este numele unui tablou. , Ulterior 0 sil vcdcm ca apclul prin refcrinta poate fi rcalizat in limbajul C si in cazul variabilclor simple, folosind pointeri. De aSCI11CIlCa, intr-un alt capitol 0 sa vcdcm ca in limbajul C't+ putem sa stabilim, pcntru ficcarc paraructru, tipul de apel: prin valoare sal! prin referinta.
Excrcitii: 4.35 Sa
5C

Ill' " IUllelle , "',


1111,

J1L'

ell" '

. c o 11111111111 ,\'11111 ~I ' C;IIT ' InSlIlllC<I/,;1 CitlllClllclc

"\CC<ISU!

IUllC\IC

arc dOl par.uncui:


1;Ii)iulIilll

scric

functic care calculcaza

valoarca

unui polinom

folosind

schema

l,siL' uutnclc
I:a rcturncuzu

ale carui

ekllll'lliL'

,W IIISllllll';I/.;L

lui Horner.
Parametrii functiei sint:

- !:sIc numarul clemente lor tabloului.


SlIl11a:

c
11

- Tabloul eu cocficientii polinomului. - Este de tip long double.


-

tablOJ ,tabJII'
iu t

, ..

Itlbllll,

Gradul

polinomului.

('0111(11"111 ccior spusc mai SlIS, fUI1C\ia arc unuatorul


in!
:,:\.111\(

auct: x

- Este de tip into - Valoarca variabilei.

tdlJII,

.in

(1)

" i\minilln, ca data lin paramcuu cfcctiv cstc Uirl1l111C de tablou uniimcnsional , atune: 1)<11"1111'" trul formal C()I" cs'I) 1II'17<1t,or St. po.u. nee I ara rara a mica. " Jl1 . I I' " ,~ c

parantczclc painuc. limit» supcrioura a indicclui Ducu a cstc un tublou dcclarat ca mai jos:
j

san.,' ' a!clllrt

n t.

ilJ

101;
<I msumu
11)) ;

- Este de tip long double. Tabloul c continc cocficientii polinomului in ordinc puterilor lui x, - Este eocficientullui x**n. c[ OJ Este cocfieicntullui x **(11-1). c[I]
c[n-l
J

descrescatoare

.uunri

pcntru
'1111 (d,

clcrncntclc

iahloului

rcspcctiv

/orn

putca

folosi

- Estc cocficicutul

lui

X.

Ikuarcc' c ( I L~ C IIUIlll. 'I,C Ulllli "11" UU, tt arc I.:a vrloarc ;ldn;S;1 prt , mrlu 'I snu 'I' l.t) clement ., adieu udrcs II' d ' . ' " ' c "CSd ,II 'I()I ,f \ pc'I U I Iii I prinvaloac, Illll paraillctruitah Inme~tc valourca lUI a dcc i tab arc 0i cl cu valourc adrc'sa 'ui alai. Rczulta ci tabj O], tub] l ]. ':" tabl91 rcprczirua ncclcasi clemente en ,1101, a] I!. .. " a[9j. D: accca, corpul lunctici '1(111 rcfcrindu .., l:a c'I'cmcntc IC I" flU, SC rctcra . uc fapt c hi , I ' I' I ,. " ~ ru-se til uar ra clcmcniclc lui u:·
tor (
Sf.

dill

- Este tcrmcnul libcr. Se "tie ca un polinom pix), cu coeficientii e[O], ell], .'" ern], in ordine descrcscatoare ale putcrilor lui x, se poate pune sub forma: p(x)=(.,,«c[O]*x+e[ I])*x+c[2J)*x+ ..,+c[n-2])*x+eln-1 ])*x+e[n} Fie s=c[O] Se observa paranteza cea mai intcrioara arc ca valoare, valoarea expresiei:

0; n

; r i-

ta b l n 1. J ;
C<I, ill accst

f:leut prin valoarc (valoirca lui (I' s-a atribuit lUI tali), s-a I'cali/<llUll apel prin rcfcrintn, dcoarccc valoareiatribuita paramctrului Iorma] cstc 0 udrcsa. ' ill ;IC(,5( cal, functia apclatu poutc. moclifica clcmentelc tabloului al ehi'ui nUi11C :)- .. Iolosit ca paramctru 1 erectiv. lnrr-udcvar, in cxcmplul de mai SlIS. .uribuirca:
Sc obsel'v<J
e,IZ,

dq;i apclu]

s-a

I
I

cit

s*x+cll)
S~I atribuim

lui s valoarca acestei expresii:

s=s*x+c[ll In continuarc trebuie sa se evalueze valoarea expresiei: s*x+c[2] Atribuim din nou lui s valoarea acestei expresii:

tahllJedOO;

IBO

181

s=S*X+C[2] In general, la ai r-Ica pas se evalueaza s*x+c[il ~iapo] valoarea ei se atribuie lui s: s'=s*x+c(i) Deci, calculul valorii polinol11ului p(x) revine la execuria repetam a atribuirii s=s*x+c[iJ, pentm i=I, 2, ..., n, valoarea ini[iala a lui s fiind c[O]. Aceasta conduce la instruqiuneajiJr
for(s=c[O],i=l;i<=n;i++) s=s*x+c[i];

expresia

~ROGRAMUL. 81V36
iiincl\ld~ ""'tdio.h, #inc Iud., Q"1;(iHb. it> 'include 'biv3§.(pp' Gdefine MAXGRAD :00 , I' I. ma i.n t ) ';*. '1'" cltc~~r'C,",I.u.,1 "[OJ 'I[ I J ..... '. , '. . 'I[n] calculcaza si afiscaza valoarca po mornu 1Il . p(X)""I[Oj'.\ **11 + a[) JOx' "(u-! + ...+a[II-1 ]*x + all1J I long doubl.e int i,ni char t.!2S5J,:
j* ciicstc valoarca X,idMAXGFAD+l);

de mai jos:

FUNCTIA BIV35
;* calculcaza valoarca polinomului p(x) = c[DJ*x"n + c[ll'x"(n-l)
long double int i; forts = CrO], return S; S; long double pol inom (long double
x,

do ( int
n , long

Itl x */

double

c [)

+...+ c[n-1l'x + e[nl';

print)' I "v,Joarea lui x: ") ; if (gets (d:) == NULL I ( pr i,rlt: f.'. "s-a tastat EOF\n"); exl t; (l;
)

1;

-c c; n;

i++

)s

if(sscanfl~"%Lf', &xl 1 I break; printf ("flU ·;-a tastat uri numar\n"); ""hile (I) ; S*X+c[i]; • ~i,aqstc pc n • f 10 l
pr_intf<flv.:~JG~roa

==

Observatie: Biblioteca standard a limbajului C contine fllnqia poly care calculeaza vafoarea unui polinol11 de graduJ n Cll coeficicl1rii de tip double. En nrc Prototipul: double poly(doubJe x, int n, double cW; care se afld injiSierull11ath.h.

if(getslt) printfi"l-a
e x i t; (1);
)

=.

Lui

");

NOLL) ( tastat EOF\n'); &n}

if(sscanflt, break; printf("nu

"'lsd', a-a

1 && n >= 0 && n <= 100 un intreg din int.ervai.ul \

In aces! caz, c[01 este !ennenul libel', c[ 1 J coeficientul este coeficientul lui x la purerea i.
4.36 Sii se scrie un program care realizeaza llnni\toare!c: .. citeste pc x de tip long double; .. ..
It

lui x. in general elil


j'

tastat
\n");

[0,10'1)

L'il!si.~cncl'lI:iL'lIt ii 1'(llinllllll1lui ,; fori i=O; i <= It; i++ ) de) { printf("ce),'ficientuJ a{%d]: ", i if«J(!t.,,~(l) NULL) ( pr.intf("s-a tastat EOF\n"), exit 11) ;
) j,

ciresre pe n de tip int din intervulul [0,100J; citeste coficientii double; calculcaza a[O], all 1, ... , u[nl ai polinornului
}J(.')'

pM

de tip long

~i afi~eaza valoarea pofinomului

a[O] este coeficientul

lui x**n, all J esre cocficicntlll

lui x**(n-l) etc.

if(,,;sc"nt(t,"~,Lt", ,\';I{il) "'" \) bre.r k, t» icsirc din dl) -whilc *i p r i n t r ("nu s-a t a s t a r un numa r vn » I, I whilell); ;* sfirsit citirc cocficicnti polinnrn ,; printf("x=%Lg\cgrad=%d\tval Pol:%Lg\n",x,n,polinom(x,n,al I;

182

I
lX3

4.3 7

5,1 sc scric (.1 lunctic cure citcsrc ccl mult » III I me rc ~I lc p,ISlrC<lZ<I 111 tabloul ndtal: carl' cslc de tip double. FUI1C\ia rcturncaza numarul uumcrclor cit ill'.

FUNCTIA BIV37
i.n t
nd~-~lt(iI11
11,

4.39

Sa se scric un program careciteste ~iafiscaza produsul lor scalar. Componcntcle cell'


/I II

cornponentele

vectorilor.c

~i , calculcaza y

d{~ld}!('

!Hil,d,ll
ill

) tahlou! n.Irub:

/~ ciicstc cc l mult u

11t1IllCIT:-.i

II: pa;-.lrc;I'/i\

rcturncuzn i n t. c na r
t o r ti
p
1i

numarul

uunu-rclor

,',Iile ''I

numarul componcntclor
cornponcntc componcnte ccle

cclor doi vcctori sc tastcaza vcctorilor (/1); ale lui x: ale lui y.

astfel:

d()lJ\)lr:'

(.'I;

t(2~)::;Jj; (); i ...n;

i,,)

Programul

de falii utilizcaza

functia dcfinita in excrcitiul

precedent.

it t cte ts t t l i [(sscanf (t,


ndl.ilblil re t.u rn .i :

r int Lt ve Lemcn tu J ['i,dl ",i.); NUI.,I,) h,tUlCll i. "',,] [", ,,<I) 1) int,>.Ik; "d;

PROGRAMUl
#include 'include
Hinclud() »include

BIV39
<stdio.h> <stdlib.h>
"hiv'37.cpp" "biv3B.Cl~"

#define

MAXlO()O

4.38

11 umaru

Sa se scrie 0 functic care citcstc componcntclc unui vector prcccdate de I lor. Functia rcturncaza numarul componcntelor vcctorului respectiv. functic foloscstc functia definite in cxcrcitiul precedent.

main () /* citcstc componcntclc vcclorilor X si y prcccdatc de numarul lor; calculcaza si afiscaza produsul lor scalar */ int i,n; double x[MAX],y[MAX1,s; /* citcstc pc n si compoucnrclc vcctorului x */ n ~ qvcit(MAX,x);

Accasta

FUNCTIA BIV38
int dvcil:(int nrna x , double dvectorl]) /* citcstc un intrcg n si cdc n cornponcntc ale vcctorului

dvcctor:

rcturncaza

numarul componcntclor

cititc */

int i,n; char t[255];


do

/* citcstc cornponcntclc vcctorului y */ if(ndcit(n,y) 1= n ) { printf ("nu sint n=·%q componente exit(l) ;

pentru

y\n",

n);

printf("numarul
if(gets(t)

elementelor=
(

");
} 0 && n <::: nmax)

== NUL,!,)

printf("s-a (!xit(l) ;
if(sscanf{t,"1;d",

tastat

EOF\n");

/* calculcaza produsul scalar */ s = 0.0; for(i=(); i <: n; 1++) s += x I i l *y[i]; printf("(x,y)= %g\n", s);

sn )
t

1 ,\c&

n>

break; ·In.intf ("nu whi Le (l)


;

4.40

S-'a

a s ra t: un i.n t.reo

din

i nt.o r va Lu l

[1, 'hl] \n",

Sa se scrie 0 functie care sorteaza tablou de tip double.

in ordine crescatoare,

elernentele

unui

nma x ) ; if{(i=ndcit(n,dvector» !,. n


S~(l

)
1

print f ("nu p r i nt Lt vs+au return i;

ou sit

ci

cit.it

UUHlili

'(,d

rea col o r n:::.~)dcomponente\n", componont e vn iil :


v

Spunem despre lin tablou tab, de elemente numerice, (descrescator), daca eiemenreic lui satisfac relatia:
n);

eli este sortat crcscator

tab]
pentru

iJ <= (>=) tab[i+ I J

184

185
**;:m,,:;;.4W$'"
4

¥iiiMI,.-'

(";:;

4\4t.4;i,*,

4$

.$

i=O, !,2, ... ,11- 2 undc:


/I

- Estc numarul

clcmcntclor

tabloului

tab.

crcscator.

.3 4 5 7 l\ !) sirul dupn pcrmurarcn lui 5 en 4. La a parra parcurgere a sirului Ill! sc mai lace nici o pcrmutarc dcoarccc percchilc de clemente vccinc sint in online crcscuroarc, dcci sirul cstc sortat

Functia care realizeaza sortarea are doi parametrii: lab - Tabloul de sortat,
11

o propricrnro

a accstei

mctodc

csrc accca

ca In Iiccurc

parcurgcrc

a sirulu]

de

- Numarul

elcmentclor

tabloului.

La ora actuala, exisra 0 serie de metodc de sortarc, care difcra intrc ele, mai ales, prin ordinul de marirne al pasilor nccesari pcutru a realiza sortarca. Pcntru amanuntc se poate consulta [3]. metode sint cele mai putin eficicnte ~inecesita un l1ul11tl.r.de n*n, Ilfiind numarul clcmentelor de sortat. Prezentarn mat jos o astfcl de metoda, care estc CU!10ScuU\ sub dcnumirca de metoda bulclor (hllhhle Ccle rnai simple

pasi de ordinullui
sort). Ea
C0I1S1('1 in

dcpartc.

numere, eel purin lin element a.iullge sn-si oellpe pozirin sa Iinala in conformitmc cu ordonarea avuta in vcdcrc. Astfcl, dupa prima parcurgere a sirului, clcmcntul ajuns pc ultimul loc nu va rnni Ii pcrmuuu, ncupindll-si locul final. ill cxcmplu] de mai sus,9 a ajuns pc ulurnul loc dupu prima pcrmuiarc, pozitic carl' cstc Iinuln peutru cl. Dupa cca de a doua parcurgcrc, II it njuns ~l <:1 !1L'pllzi\ia lu: finala intimplfllor;;i 7 a ajuns pe pozitia lui finala la cca de a doua parcurgcrc ~i a~a mai

urrnatoarcle:

Se cornpara primele doua clemente ale tabloului de sortat si da~a nu sint ordinea ceruta (de exemplu crescatoare), se pcrrnuta intre cleo ApSl1 se cornpara elernentul al doilea Cll al treilca :;;i se procedeaza ca mai sus. In general, se com para' doua clemente invccinato, sa zicem al i-lea ell al i+ 1-lea sidaca nu sint in ordinea ceruta, atunci ele se permutd. Se procedeaza in acest fel eu toate perechile de clemente invecinate ale tabloului de sortat. Apoi procesul respectiv sc rcia de la inccput. El se intrcrupe cind se constata ca toate clcrncntclc invecinate ale sirului sint in ordinca ceruta (in cazul de fara, crcscatoarc).

it:

Daca se ordoncaza crcsc.uor un tablou de numcrc, utunci dupa prima parCllrgL're a l'lcIllL'lllelor lui, clcmcnrul mnx im va uvea indicclc eel 111:11 marc. Dupa cca de-a doua parcurgcrc, ruaximul dintre elcmcntclc ramusc (timl a cousidcrn ultirnul clement) vn ocupa pcuultima poziiic ill tablnu etc. Se obisnuiestc sfl sc spunu C:I clcmcruclc urea in pozi\iile lor la rei C1l si bulcle de aer in apa care ficrbc, de un de 01 dcnumirca mcrodci. Functia de mai jos continc un ciclu pcntru parcurgcrca clcmcntclor tablnului tab. in accst ciclu sc cornpara eiL'mentcle vccinc curcntc ~idaeii accstca III I siu: in ordine crescatoarc, clc sc pcrrnuta. Dcoarccc, dupa 0 parcurgcrc a sirulu: xc rcincepe parcurgerea lui, accst ciclu cstc conrinut intr-un altul care rcal izcuzn exccutia rcpctatn a ciclulu: de pnrcurgcrc a sirului. Se ajungc In accsr rei lu urrnatorii pas]:
I. 2. Cit timp sirul 1111 estc soruu Altfel sc intrcrupc proccsul se executa pasul de sortare. pcrcchilc 2. carl' sin: ill

Exemplu: Fie sirul de numere:


8,3,9,5,4,7 pc care dorim sa-l ordonarn 83 9 54 7 389547 3 8 5 94 7 3 8 5 4 97 crescator.

Se parcurgc ~in!l.5i sc permura online descrcscatoarc. Pasul2 se realizcaza pruur-un

de ciCIllL'IlIL: invccinnn-

cielujiJ,.

de forma:

Prima parcurgere a sirului: lui 8 cu 3 sirul dupa pcrmutarea lui 9 ell 5 sirul dupa permutarca lui 9 cu 4 7 9 sirul dupa permutarea lui 9 cu 7. parcurgere a sirului: 7 9 sirul dupa prima parcurgere 7 9 sirul dupa permutarca lui 8 cu 5 7 9 sirul dupa permutarca lui 8 ell 4
sirul initial sirul dupa perrnutarea

f ell- (i I) ; j 0: n I.; j I , ) if ( t ab lLj >I:ab[ i+ 1 J) ( 1* sc pcrmuu, clcmcruclc t=tablil; t ab ji] i.db[ i.rl },
tab[i+l]
t;

,,,h[il

~i tah

I i+ II

*/

3854 A doua

3854
3584

Acest ciclu trebuie rcpctat atit timp cit elementele tabloului tab Ill! sin! in ordine crescaroa--. Problcrnr; care se pune in legillu):[ ell cxccuria repciata a
accsrui ciclu .ii!/' cstc accca de ;1 ~Ii cind s-a ajuns la sitll<qia in care cielllcntele tabloului lab sinr in ordinc crcscaroan-. Observant ca in accst caz ciclul fi!/, sc executa EIl'il a mni LIce permutar]. I)..:ci, tubloul estc surra I CII\(I ciclul jill' II parcurge Hlrll a face pcrmutari. Accsr Iap: ponte II delectat Iolosind 0 variabil», s:\ ziccm ind, care se anulcaza inaintea liccarci execfl\ii a cicluillijin' ~i sc scicazn la

3 54 8 3 54789 sirul dupa perrnutarca lui 8 ell 7. A treia parcllrgere a sirului: 3 5 4 7 8 9 sirul dupa a doua parcurgere a lui 186

1117

valourca variabila
putin III couirar.
0

111

cazul

111

care ciclul rcspcctiv

ind arc vulourca I dupu cxccutia pcrmuturc :~i .crn in C~17. coutrar. i

lace 0 pcrmuiarc. 111 fclul acosta. ciclului [or, daca accsta a facut eel
~intl

4.41

Sa sc scrie un program care citeste lin sir de numere separate prin caractere albe ~i le afiseaza in online crescatoare. Dupa ultimul numar se tasteaza un

coucluzic,

..

variuhi!a lilt! 'II'C v,tiO'II'C I.l'I'U Cllld Variubil.: inc! sc gcstioncaza astfcl: initial inc! are valoarca I;
Illailllc

csic

surl;ll :_;i I III

cal,

caractcr ncnumcric, ~;i el mull 1000, e

Sc prcsupunc ca la intrare exists eel putin doua numcrc

dc illslluqiullc,\/ill',

illtl

Sl'

1~Il'L' cg;\I ell zero:

Numerele se eitese apelind functia ndcit definite ill exercitiul 4,] 7. Sortarea lor in ordinc crescatoare se realizeaza folosind functia ordcresc definita in

cxcrcitiul
ind sc face cgal ell

precedent.


end
.I o r

in sccvcnta de pcrmuturc a doua clemente invccinatc,


I.
sccvcntu:
;i<:::n 1;1++)

PROGRAMUL BlV41
ninclude #include #include 'include nincluclc #define main ()
(

Sc obtinc

=
(I

0;
.!hl i 1'1 .. hi i, i l ) I.

ti

it

<stdio.h> <stdlib.h> <conio.h> "biv37.cpp" "biv40,cpp·

t=tab[i);
t.ab[i] t.a b l iiLl tah[i+l]=t;; inc:1"7.1; ,

tlLAX 1000

;. citcstc un sir de numcrc si lc afiscaza in ordinc crcscatoarc "(

Accasta sccvcnta sc executa rcpctat alit timp eit ind nu cstc ega I eu zero, adica tabloul nu cstc sortat. in aces 1 senp sc foloscsic un ciclu \4lii!c care arc ca ~i corp chiar sccvcnta de mai sus:
while(ind) (
i,nckO; (or (i=O; i<=n-1; i+ I) if(tao(i»tabli+l)){

double tnr[MAX1; int n,i; if«n=ndcitUIAX,tr!l'/) -< 2) p r i.nt f t vs+au c l ri.t rna i, putin exit(l); ordcresc{tnr,n)
ror(i;::;(j; i< nr

de

2 nume

r e vnt

l:

;
iri)

t=

) /. sfirsit if stirsit while */

*/

printf("tnr[%dl=%g\n", i£(i+l)%23 =~ 0) { printf ("actionati getch() ;


)

i,tnr[iJ);
0

t.asta

pentru

a cont.Lnue vnv j

FUNCTIA BIV40
void o r dc r e s c t dou b l c t.a b l l . int n) }

I*' ordoncaza

clcmcutclc

lui lab in ordinc crcscatourc

~/

i nt, i, irid : double t; ind ~ 1;


/

wh i le tind

ind 0; for{i=O; ie n-l; i++) j f (tab [ i J > tab [ i + 1] ) t: tab[i); tab[i]


i rrd /* sfirsil !' sfirsit while *1 1i

I
t.e b l i.rLl t;

4.42

Sa se scrie 0 functie care cauta un clement de valoare data a, intr-un tablou de numere sortat crescator. Functia returneaza indicele unui clement de valoare egala ell a sau -I in cazul in care nu exista un astfel de element

= tab[i+lJ;

if

'1>./

Elementul de valoare a poate f gasit cornparind fiecare element al tabloului ell a pina eind se gaseste un element egal eu a. In cazul in care nu exista un astfel de element in tabloul respect iv, cornpararea se face ell toate elementele tabloului pentru a putea constata ca nu exista elementul cautat, 0 astfel de metoda de cautare, numita cautare liniard, desi este foarte simp la, ea necesita un numar relativ mare de cornparari. In cazul tablourilor serrate se poate utiliza 0 metoda de cautare mult mai rapida, numita metoda cauuirii binare. Aceasta metoda consta in urmatoarele, 189

188

Fie tab tabloul in care se CHula un element de valoare a ~i care este sortat
CTeSCatOr.

Deci:

tab[O] <= tab] I] <= ... <= tabln-I } 1. 2. Se compara elementul din mijlocul tabloului (de indice {(n-I)/2J) cu a. Daca aeesta are valoarea egala cu a, inseamna eft s-a gasit un clement de valoare a ~i se retumeaza indicele lui. Altfel se continua cu punctul 3. Daca elementul din mijlocul tabloului este diferit de a, atunci din cauza ca tabloul este sortat, elernentul cautat se ana fie in prima jurnatate a tab lou lui, fie in a doua jumatate. Mai mult decit am, se poate stabili exact in care jumatate urmeaza a se face cautarea ~i anume: " Daca tab[(n-l )l2]>a, atunei elernentul cautat se poate afla numai in prima jumatate a tabloului tab. Dcoarcce elementele tabloulul urmatoare lui tab[(n-I )/2], sint rnai mari decit el, deei urmeaza a face cautarea in subtabloul: tab[O]<=tab[ I r=... <=tab[(n-I )/2-1 [.

tab[71=3 5> 20 dcci se va face cautarca in prima jumatatc a acestui subtablou, adica se selectcaza subtabloul: lab[51=20, tabl6 J=21 In continuare, se alege elementul de indicc 1(5+6)/2)=5, deci tabl5 J. Cum tab[5]=20, rczulta ca in accst moment a fost gasit elerncntul cautat si se revine din funcric ell valoarca 5 (indiccle clcmeutului caurar). Pentru estc bine primului ultimului I. determinarca, la ficcare pas, a subtabloului in care sa se faca sa utilizarn doua variabile ill!" ~isup, prima avind ca valoare element al. subrabloului curcnt selccrat, iar cea de-a doua, element al accluiasi subtablou. Pasii proccsului de cautare vor cautarea indiccle iiidicele fi:

3.

..

4.

Daca tab(n-l)/2l<a, atunei elcmentul cautat se afla numai in jumatatca a doua a tabloului tab. Deoarece elcmentclc tabloului, precedcntc lui tab[(n-l)/2], sint mai mici dccit el, dcci cautarea se va face in subtabloul: tab[(n-l )/2+ 1]<=tab[(n- J )/2+2]<= ... <=tabln-I} Dupa determinarea subtabloului in care trebuic cautat clcmcntul de valoarc a, se procedeaza in mod analog, adica se dctermina clementul anal la mijloeul aeestui subtablou si apoi sc procedeaza ea la pasii 2 (>1 de mai sus 3

I
I
{
J

2.

3.
4.

inf=O Indicelc primulu i clement al tabloului. sup=n-l Indicelc ultirnului clement al tabloului. i=(inf+sup)/2 Indicele elcmcntului din mijlocul rabloului,
Daca

tabji l=a cautarca se tcrrnina ~i se returncaza Altfel se continua ell 5.


5. Daca

valoarca

lui i.

tabl i] > a
atunci

si asa mai departe. Exemplu:


Fie tabloul tab de 10 clemente care au valorile: tab[O]=3 tab[3]=lO tab[61=21 tab[9]=48 tab[ I ]=4
tab[4]=13

tab[2]=7 tabl5]=20
tab[8]=41

tab(71=35

i I

Se eere indieele elementului de valoare 20. Avem: 11=10, [(n-I)I2]=[9/2]=4. Se cornpara tab[4] ell 20: tab[4]=13<20 deei pentru cautarea urmatoare se alege jumatatea a dou a a tabloului: tab[5]:=20, tab[6)=21, tab[71=35, tab[81=41, tab[9]=48. Elementul din mijlocul acestui tablou este de indice [(5+9)/2]=7. Avem: 190

i
t

sup=i-I Lirnita supcriouru xc cohn:!r;1 la valoarcn i-I PCllInJ a sclccta primajummatc a tubloului. Sc reia de In punctul 3. Altfel insenmna ca tab[i] < a si atunci inf=i+1 Limita inferioara crcstc la valoarea i+ I pentru a sclecta jumatatea a doua a tabloului. Se rein de In punctu I :;. Acest proces se dcsfasoara corcct in cazul in care, in tablou, exista eel putin un element de valoare a. In caz contrar, el continua indefinit. Se observa ca la pasui 5 de mai sus, una din limite S(' modifica ~i anumc. daca sc l1lodilid limita sup, atunci accasta descreste, iar daea se modifica limita iuf, atunci accasta creste. Initial inf«= Slip. Dcoarece la ficcarc pas la care I1U s-a gasit clerncutul cautat, una dintrc variabilelc inf sau Slip sc modifica ~i in] crcstc, iar Slip dcscrestc, rczulta ca inegaliratea de mai sus I1U va mai f satisfacura dupa un nurnar finit de pasi, adica se ajunge ca sit fie sarisfacuta relatia: J9J

inf>

UII .Ill!)

return

clement de vuloarc -1;

a */

Accasta sc intimpla cind in tablot! !HI cx ist.: un clement de valoare a. Deci proccsul de calcul indicat mai sus sc intrcrupc fie la g,\sirca clcrncntului cautat, fie cind sc ajungc ca ill/stl-I dcpascasca pe Slip. Sa reluam cxcmplul de mai sus pentru a=22, Si in accst CaL sc va ajungc la suhtabloul: tabI51=20. t<lh161=2 \
~l

4.43 Sa se scrie un program care citcste un sir de intregi separati prin caractere albe si-i afiscaza pc cci care snit numcre prime ~isint in intervalul (0, I000). Dupa ultimul numar se tastcaza un caracter nenumcric.
Accst program gcncrcaza la inccput UI1 tablou eu uumerc prime, in accst scop se rcalizcaza 0 functie pc care 0 numirn prim. Ea are doi paramctri: {prim ~iII. Primul paramctru cstc un tablou de lip int, ale carui clemente sint uumcrclc prime care nu-l dcpascsc pe 11:

inl=S,

SlJIF6

La pasul 3 se dctcrrnina:

i=l (5+6 )/2)=5


Apoi se ajungc la pasul 5, dcoarccc

tprim[O]=l,

tprim[lJ=2,

tprim[2]=3,

tprim[3]=5

etc.

EI este sortat crescator si ultimul element tprim[mJ este eel mai mare numar prim care nu-l depasestc pe 11: tprim[m] <=
11.

tab[5J!=22. Cum tab15 1"'20 -. 22, rczulla ca inf 'i I 1'51 1'(>. Sc rcvinc la pusul 3 uudc sc atribuie lui i valoarca: i=[( inf+sup )/21=[ (6+6 )/2]=6
Sc ajungc din nou la pasul 5, dcoarecc

Functia prim rcturncaza m+l).

numarul

numcrclor

prime pastratc

in tprim (adieu

tllb[61 != 22. Cum tab[6]=21 < 22, sc modifica dill nou ill/
inf=i+l=?

Pcntru detcnninarca numcrclor prime vorn proccda ca mai jos: Prime le 3 numcre prime (I, 2 si 3) sc pastreaza in mod automat, daca n>3. Pentru a detcrrnina ca un nurnar III > 2 cstc prim, este suficient sfl stabilim ca el nu estc divizibil cu niei unul din nurncrclc prime mai mici dccit el. De fapt,

cstc suficicnt

Sfl

tcstarn divizibilitatcu

lui

ell

nurncrclc prime all'

cilror

patratc nu-l

in accst moment inf > sup ~idcci proccsul de calcul sc intrcrupe, Iiind accca ca tublou] rcspcctiv nu contine un element de valoarc a. FUNCTIA BIV42
i nt; dc au t b i n (do ub Le tab I J, .in t. n , dOl)ble /. cauta in tab lin clement de valoarc egala eu a:
rcturncaza
(

concluzia

dcpasesc. De asemcnca, vorn obscrva ca singurul numar prim par cstc 2. Deci un numar In > 2 cstc prim duca: 1, III este impar. 2. 111 nu sc divide ell nici unul din numcrele prime consecutive p l , p2, ..., pk, ale caror patrate nu-l dcpascsc pc 111 (p 1=3). Deci pk estc eel mai mare numar prim peutru care pk Daca tabloul continc deja i numcre prime:

a) un astfcl dc clement

* pk

< m.

indicclc

clcmcntuiui

rcspcctiv

sau -I, daca nu cxista

*/

tprim[O], tpriml l ], ... , tprimli-I] atunci pentru a detcrmina l.

(i > 2)

int

l,inf,:;up;

numarul prim urmaror vom proceda astfel:

inE

0;
(

sup n-1; wh iLe I i n f <= sup) i =(in[+sup)/7.;

2.

tprim[iJ=tprim[i-I]+2, dcoarcce numcrcle prime mai mari decit doi nu sint pare. Sc tesrcaza daca tprimli] este prim; in acest scop se cauta daca exista printre

if: (tab [ i
it(tab[i]

==

a ) ret.urn i; > a) sup = i-l.;

numerele prime:
tprim[2]=3, tprimj I], ... vrcunul care sa-l divida pe tprim[i]. Conform cclor spuse mai sus, nu trcbuie inccrcate toate clemcntelc tabloului tab ei numai acclc clemente care satisfac relatia: (1) Iprill1UI*lprimUI <= tprimji] (j=Z, 3, ... ).
193

else inf: = irL, ;, sfirsit while 0/ /* sc ajulIgc aici cind inf> suI'. ceca cc inscamna ca inlah 1111 cxista

192

in cnzul in care existaun clement care sarisfacc atit relatia (1), cit si rclatia: (2) tprim!i]%tprim[j 1==0 numarul tprim[ijnu estc prim Si sc va trccc la pasul 3 de mal jos, Aitfel tabji] cste prim, se marestc i ell 0 unitarc ~iproccsul de calcul sc rcia de la punctul I.
5.
1

int i,j,K: rpri m [0) 1; iff n < ) return 1; tprimll] 2i if ( n <::: 2 ) return 2 i tprim[2] 3; if( n <::.:: 3 ) return 3 i tprim[3] 5; i = 3; while(tprim[i]
/* sc c~lIta cxistcuta J 2:
<=

Cum tprimli] nu este prim, acesta sc marcstc


punctul2.

ell

2 si proccsul

S(~

reia de ln

Procesul de calcul de mai sus se continua atit limp cit tprimli] <= n. Dupa generarea nurnerclor prime, programul citeste un intrcg ~idaca acesta apartine intervalului (0, I(00), Il cauta in tabela de numerc prime. Apoi se afiseaza nurnarul respectiv insotit de un mcsaj corcspunzator, Dupa afisare se rcvine la citirca numarului urmator ell care se proccdcaza analog. Executia prograrnului se intrerupe In intilnirca unui caracter care nu apartine unui intreg, Cautarea numarului citit in tabloul de numere prime se face prin metoda cautarii binarc, In aces! scop se utilizcaza 0 functie analoga cu functia dcautbin definite in exercitiul precedent. in acest caz se va folosi functia icautbln, Difererua intre cdc doua functii consra in aceea ca dcautbin cauta 0 valoare de tip double intr-un tablou de tip double, iar icautbin caura 0 valourc de tip int intr-un tablou de tip tnt, PROGRAMUL
#include .include #define

n) ( prim >= 3 pcntru rprimli]


<

unui divizor

*/

while((k=tPrim[iJ*tprim[j]) ~prim[i]%tprim[jl)
/* ciclul continua

tprimli]

&&

In tprim[jJ

alit tirnp cillprim[j)*tprimU] CSICdiferit de zero */

< tprim[i]

si restul imparlirii

lui tprim[i]

j ++;

1* ciclul.Whitc Be icrmina cind eel rutin una din conditiilc de mai sus nu csrc adcvarata 1. f ( k > tpr im [i J )( /* tprimji] cstc prim dconrccc nu ex iSla mill nne sau cgal cu tpriml i] */
1·1-+

'* /

BIV43

1111

divizor prim a lui Iplilll[il

<stdio.h> <stdlib,h> MAX 1000

ill carui patrnt sa tic

tprim[i]

tprim[i-l]

2:

1* tprirnji-J ] Iiind prim, urnuuorul int icautbinlint tab[], int n, int a) ;* cauta in tab un clement de valoarc cgala ClI a; rcturncaza indicclc clcmcntului rcspccriv sau -1, daca int i,inf,supi iof " 0; sup = 0-1; while(inf <= sup) { i =(inf+sup)/2; if(tab[i] a) return if (t.ab I i j > a) sup i-I; else inf 1" sfirsit while "1

11U

cxista un astfcl de clement

*'

) '*

numar prim va ti eel rlltin ell 2 mai marc dccit cl */ prim */

sfirsit if pClllrulprilll[iJ

else /* tprim[i] nu cstc prim dcoareee s-a dctcrminat lIll j asa incit !prim[j]*lprimUl = Iprim[i] , ~au rcstul impartiri: lui tprim[i]la Iprim[j] cstc zero; III nmhclc cavuri Ipriml il nu L'sk prim; sc marcstc ell 2 */ tprirn[i] += 2; 1* sfirsi: while exterior return i; ] /* sfirsit prim '/
rna in ()

i:

''I

} '*
194

return

1:

sfirsit icuutbin

*'
pc n */

/' eilc,!e

un sir de illiregi si-i aliscaz:1 pc cci din intcrvalul (n.1 0(0), care suu uumcrc prune ./

int prim( int tprim[], int nl /* pastrcaza in tprim nurncrclc prime care nu-l dcpascsc

int nrprirneIMAX]: int n rcr t , int 11/