Sunteți pe pagina 1din 158

slr.

Obse

3400 CIUjr:'~~oniIUi 1, bl. 051

C.P.186 poca

fax 0 ' of. Post CI .

tel 64.198263' uJ-Napoca 1

httP:~64.438328·

_ www.gmLro

Cartea se ad

care doresc sa reseaza unui cer

rea limbajelor C se inltieze in progra c larg de cititori

Primele d $1 C++ . marea si utiliza-

eleme t OU<3. volum

~o~~~i~1 alcesle limb:j:~aliZeaZa 0 introducere

C++ rei contin

_ cu aplicatii la - e programe di .

$1 tehnico-inqu rezolvarea probl verse In C si

Sl . merest: . emelor I" - .

_ In scrierea p .' In prelucrari d s iintifice

rogramelor de sisteme date precum

~ I f ! t .

CLUJ-NAPOCA 2001

Reeditare

[10lliLJm&cD~[1~ @ @O @{?{? [;)~~1F[X1QD

fll\nt::::\r,::Ji~ R c-:Jt::::\ ~ n

UU\J~I3lf/~ U ~lJijU

VOLUMUL I Partea lOla

Autor:

- '. A confruntat cu originalul Irina Mitrov

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.

PREFATA INTRODUCERE

!
~
,
!
7
11
23
23
24
24
26
29
30
30
"')
_)L
r
_'
36
37
3g
40
41
42
45
46
47
50
50
51
51
53
54
55
56
57
60
6()
61
61
62
m
(l
),:;_,
3 CUPRINS

L

1.1. 1.2. 1.3. IA. 1.5. 1.6. 1.6.1. 1.6.2. 1.6.3. 1.6A. 1.7. 1.8. 1.9. 1.10. 1.1t. 1.12. 1.12.1. 1.12.2.

2. 2.1. 2.2.

2.3.

2.4.

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

NOTIUNI DE BAZA

Nurne .

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

Sir de caractere . .

Caractcrc sau spatii albc (white spaces) 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 .

INTRARVIESIRI STANDARD Functiile getch si getehe

Functia Futch . . . . . . . . .

Exercitii .

Macrourile getchar 0i putchar

Exercirii .

l-unctiilc gets ~j puts Exercitii ... Functia printf . Litera c

Litera s

Litera d

Litera 0

Litercle x Si X Litera II

Litera I ....

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.

3. 3.1. 3.2. 3.2.1.

3.2.2.

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.

3.2.14.

2.5X Litera r

2.5.9. Litcrclc c si E .

62 63

3.2.15. AJ!i opcratori ai limbajului C .

3.2.16. Fabela ell prioritatile operatorilor limbajului C

2.S.IO. 2.5.11.

l.itcrclc g ;;i (; Litera L .... Exercitii FUIlC\ia scanf . Litera c

Litera s

Litera d

Litera ()

Litcrclc x sau X Litera 1I

Litera r .

Litera 1 .

Litera L . Excrcitii

M 64 69 71 71 73 75 75 75 75 75 75 76

4. 4.1. 4.2.

4.3. 4.4.

4.5.

4.6.

4.7.

EXPRESII .

Operand .

Opcralori .

Opcratorii aritmetici

Excrcitii .

Regula convcrsiilor implicite

Excrcitii .

Operatorii ell' relarie .

Exercitii .

Opcratorii dc cgalitatc

Operatorii logici .

Exercitii .

Opcratorii logici pc biti Opcratorii de atribuirc .

Exercitii .

Operatorii de incrernentare ~i decrcmentare . Operatorul de fortare a tipului sau

de convcrsic explicita (expresie cast)

Exercitii .

4.8.

79 79 80 80 82 86 87 89 90 90 91 93 95

100 101 103

4.9. 4.10.

4.11.

4.12.

4.13. 4.14.

4.15.

5. 5.1. 5.2. 5.3. 5.4. 5.5.

104 104 lOS 107 107 108 109 110 1 II

Opcratorul dimensiunc . Operatorul adresa '. Operatorii parantcza .. Operatorii couditionali . Exercitii ..... Operatorul virgula Exercitii

6. 6.1.

6.2.

INSTRUCTIUNI

lnstructiunea vida .. Instructiunea expresie

Excrcitii .

Instructiunea compusa

Instructiunea if .

Excrcitii .

Functia standard exit .

Exercitii .

Instructiunea while . Exercitii .... Instructiunea lor . .

Exercitii .

Instructiunea do-while

Exercitii .

Instructiunea continue

Func\iiic standard sscanf si sprintf .

Exercitii .

Instructiunea break .

Exercitii .

Instructiunea switch

Exercitii .

Instructiunea goto . . .

Programarea procedurala, functii, apelul si revcnirea din ele

Exercitii .

Apel prin valoare si ape! prin referinta

Exercitii .

CLASE DE MEMORIE ...

Variabile globale .

Variabile locale .

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

Exercitii .....

INITIALIZARE . . . . . . . . Initiaiizarea variabilelor simple

Exercitii .

Initializarea tablourilor , . . . .

112 112

113 114 114 115 116 117 118 124 125 126 127 144 147 150 151 155 156 157 159 159 162 164 166 168 172 179 181

197 197 199 202 202 203 204

'. -

211 211 212 213

5

8.5. 8.6. 8.6.1. 8.6.2. 8.6.3. 8.6.4.

8.7. 8.8.

8.9.

8.10.

8.1 1.

8.12.

9.

6

Exercitii

........

. . . . . .

......

7.

PROGRAMAREA MODULARA

Exercitii .

III ......

8. 8.1. 8.2.

POINTERI ...

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

Exercitii ..

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

Util!za~ea tabl~u~iio~ cie'p~i~t~;i ia 'p;eiu~rfrri de' d~t~ .

de tIP sir de caractere

Exercitii .. . .....

Tratar.~~ para~etriio'r ~li~ iil~il; (ie'c~l~a~1da'

Exercin] .

Pointeri spre funetii

Exercitii .

TabIouri de pointer]

Exercitii .

8.3. 8.4. 8.4.1. 8.4.2. 8.4.3. 8.4.4.

RECURSIVITA TE

Exercip] .

III '" .. "

. . .. .

217

PREFATA

225 226

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;

• construirii de biblioteci de module extensibile;

.. implcmentarii simple a interacriunilor programelor cu mediul de calcul prin utilizarea unor clemente standardizate.

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 definite operatiile care pot utiliza cornponcntele lui.

Simula sc considers ell se alb In baza lirnbajclor 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<1 cum 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

235 237

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

282 283 286 287 289 291 294 298

3(H 304

1

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 cornpatibile IBM PC in rnai multc variantc, Celc rnai importantc implcmentari ale limbajului C++ pe accstc calculatoarc sint celc rcalizatc de firmclc Microsoft si Borland. Accstc firrne au implementat limbajul C++ pe microcalculatoarele rcspective in mai multe vcrsiuni,

in cnrtca de fill{1 sc prczinta Iacilitatile de bazu ale limbajului C++ care sint COI11Ul1e diferitclor implemcntari 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.

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

Dcsprc limbajul 0 sc spline ca incearca sit imbine Iacilitatilc de nivcl malt Cll eele ale programarii sistem.

o al«j cxtensie a lui C++ estc limbajul Avalon/C++. Ea a Ii.lst realizaUl de

8

Detlefs D., Herlihy M. si Wing J. Accst limbaj este destinat pentru a suporta calcul distribuit,

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, intcrfatii urilizator se numeste interfatd utilizator graficd.

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.

INTRODUCERE

AUlOI'II!

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<1 tipurilc 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 ~i progrnmnrea oriental a spre obicctc,

Faciliratilc principalc ale limbajului C sint: portabilitatea mare ,I programclor;

flexibilitntca ill prngramarc;

programc compactc;

lucrul pe biti;

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.

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

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.

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 ~i dccrcmcntarc 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 ~i timpul de cxccutic,

Limbajul C sc considera ca cstc un intcrrncdiar intre limbajele de nivcl inalt si celc de asamblarc . .1::1 a 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 corcspunzator sc tastcaza:

- tc;

<AIt>-F~

N.

• sc editcaza programul sursa folosind editorul mcdiului TURBO C;

• se actioncaza tasta F2;

• se indica numclc fisicrului pcntru salvarca programului sursa pc disc;

• sc rcalizcaza compilarca, link-cditarca ~I lansarca in cxccutic a progrumului tastind:

<Ctrl>-F9

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 ~i celelalte lirnbaje precedente lor siut adecvate programdrii procedurale.

Programarca procedurala este un model de progpmare utilizat frecvent lnca din Iaza initiala de existcn\li a limbajclor de programarc.

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 fi privita ca 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 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 cxista 0 definitic riguroasa pentru notiunea de modul, citindu-I pe Bjarne

.. pcnuu a vizualiza rczultarclc cxccuiici programului sc tastcaza:

<Alt>-FS

• sc rcvinc in Icrcusua de cditurc a mcdiului actionind 0 (astil oarccarc.

Tasta F I ponte Ii actionata pcntru a obtine infonuatii suplimcntarc. Sc rcvine in !;Iza prcccdcnUI <lqiollind (asta ESC.

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 ~i prin 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'rllgralllarc,1 modulara COI'l'SplIllde mui binc idcii amintite mai SIIS ell privirc !a dcsc~!11pllnerea problcmclor complcxc 111 subprobkme 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 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. .

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

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

~i

una care sa scoata 0 data din stiva (procedure care de obicei se numeste

pop). .

De obicei, la aceste prcceduri se mai adauga 0 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 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

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.

o 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

16

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

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 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 ~i anurne conceptul persoana si conceptul de conducdtor. .

Conccptul de persoana se modclcaza printr-o clasa care confine datele unci

pcrsoanc:

nume;

- cod.

- prenul11e; data nasterii; localitate;

- domiciliu; profesiune; studii;

stare civila; numar copn; incadrare;

vechime in munca; - salarizare;

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 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 ~i pcntru 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 de m()~tL'nire care distantcaza substantial stilul progrumnrii orientale sprc ohiccic de eel nl 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 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

,

!

I

I

i

,

Nivclul unu.uor Ii (,()IISllllIic 11Iogl;lllIalc<I miCIII;II<I xprc ohicctc, Accst sli! de programarc, pe I inga 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 de date, prccum ~i icrarhizarca lor prin folosirea conceptului de mostcnirc.

I'wgr'lIl1<1r\.';1 UII\.'llt;lta sprc ollll'l~k implica ~i altc i'acilita\i care msa 1111 sinl 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; Limbajul C I + - vulumul 2;

Limbajclc C ~i CI+ 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 (>i programe simple care permit 0 mai buna intclcgcre $i Iixarc a clcmcntclor Jimbajului C.

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

Ahordnrcu programclor din volumcle 3 ~i 4 este posibilu numai dupa insusirea tcmcinica a cunostintelor ~i facilitatilor limbajelor C ~i C++ prezcntate in primele doua volume all' cartii.

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:

-- tipuri abstractc de date;

- mostcnire;

supraincarcarca operatorilor etc.

Majoritatca problcmclor de accst fcl sint orientate sprc caleule stiintifice, ea de exemplu:

- rezolvari de ecuatii;

- sistcmc de ecuutii liniurc;

problemc de optimizari ctc.

In schimb, aplicatiile de sistcm $i de grafica se abordeaza utilizind facilitatile 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.

Partea a 2-a contine: tipul utilizator; liste;

- arbori;

- tabele;

sortarc;

- preprocesare; 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. 111 urma 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 I

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 pe cit posibil scopul alcgerii lui sau a darci pc care 0 rcprczinta.

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 Dimensiune Modul de reprezentare I
tipului ill hiti
------_. .... _---
long 32 idem
unsigned 16 intrcg fara scmn
unsigned long 32 idem
char 8 codul ASCII al caracterului
.. -"-"---_'_ ----------- ._.,----_--. ------
float 32 reprczcntarc flotanta iii
simpla precizie
-- ".-~--. ------- .. -----""._"
double 64 rcprczcntarc flotanta in
dubla prccizic
long double 80 reprczcntarc flotanta in
dubla prccizic Exemple:

prodSeal sau ProdSeal - pcntru prod LIS scalar;

prodMat sau ProdMat - pcntru produsul a doua matricc,

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 cuvinte cheie.

Cuvintcle chcie se scriu cu litere mici, Deci cuvintcle chcie sint nume cu destinatii specialc,

Excmple:

if

while for break class ctc.

Datcle de tip caracter pot fi specificate prin: unsigned char

sal!

signed char

Sensu] cuvinte!or chcic va f explicat pc masuru cc sc VOl' descrie constructiile in carc cle apar,

in primul caz, data se presupune ca cste un lntreg in intervalul [0,255] (intreg fara sernn).

In eel de al doilea caz, data se presllpune 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,

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

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

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

I tipului I 111 1)1(1

----------

Speciflcarea tipului Intervalul de valori
int [-32768,32767]
short r -32768,32767J
long [-2147483648,2 1 47483647J int

inlrcg rcprczcntat prin complement fll\ii de doi

16

short

16

idem

24

25

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.

Specificarca tipului Intervalul de valnrl
_ .. _-
unsigned [0,65535J
unsigned long [0,4294967295]
1------
unsigned char [0,255]
signed char [-128,127]
t----
float valoarea absoluta a unci date difcritc d
apartine intcrvalului
[3,4 * I 0**( -38);3,4*10**(38)]
double valoarca absolura a unci date difcritc (I
apartinc intcrvalului
[1,7* I 0**( -308); 1 ,7*10"(308)]
long double valoarca absoluta a unci datc difcritc (
apartinc intcrvalului
[3,4*10* *( -4932); 1,1*' 0'*(4932)1 1.4. Structura unei functli

o functie are urmatoarea structura:

tip numetlista declaratiilor parametrilorformali) I

declaratii instructiuni

(continuare}

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:

c zcro

void/{void) I

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:

lc zero

1.

lc zero

Functiarnu are pnrarnctri. Ea nu rcturncaza nici 0 valoarc In rcvenirca din ca.

2.

void/O {

3.

Format identic cu eel din exernplul precedent. int gO

(

4.

Funcria g nu are pararnetri. La rcvenirea din ea se retumeaza 0 valoarc intreaga de tip int.

double It(void)

{

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 II nu arc pararnetri. La rcvcnirca din ea sc rcrurncaza 0 valoare flotanta in dubla precizie.

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

Observarii:

1.

Initial antctul unci functii a avut urrnatorul format: 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 crori ~i de accca sc rccomanda cu tipul sil tic totdcauua prczcut in antctul unci Iunctii, in cazul limbajului 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 cornpuuc dintr-un l1UJ11e sau 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 ~i in limbajul C++, dar compilatorul C++ rernarca printr-un avcrtisrnent ca aces! format cstc invcchit.

De ascmcnca, .uuintim ca cdc doua formate pot fi Iolositc imprcuna, adieu

lX

2.

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

Pentru 1I.111e\ia principal a se pot utiliza antetele:

int main ()

int roain(void) void main() void main(void)

ma i.n l ) main(void)

Prime le doua antete presupun ca functia main returneaza 0 valoare intreaga la revcnirea din ea in sisternul de operare,

Adesea se obisuuicste utilizarea formatului lara tip:

malnf)

Amintim ca functia main poate aveasi parametri. 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,

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 adrnis in setul de caraetere al limbajului, Evident, in interiorul unui cornentariu nu se va folosi succesiunea

*1

care termina lin cornentariu.

In limbajul C++ s-a mai introdus 0 conventie pentru a insera cornentarii, Astfel, in C++ un comentariu poate in cepe prin succesiunea

II

Un astfel de cornentariu se termina pc acelasi rind (Ia sfirsitul lui) pc care se afla ;;i inccputul lui.

29

Cornentariile sin! explicatii pcntru programatori, Elc Ill! all nici lin cfcct 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,

care sa precizeze:

.. actiunea sau actiunile realizate de functie;

'" formate Ie datelor de intrare $1 iesire;

• algoritmii codificati prin functia respectiva daca sint complccsi;

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

astfcl de constnnta sc rcprczinta pc 1(, hiti daca III I cstc mai marc dccit (,5515 ~i pe 32 de biti in caz contrar. in cazul in care dorim ca 0 constanta intrcaga ('art\ semn mai mid) decit 65536 sa se reprezinte pc 32 de biti, constanta respective sc va termina prin una din urrnatoarclc succcsiuni de litcrc:

III In 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

constants inrrcaga de tip unsigned rcprczcntara pc !6 hili

1.6. Constants

40000U

idem

4294967295

consranta intrcaga de tip unsigned rcprczcntara pc 32 de bi!i

o constanta 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.

400001\1

idem

40000\11

idem

1.6.1. Constanta tntreql

400()OLU

idem

40000UL

idem

Constantele intregi pot fi scrise in sistemul de numeratie cu baza 8, 10 sau 16. o 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.

Exemple:

o constanui octald intreaga cste 0 succesiune de cifre octalc (0 - 7) prcceduta 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

Ox

I Repre~entare externa

Reprezentare lnterna in binar

sall

{lV VL~.

In rest, ca arc accleasi proprietari ca 0i 0 constunta octala.

Cifrcle hcxazccimalc sc obtin cxtinzind cifrclc zccimale ell liicrelc mici san mari de In A In F:

12345 123456789 12345L

0011000000J J JOO! OOOOOIIIOIOIIOIIIIOOII010()OIOI01 OOOOO()O()()OOOOOOOOOI IO()(){)OOI 11001

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

30

31

Litera care rcprcztnt a {} cirri. hcxazccimalu

Vuluar e

It) II 12 I.l 1,\

15

:\ '[tll/\ b sau H c sau C d ,[1\.1 D

c snu " r s.tu F

Excmple:

OXABCFL

1(, bili Ii, bili 32 bit: 16 biti

idem 32 bili 32 biti

Cunstunrn

Tipul cunstuntci LII I1gilll I'" rcprczcntarf

consLlllfa I.l'Cilllalil de lip ill' constunta octal. de tip /lnsigned coustuuta zccirnala de tip IOllg constanta octala de tip unsigned

In 012} 4()OOO 040000 () 123456 123L 01231

idem

consranta zccimala dc tip long constanta octala tic tip unsigned long

constanta hcxazccirnala tic lip unsigned

constanta hcxazccimala de tip /(Jug unsigned

consuutta hcxazccimala de tip UNsigned

Oxl23

Oxa Ib2c3

1.6.2. Constante flotante

16 biti

32 hili

32 bili

o constantd flotantd rcprczinta un numar rational. Ea se cornpune din: o parte intreaga care poate f ~i vida;

- 0 parte fractionara care poate fi si vida; un exponent care poate f si vid.

Evident, nu pot fi vide toate partilc indicate mai sus. La scrierea unci constante flotantc estc ncccsar sa fie prezcnta fie partea fractionara, fie cxponcntul precedat de parte a intrcaga.

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

\

I t

!<

1

32

a**b

ISxCl1Ip!C:

123

123,7

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

Cuns(anla 11"1:1111,,

Vuluare

123. 12.u .25 7Kc4 .11:-3

1 23.456c2 12H567c-'1

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 COI1SlanUl flotanta tcrrninata prin I sau L se rcprczinta pc 80 de biti ;;i are tipullo/lg double.

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:

caractere negra/ice

spatiu

- Codul lor cste in intcrvalul [0,31]la care se adauga si codul 127 (caracterul DEL).

- Are codul 32.

caractere grafice - Codullor cste in intcrvalul [33,126).

Caractercle graficc impreuna Cll spatiul formeaza setul de caractere imprimabile.

o constanta caracter arc ca valoare codul ASCII al caractcrului pe care-l reprczinta. Ea are tipul int.

o constanta caractcr corespunzatoare unui caracter irnprimabil sc rcprczinta prin caracterul rcspectiv inclus intre caractere apostrof.

Exemple:

Constanta caructer Valoare

~-----------I-------------j

97 65

'a'

'A'

33

(continuare)

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

La aceste noratii aciiHlg<lm ~i utilizarilc sccvcnrci escape pcntru a l"l'prCZl'nta caractcrele backslash, apostrof si ghilimelc:

'I'"~ '\" 'II'

Constanta curacter

Valoare

Constanta curactcr

COIIIII ASCII

DCllllmirca caructerului

'0'

48 32 42

.-------- 1····-·-----1·-····-··· ··········----1

'.'

ghilimclc apostrof buckslash

o exceptie de la regula de mai sus 0 reprezinta caracterclc apostrof $i bam oblica inversa (backslashy. Astfel, caracterul backs/ash se reprezinta prin doua caractere backs lash incluse intre caract ere apostrof:

'\\'

La reprezentarea caracrerului apostrof se utilizeaza caracterul backs lash urmat de un caracter apostrof:

\'

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:

De aceea, constanta caracter apostrof se ponte rcprezenta prin:

d

- Este 0 cifra octala.

- Rcprczinta constantn caractcr corcspunzarourc codului

ASCII cgal cu valoarca intrcgului octal ddd,

'\If

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

\t

Deci

Exemple: '\n' ~i '\7'

Rcprczintn acccusi constanta caructcr corcspunzntoarc caractcrului BEL.

- Rcprczinra constanta caractcr corcspunz.uoarc caractcrului backspace eX din sistcmut zccimal ,c' rcprL'zillta prin nurnarul lOin sistcmul CLI baza opt).

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

\b' Si \10'

'\t'

dcfineste constanta caracter tabulator orizontal.Ea arc valoarea 9,

In mod analog, constanta caractcr rind nou (1IL'\vliIlC) sc rcprczinta prin: '\n'

Rcprezinta constnnta caracter care corcspundc caractcrului ghilimclc.

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

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.

'\"' ~i '\42'

c",,';," \ - Cudul Denumlrcn

curacter ASCII cnructerului

-- -----f------------j--.-----------------.-.

'la' 7 BEL

'\b' 8 13S

V 9 lIT

'In' 10 LF

'Iv' II VT

V 12 ff

Utiliznrc

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

activate sunct

rcvcnirc ell till spat in (nal'l(SIHj{~[') tabulator orizolltal

rind nou (Line Feed)

tabulator vertical

salt de pagina la imprimanta (Form Feed)

rctur de car - pozitioncaza cursorul ill coloana I din rindul curcnt (Carriage Return)

'\177'

'\r'

13

CR

34

fko;IITCC () C(lllstanl;IC;lJ'aclcr cstc de tip iI/I. ca sc pastrc:tZ:1 pc 16 hili, Pcntru COIIslalllcic c.u.rctcr 111;11 muri 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.

1.6.4. sn de caractere

() SIICl'L'SllInr Ik IL'iO S;1l1 Iliai multc car;ll'll'I'e iuclusc iutrc ghilimclc I<JrI11eaZa 0 C()llstallt<l xir sau un sir de caractcrc.

La scricrca caractcrclor din cornpuncrca unui sir de caractere se pot utiliza sccvcntc esc;ljK',

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"

Lin :;;ir poale fi continuat pc rindul Ul'mCltor folosind caractcrul backslash. in accst scnp sc tasteaDI back slush la sfir:;;itul rindului care sc continua, sc trccc pe rindul urrnator (uctionind tustn Enter) ~i SL' continua cu tastarca caracterclor suului rcspccriv.

Curactcrul care precede pe backslash sc va concatcna cu pril11111 caructcr de pe nndul urmaior.

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

1, deoarcce sirul se terrnina totdeauna prin caracterul NUL Observatii:

L Fie sirul

"a\lb"

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"

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"

Sirul de caractere

2,

"\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"

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

Aceasta, deoarece un sir de caractere totdeauna se termina la aparitia caracterului NUL.

1.7. Caractere sau spatii albe (white spaces)

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

spatiu (' ');

- tabulator orizontal ('\t');

caracterul de rind nou (newline) ('\n').

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 ]

primul clement al doilca clement

1.8. Variablle simple, tablouri ~i structuri

vcct[9]

ultimul clement

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 clcmcntclc prunci linii

mat] I HOI mati I II II clcmcntclc cclci de a doua linii

mat[2J[01m<lI[2H II clcmcntclc cclci de a Ircia Iinii

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 reprezinta 0 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.

o matrice de clemente intregi este un exernplu de tab lou bidimensional de lip intreg,

Referirea la elementele unui tablou se face printr-o variabild cu indici.

o variabila cu indici se compune din numele tabloului urmat de valorile indicilor, fiecare indice fiind reprezentat printr-o expresie inclusa intre paranteze patrate,

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.

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 ~i tipul ci.

38

39

in general, prin trp iniclcgcm o multimc de date unprcuna ell opcrutiilc care pot 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 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 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 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.

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. Us!u_dc_lIl/11/c se compunc dintr-un numc de variabila sunpla sal! mai multc separate prin virgule.

Exemple:

1.

int i,j;

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

40

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

2. char c;

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;

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:

- 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

Limitele limi (i= 1 ,2, .. .,») sin! expresii constante. Prin expresie constanta intelegcm 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.

lip

lim i

Exemple:

I.

int vect[lO];

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,

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

(' - de lip /llIsiglli'd

La !'clUlllca!.:! 0 valoarc til' lip rlouhlc.

o funciic ponte fi apclata folosind 0 constructic de forma: 1111me(1 ista .Pt! ret metri IOJ'_.c/i'ct i vi)

undc:

2.

char tab(lOO];

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

3. double dmatllOJ [50J;

Tabloul dmat este un tablou bidimensional de tip double. El rcprezinra 0 rnatrice de 10 linii a 50 de coloane fiecare. Cornpilatorul rczerva pcntru 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]

- Estc nurnclc Iunctici care se apclcaza.

- Esic lie vida daca lunctia IlU arc paramcrri, lie sc cornpunc

din unul sau mai multi paramctri «[ectivi scparati prin virgule.

Un paramctru clcctiv cstc 0 cxprcsic.

- Puramctri cfectivi sc corcspund cu cci Iormali prin ordinc ~i lip.

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.

o 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:

IlIllJ1C

lis/a

parametrilor ('(eeti)'i

dmat[9HO] dmat[9][ l ] ... dmat[9][49]

dmat are ca valoarc adrcsa elcrncntului dmat[O]fO].

1.11. Apelui ~i prototipui functiilor

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

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 antcrul: void f(illt xllOOj)

Exemple:

I.

int flint x,double y) Functiajare doi parametri:

X de tip in!

~l

Mcurion.uu en, I imit» supcrio.iru 1(1) JloalL' fi olllis,l la dl'l:lar;lrl':1 paral1lClrll· lui Iunual .I, dar Ill! !;>I pal':llllezclc p.uratc. Ikcl ilCel'a~1 Iuncuc IHlalL' aVL'a unnatorul antct:

y de lip double.

Functia returncaza 0 valoarc de tip int .

2.

double df I long a, int b, unsigned c) Functia dj'are trei parametri:

void I(in: xl l)

in cazul paramctrilor Iormali care sin! tahlouri ell mai ruultc dimcnsiuni,

42

43

\ I

numai limita primului iudice ponte 1'i ornisa.

duuble II'd!:[·II[i I;

~i apclul

Let (rn'::1 t ) ;

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

o Iunctic ponte II apclata intr-un punct al unui fisicr sursa daca ill prcalabil a I(lst dcfinitu ill acclusi fisicr surs«.

Excmplu:

v() i d 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 ascmanator ell untctul ei. Accsta

rcprczinta 0 informauc pcutru cornpilator cu privire la:

• tipul vulorii rcturuatc de functic;

• 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 ::;i virgula. Exista si 0 forma prcscurtata pcntru prototip ~i anume accea in care se ornitc nurnclc paramctrilor:

iiI) 11lI1IIC! I is/a tipinilcn' para III ctriiorfornia li):

Excmple:

I. v o i d f (vo i d) ;

Prototipul de fa\~r indica faptul ea(cste 0 functie fara pararnetri ~i care nu rcturncaza nici 0 valoarc,

44

2.

double a(void);

Functia (/ nu are paramctri. Ea retumeaza 0 valoare flotanta in dubla

prccizie.

3.

void clint x,long y[) ,double z);

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.

V!lirl c(inl"., lonqll,r:1o(lbl,,);

Acest prototip cxprima acclasi lucru CU eel precedent.

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~1 gaseasca prototipurile functiilor de biblioteca. in aces! scop se procedcaza astfel:

• se tasteaza numele functiei pentru care se doreste sa se gaseasca informatii;

• se fixcaza cursorul pe 0 litera arbitrara a I1UI11l!lui Iunctiei;

• se tasteaza <CTRL>-Fl.

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.

1.12. Preprocesare

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:

45

.. includeri de fisiere cu texte sursa;

.. definitii si apeluri de macrouri;

.. cornpilare conditionata.

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 alte facilitati oferite de preprocesarc,

prototipurilc pcntru () serie de functii cc rcalizc;ml opcr,qii de intrarc/icsirc. EI sc include Iolosind consrructia:

Ilinclude <sLdio.h>

Exemple:

I. .include ·fi31.cpp·

Sc include tcxtul fisicrului lis lcpp ana! in dircctorul curcnt.

1.12.1. lncluderi de fisiere cu texte sursa

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

in accst cxcmplu 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.

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.

Un fisier cu text sursa poate fi inclus eu ajutorul constructiei #include.

Aceasta constructie arc until din urrnatoarelc formate:

#include "specificator _de _ji"ier"

sau

#include <specificator _de _ji.~·ier> undc:

1.12.2. Substituiri de succeslunl de caractere la preprocesare

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

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 contine ~i 0 "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

specificator _ de _ji,~ier

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

IIdtf1ut' 1111111(' sucicsiutu- dc cunntcn:

undc:

III/III{'

Fslc prcccdat ~i unn.u de eel pupn lin spalill.

lolosind <lcc;!sta constructic, prcproccsarc.: substit uic 1111111(' ell .\'11('('('.1'/- 1/Il(,_dc_caraCII'I'C peste lot in tcxtul sursu care urrncaza constructici #deCll1e respective, cxccptind cazul cind 1111111(' aparL~ intr-un sir de carnctcrc S~\\I intr-un 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'1 pcutru a sco.uc 111 L'vidcn\:1 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 :1 dcfini 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:

46

47

#under 1/11/11(,

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.

Excmple:

I,

'Idef:;ne A 100

I~ !\ sc suhstituc prin jOn inccpind din accst PUilcl al fisicrului sursa *!

Hdef ine FI\CT 20

Udefine DIMI1AX (A'FACTI

char tabIDnl~lAXJ;

double matlA) [FACTI;

Dupa prcproccsurc sc obtiu dcclaraiiilc:

char r.a b ] (10()*20) J;

double matllOO] [20J;

DIMMAX s-a substituit prin (I 00*20) ~;i llU 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 A 123 "define B A+120

x > 3 * 13; II sc substituc prin x=J *12,\+ 120:

3. IideEine A 123 "define B (A+120)

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

4.

Ifdefine A 100

i n t, x [A+ 1J; II dcclaratia devine int x] l 00+ 1];

Ilundef A

Ifde fine A 3, 5

4P>

doubI.o y;

y=A; II instructiunca devine y='3.5;

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, B dcfincste 0 cxpresic constanta, care cste evaluata de cornpilator la intilnirca

el.

Constantclc simbolicc sc utilizeaza frecvent in locul constantelor obisnuite deoarece ele prezinta urmatoarele avantaje:

.. Permite sa se atribuie nume sugestivc unor eonstante. Este I11Ult mai sugestiv sa folosim constanta simbolica PI definita prin:

#definc PI 3.14159

decit valoarea ei.

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

49

2. INTRARI/IESIRI STANDARD

.

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;

Prin intrari/ieslri iutclegcm un set de operarii care permit schimbul de date intre un program ~i un 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 ~i scan];

- pentru iesiri: putch, puts ~i print/

La acestca mai adaugarn macrourile: getchar pcntru intrari;

se utilizcaza in cazul in care dorim sa vizualizarn Icrcastra uulizator s: sa blocam programul pentru a analiza conrinutul curcnt al ecranului. Pcntru a dcbloca prograrnul 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.

2.2. Functia putch

FUIlqiaplltc/t aji~caz;"t un caractcr pc ccranul tcrminalului standard. Ea arc un parametru care detcrrninn imagines afi~ata la terminal.

Functia putch poatc Ii apclata ustlc]:

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:

2.1 Sa sc scric un program care citcsic un carnctcr iruprimahil si-I ali~eaza apoi pc ccran.

;;1

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 ~i gctclie sint dcpcndcnte de implemcntare, Mai jos indicarn utilizarile lor sub mediile de programare Turbo C ~i Turbo 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.

Caractcrul rcspcctiv sc citcstc lolosind upclul: getch ( )

La rcvcnirca din gelch() sc rciurncaza codul ASCII al carucrcrului lasta!.

50

'il

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;

in accst cal, pararnctrul cfcctiv cstc 0 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 unci cxprcsi i.

Mcntionam ca Iuncti» gefcll rcturncnza vulourca 13 (CR) la citirca car;lclcruilii r<:l.lIil;!l din actiunnrca lasll'i ;':11/<'/'.

PROGRAMUL 8111

Nirlclude <conio.ll>

Ill" in (I ;* circstc lara ccou un caractcr inrpruunhi] ASC[I ,j·i afiscaza pc ccran =] I

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

Obxervarii:

I. Programul cstc incfcctiv daca sc aciioncaza 0 tasta cc nu corcspundc cuructcrclor A SC II.

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

2.2 Sa sc scric un program care circstc fara ccou 1I11 caructcr imprimabil ASCII, :1 ali~ea/.a la terminal ;_;i apni trccc cursorul pc linin unnatoarc.

Programu I de I~l\~l cstc 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 8112

Ii .i II(_' J u~.l(_' <; C,}!} i \) . I}'>

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

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

)

52

2.3 Programul BIB realizeaza acelasi lucru ca si programul BIl2, ell deosebirea ca inaintc de a se termini! cxccutia lui, sc afiseaza fcrcastra utilizator ~i se

asteapta actionarea unci taste.

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' ) ; gei::ch() ;

}

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 fisier sc l1Ull1eSC inregistrdri.ii: mod frecvent fisicrele 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 sfirsitul de fisier; _ Accasta inregistrare se .rcalizcaza la tastatura prin secvente spccialc, in cazul limbajclor Turbo C si Turbo C++, sfirsitul de fisicr sc obtine tastind:

<CTRL>-Z

al carui ecou este: I\Z

53

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 ~i Turbo C++, ea arc valoarca -I.

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 de rnai jos:

putchar(expresie);

Valoarea expresiei reprezinta codul ASCII al caracterului care sc afiseaza.

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.

2. Macroul getchar returneaza valoarea 10 (newline) la citirea caracterului corespunzator actionarii tastei Enter.

3. Apelul

. putchar(lO);

sau echivalentul sau

Ohscrv.uic:

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 cxccutia in mod automat $i se rcvine din getchar ell valoarea 10 (valoarea corespunzatoarc rastei Enter).

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\a de consianra simholica NUU. dcfinit., in fisicru]

stdio.h. .

Caracicrul /It'II'Ii/l(', cal'e tcrminn rindul, nu se pastre:tz.l in mcmorie. in locul lui se pasrrcazu caractcrul NUL ('\0'). In Iclul accsra, caractcre!c cititc prin gels formcaza un sir de caractcrc in conformitatc cu ccrintclc limbajclor C ~i C++

(sccvcnta de caractcrc sc tcrrnina prin caracrcrul NUL). .

Din cclc de mai sus rczulra ca daca tith cstc dcclarnt prin:

putchar{ '\n') i

are ca efect treeerea cursorului in coloana lI11U de pe linin urrnatoare.

Exercttti:

2.4 Sa se scrie un program care citcstc un came tel' folosind macron I gctchar, il afiseaza folosind macroul putchar, trcce cursorul in coloana unu din linin urmatoare si apoi afiseaza fereastra utilizator ptna la actionarca unci taste.

Acest exercitiu este analog Cll 2.3. In acest caz sc cere schimburea Iunctiilor getch fjiputch cu macrourile getchar (>i respectiv putchar.

PROGRAMUL 8114

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

main () 1* - citeste un caractcr folosind gctchar; - afiscaza caracterul folosind putchar;

- trcce cursorul la inccputul rindului urmator;

~ blochcaza programul pina la tastarea unui caractcr *!

char tab{2551;

atunci apclul:

qets (tab) ;

putchar(getchar()) ; putchar ( , \n' ) ; getch() ;

}

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 (deei caractcrul NUL scinlocuicstc cu newline).

Functia arc ca puramctru adrcsu de inccput a zonci de mcmoric care coniine cuructcrclc de alisat.

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 lin sir de caractcre, atunci apclul

I

I

puts (Lall) ;

afiscaza In tcrrninalul standard sind rcspcctiv de caractcre si apoi trccc cursorul ill colouna intii de pc rindul unuutor.

Fuuctiilc gelS ~i pills 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.

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.

i

r

I

I

PROGRAMUl 8115

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

main () t«: citcstc numclc si prcnumclc unci pcrsoanc tustatc pe doua linii separate; atiscaza pc un rind initialclc urrnatc de punct;

~ afiscaza fcrcastra utilizator. */

char nume[255] i 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

56

2.6 Sa SC modificc programul precedent asa incit dupa afisarea initialclor sa se afisczc tcxtul:

Pcnlru a termina actionati 0 (asta

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");

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.

PROGRAMUL 8116

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

ma in () /*. 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 nume[2.S51; char prenume[2S5j;

gets (nume) ;

gets (p.r enumo ) ; putchar(nume[O)) ;

pu tebar: ( , . ' ) ; putchar(prenume[O]) ; putchar('.') ;

puts ( " \nPentru a te.rmina progr:amul actionati \ o tasta");

gel:ch ();

)

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

- Este un sir de caractere care defineste textele $i formatele datclor care se scriu;

57

par l.par2 ..... pam - Sint expresii. Valorilc lor sc scriu conform spccificatorilor de format prezenti in paramctrul de control.

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 parametrilor

pari. par2 .... parn din format intern in format extern.

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 2.6.:

puts("\nPentru a termina programul actionati 0 tasta");

ponte Ii inlocuit printr-un apcl al (uucrici print] care coniine numni parametrul de control fara spccificatori de format:

printf("\nPentru a termina programul actionati 0 tasta\n");

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.

S8

1111 sir de cijr« - Care ddinc01c dirncnsiuuca minima a cimpului III care sc zccimale optional 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 sc complctcaza cu caracrerc ncscmnificativc; implicit, caracrcrclc ncscmuiflcativc sint spatii, Caractcrclc ncsemnificative VOl' f zerouri daca numarul cc indica dirnensiunea minima a cimpului iucepe cu un zero ncscmnificativ (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).

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.

lin punct optional. urmat de 1111 sir de cifrc zccimal«

11/ iii sa 1/ doua literc

Din cell' de mai SIlS, rl'/ltlta ca 1111 spcci Iic.uor de format lIll:cpe CII IIIl caractcr proccnt ~i sc tenniua Cll o litera.

lntrc caractcrul proccut si litera care sfirscstc un spccificator de format 111 a 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:

- Care dcfincsc tipul de couvcrxic aplicat datci care sc scric.

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 cc urrncaza vom indica principalc!c couvcrsii rcalizaic prin spccificatorii de format. Elc sint definite de literelc de la sfirsirul spccificatorului de format.

I

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.

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 de apcluri: putchar(getchar(1 I;

SC poat..: r..:alizil ti)losind l"uIIC\i;I/,,.illftasttl:l: printf("%c",getchar(1 I;

2.

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

sc poarc inlocui prin:

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

3.

Apclul lui prill//'pcntru a ari!ia un !iir de caractcrc: pr lilt [ (""he" I;

sc ponte scric folosind spccificatorul de format pcntru siruri de caractcrc:

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

in ambclc cazuri, cornpilatorul pastrcaza sirul de caracterc "abc" intr-o zona spcciala prevazuta pentru acest rapt ~i apelcaza functia printf folosind ca paramctru adrcsa de inceput a accstci zone de memoric.

Fie apclul lui print]:

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

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*

4.

5.

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

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.

Fie apclul:

p r in t I: ( " ''1,10 s * " , "a be" I ;

6()

59 afiscaza: * abc*

7.

Apclul: printf("*%-10s*", afiscaza:

Ha,bc") ;

*abc

*

8.

Apclul:

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

*

limbajul C*

2.5.3. Litera d

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 foloseste pcntru a afisa, in zccimal, 0 data de tip int.

2. Apclul: printf("*%lOd*",1231; afiseaza:

* 123*

3. Apelul:

printf("*%-lOd*",1231; afiseaza:

* 123 *

4, Apelul:

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

*0000000123*

2.5.4. Litera 0

'. -

DateJe de tip int sau unsigned pot fi convertite si afisate in octal folosind un specificator 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,

Partca intrcaga cstc un sir de cifre zccimalc care csre prccedat de sernnul minus daca numarul estc negativ,

Numarul zccirnalelor sc dcfincstc de precizia indicata in spccificarorul de format. Daca ca estc abscnta, atunci se afiscaza 6 zccirnale. Ultima citra afisata este rorunjita. Rotunjirca se face prin adaus daca prima cifra neglijata este eel putin egala eu 5 si prin lipsa in caz contrar.

- "

Exemplu:

Apelul: printf('*%10o*",123) ;

afiseaza:

* 173*

Exemple:

2.5.5. Llterele X ~i X

123.672

3.14159265 123.672 3.14159265

Afisare

Valoarcu dntui

Specificntnr

%51' 3.141593

%71' 123.672000

'Yo7.2f 1~,.·1.47 I

%10.11' -", I

·123.672 %1'0.11' ·123.7

_t2134_.~_;~_26_5 . ._ .. _ .. ~.:.~J::: ... __ ... _. . __ .. _ ... !3U

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

afiseaza:

* 7b*

In cazul in care se foloseste litera mare X, cifrele hexa peste 9 se afiseaza ell Iitere mario

2.5.9. Literele e ~i E

Aceste literc permit convcrsia datclor flotante de tip float sau double spre formatele:

parte ]n treagd.parte _ji'C1C( iona rCI exponen t

sau

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 zccimalclor a fisutc cstc ega I Cll 6, U It i Ill" ci fra a ti~atil cstc rotunj i til 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 pcntru a ohtinc valoarca rcala a accstuiu.

Exemple:

2.5.6. Litera u

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

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.

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

123.672 123672 0.(,71 12.1.672

%.11'

1.236720c+02 1.2E+02 (,nOOOOF·(l1 11'+02

sau

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. De accca, pcntru datele de ncest tip nu sc rccomanda sil sc afisczc un 11l1111,U' rnai marc.de zccimalc, Datclc de lip douhl«: au (l prccizic de pina la IS zccimulc ~i dcci, in accst caz, putcm afisa pina lu 15··16 zccimulc. Afisarca unui numar mai mare de zccima!c nu are scns.

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'[1 exponent, cclo cu un 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<1 ell unul din formarcle prcccdcntc care asigura 0 atisarc cu un 1111Il1<lr minim de caracterc.

Exercitii:

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.

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 a continua"); getch(l;

)

2 [\ Sa se rnodificc programul din cxcrnplul precedent in asa fcl iucit caractcrul

64

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 proccnt;

- 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 a cont.inua"); getch() ;

)

2.9 Prograrnul de mai jos afiscaza textul "Limbajul C++", folosind urmatorii spccificatori de formal:

%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 8119

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

.define v "Limbajul c++"

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

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 a continua"); getch ();

)

Rczultatele executiei prograrnului BII9 sint: *Limbajul c++*

Limbajul c++, *Limbajul c++ *Lirnbajul C++* Lirnbajul c' *Lirnbajul C

Actionati 0 tasta pentru a continua

65

2.10 Sa se serie un program care citestc un caracter cu getcharss afiseaza eodul sau ASCII.

PROGRAMUL 8111-0

2.13 Sa sc scrie un program care afiscaza constantu 123456 n9 in zccimal, octal si hexazccimal.

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

PROGRAMUL 81113

main () 1* citcsrc un caractcr ell gctchar si afiscaza codul sau ASCll *1 (

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

printf("%d\n", getchar() );

#define V 123456789

puts ( "Actionati 0 tasta pentru a continua"); getch() ;

}

main () 1* afiscaza coustarua 123456789 in zccimal, octal si hcxnzccimnl *! [

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

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 ( ) ;

}

Amintim en pcntru a citi caractcrc care 1111 corcspund codului ASCII,se 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.

2.14 Programull3fl J 4 afiscaza constanta 123 cu di teriti spcci Iicatori dc format. PROGRAMUL BII14

PROGRAMUL BII11

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

#include <stdio.h> #include <conio.h> lidefine V 123

main ( 11* citcstc un caractcr care IlU apart inc codului ASCII si afiscazn codul caractcrului citit *1

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 a continua"); getch () ;

I

2.12 Sa se scrie un program care afiscaza constanta 12345 in zccimal, octal ~i hexazecimal,

Rezultatcle cxccuiici programului sint:

PROGRAMUL 81112

*123*

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

Actionati 0 tasta pentru a continua

Dihclude <stdio.h> Dinclude cconio.h>

#define V 12345

main () ;* afiscaza intrcgul 12345 in zccimal, octal si hcxazccirnal *1 {

2.15 Programul 131115 afiscaza numcrc ncintrcui folosind dif(>riti slwt'ili('al<wi ti,>

'- • '-} - _- -_ ••.. - .• ;- '--f- _-_', - _-_._._ -." ---

format.

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 BII15

'include <stdio.h> ftinclude <conio.h>

66

67

H0efine A 47.389

II l If l i I 'II ~ X ! )'.1. .;~ 0

J.'t i.IILL ("!\··.·I.f\n", ,\); pr_intt("/\:~(t,.3f\n", ll)i rn: i n t f ( oj A::; '1~ . 2 f \ n" 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\", X) i

[) r i n t f ( " x·_:: 'I, . ~~ ~.-' \ n " I X);

p r i n t; L (" ?~~;';'?i. .l o v n " I X); 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);

Rczultatclc cxccutici programului sint: [\,,47.389000

A;47.389

/\,,17 . :3

II '4,/ . '1

!\'.i~ ii'/,

Xc . L :;()()0",·,2

/>=,·1. ;~350(~+22

;.:, l . ~! J r) j.'~ ~ :1,

'/. L. 24f:!+)2 Xc·-l.2e·'2

A=47.389 X= 1.23SE+22 1 )'iOOOO

~I. ijn()OOf"' f· no

1.25

0.250000 . 50()OOOe-Ol u. :lS .300000 .230000e+01 12.3 '.1 :.:3000 .OOO()UCI 1.230000e+OS 123000

I 5678)]43657891214000e+02

;. 1 ,11 ') ~l:) (;'i\ ',H 'li 'J3::;i OOOOOOOilO 11()()Il'" on

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:

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

- Este un sir de caractere care defineste formate le date lor ;;i a evcntualclor textc aflate la intrarea de la tastarura.

par l.purl, ... .parn - Sint adrcsclc zonelor in care se pastreaza datele citite dupa ce au lost convertite din formatele lor externe in formate interne corespunzatoare,

Caracterele albe din compunerea parametrului control sint neglijate. Restul caracterelor, care nu fac parte dintr-un specificator de format, trebuie sa existe la intrare in pozitii corespunzatoare. Acestea se folosesc in vedcrea efectuarii de controalc asupra datclor citite,

De excmplu, daca 0 data care se citcste se atribuie variabilei x, atunci data respectiva poate fi precedata de textul:

control

x=

In acest caz parametrul trebuie sa contina in pozitia corespunzatoare: x=specificatorul de format al datei care se citeste

Textele de la intrare pot fi precedate de caractere albe care se neglijeaza, 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.

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;

- un sir de cifre optional, care defincstc lungimea maxima a cimpului din care se citestc data sub controlul formatului respectiv.

Cimpul controlat de un specificator de format incepe eu primul caracter: - eurent care nu este alb si se termina:

a. fie la caractcrul dupa care urmcaza un earaeter alb;

b. ric ..Ia. caeactcnrl dtipiicare urrncaza un caracter care nu corespundc spccificatorului de format care controleaza accl cimp;

69

c. fie la caracterul prin care se ajungc la lungimca maxima a cimpului, indicata 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;

.. din neconcordanta dintre data din cimp si specificatorul 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

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

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

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

Apelul:

s can f { u (l5c II I &car) ;

citesre caracterul eurent din zona tampon Si pastreaza codul ASCII al accstuia in zona de mernoric alocata variubilci car.

Apelind in continuare tuncria printf:

p ri.n t f (lI!liCII, car) ;

se va afisa, la tcrminalul standard, caractcrul citit prin apelul de mui sus a lui scan],

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. 111 accst caz pnmmctrnl corcspuuzator spccificntorului de format poatc fi chiar nurncle accstui tablou.

Mcntionum ca dupa ultimul carnctcr citit sub controlul unui astfcl de spccific.uor de format sc p,btreazil in mod automat caractcrul NUL ('\0'),

Exemple:

1.

Fie tcxtul Limbajul C++

tastat pc lin acelasi rind la tcrminalul standard,

71

Daca tab l 0i tah l siut dcclarutc ca Illai jos: char tab1 (10 J;

char tab2(4);

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 ell I /1 dcoarccc dupa I urrncaza spatiu

I ,

I

SCall I; ( "9,s" , Lal>2); // sc cucsl c tcxtul: ell

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

I\cda~i lucru sc pnate reaiiza Iolusiud IIIl singur apcl a lui .I'('(//I( cu doi spccificatori de format:

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

Mcutionam ca sputiu! dintrc xpccificatorii de lonnat nu cstc cscntial, cl sc ncglijeaza. Dcci acelasi ape! ponte fi scris si sub forma

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

I )alt:k ritllC priu aCl':;!L' upcluri Sl' p:tslrl':t/.a III IlH~1l10nl~ priu coduri le lor ASCII ustlcl:

tabll0] >'V, tablll]->'i', tabl[2]->'rn', tilbll:lJ >'b', tabLI1)->'il', labl(5)->'j', tablI6)-->'u', tabl[7)-->'1', LClbl[8]-->'\O', tab2[O)->'c', tClb2[1]->'+', tab2[2j->'+', tab2(3)->'\O'.

Fie dcclaratiilc:

char tabl[lOJ;

char tab2 [10);

0i apclul:

scanf("'2s%9s",tabl,tab2);

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:

2.

ne

Accasta dcoarccc cimpul arc lunguuca maxima de 2 caractcre. El lncepe 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

spec! ficatoru! de format; .

AI doilca spccilicator de I(Hlllat asigura citirca in cominuarc, 111 accst 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 rnic deeil lUlIgilllea maxima admisn: 9.

72

ill concluzic, dupa apclul de mai SlIS, vom avcu: tab I [01 -> 'n'

tab 1 [I] -> 'e'

tabll2] -> '\0'

tab2[ 0 1 -> 'c'

tabzj l] -> 'U'

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

},

Spcciflcatorul

%ls

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,

o alta dcoscbiro din Ire eel doi spcci Iicalori consta ill accca ca, specilicalorlll 'Yo 1 s 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) ;

se modifica daca folosim spccificatorul % J 5, astfel: char car [2 J ;

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

2.6.3. Litera d

Speeificatorii terrninati pnn litera d permit citirca intregilor zecimali ~l conversia lor spre tipul int.

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

Cimpul din care sc citeste intrcgul se defineste COnf0l111 rcgulci generale indicate mai sus.

Exemple:

I. Fie dcclnmria

int ni

~i apclul

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;

si apelul:

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

Daca in zona de intrare se afla succesiunea de cifre

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;

si apelul

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

Daca, la intrarc, coustructiu curenta cstc

i23

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- tinuare functia scanfcu un alt specificator de format (de exemplu %s) sau macroul getchar.

4. Considerarn declaratia ;;1 ape luI lui scant' din exempIul precedent.

Daca la intrarc se afla constructia

23i

atunci se va citi intregul 23.

Cimpul incepe cu cifra 2 si se sfirseste cu cifra 3, deoarece dupa ea urmeaza 0 litera, adica un caracter care nu intra in compunerea intregilor zecimali.

La un nou apel a! fi\ncliei scanfse va incerca citirca Jiterei i. Dupa citirea intrcgului 23 se va reveni din scanfca valoarea 1.

74

2.6.4. Litera 0

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 X sau X

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 ~i cifra 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 care sc pasircza convcrtiti in binar ~i au tipullillsiglled.

2.6.7. Litera f

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.

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 SIC va couvcrti spre tipul long in loc de int.

Spccificarorul tcrminat Cll 11/ rcalizcaza conversia sprc unsignc»! IOllg. Spccificatorul It rcalizcazn convcrsia numarului citi: 111 [lotanto til/hilt

prccizie, deci spre tipul double. .

2.6.9. Litera L

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

75

Ext'rcitii:

:' I h S-a SIC xeric un progralll care citcs!c Ull caracicr de la tcrminalul standardcu ajutorul 1"1I11C\iei _\c(/II(~i ;lri~L';IDI codul ;\SCII al caracrcrului rcspcctiv.

PROGRAMUL 81116

/1 i 111"1 Ill'!I' :;t di 1,I,ll II i II' I \ II !I' . (', II I I I I j I

(lId ill () clll':--,Il' Ull c.uactcr j"ulo:;illd lunctia scan]:

- "Iisc"!,, co<l\lI/\5CII :11 cnractcrului rcspcctiv. */

{'II,tl (',II';

scarlt(II%C", &car); Pi. intf (1I{t'id\n" I celr);

I)UI,~;{"f\('t.il)lh\Ll u l:"l~;Ld p(~r\L:.lu d CUllLi"nUi"l."); qcl:ch ();

)

') 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 nUincl 5:JJ; char premJl1\<c[2S5);

sCdnf(<I'~!:3 (tiS", nurne. p rerunnel: j::)uts (prenUllle),'

pu L ~,; (llUlllQ) ;

put,s (",\('tlunilt. i c \:,,1;';1.:';1 pcntru ;:l c ou ti nuovl : 'I':;lch (I ;

)

2.1 X Sa se scric un program Gilt: citcsic un intrcg zccirnal de ccl mult 4 cifrc si-l ali~caza 111 zccimal octal ~i hcxazccimul.

PROGRAMUL 81118

~I i no i ud-. <:;:tdin. h >

ffl/\ i n () /- cucsrc un Ifl!rq; /('("il1lal de cc! Inull 4 cilrc !'i-l aliscnza in zccimal, octal S! hcxa/t·t'tlll~li ·i

.i nr. i :

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

76

prin tft vs o Yn :", iii printf("%x\n", i); )

Observarie:

La cxecutia acestui program nu se mai afiseaza fereastra utilizator cu rczultutclc. Pcutru vizualizarca ei lie tastcaza

<AlL>-F5

Se revinc in fercastra de cditarc actionind 0 tasta oarecare.

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

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

2.20 Sa se scric un program care:

citeste 0 data calendaristica tastata sub forma:

zzllaa;

afiscaza data respcctiva sub forma:

19aa/llIzz

unde: zz

- Doua cifrc ce reprezinta ziua din luna: 01,02, .

- Doua cifre ce reprezinta numarul lunii: 01,02, , 12.

- Doua cifrc ce reprezinta ultimele doua cifre ale unui an

calcndaristic care incepe cu 19.

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.

II

aa

PROGRAMUL BII20

#include <stdio h>

main () /* - citestc 0 data calcndarisiica sub forma: zzllaa, - 0 afiscaza sub forma: ! 9aa/ll/zz_ */

int zi; int luna;

77

int an;

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

Observatle:

La afisare s-a folosit specificatorul de format: %02d

Acesta afiseaza cifrele cu un zeronesemnificativ in fata, Deci cifrcle 1,2, ... ,9

se afiseaza ea 01,02, ... ,09.

2.21 Sa se scrie un program care citeste datele de mai jos ~i apoi afiscaza tipul operatiei citite pe un rind, iar celelalte date pe rindul urmator:

Tip dcnumirc UM cod prot cantitatc
operatic
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) ;

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.

78

3. EXPRESII

o expresie, in limbajul C, este fermata dintr-un operand sau mai multi legati prin operatori.

3.1. Operand

Un operand po ate fi: - 0 constanta;

- 0 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

ESIC 0 consiarua iutrcaga zccimaln de tip int, Reprczinta un operand constant de tip info

2.

Oxalb2

[sic 0 constunta unrcaga hcxuzccimala de tip unsigned. Rcprczinta un operand constant de tip unsigned.

Fie dcclnratia

t loat d 1))2; Numele

alb2

cste numelc unci varinbile simple, dcci reprczinta un operand. EI arc tipul float.

4. Fie dcclaratia

in t; t"b I I (l J ; tab[2]

Este 0 rcfcrire 1<1 clementul al trcilea al tabloului lab. Reprezinta un operand

79

I

I

de tip int. Numclc

tid,

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

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 )

Lstc un operand al carui tip coincide cu tipul cxprcsici inclusa intrc parantczc,

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.

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.

3.2.1. Operatorii aritmeticl

Opcratorii aritmctici sc utilizcazu la cfcctuarca calculclor cu date de difcrite tipuri predefinitc. Accstia suu:

a. operatori i unari + ~i -;

b. operatorii binari multiplicntivi * /;;i 'Y..;

xo

e. opcratorii binari aditivi + ~i -.

Operatorii unari sint mai prioritari dccit cei binari, iar operatorii multiplicativi

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.

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. 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 ~i tip.

2. -1234

estc 0 cxpresie care sc compunc din operandul 1234 la care se aplica opcratorul unar de ncgarivarc,

3. 7/3

Deoarece opcranzii sin! intrcgi, sc rcalizeaza impartirca intreaga a lui 7 la 3. Se obtine valoarea 2 de tip into

4. 7%3

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

5.

-7%3

Expresia arc eft valoare rcstul nnpartirii lui -7 la 3, deer -7(~"O3=-1. lntr-adcvar,

-7/3=-2 si -7=(-2)*3+(-1), dcci restul impartirii cste -I.

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 ~i in continuare prin a**b notam ala puterea b.

PROGRAMUL BIII1

~include <stdio.h>

main () /* - citestc valoarea lui x;

- calculcaza valoarea polinomului 3x**2 - 8x + 7;

- afiscaza rczultatul. */

int Xi

printf("tastati valoarea lui x="); scanf("%d", &x);

printf{"x=%d\tp(x)=%d\n", x, 3'x'x - 8*x + 7 ); )

Observatie:

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

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.

PROGRAMUL BIII2

Hnclude <stdio.h>

main () f* - citcstc valoarca lui x;

- calculcaza si afiscaza valoarca poliuomului 3,5x**3 - 9,8x + 3,7. */

double Xi

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

82

Ohservatie:

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

3.3

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 .: 1- " I I

, , . " -. .. 0' a iscaza rczu tatu .

Calculcle sc fac III flotanta dubla prccizic.

In acest exemplu intcrvin !)\IICI·'" 11"),'\1·1· ale 1· I)

ur .r. c aceca, pcntru a cvita

expresii de forma:

x*x* ... *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 ~i acesta csrc:

double pow( douhle x, double y):

La revenire se relurncaza x**y, rezulraurl fiind de tip douhlc.

PROGRAMUL BIII3

#include <stdio.h> #include <math.h>

main () /* - citcstc valoarca lui x:

- 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} I

8 . (J' I)(M ( X • Y . () ) 't , U* I'''''! ( ;-: , " . 0 )

+ .l. 0) ;

.. } ;

3.4

Sa sc scrie un program care cilc'5le valoarca variabilci x si a cocficicntilor

polinornului- ..

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

calculcaz',"i valo',lrca polinomului qfx) si alisc·1Z'! rC711!t·\'111 (-"11 I I ,t·

"11 . -, ..(.<. -, .u . d_ ell C C ~c 'Ie

til otanta clubb prccizic. . ,

C',llcltlul valorii unui polinorn sc ponte face '·1')1("),"1·111·1 '

I . , 11I1lC(ia de bibliolcca

1'0 P. 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,

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.

PROGRAMUL BI1I4

II itl(']1It!\· . :;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

\

(juul)1.c x , C i. S j;

pr-illtf("v,,'lJodrt'd 1111 K ");

"Ciltl t ( "'1, if " , & x I ;

p r in t; ("co{;,f: i c i.en r.Li po Li nomul u 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) ;

printf("c4" "I;

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

}

3.5

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

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:

I

I

I

I

!

~.

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'

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: lit-'a'+'A'

PROGRAMUL BIII5

#include <conio,h>

main () /* citcstc ell ccou de 13 tastatura 0 litera mica si 0 afiscaza ca litera marc OJ (

putchlgetche() - 'a' + 'A'I;

Observatie:

in acest program se presupune ca se tasteaza la terminal 0 litera mica.

3.6 Sa se serie un program care citeste cu ecou de la tastatura 0 litera mare ~i 0 aflseaza ea litera mica.

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 de la tastatura 0 litera marc si 0 afiscaza ea litera mica • f {

putchlgetchell + 'a' -'A');

}

CudulASC11
a 97 A (,5
b (IX II (,6
')9 C (,7 3.7
z 122 !. ')0
- '-~--~.-----.- ('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:

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

.include <stdio.h>

main () /. - circstc un nurnar cc cxprirna aria unci supralctc in jugarc:

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

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

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.

2. Altfel, daca unul din operanzi este de tip double, atnnci celalalt.operand se converteste spre tipul double ~i rezulratul aplicarii operatorului este de tip 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

86

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,

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.

6. Altfel, unul din operanzi trebuie sa fie de tip unsigned, celalalt de tip int $i acesta se convcrtcstc spre unsigned, iar rezulratul aplicarii operatorului cstc de tip unsigned.

5.

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

Exemple:

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

Opcranzii sin! de tip int, cxprcsia cste de tip int; rczultatul inrnultirii estc cronat daca este in afara intervalului [-32768,32767].

3.

int ii

long double a;

a*3+i

Tinind seama de prioritatea operatorilor, intii se executa inmultirea, apoi adunarea; expresia se evalueaza astfel:

e 3 I'C convcncstc sprc long double (regula I), se rcalizcaza inmultirca ~i rezultatul este de tip long double;

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

Exercitli:

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

87

PROGRAMUL BII18

.include <stdio.h>

II!" i II () /' ,'il,',I\' ,I." II II lc·r.1 ""1',,,,'''''11111'<1[;11,,1' ,1I1111Ic'i1,'" "11" ;1,'(1111"):1 "'/

int (1, h :

!;C;lI1 f ('''1,0 'I,d", ,\,1, "h) ;

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

2.

I ~;I sc "V;I lucazu as( Id:

• Sc culculcaza suma a+b: rczuliatul cstc de tip int, deoarccc ambii opcranzi sint dc tip into Dnca surna nu apart inc intervalului 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 11 uti lizat cxprcsia

(a+b)/2.0

suma a+b 5-a1' fi convcrtit sprc douhlc dcoarccc unpartitorul cstc de tip double; in acest cal. rczultatul cstc de tip double,

3. Exprcsia

(a+b)/2

realizeaza impartirca intreaga dintrc opcranzii a+b si 2 care sint de tip int; de accca, pcntru II ;;i h de parituti dilcritc, cxprcsia de mai sus IlU da rczult.uul coree I.

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 ill grade scxugcsimalc sc tastcaza sub forma:

I; illS

unde:

g lntrcg cc rcprczinta gradclc.

/II - Intrcg cc rcprczinta miuutclc,

s - lntreg cc rcprczinta sccundelc,

Pentru culculul Iuncuci sinus sc apclcaza functia sill aflata ill biblioteca

88

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

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

unde

PI'" 3.14159265358979 PROGRAMUL 81119

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

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.2.3. Operatorii de relatie

Opcratorii de relatie sint 4:

< - mai mic;

<= - rnai mic sau cgal;

> - mai marc;

>= - mai marc sau ega I.

Ei au acccasi prioritatc, care estc mai mica decit a operatorilor aditivi. o expresie de forma

£1 operator jie relatie £2 unde:

£1 si £2

- Sin! expresii, arc una din valorile 0 sau I.

'. -

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

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.

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.

Presupunem ca primul numar se atribuie variabilei i, iar eel de al doilea variabileij.

Atunci expresia

f>i

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

(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

'include <stdio.h> ma in () /. - citcstc pc i si f;

- afiscaza 2 daca f csrc mai marc dccit i si I ill caz contrar */

int i; double f;

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

3.2.4. Operatorli de egalitate

Operatorii de egalitate sint doi: egal:

- difcrit.

!=

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

o expresie de forma:

90

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

.~

EI operatorilc __ cgu!i/([te F;2 unde:

E I si E2 - Sint cxpresii, are una din valorile 0 sau I.

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; Expresia

bco"a*a

arc valoarca adcvarat .( I) daca II cstc egal ell patratul lui a; altkl ca are vnloarca E\ls (0).

2.

int x :

Exprcsia x%A==O

are valoarca adevarat daca x ('SiC multiplu de 4 ~i lids in C<lZ contrur.

3.

int x;

Exprcsia

4.

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

arc valoarca adcvurat daca x IIlI cste lIlultiplu de I 00 ~i ;.oC1() 111 (';11 coutrur.

Exprcsia

qr'! ('It,ll I) I r:cw

arc valourca udcvurat <.Iaca macroul ~~('/c1Ii1" a cit it UII curactcr ditcrit de sfirsitul de Iisicr.

5.

inc x;

scanf {"'tid" I x )

Aceasta cxprcsie arc valoarca adcvarat duca scanfn citit de la tcrrninalul standard 1111 intreg (.1·C(JIl!' rcturncaza uurrrarul cirnpurilor cililc de la tcuuinalul st:11Id:1nI). III Cil/. ('01111'<11', adica daca 1:1 intran' Ill! Sl' alb 1111 mtrcg, cxprcsiu de mai sus arc vuloarca litis.

3.2.5. Operatorii logici

Accstia sint:

~ negatia lugica (opt'J'alnJ' IIIwr);

L~& - ~i logic;

~ sat! logic,

lJl

\

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 dccit cca a opcratorilor multiplicativi,

Exprcsia

ioperan«

'!~'c vuloarca zero (his) !laca (//J(>lwld arc II vn lome difcrita de zero ~i valonrca UIlU (adcvarar ) daca operand arc valoarca zero.

Opcraiorul && arc prioritatca mai mica dccit cci de egalitate. 0 cxprcsic de forma:

f:'/&&E2

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

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 rcstul cxprcsiei, aflata in drcupta punctului rcspcctiv, nu sc mai cvalucaza.

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.

!a 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 ~i deei arnbii operanzi ai opcratorului II all valourcu zero. Conform dcfinitici opcratorului II, rczulta ca intrcaga cxprcsic arc valoarca zero.

2.

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:

92

J. --.-----.-- .... ., .. --------.------ •.. --------,.-.- .. -----------r--.-------- ,..------

lJ!a !a&&b !1J&&a !lI&&IJII!b&&~

o 0 0 0

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

o

diferit de zero

diferit de zero

o

o

o

o

diferit

de zero

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

o

o

o

difcrit de zero

() ()

_L .• _. -'L I L- .. --'-- _

Din cele de mai sus rezulta ca expresia

o

!a&&nll !b&&a

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 ~i se 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 sa satisfaca simultan relatiile: 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;

scanf("%lf~,&a);

printfl"a=%g\t%d\n", a, a >= -1000 && a <= 1000); }

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 ~i zero 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 este multiplu 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:

365+ 1/4- 111 00+ 1/400=365,2425 zile

ln aceasta expresie termenii au sernnificatia:

365 - Numarul de zile ale anului iulian.

114- Adaosul de un sfert de zi, adica de 0 zi la patru ani, conform calcndarului julian.

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

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)

lIlOO

/1400

an%IOO!=O (an nu este rnultiplu de 0 suta). Deci anul este bisect daca expresia

(I) an%4==0 && an%JOO!=O

este adevarata.

De asemenea, anul cstc bisect ~i in cazul in care cxprcsia

(2) an%400=0 (an este multiplu de 400)

94

este adcvarara.Ticci anul csrc bisect daca cstc adcvaraia cxprcsia (I) sau (2), adica daca estc adevarata cxprcsia:

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

PROGRAMUL 811112

#include <strlio.h>

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 0 &&

an%100 r, 0 II an'/,40() 0»);

3.13 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,

PROGRAMUL 811113

#include <stdio.h>

rna i n () !* citcsu: lin inlrcg care rcprcvintu lin an calcndaristic din intcrvalul r I (,()(),~90()15i ilfiseaza numurul de zilt:: dinanul rcspccriv +/

(

int ani

scanf ('%d', &an);

printf('anul %d are %d zile\n", an,

365 + (an%4 0 &&

an%100 ! = 0 II an%400 == 0));

Ohservatie:

In accst program sc considers ca anul tastat In terminalul standard apartinc intcrvalului [1600,4900].

3.2.6. Operatorii logici pe biti

Opcratorii logici pc biti sint:

-. complement E!t[1 de U!lU (operator unar):

- dcplasurc stln,gn;

- dcplasarc drcapta:

- ~i logic pc hi! i:

- S:tll cxclusiv logic pc bi!i;

- sal! logic pc hili.

« »

s:

1\

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:

I.

~1234

1234 sc reprezinta in binar astfcl: 10011010010

Se cxtindc 1'1 1(1 hili: 0000010011010010

apoi sc aplic<l opcraiorul de complcrncuturo 1;t!~1 de I: [ I 1 I 1 0 I 1001 () I 101

sau in octal:

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

sc ncgativcaza: 1111101100101110

apoi sc complcrncntcnza 1;1\;\ dc I:

I 00 I I 0 I 000 I sau in octal: 02321

3. -~1234

in accst caz, inti! sc dctcrmina complcmcntul I~l\il de I, apoi se ncgariveaza 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:

100 I 10 I 00 I I

sau in octal:

02323

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

Opcratorul « rca lizcnzn () dcplasnrc I" stingll :.1 valorii primului sau operand

96

ell lin numar de pozitii binare egal cu valoarea celui de-al doilea operand al sau. Ac~asla operatic este echivalenta Cll inmultirea cu puteri ale lui 2.

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. int a; a«3

arc aceeasi valoare ca :;;1 a*8

adica se inmulteste a cu 2 la puterea 3.

2.

int ai 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 astfel: a.Se extinde zero pc 16 biti: 0000000000000000

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

c. Se fac 3 deplasari spre stinga: 1111111111111000

sau in octal:

177770

4. ~H)«3)

Rczultatul din cxernplul precedent sc complemel1teaza fatii de unu: 0000000000000111

Opcratorul jr logic pe bui se executa bit cu bit, conform tabelei de mai jos: 1&1=1

1&0=0

O&I={)

0&0=0

Operatorul & are prioritatea imediat mai mica decit operatorii de egalitate, Se

utilizcaza In anulari de bili. ~

97

Excmple:

l.

int a;

a&0377

are ca valoarc, valoarca ocrctului mai plI!in scmnificativ al valorii variabilei iI.

lntr-adcvar, sc cxtinde constanta octala 0377la 16 biti: 0000000011111111

apoi se face si logic pe hili intre accasta constanta si valoarea variabilei a. Se pastreaza ultimii 8 biti ai lui a, primii 8 biti anulindu-sc.

2. int a; a&OI77400

are ea valoare, valoarea lui a dupa ce S-I\U anulat ultirnii 8 biti ai sai, Aceasta rezulta din faprul eli, constanta ocrala 0177400 arc in binar valoarca:

1]1]111100000000

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

. ;\'~a de cxcmplu, dacu x=2 Z;i y= 1, atunci x&&y arc valoarca 1, dcoarecc arnbii opcranzi sint difcrir: de zero. In schimb, x&y are valourca zero. lntr-udcvar, in accst eaz sc realizcaza 1111 si P'' hili ell valorilc:

x=ooooooooooooooro y=OOOOOOO()OOOOOOOI

- ------- .. -"e'--- _-- --- __ -_- - _

x& y=OOOOOOOOOOOOOOOO

Operatorul sau exclusiv pe hili se executa bit ell bit, conform tabclei de mai lOS:

1"1=0 1"0"" I 0"1=1 l)"O""O

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

98

I.

int i:1; 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;

a"l

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

Expresia a"l

setcaz[~ la.valoarca unu II lti mu I bit a lui a. In felul acosta, rczulratul cstc cgal ell 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

anuleazn ultimul bit a lui a. Deci, rezultatllicstc cgnl ell ccl mai marc 1I111ll[lr par care nu-l deniiscstc DC a

Opcrato~lIl·.w;1I iOgi(,'I/(' hi(i so executa hit cu bit. conlorm tabelci de mai jos: 111"'1

110=1

011"1

OI(H)

~ee~t op~ratol: nrc prioritatca imediat mai mica decit opcratorul SOli exclusiv pe bit! ( );;1 imcdia: mai marc dccit operatorul si logic (&&).

Operatorul I se foloscstc la setari de biri,

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

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,

100

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:

- Estc 0 variabila simpla, rcferentiaza un element de:·tablou (variabila Cll indici) sau de structura.

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,~:til mai

SlIS, de obicci Ill! sint neccsarc. "

v

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

este 0 expresie de atribuire. Ea arc ca valoare valoarea care se atribuie, iar ea tip, tipul variabilei v.

Rezulta efl 0 constructie de forma:

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

din opcratorii:

! % * - + « » & 1\ I

Accasta constructie sc foloscstc pcntru a face prcscurtari. Expresia

v 01'= expresie

cste echivalenta eu expresia de atribuire: v=v op(expresie)

Exprcsiilc de atribuire pot it tolositc peste lot in program undc cste legal sa apara 0 expresie. Acest Iapt permite ad esc a sa se faca compactari in programul sursa,

Exemple:

1. int a; a=10

variabilei a i se atribuie valoarea 10.

2. int i; i=i+3

valoarea variabilci i sc marcste eu 3.

3.

int ii j +=3

arc acelasi efect ca si expresia de la exernplul precedent.

4. Expresia de atribuire:

a[i*3+ 1 OJU*2-3}=a[i*3+ 1 OlU*2-3J*x se scrie prescurtat astfel:

a[i*3+ 1 OlU*2-3]*=x

Exercitli:

3.14 Sfl se serie un program eare citeste valoarea lui x, calculeaza valorile expresiilor:

4x*x+3x

4x*x+3x+l

(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 + 3x - I )/(4x'x -} 3x + I) *;

double x,y;

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

Observatie:

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

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

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 Sa se scrieun program care citeste valoarea lui x, calculcaza si afiseaza valorile expresiilor:

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

PROGRAMUL 811115

#include <stdio.h> #include <math.h>

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

x··20

x *"'3 0

x··40 *;

double x,y,z;

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

)

pow ( x , 10 . 0) I ;

3.16 Sa se serie un program care citeste valoarea lui x, afiscaza vulorile lui x, [x], I x}, calculeaza si afiscaza valorile expresiilor:

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

7 {x) * [xj-J {x )+10 unde:

102

lx/ Ix}

Notcaza partcu intrcngu a lui I' ([xl..:~x). NO!L'az:1 partcaliaqionara it lui x ( [x j =x-] xl).

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:

71\1*1\1·3Ix] + 10

si

lnt i; double x,y;

scanf("%lf", &x); printf ("x=%q\t" ,x);

printf("[xJ~%d\t",i x);

printf("(x} %f\n",y = x i);

printf ("7 l x l [ x ] - 3 l x ] ;- lO"'td\n", 7*i'j printf("7{x){x) - 3(x) + 10=%g\n",7'y'y

I

3*i +10); -l*y +10);

3.2.8. Operatorll de incrementare sl decrementare

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 J J am J( I

sal! postfixati: (JJ!I'I'III ul+r operand--

in cazul in care 1111 operator de incrcmcntnre sau dccrcmcntare csrc prcfixat, sc rolosc~le valuurca opcrandului la can: s-a aplicat npcralorlll respcctiv.

In cazul in care un operator de incrcrncntarc sal! dccrcmenrare cste postfixal, sc foloscstc valourca opcrandului dinaintca uplicnrii opcratorului respcctiv,

Exemplu:

Presupunern ca .v arc valoarea 3. Dnc11 consideram cxprcsia de atribuire

Ifn

y=++x

atunci lui y i sc atribuic valoarea 4 (la atribuire sc foloscste valoarca incrcmcntata) .

Duca utilizam cxprcsiu de atribuire

yo=x++

pcntru x=J, atunci lui y i sc atribuie vuloarca 3 (Ia airibuirc sc Ioloscstc valoarca dinaintea incremcntarii).

in ambclc cazuri valoarca lui x s-u marit cu J.

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

Adcsca dorim sa spccificam convcrsia valorii unui operand sprc un tip dat.

Acest lucru cstc posibil Iolosind 0 constructic de forma:

(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 ca functiararc un par.unctru de tip double. Fie declaratia:

int ni

Atunci, pcntru a apelafcu paramctrul II, cstc ncccsar ca, in prealabil, /1 sa se converteasca sprc double. Accst lucru se poatc rcaliza printr-o atribuirc:

double x;

f (x=n);

Un alt mod mai simplu dc convcrsie a parametrului intreg spre tipul double estc utilizarea unci expresii cast:

f t t doub l e j n l ,

Operatorul (tip) fiind unar, are acecasi prioritatc ca si ccilalti opera tori unari ai limbajului C.

Excrcitii:

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

104

PROGRAMUL BI1I17

#include <stdio.h> #include <maLh.h>

main () !*. citcstc pc 11;

- calculcaza si afiscaza radacina patrata din 11 *1

long n'

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

Observatic:

in accst program s-a utilizat functia sqrt pentru extragerea radacinii patratc.

Ea are prototipul:

double sqrt(double);

Accst prototip este definit in fisicrul math.h.

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

PROGRAMUL BIII18

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

. calculcaza si afiscaza pc 11/(n+l) cu 15 zccima1c *j

long n;

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

Observatie:

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.

3.2.10. Operatorul dimensiune

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

105

sizeol'dolif

StlU

S izeo fltlj)) unde:

dahl

- Ponte fi:

..

un nurnc de variabila simpla;

• lin numc de tablou;

..

un nume de srrucrurn:

rcfcrircu la un clement de tablou (variabila cu indici);

..

lip

.. rcferirca la clerncntul unci srrucruri,

Peate fi:

..

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

..

Expresia

sizeof data

poatc fi scrisa $i sub forma sizcof(datn). En arc ea valoarc dimcnsiunea in octeti a operandului "data", Astfcl, daca data estc:

numele unei - Atunei rezulrarul va f numarul de octeri alocati variabilci

variabilc simple respective.

numelc unui

Arunci rczultatul va f nurnarul de ocrcti al zonei de !11C!110ric alocatc tahloului rcspcctiv,

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

tahlou numel« unei structuri

etc.

Expresin

sizeof(tip)

are ca valoare numarul de ocreti alocari pcntru rcprezeutarca unci date de tip lip, Operatorul dimcnsiunc (siz('of) estc unar 0i are acecasi prioritate en restul operatorilor unari ai limbajului C,

Exemple:

1.

int Xi sizeof x

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

2,

long double y[7J; sizcofy[31

are valoarca 10, dcoarccc pcntru 0 data de tip long double sc aloca 10 ocreti.

106

sizcof Y

arc \!~dOlli\.';i 70. (k:O;jj'L'l'l; Lildl.iid ;!rC "1 L'ICl1h:IHl' III 10t:l1.

3.

i:~eut (Cl\C!l!

3.2.11. Operatnru] adre sa

Opcratorul :llirL:S:1 C'SIL' lII1:I1 si sc IllliL':I/a prin CIr<lcll'rlii &, LI sc aplica peuuu 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 Cl'a 1lI:li simplel, <lCL'sl [ljiL'l':II\11 ~c' I[I:\I/L\I/:I 1[1 l'UIlSlrll\'\il dL' 1'0 I'll !; [

&n/lillc

undc: 1/11111('

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

tvknlion:llt1 C:I ill l'll'Iul 11\ eire' u unu» L'sIL' uumclc unui inhlou, .uunci :Iccsla arc ca valoarc chiar ildrl':;:1 dc' IIlCc'l'lii :1 /(lilci dL' lllc'lIl(lriL' :tlneill:1 1;1i,llllillli rcspccriv. Dcci, ill nL'l'st cal II\! -'l' tIl:li 1IIill/l':II:1 01lL'I'illllnti :1l!t\.'S:1 &,

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

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',ISi priorit.uc ('II si ceilalli UpLTllto!'i unnr: :Ii limbajului C.

Opcratorlll unar & ;IIL' III lill1h:ljuH'i i ,S! [) :tll:l lItili/ilrc ,IS:: CUIl1 sc \:1 vc',il':1 mai tiF/ill,

3.2.12. Operatorii parantoza

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

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!;1 se !In:liL' illljlllllL' (\ ;;lla llidilh' 1[ll'I~'l'IIIJlll'a '\I1L'r;ltitlul', dL'l'll \'C';I L'arC' rczulta din prinril<llca;;i asoci:IlIVllaiL';1 opcratorilor.

Opcrunzii niJlillllli priu IlIl'ltldc[l'll 1IIIc.'i L',\:pl,;sil nun. 1';lrllll!c/c' inljlllil unuruirc limi!e :ISlIPI':1 ()jlcrllllllilol', Ik e'\l'ltlplll, Ii! 1[11 list 1\.:1 de "Jll'r;lltd 1111 sc ]lui aplicn (\pcr:ltl/il (it: illl'll'llll'llIlIlt: s[ dl'L'IL'llh'lllall' S:llI lI]ln:i1lillll adrl'sil. '\stkl constructi ilr:

(i+10)++ --(Xiy) &(\

SIIlI c!'Onate,

La upelul UIlL'i Iuncu]. list:! pilr:ltllc'lrilor clCClivl Se' im:ludc' Illtrc 11:Ir:lll\l'/l' rotundc. in aces: ca:: xc ()hisllltiL'.~IL' ,-;11 sc SPUIl:t Cil p:lmI1IL'lelc- rol!llllic' siut OI)l'ralor! lie' II/W/ tI" luncu.'.

r\lntIIlC/l'k' p:tlr:liL' iuclu.] l'\jl['L'si[ (,:[1\' [L'jlll'/illl:1 indi,: I.k "'C' 1\11111\'\,' O/}(,I'<IfU/'1 de 111.1,'.1/11'",

107

Parallk'/cic xiut opcr.itori de Fiorit;ilc ma x im.t. Opcr.itorii unari au priorit.ucu imCl"al Illai nuca dccrt paruuczclc.

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.

Numim cxprcsi« conditionala, 0 cxprcsic ;' carei valoarc si tip este dcpcndcntu 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, '

o cxprcsic condiuoualu arc fornutul:

1;'f'!E2:E3

undc:

EI,£2\'1 E3

- Sint cxpresii,

Accustu cxprcsic sc cvalucaza ast lcl:

.. Sc dctcrrnina valoarca cxpresici El.

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.

De aiei rezulta ca valoarca ~i tipul cxprcsici condiiionalc dcpindc de valoarca . cxprcsici EI.

Folosind Iounutul de mai sus, calculul maximului dintrc a ~i II sc cxprirna cu ' ajutorul cxprcsici conditioualc:

..

(a>b)'!a:h undc:

(£I > h)

II

Estc cxprcsia E! (conditia).

ESIC cxprcsia E2. hIe cxprcxiu U Opcratorii conditionali sint:

h

'! SI :

i08

" . .rdinea indicata in formatul expresiei

Ei se Iolosesc totdcauna impr,cuna s;

eOll~~!iollalc.. . . .. ,' .. iecit prioritatca operatorului sau logic (II)

, ,f~l au pnoritatea imediatmai 1~1 opcratorilor de atribuirc. Tinind seama de (ll ,lIned)at mal marc dccitHf':i_9.l;i'se pot omite parantezele din expresia pentru pnontarca operatorilor, r{)zlilf

calculul rnaximului dil1lt,~l; .I.

o(":,:~?~-,,~) ,

a>b?a:b "

. , , /;ij"este un caz particular de expresie si deci ea poate f

Exprcsia conditior . ,.. '

tili .. '1 ."gal sa apara, 111 program, 0 expresie.

U I Izata onunc e est/

De cxcmplu:

v = (El 'rE7 £3)

, " ide atribuire: in partca dreapta a sernnului de atribuirc se afla 0

cste 0 exple~ . fi . - .., 1 ".. t de arece

. .;ltlOnaia. Ea poatel sensa mal simp u lara parancze, 0

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.

Ex(ci~ii:

)19 Sa se scrie un program earl' citestc doua numere si afiseaza maximul dintre cleo

PROGRAMUL 611119

#include<stdio.h>

ma i n (l /* citcstc doua numcrc si afiscaza rnaximul dintrc de"/

(

double <l,b;

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

)

3.20 Sa se scrie un program care citeste un numar si afiseaza valoarea lui absoluta,

PROGRAMUL 611120

.include <stdio.h>

ma i nI l f* citcste un Hilmar si afiscaza valoarca lui absoluta *f

{

double a;

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

a );

109

3.2 J Sa se serie un prfJ!Jn1111 care ~ I j'

' 'Ie doi inlr(lui ~i afiseaza maximu C nitre

vnlorilc lor abs()ll1tc. ,_ . ."' ..

PROGRAMUL BIII21

#include <stdio.h>

mai n () !* cites!c doun numen, intrcgi si aliscaz(! nr. 'I I t *. ( - 'HII dintrc valorilc lor a )sn II C I

int arb,c,d;

scanf("%d %d", &a,&b),

printf ( "a=%d\ i:o=%d\ tabs (a I =¥:d\ tabs (b I =%d \1 a,b(

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

3.22 ~<,j se,scrie un p~o~ram ear~ cite::;tc valoaren variabilei x 0Lljseazii valoarca

funettel j(X) dciIl1lt~\ ca mat J05: .

[3x* ,'+ 7x-IO pentru x< 0:

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

4x'" \ 8 pcntn, x > 10

PROGRAMUl 811122

#include <stdio,h>

main( I

/* citcSk pc x si nl]scnzll "[;Io,,r('a tl!nCliCi i\x) ddlnira tI,iicl:

Jx+x + 7x • 10 pClltru x < 0;

2

peltfr;o xr= 0; pcnti'\!)( > () *!

4x·x· B

double X;

scanE ("'Hf", &x),

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

x<O ? 3·x*x+7*x-IO : x>O

3.2.14. Operatorul virgufa

Operatoru1 virguhi1eag,1 doua expresii in una :;ingura conform IOl'fl1!l(ului de mai 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

(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 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

In general, 0 cOl1sluqie de fonb,tl: e:rp / ,(',\jl2, ... .expn

7 ..., ,'" carci valoarr si tip coincide

undc ('xpJ,exp_., .. cxjn: ~nt expresu esc 0 exprcsic a vq "~'.

CLi valoarea Si t ipu] lui e,YJ/l, ,

• ("j I '·"1- " , ',11 "\7'\ pc "'11,(1 de I" ,11110,1 l~)

Inrr-o <lSi C (C COI1SI1I,;!IC', eXt/fell 1 C Si.: cv, 1 c,' s , ".' _ H ....... t ..

drcapta. "

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:

. '1 . intrcu .. 'I' si : 'l'/'I,S,'C,'lZ:\ maxirnul dintre

3.23 Sa se sene un l1rO}ml'fJ care cncsc (01 "'

valorilo lor absolul.:,

Aces! cxcrcitiu a fosrrczolvar ~i ill [laragral'u! precedent (cxcrei(iull? I,)

PROGRAMUL 811123

lincludp <stdin,h'

lHil i n ( ) 1* tilt·s!c doi iOTt'gi:-\1 atisea:ra nuxunu! {iintrl' valorilc lor ah:-\o)u(c */

int u1h,c,cl;

SCcrnf ('l~i;d'f_';Cl", &a, &1)) i

P r in t f. ( "d 'i.. I \ t 1,1'. 'i.,( i \ Uh.IX (d I);:; (d I , d lXl (t \ f) 'Lei \ 1\ " , a,b,((C~i,<O'" a r a j ,

(d=b<O .,J;,: b), (e > d)) '? c; 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 si al\i opcrutori 0i anumc: operatorul * unar;

- operatorii.;;i ->.

Opcratorul '" unar sc uulizcaza 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" urmat d~

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 de la drcupla spre stiug«.

( ) I I ->
+(1111:1') -(ullar) &(Ullar) '(unar) ++ (lip) si7tH!'
'(hinar) / ~~II
+(hinar) -(hillar)
<~:: >~
< <r- '>
l=
.'I.:(hillar)
A
• '\.&
.,
«0::- »:"-- +~ *""" l= %= &= A= 1= Ulterior accasta tabcla va it cOinplctat~, ~i eli alti opcratori specific! lin1bajului

ClI.

112

4. INSTRUCTIUNI

.

Am vazut ca 0 functic are structura:

antet ('011'

Corpul unci functii coniine, intre acolade, 0 succesiune de dcclaratii unnatc de 0 succesiune de instructiuni:

declaratii instructiuni

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 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 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;

structura altcrnativa;

-- structura repetitive (ciclica) conditionata anterior .

Acest rezultal 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 ~i in 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

structura selcctiva;

structura repetitive (ciclica) conditionata posterior.

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.

Mai jos se dcscriu aceste instructiuni Si se dau exemplc simple de utilizarc,

4.1. Instructiunea vida

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

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.

4.2. lnstructiunea expresie

Instructiunea expresie se obtinc scriind punct ~! virgule dupa 0 expresic.

Deci, instructiunea expresie arc formatul:

expresie;

in cazul in care expresia din compunerea unei instructiuni exprcsie este 0 expresie de atribuirc, se spune ca instructiunea respectiva este 0 instructiune de atribuire.

Un alt caz utilizat frecvent este acela cind expresia este un operand ce reprezinta apelul unci functii, In aecst caz, instructiunea expresic este 0

114

instructiunc de ape! a Iunctici respective. ExemplI.':

1. i nt. x ,

x=lO;

Este 0 instructiuuc de atribuirc, Variabilci .v i sc utribuic valoarcu 10.

2. double y;

y=y+4; sau y+=4;

Este 0 instructiune de atribuiro, care marestc ell 4 valoarca lui ,I'.

3. putch(c-'a'+'l\');

Este O instructiunc de upcl a funcuci putcli,

4. double a;

a++j

Este 0 instructiune cxpresic, care marcsrc valoarca lui 1/ ell 1I1lU.

5.

double a;

++ai

Arc acelasi efcct en ~i inslrllC!illile~1 cxpresie din cxcrnplu! precedent.

Ohscrvntie:

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

ai

desi esre 0 instructiune exprcsie, en nu arc nici un cfcct.

Excrci!ii:

4.1 Sa se scrie un program care citcstc trei intrcgi si afiscaza maximul dintrc ci, PROGRAMUL BlV1

#include <stdio.h>

main () 1* citcsrc Irei intrcgi si afiscazn max imul dinirc ci *1 (

scanf("%d ~ic1 'l,d", &d,&h,'<;c);

d = 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: c);

115

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

,

4.2 Sa se scric un program care c itcstc valori}c variabilclor a, b, c, d. x de tip dflilhlc~i an~eaza valoarcu cxprcsici:

daca numirorul cstc dilcrit de zero 0i zero 111 caz contrar,

PROGRAMUL BIV2

Ninclude <strlio.h>

main () /* citcstc pc a.b.c.d si x , calculcazu si afiscazu valoarca cxprcsici: (a" x "x + b*x+ c)l( a *x'x "x+ b* x+d)

d<lL',lllunlllonlll'sll' dik'rit dL~ I.l'rll xi I.ero III C;\lCHlllr:1I "'/

double a,b,c,d,%; doubl.o ,/,Z.,I.1;

printf (lIa·:::") i scanf ( "% 1 f " , &a) ; p r i n t 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", s.n . p r in t Lt "x ");

s c a n f ("1,1 f", &x);

y :::: a*xlrx; z:;:b"x; u:::.::yl<x+z+d;

pr i n t f (" (al<x*x+b*x+c) / (a'~x*x*x+b*x+d) ::::%g\n", u '! (y+z+cl/u : 1.1);

4.3. lnstructlunea cornpusa

11I.\11'lI('(/I/I/('<I ('0111/1111,1 \.'slL' () succcsiunc de instructiuni inclose inlrc ncoladc, succcsiunc care ponte I-I prcccd.ua 0i de dcclaratii:

dcclaratii instructiuni

Daca dcclara\iilc sinl prczcntc, aiunci de dcfincsc variabilc care sint definite alit timp cit controlul prograillului sc all,\ la 0 instructiunc din compunerea instructiunii compusc.

Exernplu:

Prcsupuncm ca intr-un anumit punct al prograrnului cste necesar sa se permute valorilc variahilclor IlIlregi u si b. Accasia sc poatc rcaliza astfcl:

1:6

int t·

t=ai a=b; be t :

)

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 if

Instructiunea if are urmatoarele formate: forrnat l

if(expresie)

instructiune

fonnat2

if(expresie)

instructiunel

else

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

compuse. De asernenea, instructiunile respective pot f chiar instructiuni if. In acest caz se spune ca instructiunilc (j'sint imbricate.

Exercitii:

4.3 Se da functia:

y=3*x*x+2*x-IO pentru x>O

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+ l O.

Aeeasta se transcrie imediat, in limbajul C, folosind formatul 2 al instructiunjj if:

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 '!

Acelasi proces de calcul se poate realiza eu ajutorul expresiei de atribuire: y=x>O?3*x*x+2*x-1 O:5*x+ 10;

care utilizeaza in partea dreapta 0 expresie conditionala. Aceasta este 0 seriere mai compacta, dar nu atit de evidenta, ell ~j instructiunea ifae mai sus.

PROGRAMUL BIV3

#include <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); if(x> 0)

y= 3*x·x + 2*x -10;

else

y= 5·x + lO,

printf("x= %f\ty= %f\n", x,y); )

4.4 Sa se scrie un program care citeste valoarea lui x, calculeaza si afiseaza valoarea lui y definita ea mai jos:

118

y=4 "x **3+5 *x *x-2* XII y=iO()

y=2*x*x+8*x-l

pcutru x<O; pentru x=Il; pentru x>O.

Aeest proccs de calcul implica unniltoarele alternative: daca x < 0 atunci Y=4*x**3+5*x*x-2*xt I

ultfcl

daca x=O

at unci y= 1 00

altfel y=2*x*x+8*x-1

EI se transcrie imediat printr-o insrrnctiunc ifimhriccllti:

if (x<O) 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;

else

y=2*x*x+8*x-]j

. Acclasi proccs de calcul sc ponte dcscric prin instructiunon cxprcsie de mai

jos:

y=x<O?4*x**3+5*x*x~2*x+ I x==()'I! OO:2*x*x+8*x-l;

PROGRAMUL BIV4

#include <stdio.h>

rna in () /* 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 (bc;) X"O:

y ,= l'x'x + X·x -I altfc] 0/

float x,y,a;

scanf("%f", &x); a ;::;: x*x; if(x<O)

y iJ A).: ~' ;:1 t ~')A 4 I

"lse

if ( x == 0)

Y 100;

Y 'I A,! f H ~ x

printf ("}:=%f\ty=%f\n", x , y); )

4.5 Si\ se scric un program care citcsre valorile variabilclor nCintregi a ~i b, calculeaza radacina ccuariei:

ax+b=O

119

~i afiscaza rczultatul.

Proccsul de calcul al radacinii ccuatiei de mai SLIS trcbuic s,j verificc cxistcnta

cr:

duca II cstc dilcrit de zero atunci x=b/a

alllcl

daca /1= IJ

atunci ccuatia cstc nedeterminata; altfcl ccuatia nu arc solutie.

PROGRAMUl BIV5

lIiIW]II<J., <,;Idio.h',

I1Id i \I () /+ citcstc pc a si h. "'1le-lIka!;! Sf '1Iise"," lalianlla enllli le'I ax I b o. 0 ./

.Jou b lo d, b;

if (,;( 'dill (·"I.! I '1. I I '". u,«,» hi! ;')

pri n t t ("coel icienti er ona ti \n"l;

else

if ( a ! = 01

pri n t.f ("a=1;q\tb=%<J\tx=%g\n", a, b , -b/a);

i t b'c () I

p ri n r f ('fpcu.::tt:ie nf':!det.c'rrninatn\n");

IJI,-jlltl.("r_::CUdtid IlU -r 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:

"cocficicnti crouuti".

3.

4.6 Sa sc scric lin program care citcstc cocficicntii u. b. c, d, e.], ai unui sistcm de douu ccuutii liniarc cu doua nccuuoscutc, determine] si afiscaza solutia accstuia cind are (1 solutio unica.

Fie sistcrnul de ccuatii Iiniarc: ax+by=c

dx+cy=f

Notam ell del dctcnninantul cocficicntilor nccunoscutclor. Acosta sc

120

culculcaza cu rclatia: det=ae-bd

Notam Cll del J detcrrninantul obtinut din dCI prin inlocuirea primei coloanc cu . coloana tcrmenului libel' $1 Cli del2 detcrminantul obrinut din del prin inlocuirea coloanci a doua ell coloana terrncnului libel'. Atunci:

dct I =cc-bf ~i dcI2=al~cd,

Proccsul de calcul al valorilor lui x :;;1 y se desfasoara conform pasilor de rnai JOs: 1.

2. 3.

Se citesc valorile coeficicntilor a, b, c, d, e.]. det=ae-bd.

4. 5. 6. 7. 8.

Daca det=i), arunci sistcmul I1U arc solutie unica (estc ncdctcrminat sau incnmpatibi I).

Se ,:fi~caza Ull mesaj corespunzator si se intrcrupe cxecuiia programului, Altfcl sc conunua cu puuctul-t.

det 1 =ce-bf

dctz=af-cd.

x=dct i Idee

y=det2/det.

Se afiseaza valorilc lui x si y.

PROGRAMUl BIV6

linclude <stdio.h>

main () 1* citcstc pc a.b.c.d.c.I, dcrcrmina si afiscaza 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;

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

(

detl = c*e b*f;

deL2 = a*E cOd;

x = cletl/det;

y = det2/clet; printf("x=%g\ty~%g\n",x,y);

121

- "

Observatii:

I. Expresia

(I) (det=n*e-b*d)==O se evalucaza astfel:

a. Se calculeaza a*e-b*d

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.

2. Parantezcle din expresia (l) sint obligatorii. in lipsa lor, expresia (I) devine:

(2) det=a*e-b*d==O.

Aceasta se evalueaza astfel:

a. Se calculcaza valoarca expresiei: a*e-b*d;

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

c. Se atribuie lui det valoarea expresiei 3, adieu 0 sau 1,

4.7

Sa se scrie un program care citeste valorilc variabilclor a, b, c, calculcaza si nfiseaza radacinile ccuatiei de gradul 2:

a*x*x+b*x+c=O

Pusii procesului de calcul sinr:

I. Se citesc valorile variabilelor a, b, c.

2. Daca a=b=c=O, ecuatia estc ncdeterrninata.

Se afiseaza un mesaj corespunzator si se intrerupe exccutia prograrnului,

3. Daca a=b=O ~i c este diferit de zero, ccuatia l1U are solutio.

Se afiseaza un rnesaj corespunzator $i se iutrerupe executia programului,

4. 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;

se afiseaza un mesaj corespunzator, solutia x si se intrerupe executia programului,

5. Daca a este diferit de zero, sc calculeaza: delta=b*b-4 *a*c

si

d=2*a.

6. Daca delta> 0, atunci delta=sqrtfdelta); (sqrt este functia de bibliotcca prin

122

care se calculc~IZi\ nithlCina patruta). Se dctermina $1 se afiseaza radacinilo: x I=(-o+dclta)!d;

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.

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.

PROGRAMUL BIV7

7.

8.

.include <stdio.h> .include <math.h>

II fisicrul contino prototip pcntru sqn

ma in ()

1* citc~tc pc a.h,c, calculcazn si afisCHZt1 radacinilc ccuntioi. a x'x + b'x + c = 0 '1

double a.b.c,d,delta;

p ri n t f ("co,'!UCiCllLuJ lui if(scanf("%lf",&al '= II printf{"coeficientul else { 1* 1*1

lui x patrat eronat\n"l;

printf('coeficient~] lui if(scanf("%lf",&bl' != 11 printf("coeficientul else ( 1* 2 */

x:" I;

lui x eronat\n"l;

print.f:("Lc,rmenulliher:"I; if(scant:("'61f", &c) != 1) printf("termenul liber eronat\n"); else [ r s=,

I' aflscaza cocticicmii cititi */

p r i n t. I ( "i. = '1,9 \ r. b, tq \ l C'= '{,q \ n " • a , b. (' I ;

If( a== 0 && b 0 && c == 01

printf("ecuatie nedeterminata\n"I'

else '

if( a == 0 && b == 01

print f ("c:cuat in el.sl~

if ( a == 0 ) {

l'lrintf ("c·c1..1atie (h.,..) qradul 1 \1\"); print! ('X'=%9\n", -('/b);

r:n

c:l:::;c{ /*i·l*//1<a!·····tJi-i

\ 1! ' \ I , I I) . ) ) 'l .~ ,I ; {

d ;.~ ·'d;

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 d'.:ll,1) id, Ii> dc>ild) Ill):

; f ( ,kl \ iI

II I (

1)1 i nt f (",'('11,11

, , I ,I ,I I .. ( ~ \

I"dddCilllJ dubla\n") i print: E (",,:. %q\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 i ('!,q)\I\"/d,t!C'\t'II); pr.inttl"x,'cc'!,q i.I'{,q)\n",d,deltd);

)1* $llrs;I"5**1

) l*sfirs;1 *4**1 }/* sllrsil*l*"'1

") /*slirsil *2**/

}/*sllrsi!* I **1

1/*,lirsil pr()gralll"l

Observntic:

Prourarnul de rata uiilizcazn instructiunca il ell nivcl de irnbricarc rclativ Ill.lI:', Pro~ralllele l',IIT loloscsc instructiuni /fell nivcluri mari de imbricarc sill! urcu (Ie unnarit. /vdcsca sc uita inchidcrca uuuror acoladclor. Dc uccca 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).

4.5. Functia standard exit

Funclia exit arc prototipu]: void exit(int cod)

si el sc alb in fis icrcle de tip h:

... _ll~L 1_

SlUIIU.1I

~I

pruccss.h

La apclul accsici funciii au loc urm.uoarclc actiuni:

124

.. se vidcaza zonele tampon (buffcrele) ale fisierelor deschise in seriere;

.. se inchid toate Iisierelc deschise;

.. se intrerupe executia programului.

Paramctrul acestci functii defincste starca programului la momentul apelului. Valoarca zero dcfincste () terminarc normala a cxecutiei programului, iar 0

valourc eli leril;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:

4.X Sa sc modifice programul din cxercitiul 4.7 in asa fel incit el sa nu mai contina instructiuni ((imbricate.

PROGRAMUL BIVa

#include <stdio,h> #include <math.h> .include <stdlib.h>

II fisicrul conunc prototip pcntru sqrt II fisicrul coniine prototip pcntru exit

rna in () 1* citcstc pc a.b,c, calculcaza si afiscaza radacinilc ccuatici: a*x*x + b'x + c ~ 0 */

double a,b,c,d,delta;

printf('coeficientul lui x patrat:"); if(scanf("%lf",&a) != 1) (

printf("coeficientul Lu i x patrat eronat\n"); ex it ( 1) ; 1"' tcrminarc In croarc "/

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 */

/* 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 */

)

if( a == 0 && b == 0) (

125

printf("ecuatia nu are solutie\n"); ex i.t.tO) i

if ( a == 0 )

printf("ecuatie de gradul l\n"); printfl'x=%g\n',-c/b);

exit (0);

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 are radacina duhla\n'); printfl'x=%g\n', -bid);

exit (0);

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

}

4.6. lnstructlunea while

Instructiunea while are formatul: whilc(e.xpresie)

instructiune

Primul rind din acest format constituie antetul instructiunii while, iar instructiune este corpul ei.

La intilnirea acestei instructiuni intii se evalueaza expresia 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

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:

4.9 S;I sc scric un progr:iln care calcuicnzu ~i ari~e:a7:1 valoarca polinoruului p(x)=3 "x *x-7*x-1 0

pentru

x=l , 2, ... , 10

Programul de rap rcalizcaza un proccs de calcul care consta din cvaluarca ~i

afisarca valorii cxprcsici: .

3*x*x-7*x-IO

pentru cele 10 valori all.' lui .Y. Pcnuu 0 valoarc a lui x, acest lucru sc realizcaza prin intermedin! insiructiunii de apcl:

printf("xcc'td\tp(x)c'hl\n",x,i'X'x '/'x 10);

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 ;

Apoi, vom utiliza 0 instrucriunc while care sa permits cxccutia rcpctata a instruciiunii dc :\j11.'1 a 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 p(2), cstc ncccsar sa sc mnrcasca valoarca lui .v ell I. Accasta se ponte rcaliza folosind instructiuncu cxprcsic

x++;

C'lI ultc cuvintc, cstc suficicut Sit sc execute rc'pl'1al SCCV('I\\a de insnuctiuni:

p r j n t f ( "x ~,d \ t P (x) . 1.<1 \ ri " , x ,I' co' x 7' x ~ 1 (i) ;

xir:

x avind initial valoarea I. ACC:ls1l1 secvcnta fOl'llleaz:I corpul ciclului. De accca, ea va fi inclusa intrc acolade pentru a forma 0 singura instructiune.

127

Dcoarecc ultima cxccutic a sccvcnici de mui sus arc loc cind X"" 1 0, rezulta ca cu sc va executa rcpctat atita limp cit x <= 10. Dc <lCCCH, untctul ciclului while va n

in concluzic, proccsul de ca lcul co urmcaza a Ii rcalizat il puicm dcscric astlcl:

l. x='l

2. Atit (imp Cit x<0=10 se CXCCU!il:

2.1. Afiscaza pc .v '$i ptx}.

2.2. lncrcmcntcaza pc x.

PROGRAMUL BIV9

.include <stdio.h>

lila in () i* alisctli'.a vnlorilc polinoruului

p(x)·~}·x·x· 1·x· 10 pcntru x ,,_ 1,2, .... 10 »]

int x;

x 1;

while ( x <= 10) (

printf("x=%d\tp(x)=%d\n", x,3*x'x .. 7'x -10);

x++ ;

} t= sfirsit while */ }/* sfirsit main'/

Observatic:

Lirnbaju! C pcrrnitc scricrca de prograrnc compactc. De cxernplu, sccvcnta de mai sus poatc fi compactata inlocuind cxpresia

X <=, 10

Cll

++x <"" 10

In fclul acosta sc climina instructiunca cxpresic

x+f:

din corpul ciclului.

Tinind scarna de ordiuca opcrauilor, cxprcsia

++x <= 10

se evalucaza as! Icl:

1. 2.

Se incrcmcntcaza .r.

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

in caz contra!' se incheic cxccuria ciclului while ~i prin aceasta se termina si executia prograrnului.

in accst caz se va schimba atribuirca

x=1

cu

x=O

deoarece executia corpului ciclului incepe dupa ineremelltarea lui x. ell alte cuvintc, programul BIV9 poate fi rescris astfcl:

x=O; While(++x<=10}

printf("x=%d\t p(x)=%d\n·,x,3~x'x-7'x 10); ) ;* sfirsit main "/

Mcntiol1illn ca cxprcsia x++ <= 10

utilizata in antetul ciclului nu realizeaza acclasi lueru.

Intr-adevar, in cazul expresiei

++x <= 10

atit cornparatin, cit si corpul ciclului while sc executa cu valoarea incremcnmm a luix.

In cazul cxpresiei 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

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 ~i are 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 in radiani daca se inmulteste cu factorul Pill 80 (Pl=3.14159265 ... ):

a*Pl/180

Tabelarca functiei sinus sc va realize conform pasilor de mai jos:

1. f=PI/180

2. x=O

3. Atit limp cit x<=359, se executa: 3.1. Calculeaza si afiseaza sin(x *f). 3.2. Incremeuteaza pe x.

Pasul 3 de mai sus este analog cu pasul 2 din exemplul precedent. De aceca, el se realizeaza printr-un ciclu while asemanator. La realizarea lui vom face cornpactarea indicata in observatia de la exernplul respcctiv.

PROGRAMUL BIV10

#include <stdio.h> 'include <math.h>

#define PI 3.14159265358979

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", x,sin(x*f));

Observatie:

Valorile funcrici sinus se afiseuza cite una pc 0 linie. De aceea, progrnmul afiscaza 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.

In astfcl de situatii se pune problema blocarii execurici unui program dupa cc acesta a afisat un ecran de rezultate, Dupa analiza datelor de pc ecran, utilizatorul urmeaza sa deblochezc exccutia programului actionind 0 Insta oarccarc.

Un mod simplu de a bloca executia unui program cstc accla de a apcla functia getch in momentul in care se dorestc sa sc analizeze dale Ie afisate in fercastra uti lizator,

130

La apclul funcrici getch prograrnul sc blochcaza deoarece sc astcapta acnonarea unci taste. Totodatfl SC afiscaz» automat fcreast .. q 'd;l;'":'.lIj.:",.~ I,. 'I aqi?narea unci taste onrecaro, programul se dcblocil~a7.a. ~ ~u."", ""'"u" r r , ,.u

') h~ c.~emp~ul d,c Eqa V(~1Jl apclu fllnqi:l gctch ori de cue ori programlll a al1~at ... J .de valcri ale functici SInUS. Accstc valon ocupa 23 de linii ale ccranului. Pe linin 24 se va afisa rcxtul:

pentru a continua acrionuri o tasla

Fun~tia getch sc apelcaza in corpul lui while de indata cc sin! afisatc 2) de valori, In acest seep utiliz.{1111 valorile 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, ...

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: . . , , ~ ,

pentru a continua aetionati 0 lasla

Tinind searna de aces[e obscrvani, lI10dilicam prograrnul de (;1\(1 ca mai jos.

PROGRAMUL BIV10A

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

.define PI 3.]4159265358979

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 ) { printE("sin(Cl;d),,%.16f\n", x,si.n(x'f»);

if((xtl)',;23 0) (

pcintf(Upentru a continua act.ionaLi getch ();

)/* sfirsil while ,; ) /* sfirsit main.;

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 umiat de \;11 caractcr ncnumcric (de cxcmplu sl'Ir0itui de fisier: <Ctrt=-z. 0 litera etc), iar dupu nccsta sc va actionu tasta linter.

l'rogral11ul de f'~l\~1 arc o parte care sc executa rcpctnt: eilL'slC: coustructia curcnta dc: la intrurc.

I)<lC;1 1<1 intrurc ,-,I alla! lIll mtrcg. utuuci a,;c:sta SL' adunu ln vulourca unci

v.uiahilc ,I ~i sc rcvinc la punctul a,

Altlcl sc mtrcrupc ciiircu.

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 curcia I se

'alribuic intrcgul citit, atunei la eitirea unui intrcg, cxprcsra:

a.

b,

SCJoE("%d",&i)==l

1 I 'J' u: II Dcci valoarca lui i ucbuic adun.ua la s alit limp cit

art: va narca <I( ( l l·. . ~ ~ . . ' . tilizcazi in

cxpresia de mai sus cste adcvaratu . Dcci cxprcsia dc mal S,tlS 5C U 1 l:~:lza

anictul insiructiunii while, iur eorpul ciclului se compunc dill msu ucnunca:

5::;:S+ i:

PROGRAMUL BIV11

tI i nc l ucle "':stclio. h > . N *1

. i t ) I' oitcstc ,111 sir de intrcui :::'cI)arati prin caractcrc albc 51 afiscaza surna lor

rnn 1 f, """ c-

i nt; i IS,.

c: -+. L ;

'Hi\n", sl;

S'I ·C "C'I'I'C \111 program care ciicstc UI1 intrcg II, calculcaza ~i aflscaza pc nl.

4.12 " S " b I

;\ vern:

'=1*"'. *(11-1)*11 I)Cntr\lIl>O~i()!scconsidcmcgalcu L

11." ~ _J ,.. _,

Aces: culcul implica till proccs ciclic, [ntr-adcvar, fie

F= I 01 1==2

Atuuci:

f*i= I *2=2!

132

Cousidcrarn instructiunea de atribuirc:

I~r*i;

Cum f*i=2!, rezulta ca F=2!' Putem folosi aceeasi instructiune pentru a calcula pc 3!.

lntr-udevar

3!=2!*3=f*3

dcci cxprcsia: l'I<i=3! daca, in prcalabil, i se marcstc cu 0 unitatc, Rczulta ca alaturi de instructiunea de mai sus, este nccesar sf) consideram :.)i instructiunca de incrcmcntarc a lui i:

a. f=f"i;

b. i=i+l;

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:

2L 3!, 4!" ..

Penta! a calcula pe n! (n> I), sccventa de instructiuni a-b trcbuie sa se execute rcpetat alit timp cit i nu-l dcpaseste pe 11, adica atit timp cit cxpresia: i<=n

estc adevarata.

Aces! proces de calcul 5C realizcaza simplu prin insuuctiunea while de mai jos:

while(i<=n) ( f= f* i;

i+-t;

lnstructiunea cornpusa poate fi compactata astfel:

f:=f*i++;

Inrr-adevar, operatorul de incrementare sc aplica postfixat, deci f se inrnulteste cu valoarea neincrementata a lui i, ca ~i in cazul instructiunii compuse initiate.

PROGRAMUL BIV12

Ninclude <stdio,h> Binclude <stdlib,h>

main () /* citcstc pc n din intcrvalul [I ,170J, calculcaza si afiscaza pc n! "/ (

int n , i; double t;

printf("valoarea lui n:"); if(scanf("'l3d",&n) ! 1) {

133

printf("nu s-a tastat un intreg\n"); ex i t t Ll :

if ( n < 0 II n > 170 ) (

printf("n nu apartine intervalului [O,170]\n'); exit(1) ;

f 1.0; i 2;

while ( i <= n )

f " f*1++; printf("n=%d\tn!=%g\n".n,f); }

4.13 Sa se scrie un program care citeste componentele a dol vectori x $i y, calculeaza si afiseaza-valoarea produsului lor scalar.

Daca vectorul x are componentele: xl , x2 ..... xn

iar y:

yl,y2, .... yn

atunci produsuI lor scalar se defineste prin suma de produse: (x,y)=xl *yl +x2*y2+ ... +xn*yn

Componenrele celor dol vectori se tasteaza In urmatoarea ordine: xl yl

x2 y2

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.

PROGRAMUL BIV13

#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++;

134

printf("x[~dl\tYI%dJ; ",j 'I, i.l);

p r in tf (Hnumaru] ('ornp()n(~nt,'l()r vc~ctorilor::~f)d\nU I i ) i pri n t f ("produsul ,;(,d),I1''''l,q Jl",proclscal);

4.14 S,I sc scrie un program care citcstc tim) ccou caractere imprimabile si lc afiseaza ca si caracterc minus. Prograrnul sc intrerupe la tustarea unui caracter care nu apartinc codului ASCII.

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 caractcrului cirit, atunci insrructiunca

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

care cstc difcritu (IL' I.cru (adevarat,l) pcutru caractcrclc codului ASCII ~l ll'lll (falsa) pentru resin I caractcrclor.

PROGRAMUL BIV14

#include <conio.h>

main () ;* citcstc curactcrc imprimabilc tarn ccou si Ie afiscaza ell si caractcr minus "! (

int c;

while ( c it ( c

Cjf,tdl (I I

)2 lrx,X C' < 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 [0,255].

Pc 0 lillie sc va afi~a valo.rrca coclulu: urm.ua de imagine» corcspunzuiourc

us

afisata prin Iunciia putch. Ecranul sc blochcaza dupa 23 de linii afisatc sub forma indicuta mai sus ~i dupa ce pc linin 24 sc afiscnzu mcsajul:

pClllru a continua actiollati () lasla

Dupa acuounrca unci tasIc eeranul xc dcblochcaza pcntru a se afi~a un nou set de imagini ,_;i a~a mai dcpartc,

PROGRAMUl BIV15

• include <stdio.h> tlil)clucle <c.ou io . II.>

rna in I) ;, apclcaz» luuctia putch ell valorilc codului ASCII cxtins ./ {

oint c ;

(::;;: 1.;

while I ++c <= 255 ) ( printfl"cod:%4d\t",c); putch (c ) ;

putcll,,!: I' \'1') ;

ifll c+1) % 22 0)

printfl"pentru a continua actionati 0 tasta\n"); qetch I) ;

4.16 Sa se scric un program care citcstc rczuliatclc ul101' masuratori: x I, xZ, ... , XI1

calculcaza ~i afiscaza:

• media ariimetic{t a ruasuratorilor: - media gcornctrica a lor;

Zil

- abaterea patratica.

Daca 1101[1111 cu meda media aritmctica a masuratorilor, atunci abatcrca patratica cstc radacina patrata din cxprcsia:

l (x l-rncda)" *2+(x2-mcda)* *2+ ... +Ixn-mcda)" *2F "Times New Roman" liN uncle:

N

- Estc 11 sau 11-1.

Nurnitorul sc ia egal ell n-I cind 11 cstc rclativ mic, De obicei:

N=n-i pentru 11 < 30

~i

N=n pcntru n >= 30 Evident 11 >= 2.

!36

Dcoarcce pentru calculul abutcrii patraticc cstc ncvoic de l1l~lsuratorile x I. x2, ... , Xl1, cit ~i de 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.. •

Programul lisleazii 11111suriltoriic citirc, cite 5 IlC un rind. De ascrncnca, programul sc blochcaza dupa afisarca a 23 de linii cu masuratori.

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

PROGRAMUl BIV16

«Jofina MAXMAS SOD ffdefine LIMNUMIT 30

lklefine APEL print£I"rnasuratoarea a %d-a:", n+l)

llinclude <stdio.h> Ninclude <rnath.h> #include <conio.h> Ilinciude <s t d.l ib . h»

rna in I) /* citcstc un set de masuraton, calculcazn si afiscaza media lor aritmcticn, gCOInctrica si nbatcrca patratica "]

float X[MAXMASj; double meda,medg,api int D,ng, i;

n=ng=O; meda=O. 0; -r : medg=1.0; APEL;

/* - sc citcsc mHsnratorilc; ~ sc insumcaza:

- sc inmultcsc cclc pozitivc ,,/

whilelscanfl"%£", &x[n] meda += x [n] ;

ifl x[n]:> 0) ( medg *= x l n l ,

ng++;

1)(

n++;

APEL;

} if{n<1){

print£("nu s-a tastat nici 0 rnasuratoare\n"); exi t (l) ;

137

meda /= n;

/* calculcaza media gcomctrica */ if ( ng < 2 ) (

printf("nu exista nici 2 masuratori pozitive\n");

medg = -1.0;

else

medg = pow(medg,l.O/ng);

if ( 11 > 1) (

/* calculcaza abatcrca palralica '/ ap = 0.0;

i 0;

while ( i < n ) ap += (x l i ]

meda)*(x[i) - medal;

i;-+ i

if ( n < LIMNUMI'r) ap /= n-1;

else

ap /= n;

else

printf("nu exista nici 2 masuratori\n"); ap = -1;

/* listcaza masuratorilc, cite 5 pc lin rind */ i = 0;

while(i < n) (

printf("x[%d)=%g%c",i+1,x[.iLi%5==4 II i==n-1? '\n':' 'j;

i++;

if(i%(5*23) == 0 j

printf("pentru a continua actionati 0 tasta\n');

getch ();

;* 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( n> 1)

printf("abaterea patratica=%g\n',sqrt(ap)j;

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 lui (X,d cstc i+ 1. Acosta dcfincstc numarul de ordinc

138

al masuratori i curentc.

Paramctrul corcspul1z{ltor lui

cstc x] i I ~i rcprcziuta chiar valoarL'a

masuratorii curcnte.

Dupa spccificatorul urmcazu spccificatorul "i«; <I carui par.uncrru

dcfincstc caractcrul care sc afiscaz» dupn valoarca rnasuratorii curcntc. Accst caracrcr poate f spatiu (' ') sau caractcrul de rind nou ('\n').

Pe primul rind sc afiscaza valorilc:

xj O] xj l ] x[21 x13] xl41

deci, dupa masuraiorilc de indice (J, I, 2 ~i 3 sc afiseal<l un spatiu, iar dupa xl41 urmcaza caractcrul de rind !lOU.

Analog, pc rindul al doilca sc afiscaza valorilc:

xl51 xl()1 xl71 xiX] xl91

dcci, dupa masuraiorilc de indite 5, (l. 7 ~i ~ sc afiscaza lin sp.uiu, iar dupu xl91 1I1Tllcazi\ caractcrul de rind nou.

In general, pc un rind sc afiscaza valorilc.

xl5kl xl5k+11 x15k+21 xl5kf31 xlSki41

Se obscrva ca dupil o masuratoarc de indicc :lk 14 urmcazn caractcrul de rind nou, iar in rest urmcaz:1 lin spaiiu.

Un indicc i cstc de forma 51\ 14, ((;le;1 rcstul nnpanirii lui I la :1 cstc cgaicli 4, adieu, daca cxprcsia:

i%5==4

cste adcvurata.

Dc asemcnca, dllpa ultima mnsur.uoarc sc va alis:! caractcrul de nnd nou. adieu dac;1

arc valoarea adevarat .

Rczulra ca afisarcu caractcrului de rind nou Sl' V;I EICL' .uunri CIIIt! cxprcsi.:

i%5==4I1i'~'=n-l

cstc adcvurattt . in rest sc :di::;c;lla tin carncrcr spa\iu. Accasta sitllali(~ sc leproillta suuplu PIIIIl'~pll'sia c!llllll\itlll;tia:

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 121

Pcntru ;1 calcul.: r.ulicalu! de ordinul !l!~ dill /I/("'([! Sl' apeiL-ala rUIlL·lia I)UI'·

lY)

cu p:\ral1lclrLlIII/('dg~i l.(iin,!.!.

1'\1111'11,1/'(111' .uc proioupul: duuhle PO\Y (duub lc .v.do uhlc r):

~I rcturncuzn pC ,\ la putcrca .1', in GIZlIl de 1;1\<1 1 ,(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;.

4.17 Sil sc xeric UII prugralll C;\Ie cill'~le UII CIIVIIlI (sllcccsiullc. de caractcrc dil'crile de caructcrclc alhc) ~i afiscazu prcfixclc 0i sufixclc lUI dilcritc de cl IIlSU~1.

Fie cuviruul:

c1t'r

atunci prcfixclc accstui cuvuu, difciitc de cl insus: suu: c

cl

c+t

c+t "

in mod 'll1alo,!.!, sufixclc accluiasi cuvuu sint:

*1' t* r

1 I * I'

Sc prcsupuuc (;1 un CU\'11l1 llli dcpa~c;;lc 7() de carnctcrc. . i

Prouramul ;IV;II1Scal.a peste e\'CI1111,t!e!c cnructcrc ulbc cure prcccd cuvuitul de

prclucrat. Apui cilc~le caructcrcle din compuncrca cuviniului ~i lc pastreaza ea clemente ale tabloului tab.

Cuvintul sc tcnnina 1<1: intiluirca 1I1l1li curactcr alb;

iruiluirca sfirsitului de fisicr:

- dupa cc S-;\lI eitit 70 de caractcrc care I1U sint albc.

Caractcrclc sc citcsc folosind macroul gctcluir. Accsta se apclcaza prin

cxprcsia de atribuirc:

c::.:·qetcha:r ( )

care atribuie lui c codul ASCII al curacrcrului cirit.Pcntru a avansa peste caracierclc albc cstc IlCCCS,lr sa stabilim daca eodul atribuit lUI c csre codul

140

spariului, al tabulatoruilli sau al caractcrului de rind nou. Expresia (c=gctchar()}==' ,

compara codul caructcrului citit ell eel al spatiului ~i arc valoarea adevarat, daca s-« eitit un spatiu fjoi./ci/s in caz contrar.

in mod analog, cxpresia

e=='\t'

cstc adevaruta daca S-(l eitit earaeterullabulator, iar expresia e"'='\n'

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:

(1) (e=getehar())==' '1Ie=='\t'lIc=='\n'

estc adcY[lrata daca ~i numai daca se citestc un caracter alb,

De aici, rczulta ca pcntru a avansa peste caraeterele albe vom utiliza un ciclu while care sc va executa atit timp cit expresia (I) este adevarata. Deci antetul ciclului cstc:

wh i Lo ( (co'(Jetchar () ) "llc"~ '\t '1Ic== '\n' )

Deoarecc acest ciclu nu are de realizat altceva decit sa avanseze peste caractercle albe, corpu l lui se compline din instructiunea vida,

Citirca 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,

Prima conditio sc cxprima prin negatia cxpresici (1), presupunind ca c contine

deja caracrcrul curent,

(2) !(c==' 'lIc=='\t'lle=='\n')

Tinind scarna de Iaptul Gil cxpresia '(allb)

estc cchivalenu; cu:

!a&&!b

cxpresia (2) se poate pune sub forma:

(3) !(c==' ')&&!(c=='\t')&&!(C=='\I1')

Deoarccc expresia:

!(a==b)

cste echivalenta cu:

141

al=b

expresia (3) se po ate pune sub 0 forma mai simpla: (4) cl=' '&&cl='\t'&&cl='\I1'

A doua conditio pentru continuarea ciclului while este ea sa nu se citeasca sfirsitul de fisier. Aceasta mseamna ca expresia:

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

De aici rezulta 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:

t[i++}=e;

Si

c=getchan);

Pentru determinarea prefixelor cuvintului urmam pasii de mai jos unde:

j k

- Are ea valoare lungimea cuvintului.

- Are ca valoare lungimea prefixului curent,

- Numara caracterele 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 curent. 2.4. Se mareste jell 0 unitate pentru a afisa prcfixul urrnator.

Pasul 2 sc rca lizcaza prin doua cicluri while imbricate:

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. "]

pu t ch a r ( '\n' ); f* puncI1l12.3. */ j + +; /* pUllcluI1.4. *'/

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.

Sufixul de lungime 3 se cornpune din caracterele: t[i-3], tli-2);;i tli-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 <stdio.h>

#define HAX 70

linclude <stdlib.h>

main () /* citcstc lin cuvint 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')

i I (c ~ l':(lF ) (

printf ("cllviIlL v i d vn=j . exit(l);

l" sc citcsc caractcrclc cuvintului de la intrarc ./ .i = 0; /* numerator de caracrere v

whi Ie (c ! ",' , && c ! = '\ t' && c ! = '\n'

142 143

I

I

[,Ix c: ! c EOF' ,,,'. .i <; 70) (

tli'+] C;

C :: qet.char t) i

/* arlse;\:;a prclixclc ('\1\'1111111111 dl' illll.t',illll' i */

) I; /1' 1 an.: (:I \,,11);1)(' Itlll!.'JIIIl'1I pll.'ii\\Ill11l·\III.'1I1 -iI

wh i.l EO ( j -; .i ) (

k" 0; /" "'"1UlI;.>lol 1ll'111111 caraclcrck prcfixului: de I" 0 luj- I */ wh i l e I k < j I

putchar(t[k++]) ;

putchar (' \n'); /* dura prcfixul afisut "~I j ,I· I i

/* sfirsil ulisarc prcfixe ')

/*' afiscaza sutixclc cuvintuluir iu] "]

j" 1; /" lungillll'<l sufixului curcnt *'/ wh i 1" ( j < i ) (

k =:: i - j,. I'" numarntor pcntru carncfereic sufixului: dc la i-j 111 i-I =t

while( k < i )

putchar(tlk++] );

putchar('\n');

j ++ /'

) )

4.7. Instructlunea for

lnstructiunca for, en ~i instructiunca while, se utilizcaza pcntru a rcaliza 0

structura repctitiva conditionata anterior.

Formatul ci cstc: ror(exp I ;exp2;exp3) instruciiune

undc:

exp l , cxp? si cxp s

Antctul instruqiuniijin' cstc:

- Sint cxprcsii.

fortcxp I ;exp2;exp3)

iar /II.I'II'IIC(IIIII(, 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'01 CII cxprcxin din'cielul while. -

Instruc!iullcajiJ/, sc executa astfcl:

I. Sc executa sccvcnta de initializar« dcfinita de exp /.

144

2.

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

3. UUjJ<l C:Xcc'utan:a corpului ciclului :ie' executa .scCVCIJ\;1 de rClllipaliLarc dcfinita de exp S,

Apoi sc rcia cxccuria de lu pasul 2.

Ca ~i ill cazul instructiunii while, instruc\iunea din corpul ciclului (or nu sc CXCCUl<l niciodata daca eXfJ2 are vulourea zero chiar de la inceput.

Exprcsiilc dillul1lctul luifbl' pOL fi 01 vide. Caraclcrele punct si virgula vor fi totdcauna prczcntc.

Exemplu:

Secvenra de insumare a c1cmcntelor tabloului lab: s=tab] U'[+tab] Ij+ ... +tabl n- I I

sc rcnlizcaza cxecutind rcpctat iusuucriunca compusa:

""8 I tal, r i] ; i-t-+ ;

un de initial 5=0 0i i=O, alit limp cit i<l1. Ea sc poatc rcaliza eu ajutorul inSlntetiunii./i)/' de rnai jos:

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., de conditia i<n

iar exp3 cstc exprcsia i++

Conform dcfinitici instructiuuii for, la inccput se evalucaza cxpI , dcci sc executa ntribuirile

s=O

i=O

Sc cvalucaza cxp2, adieu sc dctermina valoarea conditici

145

i<n

Daea ea este adevarara, atunci se executa corpul instructiunii for, adica suma s=s+tabji]

Apoi se evalucaza exp3, adica se executa incrcmentarea 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 fi sensa cu ajutcrul instructiunii while astfel:

s=O;

i=O; while(i<n) (

s=s+tab[i] ; i+,t;

in general, instructiunea ror: for( exp l ; exp2; exp 3) instructiune

poate f sensa cu ajutorul unci sccvcntc in care se urilizeaza instructiunea while: exp l ;

while(exp2)

{

instructiune 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:

'vhilc(ex]J) instructiune

este echivalenta Cll instructiunearor for(;exp;)

instructiune

146

o instrllqiullc/hr de forrnr: f'or(;;)

instructiun«

csre valida ~i en csre cchivah:lltil ell insirucuunca II'''i/(' de mai jos: while(l)

instructiim«

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 utilizarcn inSll'ut(iuniijor in ciclurile in care sint prezcnte partite de initializarc ~i rcini(ializare. De obieei, accstc cicluri sinr asa nunutcle cicluri ell pas.

ExerCitii:

4.18 Sa se scric un program care cite~te intregul n din intervalul 10,170], calculcaza ~i afi(,caza pc 111 .

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 <stdio.h> #include <stdlib.h>

main () /* citcstc pc 11 din intcrvalul fO,170J, calculcaza si afiscaza pc n' */ (

intn,i; double f;

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 > 170 ) (

p r Ln t I t vn nu i.'Piu·tin,' int.exvdlului. (O,l,)O)\n"); ex i t (l) ;

for! f=1.0, i=2; i <= n; i •• ) f' i; printf("n ='tcl\tn! oo'Lq\n", n.Ci;

4.19 Sa sc scric un program care citc~te pc 11 ~i a, calculcaza si afiscazn valoarca lui a In puterca a /1-a (n**n). II esrc intrcg ncncgativ, ;;,1' a csrc lin I1l1l11;11' ourecnre. Ca!cnlck SL' Iac ill fllliallta IOllg dill/hit'.

147

() 1l1L'I(ld~1 suuplupcntru u !'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 [3IV'l~

ro . r,

i;It'11 ., Ii iil

, 1 ;

1 d"lil I" ,l, I',

") ;

I' ! I {

if (::;cn;1f ("

p ri u trt vnu ;:; ,.,~ ld::~(-,1;: Illl (1t!ftlnr\l,"); ";'; i t. I i I ;

p ri L' \ H

j_ t)

"I:

\ II

) (

i I I

1.1] i 111 I' ( j, 11\ I i \_ ( i) ;

,[ I,l:·~t<lt 11[1 illll(_~·q I II "t\1 "q1.1 I iV\11<l);

(,] 0 I P 1, 0 fJ; i < n ; il" 1- }

P -i :

pr iu t r (

\ n " I,"'! I !\ I {,) l :

Ohscrvnrii:

I. Fuuctia I)()II', de prorotip:

do uhle po\\'( double v.duublc .\·L scuti lizcavu pcutru date de lip double,

, i\lcl\lda lI\ il iv.u a III prm!r~lnllil de Lila 1111 csk cl'icicllla pcntru /l rclativ marc, dcourccc ucccs itu I1\\lJ\C inmuluri. Numarul lor poetiC II reclus substantial I'!\lcl'\!ind l';1 1ll;1I jos.

Ftc rO"d

Lxccuuud l'epc\aIIIlS\J'lIC\ilIJ1C<I de auibuirc

sc gCl1crcaza putcri lc:

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)

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,

Corcspondcuta dintrc tcrmcnii sirului (2) si cifrele reprczentarii binare sc face de la dreuptu sprc stinga udica I sc punc in corespondcnta CLI ultima cifra a rcprczcnrarii binarc, 2 Cll pcnultima, 4 cu antepenultima etc.

1('\.''''t~lnlll· I J ,,"~·K.II'J I ••

Fie n=43. in binar /I se rcprezinta astfcl: 11=10101.1

Rezulta ca /I esrc suma termenilor 1,2, 8 si 32 alesi din sirul (2) conform cifrclor 1 din rcprezentarea binara a lui:

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 I til 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:

I

i

I I

1. p=J

2. f=a

3. Cit timp 11 cste diferit de zero se executa:

3.1. Daca ultima cifra binara a lui II este egala cu 1, atunci p=p*f 3,2. Se gcnereaza termenul urmator din sirul (1): f=f*f

3.3, II se deplaseaza spre dreapta cu 0 pozitie binara,

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 tcrrncuul care s-ar genera pentru n= 1, dcoarece eli toate en cl BU este necesar, calculul lui ponte conduce la 0 depasire flotanta superioara. In acest fel, punctul 3.2, se schimba ell

[49

daca n> 1 arunci f=P'f

Programul BIV 19A ridica pe a III 11 folosind procesul de calcul descris mai sus.

PROGRAMUL BIV19A

#include <stdio.h> #include <stdlib.h>

main () 1* citcstc pc 11 si a. calculcaza si afiscaza pc a**n *1 (

int n i i r

long double a,p,f;

printf("Baza a = "Ii H(scanf("%Lf", &a) != 1) (

printf("nu s-a tastat un numar\n"); exit(1.);

printf("Exponentul n = "Ii if(scanf("%d", &n ) != 1. II n<O ) (

printf("nu s-a tastat un intreg nenegativ\n"); exit(l);

i n; for(p=l.OL,f = a; if ( n & 1. ) P H(n>1.)f

n ; n »= 1. ) (

* = f; t* factor selectat din sirul (I) "!

* = f; t* genereaza termenul urmator din simi (I) */

)

printf("a=%Lg\tn=%d\ta**n=%Lg\n",a,i,p ); }

Observatii:

1.

expl realizeaza initializarile de la punctele 1 :;;i 2 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.

2.

3.

4.

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

programare.

Ea are fortuatul:

do

instructiune while(expresie);

lnstructiunca do-while se executa in fclul urmator:

I. Se executa instructiune

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

Sc obscrva ca in cazul acestci instructiuni intii sc executa instructiune ~i apoi se testcaza conditia de repctare a executiei ei.

Instrucriunea do-while este echivalenta cu secvcnta:

instructiune while(expresie) instruct iune

Consideram ~i in accst caz ca, instructiune rcprezinta eorpul ciclului do-while.

In cazul instructiunii do-while corpui ciciuiui sc executa cei rutin 0 data, spre dcosebirc de cazul instructiunilor while ~i for, cind cstc posibil sit nu se execute niciodata.

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 (0,1), se ponte Colosi metoda itcrat iV{1 :1 lui Newton de mai jos.

Fie sirul:

x[O], xII], .... x]n], ... undc:

(I) x[n+ 1 ]=0,5(xln]+a/x[ 11)) pentru 11=0.1,2 •...

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 tcrrncni C()l\SCCllIIVI ;11 <irului Sil I'lc Illai mica decit Ef'S=(),OOOOOO()OO I

S'I obscrvam ca pcntru a rczolva problema cu metoda indic.ua mai sus, Ia ficcarc pas al calculului, sint ncccsuri numai dOl tcrrncni iii sirului:

a, Dill x l n ] sc dctcnuinn xl n: II cu rclutia (I).

b. 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] 111 i 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, Tcrmcnii sirului sc ohtin cx ccutind rcpctat sccvcnta de atribuiri:

x Ix2;

x.2=O,S*(x I! .i/x I);

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

'. I f I 1 I' bile 1'\',1 aproximcaza

rcpcta sccven\a rcspccnva, a uc va oarCH val' a , _ , ,

raducina patruta din (/ cu o croarc mai mien dccit t-:I'S,

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:

x200 I;

PROGRAMUL BIV20

Hirlclude t(iio.tl>

».irlc],ude <st~Jlil).I'i>

ma i 11 I) I' citcstc pc a din intcrvalullt), II. cnlcuicaz.i 0; afiscaza ralinc;na patrnta din a */ I

clou n l o d,xl,x),:/;

prirltf("1'astali valoaren lui it = II);

ifisc"tll("Uf",&il) ! 1.!! il < 0 II ;, > I) (

printfl"Nu s-a ta';\:dt un numa r in inteJ:vdlul [0,1)\n"); o x i t ( 1) ;

'I " cz c: 0 )

:.,:>. (j; I'" rad;lc1na pallala din !L'Wl'slc zero''!

152

elsu

i £ I a ,,= 1)

x2 = 1; I" radacina patrata din I eSIC I */ eIsEe ( /* a CSiC dilcrit de () sau 1"'/

x2 l;

do

xl = x2;

x2 0,5*(x] + "/xI): i f (( y z; x.l xl.)" o

Y -Y;

/* y abstx l-x2)'/

while( Y >= EPS );

I"~ sfirsit else */

printf('a=%,11g\tsqrt(a)=%,11g\n',a,X2) ; )

Observatii:

I, inslruqiullea c/o-while ponte f scrisa mai compact astfcl:

do

xI ·.~x:::;

x2dl. ':1* (xl'ln/xl); Jwhilelly:xl-x2)<O?_y;y,y>=EPS) ;

2, 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,

4,21 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.

Proccsul de calcul inccpc cu dctcrrninnre., numarului de bancnote de 1000 de lei. in acest scop se imparte suma respectiva s la ,I 000:

s/lOOO

Pentru a determina numaru] bancnotclor de 500 de lei se determina restui imparririi lui s la 1000 si acest rest se imparte la 500 ~i asa mai departe, Se obtin pasii urmatori:

I. q=sl 1000; afiseazd q

2. s=s% 1000;

3, q=s/500; afiseaza q

- "

4. s=s%500;

5. q=s/200; aiiscaza q

6. s=s%200;

7. q=s/l 00; afiseaza q

8. s=5%100;

9. q=s/50;af(~ea::d q 10. s=5%50;

I 1. q=s/20; afiseaza £j

12. s=s'%20;

13. q=sll 0; afiseaza q

14. s=s'Yo I 0;

15. q=s/5; afiseaz{i q

16. 5=s%5;

17. q=s/I; afiseaza q

18. 5=5%1.

Se observa ca secvcnra: q=s/n; afiseaza q s=s%n;

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 0 metoda simpla prin care sa sc atribuie lUI 11 valorilc corcspunzatoare. Aceasta se ponte rcaliza daca pastram datelc respective intr-un tablou de tip int, Fie:

111on[01= I, m0I1[31=20, mont 6]=200,

l11onI11=5, 111011[41=50, 111011[7}=500,

111onI21=10, mon[51=100, 1110n[8]= I 000.

Atunci IJ poate fi inlocuit prin monli], unde initial i=8 si se decrernenreaza la

fiecarc pas al ciclului. Dcci urmeaza a se executa rcpetat secvenra:

q=s/mouli]: afiseaza q

s=s'zsmonj i];

i=i-l ;

Aceasta secventa se va executa repetat pina cind s devine zero.

PROGRAMUL BIV21

#include <stdio.h> #include <stdlib.h>

rna in () /* cxprima 0 sum" de lei in bancnorc si moucdc de 1000 lei, 500 lei etc, */ (

154

int monl9];

Ions; 51 qi

int ii

printf("Tastat"i suma: II) if(scanf("%ld",'\'s) != 1 Is <= 0 )

print:f{"nu S··a r.a s t a un intrr'g po zi r iv vnrj . exit(1) ;

monlO] = 1; monll) mon[4] = 50; monlS] monl7] ')()o; ""Jnlnl i :::: 8j

do

5; mori [2] ,010; [finn III .c ! 0 ;

100; mon[6] 200;

10(j0;

q = s/mon[i.I;

if (q ) /* utisarcn se face daca q estc dilCril de zero "! i f ( i < () ) /'1: monede "!

if( q i[(

1. ) /* C'xistn (} singura ItlOIlL'da "I

i == 0 ) I" o moncd ... d<~ I I"" "1 printf("o moneda de 1 ].eU\r1");

elSE:

p ri nt.tt v o lflonedi:'l a. :t;d l e i vne,

rnori [ i I ) ;

e Ls e l" mai I11Ultc ruoncdc 'il

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",

q, mon [i]);

else /',. 11:1I1l'11I){C')

if (q 1) /". o sing"ra hancnota "!

printE("o bancnota a %d lei\n",lnonli]);

el se I" nuii multe hancnore *1

printf{"{t1d bancnot() ("I 'l-,d 1t",i\nU,i"l, mont .i I I;

) while ( s %= mon[i--j);

}

4.9. Instructlunaa continue

Accasta inslruqiullc se ponte utili/a numui ill curpu] unui ciclu. hi pl'rIlIite abandonarea iteratici curcntc Forrnatul ci csrc:

continue;

Efectul instrucriunii continue cstc urrnatorul:

a.

In corpul instrucuunilor while ~i do-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

-1

h. 111 corpu] instructiunii r.»:

I.a inulnircu instrllC\llll1li continiu: xc abalJ(ioIlCdZ<lliLTd\i<l curcnta si sc trccc la cxccuiia pasului de rcinitinlizarc.

lnsuuctiuuca continue nu cstc (l instruciiunc obligatoric. Prczcnta ci marcstc Ilcx ihilitatcu III scricrcu programclor C. La conduce adcsca la diminuarca uivcluiilor dc' imhricarc ale instruruunilor i/utili/:ill' III COIj1l1l ciclurilor.

4.10. Functiile standard sscanf ~i sprintf

Hibliotcca standard <l liuibajclor C :jl (_'I I conrinc lunciiilc ,1'S(,(/1I/01 sprint]' carl' 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' III I 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.

Exemplu:

inL zi,luna,an;

chin da t a .. _caLendll11;

s p r i.n t.f (data,,_calend, "%02d!%02d/O"d", z i , luna, on); pu ts (da ta"ea 1 end) ;

puts {data .. _calend) i

Functia sscanj'rcalizeaza, ca ~i funcria scan], convcrsii din format extern in format intern. Dcoscbirca consta 111 Iaptul C<I de data aceasta caractcrele nu sint

156

cititc din zona tampon 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 de apelul functici sscanf. Astfel de inlocuiri sint utile cind dorim sa eliminam eventualelc 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 i

qets(tab) ;

SSCDIlt{tab, "%d ~d %d",&zi,&luna,&an);

I

Amintim cit functia gets returneaza valoarea NULL la intilnirea sfirsitului de fisier.

FUI1C\iilc sscanfc: sprintfe» prototipurilc in fi~ieruI5tdjo.h,

Exercitii:

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 <stdio.h> #include <stdlib.h>

157

main () /* citcstc un intrcg pozitiv de lip long, stabilcsrc daca accsta cstc un numar prim si afiscaza un mcsaj corcspunzaior Il<j

long n: long i; int j;

char tab[255]:

do (

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

Observatii:

I. Utilizarca instructiunii continue sc ponte omite folosind 0 instructiunc if'c» alternativa else:

if (sscanf ( ... ) ! =111 n<=O) (

j=l;

else

j=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.

158

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 1Il alara cicluluiro»:

long q;

q=sqrt(ldouble)n); for{j=1.i=2;j&&ic=q;i++) if(n%i==O)

j=O;

o alta simplificarc posibila este schimbarca inslructiunii ij"diB corpul ciclului fill" cu:

j=n'1.,i;

4.11. Instructtunca break

!nstruc\iul1ca break cste inrudita cu instructiunen continue, Ea arc formatul: brenk:

Peate fi utilizata in corpul unui ciclu. In acest caz, 1'1 intilnirea 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

I

dcci xe va testa condiu»

p-a. () && p-h () 8.:& p-e () care trcbuic sa lie adcvarata.

PROGRAMUL BIV23

1Ii.11Cllldc· <;.;l:di,n.!:

ll inc ludo <,,:I .. ell ill.li> »include <mnth.h>

!!1d i n t ) /"1< Clll'sll' musurilc l.uurilor II110i Irillllghi si afISC:l/,:1 aria lui "!

rl()u b 1 e tl I b, c, 1'> ; cho r ti)bl7.S'ij;

du ;' cil~'IC Ill;tsunk blUlilollliuligiliulul '/

do ( l" cil~SI~ pc a '/

1" i 1)1..1 ( "" "i ; iElgets(t"hi == NUL~ i

p r I n t' r ( " s - a L d S L (] I EOF' \ n " ) ; exit: (1);

)

ifU,scan[(tab,"%lf",&i)) == 1. && a>O)

brl'"l k; 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) print:.[{"s-·a t.a s t.a t EOF\n"); exi t (1) ;

) .

if(sscanl(tab,"'nf",&b) 0.=:[ ,'.,Ix b>())

broa k , Ii' sc icsc dill ciclul do-while dcoarccc s-a citit vuloarca lui b *1 f,)l"-int f ("rlu So-i) to s t a t un nurnar po zi.t iv\n");

I).t.illtl.(":~it~ r(}.i,\ citi_!_Cd l ui \,1\11");

whi 1" 11);

do (

pritltf:("c' ");

it(gets(t~b) == NULL) pritlLE("s-a t.a s t.a t. EOF\n"); ex it Ii) ;

if(sscanf(tab. "%1(",&c ) =: 1 && c>O)

bu,ak; /' sc icsc dill ciclul do-while dcourccc s-" citit valoarca lui c *1 o r i nt.f ("nu :;;-(1 t.a s t.a t; un numa r po zi t i v vn vi .

pr:tnt'f{"s.c; r(~id (~i.Lic-c:('l Ju i c\n"};

wh i 1 e (1.) ;

p (a + b + c) I 2;

if I p-a > 0 && P -b > 0 && P c >() )

brei! k; I" sc iest: dill ciclul <I, i-whilc cxtcnnr dcuarccc a.b.c p(li Ii IIW.SlIlik lal lin lur uuui Irilillgiti "I

160

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

4.24 S,j sc scrie un program care citcsic doua numerc naturale $i pozrnvc, calculcaza ~i afiseaza ccl mai marc divizor cornun u l lor (c.m.ll1.d.e.).

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.

Fie accstca a ~i b.

2. Se imparte a la b; lie (j ;;i r citul, respectiv restul acestci imparuri: a=q*b+r.

3. Daca r este direril de zero, se fac atribuirile:

a=b si b=r

~i sc rcvine fa pasul 2.

Altfel algoritmul se inrrerupe si eel mai marc divizor comun al lor este b.

PROGRAMUL BIV24

'include <stdio.h> #include <stdlib.h>

main I) ;* CilCSIC doua 111111lCrc inlrcgi si pozuivc si afiscaza c.m.m.d.c al lor *1 (

long m,D; long a,b; Loriq r ,

char tab[255];

do

p r .in t f I "p.r i mu! num'-1J:" "); if((1ets(tab) =, NULL) ( printfl"s-a tastat EDf\n"); ex i t (1) ;

if(sscanfltab, "%1d",&m) == 1 &Ix m > 0 ) break;

printf("nu sea tastat Un intreg pozitiv\n"); while(l);

do

pr.intf("al 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 )

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") i

while(l);

a = m; b = n;

do

r a % b; if ( r ) (

a = b; b

r :

while(r);

printf(" (%ld.%ld) }

%ld\n", m,n.b);

4.12. lnstructlunea switch

lnstructiunea switch permite realizarea structurii selective. Aceasta este 0

. . f . t d 'a de CAR Hoare Ea ponte

eneralizare a structurii alternative ~l aost 111 ro us'. .: '.. '.'

~ realizara prin instructiuni i/'imbricnte. Utilizarca mstrucnunu s.wltch f~ce. c~f'

1 . fie mai clar decit daca sc utilizcaza vananta Cll mstrucnuni /

programu sa 1 , ,

imbricate. . , . '. " tata dc catre adeptii

Structura selectiva 111 forma In care a fast ea accep .,

. •• ~,,,-.: en "A 1"- "",,,' in lirnbajul C etl ajutorul urrnatorului

progranlanl structurate, ,;n .. H ... a lz"",,,,~a

format al instructiunii switch:

switch(expresie){

case cl:

sir ] break; case c2:

sir_2 break;

case ell:

sir._11 break; default:

sir

uncle:

c l , (:2 •... , en sir_I, .I'il"_2 .... , »r.». sir

- Sint constante.

- Sint succesiuni de instructiuni.

162

Instruqiunea switch cu Iormutu] iudicar mni sus sc executa ;\slll:l:

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.

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

1. 2.

default: sir

ponte f abscntil.

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(.'(;! 0i Sl' trccc la exccuria instrllc(iullii urm{llo<tre.

fnstl"uc(illl1ea switch de mai sus cste cchivalenta ClI urmaroaron instruC(j une if" irnbricata

if(expresie=-c=cl ) sir.!

else

il'( I'.\"/ 1/"1'.I·il':=::O: (2) sir_2

else

if(1'.1/)f"('.I·il' ('.,')

sir_.3

else

if

else

ir(e.lprc.lic==I·1I ) .1/1"...//

eise

si,.

I(d

lnstructiuncn lneak de la sl'lr~ilul ficcarci alternative. dupa secvcntclc sir~/, 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<1 sltrsitul Iiccarci alternative a unci instrucuuu: switch, 1111 cstc 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 a acc lccasi insiructiuni ssvitcl),

Astfcl, daca () instrucuunc switch arc lormatul:

swit ch( ('.':pres it'){ case cl :

sir.J

rase ('2:

sir~2

atunci ca cstc cchivalcnta cu urrnatoarca sccvcnta:

if(expresie== c /){ sir~1

sir~2

[else

if(e.\'{iresic= =(2)( sir .. !

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

PROGRAMUL BIV25

ninclude <stdio.h> ninc·lude <F,tdlih.h>

rna i n () /* ciicsrc o citra din intcrvalul ] ! Jl sj aliscaza dcuumirca I.itci din saptamin« corcxpunzatoarc cifrc: respective *i

i n t 1..

char t(25S1; do {

t.-)uts("ttl.stdti i_' c i f ra din i n t e r valu I [1,'7]");

1. f (9':_~tE-: ( r : == I'-lUL,L, ) {

\6.1

puts("s-a tastat EOP"); exitll);

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 r a 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");

} }

4,26 Sa sc scrie un program care citeste constructii de forma: op l op op2

unde:

- opl ~i op2 sint intrcgi de tip long,

- op este unul din caractcrele: +, -, "' sau I.

~i afiseaza valoarca expresiei citite.

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 <stdio.h> .include <stdlib,h>

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;

165

iEI gGtslt) "'= I'JULL ) exiLIO);

prinLf("expresie eronata\n"); while (1) ;

switeh(op) [

case '+'

rez=opl + op2; break;

case I - I :

rez=opl - op2; break;

case 1*'

rez= opl * op2; break; ease 'I' :

if(op2 == 0 ) {

printf ("divizor nul \n"); rez = 0;

else

op1/0p2;

rez break; default:

printf("operaior eronat\n"); rez = 0;

/~ sfirsir switch*/

printf("opl= %Id op= %e op2= %ld rez=%ld\n",

opl,op,op2,rez);

1* sfirsit for =]

} r sfirsit main *1

Observatie:

ProgramuI de fata perrnite sa se evalueze mai mulre expresii separate prin caractere albe, EI i~i intrerupe cxecutia la intilnirea sfirsitului de fisicr.

4.13. lnstructiunea goto

Instructiunea goto nu cste 0 instructiune absolut necesara la scrierca programelor in limbajul C. Cu toate acestea, ea se dovedeste utila in anumitc 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 etichetd.

Prin etichetd intelegem un nume urmat de doua puncte:

nllme:

166

/lII/II£' 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:

go to I1l1l11e;

unde:

nume - Este numcle unci ctichctc definita in corpul acclceasi functii

in care sc afla instructiunea goto ,

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 i 1 izarca 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 goto ca mal JOS.

for ( ... I (

while( ... ) (

do(

for ( ... ) (

ii(i~'o())

goto divzero;

x=y/i;

lwhile( ... ) ;

167

d !_v:,.:,(;(o: printft" ,);

, " I 11'/'1 ,'1(',('1:1,,,, i lucru fllillsind nn

ill allSl'll\a inslntc(lIllill ,1:(//(/ Sl' PO;I (' rl'a ,

indicator ~i 0 scric de teste n:alizalc asupru lui,

4.14. programarea procndurala, functii, apelul !?i revenirea din ele

I de nivcl inalt s-a utiliza:

i nccpuul cu prilllck limbujc (c programare

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<:1 dc rcpcnuc, sc.cven\a de inst;ucllUlli cllrcSpUllzatuarc sc urg;ull/xaza C;I 0 p.utc dlSlIllCt:1 ::;1 sc 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 de insirLletiuni organizata 111 accst Icl arc diferitc dcnurniri III diverse lirubajc de programarc: subl;rogram, subrutina, proccdura etc. PCIlIru inceput considcrarn

dcnumirca de procedure

Uucori proccdura trcbuic 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:

(I) 4** 10-3**20

putern construi 0 proeedu[',i pcntru ridicarca la putcrc, care sa fic ge~ler:tla ~,i s~ f:\C~1 abstractie 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 0 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

!68

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:

a.

Proeeduri care dcfinesc 0 valoare de rcvcnirc.

h. Proccduri care Ill! dcfincsc 0 valoarc de rcvcnirc,

Proccdurilc din catcgoria a, de obicei se l1uJ1lesc/iIllC{ii. Valoarea de revenirc se mai numeste ~i valoare 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 ~i Ct+ 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 ~i atitca ape/uri intr-un program, cite sin! ncccsarc.

o dcfinitic de functie arc Ionnatul:

antet corp

unde:

an tet

- Arc forrnatul:

tip nume (lista declaratiilor parametrilor formali) Este 0 instructiunc compusa.

corp

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.

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

Prototipurile functiilor standard se includ in program ,inaintea ~1~e.ll~ril~r lor folosind constructia #illeilide tratata prin preproccsor (vezi paragratut I, 12,),

Exemple de fisiere ell prorottpuri:

stdio.h conio.h

pentru functiile printf, scanf gels. puts erc.; pcntru functiile putch, getch, getche etc.;

math.h pentru functiile elementarc sqrt, sin. cos etc.

Mentionarn ca pina in prezent in toate exercitiile au fost apelate numai functii standard.

Apelul unei functii care nu retumeaza 0 valoare, se rcalizeaza printr-o instructiune de apel. Aceasta are fonnatul:

flume (lista parametrilor efectiviy;

unde:

Ill/me

- Este numele functiei cafe se apcleaza.

lista para- - Estc fie vida, cind functia nu are parametri, fie 0 expresie sau

metrilor efectivi mai multe separate prin virguld,

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

argumente. • . . ..

o functie care returneaza 0 valoarc, poate fi apclata fie pnntr-o tnstructiune

de apel, fi~ ca operand al unci expresii. In cazul in care ~unc~ia se ape~eazll printr-o instructiune de apel, sc pierde valoarca returnuta. Cmd ~l~nc\la se apeleaza ca operand al unci expresii, valoarca rctumara de ea se utilizcaza la

evaluarea expresiei respective. ,

Sprc exernplificare sa consideram functia getch, Not am apelat aceasta

Iunctie atit ca operand in expresii de arribuire de forma:

c=getch( )

cit si printr-o instructiunc de apcl de forma: getch() ;

in primul caz, valoarca codului Ascn al caractcrului citit de la .tastatura se <ltrihll;" vm'inbilei c. La eel de al doilea apcl, valoare codului ASCll al ~~;;~t~l1li~'j' '~'i;i~ -de la tastatura nu este utilizata. in acest eaz apelul s~ fa.c~ ell 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

170

I ! j

I I

!

I

I

functici apclatc.

in cant! in care ripul unui paramctru efecriv difcra de ripul paramctrului formal care-i corcspunde, ill limbajul 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 amintita mai sus. in accst scop se ponte urilizu opcratorul de convcrsic cxpliciia «tip)), adica folosind asu 11lll11iteie exprcsii cast.

De cxernplu, daca functiaj'nrc un paramctru de tip double ~i 11 cstc 0 variabila de tip int, atunci in locul apclului:

f (n) ;

so rccornandn a Colosi apclul Cll convcrsic cxplicira a lui 1/ sprc iipul double: f ( ( doub l e ) n);

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:

a. Dupfl cxccuiiu ult imci illstrllqillni dill corpul Iunctici (S";I ;ljU!lS !a aculada inchisn care tcrrnina corpul Iuncuci).

b. La imilnirca instructiunii return.

lnstrucuunca 1'('/1//'11 cstc instructiuuca til' rcvcnirc: dintr-o luucuc. hi arc formatclc:

l. return; salt

2. return cxprcsic;

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 I al instructiunii de revcnirc sc utilizcazn numai in corpul unci funcrii care I1U rcturneaza nici 0 valourc. Dinrr-o astfcl de fuuciic sc pOlite rcvcni ~i in modul indica! 1:1 punctul 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

limbajclc C ~i C H. Excrci\ii:

4.27 Sa sc scric o lunctic carl' arc ca pararnctru un intrcg /I din intcrvalul [0,170], calculcuza si rcturncaza pc 11'

Numilll./i/c/ori(// aceasl~1 tunciic. :a rcturncaza U vulo.irc llotanta ill dubla prccizic. Rczult.: ca flll1c\ia arc antctul:

doub l o ft:1ctor1.iJl(-ltit 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.

FUNCTIA BIV27

dOllble fact()ria (i.ot n)

I"" clktlkaz;l si rcturncnva pL' 11' pcntru n in inicrvalul 1'0,1701: nlttc! rctumcaza ., '/

dou o l e f:; in t 1.;

itt n < () Ii n> 1.70) ret.urn 1.0;

tort j , f L,e); i -: n;~'I-+)

['< 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 f"unC\iafilc!oria/ delillita rnai sus pcntru a-l calcula pc m! pcntru 0 vuloare data a lui /II.

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 flln~\iei [actori«! din Iunctin principala, trebuic S~\ fie prcccdat de prototipul ci.

PROGRAMUL BIV28

r:k~uble fal·'tot in! (j n r l : i+ prototipu! luncuci rac(oriai *1

linclude <stdio.h, #include <COl"lio.}l>

i72

main ( ) /* afiscaza pc 111! pcntru 111 ~ 0, J ,2, ...• 170 */ (

int m;

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 a continua\n'); Qetch ();

/* sfirsit if"'/

/* sfirsit for */

/* sfirsit main *1

double factorial lint n)

/* calculcaza si rcturncaza n! pcntru n in intcrvalul [0,170]; altfcl rcturncaza -I *1

double f; int i;

if I n < 0 i In> 170) return 1.0; fori i=2, £=1.0; i <= n; i++) f * ii return f;

} /* sfirsit factorial */

I I

Observatli:

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

2. 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 BIV28A

Ninclude <stdio.h> #include <conio.h> .include 'biv27,cpp'

" -

main I) /" afiscaza pc m! pcntru m ~ 0,1,2, ... ,170 */ {

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 a continua\n"); getch () ;

} }

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.

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,

4.29 Sa se scric 0 functie care are ca parametri doi intrcgi x ~i y, calculeaza si returneaza numarul aranjamentelor de x obiecte luate cite y.

La inceput functia testeaza daca x apartine intervalului [1,170], iar y intervalului [l ,x], ln caz de eroare, functia returneaza valoarea -I.

Daca notam eu A(x,y) nurnarul aranjamentelor de x obiecte luate cite y, atunci:

A(x,y)=x*(x-l )*(x-2)* ... *(x-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;

174

I 1 t

int ii

if(x -c 1 II x " 170 ) return 1.0; if(y < 1 II yo. A) rot.u rn 1.0;

a = 1.0;

i = x - y + 1;

while( i <= x ) a *= i++; return a,'

4.30 Sa se scrie un program care calculcaza si afiscaza numarul aranjamentelor de n obiecte luate cite k, pcnrru n= 1,2, ... ,170 si k= 1 ,2, ... ,n.

Programul de fata apcleaza functia aranjamente definita in exercitiul precedent.

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 o r t n = 1; n < 170; n++) (

print,f("dctinndti () 1,'I:~~t'l IIPlllnt.1 C'(lllll!lUd\n")i "etch ( ) ;

printf("\nn= %d\n",n); for(k=l; k <= n , k++) (

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" /

4.31 Sa sc scrie 0 functic care are ca paramctri doi inlrcgi .r "i y, calculcaza ~i returneaza 1111111[lru! combinarilor de .r clemente luate cite y.

Functia testcaza dad x npartinc intcrvalului t 1,1701, iar y intcrvalului [O,xJ.

In caz de croarc, funcria rcturncaza valonrca - i.

Pentru calculul numarului cornbmurilor de .v clemente luatc eire )' sc derermina raportul dintrc numarul aranjarnentclor de x clemente luate cite y ~i yl. in aces! scop, functia de nlla apeleaza lunctiilc aranjantente ;;i factorial definite in excrcitiilc 4.29. si respectiv 4.27.

175

FUNCTIA BIV31

j~irlclude "biv27.cpp" #include "biv29.cpp"

double: c on.b i na r i (int. -'r in r. y )

/* culculcazu si rciurncava numnrul combinarilor de x obiccic luatc cite y '"'-I

< 1 i I x > ]70 I return -1.0, " 0 II y > x i return -1. (J; ~" 0 II y x: x I return 1. ts :

ro ru rn ,l)"',)n j .unc-n r » (x, '1') / Ia c r o rial ('l) ;

.i f I .',
j C I y
-r f ( Y 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 luatc cite y. ;\ccast:l re l.uic cstc ut il sa sc aplicc pcutru

y > .r:

in accst scop ultima instructiunc sc inlocuicstc cu: ifly > x/2\

ro t.u rn i)f"dlljalT\(:nt.(; ( x , X .. V} / L.lct()t-jdl {z-y};

else!

2,

return aranjamente Ix,yl/factorial(y);

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.

FUNCTIA BIV31A

clo\Jble cornb i riari (_:~nt x, I nt. y )

/* (akuica/a:-.i I\JumL',\I;t nuru.uul comluuarilor til; x ohiccic lu.uc cite y */

int ii dou o l.e c;

i (( x < 1 II x > 170 iE( Y < 0 I I y > x

if{y Oily

c = 1. 0,

for ( i return Ci

} return - 1. .0;

r o t u r n - 1. 0; x ) return 1.0,

1 ;

c c Y' iH) C = Ic • ( x - i + 1)) / i;

4.32 Sa sc scric un program care calculcaza ~i afiscaza numarul combinarilor de II obiccte luate cite k, pcutru IF 1,2, ... , 170 ~i k=O, 1,2, ... .n,

176

l'rogramul utif izcaza Iunctia BlY31 A.

PROGRAMUL BIV32

.include <stdio.h> Hinclude <conio.h> Hinclude "biv31a.cpp"

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

p r i nr.f ("actionati 0 t a s ta por.t ru a c ori t iriua vn vj ;

'I,'tcb ( ) ;

/* sfirsit if */

/* sfirsit tor interior */ 1 /* stirs;t lor exterior "/

) /* slirs;t nuun OJ

4.33 Sit se scrie 0 functic care ridica la 0 puterc intreaga ncncgativa un nurnar flotant de tip long double.

Functia utilizcaza metoda cxpusa in excrcitiul d.Iv.

FUNCTIA BIV33

long double 1drp( long double x, int n) /* ridica pe x la putcrca n *1

(

long double f,p;

for(p=x,foo1.0L; n; n»= 1) ( if ( n& 1 ) f * = p;

if( n > 1) p * p;

return f;

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

PROGRAMUL BlV34

linclude cSldio.h> finclude <stdlib.h>

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 r u I care se r i d i ca la puteri: "); if ( gets ( t ) == NULL) (

printf("s-a tastat EOF\n");

exi t (1) ;

}

iflsseanflt, "%Lf",&f)

1 ) break;

pr i nt.f t vnu s-a tastat un numa r vnvj : while(1);

do {

do (

printf("tastati limita inferioara a exponentului: "); if (gets It) == NULL) (

printfl"s-a tastat EOF\n");

ex i t t j r ,

}

if(sseanflt, "%d",&m) == 1) break; printfl"nu s-a tastat un intreg\n");

while (1);

do {

p.r int f (" tastati 1 i m i ta superioara a exponentului: "); if(gets(t) == NULL) I

printf("s-a tastat EOF\n");

ex i t (1) ;

)

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 pe eea\ superioara:%d\n", m,n);

} while (1);

if ( f == 0 && m < 0 ) (

printfj"putere negativa pentru zero\n"); exit(l) ;

}

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: %Lg\o",£,l,g);

178

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:

Fie fUl1qiajilc/orial (It: prototip: doublcj{lctorial(int 11); definita in exercitiul 4.27. La apclul:

j~lct~~factorial( I 0);

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 valorile parametrilor efcctivi, ci adrcsele accstor valori. in accst cnz, sc spline ca npclul csrc pnn reji'l'in/li (CIIlf hI' I'1'/;'}'('I/('('),

lntrc cell' doua tipuri de apeluri exista 0 difcrcnta cscntiala ~i anumc:

.. in cazul apelului prin valonrc, Iuncua (lpelatil !HI ponte modi fica parnmctr] clccuvi dill lilllqia carl' a lucut apl'lul. nc.rvn«! acccs la ci;

" in cazul apclului prin refcrirua, runC\in apclnra, dispuilind de adrcsa paraillctrilor ell-clivi. ii ponte moclilicn.

A0:l sc im impla, de cxcmplu, in cazullimbajului FORTRAN, undc upclul cstc prin rcfcrinta,

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 en i'unqia apelala S:I Illoditll'l' valorilc paramctrilor clccuvi. Uncle lirnbajc permit umbclc tipuri de npchui. A~a csrc, de cxcrnplu, cuzul 1imbajului Pascal. Parall1elri dcc!ar;qi ill l'asc;iI prin 1'(/1' sc rransfcra prin rclcrinta.

in limbajul C++. sprc dl'osebirc de limbajul C. exista allllwic apcluri. ca ~i in Iirnbajul Pascal.

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.

179

/\ (:c'I"1 , I' I' ,

" ' ' "d I1SC<11111,1;[ e,1 U UIlC\IC pO(lic "iI modificc partuncuii ci Ionnuli 1;11'

n'l:1' (';1 pnn In"c1i1IC;lI'l,';1 Il'SJI'L'l'IIV;t ,"I 11111IIl'llll'/l' \;I'uriic 11;ll;IIIK'lri!ul cfcctiv COILSJ:lIll/ilIOr!. i\~Cl de c;.;cmplu, !ll!1C\ia !dll!, ~ci!1ila in cxcrcitiul 4 Y 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

_ 111.1111111;11\11 (',1111 P;II;llllL'lnl clcctiv JH1;11l' Ii 1l1l1IICic 1I111li tablou. De CXCIllI',

Ill' " IUllelle J1L' ell" ' . '

, "', ' c o 11111111111 ,\'11111 ~I C;IIT InSlIlllC<I/,;1 CitlllClllclc uiiui labJOlc

lip 1111, "\CC<ISU! IUllC\IC arc dOl par.uncui:

Iii;'

l,siL' uutnclc 1;Ii)iulIilll ale carui ekllll'lliL' ,W IIISllllll';I/.;L - !:sIc numarul clemente lor tabloului.

I:a rcturncuzu SlIl11a:

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 scric 0 functic care calculcaza valoarca unui polinom folosind schema lui Horner.

Parametrii functiei sint:

c - Tabloul eu cocficientii polinomului.

- Este de tip long double.

11 - Gradul polinomului. - Este de tip into

x - Valoarca variabilei.

- Este de tip long double.

Tabloul c continc cocficientii polinomului in ordinc descrescatoare a puterilor lui x, c[ OJ

c[I]

- Este eocficientullui x**n.

Este cocfieicntullui x **(11-1).

c[n-l J dill

- Estc cocficicutul lui X.

- Este tcrmcnul libcr.

/I

tablOJ ,tabJII' , .. Itlbllll,

('0111(11"111 ccior spusc mai SlIS, fUI1C\ia arc unuatorul auct: in! :,:\.111\( iu t tdlJII, .in L (1)

" i\minilln, ca data lin paramcuu cfcctiv cstc Uirl1l111C de tablou uniimcn-

sional atune: 1)<1 1"1 111'" trul formal C()I" 'I) I' . t, I I I' " "

, ,~ c cs 1I 17<1 or St. po.u. nee ara rara a mica. Jl1

parantczclc painuc. limit» supcrioura a indicclui san.,'

Ducu a cstc un tublou dcclarat ca mai jos: '

j n t. ilJ 101;

.uunri pcntru <I msumu clcrncntclc iahloului rcspcctiv /orn putca folosi a!clllrt '1111 (d, 11)) ;

Ikuarcc' I 'I' 'I, "11" , '

c ( L~ C IIUIlll. C Ulllli l.t) UU, tt arc I.:a vrloarc ;ldn;S;1 prt mrlu I snu

clement adieu udrcs II' 'I()I \ 'I I Iii I ' . '

., " ' c "CSd ,II d ,f pc U Illll prinvaloac, 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: 'I' , I I" I ' . I' hi I

,. " ~ ru-se a c cmcntc C til flU, SC rctcra uc fapt c uar ra

clcmcniclc lui u:·

t o r ( 0; n ; r i-

Sf. ta b l n 1. J ;

Sc obsel'v<J C<I, ill accst e,IZ, dq;i apclu] s-a 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 :)- .. 1 Iolosit ca paramctru erectiv.

lnrr-udcvar, in cxcmplul de mai SlIS. .uribuirca:

tahllJedOO;

IBO

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

I

I

s=c[O]

Se observa cit paranteza cea mai intcrioara arc ca valoare, valoarea expresiei:

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:

181

s=S*X+C[2]

In general, la ai r-Ica pas se evalueaza expresia s*x+c[il

~i apo] 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 de mai jos:

for(s=c[O],i=l;i<=n;i++) s=s*x+c[i];

FUNCTIA BIV35

long double pol inom (long double x , int n , long double c [) ) ;* calculcaza valoarca polinomului

p(x) = c[DJ*x"n + c[ll'x"(n-l) + ... + c[n-1l'x + e[nl';

long double S; int i;

forts = CrO], i return S;

)

1;

-c c; n; i++ ) s

S*X+c[i];

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.

In aces! caz, c[01 este !ennenul libel', c[ 1 J coeficientul lui x. in general elil 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;

.. ciresre pe n de tip int din intervulul [0,100J;

.. citeste coficientii a[O], all 1, ... , u[nl ai polinornului pM de tip long double;

It calculcaza ~i afi~eaza valoarea pofinomului }J(.')'

a[O] este coeficientul lui x**n, all J esre cocficicntlll lui x**(n-l) etc.

182

~ROGRAMUL. 81V36

iiincl\ld~ ""'tdio.h, #inc Iud., Q"1;(iHb. it> 'include 'biv3§.(pp'

Gdefine MAXGRAD :00 , I' I .

. ';*. '1'" 1 "[OJ 'I[ I J 'I[n] calculcaza si afiscaza valoarca po mornu 1Il

ma i.n t ) cltc~~r'C,",I.u., ..... '. , '.

. p(X)""I[Oj'.\ **11 + a[) JOx' "(u-! + ... +a[II-1 ]*x + all1J I

long doubl.e X,idMAXGFAD+l); int i,ni

char t.!2S5J,:

j* ciicstc valoarca Itl x */ do (

print)' I "v,Joarea lui x: ") ; if (gets (d:) == NULL I (

pr i,rlt: f.'. "s-a tastat EOF\n"); exl t; (l;

)

if(sscanfl~"%Lf', &xl == 1 I break; printf ("flU ·;-a tastat uri numar\n");

""hile (I) ;

• ~i,aqstc pc n • f 10 l

pr_intf<flv.:~JG~roa Lui n i "); if(getslt) =. NOLL) ( printfi"l-a tastat EOF\n'); e x i t; (1);

)

if(sscanflt, "'lsd', &n}

1 && n >= 0 && n <= 100

break; din int.ervai.ul \

printf("nu a-a tastat un intreg

[0,10'1) \n");

j' L'il!si.~ cncl'lI:iL'lIt ii 1'(llinllllll1lui ,; fori i=O; i <= It; i++ ) de) {

printf("ce),'ficientuJ a{%d]: ", i j ,

if«J(!t.,,~(l) NULL) (

pr.intf("s-a tastat EOF\n"), exit 11) ;

)

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

lX3

I

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, d{~ld}!(' !Hil,d,ll )

/~ ciicstc cc l mult u 11t1IllCIT:-.i II: pa;-.lrc;I'/i\ ill tahlou! n.Irub: rcturncuzn numarul uunu-rclor ,',Iile ''I

i n t. 1 i d()lJ\)lr:' (.'I;

c na r t(2~)::;Jj;

t o r ti (); i ... n; i,,) (

p r int Lt ve Lemcn tu J ['i,dl ",i.);

it t cte ts t t l NUI.,I,) h,tUlCll i .

i [(sscanf (t, "',,] [", ,,<I) 1) int,>.Ik;

ndl.ilblil "d;

re t.u rn .i :

4.38 Sa se scrie 0 functic care citcstc componcntclc unui vector prcccdate de 11 umaru I lor. Functia rcturncaza numarul componcntelor vcctorului respectiv.

Accasta functic foloscstc functia definite in cxcrcitiul precedent.

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

printf("numarul elementelor= "); if(gets(t) == NUL,!,) ( printf("s-a tastat EOF\n"); (!xit(l) ;

if(sscanf{t,"1;d", s n ) 1 ,\c& n > 0 && n <::: nmax)

break;

·In.intf ("nu S-'a t a s ra t: un i.n t.reo din i nt.o r va Lu l [1, 'hl] \n", nma x ) ;

whi Le (l) ; if{(i=ndcit(n,dvector» !,. n )

print f ("nu S~(l r ou sit ci 1 rea col o r n:::.~)d componente\n", n); p r i nt Lt vs+au cit.it UUHlili '(,d componont e vn v iil :

return i;

184

4.39 Sa se scric un program careciteste cornponentele vectorilor.c ~i y, calculcaza

~i afiscaza produsul lor scalar.

Componcntcle cclor doi vcctori sc tastcaza astfel: numarul componcntclor vcctorilor (/1);

cell' /I cornponcntc ale lui x:

ccle II componcnte ale lui y.

Programul de falii utilizcaza functia dcfinita in excrcitiul precedent.

PROGRAMUl BIV39

#include <stdio.h> 'include <stdlib.h> Hinclud() "hiv'37.cpp" »include "biv3B.Cl~"

#define MAX lO()O

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

/* citcstc cornponcntclc vcctorului y */ if(ndcit(n,y) 1= n ) {

printf ("nu sint n=·%q componente pentru y\n", n); exit(l) ;

/* calculcaza produsul scalar */ s = 0.0;

for(i=(); i <: n; 1++) s += x I i l *y[i]; printf("(x,y)= %g\n", s);

}

4.40 Sa se scrie 0 functie care sorteaza in ordine crescatoare, elernentele unui tablou de tip double.

Spunem despre lin tablou tab, de elemente numerice, eli este sortat crcscator (descrescator), daca eiemenreic lui satisfac relatia:

tab] iJ <= (>=) tab[i+ I J

pentru

185

¥iiiMI,.-' (";:; **;:m,,:;;.4W$'" 4\4t.4;i,*,

4 4$

.$

i=O, ! ,2, ... ,11- 2

undc: /I

- Estc numarul clcmcntclor tabloului tab.

Functia care realizeaza sortarea are doi parametrii:

lab - Tabloul de sortat,

11

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

Ccle rnai simple metode sint cele mai putin eficicnte ~i necesita un l1ul11tl.r.de pasi de ordinullui n*n, Ilfiind numarul clcmentelor de sortat. Prezentarn mat jos o astfcl de metoda, care estc CU!10ScuU\ sub dcnumirca de metoda bulclor (hllhhle sort).

Ea C0I1S1('1 in urrnatoarcle:

Se cornpara primele doua clemente ale tabloului de sortat si da~a nu sint it: 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).

Exemplu:

Fie sirul de numere: 8,3,9,5,4,7

pc care dorim sa-l ordonarn crescator.

Prima parcurgere a sirului: 83 9 54 7 sirul initial

3 8 9 5 4 7 sirul dupa perrnutarea lui 8 cu 3 3 8 5 94 7 sirul dupa pcrmutarea lui 9 ell 5 3 8 5 4 97 sirul dupa permutarca lui 9 cu 4 3 8 5 4 7 9 sirul dupa permutarea lui 9 cu 7. A doua parcurgere a sirului:

3 8 5 4 7 9 sirul dupa prima parcurgere

3 5 8 4 7 9 sirul dupa permutarca lui 8 cu 5 3 54 8 7 9 sirul dupa permutarca lui 8 ell 4 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

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

o propricrnro a accstei mctodc csrc accca ca In Iiccurc parcurgcrc a sirulu] de 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 dcpartc.

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 ~i daeii 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. Cit timp sirul 1111 estc soruu se executa pasul 2.

Altfel sc intrcrupc proccsul de sortare.

2. Se parcurgc ~in!l.5i sc permura pcrcchilc de ciCIllL'IlIL: invccinnn- carl' sin: ill online descrcscatoarc.

Pasul2 se realizcaza pruur-un cielujiJ,. de forma:

f ell- (i I) ; j 0: n I.; j I , )

if ( t ab lLj >I:ab[ i+ 1 J) (

1* sc pcrmuu, clcmcruclc ,,,h[il ~i tah I i+ II */ t=tablil;

t ab ji] i.db[ i.rl }, tab[i+l] t;

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

1117

valourca I 111 cazul 111 care ciclul rcspcctiv lace 0 pcrmuiarc. 111 fclul acosta. variabila ind arc vulourca I dupu cxccutia ciclului [or, daca accsta a facut eel

putin 0 pcrmuturc :~i i.crn in C~17. coutrar.

III coucluzic, variuhi!a lilt! 'II'C v,tiO'II'C I.l'I'U Cllld ~intl csic surl;ll :_;i I III cal, couirar. Variubil.: inc! sc gcstioncaza astfcl:



initial inc! are valoarca I;

Illailllc dc illslluqiullc,\/ill', illtl Sl' 1~Il'L' cg;\I ell zero:

in sccvcnta de pcrmuturc a doua clemente invccinatc, ind sc face cgal ell I.

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 caractcr ncnumcric, Sc prcsupunc ca la intrare exists eel putin doua numcrc ~;i eel mull 1000,

Numerele se eitese apelind functia ndcit definite ill exercitiul 4,] 7. Sortarea lor in ordinc crescatoare se realizeaza folosind functia ordcresc definita in cxcrcitiul precedent.

PROGRAMUL BlV41

ninclude <stdio.h> #include <stdlib.h> #include <conio.h> 'include "biv37.cpp" nincluclc "biv40,cpp·

#define tlLAX 1000

main () ;. citcstc un sir de numcrc si lc afiscaza in ordinc crcscatoarc "( (

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 de 2 nume r e vnt l : exit(l);

ordcresc{tnr,n) ;

ror(i;::;(j; i< n r iri) printf("tnr[%dl=%g\n", i,tnr[iJ); i£(i+l)%23 =~ 0) {

printf ("actionati 0 t.asta pentru a cont.Lnue vnv j : getch() ;

I

) }

..



Sc obtinc sccvcntu:

end = 0;

.I o r t i ;i<:::n 1;1++) it (I .!hl i 1'1 .. hi i, i l ) I. t=tab[i);

t.ab[i] t.a b l iiLl ,

tah[i+l]=t;;

inc:1"7.1;

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

) /. sfirsit if */ t= stirsit while */

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] = tab[i+lJ; t.e b l i.rLl

i rrd 1 i

/* sfirsil if '1>./ !' sfirsit while *1

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

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. Se compara elementul din mijlocul tabloului (de indice {(n-I)/2J) cu a.

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

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

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

4. 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 3 de mai sus 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[2]=7 tab[4]=13 tabl5]=20 tab(71=35 tab[8]=41

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 I

{

I I

J

i I

I

i t

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 determinarca, la ficcare pas, a subtabloului in care sa se faca cautarea estc bine sa utilizarn doua variabile ill!" ~i sup, prima avind ca valoare indiccle primului element al. subrabloului curcnt selccrat, iar cea de-a doua, iiidicele ultimului element al accluiasi subtablou. Pasii proccsului de cautare vor fi:

I. inf=O

Indicelc primulu i clement al tabloului.

2. sup=n-l

Indicelc ultirnului clement al tabloului.

3. i=(inf+sup)/2

Indicele elcmcntului din mijlocul rabloului,

4. Daca

tabji l=a

cautarca se tcrrnina ~i se returncaza valoarca lui i. Altfel se continua ell 5.

5. Daca

tabl i] > a atunci

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

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

inl=S, SlJIF6

La pasul 3 se dctcrrnina:

i=l (5+6 )/2)=5

Apoi se ajungc la pasul 5, dcoarccc 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 tllb[61 != 22.

Cum tab[6]=21 < 22, sc modifica dill nou ill/ inf=i+l=?

in accst moment inf > sup ~i dcci proccsul de calcul sc intrcrupe, concluzia 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 a) /. cauta in tab lin clement de valoarc egala eu a:

rcturncaza indicclc clcmcntuiui rcspcctiv sau -I, daca nu cxista un astfcl dc clement */ (

int l,inf,:;up;

inE 0;

sup n-1;

wh iLe I i n f <= sup) ( i =(in[+sup)/7.;

if: (tab [ i J == a ) ret.urn i; it(tab[i] > a) sup = i-l.;

else

inf: = irL, ;, sfirsit while 0/

/* sc ajulIgc aici cind inf> suI'. ceca cc inscamna ca inlah 1111 cxista

192

UII clement de vuloarc a */ return -1;

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 ~i sint in intervalul (0, I 000). 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 ~i II. Primul paramctru cstc un tablou de lip int, ale carui clemente sint uumcrclc prime care nu-l dcpascsc pe 11:

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.

Functia prim rcturncaza numarul numcrclor prime pastratc in tprim (adieu

m+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 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 * pk < m. Daca tabloul continc deja i numcre prime:

tprim[O], tpriml l ], ... , tprimli-I] (i > 2)

atunci pentru a detcrmina numarul prim urmaror vom proceda astfel:

l.

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

2.

193

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 ~i proccsul de calcul sc rcia de la punctul I.

Cum tprimli] nu este prim, acesta sc marcstc ell 2 si proccsul S(~ reia de ln punctul2.

Procesul de calcul de mai sus se continua atit limp cit tprimli] <= n.

Dupa generarea nurnerclor prime, programul citeste un intrcg ~i daca 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,

1

5.

PROGRAMUL BIV43

#include <stdio.h> .include <stdlib,h>

#define MAX 1000

int icautbinlint tab[], int n, int a) ;* cauta in tab un clement de valoarc cgala ClI a;

rcturncaza indicclc clcmcntului rcspccriv sau -1, daca 11U cxista un astfcl de clement *'

int i,inf,supi

iof " 0; sup = 0-1;

while(inf <= sup) { i =(inf+sup)/2;

if(tab[i] a) return i:

if (t.ab I i j > a)

sup else

i-I;

inf

1" sfirsit while "1

return 1:

} '* sfirsit icuutbin *'

int prim( int tprim[], int nl

/* pastrcaza in tprim nurncrclc prime care nu-l dcpascsc pc n */

194

int i,j,K:

rpri m [0) 1 ;
iff n < ) return 1 ;
tprimll] 2 i
if ( n <::: 2 ) return 2 i
tprim[2] 3 ;
if( n <::.:: 3 ) return 3 i
tprim[3] 5;
i = 3; while(tprim[i] <= n) (

/* sc c~lIta cxistcuta unui divizor prim >= 3 pcntru rprimli] */ J = 2:

while((k=tPrim[iJ*tprim[j]) < tprimli] && ~prim[i]%tprim[jl)

/* ciclul continua alit tirnp cillprim[j)*tprimU] < tprim[i] si restul imparlirii lui tprim[i] In tprim[jJ CSIC diferit de zero */

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 1111 divizor prim a lui Iplilll[il ill carui patrnt sa tic mill nne sau cgal cu tpriml i] */

1·1-+ i

tprim[i] = tprim[i-l] + 2:

1* tprirnji-J ] Iiind prim, urnuuorul numar prim va ti eel rlltin ell 2 mai marc dccit cl */

) '* sfirsit if pClllrulprilll[iJ prim */

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 i l nu L'sk prim;

sc marcstc ell 2 */

tprirn[i] += 2;

1* sfirsi: while exterior ''I return i;

] /* sfirsit prim '/

rna in () /' eilc,!e un sir de illiregi si-i aliscaz:1 pc cci din intcrvalul (n.1 0(0), care suu uumcrc prune ./

int nrprirneIMAX]:

int n r cr t ,

int 11/

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