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

You might also like