Sunteți pe pagina 1din 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 4, Instructiuni conditionale 4.1, Probleme rezolvate [FEE] Units program simp dtermind dai un mame intr ntods del tsar este pri (act poztv sa 210), sau set nega. include Hnetude “seas then> ine meant printf (*Introducets un nbmar intreg: "); scant ("8d", suman) ; if tnvmar < 0) printt ‘Ati introdus un mumar negativ!™) ; PEintf ("Ati introdus un nunar pozitiv!") Drinte(\n"); system ("PAUSE"); return 0; ‘Urmatorul program simpluciteste un caracter introdus de la tastatur $i verified dactacesta a fost caracterul w Ainclude Binclude Minelude int ming) ( 132) printf ("Acest text va fi intotdeauna afisat."); /* orice valoare diferit de 0 este consideraté "adevarat"! */ £10) Printf("Acest text mu va fi afisat niciodata.”: printé(*\n") system ("PAUSE") ; return 0; [FEA] serio un program care calculcari si afgeara ridicnile ecuajei de gradul doi cu coetceni reali ax? +bx+0= (cocficieni find citi de la tastatura); se va presupune, pentru simplificare, ci a #0. Finclude Finclude Binelude int main) { Float a, by cy delta, xl) x2 printf ("Introduceti a (diferit de 0): "); scant "sf", 6a)? printf ("introduceti br "7 scant ("SE") 6b); printf ("Introduceti ec: "); Beant ("SE") sc); delta-btb- 44 ater ifidelta >= 0} xl ~ (Gb + sgrt(deltay) / (2 * aby /* functia sqrt() este definita in fisierul header ‘math.n' */ x2 = (+b = sqrt(dettay) / (24 ale print£("\nSe obtin radacins reale:\n"); PEinte("x1 = 81.3f\te2 = 81.38", xd, 22); 1 else ( PrintE("\nSe obtin radacini compLexer\n*) printf(*xl = 81.36 + 81.361", -b / (2 * aby sqrt (-deitay / (2* a)) DrintE("\nx2 = 81.38 ~ W1.3Fi", -b / (2 * ay sqrt (-deltay / (2 * ad); ) print ("\n"): system ("EAUSE); [EES] Unnitorut program simp itusreazs fietionaresinsuciuilor if utile Hinclude Hinelude int maing ( int 4 = 100, 3 = -207 afi > 0) AEti > 1000) print# ("i este foarte mare!"); else printf ("i este mare" J+ s¢ va afisa "i este mare"; else-ul este asociat celui mai apropiat if */ s€5 > 0) 4 4£(3 > 1000) PEAntE("\nj este foarte mare!"); } else printf ("\nj este negativ") /* se va afisa %j este negativ"; datorita folosirit acoladelor, else-ul este asociat primului if */ printe(™\n") systen ("PAUSE"); return 0; 15 Series un program cates determine daca tei numere inte introduse de la tastatur pot constitu o dat Hinclude int main) ¢ int zi, una, an; printe(*Introduceti zive: *) scanf("ta", zi); printf ("Introducet4 luna: *); scant ("2d") gluna) + print® (*rntrodueeti anol: *); scant ("8d", ean); s£((2i > 0) a8 (2 <= 311) if((luna > 0) & (luna <= 12)) if((an > 0) ge (an < 100001) printf ("Poate £1 data calendaristica."); else Printf ("vu poate fi data din cavza anului!"); else Printf("No poate fi data din cauza Tonii!*); else Printé ("Mu poste fi data din cauza ailei! printf(\n"7 systen( return 0: -AUSE") [EE]] scrict un program cares cateueze gis afigeze minimal intr dows numere rede tte de ta asta, gt respect maximal dintre valorte absolute a dou numere inte, folosind operatorul condo Hinelade Finelode int maingd 7* Sectivnea 1 */ float a, by ming inte de & printé(*Introducets ar"); Seané ( sa)? print ("introduceti bs"); scant ("SE") gb)? min-(a fe <0) 2 -C: cr /* se calculeara modulul Ini ¢ */ f = (d <0) 2-a: d; /* se caiculeaza modulul lui d */ printf (*Maxinel dintre |c| si |d| este ta", (¢ > f) 2: #); /* daca e>f se va afisa e, altfel se va afisa f */ printe n\n"): system ("PAUSE" return 0; Unmitoral program iluteaza funeionarea strcturi de slecti. Se eitese dou numere inet asi b sto operatic ini oe (+, ~ *, sau) si se vaafigarezultaal operatic Hinelude Hinelede int maingy { int a, bi Float’ rez: char oP: print € (*Introduceté tal print ("Introduceti Beant ("8d") ab) 3 printf ("introducets operatia: "); op = getche() switch (op) | SS printf (*\nsuma este 8d, a +b): breaks print€("\nDiferenta este a", a ~ b)y break: printf ("\nProdusul este 8d", a * b): breal case "/"t ith = 0) printf (*\nimpartirea nu se poate efectua!™ else printf("\ncatul este tf", (float)a / (floatyb); break? default: Printf ("\nAti introdus un cod incorect "); , printf ("\n"); System ("PAUSE ; return 0; Serie un program care sf calculeze gis afigeze urs sau Iungimes unui cere de raz dat (nue flee, iit de a tastatura, in funete de optineswtlzatorul Hinclude snelude int maing int 37 Float pi = 3.147 char ci print€(*Introducett raza: "): Scant ("Sd") Gr) printf ("Introduceti optiunea, astfel:\n"); printé(pentru arse: A sau a \n"s printe(pentra Longines f saul \n"); printt("pentra iesire din program: 9 sau q \n\n begotch (+ switeh(er ( default: printf ("optiune necunoscuta!") Break; case 'q* case "Ot: printf (*Tesire! Break; case (AE priner("aria este: 3.28", pir * rds Break; case "It printf (*hungimea este: 8.26%, 2% pi * rly Break; ” printe(*\nt); system ("PAUSE"); return 7 Diseutie: Sectiunile structurii de selectie pot fi_ plasate in orice ordine; de exemplu, asezarea lui default la ‘nceputal structuri, ca in exemplul anterior, nu afectea7i in nici un fel funetionarea programulu, Asa cum se cunoase, instructunile asociate unui case pot lipsi complet; aceasta permite, de exemplu, ca ‘oui sau nai multe case ‘si execute accleas instucfiuni fard si fie nevoie de repctarea lor _, Seeventa din program realizati eu switch se putea scrie si folosind instructiuni de decizie multiple de tipul i f-else=1£, dar era evident mai complicat iffe = tat te = tay Printf(*Aria este: 8.26", pss r+ rh; else ff(e == IN Ipc == v4") Printf("Lungimea este: %.26,2 * pi * rz else iffe == tqh i ton print® (*resire else printf (*optiune necenoseuta!"); 4.2. Probleme propuse Ce este incorect la urmatorul program? Ce va afiga programul daci dupa compilare si exeoutie se introduce de la ‘astaturd numarul 10? Hnclode Hnclide etalib. n> int maing { printé(*introduceti un numar intreg: “"); Scant ("8d") 6)7 AU > 01 printf ("Ati introdos un nunar poritiv!"); printe(*\nm); System("2nuse™); return 0: Scrifi un program care calculeaza si afiyea7A ridicina ecuatci de gradul inti cu coefcienti reali ax-+b=0 (oeficienti ind citi de a tastatur); discus Indicate: ecuata are solute daci a #0; dack a= 0: daci b =O ccuatia este nedeterminatd, iar daci b #0 cust nu are solute. 3. Folosind instruetiuni de decizie, scricti un program care citeste de Ia tastaturé un numar intreg x si afigeazi © valoare y calculata astel: -x43, pentru x<0 y={ 3, penta xe/0,4] 3x9, pentru x>4 4. Seriti un program care citeste dou numero frei de la tastatur imparte cele douil numere gi afigeaz rezultatul Cum numitorul trebuie si fie difert de zero, disculati aceasta situstie in dou moduri:folosind odecizie if - else. si respectiv operatorul conditional. 5. Scrieti un program care si calculeze yi si aflgeze maximul si minimul dintre trei numere intregi citite de la ‘ustaturd,utilizind operatoral conditional 6. Sori un program care citeste de la tastatrd un nume intreg tote 1 i 7 gi afigeaz denumireazitei din siptinyina ‘orespunzitoare eifrei respective: 1 — luni, 2 ~ mari etc. Programul va semnaliza print-un mesaj de eroare dack rnumrulintrodus nu a fost in intervalulsolictat Indicate: se va folosi o instructiune switch. 5. Cicluri 5.1. Probleme rezolvate [EE] Urmatorut program simply itustreazl utilizareaciclului eu test iia: se introdve continu earactre de la tastatur, pind cind este tata fitera Ainclude #include int main [ char ch; printf ("Introducets un caracter (‘q' pentru terminare) : Eh = getch Os whiletch ! "q") Printf("\MAts Sntrodue be", ch) , he aeten oe printf (*\o\nati introdus qi"); peinté ("\n") ayetem ("PAUSE 7 return 0; & Discutie: Accentulim faptul ed fn C, cielurle accept pentru testarea condifiel orice fel de expresii, Mai mult, se pot realiza operalii complexe in expresia ce semnifil testul de condite; astfel, partea de program urmitoare: ch = geten0o: white(ch '= ta") printE("\nati introdus $e", eh); eh = getch()? ) se poate serie mai simpha astfe: while((ch = getcn()) t= a") PrintE("\nati introdus 8c ", ch); Unmitorul program simplu ilustreazd utilizar cilului cutest final: se afieaz pltratele umerelor inte cuprinse inte asi 2a, unde « est un intreg poitv cae se cites dela tastatur Hnelode Hinclude int maing) ( printf(*introdsceti un numar intreg pozitiv (<100): "); Beant (*3d", 6a)? be2ea printé ("start\n"); ao printf(rsd 4 8d = d\n", a, a, at ads } while(a <= bys printé ('stop\n"); System (°PAUSE") ; return 0; BA Daca se introduce de la tastaturd, de exemply, numirul 4, programul va afiga: Tntroduceti un numar intreg pozitiv (<100): 4 ata a6 545225 6+ 6 = 36 T7249 as a= 64 atop 19 ®_Discutie: __ Cit aceeasi observatie ca cea ficutd la problema 5.1, cichul cu test final din problem se mai poate serie, de. cexcmplu, astfel (reamintim cd un operator de incrementare sau decrementare wtilizat ca prefix determina ca valoares noui si fie calculatd inaintea evaluatii expresiei) do printf("sdtid = d\n", a, a, at ad; Pwhile(tta <= bbz ‘Urmitorul program simplu ilustreaza forma de ba7a a ciclului cu contor: se citeste un numa natural > 2 si se afigeaz suma 1424... include Hinclude int main { int my ay ds Print (*Introduceti un numar natural (> scanf("td", Gn): 2-0 fori ao lic ist) ) Peintf ("Suma numerelor de la 1 la td este td", ny she Beintr(*\n")7 System ("PAUSI return 0: my: a ~ © varianté a programului anterior, utlizand un ciclu eu test initial, este urmatoarea: iscutie: Hinclude Hinelude int maing ¢ int, i= 0, 8 = printt(*introdveeti un nunar natural (2-2): " Beant ("8d", sn)? while (i Hinclude ant main() ( printt("introduceti un nunar natural pari"); scanf("8d", sis for( tipi 2) f poate ay Drinte(md 3a\y system ("PAUSE") ; return 0; 2» G1 Daca se introduce de ta tastaturd, de exemplu, numaral 8, programul va afiga: Introdueeti on nunar natural part 8 512 6 216 4 64 26 ~® Discutic: Programul numa descreseator, din doi in doi, dela valoerea introdusd de utilizator si pant a 2, apo atigeazt aceste numere, impreund cu euburile acestora, pe rinduri succesive. ~ Sunt iustrateo serie de variatit in modul de uilizare ale ciclului cu eontor in C: ‘© sectiunea iniializare a ciclului lipseste, deoarece contorul i este inifializat practic de catre utilizator in ‘fara ciclulu (atenfie insa cd semnul ,;* trebuie si fie prezentt); + testul de condi are urmétoarea semnificafc: ciclul se reia at timp cat i este yadevirat”,adicd diferit de zero; de asemenea, se observii ci modificarea contorului se poate face cu orice valoare, gi nu numa cu I (ca in Pascal, de exemplu); ‘© contorul este utilizat si in corpul cicluli, in cazul problemei de fall pentru caleulul lui j (acest cru este posibil, asa cum s-a specificat si la partea teoreticd, deoarece valoarea contorului nu este modifieati de operate din cadrul ciclului) ~ Dac numérul introdus de la tastaturé este negativ, sau poritiv impar, ciclul se repeta la infinit Gustifieagt accastiafirmaie!). Serieti un program care citete dela tastaturi dou numere naturale « sib, 60 @ Hinclude int main) { int a, by i, 5 = 0; printf ("introducets a (natural): "); scanf("8d", 6a); printf ("Introduceti b (natural, boa): "); seant("sd", sb)? print€(*\nllunerele dintre a 9i b in ordine crescatoare:\n") + while(i <= b) printf ("td %, i} 1 Printe(m\nt); printe( wunerele dintre a ei b in ordine deserescatoare:\n") + in-z /* dupa ultima iteratie a ciclului anterior, i= b+ 1! */ ao printe(mtd ") §)5 J while (i >= aly print #("\n"); Printé(Hedia aritmetica a nunerelor dintre a si br"); for (i= az i
Hinclude int main() ( double facts (* variabila fact = nl este deciarata ‘double’ deoarece poate avea valori care sa nu poata fi reprezentate nici co A octeti! */ printf (*Introduceti un nunar intreg intre 0 si 100: * scant ("&d", 4n) 7 while(n < 0 |i n> 100) { printé(*Munarel introdus nu apartine intervalului!")s printf ("\nIntroducet\ din now mumarul: "); scant ("td", an); ) tin > 0) | for(fact = 1.0, 3 = 2; i <= my itt) ( fact = fact * 4; /* sectiunea initializare cuprinde doua expresi separate de operatorul ',"! */ , : else | fact = 1: /* pentru cazul n= 0 se foloseste definitia standard Of = 1 */ ) printf (Pentru n= 8d, nl = tg\n", n, fact)? 7+ specificatoro! de format 'Sg" asigura tiparirea in formatol e sau f, care dintre ele este mai compact */ system ("PAUSE"): return 0: Scrieti un program cate afigeaza toi divizorii unui numir natural» citit de la tastatur; dacs numarul este prim, se va afiga acest lucra printr-un mesa Hinelude Hinelode int maing ( int oy iy printf (*introduceti un nunar natural: *); scant ("Sd", n}? k= 0; for(i= 2: 1 Hinelude int main ( int ay by iy de ke me printf (*introduceti a (natural) seant ("Sd") a); printf ("Introduceti b (natural, ba): "); scant ("Sd", 6b); a= 0; for(i = ar i br in K-07 for(s = 27 3 <4 / 2p ate) ifG 85 == 0) keds kek == 01 1 printe(mtd ") 7 nol > iftm == 1) printf ("sunt numerele prine dintre td else printf("intre ad si Sd nu exista numere prime!", a, bb; sat) ay bi: print ("\n") aystem ("PAUSE") 7 retern 0: G1 daca se introduc de la tastatur’, de exemplu, perechile de numere 3, 18 gi respectiv 24, 28, programul va afiga in cele dout situa: Introdveeti 2 (natural): 3 Introduceti b (natural, boa): 28 35711 13 17 eunt nunerele prime dintre 3 si 18 Introduceti a (natural): 24 Intredoceti b (natural, bea): 28 Intre 24 ¢1 28 nu exista nunere prime! ~ Discutic: Problems este ceva mai complicatt decat cea anterioar, in special dae se doreste tratarea tuturor eazurilor posible. Primul ciclu for foloseste contorul i pentru a parcurge intreg intervalul (a1, b]; se presupune mai inti ci fiecare numir i din interval este prim i se initilizeaz cu 0 variabilak. Se pareurge apoi cu al doilea ciclu for (contor 3) intervalul [2, £/2] pentru ase cerceta duct fiecare 1 are sau nu divizori, similar algoritmutui utiliza in problema 5.7; dacé se giseste un divizor, k va lua valoarea 1. Dacd dup parcurgerea intregului ciclu interior ‘imine 0, inseamni ei 4 este prim, se afigeazS, si ciclul exterior continud cu urmatoarea valoare a lui i, ‘Variabila auxiliari m_foloseste in acest program pentru a se putea trata si cazul special fn care [a, B] nu exista numere prime; m_ se initializeaz’ cu 0 inainte de primmul cilu, gi devine 1 dacd a fost gasit cel putin ‘un nur prim (care s-2afigt). intervalul Unmitorl program ilusireaé folosiea énstuctunilor break si continue: se affyeurd numerele itypare dinge I sun mame natural als de utiizator,trebue si se permit reluarea exer (deg din program), daca utilizatorul doreste acest lucru, iar dacd valoarea introdusi este < 0, programul va tipari: tunes de croare giv fi sbandonet Hinclude Hinclude int maing) ( int ny iy char ch ae do ( printf("introduceti un numar natural (90): "7 Seanf ("a sn) Seine 9) prince (*Valoare stegala!\n"); Breaks 7 se' ebandoneaza ciclul ‘do...while! */ b Forti = 11 4 < np tee | ie 82 continues 7?"se'trece 1a inceputul eiclului ‘tort: Be incrementeaza® contorol, se reevalueaza Conditis, apo! eiciul continua; program! mo vva"atise numerele pare */ printer *) ity 1 Printé("sont nunerele impare intre 1 si td", a); Printe(*\nboriti sa relusel? (iM: "2 eh" geechet; f(r NS) ka; prints ("\n\ 1 whalers system (PRISE) ; return 07 5.2, Probleme propuse Scrieti un program care citeste pe n natural yi afigeazd valoarea expresici ro 1 tt pe 141142 len 2, Setieti un program care eiteste pe n natural si afigeaza valoarea expresiei ++ 20+. ta! 3. Seritiun program care afigea7a numereledint-un interval [a, ] ce se dvd eu un numa natural k itt 4. Scrieji un program care afigeaza numerele prime mai miei dect un numr natural k citi. 8. Serio un programm care si descompund in factor’ primi un num natural citi 6. Reluati problema 5.9, cu urmitoarea modificare: se vor afiga numercle divizibile ew 3 dintre 1 i un numir natural neitit Este coreet urmitorul fragment de program? Ce functie realizea7s? Ce face, fn prineipiu,ciclul cu contor seis sub forma for (37)? forts 2) getcne (): ifich'== TA") breaky 4 6. Tablouri si siruri de caractere 6.1, Probleme rezolvate Screfi un program care citele de In tastaturk un vector de maxim 10 elements integi impreund cu dimensiunea sa efetva apo afc clement sale Precizare: intrucit la rularea programului nu este cunoscut de la inceput numérul de elemente (el este mai mic decat 10) se va opta pentru citirea, la inceput, a numarului de elemente. Hinclude Hinelude int maing) ( int vClO1, my is printf (*introdvceti nr. de elemente: *): scane("td", sn}: for(i = 0; £< mp StH) printé('v[td) =") 4) scant ("8d", avti}}: 1 printf ("Valorile estite sunt:\n": for(i = 07 2 < m7 t+) peinte("v{ta) = %a\s ie vt system ("PAUSE"); return 0; BX Programul va afiga pe ecran dupa compilare si executie: Introduceti nr. de elenente: 3 vo} = =2 via} = 0 wiz} = 2 Valorile citite sunt viol = ~ via} = 0 viz] = 1 7 Diseutie: Primal cila for citesteelementele vector Cel deal doieaciclu for aigeazi valle citi si memorate Scriefi un program citeste un vector de elemente intregi, impreund cu dimensiunea sa efectiva,afigeaza tn ordine inversi elementele vectorului si calculea7 media aritmeticd a elementelor sale. Ainelude Binciude ant maint) | ant v{10}, mi, s¢ Float m: print# ("Introduceti ni scant ("sd", sn)? for: =O; deny att printf (twEsa) =") ip; scant ("8a", aviil) , for(i =n 2 printe( bono i am, vite m= (floats Jn printe(*\tma = .26\n", ms systen("2AUSE); return 07 BL Programat va aig pe coun dps compile gi execu Introduceti ns 4 v(O] = 2 vay = 2 vi2) = 3 vis} = @ 4322 ma = 2.50 Discus ‘Dupi cite numrului de clemente, n, pimul ciclu for citeste elementele vectorului Al doitea cick for parcurge veetorul de la ultimul (Fa valoarea n - 1) pind la prinmal siu element (i, >» 0) prin decrementarea (i --) contor Variabila (ce va confine suma tuturor elementelor vectorului) se inifalizeaza cu valoarea 0. Al treilea ciel or parcurge veetorul sla ficcare pas al ciclului se adund Ta vechea valoare a variabilei s, valoarea lui v {i} ~ La final, media aritmeticd, ma, este calculati si afigatd. De remarcat conversia detip (float) s/n. Scriefi un program care cite un vector de clementeintegi, impreunl cu dimensiunea sa efetiva, gi determin maximal si minimul dite elementcle acest vector Hinclude finclude int main 4 int vI20], my) 4, max, miny printf (*introduceti numarul de elenente din vector: "): scant ("Sd") én) for(i = 07 $< nz ise) | printf (*v(s) = scant ("d", §v{il} an min = max - v{0}7 fori = a2 i ax) max = vi}; if (vil <= min) min = vtihy , printé ("max ~ sd\emin = tal max, minds system ("PAUSE") : return 0; BX Programul va afiga pe ecran dupa compilare si execute: Introduceti numarvl de elenente din vector: 4 vi0} = =1 vill = 5 vi2h = = vial = 4 max ~ § min = ~ 26 ®_Discusie: ~ Dupitcitte numirfui de element, n, primal cic fox citeteclomentcle vector ~ Vaiailele min simmax sunt iiiizate cu valonrea primului element din vector, [0]. Algortol parcurge voctrul i testeazi ta fecare pas al ciclului for pent ficeare clement v3, rlaia sade inegalitate fn raport ct Inia. respectiv: max. in primul eaz, daci v1] ‘ese mai mare deeat max, atunci elememtul (4) repreznt un thaxim local si dei yaloarea lui v{4i] ise aribuievarsbled marx. In al doiiea ex, daca. (4) exte mai mie decit thin atuel elemental vi) teprezinté un minim local si deci valoaealui_v[4) ise atibuie varabiled min. La Sfarjitulciellul for, varabifele nin imax confin valorle minima respeciv maxima din vector + Scrili un program care citeste un vector de clemente intregi, impreund cu dimensiunea sa efectivl, ondoncazi cescitor elementele vetoruui si apo afigazi vectorl ordonat, Se va utiliza metods de ordonare (se utilizeaza gi termenul sortare) denumiti, in limba englezi, ,bubble-sort”. Hinelude Hinclede ant maing) | int 120], n, i, ind, tmp; printf (*introduceti numarol de elemente din vector: "); scant (mta", in); for(i = 07 i < my iH) printf (vlad) =". iby Scant ("sd", Sviil); aot ind = 07 for(i = 0; i vet tmp = vty vil = vitals viel] = tmp; ind = 1; 1 P while (ind s for(i = 0 i < ny ie) printf (*v[ta) ~ d\n", i, vill: system ("PAUSE"); return 0; BD Programu! va afiga pe ecran dupa compilare si executie: Introduceti mumarvl de elenente din vector: 4 vio] = =2 vii} = 4 via} = 2 vi} = 0 vfO} = = vill =o vi2] = 2 via} = 4 ® Discutie: Primul ciclu fox citeste clementele vectorului. Anterior acesteia a fost citit numirul de elemente ale veetorului, = Programul utilizeaza variabila ind, cu rol de indicator. Aveasta variabila se intializeaza cu valoarea 0 inaintea unui cielu eare compari perechile succesive de clemente ale Vectorului, elemental curent gi unnatorul. Pentru parcurgerea vectorului se foloseste un ciclu. for care evolueazi de la 0 pand la penultimal element (altima comparajic se face inte penultimul gi ultimul element). Dacd o pereche de elemente suecesive este in ordinea doriti se trece la ‘compararea urmitoarei perechi. Daca o pereche de clemente nu se afld in ordinea dorita se schimbe intre ele gi variabilei ind. i se atribuie valoarea 1, Parcungerea ciclului se reia pand cand toate elementele sunt in ordinea dorit, respectiv pind cind ind {gi pistreazi valoarea 0 dupi parcurgerea intregului vector, Accasta este metoda de ordonare / sortare ,bubble-sort”. ~ Pentru interschimbarea elementelor care nu se fla in ordinca doriti se utilizeazd variabila temporeri tmp. 27 ‘Scrieti un program care citeste 0 matrice de maxim 10 x 10 clemente intregi, impreund cu dimensiunile sale fective (linii respectiv coloane) si afigeazi atit matricea iniialé eit si matricea avand coloanele pare interschimbate cu coloanele impare (interschimbarea afecteaza coloanele aliturate, 0-1. 2-3 ete), ‘include Hinclude int main() int AIO] (20), m, my 4, 3, tmps printf ("Introduceti nr. de Lint: "); scant ("id") 6m)? printf ("Introduceti ar. de coloane: scant ("Sd", én)? for(i = 07 i < mz ish fort} = 07 4 < nz 344) ¢ printf("attal [td] =") 3, iy scant ("td", 6402] (31) ) printf ("\nMatricea citita este:\n")s for(i = 07 4 < my 44) for(i = 0 3 < ns 344) printe("td\es, ATA)(311 DeintE("\n") D for(j = 07 3 < im / 2) * 2; 3 42 2) for(L = 7 4 < mit) tmp = ANT: ACES] = ALL G3e11y AULD (G42] = temps ' printf ("\nMatricea avand coloanele interschimbate este:\n") : for(i = 0; 1 < mts) | for() = 0; J < my 344) printe(msd\er, af) (5107 printe(*\n"); , system ("PAUSE") ; return 0; B_Programui va afiga pe ecran dupi compilare gi executie: Introduceti nr. de linii: 2 Introduceti nr. de coloane: 2 ALOI(o} = 2 A(O}(1) = 2 ALO] = 3 AG = 4 Matricea citita este: 1 2 3 4 Matricea avand coloanele interschinbate este: 2 1 4 a acti se introduce o alti matrice rezultatul va fit Introduceti nr. de lini: 3 Introduceti nr. de coloane: § a(o} (0) = 2 ao} {1} = 2 a(o}(2) = 3 AO}E3] = 4 ALOIIA] = 5 Att} [0] = 6 At) = 7 AILIE2] = 8 AE] = 9 Aray(4] = 10 a(2}o} = aa AZ}() = a2 Al2i(21 = 13 Ri2\[3] = 1a A(2)4] = 15 Natricea citita este: i 2 3 4 6 3 a 3 10 a 12 13 a4 15 Matricea avand coloanele interschimbate este: 2 1 4 3 5 7 6 3 8 io 2 1 ia 13 15 ™_ Discutie: ~ Atenyie: dacd textul probleme’ nu specifica in mod explicit cl avem de a face cu o matrice patra, matrices preluerati poate avea numarul de lini diferit de cel de eoloane! Citirea elementelor matricei 4 se face cu ajutoral a dous cicluri fox imbricate: prima din ele, care wilizeaza contorul i, parcurge linille matricei: a doua, ce utilizeaza contorul j, parcurge coloanele matricei A: Reprezentarea Sugestiva a parcurgerii matricei in acest cuz este prezentati in Figura 6.a. Parcurgerea unei matrie se poate face, in ‘general, uliizind s1 parcurgetea pe coloane gi apoi pe lini ea in Figura 6.b. Af} [01 Ao] (1) ALO] (01 AO} (1) 110 At} {0 alia arifor Lgfaiai | ay {2110} mai} gy Interschimbarca coloanclor pare cu cele impare se face utiizind a doua modalitate de parcurgere a matrice Cu exceptia cazului cand m este impar, toate coloanele 7 se interschimbi cu coloanele +1 utlizind o variabila temporari tmp pentru fiecare element ATi] [31 Serie un program care citeste dela tastturt 0 mavice pitti de dimensiune maxims 10 * 10 elemente reale impreuna eu dimensiunea sa efectva yi detennind si afgeazt suma clementclor de pe diagonala principal ide pe diazonala socundar Hinclude Bnelude 10); ~ Apoi se afigeazii matricea cititd pentru a verifica datele introduse, © Se caleuleazi si se afigeazi suma elementelor de pe diagonala principal, Aceste elemente au acclasi indice Pentru lini si eoloane, ~ Se caleulea7i si se afigeaza suma elementelor de pe dingonala secundari. Aceste elemente au indicele coloanei cal cu ,dimensiunea ~ indicele rindului ~ 1”. In expresia anterioari trebuie si seidem 1 pentru cd in C numaritoarea inoope de fa 01 Serieti un program care citeste doud siruri de maximum 100 de caractere de la tatatur’, concateneazi al doilea sir de caractere la primul gi afigeaza rezultatul Hinclude Hanclude int maing) [ char s1[201], ¢2(2011; ine iy 37 30 i=g= 07 printé("Introducets sirvl 1s” Scant ("ts", 81}; printf ("Introduceti sirul 2: " scant (ts, 32); while (s1(i] = NULL) /* atribuie de la capatul sireiyi acterele din s2 cat timp mai sunt caractere in 52 */ while (#213] = NULL ( sLtal ~ 820317 See 3 siti] = NULL PEint#("Ss\n", 51); system ("PAUSE"); return 0: daca se introduc de la tastatura sirurile "aaa" respectiv "bbb" programul va rula astfel: Introduceti sirel 1: aaa Introduceti sirel 2: bbb aaabbb Discutis ~ Cole dows siruri de caractere, 51 si 62, sunt cite eu ajutorul functiei scans () ~ Primul ciclu white parcurge six pani la capit prin detectarea condifiei $1 {i} ~~ NULL. Din acel ‘moment caructerele din al doilea gir se adaugd fn contiouare in primul sir cu al doilea cicly while. AI doilea cielu while se putea serie condensat astfel: while ( (1 (i+4] = s2(J+#1) = NULL); Se remared utilizarea operatorului de post inerementare. Cat timp reaultatul atribuirit S1(i] = s2{5] au este NULL, adic sir2 nu sa terminat, se inerementeaz i, apoi se incrementeazi j. Compul instructiunii while ccontine o instructiune vida intrucit atribuirile sunt realizate direct in condita instructiunii ~ Laiesirea din al doilea cielu wii Le, pentru a marca sfargitul siului concatenat, se atribuie s1 [1] = NULL. Problema se poate rezolva gi spelind funetia standard strcat () astfel Hinclode Hnelude Hnelade int maing { char s1{202], s2(10117 print (*Introducets sirul 2: Scant ("%9", $2) streat (s1,'52)7 printe(mts\n", si): system ("PAUSE"): return 0; Scrie{i un program care citeste un si de maximum 100 de earactere de la tastaturl si apoi citeste ined un ccaracter separat, care se va elimina din girl de caractere ducd el exist in gir Programul va afia eezultatul, Hnclude Hinclude int maing ( char sir(1011, ¢ int iy dt printé(*introduceti sirul de caractere\n"); Printf(*apoi caracterul ce se doreste eliminat "); u printf (*separat prin spatiw\n"); scant (8s 4c", sir, 66); for(i = 3 = 0; sirfi) t= MULL; s44) iftsirtil to} sirlite] = sicfid; sir(3] © NOLL: printf("ts\n", sir); system ("PAUSE") 7 return 0; A baci se introduc de la tastaturd sirul “ora” respectivcaracterul ‘0 ', programul va rua astel: Introduceti girul de caractere apoi caracterul ce se doreste eliminat separat prin spativ ®_ Discutic: ~ Ciclul fox parcurge yirul de caractere, sr. Céttimp mu s-aatnssfryta srului adied sir [i] 1= NULL, se teseazA dacd elemental curent este diferit de earaterl ce se dotese climinat, sir (i} != c, si dacd a atunct clementul curent din gir se pistreazi pe pozitia curentk prin atbuirea sir (j+#] = sir(4), echivalent eu seovenja: six[j] = six[i]; j++7 (4 se incrementeazd pentru a pregiti urmétoarea iteraie). Dacd elemental ccurent este identic eu earacterul ce se doreste climinat, atunei atribuirea anterioard nu are loc, astfel cd in urmsitoarele itcrati, six [J], care este umitorul clement din six, va fi suprascris ew primul earacter difert dec intilit in ~ Devemarcat atribuirea sir(] ~ NULL care marcheazi sfaryitul de gir, Serif un program cae citeste un sir de maximum 100 de caracere dela astatur afer acest stn Hinctude nelude int mein { char sir(io1i; int i= 0: scant("¥s", sir); while(sir(i} != Nout) ubile (i >= 0) printe("se", sir(ilds ) system ("PAUSE") : return 0; BB Dacca de la tastaturd se introduce girl "abcd", programul va rula astfel: abed deba 2 8. 9. 10. uu. 12. 13. 6.2. Probleme propuse Scrigfi un program care citeste de Ia tastaturd un vector de maximum 50 de numere intregi si determin murniral ‘elementelor impare ale vectorului Scriefi un program care citeste de la tastaur doi vectori de maximum 100 de clemente intregi (aumiral ‘elementelor poate fi difert) apoi determina $afiseaz8 intersectia celor doi vector (adicd elementele comune celor «doi vector). Scriefi un program care citeste de la tastaturi un vector de maximum 20 de elemente intregi gi :nterschimba ‘elementele de pe poziii pare cu cele de pe pozitileimpare, Scriofi un program care citeste de Ia tastaturi un vector de maximum 30 de elemente intregi si sorteazit in ordine creseatoare doar elementele de pe poritile impare Scriofi un program care citeste de la tastaturd un vector de maximum 15 elemente intregi si insereaza un element pe o pozitc k. Precizare: se vor citi de la tastaturé vectorul impreund cu dimensiunea sa efectiva, elemental ce se ddoreste inserat precum si pozitia unde se doresteinserat elemental. Scrieti un program care citeste de la tastaturl o matrice pitrati de dimensiuni maxime 10 x 10 elemente reale, afigeazi matricea wanspusi si apoi calculeazii suma elementelor matricei Scriofi un program care citeste de la tastaturi o matrice de dimensiuni maxime 10 * 10 elemente intregi apoi determina si afigeaza clementele maxime de pe Giecare line, Scrioti un program care citeyte de la tastaturd o matrice patrata de dimensiuni maxime 100 « 100 elemente reale poi calculeazi suma elementelor de sub si de deasupra diagonalei principale. ‘Scrifi un program care citeste de la tastatur doull matrice 4 si B (de dimensiuni maxime 10 X 10 elemente reale) poi calculeaza produsul lor. Precizare: programul va semnala cazul in care cele doua matrie nu se pot inal. Scrii un program care citeyle de la tastaturi dous suri de caractere (de maximum 51 de caractere fieeare) gi climind toate caracterele conginute inal doiea sir din prim si. Exemplu: irl = “abcdabed", sir2 ~ "ad" sitrebuie sirezulte "bebe". Scriei un program care citeste de la tastaturl dows siruri de caractere (de maximum I caractere fiecare) gi afigeazi pe ecran numavul de aparifi ale caraeterelor din primal sr fn cel deal doilea sir. Exemplu: girl = "abe", six2 = "aacde” sitwebuie sirezulte “a = 2, b= 0, c= 1" ‘Scri{i un program care citeste de la tastaturi dous sinuri de caractere (de maximum 41 de caractere fiecare) gi {determind de cate ori apare seeventa de caractere din al doilea sir n prim Bxemplu: girl = “abedabce", sir? = "ab" si programul trebuie si afigeze "Sirul ab apare de 2 ori" Scrigfi un program care citeste de la tastaturd doud siruri de caractere (de maximum 31 de caractere fiecare) gi transforma caracterele majuscule in minuscule si caracterele minuscule in majuscule. Exemplu: six ~ "abcdABc si programul trebuie si afigeze "ABCDabc™ 33 7. — Alte tipuri de date: structuri, uniuni, tipul enumerat 7.1. Probleme rezolvate Seriti un program care citeste datele pentru un grup de cel mul 10 persoane gi afiyea2l datcle citi. Preciziri: Pentru ficcare persoana se vor memora numele, prenumele si data naslerii. Datcle lecirci ppersoane va fi memorat su forma unei structuri. Data nasterii va fi toto structar care va avea edimpusile si, und ian Hinclude Finclude ine maing) ¢ struct data { int zi: char luna(12i; struct persoana | char mume (20); char prenvme (20); struct data datany Me struct persoana grupl10l; int i, a: do 1 printf ("Introduceti numarul de persoane: scanf("td", an)? J white Cin <0) 11 in > 20097 for(i = 07 4 = 3119); Pintf ("Wome Prenume an Lona 2i\ for(i = 07 1 < nz ite) Print#("I4s\t/t5\e/Sd\e/¥e\tied\el\n", grup[t].nune, arup(i}.prenune, grup{il -datan.an, grupli}.datan luna, grup] .datan.2!) printf("\n"; system (*PAUSE™) 7 return 0; Fed Programul va afiga roduceti munaril de persoane: 2 Nome Brenume An Luna 2: OPA Mariue 1980 Mai 22 Nume Prenune An Luna 2: DOTA Ioana 1981 Tunie 2 Nome Prenume An Luna Zi IPOPA [Marius 11980 jmai 122 (pura Jioana |1981 funie 12, 1 34 a — {in programul anterior se definese doul structuri: data si persoana, Structura persoana utilizeara un cimp datan care este de tipul struct data. ~ Variabila grup este un tablou de 10 elemente de tipul perscana. Primul ciel do - Wnile citeste numirul de persoane, n, care trebuie si fie un numar pozitv i mai mic doit 10, Deci corpul ciclului va fi executat pind cind n va fi in intervalul[1, 10}. Al doilea ciclu for citeste clement cu clement persoanele din variabila grup. De notat e& elementul grup[i] sre 3 edmpuri: primele dou (nume, prenume) sunt de tipul sir de earactere in timp ce al treilea este de tipul struct datan. Al treilea cimp are la rindul sau ei alte cimpuri: zi, luna si an, Deci pentru accesarea ‘acestor subedimpuri avem nevoie de operator.” aplicat de doudi ori asupra unei variable de tipul grup“) — Al treilea ciclu for afigeazi rezultatele citite de la tastaturd ca un tabel sub forma: | Nume | Prenume | An | Luna | Zi | iscuti , calculeaza si afigeaztsuma celor do Serieti un program care civeste dou numere complexe dela tasttu ‘oumere complexe. Precizare: Un numa complex sev memora sub forma unei stucturi eu edmmpurile real si imag. finclude Hinelude int main(void) ( typedef struct { ‘float real; float imag? } complex; complex a, b, sum: printf (*Introducets partea reala a primolui nr.: scant ("88", fa-real); printf ("Introduceti partea imaginara 4 primului nr, Scant ("3f", sainag) printf ("Introduceti partea reala celui de al doilea nr.: "); scant ("R£", §b.real) printf ("introdaceti partea imaginara celui de al printf (*doilea are: *); scant ("SE", Gb-imag); sum.real = a.real + b.real: sumsimag - acimag + b.imag? printf ("Suna celor dova nunere complexe este: ") printe(" 8.26 + (8.26) + i\n™, sumsreal, sum.imag) system ("PAUSE"); return 0; Program va afiga: BL Prog Introduceti partes reala a prinsini nr.: 1.2 Introdveeti partea imaginara a primului nrs: 1.0 Introduceti partea reala a celui de al doiiea ar.: ~0.2 Introdvceti partes imaginara a celui de al dotlea nr.: 0 Suma celor doua numere complexe este: 1.00 + (2.00) * i ® Discutie: Declarafia typedef introduce un tip utilizator cu numele complex. Structura are doua cimpuri: real si imag de tipul float. a, b si sum sunt cele rei variabile uilizate in eadrul programului, a si b se-citese dela statue’ iar rezaltatul sumei complexe se atribuie variabilei sum. Aceasti atibuire se poate face nurs uilizind ‘operatorul ,.” pentru a selecta individual efmpurile veal si imag. De notat ci atribuirea sum = a + b nueste posibili in C. Scricti un program care citeste si stocheaz dowd momente succesive de timp, ce reprezinta, de exemplu, ‘momentul la care a plecat un atlet si respectiv a sosit un atlet intro competitie. Programul va afia timpal seurs inte cele dowd momente. 35 Hinclude Finclude int main0) ( struct timp { int ora; /* ora */ int ming /* mimitol +/ int sec; /* secunda */ i struct timp start, stop int start_int, stop_snt; printf ("introduceti start: "); Scant ("Sd:td:td", cstart.ora, Sutart.min, gstart-secy; printé("Intraduceti stop: "); scant ("id:Sd:8d", sstop.ora, estop.min, éstop-sec); start_int - start.ora * 3600 + start.min * 60 + start.secr stop_Int ~ stop.ora * 3600 + stop.nin * 60 + stop.seci Printf("timp: td s\n", stop_int - start_int); system ("PAUSE") 7 return 0; BD Programut va afiga Introduceti start: 10:21:20 Introdueeti stop: 10:12:11 timp: 61s 2 Discute: = start i stop reprezinti doua variable care stocheazd ora, minutul si secunda in care a plecat respectiv 2 ‘erminat proba atletul. start_int si stop int reprezintl echivalentul in secunde al celor dows momente de timp. Relatia de caleul are in vedere faptul cd o ori are 3600 de seeunde iar un minut are 60 de secunde. Diferentadittre cele doud variabile, stop_int = start int, reprezinta echivalentul in secunde al timpului efectuat, Scrieti un program care determina spatiul de memorie ocupat de o struct. Hinclude Hinclude struct exeaplu | int *p: double di char str[803; bss Ant main | printf ("Structura exemplu are dimensionea: 8d octeti.*, sizeof(struct exenplu)); Printe (n\n); system (PAUSE) 7 return 0; BB Programut va afiga: Structura exenplu are dimensiunea: 96 acteti. Scrieti un program care codeazai yi decodea7d un intreg folosind uniuni prin inversarea ordinii octfilor care ‘compun numvrul intreg, Pentru valorle variablelor din program, se va afisa: 10 codat este: 167772160 167772160 decodat este: 10 36 Hinclude Hnclude int encode (int 4); int main() ( int a7 int Snr union coddecod [ char (41; 1 crypt; ensigned char chs Print # ("Intoduceti un nunar inte seanf("8d", ein)? /* codarea intregului +/ crypt nun = in ch = erypt.c{0); cerypt.c[0] = crypt erypt.e(3] = chy ch = crypt c(t], erypt.c(1] = erypt-e[2}; erypt.c[2) ~ chy i = crypt mum? 31 Printé("id codat este: d\n", ine is / decodarea intregului */ crypt num = 4; ch = erypt.e[017 erypt-cl0] = erypt.c{31; erypt.c13] = ch? ch = crypt c(i]; erypt.el1) = erypt.c[2}; erypt.c[2) ~ chi in = erypt.num? Printe ("td decodat este: $d", i, ims printe(™\a"); system ("PAUSt return 0; BI Progranmul va afisa pe eoran, dup compilare si executie: Inteduceti un munar intreg: 10 10 codat este: 167772160 167772160 decodat este: %® Discusie: Prin intermediul unei uniuni se pot aecesa octeiieare compun in numar ite, 10 Src un program care memoreari pe rnd, in aceayispafiu de memorie, un caracter, un num tex i un numa real dinclude Hnelude ant main(d { union { char c7 int iy Float fs er peinte In caracter: Se\n*, v.c)s vei = 65; Printf("Codul ASCII: d\n", wi); 37 printf ("Caracterul urmater: tc\n", u.c + 1); wef = ust + 0.14; Print (*Un float! 4.26\n", ut); Besa wid = 2, printf (*aria cercului de raza $d: 8.2f\n", wi, wf * ued * wd); system ("PAUSE™); return 07 B® Programul va afiga: Un caracter: A Coda ASCII: 65 Caracterul grmator: Dn Float? 65.14 Aria cercvlui de raza 2: 0.00 Discus: {in cada programului se dfinesco variailé avin pal union”. Variabila poate stea ta un moment dat un carat, un neg sa un num rel Primele dou lini dup declaarea variable atibuie variabili in eimpul © (adied vc) valourca "A Yariaila este apo pict estar speciicatoeu de format Le pent carters, ~ Urnitoarele te ini iustreaz ariirea valor 65, de data aceasta empului 4. fn acest punct al execu programulu, valoarea elmpului_c este distash Tipartea se va face ulizind specificatorl de font, aA toe lini ustreaa tndria caractrului asoiatcodului ASCILimedat unnitor.Inrweatcodul ASCII ue valosta 65 Go and aseiat carter"), programul va aga earasttul "Db" ‘Ummatorele 2 lini atribuie cdmpului £9 valoae egal cu vechea valoae a cimpul_ 4 (aie 65) ta care se aun 0.14. De remarcat faptul ca vechea Valoare, 65, se pierde numa dupa cea avut le abuiten, add ordinoa operailor se desfioars astfelincit se adund int 65 cu 0.14 31 apo! se attbuie lu uf valoatea 6814 Ie aest moment, iif perdevaloarea 65 Uline tet tn iastreaza calcul ari uns cere fnt-us mod greit. in primete dout lini atribucle w.£ = 3.14 adied numénal PI) si 1. "= 2 (acd raza cecil) au ea efeet modifcarea volonred lt PI stele rezuliatl fal este fn mod greyit atu! dect cl aeptatInrvct ovarabila de pul enumetat pose lua valor mak multe tipur fa dnp execu programulu i ucrl uuu’ tebuieavut gi ex la orice monneat de Sap ote gut Tipu date ce ata stot in varaba uniane 8 Reluati problema anterioard dar construiji si o metodi care vi permite si aflai informaie’ stocate, orice moment tipul Hnelude Hinclude Estat ibeh> int ming { struct | Ent tips union char cs float fs switch (tip) { case 0: printf("un caracter: Se\n", 2.0.07 break ease 1: printé ("Un intreg: d\n", 2.0.4); break; case 2: printf ("Un float: $€\n", 2.u.f)s break; default; printf ("Format necunoscut\ breaks ) systen("PAUS! return 0; B Prograumul va ats: un fleet: 3.141800 % Discutic: Acest program ilustreazi uilizarea unei uniuni, u, in cadrul unei structur, 2. Structura are un emp, tip, de tipul intreg. Valorile pe care le ia cimpul tip (de exemplu: 0 pentru caractere, | pentru intregi si 2 pentra real), pot fi ‘modificate la momentul aribuirii unui subedmp al uniunii, u. Asfel, in orice moment de timp se cunoaste tipul stocat {in cdmpul 1 dupa valorile cdmpului tip. ~ Instructiunea switen decide, funcjie de valoarea din cdmpul tip (0, 2, 2), cum trebuie afigatt variabila. 2 Scrieti un program care calculea7 media notelor objinute la probele de verficare (laborator, parfial gi examen) ale unei materi (zi, biologie si chimie) uilizind tipul enumerat. Hinclude Hinelude Hnelade Moat f(float x) | return (x * xx + ' int maing ( Float a, by intg, eps: int ny /* mumarul de subintervale */ int 47 printf ("introdueeti Linita de inceput a intervalulut: scant ("8E", 6a)? printf("Introduceti limita de sfarsit a intervalului Scant ("3E", ab): printf (*Introduceti numarnl de subintervale ")7 printf ("de diecretizare: ")7 Seanf("4d", én} eps = (b - a) / ng /* pasul integrarii +/ intg = f(a) * eps? /* prim! dreptunghi */ fori = i; i <=my it) intg t fla + iteps)’* epss Printé ("Valoarea integralei este %.3£\n", intg): system ("PAUSE"): return 07 1 Programut va afiga pe ecran, dup’ compilate si executi: Introduceti limita de inceput a intervalului: 0 Introducets limita de sfarsit a intervalolui: 2 Introduceti numarul de subintervale de discretizare! Valoarea integrale: esta 2.671 _Discutie: 21000 oy ” ~ Programul reprezinta implementarea direct a metodei dreptunghiurilor folositi la integrarea numeric a unei functi pe un interval dat. Caleulul valori funetit intr-un punct se face cu ajutorul functici £ (9; intervalului vor fi specificate de utilizator. Finclude Hinclude ant par(int k) if(k ¥ 2 == 0} return 1; else return 0; 1 int main) { int a, by printt(ta ="); scant ("sd", say; printr( = ")} scant("ba", 8b)? 4a Scriefi un program care afiyeaz numerele pare dintr-un interval [a, }] cu ajutorul unei functii. Limitele for(i = ap 4 <= by 44) if(par(i) = 1) printe ("Sd "iy7 print f("\n"); system ("PAUSE") ; return 0; FA Progranut va aia pecan, dup compile execute: 1 20 6 10 12 14 16 18 20 ™ Discutie ~ Parcurgerea intervalului se face in programmul principal. Pentru ficcare element din interval funefia pax () verificd daca acesta este par. Daca este par functia retumea7a 1, daca nu este par returned 0. Seret un prograin care cites un num natral ni cilculeaz i afgeaz factrialul numrlu n dfinit ail 1 pentru n= n-(n—D!, pentru n> 1 Calcul fatorialulu se va raliza eu ajutoral une functi recursive Hinclude nelude int factorial (int n) sem else return (n * factorial in ~ 1))+ 1 int main) { int i, 3, ky ne do print# ("introdueets ni" scant ("td", an): } while(n <1) k = factorial (n); printf("td! = Sd\n", ny ky systen ("PAUSE"); return 07 © Progratmul va afise pe ecran, dupa compilare si execute: Introduceti nz 12 128 = 479001600 %_Discutie: Programul verific valoarea introdusi deoarece 0 valoare eronati poate conduce la executarea la nesfargit a functiei factorial (),Funejia factorial () se auto-apeleaza pind cind se ajunge la factorial de 1. Serie un program care ctete dou mumere nature a gi s cleulesz si ager cel mai mare divizor comun, e:mmd.e al eelor doud numer. Cel mai mae divizor cmun se va calcula recast: a2 ja dack a cemmd.c(a,b)=Jemmdc(a,b-a) dack b> a emmd.c(a-bb) dackb Hnclude int cade (int a, int b) { if(a ~~ b) iffa > b} a = emmdc(a by bd sfta cmmdc(a, b ~ return a) ) ant main() int i, Jy ky a be scant ("8d", 6a); scant ("ed") 6b); k= enmdc (a,b) printe(msd™, i); DELDtE(*\a"} : systen ("PAUSE"); return 0; % Discutie: — Se remarei faptul ci fimetia_ cmmdc (} implementeazii exact definitia matematicd formulatt in enunf, Programal principal nu face decit si citeased cele dowd numere, si apeteze funetia cnmdc () gi si afigeze rezultatul Scie un program care citste un num yi stabileste i afgeaz act numirul este prim sav nu, Se va scrie siutliza 0 functe care verified daca un numa este prim. Hinelude Finclude int divizibit(int ny int i) { sein $i == 0) return 0; else return 1; , int mainQ? printf (*introduceti un numar natural: scanf ("8d") 8n}: eer while(i ie ==) Printe ("Este prim\n"); system ("PAUSE™); return 0; 4a BX Prograumut va afisa pe eoran, dupa compare gi executic: Introduceti un numar natural: 397 Bste prim _ Discutic: sok inte @ verifies dacd un numar,n, este prim se parcurge intervalul (I, n) i pentru fiecare numie din interval 8 verficd acd acesta este divizor al lui. Atunei eénd am gisit un divizorinscamni cd numrul mu este prim si esim Aeeiclul waite (devine n-+ 1). Funcia aivizibs1 verified daci contorl i eareparcurge intevalul divide pe, Daca il divide returneaza 0 jar dacd nu il divide returneazi 1 Seri un program eae cite dou numere nate ny ps calcueaz ew sjoral uni tie recursive valour enpresii. Valoacnexpresie va fait. Punta” eva defn a » [7 daca p=1 n nent" dack p>1 Hinclude Hinclude int potere(int ny int p) ( iftp = 1) return n: else | =n * poterein, p~ 1); ) int main() ( int a, dy ke my Be printf(*tntroduceti 2 nunere naturale: *) ; scant ("id", sn) scant ("td") kp) k= poterein, Bi Printe("td\n®, hk) system ("PAUSE 7 return 0; BA Program va afiga pe ecran, dupa compilare gi execute: Introduceti 2 nunere naturale: 2 16 65536 ®_Discutie: ~ Funetia putere implementeazi direct definitia propusl. Ea se poate serie mai compact astfel: int potere(int ny int p) { sftp t= n= n* puterein, p- 197 return nj Serieti un program care calculeazt media aritmeticé a elementelor unui vector cu ajutorul unei funeti Hinclude Hinclude float medie(int x, float e , int 2, int n} itt =n} e-3/ a return 5; 44 int maint) { int i, my v(10); Eloat’ 5," printf (rn ="); Seant("8d", $n} for(i = 17/4 Hnelode struct strp2 ( int iy double di 1 vari; void f(struct step? temp) int main { varl.i = 99; varia = 98.6; Fivarts systen ("Pause"): return 0; void f(struct step? temp) / printr(*Diferenta dintre cele 2 elenente printf ("ale structurii este: t1f\n", temp.d ~ temp.i); BD Programut va afiga pe ecran, dupa compilare gi exeoutic: Diferenta dintre cele 2 elenente ale structurii este: -0.400000 ce Pentru a face verficarea cera 5-0 definit 0 stucurd eu marca_stzp2 care are dou cdmpuri: 4 de tip integ sic de tip factonar eu precirie dubia In programul principal se stibuie valor celordova cdmpur le struturt siapoi se apoeazfunctia.£. Accatfanetiecalculeazi si aigeaza diferent dintre cele dou camp cutie 45 Serie un program care determin figs lungimea unui sr de maxim 200 de caratere eu ajutonul une fet Ainclude Finelude int Lungime (char sir(}) | for(i - 07 sirli) return i; Norn ate ' int maing char sir(201); printf (*rntroducets sinal dorits\n") ¢ getstain) Printf("Lungimea siruiui este de $d caractere\n", Lungime (sir) )7 system ("PAUS! return 0; Programa aaa pe sean, up compare execute: Introduceti sirvl dorit: Acesta este sirul o carui lungime 0 dori. Longimea sirulo! este de 42 caractere 7% Discutie ~ Cita srt de earactee se realizcar® apetind fanctia gets (). Aga cum am mai presizat ia Capitol 6, folosira aeseifuneti esc nerecomandstls, Penta ctrea sir de caacterefecomandmn uirarceinstnchniloc, fgets(sir, 201, stdin); Af(sirlstrien(Sir)=1] “= '\n!) sir(strien(sin) = or Cea de a doua instrucjiune elimina earacterul newline” din sir citit Functia Lungime (} _primeste ca parametns un vector de caractere. Lungimea sirului de caractere este doterminat prin oprirca ciclului for la iodlnirea caracterului_' \O". Se remared utilizarea instructiunit vide pentru eielul for. Functia Lungime () functioneazi similar eu funetia standard strlen () Scriefi un program care citeste de la tastaturd o matrice pitrati de dimensiune maximi 10> 10 elemente reale impreund cu dimensiunea sa efectivi si determina si afigeaza suma elementelor de pe diagonala principala si de pe diayonala secundari. Se vor serie si utiliza funetti separate pentru: citirer matrice Scrierea matricei, caleulul sumei de pe diagonala principala si calculul sumei de pe diagonala secundard Precizare: este vorba de reluarea probleme P6.6 dar cu uiilizatea unor fanefi Finclude Hinelude void citeste(float mat{) [10], int dim { ‘int iy 97 for(i = 97 4 < dim 144) fort) = 0; 4° dims jee) | printf("Introduceei mat (4d) (¥d)2 "3, 407 Seant("¥f", eat (31 [4))7 , float sumai (float mat (}{10], ine dim) int ty 3 float’ sum ~ 0; Forti = 0, < dim; int) mat (ilTil? , float suma2(float mat{] (101, ant aim ¢ int ty 34 Float’ sum ~ 0; for(i = 0; i < dim; itt) um b= mat fil fain return sum? 46 void tip_mat(float mat{][10}, int dim) | int i, ji printe(*\nmatricea introdusa este:\n\n"); for(i = 0: i < dim: it) 1 fort] = 0: 4 < dim: printe ("81 38\¢" yf mati] (i017 , print#("\9") > int main() float matrice[101[101; int dim; aot printf (*introduceti dimensiunea matricei patrate: scanf("8d", sdin}: } whide(aim <1 |} dim > 10)¢ citeste(mstrice, din); print (matrice, dim); print# (*\nSuna elementelor de pe diagonals principala"); printf (" este $1.3f\n", sumal (natrice, dim): printf (*\nSuna elenentélor de pe diagonala secundara printf (* este $1.3f\n", suma2(matrice, dim); system ("PAUSE"); return Oz EL rograrl wats pe eran, dup compile i exceuer Introduceti dinensivnea matrices patrate: @ Introduceti mat (0) (0): 2 Introduceti mat (0) [1]: 2 Introduceti mat [0] [2]: 3 Introdueet’ mat (0) [3]! 4 Introdueeti mat {1] [0]: 8 Introduceti mat {11 11 intreduceti mat [1] [2 Introduceti mat [1] (3 Introduceti mat [21 {0}: Introduceti mat (21 (1 Introdveeti mat (2) (2 Introdveet{ mat (2) (3)! 12 introdvceti mat[3] [0]: 13 Introduceti mat (3) (11: 14 Tntreduceti mat (3) [2]: 15 Introdveets mat(3) (3)! 16 Matricea introdusa este 1.000 2.000 3.000 4.000, 51000 6.000 7.000 8.000 91000 10.000 11.000 12.000 13.000 14.000 15,000 16-000 Suma elonentelor de pe diagonala principala este 34.000 Suma elementelor de pe diagonala secundara este 34.000 ~®_ Discutie: — Funefia citeste() realizeazi citirea efectiva a elementele matricei folosind proprictatea particular tablourilor de a putea fi modifieate intr-o functie astfel Inedt modificdrile sA fie permanente, Functia tip _mat () afigeazii matricea citi. Funciile sumai() si suma2 () ealeuleaz suma elementelor de pe diagonala principal si, respectiv, de pe diagonala secundara, Programul principal citeste dimensiunea efectivi a matricei si apelesza func definite anterior. 4 s 82. Probleme propuse Serie un program C care eiteste de la tastaturd un vector de maximum 10 numere inti impreund eu Finclode fdetine omax 10 void citmat (float mat {) {DIMMMx), int *dim): int main(vora) ( int dimef, i; Float mat [DINMAX) [DIMMAXT, sumdiag: citmat (mat, sdimefy ; sundiag ~ 0.0; for(i= 07 i < diets ity sundiag += mat(i} (217 printf ("Suma elenentelor de pe diagonala este: ¥£\n", somdiag) + system ("PAUSE"); return 0; void citmat (float mat{)(DIMMAX], int tim) { int 4, 32 do Printé("Introduceti dimensiunea efectiva (<-10): " scant ("8i", dim) J while (dim >"10-11 sim < oy; forli = 0; i < tdim t44) for() = 07 3 < Adim 344) 1 mat itd) (8d) =", 4, jhy €%, gmat (411319 © Programal va atisa pe cera Introduceti dimensiunea efectiva (<-10) ddupi compilare gi execute: 20 Introduceti dinensivnea efectiva (<-10) mat (0) (0] = 2 mat(0)(1] = 2 mat(1) [0] = 3 nat(1] {1} = 4 Sona elenentelor de pe diagonala este: §.009000 ®_Discutic: ‘Acest program pune in evidenta utilizarea pointerilor la transferul unei valori dintto functic. Al doitea parametry al funetiei ci tmat () este un pointer prin intermediul ciruia se transfera dimensiunea efectivi a metricel, P92) Screti un program care determin suma clementelor de pe diagonal unei matrice patrate formati in fnumere reale, Pentru citirea matrieei se va serie gi utiliza o functie care citeste matricea impreund cu dimensiunite sale efective. Precizare: desi problema pare identicd cu problema 9.1 nu este asa: de accastl data programul trebuie si poatprelucra matrce oricdt de mati Hinelude Hinelude float **eitmat (int tim int main(voia) int dimet, 13 Fost tat, sundiags 50 GE(1 (mat = citmat(edimet})) | printf ("Matrices nu se poate citi!\n"): system ("PAUSE"); retorn 1; 1 sundiag = 0.9; for(i = 07 i < dimefy i++) sundiag += mati) (Ir print# ("Suma elementelor de pe diagonala este: $£\n", sundiag) : system("PAUSE™); return 0; ’ float *eitmat (int dim) { int i, 37 Float’ * mat; printf ("tntroducets dimeneiunes efectiva: scant ("8i", dim: 7 Se aloca menorie pentru tabloul de pointer: care constituie matrices */ i£(1 nat = (float **)malloc(*dim * sizeof (float *)))) | printf("Matricea este prea mare! \n*); ' /* Se aloca menorie pentru fiecare linie a matricei */ for(i = 0; i < *dim ise) AE(L (mat [4] = (Float “)malloc(*dim * sizeof (float)))) ( printf ("Matricea este prea mare!\n"); return NUbi: , /* Se citesc elementele matricel */ for(i = 0: i < *dimy A44) for = 07 3 < tdim: 3+4) | printf ("mat [Sd] [84] =", i, $e scant ("S£", gmat (i) (1); d EX Prograimu! va afiga pe ecran, dupa compilare gi executic: Introduceti dimensiunea efectivar 2 mmat (0) (0) = 4 mat [0] [1] - 2 mat {11 [0} = 3 nat(1]{1) = 4 Suma elenentelor de pe diagonala este: 5.900000 Introduceti dimensiunea efectiva: 123456 Matricea este prea nare! Matricea nu se poate citi! ®_ Discutie: ~ Acest program pune in evident utlizarea poiterilor pentru alocarea dinamicd a nel mates. Se observe imatioea este declarati ca find de tip 10a ** adic de tip sponte la pointer. fn funetia eta () se aoc’ mai {nti un vector de pointer’ care repreinsé matrices propriu-ist gi spoi se aloo cite un pointer ete ficare rind din imatice. Se observi i procedind astelclementsle maticei se pot adresa exact ca atu end mutica a fost alocata static sl Serie un program care aya pe eern conn adresele a dou variate de tip inte, apo aibuie rsa unsa dine ele vou pointer ria agarea und pointer Hinclude Hinclude int maing) { int 4, kr /* declarare variabile de tip pointer */ int tpery $2; k= 2 /* ptr contine adresa 1a care este stocata variabila k */ per aks Brintf("\nj are valoarea Sd si este stocat la adresa 8") 3, Ed); Printf("\nk are valoarea td si este stocat 1a adresa $p", Ik. shy Print f("\nptr are valoarea tp si este stocat la adresa tp", ptr, éptr); Printf("\nValoarea int catre care arata pointerul este: ad*, sper) printe(*\n"); system (*PAUSEM) ; return 0; B_Programu! va afisa pe ecran, dupa compilare si executic: 3 are veloarea 1 si este stocat 1a adresa 0022°F6¢ k are valoarea 2 si este stocat la adresa 0022F69 Ptr are valoarea 0022FF68 si este stocat 1a adresa 0O22¢764 Valoarea int catre care arata pointerul este: 2 ®_Discntie: Programul pune in evidenti modul de utilizare a pointerilor. Se obser pointeruluitrebuie sii se atribuie o adresd valid. Dacd se omit instrucjiunea: insinte de a fi utiliza, ptr sk; afigarea va arta astfel: 3 are valoarea 1 si este stocat la adresa 0n22F6¢ X are valoarea 2 si este stocat 1a adresa 0022768 ptr are valoarea 004010C0 si este stocat 1a adresa 0022764 Valoarea int catre care arata pointerul este: 607409035, « recizam ci adresele afgate pot diferi de cele de mai sus in funetie de spatiul de momorie alocat programulu {de eitre sistemul de operare precum si faptul ed in varianta eronata este posibil ca programul si nu functioneze de loc Serie un program care construiste un vectors afigeaz atin tod obigmuit, its ulizind pointer Programul va afisa apoi adressle clementelor din vector gi valorle lor, Se vu Tnceca wr depts dimenstnior about Hinclude Hinclode int maing { int tablou] = (1, 23, 17, 4, -5, 10015 int “per? int iy ptr = établov(0]; /* sav ptr = tablons */ printé(*\n"); /* afisarea veetorului */ for(i = 07 4 < 6; it) 4 printf ("tabloufsd) = td", 4, tabloulil); printf ("\tptr + 8d = Sd\n, ‘4, eiptrei}): , BEAntECT\AM 2 [* Afisarea adreselor 1a care sunt stocate elenentele vectornle: */ for(i = 07 1 < 6; ny printf ("adresa pentru tablov[td}: d\n", i, ptrHid; printe("\n"); J+ Afigare cu depasirea spativlui vectorului */ for(i 0; ¢ <6; ist) [ printf("ptr + d= Sd\e", L, *iptreey); prince (*\n"): syaten ("PAUSE"); return 0; BL Prograrmut va afisa pe eeran, up compilare si execute: tabiou[o] ~ 1 ptr +0 tablou{1] pert tablout2] ptr +2 tablout 3] per +3 tabloula] = -5 ptr + 4 tablou!5] - 100 ptr + 5 adresa pentre tablou[0}: 2293576 adresa pentru tablou[i]: 2293580 adresa pentru tablou[2]: 2293584 adresa pentru tablou[3]: 2293588 adresa pentru tablou[4]: 2293592 adresa pentrs tablov(S]: 2293596 pir+0=1 per} 1= 23 per }2-17 pir + 3-4 pir t a= -5 ptr +5 = 100 per + 6 = 2293664 Discutic: Prima instructiune atribuie pointerului ptr adresa primului element din vectorul tabLou, Aga cum se arat sin comentariu, aceastlinstructiune se poate serie si: ptr = tablou; Observatie: Precizim ci un tablou nu este un vector. Din acest motiy atribuirea =e a fu este coreet ~ Primul cielu for afigeaza valorile memorate fn vector utlizand atit direct veetorul eit si pointer = Cel de al doilea ciclu afigeaziadresele de memorie la care sunt stocate elementele yestorului, Se observa cl elementele vectorului sunt memorate in locapii socesive de memorie. = In cel de al treilea ciclu se repetd afigarea, dar se depigeste dimensiunea vectorului. Asa cum se observa din rezultatul ruliriiprogramului,timbajul C nu verifica depasirea dimensiunii vectorului. In acest mod programul ruleazi ‘mult mai repede dar programatorul trebuie si lie foarte atent pentru a nu comite astel de greseli. Serio un program care concateneai dou sirri de caratere(srnguri) st A si stB, reall ind Finclude Finclude 33 Snt maing 4 char stra (eo) char strB(e0) char strc[#0) = “ccc char aux(801; /* Declara pointeri catre tipul caracter */ char *pA, *ph, *pauxy int iy J+ Afiseaza stringul stra */ Printe("stra = 'Sa"\n", stra); /* Pointerul pA va contine adresa stringulu: strA */ PA = strar Printf(*Adresa stringului stra: Sp\n%, &pA); /* eointeru? pB va contine adresa stringului strB */ B= strBy Print ("str = 's'\n", pp); /* avanseza pana la sfareitul lui strB */ while (spp != '\07) “ppt 7? Concateneaze str® cu stra */ while (pa != *\0") sppet = pases /* Adauga caractercl NULL care matcheza sfarsitul stringului */ pe = "ors /* nfiseaza rezultatul concatenarii */ printf (*Concatenare stringuri: "#s'\n\n", strB); /* imocuire ‘et cu tece! */ printf ("inlocuire te! op 'eCe'\n") print (” An"); /* pB arate din nou catre inceputul stringului stra */ PB strBs Y* cauta primo) caracter ‘ct +/ while(CpB I= "\0") 6& [Ap f= tet) Bers /* Copiaza caracterele de dupa Litera ‘et intr-un string auxiliar. Mei intai verifies faptul ca sa gasit Litera tor 4/ SEGpa = tery PB; /* Avanseaza la caracterul de dupa te! +/ paux = aux; (void) strepy (paux, pb) pB--7 /* Aduce inapoi la adresa lui ‘ct +/ } /* Copiaza strc in locul unde era litera tet */ (void) strepy (pe, strc) printf ("oul stra: "Ss"\n", etre); 7* Rdavga sirl de caractere salvat */ (void) streat (PB, pavx) 7 printf ("String final? 's"\n", etre); system PAUSE" return 07 A Programut va afiga pe ecran, dupa compilare si executie strA = 'Sir de caractere denonstrativ! Adresa stringului stra: 00228024 stre = 'SIR2" Concatenare stringuri: ‘SIR2S5ir de caractere denonstrativ' Imlocuire *e? cu tec! Noul strB: 'SIR2Sir de ccc" String final: 'SIR2Sir de CcCaractere denonstrativ' 54 ®_ Discutie: Modul fn care se realizeazt concatenarea este similar codului din funefia stndard strcat (). Accasti sectiune se poate rescrie intr-un mod mai compact astel: /* avanseza pana la sfarsitul loi stra */ wbile(sppes = 1\0") 7 xdoce imapoi la earacterel NULL */ BB 7+ Copiaza strA in str® inclusiy earacteral NULL +/ while ((spBte = spate) f= NO: = Pentru inlocuirea caracterului ‘mai intdi acesta este localizat. Apoi se salveazi restul srului de earactere ‘care urmea7a dupi acesta gi ve compune noul sir de caractere prin douil operait succesive de concatenate, Seriji un program care, prin dovi fimotit distinct, verifick egalitates alfbeticd sau numeric a argumentclor,flosind pointer. Aigarea se va face utiliza fumetia standard puts () i etirca se va face cw fgets () Hinclude Hnelede Hinclude void vers fica(char *a, char *b, Ent (*emp] (const char *, const char *))7 char *a, const char *b)} Ant comparanun (con ant maingy | ‘char s1(80), 52801; pots ("Introduceti primi argument"); Fgets(si, 80, stdin); if(si{strien{(si)-1) “= ‘n'y si(stelen(st)-2] = "\ory puts ("mntroduceti al doilea argument:") Fgets(s2, 80, stdin): Af{s2[strlen(s2)-2] “= '\n') s2{stelen(s2)-1) = "ors /* Paranetris functiei apelate sunt 2 pointeri de tip caracter */ ig (isalpha(*siy) ( puts ("Arguuente de tip caracter\n"); 7* vtilizeaza functia standard strom */ verifica(si, 82, stremp); ) else ( puts (*Argumente de tip numeric\n"); Ys Utitizeaza fonctia comparanum */ verifica(si, 52, comparanum); pats (™\n") system("PAUSE™); return 0; 1 void verifica(char a, char tb, int emp} (const char *, const char *)) | /* utilizeaza printf pentru a lasa cersorul pe aceeasi Linie */ printe(*Verificarea egalitats: /* (emp) (a,bhapeleaza functia de comparare @ carei adresa se afla in cmp cu argumentele a eb */ if (! (*emp) (a,b) puts ("Argunentele sunt egals else puts ("Argumentele nu sunt egale"); ) int comparanun{const char *a, const char *b) { (Patol (x) converteste stringul cate care arata pointerul x Intr-un nunar intreg (atol = ASCT: Eo int) */ iftatoi (a) == atos (b)) return else return 1; 55 EL Progaml va ats pe ecran, dup compare exces Introdveeti prinol argument: aa Tntroduceti al dottea argument wee Argonente de tip caracter Verificarea egal it: Argumentele nu sunt egale ~®_ Diseu! ~ Pentru verificarea tipului de valori citte se foloseste functia standard isalpha() care retumeari addevirat” daca sirul de caractere este de tip alfanumeric (cuprinde si litere) sau yfals” daca este format doar din cite. Cel de al treifea argument al funcfiei veri fica () este un pointer citre o functie. Funcfia veri fica () apcleaza functia de verificare a egalitti prin intermedial pointeruli a functie. Serie un program care incared valor intr-o structuri folosind un pointer etre aceasta Binelude Hinclude Hinclude struct strpoint | char str(#0}; bs, tp /+'$ este variabila de tip structura si Pun pointer catre o astfel de structure */ int main() 1 P= 6s: /* pointerul arata catre adresa de inceput a structurii +/ s.i- 10; /* incarcare abisnuita */ p->i = 10; /* incarcare folosind pointerui */ strepy(p-ostr, "tablou unidamengional de caractere™); printé("td Sd ts", s.i, pos, pated; Brant (*\n")7 system ("PAUSE") return 0; B_Programul va afisa pe ceran, dupa compilare si executie 10 10 tablou unidinensional de caractere ww Discus ~ Programul pune tn evident utilizarea operatorului >: Serie un program cae schimiba inte ele dou lini ale une matrice de dimensiuni 3% 3 elemente eal gi poi le schimbii la loc. Se vor defini si utiliza funeidiferite pentru citirea unk pprecum si pentru schimbarea intre ele a linilor. ‘matrice, afigarea unei matrice Hinclude Hinclude void citeste(fioat matl](3}) ( int i, 35 for(i = 0; 4 <3; AHH for(] ~ 0: J < 37 944) 1 Tntroducets elem, mat{Sal [ta] £", gmat (4) (5) printé ede De scant (" 56 void afiseaza(float mat(][3}) [ > ant iy 37 for(i = 07 4 <3; dey fort j= 0; 4 <3; GH) printe (ms e\e", mat (il (419+ printe("\a"): void schimbal (float mat(] [3], int 4, int 3) ( ) int ke float temps for(k = 07 k <3; RH) temp - + (mat {i} + kis somat{i) +k) = ttmattz) + +onatty) +k) = temps void schinba2(Float matt] {3}, ant i, int 3) | 1 Float temp; for(k = 07 k< 37 K+) | temp = #(t(mat +i) + kr s(r(mat + i) +k) = 2Cttmat +3) + bbe *(e(mat + 3) +k) = temps int main (void) [ int 3,43 Float’ {3} (317 eiteste im; BENEE ("etAnvssGnsedShenseneuedansdanensansannnenaneeea\ne) | Print f(*Inainte de inversarea liniilor\n"); afiseaza(n) PEIntE ("HAatosannaddanensnanensanaceneesagusenseanersea\ne) | printf ("Introduceti indicele primei linii (<3): * ‘scant ("ed", 63) 7 while < 211 4 >= 3) ¢ printf (bate incorecte\n") + printt("Introduceti indicele prime: Linit (<3)! "Vy scant ("sd", Sid; ) printf ("Introduceti indicele celei de a doua Linii (<3): ")r scant ("sd") 6317 wnile(s < 0.114 >= 3) 4 printf ("Date incorecte\n*); print#( sIntroduceti indicele celed de a dova Linss (3): "7 scant ("sd") 65)3 ' print (-t+8astersevanevereaneverscennyacaanenseaneesea\nn) ) printf (*Liniile inversate\n") schimbai(m, i, 3) atiseaza(n): BEAnEE(rAAHesansabennenensanaaenaasnnennenanenenaneeena\nn) Peinte(*Liniile inversate din nou\n") 7 Schinba2(m i, 317 atioeaza (mz system ("Pause"): return 0: st BA Prograunul va afiga pe eeran, dup compitare si exccutie: Introduceti elem. mat (0) (0): Introduceti elem: mat{0i [11 introduces elem. mat (01 [2]: Introduceti elem: mat [1] [0]; Introducet{ elem. mat {1} {1} Introduceti elem. mat (11 (2) Introduceti stem, mat (2) (0): Introdueeti elem. mat (21 {1} Introdvceti elem. mat [2] 12) Inainte de inversarea liniilor 1000000" 2.000000 3.000008, @ooa0a0 5:a00000 6:000000, 7000000 8 000000, 9: 000000, Introduceti indicele prinei lini (<3)? 0 Introduceti indicele celei de a doua Linti (<3): 2 Liniile inversate 4.000000) 5-oonoa9 6.000000, 1009000 2.900000 3.000050, 72000000 8000000, 3000000 Linitle inversate din now Y 000060 $.eo0000 3.000000 4000000 5S onoaoe :bo0000 Tec0000 8 onea00 $!000009 ® Discutie 4 Schimbarea fate cle alintilor matrcei se face uilizind doua funcliidiferite. Functia schimbal () pune in evident faptul ci in limbajul C/o matrice bidimensionall este o matrice unidimensional formadi din matriee uunigimensionale. Funcfia schimba2 () utilizewzd pointerii pentru accesul la valorile din matte, Serie wn program care cauté un subsir fntam sr de caractre. Programl va aga pavijia subir in gr sau un mesa de eroare dac sural mua fost gsi Hinclude Hinclude Sot cauta(char *sirl, char *eir2) | char *p, *q, "temps for(p ='sirt; *p I= "\0'; pee) [ for(g = sir2, temp = pr sqil= 0" ge temp {= '\0" 6& “temp Ge, cempe sy; if(g = *\0") return p ~ sirty ) int main (void) char sir 1200], six2(2001; int poz: printf ("Introduceti prima! sir\n"); fgets (sirl, 200, stdin) S€(sirl fsthien(siri)-1) —= "\n") sirl[strien(siri)-1] = "0"; printf ("rntroduceti sirul al doilea\n")s Egets(sir2, 209, stdin}; if(sira{strten(6ir2)-1) == "\nt) Sir2[strien(sir2)~1) = '\o" poz = cauta(sirl, sir2); Eftpor 1= 1) Printé(*Sirul *$5" se gaseste in "Sst la pozitia td\n", Sir2, sil, por)? else printf("Sirul '8s" nu se gageste an ‘4e!\n", sir2, ivi}; system ("PAUSE") ; return 0: 58 BL Prograunul va afiya pe ecran, dup compilare gi exeeute: Introdueetiprinul sir Unw dot exes! Introduceti sirul al doilea dos Sirvl "doi" se gaseste in 'Unu doi trei! 1a pozitia 4 Introducetii primo! sir Unu doi tres Introduceti sirul al doilea pateu Sirul 'patrut nu se gaseste in 'uny doi trei! w Discutie: ‘Se remareit’ modul in care se face ciutarea cu ajutoral a doui cicluri cu contor. Cielul cu eontor exterior vansea7i pozitia de ciutare in sirul in care se cauta. Cel de a doilea ciclu realizeazi cautarea propriy-7isi. Mai inti, la initializarea cielului, se aduc cei doi pointer, la inceputul celor doui giruri de caractere. Cautarea continu ct timp mai ‘exist caractere in cele dou sirur si caracterele din cele doui giruri sunt identice. Daci Ia icsirea din ciclu intern s-au ‘epuizat caracterele din siral cdutat inseamna ca sirul a fost gisit. Pozifia se determina prin diferenga dintre pointerul care indica inceputul sirulu in care se cautl si pointerul care indica inceputul subsirului gist Serie wn program eae citetedmensiaea exact @ unui vector de numere fares conse, cite 9 Mien acs vector include Hinclode int main(void) | int dim, i7 int *vector; do printf ("Introduceti dinengiunea veetorului Scane("8d", dim) 7 ) while(din <= d)7 if (1 (vector = (int *)malloc(dim * sizeof tint)? | printf ("Dimensiunea Sd este prea nare!\n", dim); Printf("Vectorul nu are loc in menorie!\n"; system ("PAUSE") + return 17 , printf ("Ci tire\n"); for(i = 07 4 © dim; is4) 1 printf ("vector {8a} =") ip; Scanf("Md", vector + i}; > print Forti criere\n") ii < dis printt ("ve iat or{td) = S4\n", tivector + 210; free (vector): system ("PAUSE"); return Programa! va afiga pe ecran, dup compilare gi executie: Introduceti dimensivnea vectorvlui: 3 citire vector [0) = vector |] vector {2} = Seriere vectorfo] - 1 vector (1) vector(2] = 3 59 Introduceti dimensiunea vectorului: 1867311664 Dinensiunea 1567311664 este prea mare! Vectorul nu are loc in menarie! % Discutie: Programul aloca spatiul de memorie necesar stocarii vectorului, Se verified faptul c& spatial de memorie a putut fi alocat. Daci alocarea ejueazi, executia programului se intrerupe. Dupa cite $i soriere spatiul de memarie alocat este eliberat, Seri un program care stele, soreazé gi affgeard un vector de irri de cartctereimplementind 0 proceduri de tip bubhle-sort si comparing pointeri alaturai Hinelude Hinclude void sort (char *p{), int ne) ( char *tenp; int i, 3, ke for(k = 0; k 0) 1 temp = pli) pti) - ptsls pti] = temp: , int maint char *p{] = ("Gabi") “webe", "Alina", "Claudia", andres"); printf (*Sirurile nesortate sunt:\n"); for(i = 0; 5 < 6: i++) printf("te\n", pt3I) sort (p, 6) printf(*\nSirveile sortate sunt s\n"); for = system ("PaUs! return 0; © Programul va afisa pe ecran, dupi compile si exeeutic: Sirurile nesortate sunt: Gabi Bebe Alina Claudia catalina andres ane Sirurile sortate sunt: Alina ana andres Bebe caratin Claudia 60 "catalin, W_ Discutie: ~ Prin utlizares pointerilor cate sirurile de caractere sunt modificate adresele cite care indied pointerii si nu sunt mutate sirurile de caractere propriu-zise. Efectul riméine cel dorit, dar este objinut cu un efort de caleul mult mai 9.2. Probleme propuse |. Scrieti un program care determina de cite ori un subgir de caractere se regiseste intr-un alt sir de caractere, Indicaje: se va generaliza solutia de la problema 9.9. 2. Sctiefi un program care citestetrei variabile a, b yi i apoi le roteste inte cle astiel: a -> b, b> € si ‘3. Sori’ un program eure citeste si sorteaza in ordinea ascendenti dath de cuvant_cheie un vector format din inregistrti definite ast: eypeder struct char cuvant_cheie{ 10]; int alte dates ) ineegistraras Pentru ordonare / sortare se va utiliza funetia sort () disponibili in bibliotecile standard C si declarati in stdlib.., Indicaje: functia qsort (). este declarathastet: void qsort (void *base, int nmenb, int size, int (*compar) (const void *eleml, const void *elem2)); unde: = base este adresa de inceput a vectorului: = nmemb reprezinti numirul de clemente din vector; — size este dimensiunea in oetetia unui element din vector si ~ compar este un pointer citre 0 funesie definiti de utilizator care realizeaz comparafia intre dowd clemente ale vectorului, eiem1 si elem2, retumind o valoare fntreagi mai mick decit, egali cu, sau mai imsre decit zero dupa cum eLem1 este mai mic, egal cu, sau mai mare decat elem2, (© metoda de sortare presupune adaugarea valorilor dintr-un vector una ete una intr-un veetor nou. Prima valoare este adugata la inceputul vectorului. Valorle urmatoare sunt adugate in poritia corespunzitoare ordiai sale prin eplasarea datclor adugate deja pentru a face loc valorii care se adaugi. Aceasti metodi poarti numele de _sortare prin inserare” (.insertion sort”. Seriefi o funefie denumiti insort () care realizeazi astfel sortarea gi se comport in acelasi mod precum funcjia qsort () descrisi in problema anterioarl. Functia incor () va ‘avea prototipul: void ingort (void *base, int men, int size, int (*compar) (const void *eleml, const vosd *elen2))7 Prototipul este similar cu al functiei qsort () realizind sortarea unui vector cu adresa de ineeput indicati de base, format din nmemip clemente de tip arbitrar gi de dimensiune size si care sunt comparate de functia compar (). Scret si programul principal care testeazi funeta Scriofi o functie care primeste ca argument un sir de caractere gi returneazii un pointer citre primul caracter care nu ‘este spat din acest gir de caraetere Preciziri: 4, Sevor considera spati caracterele * b. Prototipul functiei este: char *prinol_caracter (char *sir}; space”) $1 "Vt" (fab). ¢.Scriei si programul principal care testea7 functia, 6, Scriefiun program care citeste un text, il desparte in cuvinte si afigeazi cuvintele textului ordonatealfubetic, 7. Stiefi un program care citeste un text si afigeaza doar ultimele 5 lini ale textuli 61 8 ie RD Scrieti um program care parcurge lista defini mai jos cu ajutorul pointerului p_1ista si afigear numirul si umele, define wax 4 struct lista ( int munary char nume{10]; Paatatwaxy = ( 1, “ton, 2, "asiles, 3, "Gheorghe, 4) owaria™ struct lista *p_listay Serieji un program care citeste o expresie matematicd simpli formati din doi operanzi numeric si un operator (+, ~ +, /) 31 determing si afigeazi valoarea expresiei. Un exemplu de rulare a programului va aria astel Introduceti expresia: asa Sericti un program care citeste de la tastaturi 0 matrice de numere reale de dimensiuni maxime 10.x 10, impreund cu dimensiunile sale efeetive si determina cétul impartrii modulului sumei numerelor negative din mattice la suma numerclor pozitive din matrice. Programul va semnala cazul special al implrtri prin zero, Pentru calculul ‘sumelor se va folosio functie eu urmatorul prototip: void suma(float AI1T10], int n, int m, float *pos, float *neg)s unde: ALI (10) este matricea de lueru; am sunt dimensiunile efective ale matriceis pos ssuma numerelor pozitive; neg, suima numerelor negative. Reluati problema anterioara 3i serieti un program care citeste de la tastaturi @ matrice de numere reale de orice imensiuni, impreund cu dimensiunile sale efective si determina citul impietirii modulului sumet numerelor 'egative din matrice la suma numerclor poritive din matrice. Programul va semala eazul special al imparts prin zero, Peotru calcul sumelor se va folosio funesie ew umtoral prototip: void suma(float **A, int n, int m float *pos, float *neg); unde: a este matricea de lueru; nym sunt dimensiunile efective ale matticei; pos ‘suina numerelor pozitive; neg ssumna numerelor negative, Scriefi un program care citeste de la tastaturd'o matrice de numere reale de dimensiuni maxime 10 x 10, imprest ‘cu dimensiunile sale efective si determing cétul impartirii modulului produsului clementelor de pe disgonala principalé a matricei a produsul elementelor de pe diagonala secundara a matrice. Programul va semnala eazul special al impirtiii prin zero. Pentru calculul sumelor se va folosi o funetie cu urmatorul prototip void prod_diag(float AI][10], int n, float *dprin, float *dsech; unde: ALJ(10] este matricea de lueru; a este dimensiunea efectiva a matrices aprin produsul elementelor de pe diagonala principal dsec produsul elementelor de pe diagonala secundara Scriefi o functie care primeste ca parametru un numar intreg si rotumneazi un pointer citre numele lunit calendaristice corespunzatoare. Dacé numirul nu reprezinta o lund, este mai mic decit I sau mai mare decat 12, functia va returna un pointer citre girul de earactere nici o luna” Precizin 4, Denumirile lunilor vor fi memorate intr-o variabid local staied a famctiei definta astel: static char *luna{) = ( “nici o luna”, a rs stebruarie", vaprilie’, woctonorie®, wnosenbrie", decembrie” he >, Prototipul functiei est: thar *denunire_luna{int nunar) ; ‘Scrieti si programul principal care verified functionarea functii Folosind funetia din exerciful anterior serie o alt Funct care primind un sir de caraetere de forma "zzllaaaa” retumeazi data sorsi sub forma "zi Yuna an" . De exemplu: functia primeste "15042004" si reumeazi "15 aprilie 2004". Functia va verifica si coreetiudinea datei rejectind date cum ar fi "2902001" (anul 2001 nu a fost bisect) sau "31042005" (aprilie nu are 31 de zie). Scrcti gi programul principal care verified funetionarea functiei. Scriefi o functie care citeste cel mult n numere reale de tip float si le plaseazi in memorie incepind de la adresa indicati de pfloat.. Funetia va returna numirul valoriloreiite. Prototipul funcfiei este int citeste_n_nr(int m, float *pfloat): Serie si prograrmul principal care verificd funcyionarea functici 6 10. Probleme recapitulative 10.1. Probleme rezolyate Sich un program care si calculeze sis afgeze, in functie de optiunen utilizatoruli, urndtoarele maven pentru un cindy cu raza baz i inkimea date (oumere reale): aria baze,eitoumfernga cereal de bask $i volumul endrului: programal va felt pani end utlignora dorevetoaninars oe ee a ce Fepetare opium, dac sccasta mu sea fet cont Hinclude finclude Hdefine Pr 3.14159265356979323046 Ant main() ( Float raza, inaltimeas char ch: double raspune? int semnal=1; while (sennal) { print (*Alegeti una din optiunile:\n")s print "aria (A), Cireumferinta (C), Volumil (Vv), Tesire (Q): ‘ch = getche(); printf("\n"): ch = ‘toupper (ch): Sffeh == FAT 1) ch == tet 1) ch == vty a0 | printf("Introduceti raza: *); ) while (scane (Sf, #raza) = 1); sfton == "vty aot print® ("Introduceti. inaltimea } while (scanf("8f", einaltimea) = 1); switch (eh) [ case 'Atr raspuns print? ( break: ragpuns = 24 Pr * raza: printt( "Circumferinta bazei este: tg\n\n", raspuns) ; break; raspuns - PT * raza + raza * inaltineas printt( "Volum cilindrolui este: $g\n\n", raspuns) : break: case "0": sennal=07 break: default: printt( “optiunea necunoscuta "Se! este ignorata!\n\n", ch): break; Pr * raza * razaz ‘ria bazei este: sq\n\n", raepuns); printf ("\n"); system ("PAUSE") 7 return 0; BX Programul va afiga pe ecran, dupa compilare gi executic: Alegeti una din optiunsle: Aria (A), Circunferinta (C), Vo Introduceti raza: 10 Introduceti inaltimea: 1 Volumul cilindrului este: 314,159 mol (W), Jesice (ev Alegeti una din optiunile: Aria (A), Cixcumferinta (C), Volumel (Vv), lesire (Q): @ 64 Seri un program cares desenee pe eran un ,X" cu dimensiunea specifica de iliatr (nun ata <20, inaljimea egal cv lafimes),folosind simbotul ,**, De exemplu, dacs se introduce numéul 5, desenul va trebui si arate astel: Hinclode Hinelode ant main 4 int di /* dimensiunea */ Ent ry /* mmaral linses */ into} /* nomarsl colosnes */ printe(*introduceti dimensiunea: scant ("td", bd); J+ pentro “diagonala principala", '*" va apare cand r = ¢ pentru "diagonala secundara", '*" vo apare cand e-d-r+l */ printf ("Degenul cerut arata ast fel:\n\n" for(r = lpr <= ay ree) forte = ly © dy erty iu Se teas rey printe(™"; O° printe( : printé("\n"): ’ printe("\n") Systen("PAUSE™); return 0; EA Program va aga pe eran, pa compile i execute: Introduceti dimensiunea: & Desenul cervt arate eet fel: PHOS} © Programul urmitor citeste de la tastaturi o matrice de maxim 10 x 10 numere intregi apoi determin’ clementele minime pe linii si maxime pe coloane, tinclude Hinclude int maing) Yat A(10) (101, my my iy Jy min, maxs printé(*introduests ne. de 2inii: "7 Beane (sa, ei) prine£(*introducet! ne. de coloane: "I Beane (*sa", sm for (a ~ 0; 4 < my 344) ford = 075 maxy max > ACIES12 Blenentele maxine pe coloane: \n") : Printf("Coloana 8d are maximsl: d\n", 3, max); ' system ("PAUSE"); return 0; BB Program va ats pe eran, dps compile sexe: Tntrodueet{ ne. de lini: 3 Introduceti nr: de caloane; 3 AO} To) = 2 Alo] = 2 alo (2] = 3 Am Ia] = 4 AQ)I) = 5 ALI[2] ~ 6 AIZ}(0] = 7 Arzit} = 8 A21(2) = 9 Elenentele minine pe linsi: Linia 0 are minim): 1 Linia 1 are minimul: 4 Linia 2 are minimil: 7 Blenentele maxine pe coloane: Coloana 0 are maximul: 7 Coloana 1 are maximal: 8 Coloana 2 are maximal: 9 Programul urmitor citeyte de la tastaturd o matrice de maximum 10x 10 numere intregi si sorteazt crescitor liniile matvieei. Precizare: prin conventie, o linie este mai mare deci alta dac& peimul element de Pe 9 linie este mai mare decdt primul element de pe a doua. Dacd primele elemente sunt egale regula se aplica pentra urmitoarele perechi de elemente de pe liniile respective Finclude Hinelade /* functie care interschimba linia 11 cv 12 in matricea A */ void int linii (int A[][0}, int a, antm, int lly int 12) { ia 3, tmps for(j'= 07 4 < mz 344) ( tmp = ALI TSI: Al 3) = A123 C517 A(21051 = tmp; int maing { int A(10}120}, my my 3, 3, inds printe(*Introducets nr. de linii: scant ("Sd") §n)7 printf (*Introduceti nr. de coloan seant ("Sd") im) / citivee matricii +/ for(i = 0; i Finelude int main) | int [10] {201, 9, m 4, 3, ier printf ("Introduceti nr. de linié scant ("Sd") sn)? printf ("introduceti mr. de coloane: "): scant ("id", sm)? v2 (+ chtivea matricii */ for(i = 07 i ~"0) as (se <= my breaks else print# ("Indice incorect\n"); ) /* cy i de 1a ie 1a n se adue liniile {41 pe lintile 4 +/ for(i ~ te; 7 is For = 07 5 Hinclude ant maingy ( int AC1O) (10), mp my ky i, 5, v0); printf("introduceti nr. de lini: "); anf (™id™, én) printf ("introduceti nr, de coloane: "); scant ("8d", m7 for(i = 02 i < nz itey for (3 = 07 5 < mz 544) 1 PEintE(PATHd) [td] =" 4, dbs scanf("td", éAfi} (41) 6s while(L) | Brint#(*introducets indicele coloane ce se“) printf ("doreste inlocuta: Scant ("8d") 5k) it (Ok > 6) ae Gk <= my break; else printf("Indice incorect\n"); ' 7+ citim in vectorul v nova coloana a matricis a */ printf ("acum introduceti noile elemente ale coloanei:\n"); Forti = 0; 4 Hinelade Hinelade Smath.ho fdefine NC 40 /+ numarvl de coloane +/ Adefine NL 25 /* numarul de linss*/ main () float viNIA1, x, Mm a7 inti, Ji for" =0; 4 < ME ~ a; ity x = (float) (-12); Te tonctia ce se afiseaza */ vid) = sin(2 * 3.1415926535 * x / NLD; 0 {+ Se gasesc maximum, M, si minimol, m, functie’ */ Meme vO; for(i = 0; 4° < NL = 1; ite ati] > N= viily forG = 07 4 ¢ ML = 15 444) if Wlilem nevis J* gaseste pasol minin */ ge) y (4 m) J* parcurge terninalol alfanuseric Linie cu linie +/ for(i = 07 4 < ML tz its) for(j = 07 5 < Nes 3tt) { s£09 = cesteevii) Sm + gy printfiws\n"); /* tipareste '*+" si trece pe Linia urmatoare */ break: /* lese de cielul for ce parcurge Viniile daca ea tiparit "4" "/ } else Printf(" "); /* tipareste spatiu */ system ("PAUSE"); return © Programut va afiga pe ecran, dupa compilare si execute: Serie un program care si implementeze un calculator de buzunar foarte simply (doar cele 4 opera elements) Hinclude Hinclude int main(int arge, char Aargv(1) | float nrl, nr2, rezs char op; printé(*rntroduceti expresia (nr op mr, op = 4-x/)\n Scanf("8f Sc $f", anrl, bop, snz2)7 switch (op) ( rez = nrl + nr25 break: rez = nel ~ ne2y 0 break; rez = nel * near break; case '/" sf (ne? == 0) printf ("impartire 1a 0!\n"); system ("PAUSE") ; exit (a; } else ver = nel / nea; break; defavit: operator necunoscut \n ' printfimsg e &g = Sa\n", nrl, op, ne2, rer}; system( retorn 0; -AUSE") B21 Programul va afi pe ecran, dupa compilare si execute: Introduceti expresia (nr op nr, op = +x/} 25.75 «3.18 25.75 x 3.14 ~ 80.855 4 10, ue 10.2. Probleme propuse— Teme de casi Scrifi un program care citeste un numar intreg reprezentat in baza 10 gi il converteste si afigeaz’t reprezentat in buza 16, Scriefi un program care citeste de la tastaturi un oumdr natural cu cel mult 9 cifre si determina aumrul natural ‘ 0, n sim intreg). Scriefi un program care citeste polinoame rare si le memorea7i sub forma unei liste simplu inkinfuite, uade pentna ficcare monom, se memoreaza gradul si coeficientul. Seriei o functie pentns suma a doui polinoame rare, specificate ca parametru. Sotiefi un program care citeste n puncte din plan (n<< 100) date prin coordonatele lor carteziene si determin’ in ‘are dintre aeeste puncte putem aleze centrul cecului de raz minim ce contine in interior toate cele n puncte ‘date, precum si raza cereului. Precizari: datele vor fi citite din figierl text ,PUNCTE.. 77" , ce are pe prima Tinie valoarea tui, iar pe urmatoarele n linii coordonatele carteziene ale punctelor, edte dou pe linie (x respect y), valori real i gi afigeara Scriefi un program care citeste fisierul text 7ST. IN" care confine un text seris pe mai multe I toate earacterelefolosite, codul ASCII corespunzator precum si freevenfa lor de aparitie Scriti un program care estimeazl eu 6 zecimale numarul x (3.1415926535... in modul urmétor: 48) Se vor genera perechi de numere pscudo-aleatoare de tipul (x, y) eu <2, < I: ) Se vor numira céte perechi de astfel de numere pscudo-aleatoare cad in interiorul sfertului de cere situat in ccadranul { al plan (x, 9}; ©) se va evalua pi ca 4 = / Sotiefi un program care si citeascd elementele « dou matrice, fiecare dint-un figier, si caleuleze matricea procs si si 0 tipdreasedintr-un al trilea fier. Matricele vor fi structurate in figiere pe lini si coloane. Se va afiga un ‘mesaj de eroare daca inmulfirea matricelor nu este posibil Serie un program care citeyte elementele unei matrice pitrate, dintrun fisier ASCH, caleuleaz matrices (canspus i otipirestefntrun alt fsie. Precizdri: Matricea Va fi structurata in primul fisier pe lini si coloane astel: Lo =1.33 3.44 345.67 ° ° 67 10.01 n 2, 2. 28, Scrieji un program care citeste din figieral ,INPUT."X7" doul propozifii serise fiecare Proporigile contin cuvinte formate din literete alfabetului englez. Orice alt caracter este considerat separator. Program ~ va afiga numa de cuvinte din fiecare propozitie; = va verifica daca ultimul cuvant din prima propozitie este © anagram (are aceleagi litre) aul ‘ealalté propozitic. Pentru verificarea cuvintelorscrefi si folositio functie recursiv. Preckaii Rezultatele se vor serie tn fisierul ,ovrPUT Tx" astfel: = pe primele dowd linii programul va serie numtirul de cuvinte din fiecare propozitie; = pe ultima line va serie mesajul ,DA” sau ,NU pentru cazurile in care ultimele cuvinte sunt sau nu anagrame, imului euvant din Scriei un program care citeste fiyicrul ,AMENZI..TXT” care confine evidenta amenzilor de circulajie pe 0 perioadi dati. Fiecdrui conducitor auto i se alocé 4 ini: prima linie va confine numele, cea de a doua numirul de ‘nmatriculare al masini, ce de a treia suma de bani corespunzitoare amenzii si cea de a patra dacd amenda a fost sau nu plititt (0 ~neplatta,{ - platita). Programul va eiti mai inti numrul de tnregistar, n. Apoi programul: va afiga suma de bani rezultatd din amenzi, precum si numele soferilor si numrul masini care a plitit amenzile cecle mai maris = nuumele soferitor care nu au pltit amenda/amenzile ordonate alfaber ~ procentul de amenzi neincasate. Scriti un program care ctese lista abonailr telefoniek dint-un oras dinu-un fxier care confine num de telefon ji numele abonatului pe cite o linie. Programul va erea o lst de premiere care si cuprindd abonali al ‘iror munere de telefon cuprind doar cifre pare iar prima si ultima cif sunt proportional. Scriefi un program care citeste Gout figiere ASCII structurate astfel: 4. prim fiyier va congine, structurat pe lini, numele gi prenumele candidatilor la un concurs de admitere, separate prin unul sau mai multe spati, in formatul ; b, al doileafisier va contine,structurat pe lini, media la examenul de admitere Programul va asocia numele si prenumele persoanei de la linia i din primul figier cu nota de la linia é din al doilea figier. Programul va concatena cele trei cimpuri (numele, prenumele gi nota), Ie va sorta in ordinea crescatoare a rmediei gi va serie rezultatulfnte-un al treilea fier ASCUL Exemple de figiere: fisiorl. txt (CONSTANTIN Loana POPESCU George VASILESCU Costin Figier?2. txt 8.66 9152 7.89 Figier3. txt POPESCU George 9.52 CONSTANTIN Toana 8166 VASILESCU Costin Tas Scrii un program care citeste doua fisiere ASCII structurate astfe: 4, primal figier va confine, structurat pe lini, numele si prenumele angajailor unei firme, separate prin unul Sau ‘mai multe spafi, in formatul ; b. al doilea fisier va contine, structurat pe lini, data nasteri, in formatul can>. Programul va asocia numele si prenumele persoanei dela linia i din primul fier eu data nasterii de la accsasilinie din al doilea figier. Programul va concatena cele cinci cimpuri (numele, prenumele, 2, luna, an), le va sorta in ‘ordinea descrescitoare a varsti si va serie rezultatl itr-un a tela fisier ASCII, Exemplu: Figier!.cxe ‘CONSTANTIN Yoana POPESCU George VASILESCU Costin Figier2.ext ‘8 lanuarie 1978 27 August 1980 16 Cctonbrie 1978 Figiers.ext CONSTANTIN Ioana 8 Tanvarie 1978 VASILESCU Costin 16 Octombrie 1978 POPESCU George 27 August 1980, B 28. Scriefi un program care si recunoasca intr-un fisier sursi C directiva de preprocesare ,j#def ine” si cate si ‘gonereze un alt Figier preprocesa, Exemplu: figierl.c Hinclude Hinclude Adefine Pr 3.1415, int main() | PrintE("pi = ¥E", PLY; return 0; 3 Figier2.c Hiaclude Hinclode int main) [ printe("pi = af, 3.1415); return 0; ' 30. Scrieti un program care citestefigierul 7X. x2" care contine un text ce se incheie cu o linie goal, Sa se afigeze toate cuvintele textulul in ordine alfubetic, Preciziri: ~ Tungimea unui cuvaint este de maxim 25 caractere; ~ numa] de cuvinte din text este cel mult 100; ~ euvintele sunt despatite printr-un spatiu; ~ se va folosi sortarea prin insert Reserifi programul pentru a putea preluera un text oricat de mare e spatiu sau semn de punctuate, care cuvintele sunt despirtite prin orice tip 31. Scriti un program care construiasca un fisier cu inregistrdri de tip biblioteca cu urmitoarcle c&mpuri ‘Numele autorului Titul ear Editura Anul aparitied Lista cwvinielor eheie Programal va permite urmétoarele operaif: 4, introduceres unei inregistrii noi in biblioteed; b. stergerea unci inregistari din bibliorecd ©. extragerea int-un figier now a tnregistrrilor in funetie de valoarea unui anumit eémp: ‘Numefe autorulu Tit cart Feditura Anul aparitiet Existenfa unui anumit cuvéint in lista cuvintelor cheie d. sortarea fisierului in ordinea ereseztoare a numelor autorilor (ordine lexicograficd), iar pentru acelasi autor, ‘nregistrarite se ordoneaza in functic de anul aparitici; « interclasarea a dous fisiere ordonate conform punctului anterior. Numele fisierelor se citese de la tastatur Programul va construi un figier ordonat care confine reuniunca celor dou fisiereinifale gi va elimina duplicatele in fgier, 32. Scrieti un program care citeste fisirul text ,IN'TRARE. IN” care confine un text seris pe mai multe lini i eserie fextul pe pagini formate din doui coloane cu lini de lungime egald. Lungimea une linii Jn si dimensiunea unet pagini Jp” se citesc de la tastacur, Reserieti programul extinzindu-| pentru a putea impartreatextul ink coloane. ™

S-ar putea să vă placă și