You are on page 1of 128
Despre carte Aceast culegere de probleme este un instrument indspensabil fn Tnvarea programs, permijind ‘acu ixarea silanes} semantic insietiunilor limbajulu, edt si fnsustea unor principi corecte de Progra acon sy consent pent on cr de roam cao. Teucrarca sruturalé pe 8 capitole, confine 120 de probleme rezovate si alte 165 de probleme props: ‘Exemplcle sunt alese cu gr, find sortae tn ondinea devi. Petra Gecare problem rerolvath se preznth sucint, in limba) natural, metoda de rezlvare, dup care este dl programul coment Probleme reroivale al fost teste do cre auton, care garanteazd asifel corecttudnea soluilor plopuse. Problemele propise sunt sseminitoare x4 sunt deavoltisi ale problemelor rezolvale st Contibui a cretereaincrederilprogramatoruls in propile fot. Despre autori Valeria IORGA, doctor ingiver (din 1982), este prof. univ. le Facultatea de Automatica si Caleulatoare din Universitatea Poltehnica Bucuresti. Pred cusuri de + Programarea Calculatoarelor ——® -Metode numerice * Siructuri de Date sAlgoriimi ——_#_Sistome de programare pent tip real ‘A publicat diverse cirji de Specalitate in prestigioase edituri din Rominia precum si cursuriunivesitare htografate,arueol fn reviste de specialtate, Este membru al ACM si al Societatii Romane de Informatica Paul - Alexandru CHIRITA, stodent fn al V la Faculatea de Automaticd i Calew- lutoare din Universitatea Politehnica Bucuresti, a obfinut numeroase premil la concursuile de cercetre studenten perioada 2000-2001 a fast busier Socrates Ia Bcole Polytechnique, Paleisesy, Franja. De’ asemenea, a cfectuat un stagiu de specializare fn cadral fimei Schlumberger din Paris. In peezent este profesor asistent pent cursurile de Programarea Caledatoarcor gb Strucurt de Date 4 Algoriin! #3 ty pregieye proiectl de diploma cara Learning Pb Lower Saxony, Hanovra, Germania Corina STRATAN, student’ in anul V la Facultatea de Automatic si Caleulatoare din Universitatea Poitelnica Bucueet, a participa la ralizarea a rumeroase proiecte de cereetare {in cadrul laboratoruui de e-Business din UPB gi al Centrlui Najional de Tehnologia Informatics CoLaborator. fn prezent este profesor asistent pentru cursurile de Programarea Catewlatoarclor $i Siracturi de Date $i Algorimi $i progateste preiectl de diploma. sub supervizarea Universiti Caltech din Siatele Unit Cristian OPINCARU este student fn anul V la Facultatea de Automatica i Caleuatoare din Universtitea Politelnica Bucuresti. In cadrul acestei fault fine ore de laborator Ia tursurile de Programarea tn lnbajul C (Amul 1), Structri de date si algortini (Amal 1) i SeructuraSistemelor de Cateu (Ant TY). ‘Cristian OPINCARU este coautor al unui manual de informatic8 de casa a Xa Valeriu lorga Paul Chirifé Corina Stratan —_ Cristian Opincaru Programare in C/C++ Culegere de probleme N a NICULESCU E-mail: edit@niculescuro “Intemet: www.niculeseu.ro ‘computerizatt: TOP GALS.R.L. ‘TiptritlaS.c. EURO PONTIC ae ISBN 973-568-800-X Prefata les Cu tofii acceptim faptul cX nu este fntotdeauna uyor si te faci infeles. daca nu te exprimi in limbaj natural, ci printe-un program. Progratiarea structurat8 a cAutat, prin strategia de abordare top-down, prin impunerea unui numir redus de structuri de control cu o.intrare si 0 ieyire, prin evitarea instrucfiunii de salt neconditionat si prin comentarii inteligente, st fact programele mai clare, mai usor de infeles si de controlat, pentru a opera modificari fri riscur. [A fost definitastel un stil de programare reprezentind mai mult un set de regu, scceptate $i respectate de comunitatea programatorilor. Avestea stabilesc: “e utilizarea unei scriesialiniate (indentate) in inteiorul instructiunilor structurate (decizie selectic,cicl, instruciune compusi), cu intervale de deéalare bine stabilite (8 spaji du>8 uni, 4 dup& alii mai economi) « scrirea unei singureinstructiun peo finie comentarea semnifieativa a unor Seevente mai sofisticate de insteuctiuni 4 definitea de funetii care realizeazS un singur obiectiv ~ bine preciza formulat lar print-un comeatariu ce insoteste functia si stableste semnificaia fiecdrui parametrv. Prezenta lucrare, strusturata pe & eapitole, confine 120 de probleme rezolvate gi alte 165 de probleme propuse. Ea consttuie un suport consistent pentru orice curs de programare a calculatomrelor. Multe dintre problemele propuse si rezolvate au Feprezentat aplicafil de seminar si laborator, subiecte date ta lucrari de control si la examene. Toate problemele rezalvate au fost testate de care autor, eare garantea7a astfel corecttudinea solutilor propuse. Pentru rezolvarea unei probleme concrete folosind calculatorul nu este sufvient st ccunostiinstructiunile unui limbaj de programare. Dromey, in lucrarea ,How to solve it by computer abordeazi aceasta chestiune oferind un numir important de modele (probleme rezolvate semnifiative). © culegere de probleme este un instru folosind un limbaj de programare, permit instruciunilorlimbajulu, eft si fnsusirea unor prine nt indispensabil in invitarea program find atit fixarea sintaxei si semanticii corecte de programare. Exemplele sunt alese cu grijf, flind sortate in ordinea dificultitii, Pentru fiecare problema rezolvati se prezintA suecint, in limbaj natural, metoda de rezolvare dupa care este dat programul comentat. in capitolul 1, Justrueynt, sunt dezvoltatalgoritmi simpli folosind numa tipurile de date primitive simple st instructunite imbajului C. O serie de aplicai bazeuza pe apicarea unorrelai de recuren pena cael unor limite de iar saa in capitolul 2 se definese si se utilizeaza functii nerecursive gi recursive. Capitolul 3, Veetori introduce tipul tablou gi pointeri, permitand dezvoltarea unor algoritmi de selectie, sortare, calcule cu polinoame, numere lungi si muljimi. In capitolul 4, Matrci, se introduc tablourile cu mai multe dimensiuni, alocarea dinamiet de memorie si se devolté probleme de algebra nia Capitotul 5, inttulat“Siruri de caractere”, prezinta aplicati cu caracter nenumerie fn capitolul 6, Structuri, este inirodus tipul integistrare (structura) prints-o serie de exemple sermificative {In capitolul 7, denumit Fisiere, se dezvoltt-aplicati ce utilizenza fisiere text si figiere binare Capitolut 8, Clase, wilizeaz facilitajile limbajului C** relative la programarea orientaté pe obiecte ~ clase, supraincdrcare operatori, derivare si potimorfism. In exemplele alese se definese clase pentru Iucrul cu numere complexe, fractii rationale, e lungi, siruri de caractere, figuri geometrice, etc polinoame, nume Problemele propuse sunt asemandtoare sau sunt dezvoltari ale problemelor rezolvate si au un fol important pentru student. Ele dezvolta atitudinea activa si contribuie la eresterea increderii programatorului in propriile forfe. [Ne exprimim speranta ca aceasti lucrare si fie de un real folos celor interesafi Autorit Capitolul 1 Instructiuni Breviar ‘Atribuirea simple: variabila Atribuirea compusd: variabila op = expresi ‘Atribuirea multipl: jabila.l = variabila2 =. = expresie; Instrucfiunes compusd: ( declaratii_si_definitii; Anstructiuni; 3 Af (oxpresie) insteuetiunel; else instructiune?; AE (expresie) instzuctiune; 4€ (expr) astel; else if (expr?) instr2; = expresie; Decizia (forma generala) Decizia (forma simplificata): Decizia multipli: eis awiteh (oxpresie) { ease vall: secvental case val2: secventa? Selectia derautt: | “secventa 9; } while (oxpresie) Giclul do: ao wnile (expresie) Ciclul whi te (eat timp): Ciclul eu centor: for (exp_init; exp_test; exp_nodif) instructiune; Saltul la pasul urmitor al unui cicku ‘continue; Iegirea dintr-un ciclu : bre: fntoarerea unui rezuta dino fino otura expsesies 1 Programare in C/C++, Culegere de probleme Functii matematice uzuale Fisicrul antet conjine semméturile (prototipurile) unor funcfii ‘matematice des folosite. Dintre acestea amintim: Probleme rezolvate sin(x) | double sin(doubie) ; contr) | double coe double), Frei igonomerie tale) [double tanidouble)s aresin(x) [double asin (double); arcos(x) | double acoa (double) Funct tigonometice arctg(x} | double atan(double) inverse arctuly/#) | double etan2 double, double) sinh(x) | double sinh(double) ; z ~ | coshix) double cosh(double} Functii hiperbotice thi) [double tanh double); exp (x) double exp (double) ; Z Exponentialé natural 10° | double pow0 (int); Exponential zecimat a double pow(double, double) Exponential general | An (x) double log{double) ; Logaritm natural zi Tole) | double Logi0 (double) Logarlim zecimal double fabs (double); ~ bx int abs (int); ~ ‘Valuare absolut Tong labs (long) Ye [eeuble sart (double): TT ssid pas Tong double sarti (long double)s Tx] double ceil (double) ; | Antregul minim >= x Lxl__| double Floor (Gouble): Tnregul maxim <=x | double atof(const char *);* sCompetais #0) | conversis racer it oat ong double atold (const chart); | Cametse sir de caractere in fog due | De pe mediul de intrare se citeste un numar real rad reprezentind un tunghi exprimat in radiani, $& se converteased. in grade, minute si secunde sexagesimale. (Probleme similare: P1_11.) RL. Rezolvare: Numérul de grade se obfine rejinind partea intreagi a produsului F180 Numarul de minute este partea intreaga a fractiunilor de grad inmulfite cu = 60 gi analog, secundele se obfin refinind partea intreagd din fracjiunile de minut, ‘inmate eu 60. ‘Au fost folosite ctribuiri multiple pentru a calcula numarul de grade (minute) si frcfiuni si pentru rejinerea pari intregi a acestuia, (ie A | tinclude Hinclude define PI 3.1416 | void min (vota) ¢ [ery Unghial in radiant | oubte unghi_rac, gf, mints: 77 ongniut in grade, minute si secunde sexagesinale int grade, mirute, secunde; 11 Stergere ecran | cirserd 7/ Citivea datelor do intrare printf (* Introguceti unghiul in radiani: "); geant (*81£*, gunghi_rad) ; grade = gfx = unghi_rad*180. /Pr minute = minfr = (gfr - grade) * 60.7 secunde =(minfr - minute) * 60. // Misarea rezultatelor printf (*\n Unghiul are td grade, Ad minute si 8d secunde.\n",\ gxade, mir geten(); ) fa, secunde) ; Programare in C/C++. Culegere de_ problem RI_2. Un maratonist pormeste in cursi la un moment de timp exprimat prin ora, rminutul si secunda startului, Se cunoaste de asemeni timpul necesar sportivulai pentru parcurgerea trascului. S& se determine momentul terminarii cursei de citre sporti. (Probleme asemdnditoare: P18, P1_10, PL_12, PI_14, PL_22) Recohvare: Se efectueazi adunarea pe cele trei ranguri: secunde, minute si ore. Se propag transport intre ranguri (seconde —> minute, minute —> ore) daci suma in rangul respectiv depageste 59, Penns a evita tstul dept se caloueazi transport in rangul urmifor ea suina/60. Refacerea sumei se face folosind operatorul ®. “Trebuie avut grijt ca dupa efectuarea sumelor pe ranguri, mai inti si se propage transportul in rangul urmator gi apoi sa se refae& suma din acel rang, #include Hinclude void main (void) ( 7/ Momentul plecarii int ora_start, min.start, sec_start; 7/ Timpul parcurs {nt ore, minute, secunde; 7/ Momentul sosiria iat ora.sosire, min_sosire, sec_sosire; 77 citire date de intrare elzscr() printf (/ Introduce’ momentul plecarii (HH Mit $8): Roane ("edtasa", kora_start, tmin_start, ksec_start); printf (* Introduceti Gurata cursei mi MM SS *); Scant ("Bdtdtd", gore, sminute, &secunde) ; // Calculam momentul sosirii. sec_sosire = sec_ctart + secunde; fincseaize = ministart + minut Sracsosire = ora_start + ort 7} Propagam tranporturile nin_sosire += sec_sosire / 60: oralsosire += min-sosire / 60; G7 Refacem gumele in ranguri sec_sosire t= 60; minusosire $= 60; ora_sosire 8 24; 7) AESeam rezultatele printé (" Homentul sosirii este: 8026: Gra_sosire, min_sosire, sec_sosire); etch): 10 Capitola 1. INSTRUCTIUN R13. Se considera sistemut de ecuai: axtbyre mnxtayep et prin valorile coefcienilor a,b,c, min, p. Si se rezolvesistemal eu discujie. (Probleme similare: P1_13) Rezolvare: Avem doua cazuti dack mb - na = O, atunci dack me-ap=0 si bp-ne= (compatibil nedeterminat) ac uma din aceste valori este 0 si cealalts diferita de 0 sistemul este incompatibil « altfl, solugile sunt: y ,atunci sistemul are o infinitate de solu me~ap)i(mb—na) si x=(bp—ne) M(mb—na). Fnelu 7 Hinclude Hinclude void main (void) ( double a, br ct Souble m,n, pi Souble x, ¥ const, double eps = // solutiile sistemalui 0,001; // ‘Pentru teste pe variabile double 77 citive date de intrare eles print antroduceti as"): scanf ("81£", ga) print [neroduceti b: 7); scant [*sift, eb) print [nereduceti c: *); scant ("t1f", &e) Beints (" Introduceti m: '); scanf (*8ift, &m) Brintt (" Introduceti n: "); scanf ("Sif") én) Brinte (" introdaceti p: "); scané ("Bit") &D) TE (agimtb = nta) < eps) ( 1) 3iscem incompatibil sau compatibil nedeterminat LE (abe(mec — at) > eps) peinte'(» ¥ nu poate £ calculat! \n"): else Grintf (* aven o infinitate de solutii pentru Y! \n"): if’ labs (btp = ntc) > eps) printe (* X nu poate fi, caleulat! \n"} cabs printf (* Aven o infinitate de solutis pentru x1 \n"); 2 else (i/ Sistem compatibil y= (are ~ arp) / (mtb ~ ntad; Z 2 (bsp — ate) /{m*b ~ ata) printé (* Solutiile sunt: xs81f \t getek(): Programare in C/C++. Culegere de probleme RIA. Sk se scricalgoritml pentru rezolvarea cu diseujie a eeuafiei de gradul 2 ax'+bx-+e=0. Se dau pe mediul de intrare coeficientit a, b, ¢ care pot avea orice valori reale reprezentabile in memoria ealculatoruli (Probleme similare: P16.) Rezolvare: Avem urmitoarele cazur: ~ Beuatia are o infinitate de solu ~ Eouajia mu are nici o soluti, + Eeuaia este de pradul inti gi are solufia~c/b + a0 = Definimd =b? = 4ac Dact A >0 sau A=0, atunci soluiie sunt , #0 I, bc#0 2a #inctude finclude include Winelude emath.ay void main (void) ( double a, b, ¢: double xi, x2, delta; const double eps = 0.001; // Pentru teste pe variabile double elrser(); printf (* Introduceti a: * scant (*81f*, ba); printf (* Introduceti b: printf (* Introduceti ¢ scant ("S1E", Gc); if (abs(a) < eps) __// Testam daca a == 0, {// Ecuatie de gradul intai Lf (abs(b) < eps) iflabs(c ) < eps) print£(* Ecuatia are o infinitate de solutii\n'); o: 0 scant ("81£", &b); de fapt else printf (* Ecuatia nu are solutii, a else (printf (* Ecuatia este de gradul intai!\n") printf (* Radacina este: 81f\n", -c/b): ) ) > n\n") Capitola 1. INSTRUCTTONE else (C// Beuatie de gradul doi delta = b*b -.dtatc; 77 Testam d&ca avem radacini complexe LE (delta < -0.0) ( prince (*xis’1feit(S1f)\at, -b/(2*a), sqre(-delta) /(2*a)) printl ("x2e8Lf-i* (1) \n", -b/(2*a), sort (-delta) /(2*a))7 ) else { printf ("xL=tig\n", (-b/(2*a)) + sqrt (delta) /(2%8))7 printf (*x2ebl£\n", (-b/(2*a)) = sqrt(delta) /(2*a)) 7 ) ? geteh(): H RI, ‘Un punet in plan este dat prin coordonatele lui (x,y). SA se stabilease’ pozijia lui prin indicarea cadranului (1, 2, 3 sau 4) in eare este plasat. Pentru un pundt situat pe una din semiaxe se vor preciza cadranele separate de semiaxa respectiva (de exemplu 2-3), Rezolvare: [Beppe Hinelude Hnelude void main (void) £ double x,y: ehrscr(); printf (* Introduceti x: geanf (781f%, Gx): printf (* introaacets ys *)1 Ecenf (ALES, ays if (x >= 0) TE Coe ee 0) 66 ty == 9) ) prince (* Punctul introdus este originea toh oi geain penteu a evita inbricarea de if-uri exit (007 | | | Progeamare in C/C++, Culepere de probleme Tra | yP paca se ajunge aici, se intra sigur in unul 77 Gin sf-urile de mai jos SE (x 2.0) prinef (* Punctul ee afla in cadranele 2-2.°)1 Prine poe fi ambele 0, pentru ca am testat mai sus Af (y 52 0) prinke (" Punctul se afla in cadranele 1-4." Bet Ge > 0) aa (y > 0) ) printf (" Punctul se afla in cadranui 1 ) else Cit (x = 0 printé (" Punctul se afla in cadranele 3-4.") else Seinté (" Punctul se afla in cadranul 4 } ) else [7 x<0* {if ty =2 0) piinté (* Punctul se afla in cadranele 2-3 se ty <0) pitace (" Punctul se afla in cadramul 3.7)7 if ty > 0) peinte (* Punctul se afla in caéranul 2." } ) geteh Ql: ee _ Danduse n pe medial de intra, sf se calculeze: $= OCDE (Probleme similare: P\_1, P1_1S) a Rezolvare: 1 Gepp Winginde Siamese NL void main (void) ¢ printf (* Introduceti ar"); For (int i 21; i <= my ist) if Ge 2) else . | printf (" Suma este: td\n*, suma); geteh(): acant ("8a", 6m) Capitola! 1. INSTRUCTIUNL RI7. Abaterea medie pitraticd a rezultatelor objiqute prin determindri experi- mentale se poate calcula cu formula wy x sigma HN =p aplieabilé:numai daca s-au fut cel pujin 2 masurtori ‘Dandu-se pe medi de intrare N (IV < 25) si rezltatele celor N determinant si se ealculeze abaterea medie patratica, Rezolvare: ep a include Hinclude Hinclude Hinelude void main (void) ¢ y/ initializam pe N cu o valoare in afaa celor posibile int N= 26, double x: experimental Gouble s=0, sp=0; aouble signa; 7/ citize cu validare W else (0; while (N > 25 || N< 0) ( inté (* Introduceti Ns"); scant ("td", SN): 1/ 0 valoare determinata 7/ soma ei suma patratelor y for (int i= 0; dem iy print ("Ihtroduceti determinarea td: *, i + 1); ’ sean ("BLE") Sxl; spesxtxr ) Lea > 1) ( ‘sigma = sqrt ((Ntsp - sts) / (NP (N-2))) 5 printe (* Abaterea edie patratica este: tif\n", signa); getch(); : A Programare In C/CH. Culegere de probleme RIL8. Si se determine cel mai mare (ma) precum si cal mai mic (min) element ddintrsn git 95 dint ‘Se dau pe mediul de intare m procum si cele n elemente ale siraui, care sunt cite perind into acccasi variabilt a. (Probleme iarudlie: P\_17, P1_18) Rezolvare: Ideea este ca pe misurd ce citim un numar a mai mare / mai mic deci ‘maximal / minimul s& actualizam extremele, Bi ee Finclude include finclude void main (void) ( int a, a; \ int min = MAXINT, ! max = -NAXINT; WJ Citire date de intrare printf (" Introduceti a: *) for (int i= 0; i < ny ise) f Drintf (* Elenentul 8d: ", i+i); scanf ("ea", Ga); if (min > a) if (max < a) } | printf (* Maximul este: ta\n", max); printf (* Minimul este: d\n", min); | getch(); | scant (*ta", an): Capitola L_ INSTRUCTIUNT — void wain (wold) € int nr_studenti, nota; int note_bune = 0; // numarul de note int integralista = 1; // spune daca avem // citize date de intrare printf (* Intoduceti nunarul de studenti. ecané ("8d", &nr_studenti); for (int i <0; 1 < mr_studonti; iv) ( printé (" Nota studentului td: ", i017 scan ("kd", Snota); if (nota < 5) integralista = 0; Lf (nota >= 8) note_bune += 1; foarte bune grupa integralista a ) // afisare rezultate if (integralista) printf (* Grupa este integralistal\: else printé (* Grupa NU este integralista!\n"); ; print (" Procentajul de note foarte bune este: #1f\n", \ (double) note_bune/ (double) nr_students) geten() v RILL10, Se considers fanctia flx)=In(2x°+1). SA se serie un program penta tabelarea pe intervalul [-10, 10] cu urmatori pasi © 0.1 pentru |x|< 1.0 © 05 pentru 1.0<|x|< 50 © 10 pentru 5.0 <|.x| $10.0. RLS. Se dau pe medi! de intare notele objiute de etre studengi une grape la tun examen, procedate de mimarul studenglor. S& se determine daci grupa cste sau nu integralisti, precum si procentajul de note foarte bune (8, 9, 10). ‘include Winclude include 16 Yinelude include void main (void) { double x = -10, eps = 0.001; printf (* Valorile functiei In(2*x*2 + 1) sunt:\n"); while (x <= 10) { peinté (" £(8LE) = GLE \nt, x, Log(2ttert)): Programare in C/CH4. Culegere de probleme 70 treluie sa increnentam cu 0.5 To ee fabs (x - 1.0) > eps) 77 Peatra x LE (Fabs (x) xe te Od else 77 Pentru x Af (fabs) x te 05; geteh(): 5.0 trebuie ga inerementam cu 1.0 5.0 && fabsix - 5.0) > eps) 1.0; be RII $2 so caleulere gis se afgoevaloileintgrae: 1 (2) = [u*e*du rn in-caren ix sunt dat, cunoseéind e& (1)! Aut Je unde = pentru k= 1,2, BG) = [xt = Ayla + ae A = R=L) «(k-p+) Rezolvare: aT EEE ZZ] Likepp, Finelude #nelude Hnelude void main() ‘Goubie s;_/* valoarea integralei */ doubie x, t Scuble xk; /* variabila in care retinem x"k */ int n, printé scant( printf | Seane(el es, ax): | peintt(* Cele $d dntegeale sunt: \n", alr | ies 1.0; Bog (kis!1s gerch(): RLA2 Sirurile {uy} si {vs} generate cu relafile de recurenfa: ie = (Una + Ver2. $i Ye = Alea pornind cu w= 1 al, v= 1b]. Minde #20, a0 au oaceeas imité comund,valorea integrate liptice: 1=2'f a ® 4 Va? cos? x+b? sin? x Sa se calouleze accasti integral pontru a gi b dai, ca limita ‘comuna a color doua siruri, determinata aproximativ cu precizia eps, in momentul bh ‘care distanfa intre tormenii celor dowd siruri devine infericara lui eps, adic |ta— Yn] #include Finclude Hnelude voud imain() ( double a, by eps, u, v, aux: printi("\n a="); scanfi"8lf", a); print?("\n b= "); scanf("t1i", &b); print! (*\n eps = ") seang("tl£", keps) weedy tapstal v= 1 / fabstb) while (fabs(u - v) > eps) { Yesalvam vechea valoare a lui u(folosita in caculul lui wits us (uty) (2: y= sqrt(aux * vi; d brinté(* Valaoarea integralei este 81, u): getch(): ) Programare in C/C++, Culegere de probleme RI_13. Se dau pe mediu! de intrare un numar necunaseut de mumere nenule terminate cu o valoare nuli, SA se stabileasca daca acestea: formeaza un gi strict crescator, formeaza un gir crescator, formeazi un gir strict descrescator; formeazii um sir descreseitor; sunt identice; ru sunt ordonate Rezolvare: Se numacarelaile de ordine Inte elementele vecine. Pot aparea ‘urmatoarlesituayi avem 7-1 relaji= = sirul este constant avem I relaii> = girl este strict descresedtor + avem n+l relaii <= siul este strict crescator ++ numarul relajilor < este O (i timp ce celeate sunt nenule) = giral este deseresctor + numarulrelailor > este 0 (in timp ce celelalie sunt nenule) = girul este eresestor + numrulrelasilor = este 0 (in timp ce ceelalte sunt rene) — girl este neordonat + numarul relailor >, =_ si < sunt toate O = sirul este vid sau are 1 element Elementele din sir sunt ‘itte pe rind. ‘Trebuiese.refmite numai_doud elemente suceesive, in vederea compara (prec si ext). Vom folosi tei eontoare de reli mic, egal si mare. Hinclude #include (/ Vipuri de sizuri fdefine S_cRESC 6 faefine CRESC 5 #aefine S_Descarsc 2 3 a 1 #Gefine DESCRESC ‘define CONST define NEORDONAT void main (void) ¢ int n=0; // numarul de elemente din sir int crt // nunarul curent eitic int pred. Y) mamarul citit anterior int mic=0, egals0, marex0;// contoare de relatii int tip “7 tipul surulut elrser(): // Facem citirile primelor date printf (" Introduceti primi] numar: "); scant (*4d* if (crt t= 0) ( prec = ort; printf (* Introduceti al doilea numar: scant ("Ra") acre); if (ert == 6) 1 fort): ” 20 Capitolul 1. INSTRUCTIUNL BEInEE UEiral ave un Singur element a's getch() exit (Ql; else, ) else { printf (* sir via\n") geteh(); oxic); ) 7/ Sixwl are cel putin doua elenente while (ere 120) ¢ Le(prec < crt) else ie (prec > ert) else ‘ egalt+s prec = ert, Drinté (* Introduceti urmatorul mumar: *) Beanf ("a", kort); 14 aecrenentam a, pentru ca uitimil element introdus TBPTAT SS fa EE Saderares "7 s-cnesc: ScEEEERésc, = Seer: Ze toe!) esp = case, te SGail Up © Setcnbsc: HEIELCTEn ace) tap = Meotoonsrs 11 Stisaee"tenutate wateeete Gase S_cRssc: | printf (* Sirul este strict brea a cose cxesc; PFlnth (+ sir1 eote exescator!\n")s esas S85 s.onsenase: peinee (+ sizul esce strict cea ; cae passe: BEintl ( sirut este descreseator!\e") case cousr: BEIMEE (+ sheut esto constanti\n*};, break SESE §BERbiuae, Prince (° Sizut Gate soordonae! ww reat ; fetch: a Progeamare in C/C++. Culegere de probleme Rid, Si se calculezs pentru dat, fy termenul de rangul din sirul Tui Fibonacci, ennosednd rlajia de recureng&: fp = fos + foa pentru p> 2 $i fel firl Rezolvare: Pentru a calcula termenit sirului folosim 3 variabile: una in care reyinem termenul calculat la pasul curent (/) si doud in care rejinem cei doi termeni anterior i + fr) trebuiese (fi si fs). Dupa ce am determinat valoarea termenului curent ( actualizate gt valorile termenifor anterior: fi =i sifi ‘Am fi putut realiza aceste operafii si folosind doar dowd variable, pentru a face i ultimii 2 termeni calcula °f ave valoarea termenului ‘urmator. Dar in fi trebuie s& punem acum vechea valoare a Iui f, care s-a picrdut. entra a o reconstitui calculim fuy~ fi, deoarece: fw ~ fi = Pears + — fi = fre (2m economic, astfel fie variabilele fifi, im care sunt rei (fe tespectiv f,.). Facem atribuirea f= f+ fi si astiel otal CU fa $i fas Valorle noua, respectiv veche pentru). Vinelude void xain() ( int n, i} doutle s, pl, p2; printf£("\n n="); scarf (*"8d", &n); pl = 1.0; p2 = 2.0; (pas 2; i cen: Set) ena): em; (wl / pa); ) printé("Valoarea sunei este Std = $.31f \n", n, sly RILA6. Un numar perfect este un numér egal eu suma divizorilor sai, printre care ‘este consideraté valoarea | dar nu si numarul Si se giseascl toate numerele perfecte mai mic sau egale eu un num dat ‘pe mediul de intra, sisi se afgezeficare numa astéel_ determinat, ‘unmat de suma divizonlor hi, De exemplu numaral 6 ate divizort 1,2 513 ‘este numar perfect deoarece: 6 = 1+2+3, Rezolvare: Se calculeaza suma divizorilor si se compara cu numirul ~ daca sunt egale, rnumdiul este perfect gi se afigeaza. Suma divizorilor se iitializeaza la 1, deoarece am considerat cf | este divizor implicit al fiecarai numa. ‘include finclude Huciude Sconio.h> : include void main (void) ( int int suma_div ; 11 suna Bivizorilor 77 un posibil divizor printf {" Introduceti k: *); scanf (72d", kk); 7/ incexcam toate numerele pana 1a k for (int x= 1; x <= kr xe4) // calculam suma divizorilor lui x 2B Programarein C/C++. Culegere de probleme printf ("ad=1", x); for (d= 2; 4 if edd printe("+ad", a); printf (*\n"); die » //for geteh() reducerea sa la primul cadran utilizind urmatoarele relafi sin(x) =-sin(-x)— dack x<0 a sin(x) = sin(x-2mn) daca > 2m Q sin(x) =~ sing) daed x>m @) sin(x) =sinfn—x) dae x> 02 @ (Probleme simitare: P\_S, P1_25.) Rezolvare: Vom aplica relaiile (1) ~ (4) pe rind, modificdnd valoarea lui x pentru a ‘objine o valoare din primul cadran: dupa ce aplicim relat (1) x va fi pozitiv, dupa ielafia (2) va fi fn intervalul [0, 2x] ete. ; eventualele schimbari de semn care pot apie (daca se aplicd relaile (1) gi (3)) ae roti fntr-o variabils ‘numité semn: aceasta este inifializata cu 1 si le aplicarea relajiilor (1) sau (3) este ‘nmulfitd cu -1. In fisierul math.h se gsesc definitiile mai multor constante ‘matematice, printre care sin (denumitt M_PD, pe care o vom utiliza in program. valoarea func #include void main(voia) ¢ double x, s, sv, t, int k, n, semn; printé(*\n x ="); scanf(*81f", 6) eps: 4 INSTRUCTIUNL peinte("\n eps = 7 scanf("S1£", Geps) 7* transformam » pentru a il aduce in primul cadran: */ senn = 1; /* schimbarea de senn in urna transformarilor */ AE (x < 0.0% /* sin(-x) = -sin(x) */ tx ) while (x > 2 * MPI) /* sin(x) = x22 2 MPT; if (> MPT) /* sin () = (Cx -= LEE sin(x - 2*PI*n) */ wsin(x - PI) */ ) LE Oe > MLPI/2) = MOPI ~ x2 J* calculam sinix): */ : tx: /* 8 ~ valoarea sumei (* sintx) = sin(Pr - x) */ t - termenul curent */ /* salvam vechea valoare a lui s, pentru a evalua eroarea */ ) while (fabs (ev printé (* sin(x) 98) >= eps: lf \n", sem * 5); RL_IB. Se consider polinomul: ps G) =aa.¥ Fai" + nt de ‘Si se calculeze valoarea polinomlui nisin punct x dat, dac8valoile ovfcienilor lui x se ctese pe rind, n aceasi varnbil 4) in ordinea descrescaitoare a puterilor lui x (adica in ordinea ag, ay, 'b) in ordinea crescatoare a putcrilor lui x, (adicd in ordinea dy, ds.1. (Probteme sinitare:P1_19, PL_20) a) a) Rezolvare: 4) Ne bazim pe urmatoarcle rca de recuren}é care se pot serie pentru polinoamele se grad 0, 1. n (Scher lui Horner: Pos) = ay P(X) = Ag x4 a, = X-py(X) +4, Pil) = (ay -x+4))4 a, =x POX) +a, PDE Pala, Progeamarein C/C++, Culegere de probleme Devi, vor folasi 0 variabila.(p) in care vor rojne valoarea calcula pn to pasu Preeat”pentre polinom. In fiecare pas i, inmulfim valoatea respectiva cu xs apoi Saini’ rezultatal obfinut ctv a, Obscrvim cf este suficientd o singurd variabill a pont citi coefiienior (in pasul curent fave nevoie doar de a). t) Si in acest caz refinem valoarca polinomului iat-o variabts, tn care, in pasul & Richa dat (an, este cocticientul cit). va fi pastrat in variabila x, Tikenp, r include voia main() ( float a, x float p; // valoarea polinomalui float xi; // x la puterea i int nis printf("\n ns"); Beant ("Sd") 61) 7 printe(" x5"); scan ("S£", 8x) 7 (* punctul a */ for (i=0, p=0; i <= ms i4)( peinté(tatd=", ide scant ("SE") bali peptxtar ) }* afisam valoarea polinomului: */ printé("p(%.2£)=8.2£\n", x) Ble 7* punctul b */ // initial xi = "0 7 ist) { n= i}; boant ("S6" x et ia valoarea x*(i+l) ) peinté("p(B.2£)=8.2£\n", x) PIF eevee eos oes ooo 0 toi factor primi ai acestuia (Probleme similare: P\_21) RA_19, Dandu-se un nun inte, s& se afige precum si ordinele lor de multiplicitate. Tirul n la un posibil divizor d, cAt timp se divide cu fdivizorulei, Cand mumiral nu. se mai tatea Ini (daca aceasta a fost nenula), Rezolvare: Se imoparte repetat num cesta, eresednd corespunzator multiplicitatea divide cu d, se afigeaza d impreund cu multiplic ‘Sigoritmul Se termind cand numérul n devine 1 6 (Capitola 1. INSTRUCTIUNE ¥inelude #inelude #include void main (void) ( int nz int mult=0; // multiplicitatea unui divizor int dive2; // un divizor incercat elrscr(): printf (" Introduceti nm: "}; scanf ("$d", gn); white (1) { LE (ntaives0) { multer: a/=div; } else (CifGmut > 0) printf ("td 8@\n", div, mule); mult = 0; iE (dive=2) iv else break; 3 } getch(); R120. Printre numerele mai mici sau egale eu un numiir dat pe mediul de intrare s& se gascasca cel care are cei mai mulfidivizori Rezolvare: Pentru toate numerele cuprinse intre 2 si n se calculeazi numarul de divizori nebanali si se refine maximul si numérul corespunzitor. Dac douk rnumere au acelasi numér maxim de divizori, se ia primul dintre ele. i abepp ; ‘Vinclude = include include Winelude a Programare ia C/C++ Culegere de probleme CCopitolu! 1 INSTRUCTIUNI int int int int for ) wold main (void) € nay JJ munarul de divizori ai unui candidat ndmax = 0; // retine nunarul maxim de divizori imax = 0; | // retine nunarul cu cei mai multi divizori 1/ Citire date de intrare print’ (" Introduceti numarul: *); scant (*8a", 7/ se incearea toti candidatii pana lan (int d= 2; i <= nz is) ( JJ calculeaza nunarul de divizori ai lui i for( int div = 2, nd = 0; div <= n/a; dives) AEG & div == 0) nde; JJ actualizeaza nunarul maxim de divizori Af (nd > nd_max) { nd_max = Ad; ? n_max) ; geteh(); en): printf (* Numarul 4d are maxim de diviors, adica td\n* Rezolvare: inmuljim ecuatia cu x": ax" + bx"? + cx"? = 0 gi finem cont de fap- ‘ul cf aceasta este satisfficutd de cele 3 ridacini xy, xz six. Agadar: a ey"txs" 4x5") + BG 2" tas") + c(i" tny" bs") Notind s ("4 a5"+ 2x", obfinem relafia de recurenta: 0 .5y + basna + 6.543 = 0, pentru care trebuiesc furnizate valorie initiate: p= batt n= 3 Sremtm tay=0 sex? int ‘inelude finclude finclude taht vold main (void) { double a, b,c, 8, 80, sl, 52) | | | Deinté (* tntrodaceti, pe rand, a, apoi a, b si cr") Scanf(*"d81£B1ftiE", an, &a, bb, bc): 20 52 = 2%; 7 for(int j= 3; 5 <= nm ite) ( 8 2 -(b* sl + cts0) J ar 80 = sl; sh = 82; 22 = 8; ) printé ("5 (8d) geteh() 6.21f\n", n, 8)7 Sa se calculeze x" pentru x (real) gi ‘mai mic de fnmulfti de numere rea. Recolvare: Se observ cd x poate fi descompus fran produs de Factor in eare pot apare x, x2, x*,.°, ... Ur factor apare in produs dacé in reprezentarea binar& a lui ciffa corespunzitoare este 1 Vom forma dip rnd cite din rprnstare iar 2 a hsp cy cea ma pain semnfiatva 5 puter hu xx 27, a. Puteren se inmulest kx press dat ciffa corespunzatoare este 1 De eserpl: "= ahs deoarece 132= L101 Gee repent bina aun eon ca sur ale mpi svcesivea hin 2 ep Wnciuds void main (void) ( ane nyc, dy double x; long double rez: double px! 71 puterea lui x elrser()i printf (* Introduceti x: "); scané printf (" Introduceti n scant for (i Pen; ky ¢ afte) rez *= px: | ee Bs printf (" G1£* td = SLE\nt, x, ny rez): getch(); 8 Programare in CIC+4, Culegere de probleme in 8 RI_23. Sa se caleuleze Functia Bessel de speta I-t Jp (2) stiind c& exist a Tafatia de recurenft: J9(2)= (2p~2)xdp.u(x)-Jp a) yt ser snake 2 1962) = BM Ge = LON paaD Calculele se fac cu precizia eps (x si eps se dau pe mest de itrare) Rezolvare: Winelude dinelude vote puin( seek te ds Beane COE Bel an catlor do Lease (nis, 29r0, 9 a . caloulam 30 si 31: */ . cere eT; /* eezmenul curent din suma */ De 1.0; $2 = x7 2 Bor cea iar ee) wie 30: fay = Hl) reat ea se ms Jovs= tern: SD bom x 24 Oe + De ; HE ESTBS abv)7< eps eh Eebs it - Jv) < eps) breaks 1s cqtcutgn vatoarea funepiot: */ Page piesa pe i Puig! 2) pox) * gi ~ 30: despre -valoacen functiel Bessel: JBA(¥.22E) = SLE. Br % jh U 30 Capitol! INSTRUCTIUNE RI_24. 88 se objind reprezentarea ca fracfie zecimalé a numarului m/n. Eventuala perioada se afigeaza intre paranteze. Rezolvare: Deoarece numerele reale se refin in memoric in mod aproximativ, eu un rumét fit de zecimale, rezultatul pe care ni-t fumnizeaza ,caleulatorul” pentru ‘impifirea nv nu ne ajutd s& dotermindm daca fractia m/n este periodica sau nu. Deci ‘ya trebui s& simulim noi imparfirea pentru partea zocimalA a fractiei daca dorim s& calculm si perioada; prezentim mai jos algoritmul folosi, impreund cu un exempla (m= 34, 8) 1) Simplifies fracjia: aflam emmde (mn) (de exempta, folosind algoritmal lui Euclid) si impairjim m si m prin aceasta valoare; Ex: m= 34, n #28 => cmmdc(m, n) = 2 m=17 (= 34/2) n= 14 (= 28/2) 2) Calcalim si afigim partea intreaga a fractic Ex: [27 / 4] = 1 => afigdm “1.” 3) Determindm lungimea pérfii neperiodice; aceasta este egal eu maximul dintre, rultiplicitiile factorior 2 gi S din descompunerca numitorului; | me: n=14= 2.7) => partea neperiodicé are lungime 2 | 4). Simukind impacfireacifra cu ciftd, caleulam partea neperiodica: = 0 now ciftd a acesteia se objine prin impartioa intreaga a restului paral la sumitor = noul rest parfial este egal cu restul acestei impart inmulft eu 10. Inifial, restul partial este (m % 110 (restul impéirjirii numarstorului fa numitor, fnmalfit cu 10), Ex: Ina Rest_partial = (17% 14) * 10 = 30 Pas 1: citrl cat = 30 / 14 = 2 => afisim "2" Rest_partial = (30 6 14) * 10 = 20 5) Dac dupa co am ealculat toate ciftele din partea neperiodica, estul partial este 0,! nu existh parte periodict si algorimul s-aincheiat. Altfel, incepem si determindm| gi citele piri periodice (ne oprim atunci cénd objinem un rest parfial egal cu primal rest paral) Ex Pasi: Afigam "( Pas Cifrs_cit = 20 /14= 1 => afigim “1” Rest_partial = (20 # 14) * 10 = 60 Pas3: cifri_cat = 60 / 14 = 4 => afigan “4” Rest partial = (60 @ 14) * 10 =40 | pas nt AELgam I” 31 Programare in C/C++. Culegere de probleme Hnelude #include void main()( “prince (*\n'm'=.*) Beant (*ta", &m) printt("\n'n = Beant (*"Ba", &n) assert in 1 0); fe aflam cand (m,n) (Pe = aux § auxn: ) hse C2); men / aux; nos a / auxm; Tem ncs'0) /* {prante(*0"); exit (0); m=menr 7+ calculam numarul for (auxn mp S10" mr 7? ED for (i. Cpeinee tas, op 7 {prince d* (sd; i pEinté(*8d", ep zp = Up $n) * rinte(*)*); int m,n, i, aux, auxn, ine m2,"a5,'nen, tp, xpi; m5'= 0; /* multiplicitate 5 */ for (auxn’= nj auxn § Ep = (rp $n) © 10; Capitol. ENSTRUCTIUNE een cu algoritmul lui Buclid: */ /* simplificam fractia: */ Printf(*Fractia zecimala este *); 7* aficam partea intveaga: */ printé(td.t, m/ nl; partea zecimala a fractiei este 0 */ de cifre din partea neperiodica: */ mos 0; /* multiplicitate 2 */ ‘auxa 8 2 0; mass, auxn /= 2) Sse 0; mee, auxn 5) nich = (m2 > m5) ? m2: m5; /* numar cifre neperioada */ 7*"afisan partea neperiodica: */ restul partial */ nen; iss) A); /*,cifra curenta */ 1 (+ afieam partea pericdica, daca exista: */ it tep). /*exista parte periodica */ Ppl = rp: /* salvam primul rest partial */ yond: 10; } while (ep t= xpi}; 2 Probleme propuse PLA. S& se calculéZe coxficiengii binomiali Cy! ,C,? y.. Cy? in care gi p sunt introgi pozitivi dai {p < n), stind ci exists urmatoarea relayie de reeurent c= UE*D as pond PL2. Pentru a, b sin daji (a,bER, neZ) si se calculeze x gi y astfel ca asi: 1)" , irda folosi formula lui Moivre. S| pomind eu 2 PAB. Sirul (x4) generat cu relajia de recurengi 2, i a mitt Va. Pent oarecare, sof ete comezet rearaasd gee dat, s& se construiasea un algoritm care caleuleazd Va ca limits a acestai sireu o precizie eps data, PLA, Pentru calculul lui ‘gs x se genereaz sirurile (a,),0.} si (cx) eu relaile de recurengi <2 porind eu a =x acd a, 22 pomind cu by = ack @2,<2 Gat, dacka? , 22 pomind eu ¢,=0 Se tie e& ponte 10 Pentru x dat, si se ealeuleze e* eu o precizic eps dati So £3 Van? satisace condita |S ~/3]< € imcare eps este dat. Se tie ed: fim PL6. Si se determine valoarea n pentru care: S PL. nerate cu relafile de recurent tb) 2 Se sie 8 a beta , co = gama, alfa, beta, gama date. Cunosedind SE Nie Get iri sunt convergente gi ano Timitl comand, sh se ealeuleze eu Oo preczic eps data acoast limita ‘Cumosefind data eurentexprimats prin tri numere inte reprezentind anu, fon, siva precum si data nasteri unct_persoane exprimata in acelasi mod, st te Gaeuleze varstapersoanel exprimata. ina, luni gi alle, Se considerd in rod simplificator toate lune av 30 deal. Se citese trci numere reale poztive ordonate erescitor. Si se verifice dack SSesten pot si reprezinte lature unui triunghi si in caz afirmativ s8 se Stabile’ natura trnghialuisosel,echilateral,dreptunghic sau oarceare gis secalcaleze aia sa Indicarie: Trei segmente de lungime x, y si £ pot forma un triunghi dacd indeplinese relajile. x+y dyizorul prim cu multiplicitatea maxima, Daca exist mai multi divizori cu ‘muliplicitate maxima, se ia cel mai mare dite ci. P1_24 Modficafi problema RI_17 astfel incdt argumentel si fie redus la primul saat cctant. Se sie c&: sin (x) = cos) + iar seria Taylor pentru caleulul cosinusului est 35 Programare in C/C++ Culegere de probleme Capitolul 2 Functii Breviar Definire functie tiprezultat mume_functie( tip variabial_1, tip ariabila2,... ) @eclaratii; instructiuni; ) | Apelare funetie // apelarea unei functii care nune_functie (1ist& parametri, // apelazea unei functii care vatiabila = nune_functie (list&_parametri_efec! intoarce rezultatul void efectivi); | intoarce un’ rezultat vi) Probleme rezolvate i R2_1. Trei valori reale sunt citite fn variabilele a, b, c. SA se faca schimbarile nevesare astfel ined valorile din a, b,c 88 apara in ordine crescatoare Rezolvare: Vom face interschimbiri intre numerele date, astfel inet s& le adueem in cordinea dorita. Vom avea de fticut maximum trei interschimbaci. Parametrii funcfici de interschimbare se modifica, motiv pentru care vor fi transmigi prin referind, | sinclude elude imbare doua variabile (int ga, int ab) ¢ : | Capitolol 2. FUNCTIL LL SE int a, bye? } printt (+ Introduceti pe art); scanf ("4d") sa); | Brint£ (" Introduceti pe bi")! scan ("8d") 6b); Brintt (" Infroduceti pe ec: "); scant (-ta", ac); | 77 Teste pentru mdificarea ordinii variabilelor if ta > b) | swap (a, Dd; ifta> cb swap (a, c) fib > e) swap (b, chi J AEisare rezultate printé (" Sortat: a= td \t b= %d \t a getch(); R22. De pe mediul de intrare se citese n valori ntregi pozitive. Pentru fiecare element si se indice ce! mai mare pltrat perfect mai mie sau egal cu el ene Rezolvare: Definim 0 funcjic int patrat (int), cate introduce patratul perfect ‘cel mai mare,mai mic sau egal eu numarul dat Peppers ee Waclude | Hnelude #include [/ Calculeaza col mai mare pat ine pateat (int a) ¢ ited; return (1 * i> a) 2 (2-2) *GH void main (void) ( elescr(); print’ (* Introdueeti n: *); scanf ("td", En) 77 Prelucrare date si afisare rezultate for {int i= 0; i< nz ite) ( printf (" Intrcduceti elementul %d scant ("8a", fab; printé (*Patratul perfect mai mic sau egal cu x est Saya", “aan patrat(a}}: ) geteh(vs : 7 CoC, Cuegere de probleme Programa R23, Sa se verifice daci un wumar intreg_citit_de pe mediul de intrare este palindrom, adica se cteste la fel de Ta stinga 1a dreapta side la dreapta la Ftanga, (numarul este identie cu rastumatul siu). Un astfe! de numa este $517154. Nu se. vor folosi tablouri de variabile pentru. pastrarea eifte- lor numarului Reqolvare: Vor face imparfii repetate ale numrului dat la 10, construind eu ajutorul FRitiat acestor impiitt numarul invers. Acest algoritm este implementat in funcfia palindrom. () Ta z ae 13) eS | include Hinelude Winelude // Verifica daca n este palindrom {nt palindrom (int nm) ( int nsalv = ni // salvan pen ing nciny = 0; Yo mamaral rasturnat al lui n waile™(n) inv = niny * 10 +n 6 10; n/= 105 return (n_salv == ninv) ) void main (void) ( iat n: Minee (* tntroduceti mumarul: *); seané ("84") Sn) 7) MEigare rezultate i (palindzon(n) ) ‘print’ (" Numarul este palindrom\n"); else ‘printf (* Nunarul NU este ‘palinrom\n"); getch() ) de introgi, SA se afigeze accle RIA. Se eiteste un inireg m gi n peechi (a, 6) Capitlul 2. FUNCTIT T while Gr return a; ) int prin(int n) ( Ant div; if{n 8 div return 1; ) void main (void) ( int n int a,b; scant ("84", en); for (int fen; for (¢ive2; divédiv // stabileste daca n este prim 11 Citive date de intrare printf ("Introduceti numarul de perech: ie) 3: div printf (" introduceti perechea td: ", i); scant ("8d8d", ka, kb) 7 Sf (prim(cmmdc(a, b))) print£("emnde(#d, #4)=8a\n", @, b, emméc(arb)) + ‘eare au indicatorul Indicatorul lui Euler al unui numa x este numarul de numere naturale mai nici ca x i prime cu el Se citeste un intreg n gi m numere naturale, S& se afigeze acele numere Euler o putere a lui 2 Finciude Finclude 7/ caleul emnde cu algoritmul Jui Buclid ine emmdc (int a, int b) ( : int 7 do (r= a tb » b; finelude iE (b="0) return a; yeturn enmdc(b, a % bir perechi al cfor emimde este un numa prim Rezolvare: Rezolvare ER fl 4 5 rae #include J/ calenl cnmde ca algoritmul lui Euclid recursiv int omdc (int a, int b) ( 38 30 Progeamare in C/C++, Culegere de probleme 7 ealeuleaza Tndicatoral Tal Guler al mumaralal w Ant ipuler(int a) { int ind=0, j; for(je2; jens j++) if(enmécin, 3) indy return ind, ) {/ stabileste daca n este o putere a lui 2 ine puterez (int n)¢ while(n $2 == 0) m/s 2 return nm ) void main (void) ( int n: int x; 1/ Citire date de intrare printf (* Introduceti numarul de numere: en); for(int isd; i < ny ise) ( scant (*4a", x); if (putere? (ruler (x})) printf (*8a\n-,x); 2 scanf (*8d", ) getch() R26. Si se stabileased codomeniul D al valorilor funclii:f : [x1, x2] —> Dy fzax'tbxec, a,b.ceR, a#0, Se cunose a, b, 6 ik Rezolvare: Aver trei cazuri: 2) xem <- 2 imaceat caz D= [min(F(xi),f(2)), max(fler) fle2))] by x <-B0 sav «<0; astel: 2a b a #dacha>0, D A(- Joes Uta. fee + dacda-<0, D=[min(fG,) f(a), (-E) 8) i ag in acest caz D=[min(f(x1),flx2)), max(flxi), fla2))] ‘Yom folosi o funefic cate caleuleaza fs), precum si dou funefit care intore minim fimaximul dintre dowd numere date ca paramet “0 Sepp ‘Finelude Hinclude // Calculeaza valoarea functiei intr-un punct Gouble (double a, double b, double c, double x) return asxtxebKecy ) (/ Calculeaza minimal Gouble min (double a, return (a>b) ?bias d ‘ a doua numere double b) ¢ | a doua numere double b) « J) Calouleaza maximut Gouble max (double a, return (a>b) ?a: > void main (void) ( double a,b,c, x1, 22: elrscr()! et tose while (1a) printf {* Introduceti a (diferit de 0): Scanf ("1£", Gab; ” ) printf (* Introduceti b scant ("81E", ED); printé (* Introduceti cr"): scant ("R1E", éc); printé (" Introduceti xt: "): Beant ("SLE") xl) 7 printf (+ Introducet x2: Beane. Suni 0217 . . Bick ampeie radacini sunt mai mari sau mai mic i) Becac bide ave £(al) si fu) extrenicaes fe Cian © pire) ae G2 cbse LT (4 5 “BiGra) ae Ga > 2b/O40))) printl (2 ponenial de valor este (41f,616) .", rnin (Eavbse,a) £la,bre,22)), max (Earbiensa), flaybierx2))5s \ else TE ca oy ¢ : ‘ // Altfel, £(-b/2a) este minimul functiei {* Domeniul de valori este (tif, 1£] f{a,b,¢,-b/(2ta)), max (£{a,b,6, 71) » E(a,b,c.x2))15 > printé else 41 Prowramare in CIC++. Culegere de probleme 77 RIEL, F(-b/tay este maximal Fanctier printé (" Domeniul de valori este (S1£,81£) .*, \ P min (£(a,b,c,x1), £(a,b,c,22)), Elasbe,> by (ay): ) ) | geten(); | R27. Sa se rezolve ceualille f;(x)=x*+pxtg=Ogi fz(x)=rxttsxt cu precizia eps dati, stiind ot are fieare o radcind int-un_intervalul [a,b] precizat, Se va utiliza metoda injumatajiritintervalului (metoda biseetie). Rezolvare: Se imparte intervalul [a, 6) in dowd parti egale, Fie m mijlocul intervalului. Dac la capetele intervalului [a, m] functia are semne contrare solufia se va eduta in acest interval, altfel se va considera intervalul [m, b]. Se considera determinat& solujia dacé marimea intervalului a devenit inferioard lui eps sau valoarea | fim) | < eps. Vom folosi doua functi, una care aplic propriu-zis acest algoritm (bisecfie) si una care calculeaza valoarea functci fQ) intr-un punct x Functia bisectie () are 3 parametri: capetele intervalului intial a gi b si precizia cps. Ea poate localiza raidcina wnet singure fet $i anume, f(x). Daca se doreste ca functia de localizare a unei rédacin si fie aplicabitt oricdrei func aceasta trebuie data in lista de parametri (al patrulea parametra), ca pointer la Funetic, procizind tipurile parametrilor functici si f0) tipul rezultatului intors de funcjie, Data fiind diversitatea formelor pe care Ie poate avea functia f() ~ polinom, coualie transcendenta ete, vom considera aczasta functie cu un singur parametru x de tip float, cu valoare de tip float, adic float £(£loat) , parametrul apirand in funcjia bisect-ie() sub forma float (*£) (float). Funefia bisccfie va fi apelaté de dow’ ori cu util parametr fi, respect f Pentru a simplifica transmiterea paramettilor funefillor fi) ~ p gig si,A0~ rt intrefuncjia main () si funepile respective, vom utiliza variabile globale, Winelude #include #include #include IJvariabile globale communicate functiei £1 Jivariabile globale communicate fynctiei £2 float p, ar float r,s, t // Calculeaza valoarea functiei £1 intr-un punct x Hloat £1 (float x) { return x*x'x + ptx +a7 Capitol 2. FUNCTIL /} Calcuieaza valoarea functiei £2 intr-un punct x float £2 (float x) ( return r*xtx + st +ty ) j/ Rolica metoda bisectied pentru o functie data ca parametru i/ si insoarce radacina aproximativa x. double bisectie(flost a, float b, float ep: float (*£) (float) { float x,y? 1/ Tresuie sa verificam daca nu cunva radacina 77 este chiar mijiocul intervalului de intrare, 7) pentru ca in acest caz nu se mai intra in ciclul while. int passed while ( (b - a> eps) && (fabs( £((atb)/2) } > eps) } { x = (at) /2 y= EGO? if (f(a) ty <0) void main (void) ( ‘float a, b; // Limitele intervalului de separare a radacinii . float eps; // Precizia calculului elrsce(); printf (* Introduceti precizia: "); Scant ("8E*, beps); . printé (" tntroduceti parametrii functiei fl: p si a: Scané ("8£8E", &D, Sa); F 7 printf (" Introduceti parametrii functiei £2: x,8 sit: "17 seanf (*#£ef28", Br, 5, Gt): . printf (" Capetele intervalului pentru functia fi: *); scant ("8E8E", ka, &b); . printf (" Radacina este: $£\n", bisectiela, b, eps, £117 printf (" Capetele intervalului pentru functia £2: "); scant (*8£tf", ka, kb); printf (* Radacina est: getch!): d ‘E\n", bisectie(a, b, eps, £2)); 3 2 a Programarein CIC++, Culegere de probleme R28, De pe mediul de intrare se citese cifrele reprezentarii unui numar intreg {in baza 16, urmate de caracterul H (cifrele hexazecimale sunt Oy.n9, Ay B,C, D, E, F), Si se calculeze gi sa se afigeze reprezentarea nunsirului baza 10, Recolvare: Un sumér care are kcifrenyny...ny.y fn baza 16.se serie in baza 10 ca fiind 16° ns 4 + 16! mp2 +e + 168? my + 168M ‘Vom lua in considerare si faptul e& utilizatorul poate introduce atft ‘a’ cét si * pentru a reprezenta pe 10 in baza 16, atit "ly cat si “B’ pentru {1 ete. Functia strlen () folosita in program intoarce lungimea unui sir de caractere pe care il primeste ca parametru. Winclude finclude include’ Hinelude #include JJ Serie reprezentarea in baza 10 a lui n Ant convert (char *n) ( int result for (int 4 t i€ (n[i] >© ta") ay, TORRE fe EL = Va" + 20) + powia6, eextenin) ~ 4 - else if (n[i] >= tA") result += (n{i] - ‘A’ + 10) * pow(16, strlen(n) - i - else AE (atl) >= +0") result += (n{i] - '0') * powi26, strien(n) - 4 - 1); ) return result; ) void main (void) ¢ char n(10]; elrscr(); printé (* Introduceti mumarul: "); scant (*s*, n); printé (" Numarul in baza 10 este: #4", convert (n)}; getch(); R29, Numercle naturale pot fi cla Capitol 2. FUNCTIL sificate in: deficiente, perfecte sau abundente, dup cum sua divizorilor este mai mic, egal sa mai mare deed valoarea rumrului. Astie: = 12 este abundent deoarece ate. suma divizorilor sd=1+2%344+6= 16> 12, n= 6 este perfect: sd= 1+2+3=6, iar n= este deficient deoarece sd = 1+ 2+7< 14, 4) Definii o finejie avd ca parametns un numa tntreg n,functie care Tntoarce ca rezultat 1, 0 sau 1 dupi cum numirul este deficient, perfect sau abundent. b) Scricfi o fincfic main () care citeste dow’ valori intregi x si y si clasificd toute mumerele naturale cuprinse Inire x si y in numere deficiente, perfecte sau abundente. Rezolvare: ) > Finclude #inelude define DEFICIENT -1 define PERFECT 0 #define ABUNDENT 1 /* calculul sumei divizorilor unui numar: */ int guna divizori (unsigned int n) ¢ int i, 8 = 1: for (i = 2; i <= n/2; iss) if (n Bice 0) 8 t= iy return s; 7+ functie care intoarce tipul numarului (DEFICIENT / PERFECT 7 ABUNDENT) : */ int tip numar(uneigned int nd ¢ int § = suma_divizori(n); if (s n) return ABUNDENT; return PERPEC! void main(void) ( int x, yi int i} J* citivea si validarea datelor de ifitrare: */ ao ( printé(" x 4s Programare in CIC++. Culegere de probleme secant Ct, TT printé( y="); scant ("8d", By): it (ee 0 || y <= 0 I] > v) printe(" Trebuie ca 0 Wr for (i = x i » 0) ‘convert (n fb, D)r if (b < 10) printe ("ea") n & BI; else if (gb > 10) printt ("fc") (n @ b) = 10 + 'a* else printf ("td", nb): b void main (void) ( int n, br elrser'); printf (" Introduceti numarul: "); scanf ("8d") en)7 printf (" Introduceti baza: *); scanf (*td", 6b); Brineé (* Numarul in baza @d este: *, Di; convert (nD); getch(!; 1R2_10. Dandu-se numérul intrg a sa se determine primele n cifre ale reprozentari ll intr-o baza b dat Rezolvare: n vedere resturile repetate ale impsrfirii lui a la b, pana cdnd edtul este 0. daca vrem si convertim pe 28) in baza 2 avern: Vom avea 1%2=1, Reprezentarea in baza b este dati de citirea resturilor in ordine invers& (din acest moti hineia de calcul trebuie si fie recursiva). Pentru exemplul dat, reprezentarea in baza 2 este 11100. | este adevarata $i R2_L1, Scrieli un program C care confine urmatoarele func: 1) Funojie care caleuleaza emmdc a doua numere naturale, b) Funefie care simplified o fractic rajionala prin emmde al numaratorulat si mumitorului. Func{ia are doi parametri pointeri la numaratorul st humitoral fracjic gi nu intoarce nic un rezultat. |e) Funcjic care aduné dou fractii rajionale, objindnd tot 0 fractie Tajionalé, Funchia are 6 parametri: 4 intregi reprezentind cele dowd fracjt care se adund gi doi pointeri citre numaatorul st numitorul racic rationale rezultat Funefianain() 1. Citeste un intreg m gin fracitrafionale, pe care le simplified 2, Caleuleaza suma p/q a celor n fracti $i afigeaza mumercle p gi g- Rezolvare: Vor aduna tracfile, pe masurd ce le citi, la suma deja obfinuté (pentru a mu fi nevoie si le memorim pe toats). La sfarsit simplificdm si fractia p/g (care reprezinta suma lor. Funcfia assert. folosta in program testeazi dacd o expresie primité ea parametru include - include Hinclude {/ Serie reprezentarea in baza ba lui n LEE ccaz contrar incheie execufia programalui, Zipp. jee Se ae include Finclude Hinclude finelude ye * col nai mare divizor comin al numerelor a sib 46 a Programare in C/C++, Culegere de probleme + (ealealat cu aigoritmal tui Guclidyy e Ant ommdc(int a, int b) ¢ if (==0) return a; return cmnde(b, a ¢ b); ) /* simplificarea fractiei a/b: */ void simplifica(int ga, int &b) { int @ @= cumic(a, b); alsa: bss a; } a. * adunarea a doua fractil: "as / bs <- al / bl + ad / ba “ void aduna(int al, int bi, int a2, int b2, int gas, int bs) 4 simplifica(al, bl); simplifica(a2, 62); as sal * b2 + a2 * bl; bs = bi * ba; simplifica(as, bs); ) void main() ( int n: . // numarul de fractii int a, by // numaratorul si numitorul fractie{ eitite int p, a: // nunaratorul ei numitorul rezultatului print£(*\n Numarul de fractii = *); scant (*8a", an); pe0;q=2 for (int i dice ny ime) ( printf (*Mumaratoréd = *, i); scanf(*8d", ga); printf (*Numitoréd = *, i}; scant (*Rd", Sb}: assert (b != 0}; simplifica(a, b); aduna(a, b, DB, a Bs as ’ simplifica(ep, ka); print (*Rezultatul este : 4 / td", p, a; getch(); 48 Capitotul2. FUNCTI R2_12, $i se serie in C a) 0 funefie pertru calculul valor funetiei fx) ‘x pentru xS-1 Sixd=|View pentru -texet spent x21 1) © ‘anes peta cael negra dint prin meted trapezeor Cu m pasi cgali, pe intervalul [a, b], dupa formula : 4 sors rorea8e seein) eee rae ©) Unprogram care calculeaza integeala functiei definite la punctal a), folosind funcfia b), pe un interval dat [p, q], cu precizia epsilon (ce repeti caleulul integralei pentru n= 10, 20, .. pagi, pana cind diferenja dintre doud integrale succesive devine mai mica decdt epsilon. Rezolvare: Vom implementa direct formulele date in funefile £ gi int_£ imp | Finsiade cataio > Hnclude ceontoste Hnclude eatnsi> double f(double %) ¢ | te test) were) rear 3 elpe return sqrt (h = x°x); ) double int_£ (double a, double b, int n, double (+£) (double) ) ‘ double h = (b ~ a) / (double)n; double result = la) + £(b); acl; its) result += (2*f(a+ (double) i*h) ): return result*(h/2); 9 eogeannar n CiC+4, Culegere de probleme [wiamain way SSOSSSSSSCSCidS ‘gouble x: int ny double a,b, eps: Gouble int ft, int_£2 peinté (" Inezoducets x Bean€ ("#1f", 6x); peinté ( Linita inferioare a intervalului de integrare: ” Beant ("b1E™, Ga): printf (* Limita superioara a intervalului de integrare: Beant ("B1E, Gb): printf (" Procizia de integrar‘ Beant ("B1£", &ops) ; 77 calculam E(x) si afican rezultatul princes (" £0818) = Q1E\n", x, £00); 77 Calculam integrala si afisam rezultatul Gnt_£2 = int_fla, b, 10, &£); “: int_£2 = intlf(a, b, 20, &£)7 a= 20; waite ( fabs(int_£2 - int_f1) > eps) ( 2s int_e(a, by n, GE); ) printf (* Integrala din £ pe (¥.21£,%.21£) ests int £2): e\n", a, by geton(): ) R213. Ubilzind 0 func pent ealeull celui mai mare divizor comun a dou numer, si se ealeuleze exm.mac, a.m elementetntregi ale une! liste date. Rezolvare: Vom apela repetat functla ast smd (ame y .5Mt Pa) cemmde(ernimdctti a, ns Mads Ms) cmd ayo ‘ema, y+ tt) zim 2 Re eat Hinclude b) return crmdc [a-b, Di TE (a (/ Veritica daca un numar este prim int prin (int) { for (int {= 2; i < k/2y ive) i(k @ 4 == 0) return 0; retura i ) void main (void) ( int lista(30), nz 7/ Peatru calculul numaruiui prim cel mai apropiat int index; 7/ Gitire date de intrare printf (* Introduceti n: seanf ("8a") én); 31 Progeamare in C/C++. Culegere de probleme To ) 3 9 2 for (i = 0; i include #include Hinclude i” * calculul valorii unui polinon: * p= coeficientil polinomilui; a - gradul polinomului * x - punctul in care se calculeaza " float val_polinon(float p[l, int a, float x) ¢ int iy float val; val = pin} for (i= n- 1; i >= 0; i val = val * x + pli): return val; ) in * derivarea unui polinom: +p, m ~ coeficientii si gradul pelinomilui + pd, nd - coeficientii si gradul polinomului derivat ” void deriveaza_polinom(float p{], int n, float pal], inte nd) € int i: if (n ad palo] = 0; ) alae (nd =n 4; for (i = nd; i >= 0; f--) pati) = (2 #1) * plied}; ) d void main(void) { float p[20], pal20}; //coeficientii polinomilui initial si Iderivat ‘float eps; /( precizia float xcrt; // aproximatia curenta Int wad; 77 geadul polinomulul Inieial, respectiv derivar char ¢ cout << "Gradul polinomului (>=1) cout << * Tntroduceti coeficientii polinomlui for (int i =n; i >= 0; i) { cout << tat cc ice tat cin >> pfil: Hy cout << * Precizia = *; cin >> eps; cout <<" valoarea de pornire = cin >> xert: deriveaza_polinom(p, n, pa, nd) cout << "Aproxinatiile succesive pentru radacini:* << endl; do xprec = xcrt; . /7 noua aproximatie pentru radacina wert = xprez - val_pelinom(p, a, x prec) / val_polinom(pa, nd, prec): cout << setprecision(5) << xcrt << endl; ) while (fabs (x ert - xprec) >= cps): cout << "Aproxinatia finala este * << setprecision(S) << ert << endl; geteh(): 1 << endl; R35. Un numar de bare (S100) sunt date prin tungimile lor, Se daw de fsemenea P categorii de lngim (sa standarle) intre care trebuic si se fncadreze lungimile pieselor (P10) © categorie de lungimi este precizata prin 2 limite: una minima si ccalalté maxima, Presupunem ci aceste categorii de lungimi formeazé intervale sjuncte. © O piesa i se incadreazi in categoria de hungimi j daca: LMINU] $ Ltd] LMAX(. Si se calculeze gi 8 se afigeze: ‘numarul de piese din fiecare clast dimensiunea medic a pieselor din fieeare clas de lungimi ‘© numarul de rebatur gi angimite baretorrebutate. float xprec; // aproximatia din pasul anterior 6 Programarein CiC+4 Culegere de probleme Capitolul 3. TABLOURT UNIDIMENSIONALE (VECTORD $1 POINTERL Rezolvare: T atisee wamaral de plese din flecare clase st Simens nedie Sapp ee TRA aaa Ds E for (i=0;i Pinelude #aefine MAXN 100 Yaefine MAX_P 10 int main(void) ( int a,p) Float’ bare (MAX I], Lmin(MAX_P],1nax(MAK_P]; //date de inteare nt categ(MAX Nl; // categoria in care intra fiecare bara 11 vom initializa acest vector cu -1 int ne_piese[MAx_p]; // nunarul de piese din fiecare clasa 7/ lungimea totala a pieselor din fiecare clasa 77 {aceasta va £i folosita pentru determinarea mediei) float lungime(wuLP] ; int rebuturi; // numarul de rebuturi int i,3: dicitize print£(*n="); scan ("td", Gn) ; for (de0;denire) ( peinté("Lungimea bared €d:", il; scent ("6E",&bare(i}) 7 categ(i 7/ na cunoasten din ce categorie face parte printf ("pe"); scant ("84", 6p); for (i=O;iepiit+) ( printf ("Liin(td)=",i); scanf("$£*,lmin(i]) 7 printf ("LMax(@d]=",i)7 scanf("8£",lmax(i]) > prpiesefi Aungime(i]=0; ? 7/ calculan vectorii categ, nr_piese si lungine rebuturi-n; //initial toate piesele sunt rebuturi for (is0;icn:iv+) for (j=0;i: categ{il=3: nr_piese(3]++: a Lungime(3] +=bare(ils zebuturi break; float medie=Lungime(i] /nr_piese(i); , printé("In categoria &d exista $d piese; dimensiunea | |} medie este §.2f\n", i, nr_piese(il, medic): 2 // efieez numarul si lungimea pieselor rebutate printé("Rebuturi: $a\n",rebuturi); «For (i=0;denz i++) i€ (categli}==-1) printf("Rebut: @£ \n",bare[il) geten(); return 0; R36. Doi vectori x gi y au n, respectiv m elemente reale distincte (mm, n-$10). ‘Sa se creeze tn nou vector z cu confinind clementele celor doi vectori. Elementele ‘comune din cei doi vectori apar in z 0 singurd data (retniunea elementelor ‘muljimilor eprezentate de evi doi vector). Rezolvare: Muljimea reuniune conjine att clesentele multimii x eat gi elementele ‘mulfimii y, dar o singura data. De aceea trebuie s4 fim atenfi si nu ‘introducem emnte duplicat in vectorulz. Algoritmal este urmatoru: 1) 'Se introdue in vectorul z foate elementele vectorului x (acestea sunt confinute ia reuniun> si sunt dstincte din ipotezele probleme. 2) Se parcurg. pe rind toate clementele vectorului y si se verified dac8 apar in ‘vector x. In caz negativ sunt introduse in veetorul 2, // Citeste un vector de elemente reale de 1a tastatura iy Argunente: ‘vy - pointer la adresa vectorului u tn - pointer la adresa varfabilei ce retine hhunaxul de elenente al // sirului void citeste vector(float tv, int *n) ( printé(*Nunarul de elements scané ("8d") n) 7 | for (ledsictnsisey ¢ print£(*Elementul @d:",4); Scant (*8£*, &v(il): mde a 6 Programare in C/C++. Colegere de probleme 77 Realizeasa Feaniune waitin lo Fepreventave de vectorit © ay. 1/ nisi m eoprozines munarul de elenente al vectoritor {1 be ceeasa vectort1 ce va sven elenente, Vtg reuntone(tioee hy ey foat yy Ine hy float ty in int &,jyelemente, ine gaat; lenentesd; {/ ndaug sinentele vectoculai x in vector for (iad:tensit+) Belenentere]=x(i1; 1/ adaug a1 slomentele vactorulat y for (isd;iemrise) ( gest eanafa U=bi}sn/340 Hveritic daca ytt} esce in Sf txts}eeytin) ¢ geeted Breaky ) 44 (igasit) // in cas negativ este adauget in vectorul z aa Ke edaugat , z{elemente++]=y{il; tkselenente; } 1/ Mfiseaza-pe ecran elenentele vectorului 2. void afisare(float *z, int k) ( int i=0; print£(*2=( *); for (is0;ick:i++) printé("’.26 *,2(4)); printe("}\a"); int main(void) ( float x{10]; int nj float y{10]; int m float 2(20); int k; // poate avea maxim 20 de elemente ! citeste_vector(x,an); // Citire vector x elteste_vector(y,am); // Citire vector y reuniune (x,n,¥/M, 2, 8K) 5 | afisare(z,k): return 0; Capitol 3. TABLOURI UNIDIMENSIONALE (VECTORI) $1 POINTER R37. Se citese n ( n & 100 } coordonate reale x, y ale unor puncte in plan si se crosaza cu acestea dou tablouri x 5 «SA sc gfigeze toate tripletele de puncte coliniar. © Si se afigez: punetele i,j, & pentru care arin tiunghiului determinat de faceste puncte este maxima Rezolvare: Aria determinata de punetce i, Dac punctole sunt coliniere, atunci S = 0. ae fdefine MAXN 100 // mumarul maxim de puncte }/ caleuleaza aric unui triunghi determinat de punctele 11 Wdsy}) (2,2) 03,¥3) Host srie(float x1, Eloat yi, float x2, float y2, float x3, #loat v3) { eeurn. (xi *y24x2*y3ex3tyl-x3 4y2-y3txd-y1 32) /25 } int main(void) ( int ni; Eloat x {MAX_N],y (MAX; int i.3,k: float arie_maz--1,a; // Aria maxima este initial printé(tm=") ;scané("’a", én); // Citire n 7/ citire coordonate puncte for (is0:iensz+4) [ print£(*x 84l=" i); Beane "28%, ax14})2 printf (*y:¢d)=" i); gcané (78, gy (41) 2 } 7/ Se determina punctele coliniare printf ("Tripletele de puncte coliniare:\n"); for (i-O;icn;ie+) for (Koj +L; kei rie (e(4],y (8) ,xC5),¥13) 20) -¥ U0) 5 GE (acd) // arie=0 ~> punctele sunt coliniare DEIMEE(* (b.2E, 8,26) (8-26,8.26) (8.26,%,2£)\n", wef) YC) x13) yet -y ODD 5 else if (arie_maxca) // Betermin aria maxima 6 Progeamare in C1C#+. Culegere de probleme 77 Se determina telunghiurile de arie print£("Triunghiurile de arie maxima:\n‘); for (i=0;iensite) for (J-itisjensat+) for (kej+likenskes) ( sario(xti}, yf), Finclude #aefine NUAX 30° // ne. maxim de elemente dn vectori Capitolut 3. TABLOURI UNIDIMENSIONALE (VECTORD $1 POINTER 7e-Gietee de wunere Ge Ta tastatura SY menorarea Tor Tatean vector: int exes int x: int 2 wector(int vect{]) ¢ SyYeienentul curent citit de la tastatura jing. de elenente care se vor citi a= 0: Beinté;*introduceti elenentele tabloului(-1 la sfarsit): \nt): j while (x 1 return nj ) /* cautarea elenentului y in vectorul (de n elemente) x: */ dne‘cauta(int yy int m, int x{]) { int i for (i= 0; i < my ite) Le (e[i} == y) return return 0) ) /* eliminarea elenentului de pe pozitia p din vectorul x: */ f) (ee zeactualizeaza lungimea na vectorului) */ fold elimina(int p, int x{], inten) ( int j for (j= pi 3 /* gasirea mimimului dintre elementele x{iJ, x[i+1], x{n-1]: */ Ant gaseste min (float x1], int n, int 4) ( float miny int int poz_min; /* pozitia pe care se afla elementul minim */ min = x[il; poz min = for (ks itd; Ren; kes) Af (min > xlkl) ¢ min = xtk]; poz_min, d return poz_min; d /* interschimbarea elementelor x[p) si x(q): */ void interschinba (float x[], int p, int q) { Float aux; aux = x{p]: x(p] = xlals xlal = ame; Capitoul 3. TABLOURI UNIDIMENSIONALE (VECTORI) $1 POINTERT [rola main voray 7 float 0(2017 ine'm, i ine pos: DrintE(Snudérud de elenente din vector Beanf("ede, en): S. Drint#("incrodceti elenentele vectoruluis\n"): for (is On ven) Set) peineé(ratta) =", i): Soank(seet, sali i: , feo ee por gageatemin(a, ay i): Unterschinbala, fy poe): ) print£(*Vectorel sortat:\n"); for (i = 0; ism ive) printf(*® 6.26 ", alil); getch(); R3_10, Si se ordoneze crescitor un vector ce contin" numere intregi (n < 100) utilizand metoda contorizarii inverstirilor (demumiti. si meroda bulelor) Attn cht si mimerele vor i citite de la tastaturd Rezolvare: Ba include — Adefine MAX_N 10¢ // numarul maxim de elemente ale vectorului void ewap(int i, int J, int® x)( int temp. = x(i]; xli}=xt3); ) ea I=Eeep: 1/ Soxtare vector folesind METODA BULELOR yoia bale(int n, int* v)( ine soreat, ; — arc sortatel; // initial, ene este presupu: tat for tico; f/ define MAK_N 100 1) Adauga un element in vectorul v, astfel incat acesta sa ramana sortat. 7] n~ numarul de elemente al vectorului inainte de adaugare {/ element - elenentul ce trebuie adaugat 0 ‘wold adauga (float *¥, int *n, Float élenent) T int i=0,37 {7 gasesc locul unde trebuie inserat while (v(i] Hinclude Adefine MAK N 100 11 cautare binara ecursiva a velorii y in veotorul x 11 intoaree pozitia (poritiva) in care gaceste pe y in x (1 sau 0 valoare negative indicand positia unde erebule ineeraca (i watoazes ineeB(int i, int J, double y, double *x) ¢ £0 > 3) return ine m= (69) 72: if(y == x(m)) return m ify < xtm}) return CB(i, m1, y, x); else return CB(m+1, 3, ¥, x); Lee SAREE, ES MEE Hilo ABS ise acest // altfel, ramane acelasi numar de void main(void) ( int nel, i; double x(MAXN], y; // citesc elenestele de la tastatura while (1) ¢ printf(*Introduceti un element: *) ;scanf(*81f*, gy); ie <.0) ¢ : a if (n == 1) break: ns insertin, y, x); ) n 77 Ritsex vectoral sortat printf (*Vectorul sortat: "); 77 vectoru. a fost deplasat 1a dreapta cu o unitate for (i=l im; ie) ( if Gast! & 5 == 0) ‘printe("\n’ printf ("\e8.216*,<(4})7 ) printé("\n") getch(}; R313. Sé se ordoneze creseAfor un vector x cu n componente utiizind sortarea prin mserpie, Veetorul se considers parttionat in dou’ zone: « zona ordonati format initial din primul element + zon neordonat format din restlelementelor Se extrage in mod repetat primul element din zona neordonats si se ingereazi in zona ordonati astfel inet relaia de ordine SA se” pistreze Sil inal gi el objinut prin ordonare vor i afigate cu cite 10 clemente pein. aa. TIM ‘Winclude Winelude vold insertie(int n, int* v)( for(int kel; k < np kee) ( int temp = vlklr int j= ki while(j > 0 a& temp <=v[j-11)( vij} = vU-ll; ) } // Punctie pentru afisarea unui vector void print_voo (int *v, int n) 1 jen; 34470 0) cout << endl; ee vis) B Programare in C/C++. Culegere de probleme Capitol 3. TABLOURI UNIDIMENSIONALE (VECTORD $1 POINTERL void main(wola)¢ ny ji james v = new ine int; cout << "Introduceti elenentele vectorulu: | fortd=0: denr See) ( cout <<" Elementul " << 5 <<" cin >> v{il; << endl; print_vee (v, n) insertie(n, vb; R3_14. Sa se sorteze un vector folosind algoritmul lui Shell (Shell Sort). In acest | seop se sorteaza mai inti clementele subsirurilor situate la distanga d. Se reduce apoi d si se repeta sortarea pand cind = 1, Intervalele d se | genereazi, de exemplu, cu relajia d=3.d+1. De exemplu, daca n = 1000, 1 se pomeste cu d= 364 si se reduce cu d= Rezolvare: 'R3_15. Dindu-se o valoare x si un tablou a cu n clemente, si se separe acest tablow indoua partiii astfel incat_elementele din prima partfie s fie mai mici sau egal cu 4, iar cele din a doua parttie strict mai mari decat x Rezolvare: z Viinterschinba elenentele de pe pozitiile = si d yoid swap (int s, int a, int *a)( int aux = als] als) = ald); ald] = aux: } (/Realizeaza partitionarea. int partitie(int n, int a, int x)( ints, di while(1)( s=-1; d=) while(al++s) 0 && al--a] > x); if(s == ab break; else swap(s, dy a): ) swap(s, d, a); returns? i Tike ; oid shell (int n, int* v)¢ nt i, 3, temp; for(isdy i < np ist) ( jst mhile(j>d-1 && vii-dl>stenp) ( vii] ~8] peed vii] Bia-us 3 ” [ R316. Sk se sorteze un vector flosind algoritmul sorta rapide (Quicksor) Rezolvare: Vom alege mai intdi un element din vector drept pivot (putem lua primul sau ultimul element, sau elementul median, ca in cazul de fata, sau un tlement aleator etc). Sirul de sortat este separat in dou’ parti: partea stingk ~ cu clemente mai mici decat pivotul, si dreapta — cu elemente mai mari sau egale cu pivotul. in acest moment, pivotul se afl& pe pozitia in care ar trebui si fie in vectorul sortat si mai ramane si ordondm partiflle din stanga si dreapta lui, aplicdnd acelasi algoritm, Procesul de partijionare continu (reeursiv), pnd cdnd partitile ajung de tungime 1 Funofia de partifionare este usor modificati fafa de problema R3_15, pentru a permite pattifionares unei portuni de tablou, Functia intoarce pozitia primului element din Partijia dreeptd, Pentru a realiza sortarea unui vector, se va apela functia QuickSort. 75 Programare in C/C++, Culegere de_ probleme Wold QS(int, int, int*); Ant partitie(int, int, ine, ints); void aap (ing sy int'd, ine #4) { als) ala) ? ala; void Quicksort (int n, int® a){ Q5(0, nel, ale int* a)( al (sed) /2); int m= parcitie(s, 4, x, al; QS(s, mi, als 5» BSleas ay al: int partitie(int #, int 4, int x, inet a int st, dr; ‘ i whitey ¢ Siinie-t; dr =a ea; Dhtle(aliSt) yliyl) zlptt] = yliyee); else ( z(bt+] = yliyerl: Leet while (ix ace Hinclude conto. hm pi eemelates] e etiaeed: Hinclude waile(is <= stops) temp(itee) = alice) void main (void) { vaile(id <=: stopa) id man (lode zile din fiecare luna {an normal si bigect) templites] = alidetl: Ghost ne 2fiet) = (QE. 28,°38, 30, 31, 30, 31, 31, 30) 4 fortint is0; i < ny ite 30, 31h: ecco eee ) /ieopiere peste const int zilep{] = GL, 23, 31, 30, 31, 30, 32, 3, 30, 34, delete f) temps 1y munele fiecarei dani aalatete 1 temp: /Jeliberarea menoriei tums neti] iis) = (* Tanuorie 1, * Ferbruarie, ") \ Hartiets “'aprilie ", Mal *, \ Tune", "Tulle", " August", \ s"goptembrie ", * Octonbrie’*, \ * Nolenbrie *,/" Decembrie "); > // Punctie pentru afisarea unui vector void print_vec (int *v, int n)¢ for (int"J=0; jen; jt) ( Le(je5==0) ‘cout << endl; cout << "Ve" << vi5]t int an, luna, zi; int neczilei' = 0; int index: J/ tndexul lunii curente 7] citim datele de intrare Aiisee ts antroduceti anul: *); scant (7841. Gan): BEInEE (« Zntroduceti luna: 7); scanf (724". Gluna); BEINte (# introduceti ziua; "); scant (~8a", Sy testan daca anul este Pisect = 0) || fan & 400 ) cout << endl om) void main(void) ( fe (ian # 4 == 0) && (lan ¥ 100 int a, J ‘ cout << 1) pdaugam lunile anterioare (einen = 0; index < luna-i; index++) inte y = new intlals nrazilel += 2ileblindex] : 1" Rigugan nuparut zite: din Luna curente cout << "Introduceti elenentele vectorului vii" << ena for (J: i copilut este in cerc 77 copii(kl=0 -> copilul a fost int 4,5; i/ citese n,k,p printé(*n=") ;Scanf(*$a", én); Drinté ("ke") ;scanf(*8d" gk); Print (pe) fseant ("ed" gp) 17 Initializes vectorui copit cor ($20; en; Ses ety eliminati ‘ “ 7 4 - for ( sispii++) // j mumara de la 1 la p do { //urmatorul copil care nu a fost eliminat ieee; if (ke=(ne1)) els } white (Ieopiilk - 11); print£(*Copil eliminat: #d\n", k); copiitk = 1]=0; ) return 0; } — 80 Capltdol 3. TABLOURI UNIDIMENSIONALE (VECTORD $I POINTERT 'R3_21, Se citeste de Ia tastaturd un gir de mumere Tntregi. Se cere s& se determine ‘lementele distinte Exemplu-rin’ sul [2 2.5 4 $ 1 2}elementele distinete sunt: 2 5 4 1 Rezolvare: inainte de tipari un element v[i] pe ecran se verifica dacé acesta a mai fost afigat. Cu alte cuvinte daci exist un element v[j] in vector astfel felt: v[]=VLj] gi y fdefine MAX.N 100 // n maxim int main(void) ( int n; J ine vio os fine i citase n si vectorut printf ("ne") ;scanf (*8d" en); for (s0ricnsit+) ( printf ("v[ta] Or scant ("ed", av(i}); ) for (i=0;iensit+) ( int gasit-0; // verific daca a mai fost afisat for (Je0;cirjer) iE witl=evis1) ¢ gasiv break ) if Cigasity peineft'ad *,vi)}: ) | deturn 0: De RG_22, Dintr-un sir dat 4 se determine lungimea si pozitin subsirului strict crescitor cel mai lung, format din clemente aliturate din sirul dat. Sirul dat se tipdreste in veou eu efte 10 elemnente pe Tinie. Subsirul de hungime maxim se afigeaz eu 5 elemente pe linie Rezolvare: Se parcurg elementele sirului incepfnd cu al doilea element si atta timp eft elementul curent si elementul anterior se afli in relafia ">=" se incrementeaz’t hingimea subsirului crescitor. in momentul cind aceastt relatie nu se mai respect se verificl dack am descoperit un subsir de lungime mai mare. 81 Programarein C/C++. Culegere de probleme Observayit: 1). Subsirul ereseator de lungime maxima este inifializat cu subsirul ce confine primul clement al sirulut (avand un singur clement, il putem considera erescator). 2). Se adauga unt ultim element la sirul dat avind valoarea -MAXINT (cel mai mic ‘numa intreg posibil), pentru a include cazul in care ultimul clement al sirului este in subsirul cdutat faeces ere eee 3 acpp. r E Finelude Ainclude #include fdefine MAXN 100 void main(void) ( int VINAX_N) a; int Incepat=0, lungime=1; // inceputul si lungime subsir int i,i=t; 77 eitesc n si elomentele sirului printf (*ne") ;scanf(*td", én) For (indricnsive) ( printf ( scant ("8d' ) 1/ afisez sirul cu ecou, cate 10 elenente pe linie For (isO;icnsit+) if (i % 10 == 0) print£(*\n"); peinté ("td ",vlil)s ) 7/ determin lungimea subsirului crescator de lungine for Liieensie+) if (yiilevtd-2)) ( Hf (l>iungime) { le // afisez subsirul, cate 5 elenente pe linie for (i=inceput;i 2). ¢ for (7 = 0; 4< 1-1) ise) ati] = alivl]; // deplesare stinga 3 Wf afisare cit for {i= 0; i < dy ite) printf ("ea", qlil: printé(*\n"); 8 Programare in CiC++, Culegere de probleme ul 3. TABLOURI UNIDIMENSIONALE (VECTORD $1 POINTERI R324. Un numar introg lung este memorat intrun vector (ficcare cif este rofinuti intr-un element al vectorulvi), Fiind date dou’ numere lungi, se cere si se genereze produsul acestor numere, Rezolvare: insnultirea se realizeazi ca “pe hartie”, adicd se inmulfeste deinmal Pe rind, cu fiecare din ciftele inmulfitorului, Fiecare rezultat este deplasat spre cea mai semmificativé ciffi cu un mumfir de pozitii egal cu rangul cifrei Rezultatul final se objine prin adunarea rezultatelor parfiale (dupa ce acestea au fost deplasate corespunzittor) Ciffele produsului se caleuleazt folosind formula Cif guy l+ KU) = Cif, fl -Cifra,{R] + Transport + Cif li-+ =I] unde cortorul parcurge efile primal numa, ar eu kcifele celui deal dea numa, Observe 1) Indicele i + & ~ 1 provine din deplasare; pentru tamulfrea ou prima eft a in- muljtorali vor avea indicole i+ 1 ~ 1 = , pentru inmulfirea eu a doua cifta i +1 si aga mai depart; 2) Rezultatul va avea cel mult NrCifre, + NrCifre,cittes 3) fn cazul in care Ciffapmggli+k=I1>9 se refine ultima cifrd, prima cifts devenind transport; 4) La inceput se inifalizeazs toate ciftelerezultatuli eu zero. Exemplu: 123 » 89 = 10947 ‘Vom inmulti mai intai 123 cu cifra cea mai putin sernnificativa (9): 123 2 1 : ‘Transport 2 2 1 Rezultat vechi 0 0 0 Rezultat now 9-357 924320 91s I ‘Transport ‘Transport =2 ‘Transport = 1 Apo! inmulim 123 cu urmatoarea cif ainmulfitorulyi (9): 123 3 2 1 : 8 Transport 0 0 2 1 Rezultat vechi_7__0. 1 1 Rezultatnou 7-8 B2+06 B-Ieiet Transport = 2 Transport ‘Transport = 1 4 aig Vineluda Hinclude struct NUMAR ( ‘cups | struct MMAR a; a.n=0; while ((ch=getche() xla.nes}=ch-'0" | ckerele for (i avti return a; Lea.njit+) } for (int isa.n-2;i> ) struct NUMAR ¢7 | int 4,4, transpor for (i=0;ica.njin+) transpor' ) unsigned char x{100}; /[citire cifre nunar, int ny // numarul do cifre al numarului unsigned char v(100); // cifrele vectorului, ineepand cu terminate prin Enter (Cod ASCIT 13) // copier cifrele din [asn-i-1) if ( (asne-1 66 a.v[0] e.v{0]=0; zeturn 67 { x in vectorul a.v, inversand 77 pentru @ obtine pe prima pozitie cifra cmps void afiseaza(struct NUMAR a) ( ior) printé("8a",a.v(i}); struct NUMAR produs(struct NUMAR a, struct NUMAR b) ( {/ verific daca unul din termeni este 0 1 ak b.vE tL O. -ntb.n: // numarul de cifre al produsului Ee. 0,e-m) 7/7 tlalizer cifrele nunaruli | 77 efectuez inmuitirea 85 | Capitol 3. TABLOURI UNIDIMENSIONALE (VECTORD $1 POINTERL if EPS) printé("$5.21f tx™ tar, alil, mei); ) printé("\n"); void main(void) ( double al20}, 5(20), [20], r{20); int mm, qi, 3: printi("m*}; scant ("sd") em); Cit_pclim, a, *coeficenti deinpart af_pol(m, a, *polinom deimpartic\s t\n") printf ("a="); scanf(*#a", én)7 eit_pclin, by ‘coeficenti’ impartitor\n*); af_polin, b, “polinom impartitor\n") ; qann for (i= 0; i <= gz itt) ( efi] = alil/b(0}; // coeficent cit for (j= 0; j <=; j++). // urmatorul rest partial yA = alsed) > e18rebt31; for (i= 0; 1 < nz ite) EU] = alaeien afpol(q, ¢, "polinom cat\n"); af-polin - 4, x, *polinom rest\n"); geteh(); R326. Si se genereze mumerele prime pana ia o limit dati N (N < S00) foosind "sita lui Eratostene", intr-un vector cu N elemente de tip boolean, inifializate Ia valoarea “adevarat", iau valoarea “fals" clemente- le din porifile multiple de k numar prim, Poziite clementelor care in firal au valoarea “adevarat” sunt numere prime. Zane OE a ae Finclude | #define wax 500 fdefine TRUE i #define FALSE 0 void main(void) { char v(WAX_N}; int mi,je | 86 7 Programare in C/C++. Culegere de probleme printf ("ne") ;scanf("td",an); 77 Citese n // initializer vectorul v for (i=0;i2 + Te obtindnd in prealabil relatii de recurent& pentru coeficienti Rezolvare: Fie a, b, ¢ tablourile coeficenjilor polinoamelor Tya(x), Te-1(x) $i Tex), adiea: Tas)= Yas TaQ=Ybx!s T= Dex! ~ = = Daca inlocuim aceste expres tn retatia do rcurentt i identifcim coeficeni fn raport ¢u puterile li x, se objin rela de recurenft inte coefienfi ay By si gy de forma: co=-ao k-2 cy=2+by-1—ay pentru j=l c4-122°ba-2 cre 2-ba-a _cate se apli pomind del valor nie: a= 15 By = 05 6, = 1 finclude Hinclude finclude define wax 500 88 Probleme propuse _ Capitaul 3, TABLOURI UNIDIMENSIONALE (VECTORD $1 POINTERT Void watntwoiay int ny, 37 Ant a(20}, b(20), ¢{20) printé(*n="]4 scant ("8a", an}; aio) bio} bia) J/ aplicare formula de recurenta for (k yee) (0) for (j= 1; j< kel: jee) et] = 2° bli-2) - atid: efk-l} = 2 © ble-21; cik] = 2% blk; // actualizare a si b pentru iteratia urmatoare Wa = 0; ken) ( LE (k 0) printé(*+"); if (OK) printf ("8d %* 8d", clk), kl: > printé(*\n"); getch() 5 fntr-un sir x cu m componente reale, si se determine media aritmeticd a clementelor pozitive situate intre primul clement pozitiv si ultimul clement negativ al girului, exceptind aceste clemente, Cazurile speciale vor fi clari- ficate prin mesaje corespunzitoare. Doi vectori x si y au n, respectiv m elemente reale distincte (mt, n$10). S8 se creeze un nou vector z cu elementele comune ale celor loi vectori. (interseetia clementelor multimilor reprezentate de evi doi vector). 89 Programare in ICH Culegere de probleme P33. PRL P36. P31 Se citeste 0 valoare intreagi n (0 0,0- finclude {1 intoarce produsul scalar a doi vectori de dimensiune a int piscalar (int *, int ty, int n) ¢ int suna = 0; for (int i=; i Hinclude J/ Intoarce numaru! de vecini vii pentru o celula (1,3) Ant vecini (int **matrice, int n, int 4, int j) ( int p,q: J/ Trebuie sa tinem cont de faptul ca ‘7 celula poate fi pe frontiera. int start_i, start_j, stop_i, stop; int vii =O // Calculam Limitele de cautare pentru celula (i,4) if (i == 0) start_i = 0; else start_i = i- peinee (*\n"): estes ay gtopls = ants 2 if (3 == 0) start_j getch(); else start_j = j-1; Af (i == nol) step_j = n-t; else stop_j = j+t; ot Programare in C/C++. Culegere de_probleme 77 carcaian wonaTaT Ge Vestal VIE Tor tps started p = stop li Bt) Tor’ (g 2 etartaiy gee atopy at) {2 Geateiestp) fal) vies return vidi , ota main (void) ( ine ttnatrice, 8. 91 int i 3, ast iT rzepaie’ oa catcvian generatia urnatoare 1) “"felosind mere access! matrice {he «thackop: tire date de sntrare SUSE increducctt nes do generatii: *)2 scant ("tary 69) PEIMEE (1 Inbromucet: dinene.generatiel: "); scant (80°, i), Extulce\« [haces) mallee th + afzeot Gat); Backup’ = (dnets) malloc (ns sizeof (Ant*)): BACHE {-lIneroduceti goneratia de inceput: \n"); Set Op Le ar isa) fr scald = (int*) malloc (n+ a1ze0f (int): Bickigiti'=) Cnt") meiloe (a * sizeof (an0))) for (3.207 9 fdefine TRUE 1 Hdefine FALSE 0 {/ Ver:fica daca liniile i si j sunt egale Ant egale (int mat(30}[30], int i, int j, int n) ¢ for tk = 0; k < ny kee) Ge! (mat i) fe] != mat (5) ()) return FALSE; return TRUE? i) Afisoaza Liniile si coloanele care contin elenente nule void nule (int mat[30][30], int n) ( int i, 37 int found; // Ceutam’1iniile:ce contin elenente nule for li = 0; i < ny ise) ( found = PALSE: for (3 ie Us 0; J Hinclude #aefine TRUE 1 #define FALSE 0 elementul maxim si cel minim de pe o eee // diferenta dintre Linie // a matricii; 104 Capitolul 4. TABLOURI MULTIDIMENSIONALE [7 nes ae. de Coloane din matrices JJ Linie ~ nunarul Liniei dprelucrat | | float diterenta_excreme(float a{}{10], int linie, int ne) ( | float min, max int min = max = aflinie) (0); for (i= 1; i aflinie} {4}) min = atinie] (41; Af (max < a[linie] (i]) max = aflinie] [i]; ) | return max ~ min’ ) | // afisarea unei Ini din matrice: Linie(float af] [10], int inte, int nc) ¢ for (i i < ner ite) sprint£(* 06.26 *, aflinie] (11): printé(*\n"}; ) veld min(void) fae hy ey int gael; // eau gasit Linii care indeplinese conditia float eps! s(39] 00 Prince ties de Timd =); seanf("td", &1); | princt (one."de' cotoane Seane(tar, ae) DEInEE("Tnixodcett etenentele matricel:\n")s fertiv one ites) for (01 3 Finclude // Permuta elementele vectorului v de dimensiune n cu i pozitii int *pormat (int tv, int ¢, int 4) ( int taux: aux = (int *) malloc (c * sizeof(int)}; for (int j = 0; j < cy j+4) aux{(j+i)8e] = vid) free(v): ? void main (void) ( int t*mat, 1, ¢7 int i, 5: 1) Citize date de intrare printf (" Introducetd nr. de Linki: *): scanf ("ta", el); printf (* Introduceti nr, de coloane: "); scanf ("80", ke); | mat'= (nt**) matloe (1 + sizeof (int*)); for (i= 0; i< 1; ive) ( mat(i] = (int*) malloc (¢ * sizeof(int)); | for 3 = 0; 5 < cy J44) | printé (7 mat(td,ta] =", i41 | scanf ("8d", snat{i} (1) | gee > ) | // Peelucrarea datelor si afisarea rezultatelor for (i= 0; i <1: ite) mat(i) = permut (mat(il, c, i+2); printf (* Matricea dupa rotatii este: for (i = 0; i < ls it) { for (5 = 0; 5 < er j++) - printe (8a *, mat{il(3]); printé (*\n"); > getch(}; \n"): RA_6. Doi vectori x si y cu cate n componente fiecare, (n s 20) se afld in relatia xs y daca xy 5 y, pentru = 0..n~ 1 Si se defineasca o functie care primind ca parametri doua tinii i ik ale ‘unei matrci, stabileste dacd acestea se afl in relafia "=". #84 se defineasc& o functie care, primind ca parametri numerele a doud linii dintr-o matrice caleuleaza diferenta lor, depundnd rezultatul int-un vector. 4*Si se serie un program care citeste un numar intreg n (1 < 20) si 0 matrice cu n lini si coloane. Programul va afiga pentru toate lini care nase gasese inrelayia "s"diferenfa acestora Rezolvare: Vom implementa direct functiile Lt si Line_ dif, Winclude Hinclude Winelude #aefine TRUE 1 #define PALSE 0 (vimtoarce TRUE daca Liniile 11 si 1_2 sunt in relatia 11. int maimic (int **mat, int a, int 11, imt 1.2) ¢ for (int j = 0; j mat (12) (4}) return FALSE; return TRUE; ) 1 Intoarce diferenté int *line_aif (int int ‘dif Gif = (int *) malloc (n * sizeof (int)); for (nt j = 075 1] Afiseaza un vector void print_line (int tv, int n) ( for (int i = 0; i Wnelude Hinclude Hinclude Hinclude fdefine TUE 1 fdefine FALSE 0 1] Bloca dinamic nenorie pentru matrice @ouble** aloc_mat int n){ double** a: a = now double* nl; for [int i= 0; 4 < my its) ali] = new double(al; return a; ) F | void e1ib mat (int n, double** a) ( for(int f= 0; 4 < ny ite) delete (1 alil: delete (Ja: ) R4_7. Si se defineasca o functie earestabileste dack dot vectori dai ea parametr sunt sau nu ortogonali. Sa se sere un program care citeste 0 matrie patraté cu m lini si coloane gi stabileste dacdi matricea este sau nu ortogonali pe lini, In caz afirmativ caleuleazi matricea invers 1) Intoarce TRUE daca vectorii v_1 si v_2 sunt ortogonali Ant orto (double *v_1, double *v_2, int n) ( double sum = 0; for (int i= 0; i double sum = 0; 4 for (int i = 0; i < ny itt) + inversa - calculeazA inversa, Aici ne vom folosi de faptul c& lniile matriei een inifiale sunt coloane pentru matricea invers’. 108 Programare in C/C++. Culegere de_probleme // tntoarce matricea inversa a matricii ortogonale mat void inveraa (double **mat, double **inv, int n) ( double co! int i, i for(i Op dc mr ieee col_nozm = norm (mat{i}, my for (j = 0; j > mat lil (3): y) Werificam daca matricea este ortogonala int ortogonal = TRUE: for (i = 0; i < nel &k ortogonal; i++) for (j = itl: j 1, il seriem sub forma: y, (unde k=2, 3, 5m) Aci ay sunt cocficieni care secalculeaza pundind coniia de ortogonalitate (p31) = 0; valorile care se objin pentru ei sunt: ay, Determitarea lui ye formula de mai sus se face in program apelind de k ori fincjia adaiga() - Vectorit yy Yo Yu Objinuyiastfl formeazi o baci ortogonald. Pentru a avea 0 bazi ortonormati, imparjim clementele fiecirui vector Ia norma acestuia (adicd la ‘rodusul scalar dintrevectorul respectiv si el insui). De asemenea, pentru a nu calcula torma unui vector y, de ficcare data end impartim un efement al lui la aceasta, vom rjine normale vectoritory(F= 1, n) fntr-un tablo, A z Yinclude finolude include Kdetine MAX 100 J/ dimensiunea maxima a bazelor /* afisarea unei baze x de dimensiune n: */ void afigeazi baza(int m, float x{](NMAX]) { int i, 3 for (i= 0; i< ms ite) ¢ cout << ice itr cout.precision(2): for (3 = 0; J 3). 2 Rrdli tek o Sa se atfgez Tinie Tn care exist ect putin tei clement ava niin x] sea * yl ) “cinci divizori aobanali, Se va defini i utiliza o funetie care stabileste cati dlivizori nebanali are un num dat Rezolvare: Tay Finclude include void main(voia) ( int n; //dimensiunea bazei int i, dy ke 7/ bana initiala si cea ortonormata Float x(NMAX] (NMAX], y [NMRX] [NMAX] ; 1/ vector in care se retin produsele scalare y(k] *y[kI Float ¢ [Max]; y+ calculeaxa nunarul de divizori nebanali ai numarului a: */ float a dnt me divizort (nt a) ( cout << n= ears cin >> ny nt ent. = 0 Sout << "introauceti baza: * << end; fore? for (i= 0; deni ie) ( ine cout << "Vectorul © << i cet: << endly Peete for (j= 0; 3 > xl]: ) Mit cc gec thet void main(void) [ . int L, Ci // dimensiunile matrices int mat (10] [2017 ) > J* detezminam baza ortogonala: */ int i, 3: peer ete ee Ie contor: // nunarel de elenente din linia curente care een ere iiiad indepLinese conditiile Se OaGreae printf (*Dimensiuni: "); , for G20; 4 igefine ¥ 20 void main(void) ¢ double al], DIN; double x(¥1 [8] int i, 5, mr rinté(*Vectorul a\n* for (ie0; 4 < ms At4) scant {r@le", &a(il) x{o}{c] = a(0l; for (ie1; i < my s+) R4_10. Sa se calculeze coeficiensii by, m1 din dezvoltarea produsului: “ebox” (eta): (etay) + (ebay tbat ‘Se daw n si coeficientii ay iy wy aute Rezolvare: Daca se dezvolta parantezele gi se identified coeficengii putcrilor Ini x se cobjin rlapile: by F dy apt ty By = agra) + deras Hee Anat But = yay oe dy Vom calcula aeste sume stabilind fn prealabil relat de recurengs. fn acest scop formam matrioea triunghiular superioar’: % ata, dy tata, ay tata, ttay 0 aya yay Haya, Haya, > aya, + aya, ++ Oy 30 x=|0 0 ayayay 0 0 Om 0) 0 “ ayaa 4. in care coloana n repreznta chiar sumele cAutate Elomentele matricei se calculoaza asf ’ fey = ot + 4) io Bin = Kinser’ ar 150 jet * Oj Kietgea i>, j>0 na x(o1 (i) for (isl; i < neki it for (jeiel: for (1-0; i < nr it4) pti: = xi] in-2): for (20; 1 < ny itt) printf ("b(td s\n") M t +) gen ie) __ mtd} (3) = x4) (5-2) + al) * xfi-2) 3-21 Capitol , TABLOURI MULTIDIMENSIONALE, printé(*ns"); scanf("td", én); = x(0](G-2] + afils RUA)(G) = xti-1] Ti-2) * ally Lé\nt, i, BLED) RA_IL, $8 se rezolve sistemul: ‘unoscut prin n, matrices a si vectorul b. Rezolvare: Aceste sisten 4-Days, xe 4, me se rezolva prin substtujc (daca a, # 0) folosind rela: nl: us Programare in C/C++. Culegere de probleme igen organ REE Vinci coats te woud sracine nm, doubler a, doubles b, doubl for (int i =n - dps 0; in-)¢ : a double s = 0; : for(int j= £44) 3 < ms je) ore alsii3) * xt); HU) = Petits, Wold ott_elet (int n, doublets a, douhtet for(int i= 0; i 20; fatului magic | ) alis{i) =k } JJ Desenarea patratului magic printe ("+ for 18 pene TW } else { printé ("+ for (j= 1: j confine protoriuriefneilor fit thowtives el se compart ine tetover (char ef Ldach ¢e(a".*2") clout nance, | apper (char ef pgs ce Cee) a _ —— £ int strincmp(const char* d, const char* 5, Similar cu stxnemp(), int _isalpha(char ¢) idaci ce (1A. .'2'} vicar. tz) int n) cu deoscbirea cil mu se face int_isdigit (char ¢) 1 dac’ ce (°0'..'9*) distincjie intre literele mari Tne Toxdigietehar o) Tascs ce € 0797) V ORY te fart) y Cake | Char* strchr(const char* d,char ‘Canta caracterul in ginal 1 aseh Teaipha TTS TeT ay Inoue un pitt a RCE IGCo DET peima opie a ae int isprint (char_<) © este afigabil, cu spatia) . sau_NULL | trl (char cy ee caracter de control char® strstr (const char® d, const char* s} | Tntoarce un pointer Ta pri- Sehiel ee Tesla wma apare a bruh sau_NULL, _ chac* wurepy (char G, conse char” 3) Copiaz sins inc, THE SEEPUTCORET CHAE* G, COMET Cha¥™ ST] Tnioarce Tunginnen pretini= inclusiv *\0° .fatoarve a Ii din d care conjine m- [har 73 char 7 re din 3 char* stencpy(char* d, const char s, Int a) | Copia n caracters din 7 — = ae sirul 3 in , completind | | IRE StreSpR (cons » haste carnal eventual cu *\0". ee ‘ sargetere ce nu apar in 3. has? siveat WharF a F 2 were | Jat tvlen (const char* Sy Tntoarce Iungimea lui = al ‘const chae® 6) Concateneazi girl sa] fe (*XO" nu ge au) sfirsil lui, inoarce a sat ceetae Tena ST Converse itercle marie ligemisins. | ‘char* strupr (char* s) ~ ‘Convertesie literele mict in sfirsitul tui, comple | itere marin. cu *\0". Intoaree a, hyetay memepy Wwold® @, const vola® Sn AY] Copiava n-cctei dim Lo i intoarce d 14 i | char* -stmncat (char? , const char* s, caractere din sinus Progeamare in CIC. Culegere de probleme void Mi siove(vold" dconse void" 8,int a) | Casimencpy, folosil dca 5 $id se intepirund Copiaek caracienit te primelen pot din a Compari zonele-advesie des sid. Copiaza sro tr-0 nou Tocatie de memories finoaree un poinor ele 02a locayc. Cant in & subsirurile limitate de caracteree din ‘5. Primal apel fnioare tun pointer I prim sbi din a care nu contine ractere din 9 urmitoarele apeluci se fac eu primol argument NULL, intorcin- use de fiecare dat un pointer la urmatoral subir din ce mu confine & ractere din s. fn momeniul fn care mu mai exist sub- siruri, func Intoace NULL, Vold* menset (veld® d,const Int ©,int Ad wancap (const void” d, const void ©, Int ni jae ohare a) char *ate | chac* Gtxtek(conse char* d, const char* 3) Probleme rezolvate IRS_L. Se citste de la tastaturd un text format din ini i termina prin sfargit de fisicr (CTRL-Z). Stabiliji numirul de lite, mumirul_ de separator, nnumanu de cavine, numdrul de lini numizul de propocii i numara de dinate, Covintele sunt separate Thre cle prin spajialbe, punct, vigul, dowd punete, punctvnguld si cratimd, La situ fcedrel propoztitavem pune, iar ut ainat se tern eu panct urmat de sfirgit de line 126 Capitol 8, SIRURLDE CARACTERE. ecotrare: Caracterele sunt citite pe rand in acceasi variabild ¢ si sunt clasificate fick literd — detectat& cu funcjia isapha(), separator ~ folosim funciia, Tespace |) la care mai adiugam teste pentru separator alesi de noi, linie = ta apariia sfrsitului de lini, propozitie ~ la aparifia punctulwi aliniat ~ ta. apanijig Sfrsituiai de linie, dacé caracterul precedent a fost punct. Aceasta ne itmpune pemorarea caracterului precedent, actualizat inaintea citirii unui now earacter. Vom hea 6 contoare, inerementate corespunzator ce jin evidenja situabilor prezentate. jin coca ce priveste determinarea numérului de cuvinte, situafia este pufin mab tomplicati. Vom folosi o variabilé de stare ~ in_cuy care ia valoarea TRUE sau FALSE dep’ cum ne aflim in interiorul sau in afara unui cuvant. Iniial [ncuv=FALSE (ne afldm in afara unui cuvant). La intlnirca une litere starea devine [ncuveTRUE, jar Ia intilnirea unui separator, dacd ne afim in cuvant 'RUE) il vom parisi (incuv=FALSE) si vom contoriza cuvantul. Hinclude Hnelude #include fdegine CTRLZ ~ sdefine LINTE_NOUA 10 // Cod ascii pentru linie noua fdefine TRUE 1 define FALSE 0 void main (void) ¢ char c, ¢_precedent = '\0'r {nt in_cuvant = FALSE; int :iit = 0, nsep int nolin = 0, nprop 0 0, malin = 0; whkle(1) fe = getohar( ff (e == CTRL2) preak; // Detectez sfarsitul textulu 2 (isalpha(e))( nsept+s $2 (in_cuvant) { Thcavant = FALSE: nouves ro pit S. DE CARACTERE Programare in C/C++. Culegere de probleme Capitol §. SIRURL IRE i 77 Partea Eractionara Tite al double pirac= 0: npropet: double w= 1; | !/ Ponderea cifrei partii fractionare if(¢ S= LINTE_NouA) ( if Bvaluare seam nlinee; ites == =") seman AE (€_precedent G(s se tot [te ae 8) oes nalines; // Bvaluare parte intreaga ) cprecedent for( ; tet=t.! #& *st=*\0'; srt} if ( isdigit(ts) 1 pint = lo*pint + *s - ) ? else ( Drint€(*nunar de litere = ¢d\n", n_lit); ers -2 Printé(*numar de separatori = $d\n®, n_sep); return 0; printf(*numar de linii = $d\n", n_lin)? ) Drint#(*numar de cuvinte = ¢d\n*, newv); printé(*numar de propozitii = tain", n_prop); printf (*numar de aliniate = ¢@\n", Aalin); geteh(); {1 Bvaluare parte fractionara if( ts set) attr 1/ Se ignore punctul while( *s1="\0" ) if ( dsdigit(*s) ) { . 0.1; // Actualizare pondere cifra fractionara Dirac we (eo 2 0") ws RS_2, Un sir de caractere reprezinté un mumair real eu parte inteagi ql pare ee fiacjonars, Primul caracte poate fi semnul mumarului St ae sere © return 0; functie pentru conversia sirului in numar real, Nu se vor folosi fincile standard de conversic existente. Eventualele erori de reprezentere sunt sesizate prin valoarea -1 intoarsé de un parametru de eroare. fn eaz cd nu sunt erori parametrul de croare intoarce valoarea 0. Funcjia main () ste sinuri de caractere si afigeazi conversia in real cu un numir specificat de zecimale. in caz de eroare se va afiga un mesaj corespunzator. ) att; // Avansez la pozitia urmatoare din sir ? ) er = 0; // Conversie realizata cu succes return (pint + pfrac) * semn; ) void main (void) ( Rezolvare: Se testeaz mai intai dac& numdrul are seman, se memoreaza gi se trece peste el, Se converteste apo’ partea intreagl'anumarului, pint la ntnine punctol char £120): sau a sfiryituli de ir Urmeazdapoi conversia pili racionare (acd exit) int er formarea numanutui, din partea Tatreaga, partea fracfionara si sema. printf (* ntroduceti numarul: while (gets(s)) ( nr = atod(s, er}; printf("ts *, 6); if(er == 0) print£( else printf ( “eroare\n") : printf (* Introduceti numarul: *); Winclude finclude #include ¥inelude Hinclude 6.a2f\n", nr); J] Punctie ce converteste un sir de caractere in numar real double atod(char *s, int cer) { int semn = 1; double pint = ) getch(); Jf Partea intreaga 128 129 Progeamure in CCH. Calegere de probleme RS_3. Un gir de caractere, introdus de la tastaturd reprezinta definitile pe orizontala dintr-un care de cuvinte inerucigate. Dupi fiecare cuvant Ginchusiv ultimul) se pune", Numiragi cuvintele pe verticala si afigai linile vertical, Rezolvare: Sirul de caractere reprezint& matricea (carcul) veetorizata pe lini gi complctatd cu coloana (u + 1) de asteriscuri Din observatia ci lungimea sirului de caractere fs = rezolvarea ecuatiet de gradul 2, valoarca lui m (dimensiunea carcului). Sepp Finciude Hinclude Minelude #include Vinelude wroid main (void) ( Ghar a(240);//air de eaactere ce contine careul de maxim 15*15 int lo = 9; //lungimea unui cuvant int ne = 0; //numarul de cuvinte int n; (/eimensiunea careului; int 1s; _ //lungimea sirului de caractere printf (* Introduceti careul... \n*); gets(s): is = strlen(s); n= (sqrt (4*isen) -1)/2; int i, 3. ke for (J 20; 3 < n+ tr jee for (i = 0; i < ny it){ kegeie m+ af (stk) I= 18") lett: elae ( Lf (le > 1) te = 0; d if G i=) printé(*te", s{k]}: ) printé("\n") : ) ’ print£(" Sunt $4 cuvinte pe verticala\n", ne); getch(); in + 1) se deduce, prin fe oka) 126 Pt T Recolvare: Funcfia palindrom () converteste mai inti caracterele din sr la litere Un cuvént pe verticalé are in sul de caractereliterele situate inte le Ia distanja (n + 1). | , 130 ‘_Capituul & SIRURI DE CARACTERE REAL. Sere o funojie care determin dacd un cunt (ir de caratere mu confine Separator) reprint’ un palindrom. Serio faneic main () care cites de la tastaturd un text format din lini aleituite din cuvinte, Cavinele sunt separate printr-unl din caracteredin imal”. 2; = Vt \n La sfargit sc va. afiga numarul euvintlor palindroame din text si eare sunt acsstea, rici~folosind funcjia strlwr () si apoi compara caractorle simetrice fas de rilocal salu, La intdlnirea unei neconcordanje intoarce FALSE, ‘in functia ma:in() vom citi pe rnd cate o lini (ea gets ()),_ ti vom separa cwvintsle, fblosind fincjia stxtok() si vom testa fiecare cuvant cu functia feste_palindrom(), Palindroamele gisite sunt contorizate si introduse tablou de sirari de caractere, de unde vor i afigate a sfrsit, include finclude Hinelude #include Hinclude define NP 20 define TRUE 1 fdefine FALSE 0 Ant este palindrom(char* =) ( ‘5 = strlwr(a); // Conversie in litere mici 7/ Conpazaze caractere simetrice for(int i=, j=strlen(s)-1; i < 3; itt 3 Ge sli} f= s(3] ) return FALSE, return TRUE; d void main (void) ( char sop(]=* «.7!-\t\nty char “inie(80), * tpalINP], *p, *s: int np = 0; //numarul de palindroame print? (" Introduceti o linie: "); while(gets{linie)) { for(p = atrtok(linie, sep); pi p = strtok(0, Lf (este_palindromip) ) tpallnptt]' = strdup(p): peinté (" Introduceti o linie: i BL Progrumare in C/C++ Culegere de probleme le pce a eae ee Drinté("S-au gasit §4 palindroame\n", np); for(int 3<0; < np: j++) print£(+4s\a", tpal{3)); geten(); ) RS_S. a) SA se serie o fanofie care sterge dintrun gir de caractere un subsir specificat prin pozitic si lungime, Funcfia intoarce un pointer la siral modifica. ») Scriei o functie care insereazt intr-un sir, neepand cu o pozife data, un alt sir. Functiaintoarce un pointer la sirul nou creat, alocat dinamic. ©) Scrifi 0 funcjie main () care citeste doud cuvinte gi inlocuieste text introdus de la tastaturd, toate aparifile primului cuvant prin cel de-al dita Lt -Rezolvare: 0 linic este citita (cu gets ()) intr-0 zona alocat& static (Linde), de unde este transferata intr-o zona alocata dinamic (pentru a putea fi stears in cazul inser unui si). Inlocuirea cuvantului 1 prin cuvantul 2 presupune: edsirea cuvantului | is linie (folosind stestx ()), stergerea cuvantului gisit (ex sterge ()) si inserarea in pozijia veche a cuvantului 2 (eu insert (}). Operatia se repeti ct timp cuviinti exist in lini, Intrucdt nu pastrim tot textul, ci numai o linie din el, la terminarea inlocuiile fint-o lini, aceasta va fi afigaté (cu puts ()). include ¥include #include finclude J/ Ponctia de stergere char* sterge(char* s, int poz, int 1g)( strepy(s*poz, s+poz+lg) + return 3 Funtia de inserare: se aloca spatiu pentru nou sir de caractere, se copiaza prima parte din sirul sursa, se concateneaza sirul ce trebule inserat, ier apoi se concaténeaza ultina parte din 132 Capitol 5, SIRURI DE CARACTERE. char* insert (char® @, int poz, ohar® 6i)( char* p = (char*} malloc(strlen(s} +strlen(sil+1); strnepy(p, 8, por); p{poz}="\0"; // strncpy mu pune '\0° strcat(p, sibs streat(p, s¢poz) froo(s): return pr p void main (void) ( char Linie(80], cuvi(10], cuv2{10) int Leuvl; char “p, *1_dinanic; puts(*Primul cuvant:*); gets{cuvl) + LcuvL=etrlen(cuvl) ; puts(*Al doilea cuvant cuvan! printf (* Introduceti linia: *); white(gets(linie:) ( // binia este transferata intr-o zona alocata dinamic Ldinamic = strdup(linie) : p= strstr(idinanic, cuvi); wnile(p) { U/ Transfo-mare pointer in indice int pozitie = p~ l_dinamic; sterge(1_dinamic, pozitie, Lcuvi); Ldinamic = insert(1_dinamic, pozitie, cuv2); p= strate(1_dinamictpozitie, cuvl); )2 gets(cuva) > puts (1_dinamic) ; free(1_dinamic); // Eliberez zona de menorie In:roduceti linia: "); printf ( ) geteh(): Un text citit de la intrarea standard conjine euvinte separate prin spatiale (C,.:\n). O anagrama a umui cuvaint se objine amestecdndu-iliterele (de exemplu: brilian: $i labirint). Afisafi fa iesirca standard toate anagramele, precedate de numatul lor. RS. © Recolvare: Se separa mai intdi cuvinicle din text (cu stxtok() ). Se mengin dowd tablouri cu siruri de caraetere: unul pentru cuvintcle citite si altul care confine ~ avintele aviind literele sertate, Se ordoneaz’ cele doud tablouri dupa cuvintele din e_sortate. Anagramele vor fi pe pozifii consecutive in vectorul cuvinte: 133, Capitol 5, SIRURI DE CARACTERE, Programare in C/C+. Culegere de probleme (Zea Vincluds Hinclude J/ Sortez vectorii cuvinte si c_sortate dupa vectorut c.sortate Hnelude ceenioshe fag = FALSE: factine TRUE 2 1G Soe ers for (1-0; ienc-1;i++) if (stremp(c_sortate(iJ, c_sortateliti]} > 0) ( Swap (e_sortate[i] ,c_sortate(iv1]]7 swap (cuvinte(i], cuvinte(i+1]}; feefine cause 0 /j, Sorceagn iitorole in stray folocin sorvares prin ingorcie acon Et faloaiea orice mutola Ga sortase (3-240, void sort (char* v) ( aeons iee"tine ety k's strlen(v): kes) ( Ghar temp 5 vt? int 3 Atisez grupele de anagrane while ("> 0 && temp <= vi5-11) ( for GSb;ezner) t ° vig) 2 widths 7) Setermin cate anagrane an de afisat fee (jeislsdene && stronp(e_sortate (il ,<_sortatets})==015++) printé(*8d Anagramo:\n", j-i)7 for (keiskej kes) Brincé("\ees\n", cuvinte(k]) > i temp: ) > J) snverseaza sl ci 82 (paranetrii sunt transmisi prin adresa!} inline void ewap(char* gsi, chart &62) { char *tmp B57. a) Definifi o funcjio care determina pozifia primului caracter, dint-un gir void main(void) ( de caractere txt, care apare in alt sir de caractere sep. Cautarea in char gepflc’ 7e-\e\n"s // separator! do cuyinte char Linie(s0j; i/o Linde citita din text ‘Tncopa pecificata p. Dacd Shar teuvinee (10017 Vector cu cuvintele introduse seta ir 0 Sco inca into pac specticals P, Duck nct wou oe deat ete) aero faracterele din txt nu apare in sep, funcfia intoarce 1 77 wactor eu cuvintele avand literele sortate char *c_sortate[100]; b) Definifi 0 functic care determing pozifia primului caracter, dintr-un sir de caractere txt, care nu apare in alt sir de caractere sep, Cautarca in fae i.5c ine Flad; ee eae “i A . primul gir se face incepind dint-o pozifie specificati. p. Dacd toate ine ne"= 07 J munazul de cuvinte distincte faracterele din t3ct apar In sep, functiaintoaree =1. 6) Definii o funefie main () care citeste un intreg n g1 un text format din ‘mai multe int, O line canine cuvinte, despargite uae ele prin separatorit “|. 4=\n\t", Dupé citica une linii, aceasta este afigat trunchiind la ‘euvintele care depaigesc accast lungime (se vor folosi functlle definite a punctele anterioare). // cltese kextul si former yectorii cuvinte si c sortate printf (" Introduceti o linie: *); * tau Mhile. (gets (linie)) for{ char *p = strtok(linie, sep): pr psstetok(0, sop) ) ¢ if, werstfe ga nu existe’ aceiaal cuvant de 3 ort for (j20;,strenp(euvintets],p)1=0 ka Jene; 584) + ¢f Adaug cuvantul in lista de cuvinte ; | Se GS sey duvintelne)=strdup p) eusortate[ne]=atrivr(strdup(p)) 7 Sort (e_sortate(nel)? Rezolvare: Prima funcfie compara cite un caracter din text, incepénd din poziia specificatd, po rind, cu caractorele separatoare, pind cind giseste 0 egalitate, jnforcdnd pozifia caracterului din text. Dacd nici unul dintre separatori nu este egal eu caracterul din text, se inceare& urmatorul caracter din text, Dacé nu se gaseste nici un Separator ‘n text, se intoarce reaultatul =I. ) printf (* Introduceti o linie: *); 134 135 Programare in C/C++. Colegere de probleme ‘A doua functie intoarce pozijia caracterului din text, dac& acesta nu este egal co ici unul dintre separatori, in caz de egalitate cu un separator se incearea urmatonl ccaracter din text, . Textul se eiteste progresiv linc cu line, Dupa citirea unei lini, se separa cuvintel (Fotosind cele dou functii de In punctele anterioare), se compara lungimea cuydintull cu lungimea maxima admisi si daca este cazul se trunchiaz8. Dupi ce au fost prelucrate toate cuvintele se afigeaz linia, tape tae aioe Hinelude define TRUE 1 #aefine FALSE 0 int find_tiret_of(char *txt, char tsep, int p) ( for (char "i= txtep; *i!='\D"; isa) 7 for (char *} = sop; *i!="\0'; 5+) } LE (ome 5) return i-txt: return -1; } int find_firet_not_of (char text, char *eep, int p) ( {1 TRUE daca caracterul curent din txt se gaseste in sep int flag; for (char *i = txtep: *i!="\or; tt) ( flag=FALSE; for (char * = sep: if (44 == 95) flag=TevE; if (flag) return i-txt; sYts\or; jee) 3 return <1; ) void main (void) ( char sep{]=" char Linie(80]; s\n\er: int ic, sc, lc; // Inceput, sfarsit si lungine cuvant ine 11} 17 wongine’ Linke ‘ int nr 17 usngimea la care se face trunchierea printf "Yiscant("d", an); 7 phs3. while(gets(Linie)) ( 7/ Adaugam un separator la sfareit de linie stecat(linie,* *) 136 Capitol 8. SIRURE DE CARACTERE Ti = strlen (@iniey; se = 0; white (1) ic = find first_not_of(linie, sep, sc); //inceput cuvant ac = find first_of(linie, sep, ic); //sfarsie cuvant le = se - ie +1; {Plungime cuvant GENe > n) (scurtare cuvant strepy(Linieticen, Linietsc): (le-n) : (e-m: ) if(se >= 12 || i ? pute (Line); Se citeste un intreg n si n lini reprezentand orizontala unui careu de cuvinte inerucigate. Punetele negre sunt reprezentate prin", S& se afigeze m lint reprezentind verticala careului. S4 se numere cuvintele din careu, pe tall si vertical, Un cuvaint are eel putin 2 litere Un gir de caractere reprezinti un intreg fir semn in baza 16. S& se serie 0 fFuncfie care intoarce valoarea numéirului (in baza 10). Un parametru de eroare este setat Ja —1 in cazul detectarit unei erori de reprezentare, si la 0 in caz: contrar. Si se serie 6 funcic, avind ca parametra un muntir real in prociae simpla, care objine reprezentarea aeelui numr cu parte inteaga si parte fracionaré (fara exponent) sub forma unui sir de earactere, transmis ea parametru, Nu se vor folosi eventual functit do converse disponibile. 137 Progeamare in ClCH. Culegere de probleme PS_6. lablou cv cuvintele distinete din text, insofite de numarul lor de apariti. Cuvintele sunt PS_7. PS_8. P59, PS.10. PSL PS12. arate prin pati albe " S80 fee avn a prety 0 alae unsigned ons. ae caleuleaa reprezentrea murs tn baza 16 i depune relat ntran $k de caructere dat ca parametru al functiei. i Un ext ei det intarea standard repreznt un program format dn fea rain)» Sie dtrmine nivel taxim de adincine pete nsvcfune Indice: Se flosee un conor, creseut In fcare nivel (gs ficcare nivel). Valoarea maxima a contorului da nivelul de adancime. sf Pe baza unui text introdus de la tastaturd gi terminat prin Ctrl-Z. si se creeze un PeT\n\ed—" Un text, citit de la tastaturd, este format din cuvinte, separate us ura, este format din cuvinte, separate prin spati albe, ‘Textul se termina prin *.” Sa se serie la iesire cuvantul cel mai lung din wcea Tne (ac exist tule eve de acoaylungine. mani se considera numai primul dintre ele). ° Sa se serie o funcfie aviind ca parametti dou’ giruri de caracter st le caractere, care sterge din primul sir toate aparitiile celui de-al doilea gir. Funcfia intoarce un pointer Ja sirul modificat. . ‘ rm Scrietio functie main () care eiteste 0 linie care confine mai multe cuvinte gi ‘mai multe linit reprezentind un text. Acest text este memorat folosind ua tablou de pointe I yuri de caratre alate diane. Folosind uno de Imai sus se vor sterge din text toate cuvintele introduse la tnceput si se va af textul rezulat a om Prima tinie, inteodusi de la tastaturd, confine un cuvént, iar urmatoarele un teat. Dup lear fine ct, fe afgeze nual de apart alecuvéna Dintr-un text, introdus de la tastatura se cere sa se separe constantele zecimale intregi si 58 se calculeze suma acestora, Se menjioneaza ci acestea pot avea lungimea pand la 20 de cifre zecimale, Modifica fmeyia stretx() , astfel inet aceasta si intoarct in local adesei, un inreg teprezentind pozifia (indiele) in girl edutat unde Incepe prima apaijie a subgiului sau =1 dacdsubgiral nu este gsi. Modifica functia strstr (),astel inet aceasta si fc edutae iceptnd dintr-o pote in irl destinatie, poste spcifieata ca al eles parametr, Functia'vainloarce un fnreg reprezentind pozitia indicele) in srl cut unde se afl prima apaifie a subprfu sat'=1 dak subirl nu este gas 138 P5_13, 514. 515. 75.16. 517. 518. P5_19. 5.20. : CCapitoll S. SIRURI DE CARACTERE. ‘Modificafi finctia strstz () , astfol inedt accasta si intoarc& poritia celei de ‘@.n-a aparifii in sirul destinafie a subsirului. Valoarea lui n, ca si pozifia din ‘care incepe edutarea se dau ca parametri suplimentari ai funcfei Sergio funeyie avand acelagi efect cu funefia str tok () Un text citit de pe mediul de intrare reprezinta un program C. SA se copicze pe mediul de iesire, pistrind structura Tinilor, dar suprimand toate ccomentarile Un text cit de pe mediul de itrare reprezintt un program C. $8 se copicze pe mediul de leit, pastrand structura inilor, dar inlocuind toate comentarile EiI'C prin comentai stil C++, Menfiondm ci in C comentaile se pot intinde pe mal multe ini sau putem avea mai multe comentarit pe oliie. In stil C++ {i comentaru ocupo lini sau un sfarit de lini. Seriefi un program care citoste de la intratea standard cuvinte pana la jiudlnirea caracterului punct si afigeaz cite un cuvant pe o lime, urmat de ddespirirea acestuia in silabe. Se utilizeaz urmatoarcle reguli de desparire in silabe: ‘o consoant aflatéintre dou vocale treve in silaba a dou +n cazul a dou sau mai multe consoane aflate intre dou voeale, prima ‘mane in silaba inti, iar celelalte trec in silaba urmtoare, [Nurse iau in considerare excepfile de la aceste regul SA se transcrie Ia iesire un text citit de Ja intrarea standard, suprimand toate Cuvintele de lungime mai mare ca 10. Cuvintele pot fi separate prin punct, virgulé sau spat libere gi nu se pot continua de pe linie pe alta Scriefi un program care cteste de la intrarea standard un text terminat prin Danet iil ranscric la iesirea standard, inlocund fiecare caracter“*”_printr-un bume corespunzator de spafit libere care ne pozitioncaza la urmatoarea Coloand multiplu de 5, Se va pista structura de lini a textuli Scricfi un program pentra punerea in pagina unui text citit de la intrarca standard, Se fac urmatoarele precizari ‘ cuvintele sunt separate intre ele prin cel puin un spatiu ‘un cuvdint nu se poate continua de pe o linie pe alta + lungimea linici la iesire este N + lungiea maxims a unui cuvnt este mai mict deat fn textul rezultat se cere ca la ineeput de linie si fie yn inceput de cuvant, iar sfigitul de linie 58 coincid& cu sfarsitul de cuvant. In acest scop, spatile se sstribuie uniform si simetric intre cuvinte, Face excepfie doar ultima linie Caracterul punet apare doar la sfarsit de text. 139 Programare' ClCH Culegere de probleme Capitolul 6 Structuri Capitol 6, STRUCTUF 4 “ cpm eft dah Aeavare: Per asi acum pans et interior ui dreptnghi ‘owe aban sleet euprintine valor abslsorclaroy drums (poco a fel ix onda) in cuzul cerul tebe ea distana de la cetrul acest fx punet sf mai ied decfit raza. *, ~ 6 Lc} — Breviar Tinclode ~ — Finelude struct nume_structurs eclarayii_Sanpuri eypedet struct { , Me a double x, y; // coordonatele punctului Pest eae ae typedef struct { Punct a; // goltl din dreapta sus Declarare combinata cu definire: ) pee struct mune_structurd (declaratii camp typedef struct ( r centrul cercu! ‘Acces la un mer (ciimp) al structurii: Punct centru; //, cents 8 Ii mbru (ciimp) al struct eee on variabils structurd.nume_menbru ieee ‘Acoes Iv un membra_print-un pointer a structural tupedet struct ( 7 Punct *puncte; Nor es 207 ' “ul p este in Probleme rezolvate eee RELA. a) Sse dfincsci Gpurlepance, Greptunghi, Gere W hoF & Ponce ca tpt ster Tipu puncte va aven deep clmpuri shee x Odonata ya punctual Core va aven rep caput contest oh punct si Zaza -o valoare rela, tpl drepturght couric stanga. Joa si dreapta-sus pena doud varfur opus sledrepanghisis, Gare sit puncte ir tpul tor de puncte = num de pune dig nor toordonatae or. by Si se defineasca funcfii aviind ca parametri un punct si un dreptunghi (respec un eer), care. stabese act punctl ese fat eae drepeanghil cerca, 6) Ste sre tn program care cites: un nor de puncte, un dreptungh s un core care stabiete ete puncte cin nor sunt ioioay depnung fr elteintrioare cereal atest acute format 40 + functie care intoarce o valoare nenula daca pune’ + interiorul dreptunghiului 4: u Ant in_@reptunghi (Punct p, Dreptunghi a) ( return (pen + disj.x @@ p.x < d.do.x G6 py > d.ej-y Fe py < a.ds.y): ) r + €unctie care intoarce o valoare nenula daca punctul p este in uv Ant in_core(Punct p, Core ¢) ¢ double 42; - : @2 = (p.x ~ c.centru.x) * (p.x - ¢.centru.x) \ + (py ~ c-centru.y) * (py - c.centru.y): return a2 0); ent_e = ent_d = 0; printf (*Introduceti datele norului de puncte: \n"): printt("Nr, de puncte: *); scant (*8d, en.nr}: n.puncte = (Punct*) malloc(n.nr * sizeof (Punct)); printf (*rntroduceti coordonatele punctelor: \n"); for (i = 0; i ¢ mmr; ine) ( printé(" xtd ytd: *,i,i}; scanf ("GLE G1£*, &n.puncteLil.x, &n.puncteli]-y); if (in_dreptunghi (n.puncte(il, @)) if (in_cere(n-punctelil, ¢)) ent_evs; An"); ) printf (* $4 puncte sunt in interiorul dreptunghiului \a", ent_al; printf (" $d puncte sunt in interiorul cercubui \nt ent_e): free(n.puncte) ; 2 2) Dacti noth: R62. Si se rezolve ecuatia ax’ +h +ex+d=0, cu a.bgde Rax0, folosind formutele lui Cardan. Rezolvare; Pentru a rezolva ecuafia cu ajutorul formulelor lui Cardan, parcurgem, urmitorii pug: » 1 3a © 1) Fhcand substitutias sducemecuafia la urmitoarea forma canonicas Y” + PY @ in care: aba 2 be yd o Pee Te aaa iscriminantul ecuafici canonice este: D= 2-4 Discririnantul euatiei canonice es a 4 u (ae ve $d ©) atunci tidacinile ecuafiei canonice (2) sunt whew © yy Seutey unde esi ez sunt radicinile complexe cubice ale unitifil. Pentru a evita discutia niturii rAdécinilor in functie de semnul discriminantului, vom considera toate rida- cinile complexe. 3) Pentru a obfine din ridacinile (6) ale ecuafiei canonice ridicini ‘couatiet initial, rebuie facut din now o substitufie On sens invers, adica seazind —~din partea reall a 3a tidacinilo: y; (= 1, 2,3). ‘Vom defini o structuri pentru numere complexe, iar operafiile cu aceste numere {adunarea. inmulfiea si extragcrea radacinii de ordia 3) Ie implementiim ca funetii Fede ae Finclude #include define MIN_REAL 1.0e-5 Sdeeine PI 3.14159 Hdefine SQR(x) (1x) * (x1) typecef struct ( double re, im; } Conpiex: 43 Programare in C/C++. Culegere de probleme [ @ adunatea a 2 aunere complexes 37} Complex aduna (Complex x, Complex y) ( Complex 2; ze = x.re + y.re; zim = x.im + yvim; return 2; /* inmultixea a 2 numere complexe: +/ Complex mul (Complex x, Complex y) ( Complex 2; z.re = x.re * y.re = x.im * y. im, zim = x.re * yim + xm * y.re; return 2; ) (4 eadacina de oxdinut 3 dinte-un nunar complex: + Complex rad3(Complex x) { ones */ Complex y; doubler; //modulul iui x Gouble teta; //argumentul lui x double rx; //radacina de ordinul 3 din r F = sqrt(SOR(x.re) + SQR(x.im)); if (r < MINREAL) ( //moduiul este foarte apropiat de 0 rr = 0.0; teta = PI /2.0; d else (rr = exp(logir) / 3.0); teta = atanix.im / x.re); , Vere = rr * cos(teta / 3.0); yim = re * sin(teta / 3.0); return } void main(void) ( Complex x(31; // radacinile ecuatiei Complex y{3]; // radacinile ecuatiei canonice Complex el, e2: // radacinile de ordinul 3 ale unitatii Complex u,v, 8, double a,b, c. ds //coefieientis ecuatiet 144 Capitol 6, STRUCTURL double p, @, delta; //eoeficionti i discriminant 71 pentra ecuatia canonica int i: printf (*Introduceti coeficientii ecuatied \n"); printe(ta bcd: "); scanf(*S1f S1£ t1f E1f*, 4a, kb, be, Bd); 7* cosficientii si discriminantul pentru ecuatia canonica: */ pee /a~ sontb/ a) / 3; a= 2 * (b/3/a) * SQR(b/3/a) ~ bt c /3/ SOR(a) Has a: delta = p/3 * SR(p/3) + SOR(q/2): Af (delta >= 0) { s.im = 0; s.re = -q/2 + sqrt (delta); tim = 0; tire = -q/2 - sqrt (delta): ) else (s.im © sqrt (-Selta); s.re = -a/2; teim = sim; tire = s.re: ) a= rad3 (5): v= rad (t); el.re 0.5 * sart(3); e2.re = eli sel. im; 7* calculan radscinile ecuatiei canonice: */ yl0} = aduna(u, v): S = mul(el, u): t= mille2, vi; y(L) = aduna(s, t); 3 = mul(e2, u); t= mullet, v): y{2] = aduna(s, ©); 7s calowlam radsoin} substitutie): */ peouatiel Initiale (facem din now for (= 0; i <3; it) ( x{i}.re = ylil.re-b/ (3 * al; xUi) sim = y(il im; d for (i = 0; i <4; itt) ( printf ("\n x8i = $.31£", del, x{i}-re; AE (x{4].im > 0) printe("+"); Af (ef) sim {= 0,0) printé(me.32fei", xCi] im ? ) M45 Progeamare in C/C++, Culegere de probleme Capital 6. STRUCTURE ROS. De pe medivl de intrare se citeste o Hist a studenfilor unci grupe gi a notelor obfinute de figeare Ia un examen, informayit cu care se ereeaza un fablou cu componente ineyistriri, La introducerea datcor,ficedrui num i se rezorva primele 20 de caractere din linie, numele mai scurte find completate pani Ia 20 cu spasit liber. O Tinie se terminé cu nota stuentulu, Lista este terminata printr-o linie vidi. Pot fi maximum 30 de studengi, $a se serie un program care: a) Stabileste nunca de studengiprezen la examen, +b) Face statstca repatifc’ notelor pe student sub forma: Nowa ‘Numér studenj ©) Afigeaza listele ou studenfir eare au obfinut aceeasi noid Rezolvare: Pentru a realiza statistica ceruta, orem un tablou de 10 elemente, in care contorizim, pe pozija f, numirul studengilor care au Iuat nota f + 1 (nu i, pentru ci indexarea in tablou ineepe de la 0 si nu de la 1, eare este nota minima posibils. Am fi pputut incepe indexarea in tablou gi de la 1, pentru a evita acest decal), ip Hinclude Winclude Hinclude Finclude typedef struct ( char nume [21]; int nota ) Student; void main(void) ( student grnpal30] char 1inie(25]; //linia curenta care se citeste de la intrare int i,j, n= 07 int notud(10]; //vector de contoare pentru fiecare nota printé(*\nintroduceti lista cu studentii si notele "); printé(*(terminata printr-o linie vida) \n"); gets(linie) ; while (strlen(linie)) { 7* extragem numele studentului: */ stenepy (grupa[n)}-nune, line, 20) grupa(n} nume(20] = 0; Y* extragen nota si ne asiguram ca valoaren ei © corecta: */ grupatn] .nota ‘atoi(linie + 20); To aaext (grupa(ny nota >= 1 && grupainl nota gets (Linke) ; ) print£(*Numar studenti = 84 \n", al; 7* initializam contoarele: */ for 1d = 0; i < 10; nstudlil = 0, 7* in nstud[i] retinem nunarul studentilor cu nota itl: */ for i = 0; i < np itt) nstud(grupa (il .nota-1] ++7 print£("Repartitia studentilor pe note \n"); printf (*Nota Mumar studenti \n"); for i = 0; 4 < 10; ive) if (nstud[il > 0) printé(* 2d \t 82d \nt, i +4, nstud(il)s /* afieam Listele cu studentii care au obtinut aceeasi nota: */ for 1d = 0; i < 10; its) if (nstud[i] > 0) ¢ printé(*Lista studentilor avand nota 82d:\n", i + 1); for (j = 0; 3 < mr i++) 4£ (grupa(j] nota-1 == i) peintf("%s \n*, grupa(j].nume) : ie): R6_A. 2) SA se defineasct tipurile: numar complex si polinom ca structuri (tipal polinom va avea cimpurile: grad - 0 valoare intreagi $i coeficenti - un tablou cu componente numere complexe). +) Sa se defineased functii pentru: + adunatea a dou8 numere complexe + fnmulfirea a dou’ mumere complexe ‘ calculul valorii unui polinom de variabilt complexa cu cosficengi complecsi « calculul polinomului derivat al unui polinom dat. ‘se serie un program care: ste un polinom cu cocficengi complecs + citeste p numere complexe (p s 20) $1 ‘+ stabileste care dintre acestea sunt ridacini ale polinomului si ce ‘multiplicitaji au ee. 17 Programare in CiC+-+, Culegere de probleme Recolvare: 7* waloarea poliromalui p in punctul x */ (one. z Complex calc_valcare(Polinon p, Complex 3) ( Finclude Finclude include define MIN_REAL 1.00-6 typedef struct ( double re, im } Complex: typedef struct { int grad: Complex coef{20}; //coeficientii polinomului } Polinom; /* adunarea a 2 numere complexe: */ Complex aduna (Complex x, Complex y) Complex 2; z.re = x.re + y.rer zim = xJim + y.im; return z; ) /* Anmultivea a 2 numere complexe: */ Complex mui (Complex x, Complex y) Complex 21 z.re = x.re * y.re ~ x.im * y.im; yore *ylim + xldm * yire; return z; ) /* verificare de egalitate: */ int egale (Complex x, Complex y) ( /* din causa sepreuentarii imprecise a numerelor reale, nu punem conditia * ca valorile acestora sa conicida exact: “ return (fabs(x.re - y.re) < MINREAL && £abs(st.im.- y.im) < MIN_REAL) ; } J* afisarea unui numar complex: */ void afiseaza (Complex x) { cout << *(* << setprecision(6) << x.re <<", * << setprecision(6) << x.im << ' int i; complex val; val.re = p.coef{p.gradl .re; vallim = p.coel(p.grad) si for (i = p.grac ~ 1; i >= 0; i--) val = adura(mulival, x), p.coef{il): return val; ) /* derivarea polinomului: */ Polinom deriveaza(Polinom p) { int i: Polinom pay if (p.grad == 0) { pa.grad pd.coef[0}.re = pd.coef{0}.im = 0.0 return #4; ) pd.grad = p.grad - 1; for (i= p.grad; i > 0; i--) { pa. coef[i-l}.re coef (il.re; pd.coef[i-1].im coef (il sim ) return par ) void main() ¢ int f, pr char ¢: int m; // multiplicitatea radacinii Polinom pol; // polinomul initial Polinom pol_ay // polinomul derivat Complex nunere(20}, zero; (* citirea polizomului: */ cout << *\n Gradul polinomulul cin >> pol.grad: for (i = pol.grad; i >= 0; i--) { cout << "at << i ce ture " << tat << cin >> pol.coef[i].re >> pol.coef (iJ. im: } /* citirea celo: p mumere complexe: */ cout << * Cate numere complexe veti introduce? *+ cin >> ps cout <<‘ Introduceti_nunerele << endl; cout << " Introduceti coeficientii polinomilui:* << endl; Capitol 6, STRUCTURE 148 49 Capitol 6 STRUCTURL Programarein C/C++. Colegere de probleme [erst tee et eemenietor sale, deci dupa sortare in corecte{i] se va afla numaral de cout << tnt ce bce Tre tcc tnt ce de tim Dronosicuri penint jueStorul j (eventual cu j #1). Pentru a putea determina ola p> manera Fo 25 manera] semnifizayia elementelor din tabloul coxecte dupa sortae, folosim un alt tablou sianume zero.re = zexo.im = 0.07 = Index, in care dack index{i] = j, alunci corecte(i] = mumarul de for (1 = 0; 1 < pi toe) ; pronosticuri pentru jucdtorul j Iniial index(i} = i, cud=O,l, ... m, iar in it fesate(cale-valoare(pot, munarelii); zer0)) { timpul sortari, dacd interschimbam dou elemente din tabloul corecte, le vom afineeza(nunero(i}}; //munerelt jacina intcrsctimba si pe ecle corespunzitoare din tabloul index. FS Spa Hnelude Hinelude Hinclude finclude pol_d’= deriveaza (pol); /* Calculam miltiplicitatea: */ while (egale(cale-valoare(pol_d, nunere[il), zero) \ i pol_d.gead > 0) ( pol_d = deriveaza pola) > define NMA 14 cout << * este radacina cu miltiplicitatea * << m << endl; typedef struct ( char nume(2iJ; // numele jucatorului (max.20 caractere + 77 terminator de sir) char rez(NMAX}; //rezultatele indicate ) Bilet; , . {7 afisares unui mosaj de eroare of teminares programiut: void eroare (chart mesaj) ( ‘perror (mesa); exit(-1); R6_S. Un bilet pronosport confine mumele jucttoreli si 13 caractere 1, 2, x constituind reprezentarea codifcatt a rezultatlor unor meciuri de fotbal a) $a se deseriestructura unui bilet pronosport b) Sa se defineasea o functic avand ca parametri doi vector de acelasi tip, functi care stabileste sumarul de componente egate din eei doi vector «) SA se serie un program care primeste ca date n bilete pronospor, precum si rezultatle a 13 mociur jueate (codiieate 1,2, s) si afiseaza: + lista jucitorilor, pentru fiecare indicindu-se namarul de pronostcuri exacte « lista jucdtorilor, ordonati dupa numarul de pronosticuri exacte indicate. "Numbele jucdtorilor so eitese inoepfind din coloana 1, ar pronosticurite in 2. Rezolvare: Pentru a deserie un bilet,avem nevoie de urmatoarele empuri ~ numelLe jucitorului (sit de earactere) + rezultatele celor 13 mociui (sir de 13 caractere care pot fi‘, *2' sau °°) Numarul de pronosticuri corecte indicate de fiecare jucitor se determina folosind functia definité la punetul b), iar pentru ordonarea listei jucdtorilor mai cream dou tablouri: = corecte, in care refinm muminul de pronosticuri corecte date de jucito Corecte[i} = mumirul de pronosticuri corecte pentru al i-lea jucator. Va trebu Si sortm (descrescator) acest tablou, coea ce inseamn’ ci se va schimba ordinea /* dotorminarea numarului de componente care coincid pentru 2 vectori: " Ant nr_comp_egale(char vif}, char v2{}) ( int i, ont; // ent - contor in care se retine nr. componentelor identice i (strlen(vl) {= strlen(v2)) return ~ eat = 07 for (1 © 0; 4 < strlentvi): i++) Af (viG] Se v2(4)) enters return ent; void interschimba(int 4, int j, int v[1) ( int aux: 130 Is Programare in C/C++. Culegere de probleme veld main(void) int n, i, dz int sortat; char rezultate(141; Bilet vb(20); int corecte[20];//nr. rezultate corecte pentru fiecare jucator int index(20); // indicii elementelor din vb printf (*Introduceti cele 13 rezultate corecte: * seanf(*ts", rezultate) ; printf (*Introduceti numarul de jucatori seanf(*%a", kn); printf (*Numele jucatorilor si pronosticurile lor:\n"); for (i= 0; i = is jo) an{corectel3} > corecte(3-1)) { interschimba(j, j ~ 2, corecte) ; 7* interschimbare si in vectorul index: */ interschimba(j, 3 - 1, index); sortat=t ) ? printf (*Lista jucatorilor dupa rezultatele corecte): for (i= 0; 1 = ny i++) print£(*@s 8d\n", vblindex(i}].nume, corecte[i}); geteh(}: reas aceeneee nee ee 132 nn): Capitol 6. STRUCTURT indexti} ) J afisam lista jucatorilor: */ printf ("Lista jucatori si numar de pronosticuri corecte) :\n"); for (i= 0; i corectelj-1)) ( interschimba(j, i - 1, corecte) /* interschimbare si in vectorul index: */ interschinba(j, j = 1, index); sortats0; i > plil.xr cout << "pt > plil.y: ) convex = TRUE; ” « verificam, pentru fiecare varf al patrulaterului, daca este interior + triunghiului format de celelalte 3 varfuri: uv for (i= 0; 4 < G; ist) ( 7+ Eolosim pormutari cirovlare: */ tivi = pUGh]; Gev2 = pEGsl)8a); t.v3 = pl(ie2y 84); AE (este_interior(p[(i+3)84], 0) ( ‘convex = FALSE; break; ) ) Lf (convex) cout << "Patrulaterul este convex" << endl else cout << "Patrulaterul nu este convex’ << endl; 154 R67. SA se actualizeze stocurile dintr-un depocit in urma satisfacerii an comenzi (n € 100). O comanda este specificaté prin + cantitate (0 valoare intreaga) si + tipul produsului comandet (un tablou de 8 caractere). Situafia color p produse din depozit (p < 200) este data prin: # stocsistoc minim- valor intregi si + cod produs - un tablou de 8 caractere, © comanda va fi onorati daci produsul comandat se afla in depozit si ddacd prin satisfacerea comenzii stocul nu scade sub stocul minim de siguranfa, Programul va crea si afiga: « stocurile actualizate in urma satisfacerii comenzilor « lista comenzilor neonorate datoriti unor stocuri insuficiente + lista comenzilur de produse inexistente in depozit. Rezolvare: ‘etdio.h> Finclude Hinclude Hinelude typedef struct ( cha: cod(8}; // codul predusului int cant; // cantitatea ) Comanda; typedef struct ( chaz cod( 8]; int stoc, stoc_min; } Produs; void main(void) { Comanda comenzi 1100}; Comanda neonoratel [100]; // comenzi de produse inexistente Comanda neonorate2(100); // comenzi neonorate (stocuri, // insuficiente) Produs depozit (200); int i, 37 int p; | // nunarul de produse din depozit Ant nc; // nunarul de comenzi int cntl, ent2; //nunar de elenente din vectorii neonoratet,2 printf (*Numarul de produse din depozit : "); scant (*8G", &D) for (i = 0; i depozit{i}.stoc_min) ; d printf(*Numarul de comenzi : "}; scanf(*Bd", nc): for (i = 0; i < mez ive) ( printé("Comanda ta - cod: *, i}: scant (*8s", comenzi {i} .cod): printf ("Comanda %d - cantitate : ", i); scanf("%a", ecomenzi (i) .cant] ; assert (comenzi(i].cant > 0); ) ont = ent? = 0; for (i = 0; i < nos ive) ( 7+ cautam produsul in depozit: */ for (j = 0; J 0) ( |/* vector in care retinem ultima zi pentru fiecare luna: */ 136 ' printé(*Comenzile de produse inoxistente: \n"); print£ ("Cod \t\t Cantitate \n"); for (i = 0; i < entl; i++) printf ("8s \t 84d\n",neonoratel(i].cod, \ neonorate! [i] :cant); ) else Print£(*Nu au fost comenzi de produse inexistente\n*); if (ent2 > 0) [ printE(*Comenzi neonorate datorita stocuri insuficiente:* printf (*\nCod \t\t Cantitate \n" for (i = 0; i < ent2; i++) printf ("88s \t t4d\n", neonorate?(i].cod, \ neonorate? [i] .cant) ; ) else Drint£(*Stocuri suficiente pentru toate produsele\n") ; getch() : Seriefi o fimefic avand ca parametsi dowd date calendaristice (precizate prin an, lund siz), care stabileste una din situate: + Prima datd'o precede pe cea de-a dua * Cele dou date sunt egale + A dou data o arecede pe prima Functia va intoarce una din valorile ~1, 0, 1 Scrifi o funcfie naiin () care eiteste dou date calendaristce, le valideazs si stabilestc succssiunea lor eronologic Cl “Rezolvare: {in Hinclude typedef struct ¢ unsigned int an; unsigned int lune; unsigned int zi; ) data, int zite() = (21, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 157 Progeamare in CICH+. Culegere de probleme /* verificare daca anul este bisect (daca da, se intoarce © valoare nenula): */ int bigect(int an) ( return ((an %4 oO: 0) |] an & 400 0 && an % 100 ) /* verifica daca 0 data este valida (daca da, se intoarce 0 valoare nenula):*/ int e_valida(Data 4) ( 3 (dluna > 12 || d.luna <1 || dizi < 1) return 0; 7* daca anul este bisect si luna este februarie: */ {e (bisect (d.an) && d.luna 22 2) return (d.2i <= 29); /* anul nu este bigect sau luna nu este februarie: */ return (d.2i <= zile[d.luna ~ 1))7 } ” + punctie care compara 2 date calendaristice + Regultat intors: -1 daca di precede d2 > 0 daca datele sunt egale : 1 daca d2 precede ai " Ant compara date(Data di, Data a2) ( if (dl.an < d2.an) return -1; if (dilan > d2-an) return 1 fv dian = d2.an : */ {e (divluna < d2,luna) return -1; if (Gilluna > d2-luna) return 1 7* dian = @2.an si di.luna = a2.luna : */ ie (dl.2i < @2.2i) return ~ Gf (di.2i > é2.2i) return 1; /* dicen = @2,an ei di.luna = 42.luna si d.2i = G22: */ return 0 ) void main(void) ( Data di, 42; eo ( peinté("Introduceti data di (zi luna an}\n"); Beanf("8d $d 8d", &dl.2i, &dl.luna, &di.an); Lf (1e_valida (at) ) prince ("Data nu este valida, introduceti una corecta\n") } while (evalida(dt)); a0 ( printé(*Introduceti data d2 (zi luna an) \n"); seant("ed a @a", GaP, a2 tuna, edd-an)y Af (te_valida(a2}) printf ("Data nu este valida, introduceti una \ ‘ corecta!\n"); ) while (levalida(d2)); switch (compara_date(al, 42)) ( case -1: print£ ("dl precede d2\n"); break case 0: printé("Datele sunt egale\n"); break; case 1: printf ("dl urmeaza dupa a2\n"); R6_9, Defiiltipul mullime de numere rea ca ostrich ea urmatoarcle eimpar: + numrul de elemente (o valoare intreaga) + valorile elementelor (un tablou de numere reale, aviind cel mult 100 de clemente). Se vor defini funeti pent + a stabili dacd o valoare dat x aparfine sau nu unei mulfini date M + crearea multimii diferenfa a dou mulfimi. + calculul valorii unui polinom (definit printr-o structurd identicd cu a ‘mulfimii de reali) intr-un punct dat x + calculul polinomului derivat, Aceasta funcjie are doi parametri structur: polinomul dat si polinomul derivat si nu intoaree rezultat. Funefia main () « citeste un polinom dat prin gradul m i cei n-+1 coeficiengi + citeste color posibile ridacini ale polinomlui « stabileste pentru fecare rikcind multiplicitatea e. Indicatie: Componeotele X[k] pentru care P(x(k)) = 0 sunt radical eu multplictate cel pujin 1, cele pentru care P'(x{k]) = 0 sunt ridacini ew multplicitate cel pujin 2, s.amd, Radicinile simple se objin ficénd diferenja dintre mulfimea rdicinilor cu mutiplicitate cel puin I si eele eu :nultipleitate cel pun 2 ete Recolvare: Dup& cum sugereaza indicafia, pentru stabilirea mubiplicitayilor vom proceda astfel: rejinem ridacinile intr-o mulfime (notaté in program cu radi) si derivam potinomul in mod repetat, la ficcare pas elimindnd din muljimea respectiva ridicinile clrora le-am putut stabili multiplicitatca, Algoritmul continua pind cind am epuizat toate ridcinile (mulhimea devine vida). 158 199 Progeamare in C/C++ Culegere de probleme oS. Winelude finclude fdefine nuax 100 typedef struct ( int card; //cardinalul muttimii double elem[NMAx]; //elenentele ) Multime; typedef struct ( int grad: double coef [NMAX] + } Polinom: (* verifica daca numarul x apartine mltimii m: */ int apartine(double x, multime m) { i < mcard; i++) m.elem(i]) return 1; (+ diferenta a 2 multimi: */ Multine diferenta(Multime mi, multime m2) ( int i; Multine dif; aif.card = 0; for (i= 0; i < ml.card; i++) { if (lapartine(mtelem{i], m2)) if.elom(dif.card++} ='ml.elem[il; 3 return di ) (* adauga un element 1a o multime: */ void adauga(double x, Multimes m) ( assert (m.card < NMAX}; muelem(m.card) = x; micard++) > #* afiseaza elementele unei muleimi: */ void afiseaza(iultime m) { int i for (i= 0; i < mecard; itt) printf (*8.21f *, m.elem(i)); printé(*\n"); ) lolol 6, STRUCTURE 7* valoarea polinawulus p in punctual x7 *7 Jdouble calc_valoare(Polinom p, double x) ( int iy Gouble val =,0.0; for (i = p.drad; i >= 0; 4 val = val * x + p.coefli); vetura val; 1 J* deriveaza polinomului p (rezultatul se pune in pd): */ void deriveaza(Polinom p, Polinoné pd) ( int i; AE (p.grad = pd.grad = 0; pd.coef {0} = 0.0; } else { pd.grad = p.grad - 1; for (i = p.grad; i > 0; i--) pa.coef[i-1] = 4 * p.coef{il; on ) ) void main(void) ( Polinom p; J/ polinomul initial Polinom pdl, pd2 // folosite pentru derivare Mulkime radacini: //radacinile polinonului Multime radi, rad2, dif; Ant i, ke int milt;//in pascl curent,radacinile au multiplicitate>s mult printf(" Gradul polinomului = *): scant ("td", &p.grad) ; assert (p.grad < IMAX); printf(* Introduceti coeficient: for (i = 0; i <=p.grad; i+) ( printé(atd = *, i}; scant ("B1E", &p.coef{i}): 3 print£(* Numarul de radacini = *); scanf("8d", aradecini.card) ; assert (radacini.card < NMAX); 161 Programare in C/C++, Culegere de probleme Capitol 6, SFRUCTURI printé(*"introduceti radacinile:\n"): k= -1 7/ numara radacinile reale ale polinomulus for (i = 0; i < radacini.card; i++) ( kee: printf(*xtd ©", kd scanf("S1£", aradacini.elem{k]) if (eale_valoare(p, radacini.elem{k}) '= 0) ( peintf (*\n\t GLE NU ESTE radacina a polinomilui. \n",\ radacini .elem(%]); ke } d radacini.card = k + assert (radacini.card > 0): yrcopiem p in pal si radacini in radi, pentru a nu pierde valoarea initiala:*/ radi = radacini; pdi = pi jin primal pas, radacinile din multimea radi au multiplicitatea cel putin 1 */ mult © 1; while (radl.card > 0) ( rad2.card = 0; //multimea rad2 e initial vida deriveaza (pdt, pd2}; 7+ punem in miltimea xad2 radacinile polinomilui derivat: uv for (i = 0; 4 ¢ xadi.card; it) ( Lf (calc_valoare(pa2, radi.elem(i]) adauga(radi.elem{i], rad2); Gif = difeventa(radi, rad2); Lf (dif.cara) ( print£(*Radacinile cu miltiplicitatea td: atiseaza (dif); R6_1O, O matrice rari, adie& o matrice avand majoritatea clementelor nule, se memoreazi economic intt-o inregistrare conjinind: numiral” do lini, rmumarul de coloane, numarul de elemente nenule, precum si doi voetor, ‘unul cu clementele nenule din matrice, iar eelalalt cu pozifile Jor, fieénd sectorizarea matrci pe lini. 4 se defincasca funcjii pentru adunarea gi nmulfirea a dow matrci rare, jrecum si funefii pentru crearea structurii matrice rar& si aigarea acesteia aomatrice, Se va scrie un program care citeste gi afigeazi dou matrici rare si care apoi le adund gle iamulteste, afignd de ficare daté rezultatele. y Rezolvare: ' 1) Crearea structurit matrice rard ‘Vom crea pentru memorarea nei matrici rare o structurd cu urmatoarele edmpuri enlin, ncol — —numarul de lini/coloane nelen numarul de clemente nenule + elem = tablou cu elementele nenule * pozitii = tablou cu pozitileliniarizate ale elementelor nenule Dacé el &-lea element nenul dintr-o matrice rard se aflé pe linia I i coloana ¢, ‘tunei poziialiniarizata se calculeaza astfel pozitii[k] = 1 * ncol + ‘Numerotarea linilor si coloanelor incepe de la 0. 2) Afigarea unei matriei rare: Pentru a calcula linia gi coloana pe care se aflé elementul de pe pozitia liniarizats oz, folosim relafiile Linie = poz / ncol Colean’ = poz % ncol Deoarcee matricea rari poate avea dimensiuni foarte mari, cénd faccm afisarea nu vom refine in memorie toate linile acestsia, ci doar linia curenta (care se afigeaza in Inomentulrespectiy), Pentru ficcar nie a matillfuncja realizcaza umauourcle opera + initializeaztinia curenta cu 0 + parcurge tabloul cu elemente nenule, calcukind linia si coloana acestora gi le pune pe pozijia corespunzatoare in linia curenta, La primul element care nu mai teste situat pe linia curent’ se opreste, afigeazA linia si continua algoritmal cu linia urmatoare, tabloul cu elemente nenule parcurgindu-se in continuare din pozitia unde se ramisese inainte. 3) Adunaréa a coud matriet rare: YVeetorii pozifilor liniarizate ai matricilor rare find ordonafi strict erescator, ‘wlunarea matricilor se face interclasind cei doi vectori. Elementele aflate pe aceleasi povifi in cele doudi matrici se adund, iar celelalte se copiazd fn matricea sum. 163 Programare in CIC Culegere de probleme 4) Inmutirea a dont matric rare: : ‘De aceastii data nu mai putem face interclasare, ci procedim astfel: calculdm fiecare element c[i]{/] al produsului de matrici a-b dupa formula: aata= Satine ore Deci, pentru fiecare k, vom determina. dacs in matricile a si b existh lemente nenule pe pozitile [iI[A] si (KIGT (acest Iueru este realizat de fancyia cauté_poz_matrice()). Daci exist, adaugim produsul lor fa suma de mai sus, #inelude Hinclude define NHAX 100 //numarul mim de elenente nenule din matrice typedef struct ( int nlin, ncol; // numarul de 1inii, coloane int nelem; // numarul de elemente nenule float elem[NMAX}; // olementele nenule . int pozitii(NMAXl; // pozitiile in care se afla elementele nenule } Mat_rara; /y determinarea Liniei 1 si coloanei c a unui element din + matrice, cunoscand pozitia liniarizata poz (si nunarul * de coloane din matrice - col) “ wold determina indici(int poz, int ncol, inte 1, inte ¢) poz & neal; poz / ncol; /* verificare daca in matrice exista element nenu) in pozitia * (liniarizata) poz; daca exista se intoarce indicele acestuia * in vectorul ce retine elenentele nenule (vect_poz); daca nu, * se intoarce -1 y int cauta_poz_liniara(int poz, int vact_poz{], int nelem) ( int gasit = 0; int i = 0; while (i < nelem g& !gasit) { if (vect_poz[i] == poz) gasit = 1; 7 Capitol 6. STRUCTURT TE (igasity ive; ) Af (1gasit) return -1; return i; J* asemanator cu fenctia de mai sus, dar se cauta dupa linie si coloana: */ . int cauta poz matrico(int 1, int c, Mat_rara mat) ( int poz = 1 * mat.ncol + 7 return cauta_poz_liniara(poz, mat.pozitii, mat.nelem); ) j* citivea si crearea unei matrici rare: */ Mat_rara creeaza_mat_rara() { Nat_rara mat: int lc, i printf (*Ne, de Linki: "); scanf("%d", kmat.nlin) print£(*Ne. de ccloane: *); scanf("%d", kat ncol) ; print£(*Nr. de elemente nenule: *) | scanf("td", tnat.nelem) ; print£("Introduceti elenentele nenule: \n"}; for (1 = 0; i 1) break: // s-au terminat elementele nenule de pa 71 linia cuenta Linert (J] = mat.elem(poz}; pozt+; ) printé(*\a"}: (* afisam linia curenta: */ for (i = 0; i < mat.ncol; i++) printf(*® 6.26", linertli}); y € /* adunarea a doua matrici rare (¢ <- a+b): */ [int aduna_mat_rare(Mat_rara a, Mat_rara b, Nat_raras c) ( | int poz_a, pozb, poze: // indie in vectorii cu elemente 17 nenule /* Gimensiunile matricelor trebuie sa coincida: */ Af (anlin t= b.nlin [[ a.ncol != b.neol) ( printf (*\n Natricele nu se pot aduna*); return -1; ) /* initializam matrices suma: */ a.nlin; c.ncol = a.ncol; e.nelem poz_a = poz_b = poze = 0; /* parcurge vectorii cu elemete nenule ai celor doua matricl: " while (naza < A.nelem th por h < hnelem) —( if (a.pozitiifpoz_a] == b.pozitii(poz_b}) { /* am gasit 2 elemente cu aceeasi pozitie, le adunam: */ c-elem{poz_c) = a.clem{poz_a++] + b.clem{poz_b++] c.pozitiilpozct+] = a.pozitii(poz.a - 1] cunelem++; continue; Af (a.pozitsitpoz_al > b.pozitii(pozb])“¢ /* in matricea b ne aflam la o pozitie *mai mica* decat * pozitia din a; copion elenentul in ¢ si inaintam: uv evnlin ‘euelem(poz_e] = b.elenlpoz_bl; epozitil[poz_ct+] = b.pozitiilpozbt+]s e.nelemt+; continue; ? if (a.pozitiilpoz_a) < b.pozitii(pozb)) { c-elem{poz_c] = a.elem{poz_al c.pozitii(poz_ct#] = a.pozitiilpoz_ael; e.nelens+; ) ) y+ una dintre matrici a fost parcursa in Sntregime, copiem in * © restul elementelor din cealalta: 4 Af (goz_a < a-nelen) for (7 poz_a < a.-nelem; c-elem(poz_c++] c.pozitii(poz_cl else for (; poz < b.nelem c.elem(poz_ct+] = b.elem[poz_at+], c.nelem++) cepozitil{poz_e] = b-pozitiilpoz_bl; a.elem{poz_a++], ¢.nelem++) a.-pozitii{poz_al: a + in cele doua *for'-uri de mai sus se poate observa ordinea + ir care se executa instructiunile(mai intai se face * atribuirea din corpul ciclului si apoi celelalte, * in care se increnenteaza si indicii) " return ) (+ Anmiticed 42 matrici rare (c <= a * bb: / int dnmdteste mat_rare(Mat_rara a, Mat_rara b, Mat_raraé c) int i, i int poz_a, poz, pozci //indici in vectorii cu elemente dinenule float cij; // valoarea elementului ¢{41 [5] AE (.ncol != b.nlin) ( printf (*\n Matricile nu se pot inmultir); 166, 167 Programare in C/C++. Culegere de probleme Copltoll 6. STRUCTURE evnlin = a.nlin; e.ncol = b-ncol; esnelem = 0; poz_c = 0; for (i = 0; 4 < e.nlin; i++) for (j = 0; j < e.ncol; j++) ( /* calculam elementul [i,j] din matricea produs: */ ij = 0.0; for (k = 0; k < a.ncol; ket) ( /* cautam elenentele din pozitiile {i,k} ei [k.j) ina, respectiv b! ” poz_a caute_poz_matrice(i, poz_b = cauta_poz_matrice(k, 3 ky, ads bh: if (poz_a >= 0 kk por_b Dy) cij += a.elem[poz_al * b.elem{poz_bl: ) if (cig != 0.0) ¢ c.elem{poz.c} = cij: c-pozitii{pozct+] = 4 * c.ncol + 3; c-nelen++; ) ? return 1; } void main(void) ( Mat_rara a, b, 8, pr printf ("Matricea a \nt } printf£(" (numerele de Linii/coloane incep de la 1) \n*); a = creeaza_mat_rara\); printf (*Matricea b(numerotaxe indici de la 1) \n"); D = creeaza_mat_rara(); printf (* Matricea suma este aduna_mat_rare(a, b, 8); afiseaza_mat_rara(s); printf(*\n Matricea produs este: inmiltestemat_rare(a,'b, p)i afiseaza_mat_rara(p); getch() \n): \nt): 168 P61. Probleme propuse Un experfinent fizie este precizat prin numarul de determindri si valorile misurate, a) Siisedefineasetstructura experiment b) Sa se defineasea o functie avand ca parametru un experiment, care ealeu- Jeazd media aritmeticd a masuritorilor. ©) Si se serie un program care eiteste numinut de determina valorite lor si creeaza cu acestea o inregistrate si calouleazi, folosind functia de mai sus, abaterea standard : a). Si se defineascé tipul punct ca o structurd ) $a se defineascd 0 funcfc, avdnd ea parametri trei puncte, care stabileste ‘dacdacostea sunt sau nu coliniare ©) S& se serie un program care citeste un intreg 1 (n S 50) si m puncte si afigeaz numerele tripletelor de puncte coliniare. Pentru aproviziorarea unui magazin se lanseaz n comenzi (n < 100). O comand’ este precizatt prin dou’ element + tiput produsitai comandat (un tablou de 8 caractere) si + cantitatea comandata (0 valoare intra) Un produs poate fi comandat de mai multe ori, Sa se centralizeze comenzile pe produse, astfel net comenzile centralizate si se refere la prosuse diferte Dac& dou comerzi diferite i si jeu i < j se referd la un acelasi produs vom comasa fn comanéa i eantitatea comandati in si vom anula comanda j comand va fi caracterizata deci prin’ + tipul produsulai comandat, + cantitatea conandata si . + faptul ef este 0 comanda in vigoare sau a fost anulata. in procesul de centralizare a comenzilor se vor face toate comparafile posibile intre comenzi diferie, care n-au fost anulate La o disciplind eu verificare pe parcurs, ficedrui student i s-au acordat trei note la trei Iucrari de control si un ealificativ pentru activitatca la seminar (in- suificient, suficient, bine gi foarte bine), Pe baza acestor informal se acorda 0 not final in felul urmtor: se face media celor 3 note la care se adau’ 0, 0.25, 0.5 sau 0.75 conform calificativutui, iar rezultatul se trunchiaza 169) Programare in C/C++. Culegere de probleme POS. J. a) Sse deserie tipurile punct si dreapté ca tipuri structural. a). SA-se dofineaset tipul situat-ie ca un tip structard avand drept cémpuri: P67. = un tablou de 20 de caractere, * notele « trl valoritntregiintre | gi 10 gi + calificativul — -uncaracter (I, S, B,F). b). S& se defineasca © funcjic avind ca parametru o situafie, eare calculeazh nota final’, se seric un program care citeste pentru cei n studenfi + din primele 20 de poziis + calificativul — -uncaracterin pozitia 21 + cele 3 note ——_- valoriintregi, separate prin spafii % i afigoaza lista studenjilor promovati gi lista studengilor care au objinit note de 9 si 10. + numele + numele data calendaristica este exprimata prin trei valoriintregi: anul, luna gi ziva, | © porsoana este precizata prin: nume si prenume {maxim 30 de caractere) f1 data nasterii - 0 data calendaristica, ta). Sa se descrie tipurile data si persoand ca structuri, b) SA se defineascd 0 funcie avand ca parametru o persoand, functic care B py 9, caleuleaza vrsta persoanei in ani implinif ©) SA se sorie un program care citeste o list de persoane (1 este ctt “naintea listei) $i datelo lor de nagtere gi folosind functia definit& mai sus afigeaza lista persoanelor major. b) Sai se defincasca o funeje avand ca parametri doud drepte, un punet si o va riabtaintoaga, funcjie care stabileste daca cele dus dropte se interse- teazi, eaz in care caleuleazA coordonatele punctului de interseti, sau acd ot paral parametrul boolean separ situaia drepte paralele /eoncurente 10) Siise sorie un program eareeitosten drepte (1 < 100) si afiseaz8perecile de drepte paralele, iar pentru fiecare pereche de drepte neparale ~ coordonatcle punetului do interseeic. De exemplu: Drepte paralele: 1-3 2-4 Drepie concurente: 1-2 (8.0, 7.0) 1-4 (17.0,5.0) - 2-3 (4,0, 4.0) 3-4 (13.0,2.0) 170 Capitola 6, STRUCTURE Defiifi o structurd "Aivmai" avénd ca membri: un introg si dou tablouri eu ‘componente tntegi Definfi 0 funcjic care determina primul divizor al unui numar Gntrog lung, fark semn) si multiplicitatea acestuia. Funcfia are trei parametri: nmi, divizorul si multplicitatea (ultimii doi parametri reprezinta rezultate calculate de functic). Definifé 0 fincfie care primind un numar intreg determina: numarul divizorilor primi distinct, tabloul divizorilor primi si tabloul multiplictajilor divizorilor primi. Funcfia are un singur parametru - numarul intreg, iar rezultatele sunt fntocrse print-o structurd di. vana Definifi o funcjic care primeste doi parametri numere intregi si intonrce ca reaulat o structuri divmul (conjindnd numar de divizor, tabloul divizoritor si tabloul multiplcitjilor divizorilor) din care se poate calcula exmm.dc, al numerclor. Se stic ed emmde. confine divizorii comuni ai celor dows rhumere cu multiplicitijile. cele mai mic. Definiji o funcjie avand ca parametru o structurd Gi vmul, care intoarce ca rezultat ¢.m.m.d.e. Defirijio fimefiemain () careciteten numer integ| si calcueaza c.mmde, al or, Definiio structura "rational" aviind ca membri doi intregi pozitivi. Definji 0 funcyie avand ca parametri doi intregi, fucic care intoarce ca rezulat o structura rational Definti o fumcjic avand ca parametru o structurd rational, care intoarce ea rezulat numaratorul fracjei rajionale (acelasi lucra si pentru numitor). Definii o functie care simplifica o fracfie rafionala, Functia are ca parametru o structurd - fracjia rajionalé si infoarce ca rezultat tot o structurd ~ fracfia simplificata Definii 0 funcfic care adund dou’ fracfi rafionale. Funcjia are ea parametri dua structuri fragile de adunat, si intoarce ca rezultatfractiarationala suma, Definiio funcjic main () care: citegte un introg 7 $ 20 gn fracti rationale = ealouleazdsuma celor’m fracit rajionale si afigeaza rezultatul fracfic rafional, folosind funcile definite mai sus. P69. Definiji structurd "matrice” avind ca membri doi fntregi reprezentind numarul de lini, respectiv coloane ale matricii un tablou cu 2 dimensiuni (cu limitsle 10 gi 10 in care se pastreaza elementele matrice). Dofiniji o functic care inmulfeste dou matrici, Funcfia va avea 3 parametri, cele dou structuri matrici care se inmulfesc si produsul si va intoarce ca recultat 1/0 dupsi eum innnulirea matrcilor este sau mu posibild. Dafinifi o funcfic care compari o matrice cu matricea unitate. Funefia are un pparametru structura matrice de comparat gi intoarce un rezultat tntreg 0/1 im Programare ClCH. Culeyere de probleme Definji o fanetic care initaizeazi prin ctire © structuré matrice. Func} verified dacd numarul de lini gi colome sunt mai mici sau egale cu 0, repetind citirea in caz contra. Funcjia nu are parameti $i structura inifalizat prin cite Definijio funcfie main () cafe: = citeste doud matrici ~ verificd daet una este inversaceeilate,afigind un mesaj corespunztor. Definti structurile "complex" (cimpuri parte reala si parte ima- qinara) si ‘polinom" rar cu coeficienji complecsi (cdmpuri nunar terneni,tablou coeficienti complecsi sitablou intreg expo- nenti) Definit o funcfic care adund dou numere complexe. Funcja are doi parame structuri “comp Lex" $i intoarce ca rezulito structuri "comip.ex" (suma). Definiji o funcjie care aduna dou polinoame rare cu ‘coeficienti complees Funcfia are 3 parametri: dows structuri "pol inom" si un pointer la structua polinom rezulat. Definiti funetie care initializeaza prin citre deta tastaturi o structud ppolinom. Functia nu ate parametr si intoarce o structur§ "pol inom Definii o functie care afigcaza la terminal o structur& polinom. Funcjia are ut parametnu structura si nw intoarce nine Scrieyi o functie main() care citeste dowd polinoame rare cu coeficionf ccomplecsi,calculeaza polinomul suma gil afigeaz. Indicate: in potinomul sumé se copiazi cosfcienfit si exponent celor doxt Polinoame si se adund numérul de termeni nenuli, Se reduce apoi numirul de {ermeni, comasind termenii care au acclagi exponent inte-un singur termen, im Capitolul 7 Fisiere Capitol 7. FISIERE Breviar Fisirul comine prototipurile urmatoaretor funcfi nod) + cre ean eT pointer fisieral deschis sau NULL dact opera sua iit felowe FILE pr Int Egete(FILE® pili inchiderigieral FCitete-un ener ain Tier 3 TST cearacterul eit sau EOF, ne Epute (ehay 6, FILE pry caracerul primi en params tn gr ns cel mull not Format, 1ista_expresii)’: char? Egets(chat® =, iat 8, [Cite din fcr ol PILE* pf caracter, sats pina ta nize fi *n, in foul cara pune * 0". Intorce sa NULL di a 0 TE -FUEE (GRRE? -BFIEEP BET | Copia’ sin in ierl dT ar Tnlocuieste terminator! “\O" cu *\n'. | TE SSERETPIIET SP —SHET [Cie dn ge so cou oat rmat, lista_edrese)? ntarec mame eimpun cite sa EOF, in caz de eroare sau sfiirsit de figier, Se floseie ci fig text Tae EBFIRET (PTE BE Seren Higley sub contr Tors Intoarce numa de carnctere serise sn va Tone negativa in cay de eroare, Se floseste ou figioe text. int orig); Tat fread char*— sca, THE Ta, | Gliese din fisiorin zona, fa arieole de ur int na, PILE" pe sgime la. fecare Imoarce muna de nicole folsee- fire bn Tat Twritelchar® zona, int Ta, ‘din zona, na aricole de Tan int na, FILE pf); tgime La fiocare. intoarce aumvirul de anti [TRE Tscek (RILEY pF Tong dept, | cole scrise efeetiv. Se foloseste cu fisiere Pavilion eirsoral i fier Ta Gapl oe {ef ft de inceput,pozifia Curent sam sfir= Word Fawind(PIEBY EET ong feel (FILEY pila [int feof (rte pe} TaE forror (FILE* pty ul deh oa dowectat 0 jl de inteae /iesire Progeamar iC. Culegere de probleme Capitola 7. FISTERE Fisiere binare - Probleme rezolvate 7A. SA se seric un program pentru erearea unui figior binar, avéind articole Structuri eu urmatoarele cdmpuri: + Nume depunator — ~ sir de maxim 30 de earactere + Data depunerii —o structura avand cdmpuri + Suma depust —o valoare reala, “Articotele sunt grupate pe zile in ordine cronologicd, Datele se introduc de la consol, ficcare pe tec lini, Sa se afigeze apoi continutul figerului. (Probleme tnrudite: P7_1) intregi: zi, una, an, ‘Rezolvare: Vom introduce mai tot datele fnr-o ordine aleatoare, apoi le vom sorta dup’ data. in final, vectorul de structuri va fi scris in figierul output . dat. { [Winclude #include void main (void) ( 77 Crean un vector de articole pentru a le 7 sorta ulterior dupa data depunerii. jy Aeticolul suplimentar este necesar la sortare. J) Tm plus, vom citi ceea ce am scris in fisier 7 inte-un' vector separat de articole struct { char nume(30); struct ( int 2i, luna, an; } data: double suma; } articole[20], articol, cititel20}; PILE *£; int n: J] twunarvi de articole int founds V7 Polosit la sortare (1 Citire date de intrare printi(” Introduceti numarul de articole: "); scant ("td", gn); for (int i= 0; i < ny ise) ( printé [* Tntroduceti nunele depunatorutu: Seanf ("8e", articole{i).mume) printé (" Thtroduceti data depunerii <22/LL/ARAA>: * ts Beant ("ea/sd/td", karticole[i].data.2i, \ printf (* Introduceti sua depusa: * scarf (*t1f", karticole(i] .euma) ; ) 7/ Sortam dupa data depuneril ao ( fourd = 0; for (i = 0; i < md: ies) 7) Testam cazurile in care data articolului curent este 47 ‘mai maze’ decat data articolului urmator Af ( (articole[il.data.an > articole[i+i].data.an) || \ (articole(il ‘data.an == articole[it1].data.an && \ ‘articole(i] .data.Juna > articole{i+1} .data.lunal || \ (articole(i}.data.an == articolo(i+1] data.an s& \ ‘articole(i] data, luna == articole(i+1) .data.luna && \ articole(i)-data.2i > articole[i+1}.data.zi) } ( articol = articolelil; articole[i} = articole(i+i]: articole[iti] = articol; fund = 1; } } while (found) : 1] Decchidere fisier LE ( (£ = fopen (Toutput.dat*, twb")) == MULL) { printé (" Eroare la deschiderea fisieruluit exit (2); ) // Seviem in fisier si 41 inchiden 1) Seriem intai numarui de articole furite (en, sizeof (int), 1, fh; fwrite (sarticole, sizeof(articol), n, £7 felose (f); LE C1f = fopen (Youtput.dat®,trb")) == NULL} ( printé (* Eroare la deschiderea fisierului! *); exit (1) ) fread (in, sizeof (int), 1, £7 fread (kcitite, sizeof(articol), n, £1; for (i= 0; 1 Wanclude include include include #include void main (void) { // Von citi ceea ce am scris in fisier 77 Ante-un vector de articole (pentru a testa // ca actualizarea s-a facut corect. struct ( char nume(30]; struct ( int zi, luna, any } data; double’ suma; ) articol, citite[20); FILE *f; double Suna char nume(30] ; char cont = 'D! int n; 4/ Pentru continuare 17 momarud de articole J] Deschidere fisier Af ( (£ = fopen (routput.dat",*reb")) == NULL) ( printf (* Broare la deschiderea fisierului! *); exit (1): b 176 77 Retualtzare while (toupper (cont) == 'D') { printé (" Foaie de restituire, \n"); Brintf (* Tntroduceti nunele: *); scanf ("8s", nume}; printf (+introduceti suma: *); scanf (*$1E", Gouna): 7/ Ne pozitionam...1uan in calcul pen = nr de articole fseck (f, sizeof (int), 0); articol.suna = -1.0; wnile (/fe08(£) && stremp(articol.nume, nume) != 0) fread (garticol, sizeof(articol), 1, £1; if (feof (£)) LE (guna > exticol.suma) printf ("Sima este prea mare! \n*); else articol.sume -= suma; fseek (£, ftell(f)-sizeof(articol), 0); fwrite (aarticol, sizeof(articol), 1, £7 ) flushall 0) 5 printf (* Doriti sa continuati? "); scanf (*80", gcont) ; ) fseek (f, 0, 0); fread (sn, sizeof(int), 1, £7 fread (keitite, sizeoflarticol), n, £) for (int i Len; ive . printf (* Articolul td: ts, ¥4/ta/ta, €1£\n", S42, \ eitite(i} ume, citite[i].data.2i, \ citite(i] data.luna, citite(il.data.an, \ cititeli] -suma) : fclose (£): geteh(); Pentru a sorta clementcle unui tablou V, irda Te doplasa, se erect un now tablou P, fn careun clement P, reprezintd pita po care ar avca-o elementul co- respunzitor din Vin tabloul sorta, adic& numrul de elemente care ar trebui si se giseascd inainteafiecdrui clement din tabloul sorat: 2 = numaimul(V, SV.) 173. De exemplus 7 Progeamare in C/C++. Culegere de probleme Pe baza tabloului P se obfine relativ simplu pozitia (indexul) clementelor sorta din tabloul V. Cel mai mic clement se affi in V in pozilia & astfel inc&t Py turmatorul ~ in pozifia corespunzatoare lui P pentru care Py=n Daca tabloul V nu are toate clementole distinct, pentru erearea tabloului P se face modificarea: = numarulV, $¥,) +mumarul(¥, <¥,) 1, ultimul clement corespunde pozitst De exemplu: oT vis [2 on x] 1Te Problema prezinta interes in cazul in care in locul tubfoului V avem un fisier eu tp. Sortarea fisirului in raport cu o cheie (unl din cimpurile aticolelor fiscrului) revine Ja crearca unui fisier index care reprezinta un fisicr de intregi (echivalent tabloului 2), in care fiecare element x di pozifia celui de-al lea clement din fisierul sorta in fisicral inijal Si se defineascd 0 funetie, care, primind ea parametru un figier binar, ereeaza un fisicr index in raport eu 0 chic. ‘so defineased o functic, care, asociat,afigeaza articolelefisierului sortate in raport cu indexul dat Rezolvare: Vom genera vector ind (P din exemplul de mai sus) six (ea in exemplul dde mai sus). Apoi imediat, solupe sunt date de v{x{}] Fisierul binar ce congine vectorul v va fi dat ca parametru in linia de comands, T3.epp z z Winelude Wnctude Hinclude #include // Serie fisierul index pe baza fisierului de intrare FILE "index (PILE *f in) { int n, *v, tind: FILE *£ index; ” int ley /1 Yunarul elenentelor din vectorul initial care i} sunt mai mici decat elementul curent. int i, ji // Indecsi 178 Capitola 7. FISIERE, imind ca parametri un figier gi un figier index tire fisier de intrare : os ae, GEtcortane)s dr fsa); // Sumarul de elenente din v Fee sees matloe ta * eizeor ne) waa tine *) maboe (a * sizeof Gat); fread (vy sizeof ine), ny £m); rewind. (Ein) Ti catculan voctorvt index for (i Lc ise) { it = 0 for (j= 0: 3 = vid) ae di: else Af (vii) > VG) ae tay y anata) «= 281 ) secien fisierul index UTE adax = Cope (cindex.dae*,"wib")) = NULL) ¢ ‘mise Co arcare ta Goschidorea fisierulul! */ tate (2 ) Eweite (ka, sizeof (int), 2, f_index); fwrite (ind, sizeof (int), n, £index); rewind (f index); return f index; ) 17 sorteasa vectorut din fisiensl fin folosind fisiersl £ sndox (adware (fue *e ny Feu of_tadew) ¢ men, sing, 7 RE ava ine ais TM cltlte fisiere de sntcare these ten, sizeot (int); ty fin); Gade Snattes ta # slzeos ine): frond (v, bizeo! (int), ny fia); Eieea (ea, eiceos (ant), i, Eindex); fest (SoS) Taaidee (a alzeoe ane) Hided (ing, ‘izeot tint), ny finden); Croan voctorul x WORE YS nalloc (n+ atzece int): eee 179 pio 7. PISTERE Programare in CIC. Culegere de probleme Sri for (is O;i white (indfaue) t= 4) auxe+; Hnelude aac #include ) Hinclude // Atisam vectorul sortat Binclude printf£ (* Vectorul sortat este: \n"); Sequeeic {/ ansonce texnenal in otrat Tul Fibonscet De ee ine £4 (ine a | Pinee Ce" otEIny: Tete ceo-|] fe 4) return 2 Feturn (fSb(mel) + £3b(a-2))1 void main (int arge, char *argv[]) ( uJ FILE *fin, +f index; ea daca nunarul n este din sizul lui Fibonacci ibe vfs (1 werttce a // Deschidere fisiere "fae if (argc t= 2) ( while (fib(it+) < nb; printf (* Utilizare: 7_3.exe \n"); ays return (£ib(i-1) exit (1); ) ) if ( (fin = fopen (argv(1,*rb")) == MULL) J/ Verifica daca nunarul n este prim print? (" Eroare la deschiderea fis{eruluil "); Ant prime (int m) ( exit (2); for (int i= 2; 4 < n/2; ise) ) if (nt 4 == 0) return 0; return 1; } 11 Seolucrarea datelor index = inde (fein) sort [f_in, feandex)s felose (é in); : void main (ola) { felose (finden) 5 PILE tfAny *E.out; serch ies, . ! fe Tterin © fepen(rmumere.dat*,"ybt)) == NULL) ¢ pH (> sroure de desenigoren finferviuit "7 exit (17 R74. Se considera dat fislerul de intregi numere .dat . Si se erecze Figierl ) sop i Eibopr.dat , confindind numai acele elemente din fisicrul intial care if ( (out = dopen. (+#ibopr dat” ee eae sunt numere din siru! fui Fibonacei, numere prime, ap exit (10 Rezolvare: Vom folosi tri funeti: fit (caleulewza termenul_n din girl bi dinite (1feot (tin) ( Fibonacci}, test_fib (verified dack numarul n aparfine sirului lui Fibonacci) si Brood (Be, sizeof (ine): 1. fin) ‘ime (verified daca numrul este prim) if (prine(k) && test_£i Se eaeoerenineceare an eweite (uk, sizeoftine), 1, Louth; deca este simpli: se citeste efte un numir din figicrul numexe dat si se verified ) daca este prim si dac8 aparjine sirului lui Fibonacci. in caz.afirmativ, se serie numirul felose (fin); in fisicral £bopr .dat. Eclose (f_out}: _| 180 8 Programarein CIC4+, Culegere de_ probleme R7_S. Pentru stablirea cdgtigitorilor la concursul: PRO sti si estigi la telefon se folosese dou figire: concurenti (confinind articole eu edmputile nnune ~ sir de caractere si telefon - sir de caractere) si premii (Cimpuri telefon ~ sir de caractere gi premiu — valoare real) Sctiei un program care aliyeazat numele eistigdtorilor si valoarea premilor. Se vor afi de asemenea: valoarea total a castigurilor, premiul maxim $i hhumele celui care -a cistigat Nl Rezolvare: Nu tcebuie decit si edutim numerele de telefon din figicrul conc. dat in fisierul premii.dat si si luim in considerare cdstigul (suma eéstigata si numele istigatorului). Vom presupune cd acestefisiere sunt deja scrise. De asemenea, vom reine in variabila maxx_prize valonrea premiului maxita. Aceasta va fi init cu 0 valoare negativi oarecare (spre exemplu =1). 7 Sepp To Finclude include finclude Hinclude typedef struct contestant ( char name[30], phone(30}; ) contestant; typedef struct prize ( char phone(30] 7 double value; ) prize: void main (void) ( FILE *f_conc, *f_prizes; double Sun ='0 W/ Suma premiilor double maxprize = - 1.0; // Premiul maxim char winner (301; V/ Castigatorul premiulud maxim contestant cont; prize p: 7} Presupunem ca nu au doua persoane acelasi telefon int found; elrscr(): 1 Deschidere fisiere Af ( (£conc = fopen (*cone.dat",*rb')) == NULL) { printf (" Eroare la deschiderea fisieruluif "); exit (1); } if ( (Eprizes fopen (*premii.dat*,"rb")) NULL ) ( 12 a Capitol 7. FISIERE printf (" Eroare la deschiderea fisierului! exit (1); ) wails (1feof(fprizes)) { : fread (&prz, sizeof (prize), 1, f_prizes); rewind (£_conc) ; foand = 0) while ({feof(fconc) && tfound) { fread (&cont, sizeof (contestant) , i£ (stromp(cont.phone, prz.phone) found = 1: printt (" $6 a castigat @1£\n", cont.name, prz.value) sum += prz.value; if (nax_prize < prz.valuel ( nax_prize = prz.value: strepy (winner, cont.name) ; ? fLcone) : ot } y printf (" %5 a castigat $1f, adica cel mai mult\n", winner, max_prize) printf (* Suma premiilor este: 81£\n", sum); fclose (fcone] fclose (f_prizes): “Abonafil uni companii de telefoane sunt rejinusi in figieral abonati .dat’ ce confine inregistii de forma: same abonat (sir de 25 de caractere) numar de telefon (gir de 25 de caractere) Existi de asemenea un figier binar plati.dat ce confine cate un articol pentru fieeare chitanfa de achitare a taxci tclofonice sub forma: ‘enumir de telefon (sir de 10 caractere) ‘»suma platit (teal) Sa se serie in C: ‘+0 funcfie pontra cdutarea unui abonat in fisieul plati dat, care fntoaree rezultatul 1 (exista) / 0 (nu exist) 0 funcfie main ()_ pentru tiparirca la imprimanté a numelor abonafilor care im si-au achitat taxa telefonicd. 183 Recobvare: Se citese infomaile din fijenl "abonati .dat" una edte una gi verfick dacd exist8 0 inrepistrare corespunzatoare in fsierul de plifi, adie duet abonat. tel=plata.tel, Imprimanta este privitt in C ca un fisier de tip text (stdpen). Tipdrirea te imprimants se relizcazA folosind funcjia: fprinté (stderr, ...); T6epp ae = = ‘Finclude ¥include Hinclude define PISTER_ABONATI ‘abonati.dat* #define FISIERPLATI *plati.dae* struct PLATA ( char tel (10); float suna; ne struct ABONAT ( char nume(25]; char tel {10}; // Cauta in fisierul de plati dupa campul tel int cauta(char *tel, char *fisier) { FILE *£; struct PLATA articol; if ( (ffopen(FISIER_ABONATT, *rb"))) { printf(*Nu pot deschide fisierul de abonati!*); exit(-L); while (fread(earticol, sizeof (articol) ,1,£)>0) if (styomp(articol.tel,tel)==0) { felose(£): return 1; ) fclose(£); return 0; ? int main(voia) ¢ struct ABONAT abonat; FILE *£; // Deschid fisierul de abonati (*rp* if (1 (£=£0pen(PISIER_ABONRTT, "rb"}}) ( printf ("Nu pot deschide fisierul de plati!*); exit(-1); READ BINARY) po 184 (Capitol 7, FISIERE, [77 citesc tnregistrarile veteritoave a abonati una cate una i'Ggut in fisieril ae piaei || shite Bread laatonat,etzect (abonae),1,£>0) {4° cfeautalabenae, cel, FISHER PATIO | printf cetdeut, s\n" abonat-ounel tc1oee teh return Ir J R77. Un figier binar neLinii dat confine intregi reprezentind numercle anor fini dintr-un figier text text. txt. Stiind ca acesti intregi Cu lordonati crescitor, seteli un program care afigeazi la consola line din fisiral text a ctor numere apar in fisieral bina Rezolvare: AGE - ee as Hnelude int main(voia) ( cuscrr LB ty tes [nt Linie afisata,2inie_curenter0; Ghar 2inet1000)" (bosch fiekerete open {ncext.eae2, ort" Cpen(wnrlinsicaae’, rb"); Fe (eeniath |] peamiub) ¢ . plinesttulpot doschide unul din fisiere.*): Peturn —17 » waite (2) ¢ tbee 0 nova informatie din fisierul 1) Sotndsen Panter dace cltiven,s-a facut, bine (1 al dace” puon ajune le sfarestol Feteni {6 (reed (aline afieata, eizeot (int) 1b) jPeltese Linii din fisierul eext pana cand na positiones pe nia ca trebuie 28 0 afisee While (linietstteatastinie-cerenta) ¢ Tinie curentares EgoteTiiaie,1000,¢); b fpute (Linke, stdout) + ) felose(t Eclose(b) : return 0; 185 are tn CIC++, Culegere de probleme R78. Sa se serie un program care primeste date numero pare gi_afigeacd ‘descompunerile distinctc ale fiecirui mumar par ca 0 suma de dowd mumere prime. Datele pot fi introduse in 3 moduri 8). imteractiv, caz in care linia de comand nu are parametri, iar numerele se introdue de la tastatura, céte un numar pe o linie, Numerele se termind prin marcajul de sirgit de fsier. rnumerele se dau ca parametr ai liniei de comand’ numerele se citese dintrun figier binar, caz in care comanda are 2 parametr: ~£ gi numele fisierului (Ex. “-£TNPUT.DAT") = Bact numnul de argumente din linia de comanda (argc) este egal cu 1, numercle se eitese de la tastaturé. Un program C/C* primeste intotdeauna cel pufin un argument (numele programalui executabil) = Dack arge = 2 suntem in una din situaile: 4) Citirea se face din fier. In acest caz argumentul este de forma: “ENume Fisier", deci al doilea caracter al argumentului este b) Am primit ca argument un singur numvit + Dackarge > 2, se citesc argumentele liniei de comands gi se convertesc la tipul | {ntreg (folosind funcfia ato3). Pentru a serie un num ea sumd a 2 numere prime se cauti toate descompunerie distincte de forma nr = i+ (nr ~ i) $i se verified dact i, respectiv nr ~ i sunt nurere prime, TBP E Ee #include #include include define BOOL unsigned char facrine FALSE 0 fdefine TRUE 1 | 1/ determina daca numarul n este prim sau nu BOOL prim(int n) ( for (int is2;i return: ? ) J/ axge ~ numarul de argumente din linia de comanda 7J argu ~ vector de siruri de caractere ce contine argumentele int main(int arge,char **argv) ( FILE *£; char nume[100]; // Nunele fisierului de intrare int rer switch (argc) ( ‘cace 1: // linia de comanda nu contine argunente while (scanf ("8d", &nr) !=B0F) descompunere (nr) ; break; case 2: // linia de conanéa contine un singur argument 4€ (argv(1} [1]=='£") ( // mumerele sunt citite din fisier sacanf (argv(1},*-£%s", nue) ; Lf (1 (Eefopen(nume,*eb*)))_{ print£("Nu pot deschide fiserul %s\n*,nume) ; while (£read(&nr, sizeof (nr) ,1,£)>0) descompunere (nr) ; Eclose(t}: breal ) default: // mumerele sunt citite din linia de comanda for int ist;icargc;ies) ( zeturn 0; 187 Programare in C/C#++ Culegere de probleme Capitola 7. FISTERE. R7_9. Si se sorie un program care primeste date numere naturale gi giseste, pentru fiecare numar, numerele prime cele mai apropiate de acesta. Datele se citese de pe mediul de intrare si sunt scrise,intr-un figier binar ce ‘conte inregistari de forma: int numar; // Numirul itt int a; // Cel mai apropiat numa prim mai mie dee numairalctt int b; Cel mai apropiat numer prim mai mare decdt numialctt in cazul in care numa citit este prim, inregistrarea eorespunzatoare din fisier va avea nunar Rezolvar Tgp a EEC Vinelude #include #aefine BoOL unsigned char define FALSE 0 fdefine TRUE 1 struct INREG ( int numar; int a; int b; ) // determina daca nunarul n este prim sau nu BOOL prim(int n) ( for (int is2;icfloor(sqrt(n))+1;i+4) if (n Bi == 0) return FALSE; return TRUE; > /* Gaseste cele mai apropiate nunere prime si returneaza o + structura de tipul INREG ” struct INREG gaseste(int ar) ( ‘struct INREG inregistrare; int iy inregistrare.numarenr; if (priminr)) { // Verific daca numarul este prim inregistrare.asnr; inregistrare.b=nr; return inregistrare; 188, 77 beternin cel wal apropiat munar prin wal wic decat ar for ( deo) if (prim(iy) ( inregigtrare.a=i; breaks” ) J/ Determin cet mai apropiat mumar prim mai mare decat nr for (ienr+l;its) GE tprim(i) ¢ inregisteare.bei; break: A return inregistrare: ) void main(void) ¢ FILE tout; int nr; Struct INREG inregistrare; LE (1 (outsfopen(*OUTPUT. BIN", wo")))_{ printf (Nu pot crea fisierul de iesire\n*); ) while (scent ("ta", anr)!=B0R) ( Anregistrare=gaseate (nr) ; Ewrite (kinregistrare, sizeof (INREG) ,1, out) ; ) Eclose (out) ; R710. Se dun fisier binar rumere.bin care confine numere nanirale, St se seri un program cafe inlocueste numerele din acest filer cu risturnatele lor Exempla: Dac& fgieral conine mumercle: 102, 5, 0, 123, 100, a termina rea program figieral a avea urmatorul coninat: 201, 5,0, 321, 1 Rezolvare: Exist 2 variame pentru a modifica inregistririle dintr-un figier: 1) Cu figier temporar se ereeaza un nou fier pe baza fisirului dat (cu modificarile necesare) «se sterge figierul original (folosind funeyia remove) ‘se redenumeste fisierul temporar eu numele fisierului original rename) (folosind funetia Programarein C/C++. Culegere de_probleme ) Se deschide Fisicral cu "e+" (citirelseriere in mod binar) si se suprascria inregistraile care se dorese modificate, Problema este rezolvati folosind cea de-a doua variant. Fincluds // calculeaza xasturnatul unui numar Ant rasturnat(int ar) ( Ant rasturnat=0; while (nz) ( ragturnattsnr%10; rasturnat*=10; nr/=10; , return rasturnat/10; ) void main(void) ( FILE int ney i LE (1 (€=£open(*NUMBRE.BIN","x4b*)))_( printf (*Nu pot deschide fisierul \n"); return ; ) while (fread(anr, sizeof (int},1,£)>0) ( nr=vasturnat (nr)? // Ma pozitionez pe inregistrarea antericara {fi scriu noa valoare fseek(£, itsizoof (int) ,SEEK_SET) : fwrite(ane, sizeof (int) ,1,£)5 // Ma pozitiones pentru a citi o noua valoare Eseek(£,i*sizeof (int) ,SEEKSET) + 2 ? felose(£) : Ins // deschia fisierul penteu operatii READ/WRITE in mod binar R7_AL. Un figier confine articole cu structura: cod (gir de caractere), nume (sir weer Capitol 7. FISIERE de caracter) gi cant itate (el) Si se sere un program eare permite + consultare roduce ca argument al Tiniet de comanda, prin numele complet al operatici = Creare Nume_fisier — So erecazii figierul ume_fisier prin citiea de la tastatura a articolelor. Dupit fiecare linie introdusa se interogheaza daca se continua. -Consultare Nume_fisier - Confinutul figicrului Nume_fisier este Tistat pe ecran, edie 20 de linii, Pentru continuarea afigdrii se apasi ENTER. -Stergere Nume_fisier cod_articol — Este cAutat articolul in fisier i se ‘marcheazi pundndu-i codul x0 Rezolvare: Tike » C Winelude include include include define FALSE 0 define TRUE 1 struct ARTICOL { enar cod{10]; char nume [30]; float cantitate; // sxecuta functia de creare fisier void creare(char *fisier) ( FILE *£; struct ARTICOL ay 7/ Deschid fisierul pentru scriere in mod binar ie ‘open(fisier,*wb")) == NULL) printé (* Nu pot deschide fisierul. \n"); exit (1) 190 191 cs legere de probleme /facticolele citite unul cate unul si serise in fisier printf (* Introduceti codul, numele si cantitatea: *); scanf (8s $5 €£",4a.cod, aa-nume,&a.cantitate) ; Ewrite (a, sizeof (ARTICOL), 1, £); printf ("Doriti sa continuati ? (a/n)\n"); } while (getch()==*a"); felose(£) : y // Executa functia de consultare fisier void consultare(char *fisier) { FILE *£; struct ARTICOL a; int 7/ Deschid fisierul pentru eitire in mod binar if ((fsfopen(fisier,"rb*)) == NULL) ( printf (* wu pot deschide fisierul. \n"); exit (Qs ) while (fread (ga, sizeof {ARTICOL) ,1,£)>0) 11 Am grija sa mu afisez articolele care au fost sterse LE (stromp(a.cod, "x00c") 1=0) _[ printf(*8105 $308 $10.2£\n",a.cod,a.nume,a.cantitate) ; 7/ daca am afisat 20 de articole, ma oprese ei intreb if (i4+820=20) ( printf (*Doriti sa continuati ? (@/a)\n"); if {getch()=='n"} break: } ? fclose(f); ) // Executa functia de stergere void stergere(char *fisier,char *cod) { FILE *£; struct ARTICOL a; int gasit=FALSE; // Pisierul este deschis in pentru citixe/seriere in mod binar ‘open (fisier, *r+b") ; while (fread(éa, sizeof (ARTICOL) ,1, £)>0) if (stremp(a.cod,cod)==0) { // Marchez articolul ca fiind sters strepy (a.cod, "xxx*); 77 Wa poritionez cio // supraserie articolul faeek(£, ftell{f) -sizeof (ARTICOL) , SEE! fwrite (Sa, 912008 (ARTICOL) 1, £97 | gasic=TRve; neegisteare inainte pentru @ BE : ) | Af (Igasity printé (*Broare felose(t) , Articolul nu a fost gasit\n"); void main(int arge,char *argv) ( if (stremp(argv[1), *Creare")==0) exeare(arsv(2}} Af (stremp(argv{1], "Consultare") consultare(argv(21); if (stremp(argv[1], *Stergere") ==0) stergere(argv[2] ,argv(3]); Fisiere text - Probleme rezolvate RT_A2. Dintr-un figier text text . ext se separd toate cuvintele, plasandu-le -un figier binar cuv.dat, avind ca artiole giuri de’ 10 earactere (cuvintele mai scurte se comploteazi cu spati, iar cele mai lungi se frunehiaza la primele 10 caracters) Hinciude Hinelude Hdofine MAX 1000 // Numarul maxim de caractere de pe o linie void main(voia) ¢ BILE ¥in, Yout; “char Linde(ax) , cuv (121, *p: . char desp{]=" ;,.\n\t\0"; // despartitorii de cuvinte int 1; // lungimea cuvantului ul] Deschid cele 2 fisiere in=fopen("TExT. TxD", "rt") ; -out=fopen(*CUV.DAS", "ub") + if (tin || tout) 193 Prograiire in C/CH+. Culegere de probleme [Brinti"Wa pot Geschide anal din fisierel return } while (1feoftin)) // Citese fisierul de intrare linie cu linie folosind fgets Egets(1inie, VAX, in); pelinie; do ( 1) Pormez cuvintele 150; for (strech (desp, *P) AE (1<10) cuv[1++)=*p: 1/ Completes cu spatii pana la 10 caractere menget (cuvt,* "10-1 Y/ Pun torminatorul de sir de caractere cuv(10)=0; verific daca este cuvamt format numai din caractere NULL; p++) ue Yi despartitoare (acest lucru se intampla daca exista 2 J) caactere despartitoare consecutive) apoi seriu in // fisierul binar LE (strehr (esp, cuv(01) fwrite(cuv,11, 1, out! pees ) while (strlen (1inie) »p-Linie) ; ) Eclose lout); gclose (in) NULL) Capitolul 7. FISIERE Rewolvare: Vom scrie o funcfic (calc_pozitii_linii () ) care, pentru fisierul dat ca parametru, intoarce un vector in care se refin poziile de inocput in cadrul fjerului ale tututor linilor acestuia. Deoarece fisierul poate fi foarte mic sau foarte rare, memeria pentru vector se alocd dinamic, incremental, Pentru a afiga linile in ‘dine inverst, ne folosim de pozitile Lor de inceput, memorate in vector. [Numarul de lini este determinat tot in cadrul funcfiei de mai sus (este refit ca arametru transmis prin refering) Zorrno.h> finclude Hinelude finelude Hinelude Hinelude finelude J/ Amexement pentru alecarea menoriei 77 Yungimea maxina a unei Lindi + 1 Féefine INC 10 fefine Wax 81 J* afigazea unui mesaj de eroare si iesirea din program: */ void eroare(char *s) ( perror(s) ; exit(-L): ’ J* calcularea pozitiilor de inceput ale liniilor din fisierul £: +n - numarul de linii, care este de asenanea calculate */ Ant® cale pozitii linii(riE ¥£, inte n) ( R7_AB. Se da un lier text. a). Si se determine mumérul de lini din fier. inversi, ° dd lungimea ei (un octet). 4) initial, $8 se afigeze Ia imprimanta linile din fisie dd fisicrul de intrexi b). SA se creeze wn nou figier cu linile din primul, aparénd in ordine Pe baza fisictului iniial, s8 se erceze un fisier de caractere, in care mi ‘mai apar caracterele de sfargit de fini, iar ficearelinie este procedatd Se da un fisiet de introgi reprezentind numese de Tinii din figerl ‘in ordinea precizath int i Ant *vpoz; // vector in care se retin pozitiile de inceput char s{81); // linia curenta vpoz = (ink*) malloc(INC * sizeof (int)) Eeeek(:, 0, SEEK_SET); i=0; vpoz{0) = 0; while [fgets(s, LUAK, £)) { LE (i> 0 && 4 8 INC == 0) 7* menoria se realoca incremental: */ realloc(vpoz, (isINC) * sizeof (int)); vpozi++i] = ftell(f); ) return vpoz; 195 Programare in CiC++. Culegere de probleme Capitola 7, FISTERE aesert(i > ORL wT // in fisier, numerele Liniilor incep de 1a 1 => folosim Wf vpozli = 1 foeck(£, vpozi! - 1], SEEK_SET); fgets(s, UMAX, £) fprint£(stdprn, "ts", 5! > void waintwoiay ( FILE *f, fn, *fresi, *€res2; : char nume(20]; // nume pentru fisiere char s{LMAM]; // linia curenta din fisier int n; // nunarul de Linii din fisierul de intrare int *vpoz; // vectorul pozitiilor de inceput ale liniilor int is char lung; // lungimea unei Lintt felosotin); printf (*Numele fisierului de intrare; *); fclose(£); scané("$5", nume) ; getch(}: £ = fopen(nune, re"); if (£ == NULL) eroare(*fopen"); fresi = fopen(*rezi.txt", "wt"); // fisierul cu Minii in ordine inversa if Ufresi == NULL) eroare(*fopen*}; fres2 = fopen("rez2.txt*, ‘we; // fisierul de caractere if (fres? == NULL) eroare(*fopen"); 7* (a) NOWARUL DE LINIT DIN PISIER: */ vpoz = cale_poritii_linii(£, n) + printe(*Fisierul are td linil \a‘, nl; 7* (b) FISTERUL CU LINII IN ORDINE INVERSA: */ for (i =n ~ 1; i >= 0; i--) ( tseek(£, vpoz{i}, SEEKSET); fgets(s, LMAX, £); fputs(s, fresi): /* daca dupa ultima linie mu exista '\n', se adauga in fisierul rezultat: “ if (i =n - 1 G& s[strlen(s) - 1) t= '\n') fputs(*\n", fresi); R7_14, Fisierul text prog. reprezintd un program sursi C, $8 se copieze acest fisier Ia iesitea standard suprimand toate comentarile. Rezolvare: Vom citi fiierul de intrare caracter cu caracter $i, cind intalnim un posibil Inceput de cornentariu (caracterul ‘1’, analizim gi caracterul urmator: + Daca acesta este, zveam intr-adevar un ineeput de comentariu si nu vom mai copia cele dou’ caractere la iesire. + Altfel, copiem Ia iesire “al si ‘punem inapoi’ in fluxul de intrare cel de-al doilea caracter citt, pentru a se relua analiza incepind de ta el (acest Iueru este necesar deoarece putem avea secventi de genul V/4", in care caracterul de dupa primul “7 chiar este inzeput de comentariu si trebuie Iuat in considerare; “punerea sapoi” se realizeazi cu functia putback ()) Sflrgitul de comentariu se detectexza Intr-un mod asemanator celui de mai sus, ) felose(frest) ; rewind (£) ; (7 (2) FISTERUL DE CARACTERE: */ while (fgets(s, LMAX, £)) ( lung = strlen(s) - 1; // ignoram caracterul '\n' fputc(lung + '0", fres2); for (i = 0; i < strlen(s) - fpute(s{il, fres2); Vinclude Hinclude Hinclude | | void main(void) ( | fstream £; char nume(20}; j/ numele fisierului char cl, c2; // caracterele care se citesc din fisier cout << *Numele fisierului : f.open(nume, ios: in); in ) fclose(fres2) ; (+ (a) GISTAREA LA IMPRIMANTA: */ Z exit(-1); | fn = fopen(nume, *rt*); Af (fn == NULL) eroare(*fopen'); while (fscanf(fn, "8d ‘,@i) != EOF) ( a while (1) t 196 — Capitola 7. FISIERE, 77 citia Gin Cister pane Tntalnin 777 sau pana se Fermin ae ——— — fisierul pe / me a TAsepp i ae while (£.get (el)? Vinclude if (el fe */') cout << ety finelude isa break Hinclude if (£.e0f{)) break; // fisierul s-a terminat #include y* am intalnit '/’, analizam caracterul urmator: */ finclude figet (e2)s Saefine MAK 61 // lunginea maxima a unel init + 1 if tea se °*) ( // anceput de conentarin while (1) ( a /* afisarea unui mesaj de eroare si iesirea din program: */ waite (f.get(cl)) yoid ervare(char “a) { Sf (cls '*) break; //am ajuns 1a un posibil error(s); terminator de conontari exit: if (£.e0f()) break; ) 7 am intainit ‘*", analizam caracterel wmator: */ f.get(e2); void main(vota) ( LEgea ceo 77) 11 coxmmzaniel ana terainat. TILE 't, sfr0o; // fisierele de intrare i de iesire break; FItE ‘fins; // fisierui de inserat else // nu fusese inceput de comentaria char mune (20); _// nune pentru Lisiere £,putback(c2); ” char s{LMAX], s2[LMAX]; // liniile curente din fisiere ) printf(wunele fisierului de intrare: “); , Scant i"%e", mune)? else { // nu era inceput de comentariu, afisam ci £ = fopen(nume, "rt") cout << el: ip (f 22 NOLL) eroare(*fopen") | £.putback (¢2) ; printf(*Mumele fisierului de iesire: * Joa scanf\"%s*, nume) ; ae fres fopen(nume, "wt") 7 f.close(); LE (tres = MULL) eroare(“fopen") ; 7+ parcurgem fisierul de intrare linie cu linie: */ hile (Egete(s, DHA, £1) [ GEO] == '#" Ge 8{2) == °R) { R715, Un fsior tox, ew mumeleintrodus dela astaturd are urmtonrea struct strepy(mume, 0°¢ 3); // mime fisier incope de ta s(3] F funsfatrien(aune) = 1) = 0;-// "stergen" caracteral "\n" iinii ¢/ de la sfarsit: & nume_figier fins = fopen(nune, "xt"; hints Le (eine oe tn) exoaret*fopen") 7* inseram fisiersls */ Sa se creeze un now figcr, din fgicrl dat, eae in locus specificate va wale (foota(od, aK, final) avea inseratfigienul nuit, 7 Gn else // copien linia in fisierul de iesire Eputs(s, fres); Rezolvare: Parcurgem fisirul de intrare linie cu linie si, end tntilnim o linie care J | incope cu “#2”, determinim numele figierului care trebuic inserat (presupunem cf || Ectose(£); ‘ncgsta invepe exact in a patra pozife alinici; dacd nu am fi ficut accasta presupunere, | | fclose(£res) : ami putut folosi escan£” sau strtok - siatunci numele ar fi putut avca oriedte | | felose(fins) + spafiiinainte). Inserateafigicrului se face tot “Tinie cu linic” ) 198 R7_16. Un fisicr text confine blocuri delimitate de caracterele #B si #K, Sa se creeze din aceste blocurifisiere cu acelasi nume cu figierul initial, avind cextensiile 001, 002, Rezolvare: Detvetarea blocurilor se face ascmindtor cu cea a comentariilor din programele sursi C (vezi problema de mai sus). Pentru a genera numele fisierclor de iesire proceddim astfel: copiem in siral pe care trebuie sa il cream caracterele din numele figierului de intrare, pad Ia *", fick cesta (deoarece numele fisierului de intrare poate s% nu aib extensie) ; apoi adaugim tun *." si extensia corespunzatoare (vom folosi un contor pentru a refine numérel fisierelor generate, Titepy z EST Hnelude #include Hnelude Hinclude include #include /* afisarea unui mesaj de eroare si iesirea din program: */ void eroare(char *s) ( error(s); exit (i): ) /y generarea nunelui pentru al ‘nr’ - lea fisier de iesire: “ nvechi = numele fisierului de intrare " char* creeaza_nume_nou(char* nvechi, int nr) ( char extensie(3] char *ninow; //'numele pe care {2 vom genera int ALnow = (char*) malloc((strien(n_vechi} + 4) * sizeof (char}}; 7* cream extensia: */ sprintf (extensie, *%034", nr); J* copiem in nume nou inceputul numelui vechi (fara extensie) ” for (i = 0; i < strlen(nvechi) && nvechi[i] I= 1.1; i++) ‘nnou[i] = nvechi li]; nnouli] = 1.17 nonou(+#i] ='0; // trebuie sa adaugan terminatorul de sir strcat(n_nou, extensie) ; return nanou; 200 Capitol 7. FISIERE, [rola mata eT) Estream f, fr; // fisierele de intrare si de iesire char nune(20]: // numele fisierului de intrare char *nume_res: j/ nume pentru fisierele de iesire int ent = 0; // contor care nunara fisierele de iesize char cl, ¢2; // caracterole care se citesc din fisier cout << tNunele fisierului de intrare:": cin >> numer f.open(nume, ios: :in) ; LE (1£) eroare(*open") ; while (1) { 7* citim ain fisierul: */ while (f.get(c")) | Af (el == '#)) break; if (£.cof()) break; // fisierul s-a terminat /* am intalnit '#", analizam caracterul urmator: */ E.get(e2): if (c2 == Bt) ( // inceput de bloc /* initializam un nou fisier de iesire: */ entry fr-open(nune_res, ios if (1fr) eroare(*open") ; 7* copiem caracterele ain blec in fisierul de iesire: */ waile (1) while (£.got (c1}) Ae (et 15 8) fr.put (el) ; elge break; //un posibil terminator de bloc Lf (E.eof()) break; Y* am intainit ‘#", analizam caracterul urmator: */ Eget(c2); if (2 break; else { Ex.put (el) ; £.putback(c2) ; } } fr.close(): sier pana intalnim "#* sau pana se termina creeaza_nume_nou(nume, cnt); out) “K) // blocul s-a terminat ) else // nu ere inceput de blee E.putback(e2): ) £.closel): ) 201 Programarein C/C++. Culegere de probleme Capitolul 7. FISIERE. R7_17. Stergeti woate apari le unui cuvant dintr-un figier text. Cuvantul care se sterge, ca $i numele fisierului se citesc de la tastatura. Programul va erea ‘un now figier, care in final va primi numele fisierului initial, iar cesta va fi sters, Rezolvare: Vor citi fisierul de intrare linie cu linie. Pentru a separa cuvintele dint-0 linie putem folosi functii ca strtok() sau sscanf() , dar acestea elimina delimitatori (adicd spatiile albe, tab-urile etc.) gi noi dorim si le copiem si pe acestea in fisierul de iegire. Deci aplicdm alti metoda: cautam apariti ale sirului de sters inf tia curenti si apoi verifieim daca sunt ciwinte separate (delimitate de spati) sau nu Exemplu: dacd ab este cuvantul de sters, nu trebuie sil stergem din fini: ‘abcd xyz (nu este cuviint separat) Verificare, daca un sir este cuvant sau nu, este cut fn funefia e_cuvént ()*, | care intoaree un rezultat pozitiv dacis ~ sirul est a ineeputul niet si este urmat de spaiu, sau ~ sirul este la sfarsitul nied si este precedat de spatiu, sa 3 = sicul este in interiorl Finiei gi inainte si dupa el sunt spa (Observatie: verfiearea, dacd un caracter este spatiu, se face eu funcfia Ssspace(), pentru generalitate). Dupa ce am generat figierul de iesie, 1 stergem pe cel initials il redemuanim pe col now (Gindu-i numele fiserului initia) Titepp. | ‘Winclude Hinclude Hinelude finclude Hinclude #inelude faoring tHAK 81 // lungimea maxima a unei Linil + 1 Hdefine nune_temp ‘res.tmp* // nunele temporar al fisieruiui de iesize /* afisarea unui mesaj de eroare si iesirea din program: void eroare(char *5) ( perror(s! exit(-L); y ’ " | y+ intoarce 1 daca sirul "cuv* e cuvant separat si 0 altfel: + linie = linia din care face parte cuvantul + poz = pointer catre inceputul cuvantului in linie 202 Ant e_cuvant (char *Linie, char *poz, char *cuy) ( /* daca sirul este la inceput de linie: */ if (por == linie) ( Af (strlen(Linie) == strlen(cuv)) /* sir singur pe linie */ rezurn 1; if (isspace(* (poz + strlen(cuv)))) // dupa six urmeaza un 17 spatiu recurn 1; return 0; /* dupa sir nu urmeaza spatiu */ ) /* daca sirul este la sfarsit de linie: LE (por + strlen(cuv) == 0) ( Lf (isspace(*(poz - 1))) /* inainte de cuvant este spatiu */ return i; return 0; ) /* sirel nu este nici 1a inceput, nici 1a sfarsit de linie: */ Af (isspace(*(poz - 1)) && isspace(* (poz + strien(cuv)}}) return 1 return 0; ” ) void main(void) ( FILE *Hin, *£out; // fisierele de intrare si de iesire char numefis{20]; // nume pentru fisiere char cuv[20]; // cuvantul de sters char *linie; // linia curenta din fisier char tres; // Linia care ee eopiaza in fisierul de iosire char * poz;// pointer la inceputul cuvantului in linia cuenta char *linie2; // pointer pentru deplasarea in cadrul liniei printf!*Numele fisierului de intrare: "); scanf("ts", nunefis); fin = fopen(nunefis, "rt* Af (fin == NULL) eroare("fopen"); printf {*Cuvantul de sters: "); scanf(*ts", cuv); fopen{nume_temp, Fout sweet 203 Progeamare in C/C++, Culegere de_prubleme NULL) eroare("fopen") : new char [LMAX] new char [LMAX! rez = new char (LMAX]; poz = new char [LMAX]; 71 parcurgem fisierul de intrare linie cu linie: while (fgets(Linie, LMAX, fin)) ( 7/ initializam linia care se va copia in fisierul de iesire: rez[0] = 0 linie2 = linie; 77 cautam cuvantul while ({poz = stretr(Linie?, cuv)) Lf (@_cuvant (linie, poz, cuv)) // copiem partea din line din 40 sters: strncat (rez, else // na @ cuvant separat, nu se sterge strncat (rez, linie2, (poz - 1inie2) // modificam pozitia curenta Linie2 = poz + strlen(euv) if (fout Linie Linie2 NULL) ( tea cuvantului de Linie2, (poz ~ Linie2)); + strlen(cuy)); ) 7/ na am mai gasit cuvantul streat (rez, linie2); Eputs (rez, fout): ) Eclose (Ein) ; folose(Fout) : 11 stergen fisierul de intrare: LE (remove (numefis) != 0) ‘exoare ("remove"): J/ redenunim Eisierut de ies if (rename (nume_temp, copiem restul Linie (ca munele celui de intrare) 0) print® ("Fisierul a fost modificat"); else eroare("xename") ; getch(); delete[] linie delete!] linie2; deletet] rez: deletel} poz: 208 SS se serie sun program, care, folosind fisierul creat in problema 1 rezolvata, Pa. calculeaza si afigeaza: © Suma maxima depusd, impreund cu data gi numcle depundtorului © Numérul depunerilor din ficeare zi si suma total depusd in ficcare zi findnd cont c& tranzacjile dintr-o zi sunt contigue in figir. P7_2. Sa sv serie un program, care, folosind fisierul creat in problema | rezolvati, actualizeazA aces: fisicr prin adsugarea dabanzii In data curent, Se precizeazit urmiitoarele date: * Data curentila care se calculeazit dobinda (an, Lund, 24) * Dob&nda anal Se va folosi o finctic caro determin numarul de zife intre data depunerit $1 data curent’, pentru a calcula dobiinda cuvenita PIA. Se consider’ dat fisierul de tntregi numere.dat . Sa se crecze fisierul prime.dat , confindnd numai acele elemente din figierul inigial care sunt snumere prime, PIA, Se considers fisierul abonaji dat cu articole structuri avand campurile © Nume —un gir de 20 de caractere * Adres& —un sir de 30 de caracte © Data_expizdrii ~o structuré cu cdmpurile an, lund, 24. Consideriim ci data curentd se introduce de Ia tastaturd SA se actualizeze figierul de abonali, stergind pe accia al caror abonament a cexpirat la data curenti. Actualizarea se face eredind un nou fisier in care se tree ‘numai abonaii al ciror abonament nua expirat gi care fa sfirsit va primi numele figierului niga Se va defini si folosi o funcfic care compari dou’ date (d gid) si Intoarce I ach aj este Inainiea Iwi d, $1 0 tn ca contrat. PI_S. Un fisier binar confine valori intregi ordonate crescator. Sa se ereeze un now fisier cu valorile ce mai sus ordonate strict crescator. P76. © baz de date este compust din na articole, iar un artico! este format din ne ‘dmpuri, De exenp TES i Popescu fon ry [oneseu Tudor ca 205 egere de probleme ragramare in CIC, {in acest exemplu un articol are $ cimpuri. Deserierea efimpurilor (eapul dy tabel) se face prin: ‘+ num: de cimpuri din articol (nc —intreg) ‘+ nume edmp (11 caractere) + tip cimp (I earacter: C = gir de earactere, sau N + Jungime cimp (un intreg) ultimele 3 deserieri apar pentru fiocare dintre cele ne edmput Desericrea cimpurilor ocup. prima porjiune din fisice. fn exemplul da, descricrea cdmpurilor est: i SNume €20Grupa ¢ SNotal N 2Nota2 N 2Nota3 N 2 wumneric) Urmeaz’ apoi articolele dn figier: Popescu Ton 313cA 6 8 4 Fisierul bazd de date are numele dat ca parametra al comenzii. Tot ca parametti se mai dau doua siruri de caractere, reprezentind un nurve de cdg, sio valoare de camp (Deexemplu: Grupa i 313CR’). Se cere: + si sc determine lungimea unui articol si numarul de articole + sf se afigoze toate articolele avind in numele de cdmp specificat valoarea, specifieatd (in exemplul nostru, vor fi afigati toji studenpii din grupa 3I3CA). Indicasie: Din fisirul binar bazi de date se citeste mai inti mumiral de ‘cimpuri di articol, gi apoi se citesedeseriritecimpurilor. Se aduna lungimile eémpurilor, objinandu-se lngimea articolulu, Nurul de-artizole se objinc impiryind spayiul cuprins dupa. descrietea ime (real) = profesie (20 caractere) = venit (rel) = ume (30 caractere) ee) Solicitantt de servicii matrimoniale completcaza un formular conjinand: = numele solictantului precum gi primele 5 cmpuri din cele de mai sus. Criterile de select pentru aceste efmputi sunt: ==, <=, >=, ==, >= Serieli un program, caro, folosind fisirele binare "agentie" si “crite”, selocteaza dintre candidai care satisfac aceste erie pe col cu venitul cel mai mare gi creeazi un fier text cu rispunsuri de forma: SNune-solicitant> perechea —potrivita este CNane_eandidat> sau perechea potrivita nu exista inc. i, avand articole ‘num depunator (30 caractere) data depanerii (3 intregi) ‘suma depus Scriefi un program cate actualizcaza acest fgier, addugind Ia suma depusd dobanda la data curenti introdusi de la tastaturd, Dobanda anuald este 45%, Prigramare in C/C++. Culegere de probleme P7_A1. Mai multi client tanseaza unei firme mai multe comenzi de forma: PIA = ume client 30 caractere) + ume produs (20 caractere) = cantitate comandati (real) Un cient poate spare de mai multe ori in comenzi diferite, eventual ca produse diterite. Firma face 0 centralizare a comenzilor pe clienfi astfel incit si existe 0 singur&' comand& valoricd pentru un cient de forma: + mume client (30 caractere) + valoare total produse comandate(real) fin acest scop firma isi consults catalogul de produse (un fisier text) cae ‘contne lini cu numele produslui si preful unitar, separate prin spa libere Scrieli un program, care, folosind fsierul binar de comeni gi figicrul txt catalog de produse, ereeaza figierul binar de comenzi valorice centralizate pe client (asf c& un elient spare int-o singurdi comand). Comenzile de produse inexistente in catalog sunt listate la iesirea standard de croare, Numele celor 3 fiscre se preiau ea parametti ai comenzii Indicasie: © comanda este cdutats dup’ nume produs in catalog; dact ese ‘gisitd se calculeaza valoarea si este cdmtatd dupa client in figierul de comenc centralizate - daci este gist, se modifica valoarea, in eaz contrar se crectal un now artcol care se adaug la sig. Mai multi clieni lanseaza unei firme mai multe comenzi de forma: = nuume client (30 earactere) = nlume prods (20 earactere) > cantitate comandat (real) ‘Un acelasi produ poate apare de mai multe ori in comenzile mai multor cen. Firma igi centralizeaza comenzile pe produse, astfel incat si existe o singurd comand valorica la un prodius (cerut de mai multi elie. Jn acest scop firma isi consulta catalogul de produse (un fisier text) care confine lini cu nuntele produsutui siprejul unitar, separate prin spagi libere Scrieli un program, care, folosind fisierul binar de comenzi si figierul tet catalog de produse, crecazi fisieral binar de comenzi valorice centralizate pe produse, continand perechi: ~ niume produs (20 earactere) = valoare total comandata (real) Comenzile de produse inexistente in catalog sunt listate la iesirea standard de eroare, "Numele color 3 fisiere se preiau ea parametri ai comenzii 208 Capitol 7. FISIERE, PTA3, Scrii un program cate insereaz int-am fgier text, ineepind eu o linie en snumar dat, lini din alt fisier. ‘Namele fiieruli in care se face inserarea, numarulfinici din acest Fiser unde fnoepe inserarea, numele fiserulutinserat, mmrul Tinie de unde se insereaza si numérul de lini’ inserate se preiau ca parametri ai comenzi, Fisicrul ‘modificat primeste in final mumetefiscruti initial Exemplu: inser fl.txt 10 £2.txt 50 25 Fisiere text - Probleme propuse a tere P7_I4, Seriefi o fimefie care afigeaz’ cuvintele palindroame dintr-un sir de * dat ca parametn, Cuvintele din sir sunt separate prin: spativ, punet, virgula, dow puncte gi punct-virgula, Seriefio funcfie main () care citeste lini din fisirul text sursa.txt $i afigcazA numéral liniei si euvintele palindroame din linia respectiv P7.AS. Un fisir text confine um bloe delimitat de sirurile de earactere KB. gi WKK . Si se crocae din acest bloc un nou fisier avand acclasi nume si extensia . bLk, Numele fisierului sursa este citit de a tastatura P716, Un figior text eonjine un bloc delimitat de gisurile #B. si #K . SA se creeze un nou figier din fisiorul dat sterg’ind acest bloc. Nou! figier are acclasi name cu figieral iniial dar nu va avea nici o extensic. PTI. Un fisicr text confine blocuri delimitate de caractercle #B si #K, formate dint-un rmumér introg de linli, S& se afigeze din acest fisir, la imprimants, mumai Dlocurile mareate. 7.18. Un fsier text confine blocuri delimitate de caractercle #B si #K, formate dintr-un rnomar intreg de lini, $8 se ereeze un nou fisir, prin concatenarea blocusilor din figierul dat P7_19. Pentru objinerca unci gradafii, persoand trebuie s& susjiné cel pugin np probe la care si obfind o medie de cel puyin_ med. © inie dintr-un figier text de intrare confine numele candidatolui si calificativele objinute la probele sustinute. Numele este separat de note prin spat libere, iarnotele sunt separate inte ele prin virgule $i sp 200 Proyeamare in C/C++, Culegere de_prubleme Creat un fsierbinar eu persoancle care au cbfinut gradafia, Acssta va avea articole cu eimpurile: nume (sir de 30 de caractere), nunéx_de_exanene prezentate (intr) si media objinat (real. Numele celor doud fisiere, numarul minim de examene gi media de promovare sunt date ea parametr ai comenzi 7.20, Porind de Ia un figier text, s se ereeze un at figier eu acelagi mume dar cu extensia pal, format din finile din fisierul inijial care reprezints palindroame, Numele fisierului inigial este dat ca parametru al comenzi [Exemplu de line palindrom: “A man, a plan, a canal - Panama! P7_21. Un fisier text, reprezenténd un program sursi, confine comentarii de tip C1/*. «| .*/),ineare peo lini se pot afla mai multe comentari, dar sin eomentariu se poate Fntnde pe ma malt ini Serie{i un program care modificd acest text, astfel inedt comentariile si fie in stilul C™, adic& //... un comentariu terminandu-se cu un sfiirsit de linic, [Numele fiseruhui de intrare este dat ca paramotra al comenai Figicrul de iesre va avea acclagi ume gi cxtensia .cpp, P7_22. Scriefi un program care extrage dintr-un fisier text toate cuvintele reprezentind constante intregi zecimale si le plaseaza int-un figier binar de intreg lung Separatoriiintre cuvinte pot fi toate spafile albe, virguld si punct virguld Numele fisicrului text este proluat din linia de comanda. Fisicral binar are acolagi nume si extensia .BIN, P7_23Scricti_un_ program care storge dintrun fier text, spocifieata un ume de lint gi erecaza un now figier Numuele fisicrulu, linia si numarul de linii sunt date ca parametri ai comenai Fisierul modifteat va avea acclasi numne cu figicrulinifial Fxemplu: starge date.txt 20 5 reepind cu © linie Scrie{i wn progiam eave ei toate linile din fisier de acceasi tungime n. Numele figierulut de intrare si valoarea tui m se dau ea parametri ai comenzi Fisionul de iegire are acclasi nume, dar extensia . out: Indicatie: Linia setist in fisicral de ire se formeaza concatendnd la restul linici precedente linia curentd. in momentul in care linia do icsire depasoste nn caractere se seriu cite n caractere din ca in fisierul de icsir, Caraeterele rimase tree in linia precedents, feat gi creeaed un uuu figier, Ridin 210 nists. rrgr P7_2S. Un fisier text confine linii eu urmatoarea structurd: un nume (de student urmat de mai multe valori intregi, separate intre ele prin spafit libere, mumere reprezentind notele obfinute de student la examencle la care s-a prezentat. > Stind cd in total s-au susfinut n examene, s2 se cteeze un nou fisier text, in Care fiecare linie confine mumele studentului, media notelor In. examencle susfinute gi numarul de examene rimase a i susfinute € ‘Namelefigerui de intrare gi numérul total de examene (n) se preiau di linia decomanda. P726, Scrieli un program caro inlocuieste intr-un figier text toate aparifile unui ccuvnt prin alt cuvint. Numele fisierului gi cele dou cuvinte sunt preluate ca ppacametri ai line’ de comanda. Se presupune cd tabloul in care se memoreaz’ ina este suficlent de mare pentru a confine linia modificata, fn final, fisieral modificat va avea acelagi nume cu fisier inifia Programarein C/Css. Culegere de probleme Capitolul 8 redefinirea operatorilor += Capitol, CLAS! w=, /= pentru adunarea, seaderea, imulfirea si impirfirea numirului rafional en un alt numar rajional dat ca Clase Sea eee ne — de In intrarea standart Se vor asigura funesii nemembeu pentru ~ testul de egalitate a doud numere rajionale (redefinirea ops Breviar Declararea unei clase: + redefiniren operaterilor +, A fipaccest to ‘argumente numere rajionale Elpvacces Geciarare date nenbri; « redefnitea operatorl de arbuire prototipuri funeyii membrd; ka_parametrs); friend tip nume_functie_nemembru (1 } Definirea functilor clasei gi a functilor nemembri (prieteni): Hnclude #inelude #nclude finclude tip nume_clasa:: nume_functie_menbru(lista_parametri) { corp_functie; ) tip nume_fui ie_nemenbru(Lista_parametri) ( conp-funceie; class Rational ( int ns, nj; // numarator si numitor public: int cmdc(int a, int b); Rational(int nic0, int n2e1)( ) Declararea unei clase derivate: class nume_élasa_derivata : tip_acces nume_clasa_parinte{ Geclarare date si funetii menbri; } Rational (Rationale x) { sus () Probleme rezolvate ~ int sus() const { return ns; } int Joe) const ( return ag7 void setous(int =) (ne = x7) void setdostint y) (nd © ¥2 R81. Proicctaji si implementayi clasa Rational care s& permit lucrul cu numere ~ serierea unui numer rational Ia iesirea standard (redefinirea operatorului <<) *, / pentru a permite operatii cu dow tester fracfiirafionale si calculeazzt suma lor. rationale, | Rationale operator+s(const Rationale 71 Construciorul clei va aven dow arguments: nunaritorul, respeciv | | Ratdonale operators (const Rationale =) rnunitorul numrulut rational (constuctorul poate avea gi un singur argument, Rationale operator*=(conat Rationale r)7 caz in care al doilea se iv implicit 1,sau niei un argument, caz in care se ia Rationale operator/=(const Rationale 1)7 valoril implicit si 1) friend iatreana operator>>(Istreank is, Rationalé 1); Se va asigura un constructor de copier. Se vor prevedea functii membri pentr = accesul la numaratorul, respectiv numitorul numstruli rational 212 ons friend ostream oporator<<(ostream& os, const Rationalé r); friend int operator==(const Rational& rl, const Rationale 52); Programare in C/C++. Culegere de probleme felend Rational operators (const Rationale ri, | const Rationale £2); friend Rational operator-(const Rationalé ri, const Rationale r2); friend Rational operator* (const Rationale rl, const Rationale friend Rational operator/(const Rationalé ri, const Rationale r2); friend void simplifica(nationale r); Rational& Rational: roperator+s(conat Rationalé r) ( int t = ns * r.jos() + aj * resus(); nj = nj * r.Jos(): Rational& Rational: :operator-=(const Rational r) ( int t= ns * r.jos() - nj * r.sus(); nj = nj * egos: Rational& Rational: :operator/=(const Rational& r) ( ns t= r.jos(); nj t= .sus(); return ‘this; ) Ant RatSonal: mmdc(int a, int b){ } while (e) ; 214 Capitola 8. CLASE, Astream: operator>>(istreanz is, Rationalé r)( int x, yi is >> x >> yr r.setsus (x); risetjos(y); return is; ostreans operator<<(ostreamt of, const Rationale r)( os Rational r(rl); ete =r return ry ds Rational r(ri); rf return r; void sinplifica(Rationale r)( int s = r.sus(); 215 Rationa? operator+ (const Rationale ri, const Rationals 12)( Rational operator-(const Rationalé ri, const Rationalé +2)( Rational operator* (const Rationalé ri, const Rationalé r2){ Rational operator/(const Rational& rl, const Rationalé 12){ Progra umaretn C/C#+. Culegere de peabl i ) R82. Tat J int ¢ cout << suma << endl; geten(); sos reemmde(s, 3); fee Tsetios (3); void main (void) ( elrser(); Rational suma, ¢7 cout << "Nunar de termeni=" cin >> cout << "Introduceti fractiile, cate una pe linie\n*; for (int i= 0; i > ty simplifica(t) simplifica(suma) : Proiecat implementa clasa Comp!.ex care st permit Iuerul cu numere complexe Constructorul clasei va avea ca argumente partea reali, respectiv imaginari a” numaruli complex (in mod implicit aceste vari seit 0). Se va asigura un constructor de copiere Se vor prevedea funcii mombri pentru + avcesul la parte reali, respectiv imaginari a numrului complex + redefinirea operatorilor +=, ==, *=, /= pentru adunarea, seiderea, inmutyrea 51 imparjtea nurnarutui complex ew un alt numa complex dat ca argument = modal nuretruui complex = argumentul numarului complex Se va redefini operatorul >> ca funeie preten pentru citirea unui nut complex de la intrarea standard Se vor asigurafunctiinomembns pentr + testul de egalitate a doua mumere complexe (redefinirea operator ~_scrieea uns numa complex la esrea standard (edefnirea opertoruti <<) + redefinirea operstorior +, ~,*,/- pentru a permite operaii cu douk argumente numere complexe = redefinirea operatorului de atribuire 216 Capitol 8. CLASE, Rezolvare: Stepp [#inciude Hinclude Hinclude finclude >(istreamt is, Cplxé 2); Jioparatori binari friend int operstor=s(const Cplxk s, const Cplx& friend int operstort=(const Cplxk 8, const Cplxt friend Cpix operator+ (const Cplxk 3, const Cplxe Eriend Cplx operator-(const Cplxk s, const Cplx Exiend Cplx operator* (const Cplxs a, const Cplxe Exiend Cplx operator/(const Cplxk #, const Cplxt /foperatori unari Exiena cplx operator- (const Cplk 2); : | Eeiend cplx operator! (const Cplxe z); //conjugat friend Cplx operator++(Cplxk 2); //prefixe friend Cplx operator++(Cplak z,int); //postfix " Jf implomentare clasa = _ friend ostreank operator<<(ostreamé is, const Cpl 2)7 a: a; as as a: ar 207 Progeamare in C1Cr+. Culegere de probleme Capitol 8. CLASE, Gpinii@pin(Goubie x, double IT ims y: cpix::Cpix(const Cplak 2) ( re = z.real( im = z.imag( perator=(const Cplxe 2) ( this] ( zereal(); zeimag 0) 7 return *this: > cplxe Cpix:roperator+=(const Cplxt #) ( ro += z.real() im += zeimag(); return “this: ) ‘cplae Cplx: roperator-a(const Cpl =) ( re -= z.real(I; im -= z.imag() return “this: cplxé Cpls: toperator*=(const Cplxé 2) re = re * z.real() - im * z.imagi); im = re * 2 imag() + im * z.real(); goturn *ehis: ja cplxk pix: toperator/=(const Cplxé 2)¢ double t=z.real()*z-real()+z.imag()*z.imag(); re> (co * gereal() + im* z.imag()) / ty im = (im * gizeal() - re * 2.imag()) / t return *this; ) double Cplx+:mod(const Cplxé z) ( double x = z.real(); double y = z.imagQ); return sqrtixtx + y * y)i > 218 double y = 2.imag(); return atan2 (x, y ) istream: operator>>(istreans is, Cplxt 2) ( double x, ¥: ig o> x >> yr z.setreal (x); z.setimag(y): return is: ) ostreant operator<<(ostream& os, const Cplxé =)( os << "(" << z.zeal() << ")" << Z-imag() << 1)" << endl retura 06; ) Ant operatorss (const Cplxk 8, const Cplxk A) ( return s.real()==d-real() && s.imag()=#d.imag(); ) ) const Cpl 4) ( imag): int operator!=(const Cpl return s-real()!=d.real() || 9-imag() > cpl operator+(const Cplxk s, const Cplxé 4) i return Cplx(s.real ()+d.eal(), s.imag()+d.imag (1); d 7* Se mai poate serie * cplx operatort (const Cplxé s, const Cplxé 4) { + pix 21817 + gta: + return 2; 4) ” cplx operator-(const Cplxé s, const Cplxé 4) ( return Cplx(s.real ()-d.real(), s-imag()-d. ) 219 Programare in C/C++. Culegere de probleme ‘pix operator® (const Cpink w, const Gpixe d)( return Cplx(s.real (}*d.real ()~s.imag() *d.imag(), S.real()*d,imag()-d.real()*s.imag())7 ) cplx operator/(const Cplxk #, const Cplxt 4) ( double t-d.real()*d.real () +d.imag() *d.imag() return Cplx((s.real()*d.real()+s.inag()*d.imag())/t ; (8-real ()*d,imag()~s.real()*d.imag()}/t) cplx operator-(const Cpixé =) { return Cplx(-z.real(), ~2.4 ) pix operator! (const Cpix& 2) ( return Cplx(z.reai(), ~z.imagi)}7 ) cplx operators+(cpixe =) ( z.setreal (z,real ()+1.0); J ipretix ) cplx operator++ (cpl 2, int) ( cpl (2); t.setreal (t.real()+1.0); return t; J postfix ? void main (void) ( elrser(}; cpix el, ¢2, ¢3; ein o> ety 2 = el: cout << 3=c2; cout << cl = c2 cout << tel: cout << ely 2 = elt+; cout << cl << 62; | etch); 2: 3 +33 eur 20 Capitol 8 CLAS! RB_3. Clasa atrice cs elemente reale este definits atte (Glass watrice( float **a int 1, cp 7 Jpublic: Matrice(int List, int ciel, float vis0); Matrice (Matrices x); sMatrice(); Matrices operators (Matrices x); Floate val(int 11, int cl); Ant Linii() const ¢ return 1; ) Ant coloane() const { return cy } void seti(int 11) (1 = 137 ) void sete(int cl) (© = chy } friend Matrice operators (const Matrices friend Matrice operator* (const Matricet: friend int operator==(const Matrices x, friend ostroamé operator<<(ostreant os, friend istreamé operator>>(istreant is, x, const Matrices y) x, const Matrices y)s const Matrices y)i const Matrices y); Matrices y); be Implementafi aceasta clas’ Rezolvaret a _ 8 3.cpp ~ Vinclude #include Hnelude Hinclude | #include Matrice::Matrice(int 11, int ci, float vi){ del: c= cl; a = new float* (2) for (int d= 0; i <1; dee) afil = new floaticl: for (int j= 0; 5 < er i++) a(t] = viz de Mateice: Matrice (Matrices x)[ Linki 0; x.coloane() ; ba = new float* (1) 21 Programarein C/C+4. Cutegere de probleme [for ine PS Ort Sty EIT ali} = new float (el; for (int 3 = 0; 5 < cy i+) aal{3) = x.val(i, 3) » Natrice: :-Matrice() ( for(int i= 0; 1 <1; ite) delete {) alil: delete [) a: | uatrices Mateice: roporators (maericet 2) ( afte) Se) return *this: De xiiniid: © = x-coloane(): a = new float (10; for (int is 0; 4 <2; i4( | ali] = new float[c]; for (ant 3 = 0; J =0 a& 11=0 Gk cl < c)7 return a(11} (cil; » Matrice operator+ (const Matrices x, const Matrices ¥)( ‘asgert (x.1inii (J==y.linii() && x.coloane()==y.coloane()); int lin = x.1inii( int col = x.coloane(); Matrice z(lin, col): for(int i= 0) i < Lin; ise) for(int j=; j < col: j##) zivallinj) = x.val (i,j) + valid): turn 2 h Matrice operator* (const Matrices x, const Matrices y)( assert (x.coloane()==y.1inii (1); “ int lz = x.1inii() int cz = y.coloane(); int col= x.coleanel): m2 ‘Capitol 8, CLASE, ana ae ean aa nents ese eee Watrice 2(lz, e2)7 for(int 1 = 0; i < Iz; iss) for(int j=0; 5 < cz: J+4)¢ Eloat 5 =0.3 for(int k = 0; k < col: kr+) st= x.val (i,k) * y.val Us 3)7 zivallisd) + 3; h return 2; h Ant operator==(const Matrices x, const Matrices ¥)i S€(xLinéi() !=y.linii() || x.coloane() != y.coloane()) return 0; for(int is0; 4 < x.inii(); i++) for(int j=0; j < x.coloane(}: j++) ifGe.val (i,j) t= y.val(i,j)) return 0; return ostreame operator<<(ostreamt os, const Matrices ¥)( os << end! for(int i = 0; 4 < y.Linii(y; is)( for(int j = 0; 5 < y.coloane(); j++) os << yeval(i, j) <7 ty os << endl: d return 05; h istreams operator>>(istresms is, Matrices ¥)( int 1, 7 cout << "Numar Lindi: *; ds >> Ly y-setl (1) ; Gout <2 "Numar coloane: "y y.sete(e): ‘cout << "Elementele pe linii\n"; for(int £ = 0; L< y.linii(); ise) for(int j= 07.4 y.valli, j)p 0° return is; iv void main(void) ( elrser(): 223 Progeumare in C/C++. Culegere de probleme Watrice a, b, 6 cout << b; R84. Clasa Polinom, care permite realizarea operajilor aritmetice cu polinoame cu coeficienti reali, este definits astfel: (Giass Polinom ( Iprotected! float ‘data: public: Folinom(int ni, float *datai); Polinom(int nico) Polinom(Polinom &p); ~Polinom() {4£ (data) delete [] datas}; void seta(int m)(n =m} Folinom & operators (const Polinom &p)7 int size()const ( return nj } void resize(int ni); void normalize(); float & operator[} (int i)const; Polinom & operator+=(Polinom £p) 7 | friend int operator>(const Polinom &p, float eps); friend Polinom operator+(Polinom spl, Palinem #p2)+ friend Polinom operator/(const Polinom épl, const Folinon lea) friend Polinon operator’é(const Polinom pi, const Polinom lep2) friend Polinom cmmdc(const Polinom epi, const Polinom &p2) friend ostream & operator<<(ostream &0s, const Polinom &D); friend istream & operator>>(ostream &is, Polinom &p)+ Implementafi_aceste functi, Seriei o functie main {) care citeste dou polinoame gi calculeazai emmde al lor, 24 Rezolvare: Indicayie: Pentru caleulul cétult si restuluiimpistirii_ a dows potinoame se simuleazé impacirea manual: 4 dye ty xitechdy fay 8 tet hy tt pon Dack se iak=n-m : 0 i = Airy lBy HM, Finclude Hinclude Hinclude #include Hinclude #include ¥include #def ine EPS 1.E-3 Polinomt: :Polinom(int ni) ( data for (int datali new float(n + 1}; +) ) Polinom: :Polinom(int ni, float *datat) ( n= nl; data = new float{n + 1) memepy (data, datel, (n+l) * sizoof(float)); ) jlinom(Folinom Ep) { Polinom: int 5: if (data) delete [] data; p.size() data = new Eloatin + 1 J: for(j=07 jen; je+) data(i} = plils ) Polinomé Polinom:: operators (const Polinom &p){ (el gp) return *this; delete () data; 25 Programare in CIC. Culegere de probleme Capitol &, CLASE [ee psizetir Gata = new floatin + 2); for(int j=0: jxen: j++) davai] = pli]: return “this void Polinom: :resize(int nl) ( if(ni <= alt for(int jenlel; 5 <= a; ++) data(j] = 0 n= nl; } elsel float *datal = now floatini+1]; mencpy(datal, data, (n+ 1) * sizeof (floatl); for(int i= n+ 1; i <= nly i++) dataL{il = 0.5 n= nly if(data) delete [) data; data = datal; ) void Polinom: :nornalize() { ine i while(i >= 0 && fabs(datali}) < EPS) re resize(n}: M float & Polinom:: operator{} (int 4)const ( assert (i >=0 && i <= size(}): return Garalil: Ant operator>(const Polinom ep, float eps) ( int gr? gr = p.size(: for(int isgr; i>20; i--) i€ip.datali} > eps) return 17 return 0; ) Polinom & Polinom: :operator+=(Polinom ap) ( int max; max = (n> p-size())? m+ p.sizell LE(max > a) resize (max) else p.resize(max) ; for(int Leemax; i++) aatali) += plilr normalize() : return *this; » Polinem operator+(Polinom Epi, Polinom &D2) ( Polinom p(pt): PoLinan operator/ (const Polinom pi, const Polinom &p2) ( int nl, n2, a al = pl.size(); n2 = p2.size(); q=ni- na: Polinom a, br a= pl: b= p2; Polinom ¢(a): int i, 7 forti'= af eli} = alien2] / bind fer(j = nds J >= 0; 3 alied] == eft] * BIS}? ) asncemalize() : c.normalize() ; ) Folinom operators (const Polinom spl, const Polinom &p2) ( int nl, n2, al = pi.size(): na = p2.size(): q=ni- m2; Pol:nom a, bi 26 2 Programare in C/C++. Culogere de probleme Tort T m1 eli) = alien2) / bina; for(j = nd; 5 >= 0; 5--) alisj] = aliej] = eli] * pti): y a.normalize(): return a; M Polinom onmdc(const Polinom spi, const Polinom &p2)( Polinom a, b; a= pl; b= pa; int m; m= p2.size()-1; Polinom x (mm); do ( ‘ reaab: 7 r.normalize(); a=b: a-normalize() ; ber; } while (r.size() >= 0 ee x > EPS); return a; ) ostream & operator<< (ostream é0% int m= p.size(}: for(int j =m 3 >= 073-1 Le(p(3] > 0 ke J >(istream ais, Polinom &p)( int m; Le >> p.setn(m) ; /icout << *coeficienti in ordine crescatoare puteri:\n"; for(int j = 0: j <= m; j++) is >> pid} return is; 208 void main() ( elrser(): Polinom aa(3): Lfstream £(*DAIP.IN"); £ >> aa; cout << "as" cc aay Polinom bb(2): f >> bb; cout << *bs* << bb; E.close(): Polinom ¢(3): © = cmmdc{aa, bb) cout << "c=" Hinclude Hinclude define NoT_FOUND -1 void string! if (data == 0) n=0; if (nou ) String::-string() { delete [] data; ) int string: reize() ( for (int i= 0; i < ny itt) if ( data{i) == ‘\0" ) otuen ir retum| 1 Ant string: :is_empty() ( return data[0]=="\0" ) charg string: roperator[] (int i) ( assert (i <= n) return datalil: ? 230 231 Programare in C/C++, Culegere de probleme Capital 8. CLASE, String String? reubste(int poz, int Ia) 1 assert (poz+lg <= size()}; string 37 s.resize(19) ; for(int i = 0; iclg; i++) s{i] = datatpoz+i); return 5; ) void String: :remove(int poz, int 1g) ( int stop = poz + lg: waile(stop (int p)7 //conversie din baza b in baza p friend ostream: operator<<(ostreamé om, NUDE )7 eee Implementafi aceasta clas, pentru ca programul de mai jos si fe executabil, (void nainive NoB x(2,*1101001*), y48,"253647"), 2 |. cou << 2s H Rezolvare: Numéru lung este pstrat ca un sir de caractee, alocat dinamie, incepaind ‘eu cla cea mat sernifieativa in poztia 0 gi neluzand terminatorul de sr. Funcjia privata int cifva (char) ; ne permite si aflim valoarea unui caraeter cif, conversa investi icdndu-se prin intermediultabloului hexa (1 « Funclia resize) sealoeé spatiul de momoric alocat numrului ung, Daca so loca mai pujina memorio, nu se face realocare ci se trunchiaz8 numarul in pozifile cole mai semnificativ. Dacd se alocd mai multi memorie, in spagiul now alocat, ‘numaral esc ainiat la drcapta si compleat Ia stinga cu caractere 0". xe EE Weide Sinelude Winelude Winclude Winclude char hexal} = "0123456789ABCDEF"; NUD: :NEB(int bi, char* datal) ( int ni = strlen(datal); data = new char(ni+l); a strepy (data, datal); neni; EB: :NEB (NEB fe) ( int nl = x.size(); data = new char(nle]: n= at b = x.mase(); for(int i=0; i datati] = x{i]; ie ) NBs :-NEB() ( n= 0; delete [] data; M NEB & NLB: roperator=(NLBE x) ( if (this == ax) return *this; //evita autoacribuirea int nl = x.size(); delete [) data; sa = new char(nl+1 n= nl; b= x-base(); for(int i= i Lee) datali] = xlil; return *this; h char & NUBrroperator(] (int i)( ‘assert (i >= 0 4 i <= a); return datalil; void NUBItresize(int ni) ( iginl = 0; 3--)( sum +2 tr + cifra(data(}); er = sum / by sum #= by 2(3) = hexalsum): h AE (te) ( zuresize(triz); 210) = hexa(er); ) return 2; in MLB NEB: roperator* (int p) ( NLB 2: int Iz = size(): int prod, tr = 0; //produs partial si transport z.resize(1z) ; for(int j = 1-2; j >= 0; 4--)¢ prod = tr + cifra(data[3]} * p: tr = prod / b: pred 8- b; 215] = hexalprod) h iE (tr) C z.resize(+#lz); 2{0) = hexa(er]; ) return 2; hn LB NEB: roperator/(int p) ( NEB 2: int 12 size(): 236 int ep = 0) //eest partied z.resize(1z); for(int 5 =O; j < er $44) rp =b* rp + cifra(data(j}); //noul rest partial 2(3] = hexairo / pl; rp ¥ p; ) while(z(0] == 0" e6 z.size() > 0) z.resize(--12); return z; Ant NLB::operators(int p)( NLB 2; int lz = size(); int xp J/eost partial z.resize(1z): for(int j j< ler jeer zp = b * xp + cifra(data[J]); //noul rest partial zU4] = hexalr> / pl; zp tp: ) while(2(0] == '2' a z.size() > 0) z.resize(--1z) ; return rp; if(beal0) retura *this; NLB 2(10), yz int lz = size(}: for(int 5-0; 5 < le: 3+) ( yr2t by 2 = y + cifra(data(j}): ) while (2 (0) z.resize( return 2; 1D) && z.size() > 0) Lat: NLB NUB: sev20B(int p) { if(p==10) return *this; NLB z, w(p,"0"): int 12 = size(): int j,k, iy z.resize(1z) {/numarui in baza 10 237 Capitol 8. CLASE z.resize(2*iz); //eonvertind din baza 16 avem mai milte cifre Propramarein CICH. Culegere de probleme weresize(4 * 12); J/numarul in baza p | forid = 0; 3 < ler J++) //eopiaza obiectul in z | 219) = data (3): | tori} = 07 5 <4 * te: j++) //cifrele se obtin inversate w(J] = hoxalz © pls Zeas ) for(k = 0, d= led; k (int p)( if(b == p) return *this; NLB 2; z= cvBLO(; return z.cvL0B(p}: > ostream operator<<(ostreamk os, NLBE x){ forlint j= 0; j < x.size(); 5++) os << xI5]7 os << endl; return 05 i void main (vot) | clescr() MLB x(2,"1101002"), y(B, *2536477), 27 cout << x: cout << yi z= x.cvB10(); cout << 2: 2 getch(}; Capitola 8. CLASE R8_7. Considerim definifia clasei Natural, care permite adunarea unor intregi firs sema de orice lungimeTbaza 10. char* data; wablic: Natural(char*); //constructor de initializare Natural (Naturals); //constructor de copiere Naturale operators (Naturale) 7 Natural (); Ant Length()const (return 27} void resize(int nn); friend Natural operator+ (Natural&, Naturalé); be 238 Fic clasa derivati Intxeg, care permite adunarea numerelor intregi cu semn de orice lungine: Natural © Tatreg. Clasa Zntreg are un membru suplimentar ~ semn ~ un intreg eu valoarea 0, act numiral este pozitv gi 2, daca este negativ Dafi defnijia clasci Int ves gi implementayi cele doud clase, Implementaji in clasa Zntxag si operatonul <« suprainedrcat, Fe Rezolvare: Cifrele unui numar sunt refinute intr-un vector incepiind cu cea mai pun semnificativa (data {0} este cea mai pufin semnificativa cifri). A fost aleasi aceasta reprezentare deoarece este potrivita pentru operatile de adunare si scidere Funciia operator+() simuleazi adunarea manual’, calculind pentru fiecare rang suma_ si transportul in rangul urmitor. Se porneste de la cca mai putin semificativa cifrd gi se continu& pang cand transportul este zero gi am ajuns fa ultima tifa din ambele numers, Exemplu: 123 + 89 = 212 ‘Vom inulfi mai int&i 123 en cifra cea mai pugin seraificativa (9) 123 1 + 89 ‘Transport Rezultat ie 1 ‘Transport=0 239 Programare fn C/C++, Culegere de probleme Pentru a aduna numere intreg a fost defnité funcjia Natural ; :operator() ceare seade dowd numere cu condifia ca rezultatul si fie numar natural. Adunarea & dows numere integi revine laa face suma/diferen|a moduleloracestor numere mao ae ¥inelude Hinclude Hinclude Adefine MAX(a,b) ((a>b) ? a:b) define MIN(a,b) ((axb) ? a:b) fdefine TRUE 1 #aefine FALSE 0 class Natural ( protected: int 2 char “data; public Watural() { n=0; datasNuuL; } Natural (char *); Natural (Naturale) ; Naturalé operator= (Naturale); -Natural() ( if (data) delete() data; ) ant Jength() const (return n;) void rasize(int); ohare operator[] (int 4) ( return datalil; ) friend Natural operators (iaturale, Naturale); friend Natural operator-(Naturalé, Naturale); friend int operator<(Natural&, Naturalé); h Naturals satura (char sir) ( nsstrien(sir); data(il ir(n-i-1)-"0"; ) Natural: :Natural (Naturale x) { 7 datasNULL; resize(x.length())1 moncpy (data, x.data,n) ; ) Capital 8. CLASE, Waturale Wat ‘operator=(Naturalé x) if (this I= ax) { ‘resize (x.length()); momepy (date, x.data,n) ; ) return tth{s; char *new_datasnew char [new_size] ; | memepy (new_data, data, MIN(new_size,n) ); Af (data) delete[] data; dataznew_data: matural operators(iaturalé a, Naturale b) ( Naturale, Crrestze (Haxt(a.Longeh() .B-2engeh()) #1) fae teanspor ine digitrir for (ernsdsé.nca.tengtn() || e-neb-tength() {I Eransporesdjermee) aigit-vcanspores fe tenncatenmth()) digit He teincbclenmen()) digit cle n)=digittl0; Crensportedigit/10; ) E.resize(e.n: ) fon}: fein): Natural operator-(Naturalé a, Naturale b) ( Natural ey Erzesize(a.lenath()); 17"Se presupune asserttaciongen() > ine eprunut int digit is for (iso; ica.lengen(s 7 ite) ( ‘aigitea [i] -inpeunue: LESS berengen() ) aigit--btils if (aigicos0) elil=digit; ese ( Srprumate1; etii=aigite1o; ) ) — (rezultatul este un numar natural) belength()) : 240 241 Progeamare in C/C++, Culegere de probleme Capitolul 8, CLASE 77 Se elimina posibliele gerour din fata sunaralul while (c[c-length()-1]==0) ¢.resize(c.length(}-1}; return ¢; > int operator< (Naturals a, Naturale b) ( int i: Lf (aslength() = b.length()) return a.length()=0 a& ali]=blil;i--) AE (ic) return TRUE; // sunt egale else return alil : ostreans operator<<(ostreamk out, Intrege a) { int i; if (a.get_semn()==1) oute< if (aslength()==0) out<<"0"; else ( 77 Se sare peste eventualele zerouri din fata nunarului for isa.length()-t;a[i]==0 ak i>0;i--}; outee ((int) alil); 2 y return out; ) 242 283 Programare in C/C++. Culegere de probleme int main(voia) ( Intreg a, by ("1"); =Intreg (*-110") ; rntreg(*=19"); +b ter coutccre= *arie(); //afisare arie patrulater cout << "ps; i 244 Capitol & CLASE. Rezolvare: Pentru a stabil dacd dow segmente AB si CD se intersecteaz, vriticim ack punctele A si B se alin regiuni difeite de plan, determinate de CD, adie: (5-4-)(5< 6) ea xD-xC yD=7C}\xD=xC yD- yC xC-xA_yC-yA) (xD-xA_yD-yA) . xB-xA yB~yA|(3B=xA yB= yA Pentru 4 puncte in pan A, B, C, D existi 3 posibilitqi distinete de intersectie: AB cu CD, AC cu BD si AD su BC. 7 Pentru a determina punctul de intersectie a dowd scgmente, cu cit mai putine caleule se foloseste ecuat a dreptei y = mx +n, Punctul de interseesie are coordonatele my ‘Trecerea de la ecuatia dreptei prin dowd puncte: ta couatia y= mx mse face eu = ayia m=-222, AT ah 7 La calcula aril gi porimmtratuipatrlateratui convex sunt posbile umstoarcle 3 situa: 1 1 1 Lp 3

| class Punct ( | float sy7 pubiier Punct (float pxs0, float py=0): x(px) -y(py) Punct (const Purcte Py x(P.x), yiPey) Puncte operators (const Puncte’ 2) ( reece Pehis t= 62) ees yep yt d return ‘this: 245 Capltolul 8. CLASE. const { return x; ) ~ Int intersectie (const Segment& 8) ( | gloat ¥() const { return y; } return ((PL-X()-S.PL.X(1)/(8.P2.X() -8.PL_X()) = 1: //Punce (PL.Y)-S.PL.¥0)/(8,P2.Y0)-S.BL.Y01)* ((2,K()-8.PL.X0)1/(8.P2.40)-8.PL.XO)~ clase Forma ( (22. 4028.21.40)/(8.P2.¥0-8.PL¥0)) < 07 protected: i) Punct. PL Erlend ostreams operator<<(ostreamé os, const Segments $) pubtie p Forma (const Puncté P) + PL(P) () Punct punct_intersectie(const Segments 5) 1 Forma(const Formas F) : PL(F.PL) Tey iassee Format operators(const Fornag F) { | it ( this t= 6F ) ostreant operator<<(ostreamt 08, const Segmenté 8) { PLeP.PL; os << "Segment" << endl; ) Teteen “ehh | os > 250 Capltolul & CLASE, P8_3, Proicctati si implementafio clasi Aleator, care genereazi 0 scovenfi de ‘numereintegi pseudoaleatoare flosind metoda congrucnfilniare Jn accasti metoda se folosese 4 intregi: sAmanja, inmuljitorul, inerementul gi smedulul, Cu. formula: (samanta * inmultitor + increnent), ¢ modul se goncreavé ete un numér aleator, care devine simdnja. in acest mod se genereazi. "modu'o" numere diferite. Constructorul clasei are ca argumenie: siimnfa initial, iamulfitorul, incre- smentul si modulul, Se vor prevedea functii membri pent: + schimbarea stimangei ~ generarea urmatorului numar din secvenfa de numre aleatoare P84. Definji si implementaji clasa Calendar avind ca date membri: An, Luna, Zi, Numezi (enumerarea de Luni pind Duminica) si ca func smembris ~ un constructor ~ objinerea datei curente = modificarea datei curente = incrementarea datei curente + afigarea datei curente, Se va defini o funcjie priten pentru cititea dateicurente ‘Se vor defini de asemenea func nememibru cu 2 parametri date calendaristce: “anterior () care intoarce rezaltatul boolean trucifalse dupa cum data argument | este Tnaintea sau dupa data argument 2 si - Interval () care intoarce numérul de zile cuprins intre cele doud date argumente. P8_5. 0 riuljime de intregi poate fi reprezentati printr-un vector de bifi in care bitul i teste 1 daed intregul / aparfine mlm si 0 in caz contrar. Numerotarea bitilor in vector se face de la stinga la dreapta gi dimensiunea vectorului se numeste feprezentantul mulfimii, De exempla muljimea (1,5, 7} avnd reprezen- {antul 210. arat ase 0123456789 9100020100 fn locul unui vector de bifi vom folosi un vector de octefi (caractere), Pentru 0 rmuljime cu reprezentantulr se aloci r/8+1 oct. Definti #7 implementafi clasa Maltime, care ne permite lucral eu muljimi. Ce date membri se preva = reprezentantul mln 1m pointer Ia vestorul de octefi,alocat dinamic ce reprezinta mulimea, 251 Programare in CIC++. Culegere de probleme Capitol 8 CLASE, Ca finctii membri aver P87. Proiectati si implementafi clasa Vector care si permit incrul cu vectori de = un constructor de inijilizare, avind ea parametru reprezentantul muni lemente reale Armplicit 0) CConstructorul clase va avea un argument - dimensiunea vectorului i va aloca + un constructor de copiere, avdnd ca parametra un obiect muljime rmemorie pentsu vector (in lipsa argumentutui se ia implicit dimensiunea 10) = un destructor Se va asigura un destructor si un constructor de copier, 6 func care testeaz’ apartenenta unui intreg fa muljime o funcjie care adayes un intreg la maljime 6 funefie care scoate un intreg din mulfime, ‘operatorul de atribuire supraineareat ‘operatorul *= suprainedreat, realiznd intersectia mull cu rmuljimea data Se vor preveda functii membri pent ~ determinares dimensiunil vector ~ determinarea lungimil veetorult + redefinicea operatsrilor += , um alt vector dav en argument Se va redefini operstorul >> ca funchiepricten pentnu citirea unui vector de la + pentru adunatea gi sedderea vectorului cu ca parametru + operatorul += supraineareat, realizind reuniunea muljimii cu muljimea dats intrarea standard ca parametru Se vor asigura funct i nemembru pentru: Ca funefi prieten se preva + operatorul * supraincarcat pentns a realiza ersectia a dowd mulfimai date ca = testul de egalitate x doi vector (redefinirea operatorului ~ sericrea unui veetor Ia iesirea standard (redefinirea operatorului <<) parametri = redefinirea operatorilor + , ~, pentru a permite operafii cu dowd argumente + operatorul + supraincdrcat pentru a realiza reuniunea a doud muljimi date ca vectori parameti, + redefinirea operatorului * pentru a permite calculul produsului scalar a doi Indicajie: Un element x al multimii este reperat in vectorul mulfime printr-un numar de octet (no = x / 8)siunnumar de bitin octet (nb = x & 8). Prezenfa lui x in muljime este indicat prin valoarea 1 a bitului nb din octetul no al vectorului multime, Pentru test se foloseste masca 1 << 7-nb. O expresie pitraticd de 0 variabilé are forma: ax*+bx+e in care numercle 4, b, ¢ (coeficieni) au valori fixate, iar variabila poate lua diferite valor Specificati, proicctati si implementaji clasa Parabola, care poate pistra informafii asupra uni expresi patratice. Un constructor implicit seteaza cei 3 coeficient la zero, Se vor prevedea functii membru pentru + schimbarea cosficiengilor = aflarea valor curente a coeficientilor = evaluarea und expresii patratice pentru un x dat = determinarea numarului de ridacini reale a unei expresi ptratice Se vor redefini operatori + si * ea fun’ nemembri pentr = adunarea a dou expresiipatratic: Parabola operator +(const Parabola &p1, const Parabola &p2); inmulfirea unei expresiipatratice cu 0 constant Parabola operator *(double k, const Parabola &p); Proiectafi si implementafi clasa Matrice care si permita lucrul ew matrice pitrate de elemente eal. Construetorul clasei va avea un argument - dimensiunea, adica numiral de linii si de coloane al matricei, va aloca memoric pentru matrice (in lipsa argumentului_ se ia implicit dimensionca 10) si va permite accesul la clementele individuale prin indexare. Se va asigura un destructor si un constructor de copier. Se vor prevedea fune|ii membri pentru = determinarea dimensiunii matricei = calculul determinantuli mattcit + redefinirea operaorilor +=, = , *= pent adunarea, ‘nmulfiea nei metrici eu o altd matrice data ca argument + rodefinirea operatorului /= pentru caleull inversei matric’ Se va redefini operacorul >> ca funeic prieten pentru citiea unei matric de fa intrarea standard Se vor asigura funcii ncmembru pentru ~ testul de egaitate a doua matrice(redefinirea operatorlui ==) ~ serievea unei matrice la iesirea standard (redefinirea operatorului <<) ~ redefinirea operatorlor +, ~, * pentru a permite operatii cu dowd argumente matrice, selderea si 253 Programare in CIC. Coleyere de probleme P8_9. Considerim clasa Forma cu derivarea Forma ¢— Dreptunghi [elass Forma ( [protected double x.¥; Ipublic Forma(double h=0, double v=0); virtual double Arie() const; |, virtual double Forinerru()conste0y Ve ‘class Dreptunghi foe : public Forma ( Dreptunghi (double h=0, double v=0); virtual double Arie() const; | virtual double Perimetru()const; Me class Cerc : public Forma ( protected: : double raza; Cere(double h=0, double v=0, double z=0); virtual double Arie() const; virtual double Perimotru()const? | hi Definifi si implementayi funcfile din cele 3 clase P8_10, Considevdm derivarca Dreptunghi <— Paralelipiped. Tinplcmentafi constructori pentra clazole respective gi finefiile Arie () si Volum (), penttu Dreptunghi se ia volumal 0, ceeptunghi = patrat romb “Toate figurile au slow’ laturi paralele eu axa Ox. i Patratul are ca date miembri coordonatele coljului stanga-jos i Iungimea laturi, dreptunghiul are, in plus, lungimea celeilate laturi, rombul adaugi la memibtii date — coordonatele coljului opus, iar trapezul are ca membn PS_LL. Se considera ierarhia de clase crapez <— paralelogram¢— 254 Capital 8, CLASE suplimentar ~ cca de-a doua baz, Funcfiile membri confin, in afara construc- toilor, funcfii pentru calculul arei si perimetrului, © data membru - valid , are valoarea 1 dack figura respectiva este spxcificati coreet. Constructor verfick paralelismul faturilor. Definifi si implementagi ierarhia de clase. 812. Consideram derivarca: Functionar ccnp operatii Functionar() Afisare() Perndaent Temporar date: date: salariu plataorara nrorelucrate operatii: operati Pernanent () ‘Temporar () Afisare() Afisare() Funcjia Aficare() din clasa de baza tipareste nume si cnp, iar in clasele derivate se tipdreste in plus sa.lariu2, Definifi i implementafi aceste clase P8_13. Definti si implerentai ierarhia de clase: triunghi eal reptunghic-isoscel isoscelG_____ echilatera Chscle echilateral si dreptunghic-isosce1 au ca membru aio laturd (cateta pentru cel de-al doilea), Clasele Greptunghic si isoscel au suplimentar a doua latura (catcta cealalti, respectiv baza), iar clasa triungh: are cea de-a treia latur’, Definifi constructor’ si funcfi peatru calculul perimetrului si arc. 255 Tabla de materii Profaya Capitolul 1. INSTRUCTIUNT Breviar Probleme rezolvi Capitolul 2. FUNCT Breviar Probleme rezoivate Capitol! 3. TABLOURI UNIDIMENSIONALE (VECTORD $I POINTER] . Breviar . - Probleme rezolvat Probleme propuse Capitolul 4, TABLOURI MULTIDIMENSIONALE Breviar . le Probleme propuse - Probleme propuse - Probleme rezolvaie Probleme propuse Capitolul 5, $IRURI DE CARACTERE, Breviar Probleme rezovate Probleme propuse Capitolul 6, STRUCTURI . Breviar Probleme rezolvate Probleme propuse Capitotul 7, FISIERE Breviar Figiere binate ~ probleme rezolvate Fisiere text ~ probleme rezolvate Fisiere binare ~ probleme propuse . . Fisiere text ~ probleme propuse . Capitolul 8. CLASE Breviar ...- Probleme rezolva Probleme propuse ie ie 256 19 124

You might also like