You are on page 1of 256
Herbert Schildt “Traducere de Bogdan Pisai ! Teora itll original: C#: A Beginner's Guide ‘* Copyright © 2002 Teora ‘Toate drepturle asupra versiunil in mba romana apartin Ecituri Teora. Reproducorea integrala sau pariala a toxtului sau a ilustratilor din aceasta carte este posibilé numai cu acordul prealabil scris al Edituri Teora. Original edition copyright © 2001 by The McGraw-Hill Companies. All rights reserved. Romanian edition copyright © 2002 by Teora. All rights reserved, Teora Calea Mogilor nr. 211, sector 2, Bucuresti fax: 01/210.28.28 e-mail: teora@teora.kappa.1o ‘Teora ~ Cartea prin posta CP 79-80, cod 72450 Bucuresti, Romania tel: 01/252.14.31 ‘ e-mail: cpp@teora kappa.ro- Coperta: Gheorghe Popescu Techno Media Pregedinte: Teodor Raducanui NOT 5087 CAL C# ISBN 973-20-0083-X Printed in Romania |: Diana Rotaru oa Cuprins Despre autor VI Prefati vil 1 Fundamentele limbajului C#.....0 0000 ccsceeeecseeeeeeeesseteeeeeed 2 Prezentaces tipusilor de date si operatorilor «........ + 39 3. Insteuegiuni de control . 4 Prezentarea claselos, obiectelor si metodelor..- 5 Mai multe despre tipusile de date si operatori .. 6 O privire rai detaliatd asupra metodelor si claselor . -190 7 Supraincdrcarea operatorilor, indexisi si proprietifi ............ 235 8 ‘Mostenires. 6.6 .60e0ee .271 9 Incegfoge seructari gi enumeritl ..6..cceeeeeeeseeeeeeeeeeeeeees SIT 10 Tratarea exceptiilor. . : 11 Opcragi de intiare-iesire 12 Delegiti, evenimente, spayii de nume si subiecte avansate 410 A. Rispunsurle testelor de verificare a cunostingelor. 458 Index Despre autor Herbert Schilde este primul autor in domeniul programirii pe plan mondial. Este o autoritate in limbajele C, C++, Java gi C# gi un programator Windows expe- rimentat. Luceisile sale in domeniul programisii s-au vindut in peste 3 milioane de exemplare in toati lumea, fiind traduse in toate limbile de circulagc internasionala. Este autorul a numeroase hucsiti de succes, printre care ,C— Manual complet’, C+ ~ ‘Manual complet (aparute la Editura Teora), Java 2~ Maral complet’, Java 2~ Mannalal incepdtoruli", ,Programarea in Windows 2000 de la findamente la nop ‘evancate", Schildt a obsinut titul de Master in Calculatoare la Universitatea Illinois, Prefata fn ultimii ani, programarea a suferit 0 schimbare de paradigm’ de la un peisa} Gominat de sisteme izolate la un medi on-line, in care sistemele sunt conectate in sefea. in epoca ia care pentru foarte mulfi,tefeaua este calculatorul" limbajele de programate, istemele de operate si instrumentele de deavoltare s-au striduit si tin pasul, Limbajal C#a fost invéntat ca ispuns la necesitatea unui limbaj de progra- mare modern, cate si corespund ceringelor lumii interconectate. Cif reprezintt pasul urmitor in evolugia limbajelor de programare. Limbajul a preluat rezultatele cele mai bune din trecut, incorporind totodati si ultimele escoperiei din proiectarea limbajelor de programare modeme, De exemplu, C# a fmpramutat faclitii ate din Java, eit si din C++ ~ dowd din cele mai importante limbaje pe plan mondial. in acelasi timp, C# a venit cu inovati prope, cum ar fi delegicile si indexicile. Datosité faptalui ct C# utlizeazt ashitectura NET, codul rezultat este extrem de portabil si permite programarea in limbaj mixt. De exemplu, ‘componentele software create utilizand C# sunt compatible cu codul creat in alte limbaje de programare, ait timp cit acesta este destinat tot arhitectusii NET. ‘Scopul acestei criri este de a vi inviga nofiunile fundamentale ale programas in C#, Lucrarea utlizeaaii o abordare pas cu pas, completati cu numeroase exemple, teste propuse si proiecte. Parcurgerea nu cere o experiengi anterioarl in domeniul progeaménii. Lucrarea incepe eu chestiuni fundamentale, ca de exemplu compilarea si ralaea programelor C#. Sunt apoi discutate cuvintele cheie,facilitiile si construcgile care alcieuiesc limbajul C#. La sfarsital lctati, veg stipani bine fundamentele programicii in CH. Este important si”mentionim de la inceput gi aceasti carte este doar un punct de pomire. Progtamarea in C# inseamna mai mult decit cuvintele cheie si sintaxa care defineste limbajul. Aceasta implict uilizarea unui set sofisticat de biblioteci denumit , biblioteca de clase a athitecturii NET“ (NET Framework Class Library in original), Biblioteca de clase a athitecturii NET este foarte voluminoasé si discu- tarea acesteia ar necesita 0 lucrare separati. Chiat dact unele din clasele definite in aceasti bibliotecd sunt prezentate in-lucrarea de fat, din cauza spayiului resteins cele mai multe nu sunt. Pentru a deveni un programator de elitt in C#, trebuie si stipinigi foarte bine si aceast& bibliotec. Dup& parcurgerea acestei cgi, vei dobindi insi cunostingele necesare aborditi oricinui alt aspect legat de C#. ‘Un ultim punet de vedere: C# este un limbaj nou, Ca gi toate celelalte limbaje de progtamate noi, CH va trece prints-o perioada de dezvoltare si modificare. Va fi necesar si urmiit. aparitia unor noi facilitii si tehnici. De asemenea, nu teebuie si {igi surprinsi dacd anumite aspecte se modificl tn timp. Istoria limbajului C# este abia la inceput. vim | cit Organizarea lucrarii Aceasti lucrare reprezined un ghid struturat in secyiuni de lungimi sensibil egale, ficcare secfiune fiind bazati pe cele anterioare. Lucrarea contine 12 module, fiecare dintre acestea prezentiind cite un aspect al limbajului C#. Aceasta este o lucrate unicl, deoarece confine citeva elemente speciale care Vi ajuti si consolidayiccea ce af inv Scopuri Fiecare modul incepe cu un set de scopuri, care vi prezintl ceea ce veti invlga, Verificarea cunostintelor Ficcare modul se incheie cu un test individual care vi permite si vi verificagi cunostinjele insugite. Rispunsurile testelor se giisesc intr-o anexi a lucriii, Exercitii la minut La sfargital fecitei secyiuni majore sunt prezentate exerciti scurte care verifick ingelegerea nosiunilor esenfiale din cadeul secfiunii. Raspunsurile acestor intrebari se sisesc In partea de jos a paginii Sfatul expertul Casetele cu ,sfatul expertului* se gisese imprlstiate pe tot parcursul lucrici Acestea contin informatii suplimentare sau comentasii interesante despre anumite subiecte, Modalitatea de prezentare este sub form’ de intrebare-rispuns, Proiecte Fiecafe modul confine unl sau mai multe proiecte care vi arati cum putegi aplica ccea ce invigagi. Acestea sunt exemple reale, pe care le putegi utiliza ca puncte de pornire pentra propriile dumneavoastea programe. Nu se cere experienta anterioara in programare Aceasti lucrare nu presupune ci aveti o experiengi anterioari in dom: gramicii in consecinsf, pute utiliza cartea chiar dact nu afi programat Desigur ef, dup cum stau lucrarile in momentul de fax, majositaea ctitorllor au cel Profays | IK Bj ww winimam deepen progamare Pen meena, seat pe Hengl anterioara este in C++ sau in Java. Dupi cum veg invita, C# este invudit eu mbele limbaje. Prin urmace, dact stig deja C++ sau Java, veti putea inviga C# cu vsuring Software necesar Pentru compilatea si rularea programelor din aceasti catte, aveti nevoie de Visual Seadio. NET 7 (cau o versiune mai recenti) si arhitectura NET trebuie s& fie jnstalatd pe calculatoral dumneavoastri. Programele din aceasti carte au fost testate utilizind versiunea Visual Studio.NET 7.0, Beta 2. Nu uitati: codul este disponibil pe Web Codul sursi pertru toate exemplele si proiectele din aceasta carte este disponibil gratuit pe Web la adresa www.osborne.com. Lucrari recomandate pentru aprofundare _Ci#""este poarta dumneavoastri de intrare cite seria de lucriri de programare realizhti de Herb Schilde. lati alte etteva luctti care vi pot fi utile. Pentru a invita mai mult despre C#/"incercagi: CH = Menual comple Pentre a invigalimbajul C++, aceste lucrisi vi vor fi in mod deosebit de ajutor: C++ — Méiual complet" (apioati la Edigura Teors) NOt — Manual inepatorah® nap angi CH" MC dle finde Le fi anne $yProgramacta STIL dela fundamente la najuniavansate" ‘Programarea C/C++ ~ arhiveadnotate™ Pentru invijarea programe in Jiva, vf recomandim unmitoarle wava 2~ Manualiltnrpatoruti wana 2~ Manuel complet” sata 2— Manualilpregramatoruai" Pentnt a invija programarea sub medial Windows, propunem urmitoarele luce ale lui Hesbert Schild: wProgramarea Windows 98 dela fundarmente la nofiun avansate® ‘ePragramarca Windows 2000 dele fundamente la npian evans vill | cat Organizarea lucrar Aceasti lucrare reprezint& un ghid struturat in secgiui de lungimi sensibil egale, ficcare secyiune fiind bazati pe cele anterioare. Lucrarea contine 12 module, fiecare dintre acestea prezentind cite un aspect al limbajului CH. Accasta este o lucrare unicd, courece confine céteva elemente speciale care vi auth si consolidei ceca ce afi inva Scopuri Fiecare modal cep us sop cc presin exec ve tg | Verificarea cunostintelor Fiecare modul se incheie cu un test individual care vi permite si vi verificag | cunostingele insugite. Raspunsurle testelor se gisesc tntt-o anext a lucrat Exercitii la minut La sfargieul flectrei sectiuni majore sunt prezentate exerciti scurte care verifick ingelegerea noyiunilor esengiale din cadral secyiunii, RAspunsurile acestor intrebiri se giisesc in partea de jos a pagini Sfatul expertului Casctele cu ,,sfatul expercului* se gisesc impriigtiate pe tot parcursul lucriti, Acestea consin informati suplimentare sau comentatii interesante despre anumite subiecte. Modalitatea de prezentare este sub forma de intrebare-rispuns. Proiecte Fiecate modul congine unul sau mai multe proiecte care vi araté cum putegi aplica ceea ce iaviyagi. Acestea sunt exemple reale, pe caze le pute utiliza ca puncte de porte pentru proprille dumneavoastel programe. Nu se cere experienta anterioara in programare Aceasti lucrare nu presupune ci aveji o experiengé anterioari in domeniul pro- gramitii. In consecingi, puteyi utiliza cattea chiar dack nu afi progeamat niciodat3. Desigur cf, dup cum stau lucrurle tn momentul de fat, majoritatea cittorior au cel Preys | 1X 1» minimarn de experiengi in programere, Pentru majortatea, aceasti expe- i : a, acea Bengt anterioard sste in C++ sau in Java, Dap’ cum ver! iavia, C# este ineudi cu sates lembae Pin urmae, dal yt dja C+ aa Java, vey pura tna CH cu uguring, Software necesar a wvefi nevoie de Visual Pentru compiarea si ulatea programelor din aceasth carte, aveti nevoi Studio.NET 7 (stu o versiune mai recenti) si arhitectura NET trebuic si fie instalatf pe calculatorul dumneavoastel. Programele din aceasti carte au fost testate utiizind versiunea Visual Studio NET 7.0, Beta 2 Nu uitati: codul este disponibil pe Web Codul sursi pentna toate exemplele si proiectele din aceasti carte este disponibil gratuit pe Web ls adresa www.osborne.com. Lucrari recomandate pentru aprofundare Gi" este porta dumneavoastei de intrare citte seria de lueriti de programare realidata de Herb Schilde. Iati alte céteva lucrisi care vi pot fi utile. Pentru a invija mai mult despre C#, incercagi CH ~ Manual complet . Pentru a iavizalimbajul C++, aceste lucrti vi vor fia mod deosebit de ajutor: C++ — Matiwal complet" (apirati la Editara Teora) C+ Manabe incepatoraht neta singuri CH NC el findanent fa nope avanat ‘wPrograrearea STL. de la fundament la nofani avansate svProgrararea C] C++ = arbive adnate Pentru invitatea programirii in Java, vi recomandim urmitoarele: Java 2~ Manual inepatoralei" Java 2— Manual complet Java 2— Manualul programatorui® entra a faviga programarea sub mediul Windows, propunem urmitoarcle lucriri ale lui Herbert Schild »Progranarea Windows 98 de la fondamente la nopiuni avansate* Prnoramiten Windame 2000 de I Fancamente In notin arent cH s»Programarea MFC dela fundamente le nopiun avansate® »Programarea Windows ~ arbive advotate Dacit doriti si va insusig limbajul C, eare constitue baza intcegii programéri moderne, urmatoarele luctisi vi vor fi de ajutor: »C~ Manual complet (apasuth la Edivura Teors) snbnnafaf singer C* Modulul 1 Fundamentele limbajului C# Scopurile acestui modul * Intelegerea evolutie! limbajului C# © Cunoasterea modulul in care C# utilizeazi arhitectura .NET « fnvatarea celor trei principii ale programarii orientate spre oblecte © Crearea, compilarea i executia programelor C# © Utilizarea variabilelor © Lucrul cu instructiuni if si for * Utilizarea blocurilor de cod * Cunoasterea cuvintelor chele din C# (Ciutarea unui limbaj de programare perfect dateazi de la inceputurile afirmat programirii ca disciplin’. In aceast% clutare, C# a devenit purtitorul actual al stin- dardlui, Creat de firma Microsoft ca un instrument de dezvoltare pentru athitec- tura NET, C# combin’ facilitgi testate de-a lungul timpului cu inovagii de ultim moment. Limbajul oferii o modalitate facili si eficienti de a scrie programe pentru mediul profesional modern de dezvoltare, care cuprinde sistemul Windows, Inter- netul, componentele software etc. Pe parcursul dezvoltiti sale, C## a redefinit peisa- jul in programare, In cursul luerici, veti invita sk programati utilizind acest limba) Scgpul acestui modul este de a prezenta limbajul C#, incluzind forte care wa condus a crearea acestui, flozpfia proiectisi sale si eSteva dintee cele mai impor- tante facilisi pe care le ofert. whe depute, cea mai dif problem legat de invi- fatea unui limbaj de programare 0 constituie faptul cf nici un element nu este izolat. ‘Componentele unui limbaj de programare lucreaz’ impreuni. Aceasti relagionare face dificlé prezentarea unui aspect‘al limbajului C# firk a implica altele. Pentra a depisi aceast’ problema, acest modul oferé 0 descriere scurti a cétorva faciitii oferite de Cif, pentre care forma general 2 unui program C#, céteva instructiuni de control esentizle si operatorii limbajului. Modulul nu intra in foarte multe detalii, concentrindu-se mai degraba asupra conceptelor generale comune tuturor progeamelor C#. 2 | c# Arborele genealogic al limbajului C# Limbajele de programare nu exist inte-un spay vid. Dimpoteiva, ele se inrudese uncle cu altele, fiecare limbaj nou apirut find inflenjat intr-un fel sau alral de cele | cxistente pink atunc. Inte-un proces similar cu polenizareaincrucisati, facility exis- | tente inte-un limbaj sunt adaptate ints-un all, inovafile sunt integrate in contexte cexistente, sau construe mai vechi sunt eliminate. In acest mod, limbajcle evolueaz, | ine stings programarli se deavolel. Nici C# nu face exceptie de la accasté regula C# este mostenitorul une! averi bogate in domeniul programas, Limbajl deriva direct din dout dintre ecle mai de succes limbaje de programare pe plan mondial,C | siC++. De asemenea, C# este o rudé apropiati a unui at imbaj de succes: Java, « Ingelegerea natucii acestor relai este de mare importangs pentru ingelegerea limba. | jului C#. Din acest motiv, vom incepe prezentarea limbajului C# prin plasarea Iai fn context istorie determinat de aceste tei limbaje. C: inceputul erei moderne a programarii Ceeatea limbajului C marcheaz’ inceputul epocii moderne in programare. Tn- bbajul C a fost inventat de cate Dennis Ritchie in anii’70 pe un calculator DEC. PDP-11 care rula un sistem de operare UNIX. fn vreme ce uncle limbaje anterioare, dintre care cel mai important era Pascal, incegistau un succes semnificatiy limbajal C are meritul de a fi definit paradigma care incl trasea2i cursul programa sin ziva de azi Limbajul C s-a deavoltat in urma revoluyei prgramdrit srctarate din ani "60. nsinte de programacea structurati, programele mari erau foarte greu de seris din Sfatul expertului LE intrebare: De ce in Ci exit tipuri de date diferte pentru Sntreg i valor in virguld mobil? Cu alte cuvinte, de ce nu sunt toate valorle numerice de un singur tip? RAspuns: Limbjl C# vi pune la deposi tipi de date dferite pentru ca si pute serie programe eficiente. De exempl,operaileartmetice pe numere fnveegdecurg mai rapid decitealculele in viegula' mobil, in consecing,dack sve} neapirat nevoie de vals feayionare, nu este cazal svi complica ou inti “Hevea determinad de loeral cu pail fet si eb, fn al dilea sind, un anumit, Baace ‘Modulul ts Fundamentelelimbsjlui C# | _29 % Sema erogremulutizdnd med integrt Visual C++ (urmisnd instructunle | fn acest car cumn 10 este mai mi det 11, expesa condionalt ext adevEa iar desciseenterior in acest modil sau cu ajutorul urtoarel lin de comendé eee fn aes iz, 10 neste mal ni decit 9. Apel a wsteLina() ma va mal aves le Limbajal Cf defines un set complet de operitorielaional care pot fi wiz cxpresilecondjonale, lat care sone acy leone sinner maemarecemmms Va apes pe econ rezultatul: ‘oot eee ee 5. in momentul de fata, programul converteste temperatura de 59 de grade Fahrenheit in ‘rade Celsius. Modifcdnd ins valoareaatribuit lit, pute face programs conver- ‘easel temperatura dite - ED Semnificatia Mai mae sa gat Exercipi la minut | ree 4 Ce eave exst fa C¥ pent til neg de date? © Ceeste doue? © Este using systen 0 parte necesard inte-un program CH? | Remateafi ek operatorul de egaltae este semmnul de egalitate dubla, ath un program care prezinth instrucyiunea 4¢ Doua instructiuni de control {in compel wai meso, execu se destyoatt de no instreyiune ta le, de poi pl kia Este isl ponibl 9 mouliicim acest x seevenyal, cited slivrsl instru de control de cate dispunem in Ci. Chine Gack tom stcia sinunt nstvcfiunile de contol eeva mai teria, douk dine seestes sant rezenite pe seu sc, dcoarece le vom utiliza pent s sre programe detest Instructiunea ir Pure excous seedy pig dint-un program uilizind insrucgiunea condionalt in Ci: instruciunea at, Aceasta functioneazi si in CH similar ev instrucivnea IF din (osice alt imbaj. De exemple, st din CH este sintactcidentc cu instruetunie s¢ da C,C#+ sau Java, Forma cea mai simpli a inswuegiuni este prezentats mai jos t(conditi) instructiune; ‘ab este nepativ*); : AiG conic este 0 expresie de tp boolean (adic8 poate si fe adevirsté sau fal) Atonci cind nie este adevieat,instmicfnnea este exeevtatS. Chnd lash conde este fils, cul executiei sare peste instrueyiune, [ati un exemplar "Sires eens ooo BRANSON) + Covina chee tn C# penta pul inte de date este tm 1 feubts cate cuviatul cheie penis tipul de dite in wirgull mobili cupreciie dubia, | + No, dr eeprezigd un avant important. 2 ce 3. Compilt programulutlizind medial integrat Visual C++ (rmdrind instructiunile descrise anterior in acest modul sau cuejutorul urmétoarellin de comand peeeaERaONeR Re Va apairea pe ecran rezultatul so oradecray Sora con tus IS 5. In momentl de fa, prograrnl converte temperatura de 9 de grade Fehreneitin grade Celsius. Modificénd insd valoarea atribuité lui t, putefi face programul teascd o temperatura di we Exercifii la minut # Ce cuvint cheie existi in C# pentru tipul inteeg de date? © Ceceste doubte? ‘© Este using sy © parte necesariintr-un program C#? Doua instructiuni de control in corpul unei metode, execugia se desfigoari de lao instrucyiune Ia alta, de a prima pind la ultima. Este Inst posibil si modificim acest flux secvential, uilizind diversele instructiuni de control de care dispunem in Ci. Chiar daci vorn seudia in amnunt instructiunile de control ceva mai tfrziu, doud dintre acestea sunt” prezentate pe scurt aici, deoarece le vom utiliza pentru a scrie programe de test. Instructiunea if . utes execu seleciv par dint-un program utiliind instrucgiunea condionali din C#instrucyiunea 1. Aceastafuncyioneazi si in C# silat ca instrucyuniea IF din orice at limbaj- De exempta, 4¢-u din C# este sintactic identic cu instrucyunilea¢ din C, C++ sau Java, Forma cea mai simpli a instruction este prezentati ma jos: At(conditie instructiune; fl Aici, condife este 0 expresic de tip boolean (adici poate si fie adeviratl sau fast), -Atunci cind condife este adevirati,instructiunea este executati, Cand insé conde sare peste instrucgiune, Iaek un exemplu: + Cuvintul cheie in C## pentru tipul intreg de date este ant. oF + doubte este cuvéntul cheie pentra tipul de date in viggulé mobili cu precizie dubls + No, dar reprezinti un avaniaj important. Modulul 1: Fundamentele limbajului C# | 29 fa aces caz, com 10 este mai mie dect 1, expresa condlionalt este adeviest ia instrucionea wrtteLine() se va execua, S& consider nel wmitonee instrucfiane: GERUUTERLG) onsere westecane( Lint care nu" sete aT In acest caz, 10 nu este mai mic det 9. Apelul lai writeLine() nu va mai ave le. Limbajul CH éefineste un set complet de operator’ relafonal, care pot 6 ulizas in expresile condionsle, lath care sunt cesta ‘Operatorul < Mai mic decdt < Mai mic sau egal cu > Mai mare decét De Mai mare sau egal cu a Egal cu '~ Diferit de [Remarcafi ck operatorul de egalitate este semnul de egalitate dublat. Tati un program care prezintd instrucgiunea 4; Ee inetrietsuriea i so 4 tic void uain() ¢ Metructiune nu atiseaza nigic ", S b) console.wedteLine(*Nu vets vedes nimio") i 11-6 contine = = Console. wrsvetine(); +b - a; // ¢ contine acu 1 ‘Conéole wri:eiLine(-c contine 1"); “Af (@ >= 0) console. WriteLine(*e ny este nepativ"); _Sf(@, £0) Congole.nriteLine(re este negativ"): ¢ contine <1 © este negativ, declari trei variabile a, 6 izand o listk cu elementele separate prin virgule. Dupt cum am precizat anterior, atunci cénd avefi nevoie de dow’ sau mai multe vaciabile de acelagi tip, acestea pot fi declaate into singurd instructiune. Este suficient si separati numele variabilelor prin visgule. Bucla for Este posibil si executati in mod repetat 0 seeventi de cod prin crearea unei be “Limbajul C#t dispune de o vatietate de construcii repetitive puternice. Cea despre care vom discuta aici este bucla for. Dact stti unul din limbajele C, C++ sau Java, veti fi incfntat si aflayi eX bucla for din C# functioneazi la fel ca gi in aceste limbaje. Cea mai simpli forma a buclei for este prezentaté mai jos: ‘forinalizare; conde; iteratie)instructune; fin forma cea mai intalnitl, partea de infialzareatribuie unei vatiabile de control a bbuclei o valoate inigiali. Condiia este 0 expresie de tip boolean care testeazi variabila de control a buclei. Dac rezultanul testului este adevarat, atunei bucla for continu shitereze. Cand acesta este inst fils, bucla se termin’, Expresia itrie determing ‘manicra in care variabila de control a buclei se modifct la fiecare iterage, Tat un program scurt cate utilizeaz’ bucla for: Modutul 1: Fundamentele imbajului Cit | 31 Rezultatul generat pe ecran de program este prezentat mai jos ta acest exempli, vaiblla de contol a bucle este eount. Acesta primeste -_ valoatea zero in sectiunea de iniyializare @ Iui fer. La inceputul fieckre! itera {nclusiv la prima), se efectueaza testul condiici count < 5. Daci rezultatul acestui test este adevirat, atnci se executt instructiunea weiteLine() gi apoi secgiunea de © iteragie a buclei. Acest proces continua pind cand testul conditional devine fals, ‘moment in cate exzcutia se reia cu ecea ce se giseste dupa bucli. Ca un amfnuntinteresant, in programele C# sctise in mod profesionist mu veyi | tla’ aproape niciodat secyianen de iteragic a buclei scrsi ca in programul ante- rior. Cu alte cuvinte, foarte rar vey intilni instrucyiuni de forma: RETA Accasta se intimpli fiinde& in C# dispunem de un operator special de inctementare, care efectueaza aceasti operatic mai eficient. Operatorul de incrementare este ~+ (adic semnul + dublat). Efectal operatorului de incrementare este de a creste valoarea operandului cu o unitate. Utilizind operatorul de inctementare, instructiunea precedengs se poate rescrie astfel: EecuneS Ea CLERERZS SESE (ter TeainReK on LesmnRaI Hen a ae Efecuaaceati modicare, Du cum vei observa, buca va rlaexat afl a tnainte In C#, dispunem si de un éperator de decrementare, notat - - (semnul minus dublat). Acest operator scade o unitate din valoarea operandului stu. Exercifii la minut © Ce face instruegiunea 49? © Ce face instructiunea tor? © Care sunt operatosiiselagional in C#? + 4 este instrucgiunea conditional, * for este una din instrucyinile repetitive din CH. * Operator relationali sunt 13>, <= f=, a2 | ce Utilizarea blocurilor de instructiuni Un alt element esengial in Ci este bloc de cad. Un bloc de cod este o grupare de doua sau mai multe instrucyiuni, Aceasta se realizeaz4 prin includerea instrucfiunilor intre 0 acolada deschisa si una inchisi. Dupa creare, un bloc de cod devine o unitate Jogict si poate fi utilizat oriunde in locul unei singure instructiuni. Spre exempl, un bloc poate constitu tinta unos instrucjiuni 4¢ si tor. $4 considerim urmatoarea instructiune 4 SEY Vie ws Aici, daci w are valoarca mai mick deeit &, atunci se executé ambele instruefiuni dia bloc. fa concluzie, cele dout instructiuni din interiorul blocului formesz’ o unitate logics, nici una dintre instrucyiuni neputindu-se executa separat de cealalté. Aspectul esential aici este c& ori de edte ori avesi nevoie si grupati logic dow’ sau mai multe instrucgiuni, aceasta se realizeaza prin crearca unui bloc. Blocurile de cod permit implementarea multor algoritmi intr-o ‘manierk mai clark si mai ficient. Ith in continuare un progeam care utiizeaza un bloc de cod pentru a evita 0 impirgire la zero: ‘1 E Brezsita”BLCUFL YS" do" coe using sys class Siockoeso { public static volguain() ¢ Seid 4 agestui if este an bloc. Ue Tina kif este Geesie ntitetine(-t orto opts ov zero"); sees ine bloc ontr ts Console. Writetine(*j / i este * + 4); eee Modulul 1: Fondamentelelimbajului C# | 33 sD Sfatul expertului E _ intrebare: Usilizarea blocurilor de cod conduce la ineficiengt la rularea programului? Cu alte cuvinte, prezenta acoladelor determing ‘consumul unui timp suplimentar pe parcursul executiel programului? RAspuns: No. Blocurile de cod nu adaugh in nici un caz. vreo intérziere. De fapt, datorita caprcitigii lor de a simplifica transpunerea in cod a anumitor algo- titmi, utlizarea Ice determina in general 0 crestere a vitezei si eficiengi, Rezultatul generat de acest program este prezenat mai jos in acest caz, fina instructunii s¢ este un bloc de cod si nu doar o singurd instrac- fiune, Atunci cind condigia care controleaz’ instructiunea 4¢ este adevrath (at in acest caz este), se executi cele tei instructiuni din bloc. Incercagi st dagi Iai & vvaloarea zero si observati rezultatl ‘Dupi cum vei observa mai tirziu in aceasti carte, blocurile de cod au si alte proprietifi si intrebuingie. Principalal motiv al existenge lor este ins crearea ‘unitifilor atomice (adic& inseparable logic) de cod. Separatori si pozitionare fn C#, punctal si virgula marcheaz4 sfasieal uneiinsteucyiani. Cu alte euvinte, fiecare instructiung separati trebuie si se termine cu punct si virgulé. ‘Dupi cum sti, un bloc reprezineé un set de instrucyiuni legate logic, incluse 4atee 0 acoladk deschisi si una inchis’. Blocurile sw se termin& cu punct si virgula. Deoarece un bloc este un grup de instruegiuni, cu punct si virgul dupa fiecare instrucgiune, este normal ca un bloc si nu se termine eu punct si virgul finalul blocului este indicat de acolada inchis In CH, sfirsital de linie nu este recunoscut ca sfisit de instructiune ~ doar puactu si virgula pot marca terminarea nel instrucfuni. Din acest motiv, nu are nici o important unde pozigionati o instrucyiune in cadrul unei lini. De exemplu, seeventa din CH sie yay tt ” cies Gonsole.wriceline(x + * + y)i este aceeasi cu: LL WELT RS a4 | cH ‘Mai mult, clementele individuale ale unei instructiuni pot fi pozitionate pe lin separate. Spre exemplu, urmitoarea instructiune este perfect corecti: Despinyceslnior hang in aceasté maniect este deseosulizath pentea a face programele mai wor de itt. la acest mod se poate evita si despiryirea automata a lnilor excesiv de hngi Indentarea programelor Poste ci ati observat in exemplele anterioate ci anumite instructiuni erau serise indentat. Limbajul C# este independent de format, in sensul ci nu ate important unde pozitionag instrucyiunile unele in raport cu celelalte pe o linie. De-a hungul anilor ins s-a dezvoltat un sti de indentare comua si universal acceptat, care permite scrierea unor programe foarte usor de citi. Aceasta hucrare adopt acest stil si se recomand® ca si dumneavoastei si procedat la fel. In conformitate cu acest sti, se trece [aun nivel nou de indentaze dups fiecare acolada deschisi, revenind cu un nivel Inapoi dupa fiecare acolada inchisS. Exist anumiteinstruegiuni care favorizeazd o indentare suplimentart acestea vor fi discutate ulterior. Exercifii la minut © Cum se creeaza un bloc de cod? Care este rolul acestuia? © Tn Cit, instrucriunile se termina cu © Toate instructiunile C# tebvie si inceapA si sk se termine pe o singuri linie. Este adevirat sau fals? Proiectul 1-2: imbunatatirea programului de conversie a temperaturii SPE, Puteti acum utiliza buca for instructiunea 4¢ si blocuile de cod pentru a g «rea o versiune imbundtajta a convertorulu din grade Fahrenheit in grade Celsius pe care Fati dezvoltat in primul proiect. Aceast8 nous versiune va afiga 0 tabelé de conversi, incepsnd cu O grade Fahrenheit si pind la 99. La fiecare 10 ‘grade, se va afisao ine vids, Aceasta se realizeaza utiizind o varabilé numitd counter, Care numr lini aigate. Fil deosebit de atent la utilizar acestea, * Un bloc incepe cu 0 acoludi deschisé (, Se termind cu 0 acoladé inchiss }. Un bloc crceaai o unitate atomict de cod. ‘+ Instrucgiunile C# se termind ea punct si virgall, + Fals ‘Modulul : Fundamentele limbajulai C# | 35 $4. creat un nou fsier, denumit Freer 2 Introduceti urmstorul program in fisier: {© = 5.0/9.0 * (1 ~ 92.0); _// conversie in grade celsius Console.writeLire(t + * grade Fahronneit =" + 6+ * grade coleius, ‘counters+; <—— Tncrementim contorul la fecare iteraie. Si la tiecere 10 Linii, etican una vida Cand counter este 10, afisio o line vids | St(gounter == 10) ¢ ¢@———__"__- ‘Console, g itetine()} 0; // resetare a contorulus de init 3. Compa prgrauluiland meintepat Visual C++ su umStoarea ne de comand (Seve ricertee8 4. Rulati programul utilizand medi integrat Visual C++ sau urmatoarea linie de comands: Heseteerabie One x Tat o parte din rezulatele pe care le veyi vedea afigate pe ecran. Observati ck rezultatele care au produc valosi exacte con; roger 18, 686sessesee07 sami 36 | c# 8 grade’ Fahrenheit © -19:9548898000089 grade Celsius 9 grads Fahrenheit = -12.7777777777778 grade Celsius 12:2222220220222 grade Celsius +f ese6se6666067 grade Celsius i Saiiantisinisttt geade Celsius 40 1sse5555055556 grade Celsius 10'grado,Calsius To redesanenaages grade Celsivs ‘Ce lenesseasescas grade Celsius Te lgaaneas999959 grade Celsius 16 grade Fanrenneit 47 grade Fanremeit 18 grade Fahrenholt © -7-7771717777778 grade Celsius 19 grade Fahrenheit = -7,2200009000022 gre ‘celeiue i Cuvintele cheie din C# Existt 77 de cuvinte cheie definite in limbajul Ci# (vezi tabelul 1-1). Aceste eu- vinte chee, impreuni cu sintaxa operstorlor si separator alcituiese definiga im- boajuhii CH, Aceste cuvinte nu pot f utizate ca mame de variable, case sau metode, ——————— [Habelui G12 Cuvintele cheie din C# abstract a base bool reek byte case catch cher checkes class const continue docinat default dolegate @ ddoubte else nun event explicit extern false *tinatty thxed float for foreach goto ry snplicit in int interface incernal is tock ten namespace new ult object operetor out override params private protected public readonly ret return spyte sealed short sizeot Gackallce static seeing struct switch wis ‘throw rue ey typeot int slong unchecked unsate ushore using vwirtuat volatiie void wile er Identificatori in C#, un identificatos este un nume atribuit unei metode, unei variabjle sau oricicei alte enttiti definite de utilizator. Identificatorii pot avea unul sau mai multe caractere, Numele variabilelor pot incepe cu orice literi din alfabet sau eu underscore (_). Acest simbol este uilizat pentru a face numele unei variabile mai ugor de citit, ca de exemplu Aine_count. Literele mari diferi de cele.mici; cu alte Modulul t: Fundamentele limbajului Ci# | 37 cuvinte, in Cif, ayvar gi nyvar reprezineé variable dferite. Tati citeva exemple de jdemificatori corect format: Maxtoad sanpie23 Test x ra w “09 ny.var Rejneyi ck un identficator nu poate incepe cu o cifrt. In conelusie, vax este un identifcator incorect. Regulile nesesise ale unei programiri corecte cer si utiliza tnume de identificatori cate reflecté sensul sau modul de utlizare al entitiilor denumite Chiar daca in C# cuvintele cheie nu pot fi utilizate ca nume de identifieatosi, limbajul vi permite si prefixat aceste cuvinte cu simbolul @, obtintnd identifica- tori coreci Spre exemplu, efor este un identifiator valabil. In aceasta situafe, iden- tiffcarorul se qumeste de fapt for, iat simbolal @ este ignorat. De tegul, utlizarea cuvintelor cheie precedate de @ pe post de identificatori nu este recomandati, exceptind anumite scopusi speciale, Din punet de vedere tehnic, simbolul @ poate precede orice identficator, dar aceastl practic este considerati un abu. wt Exercifii la are dntre urmitoarele este un cuvint cheie: for, For sau FOR? © Ce tipuri de caractere pot apiea intr-un identificator CH? # Represinti indexat si Index24 acelas identificator? Biblioteca de clase C# Progeamele peszentate ca exemple in acest capitol ulizeazt dow metode prede~ finite in Ci: weteetine() siveste(). Dupa cum am stabilig aceste metode sunt membri ai clasel consote, care face parte din spaiul de nume syste, definit de biblioteca de clase a athitecturii NET. Dept cum s-a explicat anterior in acest modul, mediul Cit se bazeara pe biblioceca de case a athitecturi.NET pentru a asigura uncle facili cam at fi operaile de intare-egr, lucrul cu sruci de cartetere,lucral in rejea sau dlezvolttea de interfeyegeafce. In concluzie, C# viaut ea un intreg reprezint’ suma dlnwe limbsjul C# propriu-zs giclee standard NET. Dupi cum veti vedea, biblioteca de clase asigura'o mare paste din funcfionaltatea oricéraé program C# faue-adevie, a deveni programator in C# presupune in bunt parte deprindezea hu- crului cu aceste clue standard, Pe parcursul eet, sunt prezentate diferite elemente ale claselor si metedelor din biblioteca NET. Biblioteca NET este insi de mari dimensiuni, fiind mai adecvati studiului individual. + Cuvantul cheie este for, Toate cuvintele cheie din Ci se scriu eu ltere mici. + Un identiicator Cif poate congine ler, cifte si underscore «Na, limbajul C# este sensibil la dpucle de liters othe EC ee 7 Verificarea cunostintelor 1. Ce este MSIL. si ce importanga prezinti pentra CH? 2. Ce este motorul comun de progsamare? 3. Care sunt cele tei principii fundamentale ale programarit orientate spre obiecte? 4, Cu ce incepe executia programelor CH? 5. Ce este 0 variabila? Ce este un spagiu de nume? 6. Care dintre urmitoarele nume de variable sunt incorecte? AL count B. Scount C. counta? D. sreount E at 7. Cum putegi crea un comentasiu pe o singuri linie? Cum putefi crea un comentariu multilinie? 8. Prezentagi forma generalé a instructiunii st, Prezentayi forma generalé a buclei tor. 9. Cum putegi crea un bloc de cod? ). Este obligatoriu ca fiecare program C# si inceapa cu urmitoarea instructiune? using System; |. Acceleratia gravitayionali pe Lund este aproximativ egal cu 17 procente din cea de pe Pamint. Scrieyi un program care calculeaza greutatea dumneavoastei pe Luni. >. Modificasi proiectul 1-2 astfel incit sf afigeze o tabeli de conversie din fol (inches) in mets, Afigagi conversia pe un interval de 4 meti, din fol in fol ‘Afigati cite o linie vidt Ja fecare 12 soli. (Un metru este egal cu aproximativ 39.37 poli) Modulul 2 _ Prezentarea _tipurilor de date si operatorilor Scopurile acestui modul _ ¢ Insugirea tipurilor fundamentale din C# ¢ Utilizarea literalilor * Crearea variabilelor initializate | * Cunoasterea domentului de valabilitate al unei metode ¢ Intelegerea conversiel de'tipuri si castului « Invitarea operatorilor aritmeticl « Invatarea operatorilor relationali si logici * Studiul operatorului de atribuire © Studiul expresiilor Tipurile de date si operatoriistau la byza oricirui limbaj de programare si nici Cif nu face exceptie de la aceasti reguli, Aceste elemente stabilese limitele unui limbaj si determina tipusile de activitiqi pentru care poate fi utiizat. Dupa cum vi asteptaf,limbajul Ci oferi o gam larga atit de tipusi de date, cit si de operator, fiind astfel adecvat pesitea dezvoltarea unor categarii diverse de programe. Tipurile de date si operatoriixeprezinti un subiect vast. Vom incepe prin a exa- mina tiplrile de date fundamentale din C# si operatorii cel mai des utilizati. Vom srunca de asemenea o privire amihunyitt asupra variabilelor si vom seudia expresile. De ce sunt tipurile de date importante Tipurile de date au ir C# 0 importangi deosebitd, deoarece acesta este un limba} puternic tipizat, Aceasta inseamni ci pentru toate operagile, compilatorul efecru- enzi verficiti privind compatiblitatea tipusilor. Operaile nepermise nu sunt com- pilate. Verifcarea puternicd a tipurilor ajuti deci la prevenirea erorilor si creste fiabi- litatea programelor. Pentru a permite verificarea puternici a tipusilor, raturor vatia- bilelor, expresitor si valorilor lise asociaz4 un tip. Nu existi conceptul de variabilé fick ip", Mai mult, ipul unei valori determing in mod exact operatile permise asupra sa, Uncle opera permise ssupra anumitot tipuri ma sunt permise si asupra altora, Modulul 2: Prezentatestpulor de date si operatoriloe_| 41 4o [ce Tipuri valorice in C# Largimea in biti Domentul 019 255 Limbajul Ci# include dout categorii generale de tipuri predefinit: tipuri valorce 8 "128 a 127 si tpuri efiringd. Tipaile referingd din C# sunt definite de clas; diseuyia despre 16 (32 766 la 32.767 a ey 16 0ia6s 535 Clase 0 amin penteu mai tiziv. La baza limbajului C# stau insi cele 13 tipusi i Oa eo valorice, prezentate in tabelul 2-1, Tipurile valorice sunt cunoscute si sub denumirea 32 14294 967 295, de sipurt simple ea ~9 223 372 036 854 775 808 la 9 223 372 036 854 775 807 6a Ola 18-446 744 073 709 551 615 ee ‘Tabelul 24. Tipurile valorice din C#* Rabel 2ets Tipurle valence oe —____—_— > up cum se observa in tabel, in C# sunt definite ati versiuni cu seman, ct si Tipul —_Semnificatia . ‘i ' ‘ set Repredintsvaloite de adevsr(adevSrat/als) firi semn pentra diferitele tipui intregi. Diferenga Intreintregi cu ser si cet fi byte Tatregi pe 8 bit, fra semn seman apare la interpretacea bitului cel mai semnificativ. Daci specificim un intreg char Caractere ~ eu semn, compilatorul de C# va genera cod care presupune cX bitul cel mai decimal Tip numeric pentru calcule financiare douse Virgula mobila, rroat ——Virgula mobila, si int Numere intregi _ semaificaiv al inteegului este folosic ca bit de sem. Dact bitul de semn este 0, aunci rumirul este pozitiv; éack este 1, atunci nomarul este negativ. Numerele negative sunt aproape intotdeauna sepreztntate utilizind metoda complementulai fa de doi. in xeng__ntregi informa lunga -~f aceast ceprezentare, se inverseaza tof biti numarului, cu excepfia celui de semn, syte —_Integipe 8 i cu semn adunindu-se 1 la numirl rezulat. fn fine, bial de semn primeste valoarea 1. een ae ‘Numerele intregi ct semn sunt importante pentru o mare varietate de algoritmi, fee, eet neo dac cl pot atinge numa pe jumiate valorle masime absolute atinse de echivalen- usnore __Intregitn forma scuts, far sernn tele lof fark semn. Spre exemplu, iat reprezentarea ca short a numéralui 32.767: ovtaaata atnattyd ° LLimbajul C# precizeaza in mod strict un domeniu de valosi si un comportament pentru fiecare dintre tipurile valorice. Din rafiuni de portabiltate, in C# nu s-au admis compromisuri la acest aspect. De exemplu, un int rimine la fel, indiferent de ‘mediul de execusie, Nu este neceser, dec, si reseriem codul pentra adaptares la 0 ‘anumiti platforma. Chiar dack precizarea strctl a dimensiunii tipusilor valorice conduce la 0 uyvari degrudiue « performangclor in anumite medi, aceasta este necesark pentra asigurarea portabilitigi. tn cazul unei valori cu semn, daca dim bitului de semn valoarea 1, numirul eprezentat este interpzeta ca ~1 (In formatul complementuli fgt de doi). Dack {nek declarim aceasti Yaloare ca ushort, cind bityl cel mai semnificativ devine 1, ssumérul este interpretat ca 65 535. Cel mai des utilizat tip intreg este probabil tipul int. Variabilele de tip ant se utilizeaza de regula pentru contrdlul buclelos, pena indexarea tblourlur, dat yi pentru atitmetica obignuita cu aumere intregi. Atunci cand aveyi nevoie de un intreg cu un domeniu mai lag decit ant, dispuneti de multe opriuni, Daca valoarea pe care trebuie si 0 memorat este firk semn; pute utiliza uint. Pentru valori mari cx semn, alegeti tong. {n exzul valosilor mari fri semn, utlizai wien Iti in continuare un program care calculeaz numérul de cubusi cu larura de tun fol care incap intr-un eub eu latura de o mild, [fin cauz4 ed valoatea este foarte ‘mare, programul wtlizsazK o variabili de tip Yong pentru a 0 memora ' catcutuh ounaratel de cupurt cu tatura ge 1 tol tea sntr-an vd eu Latur intregi in Cit sunt definite noud tipusi intregi: ena, byte, shyte, shor, oshort, int win, ong si tong, pul ehar este ins utilzat in primul rind la reprezentarea caracterelor side aceea va fi prezentat ulterior ia acest modul. Celelalte opt tpuri rimase sunt utilizate pentru caleule numerice. Dimensiunile for in biti si domeniile de valori sunt prezentate in continuate: aes Ce Modulul 2: Prezentarea tipurlor de date si operatorilor | 43 elase tnehes ( ‘statio void wain(y Tipuri in virgula mobila © Dupi cam am explice in modulul 1, tiple in vigulé mobili se utlizear | pentna a reprezenta numere cae au pate fracionard. Bist dud sipusi in virgulk © mobili, fiat si deubte, cre reprezntd numere fracionare in simpli, respectiv dublé © precize. Tipul tiost are ungimea de 32 de bis si domeniul intre 15E-45 si 34E#38. ‘Tipul deubie are 64 de bij, domeniul find cuprins intre 5-324 si 1.7E+308. Dintte cele dows tipuri, doubte este cel mai frecvent intrebuingat. Unul dintre ‘motive este acela ci mute dintre funcyile matematice din biblioteca de clase C#t © (ere este de fapt biblioteca aritecatii. NET) utlizeazA valoride tip deubte. Spre | exemplu, merods sre() efinit in casa standard eysten.aat) Intoarceo valoare | de tip douste care este ridicina pitrati a parametruluisiu, fa exemplul urmator, = vom utiliza sert() pent a caleulalungimea ipotenuzei unui tiunghi drepranghic in mod evident, acest rezultat mu putea fi memorat intr-o variabilé de tip int sau int, Cele mai mici tipuriintregi sunt byte si sbyte, Tipul byte poate contine valori {ari semn cuprinse intre 0 si 255. Variabilele de tip byte sunt utile mai ales atunci cand se lucreszi cu date binate brute, cum ar fi un flux de date produs de un anumit dispozitiv fiic. Pentru a reprezenta intregi mici cu semn, putes! alege tipul sbyte, [ata un exemplu care utilizeaz’ o varisbilé de tip byte la controlul unei bucle forse calsens nap 100 de numere naturale ‘Observagi cum este aa | sqrt()+ precedati de numele care este membeu SRST ERA Fa ee ee sart() este tn membru al clase uath. Resinesi modul in care sgrt() a fost apelat, find precedati de numele wath In mod similar, eoneene precede writetina(). Desi au toate Deoarece bucla for itereazi numai inte 0 si 100, domeniu cuprins in dome- metodele standacd sunt apelate specifieind mumele clase! inainte, unele dint ele sunt. niul de valori al dipului byte, nu este cazul si intrebuingim o variabilé de un tip ‘Anunci cénd avefi nevoie de un intreg mai mare decit byte sau sbyte, dar mai hort, espectiv ushort, Tipul decimal Cel mai intecesant tip numeric din C# este foarte probabil tipul decinat, desti- nat utilizici la calcule monetare, Tipul decimal utilizeaz4 128 de biti pentru repre- zentatea valorilor cuprinse intee 1E-28 si 7.9E+28. Dupi cum probabil sti, ic decit int sau ufnt, utliz ‘| 4 fc aritmetica obisnuité in virguli mobilé conduce la varietate de erori de rotunjie atunci cind lucres2i cu valor frationare, Tipul deetned elimi aceste eror, putind reprezenta in mod precis pana la 28 de pozitii zecimale (chiar 29 in unele cau. Aceasti capacitate de reprezentate a valorilor zecimale fir erori de rotunjire fyi iseste cu precidete utiltatea la caleule care implici bani. Ist un program care utilizeaz& tipul deessar intr-un calcul financiar. Progtamul calculeazi un sold dups aplicarea dobanaii, edpuiue gor ‘toate valorile de ip desman tebuie urmate de m sau M, cP Sfatul expertului S_. Intrebare: Celelalte limbaje de programate in care am lucrat m au un tip de date decinal, Este acest tip de date prezent numai in C# ? RAspuns: Tipul decteat nu existh in C, C++ sau Java, Prin urmare, dia fami lia sa, C# este singurul limbaj care oferi acest tip. Programul va afisa urmatorul rezultat: in acest program, remarcafi ci toate constantele de tipul decdael sunt urmate de sufixul # sau w. Aceasta este necesar fiinde% firk sufix, valosile ar fi interpretate ca fiind constante standard in virgula mobild, care mu sunt compatibile cu tipul de date decinal, (Vom examina mai aminuntit modul de specificare a constantelor aumerice ulterior in acest modu.) ‘Modulul 2: Prezentazeatiporilor de date si operatorilor_| 45 la minut © Care sunt tipusileintregi din Cit ? © Care sunt cele dou’ tipuri in vieguld’ mobilé ? © De ce este tipul deetnat important pentru calculele financiare ? Caractere | tnt acter sunt eprezentate pe Bian ake Hnbse de prowramate, ca de exempht in C++. in C# se uilizeazi modelul Unicode. Modelel Unicnde defineste un set de caractere care poste reprezenta caracterele din toate Timbile de pe Pémfnt. Tipul char este deci in C# un tip fii semn cu lungimea de 16 big, acoperind domenial dintze 0 si 65 535, Setul standard de earactere ASCII pe 8 bigi este un subsct a. modelului Unicode, find euprins intr 0 si 127. Prin urmare, ‘aracterele ASCII continua 84 fe valabile gin C#, Patem atribui o vaoare ungi vasabile de tip caracter dact incladem caracteral © there apostrofusi simple. De exemple, seevenga urmétoare attibuie ‘X? variabilei en Fearon: wang acces Pate afiga un catécterutlizand o instructiune wetetane(). Spze exemplu, linia urmftoare afigeazi va ontea hui (Gaisote snpaeLan (“atoareataTON EE eae Desi enar este defiat in C# ca un tp fntreg, nu poate fi amestecat la intémplace ‘cu valoriIntregi in tozte cazurile. Aceasta se intiimplt deoarece nu se ofectueazi conversii automate,nire tipusile intregi si ehar. De exemplu, secvenja urmitoare este incorecté ‘ 10; ‘ Motival pentra cate instrucjiunea anterioari nu funcsloneazs este ck 10 reprezinth o valoate intreaga si nu este convertiti automat la tipul enar. Atribuitea de mai sus congine deci tipusi incompatibile. Dact veti incerea si compilayi acest fealae east tas) ce eee Pe parcursul acestui modul, vei vedea o modalitate de a depisi aceasti restrcyie. + Tiposile intregi din C# sont byte, short, Ant, Jong, sbyte, ushort, uint si ulong. Tehnic ‘vorbind, si tpul char este tor ua ip numeric, dar este ulizat in general pentru mnemorarea caracterelos. 4 Tiposile in virguld mobils sunt fhoat si doub «+ Tipul decinan este extrem de preyio la caleule financiare deoarece este innun la erorile de rotuniize care afecteae4 tipurile Float si double, # Sfatul expertului Intrebare: De ce se utilizeazd modelul Unicode tn C# ? 46 fc o R&spuns: Limbajul C# a fost conceput pentru a permite progeamelor si fie scrise astfl incit si fie utlizate oriunde in lume. Limbajal trebuie deci sé utilizeze tan set de caractere care ponte reprezenta semnele din toate limbile lumii. Unicode este setul standard de caractere coneeput special cw acest scop. Desigur cf utli- zarea setului Unicode este ineficient& pentru limbi cum sunt engleza, german, spaniola sau franceza, care au caractere ce yincap' in 8 big. Acesta este ins prejul plicit pentra obtinerea unei portabiltii globale. Tipul boo1 ‘Tipul boot seprezinté valosile de adevie ,adevirat (true) si flo (false) In C#, acestea sunt definite prin cuvintele rezervate true si fatse, Orice variabill sau expresie de pul boot va lua deci una din aceste valor. fa plus, nu este definith nici © reguli de conversie intre tipul bee si valori intregi. Spre exemplu, 1 nu este convertit in true si nici 0 in fatse, Tati un program care prezinté tipul bee: Modulul 3: Prezentarea tipurloe de date gi operatorlor_| 47 © Sunt tri aspecte interesante care merit remarcate in acest program. Mai “ jatdi, dupa cum observati, atunci cdnd se afigeaz’ o valoare boolean’ ca = writetine(), pe ecran apar girurile de caractere ,true", respectiv false" In al | doilea rind, valoarea unci variabile de tip boot este suficienti, firk alte clemente in plus, pentru a controla o instruegiune 4¢, Nu este necesar s& seriem 0 | instructiuae 4¢ in modal urmitor: pis Bitabeaai tue) inal weilea rind, rezultatul unui operator relational, cum este <, este o valoare de dip oot. Din acest reotiv, expresia 10 > 8 afgcarA valoasea true. In att ordine ide ide, expresia 10 > o trebuie inclus® inte-un set suplimentar de paranteze, deoa- _ rece operatorul + are o precedenti superioari lui >. RS Exerci # Ceeste Unicode? , © Ce valosi poate lua 6 vatiabli de tip boot ? © Care este lungimea in bigi a unui enar ? _ Cateva optiuni de afisare fndinte de a continua studiul tipurilor de date si operatorilor, este util si facem 0 ee parte a list prin semnul plus, cain exemplul Keaieseied ee + Desi este foarte convenabil, acest mod de afigare fect aii un control asupra formatulu in care apace informaya. De exempta, in cazal unei valor i virgolS moi, au putem controla numisul de zecimale afgate Si consideriim instrucfunea: ase aeLO) ‘Aceastaafgearhrezltaal: ease an LOTS SRNR Chiar dact este satisficitor in anumite situa, aigarea unui nuimis atit de mare de zecimale poate si na fie adecvaté in altele, De exempla, in caleule financiare, irebuie de reguld s4afigim dout povitiizecimale, + Unicode este un set de caractere international, pe 16 big. ‘+ Variabilele de ipul boot pot fi true sau” « Tipul char are lungimea de 16 big Pentru a controla formatarea datelor numerice, este necesat si utilizim 0 a doua form’ a lui westeLane(), pre: informagie de formatace: eta ERG (Bea tornanal nati’ mai jos, care ne permite si adaugém gi eco rane ara Jn aceastd versiune, parametsi lui wetteLine() sunt separa prin virgule in locul semnelor plus. Sind! de formatare congine doua elemente: caractete afigabile obignuite care sunt afigate firk modificiri si specificatosi de format. Specificatoti de format au forma generat {nr arg, width: ft) Aici, nr_arg precizeaz numiral parametrului (Incepind eu Zero) care trebuie afigat. Ligimea minima a cimpului este stabilitk prin valoarea width, iar formato este specificat de citre nt La execugie, atunci cind in sirul de formatare este intilat un specificator de format, parametrul corespunzitor, precizat de eltre ar_arg, este substituit si afisat. in concluzie, poziia unei specficatit de format in sirul de formataze este cea care determina unde se va afiga informatia care fi corespunde. Atat wid#, cAt si fnt sant opfionale. in cea mai simpla forma, un specificator de format indiek deci parametrul care va fi afigat. De exemplu, {0} corespunde eu argo, {1} cu argt, sam. Si incepem cu un exempla simplu. Instrucyiunes Dona HPA RELARR CeO ACR RMONONEAIET determin’ afigarea textuluis resus Dupi cum observati, valoarea 28 este substiuitl fn locul lui {0}, iar 29 ia locul lui {1}. Specificatorii de format identified deci pozifia in care parametrii care ‘urmeazi, in acest caz 28 si 29, sunt afigagi in cadral siruhu. Mai mult, observafi ck valorile suplimentare sunt separate prin virgule, nu prin semne +. Tati in continuare o form’ usor diferité a instructiunii anterioare cate stabileste si {simile minime ale cAmpurilor: 10} SUAS wea Aceasta determina afigarea textub: e981 SITES E ‘Dupi cum se observ, sau adiugat spagii pentru umplerea porgiunilor neutlizate ale climpurilor. Regine cf este vorba despre liximen minima pentru flecare cimp in parte, Textul aigat poate depisi aceasti litime, dact este cazul, in exemplele anterioare, valoile propriu-zise nu au fost formatate in nici un fel Desigur insi c& avantajul utiliza specificatorilor de format consti ia controll asupra aspectului datelor. Tipurile de date cel mai feeevent formatate sunt, valorile in ‘Modutul 2: Prozentarea tipusilor de date si operatorilor_ | 49 virgul mobila si cele de tip ¢eeinai. Unul dintee cole mai simple moduri de a specifica un format este descriind direct sablonul pe care Writetine() il va aplica Pentru aceasta, precizaji un model al formatului dorit,utiizénd semnul # pentru a ‘marca poziille numerice. De exemplo, iati o modalitate imbunitiyi de afisare a rezultacului imparfii li 10 la 3: boiisove.wrdtoLima(*Vauoarda 1us) 10/3" (0:¥.F}*)"10:013:0)3 Aceasti instrucyune va afiga rezultatul prezentat mai jos ale 88552 fn acest exempla, sablomul este #.###, ceea ce informeazi metoda wréteLine() si afigeze dou zecimale. Este bine insi si resineti cl wréteLine() va afisa mai mult de o poziti la stinga puncrului zecimal dack este necesar, pentru a nu teunchia valoarea. wi t7se Peniraafigazea unor valor reprezentind sume de bani in formatal cu doa si cen wlzaispecficatoru de formate. De exempls, fess oid} z sold = 12529.008; console, writetine(-so1dvt curent este (0:c}", $016); Aceasti secventi va afiga urmitorul rezultat: (Baan arene ats ere Proiectul 2-1: 0 convorbire cu planeta Marte A Planeta Marte se apropiein cel mai bun caz la distant de aproximativ SET cece de ret de ln. eupnted chpe ts gher SFPD cinevacu cae dors vor care ete traces dnte momenta care * _ounds radio pleacd de pe Pamant fi momentul in care aceeasi und ajunge pe Marte? ln cadrulacestu proiect, vei crea un program care aspunde la aceasta intre- bare, Reamintitivd c vitezaluminil este de aproximati 300 000 de kilometri pe secunda Prin urmare, pentr a calcula inthrsirea tebuie a ImpSrifi istanf la vite lumii Rezultatl va fi afigatin minute si secunde, Pas cu pas 1. Creaji un fsier now, numit wars.cs, 2. Pentru calcul intirzeri, este nevoie s@ utilizim valor tn viguld mobilé. Aceasta deoarece valoarea intervalului are go parte fracfionard, lat care sunt varabilele pe care programul le utilizeazs: |p aouere ast sara ‘double. Lightspeed, double delay; : pdouble delay iain) 0: 3. Injilzam variable eietance # 1dgnte sistance x sso0000a;rmy ss ccoor coor 5 Fvightepeed = 300000} 7/300 000 kn pe secundas so_| cH 4. Pentru calcul intarzeri, distance se imparte la Lightspeed, Rezultatul acestei operatii este valoarea in secunde a intrzierl. Aceasts valoate se atribuie variabilei delay, dupa care se afigeazd rezultatul. Acest pas sunt cupringi In secventa: ‘atstance / Lightspeed; iPsteLine(*Entarzierea 1a convorbirea ev wart i delay + * secunde.}; 5. Se imparte numarul de secunde obtinut anterior la 60, pentru a obtine valoarea Intérieri in minute; acest rezultat se afigeazé utlizand secventa de cod dataysiintn = dotay (607 " Console.WriteLine(“Intarzierea este de * + go 2 Wginute.*)3 oray. Conse in + lat In continuare listingul complet al programului Mars.es: [oer Proieetul 2-1 (© convorbire cu planeta marte Denumiti tieierut wars.ce “Dee a Using syeten; 23 ease wars ( static vold lain() ( Gouble distance: double Lightspees; double delay; ~ double tn distance = 25000000; 17 55 000 000 kilonetri 4 | Lightspeed = 200000; 1/300 000 kn pe Secunda Lighten 4a convorbires cu Marte: * + ‘seounde."); yAn_ain « delay / 603 Console. WriteLine(*Intarzierea este de + elay_in min + oe minutes"); i; i Kode 6. Compilati si rulai programul, Acesta va afisa urmatorul rezutat Tntakzterea 1a convorbirea cu waree? 185: seseeaeeses secunde. Intarzierea este do 3. 0555555655556 minut 7. Pentru majoritatea celor interesayi, programul afigeaza mult prea multe poziiizecimale. Pentru a face rezultatul mai ujor de citi, inlocuiiinstrucyiunile wréteLine() din program cu cele de mai jos: Coiisole:wisteLine (-rntarsterew 1a" cenvornérea eu vate: (0:88.44) secunce”, delay); Console.WriteLine(*Intarzieres este de (Q:4##.##B} minutes, delay_Ancn 0) Modulul 2: Prezentatea tipurilor de date si operstorilor_ | _ St 8. Compilati si rulat ined o data programul, Acesta va afga vezultatul Sitirzderea)1a,converbites Qu warte:) 169,089 secunds [intarzierea este ¢@ 3.056 ainut ‘Acum, acesta afigesz8 doar trei pozitiizecimale Literali In Ci, rermenul de dteral desemneaza valorile fixate, reprezentate intr-un format aceesibil omului. De exemplu, numfrul 100 este un literal. Literalit sunt denumigi in mod w2ual si rnstante in mazea majortate a cazuilor, constructa si ulizazea literalilor sunt atit ce usor de intuit, inci acestia au fost utlizayi intro formé sau alta de toate programele prezentate anterior ca exemple. A sosit acum momentul sk prezentim si o explicasic riguroasé, “Literal din C# pot fi de orice tip valovic. Modul in care fiecare literal este seprezentat depinde de tipul si. Dupi cum am precizat mai devreme, constantele de tip caracter suntincluse intre apostrofuri, De exempta, ‘a’ si %’ reprezintd ambele constante de tip catacter. , ‘Literal intregi sunt specificai ca numere fick parte fractionard. De exemplu, 10 1-100 sunt constante intregi. Constantele in virgula mobili cer utlizarea punetului zecimal, urmat de pattea fracjionara a numérului, Spre exemplu, 11.123 este 0 covistanté in vrgult mobili. Limbajul C# permite de asemenea utlizarea notayii stingifice pentru numerele in virgula srobil Deoarece limbajul C# este puternie tpizat, si lterall aparyin unui tip. fn mod firese, aceasta di naytere urmitoarelintrebiri: Care este tipul unui literal numeric ? De exempla, caze ete tipul pentru 12, 123987 sau 0.23 ? Din fericire, limbajul C# precizeazi citeva reguli ugor de aplicat pentru'a rispunde acestor intrebit. Mai inti, pentru literal intreg, tipul fecirui literal este cel mai mic tip inteeg tare permite memorarea sa, ingepind de la ant. in concuzie, un literal intreg poate fide tipul int, wint, tong sau ulong, in funcyie de valoarea sa. Literal in virgula ‘mobil au implicit tpt doubae, Dack nu vk convine tipul pe cate limbajul C# il foloseste implicit pentru un literal, puegi preciza explicit tipal édzugind un sufix. Pentra specificarea unui literal de tip tong, se adaugi un / sau L. De exemplu, 12 este un ant, in timp ce 12L este tong. Pentru a specifca o valoare intreagi firk semn, se adaugi sufivul w sau U. Prin uurmare, 100 este un int, dar 100U este de tip wine. Pentra specificarea unui intreg Jung fir8 semn, se utilizeard ul sau UL. Spre exemplu, valoarea 984375UL este de tipal utong Pentru a specifica un literal de tipul float, se adaugi un F sau fla constan exemply, 10.19F este de tipul treat. Pent specificaren unui literal de tip deetaal, se adaugi la valoarea acestuia un m sau M, Spre exemply, 9.95M este un literal de tip deeteat De s2_| cH Chiar daca literalii intregi creeaza in mod implicit valosi de tipul ant vine, Yona sau long, acestea pot fi atribuite unor variabile de tipul ayte, suyte, short sau ushort atit timp ct se pot reprezenta in cadrul tipului fintS. Un literal intreg poate 6 intordeauna atribuit unei variabile de tip tong. Literali hexazecimali Dupa cum probabil sit, in progeamare este uneori mai simplu si utilzim sistemul de aumeratic in baza 16 decit cel in baza 10, Sistemul de numeratie in baza 16 este denumit bexazecimal si utiizenr’ cifrele de Ia 0 la 9 siliterele de la A la F, care inlocuiese valorile 10, 11, 12, 13, 14 si 15. De exemplu, numirul hexazecimal 10 are in zecimal valoaren 16, Datorita frecventei mari de utilizare a numerclor hexazecimale, limbajul C# permite specificarea constantelor intregi in format hhexazecimal. Orice literal hexazecimal trebuie s& inceap& cu Ox (zero urmat de»). Inti citeva exemple: aint = OFF ner = oxta; 1) 285, 1i vee taat U1 26 40, z0cinal Secvente escape pentru caractere Includerea constantelor de tip caracter intre apostrofuri funcrioneaza pentra majoritatea caracterelor afigabile. Cateva caractere ins, cum ar fi cel de revenie la cap de linie (Carriage Retuen), sdica probleme deoscbite atunci cind se uilzeazi editoate de text penteu introducerea lor. Mai mult, alte cateva caractere, cum sunt apostrofurile si ghilimelele, au semnificati speciale in Ci, deci nu pot fi utilzate in mod direct. Din aceste motive, C# pune la dispozitie sven exape speciale, demumite uneori si consante caracer cu backslash, prezentate in tabelul 2-2, Aceste secvenge sunt utilizae in local caracterelor pe care le reprezint’. Spre exemplu, insteuctiunea urmatoare atribuie lui eh caracterul tab: eS NE Urmitorul exemplu atribuie tot lui eh un apostrof: ae Ay Sani Tabelul 229 Seevenge escape Secventa escape _Descriere ta alarms we sferge un caracter in urma (backspace) w form feed wn Tinie nova flinefeed) revenire la cap de rénd (carriage return) Modulul 2: Prezentarea tipurilor de date si operstorilor | _53 Secventa escape Descriere it tab orizontal w tab vertical yo nul v apostrof v ghilimele W backslash Literali de tipul string fn Ci, putem ins i un ale tip de literals ipl string. Un sting eeprezincd un sit de cersctere incl intze ghlimele, De exempla, faosta este un teste ste un sir de caracere, Ag observat exemple de sicuri de caractere in mulke din Snstrucgunile weetine() din progeamele prezentate ca exemple pind acum. Pe lingii caractere obignuite, un literal de tipul sie de caractere poate contine si ‘una sau mai multe cin seevengele escape prezentate mai sus. De exemplu, si considerim progtamul din continuare. Acesta utlizeazl secvengele escape in si \t 4A rie deearattars Ply peebanta weinszirea secveseaise sta [using systen; Uslizarea \a pentru a trece la linie now [elles serosa ( pe fiatie veld Weg |“ Gongole strsteLine (“Prins 1snie\nA ova 1inse"j | Gontoe nrdtetine(sA(eb\ 00 : | Sontone suri seine AN SCY] Uiiiaréa ab-udlor pent alncre } : a : Coe Tati ce afigeaza progrannul Fria ass Waom nie ' nee oe SD Sfatul expertul S __ intrebare: stiu ca limbajul C++ permite ca literalii intregi s4 fie specifica in octal (sistem de numerafie in baza 8), Se tneimpl aceasta siin CH? Raspuns: Nu. Limbajul Ci permite specificatea lteallor numai tn format este foarte rae uelizat in medile de pro- gramare moderne. s4_| cit ‘Observagi utlizarea secventei escape \n pentru trecetea ao line nou. Nu este nevoie si utilizayi mai multe instructiuni wrdteLsne() pentru a tealiza o affgare pe ‘mai multe linii, Este suficient si introduceti secvenga \n in interiorul unui sir lung de caactere, in locurile unde doriti efecuarea teceri I o linie nous Pe langa literal de tip sir de caractere prezentati pind acum, se mal pot de asemenea specifica literal pie a indigo. Un astfel de literal incepe ou @, wtmat de tn sir cuprins intre ghlimele. Conginueal sirului prin inte ghilimele este acceptat fir modifictri si se poate intinde pe mai multe lini. Putegi deci include caraecere linie novi, tab, etc, fird si fie nevoie si uiizati seevenge escape. Singura excepyie este ci, pentru a obtine ghilimelele "), trebuie si utiliza dows astfel de caractere ‘nul dup ata (Ta un program cre presne eral cope I indigo ‘Acest literal copie la indigo" iiteLine(@rAceste este un Literal <— congine caractere de trecere la copie 1a indigo e ae linie nous... ste Linit. iste rezultate atisate tabel: ir acesta confine caractere tab oe pewsta aster on literal” copie 1a indigo Gere ecupa mai mu fe Links rate niete Fezuitate arisate tavelac; ‘ha place ca." Ceca ce este important de observat in programul anterior este ci literali ,copie la indigo" sunt afigagi exact la fel cum sunt inteodusi in textul program Avantajul utilizani iteralilor copie la indigo" este c& putefi descrie modul de afigare in program exact la fel cum va apiirea pe ecran. in cazul siruilor multlini, trecerea pe o alti linie va ascunde indentarea programului. Din acest motiv, progra- mele din aceasti carte nu vor utiliza iterali ,copie la indigo". Cu toate acestea, ei seprezint& un avantaj pretios in multe situagi cu dificultigi la formatate. Modulut 2: Prezentarea tipurilor de date sioperatorlor | 55 Exercifiila minut © Cate ese tpulliteratlui 10? Das al literal 10.0? # Cum specifica’ 100 ca tong? Das ca vane? © Ce reprezintié @,test"? sD Sfatul expertului & i ‘intrebare: Sirul cu un singur caracter reprezint4 acelagi lucru cu un literal de tip caracter ? De exemplu, ,ke" este identic eu ‘k’ ? Rspuns: Nu. Nu trebuie si confandafi sirurile de caractere cu caracterele simple. Un literal de tip caracter seprezinti o singuri liter de tipul enar. Un sir de caractere, chiar dack are o singut liter, rimne tomugi un obiect dferit. Chiar dact sirutile sunt akcituite din caractere, ele au un tip difert. O privire amanuntita asupra variabilelor ‘Variabilele au fost prezentate in modulul 1. Dupi cum afi invitat atunci, variabi- © tele sunt declacste printe-o instruegiune de forms: tip nume-var; unde zp repzecintatpul vasable, iar mame-rar este numele si, Puri declara variabile avand orice tip valid, inclusi¥ tipurile valorice discutate pind acum. Atunci cind creaji o vatiabid, creagi de fapt o instangh a tipul stu. Operapile permise asupra unei variabile sunt deci determinate de tipul acesteia, De exemplu, nu putesi utiliza o variabila de tipul boot pentru a memora valori in virgulé mobili. Mai mult, tipul uneivariabile na se poate modifica pe pafcursul ducstei sale de via. Spre exemplu, o variabli de tpul int nu se poate transforma inteuna de tipul cher. tn C#, toate vatiabilele tretyuie declarate inainte de a fi folosite. Aceasta este necesar deoarece compilatoral trebuie si cunoasci tipul de date conginut de o vatabildinainte de a compila orice instucyiane care o wtlzeaza. Aceasta permite limbajului Cif s¥ efectueze verificayea strict a tipurlor, {tn CH, sunt definite tipusi difeste de vatiabile, Cele pe care deja e-am utiizat se numese variabile Jocalt, deoarece sunt declarate in interiorul unei metode. 4+ 10-este de tipul Ant, ae 10.0 este doubre. + 100 ca tong este 100. 100 ca ant este 1000. + @,test" este un liteal copie la indigo" wane sen Initializarea unei variabile ‘Trebuie s& atribuiti unei variabile o valoare inainte de a o utiliza. O modalitate de a realiza aceasta este prin intermediul unei instructiuni de atribuire, dup’ cum agi vizut deja, O alta este de a atribui o valoare inigalé atunei cind vaciabila este declarati. Pentru aceasta, dupi aumele variabilei se scriu semaul egal si valoarea cae ii este atribuits. Formatul general al inigiaizii este prezentat mai jos tip var = val; Aci, va reptezinel valoarea asibuith variable ner atuncicind aceasta este ereath. Valoatea trebuie si fie compatibild cu tpul preciat. Tati citeva exemple: int cous char ch float t = 1] Couiit prsdoste’ vatoarea iittiata 10 FJ] Anitializan eh eu Litera x 1.2F} /] f este initializata cu 1.2 La dectararea a doult sau mai multe vatiabile de acelasi tip utilizind o list sepa- ati prin virgule, putetiinigaliza una sau mai multe dintre variabile. De exemplu: int 4b $0; °6" 9, 4} 77 bse sunt taitiartzate & fn acest caz, mumal ie sunt inigiiat. Initializarea dinamica __Detiin exemplee anterioare am folost numa constante ca initiaizatori,limbejal Cit permite ca vasiabilele si fie inalizate dinamic, utlizind orice expresie valida la ‘momental in, care variabila este declarat. Spre exemplo, i un program de citeva lini care caleuleaz’ volurmul unui cilinden cunoscind zaza bazel sale si ndlgimea: If Prosontatea instializaris dinanice : using Sys} elas byninit { static void vain(). ( Geuble radius = 4, height = 5; > ‘volume este inigalizata | dlinamic la rulare 17 Anitdatizarea ainanica a volunulut z double volume = 3.1416 * ragiua,* radius + neignt; 2 Console.WriteLing("Volumut este * + volume : ine -volunut est une) Dd {in program sunt declarate tri variabile locale ~ redius, hesght si votune, Primele oui, radius (raza) si netghe (inalimea), sunt inifializate cu valori constante. Varia~ bila votune este ins initializati dinamic cu volumul cilindsului. Esentialal este ci expresia de inializare poate utiliza orice element valabil Ia momentalinigjalizarii, incasiv apelusi de metode, alte varabile sau literal. : Modulul 2: Prezentareatipurlor de date si operstorilor_| 57 “Domeniul de valabilitate si durata de viata a variabilelor > Pani acum, atm declarat toate varabilele pe care le-am uiiiat la Incepural meto- = dei uatn(). Limbajul Ct permite insi declarareaunci variable locale i interionsl = ricirui bloc. Dup cam am precizat in modulul 1, un bloc incepe cu 0 acolada | Geschish si se termind cu o acolads inchisi. Un bloc delimiteari un spain de dearer, Fpumit si domenin de valabiltae, De fiecare dats cind incepeti un bloc nou, creat de “fapt un nou domeniu de valabilitate. Un domeniu de valabilitate stabileste care biecte sunt vizibile in alte piri ale programulu. De ascmenea, acesta determin’ si Gdorata de viagi a acelor obiecte. Cele mai importante domenii de valabiltate in Cit sunt acelea definite de o clas Fs sespesti de o maou. Despre domenil de vata aoc une case (i “feapre variabilele declarate fn acest domeniu) vom discuta ulterior In aceast carte, ‘cind vom prezenta nogiunea de clasi. Ne imitim acum la studiul domenillor de valbilitate definite de eitre o metodé sau in interior acest Domeniul de vaabilitate definit de 0 metod incepe o dati ca acolada de © deschidere. Dact insi acea metoda ate paramets, acesia sunt la tindul lor inchusi in domeniel metodei. “Ca segull generilt, variabilele declarate in iteriorul unui domenia au sunt vizibile (adici accesibile) pentru codal definit in afara acelui domeniu. Prin urmare, declazaiea unel variable inte-un domeniu localizeazi acea variabili, protejind-o mpotsiva accesului si modifictrii neautorizate. Regulile de accesibilitate pentru un domenia constitu astfel un fandament pentru incapsulare. Dmenilede-visbilzaw pot & imbricate De exempl, de fecare dati cind creat tun bloe de cod, creafi de fapt si un now domeniu imbricet. In acest caz, domeniul cexteriog il congine 3¢ cel inteflor. Aceasta inseam’ ci obiectele declarate in dome- nial exterior sunt vzibile pentru codul din domeniul interior. Reciproca nu este ins adevieatl. Obiectel declarate in domeniul interior au rman vzibile in afara acescuia, ‘Pentra a fagelege efectul domeaillor imbaicate, sk considerim urmitoral progr: [Prexennae aetoni tok ae vanasaseate ‘sing syeten; clase ScopeDeno | Oo Ratio vota Malo) Int xj // eunoscuta in toate metoda tain() f(x == 10) { // ineepem un nou doneniu © Ant y.= 20; 59 . Prezentarea tiputilor de date si operatorilor | ‘Gonsole.WeiteLine(* y si yrt tx + % of 2 i a ra 1y se giseste in afara Spy = $005 17 Ere = domeniului stu. mai jos: ‘Progeamul va afisa textal prezentat ) metodei tain(), find accesibilé pentra intreg codul adiugat ulterior in corpul metodei. fn interiorul blocului 4, se declari variabila y. Deoarece un bloc defineste tun domeniu, y este vizibilé numai pentru codul aflat in eadrul bloculai stu. Din acest motiv am comentat linia y = 100; ce se gaseste in afara blocului, Dact vefi climina marcajul de comentasu din faja acest lini, se va produce o eroare la compilare, deoarece y nu este vizibilA in afara blocului stu. In cadrul blocului sf, vatiabila x poate fi folositk dcoarece codul dinte-un bloc (care este un domeniu—~ imbricat) are acces la varabilele dectarate in domeniu! care il cuprinde in cadrul unui bloc, variabilele pot fi declarate in orice punct, dar sunt valide rnumai dupa declarafie. in concluaie, daci declaragio variabilf la incepurul unei metode, aceasta este disponibili pe intreg parcursul metodei. Reciproc, dact declacatio variabilé la sfarsital unui bloc, aceasta este practic inutili, deoarece nu existi nici o porgiune de cod in care si fe accesibilt. Tati un alt aminunt important de refinut: variabilele se creeazi atunci cand fluxul de executie intri in domeniul lor, fiind distruse atanci cind domeniul este pitisit. ‘Aceasta inseammni cl o variabli nu isi mai pistreaza valoarca dupi ce domeniul six a fost parisit. in consecingi, variabilele declarate intr-o metoda nu isi pistreaz’i valo- rile din apelurile anterioare ale aceleiast metode. De ascmenea, 0 variabila declarata {n interiorul unui bloc isi pierde valoarea atunci cAnd blocul este plist, Durata de ‘viagi a unei variable este deci resteinsi la domeniul sit: de valabiitate. Daci o declaratie de variabild confine un inifializator, atunci variabila va fi reini- tilizati de fccare dati cind se intei in blocul in care este declarati. De exemplu, 6 considerim programul: ' ertarea auratel raph eum pate obsexva, y est cCnializth cu—1 de flecare dack chnd se ints in ose _ ror Chiar dach ulteior ise atebuie valostea 100, aceasta se pierde, THninth 0 ciadajenie in ceea ce priveyteceglle de domeniu in CH care vi poate © surprinde: desi blocusile pot fi imbrcate, nici o variabila declarati intr-un domenity F jrerior nu poate avea acclayi mume ex 0 al varabilt, declara ite-un Ce © Gare il congine. De exemple, urmitorul program, care incearck declararea a «arable difrite ct acelasi ume, na se va compila: Felass westvar { SU peatic void Main() int count; fount: = count +1) 6 ‘Na puter deciara din ‘sommes ss coun: | nous row pe count, find de ddeclaratl in Masn() “for(count = 0; count & TCgnsole tieiteL ine(*Valoarea pt count; (7 declaratie nepersise 111 <————| for(count = 0; count < 2; countt+) aie 7 eats aniverine( acest program contine erord 1°); anterior in C smu C++, stil eX acolo nu exist restriegil asupra ‘ domenin interior. Prin urmate, in C/C++, joate este perfect redeclararea varabiei eount in cadrul btoculwi buclel for exterioare este pe werabils. in C/C#+, astfel de declaraie ascunde variabila exterioard. Cei care 20 proieca imbajel Ci au considera ck aceast andre a nuoeor poate conduce cu ‘usueingi la eros de programace si au interzis-o- Daci agi lucrat numelor varablelor declarate inte-un oo | ce Exercitii la minut * Ce este un domeniu de valabilitate ? Cum se poate crea un domeniu de valabilitace ?| * Unde se pot declara variabilele in eadrul unui bloe ? # In cadrul unui bloc, cind se erceaslo varabilt? Cand se distruge variable cxestk? Operatori Limbajul C# pune la dispozitie un set bogat de operatori. Un operator este un simbol care determin’ compilatorul si efectueze o anumiti preluctare matematic’ sna logit. in Cit, avem patra catego generale de operator: arta, pe bi, releponali lg. Exists de asemenea in Ci cigiva operatori suplimentai, necesasi pentra rezolvarea unor situatii speciale. in acest modul, vom examina operatorii aritmetici, zelationali si logici. Vom studia de asemenea si operator de atribuire. Operatorii pe biti si cei speciali vor fi examinati ulterior. Operatori aritmetici Limbajal C# defineste urmatoril operator aritmetic: operatorui —_Semniicatia. ‘dunare Scere (f minus uno) Inmultire Impérive est (operatorul module) + inerementare Decrementare tere Operatorii +, -,* gi / functioneaza in Ci Ia fel ca in orice at limbaj de progra- are (si totodati la fel ca in algebr3). Acesti operatori se pot aplica asupra oriciror tipuri numerice predefinite. Chiar dacd acgiunea operatorilor aritmetici este binecunoscutt tuturor cittorilor, cexisti céteva situagi speciale care justficd uncle explicagl. Mai intt, st ne amintim ‘hatunci cind / se aplicé asupra unor intregi, restal este trunchiat; de exemply, 10/3 este egal cu 3 la implayirea inteeagt. Restol la impArfirea intreagi se poate + Un domenia de valabilitate defineste viibiliatea si durata de viaph a obiectelor. Oriee bloc defineste un domenin de valabiltat. + Varabiele se pot declaa in orice punct in eadral unui bloc + O vatiabils este creat la ftilnirea declaraii sale in cadrul blocuk. Variabila este distrust risirea blocului. - Preventateatipurilor de date si operatorlor | 61 Modulul regi. De exemplu, 10 % 3 = 3 CH aa act ndelo tual asia dps ie) Union progr © chine wind operstorul modulo “Tmbaje:intoarce restul unel impBrgi Yass Moddeno { fee ae : So vole Hain() { ‘double aresuit, dren Saresuit = 10/8550 5 fem = 10.8 3 S dresult:= 10.0 / 3,05 + ms © Gonsole,iritaLine(catul si restul: in result tor + dram); £ olestiriteLing(-catul #4 restul impartirii 10.0 7 9.0: © + re result) +:7.22# rem) § ae Programul afigeazA sezultatul pr€zentat mai jos: (oatuY o1 restin snartiris 10 / ‘Gatul oi reetul inpartiris 10,0 1 7 3.0: 9, 99905505080809 1 Dupi cum seobservi, operatore! Y intoarce 1 att Ia mpirgiea inteeagl, cits la operatia cu numeze in virguli mobili. * Incrementarea si/decrementarea Prezentati in modulul 1, ++ si - sunt operatorii de incrementare, respectiv de decrementate, Dupi cum vom vedea, aceytia prezinté uncle proprietii speciale, care fi fae desta de ineexesanfi SH iscepem prin a recapitul exact ce fac operator de incrementare si decrementate Operatorul de inccementare adaugi 1 operandului six, decrementaresexde 1. In consecings {in timp ce operatorul de ee ae este acelasi lueru cu Akt operatorul de incrementare, ct si cel de decrementare igi pot precede (in forma prfixatd) sau urma (in forma porfixatd) operandul. Spre exemplu: se poate resctie ca: Ea ore sau cat in exemplul anterior, nu apace nic o difereng& daca incrementarea se aplick sub forma prefixatt sau postfixatl. Atunei cind insi incrementarea sau decrementarea face parte dintr-o expresie mai mate, existi o diferengi importanti. Dac operatoral de incrementare sau de decrementare isi pretde operandul, operat se va efectua inaimte de a calcula valoatea operandului care va fi ulizatS in rest expresii. Dat {ns& operatorul wrmeagd operandului, compilatoral va obfine valoarca operandului fnainte de a-l incrementa sau decrementa. Si considerim secvenga: {In acest enz, y va primi valontea 11. Dact inst rescriem codul sub forma: Rasiomsees rauieenactseg = aun y va primi valoarea 10 fn ambele cazus, x priest valoaea 11; deck rmomental clad aceasta se intimpld, Conroulasupra moment cin se exceuth pera dei srementare cau decrementaze aduce tineori avantaje importante Operatori relationali si logici in sintagmele , operator’ relational" i operator’ logic", relational se ceferk la xelagile de ordine care pot exista intre dou’ valori, iar lgic desemneazi modalititile in care se pot asocia valotile de adevir true gi false. Deoarece operatorii relationali produc rezultate adevirate sau false, acestia se utlizeaz’ deseori impreuni cu cei logici. ‘Acesta este si motivul pentru cace fi prezeaciim ail impreund, Operstori relsionali sunt prezentati mai jos: atorul ——Semnificatia 7 Egatcu iene de > Mai mare decit ‘Modulul 2: Prezentatea tipuilor de date si operatorilor Mai mic decst Mai mare sau egal cu Mai mie sau egal cu fn continuare, prezentim si operatori logic: __ Semnificatia Si.scurtcircuitat” NON Rezultatele intoarse de operatori relasionali si logici sunt valori de tipul neo. ~ fn Cit, toate obiectele pot fi comparate in ceea ce priveste egalitatea sau = ncegalitaea, utlizand operatorii == si =. Operatorii de comparagic <, >, <= si >= ‘luzie, toi opertorii rlagionali pot fi aplicai tuturor tipurlor mumerice espa pot pot fins comparate aura in ce privet egalaten sau neegaliaten, Mdeoarece valorile true si false nu sunt ordonate. Relagia true > fatse au are deci ici o semnificatie n C# ; pes apt logs, opin te te de pl real operl “ logicefiind tot de tipul bee. Operatoriilogici &, |, “si! implementeaz’ opera = Jogice elementare $I, SAU, SAU exclusiv (KOR) gi NON, in conformitate cu " uumitoazee tabele de adevit: a iD : 9 pea pid pra false false false false false re we falst false tye 7, te false false true false tele true true tue true rue true false false Dupi cum se o2serva did tabeli, rezutanal operayiei SAU exclusiv este true atunci cind unul si numai unul dintre operanzi este true. a {in continuare, iat un program care prezinté citiva dintre operatorii relayionali si Modutul 2: Prezenacea puro de date si operatoilor_| of c# | St(s 4) combate. weeautho(*s = §2)5 ee . . £4{5 15 }} coneoue.WrieLine(“s I= 39}5 Featse oss lain() : SEU 3} consolecurdsatine( se vn exeout St(4 52 j} Gonsolecurdtatine(-no os ve exoscta™ IFUL 57s} contteluriteinet nee enecute) | ‘bi = true; 2 wee tate Af (bt 2) Console weiteLi fisat de program este prezentat mai jos: Operatori logici ,,scurtcircuitati” ‘in C#, dispunem gi de variante ,,scurteireuitate ale operatotilor logici $I, respectiv SAU, care por fi utlizate pentra a serie programe mai cficiente, Pentea a ingelege de ce sunt aceste variante mai eficente, s& considerim urmatoarea siuaye, fatr-o operatic $I, daci primul operand este fal, rezultatul va fi fas indiferent de valoarea celui de-al doilea operand. Pentru 0 operatie SAU, daci primul operand este adevi- rat, arunei rezultatul operatiel este adevirat indiferent de ce valoare areal doilea operand. In aceste doud cazuri, nu este deci necesar si evaluim al doilea operand. Neevalund al doilea operand, se cistigi timp, iar codul rezultat este mai eficient. ‘Operatorit,scurtcirenitagi* ST si SAT] snne 4, sespectiv | |. Pops eum am vizut mai devreme, acestia au ca pereche operator obignuiti&, respectiv |. Singura diferengi dintre vatiantele obignuite si cele scurtcircuitate este ci operatorii obismuiti cevalueaz4 intotdeauna ambii operanzi, in timp ce variantele scurtcircuitate evalueaza al doilea operand numai daca este necesar. atk in continuare un program care prezinti operatoril $I scurtctcuitat, Progra- ‘mal stabileste dack valoarea memorath in 4 este un divizor al Ini n. Aceasta se realizeazii efectuind operatie modulo. Daci restul implrtsiin / d este zero, atunci «este un divizos. Cum inst operatia modulo implica o imparyre, vom utliza forma scurtcieuitati a operatorului $I pentra a evita 0 eroare de imparyire la zero. 11 Prexsnta operatoris seurvesrauitaet: | St obisnuit. Aceasta determint evaluarea ambilor opersnzi, ceea ce conduce la 0 Pentru a evita ercarea de impirtire la zero, instructiunea if verifici mai inti dack este zero. in caz afirmativ, $T-ul scurtcircuitat se va opti fird si mai cfectueze imn- pirjirea. In primul test, deci, # are valoarea 2 si operatia modulo este efectuati. Al © doilga test esuenz’, dsoarece # a primie valoatea zero, iar operajja modulo este mist, evitindu-se croarea de impirgire la zero. in fine, se incearca utilizarea operatorului troare de execufe stunci clad se efecruetzkimpirtiea la 220, Operatoral $I seurtcteuitat se ma aumeste fT eodfoay, in rap ce operato- ful SAU seurtcieuiic este denumit SAU condfonae. "1 Proiectul 2-2; Afisarea unei tabele de adevar pentru operatorii log} {in cedrul acestui proiect, vefi crea un program care afieaza tabelele de EER tyece come chop tre en Scere cana a ei cpl cn tie aad | nnacan ed sneer acaun etpe tops og Mogae SEAT Sn cent ncaa ele fone og Pas cu pas 41. Creafi ua figer nou, numit Lopteazoprabie.cs. | 21 Pentru a asigura aliierea coloanelo, uilizati secventa escape \t pentru a include tab-uri in fiecare sir de carzctore afisat. Spre exemplu, urmBtoarea instructiune WriteLine() 3. Pe lnile urmatoare din tabel,utlizaticaractere tab pentru a pozitiona rezultatulfiecdrei ‘operatii pe coloana cu antetul corespunzator. 4, lat listingul complet al programului togtealoptable.es, pe care putefi introduce acum: “Console writer ine(-P\ta\tS1\tsAu\txOR\ HON") | “p= true; q = true, iil oes 2 | Gongolevirite(p eit +g + *1t"); & Console. virite((pta) + *\t* + (plg)'+ \t"); Console.writeLine( (pq) + *\t" + (1p); “Ba true; 9.» raise; eae sie Ganeotesnedte(p + sit" 9 q°4 “\et); Consote.write( (esa). +.*\e* + (pla) + 1874 3 © Console Weitetine((prq) * Ute # (19) + Ope false; q = tru : Gansote nedte(p + sie + q + *\E+) Gansote irite( (pq) + "At" + (ola) At"); ‘Console. Writeline((p"q) + "1" + (1p)); B= false; q = false; Console Weste(p + "\tt + q+ "\tt); ‘Console Write((péa) + *\t" + (pla) + *\t"); Console irstetine((p'q) © “\t" + (1p)); ¥ d 5. Compilat si rulati programul. Acesta va afiga urmatorul tabel: ema Sto SF SAU SoxORE ST HO true true true true false true false | false true false teve false true false false false false 66, Remarcati parantezele care delimiteaz8 operatilelogice in instrucfiunile write) si writeLine() din program. Acestea sunt abligatorii din cauza precedentei operatorilor in C#. Operatorul + are precedents superioara operatorilor logici 7. Incercati pe cont propriu si modificati progranul astfl nets utlizeze gis afigeze valorile 1 $10 tn loc de true si tatse, Aceasta presupune un efort mai mare decst afi putea crede initial Mogulul 2: Prezentarea tipurilor de date si operatortor_| 67 Sfatul expertului £ Intrebare: Din moment ce operatori scurtcircuitay sunt in majori- tatea cazurilor nai efciengi decdt operatoil obignulechivaleng, de ce dispunem in C# de ambele vasiante de operator $I si SAU ? RAspuns: in uccle cazur, este necesar si evaluim ambii operanzi ai unei operat $1 ori SAU, datoritiefectelor secundare produse. Sa considerim utmitonal program: Bij efecteie secundace pot conte foarte) wate. ing syst static void ain() ( int 3; : = 0; {f Aici, 4 este in continuare incresentat desi Anstructiutea if nu se executa, */ “ At(faise & (11 = 100)) Console. writeline("Mu este’ afisata*) Console.writeLine(*Dups primul sf 1 = 11 se afiseaza t Dees Scurteireultat care nu mai. eval st (falee & (#44 © 100)) ‘Console .WriceLino(*Nu este atissta’); // Console.writeline(*bupa al doles if 1/2) Dupi cum araté si comentatille, in prima initeuegione 4¢, 4 este incrementat chiac daca instrucyjnea se exeeuth sau au, Atunci cind folosim ins& operatoral scurtcircutat, variabila 4 ni mai este inczemebtati daé& primul operand este false. Resinesi de aici cd dack programul dumneavoasted asteapté ca al doilea operand sl uni uperagi $I of SAU sk fc evaluat, uebuie si utiliza formele nescurtcircuitae ale acestor operat Exercifiila minut - © Ce face operatorul % ? Cu ce tipuri lucreazi el ? © Ce tip de valori poste fi utilizat la operanaii operatorilor logici ? © Operatosii scurtcircuitag isi evaluenz’ intotdeauna ambii operanzi ? * % este operstorul modulo, cate Intoarce restul unc impirtii Intregl. Operatorul poate 6 aplicat asupea turaror tipurilor numetice + Operator logicihucrea2i doar cu operanzi de tipul b ‘+ Nu, operator scurt:izcutag! fi evalueazd al doilea operand qumai dacd rezultatl opera fei mu poate & stabil sigur dupi evaluarea primal ce Operatorul de atribuire Afi mai utlizat operatoral de atribuie si in modulul 1. A sosit acum momentul 100) pereche cu if(Z.e= 100) 100), acesta find sul cel mal apropiat din acelai bloc. Datef utiliza 4¢-urile imbricate pentrt inci o imbundtigire a joculul ,ghiceste litera, Acum, jucktoruva primi in plus o informatie in cazul unei alegeri incorecte accuse Satara) wares nea w trea OS 2 » Utilizand o instructiune 4¢, programul verified daci acest caracter coincide cu ispunsul stabilit, care este K in acest caz. Daci se tasteaz K, programul afiseazi mesajul. Atunci cind incercagi acest program, retinegi cd litera K introdusi trebuie si fie majuscul, Dezvoltind jocul, urmatoarea versiune utiizeazd clauza coincide cu rispunsul. se pentru a afiga un alt Un Sf imbeicat sguasanesniae | Ui obieate vite “sein pare rau, 2800 using systes class noes Un exemplu de fulare a programului este prezentat mal jos sia ane eRe ES er Dita : rau, Litera ¢ prea nar Scara if-else-if constructie uzualé in programare bazati pe tt-urle imbricate este scare fake Aceasta are forma: se(conditie) instructine; ‘ise s4(conditie) instructune; else ificonditie) instructiune; = aise instructune; Expresiile conditionale sunt evaluate de sus in jos. De indati ce se intalneste o condifie adevirati, se executd instrucyiunea asociat cu aceasta, resal sei find jgnorat. Daci nici una dintre conditi nu este adevirati, se executi instructiunea else final. Clauza else finalé se comportd in multe cazuri ca 0 conditie implicit; cu alte cuvinte, dac toate celelalte teste esucazi, ultima instrucgiune ease finalk este cea care se executs. Daci nu existi o clauzi else finali si toate celelalte condigi sunt false, se va exccuta aimic, - Mt Lobe Modulul 3: Instruyiuni de control_|_85 oles a(x = Be * console.wri be ole ee Console. WrsteLine("x nu este intre 1 “Aceasta este instruc- sones implicis Exercipii la minut «Ce tp tebuie sh aiba condiia dare coneoleaatinstruciunes 4? © Cu care if se asociaz’ o clauzi else ? © Coesteo scark if-elee-it? - Instructiunea switch Cea de-a doua instrucfiune de selectic din CH este snsten. Instructiunea switch implementeczll 0 ramificatie cu mai mulie ci, Astfel, ea permite unui program si selectege una din mai multe variante. Chiar dack si o seevengl de sf-uci _ imbricate poate implementa teste cu ramificafii mule, in majositatea situaglor instrucjiunea swtten reprezinti 0 abordare mai eficient. Instractiunea funcyionenz astfel: se verificd succesiv dacf valoarea unei expresii este egali cu fiecare din constantele dintr-o lish. Atunci edad se detecteaz4 potrivizea cu un element a listel, se exccuti secvent: de instruefiuni asociaté cu valoarea respectivi, Forma generals & inseeucgiunii steh este: switch(expresie) ‘ase constonta’: secventé de instructiuni break; + Conga care conttolea2i un 4f trebuie si fie de tipul book. Un else se asociaa intotdeauna cu eel mai apropiat 4¢ din blocal siu care nu are deja 86 | Ci Modutul 3: Instruetuni de control case constanta2: secvent’ de instructiunl break; case constante3: secventa de instructiuni break; default: scent densi , Expresia care controlea2i instructiunea seiten trebuie si fie de uml din tipurile {ntregi, cum ar fi char, byte, short sau int, sau de tipul string (care va fi prezentat ceva mai tzu in hucrate). in consecingS, expres in virgulk mobili, de exemplu, nu sust, pemise. In mod uzual, expresia care controleazdinstrucfiunea switch este pur gi simpli © variabili, Constantele ease trebuie si fie lterali de un tip compatibil eu expresia, Nu este posibil ea dow’ constante ease din acclasi swatch si aibi valori identice Seevenga de instrucyiuni detaute se executé daca nici una din constantele ea corespunde cu expresia, Prezenta clauzei default este optionali; dacd aceasta nu exist, nu se execut’ nimic in cazul in care toate testele ejueaz4. La detectarea unei potrivis, se executi instractiunile asociate clauzei ease corespunzitoare pind cind se © Dupit cum se poate observa, la fecare iterate bucle, se exeeutdinstrueyinile ssociate constantei ease care este egal cu 4, Toate celelalte instructiuni ease sunt fnorate.Cand 4 devine mai marc'sau egal cu 5, nici una din constantele ease nu se ppotriveste si se executl insthuctiunea default. in exemplul anterios instracfiunea suiteh a fost contzolat de 0 variabild tnt. Dap cum am precizat, puteyi controla un switeh cu orice tip intzeg, inclusiv enar. de tipul enar: ss ce ‘Texrul afigat de acest program este prezentat mai jos: ef ch este 8 ch este ¢ ch este D ch este E CObservagi ci acest exemplu mu confine o insiruciune defeute, Refine cl utiliza. rea'elauzei default este optionala. Atunei cind nu este necesata, ea poate fi omisi. iin Cit, se produce o eroare dack secvenga de instrucjiuni ssociask eu un ea ‘continua cu urmatoral exse, Aceasta se mumeste rgila de interee a eccuielfn secon Din acest moti, roate secventcle case se termina cu instrucyiunea break. Este posiil si interziceti continuazea execusie si in alte modu, dar instrucyiunea bresk este de departe metoda cel mai des utilizatd) Atunci cind este intilith in seevenga de instruction’ a unui ease, breek determin ful execusii programulul sk piriseasci fntreaga instrucfiune evdten, consinulind cu urmitoarca instrucfiune exterioar i teniteh. Un alt aspect de regiaut este cl nici clauza defauit nu trebuie si permit contiauarea executici, motiv pentru care de obicei si ea se termind cu break ‘Chiar dack nu este permis ca 0 secventi case si se continue cu o alta, este pasibil ca dows sau mai multe instructiuni ease si refere acceasi secvensi de cod, eum se observi si in acest exemplu: ‘ewitch(ip ates es % in sa el ‘Console.tiriteLine(" 4 este 1, 2 Ce | ‘break; a ee S case ts) console-rteLion(*h este 42); i San f ae ae | ¥ See i ists fn acest fragment, dacd tare valoacea 1,2 sau 3, se executi prima instrucyiune rsvetine(). Dac i este 4, atunc se executt a doua instrucyiune wrétetine(). Gra putea instcucfiunilor cese ns incaledeegula inteszicerii exer’ fn seevenff. deoa- zece toate instrucfiunile grupate partajeaza aceeasi secvensi de cod. ‘Gruparea este 0 metodi frecvent utiliza atunci cind mai multe instrucyiuni esse pot partaja acelasi cod. in exemplel uemdtor, gruparea este utiliza pentru separarea literelor alfaberuli in vocale si consoane: 10 Sapa using syste ite(‘introduoeth 0 Litera"); iP) cansole-Road\); Modulul 5: Trstucjuni de contol | 89 Sfatul expertului ————— Intrebare: fn ce caz este preferabil s& utiliz’im 0 scark st-else-4¢ {n local instruciunii awsten atunci cand implement&im 0 ramifica- ie multipla? 7 fy Raspuns: fn general, veg utliza 0 scard sf-etse-df atunci nd condliile care Controleasd seletia nu se bazeazl pe o singurl valoate, De exempl sh consideriim urmitoarea secventi 4f-else-4f: stor £10) He else itty t= 0) 17 lee SF(1 done) J/-. “Aceastisecrenff nu poate i sansrishfawe-oinstrufiune sesten deoarece roate cele wei condi implicd variable diferite si chiar de tipuridiferive. Care ‘inte acestea ax putea confrola un awtteh ? De asemenea, este necesar si utlizast 6 scarl if-e1se-s¢ la testarea valorilor in virguld mobi, sau la tstarea alror biecte care nu sunt de unul din tipurle permise intro expresie entteh Instructiuni switch imbricate Este posibil ca o instructiune evtten si constituie 0 parte a unei seevente de jnstroctiuni dinteun switen exterior, Instructionea interioari se numeste ewsteh Imbriest, Constantele ease din switeh-ul intesior si cel exterior pot congine valori comune, fir ca aceasta s& genereze conflict De exemplu, wsmitoarea seevents de cod este perfect corectt Modulul 3: Insteucyiuni de control | 91 —— EOE EE switeh (oh) : case ‘At: Contole Writ ~ ewiten cho), ( case A i ‘Console WrsteLine| [J esune a programul se vor documenta numa instructunile4¢ 5 ewsten, Celelakte etn de conic se vr aduga in proiect uterione as cu pas 1, Creat un fgier cu numele Hetp-cs. 2 Programul incepe cu afisarea meniului urmator: 11 star teak cP Sfatul expertului ————_ GS _ intrebare: in C, C++ gi Java, o secvent’ ease poate continua cu ee ee tull Switoh-uluk interior ectadilaltSs Pentru aceasta, se utiizeazs secrenta de intructiun prezentaté mal jos folp 142") foie urmitoarea. De ce nu se permite acest iucru gi in CH ? R&spuns: Existi doud motive pentru care limbajul C# a institut regula de interzicere a execujei in secvenjé pentra instrucfiunile ease, in primul rind, compilatorul poate reordona in mod liber instrucfiunile ease, in scopul optimizisii codului. O astfel de reaennjare au este posibild dact o seeventi case ge continua cca ucmitoatea, inal doilea sind, obligaya ca fecaze ease si se termine in mod explicit evité ca din greséald, programatoral s& permit continuarea unei secvenge cease cu urmitoatea 5 rogram determina alegerea utiizatoruui apelind Gensel. teas), cd ma js: BIEN = (char) Consote.neadert up determinarea select, programul utlizeszsinstructiunea ewiteh prezentaté mal jos pentru agree sintan instruction selectate: ‘Console. WrsteLine(*tastructiunea if:\o") Console WriteLino(-it (oenditie) instructiune ole WriteLine(colse instructiune; Exercifii la minut i siba 7 y ‘onsole:tirsteLino(tnetructiunea switch: 10"); © Ce tip trebuie si aiba expresia care controleazi un switeh Beene rrr eanraaishetcye * Ce se intimpla atunci cind expresia care controleaz un axiteh se > Gensoielueseecine( case constanta:"); 2 “Gonsole.Wnstetineté secventa de instructiuni*)} potriveste cu una din constantele e «# Este posibil ca o secvengi de instructiuni asociati unei constante ease ? Gonsole.nriteLine(* break"); = Gongole writetine(*

You might also like