Anda di halaman 1dari 75
Dragos Burileanu Claudius Dan Marius Padure RAMAREA GALCULATOARELOR (LACORLTOn 1. Descrierea mediului de lucru Dey-C++ Dev-C#+ este un mediu integrat de dezvoltare pentru limbajul de programare C/C++ si este oferit grauit de citre firma Bloodshed Software (Website: http://www .bloodshed.net). Bl foloseste compilatoral GCC (GNU C ~ Free Software Foundation) s. poate erea figiere executabile Win32, fie in mod consol, fie prin intermediul tunel interFofe grafice (GUID, si de asemenca bibliotceistatice sau dinamice (DLL-ur). Cerinjele de sistem recomandate de eftre autori sunt urmitoarele: sistem de operare MS-Windows 2000, XP; 32 (MB memoric RAM; unitate central (compatibila Intel) la 400 MHz; spatiu pe dise disponibil 200 MB. fn afara distribujci sale gratuite, Dev-C+ are un numa de caracteristci care il fac extrem de atractiv pentru utilizare. Fara a intra in detalii, vom remarca in mod special faptul cd interfaja graficd este foarte flexibili, dar si ‘ntutiva si ugor de folosit si include toute fuciliitile necesare unui mediu de programare evoluat (editare complet, listare de functi, compilare si rulare, depanare, ereare de proiecte,adaugare de biblioteci ete). Jn aceasta Iucrare se utilizeaz mediul Dev-C++ pentru programarea in limbajul C, iar compilarea surselor va avea ea rezultat obginerea de fisiere executable Win32. Ll. Editarea unui program Falitarea (adicd serierea figierulu’ sursd al programului) se poate face in mediul Dev-CH in douit moduri. © ‘modalitate eficient, recomandati in special atunei cand avem mai multe fiyere sursd, este de a crea mai inti un Proiect (meniul FALe, optiunile New si apoi Project... .); in acest mod se permite adiugerea sau climinarea imediatt a unor figieze gi editarea legaturilor dupa compilarea tuturorfiserelor sursi, ca gi un control al diferilor parametr disponibili in mediul de programare. O a doua modalitate, mai simpli, este de a se crew direet un (singur) figier sur; neeastd metod va fi descrisi succint si ustraté fn cele ce urmeazi, Presupunind ca suntem deja in interfaa grafic, se selecteaz meniul Fie, iar din New se alege Source Pile (sau se foloseste eombinatia de taste CTRL-+N), aga cum este prezentat fn Figura 1. Se va deschide astfl o novi feresstr (numita iniial Unt it Led) in care se va serie efectiv programul surs Dupi incheietea editri,fgicrulsursi trebui salvat pe dis. Salvarea se face prin comanda Save AB. . . (su Save) din meniul Fi.Le, asa cum este ilustrat in Figura 1.2; fisirele se vor salva ca figiere C (C Source), si vor avea pe dise extensia © oe ‘ a 0 aa Reprrencanie cna Orr fm ta "geome wen : rn cna on ere Figura 1.1. Deschiderea unui figiersursi now 1.2, Compilarea programului Unmitoatea etapa ce trebuie parcursi este compilarea programuluisursi rezultat dupa terminares edit, adicd straducerea” sa in limbajul calculatorului si obtincrea unui program obieet, reprezentat in cod masind sau int-un Yisnbaj ‘propiat de acest In cazullimbajului C, procesul de compilare si editare de legituri se imparted fapt inte mai multe programe: preprocesorul, compilatorul propriu-zis, asamblorul si editorul de legaturi, rezultind in final un fier exeeutabil 2 alata = = Stine wie! 1] RBs ota mms» Sire wo | RS Henan] @ haar home Poa] re Figura 1.2. Salvarea figieruluieditat In mediul Dev-C++ ctapele sugerate anterior (practic compilarea gi editarea legaturilor) sunt parcurse automat si transparent pentru utilizator prin apelarea opfiunii Compa Le din meniul Execute, sav folosind combinatia de taste Curt+F9 (Figura 1.3). Figura 1.3. Opfiunea de compilare a figicrului sursi {in cazal in care nu exist cror, este orcat un fisier executabil (avind extensia ,.exe") care poste fi rulat, partea de jos a ferestrei interfeei grafice ardtind, de exempla, cain Figura 1.4. In cazul in care se constati erori fa compilare (tipie erori sintactice), lansarea in executie nu este posibla, iar erorile sunt semnalate in fereastra Comps Ler (aflati in colul din stinga jos al interfefei grafice). Figura 1.5 prezinth o asifel de situate; este vorba de acelasi exemplu (problema 2.2 din Capitolul 2), in care s-au omisintengionat ghilimelele ee incadreazi specificaroral de format %& din linia 10. ‘Dupii ce erorile au fost inlaturate este necesar si se facd'o nova compilare (de remarcat Faptul cd dupa fiecare tmodificare adusi codului sursi, acesta trebuic recompilat). Cand compilarea a decurs bine, este permis rularea programului 13. Rularea programului Rularea programului se face prin comanda Run (sau CirH4F10) din meniul Execute (« se veden yi Figura 1.4), Aceasti comands lanseazd in execute programul, tipdrind eventual mesaje si rezultate pe ceranul caleulatorul O8 1eeab = Boogy 96 oe ee ee Sewree RAT Eremarace we Figura 1.4. Compilarea cu succes a figierului sus lala Figura 1.5. O situatie ce conduce la erori de compilare a programului In acca etapi sunt puse in evden eroile la exccutc, cum arf impiiea cu zero, sau sunt puse in evident crorilede logic duck rezultitele sunt eronate. Daci se descoper asl de ero, programatorultrebuie si se rentoarci Ineltares programului suri, si ecompilee is alee din no Pentru ca programul si fie lansat in exccutie automat dupit compilare se poate folosi comanda Compile & Run (sau F9) din meniul Execute. 2. Programe simple; variabile si constante, operafii de intrare/iesire formatate 2.1. Probleme rezolvate Serie un program care afigeaza pe ceran un text dat Hinclude finclude int main() Printé(*Acesta este un program Print (*\n")7 print (*ereat\n") 7 Print f (Mde mine. printf system ("PAUSE") 7 return 0; A Programut va afiga pe ecran, dupa compilare gi execute: acesta este un program ¢ de nine. ®_ Discutic: Comands # include realizeazi includerea in figieralsursi'a unui alt figier (situatintr-un direetor cunoscut de tre compilator), in acest caz a unor fisiere speciale care descriu conjinutul unor bibliotec si care poarti denumirea de Jigiere header, avind extensia ,.11". In exemplul anterior, st.di.o.h este fsierul care defineyte Functile standard de WO din biblioteca C (printre acestea numnarindu-se gi fmctile printf () si scanf ()), iar std ib .h este un figier ce defineste un numa de functi militare din biblioteca standard (cum este gi system ()). Programul propriu-zis este descris de funetia main (). Acoladele ,[* gi ,} din interiorul fnetici marcheaza practic inceputul si sfarytul programului. Instructiunite se exccut seevential; in cazul anterior, succesiunea operatilor ‘corespunde eu cea de seriere a comenzilor, deoarece nu se precizeaza explicit un salt lao alta instructiune. Funcjia peinté () afigeaza sirul de caractere inelus intre ghilimele. Seeventa de caractere ,\n° determin ‘recerea afisarii la un rand nou (yewline”). Existd alte secvenge de caractere care determini deplaserea pozitici unmdtoare de afigare. ~ Instrucfiunea system ("PAUSE") are ummdtorul efect: dupi afigarea rezultatelor, fereastra de rulare DOS! imine deschisi pani cind se introduce un caracter oarecare de la tastaturi, permigind astfel vizwalizarea si interpretararezultatelor programulti (fo lipsa unei astfel de comenzi,fercastra se inchide automat dupé rulae), = Instructiunes return ulflizati in main) determind intoarcerea unui cod de terminare edtze sistermul de ‘operare (valoarea intoarsd trebuic si fic un intreg). Uzwal, valoarea ,0° indica faprul el programul s-a terminat normal; orice alti valoare indicd fuptul ci existi o eroare. Precizm cd toate programele din aceasta luerare intore valoc din main (), desi din punet de vedere tehnic acest ucru este opfional (strict formal, deoarece instructiumea return este Plasata pe ultima linie din main (), executia programului oricum se incheic), [EE] seve um program or cite doot names nes xe au or. Hinclude Hinelode estdlib, int maing) | int a, be sy printf("Introduceti primul numar, a: "7 scant ("id", 6a)? printf ("introduceti al doitea numar, b: "3 scant ("td", sb)? printe( printe( system ("PAUSE") return 0; color dova nunere este td", Ds Bl Daca se introduc de la tastaturd, de exemplu, numerele ~7 si 7, programul va afiga pe ecran, dupa compitare siexecutie: Introduceti primul nunar, a Introduceti al doilea numar, b: 7 Suma celor doua nunere este 0 ®_ Diseutie: Instuctimes int a, by 87 declarl variabilele de tip imreg a, > sis. Varabila sve fi folosté pentru a stocavaloarea sumei dine ‘asi b. Funefia Scant () teste un caractr introdus dela tastatur: conform specificatorului id”, valoarea citi va fide tip itreg si va fi stocata la adresa variabilei ce urmea simbolului ya. Linia’ © ~ a+ bz attibuie variabilei © valoarea a+b. = Linia printf ("Suna celor doua numere este td", s); vaafiga pe ccran textul Suma celor doua numere este unmat de valoarea caleuatéalui =. [EGS] seri un program cre calcula diterenaa dou numere ine inroduse datas Hsnclude Hinclude int main ( int a, by Printf(*Introducets dova numere intregi: *) scant ("td 8d", da, 6b); print£("td = fd "8d", a, by a - bd; peinet ("\n" : system (PAUSE): return 0) EL die’ se introduc de ta tastaturd, de exemplu, numerele 7 519, programul va afiga pe ecran, dupi compilare si exeeuie: Introduceti dows numere intregi: 79 y-9= 2 = Instrucjiunea scan£ ("8d td", Ga, Sb); permite citirea de la tastaturi a dow numere intregi: prima valoarecitti va fi stocati la adresa variabilei a,” cea dea doua la adresa variabilci b. De notat ci spatiul dintre cele doud grupe de caractere ,:a” din "Sd %a" spune funcjiei_ scant () cf cele dowd numere introduse de la tastarura pot fi separate de spati, absolut coreeti utilizarea unor expresii (cum este a - b”) Tn lista de parametri a functiei printf (); ele vor fi evaluate Inainte de apelul functei. Aceast8 variantd este chiar mai eficienta decit utlizarea une variabile suplimentare, sa spunem c, clieia si i se atribuie valoarea a ~ b” (aceastd metoda a fost folositi in problema 2.2), deoarece reduce spatiul de memorie necesar programulu [PEA] sevieg un program care calcueaza aria unui core de rua dati valoarca raze se va cit de a tsttur iva ft un numa ine, Vinclude Hinelude int main { 7* declaratis + int raza; Float aria, pi = 3.14; 7+ comenzi */ printf ("Introduceti raza: scanf("Sd", raza); aria = pit raza * raza; /* caleulul ariel */ printe(*aria cerculbi de raza 8d este 8f", raza, aria); printe ("\n"); system ("PAUSE") ¢ return 0; BL aca se introduce dela tastatura, de exemplu, valoarea 3, programul va afiga: Introducsti raza: 3 Aria cercului de raza 3 este 28.260000 % Discutie: ~ Se decard vriabila raza_de tip intreg. Deoarecesuprafita unui cere nu est neapirat un num ftreg, vatabila aria in cae este calculatévaf declarat de ip real (deci se va utiliza pul float). ~ Variabilatealé pis niializearA cu valoarea 314, Deoareceaceast varabil ny este de pt asocial dectt valor constante 3.14, acelasiefect putea fi obginut utlizind modicatorul conot- Aceata poate fi folosit petra ‘rea constante de un anumit ip: ast, compilatral va inforinat ci variabila care uwneazl mu poate ft modllfcnt de program, Prin urmare instruciunea float aria, pi-3.14; din programul anterior se putea nlocu cu Float arias const float pi = 3.14; ‘Comentarile se pot introduce oriunde fn program, Scriefi un program care transformd temperatura exprimati in grade Fahrenheit in grade Celsius. Se va utiliza formula: C= (F-32)*5/9 , unde C— grade Celsius (numae real), grade Pabrenheit (numa intreg). Hinelude Hinclude int main) ¢ int gradt; float grade; print#("Introducets temperatura in grade Fahrenheit: *); scant ("kd", agrads) ¢ grade ~ (gradf - 32) * 5.0 / 9.0; printf ("tenperatura in grade Celsius este $f", grade); printt(*\n"} 7 system ("PAUSE") ; return 0; act se introduce de a ast, de exemply,vlourea 100 programa vats Introducets temperatura in grade Pahrenheit: 100 Tenperatura in grade Celsiug este 37.777779 ® Discutie: ~ Dupé cum s-a cerut fn enuntul problemei, se declard variabilele grade de tip intreg si grace de tip real Cele douii constante utilizate (5 si 9) se vor introduce in program sub forma 5.0” gi respectiv. 9.0"; desi asupra acest Iueru vom reveni in capitolul urmitor, vom spune deocamdati doar faptul ed rezultatal impiirtieit a doi intregi este un fntreg, deci evaluarea expresiei ,.(gradf - 32)*5/3” ar fi dus la un rezultat incorect (chiar dact variabila grade a fost declarati de tip £Toat). (FER) seri un program care transform sre unui unghi in grade (ram ne) tn ain (unre, Se vali relia de ransformarecunoscat: rad = grad * 2/180 Hinelude Hinelnde int maing) ( int gra float rad: const float pl = 3.142593; print£("Introduceti unghiul in grade: “I; seant("8i", agead); rad = grad’* pi / 180; print€(Masura unghiului este de $4.26 radians", rad): print (*\n"): System ("PAUSE 7 return 0; 1 daca se introduce de la tastatur, de exemplu, valoarea 360, progranmul va afiga: Introduceti unghiul in grade: 360 Masura onghiviui este de 6.28 radiani 7% Discutie: ~ Dupii cum s.a arta la partes terete, ca specifietor de format pentrs numere integi acim poate fi ilizat wit td” ct gi 8s sa folosit aii a doua variant Fiecare caracter Ce indie format variable poate fi precedat in cadnal unui specficator de format de un ‘modificatr ce va determina felul in care se va tipi valoaren. Aste, in exempul anterior, 6.22” vuiliat la a dou fanctie print ® () are urmitoare semnificae: se va tp un numeral in format zecimal utilizing in total & caractere(inclornd punctul zecimal), cu 2eife la parte factionard 2.2, Probleme propuse 1. Scricji un program care si va afigeze numele pe ecran, ca si seria i grupa, pe doul randuri succesive. 2. Secitete un intog. Sri un program cae si afigeze: At introdus num." 3. Serif un program care cites do integi si calculea produsul lor. 4, Scrigi un program care ealculea7a lungimea unui cere de raza dati; valoarea razel se va citi de la tastaturd gi va fi ‘un num ftreg, 5, Scriefiun program care transform temperatura exprimati in grade Celsius in grade Fahrenbet. (6. Serie wn program care transforms misura unui unghi din radiant in grade 7. Scrieti programe care calculea7i ari pentru pitrat, dreptunghi,tiunghi 8. Serio programe care calculeaza volume pentrs cub, pralelipiped,piramid. 3. Tipuri fundamentale de date, operatori si expresii 3.1. Probleme rezolvate [FEE] Unnitorut program hastea uilzareatiprilor fundamental de date fC. Hinclude Hinclode int maingy ¢ long int 4 = 66000; unsigned short int uy double x, ys char bic, b_mare, u = 66009, printe(*8id\eshu\n\e", i, 27 x = 12.3468, y ~ 11.20-2; print ("x =" 8f sau 86.38 eau te\n", x, x x0 printf ("y = 8 BAF sau VE\n\n", y, ye ¥h7 bimic = "bt, mare = 'a', ch = inte PFintf(*Coduriie ASCIT pentry 'b! si ‘BY sunt: &d, Sd\n", b mic, b mare); printf (*Oupa "Se" urneaza 'Sc!\n", bmi, bmie + 1); printf (*Majuscula corespunzatoare Ibi ‘ct este ‘$c, ch, ch = tat + tAN; printf (*\n*); system ("PAUSE"); return 0; EX Programul va afiga pe ectan, dupa compilare si executie: 66000464 x = 12.346800 sau 12.347 sau 1.234680e+001 y= 0.112000 sau 0.1120 sau 1.1200008-001 Codurite ASCIT pentrn "bh! si ‘Bt sunt: 98, 66 Dupa "b! urmeaza ‘ct Majuscula corespunzatoate Ii 'm! este 'M ®_ Discutie: ~ Programa are, aya cum se observ, tei pei complet distnete. fn prima parte se dau doui exemple de folosire 4 numerelor intregi. Programul va afisa corect numrul 66000 declarat long int (de fapt, s-ar fi afigat coreet si daci arf fost declarat int, deoarece pe majoritatea calculatoarelor eurente reprezentaea inter a lui int este pe 32 de bit). insti nu afigeaza corect acelasi numsirdeclarat unsigned short int. Numerele de tipul unsigned short int sunt intotdeauna reprezentate pe 16 biti, gama for find inte 0 si 2'*-1-65535; de altfel, compilatoral semnalizeara acest Iuera printr-un mesaj de atentionare (fereastra Compiler). Specifietorii de format S14" $i sSinu” permit afisarea numerelor itregi zecimale de tipurile Long int sirespectiv unsigned shore int. ~ Partea « doua ilustreazi citeva modalitti de afisare a numerelorreale. Variabilele x si y se declard de tipul doub2e gi se iniializeaza eu dout valori conerete. In prncipiu, specificstorul de format ,:£" poate fi folositeu oricare din tipurile float sau double si afigarea se face uual cu 6 cifre la partea fractionari, Usilzarea specificatorului te sau," conduce la afigarea numarulu real in formatulstiingific;formatul 86.3 va duce Is afigarea hui x cu 6 caractere in total (5 cite plus punctul zecimal) si 3 cifre previzie pentru partea fractionara (ca ‘tare, numirul 12.3468. se va rotunji la 12.347); in sfirgit, formatul ,88.4£" va duce la afigarea lui y sub forms, 0.1120" (deoarece lakimea edmmpului de afgare specifiats prin format este 8, cu dou unitifi mai mare decit este necesar,afisarea se completea7a eu dou spati liber la stinga numa) Tn parted atria a programului se exemplificd utilizarea si afgarea caracterelor. Cele tei variabie Folosite sunt declarate de tipul char; constantele caracter se seriu intre simbolurile apostrof. Compilatorul plascazi, de exemplu, codul ASCH al lui b', 98, a adresa variabilei b_micc similar pentru eelelate dou variabile. Aceste valori pot fi utlizate, de exemplu, pentru a face diferite calcule aritmetice (dupa cum se araté iin program), si se afigca7a ca rnumere intregi daca se foloseste specficatonul de format, sau sunt reconvertte in caracterele corespuncatoare daca ‘este folosit specificatorul,%c". Aceasta idee este reluat sn problema urmtoare. [EER] sevitam program cre afiearcodul ASCH al uma carter itt datas. Hinclude Hinclude int maing) | char ch; printt ("introduceti un caracters "7 ch = getoh 0); print€(*\nCaracterul 8c are codul ASCII 43d", ch, ch): Brinte(*\n")2 system ("PAUSE™) return 0; A Dac’ se introduce de la tastaturd, de exemplu, caracteral introduceti un caracter: (e) Caracterul © are codul ASCII 99 a Se declard variabila ch de tip caracter, Functia_get.ch () citeste un caracter de Ia tastaturd,adied asteapt pnt cind este apdsati o tas si apoi intoarce codul siu ASCH. Este © varianti a funetiei de LO getche (), dar spre deosebire de aceasta din urm, nu afiseazd automat pe ecran caracterul introdus de la tastatur (Se mai spune c& nu are @cou pe ecran”). Precizim ci functile getch{) si getche() nu sunt funcfii ANSI. Bibliotecile standard ANSI pun la dispozitia utilizatorului doar funefiile getc () si getchar () care insi citese primul caracter introdus si astcapti validavea serieri de etre uilizator prin asta . Caracterele nevi, inclusiv , rimin in batfer si vor fi citite de urmatoarele apeluri la get.c () sau getchar (). Recomandim folosirea funetiilor getch () si getche ()_ care sunt mai flexibile ~ Specificatorul de format , 34” defineste dimensiunea minimdi 2 edmpului in care se va afiga numdrul fntreg in cazul de fata); deoarece codul ASCTI al ui ,c* este 99 (pentru exemplul considerat anterior), deci necesiti dou cif, se va tipari un spafiu suplimentar la stanga’sa. De notat cd dacd se indicd o litime de camp inai mici decat este esi compte alocs tot mes oeceset (ar mmdrl de zecinale preci prin fomat ve 6 epee intocra programvl va afig Serie un program care adund i fnmulfete dou numer complexe exprimate sub forma zt + di (se citese efectiv a, b,c, d— numere reale). Indicajie. (a+ bi) + (c+ di)= (ate) + (b+ ai (as bine nd) = (ac ba) Mad boi athisdae Hinclude Hinelude ime main) ( float a, by cy dz printé("introduceti scant ("EE 4E", Gay bb printf ("Ati introdus zl - $f + $i", a, bi: printf (*\nmeroducet 22: "): scant(™4t 81", ke, 4d); printf ("Ati iptrodus 22 = 8 + Sti", c, ale printe(*\nzl +22 ~ af + Mi", a +c, b+ a: rinté(*\nel * 22 = 884 Sf Mah Cb td, at dt bt ey rink e(™\n") ; system ("PAUSE") 7 return 0; Daca se introduc de la tastaturd, de exemplu, numerele 1.2 si 2.1, respectiv 3.4 $i 4.3, programal va afiga Introduceti 21: 1.2 2.4 Ati introdus 21 - 1.200000 + 2.100000 Introducets 22: 3.44.3 Ati introdus 22 = 3.400000 + 4.300000i zl +22 = 4.600000 + 6.490000; 21 * 22 = -4,950000 + 12.3000004 Urmitoral program ilustreszi utilizarea operatorilor de impirtre (/) si modulo (2). Hinclude Hinclude int main 1 int i= 7, 5-4, ks Moat £ ="7.0, g/= 4.0, hi krisgs n=isgs printf ("7 / 4 = Sd sau 8f*, k, h); /* rezultate incorecte */ be t/a: Printf("\n7.0 / 4.0 = Sf\n", hb); /* rezultat corect */ Leitj; printé(*Restul impartirii Iwi 7 1a 4 este 84%, 1); prante(*\n"); system ("PAUSE"); return 0; © Programul va afisa pe ceran, dupi compilare si executie: 7/4 = 1 sav 1.000008 7.0/4.0 = 1.750000 Restul impartirii Ini 7 la 4 este 3 ‘Unndtorul program ilustreazi utilizarea operatorilor de inerementare si decrementare Hinelode Hinclude int maind) { int x, y= 10) 27 x = Hy; /* secventa echivalenta cu: yrs x ” printf(%x = ad) y> d\n", x, yz y= 10: 2 = --y + 5; /* secventa echivalenta cu: y=; 2 = y+5; */ prante("2 ~ Wd, y= Sd\n", 2, yd; y= 107 x = ytts /* secventa echivalenta cu: x = ys yb; */ printf ("x ~ $d, y= Sd\n", x, yl y= 10 2 = 3+ yoy /* secventa echivalenta cu: z= 3" ys yor */ printt ("2 = 8d, y= 3a", 2, yr DEaneE(*\n") 2 system ("PAUSE") 7 return 0; © Programut va afiga pe ecran, dup compilare si executie: ‘Unmatorul program ilustreaza utiizarea operatorlor relational i logici Finclude Hinclude int maing ¢ int 410, 3, ke 1 = 18, my nz ant a, by Ge dy ee J+ Sectiunea 1 +/ go> 5: k =i > 50; printe("j = td, k= ta\ 7+ sectiunea 2 4/ m= (> 11) && (1 < 199) 11 > 10); printe('m = d\n", om); ede RE 1" sectiunea 3.*/ n= 10> 566 1(10 ¢9) 11 3 >= 47 printf(n = td\n\n", nd; a+b e-% 4-5, e 7? Sectiunea 4 */ bed t= 2 printf(@b = Sd\o", bis f Sectiunea 5 4/ boot > 7 printf(mb ='td, © = 4d\n", b, ed /* Sectivnea 6 */ bean 0a cr printf ("> ~ Sa\n", bb J* Sectiunea 7 */ printf(te~ 8d" eb: print ("\n"): system ("PAUSE") ; return 0; EX Programul va afiga pe ecran, dupa compilare gi exeoutie: dru k-o net mea bas broe-a 625 ®_Discutie: ~ Sectiunea I: expresia i > 5 este evaluati ,adevirat” (10> 5), deci va primi valoarea 1°, apoi 3 = cexpresia i >= 50 este evaluati .fals", deci va primi valoarea 0", apoi x = 0. ~ Seetiumea 2: se executi mai inti parantezele; 0 && 1="0, apoi O | 2 = A;infinal m= 2. Secjiunea 3: ordinea de evaluare este urmatoares: Lao <9) =0 2 $0) =1 3. 1G>5-1 , 354-0 4 Llee1i0 = Geen oro H=2 Sona ~ Seetiunea 4: operatorii ,~" si yt” au acceasi priortate i asociativitate de Ia dreapta spre stinga; prin urmare, ordinea de evaluare este urmatoarea: Lode 2 8 2 p-7 Seotiunea 5: ordinea de evaluare este urmitoarea: Loe>7=0 2 b-o 3 ct = 8 7 a+2 ~ Sectiunea 6: ==" are priovitate mai mare decdt__,8 6”; ordinea de evaluare este urmatoarea: Lo a=0-1 2 Leec=i eect ~ Sectiunea 7: ordinea de evaluare este urmitoarea: agate 2 ide : 2-0 3 e-0 Urmitorul program ilustreaza conversile implicite de tip in expresii si atribuiri, ca si ullizarea operatorului cast. Hinclude Hinclude int maingy ( 7* Sectivnea 1 +/ int a= 10, b= 3; float ¢ = 10.0, dy int ur ¥ unsigned’ char ch_i, ch_2z double vs Ane 3 float’ ky 1, mm, pe dees (as by printf("d = af\n\n", a); J* Sectivnea 2 */ uy x = 230, y = 260: v’= 10.333) ch = x; ch? = printt("a = ad ol WL = Ad ch2= Sd\m\or, w, chi, chs /* Sectiunea 3 */ 4-5, = 4 meus) 1 = (floaty (i / 51s printf("e = te\tl © s\n", ky 1)7 m= (float)i / 3: n= if (floaty}: > (float)i / (loat)3; Printf(m - tf\tn - §fvte - tf\n", mony phe printf ("(float) (4 * 6) 5 = 88", (floaty (4 * 6) / 5); printé("\o"); system ("PAUSE") ¢ return 0; 2 Programa va ata pe een, dp compare gi exeote: a= s.3asa03 0 cha= 230 cnhe-4 k = 1.000000 = 1.000000 m= 1250000 n= 1.250000 p = 1.250000 (Float) (4+ 6) /-5 = 4-8on000 %_ Discutie: ~ Scctiunea 1: se evalucaz’i mai inti paranteza; impinjirea Ini a Jab produce un rezultatintreg (3), ambi ‘operanzi find intregi; aceasta valoare este apoi convertti In o valoare reali, deoarcee tipul lui c este float (chiar «daca rezultatul final al unei expres va fide tipul cel mai larg, regulile de conversie implicita sunt aplicate operatie dupa ‘operatic. ~ Secjiunea 2: u_primeste valoarea intreaga a lui v; ch_1 este afigat corect, deoareve numrul fntreg, 230) intr in gama de reprezentare a tipului unsigned char, adicd [0, 255], in schimb ch_2_ nu este afigat corect, producindu-se o pierdere de informatie (numai cei 8 biti inferior ai lui) y sunt copiafi in ch_2) Observasie: putem deduce simplu valoarea ce va fi afigati pe coran in acest ultim az; numlrul intreg 260 cexprimat in binar este 100000100, iar ultimii 8 biti codified practic umdrul intreg, 4 (numarul 4 reprezentat in binar este 100), ~ Soctiunea 3: aturi de Iuerurilediscutate deja pin in acest moment, mai facem doar 0 precizare:teoretic, este suficient sa fortim tipul unuia dintre cei doi operanz ce realizeazi o operate, deoarece cel de-al doilea operand va fi dus automat la tipul celui dint 3.2. Probleme propuse 1. Scrietiun program care caleuleaz si afigea7a pe ecran media aritmeticd a doud numereintegicitite de la tatatura, Propunej mai multe varante de a rezolva corest problema, tind coat de faptul ci media trebuie sfc un numyir real 2. Scrieti un program care eiteste pe n intreg si afigeara valoarea expresieini(n+1) cu patru zecimale. 3. Deduceti ce afigeaza urmaitorul program: Haclude finclude int main) ( int 493, 95) K-10, my zy us float y# xeite/jtk- printf("% = d\n", 0? tah y= Q*w) / (floaty * 3) + 7 printt(ty = 8f\n", yz printe("z = Sd\n", 2); 4233 ere printe (a Print e(\n") system ("PAUSE return 0; ve ’ 4, Coeste ineorect la urmitorul program? Hinclode Hinelude int maing ( nt x (float) = 10.22; printf ("% ~ SE\n"): system ("PAUSE"); return 07 3B

Anda mungkin juga menyukai