You are on page 1of 149
120 Torut Despre C/C++ breaks "system ("TIME break; system ("DATE"); break; Uneos, veti dori ca programul dummnezvoastrl si execute in cascad mat multe instructiunl ‘case, De exemple, umitoril program, vocalec, utlizeszi o instructiune switch pentru a pnumara vocalele din alfabet: Hinclude void main (void) { char Litera; int nz_yocale = 0; for (itera = 'A'; Litera <~ 'z') literatt) ‘switch (Litera) ( case ‘A! case ‘ET: case 'I': case '0' case 'U': nz _vocalett; Mh printé("Nunarul de vocale este d\n", nz_vocale) ; Wes in acest caz, daca vatiabila Mera conyine unul dine caracterele A, B, [sau O, s-realiat nul dintre Cazur, jar compilatorul va ,cobor' pind la instructiunea corespunz ‘hort dupa lkera U, progamol na comin Insvuewunea break 131 Uruizanea cazuwu oerauct f AL INSTRUGTIUNII SWITCH switch (iitera) { case ‘A': system("DIR"): break; cage 'B': system("TIME") 7 break; ” case 'C’: system("DATE") ; break; Mv : coare liter! Uy care incrementeaza yarabila nir_vocale. Deoarece insiwuciunea switch nu congine ake ‘Asa cum afi fnvitat, instructiunea switch va permite si efectuati o procesare conditional. 4 ‘Anne cna utlizafi aceastl insinaefiune, specifica unul sau mai multe cazur, ea maj jos Macromsteuctiom srconsrante 124 Cn ulizayiinsoreyiunes switch, por apicea suai in care dont ca program si efectueze anumite insuuctiuni atunci cfnd celelalte cazuri nu se potivese, Pentru aceasta, puteti Include eazul default (prestabili/in insructiunea swe, ea mat jos switch (expresie) ( 0)! 2 case Constanta 1: instructiune; | ease Constantal2: inetructiune; i case Constantal?. instructiune: default: instructiune; % Daci nu se potriveste nid una dintre optiunile care preced cazul default, se vor executa insructunite corespunzi‘oare acestuia. Urmitorul program, con_toc uilizeaza cazul default pentru a numira consoanele din alfabet | | Hnctude’ void main (void) char Litera; int nr_vocale = 0; int nrlconsoane = 0, for (Iitera = 'A'; litera <= 'z'; literatt) siteh (itera) ( case 'A': case 'E! Fo aon B gase: 2 pe Yooalets, Fone ee y PrintE("unarel de vocale este tu\u", nz_vocate) | Prints ("Numarul de consoane este d\n", iz_consoane) ; Derinea consravre.on CORES) Gesell, pe inbu bintea porate pram loin fi pts dec shoe nt vo enema se moa, Pees es o conten a Sats esa aie De xen, union drt tech eae domes [bucannststc does 38 Videtine omm ince 128 Pxinci cand preprocesoni de C va intalni numele constantet DIM_LINIE in program, it va foal ch vsloscs ck Deexempl, sondern uate Sart de es Ht 122 Toru prspre C/C MACROINSTRUCTIUNI $I CONSTANTE 123 | extinde macroinstructiunil: gi constantele. Inainte de a incey ‘ovat Ree mune de ensancavaaa ek coals eepamoN per iadoleeceeeston corre biccitnadaieckaie ig eR acy tosee auarearmeeamn Chaz oie inerodualOne UIE) | " he : ee bo cehar carte (128); denn rimele doud decarapi creeazi giruri de caractere care contin 128 de bij flecare, Urmston fie ‘ .F imume (128) 7 ene hea arr Gerloat crecaza sur de caractere de dimensionea constantel DIM LINIE, Ste, an or ceopatnaton vd cese program, una dinicepimele intebis pe cave le pun ese Gane ay ORigemal 128 tn cectaraa sil, {naz celet de & dova declan oe cpl lest ha declare tote fe uncle deo dmensiume proce POF TIME In ead programelor, pute. include bude, la fel ca in exemplele urmitoars "> printe("mitlul cartii este te\n", "Totul despre c/c++' | printé ("Macroinstructiunile") ; oe 4 Deoa a areas ee - rece preprocesorul luerea2’ cu #inciude, adefine si alte ins BARONE 45} gp Bemece preprocesorut 2 Adefine ale insrueiuntintzoduse cu Fee eacaaie 2. _ ql tea sunt adesea denumite directive cdtre prepracesor. sol eons com nine: 44) : 1a, OY snateuctiuns e 4 § Atpizuinea oe nue consranreLon $iMACRONSTRUCTIUNILOR Dep cun a via, cans ese uo nome pect complain eC edn ne : a care nu se modifica. In sectiunea 144, veyi invaja despre macroinstructiunile ratty ‘na eo occ ss etn on pom ea Soe ean mera Poms tobe perenne can Ss Coo ace nc cme’ wy bono rc mje sec enclrfe sacelsmacioaor Ind cher exemple marae cea de 2 dova buci for face prograncle dumneavoast anult mal ugor de cilt se ifeat Presupuntnd, de exempli, ch programul utlizeaza peste tot valoatea 128 pent ania eat Tecioeenshunea sul, cack mai taziv don sf schimbati dimenstunea a 256 eee icbul i morlfcal Recare aparijie avalon 128 in program, ose ce dex eared inal utiliza! © constantd cum ar i DIM LINE, va fi nevote si modiicafi num aatecava adefine-un proces CU Un singur pas, a cum se vede mai jos q iastlns ond atee 2867” o fine PI 3.1415 Hees : ‘fdefine PROGRANATOR "Kris Jansa" 433 — Exrinvenca macronsTRUCTIUNILOR $1 CONSTANTELOR te seciunea 132, a vat ch pote utiza deca edefine pent a defi o const te ei etteramaul dumpeavoasi. De exemple, urmitorl program, csmacr uta ya dupa cum puseji vedes, constantele pot conyine valori de tipal int, loa sau chiar ebar. _ Uriizanea CONSTANTEI PREDEFINITE_FILE_ | in a ars an print at da anc pera ac umele fui sursi curent, De exeiplu, pute utliza numele figieraut in eadtl unei directive citre preprocescr care include un mesaj C3 mind cl programil ese Eee che pecs Jude un nea che ullastor spond ch program ete Progra! PLATI.C este in Xeaase / eaeeine ante 28 017) foafine TT7EU "otal despre C/Ct+" GGetine CaPTTOL "Nacroinstructiun cadiu de dezvoltas sh testare. ‘este doar o versiune BETA. | Ghee une (UTNE); | pelntecenieaun cartsi ate te\0") TO: Betne#(CABETO) / Crear a aja program sb efectucze atl de proce fel de procesin,preprocesonl de C defineste Femara Le ced egal cv ramvle ead sue cen, Con progam _filecons.c, ilustreazi modal de utilizare a constantet __FILE_: wane ‘arunci cind compilaji un program in C, mai intai se rules ‘prproceror Seopkl preprocesorului este de a include fjlerele antet specious «i 124 Torut pespre C/C++ Mt [ACROINSTRUCTIUNT SI CONSTANT 125 ‘Aronci cfind compilayl si executayl acest program, pe ecranul dumneavoastrl vor apirea ‘usmitoarele: S#2ine 100 ae Fisierul filecone.c este in stadiu de test cs Observates Spre doosebire de alte constante ale preprocesorulut, care se schimba de la un compllator la compilator, Constanta FILE ese defini la fel in cacinal compitatoarelor Turbo C++ Lite, Visual Crs, Borland C++ 5.02 siBorland C=* Builder. Deas i 8 asemenea, putet utliza aceastd directv penteu a schimba nus a De serena, pty wits ss pentru a schimba numele Aslerului sursi pe #line i "NuMEFIs/¢" eae Urmatorul program, seh.tine. ustteazi modul de uilizaze a directivel line: Hinclude "void main (void) { prints ("Fisier 5 recut de Lin: " Ante ("Elaier te: Aa ceacut de Linda ¢d\ny ere, // Alte insteuctiuni, Hine 100 “Numerzs.c” Prinee (Pisier $0: a trecut de Tinta t¢\o", Fru ) 136 Unuzarca consranreipreverivre_une_QOKO ‘Atunci cdnd vetl icra la un proiect mare, vetl dott uneort cx preprocesorul si cunoasct fk dventual si utlizeze numéqul line! curente al figierului sursi. De exemplu, daci depanay vn rogram, vet don sl fie aigate mesaje pe mAsutl ce compilatoral rece prin diverse pune fale programuli, c2 mai jos Am trecut de Links dm trecut de linia 301 hm trecut de linia 213 UUnnatorul program, dinecons.¢,ilustreazi modul de utiizare a constantel LINE Atunci cand compilay $1 exeeutay acest program, I Asoc cn est program, pe ecranul dumneavoastri vor apiiea include ‘ ‘void main (void) i y printe(‘am trecut de linia ¢d\n",_LINE_) 7/ Rite instructiuni 2 prince ("Am trecut de linia 4d\n", _LINE_); ) i i ‘Atunci Glnd compilai si execu! acest program, pe ectanul dumneavoasirl vor aplres vrmatoaree! 4 Fisier sch_line.s: An trecut de linia 5 Am trecut de linia 102 B scmisua isu ce proramele imaeavous or deve cue i complexe gi vor utlza ua mare numa Efrat api sat nee vel doch oma ss compan sce dick a odie ne mle os, td lal et rep Spr ons ert ana odor pe rele topo [Spires ndtoncn ec eer aes nig a hl ize fe legit staircase ST¥ind vn mest clue Am treout de linia 5 bm trecut. de Linka 7 ery Observatie: Spre deosebire de alte constante ale preprocesorului, care se schimba de a un compllator la compilator, constania LINE. este definitd la fel x cadral compltatoarelor Turbo Cr+ Lite, Visual C++, Borland C++ 5.02 si Borland C++ Butler. 3 eror Procedura sort_sir utilizeaza siruri far . ee Drogramaios si post compila succes programul, ei webuie sf flit 137 = Mooiicarea NUMARULU! CURENT AL LINE! 707, lund ase eunosinl despre modifieare fn secianes 136, ajtinvijat cum 68 uilizay constanta __LINE_ tn programele dumnet ease, Atul cand ulizat aceasts constant, Sar putea ca uncori si dori st schimbat Tenn curent a line! preprocesorulu, De exempl, i presupunem ci tlzai constan "TINE. pent a vi ajta si depanah:programul, aya cum am ata in sectiunea 136, Dac Fi sabi cf croarea se afil inten anumit set de insructionl, probabil ck veti dost et ‘reprovesortl 2 afgeze aumic liniel porind de lao anumiti locate, entra a va afta Picfaat aceasta, preprocesonl de C oferl directa #fine, care va permite si schimbal, eanirul de ordine ai niet curente. Urmitoares directiva, de exemplu, indica preproce: Sorulul sf stablenscd numécul de ordine al inlel curente I 100: ALTE CONSTANTE DE PREPROCESOR tale set din acest aptl au prezentat cons au prezentatconsante de preprocesor pe cre le accepe rciatea complatonreat. Uncle compltcare defines leaks eonaaote de aes fo, Ginplton lacs Mul Cee, de exemple, Uiacatd ich 15 conte de pep re ae acest cae ede Cons docamentaa ce inset comp: sal dipreworsrd pew subll dich propamete pet bens Ge ate consane n plus, pute eonsulta doeumenaia online, caput Predefined Macros 426 _Torer DESPRE C/C++ = MACROINSTRUCTIUNI $1 CONSTANTS 127 TeSTAREA MODULUI DE LUCRU AL compiLaToRULut (C++ sau C) 140 _ inrecistaanca vaTel s! OREI PREPROCESORULU! cand ter a progtame exinse, probabil ck vet dos ca preprocesoril dureavanstl and luca promarte, De exerp, proba ci ve dovtca progr sk afieze un tacts orn dat or ume! compli, cma jos: seelgv'4 3997 12:00:00° sen neem oor ts pet pogsmac nC, pe cn ie apd muna pen CC eh ee rograme, uneori veqi dori ca preprocesorul 2 uaa! un f. Pentru a realiza aceasta, multe compl definese constant epi in compilator de C standard, i rmaonl feces tgp —elusplus pers a determina modu de hea erent Pentru a vi ajuta sk facet! aceasa, preprocesotul de C atribule constantelor DATE § Peni dats @ ora curente. Urmitora progam, datetime. tustwexzi wiizares acest Constante: ‘ Sue are ss ts\n", _ PATE, _ fitdet cplusplus G | printé ("Se atilizeaza CH+\n"); ot 441 Testanca comparianiraq cu ANSI C 4 SAU #INCLUDE "NUMEFIS.H” fn toate programele prezentate pind acum, fisieralantet so.) era inclus cama jos: Raa! fn sectiunea 147, aft invljat cum si creay is includet! propriul dumneavoasta fisler antet, ‘ant_meu.b, Puteti sh incudes alt stdio.b c&t $i ant_meu.D in programele dumneavoast’, cu vrmaxoarele instructiuni: Pinetude “antimen.n” | Hinelude [xamindind cele dovi insrucjiuni include, veyi observa cl fisierul antet staio.b este inclus inte paranteze acute, pe cind figierul ant_meu.b este inclus ine ghilimele, Atunct cind. includeti aume de fgiereantet intre paranteze ascutte, compilatorul de C va cauta respec Ail filer mai intat in propriul slu director de fisiere antet, Cand compllatorul localizeaz’ F fislerul, preprocesorul it va utiliza pe acesta, Dac mil intlneste, el va cbuta in directonul curent Sau int-un ditector pe care i specifcati dumneavoasta, Pe de alti parte, atc cind incudeti un nume de figier ire ghilimele, compilatorul va cluta numat tn interiorul ddzectorului curent. TESTAREA DEFINIRII UNUI SIMBOL itera segiun din acest capitelv-au prezenatsimbolus predefnte de compilator. fn pl cdieva sectiuni vat att cum si va defini proprile durineavoasta constarte gl macroins- tnugiun. In funcje de programele dumneavoasteS, uncor vey dovi ca preprocesorul si 430 Torur pespre C/C++ rela def paint un ino dhe aa sh exec un amit Le a edna nel fos insti, preproceso de ecb ne Yormatl recive fees: (fendif 4 tunel end preprocesoa iniineyte zectva. fe ol va testa ack simboll respec + ft dea anti pra, Da ee dca prepoxesonl st esi seen la insouetunes send. Aeon vet dor ser 3 este Se ermal 2 Gea an anu etl. nace ce puch ef Unetoarlensnitun! iizeazt aide pena a inca rep tl di cioedaroinsrctunes Joupper dack nu 2 Tost defini un si BE iia oe eet oe 150 — PrerrocesaREa INSTRUCTIUNILOR IF-ELSE reer i sii taviat cam of utlaapinsiruciunle fey, ifdef #enaf pent & inseoiaes 49 a a sc nse dac on prom deft ane Foe er hen anal si Unon, ve dno procoare ma cme, Shee) cer sk execate un set de insuciui tune cd con estat U4 ree reeiets alt set de insiracluni cind condi este flsi, Pentru aceasta, pure Culizay insiuctiunea ose, aga cum se arath mai jos pe etenpl, complaoxele most Haul Crs Baiand C++ 5.2 nud const preprocesor unice, ‘care indic’ ce compilator si ce versiune util lear cont Pl ear consane pi aca sce Tees ir ol agent de cod va aja Mrs ach : {ore eae rns acd se ilizeaedcomplatorl Borind C++ 5.02 ins a : d »gitde® “Msc_VER . sae £ : i printé ("Microsoft") i Mackoinsteucunt $i consTanne 131 TESTAREA UNOR CONDITI! DE PREPROCESOR MAI PUTERNICE fn sectiunea 149, ai invatat cum si utiizay instructiunile sifef si aifudef, pentru a cere preprocesorului si esteze daci un program a definit sau nu Un simbol si apoi sa execute instructionile care umeazé in funcyie de rezultaul testuli, In anummite cazuri, Saf putea i dont ca preprocesorul si testeze daci mai multe simboluri sunt definite sau nu, Urmitoarele directive testex2i mat intl dacd simbolul BISI_MEA este defiit. Duc prograrmal dumnea- voustd a definit anterior BIBLE, dtectivele de preprocesor testea2’ daca a fost defini simbolul FCTMELE, Daci progeamul dumneavoastil nu a definit inci FCTLMELE. coxlul indicd preprocesorului si includ figerul antet coe meth: Heder prot! sen itndes FCT MELE | Hinclude: "cod_meu.n" “fendi | fendi 4 toate ca directvele efectucazi prelucrarea doriti, condiile imbrlcate fac ca alti Programator si fie dificil si va usmareasc® incenfile.O solutiealternativa a fica progam dumneavoasiri si testeze definitea simbolului cu directiva #ifsi operatorul defined, dupa coum se vede tai jos 2 datinea (sitbot) Tic //tnatrvctinns fandiz Spre deosebire de wiles #ifndef aceasta drectva oferl avantajal posibiitatii de a combina teste. Unnitoarea directv efecsuesz’ testl din primul exemple al acestui capitol: if defined (BIBI MEA) G@ {dotined (rch MELE) include “cod meu.h” ee fendi ‘ Put fos 4 deie penn consis condi cae wlizeazi operator lil alin CAinclusiv &&, 11 gi), 2 7 , PREPROCESAREA INSTRUCTIUNILOR IF-ELSE $1 ELSE-IF _ fn sccyiunea 151, a invijat cum se uilizeazd directiva clue preprocesor #ifpentra a testa | daci programul dusneavoastci a definit sau nu anterior Un simbol, Cand veqi utiliza drectiva #if, est posibil ca preprocesorul si execute un set de instrucfiuni cand simbolul ‘ete deja defini gf alt set dict simbolul este nedefinit (preprocesare condijionala). Puteyi ‘electua preprocesarea conditionali utlizind divectiva else be defined (simbol) | U/ Anseructiuns 132__Torur pespre C/C++ Fe pameryrereetrimnconntupsiiny sioner pire rons mania epee em es (ec epeitann enee ce ‘Selec taperearninecie ng eee se ine args neo Asa cum putey! vedea, directivele #if i #else vi oferd un control mai mare asupra preprocesorull ‘Observatie: Unele compilatoare, snclusivTurbo C+ Lite, accept directiva cdtre preproce- sordelif, care indeplineste aceeasi funcje ca si consiructia telse if. 153 Derivinca macroistRUCTIUNILOR SIA CONSTANTELOR PE MAI MULTE LINII teva dine secnte peezette tn acest capil av efit contact x macroinseui. Fe es et etn lege erecta CENTS peeing ne un ld defi une conmant sua une! macs Seni Sete pins urmatoarepasun caer bac cept ie cama ox actin id ietere fc slung” sta /constanta’ de tp] ja sinacesttn dous ini" a (C(e) >= ta!) 6 ((e) <= tz!) 2 Ce) \ a 154 © Crearca pROPRILOR MACROINSTRUCTIUNI Dupi cum af nv, maciolntrvne v fe posbliaea dea defi consant pe exe prcaSteol Te aibsttite in tt progeaml kine si Iceaph complarea. fh pls are univ perm eras unot opera asendnouefunior ce lucen2 cb i Fluameul ant valod pe exe e eansnite} macronsucni De exe aon a scjana Stes, curneatd sua ear Gov valon pe cies ea Leer Me eee idefine _toupper: ‘atta eo Wineilids /Zeeaiolas Hdefine SUMA(K, ¥) ((x) + ON) MacromstucTiunt $1 CONSTANTE 133 Printe(!3 + 5:2 ¢d\n", suMA(3,"5)); ae | peint£("3.4#3.1 = 42\n", SUMA(3.4,°3,1)) 7.) | peint£("-100 + 1000 = sd\n", SuMA(-100, 1000) In cadral definite! macroinstuciunl SUMA, x 9 eprenints paramet macroinstactan ‘Atunci cind transmitei dova valor! macroinstruciunil, cum ar f SUMAG, 5), preprocesonil substituie parametii In cadrul macroinstructiuni, ca ia figura 154: codulprogramull|) xe sunal3.5) reprocesor Eo) cod! programull| Figura 154 Substituirea parametrlor macroinstrucfiunii SUMA. Ia programul suma.c, subsituiile vor avea ca rezultat urmitorul cod: ee S SS FANN, (3/415) Bie Prinee("3.4 43.2 42\n" (8.4) + Ge PFAnt£("-100-+ 1000.8 8d\n",.((-200)'+ (1900)))7 UriizaREAa CARACTERULUI PUNCT $1 VIRGULA IN MACROINSTRUCTIUNI [Bxaminand definita macroiastruciiunil SUMA, vel observa cd ea nu confine caractenul punct sivigull [liseting Suma ce) yy)" CO) + Gn) ci includeti punctuls visgoa in cadrul macroinstrucyiunilor, preprocesomil va plasa acest caracter la fiecare aparve in cadrul programului, Si presupuner, de exemplu, cl ati plasat punctu s virgua la sleitul define! macroinstruciunis SUM, asa cum se vede mat jos Rey Hye define SAGE WC Sue tunel cand preprocesoralexpandeatd mactensnujiines, el va inkude si punctl el, cal ou SUpeinee('3 F S1= VASP TAIN print£("3.4 + 3.1 = ¢f\n")((3.. pELNEE(*=100 + 1000 = Sa\ne,( 434 Tout pesprE C/C++ Macromsmucyium si constayre 135 dee: Deoarece caracteral punct st vegullapare acum in interior Insrueiund pringf Gndicand sfarsitu instragiunii, complatorl va genera Or ‘Observapie: In afara cazulul in care dont ca preprocesorul sd includ punctul si vingula la Sete, ma uz punctul rgula ito cafe de macrofnsrucine (CoB) CGR). # Ga)” void main(void) ‘ : io Eee prints ("Patratul lui 2 Print£("Cubul lui 100 eate 4£\ Se ste. 4d\n", PATRAT(2));__ bp 7 C0B(200.0)) 156 — CreancamAcrONsTRUCTIUNILOR MIN $I MAX rere ost Urmatoarle ti ecjunes 184, cea macroinsavunen SUI, cae au dowd val In sete ag DUAN, reuse mnimul main dou Yolo desine wae av (@) < GD) 7 Gs G) ae mate, ¥) (C(O) 2 (2) F (xs) CGontortpropam, min. max. c usucark modul de wlizare a macoinsvucnlog MN AX Inscen ogra, susie va ave eit io [prints cmataatsi came: [Printe("Cubul ini 100 este ¥£\n", (100.0) ¥ (200.0), * (100.0))); printe ("patestel ui'2 Observatie: Pere brevet i asd ; vont suai de doping, programslpat-eube wsieaza re out mob 100.0 aa macroimsncaitCOB ne eee eae (ieee Spapite on DEFINITILE foofine MIN(x, x) ((60 <9) 2 GD: W)) _MACROINSTRUCTIUNILOR factine MAx(x) yd (U(x) > (7D) 7G )) Citeva dine secjiunile precedente v-au prezentat ma entre eee Aci cind crea macrinstucun! cae accept paramet, Webley sets ape void mange ; / ae dn cau dehnilor Nu placa Gaga eee eee ent spa 1, 25-00) 3 si iaiicn piensa deh Ent AS ONE clog 9.4 a 3.2 ent, $e YONG 4, 2.04 a) ; Saye eee hase eu 4) poncicind preprocesoal vi examines2 : x grarmul, spatiul de dup numelé macroinstruc- ta fice ca preroceso sh presupund of wet st inlocuissc Hecate apaie# mmc PuteaT os (69 "inode (ca eat especie sel covet, cle al mae can, compl fenrs mee de Coss Inesae de averare, Pert alee cum realize prprotesna subs tules macroinsructniymodifea progam pat pun un spas die Hette nme Ge mactinangiune. Pn Sestunea 25 vreonel edod execu program] sin.mas.c,sobsitunle: reprocesoruhti Yor Ave Ct ezultat urmatorel coc caisee pnagaman/wareeiiag 1010 aii 25/0 gata, saNs, (C1200) 5 (20.0) :2(25.0)) 0 x Oe alorilor 3.4 si 3.1 este f\n", (( (3-4). % Reh C sol teva dinre seiunle precedente v-au prezentat ma 157 © Crcarea MACROINSTRUCTIUNILOR la (parame). Dak vt a orate la ecae macoisuaine, Vey ves ch PATRAT S| CUB ‘ponte sunt inciuse Inve paranteze ‘macroinstructiune, veji vedea ci ‘pop cum aj inva, imbajul Cv permite s& dein maeoinsavetual SSK etie rr ncn, respect, pavatl (&*) si cubul une! valor (&* =" = oe jaatine ARRATG (GO) + CO) “ gdefine COB(x) (x) * Ge) * (9) ‘pat cube, tuscea usizarea macrlnsrucpunilor PATRAT # COR 4 Bown (ev) Cx) 4) soar PATRAT (x) ((x), * (3) ‘ CUB), C1) # (a) #200). i . MEN (x, Y) (8) < (I) 2G) efine MAK Ge, ¥) (C(x) > (y)) 2 GH {Umatorul program, aes” ‘dofine PATEAT(x), ((2)/" GD) foie macroinsrcivlor includ parame tire exempl, sf consderim umnatacen insane Pn * SRP CAPs eaitat = parAr(3 + 5); 136 Toru pespre C/C++ ‘Ar webui ca instructiunea si stocheze in variabila resulta’ valoarea 64 @ * 8). Si presupunem, de exemplu, cf ati defini macroinstructiunea PATRAT ca mal jos: Daca ne reamintim precedenta operatorlor In C, observim ci inmuljirea are precedent’ mai ‘mare decit adunarea, Prin urmaze, programul va calcula expresia astfl: ‘und cand incdeyflecare params Ins-o pirate, vi aigual cB preprocesori va ala corect expres: Observatle: Ca regu, pune} intotdeauna parametr macroinsiructiunilor intreparanteze, 160 = Macrowstauctiunie nu au TIP fn capitokul ,Puncti', veti invita cum si exeati functii care executd anumite operat. Ve Ne conor ciammcrene lain oS eonlon back func dumreavonia fetes o operate $e aan ac uctule ak apeeica pal teal (eum at in float ec). De aaa ee eae fons alg tun do valent! 9 etrear un ez ta a In cadrul programului, putet utliza aceastl functie numai pentru a aduna dou valor de tipul int Dacd incercati si adunaji dova valos real, va fl generaté 0 eroare. Dupit cum a Vat, macroinstructiunile va permit si lucra cu valori de orice tip. Macroinstructiunes SSUMA, pe care at creat anterior, agcepti valoni de ambele tipus: ints float SOMA, SE £\n", SUMA(3.4, 3.2)) 7 : soci ut ia macros \ctiuni pentru © operatic aritmetica simpla, nu mai ese meat Br neetiee pentru a permite utilizarea unor valorl de tipua yRuRI_137 diferte, Towusi, asa cum vei invata in cxpitolul Fung, tebuie 5 fini cont gi de alte Sspecte atunci cand decidei daci ves utliza macroinstrucjiunt sau Fanci, ViZUALIZAREA UNUI SiR Calculatonul ciumneavoast:d necesiti un octet de memorie pentnt stocarea unui singur caracter ASCIL. Asa cum a{i invijat, un gireste o secvenji de caractere ASCII, Atunct cand declarato constant de tp sir, ise aribuie automat caracterul NULL, Arunci cand programele ‘si crecaza proprille suri chind caractere de a tastaturi, tebuie si plaseze caracterul NULL |a sfarsitul scului peatru ai marca sfirgtul. Prin urmare, cea mai bund modalitate de a Viaualiza un sir de caractere este si vil imaginayi ca pe o colecte de octet terminati cu un caracter NULL, asa cam se ara in figura 11 1S oct cert | r Tivo) Thu [84] ="Totul despre cies afasit “Tay (69) Figura 161 Sinurile se pastroaza in locaji consecutive de octett de memorie, Auncl cind 0 funcjc lucreaza cu un sir, de obicei cunoaste aumai locaja la care incepe acesta. Cunoscind locaja de start a sirulu, funeya parcurge urmavoatele lotatii de memorie pind cAnd va intlniearacterul NULL (care indica sfaritl iru RepREzENTAREA UNUI SIR DE CARACTERE Citeva dine sectiunie acestet clini uulizeazi constamte de tp sit de caractere incuse intre sllimete, ca in exemptul urmat | Srotal despre S/cr ‘Atunci cind utlzatio constant de acest tip imt-un program, compilatorul de C adauga automat caracterul NULL C\O) la sfigptul sirulul. Compilatorul de C va stoca aceasté constant Jn memorie aga cum se vede in figura 162. 19 octei le] | folv|e}s] sho ‘Figura 162 Compiletorul adauga automat caracterul NULL constantelor de tip sir de tance 138 Toru pespre C/C++ Suort_ 139 Ohservapie:Atwnct nd lcracu srart de caratere tebe sw agro snclus coct varaclerulNNULL pentru a reprezenta sfarsitul sul Direnenya Ine’ $I°A* reed ga cum nv in secea 161, un gr de aratere ete o sees oF 0 multe Ace re nba Co tenn co caracterl NULLCASGHT 0) Aun! wera Fea ee Cone lca valoarea numeric in ASI a crac = poe plasa sree apostofut, cum af Pe de até pate, cind utlizal gsineie Se fs, erro dec egecat un sr de caratere care confine litera special lierele) si complatont €& Geagenl MULL Tiga 164 Muses storarea in C a consaislor'8 3 "A" 163 SrocareA unui sin DE CARACTERE IN LIMBAJUL ute dnwe secure acest cl wileaz pe ca larg ule de ase Oe cexemplu, Mule ane leas gt de caraere pei ai ie st ate tastaturl, precun se ate operai. In C, un side caracere exe un tablog de races rermioat ew NULL 1 pet ae oe eave, pur sip ve detarauntabion de carer, ca PS saptesehint complain de C va cea un gr capil si paueoe 256 de canto Pe Se, le indexeazh eEESG dea sil para a sif2531 Deoaece sl pate coming ms ‘de 256 de caractere, sree onl de ullzaclcaracterd NULL (cok ASCH OD pen 2 1-PrSra) ail caracer a Sa esc nb C mu pase acest arate pa ui et sirul, fn schimb, dee onan ges sau. gos plaeazl aces. caracet lx capital dni Of Se Dad Fen Sele dumpesveasrsmaniplesl su de carat, ei pene Gurneavonsirt ae rat prnena carci NUL. Uric progam, crmezilc¢ eines ‘de caractere Sa SG a apal abe primelor 26 de ori Ierele mas ale abe areesasicaUllents aa 7 A a | 1K “AY ‘Figura 164 Stocarca bi C a constanstelor ‘4’ 51°8" Deouece sunt stocate mod fet, constaniele de tp caracter eae de tip de SET Decaece sur ora pebule shaved gis sl le Waal im mod difert in progamele ‘aumneavoast. RepRezENTARES UNE! GHILIMELE INTR-O CONSTANTA DE TIP SIR DE CARACTERE Aga com af Tavtat pent a cron o constan de up gr de carat lnsae carucerele dote ine ghimele peoarecelmibajul C lized gimelele pentra a defini constanele de Up ts 66 TGs peoere existe o modaltate i+ spomes!compilatorul eA dons ineioeet sghilimelele in cet gull Peuzaacesaa ilaal secvena escape V, com se wede sal JS aractere contine ts\n", sir); in program trebule rizeaza bucla for pentna a ssibu rele de Ia Ia Z. grt de carats, ‘Got Brograml plaseszi caraterl NULL dup era 2Z pent ‘stabil fasta snub Ae rea ea ofa opch Recare caracter al gull, pan Ja caraieny) NUE Funeyile re Cre iuereanh cu ru de caractere lizenta cracrenel NCTE pon aaa al, Umitorul program, ala able de asemenes ros Ta Ala Z unui Saye dracere. Tors, progrml atbuie caracterl NULL Ww Stic! locafa Fe argc ert) tune ed prinfafigeaz continual ln #8 os 1 inciude “ecvaata 5 osnstanta|da,thplateide [caracteret | } dope 68. “fascopt\apune a. ‘ anne am gc wor even ccpe pei 2 as gine 2 a gris caere iE ‘ -yoid main (void) oh Bei 140 Torur pespre C/C++ Smmurr_ 141 strlen (titticarte)) ; ; = char sir[] = "\"stop! printe (siz); aE: i Atunci cand compilat si executat programul strlen, pe ecranul dumneavoastei se va afi Totul despre C/C++ contine 35 caractere ee 166 Dereawnanea cuncim unui ROCRER | renin injege nal bine cum pete nc stron SIR DE CARACTERE nef urns caracterele dine-tn gi pai | epuse ea. Lurmatoarea implementa. la caractenul NULL Pi al pune st peel la socotealt fn sectiunea 163, afi favijatc& functileIimbajului C utiizeaza in mod obisnuit caracterat size SUCTaR TOSSES} [NULL pentnu a reprezenta sfizsitul unui sit de caraciere, Funcgile cum ar fl fgets sau cgets ce atrbuie caracterul NULL pentru a indica sfarstul giulul. Urmatorul program, wun_sirc ee utlizeazd functia gets pentru a citi un sir de caractere de la tastatri, Programul foloseste poi bucla for pentru a afiga caracterelegirulul unul c&te unul, pind cand condita sii NULLeste evaluat ca falsis while (sir{i]) att xeturn (i); Hindlude char ‘stropy(char Adestinatie, const char *sursa) ( Sea char * initial = destinatie; char titly carte(] ‘Totul despre C/c++" Print£ ("ts contine td caractere\n", titlu carte, while (tdestiratiet+ = *sursat+) Suny 143 4142 Torurpespre C/C++ ADAUGAREA AN CARACTERE LA UN ‘SIR fn sectunea 169, ai iva fu ‘acter la atl. fn uncle cazu ia st sirul destinatie, pan’ la Pungia spy coplazk pur si mph Merele din sul sus th gil desinai, pi farateral NUT, pe eet include 70) ni ica! permite adSugiea (concatenarea) unui git de dori st adiugat la irl destinae tone eaactrle sl Si; lar aheort doar prmele dou, tel sas n earactre- Pent & fala scaeeees Garaceve Ia a sir, cele mai multe compllatoae de C ofa Ring tmecas aes etapa phimele caactere ale gli sus sil destnati cal foe [Winetuda!Zstzing is SEDRREE [Ghar setmeat (char “destinatie, const char “aurea, size tn); ) Dac peeiena un auc de caractere mi suis, funcjia stmicat va copia toute earatercle pl Frogramal imitorsrincae hues modal de ua 169 — Avducarea conpinututui unui si LAALT SIR ; tc posi have | sal tn prance duonenvoa ren drat es post sh Tenet unulsusiector gal un nue de er, pte ga nel fier a ie Sihseconl pets eine un ae decal), ana dC mane Someone proce eal ul de caacteela at Fens Qhatupa unde racer a ele mal mule compton de Cole i She conextencaal Cadauga) un sie de eavactere la un gir Ut, cum decit numasul de casactere din sirul ind Ia sfarsital sirului, nu mai mult, lizare a funciel simcat mena aaa ae ae ERIE Hatsear oar Sdestioazio, conse ‘tor progam, seat, lusrear uate nee reat char nue (6s) = "Bint"; strncat(nume, " si Hillary", 3) | PFANt€("AL votat cu 2?\n", une); eerie IRBETAE | Atunci cind compilai i executai AL votat cu Bill ei? en\> Programul sirncat., pe ecran va apavea windtorl text: entra injelege mal usor cum opereaza funciastrncat, analiza! wematoarea implementare: Pehar “etrncat (char +destinatie,’ const chat! ¥eurea’” ink a) 1 char ‘initial’ = destinatie; r ‘ennatoarele: Spent Muele cartit cote Totul despre C/C++ wile, (tdest-nacie) ene “dostinatiets; Pentri ainjelege mai bine cum o (taestinatiot+ Be ean a rsursat+) _TRANSFORMAREA UNU! SIR DE CARACTERE SINALT SIA Dui ca caractere destinatie pat com pute veden, fone seat lene sul de Palnege aacerl NULL, pe cae inte in qu deste 144 Torvt pespre C/C++ a Res ee sings sets male Se eee Posse mada funn ae ears de copies Geter pees apie, huarerh See eur 145 tet : *etr2) ee (*etri)) 2 stritt; strait: ty es Feturn((*s:rl == NULL) && (#str2 == NULL); ye i ‘Punctiastregleturneae’ valoarea 3 dacf cele dout girui sunt egale s valoatea 0 daca ele nu sunt egale. Urmitorul program, si reql.c, ustreaza felul in care se utlizeaz’ funcia sireqe #Hinclude’ care void main (void) ¢ Printé("Testare Abe si Abe d\n" Printé("Testare abe si abe d\n" Printe("estare abed ai abc $d\ + streql("Abe", abo") ); streql ("abo", “Abe")) ; + streql("abed", abe"); ) Atuncl cind compi ‘urmatorul vezulat Test Abe si abe 1 Test abc #4 Abe 0 Test abed at abc 0 c\> lati! executati programul-stregl.c pe ecranwl dumneavoastid se-va alga vniriaatl, tune ind eecua Opera c gu decree, rebut 4 asgura tu dept lect de momerelste gl Pent andes cre un probleme i de sceres peste intele stro, um de exempt umdtoaen declaa,cae rea tin i eapabl plazeze Io cartctre IoNORAREA DIFERENTEI DINTRE MAJUSCULE $ MINUSCULE CAND SE COMPARA DOUA SIRUI Cea [tn secjiunes 173, afi creat functia si determine daca dou Duck bul su al ma 10 ate ape col dammed aie oh sesizeze eoatea 9st suprselecaraceelesuplimenaze pexe lose ‘terns covecpunaatone lor varie, Nu sual cl ente fous ll de corcat cor desuprasciere; dao aseldeeroare poate, de asemenca, sk caine blocatea exes 8 compara are aceast distintie. Pentru a compara doud sind de {sacri se Seana dak ieele sitar sani putas oie ae id aac dope Cael dea lee tena Gxracere pulin mal mast d za a Ficind aceasta, veqi reduce = cere pin mai mat decdt vd gin cl vey sven nevole.Facind aceasta ve edn ee frotmtes supra prnloc Dae proyeanal dumneavonu gonseed dn Gnd’ fe Finclude' unde (air) void main(void) t Te : sole = tolower (teiz) 7 { pinte(omestare Abe ai Abo Sd\n!, striegi ("Abe", "AbE")) sizer printf ("Testare abe 3i:Abe $d\n", strieql("abc", Abo") ) 7 : Renee (imeseace abed ai abe Ad\n", striegi (‘abed", "abe return (initial); : Diladene aaa “Atunci cand compilati st executatj programul siriegl.c, pe ecranul dumneavoastd se vor ait ‘urmitoarele upd cum pute vedea, smbele func prezentate, sili sirup, ccleaz irl de caractere onvertind fiecare earacer fie in majuscule, ein minuscule, conform Fanctei invocate, | OsrineneA PRIME! APARITII AUNUI CARACTER IN SIR Cad vey crea programe care lucreazi cu giruri de caractere, putett si gsi prima apatite fn stdnga a unui anumitcaracter in ineriorulsirului. De exemplu, daca erat’ eu un gi care ontine numele une! cai, piteti si elute primul caracter backslash (\) din gi. Pentru ava > fs si chuta. prima apace @ unui caracte intrun sir, cele mai multe Compilatoare pun Gxposite functia numiti sircbr, care retumeazs un’ pointer la prima apariie in sit a ‘aacterului specifica, c2 mal jos 175 — Converrinea cARACTERELOR UNUI SIR Ce IN MAJUSCULE SAU MINUSCULE “awund clnd programele dumneaveastd lucreaz’ cu sinut de caractere, veil dost uneor 8 deere at uni de caractere in majiscle. De exemplu, cind tiizaor intenduce numele Sear fe eal iene posi ca program si convertessc intregul it de cracteret wajustule, pent a sinpliiea operafa de comparae a sirulor sau pentrs a 8 sigur d raimil pisizerd dateleintean format yntar. Peni a v8 ajuta si realza! aceasd eee dale mai multe complatoare de C pun la disposiie functile slur gsr prezentate ma os Hfinclude ‘char *stechz (const char *six, int cazacter); Dack-functia strcbr nu giseyle caracterul specificat in interionil gira, ea rewurneaza peimerul earacterufui NVJLE care marcheaz’ sista siului. Urmatorul program, strebar.c fusireaa’ vlizarea fungiel strebr: fincas stato x Hinclude vyoid main (void) char titiu(64] = "Totul despre c/c++"; char *ptr; per = etrchr(titu, 'm!); if (*ptr) ‘ printf ("Prima aparitie a lui C este 1a deplasamentul *d\n", per - titlu); : else peinte ("ci c/cte\n")) 7 c/cet\n")) terul nu exista\n"); functiet strtur 148 Torus pespre C/C++ ‘unc nd comply sl execu programal sch, pe ecranul dumneavoase vt Haft “uma relat prima aparitie a 3ui C este 1a deplasanentul & ene ‘Trebule sf observatt c strchr mu confine indexul primed apart a unui caacter, et un sent Pentre a flege ma bine func sirhr, st analiza urmatoare implementre iar! #etzche (Const Ghat aiz, int 1itera) {mite ((seiz [= Litera) 66 (teie)) “peirtt: © return (aiz) > ) 177 — ReturareA INDEXULUI PRIME! APARITI DINTR-UN SIR tn seciunea 17% tien prima apanife a unui caracter Ia interim sul, Dach isk tata srl de ae Pablo’ probabil ef vey pefera si hrs. ca un index al eoratrelor, nu co un eae ne oles func srr penira 4 obinetndexulcaracterul do, send eee je nceputa pr din polnterl pe care Il etumeaed func ste, aga cum se vede mal ps char ptr =stzchr (siz, caracter); index = char_ptr - siz act functia sinchr mu giseste caracterul fo sir, atunct valoarea pe care ea o auribuie indexulut va f-cyald cu lungimea girl. © alti metodi este wilizarea functiel strindex, ‘eum se vede mai jos: int ste index (e Chae sist char *eir, int *litera) while (tes [= litera) 66 (*sir)) | sizths ‘ return ( initial); 178 © Gisinea ute: apanrri Crem AUNUI CARACTER INTR-UN ‘SIR Cin vet! rea programe care hucreaaS cu suri de caractere, pote si isi ultima apatife (Gea din extrenitatea dreaptd) a unui anumit caracter a sirulul, De exerplu, daca hucra tun gr care congine un nume de cal, pute si tat ultimul caracter backslash (\) din grou Scopul de a gist locatia unde incepe mumele fisierulul. Pentru a v8 ajuta si ciutai ultima al invijat modul in care se folosese funcia strabr pentnu a objine wn | sieury 149 a unui caracer fnt-un sc, cele mai multe compllatcare pun la dispozie funcyia strc, care retumeaza un pointer la ulima apariie in gira caracterului specifies, ca include’ #include functia strebr mu gi void main(void) char titlu[64) char *ptr; Af (pte = strrchr(titlu, '¢")) "Potul despre C/C++": printé("Ultina aparitie a lui Ce 1a deplasamentul 4d\n", ptr - tithu); else printé ("Car erul nu exista \n"); , Trebule si observati Gi sirrebr nu contine indexul ulimei apasgi a unui caracter, cf un 8 analizim pointer Ja respecivul cancer, Pen inelege mai bine func sre Umitontea implemencares ‘char *strrchr (const char *sir, int litera) 4 char *ptr = NULL while (*siz) ‘ Af (#841 ptr = sir; siz: ) return (ptr) ; ? Litera) RETURNAREA INDEXULU! ULTIMEI APARITH DINTR-UN SIF. {a seeitinea 178, aj Invajt cum se foloseste funcia strrcbr pentru a objine un pointer ta hima aparijie «unui carter intr sir, Dac trata irl de caractere ca un tablou, probabil cl veti prefera si lucrai cu un index al caracterelor, nu cu un pointer, Puteti si folosit 150 Toru paspre C/C++ Sieve 151 Scrienea Funcpiton PENTRU SIRURI FAR (ezaet clatoare pun a dspozie unt eae accept "are face referire de pointeri far. Dacé utilizati ut ea spun easel defunct pure singe neh pent dae ee aR functia sirebrpentru a obfine indexul caracterului doit, scizind advesa de incepur a sul din poingeral pe care il returneazd functia slrrebr: ghak pte = stetchr(eiz, carecte:) index = chaz_ptr - siz; i pentr suri far modifiednd func Pin eceaatl eecfine De cree inctile prezenuate 2 care © va atrial fexemplt, urmitoarea functic, Juregh, ilustceazd 0 iy ‘Dac’ functia strcbrnu giseste caracterul in interioal sirulu, valoarea ps i Dazat pe pointe far function local ele ited basa oe ye rae indexului va 8 egald cu lungimea sirului de caractere. O alts metod este wtizarea funcyet ndard, bazate pe pointer: local) sinr_sndox, cum se vede mai jos: int fstreql (chiar ‘far *eizi, chav far *eiL3) " { in€ strr!index(conat char *sir, int 1itere) ( “char “initial = siz: char *ptr = NULL: while ((vatet == e112) 66 (*air1)) sirlt+; t sir2tt; while (sir) i return((*ptr) ? ptr - initial : sir - initial); 7 ) : Nuwinanes ses INTR-UN SIR ind crea proprae core creas {ide ce on apare un caracer in * $i, pte fos ung ITIILOR UNUI CARACTER CAGE 162) sr de earatere, po pire sta tr-un sir, Penta " : 180) Siruave ran cm se poste vedea tn capt Memos", pointer far pemik progamelor se ta Slustenet de operate DOS st acesee date state Th fra semen cent de di Beh Aruna ind lca pointes Jar bute flo, de asemency, func ci Sec pantmetti Tor si fie pointe for Din plate, nic una dinae nudoele P care dori si 4 numira apasjile unui caracter inte-un _ |Ant!charent (const char "sir, int litera) ‘ Exemplu, pentri a determina lungimea unul sir de caractere la cave face refeive un poi return (nz) ; “fan, pute utliza Funciia _Stien, prezentati ma jos Hinciade size_t _fatelen(const char *siz) Iwersanea conpinuruLut UNUI SiR Glad creati programe ¢ Penni a determina care functt far sunt acceptate de compilatonl dumneavoase, sud documentatia aferenta acestia 4 Observatie: Asa cum afi invdjat anterior, Visual C++ mu accepiit declaratti far (oh pointers, nic fancti),asifel ed, inVisual C+, pute} utiliza fanchiastrlen cu pointeriebar de orice dimensiune creazi cu sur de caratere, pot apaea suai care dor sh : lor drs ss Pent smpiieraceest opera cae ea _fulte compilatoare oferd posibilitatea utilizirii unciei st " trex, ca mal jos Es char *strrev(char *eir); _Fenin a injelege mai bine Functia ster, analiza! urmitoacea implementare 152 Torut pespre C/C++ che ¢etcbev(char *ein) oe char initial = sir; che laemnter a) ete “char temp; while (tain) sists hte (uenator! rots masa toaia) " PEIntE ‘compare Abs cu abe Ad\e", stremp(vabe", "ane")), PEINtE(*Conpara abe eu Abe td\n" streap(oaben, “abe Prlnte(compasa abcd gu abe Wass, Shere reese ey PEinte “compare. Abe ou Abed W3\ae, Seer aan nana} [sint# (Coompuen abed gy abou tale" (etsore (raises, anak ,Pritef(conpasa Abce cu abeg tan Sereapogeeee aR}! Pentru ingelege mai bine funcjia siremp, sf analizim implementarea urmatoare: | int stremp(const char *s1, const char #s2)7 while ((*s1 = ( alt: s2t+; d 48 ((¥82 Eeturn (0) ; else if ((¥s1) G6 (1 *52)) // Aceleasi dar 51 mai mare return(-1); else i€ ((*82) 6& (! ¥s1)) // Acoleasi dar 52 mai mare eturn(1) ; els y Tatwen((t91 > #52) 7 4: 2); // Diterite 492) 66 (#51)) 82) G6 (1 *81)) // Acoleass sirurs 184 Torun pespre C/C++ RURI 155 ratFal 186 — Compararea PRIMELOR N CARACTERE DIN DOUA SIRURI {n secjunea 185, ai invigat cum se foloses ESS in fone de progamele durneavoast pot Somparat deett primele 1 caractere din dow sirud. Peniea orantere din douk sri, cele mai multe compilatoare de C ofero functe ne tun se ede mai os Hance *82) ce functia siremp pentru a compara dou iru de jpirea situa in care nu tebuie st a facilia compararea a.m smith ssc, Per aye ey CoMPARAREA SIRURILOR FARA A FACE DIFERENTA pom INTRE LITERELE MARI $I MICI (TE fn secyunea 185, twat cum se utlizea2 funtiastremp pentne a compara dou suri de saracere. De asemere, in secjiunea 185 af invat cu se flosese funeta strcmp pentn ‘compara primele ncaractere din doutgirur. Ambele funefi, siremp si straemp, consider’ liesele mari gi mic ca Rnd diferite. In funeyie de programele dumneavodstr, putei ca la compararea unor sini de caractere si fe iynorata aceastddiferena. Peniss 0 asemenca epertie, cele mal multe compilatoare de'C xlispun de funcfile sricmp 1 strcmp, Prezentate mat jos: (recites RSS NN : include 4 a [Pinciude : = (1B [ine stziomp(const char oi, const char 42); jompara 3 Litere abe cu Abc td\n", strneap("abe", [ARE atenempi (const char *61, const char *32, size_t a); | tmbe, 3))7 : “peint£ (“Compara 3 litere abcd cu abc #d\n", “strnemp(“abed", "abe", 3))7 prints ("Compara 5 litere Abo cu Abed *4\n", “ strnemp("Abe", "Abed", 5)) 7 e("Compaza 4 litere abcd cu abce td\n", (abed", “abea", 4) Unmitorul program, compi.c lusieaz’ modul de uilizace a functillor strcmp si siracmps Piinclude | Hinclude [void main (voic) fet printe('c sten PEint£ ("Compara Abe cu Abe 4d\n", stricap("Abe", “Abe! PEint£ ("Compara abe cu Abe 4d\n", stricmp("abe", " Print£("Compara 3 litere abcd cu ABC 4d\n", ‘etencpi ("abed", "ABC", 3); printf ("Compara 5 Litere abe cu Abed td\n", strncmpi("abe", "Abed", 5); Fens a inclege mat bine fenctia staremp, sl analizim urmitoarea implementare ing stenénp (const char *e1, const char *s2, int n); ‘ y 4 sme io; es aa while ((#e1 om ¥22) 66 (481), 664 < i B A 7 3 ‘Aunci cind compitay si executal programul compl. pe ecran va apivea Ce | D conpera the ou abe 0 eat 9 @ compara abe cu Abe 0 a QD comarca 3 ittece sbed cu anc 0 es |B eepera 5 Saco abe" abed Ss 4f (Gi == n) 4 . ‘return (0): | gise if ((tel == *92) Ge (1 *s1)) // Aceleasi sizurt zetuzn (0) ; else if ((*s1) 6 (1 422) // Aceleasi daz ol mai mare Ee 186 Torun pespre C/C++ 188 — Converrinea une REPREZENTARI i 7 (ers DE TIP SiR INTR-UN NUMAR Atunci cind programele dummeavoastrl hucreazi cu suri de caractete, una dintte cele mai frecvente operat pe care trebuie si o executati este convertizea reprezentirii ASCH a unei valori into valosre numeric’, De exemplu, daci cere utilzatorulul si-i introduc de la tastaturd salariul, va tebul si convertti girul de caractere Inirodus tnt-o valoare reall in vingulé mobila, Pentru a va uta si convert valorle ASC, cele mal multe compilatoare de C pun la dispozitie un set de funcii de bibllotecs run-time. Tabelul 188 descrie pe scurt, funetile standard de conversie a reprezentirilor ASCH, silicate ‘Converts 0 reprezentare de tp gir de earactere a uni valor reale in virgulé mooi toi Conveneste o repreventare de tip gr de earactere @ unei valor ntregt ato} Conveneste 0 reprezentare de tip gr de caractere @ unel valor! ineagi de tip long strtod Convene 0 reprezentare « unul ir de caractere a uinel valor rele in dubia precizie stot Conveneste 0 reprezentare de ip sir de caractere a uneivalos de tip long Tabelul 168 Funcyile de biblioteca run-time pe care programa dumneavoasird fe poate Lfolost pentra conversia reprezentarilor ASCII in valori numerice. Urmitoral program, asctinum.c, ilusreaza utlizarea acestorfuncyii de conversie include finclude void main(void) ae rezultat_int = atoi (1234); rezultat float = atof("12345.678") ; rezultat long = atol("1234567L") ; printg("Sd #£ #1d\n", rezultat_int, rezultat_float, rezultat_long) 189 = Durticarea conpivuruLui unui giR DE CARACTERE ‘Aun cind programele dumneavoastri lucreazi cu sirur de caraetere, este necesar unecri ‘si dupliea} rapid conjinutul unul sir, Daci in unele situait programul dumneavoastrs va trebul ef copieze srul, arin altele nu, e posi ca tn timpul executiei programul si aloce in iRuRE 157 mod dinamic memoria necesara pentru a pasta copia siulti, Pent in c irulul, Pentru a permite programelor si aloce (inamic) menorie in timpul executei atune! clad webuie copiat un sir de caractere, cele mai multe compilatoare de C ofera functia sirdup, prezentaté mai jos: Hinciude ‘ char *atrdup (const char *un_siz) ; Glo Ivoca fancia dp, aceasta linens! mailoe pet a al , ee pent &aloea remota $1 apo! copia seul de carci Tn foeatia de memri, Dupl ee programa termi de Tent Copia allel poste elbera memoria villandInclanea free: Progra eae umes sirdup.c, ilusteeaza unlizarea functiei strdiyp. . finctuds | Winclude "void main (void) ‘ char *titlu; | Af ((estiu = strdup("totul despre ¢/ct+"))) i printf ("Titlu: ¥e\n", titlu) ; else 4 printf ("Excare 1a duplicarea sirului") ; Be), Pentnt a injelege mai bine funcyia strdup, si urmasm urmitoarea implementare: include * | #include | char *strdup(const char *s1) ‘ char *ptr; A£ ((ptr = malloc(strlen(si) + 1))) // Aloca buster stropy (ptr, 81); return (ptr) ; ) GAsIREA PRIME] APARITII A UNUI CARACTER fn secyiunea 176, af invijat cum si utiliza fanctia sirebr pent a ga a a strchr pentru a gsi prima aparitie a unui snumit caracter. fn Funqie de programul dumneavoastrl, putetl s& cdutaflintrun git de axactere pra paie toil eractrdntrun ana set. enw av ata sc inte-un gi orice caracter dintr-o mulime dati, cele mai multe compilatoare de C oferl functia strspn, prezentati mal jos * : tikeisds use nonene career {prints ‘cauta nbs in Ancpef 4é\n!, steepn("Abebes";“Rbe")): ieee meat Aare seein, teeny eRe Geert rer an Metate anes obenwP™ Gennes” soon | Binetude a void main (voia) j Be Gecact : PHint£("Cauta\ Abo in AbeDef 4e\n", (strate ("Abedef", "Abo")). 2 "apace" : “hu apace"), PEinG#(Cauta abe ‘in abepee serene | SP “(strate("abeDee", "abo")) 7 "apace" PEint£("Cauta Abo in abcabo ¢\n", (steste("aboabo", “abo")} 7 "apace" Wa apare"); ; ‘Acunct end complla! si executai acest program, pe ectan vor apizea urmitoarele Cauta Abe in AbeDef 3 Cauta cbA in AbcDef 3 Cauta Def in Abcabo 0 er Pentru a injelege mai bine functia sirspn, observajl urmnatoarea implementare 2 "Nu apare"); Feruru av auta sf fllege! mai bine func star, stciay urmitonra implementare: (char *otrstr (const: char #81, const char + BS 2) bomen e for ($= 0; s1(s1; ity for (3 = 4, k= 0; 513] == 2th], jae te aatioany Pam et |S return (01 + i); : : return (wuny); % Bad ai spa (Sona Vena 4a dana chaz 268) Nuwanue o€ arse ave unt suosin ez Insecunea 191, a 7nvtat cum st il a Tava cum sulla funevasatrpentua localiza un subs neat ecarcere Pues canoe de cite ol apure un dane seo a | Umitoares functe, strsm_nn, vi permite determinat de vive : _ plows nas side ete orl apare un anmit subsie a Hint cteats nc (Const ‘chdr Fsiz, conde char ¥subelZ) C int i 4, k, ne = 0; for (de 0; asetiss 440 for (j= i, k = 0; sir[3] == subsir[x) oH ; 9» of (1 subsir[k + 1)) Ce atte en oO RE+ z | return ine) fee OsqiNEREA INDEXULUI UNUT SUBSIR eos) ln seciiunea 191, afl tavaiat cum si ui alt Hnvaiat cum si utiliza foncya strstr pentru a obtine un pointer la un ‘bir dineun gs Dad ati sue de cactere cable, utah keane eee 191 Locauzarea unu ‘SUBSIR INTR-UN SIR DE CARACTERE ‘Atunci ind programele dumneavossri lucreazi ou sinus de caractere, uneoti trebuie st lutat un anumit subsi ins-un sir de caractere, Pentru aceasta, cele mat multe compilstoare eC oferd funcia sist, prezentati mal jos Winclude" [char Ystrstr_rep(char *sursa, char *vachi, char nou) ( Ren! 163) 462 Torurpespre C/C++ acd ofuncie mu poate si converteascsiul de caractere ino valoare numeric, funcia va returna 0, Unndtorul program, ascit_to., ilustreaz& willaarea funciilor ato Fiinciade' stators 71° pispetods Soeanib iho 7 yr eta), vyechs [kl geome rele = atos(" valllong = atol("igprost") + . pa: (rant $d float 45.2f Long $1d\n", val_int, val fie, ‘Aunct cind compilay gi executafi acest program, pe ecranul dumneavoastrl vor apivea umitoarele Ant 12345 float 33.45 long 12 a> Observatl apelul functici tot. Aga cum puteti vedea, atunci cind functia intlneste valontea nenumeticd Glitera p), functia Tnchele conversia, returnnd valoarea pe care funciia a convesti-o deja pind ir acel punct, 4198 — ConverrincA UNE! REPREZENTARI Ges ASCII numeric TESTAREA UNUI CARACTER PENTRU A STABILI DACA ESTE ALFANUMERIC Un caracter alfanwmeris este ox o liter, on o cilia. Cu alte cuvinte, un earacteralfanummeric exe orl o majuscul cuptinsa inire A sl Z, oF o literS mick cuprinsl intre a st 2, oti © cilri ‘cuprins intr O $19. Pertru a ajuta programele dumneavosstd si determine daci un earactet ‘exe alfanumeric, fier antet chped confine macioinswuc\iuine enniltd fShauM, Macro- insiuctionea examineazd un caracter si returnes2i valoarea 0 dacii au este alfanumeic sau 0 yaloare diferiti de 0 peru caractere alfanumerice, ea mal jos [Be Geatnua carectar : y entra inelege mai bine macroinstuyianes ésalnum, staat wrmitoares impemen- se {Wdefine’isainumis) ((toupper ((c))|>= 1A) &6 \) (toupper((e) )) SEN) IIC(@) >= 10" 66 (6) <= 9)) S 2 cu girut de caractere, adesea ele trebule sl ‘a 1.2345, int-o valoare corespltr 2 tla ac Op Se ac, ngs nd ha fo ie psec sb 8 wat : geo aac Mas ae wae Sete ospsnare ci ae al Saad ‘conversia reprezent ep cae fs per cones ren rear onan ior dn bel 198 in virguld mobil tor te wrat 164 Toru pespre C/C++ 200 = Testarea unui CARACTER PENTRU er eses A STABILI DACA ESTE LITERA Jind programele dumneavoast’ lucreaz% cu sirui de caractere, va trebui uneor! si testa Sic Gn cr cone rt i label mia. Fete 9a borne dnenvoasel of deine dae n crater ee oer lb ro Entet che vi pane la cisporitie macroinstrugiunea ‘alpha. Macroinstruciunea exami- tnicd dela ala 2. Dacd este o liters alfabetuls, macroinsruciunea retumeazi o valoare ciferti de 0 TE) Gsaipha (Gdzdcter}i/ Pentru a infelege mai bine macroinstructiunea isalpha, studiat! urmitoarea implementa asin "Teaspia i Woappek (ep) S20 ANE Roapper (le) 2) 201 = Tesrarea unuicaracter pentauA sTasiL! E@R@Reed pacd ese o vaLoane ASCII 6 valowe ASH ete 0 valour cre apn ine de 0 8 127, Ans cn fate dnesvaatd hese co i eect, ot pe sn nce ve dln cho car ceo ate AH, Pen seni ler a oped vd pune ln dopeafe mactonsruchunes fast care examinesal Un caster ‘2kiteas Vlosen 0 dec ee un eaacer ASC sao value ft de 0 dack nu es Carater ASC, aja cn se vede tal os Pentnt a infelege mai bine macroinstrictiunea isasct, studiatl urmatoarea implementa: define Yaaseii (itz) ((unaigned) (Ltr) < 128) d Dupi cum puiett vedes, sauiviusuucyunea (easel! considert o valoare de Ja 0 Ia 127 ea valoace ASCIL 202 — Tesrancaunurcaracren renreva rons RGERSEEY DACA ESTE CARACTER DE CONTROL Un earactor de comirotesteovaloare dela Ala AZ sau de laa la Az. Aplictilefolosesec in mod diferit caracterele de control, De exemplu, mediul DOS foloseste caracteral CTRL+Z | pew. feprezenta sty nul Tg, Uncle procesote de ext wtleaehearactere de Snel penta reprezenta caractetle alin cin ch eu Caracer, pot paren sual incre ebule st detesmina dad un eracer ee exacted ‘control, Pentru aceasta, figierul antet ciypesh cr retumeazé 0 valosre diferith de 0 daca este un caracter de control sau valoarea 0 in cat § contrar, aga cum se vede mal jos: if (Gente (Caradten) 7 a | Cind programele dumneavoast’ Iucreazs _Yaloarea 0 daci nu ese mints idine sau italice, Atunci cand lucrayi cu sirusi de ine macroinstructiunes isentr, cae = i185 ESTAREA UNUICARACTER PENTRU A STABILI DACA ESTE O CIFRA O cif este o valoate ASCU de la 0 1a 9. Atunci cind luca cu scuri de caractere, pot apirea sitwayit in care trebuie i stabilifi dacd un caracter este o cif. Pentru aceasta, fiserul antet ebppe-b contine macroinstructunea isdigi, care examineazA caracterl eturneasi valoarea O dack nu este o cfr sau o valoaredifeiti de 0 pentru caracterele din intervalul de fa O19, 3a cum se vede mai js Heda leary) - : Pentru a injelege mai >ine macroinstructiunea isdigi, observati urmatoarea implementa: Sdefing ssdigit(e) {((e) (b='¥0 ee (ey a9) TESTAREA UNUI SARACTER PENTRU A STABILI DACA ESTE CARACTER GRAFIC Un caractor grafic este un caracter ce poate fi iparit (vezi isprind, cu exceptia caracterul spatiu (ASCII 32). atunct cAnd programele dumneavoast executa operat care produc faractere, pot apivea sia in care doris gutidact acestea pot fi parte sau nu, Fenter g sjuta programele dumneavoasir’ si efectueze acest test, filerul antet chped pune le ispozitie macroinstruciunea isgrap, care examineaz’ cafacterul gi retumeazd valoarea 0 daca respectivu caracter nu este grafic sau 0 valoare diferitl de 0 pentru catactetele gratice: raph (Litera) ) Fentr a fgeleye mal Line macroinstctiines grap, stud umtoaea implementare [setine Gsgeaph Glee). (ate)! >= 33) lee (ae Sa up cum puteti ved, un earacter grafic este orice catacter ASCII din intervalul de la 33, ku, TESTAREA UNUI CARACTER PENTRU A STABILI DACA ESTE MAJUSCULA SAU MINUSCULA u situ de caractere, pot aparea situai in care teebuie si stabil dacd un caracer este lterd mare sau lterd mica. Pentra a ajuta programele dumneavoasta si efecueze acest test, figerul antet chpe.b pune la dispoaite macroins ‘raciunile ilower si isupper, Aceste macroinstrucjuni examineaad caracterul 91 retunien (slower) sau majusculd supper, iat tn eazurile contrare ntore 0 valoare diferith de 0: EUR anaaemernon Bes lgepeticeraceaniy i Pentru a tnfelege mai bine macroinsirueqiunile sslower si iswpper, analizati urmatoarea © implementare: 166 Toru pesprs C/C++ iRURI AGT sank un carne setuneantovloare df de ack ee spa lb su valosrea Oi (Be Gespace eazdeesn)) © Se Pentra a fnjelege mai bine macroinstrucjiunea ispace, studiati urmitoarea implementare: 206: TesTAReA UNUICARACTER PENTRU A STABILI \ DACA POATE FI TIPARIT ‘awnci ednd programele dumneavoasiti produc fest sub form de caractere, pot apsiea ‘Mua in care webule oi tesa fecare carater pentru 2 vi asiqura cd poate upd Ue aaa bare poate fi tipirit este orice caracter din interval de la 32 (caracteral spa) le S37 (earecoral Deb, Peniru a ajuta programele dumneavoasta si testeze dach un caractey oats B upisit, fier antet che oferi macroinsruciunea isprint care rtumesz! @ Poa ipod de'0 pentra caracere ce pot fi tipirte sau valoarea O pentru caracterele cart pu pot fi parte p [istine sspace (c) (((€) == 32), Tey Sa TeSTAREA UNUI CAPACTER PENTRU A STABILI DACA ESTE O VALCARE HEXAZECIMALA | Otaloare bexazecimald es. o cifrt din intervalul de la 0149, 0 lier majusculd dela Ala Z suo litera minuseuli de laa la 2, Atunci cind programele dus soe 7 rogramele dumnesvoast lucreaza cu sinus de caractere, neori va uebui si determinati dai un caracter este 0 cifil hexazecimala, Tema : | oi ses, fr oncogenes cance gn entre tnjelege mat bine macroinsuctiunea sprint, study urmitoarea implementa es sceina’dapesne GR) (ae) saiservee (GR) a TDF ea secigit ccaracten) 2 Dupi cum putes vedea, macroinssuctiunen {print consider dreptcaracter ce poate B | yak 2 Dap Cm te ei 4G) rn steps mat ne macronscunes dg sd umstoncaiplemenae Ustinw ioxaigit (ey Genial (@)) 11 (ouppat (ids Stoupper((e))<55/21)) E upper ((c)) : 207 — TesTAREAUNUICARACTER PENTRUA STABILI GE DACA ESTE SEMN DE PUNCTUATIE ‘ In in, semnele de punctuate sunt vrgula, punctl sf vieguls, pune, semnul Ine 8 tee Sopa n Schimb, imbajel C consider semn de punctuate orice carat re Rae scr se alfanumeric, Cand programele dumneavoastrl hucreazi eu sro de acter pot apitea stuf in care tebe sb examina lac un caractr este un semn de Canc Penvu aceasta, lerl antet chpel pune la dispose macroinsruciunes aoe mndizcnst un careter returner? 0 valoare difenti de O aclu exe Sema | de punetvatie sav valoarea 0 in cat contra: 14 Convenrines unurcaracrer InmasuscucA RU SGSemLaLieha cna oe pede iene jspunct (Garacter) ) cee A tiisciids . void main(yoid). aie ey iRuRr 169 char “siz[] = *Totul despre c/c+} : int i for (4 = 0; saz lits a4) putchar (tolower (9ir(4]))7 putchar('\a!); . for (i= 07 sir(il7 ith) © putchar ( tolower (siz (i]))7 putchar ('\a") hot ) Atuncl cind compilad si executat acest program, pe ecranul dumneavoasti va ft afiyat primul sir de caractere corect, cu ltere mici (folosind ‘olower). Al doilea si de caractere va Confine insi caractere non-standard (simboluri, grafice i altele) pentru ci _tolowerincearci si converteasc’ in litere mici caractere care nu sunt litere maz. Lucaut cu canactere ASCII eres: [Atunci cdnd lucrai cx sinuri de caractere gi cu functi de preluerare a caracterelor, trebuie si ‘Aasigurati uneor clin caracter este un caracter ASCII valid, ceea ce inseamna ca valoarea este in intervalul de lh O la 127, Pentru a vi asigura cf un caracter este caracter ASCII valid, tej folosi macroinsinuctivnea foasci,care este definita in fisierul antetclype.h, ca mal jos: Winclude’ int toascii (int caracter) ; ‘ Pentru a injelege ma bine macroinsizuctlunea ‘oasct, studiai urmiatoarea implementare: jdefine Coaacii (caracter) ((caracter) 6 0x78); entry a fi mai performanti, mactoinstructiunea foascit executl operatia $1 pe biti, care fterge cel mai semirificatiy bit din octetol care reprezintd caracterul. Operatia $1 pe bits asigurd plasarea valailor in interval 0-127, ScRIEREA /ESIRI FORMATATE INTR-O VARIABILA DE TIP SIR DE CARACTERE Dupa cum gt, fungia pring vi permite S& formatatiieytea cite ecranul monitorulu. In funcjie de cerinjele programelor dumnesvoastri, pot apirea situa! n care tebuie si lucraji cu situs de caractere care contin o ieste formatatd. De exemplu, si presupunem ci angajai Gumneavoastel ati un numar de marci compus din cine ciffe sl un identificator de regiune din trei caractere (cam ar fi Sea pentru Seat). S4 presupunem ci pistrajiinformaile ‘despre flecare angajat intr-un fisie pe care il numiti cu o combinayie a celor doua valoni (cum, far fl SEAI2345). Furcqla sprinf vi permite sf formatay iesirea inirun sit de caractere FFormatul functiei sprintf este urmatorul Winclude int sprinté (char *sir,const char *format [,argumente. J 470_ Toru pesere C/C++ Sueure_171 rumic mare de caractere, $4 spunem ci programul congine o baza de date cy contusle dlenjlor dumneavossiri pe orage gi sate. {a funcje de modul in cate este conceput programul, pute! ajunge la un volum mare de teste, aga cum se vede tna jos Unmitorul program, sprinif.c, utlizeazd functia spriny/pentru a crea numele de fisier al unui | angaja: z q eats)” Af (atreql(oras, "New York")) (11 nstzuctiune ; i [else S£ (streql (ores, “chicago")) : U/ tnstructiune.. # fn cadnulfieciru fragment de program care executl in mod repetat teste else if se consumil lun spajiu considerabil pentma stocarea constantelor de tp sir de caractere $1 mult timp pentnt compararea giruilr. In toc si utlizim apelurl repetate la sirur, putem crea o functle denumitd sokenize_siring cave si returneze un simbel unic pent flecare sir de earactere. fn cadrl functiei din exemplul precedent, restarea din program va arita ast! [lint “sinBoiozas? printé("Fisierul angajatuiui: s\n", numefis) ; 6 7 re one i fee : 214 Circa ivrpdnn owre-un sin oe canacrent FO ‘Asa cum aff invatt,functia scanyvl permite si citi o Inrare furnizata de stdin. In fancqie de | programele dumneavoastri, uneori se va intimpla ca un gir de caractere i conjind clmpur pe care doriti si le atribuiji anumitor variable. Functia sscanf permite programelor lumneavoastra si citeascé valori dintrun gir de caractere si le atvibuie vasiabileler specificate, Formatul functielsscanyeste urmitorul: Haetude Geass I 9 (ae Ane sacant const char *air, const char *format [, azgunente]); | [ sisbod: oras = tokenize_stzing (ores) 1 : (Ee ounces alsin seattle) ee // tnatractiune 10 1 (ainbol_ ores Fo // anstructivne [else Lf ((ainbol o: E17 rostzuctia ‘inbol_ NewYork) 18 == simbo}_Chicago} i Uilzind simbolurile in modul descris mai sus, vei putea elimina spajul consumat de constantele de tip sirde caracere, De asemenea, eliminarea comparalei dinte sii va duce Wimbundtizea performanjelor programulul dumneavoasta. Argumentele pe care programul dumneavoastel le wansmite funcjici sscanftrebuie si fie pointer la variabile de tip adresd. Daci sscanf auibuie cAmpurile cu succes, returneazi ‘numaral de cimpurl aibulte, Daca sscanfnu atribuie cimpusi,atuncl returneaza 0 sau EOP in cazul in care intdineste un terminator de sir. Urmitorul program, sscanfe, ihistreazi utlizarea Functlel sscanf finclude void main(void) ‘ : INIALIZAREA UNUI SiR DE CARACTERE facapitolul ,Matrice, pointer: gi structuri", veti afla cum si. atribuiti valori unei matrice in timp: teenie decratt de program Llmbsjl Groped inl de caratre sl fsa scot, {ati} de octey. Aun! cn dears! uns, ve spect, in genera valone iia a sal js: Weber UAeit] = aot daapte C/edee char sectiune[64} = Siruri"; Gompilatorul de C va attibsi un tablou suficlent de mare pentru stocarea caracterelor ‘peciicate in deeptul sirului re (precum gia caracterulul NUL). Pentni 8 siral Total despre C/C++ congine 35 de earactere, girl tit poate psira 35 de caractere ce pot htiparte pus caracterul NULL Dac’, mai riraiu, vet auibui mai mult de 32 de caractere sirulu, veqi ‘uprasatie 0 zond de memore care siccheazi valoarea altei valablle, Pent gira secttune, ‘empilatorul va aloca un spajiu capabil si stocheze 64 de caractere, Compilatorul va atribui imllor 8 octet ai snuluiitetele cuvintului fran celui de al novles, caractersl NULL De ‘hice, cella 55 de octeti vor fi iniializayi cu caracterul NULL. 215 — Simeouzarea sinuriton DE CARACTERE PENTRU A ECONOMISI SPATIU Simboltzarea sirusilor de caractere este procesul de uilizare a unel valori unice pentu a eprezenia un gir. De exemplu, s& presupunem ci aveji un program care lucreazi cu un Fovcyn_173 172_Torut pespre C/C++ Pence _173, 217 = Prezenranea FuNcTiLOR Cele mat multe dine programele prezentate pink acum in aceasl carte au tliat aval funcjia main, Pe masurd ce programele dumneavoast vor devent mal mai $i mai complexe, veii putea si vi simplificayi munca si st imbundtiqi clartatea acestors pin fragmentacea lor in pir mai mic, numite funcfit De exemplu, i presupunem ci aj reat un program de contabitate.Putei st aveto funcie cate sh electueze operatile din eps, alld functe penia debite, o a ucla funcye pent eredite si o a patra pentry generac balan de plat, Dact afi plasa toate insirucunile In cadrul functiel main, program at deveni foare lung gi grew de ineles, Pe misuri ce dimensiunea programeler si complex tata lor reste, cregte st posibiltatea apart! eronllot. Dac fragmenta programul in pi mai mii, mai ugor de manevrat, pute} evia ero. O funcieesteo colete de instr ‘are executi o anumitl satcind. De exemplu, unndtearea functe, salut planeta, flosege (Print€("Incepe apelarea functiei\n") “salut_planeta() ; feo | printE('S-a terinat apelarea functie: ‘Anunei cand compilati si executajl programul utifianc.c, pe ecranul dumneavoasted vor f stgate urmatoarele UTiLIZAREA VARIABILELOR IN CADRUL FUNCTILOR Fe misurd ce veti crea diferite functi, ve observa cd multe necesté variable pentra a gener rezultatele drite. Cd folio varabil in cadral une! Fanci al inti edule $8.0 clara, Ia fel ca in czzul functii main. De exemplu, umitorul program, iets. ‘geleazd funciiatot_salturt, cate foloseste variabila contorin bucla for penir a aga un amiaereuaaeeers eee aoe eee eient alee viaat one toe er ine mae ees eames Secria eeepc aoa ate ae Sera ana eecaeee ee oeeea Seen one eae Sects mys cand epee eta de exemplu, informatile plasate inire paranteze sunt parametri. Cand o functie nu folosege Scat namie ney Cy ses cram sae ears nome oa taped ls napa ea os eaocan os ces es et ort satise saraes tae nee pwc ee a aie see Seas haves Wineluas star gba sre ET ae os ee mere ones Cind declarati variable in cadral funcyilor, nummele pe care le daji acestora se Folosesc ‘uclusiv in eadrul functic, De aceea, chiar daci programul dumneavoasird utilizeaza 10 ‘une dlferite gi ficcare folosesteo variabili numa contor, compilatorul de C va considera | ferta variabila ecirei uncqi. Dac functia dumaneavoastra necesiti mai multe vatiabile, sebuie si le declarayi la inceputul functii, la fel ea in cadral functiet main. CCAnd rulayi acest program, intdi se executi functia main. Dupi cum puteti vedea, unica Insisucfiune din main este apelul funcjiel denumite salut planera. Clad compllator Intdlnexte apelul de funcie, el wansferd imediat executia programului citre functie se Tncepe cu prima instructiune a acesteia, Dupi terminarea ukimei instrucjiuni din furcye, compllatorul de C transfert execuyia cltre instuclunea care urmeazi imediat dupa apeil funcfei. Pentru a injelege mal bine acest proces, si modificim functia mate din cadrul programului wifienc., ca mai jos Funopia man Ces a creat! un program in C, numele de functie main determina prima instructiune pe care 0 va executa programul, De fapt, main este o functi, astfel incat daca ave intrebiti Inlegituri cu ipurite le ozerati pe care le putes efeccua in cadrul functillor dumneavoasta, 474 Toru Despre C/C++ Punch _175 Jn acest ca, functia nr safutur accept un parametra de tip int, numitnr_mesaje. Cand o ale funcie, cum ar fi main, veea si foloseased nr_salutun,trebuie si specifce valoarea autbuité parametrul ar-mesaje veces one pug js an psc cop es rl en sil Oe i es donno | ‘asemenea, si folositi structurl cum ar fi if, while $i for. In sfargit, 0 ee cm oe see oe ee a toe | cee A donne oe pineal ata iia eae asete vote) Snglsaduturi (yy) | // aELgeaza Ieaddui Ge dou’ oxi 1 nr_saluturi (100) ; (f Bisaaza megajul de 9 eura de ort 2// atieeaza mesajul o data | Unndtorul program, uzparam ¢,lustrea2’ modu in care pute utliza 0 functie cu parametri 8 Printe("Salst, planeta!\n"); 9+ se a 3 void nr_saluturi (int nr_mesaje) tr : Ant, contor; Jed jf eantor <= 37 contort) ne se for (contor = 1; conter <= nz_pesaje; 0 salut planeta : nr_saluturi(2); 2 aa printg("Afiseaza mesajul de cinci ori \n’ ar_saluturi(5); Seca 220 = PrezeNTAaREA PARAMETRILOR ol parame este o valoare wansmish une fig. Cle msl male de propane oo ae oid carte tu uanom parame ce anc prin cms Dupi cum vedeti, in miain, apelul functie ne_saluturtinclude valoacea pe care compilatorut _ de C tebuie si o atribuie parametrulul nr_mesaj, jee! $a\n") Fezultat)? a Observatie: Cand transmiet! un parametrs senet functi, tpt! valons pe care o atribuai aresiuia (cum ar fitmt float, char f aga mai departs) trobuto st comnckdal eu tips. fs funcje de compilatorul de C cu care lucrat, acesta poate sd detecteze nepotriirile cu tiptal [ parametrulu. Dace nw sunt devectate aceste nepotrivin, pot apdirea erort care adesea sunt “ifictl de gsi si ce covectat, : ‘mbundeipy elitatea transmitande | UriLizaREA PARAMETRILOR MULTIPLI ‘Asa cum ati invatat, un parametru este o valoare pe care o transmitei funciei In general, pulei transmite un nunar nelimitat de parameui cite o functie, Tow), cercetaile arata cl funtia este mai dificil de tnjeles g de utlizat coreet atunci cand numirul de parameti ese ‘mai mare de gapte si de aces, creste probabilitatea apatite! erorilor. Cand fungile ‘@umneavoasird utlizeaci mai mull parameti rebule s specifica tipul gi numele flecdruia, _ §.s8 11 separat prin vizguld, ca mai jos Waive planeta()i ‘ es smnatul acd umniirul care arati de 5 cep ack a pete pkg anger eng al ko i an panacea fnumele parametrulu gi pul si, ca mat jos: (eka nz laaiutadl int ne esas) 176_Torut pespre C/C++ Foncyt_177 mai multe modificit programelor dumneavoasw, creste posibilitatea de a introduce 0 ceroare, Ca reguld genes, nu wd legati la cap dacd nu vii doare! | [/ rnatructiunile ey Meee IES ‘une cdnd programl dumneavoastl apeleaz func, webu si special valoarea Feira paramets, ca mal os ReTuRNAREA UNE! VALOR! DE LA O FUNCTIE Pe misuri ce programele dumneavoastel vor deveni mai complexe, ele vor efectua de | obice: cacule gl vor resuma un rezulta entry a furniza un rezultat apelantulu, funcyia trebuie s8 contin instruciunes return, ca mai jos: eee eee sarseseagnesers SERRA ENC HO Zag ‘Tipul functiei depinde de tipul valor returmate Cint, float, charsi aga mai departe). Dac 0 funcjie retumeaza valor de up int, de exemplu, webuie si plasayi oumele tipulut in faja ca mal jos: e baza acestor specifica, compilatonul de C va atibul valorile parameteilor, cum se aratiin figura 221, (fat Valoare) | Void o_functio {int varsta, float salariy, int nr_mareal «une (9, 40000.00, 594); : é ‘Unnitoarea functie, i_aub, returneaz’ cubul unei valor intregi, introduse ca parametru. De tempi, deh fea vansmite valores 3 unc apelte, tub va retro valonrea 35 | sack 125 BRE cab int Vetoes) { instruction functiet , Figura 221 Schema de atribuire a valorilor parametrilor. 222 — Deciararite PARAMETRILOR IN PROGRAMELE in C MAI VECH! ‘Atunci cind cresji fancy care folosese parametsi, de obicei specticai tipurile si mumele parametrilor, separate prin virgule, in antetul functiel, ca mai jos return (valoare * valoare * Dupa cum puteti veder, functiafoloseste instrucyiunea return pentra a retuina rezultatol calculi eitre apelant Puncya apelanta poate atnbul rezultatul functiet pe care o apeleaza Gcunoscut sub numele Je waloare de revenira) unei varabile sau codul poate si foloseasct F valoarea returnata in cedrul unei a tela funcyl, cum ar ft printf, aga cum se vede mai jos: HoT NS | peinte(rcubul dai 8 este ta\n", 4 e0b(5))7 ee Unmitorul program, cub. ullizeard funcjia Lcubpentrua determina cuburile mal multor vari Piineiae a doua) Fezultat = 1; else if (prima < a dova) rezultat = 2; return (rezultat) ; d fn acest caz, functia find att de sie nel singure instryiun! return, Dar, ip, va fl grew si intelegeti avantajul oferit de wilizarea Pe misura ce funcjlle dumneavoastel vor devent complexe, acest avants) va deveni din ce in ce mai evident. Trebuie totus si reine e | scot; codul pe care il ereati este mai lizibil dac folosti mai multe instruc! reson Teebule s& scriei un cod it mai lizibil si mai usor de modifiat; dack este nevoie de met tule insructiuni retars pentru atingerea acestui object, folosii atitea cate sunt necesace 224 —_Instrucyiunea RETURN x functetrebule ‘ga cum afl fovSjat, pensu a seruma vn realist funcielapelatc, o funete eb (Sbscer nnsuctine return Chnd eomplatonl de € tnlpey laren. ren immo funeye tochele imciat exec Funct tFeturneazd valozes rexpecwt func Spelate, Programul au mal execud eventual Inssuion! cate umes insu tower cada fut rela exerupia in func apelan ’ Duck sud alle programe in C, putt sf nln func care contin mal mule Inatucyun! return, Hesze en ele return o valare in annie condi, De exemple ‘bservim fungia compa prezeniatt mal jos: tht Gop “vad (nt “pets “ink n Prororipurive 0€ FUNCT Duck observa ateje ecare dnte programele precedente, vet veden ct fete 2peaneaparinttdenuna in rma fini pe tare oapeca in col wind a Dee Cele mai mule dine ile compiatare de € cerca tpl parameter fal slot eae Sie conoscte insite ca program sh specne hun. Paving fine a eens _ ceva in cad codhll programuls, permite) compllatondis ok onine kore » dows) < Af (prima == a_doua) feeesare inainte de ainllni apelul de funcile, Pe mur ce progtamele dumneavonsrd vor Fe rer peees ‘ even! mal complexe, uneor va flimposibil si plasa inet in ordinea corectt De sees, else if (prima > a_doua) Jinbajul C vi permite s& plasai tn programul dumneavoastel provoripurt de fancy care concerns r ‘ ecizesritipul paramerilor 4 al valor returoate. De exemplu, st analizim un reegram salegiocims cts docs) ‘ (are ulizeszi funcile (cubs! f cub, prezentate in ectunea 225 nainte de pine woke |Muncilor, poate inchs in program un prottp sina co unmitord, Be ASME (URED 7°77 atiieneaza in int-Zun pazdnatzy Lad sldat # cub(float);. // neturneaza’ un float--un paranetiw float ‘eturn(2); Functia comp.cal examinaezi dous valod intregi gi erurmeaza una dintre valorile prezentte intabelul 224 1 Pips cum pute vedee, prototipul funciel species tipul parametior 1 al valoior —Rezultst__Semmlfcnge_______" a rrumate. timitoral program, uliprot.<, utlizeazi dovd protoupunt de functl pene e ° Valo suns scceay TAB lina necesiaten oedenan functor 1 Prima valsre exe mal mate deca dou. Hheliide’ {Jeunes ('a contine 44.b contine dc contine Ad\n", 4, by [> rexuitati= a +b; return (rezultat) ; 231 © Unuizarea stivel 0& CATRE FUNCT Siva, o zonl pe care programele o ulizeazi penta pista temporar informati deal fexte prevenati in capitolul .Memoria", Pineipala destinale a unel sive este ape 184 Torut Despre C/C++ Funcp_185 tong ine iF float reruitat = 0 | fine t start time, atop tine: ( pEints (iucreaza. -.\n") | tie (estart_ tine) for Wm 1j4 < 1000001; S44) j Peruleae = 4) time (setop_time) : printé("Utilizare bucla #4 secunde\n", stop_time - ‘start time); printé("tucreaza.. -\n' eime(sstart tine) ; for (i = 1771 <= 100000; i++) rezultat = aduna(i, rezultat); ‘eime (¢stop time) ; print£("Utilizare functie 4d secunde\n", stop_time - start_time) ; ) fn cele mat multe sisteme, calculele bazate pe foncti pot consuma de dou oni mai mult timp pentru procesare, De aceea, cind folosji functi in cadrul programelor dumneavoast, trebuie 8 lua in considerare benefice pe care le aduce functa (cum ar fi ugurinya vila, reutlizarea unei funcil existente, ceducerea necesitiii de testare, usurinjainfelegeri i asa ‘mai departe) fat de zeducerea performantelor datorti suprasarcinilintcoduse. 233 — AupLAsancA VARIABILELOR LOCALE Asa cum afi fnvéjat, limbajul C vi permite st declaraji variabile in cadul fans dumneavoastr, Aceste variable sunt locale pentru funcyia respectiva, ceea ce inseaman’ ck rumai functia in cadral cireia aji declarat variabilele recunoaste valotile st existenta lor, Urmitoarea functie, uit_abe, daclaré tri vasiabile locale, mumite a, hl void! ubiiabe (vola) (ee int a, by G7 Ree é (beati: | : ; moieties : Print£("a contine $d b contine #4 ¢ contine td\n", a, by c)/) ) De fiecare dati cnd programul apeleazi funcyia, se aloca spaju in stiva pentru a depune vatiabilele locale a, bi ¢, Cand executiafunctiei se inchele, se elimina valorile varlabileior locale si se anuleazi alocarea spatiulul in stv. Chiar dact funcyia declari multe variable locale, valoarea fiecireia este stocati tn tiv. DECLARAREA VAPIABILELOR GLOBALE In sectiunea 218, at invéjat ci variabilele locale sunt varlabile definite in cadrul unei functi, rumele si existenya lo find recunoscute aumai in acea functie. Pe lang variabilele locale, linbajul C permite programelor dumneavoastr’ si foloseascd variabile globale, ale clror ume, valoti si existergi sunt recunoscute in Inteegul program. Cu alte cuvinie, toate progrimele dumneavoast’ in C pot folostvariabile globale, Urmitona program, global.c, lustreazi folosizea a we. variabile globale, numite a, bi c P¥ibcldde' [int’a #1, b= 2, 6 =3; // Variabile globale “yoid val_global (void) bet Print€("a contine 44 b contine td ¢ contine 4d\ ) | yoid main (void) arb, eds val_global(); Printe("a contine td b contine td ¢ contine $d\n") a, b, c)7 Ee Atunei cand compilati si executati acest program, ambele func, val global st me alisa pe ecran valotilevariabilelor globale, Observati ci afi declarat variabille i funcjifor. Cand declarai variabile globale in acest mod, toate funcyile programului pot folosi si modifica valorle unei variabile globale prin simpla referie la numele siv. Dest vatiabilele globale par convenabile la prima vedere, utlizarea lor necorespunzitoare poate conduce la ero foarte dificil de depanat, asa cum vel invaja In secfiunes 235. EVITaREA UTILIZARII VARIABILELOR GLOBALE In secjiumea 234, aj invijat si declarati variable plobale, pe care programul le recuncaste in toate fancile sale. La o prima privie, folosirea varabileir globale pare a simplifica progra- hiatea, deoarece elimins necestiates felons parasneuilos ia Fanci, mal important, neces tutea inelegerit apelul prin valoare sa apeltlut prin referinfa. Din picate, in loc si reduc rumarul de eros, vartbilele globale adesea il sporesc. Deoarece codul dumneavoastri poate modifica valoaces unel vatibile globale in cricare loc din program, este foarte dificil, pent alt programator care cteste programul si giseasci fiecare loc din program in care Yaiabila globala se modified. De aceea, ali programaton ar putea si modifice programul ‘Guinneavoasta fird si injeleagi pe deplin efecul pe cate modiicarea il are asupra variabllei obale, Ca regula, fangile trebule si modifice doar acele variable care le sunt transmise ca parametr. In acest fel, programatoril pot si studieze prototipurle funciilor pentru a fetermina rapid care veriabilé este modiieatd de o Funct. Daci programul dumreavoaste4 foloseyte variabile globale, ar fi bine si reconsiderat ‘conceptia programului. Scopul dumneavoastri webule si fle eliminarea (sau cel pujia ‘minieizarea) folosiril variabilelor global

You might also like