----, ". ō' 3 (!) C" t: Q)... t: m ;;:» z c m ~ o m :n oi m 1" ;;:» :n z m r.(f) m g! +

Mărimea: px
Porniți afișarea la pagina:

Download "----, ". ō' 3 (!) C" t: Q)... t: m ;;:» z c m ~ o m :n oi m 1" ;;:» :n z m r.(f) m g! +"

Transcriere

1 ----, ". ō' 3 (!) C" t: Q)... t: m ;;:» z c m o m :n o m 1" ;;:» :n z m.(f) m g! +

2 EMANUELA CERCHEZ (n. 1968, lai) cstc absolventa a Facult2tii de Matematica, scotia nfomatica (J990), i a Seminaului pedagogic postunivcsita (1997). pctesoaa de infomatica (gad didactic J), memba ill Comisia Nationala de lufonatich. Autonea a mai publicat la Editua Poliom: ntenet. Mallilal pcntu liceu (2000, avizat MEN), nfomatica. Ml/lual penuu ctoso a X-n (coauo Mainel-Paul Seban, 2000, nvizai MEN), Pc. Pas ell pas (coauto Mainel-Paul Seba». 2001; ed..» 1-a, 2005), llfomaicn peutu ginmaeiu (coauto Mainel-Paul Seban, avizat MEC), lnfomatico. Culegee de poutcme pcntu ticcu (2002), Pogamaea in timbajul cle+ + pemu uccu (vel., coauto Mainel-Paul Scban, 2005), Pogamaea tu limbajul GC++ pentuiccu, Metode $i tehnici de pogamoe{vel. l, coauto Mainc1-Paul Scban, 2005), Pogatnaea in fimljajul CC+ + pentuliceu (vel., coacto Mainel-Paul Scban, 2006). MARNEL-PAUL serban (n. 1950, Aad) este absolvent al Facultalii de Matcmauca-Mecanicg, Univesitates din Timisoaa (1973); specializae postuuivesitaa in infomatica (974), pofeso de infomatica (gad didactic }, mcnbu in Comisia Nalionall de nfomatica. De acelasi aua, la Editua Poliom au apllut : nfomatica, Manual pemu ctoso a X-a (coautoae Emanuele Cechez, 2000, avizat MEN), Pc. Pas cu pas (coautoae Emanuele Cechez. 2001; ed. a l-a, 2005), infomatica pentu gimnatiu (coautoac Emanuele Cechez, 2002, avizat MEC), Pogamoeo ill limbajul CC+ + pentm liceu (vel.. coauoae Emanuele Cechea, 2005), Pagamaea ill limbajul CC++ pemu liceu, Metode i tehnici de pogoml1e (vel. 11, coautoae Emanucla Ceehez, 2(05), Pogomaoa ill limvajul CC++ peuuu ticen (vol., coautoac Emanuela Cechez, 20(6). Autoii au 0 bogata expciema in pegsoea de pefomanjn a elevilo : sustin cusui la Ccntul de Pegntic a Tineilo CapabiJi de Pefomanta din asi. popun pobleme pentu olimpiadelc si ccncusuile nationalc i judejcnc de iufonnaoca. susttn activitatea de pcgatic a lotului national de infomatica, pecum i pogamul de pegane de pcfomanja in infomatica.campion, 2013 by Editua POLROM Aceasa cane este potejata pin copyight. Repoduceea unegala sau pania1a, multiplicaea pin oice mijleace i sub oice foma, cum a fi xeoxaea, scanaea, tanspuneea in fomal electonic sau audio, puneea la dlspozijia publica, inclusiv pin intenet sau pin ejele de ca1culatoac, sccaea pemanents sau tempoaa pe dispozitive sau sistcmc cu posibiltatea ecupeaf infcnnatiilo, cu scop eomecial sau gatuit, peeum i alte faple simij<le s1ivaite taa pcmisiunca scis1i a de{in1iloului copyightului epezilll1i 0 inca1cae a legislaliei eu pivie a poteqia popietatii imelectuale i se pedepsese penal i/sau civil in confomitate eu egile in vigoae. "WW1 J.poliom.o Editua POLROM 1a.>11, B-dul Caol ill 4, P.O. BOX 266, Bucue.>1ti, Splaiul Uniii n. 6, bl. B3A, sc. 1. ct. 1, secto 4,040031, O.P. 53, c.p Descieea CP a Bibliotecji Na\ionale a Romalliei : CERCHEZ, EMANUELA Pogamaen fnlimbajul CC+ + pellfm liceu Emanuela Cechez, Maine! eball. - ai: Poliom, vol. SBN Vol. 4. Pogmmae oielllai'i pe obiecte $i pogmmae geneidi C/ STL Bibliog. SBN '- Emanuela Cechez, Mainel eban PRDGRAMAREA N LMBAJUL.-. J! l ff t ii,,/if 1:'" ', f:" fin",f, f "'t(fj tl' it{1] j= :-.. l't':=(""'i i" _i!:.,." _,- " "'T f! { ' f;}( j]tly;,"',;- f:<i t1 tlk[ii,:,,!je:, iis'jij Pogamae oientata pe obiecte si pogamae geneica cu BTL L, fl U u C'l, U nu u U i,-, U i,., y 'U, f1 w, -1 ' U o 1. eball, Maillcl (075.35) C(075,35) C++(075.35) Pinted itl ROMANA POllROM 2013 ' U u [1

3 CUPRNS CUVGm tnatue Pincipiile pogamaii oientate pe obiecte 1.1. Evolupa jimbajelo de pogamae Pincipiile POQ AvantajeJe PDQ lntebai ecapiulaive 2. Pogamaea oiematii pe obiects in C Clasele i obiectele.., ComoJuJ accesului la membii unei clase _, Ahitecua unei aplicatii POD Definiea funqiijomembe in exteioul clasei 2.5. Punctille inline.., _.. " Funcuile eli paameti implicijj " 2.7. Supaincacaea funqiijo Conslucoii Destmctoul ModeluJ logic aj vietii unui obiec. 2? 1. Constuctoul de copiee Pointeul this Mcmbii statici ai unci clase SpecificatouJ cons.. 2. J5. Functiile fiend Clasele fiend.. 2. J Supafncacaea opeatoilo Tataea eoilo Aplicatie. Numee natuale mai Clasa sting Mosteniea ncludeea conditionala PoJimofiSl1lul Tataea eoijo utilizand clasa excec s.on 25. Execilii i poblcme popuse S ] W n '" 51.M m76...':::::::::.':::':::::......:77 8]....

4 3. Elemente de pogamae geneica 3.1. Punctiile sablon Clasee sablon Execitii si pobleme popuse 4. STL. Concepte geneale Ce ese STL? Clasele containe Clasee adapto pentu containee lteatoii Clasele adapto pentu iteatoi 4.6. Functo'ii Clasele adapto pentu functo! 4.8. Algoitmii Clasa sablon pai Alocatoii Aplica!ii Execitii i pobleme ecapiulative. 5'. Comainee secventiale Clasa vecto. Clasa deque.. Clasa list. Clasa fowad_list.. Clasa aa:y. Execitii i pobleme popuse. 6. Clasele adapto Clasa adapto queue (coada) Clasa adapto stack (stiva) Clasa adapto pioity_queue Execitii sl pobleme popuse. 7. Containec asociative Conaincelc asociative sotate set i mu\ t Ls e t; Containeele asociative sotate map i mu t Lmap Containeele asociative nesotate Execitii i pobleme popuse.. 8. Solui! i indicatii.. Anexa. Caocieisttct ale pincipalelo containee... Bibliogafie m n ] n4. n Cuvant inainte Volumul al V-lea al lucaii Pogainaea in limbajul CC + + pentu liceu epezinta 0 continuae fieascs a celo anteioae, cel de fata cupinzand pezentaea a doua noi paadigme de pogamae: pogamaca oicnaa pe obiecte i pogamaea geneica, Pezentaea concisa, claa si opeationala a conceptelo pogamaii oientate pe obiecte a epezentat 0 adevaata povocae. Suntem convinsi insa ca am eusit sa punem la dispozitie un instument eficient de invatae, datoita numeoaselo exemple explicate i apllcatiilo de factue algoitmica incluse, utile atat ejevilo de liceu, cat j sudentilo cae se initiaza in pogamae. Cea de-a doua sectiune a lucaii este axata pe pogamaea geneics si ilustaea acestui nou stil de pogamae, utilizand biblioteca STL (Standad Template Libay). Nu ne-am popus sa inlocuim in acest volum documenatia STL, cae este excelent stuctuata i poate fi accesata online, ci am umait ilustaea pincipalelo functii pmt-o abodae algoitmica. Am intega cuncstinte i depindei pe cae eievii i e-au fomat deja pin studiul volumelo pecedente, da am schinbat pespeciva in ceea ce piveste modul de implenentae, valoificand facilitiltile ofeite de STL. Pefata pe cae Alexande Stepenov.,pincipalu! aua al bibliotecii STL, a scis-o in 2001 pentu lucaea STL Tutoial and Refeence Guide se incheie astfel : "STL pesupune un mod difeit de a peda infomatica. 99 % din ceea ce un pogamato tebuie sa stie nu este cum sa constuiasca 0 components softwae, ci cum sa 0 foloseasca". Ca pofesoi cu zeci de ani de expeicnja in fomaea pogamatoilo de pefonanta, am doi sa nuantam aceasta afimatie, deoaece suntem convinsi di pentu a utiliza eficient si poductiv 0 componenta softwae tebuie sa ai 0 buna tntelegec a modului de funcdonae a acesteia. Din acest motiv nu am putut pezena biblioteca STL faa a ilusta pincipiile pogamaii oientate pe obiecte si ale pogamafi geneice, pecum si modul de implementae a aces to doua stilui de pogamae in limbajul C++. Si suntem convinsi in egala masua ca "invlitaceii" nosti, cae stapanesc deja stuctuile de date, vo intelege pefect containeele standad din STL sl vo si sa e utilizeze optim in implcmcntanle lo. Speam ca pin acest volum sa ofehn un punct de spijin in constuiea unui aspuns afimativ la intebaea pc atunci etoica a lui Alexande Stepanov: "Putem muta vcodata softwae-ul in ea industiala?": u. {, LJ f U o o o o o o o o o o o n

5 - 1. Pincipiile pogamaii oientate pe obiecte.- - -: 1.1. Evolutia limbajelo de pogamae Pogamaea oientata pe obiecte (pe scut, POD) cpezinta un stil de a dezvolta aplicatii (sau, mai elegant spus, 0 paadigna de pogamae). Ca sa tntelegem cum s-a ajuns la PDQ, at fi utila 0 scuta incusiune istonca in evolutia calculatoaejo j a limbajelo de pogamae. Pima masina de calcul pcgamabila a fast conceputa de matematicianul englez Chales Babbage, in peioada 1830-] 840. nteesant ese ca modelul popus de Babbage se apopie de stucua conceptuala a unui calculato actual (avea 0 unitaie aitmetico-logica, 0 unitate de contol, 0 unitate de memoie). Ada Lovelace (mai exact, Augusta Ada King, Conesa de Lovelace, nascuta Augusta Ada Byon, fiind singuul copil legitim al poetului Geoge Godon Byon) a fast pinul pogamma din lume. Ea acanceput un.jimbe] de pogamme" pentu masina lui Babbage $i a ceat pimul pogam din lume. Din pacate, unele pobleme tehnice si financiae nu i-au penis lui Babbage sa finalizeze constuctia nasinii sale de calcu1, astfel incat pogamuj Adei Lovelace nu a fost niciodata testat. o sum de ani nai taziu, tnc anii 1940 si 1950, au fost ceate pimele calculatoae electonice. Cele mai impotante teoii cae au stat la baza constuctiei calculatoaelo le apatin lui Alan Tuing (cae in 1936 a descis un model matematic de functionae a unei masini de calcul pogamabile), Claude Shannon (cae in 1937 a demonstat ca oice functie din algeba booleana poate fi impjementatii mecanic cu ajutoul uno cicuie Jogice electonice) i John von Neumann (cae a descis schema stuctuale de baza a calculatoaelo, denumita ahitectua von Neumann); calculatoaele modene sunt constuite din cicuite logice, se bazeaza pe ahitecua von Neumann si implementeaza functional modelul masinii Tuing. La titlul de "pimul calculato moden" candideaza masina Atanasoff-Bey (pimul calculato electonic), calculatoul bitanic Colossus (pinul calculato electonic pogamabij pin conexiunije cabluilo si comutatoae), masinile ingineului geman Konad Zuse (pima masina Tuing complete) 'i ENAC (pimul calculato geneic; pogamul tebuia intodus manual, modificand concxiunile cabluilo si comutatoacle sale). Pimul calculato functional cu pogam stocat a 1'05t Mancheste.,Baby" dczvoltat de Fedeic C. Williams si Tom Kilbun a Univesity of Mancheste in Odaa eli dczvoltaea calculatoaelo ell pogamc stocate s-au dezvolate i limbajclc de pogamae.

6 ;;; '!, : : li[ f 10 PROGRAMAREA in L1MBAJUL C/C++ PENTRU LeEl! m'''''''''''tt'''...ogramarj ORENTATE PE OBECTE nitial, calculaoae!e eau pogamate in limbaj masina (pogamatoii cunosteau coduile numeice ale instuctiunilo speciflce masinii de calcul utilizate i ie intoduceau "de mana", poces, evident, lent i supus fecvent eoilo). 0 idee majoa. cae a schimbat acest sti! de pogamae, a ost accca de a cea un pogam cae' sa taduca un at pogam. Astfel au apaut limbajele de asamblae. Accstea sunt de asemenea specifice masinii pe cae uleaza, asambioul taducand instuctiunile limbajului de asamblae in cod masma. nstuctiunile scise in limbaj de asamblae au o codificae mai uso de etinut (mnemonic) pentu opeatia executata si opeanzi (date sau adese de mcmonc). De exemplu, MOV AL 61h detemina nemoaea valoii hexazecimale 61 in egistul de memoie AL. deea cae a facut teceea de a unbajele de asamblae (dificil de utilizat si specifice masinii de calcul) la limbajele de nivel inalt a fost intodusa in 1952 de Gace Hoppe: utilizaea unui imbaj de pogamae independent de masina si a unui pogam (pe cae ea l-a denumit compilato) pin cae sa fie tadus codul-susa (codul scls in limbajul de pogamac espectiv) in cod obiect (cod scis in limbaj masina). De altfel, Gace Hoppe a si dezvolta pimul compilato pentu limbajul A-O, desi acest meit este atibuit fecvem echipei conduse de John Backus de 1a BM, cae a dezvoltat in 1957 compilatoul pentu limbajul FORTRAN. Din acest moment s-au dezvoltat numeoase limbaje de nivel inalt. Dlne acestea, unele au ezista in timp i au fost utilizate pe scas Jaga : FORTRAN (imbaj de uz geneal, in special pentu oameni de tiinta i inginei, cae in timp a avu nuneoase vesiuni), COBOL (imbaj poiectat pentu aplicatii econonice), LSP (cae a intodus conceptele pogamaii functionale) i ALGOL (cae nu a avut inpotanta coneciaia, da a intodus concepe-cheie pentu dezvoltaea limbajelo de pogamae actuale). Peioada unaoae a fost extem de polifica, ata: in ceea ce plvestc imbajele de pogamae dezvoltate, cat $i in pivinta concepteio cae au influentat evolulia limbajelo de pogamae. Un pim concept-chcie a fost natatia BNF (Backus-Nau Fom), intodusa in 1959, epezentand 0 modalitate matematidi de a descie iguos sintaxa unui limbaj de pogamae. Pincipala paadigma de pogamae dezvoltata n aceasn peioada a fost pogamaea stuctuaa, ca aspuns la necc.sitatea_de a scie pogamc mai clae, -in imp mai scu i a CaOl' coectimdil1e sa poata fi demonstata. Satisticile demonstau ca la vcmea espectiva un pogamato scia in medie ime 5 $i 10 linii de cod coecte pe zj. Extem de pulin, avand in vedee dezvoltaea hadwae-ului i ceinp. pentu softwae existenta. PUl1ctul de plecae al pogamaii stuctuate este consideat aticolul "Go To Statement Consideed Hamful", scis in 1968 de Edsge Dijksta, pecum i lucaile lui Bohm $i Jacopini. Ace$tia au fomulat i demonstat in 1966 Teoema pogamaii stuctuate: "oice pogam poate fi descis cu ajutoul a tei stuctui de contol: stuctua secventiahi, stuctua altenativa i stuctua epetitiva". Timp de 20 de ani, Dijksta a pomovat pogamaea s(uctuan, da pobabil momentul de cotitua, pin cae industia softwae a col$tientizat beneficiile acestei paadigme de pogamae, a fost lal1saea, , a unci aplicalii de indexae a aticolelo din ziae, ealiza(a de BM pentu New Yok Times. Dezvoltaea apjieaici a dua( 22 de luni, echivahind ell l1lunca unui 0111 ill 1J Clni, constand in apoximativ de linii de cod. Dupa cinei saptamani de testae a aplicatiei au fost identiticate doa 21 de eoi, umand ca in utmatou! an de u(ilizae sa mai fie identificate inca 25. Mai mult, aplicatia a fost ivaa inainte de temen si cheltuielile au fest mai mici decat cele bugetate. Acest succes a fast un $OC in comunitatea pogamatoijo (de exenplu, aplicatia pecedenta dczvoltata de BM, sistemul de opeae penu System/360, a costat sute de milioane de dolai, a fast finalizat eu un an intaziee si continea a Jansae mil de eoi). Pogamaea stuctuata a consiuit 0.aevolune" in domeniu. n esenta, pogamaea stuctuata ae la baza tei pincipii pentu dezvoltaea aplicatiilo : L analiza TOP-DOWN: poblema de ezolvat este impatita in subpoblene elativ independente ; fiecae subpoblems este analizata in acelasi mod; 2. modulaizaea : pogamul este inpatit in mai multe sectiuni (denumite module, subpogame, pocedul sau functii}, fiecae modul ezolvand 0 subpoblems a poblemel date (in concodanta cu analiza TOP-DOWN a pobjemei); 3. codul stuctual: fiecae modul consta in compuneea celo tei stuctui de contol fundamentale: secventiala, altenaiva, epetitiva. nteesant este ca pincipiile cae stau la baza pogamani oientate pe obiecte dateaza tot din anii '60. Cccctaon de la Uuivesiatea din Oslo au dezvoltat un limbaj de pogamae denumit Simula, cae intoducea notiunile de clasii, object, functie vituala etc. Simula fiind pimul imbaj de pogamac oientata pe obiecte. nspiati de acest limbaj, cecetatoii de la XEROX Palo Alto au dezvoltat in peioada un alt limbaj de pogamae oientata pe obiecte "pu", SmallTalk, in cae mate pelucaije se ealizeaza in cadul claselo. 0 incecae de a cea un limbaj de pogamae oientaa pe obiecte "pu", eficient de utilizat in industia softwae, a fost limbajuj Eiffel, ceat de Betand Meye. Pogamaca oientata pe obiecte a devel1it insa populaa odata cu apaitia Hmbajului C+ +. Limbajul C+ + ceat la incepuml anilo '80 de Bjane Stoustup de la AT&T Labs ea un limbaj hibid, cae pasta compatibilitatea cu limbajul C. Limbajul estc considcat hibid deoacce pogamatoul poate scie un cod i in afaa claselo. Ulteio, la inceputul anilo '90. Sun MicoSystems a dezvoltat un all limbaj'de pogainae oientaa pe obiecte, denumit Java. Java a meninu 0 sintaxa asemanatoae cu a limbajujui C+ +, da a eliminat caacteistici potential peiculoase (cum a fi posibilitalea de a utiliza pointei) i a simplificat anumite aspecte (de exemplu, ae un sistem denumit gabage collectiol, cae elibeeaza automat memoia ncutilizaui). La oa aetuahi, pogamaea oientata pe obiecte este paadigma geneal acceptat5. pentu dezvoltaea de aplicaii softwoe. "'---J w ' '-'

7 ",... l, " l, ni i- ' i.. ;;, u,.( i,...:... ''i l' PROGRAMAREA in L1MBAJUL C/C+-t PE1'\TRU LlCEU 1.2. Pincipiile POO Abstactizaea datelo Un tip de date este definit de domeniul de vajoi pe cae e pot iua datele de tipul espectiv, setul de opeatii pemise asupa valoilo espective si modul de epezentae in memoie. Un tip de date abstact este definit doa de domeniul de valoi j setul de opeatii asupa valoilo espective, modul de epezentae in memoie nefiind specificat pentu utilizato, De exempju, stiva, ca tip de date abstact, este 0 stuctua de date cae pennie doua opeatii : push (inseaea unui element 1a vaful stivei) si pop (extageea clementului din vaful stivei). Madul de implementae a stivei (Ca vecto? Ca lists simplu inlantuna") nu este specificat. ci doa setul de opeatii pennise. Un tip de date abstact pactic functioueaza ca 0 "cutie neaga?: inteioul este "opac", poate fi studiat/utilizat pc baza de intat/icsii.,. uae Abstecizaea datelo este pocesul pin cae sunt definite de cate utilizao tipui de date abstace (ADT = Abstact Dam Types). n C+ +, tipuile de date abstacte se implementeaza utilizand close. incapsulaea datelo ncapsulaea datclo (encapsutcuton, in limba engleza) cste 0 consecinta imediata a pincipiului abstactizaii datejo, poces in cae epezemaca inena este "ascunsa" utilizatoului. Pocesul de dczvoltac a aplicatiilo pana a POD poate fi dcscis in modul eel mai concis pin ce1eba ecuatic lansaa in 1976 de Niklaus With : Stuctui de date + Algoittn = Pogam Accasta ecuatie evidentiaza faptul di efotul de poiectae a unei aplicatii se concenteaza pc 0 buna stuctuae a datelo, apoi pe dezvoltaea ecla mai eficieni agaitmi de pelucae a acestoa. Efotul de poiectae a unei aplicatii POO eonsta in pimuj and in identificaea "modulelo" apjicatiei, datele fiind "ascllnse" in cadul fiecaui modul. Modulu tebuic sa contina funetii "de intefata", cae sa pemita accesuj la datele "ascunse" in modul. Utilizatoul modulujui nu ae acces diect 13 date, accsta -fiind pemis daa pin intcmediul funqiilo de "intefala". Chia dadi epezentaea datelo se schimba i, in consecinta, i impementaca funqiilo de pelucae a datclo, acest lucu nu estc tanspaent pemu utilizato, fijnddi accesul se calizcaz:1 pill aceeasi ijltefaa. ill plus, acccsul la date fiind limitat, cc:;;tc secuitatca aplicaiei. Mosteniea ogramarj ORENTATE PC OBECTE. Conceptul de mostenie (inheitance, in limba engtcza) este inspiai din domeniul biologiei. De exemplu, putem considea ca tip de date abstact clasa Animal. Toate animalele tebuie sa aiba functie de hanle, functie de epoducce etc. Acestea sunt functii comune tutuo animalclo. in cadul c1asei Animal putem difeentia difeite tipui de animale, de exemplu, pasai si mamifee. Atat pasailc, cat i mamifeele au in comun eementele specificc animalclo, da au i caaccnsici specifiec. De exempu, pasaile au pene. La POO, pin mostenie, 0 clasa poate mosteni toae elementele altei cjase. Pocesu pin cae 0 clasa mcsteueste ecmentele atei clase mai ese cunoscu si sub denumiea de deivae. Pin deivae, 0 clasa (denumita clasa deivata sau subclasa) mostenese toate elementele unei alte clase, cea din cae este deivata (aceasta se numeste clasa de baza sau supaclasa). Clasa deivata va avea si alte clemente specifice ei, cae a difeentiaza de clasa de baza, De exemplu, clasa Pasae poate fi deivatf din clasa Animal si adaugam la caacteistici specifice faptul ca pasaile au pene. Clasa detvata este mai spccializata decat clasa de baza. o clasa deivata poate fi, la andul ei, clasa de baza pentu a alta class. Se obtin astfel ieahii de clase, clasele deivate avand in eomun toate elementele mostcnite de la stamosul lo eomun. n eoncluzie, in poeesul de poiectae a unci aplicatii POO, tebuie sa idcntificam "modulele" aplicatiei (clasele), da si elementele pe cae e au acestea in comun, constuind, pin deivae, ieahii de clase. Pin mostenie eluninam codul edundant si putem extinde aplicatia, adaugand noi functionalitan. Polimofismul Etimologic,' cuvanul polimofism povine din limba gcaca. de Ja polys (multe) si mophos (foma). n POD, pin polimofism se intclege posibilitatea ca, pin apelaea unei functii, sa obtinem efcce difeite, in functie de contextul apelului. Reluand analbgia cu lumea vie, mentionam ca toate aninalele tcbuie sa alba functia "de epoducee; da accasta functie "se executa" difeit in functie de context (nt-un mod ae oe, de exemplu, epoduceea la pasan, in alt mod la mamifee). n C++, polimofismul se poate obtine pin supaincacaea functiilo (oveloadin.g) sau, in cazul claselo deivate, pill edefmiea unei funqii a clasei de baza (oveiding) Avantajele POO Pincipiile cae stau la baza POD eonduc la 0 seie de avantaje in ceca ce pivctc dezvoltaea aplicatiilo. Aplicaliile au a stuctua modulaa. Moduleie : pot ti dezvoltate sepaat ; - pot fi modificate sepaal (taa a afecta functionalitatea integii aplicaii) ; poth eutilizate in alte "aplicaii; pot fi extinse ulteio.

8 1 -' 14 PROGRAMAREA in LMBAJUL etc++ PENTRU LCEU, g Yi f! t, '1 P Toate acestea conduc la cesteea poductivitatii (timpul necesa pentu dezvoltae este mai scut. costuile suu eduse, mentenanta aplicatiei este mai usoaa) ntebai ecapitulative 1. Cae dinte umatoaele afimatu sunt coectc? a. Limbajul c++ pemite mosteniea, da aceasta nu este ecouandata, deoaecc este consumatoae de limp. b. Pincipiul tncapsulaf datejo pesupune ca datele sa fie toate impeune in aceeasi suctua de date, fiind pemis accesul 1a datele din stuctua. c. Abstactizaea datelo inseamna sa definim suma stuctua de date. d. n imbajele cae pemit pogamaea oientate pe obiecte nu se mai utilizeaza pogamaea stucuata. e. Niciuna dinte vaiantele pecedente. 2. Pincipiul cae pemite ca aceeas! actiune sa fie executata in mod difeit in functie de context se numeste : a." poligamie; b. mostenie ; c. polimofism; d. multitasking. 3. Dati exemple din viata cotidiana cae ilusteaza mosteniea. 4. Dati exemple din viata cotidiana cae ilusteaza polimofismul. 2. Pogamaea oientata pe obiecte in C Clasele i obiectele n dictional', temenul claslieste definit ca 0 multine de elemente ell insusii comune. Pin insusii comune putem intelege atibute comune sau compotamente conune. Sa considean clasa cainilo. Toti cainii au atibute si compotamene comune. De exemplu, toti cainii au blana, deci un atibut inteesant a putea fi. lungimea paului. Toi cainii Jaa - acesta este un compotament comun. n esenta, 0 clasa epezinta exact acelasl lucu 1;'i in cazul PDQ. Clasa dcfinese caacteisticile comune (aibue, compotamente) ale obieetelo c1asei. Mai exact, ell ajutoul claselo putem defini popiile noaste tipui de date., Din punct de vedee sintactic, declaatia unei clase este : class NumeClasa : {lista_declaatii_membi} j unde: NuneCLa s a = numele tipului clasa declaat Lls t aldecla-a ni. membi = secventa de declaant ale menbilo clasei (contine declaaji! de date membc, pecum si declaant sau definitii de functii..membe). Datele -membe coespund atibutelo, ia functiile membe coespund conpotamentelo. Functiile membe ale unei clase mai sunt denumite metode. Ca pim exemplu, sa deciaam clasa Caine: class Caine int Luq-imepa- j void Lat -a () {co u t c c vham l v i ) idata membu lfunctie membu Un obiect este 0 vaiabila _de tip clasa sau, mai elegant fonu lat, 0 instantiee a unei clase. De exemplu : Caine Giv e a. Azo e Giv e.i si Az o -e sun doua instante ale clasei Ceine (doua obiectcj. i -' J J J :1.J J J J J J J J J 1

9 f -, '-,:, t \1, 'i, i _,, - l,, ;, i -, 16 o analogie elevanta pentu a intelege mai bine conceptele de ctasa i obiect este cea ell foma de p-ajitui. Foma de pajitui cste clasa ; ea defineste aspecul utuo pajituilo cae VOT fl taiae ell foma espcctiva. Pajuuile pe cae lc taiem ell foma espectiva epczmta obiecele clasei. Obiecte Accesul Ja un membu al unui obiect se ealizeaza in mod simila eli accesuj la un camp al unei vaiabile de tip s t -uct, utilizand opeatoul de selectie diecta : obiect.membu De exemplu : PROGRAMAREA in UMBAJUL C'/('+-f PENTRU UCEU _', _c]asa Givei.Lunginepa=10i //pentu obiectul Givei am atibuit datei membu //Lungimepa valoaea 10 Givei.Lata() ; flam apelat funct;ia membu Lata() pentu obiec'[.ul Givei,?."'>J 2.2. Contolu accesului a membii unei case in pocesul de p'oiectae a unci clasc, 0 atentie specials tebuie acodata contolului modului de acces pentu menbii unci clase, in acest scop pot fi utilizati tei specificatoi de contol al accesului : public = membul poate fi accesat din o-ice functie din domeniul de declaatie al clasei ; pivate = membul poate fi accesat doa din functiile nembe ale clasei, pecun si din functiile pnetene (fiend) ale clasei; potected = ca efect, este simila cu pivate, da, in plus, accesul este pemis i pentu functiile menbe sf fuuctiile pietene ale claselo deivate din clasa espectiva. Specificatoul implicit este pivateo Din pullct de vedee sintactic, un specificato de contol 31 accesului sc pccizeaza astfcl : t specif:'lcato: Obsevatii PROGRAMAREA ORENTATA P: OBECTE jn C-:-.-' Un specificato de acces amane valabil p,1na 13 apaitia unui alt specificato, 2. Confom pincipiului ncapsulali datelo, datelc mcmbe ale unci clase a tebui sa fie "ascunse" in inteloul clasei. Cu aite cuvinte, nu tebuie sa fie publice. Clasa a tebui sa cantina metode speciale publice, pin cae putem 55 aflam valoaea datei menbe sau sa 0 modificam. Aeeste funcui se numesc accesoi, Este fecven utilizat pefixul Get pentu numeje unui acceso cae ctuueaza valoaea. cspectiv peflxul Set pentu numelc unui acceso cae modi fica valoaca daei membe. 3. in geneal, este de doh sa minimizam numaul de menbi publici ai unei clase; mcmbii publici vo costitui patea de "intefata", pin intemedtul caet elasa inteacnoneaza cu exteioul analogie elevanta pentu tnjelegeca modului de poiectae si de utilizae a unei clase este cea eu apaatul de adio. Un utilizato obisnuit al unui apaa de adio obine efectele doite actionand butoancle de pe cacasa apaatului de adio (pentu a deschide apaatul, apasa pe un buton, pentu a modifies volumul, oteste un alt buton etc.). Butoanele acestea epezinta de fap metodele publice ale clasei. n mod nomal, un utilizao al apaatului de adio nu va desface cacasa apaatulul pentu a avea acces diect la ceea ce cste in inteio (inteioul apaatului epezentand membii pivati ai clasei). Exemplu Sa esciem casa Caine, contoland accesul 1 1 data memba Lu.nq LmePa : class Caine {pivate: int LungimePa; public: void Lat.-e ( ) int qetlungimepa(} int SetLunginePa(int x) { c out.ccvheml v: {.etun Luiqi.ne Pa : { LungimePa = Xi Data memba LuiqLmePa- este pivata, in timp de meodele Lata' ('), Oet.Lunqi.mePa () i Se t LunqamePa () sunt publice (ultimele doua fiind acccsol). Pentu a stabili lungimca paului lui Givci, vom apela accesoul Se.Luiq.ime.Pa- ( ) Givei.SetLungimepa(lO) i Daca doim sa aflsam lungimea paului lui Givei : cout<:<givei.getlungimepa(); o incecae de a acccsa diect data memba Luqi.ne Pe () suh foma: 9ut«Givei.LungimeP2; va genea un mesaj de eoae la compijae. '7

10 18 PROGRAMAREA in LMBAJUL C/C -+-- PENTR li LiCEU u 2.3. Ahitectua unei aplicatii POO i Pentu fiecae clasa se gcneeaza doua fisiee : un fisie cae conjine declaatia c1asei; acesta va fi un Fisle antct (heade), cae va avea numele clasei si extensia. h ; un fisie cae contine implementaea clasei; in aces fisie susa (fisie ell numele clasei $i ell extensia. cpp) se afm. definitiile functiilo clasei. in o-ice fisie susa este necesa sa utilizam clasa si vain include fislcul antet : void factie: ; SetNumito (int y) ( b=y; ) J #include "NumeClasa.h" o aplicatie va consta dint-un poject cae va contine mai multe fislee susa. doa unul dinte acestea continand functia main ( ). Gice functie va fl definta 0 smgua data (in fisieul susa in cafe apae implementaea sa), da va fi declaata oi de cae oi este necesa (p-in includeea fisieului antet ccespunzao) Definiea functiilo membe in exteioul clasei Cand definim 0 functie memba a unei clase in exteioul clasei tebuie sa pecizan sl clasa caeia ii apatine. Pentu aceasta vom peceda numele functiei de numele clasei, utilizand opeatoul de ezolutie : : astfel : NumeClasa: : NumeFunctieMemba Este destul -de fiesc, avand in vedee ca in clase difeite pot exista functi i eu acelasi nume. Exemplu Vom incepe sa constuin pas eu pas 0 clasa pentu lueul ell factii,- Pentu a specifiea 0 factie tebuie sa etinen numitoul!?i numaatoul factiei (aeestea vo fi datele membe pivate). Pentu inceput, vom defini accesoi,o;;i 0 functie de simplificae. Declaatia clasei se va afla in flsieul antet factie. h : cass factie {pivate: int a; //numaato int b; //numito publ.ic: int GetNumaato() { etun a; int GetNumito() {etun b; void SetNumito(int); void SetNumaato{int) void Simplifica(); } ; void factie: :Simplifica() {int X, y, ; //ealculez emmdc eu algoitmul lui Euclid x=a; y=b; while (y) { =x%y; x=y; y=; a/=x; b/=x; //simplifie } Ca sa ilustan modul de utilizae a c1asei factie, in functia main () declaa un obiect de tip faetie, vom inltializa numitoul si numaaou}, simplifiea factia, apoi 0 vom afisa simplificata. #include <iosteam> #inelude "factie.h" using namespace std; int main () faetie f; f.setnumito{12)j f.setnumaato(8} ; f.simplifiea() ; eout«f.getnumaato()«'/'«f.getnumito(); etun 0; Evident, executand acest pogam, se va afisa pe ecan 2/ Functlile inline Difeeute dine 0 functie inline,o;;i una uzuala consa in faptul ca fiecae apel al functiei inline este inlocuit de compilato cu codul funcnei. Avantajul consta n cesteea viezei de executie a codului, fiind eviate opeatiile afeente 'apelului de functie (de exemplu, alocaea pc suva a mentone! necesae apejului, copieea valoijo paametilo, etunaea valoii calculate de functic). DezavantajuJ consa in faptul ca va ceste dimensiunea codului susa. vom vom 1 - J J J J J J J 1 '--' J

11 20 PROGRAMAREA in LMBAJUL C/C ++ PENTRU LCEU Dinpunct de vedee sintactic, definitia unei functii inline este similaa ell definitia unci fu1cii uzuale, nunai ca este pecedaa de cuvantul-cheie inline. Exemplu PROGRAMAREA ORENTATA PE Ol3ECTE in C++ Functia pecedents f () definite mai sus 0 putem apela eli un paametu : 21, - Exemplu inline int max(int a, int b) { etun a > b? a : bi } Obsevatii 1. Functiile inline tebuie sa fie foate seute. 2. Functiile ecusive nu pot fi functii inline. 3. Compilatoul poate ignoa declaatia inline. 4. Functiile lnline combine avantajele macouilo eli cele ale functiilo, in acest mod, ca si in cazul macouilo, se elimina opeatiile afeente apelului, da pasteaza toate popietatile fuuctiilo in ceca ce piveste validitatea apelujui, tansfeul paametilo, declaatiilc. Functiile membe definite in declaatia clasei sunt implicit tuncpf inline, in exemplul pecedent, functiile GetNumito () i Getnumaato () sunt, pin umae, functii inline, 2.6. Functiile ell paameti impliciti Pentu a coespunde unei vaietan cat mai man de situatii, functiile sum poiectate de obicei eu un nuua foate mae de paameti, chia daca pentu uni i paameti se utilizeaza fecvent la apel aceeasi valoae. Pentu ca functiile espective sa fie mai use de utilizat, limbajul C+ + a intodus o facilitate suplimentaa, pin cae pogamaoul poate declaa in antetul functiei valoi inplicite, Exemplu void f(int a, int b=l, int c=2) {cout «a «b «c;} Functia f () ae tei paameti, dinte cae doi ell valoi implicite (b ae valoaea implicita 1, ia cae valoaea implicita 2). La apelul functiei se pot omite paametii actuali coespunzaton paametilo fomali cu valoi implicite, ill acest caz utilizandu-se valoile implicitc ale acestoa. Pentu ca la apel coespondents paametu actual - paametu fomal sa se execute coec, paametii eu valoi implicite sunt intotdcauna ultimii declaati in lista de paameti a functiei. Valoile implicite se specifica 0 singua data (fie in definitia funciei. fie in declaaia acesteia ; uzual sunt specificati in declaatie, deoaece compilatou1 valldeaza apelul de functie n confoniate cu declaatia acesteia). f (9) ; in acest caz se utilizcaza valoile implicite ale paametilo b i c si se afiscaza 9J.2. Sau 0 putem apela cu doi paameti : f (9,8) i in acest caz se utillzcaza valoaea implicita a paametu1ui c i se afiseaza 982. Sau 0 putem apela ell tei paameti : f (9,8,7) ; in acest caz nu se utilizeaza valoile implicite ale paamctijo si se afiseaza 987. Exemplu Un exenplu dcfunctie cu paameti implicit] pe cae l-ati utilizat deja este functia getline (), functie memba a clasei istean: Pototip : isteam & getline(signed cha*, int, cha = '\n') i Puncpa citeste caacteele de la intae si e plaseaza siul deseis de pimul paametu. Opeatia se temlna fie cand s-au extas atatea caacee cae specifics eel de-al doilea paametu, fie Ja intalniea macajului de sfasit, specificat de eel de-a! teilea paametu, Obsevati ca eel de-al tcilea paametu ae ca vatoac implicita caacteu1 newline (deci, implicit, citiea se tenina 1a sfasltul liniei) Supaincacaea functiilo Cea mai putenica facilitate intodusa de limbajul C efeito la functii consta in posibilitatea de supaincacae' a functiilo. Supaincacaea ofea pogamatoului posibilitatea de a defini mai multe functii cu acelasi nume, da cae difeii pin uumaul si/seu tipul paamctilo, Exemplu Definim 0 functie suna () cae calculcazll suma a doua nuuee integi : int suna (int a, int b) {etun a+bi} J. Tcmenul,.supaindicac" cstc 0 tuducce a tenucnului cngtczesc ovctoaaing, in uncle diqi puteti intaln i si tcmcnul "sllpadcfinic", ell acecasi scmnificatic.

12 22 PROGRAMAREA in LMBAJUL C/C ++ PENTRU LCEl] PROGRAMAREA ORJENTATA. PE OBECTE N C+ + '3 Putem supalncaca functia suna ( ), astfel iucat sa calculeze suma elementelo unui vecto: int suna (int * a, int nl fo (int i=o, 5=0; i<ni i++) s+=a[ij etun S Desi nu am discutat explicit despe aceasta, am folosit deja supaincacaea funcjtilo. De exemplu, functia get (), functie membu a clasei iste.am, este 0 functie supajncacata, avand umaoaele pototipui : Foma 1; Foma 2: Foma 3: Foma 4: Un apel de tipul : int get(); isteam& get (cha &); isteam& get (cha * int 19, cha = '\n'l isteam& get(steambuf &, cha =. '\n'}; Conpilatoul este eel cae selecteaza la apel functia adecvata 'in functie de ista paametilo acuali. in pimul and, se cauta 0 coespondenta exacta (0 functie pentu cae tipuile paametilo fonali sa coincida eu paametii actuali ai apelului espectiv). Daca nu este gas ita. 0 coespoudenta exacta, se fac convesii de tip implicite (de exemplu, tipul float este convetit a double;.cha este convetit la int etc.). in aces caz pot apaea ambiguitati (compilatoul nu poatc identifica in mod unic functia pe cae tebuie sa 0 apeleze). Exenplu Pobabil eel mai fecvent caz de ambiguitate apae din cauza functiei sqt ( ). in c+ + functia sqt () este supaincacata astfel : long double sqt(long double); float sqt{float); double sqt{douh1e) int Xi sqt tx )... va genea la compilae un mesaj de eoae, deoaece compilatoul nu stie la cae dinte eele tei tipui eale sa-! convctcasca pe x. Utilizaea functiilo supaincacate epezinta unul dinte cele mai impoante mecanisme ale pogamaii oientate object Constuctoii numeje constuctoilo coincide cu numele clasei ; in declaatia/definitia unui constucto NU se spectfica tipul ezultatului. a class poate avea mai multi constuctoi, pin supatncacae. Daca in cadul declaatiei clasei nu am specificat niciun constucto, compilatoul va genea automat un constucto implicit (constucto faa paameti). Pentu a putea cea obiece ale clasei, constucou tebuie sa fie publici.. Exenplu Yom completa dcclaajia clasei factie ell un constucto. astfel : class factie {pivate; int a; //numaato int bi //numito public: int GetNumaato{) { etun a; int GetNumito() {etun bi void SetNumito(int); void SetNunaato(int); void Sinplifica(}; factie(int x=o, int y=l) } ; Vom defini acest constucto in extenoul clasei astfel :.1; f ac t Le : : factie (int x,, { avx by; } #include <iosteam> #include "factie.h using namespace sto; int main () ( factie z. 2(5), int y) Obsevati ea am ales sa definim un singu constucto, cu valoi implicite (valoile inplicite le-an specificat la dec1aaea constuctoului). Pentu excmplificae, in functia main () a111 ceat tei obiecteale clasei (fl, 2, 3), in tei modui difeite : folosind constuctoul faa paameti pentu obieetul f 1 (n acest caz s-au folosu valoile implicite ale paametilo, adica f 1. cpcznna factia 0/1) ; folosind.constuctoul cu un singu paametu pentu obicctul :2 (in acest caz pcntu al doilea paametu s-a folosi valoaea implictta, dcci 2 epczlma facua 511) ; folosind constuctoul eli doi paameti pentu obiectul f3 (f3 epczina factia 8/12). f3(s,12); e- '-' e- u w Constuctofi sunt functi i membe ale clasci cae au caacteistici speciale : C se apeleaza automat la ceaea fiecann object al clasei ; cout<-:fl.getnumaato{)«'/'«fl.getnumito()«'\n' cout«f2.getnumaato()«'j'«f2.getnumito()«'\n' cout«f3.getnumaato()«'j'«f3.getnumito{)«'\n'

13 ,.,,..., 24 PROGRAMAREA in LlMBAJUL etc: ++ PENTRU L1CEU f3.sinplifica(); cout«f3. GetNumaa.to ()«/ '«3. GetNumito ()«\n' ; etun 0; Evident, executand aces! pogam, obtinen pe ecan : 0/1 5/1 8/12 2/3 Exemplu Clasa factie putea fi uilizata i fa,a a declaa un constucto. S-a fi gene at automat un constucto implicit si am fi puut utiliza clasa in madul pezentat la pima foma de dcclaae a clasei, Pentu a exemplifica sl 0 situatie in cae declaaea unui constucto este obligatoie, vom dec1aa sl ven implementa 0 clasa denumita mesaj. Datelc membu sunt lunginea mesajului i un vecto cae va contine caacteele mesajului. Pentu ea memoia alocata vectoului sa fie exact eea nccesaa, vom aloea dinamic memoie pemu mesaj. in concluzie, la eeaea unui obiect al clasei tebuie sa alocam dinamic memoia nccesaa (evident, consucoi). Declaatia clasei mesaj (stocata fisieul mesaj. h) va aata astfel: class mesaj { pivate: cha * si; int 19; public: mesaj (); mesaj (cha *); int GeLLg ( ) ; voi.d Sc:ie(); ) ; lconstucto faa paameti lconstucto supaincacat Declaatia estc incompleta, umand sa 0 completam 111 sectiunile umaoae. Obsevap ca am declaat doi constuctoi : un constucto flia paameti si unul cae pnmeste ca paamctu un si de caactee. n fisieul susa mesaj. cpp vom defini constucoii si functiile membe GetLg ( ) st Sci e () asfel : mesaj : : me s a j ( ) { 19=0; si=null; mesaj: :mesaj (cha * s) {int i; 19;=;stlen(s) /detemin lungimea siu1ui PROGRAMAREA ORENTA'fA PE OBlECTE in C+-si= new cha[lg); ialoc dinamic memoie pentu vectoul cae etine lcaacteele mesajului fo (i=o; i<lg; i-+) si[i]=s[ij lcopiez caactee1e mesajului ) int mesaj::getlg() { etun 19; void mesaj: :Scie() if (si) fo (int i=o; i<lg; i++) coutc c s L jij else Cout«"Mesajul es t e vid"; cout«' vn ' ; Pentu exemplificae, functia main () am ceat doua obiecte de tip mesaj ; pentu obiectul m1 am utilizat constuctoul taa paameti, ia pentu obiectul m2, constuctoul cae pimeste ca paametu un si de caactee : #include <iosteam> #include "mesaj.h" using namespace std; int main () { mesaj ml, m2 ( "Ana ae mee.") ; cout«m1.getlg()«' '; ml.scie() cou t c-emz. Get,Lg () -cc ' '; m2. Scie () etun OJ ) Executand acest pogam, se afiseaza pe ecan : o Mesajul este vid 13 Ana ae mee Destuctoul Destuctou este de asemenea 0 functie memba specials a unei clasc, datota caacteisticilo sale: este apelat automat Ja eliminaea viata a] obiecului sau, cazul opeatou delete) ; unui obiect al clasei obiectelo dinamice, (Ja ncheieea ciclului de atunci cand este util izat tebuie sa existe ; daca 111 cadul cjasci nil este explicit declaat un destucto, compilatoul geneeaza automat un destucto implicit; destuctoul nu poate fi supaincacat (ese unic) ; 25

14 '-' '6 PROGRAMAREA N LM3AJUL C/C+-+ PENTRU LJCEU PROGRAMAREA ORENTATA. PE OBECTE N C ae acelasi nume ca si clasa, pecedat de caacteul - ; nu ac agumente sl nici tip ezultat. Exemplu n clasa factie nu Yom dec1aa Ull destucto, pentu ca nu este necesa (conpilatoul va genea automat un destucto). Da, in clase mesaj, un destucto este obligatoiu, pentu ca aunci cand un obiect a1 clasei este eliminat, tebuie sa fie elibeata si memoia alocata dinamic pentu vectoul de caactee. Declaatia destuctoului in cadul dcclaatiei clasei va fi : -mesaj (); a definitia destuctoului in exteioul clasei va fi : mesaj : : -mesaj () [ delete si; //elibeez memoia alocata Modelullogic al vietii unui obiect Modelul logic al vietii unui obiect poate fi ilustat astfel : Exemplu Se ceeaza un.obiect Este apelat un constucto Obiectul,, taiete" Este apelat destuctoul n exemplul umato am declaat a clasa denumita fie t iv, ln cae am inclus un constucto, un destucto i -funetia memba Scie (). Toate cele tei functii membe nu fac decat sa afiseze pe ecan cate un mesaj cae ae olul de a evidentia momentul executiei functiei. Plsieul f i.ct i v. h : cl.ass fictiv ( publ.ic: fictiv() } ; -ficti-v() ; void Scie ( ) Fisieut fictiv.cpp: #include "fictiv.h" #include <iosteam> using namespace std; fictiv: :fictiv() lconstucto { cout«" Am ceat un obiect! \n" ; fictiv: :-fictiv() idestucto { c out.«-c " Am eliminat un obiect! \n" ; void fictiv: :Scie() { cout«"obieclul taieste!\n"; in fisieul main. cpp ilustam ciclul de viata al unui obiect in doua modui : in functia f () am declaat 0 vaiabila locale ob, de tip fietiv; acest obiect va fi ceat in momentul apelaii functiei f ( ), va "tai" pc duata executiei functiei f () si va fi eliminat la teminaea functiei f () ; in functia main () am declaat un pointe la un obiect de tip fictiv denumit p_ob, cu scopul de a etine adesa unui obiect alocat dinamic; la alocaea dinamica a obiectului se apeleaza automat constuctoul ; acest obiect va "taj" pana la elibeaea sa dinamica, folosind opeatoul delete. #include <iosteam> #include "fictiv.h" using namespace std; void f () {fietiv Obi cout«"suntem in functia f: "; ob.seie(}; int main () { f ( ) ; fictiv * p_ob=new fietiv; cout«,. Suntem in functia main: "; p_ob->scie ( ) delete p_..ob; etun 0; } Executand acest pogam,.pe ecan se va aflsa : Am ceac un obiecc! Suntem in functia f: Obieccul taiese! Am eliminat. un obiect! Am ceat un obiecl! Suntem in functia main: Obiectul taieste! Am eliminat un obiect! Obsevatie n functia mai n (), pentu a acccsa functia mcmbu Scie () a obiccwlui alocat dinamic, am utilizat opcatoul de selcctic indiccta -;'. intucat am acccsat obiccul..j -' w j

15 2R PROGRAMAREA N LJMBAJUL C/C++ PENTRU LlCELJ PROGRAMAREA ORENTATA PE QBlECTE in c t -+ :!9 indiect. p-iu intemediul pointeujui cae conlne adesa sa. Reamintim ca cfectul consuctiei p_ob->nembu este echivalent ell (*p_ob).membu. in concluzie, atunci cand membii unci clase sunt pointei cate zone de memoie ce umeaza sa fie alocate dinanic, constucoul de copiee geneal automat de compilato 11U cste suficicnt, tebuie sa definim explicit uu constucto de copiee.,.'-.., Constuctoul de copiee o alta funcie memba specials este coustuctoul de copiec. Coustuctoul de copiee se apeleaza automat oi de cntc o! este necesaa copieea unui obicct a] easel espective (de exemplu, Ja tansfeul unui obiect ca paametu sau czultat a unci functii, a ceaea un o obiecte tempoae). Gice class tebuie sa aiba un constucto de copiee. Daca nu este declaat explicit unul, compilatoul va genea automa un constucto de copiee implicit, cae ccpiaza obiectuj mcmbu ell membu. NumeJe constuctoului de copiee coincidccu numele clasei, nil ac tip ezultat, ia ca paametu ebuie sa pimeasca a efeinja la Ull obiect al clasci espective. numeclasa (numeclasa & Exemplu obci e c t.) j Sa evenim a clasa mesaj, pc cae 0 vom completa ell un constucto de ccplee. Declaatia constuctoului din cadul clasci mesaj va fi : mesaj (mesaj&) ; Definitia constuctoului de copiee din cxteioul clasei va fi : mesaj: :mesaj(mesaj& m) { int i; 19=m.lg; //copiez lunginea si=new cha[lg]j /aloc memoie penu vecto fo (i=o; i<lgj i+-) si[ij=m.si[ij; lcopiez caaceele din mesajul m in mesajul cuent Daca nu am fi declaat un constucto de copiee 111 clasa mesa j, compilatoul a fi geneat un constucto de copiee. Da acest constucto nu a fi functional coeet in acest caz, dcoaece unul dine membii clasei este un pointe, ia 110i nu mtenlonam sa copiem pointeul, ci coninutul zonei de menoie a caei adcsa se aoa in pointeul espcciv. Ca umae a copieii pointeului vo apaea doua poblemc : daca intentionan sa modificam zona de mcmoic a caci adcsa sc afla ill pointe pentu obicctul copie, va fi afectaa de fapt zona de menoie illdicat<l de poimeul din obiecml copiat (sunt doi pointei difeili, da cae indica acecai zona de memoie) ; cand obiectul copie este elimimn (ej fiind Ull obiect tcmpoa) estc apelat destuctoul; destuctoul va inccca sa elibeeze zona de mcl110ie alocau1 dinamic pentu obicctul copie; poimcul copie i painteuj.dill obiectul copial indidind 0 aceea;;i zona de mcl110ie, se cjibccaz3 0 zona de mcmoic cae nu n tcbui elibcaa Pointeul this in fiecae functie memba nestatica a unci clase este automat declaat un pointe constant, denumit this, cae ae ca valoae adesa obiectului cuent. Uneoi este necesa sa uilizam si noi explicit pointeul this. De exemplu, atune! cand 0 functie tebuie sa ctumezc ca czultat obicctul iususi : : ecun *this; Membii statici ai unei c1ase o clasa poate contine membi statici (date si functii). Din punct de vcdec sintactic, specific este faptul ca dcclaaca membilo staici este pecedata de cuvantul-cheie static. Refeiea 1a un membu static al unei clase din exteioul clasei se poate ealiza in doua modui : t NumeObiect.NumeMembuStatic NumeClasa: :NumeMembuScatic eel de-al doilea mod de efeie este posibil datot-ica faptului ca menb'ii statici sunt aceiasi pentu toate obiectele clasei (deci nu caacteizeaza un anumit obiect, c! meaga clasa). Datele membe statice Pentu datele mcmbe nestatice exlsta copii distinctc in fiecae obiect al clasei. Datee nembe statice au 0 valoae unica, comulla pentu eate obiectele clasei. Din acest motiv. datcle membe statice sunt supanumite vaiabilele ctasei, dcoaecc sc compots ca vaiabileje globale. Membii static! epeaima 0 solutie optima in cazul 111 cae ansamblul obiectelo clasei utilizeaza date 111 comun, deoaece : se educe numaul de vaiabile globale : se asociaza explicit datcle stalee eu 0 anumita clasa ; spe deosebie de vaiabilcle globale, in cazul membilo statici cste posibil comoluj accesului. Deoaecc pemu 0 data memhi:! statica sc asociaza 0 singua zonu de mcmoie pemu nteaga clasa, tehuie sa existc 0 dcfini\jc J datci mcmbc statiee ill afaa clasei. Sintaxa unci 3stfel de definilii este: l tip NumeClasa: : NumoMenb:o.-uStat:i.c;

16 30 PROGRAMAREA in LTMBAJUL C/C +-1 PENTRV LlCEU PROGRAMAREA ORENTATA. PE OBECTE in C La definie este posibila.!?i ininalizaea datei membe (implicit compijatoul va initializa ell 0 datele membe statice). Exemplu Pentu exenplificaea modului de functionae a unei date menbe statice, vom declaa 0 class flctiva denumita ExStatic astfej : class ExStatic { public: static int n; Ex.St.et.Lc () { n++; -ExStatic () { n--; } ; }; lconstucto }; ldestucto Clasa ExStatic ae 0 data memba statica (n). un constucto (cae incementcaza pe n la ceaea unui obiec) i un destucto (cae decementeaza pe n a eliminaea unui obiect). Sa utllizam aceasta class in difeic nodui : int ExStatic::n=O; void f () { ExStatic Obi cout «ob.n «' int main () {ExStatic aj cout«exstatic::n «' 'j ExStatic b[5]j cout «ExStatic::n «' ExStatic* c=new ExStaticj cout«a.n«' delete Cj cout «ExStatic::n «' ; f (); cout «ExStatic::n «'.. etun OJ Executand pogamul, se va afisa : Obsevajii //definie 8i initializae lise ceeaza obiectul local ob //scie 7 //ceez un obiect //scie 1 / /ceez un vecto eu.5 obiecte //scie 6 //ceez dinamic un obiect //scie 7 //elibeez dinamic obiectul c //scie 6 //apelez functia f //scie 6 1. La menbul static nne-am efeit in doua modun difeite (Ex S't a t aci en i pin inemediul unui obiect a. n sau ob. n). ndifeem de modul de efeie, vajoaea la cae De efeim este aceeasi. 2. Deflniea si inijializaea membului static n s-a ealiza in afaa clasei. 3. Datele stance exisa, chia daca nu exisa obiecte ale clasei espective. Functiile membe statice Functiile membe statice efecueaza opeatii cae nu sunt asociae obiectelo individuale, ci integii clase. Functlile membe statice se efes numai 1a date stance i nu.se pot efei la this (deoaece this este definit daa in cadul obiecelo, epezentand adesa obiectului cuent). Exemplu Pentu exempjificae, vom adapta clasa ftctiva peccdena EXStatic. Mai exact, ven tansfoma data mcnbu statica din membu public in membu pivat si vom adauga functii publice de acces (0 functie statica i a functie ncstatica). Vom adauga j 0 data membu nestatica, pentu a evidcntia potentiale eoi. class ExStatic {pivate: static int n; int m; public: ExStatic () { n++i }; //constucto -ExStatic () { n--; }; //destucto void Set (int a, int b) { n=ai m=bi static void Scie () {ccut.e cn-c c ' " J ) ; Pentu a afisa valoaea membului static pivat n, se va utilize functia statica Scie (). Aceasta functie acceseaza dea membul static n (fiind 0 funcpe staica). Functia Set este nestatica, deci poate accesa atat menbi static! cat i membi nestatici ai cjasei. int ExStatic::n=Oi void f () { EXStatic Obi ob.scie() i int main () {ExStatic aj ExStatic::Scie()i ExStatie b [5] ; ExStatic::Scie()i ExStatic* c=new ExStatici a.scie()i delete Ci ExStatic: :Scie()i f ) ; ExStatic: :Scie()i a.setlloo. 200); ExStatic: :Scie) ; etun 0 i //definiea datei membe statice //scie 7 //ceez un obiect //scie 1 //ceez un vecto eu 5 obiecte //scie 6 //ceez dinamic un obiect /scie 7 //scie 6 //sc::e 6 / /scie 100,.,-,' '--'

17 32 PROGRAMAREA N UMBAJUL C/C+-1 PENTRU L1CEli PROGRAMAREA ORENTATA PE OBECTE in Ci 33 Executand pogamul, se va afisa : Obsevatii 1. La functia stanca Scie () ne-am efe-it in doua modui difeite (ExSt.atic: :Scie() i pin intemediul unui object a.scie() sau ob. Scie ()). 0 functie memba nesatica se utllizeaza doa pin intemediul unui obiect. 2. Daca in functia Scie () am fl incecat sa afisam si valoaea membului nestatic m, am fi obtinut 0 eoae la compilae Specificatoul canst :-- Specificatoul const poate fi utilizat in difeite contexte, da efeetul este simila in oice context: elemenul asupa cauia actioneaza canst nu mai poate fi modificat ulteio.... Specificatou canst poate peceda declaaea paametijo functiilo ansmist, pin adesa (poinei sau efeinte) sub foma: -:, Specijicatoul cons t Specificatoul canst poatc f utilizat i Ja declaaee unui obiec. sub foma: t const NumeClasa NumeObiectj aplicat vaiabilelo Specificatoul const poate fi utilizat 1a declaaea vaiabllelo astfel : const tip va=valoae; Dep umae, valoaea vaiabilei va nu se poae modifica ulteio. Specijicatoul cons t aplicat paametilofuncjiilo : tip numefunctie (const tip& numepaametu,...); Dcpt umae, in inteloul functiei valoaea paametului espccnv nu poate fi modificata. Udlizand specificatoul canst, compilatoul veifies faptul ca valoile cae nu ebuie sa fie modificate nu vo fi modificate, ia pogamatoul este asiguat ca. pin apelaea funcjlei, valoaea paametului espectiv nu se modifica. Pin umae, ca egula geneala, intodeauna.este bine sa' utilizati canst penu un paametu de tip efcinta a caui valoae nu doiti sa fie modificata. Specijicatoul cons t aplicat obiectelo Ca umae, toti mcmbii dae ai obiectului nu mai pot f modificati. Din acest motiv, este obligatoiu ca la declaaea obiectului sa fie utilizat un constucto cae sa illitializeze toate datele membe. Obiectele dcclaatc const nil pot f asemenea const. Exemplu tausmise p-in efeinte cae nil sunt de Pentu exemplificae, vom cea 0 clasa fictiva, dcnunita Ex.Cois t;, cae ae 0 singua datil memba (x), un constucto cae initializeaza pe x, pecum i functii de acces 1a x : class ExConst {pubic: int Xj ExConst(int a=o} void ResetValue(} void SetValue(int y) int GetValue() canst } ; x - a; x. = 0; X :::: Yi etun X; Sa consideam obiectul ob declaat astfej : canst ExConst ob(7) i lconst'l.:lcto Umatoaele tei instuctiuni epezinta tentative i1egale de a mcdifica valoaea lui x, pin umae, vo genea eoi la compilae : ob.x = 5; ob.resetvalue(); ob.setvalue(5); Specificatoul cons t aplicat functiilo membe ale claselo Specificatoul const poate fi apltca functiilo membe ale claselo, mentionandu-l inediat dupa anteul functiei, atat in declaatia functiei : i tip NuneFunct;.ie (lista-paameti) const; cat i in definitia functici : tip NumeClasa: : NumeFunctie (lista-!)aameti) f {... } const Specificatoul canst asigua compilatoul ca functia nu va nodifica datele membe ale clasei. Cu obiectele declaate const se pot utilize dea functii declaate const. Constuctoii nu tebuie declaati c onet. ;! \; 'i :l i1, J 111, :'i l'i\ ::ii n ii'l' ;:1.;: ' M ',,! i:i; ;: ':! ' :i!

18 T 34 PROGRAMAREA N LMBAJUL C/C-t-'-j- PENTRU L1CEU PROGRAMAREA ORENTATA PE OBECTE N C Functiile fiend o functie fiend poate accesa membii pivate si potected ai clasei pentu cae functia este declaata fiend. Pot fi declaate fiend aat functi! obisnuite, cat si functii membe ale alta clase. Pentu a declaa faptul di 0 functie este functie pietena (fiend) a unci clase, tebuie sa includem in imeioul clasei declaatia funcjiei, pecedata de cuvantulcheie fiend. Functille fiend nefiind functii membe ale clasei, specificatoii de acces nu au niciun efect. Cuvantul-cheie fiend se specifica dea la declaatia functiei in inteioul clasei, nu si la definiea acesteia.,0 aceeasi functie poate fi funcpe fiend pentu mai mule clase si aceeast clasa poate avea mai multe functil fiend. Exemplu Pentu exempificae, vom declaa 0 clasa fictiva denumita ExvELed. in aceasta clasa vom declaa 0 data memba pivata x si doua functii de acces publice (Setx ( ).i Getx (). Functia nc este declaata functie pnecna a clasei EXFFiend. cj.ass ExFFiend {pivate: int X; pub1.ic: int Getx() { etun. x; } void Setx(int a) { x=aj} fiend void nc(exffiend &); ) ; Funcjia nc va incementa valoaea datei membu x. Acest ueu este po sibtl deoaece functia fiind declaaa fiend, ae acces si Ja memb'ii pivati ai casei. i void nc(exffiend & ob) { ob.x++j } Obsevati ca functiile pietene, nefiind fuuctii membe, tebuie sa pimeasca obiectul ca paametu. lata cum putem utiliza functia nc: ExFFiend a; a.setx(7) ; nc (al; cout«a.getx{); Evident, se va afisa pe ecan valoaea Clasele fiend in mod simila eu functiile fiend, puten decaa clase fiend. Pentu a declaa faptul ca 0 clasa A este pietena (fiend) eli 0 clasa B, Yom include in casa B 0 declaatie de foma: fiend c1.ass A; Ca umae, casa A va avea acces la membii pivate i potected ai clasei B. Cu alte euvime, toate functiile membe ale clasei A sunt pietene eu clasa B. Exemplu. Yom declaa 0 class A i 0 clasa B. Clasa A va fi declaata clasa pieena a clasei B. in clasa A se aflf 0 functie memba publica, denumita Suma () cae va accesa 0 datil membu pivata a elasei B. class B; class A {pivate: int y; public: A(int b=o) { y=b; void Suma (B &) ; }, j class B {pivate: int X; public: int Getx() { etun Xi } void Setx(int a) { x=a;} fiend class A; } ; void A: :Suma (B & ob) { ob.x+=y; } Obsevati ca am utilizat 0 declaatie fowad a clasei B tnainte de a decaa clasa A. Aceesa declaatte anunja compiatou ca exista clasa B i va fi definica ulteio. lata i un exemplu de utilizae a celo doug clase : A a (10) ; B b; b. Setx (7) ; a c Sume (b); c out.ccb. Cet x ( ) ; Evident, accasta sccventa de instuctiuni va aflsa pe ccan valoa ea 1'7. '-' 'u, ; c --J -' :-J -'

19 36 PROGRAMAREA N LMBAJUL C/C ++ PENTRU LCEU PROGRAMAREA ORJENTATA. PE OB1"'''-.,., _ l l ;" l!',_ - -t- ---< :::.7 --: -' ; i,, Supaincacaea opeatoilo Utilizaea opeatoilo supaincacati Supalncacaea opeatoilo este un concept simila ell supaincacaca functiilo. Pentu a supaincaca un opeato, vom defini 0 functie ell numele opeato simbal, unde opeato este un cuvant-cheie, ia simbal este simboluj asociat opeatoului. Pot fi supaincacati doa opeatoii existenti in limbajul C+ + si dea pentu a fi utilizati ell clase. Apoape toti opeatoii imbajului pot fi supaincacati, exceptiile fiind. (opeatoul de selectie diecta), * (opeatouj una de deefeentiee), :,: (opeatoul de ezolutie},?: (opeatoii conditionali) i opeatoul sizeof. Pin supaincacae, nici pioitatea, nici asociativitatea opeatoilo nu se schimba. Daca opeatouj de atibuie = nu este explicit supatncacat. compilatoul genceaza automat un opeato de atibuie cae va copia in obieeul din stanga opeatoului = valoile datelo membe din obieetuj aflat in deapta opeatoujui =. Opeatoii pot fi supaincacati fie ca functii membe ale clasei, fie ca funcjii fiend. Un opeato una poate fi supaincacat ca functie memba faa niciun paametu (el actionand asupa obiectului cuent) sau ca functie fiend cu W paametu. Un opeato bina poate fi supaincacat ca functie memba eu un singu paametu (pimul opeand fiind eonsideat obiectul cuent, ia al doilea opeand este paametul) sau ca funcpe fiend ell doi paameti. Opeatoii de atibuie (= += = *= /= %= A= &= 1= «=»=), opeatoul de selectie indiecta - > si opeatoul de indexae [] pot fi supaincacati doa ca functii membe ale clasei. Opeatoul de citie» si opeatoul de sciee «pot fi supaincacati doa ca functii pietene. Ceilalti opcatoi pot fi supaincacati fie ca functii membe, fie ca fuuctii pietene, da in geneal se espects unatoaele eguli : - opeatoii unai sunt supaincacat! ca funcpi nembe ; - opeatoii binai cae nu modifies niciunul dinte opeanzi sunt supaincacati ca functii pietene ; - un opeato bina cae modi fica unuj dinte opeanzi e pefeabil sa fie functie memba. Obsevatii 1. Cand supatncacam un opeato este bine ca pin aceasta sa mentinem semnificatia sa initiala, in caz conta, a fi mai bine sa definim 0 funqie memba cu un nume sugestiv cae sa ealizeze pelucaile doite. 2. Este bine sa venim in intampiuaea asteptatlo utilizatoilo. Mai exact, sa supalncacam toti opeatoii similai: daca am supaincacat opeatoii aitmetici sau pe biti,. supaincacan si opeatoii de atibuie compusi coespunzaoi (de exemplu, daca am supaincacat opeatoul +, supaindicam $i +=); daca supaindidim opeatoii elationali i de egalitate, ii supaincacam pe toti (i === i! =; i < i > i >== i <=); dadi supatncadim ++ i -- in foma pefixata, atullci ii supaineacam -5i in foma postfixata. Opeatoii supaincacati pot fi utilizati in doua modui (uzual, ca un opeato sau ca apel de functie). Pentu a explica, vom nota cu 0: un opeato una, eu b un opeato bina, ia ell ob si obl doua obiecte. Uzual, opeatoul una 0: poate fi utilizat in foma pcflxata cco'b. Doa opeatoii ++ si - - supaincacati pot fi utilizati si in foma postfixata (ob++ sau ob--). Opeatoul bina 13 poatc fi utilizat uzual ob il obl. Opeaton supalncacati pot fi utilize]! i pint-un apel de functie. Daca opeatoii sunt functii membe ale clasei, apelul se va ealiza astfel: ob. opeato 0: ( ), espectiv ob. opeato 13 (obl). Daca opeatoii sunt functii pietene ale clasei, atunci apelul functiei se ealizeaza astfel: opeato ex (ob) sau opeato il lob, ob2). Exemplul 1. Supaincdcaea opeatoilo ca functii membe pentu clasa mesaj Peutu a exemplifica supaincacaea opeatoilo ca functii membe vom elua clasa mesaj, pezentata 1a inceputul accstui capitol, si ven supaincaca umatoii 'opeaton pentu aceasta : opeatoul una - (cae va invesa mcsajul) opeatoul de atibuie == opeatoul + (cae va avea olul de a concatena doua mesaje, obtinand ezujatuj int-un alt mesaj) opeatoul +== (cae va concatena doua mesaje, obtinand czultatul in pinul dinte acestea) opeatoul == (cae vcifica daca doua mesaje sunt egale) opeatoul : == (cae veifica daca doua mesaje sunt difcitc) opeatoul de indexae [) Declaatia clasei mesaj (in fisieul mesaj. h) c1ass mesaj { pivate: cha "* si; int 19; public: mes a j () ; mesaj (cha "*) -mesaj () ; mesaj (mesaj&) ; int Get,g () ; void Scie(); //constucto faa paaneti //constucto supaincaca //destucto / /co:nstuct:o de copieye

20 38 PROGRAMAREA N LMBAJUL C/C++ PENTRU LlCEU vod Majuscule() i /opea.toi' supaincacati mesaj opeato-(); nesaj& opeato=(const mesaj &}; canst mesaj opeatoy+(const mesaj&) canst; canst mesaj& opeato+=(const mesaj&) i boel opeato ==(const mesaj&) canst; inline boal opeato!=(const mesaj&) canst; cha opeato[] (canst int) const; ) ; mplementaea opeatoilo ca functii membe (in fisieul mesaj. cpp) Definiea opeatoului una - : mesaj mesaj: :opeato-() {int st, d; cha aux; fo (st=o, d=lg-l; st<d; st++, d--) {aux=si[st]; si[st]=si[d]; si[d]=aux; etun *this; i ) Opeatoul - poate fi utilizat oa in foma pefixata, De exemplu : mesaj m("12345abc"1 -m; m. scie () ; Executand aceasta secventa de instuctiuni, pe ecau se va afisa : CBA54321 Ca apel de functie, opeatoul - a putca fi utilizat (eu acelasi efect) astfel: m.opeato-() ; Definiea opeatoului de atibuie = : mesaj& mesaj: :opeato=(const mesaj & m) ( lveificam daca este autoatibuie if {this == &m} etun *this; lelibeam eventuala zona de menoie alocata deja if (si) delete si; ialocam 0 naua zona de memoie pentu obiectul cuent si = new cha[m.lg]; lcopiem in obiectul cuent obiectul m 19=m.lg; fo (int i=oi i<19;.1.++) si[i]=m.si[i] etun *this; PROGRAMAREP. ORENTATA PE OBlECTE N C Opeatoul de atibuie poatc fi supaincacat doa ca functie memba si pooipul sall va fi intotdeauna : NumeClasa& NumeClasa: :opeato=(const NumeClasa &}i Obsevati ca tipul ezultatului este 0 efeinta la un obiect al clasei, Acest lucu este necesa pentu a putea utiliza opeatoul de atibuie in mod inlantuit, sub foma: obleobz>... e obk, Din acest motiv, functia tebuie sa etuneze la final obiecul cuent (etun *this;). Deoaece pentu clasa nesaj constuctoii aloca dinamic memoie, ia destuctoul elibeeaza dinamie memoia alocata, mai sunt doua aspecte la cae tebuie sa acodam atentie cand implementam opeatoul de atibuie. Un pim aspect consul in alocaea memoiei pentu ezultat. Rezultatul tebuie sa fie stocat in obiectul cuent, cae ese posibil sa aiba deja memoie alocata. De aceea, tebuiemaiintaisaelibeammemoiadejaalocata.sa alocam 0 alta zona de memoie, suficienta pentu a etine ezultatul atibuiii, apoi sa ealizan copieea. eel de-al doilea aspect se cfea la atibuiile de foma obe ob. Accasta este 0 at-ibuie legala s! opeatoul nostu a tebui sa functioneze. Da acest caz tebuic atat sepaat (if (this == &m) etun *this;); in caz conta, vom elibea memoia alocata obiectului cuent (cae de data aceasta coincide eu obicctul cae se copiaza si, dept umae, obiectul de copiat va fi distus). Definiea opeatoului de concatenae + : const mesaj mesaj::opeato+(const mesaj& m) const (mesaj temp; int ii 'temp.lg=lg+m.1g; temp.si=new cha [temp.lg]i fo (i=o; i<lg; i++) temp.si[i]=si[i] fo (i=o; i<m.lg; i++) temp.si[i+lg]=m.si[i]; etun temp; Obsevati ca am ceat un obiect tempoa temp in cae constuim ezultatul concatenaii ; mai intai alocam dinamic memoia necesaa, apoi copiem caacteele din mesajul cuent, apoi in continuae caactcele din mesajul tansmis ca paametu. La final eunam ca ezultat obiectul tempoa. Explicatii suplimentae sunt necesae efeito la utilizaea specificatoului canst. Aplicat paametului (const mesaj & m), indica fapul ca opeatou! nu modiflca paametul m, tansmis pin efeinta. Aplicat opeatoului (canst dupa antet) indica faptul ca functia nu modiflca datele membe ale obiectului cuent. Aplicat ezultatului functie! (const mesaj), inpiedica scieea uno constuctii ciudate de tipul : ml +m2 =m3. Opeatoul + poate fi utilizat, de exemplu, astfel ; meaj m: ml ( "Ana, mo-ml+ffil" mo.scie{) " }, m2 ( "ae mee"),,, '. i, ',

21 -,, 40 l'rogramarea in UMBAJlJL CC++ PENTRU LCEU PROGRAMAREA ORENTATA PE OBECTE N C Dupa executia acesto instuctiuni, pe ecan se va afisa : Ana e mee Ca ape de functie, opeatoul poate f ytilizat (ell acelasi efect) si astfel : mo=nl. opeato + (n2) i Opeatoul + poate f utilizat i astfel : mesaj no, ml ("Ana"); mo=ml+" ae mee" i mo.scie() ; La 0 astfej de utilizae, se calizeaza 0 convesie impliclta. Siul de caactee "ae mee" este convetit int-un obiec tempoal', pin apelaea automata a constuetoului coespunzato. Da - atentie! - aceasta convesie este posibila deoaece exisa un constucto cae ceeaza un obiect de tip mesaj pe baza unui si de caactee. Pactic, constuctia ml+"ae mee" este echivalenta ell ml+mesaj ("ae mee"). [nsa 0 utilizae de foma: mo=" ae ne-e vs-m : este ilegala $i va genea 0 eoae la compilae. nplementand opeatoul + ca functie memba, el nu mai este conutativ, pimul sau opeand fiind obligatoiu un obiect. Din acest motiv, este eccmandabil ca opeatoul + sa fie inplementai ca functie pietena, Definiea opeaoului de atibuie compus += : const nesaj& mesaj: :opeato+=(const mesaj& m) {mesaj temp; int i; temp.lg=lg+m..lg; temp.si=new cha [temp.lgji fo (i=o; i<lg; i++) temp.si[i]=si[i]; fo (i=o; i<m:lg; i++) temp.si[i+lg]=m.si[i]; *this=temp; etun * this ; ) Difeenta dinte opeatoul + si opeatouj += consta in faptul ca ezultatul concacnaf tebuie sa fie plasat n obiectul cuent. Din nou, pentu a putea utiliza acest opeato lnlantuit, am eunat 0 efeninja la ezultat (etun * this;). Functia modifica obiectul cuent, din acest motiv nu apae specificatoul canst dupa antetul functiei. Obsevatie in cazul opeatouiui +, tipul ezultatului este un obiect. Retunaea unei copii a obicctului ezultat este obligatoie, deoaece ezultaul a fast obtinut int-o vaiabila locala, cae s-a f distus la iesiea din functie. n cazul opeatouiui +=, tipul ezultatului este 0 efeinja la un obiec. Nu a fost necesaa copieea obiectului. dcoaece ezultatul se afla in obiectul cuent, cae nu este distus Ja temiuaea executiei functiei, dec! a fost suficienta tansmiteea ca ezulta a unei cfeinte a obiectul cuent (mai eficient). Un exempju de utilizac a opeatoului += : me s a j no ( "ana" ), ml (" ae mee"), m2 (" bune"); mo+=ml+='m2 ; mo.scie() ; nil.scie(); Asociativitatea opeatoilo de atibuie este de la deapta la stanga. Pin umae, nai intai se concateneaza m2 la ml, apoi noul nj. a mo. Dupa cxecutaea atibuiijo, pe ecan se va aflsa :. ana ae mee bune ae mee bune Definiea opeatou1ui de egalitate =-= : baal mesaj: :opeata ==(const mesaj& m) const {int i; if (lg!=m.lg) etun false; fo (i=o; i<lg && si[ij==m.si[i); i++) etun (i=-==lg) Pentu ca doua mesaje sa fie consideate egale, elc tebuie sa contina exact aceleasi caactee. Definiea opeatoului de inegalitate! 0:: inline bool mesaj: :apeata!=(const mesaj& m) { etun (*this == m) const Obsevati ca pentu a implementa opeatoul!:= am util izat opeatoul eficienta, am dec1aat opeatoul! = dept functie inline. Definiea opeatoului de indexae [J : cha mesaj: :apeata[] (canst int paz) const { etun si (paz] ; ) Odata supaincacat opeatoul de indexae, putem accesa oice caaete din vectoul de caactee din mesaj : mesaj no ( "ana.poda" ) caut«mo [3 J ; Pentu Pe ecan se va afisa litea p. Da oice incecae de a modifies un caacte din vecto va genea eoae la compilae.

22 42 PROGRAMAREA TN LMBATUL CC ++ PENTRLJ L1CEU PROGRAMAREA ORJENTATA PE OBECTE in C+- Exemplul2. Supaincacaea opeatoilo pentu clasa factie Pentu a exemplifica supaincacaea opeatoilo ca funcjii fiend vom elua clasa factie, adaugand declaanl fiend pentu umaoli opeato! : opeatoul >- una (schimba semnul algebic a] actiei) opeatoi aitmetici (+, -, *, /) opeatoi de atfbuie compusl ell opeatoii aitnetici (+=, -= -;;= 1=) opeato! de egalitate (==,! =) opeato! elationali «, >, -ce, >=) opeaoul de citie» opeatoul de afisae < De asenenea, vom supaincaca dept funcjil membe ale clasei opeacii de incementae/decementae, in foma pefixata i in foma postfixata (++, ---), pecum i opeatoul de convesie explicita din factie ill numa eal de tip double. Nu vom supaincaca opeaoul de atibuie =, intucat acesta va fi automat supaincacat (ealizandu-se copieea membu eu membu, ceea ce este suficient in acest caz). Declaaea clasei factie class factie {pivate: int a; int b; public: int GetNumaato() { etun a; int GetNumito() {etun b void SetNumito(int); void SetNumaato(int)j void Simplifica()j factie(int xo, int y=lj inumaato inumito lconstuctoul clasei lopeatoi aitnetici fiend factie opeato-(const (actie &) fiend factie opeato+(const factie &, fiend factie opeato-(const factie &, fiend factie opeato*(canst factie &, fiend factie opeato/(const factie &, lopeatoii de atibuie compusi fiend factie& opeato+=(factie &, fiend factie& opeato-(factie&, fiend factie& opeato*=(factie &, fiend factie& opeato/=(faclie &, lopeatoii de egalitate fiend bool opeato==(canst factie &, fiend boo1 opeato!=(canst actfe &, lopeatoii elationali canst canst canst canst const canst canst canst fact e fact e fact e fact e factie factie factie factie &) ; &) ; &) ; &) ; canst f.a c t Le &) j const factie &,) j &) &) &) &) ; fiend bool opeato«const factie &, const factie &); fiend bool opeato>(const factie &, canst factie &); fiend bool opeato<=(canst factie &, canst factie &) fiend boo1 opeato>=(const factie &, canst factie &) lopeatoii de citie si sciee fiend isteam & opeato»(isteam &, fiend osteam & opeato«(osteam &, factie &); canst factie &) lopeatoi supaincacati ca functii membe factie& opeato++(); lfoma pefixata factie ope -a t o -e--i-(int fictiv); foma postfixata factie& opeato--(); lfoma pefixata factie opeato--(int fictiv}; foma postfixaa opeato double(} } ; Definijiile opeatoilo supaincdcati Opeatoul - una etuneaza a factie ell semnul algebic schimbat. Atentie! Obieetul tansmis ca paametu nu tebuie sa se modifice l Pin umae utilizilm un obiect de tip factie tempoa in cae constuim factia cu semn -...J schlmbat i etunam acest obiect ca ezultat. Rezulaul functiei este de tip factie si nu factie & (efcinta), deoaece este necesaa copieea obiectului tenpoa cae conune ezultatul (la teminaea executiei funcpei obiecul tempoa este distus si tansmiteea unei efeinte cate acesta nu a avea -sens). factie opeato-(const factie & f) ( factie temp(-f.a,f.b) j etun temp; } const; /convesie explicita a double Opeaoii aimetici inplementeaza opeatiile cu factii binecunoscute de la matematica : al a2 al. b2 + bl. a = --_,:-,:- bl b2 bl a2 al a2 al. b2 - bl. a2 ---= bj b2 bj a2 al a2 alaz _._=-- bj b2 bl b2 aj a2 aj. b2 bl : b2 = bl. a2 Toti cei patu opeatoi pimesc dept paamcti doua obiecte de tip f.a c t i Eo: (cae nu se modifica, de aceea este utilizat specificaioul canst), calculeaza in-o vaiabihi tcnpoaa ez ezultaul opeatiei, shnpl iflca factia czulaa si etuneaza ez " c...

23 44 PROGRAMAREA N LlMBi\JUL etc ++ PENTRU LlCEU,,.,. EA ORlENTATA. PE OBECTE in C+-j ca czultat aj functiei. Justificaea faptului ca opeato» aitmetici etuncaza un obiect ca ezultat, nu 0 efelita la acesta, este aceeasi ca in cazul opeatoului una -. factie opeato+(const factie &f1, {factie ez; ez.a=fl.a*f2.b+fl.b*f2.ai ez.b=fl.b*f2.b; ez. Simplifica () etun ez; canst iactie &[2) fl. Simplifica () etun 1; factie& opeato*=(factie & fl, const factie & f2} {f1.a=f1.a*f2.a; fl. bv f L. b*f2. b; fl. Simplifica () etun fl; -' iaetie opeato-(const factie & f1, const factie & 2) {factie '-ez : ez.a=fl.a*f2.b-fl.b*f2.a; ez.b=fl.b*f2.b; ez. Simplifica () etun ez; factie& opeato/=(factie & fl, const factie & 2) {f1.a=f1.a*f2.b; fl.b=fl.b*f2. a; fl.simplifica(); etun fl; factie opeato*(const factie & fl, const factie & f2) {factie ez; ez.a=fl.a*f2.a; ez.b=fl.b*f2.b; ez. Simplifica () etun ez; factie opeato/(const factie & fl, canst factie & 2) {factie ezi ez.a=fl.a*f2.bi ez.b=fl.b*f2.a; ez. Simplifica () etun -ez : Opeatoii de atibuie compusi eu opeatoi aitmctici sunt similai opeaotlo aitmetici, numai ca in aces caz ezultatul se obtine in pinul paametu (acosta nu mai ae specificatoul ccnst. deoaece se modifica). Rezultatul etunat este 0 i efeinta la pimul paameu, pentu a putca utiliza opeatoii de atibuie lnlantuit. factie& opeato+=(factie &f1, {fl.a=f1.a*f2.b+fl.b*f2.a; fl.b=fl.b*f2.b; fl. Simplifica () etun 1; factie& opeato-(factie &f2, (fl.a 1.a+f2.b-fl.b* 2.a; f1.b:::-fl.b*f2.b; const factie &f2) const factie & 2) Opeatoii de egalitate si opeatoii elationali pimesc ca paameti efeinte la doua obiccte de tip factie (cae nu se modifica, din acest motiv am utilizat specificatoul const) i euneaza un ezultat logic (tue daca elatia este indeplinita si false n caz conta). Obsevati ca in implementaea opeatoilo > i '>= am utilizat opeaoul deja definit <, ta pentu a implemema opeatoul <= am utilizat opeatoul deja definit >. bool opeato==(const factie & fl, const factie & 2) { etun fl.a*f2.b-fl.b*f2.a==o; } bool opeato!=(const factie & f+, const factie & f2) { etun fl.a*f2.b-f1.b*f2.a; } bool opeato«const factie &f1, canst factie &, 2) { etun fl.a*f2.b<f1.b*f2.a; } bool opeato> (const factie & fl, const factie & 2) { etun 2<fl; } bool opeato<= (const" factie & 1, canst factie &f2) { etun! (f1> 2); } boo1 opeato>=(const factie & 1, const factie &f2) { etun! ( 1< 2); } Opeatoul de cme» poate fi supaincacat pentu a chi nuuaatoul i numitoul unei factii. Acest opeato ae intotdeauna doi paameti: 0 cfemta la un obiect de tip isteam (fiuxul de intae) i 0 efeinta a obiectul cae va f citit. Ambii paameti sc modifica in uma citiii. Rezultatu] este de tip a s t.z-eams, (efeinta la fluxul de intae), pentu a putea utiliza inlantuit acest opeato.

24 , 46 PROGRAMAREA in LMBAJUL CC++ PENTRU LCEU PROGRAMAREA ORENTATA PE OBECTE in C Opeatoul de sctce «va fl supaincacat in mod simila, pentu a afisa factia int-un mod convenabi. Aces opeato ae tntodeauua doi paameti : efeina cae fluxul de lesie (osteam&) si efeinta 1a obiectul cae se afiseaza (acesta nu se modifica). Rezultatul este de tip osteam& (se euncaza fluxul de iesie), pentu a putea utiliza inlantuit acest opeato. osteam & opeato«(osteam &out, ( out«f.a«'/'«f.b; etun out; ) Opeatoul de incementae in foma pefixata va mal ell 1 valoaea factiei din obiectul cuent i va etuna 0 cfeinja la obiecul cuent, cae etine factia incementata : factie& factie::opeato++{) ( a+=bj etun *this; const factie '&f) lfoma pefixata Pentu a exemplifica modul de funcjionae a opeatoului + + in foma pefixata, sa analizam umatoul exempju :, factie fo, f1(3,4)j 0=++f1; : c out c-c f O.<«" "«1; 1 isteam & opeato»{is:eam & in, factie & f) {.i.nc-c-f.a»f.b; etun in; ) in.mod simila se implcmenteaza si opeatoul de dccemenae pefixata : factie& f -a c t Le: : opeato-- () ( a-=bj etun *this; lfoma pefixata in foma Se maeste mai intai eu 1 valoaea factiei memoate in obiectul 1 (3 14), apoi aceasta valoae se atibuie vaiabilei f 0, Ca umae, pe ecan se va afisa : Opeatoul de incememae in foma pcsfixata ebuie sa adune 1 ia facjia din obiectul cuen, da tebuie sa etuneze ca ezultat factia dinainte de modificae. Pill umae, este necesaa 0 vaiabila locala temp in cae se etine factia cuenta inainte de modificac. se incementeaza factia cuenta, apoi se euneaza ea ezultat factia memcata in temp. Pentu a face distincjia inte.foma pefixata &i foma posfixata. in foma postfixata se tansmite un paametu suplimenta de tip int factie factie: :opeato++(int fictiv) foma postfixata (fict Lv), cae nu ese utilizat. Pe ecan se va afisa : 3 14"" ( ) factie temp(a,b) ++ (*this); etun tempi" Sa exemplificam modul de fuucponae a acesui opeato: fact.ie fo, f1(3,4) fo= l++j cout«fo«" "<x f L j Pe ecan se va afisa 3/4 '714 deoaece 1 este incementat, da lui fa i se aibuie valoaea dinaintea inccmentan. in mod simila se implementeaza opeatoul de decementae in foma postfixata : factie factie: :opeato--(int fictivl foma postfixata { factie temp{a,bl --(*this)j etun tempi Obsevati di la implementae am utilizat opeatoul ++, espectiv -- in foma pefixata, deja definit. Analizand compaativ cele doua implementat (pentu foma pefixata i pentu cea postfixata), deducem ca foma peflxata este mai eficicnta. Pin unae, atunci cand putem utilize oicae dinte cele doua fome, este convenabij sa alegem foma pefixaa. Aceasta obsevatie este geneal valabila. Am. vazut in exemplul pecedent (clasa mesaj) ca se calizeaza convesll implicite de a un tip pedefinit aj inbajului cate un obiect, utilizandu-se constuctoii definiti ai cjasei. Pentu a ealiza tnsa convesii "de la un obiect al clasei cate un ip pedefinit a1 limbajului tebuie sa supaincacilm opeatoi de convcsic cxplicita (cast). Opeatoii de convesie explicita au 0 scie de paticulaitati : - au ca nume un tip; - nu au tip ezultat (acesta fiind implicit acel asi eli numele opeatoului) - nu au paaneti ; tebuie sa fie functii membe ale clasei. Vom implementa ea functie memba un opeato de eonvesie explicua, cae ansfoma U11 object de tip factie 11t-u11 numa eal de tip double: factie: :opeato doublet) const { etun (double) al bj ) Un exemplu de utilizac a acestui opeato: factie 1(3,4) i cout«f1«"="«(double)f1i w -'! :,,!,

25 48 PROGRAMAREA in LlMBAJUL CC++ PENTRU LCEU PROGRAMAREA ORJENTATA PE GaJEeTE in C+ + 49,. -' Tataea eoilo La scoaja nvatam di "dateje de intae sum coecte", pin unae. nu este necesa sa validam ca datele de intae especta cstnculle poblemei. Din pacate, in ealitate nu e deloe 3$3. De cxemplu, daca lucan la 0 aplicatietn cae utilizatoul tebuie sa intoduca numaul de telefon, chia daca i explicati pint-un nesaj cum tebuie sa intoduca numaul de telefon, ii ofeiti chia si un exemplu, este extem de pobabil sa existe utilizatoi cae sa inoduca numaul de telefon in cele mai vaiate modui: 0740-J sau sau sau oicum altcumva. in viata eala ebuie sa validam datele i sa ne asiguam ca.sunt espectate esticdile necesae unci bune functionai a aplicatiei. Daca doim sa citim dint-un fisie, tebuie sa ne asiguam ca fisieul exista ; daca doim sa citin un numa pozitiv, tebuie sa ne asiguam ca utilizatoul a intodus un numa i ca numaul este pozitiv etc. Astfel de eoi, cae pot apaea in timpul executiei unui pogam, sun denumite de pogamatoi cxccptti (deoaece acestea sunt cazui paticulae, ce nu a tebui sa apaa in mod nomal). a vaiana posibila de tatae a eoilo a aata astfel : secventa de instuctiuni 1; daca a apaut 0 eoae atunci tateaza eoaea 1 altfel secventa de instuctiuni 2; daca a apaut 0 eoae, tateaza eoaea 2 a astfel de abodae este posibila, da neecomandabila. Codul devine exten de stufos, geu de inteles, geu de intcjinut, deoaece codul de executat este intejesu cu codul de atae a eoilo. Expeienja pogamatoilo POO econanda 0 abodae difeia in tataea eoflc : codul de executat tebuie sa fie sepaat de codul de tatae a eoilo. Cand se identlflca 0 eoae se "aunea" (thow) 0 valoae coespunzatoae coii espective. "Auncaea" unei valoi pentu 0 exceptio se ealizeaza astfel : i thow (valoae_except;:ie) ; Valoaea "auneata" pentu 0 exccpjie poate fi de oice tip (numa, i de eaaetee). De exenplu, sa seiem 0 fuuctle cae citeste nunaul de telefon a1 unui utilizato : int NTelefon ( ) {int 19, i; cha s(100j; cout«"ntoduceti numaul de telefon! "; cin»s; Lqvs t.-leij s) i if lg!do) thow("n invalid: tebuie sa cantina 10 cife!"); if (s[oj!'o') thow{"n invalid: pima cifa tebuie sa fie 0"); fo (i=o; i<lg; i++) if (! s[ij>'o' && s[ij<'9')) thaw( "N invalid: tebuie sa cantina doa cife"); etun atoi (s) ; Obsevati ca 1a cmea numaului de telefon identificam eoile posibile si "auneam" 0 cxccptie pentu fiecae dinte ele. Valoaea auncata este de fiecae data un si de caactee, contiuand un mesaj specific. Ese posibil ca valoile "auneate" sa fie de tip ui difeite. Cand se "aundi" 0 exceptie, executia pogamului este automat inteupa. Pentu a evita acest lucu, tebuie sa "captumn" eoile. in acest seop, aunci cand 0 secventa de cod este susceptibila sa geneeze eoi, ea va fi "inceeata", adica va fi inclusa int-un bloc ty, astfel: ty { secventa de instuctiuni de executat } Acolade1e sum obligatoii inbloeul ty, ehia daca secventa consta dint-o slngua instuctiune. Dupa bloeul ty putem eaptua eoile ell ajutoul unui blocuilo catch. Dupa ty tebuie sa apaa un bloc.cetch pentu fieeae tip de eoae "auncatii". Sintaxa unui bloc catch este : catch (tip valoae) { secventa de instuct;:iune cae se executa daca este captuata 0 eoae De exemplu, iata 0 incecae de a citi un numa de telefon, utilizand funcua NTelefon () pccedenta : int nt; ty ( nt=ntelefon(); } catch (canst cha * s) { cout«"eoae 1a intoduceea numaului de telefon: "; cout«s«' vn ' ; Daca secvema de instuctluni de executat aunca eol de tipui difeite, atunci tebuie sa exise 0 scctiunc catch pentu fiecae tip de eoae. n acest eaz, toae eoile auncateau fost de acelasi tip (si de caactee), deci a fast ncccsaa doa 0 singua sectiune catch pentu a captua eoaea.

26 50 PROGRAMAREA N LMBAJUL C/C++ PENTRU LCEU Dace exista mai multe sectiuni catch, atunci ele.sunt pacuse in odine, pana se identifidi pima sectiune pentu cae tipu paametului coespunde ell tipul coii "auncate". De exemplu, vom face 0 functie de citie a vastei, cae "aundi" eoi de tipui difeite (un si de caactee, daca vasta nu este numeica, espectiv un numa integ epezentand vasta, daca vasta nu este in intevalul [18, 99] ) : int Vasta () {int V, ij cha 5[100J; cout«"ntoduceti vasta! (0-99)"; cin»s; fo (i=o; s j aj, i++) if (! (s [i) >= '0' && s l L J <=' 9 ' ) ) thow ("Vasta tebuie sa cantina doa c Lf -ev ) v=atoi (5); if (v<18 v>99) thow (v) ; etun Vi Putem "lnceca" Sa citim vasta astfel : int V; ty ( v=vasta () i } catch (canst cha * s) ( CQut«"A apaut 0 eoae la intoduceea vastei:... couu-c-es e \n ; ) catch (canst int val) ( cout«"pentu pemis vasta este inte 18 $i 99 ani, nu ". cout«val«" ani \n" j ) Obsevati ca s-a utilizat 0 'sectiune catch ell paametul sl de caactee i 0 sectiune catch ell paametul numa integ. Exista posibilitateade a utiliza si 0 sectiune catch implicita, aceasta se plaseaza ultima si se va executa daca niciuna dinte sectiunile catch pecedente nu se "potive te" ell eoaea "auncata". Secjiunea catch lmplicita nu ae paanetu inte paanteze, ci puncte de suspensie: catch (... ).! PROGRAMAREA ORENTATA PE OBECTE N C Aplicatie, Numee natuale mai Datele membe Vom poiecta 0 clasa denumita Bignt pentu ucu cu numee natuale mai seise in baza 10. Numaul maxim de cife ale numaului va fi 0 constanta simbolica LGMAX, defiuita in fisieul antet bigint. h. Von epezenta un numa mae ca un vecto cife, in cae vom etine cifele numaului incepand ell unitatile (in acest mod, pozitia cifei in vecto va coincide eu pueea coespunzatoae a bazei). Ven etine de asemenea i numaul de cife in data memba g. Functiile membe Constuctoi Vom implementa: -: un constucto cae constuieste un numa mae pe baza unui numa mic (numa ce poate fi memoat int-o vaiabila de tip int); acest constucto va pimi un paametu de tip int, paametu cae ae valoaea implicita 0; - un constucto cae va constui un numa mae pe baza unui numa memoat int-un si de caactee ; - un constucto de copiee. Constuctoii vo initializa vectoul de cife cuo, pentu a usua implementaea opeatoilo. Destucto Nu este necesa sa implementam un destucto, compilatoul va genea automat un destucto. Opeatoi Yom implementa ca functii membe opeatoul de atibuie, opeatoul de indexae, opeatoii de incementae si dccementae (in foma peflxata si n foma pefixata) si opeatoi de convesie dint-un numa mae int-un numa mic (de tip int sau long long int). Ca functi! pietene ale clasei vom inplementa opeatoii aitmetici, opeatoii de atibuie compusi eu opeatoii aitmetici, opeatoi elationali, opeatoi de egalitate, opea toi de citie/sciee.!,,,

27 52 PROGRAMAREA in LMBAJUL C/C ++ PENTRU LlCEU PROGRAMAREA ORENTATA PE OBECTE N C ' i, -e- -- Declaatia clasei Bignt #define LGMAX 1000 class Biglnt { pivate: cha cife[lgmax]i,int 19; //vectoul de cife /lunginea numaului publ.ic: /constuctoi Biglnt (int n=o); /constucto cae ceeaza numaul mae dint-un n. int Biglnt(const cha * 5) i //constucto cae ceaza numaul mae dint-un si Biglnt(Biglnt&) ; /constuctoul de copiee int GetLg{) { etun 19; } fiend bool eo(const Biglnt &); //opeatoul de atibuie Bignt& opeato = (canst Biglnt &) //opeato de indexae int opeato [J (canst int) canst; Biglnt& opeato++(}j Biglnt opeato++(int Biglnt& opeato--(}i Biglnt opeato--(int //foma pefixata fictiv}; foma postfixata lfoma pefixata fietiv); foma postfixata fiend Biglnt opeato +(const Biglnt &, const Biglnt &) fiend Biglnt& opeato +=(Biglnt &, const Biglnt &) i fiend Bignt opeato -(const BJglnt &, const Bign &) fiend Bignt& opeato -=(Biglnt &, cnst Biglnt &); fiend Biglnt opeao * (const Biglnt &, canst Biglnt &) fiend Biglnt& opeato =(Bignt &, const Biglnt ) i fiend Biglnt opeato (const Biglnt &, const Biglnt &) fiend Biglnt& opeato 1=(Biglnt &, const Biglnt &); fiend Biglnt opeato %(const Biglnt &, const Biglnt &); fiend Biglnt& opeato %={Biglnt &, const Biglnt &}; lopeatoi de egalitate fiend bool opeato == (const Biglnt &, const Biglnt &) } ; fiend boo1 opeato!= (canst Biglnt &, canst Biglnt &) lopeatoi elationali fiend boo1 opeato < (canst Biglnt &, canst Biglnt &); fiend beel opeato <= (const Biglnt &, canst Bignt &) fiend beol opeato> (canst Bignt &, canst Biglnt &); fiend boo1 opeato >= (const Bignt &, canst Bignt &) lopeatoi de citie/seiee fiend osteam & opeato «(osteam &, fiend isteam & opeato»(isteam &, Definitiile functiilo Constuctoi Biglnt:: Biglnt{const cha* s) ( linitializez eu 0 veetoul de eife memset{eife,o, LGMAX); Lqe s t Len s : ; if (lg>lgmax) if (lg) fo (int { if idetemin lunginea thow ( "OVERFLOW" ) i=lg-1; i>=o; i--) (s[i]>='o'&&s[i]<='9') canst Biglnt &); Biglnt &); Constuctoul cae ceeaza un obiect de tip Biglnt pe baza unui numa de lip int.. tansmis ca paametu : Biglnt: :Biglnt(int n) {linitializez eu 0 veetoul de cife memset(eife,o, LGMAX); lextag eifele lui n si e nemoez ineepand eu unitatile 19=O; do (cifellgj=n%lo; n/=lo; 19++;) while(n); } Constuctoul cae ceeaza un obiect de tip Bignt pe baza unui numa stocat int-un si de caactee, tansmis ca.paametu : eife[li-l)=s[i]-'o'; else thow ( "NVALD NUMBER") } else 19=1; isiul vid il tansfom in valoaea 0 Obsevati di, in cazul in cae lungimea siului este mai mae dedit numaul maxim de cife ale unui numa mae (LGMAX), "aundim" eoaea OVERFLOW, ia daca siul confine alte caactce dedit cifele zecimale. "auncam" eoaea NVALD tjumber.

28 1 54 PROGRAMAREA N LMBAJUL etc ++ PENTRU LeDU Constuctoul de copiee Biglnt: :Biglnt(Biglnt& ob) {int i; 19=ob.lg; menset(cife, 0, LG); fo (i=o;i<lgji++) cife[i]=ob.cife[ij; ) Functia e O ( ) Functia pletena eo () veifica daca numaul mae tansmls ca paametu este nul: boal eo(const Biglnt & ob) { etun ob.lg==l && ob.cife[oj==oi Opeatoul de atibuie Eignt& Biglnt: : opeato = (canst Biglnt & ob) {int ij if (this!= &ob) inu este autoatibuie {Lqeob.lg; memset (cife, O,LGMAX) j fo (i=o; i<lg; i++) cife(i)=ob.cife[ij; ) etun *this;... n na ORENTATA PE OBECTE N C Bignt& Biglnt: :opeato--() lfoma pefixata {int i; if (lg::::=l && cifelo]==o) thow ("UNDERFLOW'!); fo (i=o; cife[i]==o; i++) cife[ij=9; cife[i]--; if (lg>l && cife[j.g-1]==o) 19--; Biglnt Biglnt: :opeato--(int fictiv) foma postfixata {Biglnt temp; temp::: *this; -- (*this); etun temp; ) in cazul n cae numaul este nul, opeatoul de decementae "aundi" UNDERFLOW. Opeatoi de egalitate bool opeato == (const Biglnt & obi, const Bignt & ob2) {int i; if (obl.lg!=ob2.1g) etun false; fo (i=o; i<ob1.lg && ob1.cife[ij==ob2.cife[i]; i++); etun i==ob1.lg; ) eoaea...i :!!.J Opeatoul de indexae int Biglnt: : opeato l j (canst int paz) canst { if (poz<o poz>lgmax-l) t hxcw.t -'RANGE ERROR"); etun cife[poz]; } Obsevati di opeatoul de indexae "aunca" 0 eoae in cazul n cae indicele nu se 1l.fHi in intevalul [0, LGMAX). Opeatoii de incemeuae/decementae Bignt& Bignt: :opeato++() /foma pefixal:a {int i;.. fo (i=o;.i c Lq && cifelij=:::9; i++) cife[i]=o; if (i ==LGMAX) thow ( "OVERFLOW" ) ; cife[i]++; if (i===lg) 19++; Bignt Biglnt:;opeato++(int fictiv) {Biglnt temp; temp == *this; ++ ("-this) ; etun temp; foma postfixata boo1 opeato!= (const Biglnt & obi, const Biglnt & ob2) { etun! (obl==ob2); } Opeatoi elationali bool opeato < (const Bignt &obl, const Bignt &ob2) {int i; if (obl.1g < ob2.1g) etun tue; if (obl.1g >'ob2.1g) etun false; fo (i=obl.1g-1; i>=o && obl.cife[i]=ob2.cife[i];i--); if (i==-l) etun false; if (obl.cife[i] < ob2.cife[i] }etun tue; etun false; bool opeaco > (const BignL'&obl, const Biglnt &ob2) { etun ob2 <obi; } bool opeato <= (const Biglnt &ob1, const Biglnt &ob2) { etun! (ob1>ob2l; ) bool opeato >= (const Bignt &ob1, canst Bignt &ob2) { etun! {obl<ob2l; } i :

29 ,. 56 PROGRAMAREA N LJMBAJUL C/C ++ PENTRU LCEU PROGRAMAREA ORENTATA PE OBECTE in C , ;--. c-. Opeatoi aitmetici 11 de atibuie compusi cu opeau!i aitmetici Toti opeatoii aitmetici sunt implenentati utilizand opeatoul de atibuie campus coespunzato. Biglnt& opeato+= (Biglnt &ob1, const Biglnt &ob2) {int t=o, 5, i; if lob2.1g > obl.lg) obl.lg=ob2.1g; fo (i=o; i<obl.lg; i++) {s=obl.cife[i]+ob2.cife[i]+tj t=s/10; obl.cife[ij=s%10; } if t) (if lobl.lg==lgmax) thow "OVERFLOW") obl.cife[obl.lg++]=t;} etun obl; } Biglnt opeato +(const Biglnt &ob1, canst Biglnt &ob2) {Biglnt temp; temp=obl; temp+=ob2; etun tempi Biglnt& opeato-=(biglnt &ob1, const Biglnt &ob2} {int i, t=o, s : if (ob1<ob2) thow ("UNDERFLOW") i fo (i=o; i<obl.lgi i++) ( s=obl.ci.fe[i)-ob2.cife[i]+ti if 15<0) {5+=10; t-l;} ese t=o; obl.cife[i]=si } while (ob1.1g>1 && obl.cife[obl.1g-1]==o) ob1.1g--; etun obi. Bignt opeato-{const Bignt &ob1, {Biglnt tempi temp=obli temp-=ob2i etun temp; const Biglnt &ob2) fo (i=oi i<obl.lg; i+-) fo (j=oi j<ob2.1g; j++) { if (i+j > =LGMAX) thow (" OVERFLOW" ) i v[i+j]+=obl.cife[ij*ob2.cife[j]; } fo (t=i=o; i<lgmaxi i+-t-) {s=t-v[ij v[i]=s%10i t.es 11 0; if (t) thow ("OVERFLOVJ") //detemin 1ungimea si copiez in obl cife1e fo (obl.1g=lgmax; ob1.1g>1 &&!v[obl.1g-1l; ob1.1g--) fo (i=o; i<obl.1gi i++) obl.cife[il=v[i]i.etun obl i Biglnt opeato *{const Biglnt & obl, Biglnt l:.empi temp=ob1i temp*=ob2i etun temp; const Biglnt & ob2) Biglnt& opeato /= (Biglnt & ob1, canst Biglnt & ob2) {int cat [LGMAX], i, 19cat=O, CCi if (eo(ob2}) thow("division by 0"); i.f (ob1<ob2) { ob1=biglnt()i etun ob1i } //catul este 0 i.f" (obl==ob2) { obl=biglnt(l) i etun obl; }//catul este 1 Biglnt t; fo (i=ob1.1g-1i t*lo+obl.cife[j<ob2; i--) { t*=10i t+=obl.cife[iji //calculez cifele catului fo (i i>=oi i--) {t=t*lo+obl.cife[ij; fo (CC=9i cc*ob2>t; cc--); t-=cc*ob2; cat[1gcat++]=cci } obl.1g=lgcat: i fo (i=o; Lc Lq c a t : i++) obl.cife[ij:=.:cat[lgcat-j.-ili etun obl i } " :!-) i i, i j" j 'ii, j; ' " "" :! 1'" i ': :' i,::1, 1:::: ' f'! h",' Biglnt& opeato *= {int v [LGMAX] ; int i, j, t. S; (Biglnt & ob, canst Biglnt & ob2) memset(v, 0, sizeof(int)*lgmax}; if leo (ob) eo lob2) { cbl=biglnt();etun obl;} //ezu1tatul este 0 Biglnt opeato /(const Bignt & ob, const Bignt & ob2) { Biglnt tempi tempobl; temp/=ob2; etun t.empi Biglnt& opeato '1;::- (Biglnt & ob, const Bignt & ob7.)

30 l' ""'F""- 'f' 58 PROGRAMAREA in LlMBAJUL C/C++ PENTRU LlCEU PROGRAMAREA ORENTATA P: OBlECTE i'" C! - 59 (int cat [LGMAXJ, i, gcat=o, cc; if (eo(ob2)) thow("division by 0"); if (obl<ob2) { etun ob; } lestul este ob; if (obl==ob2) ( Biglnt t; obl=biglnt(); etun ob; }/estul este 0 fo (i=obl.lg-l; t*10+obl.cife(i]<ob2; i--) { t*=lo; t+=obl.cife[i]; } //calculez cifele catului fo (; i>=o; i--) {t=t*10+obl.cife[i); fo (CC=9i cc*ob2>t; cc--); t-=cc*ob2; cat[lgcat++j=cc; ) while (t.lg>l && t.cife[t.lg-1]==o) t.lg--; obl=t; etun ob; } Biglnt opeato %(const Biglnt & ob, canst Biglnt & ob2) { Biglnt temp; temp=obl; temp%=ob2; etun temp; Opeatoii de citielsciee La citie utilizgm un si de caactee tempoa, in cae citim numaul, apoi etinem cifele numaului in vectoul de cife, 'in odine invesa, tansfomand caacteele in cife : isteam & opeato» (cha s[lgmax+j; (isteam &in, Biglnt & ob) in»s; ob.lg=stlen (5) ; if (ob.lg>lgmax) thow ("OVERFLOW"); fo (int i=ob.lg-i i>=o; i--) ob.cifelob.lg-i-1j=s[ij_'o'; etun in; Afisam vectoul de cife in odinc invesa : osteam & opeato «( fo (int i=ob.lg-1; i>=o; out«(int)ob.cife[i]; etun.out.: (osteam & out, const Biglnt & ob) i--) Poblema 1. Descompunee Fibonacci Consideam siul lui Fibonacci: 0,1,, 2,3,5,8,13,21,. Dat fiind un nuua natua] (nen), scieti acest nuna sub foma de suma de clemente neconsecutive din siul Fibonacci, fiecae element putand sa apaa eel mul o data, astfel incat numaul de temeni ai sumei sa fie minim. Date de intae Din fisieul de intae fib. in se citeste de pe pima linie numaul natual i. Acesta poate avea maximum 100 de cife. Date de iesie n fisieul de iese fib. out se vo afisa temeni ai siului Fibonacci, die unul pe linie, cae espectg estictiile din cnunt. Exemplu Pentu n=20 flsieul de iesie poate contine Solutie (Olimpiada Nationala de nfomatica. Constanta, 2000) Metoda utillzaa este Geedy: la fieeae pas selecam ca tenen n suma eel mai mae numa Fibonacci.s.n, apoi scadem din n numaul selectat, Pocedeul se epeta cat timp n> o. Sa demonstam ca acest algoitm geneeaza 0 solujie cae espects estictiile din.enunt. n pimul and, 'algoitmul se temina : la fiecae pas, n se micsoeaza, deoaece exista tntodeauna un numa Fibonacci Sn (maca 1), deci dupa un numa fini de pasi va deveni nul. n al doilea and, niciodata nu vo fi selectati doi temeni consecutivi ai siului Fibonacci. Sa pesupunem pin educee la absud ca in sums am selectat doi temeni consecutivi din siul Fibonacci. Fie fib [ i +1]!?i fib [ i ] cei mai mai temeni Fibonacci consecutivi selectati : S=... +fib[i]+fib[i+l]+... Deoaece fib[i]+ fib(i+1j=fibli+2], ia fib[i+2]>fib[i+l]>fib[i], deducem ca algoitmul Geedy va selccta fib [i-;-2j, nu pe fib [i+l] (deoaece acesta este cel mai mae temen al siului Fibonacci :S:n la pasul.especiv). Matematiciauul belgian Edouad Zeckendof a demonsta pin inductie ca scieea unu! numa natual ca suma de temeni Fibonacci neconsecuivi este unica. flicfmd abstactie de odinea temenilo (vezi Teoema lui Zeckendof wiki/zeckendofs theoem) Pentu a implementa algoitmul Geedy desets, am utilizat 0 funqic CeneayC:" Fibonacci cae genecaza ton tcmcnii Fibonacci <n i ii memoeaza in vcctoul fib. in functia main () pacugem vecoul f in de la sait due ihcepu (astfel inca la fiecae pas sa fim pozitionatl pe cel mai mac tcnen Fibonacci. -), ll selccam in sums (l afisam) -51 l scadcm din n... L...-J

31 ,.., --,.., 60 #include <fsteam> #include "bigint.h" #define NRMAX using namespace std; ifsteam fin(lfib.in"); ofsteam fout( ltfib.out"}; PROGRAMAREA \' LMBAJUL C/C++ PENTRU L1CEU Atat n, cal i vectoul fib sunt nuuee mai. Obsevati cit de ctcgama, simpla i claa devine implementaea acestui algoitm, utilizand. clasa Biglnt $i opeatoii supatncacad de lucu cu numee mai : CeinJa PROGRAMAREA ORENTATA PE OBECTE in C---t Deteninati in cae modui se poate ealiza pavaea aleii eli dalele existente. Date de intae pisieul de intae pavaj. in contine pe pima linie doua numee natuale sepaate pint-un spatiu : L n, unde L este jungimca aleii, ia n este HUmaTUl de ipui de dale. Pe eea de-a doua linie se afla n uumee natuale nenule distincte sepaate pin cae un spatiu d 1 d 2. d», unde d, epezmta lungimea dalelo de tipul i, pentu oice i =1, n. Biglnt n; Date de iesie int n; Fisieul de iesie pavaj.out va contine 0 singua linie pe cae vafi scis un Biglnt fib[nrmax); singu nuna natual, epczentand numaul de modui in cae se poate ealiza -: void Geneae_Fibonacci{); pavaea aleii cu dalele cxtstente. Restictii i pecizai int main () { int paz; 0 < L.::;: 700 fin»n; 0 < n S; 250 Geneae_Fibonacci() 0 < d, < 1000, pentu o ice i=l, n -t poz=n-l; d j:;t.:dj, pemu oice i.=l, n while (! e O (n)).. Rezultatul va avea maximum 300 de cife. {/caut eel mai mae temen din siul fibonacci <=n fo ( ; n<fib[pozj; poz--); Exemple fout«fib[poz)«'\n'; pavaj.in pavaj.out n-=fib [paz] ; ) fout.close{); etun 0; (.campion 2006),.., Soltqie i j,.., ", void Geneae_Fibonacci() int i; fibo]=bignt(); fib[l]=bignt(l); fo (i=l; fib(ij<=n; i++l fib[i+l]=fib[i]+fibli-l); n=ii " ] Poblema 2. Pavaj Aleea din fata scolii ae lungimea L si tebuie sa fie pavata eu dale de foma deptunghiulaa, avand lanmea egala eli latimea aleii, da de difeitc Jungini. Extsa n tipui de dale, numeotae de la 1 la n, din fiecae tip existand U numa suficient de mac de exenplac. Vom ezojva poblema pin metoda pogamaii dinalnie. Subpoblemd Sa se detemine n lx l = numaul de posibilitati de a pava 0 alee de lungime x, utilizand dalele existente. Relatia de ecuentii Pentu a pava a alee de lungime x incepem pin a pasa 0 dala. Dala poate fi de oice tip 1. (i=l, n). Dupa plasaea unei dale de tipul i, mai amane de pavat 0 alee de lungime x-d [i] (desigu, daca xed [ i ] ) _ Relatia de ecucnta devine:, n [xl <n. [x-d [lj ] +n [x-d [2 l J n [x-dnl J (da.ca x-d [1. J >=0,.i.eL. n ).n[o]=l Tinand cont de dimensiunea datelo de inae. este ncccsaa utilizaea numeelo nai. u de.:il,incl, #include <fstean> "bigint.h" 61

32 62 PROGRAMAREA in UMBAJUL CC+t PE!\TRU LlCEU #deine NMAX 251 #define LMAX 701 using namespace std; ifsteam fin ("pavaj. in") ; ofsteam tout ("pavaj. out") int il, L; int d [NMAXj ; Biglnt n [LMAX] ; int main () { int i, Xi //citie fin»l»d; fo (i=l; i<=n; i++) fin»d[i]; /pogamae dinamica n[o]=biglnt{l); fo ex=].; x<=l; x++) fo (i==l; i<=n; i++) if (d[ij<=x) n[x]+=n[x-d[ijj; //afisae fout«n[l]«'\n' fout.close{); etun 0; Poblema 3. SQR Sa consideam n un Hilma natual si a, natuale nenule. Ceinta Sa se scie un pogam cae sa detemine eel mai mic numa ell cae a putea f inmultit podusul al * a2*... '"an astfej incat Sa se obtina un patat pefect nenul. Date de intae Pisieul de intae sq. in contine pe pima linie nuuaul natual n. Pe cea de-a doua linie se afla nuneele natuale al. a2'. an> sepaate pin cae un spatiu, Date de iesie Fisieul de iesfe s q. aut va contine 0 stngua linie pe cae va fi scis un numa natual, cae epezinta numaul minim cu cae a putca fi innuljit podusul al * a2 *... * an astfej inca sa se obpna un patat pefect nenul. a,, an 0 secventa de n valoi Restictii PROGRAMAREA ORENTATA PEO3ECTE in C\ < n :s:; < ai , pentu l:s:;-in Rezultatul va avea maxim 1000 de cife. Exemple Solutie sq.in sq.out Exnlicatic *3* *5=900=30* (.campion 2005) Pentu ea un numa sa fie pata pefect nenu, dcscompuneea sa in factoi pimi ebuie sa cantina doa factoi la putei pae. Pin umae. u-ebuie sa deteminam desconpuneea in factoi pimi a podusului al* a2 *... * a l,. 0 idee a fi sa calculam podusul, apoi sa-l descompunen n facoi pimi (ceea ce a f cam conplicat, descompuneea unui numa mae in facto! pimi nefiind fcate simpla). o alta idee se obtine plecand de la obscvatia ca daca in al apae factoul pim d la puteea P, ia in a:>. factoul pim d apae la puteea P2, in podusul a *a2 factoul pim P apae la puteea Pl +P2. Pin umae, este suflcien sa descompuncm fiecae numa a, (l.-:::'in) 1n factoi pimi sl sa ennem int-un vecto p suma puteilo factoilo pimi (p l d ] = suma pueilo factoului pim d din descompuneea in factoi pimi a numeelo ai, l.:o;is",n). eel mai mic numa cu cae poate -f lnmulu podusul al* a2*... * a. pentu a obtine un pata pefect se detemina lunultind factoti pimi cae apa la putei impae. Acesta va fi, evident, un numa mae. #include <fsteam> #include "bigint.h" #define NMAX 1001 "define DMAX using namespace stdj if'steam fin (" sq. in") j ofsteam faut Lveq. co u t v ) int nj int a [NMAX] j int P [DMAX] ; Biglnt n (1) int main () {int i, dj //c.itie fin»ni fo (i=l; Lc e n : i++) f i nc-c-e Li L: '-", 1 ' --' --' '! -.J L...;

33 -',,.J //descompuneea in factoi pimi fo (i=l; i<=n; i++) fo (d=2; a[ij>l; d++) while (a[i]%d==o) (++p[dj; a[ij/=di} //detemin n fo (d=2i d<dmaxi d++) if (p[dj%2) n*=d; //afisae fout«n«' \n' ; fout.close(); etun o Clasa sting Opeatiile ell siui de caactee in C necesita 0 buna cunoastee a modului de epezentae si 0 buna injelegee a opeatiilo ell pointei. Din acest motiv, lucul ell siui in C ("C-like") ae un nivej elativ inalt de dificultate. Din acest motiv, in biblioeca standad a limbajului C+ + a fast implenentata clasa sting, pentu a facilita opeatiile ell siui de caactee. Pentu a utiliza aceasta clasa, tebuie sa includeji fisieul antet sting:!: #include <sting> l. n,!! 1 : i 64 Constuctoii clasei st:ing sting (); - ceeaza un si vid. PROGRAMAREA in LMBAJUL C/C ++ PENTW L1CElJ sting (const sting& s) i - consuctoul de copiee: -cceaza un si identic' ell siul s.. sting (const sting & s, size_t poz, size_t n = npos); _. ceeaza un si cae contine n caactee din s, ncepand de Ja pozitia po z. Daca - n lipseste sau este pea mae, se copiaza caaetee1e din s de la pozitia poz pana la sfasitul siului. sting (const cha* s) i - ceeaza un si pe, baza siului de caactee din C s (secventa de caactee teminaa cu caacteul 0). sting(const cha* s,size_t nl; - ceeaza un si continand pimele n caactee din siul de eaactee s. sting (size_t n, cha c) i - ceeaza un si cae contine caacteul c cpcta de n oi. Obsevaiii size teste un tip cae ae ca valoi nuuee natuale, capabil sa etina dimensiunea oicaui tip de date. 2, npos este un membu static constant, cae ae valoaea maxima pentu tipul..., size_to Cand utilizam aceasta valoae ca lungime a unui subsi, ae sctni1katia! "pana la saitul1;:iuluj". Destuctoul clasei sting PRQGRAMAREA ORENTATA PE OBECTE N C+ +.c s t i nc () - elibccaza memoia alocata dinamic de constucto. Opeatoi supaincacati Opeatoul de atibuie :::: este supaincacat pentu a atibui unui i de tip sting un alt si de tip sting sau un si de caactee din C oi un caacte: sting& opeato= sting& opeato:::: sting& opeato= (const sting& st) (const cha* s); (cha c); Opeatoul + este supaincacat ea funcpe fiend si poate fi utilizat 'pentu ooncatenaea a doua siui de tip sting, a unui si de tip sting cu un si de caactee din C, espectiv dinte un caacte si un si de tip sting: sting opeato+ (const sting& s t. c ons t; sting& s2) sting opeato+ (const sting& sl, const cha* 52) sting opeato+ (const cha* sl, const sting& s2) sting opeato+ (const sting& sl, cha 52) sting opeato+ (cha sl, canst 5ting& 52) 'Opeatoul += este supaincacat ca functie memba si functioneaza pemu concatenaea eu un i sting, un si C si, espcciv, un eaacte: sting& opeato+= sting& opeato+:::: sting& opeato+= (const sting& s) (canst cha* e j : (cha c); Opeatou1 de indexae [] euneaza 0 efeinta la caaeteul de pe pozitia specificatii poz : cha& opeato[] (size_t poz); const ch& opeato[] (size_t poz) const; Daca poz este ega1 cu lungimea siului, va etuna 0 efeinta la eaaeteul nul. Daca siul este constant, atunci efeinta cunata va fi constants. Opeatoii de citie/seiee sunt supaincacati astfel incat sa functioneze ca pentu siuile din C isteam& opeato» osteam& opeato«{isteam& is, (osteam& o s sting& st); const sting& st)j Opeatoii elationali si de egalitate sunt supaincacati ca functii fiend pentu a functlona atat pentu compaaea slutlo de tip s t ing, cat i pentu compaaea unui $i de tip sting Cll un si din C: bool opeato:::::::: (canst sting& sl, canst sting& 82) boo1 opeato== (canst cha* sl, canst sting& 52) boo1 opeato:::::::: (const sting& sl, canst cha* 52) boo1 opeato!= (const sting& sl, conse sting& s2) 65

34 t; Functia getline () citeste caaetee in siul s pana 1a intalniea caacteului delimitato d, espectiv pana la intalniea macajului de sfasit de linie '\n'. isteam& getline (isteam& in, sting& s, cha d) i isteam& getline (isteam& in, sting& s); Puncna swap () inteschinba valoile a doua siui de tip sting: void swap (sting& x, sting& y); Funcjii membe Puncjtile menbe sunt foate numeoase, mentionan cateva dinte acestea. Lista tutuo functiilo membe poate fi consultata online in docunentatia linbajului C+ + ( tunctiile length () si size ().cuneaza lungimea siului (numaul de caactee din si) : size_t length() canst; size_t size() const; Functia empty () etuneaza tue daca siul este vid i false in eaz conta: baal empty() const; Puncjla memba data () eumeaza un st de caactee din C (succesiune de caactee teninata cu caacteul nul), continand caacteele din siul cuen : canst cha* data() canst; Funcjia puh_back() adauga caacteul c 1a sfasitul siului cuent: void push_back (cha c) ; Punctia pop_back () stege ultimul caacte din siul cuent : vaid pop_back ( ) ; PROGRAMAREA ORENTATA PE OBECTE in C Fuuctia inset () inseeaza la pozitia paz in siul cuent un si s (cae poate fi sting sau din C): sting& inset (sizet paz, canst sting& 5) sting& inset Csize_t poz, const cha* s); Peate insca dea 0 subsecvenja din siul de tip sting s (cea cae incepe la poz L si ae 1ungimea n.-l}: sting& inset (size_t paz, canst sting& s, size_t pazl, siz _t nl) i Poate insea pimele n caactee din siul din Cs : sting& inset (size_t paz,, Sau poate insea de n oi caacteul c : const cha* s, size_t n); sting& inset (size_t paz, size_t n, cha C)i Puncia ease () sege n caactee din siul cuent incepand de la pozitia paz. Paanetul paz ae valoaea implicita 0, ia n ae valoaea implicita npos (stegeea se face pana la sfasitul siului) : sting& ease (size_t paz = 0, size_t n = npos) ;.' Functia find () cauta in siul cuent un alt si s (de tip sting sau si din C) incepand de la pozitia poz si euneaza pozitia de inceput a pimei apaitii (sau npos daca nu apae) : size_t find (canst sting& s, size_t poz = 0) canst; e Lz e j find (const cha* S,. s,ize_t poz = 0) canst; Poate de asemenea cauta doa pimele n caactee din siul din C s : size_t find(canst cha* s,size_t poz,sizet nl Sau poate cauta un caacte c : size_t find (cha c, size_t poz = 0) canst; canst; Funcjia eplace () inlocuieste in siul cuent 19 eaactee, incepand de a pozitla paz Cll un alt s s (de tip sting sau din C): sting& eplace(size_ paz,size_t 19,canst sting& s); sting& eplace (size_t poz, size_t g, canst cha* s) sau doa cu un subsi al lui s (cae tncepe la pozftia p ozl i ae lungimea 191): sting& eplace (size_t paz, size_t 19, canst sting& s. size_t pozi, size_t 191); sau eu pimele n caacee din s : sting& eplace (size_t paz, size_t 19, const cha* s, size_t n); sau cu -n caactee c : sting& eplace(size_t paz, size_t 19, size_t n, cha Cli i,'-" -'

35 i ; -' " -«,, t i,.., l ; t. ; i ' - 68 PROGRAMAREA in LMBAJUL CC--H PENTRU LCEU PROGRAMAREA ORENTATA PE OBECTE N C Functia subst () euneaza un subsl al siului cuent, cae incepe la pozitia paz i ae 19 caactee (valoaea implicita pentu paametul 19 este npos, ceea ce tnseamna ca se consides toate caacteele de la pozitia paz pana la.sfasitului siului cuent) : sting subst LsLz e t paz := 0, size t 19 :::: po s ) con s c : Functii de convesie Functiile stoi (), stal (), stoll (), stolul {), stolull () convetesc un sting s cae contine un numa integ seis in baza b (valoaea implicita pentu b fiind 10) i etuneaza numaul integ obtinut (de tip int, long, long long, unsigned long, espectiv unsigned long long). Daca pointeul peste nenul, dupa ape] in p se va afla adesa caacteului din sl cae umeaza dupa valoaea numeica convetita. Valoaea implicita pentu paametul peste 0, caz in cae p nu ese utilizat. int stoi (canst sting& s, sizet* p=o, int b=lo); long stol (canst sting& s, size_t* p=o, int b=10) ; long long stoll (canst sting& s, size_t* p=o, int b=10) unsigned long stoul(const sting& s,size_t* p=o,int b=10)j unsigned long long stoull(const sting& s,size_t* p=o,int b=lo); Functiile stof (), stod () si s t o Ld () convetesc un sting s in-un numa eal si euneaza numaul convetit ea ezulta (de tip float, double, espectiv long double). Semnificatia paametului p este aceeasi ea la functiile de canvesie in integ : long double stad (canst sting& s, size_t* p=o); double stad (canst sting& 5, ize_t* p=o); float stof (canst sting& s, 5izet* p=o); Poblema 4. Ed Sa consideam un text fomat numai din itee mici ale alfabetului englez. Asupa acestui text se pot executa unatoaelc opeatii de editae : 1. L (cusoul se muta eu 0 pozitie la stanga; in cazul in cae cusoul se afla a inceputul texnilui, aceasta opeatic nu ae niciun efect). 2. R (cusoul se mute cu 0 pozitic la deapta; in cazul 111 cae cusoul se afla la sfasitul textului, aceasta opeajie nu ae niciun efect). 3. B (stege caacteul din stanga cusoului; in cazul in cae cusoul se afla la inceputul textului, aceasta opeatic nu ae niciun efect). 4. <secventa> (inseeaza secventa de litee mici specificata dupa litea in pozitia cuena a cusoului). 5. D<->' (stege lncepand eli poz.itia cucna a cusoului n eaactee; in cazul in cae numaul de caactee existente din pozitia cuenta a cusoului pana la sfasitul siului ese < n, se vo stege toate caacteele exisente de a pozitia cucnta a cusoujui pana la sfasitul siului). nitial, cusou1 de sciec se ami la sfasiul tcxtului (dupa ultimul caace). Ceinta Scieti un pogam cae sa aplice unui text dat 0 secventa de opeatii de editae si cae sa afiseze textul astfel obtinut. Date de intae Fisieul de intae ed. in coniine pe pima linie textul da. Pe cea de-a doua linie cste scls un nuna natual N, cae cpczina numaul de opeatii de editae. Pe umiitoaele N 1inii sunt scise cele N opeatii de ediae (cate 0 opeatic pe 0 linie), in odinea in cae tebuie sa. fie executate. Date de iesie Fisieul de iesie -ed. aut va contine 0 singua linie pe cae va fi scis textul obtinut dupa executaea in odine a celo N opeatii de editae. Restictii si pecizai Textul da este fomat din eel mult litee mid ale alfabetului englez. 1 N 5000 La oiee opeatic de inseae () se pot insea in text maximum 10 caactee, '. La oice opeatic de stegee (D) se pot stege din text maximum 1000 caactee. Exemplu Soliqie ed. in gwety 10 L L D3 L "" R bb L aaa D2 ed.aut qwabb (.campion 2006) Solutia devine imediaa, utilizand clasa sting. Ciim succesiv opeatiile si executan fiecae opeatie citita, in functie de tipul ei : #include <fsteam> #include <sting> #include <cstdlib> using namespace std; ifsteam fin("ed.in") :

36 70 PROGRAMAREA N LMBAJUL CC++ PENTRU LCEU T ofsteam fout (" ed. out" ) ; sting S, int paz i 0Pi int main ( ) {int it N, 19; fin»s; poa e s. length () ; fin»n; fo (i=o; i<n; i++) ( fin»op; switch (op[o]) case 'L' case 'R' case 'B' case '' case 'D' ) fout«s«' \n' ; fout.close(} ; etun 0; ) {if (poz>o) poz--; beak;} {if (poz-cs. length () ) poz++; beak;} {if (poz>o) {s.ease(poz-l,l); poz--; beak; {s.inset{poz,op,l,sting: :npos); beak;} (lg=atoi(op.data()+l) i /lg=stoi(op.subst(l); s.ease(po2,lg); poz-lg; beak; Singua opeatic mai diflcila estc stegeea, deoaece a fost necesaa convesia unui subsi al siului op (in cae este memoata opcana cuenta) int-un numa lntfeg (lg). Exfsta doua vaiante pentu a ealiza acest lucu (ell functia e t o i (), cae penu compilatoae mai vechi nu functioneaza, fiind inodusa in biblioteca inbajului in anu1 2011) sau tansfomand cu ajutoul functiei data () subsiul extas in si de caactee din C, apoi ealizand convesia eli functia atoi () Mosteniea Mosteniea epezinta unul dinte pincipiile fundamenta1e ale POQ si, in esenja, consta in posibilitatea ca dint-un concept geneal sa obtinem un concept paticula (sau mai specializat). Pocesul.pin cae se ealizeaza mosteniea se numeste deivae. Pin deivae, clasa deivata mosteneste toate datele si functiile membe ale unci alte clase (denumita clasa de baza). Clasa defvata se difcenuaza faa de clasa de baza pin adaugaea uno membi (date sau functii) sau pin supatncacaea functiilo membe ale clasei de baza.,, PROGRAMAREA ORENTATA. PE OBECTE in C Utilizand deivaea claselo, dezvolaea aplicatiilo devine mai eficienta. Aplicatiile nu sunt de fiecae data tnccpute de 1a zeo. 0 pate din cod este deja sensa i va fi l1lotenita. Codul mostenit este deja testat, deci exista 0 gaantie 3, coectitudinii acestuia. o clasa poate f clasa de baza pcmumai multe clase deivate, ia 0 clasa deivate poate fi clasa de baza pentu alte clase, obtinandu-se astfel ieahii de clase. n uncle dinte limbajele de pogamae onentaa pe obiecte, oice clasa este 0 class deivata dint-o alta clasa de baza. gcneala, definita in cadul limbajului (de exemplu, in Java sau in C#, aceasta clasa este denumita Obj ect ). Limbajul C+ + fiind un limbaj hibid, pemite, asa cum am vazut deja, definiea unei clase taa deivaea acesteia dint-o alta clasa. Deivaea unei clase dint-o ctasa de baza Sintaxa declaaii unei clase deivate (denumita ClasaD) dint-o clasa de baza (denunita ClasaB) este : class ClasaD: specificato_acces ClasaB { ideclaa\ii de date menbe ideclaatii de functii membe } ; n declaada clasei deivate, specificato acces poate fi public, potected sau pivate. Daca nu este mentionat specificatoul de acces, el este conside-at implicit pivate. Uzual, pogamatoii C+ + utilizeaza la deivaea claselo spccificatoul public. Reamintim ca membii pivate ai unei clase pot fi accesati doa' in ca-sa espectiva i in functiile pietene ale clasei espective; membii p.o t.ec t e.d pot fi accesan in plus i in clasele deivate si in functiile pieene ale claselo deivate. Efectul specificatoilo de acces asupa membilo clasei de baza este sintetiza in. tabelul unato. Yeti obseva ca. in c1asa deivata, aceesu1 este mai eslctiv dccat in clasa de baza, in functie de specificatoul de "acces utilizat 1a deivae. Atibut in clasab Speciflcato acces cces in clasad Acccs in exteio public pivate inacccsibij pivate p'i.ve-te inaccesibtl inaccesibil potected pivate inaccesibil public potected inaccesibij pivate potected inaccesibil inaccesibil potected potected inacccsibtl public public accesibil pivate public inaccesibil inaccesibil potected. potected inacccsibil i L -.J l...j 1, w '--' '--', 1 -J -J -.J

37 72 PROGRAMAREA N LMBAJUL CC++ PENTRU LeEU PROGRAMAREA ORENTATA PE OBlECTE in C ' n -' n - j i! ",.,: ", " Exemplu Sa constuim, int-o foma extem de -simplificata, 0 class pentu evidenta esuselo umane la 0 companie. Gice pesoana, indifeent ca este client sau angajat, tebuie sa aiba un nune i un cod unie de identificae in cadul companiei,. Vom constui, in pima instanja, clasa Pesoana astfel : class Pesoana public: static int dct; potected: int d; sting Nume; public: lconstuctoi: Pesoana(); Pesoana{const sting& 5) idestucto -Pesoana () ; /functii de acces int Getld () ; sting GetNume(); void SetNume(const sting&) void Scie(); } ; Numeele de identificae ale pesoanejo sunt geneate automat, cu ajutou datci membe statice dct. Valoaea acesteia va fi incememata de fiecae data la ceaea unei pesoane (in functiile constucto). Am declaat doi constuctoi (unul taa paameti, cae seteaza doa d-ul, i unul cu un paanetu de tip sting, cae scteaza si numele). in ambii constuctoi i n destucto aflsam die unmesaj, pentu a putea umal modul in cae se ceeaza, espectiv se elimina oblectc. mplenentaea functiilo menbe este : Pesoana::Pesoana() { d=++dct; Nume=""; eout«"am ceat 0 pesoana faa nume\n"; Pesoana: : Pesoana(const sting& s) { d=++dct; Nume=s; eout«"am ceat 0 pesoana eu nume\n"; idestucto Pesoana: ;-Pesoana() { eout«"an elininat 0 pesoana\n"; lfunctii de aeees int Pe.s.oana.. ccc c () { etun d; sting Pesoana: :GetNune() { etun Nune; } void Pesoana: :SetNume (const sting& s) { Nume=s; } void Pesoana: : Seie () { c out c c j d-c "<cnumec ' \n'; } Obsevati ca in c1asa Pesoana am declaat datele membe utilizand specificaoul de acces potected. n acest mod avem acces diect la datele membe din clasele deivate. Aces! lucu nu ea obllgatoiu. Am fi putut declaa dateje membe pivate si sa e accesam pin intemediul funclilo publice de acces, Din clasa Pesoana von deiva clasa Angajat, cae ae in plus un salaiu i 0 tunctie (date membe) si functii de acces a salaiu i la functie. c1ass Angajat : public Pesoana ( potected: sting Functie; int Salaiu; public: int GetSalaiu(); void SetSalaiu(int); sting GetFunctie(); void SetFunctie(sting) void Scie ( ) ; } ; Definitiile functiilo membe fiind : int Angajat::GetSalaiu() { etun Salaiu; } void Angajat: : SetSalaiu(int x) { Salaiu=x; } sting Angajat::GetFunctie() { etun Functie; void Angajat: : SetFunctie (sting s) { Functie = s' void Angajat: :Scie() { c out c c Ld-c «Nune«-e e'unct t e-c «Salaiu«\n '; Unnatoaea secventa de cod geneeaza doua obiecte de tip Pesoana (x, utilizand constuctoul implicit, si y, utilizand constuctoul eu un paametu) si un obiect de tip Angajat (z). Deocamdata in clasa Angajat nu exists un constucto definit, pin umae, se apeleaza doa Ja constuctoul implicit at clasei Pesoana. Pesoana x, y( "Popescu ves i Le») x. SetNune t " onescu Dan"); x.scie() ; y.scie() ; Angajat z; z.setnune("vasilescu Ana") j z.setfunctie(lt c ontabil") z.setsalaiu(looo) ; z.scie() ; Dupa executia acestei secvente, pe ecan se va afisa : Am ceat 0 pesoana faa nume Am ceat 0 pesoana eu nune 1 onescu Dan 2 Popescu Vasile Am ceat '0 pesoana Laa nume 3 Vasilescu Ana eontabil 1000

38 74 PROGRAMAREA in LTMBAJUL C/C ++ PENTRU LTeEU Am eliminat 0 Am eliminat 0 Am eliminat 0 pesoana pesoana pesoana Constuctoii si destuctoul in clasa deivata ReguliJe de functionae a constuctotlo/destuctoului aman valabile i in clasele deivate. Tousi exists 0 sefc de elemente specifice, cae ilusteaza elatia dinte constuctoii/destuctoul clasei de baza i constuctoii/destuctoul clasei deivate: pentu constuiea unui obiect al clasei deivate se apeleaza mai lntai constuetoul clasei de baza, apoi se apeleaza constuctoul clasei deivate; la eliminaea unui obiect a] unei clase deivate se apeleaza mai ntai destuctoul cjasei deivate, apoi destuctoul clasei de baza. Cand declaan un constucto in clasa deivata t-ebuie sa spccificam in lista de paameti mai intai paametii pentu consuctoul coespunzato din clasa de baza, ia in continuae eei pentu constuetoul c1asei deivate. Cand definim constuctoul elasei deivate tebuie sa specifidim :i eonstuctouj clasei de oaza eu cei cocspunzatoi, astfel : clasad tipd2 pd 2, Definiea unui constucto in clasa deivata este obligatoie daca 111 clasa de baza nu exists un constucto taa paancti. Pentu exemplifieae, vom conpleta clasa Angajat cu tei constuctoi : unul taa paameti, cae se bazeaza pe constuctoul taa paameti al clasei de baza si constuiesc un angajat taa nume, functie sau salaiu ; unul eu doi paameti, cae se bazeaza pe constuctoul taa paameti al clasei de bazf :i constutestc un angajat fiia nume, da cu functie i salaiu ; unul ell ei paaneti (numele angajatului, functia i salaiul) cae se bazeaza pe constuctoul cu un paamctu al clasei de baza (numele angajaului fiind tansnis acestuia). class Angajat : c l a s an t t Lp, pb 1, tip2 pb 2,., tiph pbh, tipdk pd,:> : clasab (pb 1,pb2, pb h ) public pe-sso aa tipdl pd 1, {potected sting FUDctiei int Se.Laz a u : public: int GetSalaiu () void SetSalaiu{int) sting GetFunctie(); void SetFunctie{sting); void Scie() i //constuctoi Angaj03t() ; Angajat (const sting& sf, const int sal); Angajat(canst sting& SD, canst sting& sf, const int sal) -! /destucto -Angajat () ; ) ; PROGRAMAREA ORENTATA. PE QBJECTE N c++ 75 Definitiile pentu constucto! i destucto sunt : Angajat: :Angajat (canst sting& sn, const sting& sf, canst int sal): Pesoana(sn) {Fulctie=sfi Salaiu=sali cout«"an ceat un angajat cu n ume. functie si salaiu\n"; Angajat::Angajat(const sting& sf, Pesoana () {Functie=sfi Salaiu=sali cout«"an ceat un angajat faa nume, cout«"cu functie si salaiu\n"; canst int Angaj at: :Angaja.t () : Pesoana () {cout«"an ceat un angajat faa functie si salaiu\n" i /destucto Angajat::-Angajat() { cout«"affi eliminat un angajat\n"j sal) : Obsevati ca atat constuctoii, cat si destuctoul afiseaza pe ecan mesaje specifice, astfel ncat la executie sa putem identifica exact ce se executa. Pentu exemplificac yom eea i vom afisa tei obiece de tip Angajat (cate unul pentu fiecae constucto definit) si apoi le vom afisa. La declaaea unui obiect a1 clasei deivate tebuie pecizata mai nai lista paametilo actuali pentu constuctoul clasei de baza, apoi pentu constuctoul clasei deivate. Anca j a t; Xi x.setnume('''vas ilescu Ana") i x.setfunctie("contabil") x.setsalaiu(1000); x.scie(} i Anq'a j a t; y ("diecto", 2000); y. SetNume ("Vasilescu Ana") i y.scie{) ; Angajat z t v Pope. on","casie",500) z.scie() i Umaind mesajelc afisate pe eean la executia acestei secventc de instuctiuni, deducem ca' se apcleaza mai intiii constuctoul clasei de baza, apoi ccnstuctoul clasei deivate. in cazul destuctoilo este inves (se apeleaza mai intai destuctoul clasei deivate, apoi destuctoul clasei de baza). Am ceat 0 pesoana faa Dume Am ceat un angaja faa functie si salaiu 1 Vasilescu Ana contabil 1000 ', ' --', i:,.'-.j, -J u

39 , ': j ': -' ; :,- 7(> PROGRAMAREA in LMBAJUL CC+-j- PENTRU L1CELJ Am ceat 0 pesoana faa nume Am ceat un angajat faa nume eu functie si salaiu 2 Vasilescu Ana diecto 2000 Am ceat a pesoana eu Dume Am ceat un angajat eli DUffie, functie si salaiu 3 Papa on easie 500 ffin eliminat un angajat Am eliminat a pesoana Am elininat un angajat Am eliminat 0 pesoana Am eliminat un angajat Am elininat 0 pesoana Mosteniea multipla n c+ + este pemisa mostcniea multipla (0 clasa poae fi deivata din mai multe clase de baza). n acesta caz, la declaaea clasei deivate nu se specifica 0 singua clasa de baza, ci 0 succesiune de clase de baza. sepaate pin vi gula, fiecae clasa de, baza fiind pecedata de popiul specificato de acces. Toate egulile mentionate.1 1 pentu mostcnlea shnpla aman valabile. ' Exisa multi pogamatoi cae considea mosteniea multiple inutila (deoaece aceleasi ezultate a putea fi obtinute si cu mostenie simplil), ba chia un indiciu ca ieahia de clase nu este coect poiectata. Din imbajul Java, moseniea multipla a fast in mod delibeat eliuinata. Convesiile implicite de tip Conpilatoul C+ + admite unatoaele convesii implicite de tip: dint-un obiect a1 clasei deivate nt-un obiect al clasei de baza ; dint-un.pointe (sau cfeima) cate un obiect al clasei deivate cate un pointe (sa_u efelnjaj.cate un obiectal clasei de baza. Nu sunt penise convesiile invese! ncudeea conditionata Cand clasad este deivate din clasab tebuie sa includem fisieul antet ell declaatia clasei de baza (clasab. h) in flsieut anet al clasei deivate. Aces! lucu poate cea poblemc, in sensuj ca u-o aplicatie este posibil ca declaatia unci clase sa fie inclusa de mal multe oi, ceca ce a genea coae a compilac. Pentu a evita astfel de shuam, la inccputuj flsieutui antet, pentu oice clasa, Yom dcfini 0 constanta simbojidi semnificatiya, cu ajutouj dicctivei pepoceso #define: #define NUMECLASAH < " PROGRAMAREA Polimofismu ORENTATA PE OBECTE in C+ + Pentu a evita ca un fisie antet sa fie inclus de mai multe oi nt-o aplicatie, vom include conditionat continutul acesuia, utilizand diectiva pepoceso iti fndef. #ifndef NUMECLASA H #define NUMECLASA H." //continutul fisieului antet numeclasa.h #endif Polimofismul epezinta un alt pincipiu fundamental al pogamaii oientate pe obiecte. Cuvantul polimotfism descie posibilitatea de a avea mai multe fome. in viata.eala, polimofismul este extem de uzual. De exemplu, daca as spunc "Deschide! ". aceasta "functie"va fi executata in mod difeit daca este yoba de a deschide usa sau a deschide ochii oi a deschide un fisie etc. in c+ +, ideea este similaa : apelul unci functii neube va avca un efect difeu in functie de obiectul cae invoca functia (functia apelaa este selectata in functie de tipulobiectului). in exemplul pezentat la sectiunca "Motenie" am intalnit deja polimofismul. Atat in clasa de baza Pesoana, cat i in clasa Angaj at a fast definita functia scd e (). in clasa Pesoana, functia afisa doa d i cune, ia in clasa Angaj at afisa in plus Functie $i Salaiu.De exemplu, sa 'analizam apeluile functiilo scie () din secventa umatoae de cod: Pesoana x ("Vasileseu Ana") ; Angajat y( "Po'pa on", "casie", 500); x.scie(} ; y.scie() ; Pe ecan se va afisa : 1 Vasilescu Ana 2 popa on easie 500 deoaece pimul ape! a1 functiei Scie () este pentu obicctul x de al doilea este penu obiectul y de tip Angajat. Sa analizam acum umaoul exemplu : Angajat y t vpopa on", "casie",soo) Pesoana &=y;.scie() ; Pesoana *p; p=&y; p->scie () ; Aceasta secventa de cod va afia pe ecan : 2 Papa on 2 Papa on 77 :tip Pesoana,,...,

40 78 Oosevaji ca am declaat 0 efeinta (cate un obiect de tip Pesoana) i un pointe p de asemenea cae un obiec de tip Pe s o aa: Atat z-, cat si p pimesc adesa obiectului y de tip Angajat. Ambele apelui ale functiei Scie () (deci i functia apelata pi-in intenediul efeinjci, i eea apelata pin intenediul pointeului p) poduc acelasi efect: se apcleaza funcpa Scie () din clasa de baza Pesoana. Aces! uecanism este denumit eeoluiie statici (static esolution = static linkage = ealy binding): compilatoul selecteaza funcna inainte de execuua pogamului, consldeand a vesiunea din clasa de baza. Functiile vituale a functie vituala este 0 functie din clasa de baas a ceei declaatie este pecedata de cuvantul-cheie vitual. Definind 'in clasa de baza 0 functie vituala, ia 'in.clasa deivata 0 functie eu acelasi nume, anuntam compilatoul ca nu doim ezojutie staica pentu aceasta funcpe, cl doim ca identificaea vesiunii fuuctiei ce tebuie Sa fie apelata sa se ealizeze in timpul executiei pogamului, in functie de obiectul cae 0 invoca. Acest meeanism se numeste ezoluiie dinamica (dynamic esolution = dynamic linkage = late binding). Caacteisticile functiilo vituale Sunt functii menbe nestatice. Daca a functie este declaatii vitual 'in clasa de baza, pentu fiecae functie din clasele deivate avand acelasi pototip se va face ezolujie dinamica. Supajncacaea functiilo viuale n clasele deivate nil este obligaoie. Daca supaincacan functia eu un alt pototip, este consideata 0 alta functie, deci se face ezolutie statica. Constuctoii nu pot fi functii vituale, destuctoul poate fi funcue viuala. FUJ1ciiJe inline.nu pot fi vituale, Exemplu Pentu exenplificae vom elua claselc Pesoana i Algajat (eu 0 midi simplifieae: elininan destuctoul si mesajele afisate in constuctoi). in clasa Pesoana von declaa funcna.sc -Le () ca funcpe vitualii. n plus, von mai deiva din clasa Pesoana!ilea a clasa denumita C'Ld eit.. in Glasa Client aclaugam codul BAN al clientului (ca data memba), funcjiilc de acees la codul BAN i doi constuctoi. Ese necesa sa utilizam includee conditionata. Fisleuj antet pesoana. h : #ifndef PERSOANA_H #define PERSOANA_H #include <iosteam> #include <sting> using namespace std; class Pesoana { public: PROGRAMAREA in LlMBAJUL CC++ PENTRU L1CEU, static int dct; potected: int d; sting Nunei public: lconstuctoi: Pesoana ( ) ; Pesoana(const sting& s); lfunctii de acces int Getld () ; sting GetNume{)i void SetNume(const sting&) vitual void Scie();, }; J #endif Obsevati ca am declaat functia Scie () ca functie vituala, pentu a. obtine ezolutie dinamica. Fisieul pesoana. cpp : #include "pesoana.h" pesoana: :Pesoana() { d==++dct; Nume==""; } pesoana::pesoana(const sting& s} { d=++dcti Nume==s; } lfunctii de acces int Pesoana: :Getld() { etun dj sting Pesoana::GetNume() { etun Nume; void Pesoana::SetNune (const sting& s) { Nune=Sj } void Pesoana: Scie () { c out c c Ld-c-c ' '«Nume«' 'vn ' } Fisieul antet angajat. h : #ifndef ANGAJAT_H #define fugajat_h #include "pesoana.h" PROGRAMAREA ORENTATA PF. OBECTE in C+ + class Angajat : public Pesoana { potected: sting Functiei int Salaiui publ.ic: int GetSalaiu () void SetSalaiu(intl sting GetFunctie(); void SetFunctie(sting) void Scie(); Angaja1:(); Angajat(const sting&, const int) i P...l"lga Jat (const s cing&, const s ting& ) ; #endif const int) 79,- -'..J - '--'

41 - :!, \ l,...,,- "/,i,i " "0 nd.d A H -seut angajat. cpp : An,.., A, in LMBAJUL CC++ PENTRU LCEU #include <iosteam> #include "angajat.h" int.gajat: :GetSalaiu() void Angajat: :SetSalaiu(int xl sting Angajat:: GetFunctie ( ) void Angajat: : SetFunctie (sting s) void Angajat: :Scie() { c out.c-ced-c c ' "<c.nume-c c ' '«Functie«' { etun Salaiu; { Salaiu::::x; } { etun Functie; { Functie :::: Si Angajat: :Angajat (const sting& SD, int s): Pesoana(sn) { Functie=sf; Salaiu=s; } Angajat::Angajat(const sting& sf, canst int 5) { Functie=sf; Salaiu=s; } Angajat: :Angajat () : Pesoana () { Salaiu=Oi Functie=""; ) Pisieul antet elient. h : #ifndef CLENT_H #define CLENT_H #include "pesoana.h" class Client: public Pesoana ( potected: sting Codlban; public: sting GetCodlban()i void SetCodlban{const sting&) voi.d Scie () ;. lconstuctoi Client () ; Client (const sting& sn, const sting& se); ) ; 4fendi't Fisieul c 1 i ent. cpp : #include "client. h " sting Client: :GetCodlban() { void Client: : SetCodlban(const void Client::Scie() '«Salaiu«'\n'i const sting& sf, const etun Codlban; } sting& se) { Cadlban=sei { cout«d«' "<cnume-c-c ' "<ccoo.ben-e e : 'vn ' ; Client: : Client () : Pesoana () {Codlban=" " ; Client::Client(const sting& sn, const Pesoana(sn) { Codlban=sci Fisieul cae contine funcia main ( ) #include <iosteam> ffinclude!'angajat.h" sting&, Pesoana () se) iinclude "client.h" using namespace std; PROGRAMAREA ORENTATA PE OBiECTE in C--l-t int Pesoana::ldCt=Oi int main () {pesoana x ("Vasileseu Ana"); Angaj at y ( "Papa on", "cas i e ", 5 0 0) ; Client z ( "onescu Dan", "R049A.AAA1B ") x, Scie () i y. Scie () i z. Scie () ; pesoana *p; p&x; p->seie(); p&y; p->seie(}; p&z; p->scie () etun 0; Executand aplicatia coustituia din aceste fisicc, obinem pe ecan : 1 Vasilescu Ana 2 Papa on easie SOD 3 oneseu Dan RO 19AAAA1B Vasilescu Ana 2 popa on easie lonescu Dn R049AAAA1B Obsevati ca, in acest caz, compilatoul analizcaza continutul pointeului, nu tipul acestuia, j se executa funcjia Seie () cocspunzatoae. Functiile vituale pue Dad! doim sa includem 0 functie vituala in clasa de baza i aceasa umcaza sa fie edefinitf in clasele deivate, da nu exista nicio definitie cu sens in olasa de baza, atunci putcm defini 0 functie viuala pua. ". Declaatia unei functii vituale pue: vital tip nume,_.functie{lista----paameci) =.:0; Constuctia = 0 anunta compilatoul ca nu cxtsta copul functiei, ca aceasta csle 0 functie vituala pua Tataea eollo utilizand clasa exception Biblioteca standad a limbajului C+ -+ contine 0 clesa pcutu tataca ccilc. Aceasta clasa se numeste exception si. pentu a utiliza aceasta clasa, tebuie sa includem fisieul antet cocspunzao : #include <excepcion> 81

42 82 PROGRAMAREA in LMBAJUL C/C++ PENTRU L1CEU PROGRAMAREA ORENTATA PE OBlECTE in C+ + 83, Din clasa exception au fost deivate c1asele: Numele clasei Desciee i exception Clasa de baza peuu oae excepjiile standad in C i, bad_alloe Excepjii cae pot fi geneate la alocaea dinamica a memoici (ell opea. toul new) - se inceaca alocaea dinamica a unei zone de ncmoic, da i nu exista suficlenta memote disponibfla. i bad_cast Bxceptii geneate de opeaoul dynamic_cast, cae apac atunci cand se conveteste un pointe sau 0 efeiua ta un object al clasei de baza nt-un pointe la un obiect al clascl deivate. bad_exception Excepjiile bad_exception SU'l1 geneate de eoi ncasteptatc. cae nu sum captuate de niciun cecch. bad_typeid Opcaout typeid cuneaza infomaui dcspc tipul unui obiect. 0 coae bad_typeid ese gencata la inceeaca de a aplica opcaoul t.ypeld unei expesu vide. logic_eo Eoi logice geneate de pogam. Accasta cstc ctasa de baza peuu domain eo, inva1id_agunent, 1engtlLeo, out_of_ange.! domain_eo Exceptie gcneata atunci cand estc utilizat un domcniu matematic invalid., invalid agument Eoac gencata de paamcti incoccti. length_eo Eoae geneate la ccaea unui obiect a caui lungime dcpaseste lungimea maxima adnisa. out - of_ange Eoae geneata auinci cand un indice cste in afaa domeniului (pentu clasa vecto de exemplu, sau bitset, de cate opeatoul de indexae l l ). untime_eo Eoi geneate in iupul cxecutici poganului. Aceasta estc clasa de baza pentu oveflow_eo, undeflow_eo, ange_eo. oveflow_eo o exceptio geneate de -0 coae matenaica de tip oveflow (depasic supenoaa a domeniului de valoi). ange_eo o excepie geneata de incecaea de a memoa 0 valoae cae se afla in afaa domeniului de valoi. undeflow_eo o exceptie geneata de 0 eoae matemauca de tip undeflow (dcpasie ' infeioaa a domeniului de valoi) [ exception bad alloc logic_eo bad_cast bad_exception untime_eo domain eo invalid_agument: length_eo out_of_ange ange_eo oveflow_eo '! i Functia memba what ( ) n clasa exception i in clasele deivate exista 0 functie memba denumita what (). Functia etuneaza mesajul de eoae coespunzato unei eoi apaute. Exemplu de utilizae a exceptiei standad bad_alloc : #include <iosteam> #include <exception> using namespace std; int main () {ty { int* v= new int[looooooooo]; catch (exception& e) { cout «"Standad exception: etun 0; } Pe ecan se va afisa : Standad exception: std: :bad_alloc Exemplu de utilizae a exceptiei standad bao_typeid: «e.what() «'\n' #include <iosteam> #include <exception> #include <typeinfo> using namespace stdj int main () {ty { sting* p=o; typeid(*p) ; itentativa de a identifica tipul unui obiect inexistent ) catch (exception& e) {cout < "Standad exception: " < e. what () < '\n 1 j } etun 0; "Auncaea" explicita a unei eoi standad Functia CitesteNenul () va "aunca" explicit 0 exceptio de tip untime_eo in cazul in cae se citeste valoaea O. Obsevati ca pentu a putea utiliza clasa untime_eo am inclus stdexcept. #include <iosteam> #include <stdexcept> using namesace std; c.j, i,-bad_typeid undeflow_e:;.o int CitesteNenul() {untime_eo eoae ("Numa int val; nul" )

43 C""' 84 PROGRAMAREA in LMBA.lUL C/C+..- PENTRU LlCEU cin» val; if (val == 0) thow{eoae); etun val; int main () { ty ( int x=citestenenul()i cout«x; ) catch (untime_eo& e) { cout«"eoae captuata: "«e.what (); etun 0; La intoduceea valoii 0, pogamul va aflsa pe ccan : l PROGRAMAREA ORENTATA PE OHiECTE in C.,. -j int CitesteNenul() {int val; cin» vaj.; if (val =:= 0) thow ExceptiaMea ("Numa nul") ; etun val; int main () { ty { int x=citestenenul()i c out c c x catch (ExceptiaMea& e) { c out;«-c" Eoae captuata: "«e.whet; () ; etun 0; 85 Eoae captuata: Numa nul C""',, Deivaea popiei clase de exceptii din clasa exception in c+ +, pot fi "auneate" eoi de oice tip, da acest lucu este imposibil in alte limbaje de pogamae. De exemplu, in Java sau in eneste posibila numai "auncaea" unei eoi standad sau 0 eoae de un tip deivat din ec-ile standad. Unifomizaea nodului de taae a eoilo poate face pogamele mai uso de inteles si de tnetinut. Exemplu Vom deiva din clasa logic_eo 0 clasa denunita Except Labtee.. Declaatia clasei : #ifndef EXCEPTAMEA_H #define EXCEPTAMEA H #include <stdexcept> class ExceptiaMea : public std::logic_eo {public: ExceptiaMea(const cha * $); }; #endif EXCEPTAMEA_H Definina constuctoului : ExceptiaMea :: ExceptiaMea Cconst cha * s) std: :logic_eo(s) { } in functia Ci testenenul () vom "aunca" 0 cxccpue de tip ExceptlaMea in cazuj in cae se citestc vajoaea 0 : #include <iosteam> ttincluje "exceptianea.h" #include <stdexcept> using namespace std; Execitii i pobleme popuse 1.. Un obiect este pentu 0 clasa ceea ce... a. caine este pentu pisica. b. filosof este pentu Kant. c. Nichita Stanescu este penu poet. d. cate este pentu biblioteca, 2. Pesupunand ca ati definit a clasa denumita Factua cae conine data memba nestanca pivata Cod, ce etine codul factuii. Consideand un obiect F de tip Factua, cae dinte umatoaele instuctiuni aflseaza coect codul factuii? a. cout c-ep. Cod; b. cout«f (Cod) ; c. cout«factua.cod; d. Niciuna dinte vaiantelc pecedente. 3. Pesupunand ca n clasa Factua de la execitiul pecedent este definite a functie memba nesanca publica dcnumita Total ( ), ce etuneaza suma totala de pc factua cucuta. Considcand obiectul F de tip Factua, cae dinte umatoacle instuctiun! aflseaze coect toalul de pe factua? 3. cout«f. ''ot.al () i c. cout«factua.total()i 4. Pesupunand ca clasa Factua de la execitiul pecedent este definita 0 funcuc memba nestatica publica denunitf Scie (), cae afiscaza pe ecan date efcitoae Ja factua cuenta. in dcfinitia acestei functii in exteioul clase! ne putem efci la data memba Cod astfel : a. F.Cod c. Cod b. cout«factua: :Total(); d. Niciuna dinte vaiantcle pecedcntc. b. this->cod d. Faccua.Cod

44 - - uncue este 12 definita in exteioul clasei. cae este antetul coect pentu definitia functie] 1 Scie()? 86 PROGRAMAREA in UMBAJUL C/C +--1 PENTRU LCEl, f'. PROGRAMAREA ORENTATA FE Ol3lECTE N C Pesupunand ca supa'indidim ca fuuctie fi.end opeatoul -;. i' doim sa funetioneze A i sub foma F1 +F2...-F3 (unde FL P2, F3 sunt obiecte de tip Factua). n accst caz tebuie sa : a. Factua::void Scie() c. void Factua: :Scie() 6. Cae dinte umatoaele vaiante stucto al clasei Fec t uz-a? a.void Factua(); c.void Factua: :Factua() b. void Factua.Scie{) d. Factua::Scie() epezlnts 0 declaatie coecta pentu un conb. Factua ( ) d. FactuaCanstucto(); 7. Consideand ca antetul constuctoului clasei Factua este Ea c t u a (int=l, sting=" Anonim"), cae dinte umatoacle declaatii sunt coecte? 13. a. supa'incacam opeatoul + pentu a accepta 3 paameti ; b. etunam ca ezultat un obiect de tip Factua; c. etunam un ezultat avand un tip standad al limbajului C+ + ; d. supatncadim opeatoul + taa paameti, astfel incat la apel sa poata accepta un numa vaiabil de paameti ; e. Niciuna dinte va-iantele peccdcnte. Pesupunand ca am supaincacat opeatoul bina * ca functie memba publica a clasei Factua, ia Fl si F2 sunt doua obiece de tip Factua, 'cae dinte umatoaele va iante epezinta 0 utilizae coeca a acestui opeato? { a. Factua F; c. Factua F(7); b. Factua F(7, "Papa Vasile") d. Factua F("Fopa Vasile"); 8. Cae este declaatia coecta pentu destuctoul clasei Factua? a. -Factua (int); c. -Factua () ; 9. Cae dinte umatoii constuctoi pentu clasa Factua pot coexista? a. Factua (int) ; c. Factua(int, sting=""); b.void -Factua(); d. -Factua(Factua&) 10. Cae este declaatia coectaa constuctoului de copiee al clasei Factua? a. fiend Factua(Factua); p. Factua(censt Factua&); c...eid Pec t u a : : -act.ue (const Factua&); d. Factua& Factua (const Factua&); e. Factua Factua(Factua&); f. Niciuna dinte vaiantele pecedente.. b. Faciua(int=O, sting=""); d. Factua ( ) ; 11. Pesupunand di am supatncacat opeatoul bina + ca functie pietcna a clasei Factua, cae vaianta poate fi un antet coect al definitiei opeatoului +? a. fiend Factua opeato+(factua, Factua) b. Factua opeato+{const Factua&) c. Factua opeato+(const Factua&, const Factua&) const d. Fact.ua opeato+(const Factua&, const Fact:ua&) e. Fact:ua& opeato:+(const Fact:.ua&, canst F'actua&) f. Niciuna dinte vaianele pcccdcmc a. Fl *F2 c. Fl.opeato*(F2} b.opeato*(fl,f2) d. Niciuna dinte vaiantele pecedente Pe oice facua tebuie sa fie specificata valoaea taxei pe valcae adaugata (TVA). Cae dinte umatoaele vaiante epeaina cea mai adecvata modalitatc de a etine valoaea TVA-ului? a. Data memba nestanca c. Va-iabila globala : b. Data memba statics d. Vaiabila locala funcuei Scie (). Pesupunand ca Fima este 0 data memba statica de tip sting a clasei Factua, cae dinte umatoaele afimatii sunt coecte? a. Data memba Fima tebuie initializata chia de 1a declaaea sa in cadu1 declaatiei clasei Factua astfel : static sting Fima:=o""; b. in fisieul cae conine fuuctia main (), initializam Fima ca vaiabila globala astiel : st"ing Fa'c't.ua":: Fi-ma=-"vasileSRL"; c. in functia main ( ), initializam Fima ca vaiablla locals astfel: sting Factua: :Fima="VasileSRL"; d. Declaant un obiect F de tip Factua i apoi initializam Fima ca membu a] lui F astfel: F. Fima::: "VasileSRL". Pesupunand ca supalndici'im opeatoul = pentu c1asa Factua, cae dinte unatoaele vaiante epeztma 0 declaatie coecta pentu acest opeato? a. fiend Factua opeato=(factua&, const Factua&) b. Factua& opeai.::.o=(const Factua&) i c. Factua& opea't.o={factua&, Factua&) const; d. Factua& opeao(const Factua&) const; c. void opea LOT"" (Factu:caD:, const Fac:"ua&); f. Niciuna dinte vaiantelc pecedente...., -

45 88 PROGRAMAREA in LlMBAJUL C/('-t--!- PENTRU LlCEC PROGRAMAREA ORENTATA PE OBlECTE in C+ + 89,, '" "' "',, - ': Pesupunand ci'i supaincacam opcatou! < pentu a afisa 0 facua, cae dine unatoaele vaiame epezinta 0 dcclaane 'coeea a acestui opeato? a. fiend Factua opeao«(osteam&, canst Factua&); b. fiend osteam& opeato«(osteam&, Canst Factua&) c. fiend void opeato«(const osteam&, canst Factua&); d.osteam& opeato«(osteam&) C.osteam& opeato«(osteam&, Factua)i f. Niciuna dinte vaiantele pecedente. Pesupunand cii doim sa supaincacan pentu clasa Factua opeatoul ++ ca functie publica memba a clasei, ata in foma pefixata, cat si in foma postflxata. Cae dinte umatoaele afimatii sunt coecte? a. Tebuie sa supaincacan opeatoul ++ de doua oi, cuunaoul pototip Factua& opeato ++ (),... b. Tebuie sa supaiucacam opeatoul ++ 0 singua data, cu umatouj pototip Factua& opeato ++ () ; c. Tebuie sa supatncacam opeatoul ++ de doua oi, eu umatoaele pototipui : Factua& opeato ++()i Factua opeato +(); d. Tebuie sa supaincacam opeatoul + + de doua oi, eu unatoaele pototipui F'actua& opeato +()i Factua opeato + (int) c. Opeatoul ++ nu poate fi supatncaca pentu clasa Factua; f. Niciuna dinte vaiantele pecedente.. Pincipalul nctiv pentu cae utilizam diectivele pepoceso #define, #ifndef, #endif in fisieul antet al unei clase este ca... a. doim sa atibuim un nume semnificaiv fisieului antet espectiv ; b. ne asiguam ca astfel clasa a fost declaata inainte de a fi utilizata ; c. astfel evlam declaatia multipla a unei clase in cadu aceleiasi aplicatii ; d. ealizam 0 economic de memoie Pin supaincacae... a. cste posibil sa definim mai multe funcni cu acccasl lista de paamcti, da ell nume difeite ; b. sa definim mai multi destuctci pentu 0 clasa ; c. sa definim mai multi constuctoi pcntu 0 clasg ; d. sa definim mai multo functi i cu acelasi nume, da cae iebuie sa difee pin tipu] ezultatului ; e. sa definim mai multe funqii cu acclai nullc, da cae tebuic sa dih:c pill ista paametijo; f. putem s utilizam funqii cu Ull singu nume pentu a iniplemcnta toate opeaiilc llecesae. 21. Cae dinte unatoaele peechi pot epezenta 0 elatie de ipul clasa de bad)! clasii deivaui't a. Punct/Poligon; c. Cec/Tiuughi ; a. class Y: public X c. class X: public class Y 24. Cae dinte umatoaelc afinatii sunt coecte? b. Cilindu/Cec; d. Poligon/Poligon convex. 22. Cae dinte umacoacjc va-iante epez.inta fapul ca am deiva clasa X din clasa Y, eu specificatoul de acces public? b. cls Y: public class X d. class X: public Y 23. Consideand ca am deivat public clasa X din clasa Y, ia in clasa Y este declaata data memba d eli specificatoul de acces potected, cae dinte unatoaele _afimalii sunt adevaate? a. Nu aven acces la d in clasa x. b. Aven acces la din oice functie din x. c. Avent acces la din oice functie pietcna cu clasa x. d. Data memba d tebuie edeclaata in X pentu a avea acces 1a ea. e. Aven acces 1a d numai in clasa y si functiile pietene ale clasei Y. f. Niciuna dinte vaiantele pecedente. a. Oice opeato din limbajul C+ + poate fi supaincacai. b. Pill supalncacae putem modifica attatea opeatoilo. c. Pin supaincacae pioitatea i asociativitatea opeatoilo nu se schimba. d. Toi opeatoii pot fi supaincacati atat ca fuuctii fiend, cat i ca functii menbe ale clasei. e. Pentu oice clasa ceam tebuie sa supaincacam toti opeatoii limbajului. f. Uni! opeato: pot fi supaincacati ata ca opeato! una-i, cat i binai. 25. Sa consideam ca A este clasa de baza pentu clasa B, ia Beste clasa de baza pentu clasa c. Cand ceep un obiect al clasei c : a. Se apeleaza nai inai un constucto al clasei A, apoi W constucto a clasei B, apoi un constucto al clasei C. b. Se apcleaza mai intai W1 constucto aj clasei C, apoi un constucto al clasci B, apoi un constucto al clasei A. c. Se apeleaza doa un constucto ai c1asei C. d. Este posibil sa nu se apeleze niciun constucto, in cazul in cae clasele nu au constuctoi definiti. 26. Definiti 0 clasa denumita Caine. Datele membe VOl' fi codul de idcntificae, numcle, asa, anu1 na teii. Datele membc VOl' fj dcclaatc pivat.e. Declaali funqii membe publice pentu acces 1a date.i pemu afiae. Scieti 0 aplicatie in cac sa demonstati ca aceasta clasa functioneaza caect.

46 90 PROGRAMAREA in LMBAJUL CC ++ PENTRU UCEU 27. Complex Un numa complex poate f epezentat in foma algebica. etinand patca eala si patea imaginaa a numaului. De exemplu, z=2. 5-3i cste un numa complex (2.5 este patea eala, ia -3 este patea imagtnaa a numaului). Definiti o clasa denumita Complex pentu Jucul eli numee complexe. Datele membe vo f patea eala i patea inaginaa a numaului (ambele de tip double, ambele pivate). Definiti constucoi, funcjii de acces i opeatoii specifici pentu lucul eli numee complexe. Deuonstati int-o aplicatie ca aceasta clasa functioneaza. 28. Euclid Utilizati clasa Bignt pentu a ezolva unatoaea poblema. Este bine-cunoscut algoitmul de calcul al celui mai mae divizo eomun (emmde) eu algoitmul lui Euelid pin impatii epetate. Confom acestui algoiun, cmmdc a doua numee natuale nenule a i b se calculeaza pastand estul mpatih si eluand impatiea cu vechiuj impattto i vechiul est. Algoitmul se va temina cand estul impatif devine zeo. Cel mai mae divizo comun al celo doua numee a si b va fi ultimul inpatito. Pentu calculul celui mai mae divizo comun al peechii (16,22) se vo efeetua succesiv impatiile : DeLnpe t d t; mpalito Rest Pasul Pasul Pasul Pasul Pasul 5 Vom numi un "pas" 0 opeatic de impatie ce intevine in calculului cmmdc. Se obseva ca pentu deteminaea cmmdc(16,22) =2 au fost neeesai 5 pasi. Ceiua Cunoscand valoaea unui numa natual D, scieti un pogam cae detemina 0 peeche de numee natuale (a, b) mai mid sau egale eu D, al cae cmmdc se obtine tn-un numa maxim de pasi. Daca exists mai multe peechi eu aceasta popietate, se va afisa eea minima. Spunem di peechea (a, b) este mai mica decat peechea (x, y), daca a-ex sau a e x si b<y. Date de intae Ftsieul de intae euclid. in contine un singu numa natua] n (4<n<1 0 2 ).. Date de iesie Fisieul de icsie euclid. out va contine pe pima linie numaul maxim de pasi deteminat. A doua linie va contine un numa natual a epczentand p imul numii al peechii minime identificate, ia pe a eia linie se va seie uuuaul b epezentand al doilea numa din peeche. - Exemple 1-J:<.VlJl",Vl.U,"l;,n. Vf\.Jl;,'' n. Ln. J.:. VLaJ.:.\... J.:. ""... T, n euclid.in euclid. out Explicatie B 5 Numaul maxim de pasi pentu oicae peeche 5 de numee mai mici egale eli 8 este 5. Peechea 8 (5, 8) este minima eu aceasa popietate Numaul maxim de pasi pentu oncae peeche de numee mai mici egale cu ese 48. Peechea ( , ) este minima eli aceasta popietate. Ceinta Date fiind un set de eguli si textul in cae' tebuie ealizate inlocuiile, sa se detemine foma finala a textului, Date de intae Fisieul de intae eplace. in contine pe pima linie numaul natual N (O.:o;N::;;10) epezentand numaul de eguli. Umatoaele 2N Hnii contin peechi de siui, pimul si din peeche fiind siul cae se cauta, ia pe andul iuediat umato siul cu cae tebuie inlocuit acesta. Ultimul and a1 fisieului de inae contine textul in cae se vo face inlocuiile. Date de iesie Fisieul de iesie eolace. out va contine 0 singua linie pe cae va f texul obnnu dupa aplicaea eel o N eguli de inlocuie, scis -C '-'...J.J -

47 .-,.-,,,... -;,, -t,!,, i ;- 92 PROGRAMAREA in LMBAJUL CC ++ PENTRU LCEU Exemplu eplace. in eplace. out 3 azi_es c e..va.ne als a., eace jvesej esti es"te joi vinei āzi esti joi si esti vesel (Olimpiada Municipala de nfomatica, asi., 2009) 30. Modificati clasa Bignt astfel incat sa uceze cu numee natuale scise in baza b (b<=3 6). Un numa in baza b utiiizeaza b cife (cifeje mai mai decat 9 fiind eodifieate eu Htee din alfabetul englez A=10, B=l1, "', z=35). 31. Deivati din clasa Biglnt 0 clasa cae sa impjementeze numeele tntcgi mai. Adaugai 0 data memba cae sa epezinte semnul nunaului 1;>1 supaincacati functiile i opeatoii in mod coespunzato. 32. Timp Ceati 0 clasa denunita Timp pentu a memoa timpul expnna in ae (de la 0. Ja 23), minute (de la 0 la 59) i seeunde (de la 0 a 59). Ceati un constucto cu tei paameti (pentu ae, minute, secunde), avand toti valoile implicite o. Constuctoul tebuie sa veifice faptul ca estictiile specificate pentu oa, minute, secundc sunt espectate. Supaincacati opeatoul de citie si opeatoul de afisae pentu c1asa Timp (impul va fi afisat sub foma oa :minute: secunde, ninuele i secundele avand exact deus ci.fe). Supaiucacati opeatoul + pentu a aduna doi timpi. Daca pin adunae se depaseste 23 : 59 : 59, se obtine ca ezultat timpul coespunzato din ziua umatoae. Supaincacati opeatoul - pentu a scadea doi timpi. Daca scazatoul este mai mae dedit descazutul, afisati timpul coespunzato din ziua pecedents. Supaincacati i opeatoii +=, espectiv - e. Supaincacati opeatoii de cgahcate si elationali. 33. Dentist Ceati 0 clasa denumita poganaedentist,in cae sa utilizati c1asa ''i.np constuita la poblema pecedenta, pentu a ezolva unnaoaea poblema. La un cabinet stomatologic, secetaa ealizeaza pogamaea pacientilo. Pentu fiecae pacient pogamat, edne numele, timpul la cae pacientul doese sa fie pogamat (oa i minutul), espectiv duata maximahi estimativa a tatamentului (deteminata pe baza vastei expeiente a secetaei i expimata. de asemenea in oe i minute). Doctoul luceaza dupa umatoul algoitm: ;, PROGRAMAREA ORENTATA PE OBJECTE N C soseste la cabinet laoa la cae este pogamat pimul pacient ; nu luceaza mai mutt de 8 oe; cand temina de tatat un pacient. ia duata cfectivs a tatamentului este mai mica dedit duata maximala estimata. doctoul se odihneste in timpul amas pana la duata naximala estimate : secetaa ae suficienta expedcnta st estimeazf coect duata maximala a unui tatament, astfel ca doctoul nu depaseste niciodata duata maxiuala a tatamentului unui pacient ; dupa teminaea tatamenului unui pacient (si a eventualei peioade de odinna), doctoul invita in cabinet umatoul pacient poganat ; doctoul nu supota sa existe pacienti in sala de asteptae ; fiecae pacient vine exact la oa la cae este poganat i inta imediat in cabinetul doctoului. in fiecae zi, secetaa analizeaza istapogamailo pentu a doua zi i anuleaza 0 seie de pogamai (telefonand pacientilo pentu confinnae sau pentu epogamae in alta zi), astfel incat : toate esttctfile din algoitmul de lucu al doctoului sa fie espectate ; doctoul sa tateze un numa maxim de pacienti. Scieti un pogam cae afiseaza ista pogamailo confinate pentu a doua zi. 34. Polinoame Un polinom poate fi epezentat ca un vecto in cae etinem coeficientii acesuia, pe pozitia i in vecto fiind plasat coeficienul mononului Xi. De exemplu, a polinomul de gad 5 P {x ) =X 5-4X3+2X+1S, vectoul de coeficienti va fl : p o Constuiti 0 clasa denumita Polinom pentu lucul eli polinoamc avand aceasta epezentae. Scieti 0 aplicatie in cae sa demonstati functionalitatea clasei. 35. Poligon convex Ceati c1asa Punet pentu epezentaea unui punct in plan specificat pin coodonatele sale caeziene. Ceati clasa Segment (un segment fiind detemina de doua puncte in plan). Utilizand clasele Punct i Segment, ezolvati unatoaea poblema: n fisieul convex. in se afla pe pima linie un numa natual n (35n:S: 1000) epezentand numaul de vafui ale unui poligon convex. Pe umatoaele n linii sunt scise cae doua nunee eale epezentand coodonatele vafuilo poligonului (in odinea abscisa. odonaa). Vafudlc poligonujui sunt specificate in flsie in odinea pacugeii poligonului in sensul aceo de ceasonic. in fisieul convex. out afisati pe inii sepaate peinetul i aia poligol1ului.convex citit din fi ieude intnie.

48 '-..-i 94 PRQGRAMARF.A in LMBAJUL CC++ PENTRU UCEU 36. Sfee Delvan din clasa Punet clasa Punct3D pentu epezentaea unui punet ill spatiu, spccifica de asemenea pin coodonatele sale cateziene. Definiti. clasa Sfea (0 sfca fiind idemificaa pin coodonateie cenului sau - un punc in spatiu - i aza). Uil izati clasele Punct3D sl Sfea pentu umatoaea poblema: Flsleul de Jntae sfee. in contine pe pima inie un numa natual n (2SnS100), epezenand HUmaTU] de sfee, ia pe umatoaele n Jlnii die patu nunee Teale Y.. y Z, epezentand coodonaele centului i aza pentu fiecae dine cele n sfee. Scieti un pogam cae sa veifice dad! exista eel putin doua sfee cae se inesecteaza. PogamuJ va afisa pe ecan mesajulda sau mesajul NU, dupa caz. 37. Date calendaistice Ceep 0 class pentu lucul cu date calendaistice. Scleti 0 epllcaue in cae sa demonstap ca aceasta class fuucjioneaza. 39. Biblioteca Studiati activitatea de la biblioteca scolii i eaiizati 0 eplicape cae sa pemja gestiunca unci biblioteci scolae. La biblioteca tebuie sa etinem : evidenta catilo (pentu fiecae cate etinen cota di!ii, titlul, auoul, ediua, anul apaijiei) ; aplicajia tebuie sa pemia adaugaea unei cati, segeea unci catt, cauaea catilo dupa titlu (cautae cu potivie totals sau patiala), diutaea tutuo catijo unui auto etc. ; pentu caile de speciaiate, eineti domeniuj caqii (infomatica, dept, medic ina ClC.); apjicatia tebuie sa ealizeze caudii dupa domeniu ; evidenta cititoi1o (penfu fieeae citito etinem coduj de identificae a eititoujui, llumeje, adesa, telefonul, -uj); aplicaia tebuie sa pemwl adaugaea L111ui dtito, tegeea unui eitho, cautaea cititoilo dupa nume (eautae cu potivie totala sau paqiaja), diuaea unui citio dupa codul -de idchificae etc. ; evidena impumutuio (un impumut este identificat pin cota ditii impumutate, codul cititouui cae a impumuat caiea, data 1a cae a avut loe impumutul i data la cae a fost estituita caftea impumutaa; utilizati pentu epezentaea datelo calendaistice cjasa definita 1a poblema pecedenta); apicaia tebuie sa pemita eajizaea unui impumut, estituiea unci cai, vizualizaea tutuo impumutuijo estante (catile pentu cae lemenuj de pedae a fost depait, impeuna cu datee cititoilo cae au impomutat aceste cati), vizuajizaea tutuo impumutuilo unui eitho, vizualizaea lutuo eititoio eae au inpumuat 0 anumita cae etc. ilt-o data memba statidi yeti etine numaul de zile pento cae poate fi impumuata 0 cate (ace]a i pentu wate ditie j pentu top cititoii). PROGRAMAREA ORENTATA PEOBECTEij\' Cot i 39. Teste gila Constuit i clasele neccsae pentu a cal iza 0 aplicatie de lucu ell teste gini. Un test gila este fomat dint-un numa vaiabil de iteni. Un item consta int-o inebae pentu cae se ofea exact patu vaiante de aspuns, dinte cae doa un...! singu aspuns este coec. Cand se genecaza un test gila, se aleg in mod aleatoiu itemi distincti din ista iteniilo disponibill, numaul acestoa flind pestabilit (da taa a depasi 100). La ezolvaea unui test gija, pentu evaluae vom considea ca toi itemii din test au aceeasi pondee pentu calculul punctajului la test. La evaluae tebuie sa se afiseze punctajul total obtinut a test, da si feedback punctual pentu fiecae item. Feedbackul poate fi doa coect/ncoect sau puteti afisa un 1 feedback mai elaboat, specific itemului espectiv (pentu itenii cae.au asociat un i feedback constuctiv). 40. Blackjack Blackjack, cunoscut si sub numele de 21, este unul dinte cele mai populae jocui de cani de casino din lume. Reguile jocului pot fi consultate pc ntenet (de exemplu, vezi Constuiti clasele necesae si ealizati o aplicatie pentu jocul de Blackjack. 4]. Catalogul electonic Coustuiti clasele necesae si poiectati 0 apticaie cae sa funcnoncze ca un catalog scola electonic. Catalogul electonic contine catalogul coespunzato fiecaei clase din scoala. Catalogul unci clase confine oti elevii clasei, cu notele (inclusiv nota la teza, daca este un obiect cu eza) i absentele (motivate i nemotivate) la fiecae obiect. Catalogul tcbuie sa pemita teate opeatlie pemise in catalogul "oficial". 95 -', 1...J...J -' - i,...j -'...J

49 ",J'''''-'' 97 using nanespace std; -,!,, C"' : 3. Elemente de pogamae geneidi Pogamaea geneica este 0 paadigms de pogamae ce ae ca scop poiectaea componentelo softwae (algoitmi, stuctui de date, mecanisme de alocae a memoiei etc.) -lnt-un mod abstact (sau geneic), astfel incat utilizaea acesioa sa fie posibila in contexte cat mai vaiate. in acest scap. accentul este plasat pc oganizaea acesto componente astfel inca; sa poata fi eutilizate -5i exinse in divese situatii si pc dezvoltaea algoitmilo si, pin unnae, sa fuuctioneze eficient indifeent de tipuile/stuctuile de date implicate. Pogamaea geneica pesupune Ull nivel inalt de abstactizae i ae 0 complexitate idicata, da este a abodae nauala : indifeent ca sotam numee, oi sau elevi, metoda de sotae utilizata este pactic acecasi. Concet, pentu ca aceeasi secventa de cod sa poata functiona pentu tipui de date difeite, nu este necesa sa 0 escien pentu fiecae tip de date, ci vom considea di tipul datelo este un paametu. n C++, pogamaea geneics este posibila utilizand functii 1;>i clase paametizate dupa tip. Acestea sunt denumite functii/clase sablon (template): 3.1. Functiile sablon o functie sabion este 0 functie pcntu cae eel putin unul dine tipuile de date utilizate este paametizat. Functia sablon coespunde unei familii de functii, cae ealizeaza aceeasi pelucae, da asupa uno d'ate de lpui dife-lte. Declaaea/definitia unei functii sablon este pccedata de : template <class '1'1' class 'f 2,..., class T k> Ulteio, in antetuj sau in copuj functiei, pot f utilizae tipuile ''J, 'f 2,., T".. Exemplul 1. Minimul a doua valoi De exemplu, vom scie a funcpe sablon pcntu dcteminaea minimului a doua valoi. Yom pezenta un pogam complet, pentu a exemplifica modul de declaae, definie si apelul unci astfel de functii. :' #include <iosteam>, #include <sting> il /declaatie T minim (T, T); tempate <cass T> int main () {st.ing 51 ("Ana ae 'mee") 52 ("Anatol"); int i1==8, i2==5; double xl=3.l4, x2==1.5; lapel cout«"min sting: "«minim(51,52)«' \n' ; cout«"min int: " «minim(il,i2)«'\n' cout«"min double: "«minim x t. x2 ) < ' \n ' i etun 0; ) idefinitie template <class T> T minim(t x, T y) { if (x<y) etun X; etun Yi Functia minim () poate fi ape lata pentu oice tip de date T pentu cae est definit opeatoul -c, Exemplul 2. Afisaea a doug valoi de tipui difeite Pentu a exemplifica modul in cae declaam. definim $i apelam 0 functle sablon cae acccpta mai multe tipui ca paamct-i, vom constui.functia Scie (), cae pimese ca paaneti doua valo! de tipui (paamettzatc) potential difette s! afiseaza pe ecan vajoile espective. Pesupunem ca in cazuj tipuilo pentu cae apelan functia exists opeatoul de afisae < < supaincacat. #include <io5team> #include <sting> using name-space std; /declaae template <class ''L, class '2 > void Scie (Tl, '2); int main () {sting sl("ana ae mee"), s z vana t.olvj. int il==8,- i2:=5i double xl""3.14, x2:<i. 5; lapel Scie(sl, il} i Scie(x2, 52} Scie(il, 'xl); etu'n 0;

50 8 YKUuKANlAKCA N LMBAJUL CC++ PENTRU LlCEU ELEMENTE DE PROGRAMARE GENERC.\. 99 idefinie template <class T, class T2> void Scie(Tl a, T2 b) {cout«"pima valoae: "«a«" "., cout«"a doua valoae: "«b«'\n' Exemplul 3. Supainciicaea functiilo sablon Functiile sablon pot fi supaincacate, ca oice alte functii. Binetnjeles, la supa, jnoacae, tebuie sa ne asiguam eli functiile supaincacae difea flia ambiguujj pin lista paametilo. Pentu a exemplifica supaindicaea, definim functia inv () 0 data ell doi paameti (acestia vo fi inteschimbati) si 0 data eli un singu paametu (acestuia i se va schimba semnul algebic). #include <iosteam> #include <sting> using nespace std; template <class T> void inv{t&) i template <class T> void inv{t&, T&}; int main () {int i1=8, i2=5; double x1=3.14., x2=1. 5; inv(i1}; inv(il, i2); inv(x2); inv(x1, x2); cout«il«' «i2«\n' cout«x1«' '«x«'\n'; etun 0; template <class T> void inv(t& xl { x=-x; } template <class T> void inv(t& a, T& b) { T aux=a; a=b; b=aux; 3.2. Clasele sahlon o clasa sablon estc 0 class pentu cae eel putin unul dinte tipuile de date utilizate estc paametizat. Clasa sablon coespunde paetie unei familii de elase similac, cae supota acelcas! pelucai, Din punet de vedee sintactic, declaatia/deflnitia unei clase sablon este pecedata de 0 constucue de tipul : template <class Tl' class T 2,..., class T k > n definijia clasei, evident, se utilizeaza tipuile T 1, T 2,..., T k Pentu a utiliza 0 clasa sablon, tebuie sa specifican numelc clasei. umat de tipul actual incadat nte paanteze unghiulae (xc.). in cazul in cae clasa admie ca paameti mai multe tipui, tipuile actuale vo fi specificate inte paanteze unghiulae, sepaate pin vigula. Exemplu. Clasa sablon Stiva Stiva este 0 stuctua de date absacta, cae supota doua opeatii : - inseaea unui element la vaful stivei - extageea elementului din vaful stivei. Deoaece aecesul este limitat doa la elementul din vaful stivei, aceasta stucua de date functioneaza dupa pincipiul LFO (Last n Fist Out - ultimul intat, pimul iesit). Pentu exemplificae, vom defini clasa sablon Stiva caesa impjementeze acest tip de date abstact. Vom considea dept paametu tipul T al elementelo din stiva. Vom epezenta 0 stiva ea un vecto s cu maxim SMAX elemente de tipul T; data memba vf indica vaful stivei. Vom include 5 functii membe publice: Push () (inseeaza un element in stiva, la vaf), Pop () (extage elemeutul de la vaful stivei), 'Pop () (acceseaza elementul de la vaful stivei), Empty (l. (veifica dadi stiva este vida) si Size () (cae euneaza numaul de elemente din stiva). #ifndef STVA_H #define STVA_H #include <stdexcept> #define SMAX using namespace std; template <typename T> class Stiva {potected: int vf; T s[s]; public: S.tiva() { v =-l; '& Top (J {logic_eo e (" Stiva vida") j i L w i...;.,! i, 1, -'

51 L, -' l : } ; #endif /1 STVA_H PROGRAMAREA in.jmbajul c:«: H if (vf<o) thow e; etun s [vi J i T PoP () {logic_eo e("stival vida") i if (vf<o) thow e; etun 5 [vf--] i void Push (canst T& xl {logic_eo e("stiva pllna") if (v==smax-l) thok e; s[++vf]=x; bool Enpty{) {etun yf==-lj int Size() {etun yf+lj Aplicatie. Poblema SL PENTRU LlCEli Limbajul SL (Stack Language) uceaza ell 0 stiva (initial vida) j un singu egistu (cae initial contine valoaea 0). ub pogam in limbajul SL este fomal dint-o succesiune de instuctiuni, caw 0 iistuqiunc pe 0 linie, scise ell majuscule. n pogam, insuctiunile sunt numeoatc de la O. Executaea unui pogam ncepe eu pima instuctiune a pogamului. ns;tuqiunile limbajuiui SL sunt: nst-uctiune Efect Exemplu PUSH x ntoduce valoaea inte' ga Daca stiva ese : x in sttva. 1 2 si executam PUSH 4, -stiva va aaa astfe1 : STORE Valoaea de 1a vaful stivei Dad. stiva este : este exasa i este plasata in 1. egistu. 2 j executam STORE, stiva va aata astfe1 : 2 ia in cgistu se ami valoa ea 1. LOAD Conjinutul egisului ese Dad! egistul ae valoaea 4 si stiva este copiat i intodus in suva. 1 2 dupa executaea opeatiei LOAD egistul va uvea tot vaioaea 4. ia stiva este : ] 2 i ELEMENTE DE PROGRAMARE GENER1CA JO PLUS Extage din stiva doua Daca stiva este valoi (cele de la vaf), le 4 aduna i intoduce in siva 10 ezultatul. 2 a si executam PLUS, stiva va aata astfel : TMES Extage din stiv_a doua Daca am fj executat TMES pentu aceeasi valoi (ccle de fa van), e suva, am fi obdnut : inmultese i intoduce in 4 a stiva ezultatul. 2 a FZERO n J;)ONE Ceinpi Sceti un pogam cae sa cieasca un pogam i1 Jimbajul SL i sa il execute. Date de intae Fisieul de intae s 1. in contine pe pima linie un numa natual n epezentand numaul de instuctiuni din pogamul in limbajul SL cae umeaza. Umatoacle n linii contin cele n instucjiuni ale pogamului, cate 0 instuctiune pe C? linie. Dale de iesie Fisieul de iesie s 1. aut va contine 0 singua linie pe cae va fi scisa valoaea afisata de pogamul SL din fisieul de intae. Restictii Daca valoaca de a vaful stivei ese 0, atunci se sae 1a cea de a n- instucjiune din pogam. n caz conta, se continua executia cu instuctiunea umaoae. Afiseaza valoaca de la vaful stivei si ncheie executia pogamului (indifeent dad! mai exists sau nu instuctiuni). 2 ::; n 1000 in cazu1 instuctiunilo PUSH si FZERO exists un singu spatiu tne nume1e instuctiunii i agument. Agumentul instuctiunii PUSH este un numa integ din intevalul [-10000, 10000J, ia pentu FZERO un nuua natual din [0, i ooo j Pogamul din fisieul de inae este coect (nu va conine ciclui infinite, nu va cxtage 0 valoae dint-o siva vida).

52 '02 Exemple PROGRAMAREA N LMBAJUL C/C++ PENTRU LJCEU sl.in sl.out: Expltcat!e Executam acest pogam pas eli pas, umaind stiva i egistul PUSH 5 nstuctiunc Stiva Regist-u PUSH 3 PUSH PLUS STORE 3 PUSH 3 0 LOAD 5 FZERO 11 PLUS 8 0 PUSH 4 STORE 8 LOAD LOAD 8 8 PLUS DONE FZERO PUSH 10 4 PUSH 4 8 LOAD 8 TMES 8 DONE LOAD Solutie PLUS DONE PUSH 10 LOAD TMES DONE (.campion 2008) Von citi iustuctiunile pogamului int-un vecto P cu componente de tip sting. Ven pacuge secvenpal instuctiunile pcgamului i e vom executa. Pentu fieeae instuctiune, extagen cuvanul-chele a1 acesteia (cautand mai ntai caacteul spatiu eu functia memba a clasei sting find (), ap.oi extagem punul cuvant cu functia memba subst ()). n functie de instuctiune, executam opeatia ccespunzatoae, utilizand opeatiile implementate in clasa Stive. Obsevati ca in eazul instuctunflo PUSH si FZERO a fast necesaa i extageea numaulul si convesia sa in numa integ. #include <fstean> #include <stdexcept> #include "stiva.h" #include <sting> #include <cstdlib> #define NMAX 1000 using namespace stdi ifsteam fin ("s1. in") void citie () int executie()i int main () citie () i fout«executie()«'\n' fout. close () etun 0; void citie () {cha c; fin»ni fin.get(c)i fo (int i=o;.i cn. i++) get1ine(fin,p[ij,'\n'}i int executie () {int i, a, b, pazj sting op, sni fo (i=oj i<ni i++) {paz=p[i).find(' 'J; op=p[i].subst(o,poz) if (ap=="push") {sn=p[i).subst(paz+l)i S.Fush(ato.i (sn..data().); cont.tnue i } if (op=="store") { R=S.Pap()i continue; if (op=-="load") {S.Push(R)j cont i.nuc : } if (op=="plus") ( a=s.pop(); b=s.pop(); s.push(a+b) continue; } if (op== "TMES") ( a=s.pop(); b=s.pop(); s.push(a*b) continue;} if (op=="fzero") if (S.TOp()==O) {sn=p[i].subst(paz+l)j i=atai(sn.data())-lj continuej} if (op=="done") { etun S.Top()i } }, l03 1 L...: 1 '-' i 1 LJ t, : 1, -J

53 l j [ i,,...,. '! i l -'- J!- l. ; 1- ; l04 PROGRAMAREA in LMBAJUL C/C -H- PENTRU L1CEU ELEMENTE DE PROGRAMARE GENERCA Execitii i pobleme popuse 1. Constuiea unci functii sablon cste ecomandata atunci cand... a. este necesaa 0 functie cu mai multi paameti. b. sunt necesae mai multe functii cu acelasi nume, da cae ealizeaza pejucai difeite, in functie de paamei. c. sunt necesae mai multe functii, cae au paameti de tipui difeite, da cae ealizeazii aceleasi pelucili. d. este ncccsaa ceaea unei singue functii, pentu a nu cea confuzii. 2. Cae dinte unatoaele vaiane peceda definitia unei clase sablon? a. template <T> c. template class<''> 3. Pesupunand ca am definit clasa sablon X ell un singu tip ca paametu $i considcand di doim sa declaan un obiect ob, tansmitand constuctoului ca paametu valoaea 7, cae dinte umatoaelc declaatii sunt coecte? a. x ob (7) ; c. X<int> ab(7); 4. Definiti 0 funcue sablon cae sa detemine minimul dint-un vecto, indifeent de tipul componentelo vectoului. Apelati functia ceate pentu vectoi eu clemente de tipui dife-ite. 5. Definiti 0 functie sablon cae sa soteze un vecto, indifeent de tipul conponentelo vectoului. Apelati functia ceata pentu vectoi eu elemente de tipui difeite. 6. Unific b. <template class T> d. template <class T> b. X<int> ob=7; d.x ob<int>(7); Utilizand clasa sablon Stiva, ezclvati umatoaea poblema; Se considea un si A= (A, A2,..., AN)' fomat din N numee natuale nenule. Doutt numee se considea vecine daca se afla pe pozitii alatuate (Ai ae ea veeini pe A i - 1 i Ai+, pentu oice l<i<n, A 1 ae ea vecin doa pe A 2, ia AN ae ca vecin doa pe A N - l ). Daca doua clemente vecine Ai, Ai+! (li<n) au eel putiu 0 cifa comuna, ele se pot unifica. Pocedeul de unificae consta 111 ejiminaea din numeele Ai $i A i..- 1 a uuo cifelo eomune i adaugaca pin alipie a numaului obtinut din Aj.,.l la numaul obtillut din Ai, fomandu-se astfel un nou nuna. Numaul Ai va ti inlocuit ell noul 1Uma, ia numau Ai-l 1 va fi eliminat din $i. (De exemplu, llumecle A;.=23814 '$i A.'J= au cifcle 2, 3, 4 eomunc, dupa unificae obinem Ai.:o: 8 1 7, ia A i + l este eliminat; obsevati ca, daca dupa eliminaea cifelo eomunc numeele incep cu zeoui nesemnificative, acestea vo 1'i eliminate, apoi se eali zeaza alipiea.) Dadi in uma eliminaii cifeio comune. unul dinte numee nu mai ae cife, atunci numaul ezultat va avea cifele amase in celalalt. Daca in uma eliminaii cifelo comune atilt Ai cat i A j + 1 nu mai au cife, atunci ambele numce vo fi eliminate din si, tadi a fi inlocuie eli 0 alta valoae. Odinea n cae se fae unificailc in si este fmpotanui : la fiecae pas se alege pima' pecche de clemente veeine Ai A i + 1 cae poatc fi unificata, cousideand siul paeus de a stanga la deapta. (De exemplu, consideand Ai=123, Ai-l'1=234, Ai+2=235, se unifica A:-. eu Aid = > A i=14, ia unificaea cu umatoul numa nu nai este posibila.) Ceinta Cunoscandu-se siul eelo N numee natuale, sa se detemine: a. cifa cae apae eel mal fecvent in scieea tutuo eelo N numee ; daca exista mai mujte cife cu aceeasi fecventa de apaitie maxima, se va etine cea mai midi cita ; b. siul obtinut pin efectuaea unui nuna maxim de unificai, dupa egulile descise in enunt. Date de intae Plsleul de intae unific. in contine pe pima linie 0 valoae natuala N, ia pe umaoaele N linii, in odine, cele N numee natuale din siul A, cate un numa pe 0 linie. Date de iesie Fisieul de iesie unific. out va contlne pe pima linie un numa natual c epezentand cifa c,a.e apae eel mai fecvent in scieea eelo N numee natuale. Pe cea de-a doua inie, un numa natual N epezentand nunaul de numee natuale amase n si dupa efectuaea unui numa maxim de unificai, Pe cea de-a teia linie se vo seie cele N numee natuale amase, in odinea din si, sepaate pin cae un spatiu. Daca, in uma pocedeului de unificae, toate numeele vo fi eliminate, fisieul de iesie va contine 0 singua linie, pe cae se va scie cifa cae apae eel mai feevent in scieea celo N numee natuale. Resticjii 1 <; N <; Numeele din siul initial, pecum $i numeele obtinute in uma uniflcailo, nu vo depa i

54 log PROGRAMAREA in UMBAJUL C/C+-t PENTRU L1CEU Exemplu unific.inlunific.out o 837 Expticatii Cifa cae apae eel mai fecvem cste 3 (de 6 oij. Se unifica : 47 cu 67 = > 46. Siul amas : Se unifica : 6 co 46 = > 4. Siul amas : Sc unifica : 4 Cll 40 = > O. Siul amas : Se uniflca : 123 cu 231, ambele numee aman faa cife, dec! vo f ambele eliminate. Simi dimas: Se unifica : 1238 cu 331 = > 28. Siul amas:' a Se unifica : 28 cu 2035 => 835. Siul amas : Se uniflca : 835cu50007 => 837. Siul amas : 0837 (Olimpiada Judeteana de nfomatica 2013) 7. Constuiji 0 class sablon denunita Coada, cae sa implementeze aceasa stucua 'de date. Anintim ca 0 coada este a suctua de date abstacts cae pemite umatoaele opeatii : - inseaea unui clement 1a sfasiul cozii - extageea elementului de la inceputul cozii. Demonsau functionalitatea clasei int-o aplicatie in cae sa util izati eozi elemente de tipui difeite.. eu ' 4.1. Ce este STL? 4. STL. Concepte geneale SlL (Standad Template Libay - biblioteca de sabloane standad) ese 0 biblioteca eunind implementai geneice a numeoase stuctui de date i algoltmi fundamentali in infomatica. STL nu este singua biblloteca de acest tip, da cu siguanta este cea mai utilizata, datoita nodului in cae a fost poiectata stucua sa, a eficientei implementailo $i a faptului ca poganatoii pot intega ell usuinta componente STL in aplicatiile lo. Pogamatoii familiaizati eu stuctua STL, pincipiile PQ i cele ale pogamaii geneice considea aceasta biblioteca un instument foate eficient, cae ceste semnificativ poductivitatea lo in dezvoltaea aplicatiilo. Stuctua STL este apoape in integime ceatia lui Alexande Stepanov, cae a inceput sa puna in pactica pimelc sale idei efeltoae 1a pogamaea geneics in 1979 (acelasi an in cae Bjane Stoustup a inceput sa elaboeze C++). Pmcipalul colaboato a1 lui Alexande Stepanov a fost David Musse, cae pomova pincipiile poganaii geneice inca de a ncepuul anilo '70. nitial, biblioteca a fost conceputa pentu limbajul ADA, da nu s-a bucuat de succes in industia softwae, Ulteio, biblioteca a fast implementata in C++, datoita facilitatilo pe.cae aeest limbaj e ofea pentu pogamaea genelca eficienta. in 1992, Meng Lee. a fost cooptat in poiect si, impeuna, aueuit sa finaizeze biblioteca STL, confom ceinjelo comitetului pentu standadizaea ANS/SO a limbajului C++. La oa actuala, STL face pate din bibliotecile standad ale JimbajuJui C+ + i poducatoii de compilatcae includ STL in podusele pe cae e distibuie. STL contine elase containe, algoitmi geneici, iteatoi, funcoi, adaptoi i alocaoi. Yom face 0 pezentae geneals pentu fiecae categoic, unand ca in capitelele umatoae sa analizam in detaliu clasele containe. Nu ne popunem 0 abodae exhaustiva a bibliotecii STL. Doim sa ealizan tnsa 0 abodae opcatlonala. Scopul nostu este fomaea unei viziuni de ansamblu asupa biblioteciistl, impeuna cu 0 pofunda tntelcgee a conceptelo cae stau la baza consuiii acesteia, pccum i omaea uno abilitati de utilizac avizata a eomponentejo STL pentu czolvaea uno pobl ene de Jactua algounuca. o documentatie complca i foate bine stuctuata pcntu biblioteca STL poate f consultata online la adesa Yeti. considea utili1 si documentatia STL inclusa ill docunentatia pentu limbajul C++ 13 adesa - i -"

55 .",.; 108 PROGRAMAREA N LMBAJUL etc -H PENTRU LCEU STL. CONCEPTE GENERALE , Clasele containe Un containe este un obiec cae contine 0 colectie de ale obiecte, denumite elenenele containeului, in tuncue de modul de oganizae a elementejo, in STL exists doua categoii de clase comaine : containee secventiale (sequence containes) - contln 0 succesiune de clemente de acelasi tip T; containeele secventiale din STL sunt vecto, deque st list; in C au fost intoduse inca doua containee secvenuale : aay si fowad_list; containee asociative (associative containes) pemit accesul apid la clemente, pin intemediul uno chei; containeclc asociative sotate din STL sunt set, multiset, map si multimap; in C++ 11 au fost intoduse i containeele asociative nesotate : unodeed_set, unodeed_multi set, uno-deedjnep i uio.-de-e djmultimap. Pactic, containeele implementcaza difeite stucui de date. in functie de poblema pe cae tebuie sa 0 ezolvati pentu a obtine 0 implementae eficienta, tebuie sa alegeti clasa containe adecvata. Utilizaea claselo containe Clasele containe dispun, in mod unita, de 0 seie de funcpl membe i opeatoi supaincacan. in functie de containe, evident, exists i alte functii si opcatoi disponibili, specifice ctasei. Pezentam in continuae cateva exemple. Tipuile definite in clase containe Gice class containe din STL defineste in mod public uuaoaele tipui : Tip Semnlflcatic value type Tipul elencntelo eontaineului pointe Pointe eu tipul de baza veluej element al containeului. t ype (T*) - contine adesa unui efeence Refetnja ell tipul de baza value type (T&) iteato Tipul iteatoului diffeence type Tip integ, epezentand tipu! ezultaului difecnjci dintc doi itcatoi size t.ype Tip imeg pozitiv, cae cpezima tipul dimcnsiunii unci zone de memoie eveseiteato Tipul iteatoulul inves Tipuile pointe, efeence, i.teato si evese_iteato au definite si vesiuuilc constante (const-pointe, ccnatjeteence, cons t j i t e-at o i canstevese_iteato). Vesiunile constantc nu pemit modificaea elenentului indicat. Existenta vesiunilo constante nu este doa 0 masua de secuitate, ci 0 necesitate, deoaece n functii canst pot fi utilizate doa vesiuni canst. Constuctoii si destuctou.l Teae clasele containe au un constucto implicit (constucto tad! paameti), un constucto bazat pe un domeniu (pineste ca paameti pim -cae indica pimul element -al domeniului - i ultim - cae indica pozitia de dupa ultimul element al domeniului; aces constucto ceeaza un containe i l mitializeaza cu obiectele din domeniul [pim, ultim)), un constucto de copiee i un destucto, Opeatoul de atibuie Pentu toate clasele containe este supaincaca opeatoul de atibuie =:. Functiile membe efeitoae la dimensiunea containeului Clasele containe contln tei functii membe cae se efea la dimensiune : size () - eumcaza numaul actual de clemente din containe; empty () - euucaza 0 valoac de tip bool {t-ue pentu un containe vid, adica un containe pentu cae size () ==-0 i false in caz conta) ; nax jsiae () - etuneaza numaul maxim de elememe ce pot fi stocate in containe. nteschimbaea a doug containee nteschimbaea a doua containee se poate ealiza pin intemediul functiei swap () cae poate fi definita aa ca functie memba, cat i ca functie ncmcmba (algoitn). Fie cl si c2 doua containee. nteschimbaea lo pin intennediul functiei swap () se ealizeaza astfel : cl.swap(c2l; //functia memba swap() swap(cl,c2); //functia nememba swap{) lnseaea elementelo int-un containe ClaseJe containe dispun de funcpa memba inset ( ). cae pemite inseaea unui element in-un containe sau a unui domeniu de elemente nt-un containe, Ellminaea elementelo dint-un. containe Functia memba ease (') pemite eliminaea unui element specificat dint-un containe sau a elencntelo dint-un domeniu specificat. Exista i functia memba clea (), cae detemina stegeea tutuo elementelo din containe Clasele adapto pentu containee Clasele adapto pentu comainee sunt definite pe baza unci alte clase containe, asiguand 0 functionalitate esansa pentu aceasta. Exists tei clase adapto pedefinite in. STL, bazate pc containee secventiale : stack (stiva), queue (coada) plc i t.yi queoe (coada cu pioiate). -,

56 \1: teatoii teatoii pemit accesul la elementele unui containe, independent de modul in cae aceste elemente sunt stocate. Jteatof sunt asemanatol cu pointeii. Mai exact, iteatoii sunt 0 genealizae a pointeilo, fiind obiecte cae.indica (point) alte obiecte. Fiecae clasa containe ae definiti iteatoii popii. Declaana unui iteato it pentu clasa containe CC<T> este: CC<T>: : i teato it; PROGRAMAREA in LMBAJUL CC++ PENTRU LCEU (it pemite accesul a elementele containeului CC<T> pentu citie si sciee) CC<T>:: const_iteata}:" it; (it pemite accesulla elementele containeului CC<T> pentu doa pentu citie) o declaae schematica a clasei teato este: template<class T> cl.ass teata ( public: constuctai, destucto boel opeato=={censt teato<t>&) const; heel opeato!=(const teata<t>&) const; teato<t>& opeato++(); pefixat teato<t> opeato++(int) postfixat T& opeato*{) const; T* opeato->{) const; pivate: } ; Din schema pecedents deducem ca oice iteatc penite umatoaele opcatii : compaani (cu ajutoul opeatoilo supatncacatt == $i! =); incementae (utilizfmd opeatoul supaincacat ++, atat n foma pefixata, cat $i in foma posfixaa) ; deefeentiee (cu ajutoul opeatoului de deefeentiee * poate fi accesat elementul indicat de un iteato, asemanao cu deefeentieea pointeilo) ; selectie ndiecta (cu ajutoul opeatoul de selecjie indiecta -> se poate selecta un membu al obiectului indica! de iteato, pin intemediul iteatoului; functionalitatea acestui opeato este sinilaa cu eea din cazul pointeilo). ClaseJe containe con tin functii mcmbc necesae iteatoilo pentu paeugeea elementelo : functia begin () ctuneaza un iteato cae indica pimul element al conalneului : functia end () etuncaza un iteate cae indica pozitia de dupa ultimu element al contail1cului. Obsevatii Obsevaiii STL. CONCEPTE GENERALE 1. Domeniul unui iteato poate fi deflnit cu ajutoul functiilo begin () $i end ( ) astfel: [begin (), end () ). 2. Domeniul unui iteao este vid (contaiueul nu contine clemente) daca begin ( ) ==end ( ). 3. Pentu a pacuge elementele unui containe Cob de tip CC<T>, utilizam un iteato it, pe cae 1 initializam cu ajutoul functiei begin () ; cat timp n11 am pacus oate elementele (it! =end (), iteatoul este incementat : CC<T> Cob; CC<T>: :iteato it; fe (it=cob.begin{); it!= Cob.end(}; ++it) in funcpe de opeatiile ce pot fi efectuae eu eatoii, in STL exists cinci categoi de iteatoi. TabeJul unato iluseaza pentu fiecae categoic de iteatoi : modul in cae iteatoul poate aceesa elementele containeului (pentu citie : * i t sau it->membu, taa a fi utilizat in membu stang al unei atibuii ; pentu sciee: * i t.eveloe.e, adica utilizat doa in membul stang al unci atibuii ; espectiv pentu citie si scice) ; sensu] in cae se poate ealiza pacugeea elementelo containeului (doa inainte eli ajuoul opeatoului ++, in ambele sensui cu opeatoii +-i- $i --, cspeciv daca este pemis accesu1 diect [aleatoiuj la.elemenele containeului). tcatoi Opcaju pcmisc Clasc asoclate teatoi de intae Acccs pentu citie isteam (input itueatos) Pacugee inainte teatoi de iesie Acces peuu scice osteam, insete (output iteatos) Pacugce inainte teatoi de lnaintae Acces pentu citie i scice (fowad iteaios) Pacugee inainte teaoi bidiecionali Acces pentu citie sl sciee list, set, (bidiectional isecuos) Pacugee in ambele sensui multiset, map. multimap teatoi cu acces aleatoiu Acces pentu ciic i sciec vecto, deque, (andom access iteatosv Acces diect (aleatoiu) sting, aay 1. teaof de intae pemit ciuea datelo dint-o sccventa (piut-o singua pacugee), in timp de iteatoii de iesie pemit doa scieea vajoilo tm-o secventa (de asemenea pint-o singua pacugee). 2. eatoii de inaintac pemit atat accesul la elementele eontaineului pcntu citie, cat j pentu seice; pemit pacugeca unei sec vente doa nt-un singu scns, nsa, spe deosebie de iteatoii de jnac/esie. elementele containeului pot tl pacusc de mai mulc oi. Jtcatou bidiecdonali sunt similai cu cei 'de inainae. numai ca pemit in plus pacugeea secventei in sens opus (cu opeatoul -)., ' - i ': i...j -!, -1,

57 <i""" -,!, - J 12 PROGRAMAREA in LMBAJUL C/C ++ PENTRU LlCEU 3, teatoii cu acces alcatoiu supoa toate opeaiile penise pentu opeatoil bidiectionali ; in plus, sunt supaincacati opeatoii cae' pemit accesul diect la elementele containeului : Opeato Sintaxa Eect lndexae it[n] Acces la elemcmul de pe pozitia n Adunae cu integ it+n teato cae indica a1 n-lea element umato (pcntu n n+it pozitiv) sau pecedent (pentu n negativ) Scadee cu nteg it-n teato cae indica al n-lea element pecedent (pentu n pozitiv) sau umatc (pentu n negativ) Atibuie compus cu it+-n teatoul it va indica al n-ca clement umao (penttu n adunae pozitiv) sau pecedent (pcntu n negativ) Atibuie com pus eu it--n teato it va indica al n-lea element peceden (pentu n scad ee pozitiv) sau unato (pentu n ncgativ) Scadeea a doi itl-it2 Reuncaza un numa integ epezentand distanta dinte iteatoi doi iteatoi (numaul de clemente din domeniul detemina de cei doi itcatoi) Opeatoi elationali itl<it2 Rctumeaza 0 valoae bool indicand daca elememul itl>it2 indicat de itl peccda clemcnul indicat de it2 «); it:i<=it efect simila pentu >, >,, <"". itl>=it2 4. Analizand opeatiile disponibile pentu fiecae categoic de iteatoi, deducem 0 ieahizae a iteatoflo : iteatoi de intae iteatei de ieie teatoi de inaintae iteatoi bidiectionali iteatoi cu acces aleatoiu Oice iteato eu acces aleatoiu este l iteato bidiectional; oice iteato!' bidiectional este si iteato de naintae ; oice iteato de inaintae este iteato de ntac/iesie Clasele adapto pentu iteatoi o clasa adapto pentu iteatoi este 0 clasa sablon cae schimba modul de functionae a unui iteato. teatoul inves [eves ej i Cea t.o.c} SlL CONcEvE GENERALE - n Pentu a putea fi pacuse cu un iteato inves, clasele containe contin doua funeth membe sinilae cu begin () i end ( ). Acestea sunt: - - begin () - etuneaza un itcato cae indica ultimul element al comaineului (aeeasta este pozitia de la cae incepc 0 paeugee invesa) : end () - etuncaza un iteato cae indica poztna dinainie de pimul element a1 containeului (aici se temina 0 pacugee invesa). Pentuun -eve s e j i.ceet o-, opeatoil de incementae st decementae se,compota inves. Pin umae, iata cum se implcmeneaza pacugeea in odine invesa a elementelo unui containe Cob de tip CC<T> cu ajutoul iteaoului inves d t : CC<'l'> Cobj CC<T>: :eveseiteatoitj fo (it=cob.begin() ; itl= Cob. end ( ) j ++it).. teatoul de inseae teatoii de inseac sunt adapto! cae ansfoma un iteato de iesie asfel meat a 0 atibuie de tipul "*.i.t=valoae nu va fi supascls un clement al coutaineului,.ci este inseata in containe valoaea specificate. 0 alta caacteisica a iteatot-ilo de.inseae ese d'i opeatoul de incementae ++ nu ae niciun cfect (nu mcdiflca iteatoul). in STLsunt definite 3 categoii de iteatoi de inseae : teato back_inset_iteato font_inset_iteato inset_iteato teatoul pentu flux Eect nseeaza valoaea a sfasiul containcului Disponibil pentu c1ascle vecto, deque, list i sting lnsceaza valoaea la inccpuul comaineului Disponibil pentu clasele deque i list: nseeaza valoaea int-o pozijic spcctficata (utilizand functla inset a containeului) Un iteato pentu flux (st-eemo.cea t o-) este un adapto utilizat pentucitiea (isteam_iteato) sau scieea (o s t -eemji t ee.cc-) ut-un flux. in STL ese defiit. adaptouj eve.s ejlte-accc- -(iteato inve's); cae tansfoms un iteato bidiectional sau un iteato cu acces aleatoiu in-un iteato 1 cae penite pacugeea eleuentelo unui containe in odine invese. -

58 .' (::,.;:,;", 114 PROGRAMAREA N LMBAJUL C/C++ PENTRlJ LlCEU STL. CONCEPTE GENERALE Functoii 4.7. Clasele adapto pentu functoi Un functo (obiect functle) este un object al unci clase cae ae supaincacat opeatoul (), denumit opeatoul apel de functie. Sa notam ell x 0 astfel de clasa i Xob un obiect al acestei clase. n cazul in cae opeatoul () este supalncacat pentu clasa x, putem utiliza constuctia xob (... ), in paanteze fiind specificata lista paametilo opeatoului (). Aceasta constuqj, cpezinta un apel al opeatoului () pentu obiectul Xob. Lista paametilo poate fi vida (functo geneato) sau poate confine un paametu (functo una), doi paameti (functo bina) sau oicati paameti sunt necesai. o categoic speciala de functoi sunt pedicatete, acestea fiind functoi (unai sau binai) cae etuneazao valoae de tip bool. in C sau c+ + nu este posibil sa tansmiti unei functii ca paanetu 0 alta functie, Este tnsa posibil sa fie tansmis un pointe de functie (pointe cae contine adesa unei functii). Funcoii coespund pointeilo de functii din limbajul C. in STL sunt pedefinite mai multe categoii de functoi. Pentu a utilize acest; functoi, tebuie sa includeti flsieul antet functional: #include <functional> Functoi aitmetici Functoii aitmetici sunt binai i caltzeaza opeatia ainnetica specificate pin numele lo asupa eelo doi paameti, etunand ezultatul opeatiei. Acestia sunt: p Lus (pentu adunae eu opeatoul -), minus (pentu scadee cu opeatoul -), multiplies (pentu inmultie ell opeatoul -), divides (pentu impatic eu ), modulus (pentu estul impati» eu opeatoul %). Exista si un functo aitmetic una denumit negate (schimba semnul algebic al agunentului sau.utilizand opeatou1 una -). Functoi de compaae Functoii de compaae sunt binai i etuneaza W ezultat de tip bool: equal_to (pentu egalitate cu opeatoul ==), not_equal_to (pentu neegalitate eu opeatoul! =), less (nai mic), geate (mai mae), Lesstecua (mai mic sau ega!), geate_equal (mai ma:;-e sau egal). Functoi pentu opea/if logice in STL exists pedefiniti tei functoi pentu opeant logice: log::,calnot (functo una pentu negatia loglca cu opeatoul! a paametului sau), logica.l_and (functo bina pcntu conjunctia logica eu opeatoul && a ecto doi paameti) i logicalo (pentu disjuneia logica a celo doi paamcti utijizand opcatoul ). Ca.si in cazul containeelo i iteatojlo, exista adaptoi pentu funcoi, cae au ca scop cesteea flexibiliatii in utilizae a functoilo pedefiniti. De exemplu, exisa doi adaptoi de legaua (binde) cae.jcaga" unul dinte paametii unui functo cu doi paameti, fixandu-l pe 0 anumita valoae. Cu ajutoul acesto adaptoi, un functo bina poate fi utilizat ca functo una. Cei doi adaptoi de tip binde sunt bindlst si bind2nd ("leaga" pimul, espectiv al doilea paametu) Algoitmii A1goitmii sunt functii geneice (sablon), cae nu apatin claselo containe i cae [mplementeaza 0 seie de pclucat fundamentale asupa eementelo containeelc, [ndifeent de tipul acestoa. Exceptand a1goitmii nuneici, pentu a utiliza algoitmii pedefiniti in STL, iebuie sa mcluden fisieul antet algoi t.hm : -] #include <algoithm> Algoitmii inteactioneaza cu elementele conaineelo pin intemediul iteatoilo : Algoitmi caoi Containee Algoitmii au ca paaneti iteatoi i functoi. De exemplu, de multe oi un algottm peluceaza un anumit domeniu (ange) de clemente ale unui containe. Un astfel de domeniu este definit de doi iteatoi (pim i ultim) i epezinta toate elemcntele tnccpand de 1a elementul indicat de iteatoul pim (inclusiv acesta), pana a elementul indicat de iteatoul ultim (exclusiv acesta). Un astfel de domeniu este notat [pim, 'u tim). De asemenea, cand se specifica pozitia de inceput a unui domeniu, aceasta se pecizeaza pin intemediul unui iteato. Un alt exemplu feevent intalni sunt algoitmii cae veifica 0 _anumita conditie pentu elementele containeului (conditia aceasta este tansmisa ca paanetu pint-un functo. cu ezultat boo, adica un pedicat). n functie de pclucanle ealizae, algoitmii pedefiniti din STL pot fi clasati in 10 categoii. Unii dinte acesti algoitmi sunt disponibili doa incepand cu C+ +. Pentu a in9.ia acest lucu, mcnjionam (ll) dupa numele algoitmulul.., J -i, i i, c.j '--' '-..J,

59 ,, i 1- - i.-,:,' -.. i i.- ll(l copy copy_backwad copy_n i l l PROGRAMAR,EA in LlMBAJUL e/c., + PENTRU LCEi.; Algoitmii cae nu modified elementele containeului Acesti algoitmi ealizcaza n geneal velflcai ale clcmcntclo dint-un domeniu, in functie de 0 anunita conditio. Conditia poate fi ca elementele sa fie egale sau ca. un anumit pedicat (tansmis ca paametu) sa aiba valoaea tue. Algoitm Efect all_of ll) Vetfica dad! toate elementele dint-un domeniu veifica 0 anumia conditie any_of (1] l Veiflca daca exista un element int-un domeniu cae vctfica 0 anuuaconditie none_of.(ll! Veifies daca niciun element dint-un domeniu nu vetfica 0 anumita conditio fo each Aplidi. 0 anumita functie pcntu fiecae element dint-un domeniu find, find_if, find_if_not(111, Cauta 0 valoae cae ndcplineste 0 anumita conditie nt-un domeniu find_end, find_fist_of adjacent_find Cauta lnt-un domeniu doua valoi cae indeplinesc 0 anumita conditie, aflate pc pozitii consecutive count Detemina numaul de apaiui ale unei valoi int-un domcniu count_lf Detenina numaul de valoi cae indeplinesc 0 anumita conditie dint-un domeniu mismatch Pacuge in odine clenentele a doua domcnii!?i detemine pima pozttie pentu cae elementcle de pe pozitia espccuva nu se "potivesc" (nu lndeplinesc 0 anumitf conditio) equal Pacuge n odine elementele a doua domenii!?i veifies daca elcmentele coespondente din cele doua domenii se.pomvesc" (indeplincsc 0 anumia conditie) is-pemutation Veifica dad un domeniu cste 0 pemutae a unu] alt domeniu (11 ) seach Cauta pima "potivie" (in functie de 0 anumita conditie) a unui subdomeniu nt-un domeniu seach_n Cauti'i hu-un domeniu pima -apaitic a unci suceesiuni de n valoi conse cutivc cae indepjinesc 0 anumil1i condilie.. Algoltmil cae modified elementele eontalneului Aceti algoitmi apliea 0 anumitii pe]ueae elementelo dim-un domeniu (sau a pimelo n clemente incepand eu 0' pozitie specifiealli - vaiantele a1 dio, l1ume conine _n); ezultatul se obtine in domeniul initial sau se copiaza int-un alt domeniu identificat doa pin pozitia de inceput (vaiamele copy). -. Algoitm Eect Copiaza (in odine, cspcctiv in odinc illvesa) clcmentclc unui dome niu im-o pozitic specificatil Copia7.1i pimele n clemente' inccpand eu 0 pozi\ic specifieatii "a 0 awl. POZ.iiic specificaui copy_if(jll (]! : move move.lbeckwec-d (J 11 swap it.e_swap swap_anges tansfom eplace eplace_if eplace_copy eplacecopy_if fill filln geneate geneate n emove emove_if emove_copy emove_copy_if unique unique_copy. evese evese_copy otat.e otate_copy andom_shuffle shuffle(l.1l STL. CONCEPTE GENERALE C-6'i-a-;; -;1i -dit-'-;l- -d-b,-,;cniu ditie int-o poziue speclficata i 7 ""._---._--._- cae indeplincse 0 anuniui con. Jnteschimba valoilc a doua obicce. Penu swap sum tansmise ca paameti cfcinjc la obiecele cae sc inteschinba ; penu i t.e_swap sunt ansnisi ca paameti ieatoi cae indica po ziti a elemente]o cae se inteschinba ntcschimba valoile dint-un domeniu cu valoile unui alt domeniu, cae ncepe la 0 pozitie specificata Peluccaza elementele din-un domeniu (dad pelucaca ese 0 functie unaa) sau din doua domenii (daca pelucaea estc 0 functlc binaa)!?i stocheaza ezultaul pclucaii tu-o pozitic spccificata nlocuicste toate elenentele dint-un domeniu egale cu 0 anumia valoac, espectiv cae indeplinesc 0 anumita conditio eu 0 alta valoae Efect simila cu eplace, cspectiv eplace_if, doa cii ezultatu! obttnut este copiat iucepand eu 0 pozltie spccificata Atibuie 0 valoae tutuo elcmemelo dint-un domeniu ncepand cu 0 pozitic specificata, se atibuie plmelo n clemente 0 valoae speciflcaa. Aibulc elemeuelo dint-un domeniu valoi geneate succesiv de un geneato (functo taa paameti) lncepano eu 0 pozhie speciflcata, se atibuie pimelo n clemente valoile geneate succesiv de un.gencato specificai ca paametu Stege dint-un dcneniu toate clementele egale cu 0 anumita valoae, espectiv cae indeplinesc 0 anumita conditie Efect simila cu emove, espectiv emove_if, numai di czultatul este eopiat incepiind cu 0 anumita pozi!ic Daca exista iot-un domeniu succesiuni de clemente cgale, espectiv cae indeplincse a anumita conditie, situatc pc poziii consecutive, se climina aeeste sucecsiuni, pastand doa pimul element. lnveseaza odinea elementelo dint-un domelliu. Rezultatul sc obtine in acela!?i domeniu, cspectiv se copiw...1. inccpand eu 0 pozi!ie speeificata Realizeazi:i 0 otatie spe stanga cu un anumit numa de po:lilii a elementelo dint-un domeniu Reaanjeaza in mod aleatoiu elemcmele unui domcniu Rcaanjcaza in mod alcatoiu clememc1c ullui domcniu utilizimd un geneato :

60 - 118 PROGRAMAREA N LMBAJUL etc ++ PENTRU UCEU stt.. CONCEPTE GENERALE 119, cj Algoitmii de patitionae Acesti algoitmi impat un domeniu in doua subdonenii (pimul subdomeniu este fomat din elementele pentu cae pedicatul tansmis ca paametu euneaza valoaea tue, ia eel de-al doilea subdoneniu este fomat din elementele pentu cae pedicatul eumeaza valoaea false). Algoitm patition stable-patition patition_copy(lll patition-po i n t (11 ) is_oatitioned (lll Algoitmii de odonae Eect Reaanjeaza elementele dint-un domeniu astfel incat elementelc pemu cae pedicatul specifieat ca paametu etuneaza tue sum plasate inaintea elementelo pentu cae pcdicatul etuncaza false; etumeaza ea ezultat un itcato Cae indica inceputul cclui de-al doilea subdomcniu Efectul esc simila ell patition, numai ca se gaanteaza ca odinca inijiala a elementelo din fiecae domeniu se pasteazf Copiaza la 0 anumita poziie elementele dint-un domcniu pcnu cae pedicatul spccificat ca paametu ctuneaza tue, ia la alta pozitie elementcle pentu cae pedieatul etumeaza false Retuncaza un iteato cae indica pozitia pimului element diu-un domeniu speeificat pentu cae pedicaul nu etumeaza tue. Se consides ca domeniul a fos deja patijionat Retumeaza tue dad elemenele unui doneniu sunt patitionate in maniea descisa la pati t ion Acesti algoitmi odoneaza sau veifies odinea elementelo unui domeniu ; pentu eompaaea a doua clemente se utilizeaza opeatoul = sau 0 functie de COll1 paae specificata ca paametu. Algoitm Sot stable_sot patial_sot patial_sot_copy is_soted ll) s_soted_untilon nth_element Odoneaza elementelc dint-un domeniu Odoneaza elementelc dint-un domcniu, gaantand di elonentele echivalente i i pasteaza bdlnea initiala Realizeaza 0 odonae papala a elcmcntelo dint-un domeniu. Rezultatul se obtine in acelasi domcniu, espcctiv se copiaza int-un alt domeniu Rctuneaza tue daca elememele dint-un anumit domeniu sunt odonate Retuneaza un iteato cae indica pozi!ia pimului clement cae nu este in odine hht-un domeniu specificat Rcaanjeaza elemcntele dint-un domcniu astfel fneat al n-jea element (consideand clementele sutate) sa fic pc pozilia sa euectic. elc1l1entele mai mici decal el fiind plasalc inaillea sa Algoitmii de cautae binaa Algo itmii din aceasta categoie acloneaza asupa unui domeniu odonat. Si in acest caz pentu compaaea a doua elemente se utilizeaza opeatoul implicit == sau 0 functie de compaae spectficata ca paametu. Algottm binay_seach lowe_bound uppe_bound equal_ange Eect Cauta bina 0 valoae int-un domeniu specificat si etuneaza tue in cazul in cae valoaea exista in domeniu, cspectiv false in caz conta Retumcaza un iteato cae indica pozitia pimului element din domeniul specificat cae nu cste mai mic. espectiv cste mai mae decat 0 valoae specificata Retuneaza pentu un domeniu specificat, subdoneniul fomat numai din elementc egale eu 0 valoae specificate (subdomeniul fiind idcntifica pint-o peeehe de lteaon : plmul indicand pozitia de tnceput, al doilea pozitia de sfait) Algoitmii de lucu cu multimi Acesti algoitmi luceaza cu domenii odonate. Domeniile obtinute ca ezultat SUlt de asemenea odonate. Odonaea elementelo se face considcand implicit opeatoul < sau 0 functie de compaae spcclflcata ca paametu. mege Algoitm inplace_mege includes set_union set_intesection set_diffeence set_symetic_diffeence Eect nteclascaza elemeuele unui domeniu cu elemenele unui alt domeniu. copiind ezuhatul incepand eu 0 pozitic spccificata Jnteclascaza domeniul [pim, mij) cu domeniuj [mij, ultim), obtinand ezultann lntcclasaf in domeniul[pim, ultim) lncluziunc : vcnfica daca toate elementele unui domcniu apa in unui alt domeniu Constuieste la 0 pozitie speciflcata un domeniu cae este ezultatul euniunti. intesccttei, difeenjei, espectiv difeentei simetice a doua domenii Algoitmii de lucu cu heap-ui n accasta categoie sunt inclusi algoitmii fundamentali de lucu eu heap-ui, algoiuni cae vo fi apelati i de adaptoul pioity_queue. Pentu compaaea a doua elemente se utilizeaza implicit opeatoul < sau 0 functie de compaae specificata ca paametu. Algoitm Eect make heap Reaanjeaza elemcmeje dillt-un domeniu astfel ineat sa constituie un heap push_heap Consideand di elementelc din domeniul [pim, ultim-l) constituie un heajj, sc eaanjcaza clcmentcle_din domeniul [pim, ultim) aslfcl indi.t sa constituie un heap (paclic, se extinde un heap, pill inseaca.,_j_c_:11ll.ji _i: _!l:,? i _ i,...:...:..j LJ. '-', -'

61 L : j, i " : ',. ; -, '10 ;';.:::;.:;;:;,:.;:,;:::.::,' ':""::vjbajul C/C; ;-;::;; ; :V._. _."'''' - _ pop_heap Se extagc din heapuj aflat in domeniul [pim, ul tim) pimul. element i cste lnteschinbat eu ctemcntul de pc pozitia indicata de ult.ln-. 1, apoi heap-us estc estucua astfel incat elcneutelc amase in domcniul [pim, tz Ltd.n-e L} sa consdtuic un heap sot_heap Soteaza elementelc dint-un domcniu oganizat caun heap is heap'11) Rctumeaza tue dad elcnentclc dint-un domeniu specificat constituj, un heap, espectiv false in caz conta is_heap_until (ll) Rctuucaza un ueao cae indica pozina pimului element dint-un domcniu specifica eae ncalca popletatea de neap Algoitmii de maximum/minimum Acesti algoitmi detemine eel mai mic/mae element dint-un domeniu, etunamj fie 0 efeinta, fie un iteato cae indica pozttia acestuia. Pentu compaaea a doua clemente se utilizeaza implicit opeatoul < sau 0 functie de compaae specificata ca paametu. mi n max Algoitm mixl;l; min_element: max_element minnax_eleme.nt 1111 EJect Rctumeaz.. 'l 0 cetma cae cca mai mica. cspeciv cea mai mae valoae dint-un domcniu spcciflca Rctuncaza 0 peeche (pai) in cae pimul element estc mininul. Ja al doilea element estc uaximul dint-un domcniu Rcuncaza un ucato cae indica pozijia cclui mai mic/mac element dint-un domeniu spectflcat Algoitmii efeitoi la odonaea lexicogafica Spunem di 0 secventa x= (Xl, X2, X n ) peceda (este mai midi) din punet de vedee lexicogafic 0 secventa Y= (Yl," Y2,..., Ym) daca exista un indice k astfel tncat Xi=Yi, pentu once i=l. k-l :;;i fie Xk<Yk, fie ke-. PC11tu coinpaaea a doua elemente, se utilizeaza implicit opeatou! < sau 0 funqie de eompaae specificata ca paametu. a Algoitm lexicogaphical_compae next_pemutation pev--pemutatl0n Rctuneazii 0 pceche de iteato-i (pai) in cae pimul element indica uinimul. la al doilca element indica maximul Efect Functia etuneaza un ezultat de lip bool cae indica daea pimul domcniu specificat ca paametu peceda lcxicogafic al doilea domcniu spccificat ca paamctu FUJqia caanjeaza clcmcntele unui doncniu astfel incat sa epezinlc pennutaea imedia! unnaloae/pecedcnt:1, in odine lexicogafica. Functia ctunca:di t:.-ue daca eaanjaea a f?sl posibilii, espectiv f<=:.lse in caz conta '''''' Algoitmii numeic! sn.. CONCEPTE GENERALE Algoitmii numeici ealizeaza pelucai ale uno secvente numeice. Pentu a utiliza aceasa categoie de algoitmi tebuie sa includen fisieul antet ume i c. Algoitm accumulate adjacent_diffeence inne--poduct patial_sum iotaill) 4.9. Clasa ablon pai Obsevatie Eect mplicit, insumeazii ejcmeuele dint-un anumit domcniu. Dad. cste specif'icata. executa 0 alta opeatic in loe de adunac cu elcmcmclc din domcniu mplicit, detemina siul ditecntelo dinte elementele consecutive ale unui domeniu. Dad!. cste specificata, executa 0 alta opcaue in oc de scad ee eu elcmenele din domeniu mplicit, dcicnnina suma poduselo dintc elcmentele coespondentc a doua domcnii. Bste posibila specificaca alta opeajii in loc de suma i podus mplicit, calculeaza suul sunelo patlale ale elementelo unui domeniu. Este posibila specificaca unci altc opeatii in loc de adunae Constuiestc 0 secvcnta ccscaoae de valoi consecutive, ncepand cu 0 vajoae specificate Deoaece apae fecvcnt necesitatea de a luca ell 0 peechc de valoi, a fos pedefinita in biblioteca STL clasa sablon pai. Pentu a utilize clasa pai tebuie sa lncluden fisieu! antet utility. Declaatia clasei pai template <class 'P' class 1'2> stuct p a.i i n declaatie am utilizat cuvantul-cheie st.uct. in c+ + tipul stuct esc simila cu tipul class, difeenta consmnd n fapm! di toti mcmbii tipului stuct sunt publici. Defini[ia clasei pai template<class Tl. class T2>stuct pai {/date membe Tl fist; T2 second; lconstucto implicit pai (): fist (Tl () ), second ('1'2 ()) {} lconstucto Cli doi paameti pai(const Tl& a. const T2& b): fistla) second (b) {} lconstucto:- de copiee cu convesie implici t.a template<class U,class v> pai{const pai<u,v>& p): fist{p.fist) second(p.second} {} }; 121

62 122 PROGRAMAREA N LMBAHJL CC++ PENTRU L1CEU Obsevajii 1. Clasa pai continc doua date membe publice: fist $i second, avand tipul Tl, espectiv '2. 2. Clasa pai ae doi constucto! (constuctoul implicit si constucoul de lnitializae cae constuieste 0 peeche pe baza a doua valoi specificate ca paametu) 1 un constucto de copiee. 3. Des! nil sunt explicit dcfiniu in cadul clasei, compilatoul gcnceaza automat destuctoul i supaincaca opeatoul de atibuie, 4. lncepand Cll C++ 11, in clasa pai a fast inclusa functia memba swap, cae inteschimba fist cu second. Functia make-pai ( ) Functia sablon makejjaa.i- pemite constuiea unei peechi pe baza a doua valoi specificate ca paametu, astfel : tempate <class Tl,class T2> pai<tl,t2> make---.j)ai (Tl x, T2 y) { etun ( pai<tl,t2> (x,y) }; Opeatoii de egalitate si opeatoii elcqionali Opeatoii de egalitate i opeatoii elational! sunt supatncacati pentu a functiona cu peechi. Yom detalia doa opeatoul == $i opeatoul <, dcoaece semnificatia celolalti opeatoi poate fi descisa eu ajutoul acestoa. Opeatoul de egalitate ==0= template <class Ti, class T2> bool ope.a t oxvv (const pai<tl, '1'2>& a, const pai<'t'l,t2>& b); Peechea a estc cgala eu peechea b (a,.o;,:b) dad! a. f L-ss t e-e-b. fist. sl a.second==b.second. Opeatoul elational < template <class Tl, class T2> beel opeato«const pai<tl,t2>& a,const paiy<tl,t2>& b); Compaaea a doua peechi se ealizeaza din punct de vedee lexicogafic. Mai exact, pecchea a este mai mica dedit peechea b (a-cb) daca a.fist<b.fist sau a. fist==b. fist i a. second<b. second. Exemplu n exemplul umato vom denonsta modul de utilizae a constuctoilo, a functie! make---.j)ai - () j a opeatoilo elauonali, fojosind peechi n cae p-imul element (fist) este de tip sting, ia al doilea (second) este de tip float. Peechea pi cste ceata uuhzand consuctoul de initializae, ja peechca p2. ese ceata utll.zand constuctoul implicit, apoi este initializata apeland functia make jpel- (). STL. CONCEPTE GENERALE 123 #include <iosteam> #include <utility> using namespace stdi int main () {pai<sting,. float> pl("onescu Dan, 9.75) pai<sting, float> p2; p2=make---.j)ai (" Popescu Ana", 9.43); cout«pl. f Ls t.«-c ' '«pj. second«' 'vn ' cout«p2.fist«' '«p2.second«'\n' if (pl==p2) cout«npeechi egale\n"; else cout«"peechi neegale\nn; if (pl<p2) cout«pl<p2"; else cout«"pl>=p2"i pl=make-pai("popescu Ana", 9.98) i if (pl<p2) cout e c" Dupa schimbae: pl<p2\n" i e Lee cout«" Dupa schimbae: pl>=p2 \n" ; etun 0; Dupa executia acestui pogam, pe ecan se va afisa : onescu Dan 9.75 pope s ou Ana 9.43 Peechi neegale pl<p2 Dupa schimbae: pl>=p Alocatoii Alocatoii sunt clase cae deflnesc modul de alocae a menoiei pentu conaineole dinstl Aplicajii n capitolcle umatoae vom descie difette clase containe si ven face aplicatii eu acestea. Aici vom demonsta modul de funcjionae a uno algoitmi din STL utilizand un tablou unidimensional (vecto din C). n loc de ieatoi vom utiliza pointed. Acest ueu este posibil deoaeee se ealizeaza 0 convesie inplicita a poineilo n iteatoi. Pentu exemplificae, luam in consideae umatoaele declaatii :,. int a[]=o,11,12,13,14,15,16,17,18,19j;. int n=10; İ nvesaea elementelo int-un tab lou unidimensional Declaatia functici - eve.s e ( ) template <class jdiectionallteato> void.evese (Bidiectionallteato p::cm, Bidiectionallteato uj.tim);, 1, -J, 1 i, i -" :1 -J

63 -' - i i i, -' -t- -t -, Dupa invesae, vectoul a este: {19, 18, 17, 16, 15, 14, 13, 12, 11, 10 }. Pentu a invcsa doa elementele din vecto de la pozitia st (inclusiv) pan a la pozijia d (exclusiv), putem apela functia evese () astfel: evese (a+st,b+d) PROGRAM:\REA in LMBAJlJL CC++ PENTRU LCEl} Functia evese () inveseaza odinea elenenelo din domeniul [pim, u LtLm). Pentu a invesa incgul vecto, putem apela functia evese () astfel: evese(a,a+n); Daca st=3 si d-»?, dupa invesae vectoul a este : {lo,11,12,16,15,14,13,17,18,19}. Eliminaea elementelo cae indeplinesc 0 anumitd conditie Dcclaana functiei emove_i f () : template <class FowadlLeato, class UnayPedicate> Powadlteato emove if (Fowadlteato pim, Fowadlteato ultim, UnayPedicate ped) j Functia emove_if () elimina din domeniul [pim, u Ltim) eate elenentele pentu cae pedicatul euneaza valoaea tue, pastand odinea elementelo neelininate. Punctia euneaza un iteato cae indica noua pozitie de sfasit a domeniului obtinut dupa eliminae. Functia pacuge domeniul si, la fiecae pozitie pe cae se afla un element cae indeplinese conditia, cauta pimul element umato cae nu indeplincste conditia si il plaseaza pe pozfna cuenta. Astfel, odinea elementelo se paseaza. ia algoitmul de eliminae cstelinia. Sa pesupunem ca doim sa eliminant din vcctoul a elemeneje pae. Vom constui o functie cu ezulat bool cae sa veifice conditia doita (aceasta functie va f ca pedicat). l: hool EstePa (int x) {etun x Si,;2 = -== O; } unlizaa Pentu a elimina elementele pae din intcgul vecto a, putem apela functia emave_i f () astfel : int * psf=emove_if(a,a+n,estepa) j Evident, functia emove_i f () llu.modiflca dincnsiunea vectoului a. Pill umae, von actualiza dupa apel valoaea vaiabilei n (numaul de clemente din vectoul a), scazand din pointeul psf n cae am etinut noua pozitie de sfasit a domeniujui, pointeuj a cae indica inceputul acestuia: t.nvps f e a : Daca doim' sa calizjim cliuinaea elementelo pae doa de pe Ull inteval din vectoul a, sa spunem intevalul Le.s t. a+d), atunci tebuie sa avem gija s5 mutam 1a stangacu n pozitii toate elementele din intcvalul a+d, a+n) (unde eu n am notat numaul de clemente eliminate). si: CONCEPTE GENERALE int st=3, d=6, n; int * p s f e -emove if (a+st., e--d. EstePa) n=a+d-psf; //detemin numaul de elemente eliminat:.e copy{a+d,a+d,psf) ;//copiez estul vectoului n-=n; /actualizez dimensiunea vectoului Tansfomaea si Ne popunen sa aplicam 0 pelucae tutuo elementelo unui si de caacce (n cazul nosu, do im sa tausfomam toate liteele mici din si in majuscule). Pentu aceasta am putea utiliza algoitmul fo_each () din STL. template <class lnputlteato, c1.ass Function> - : 'unc t i on fo_each (lnputlteato pim, lnputlteato ultim, ; Function fn); AlgoitnuJ foeach () aplica tutuo elementelo din domeniul tp-lm. ultim) o pelucae descisa de functia fn. #include <iosteam> #include <algoithm> using namespace std;,sting s; void majuscula{cha& c) { if (c>='a' && c<='z') c -=c-'a'-l 'A'; int main () {cin»s; fo_each (s. begin (), s. end ( ), ma j u s oulal : cout«s; etun 0; Obsevatie Functiei fo_each i-am tansmis ca paameti doi itcatot (s _begin () euneaza un iteato cae indica inceputul siul, ia s. end () euneaza un iteato cae indica pozitia de dupa sfasitul siului) i numele functiei cae calizeaza pelucaea (majuscula). Sotaea unui tablou unidimensional Sotaea clementelo unui containe se poate ealiza eu ajutoul functiei sot ( ). Aceasa functie este supalncaceta : template <class RandomAccesslteato> void sot (RandomAccesslt.eato pim, Randomlccess:t:eat.o ul tim) i template <class Randon.i;ccesslteato, class Compae> void sot (RandomAccesslteato pim, Rzmdons.cces s Lteat.oz u tim, Compae camp) 125

64 126 PROGRAMAREA in LMBAJUL CC++ PENTRU LlCEU Pima foma se poate utiliza penu a soa elementele din domeniul [pim, ultim) in odine cescatoac (consideand pentu compaaea elementelo opeatoul -c, cae tebuie sa fie dcfinit pentu tipul elementelo containeului). A doua foma penite speciflcaea functiei cae se utllizeaza pemu compaaea ejementelo conaineului (pint-un functo sau un pointe de fuuctiejv.aceasta tebuie sa 'fie 0 functie ell doi paameti sl tebuie sa etunczc un ezulta de tip boo1. Rezultatul va f t ue daca pimuj paametu tebuie sa fie plasat in vectoul sotai naintea eelui de-a doilea paametu, Metoda de sotae utilizata este un algoitm ccat de David Musse n 1997 denumit intosot (sau intospective sot - sotae lnospectiva). Aces algoitm optimizeaza metoda de sotae quicksot, utilizand tieapson, pentu cazul in cae adancimea ecusiei este pea mae. Complexitaea acesul algoitm este de 0 (n log n) in cazul eel mai defavoabi {unde cu n am notat numaul de clemente din domeniul ce tebuie sotat). Sotaea cescdtoae a unui tablou unidimensional de numee integi Pentu a sota cescato jneg vectoul : sot (a, a-n) ; Pentu a sota cescao dea domeniul j e e s t.. a+d) sot e s t a+d); Sotaea cescatoae a unui tablou unidimensional de factii Revenim la clasa factie, pe cae am defini-o in capitolul a1 doilea, Pentu accasta class am supaincaca si opeatoul <. Sotaca unui tablou unidimensional ell clemente de tip factie se poate ealiza asfel : #include <iosteam> #include <algoithm> #include hfactie.h" using nnespace std; factie a [loooj int n; void ci teste ( ) {cin»n; fo (int i=o; i<n; i++) cin»a[i]i void Sci e ( ) {fo (int i=o; i<n; i++) cout«a[ij«' cout«' 'vn ' j } int main () {Citeste () sot(a,a+d) Scie() ; etun 0; Conctuzie STL. CONCEPTE GENERALE 127 Daca tipul elementelo containeului este un tip pedefinu al limbajulul sau un tip definit de utilizato cae ac supaincacat opeatoul <, sotaea cescatoae a elementelo se calizeaza cu pima foma a functicl sot ( ). Sotaea cesciuoae a unui tablou unidimensional de elevi Definim 0 stucua denunita elev cae va avea 3 campun : numele elevulul, penumeje elevului j media sa gcneala. Pentu acest lip _de date, apcatoul < nu este supaincacat, pin utnae vom defini 0 functie de conpaae a doi elevi (intentionam sa soam elevii lexicogafic dupa nume, ia dacil exista mai multi elevi cu acelasi nume, ii vom sota lexicogafic dupa penume). #include <fseam> #include <algoithm> using namespace std; stuct elev {sting nume, pen; double mg; }; eleva [1000]; int n; ifsteam fin("elevi.in"} j ofsteam fout("elevi.out"); void Citeste () {i..nt i; fin»n; fo (i=o; i<n; i++) fin»a[i].tume»a[ij.pen»a[i].mg; } void Scie () {int ij fo (i=o; i<n; i++) fout«a[i). ume-c-c ' '«a[i].jx-ei-cc ' '«ali].mg «' \n'; bool CompaElevi (const elev& el, canst elev& {etun el... nume<e2. ume el.nume==e2.nume && el.pen<e2.pen; int main () {Citeste () sot{a,a+n, CompaElevi) Scie () ; etun 0; in pogamul pecedent am -definit 0 funcue de compaac. Puteam defini CompaElevi ca functo, astfel : e2} w u : -', 1 -.J, i '--'

65 -t -',,, i -,, i j -e, [ 7 t uc t ClasaCompaElevi haal opeato(} (canst elev el, canst elev e2) { etun el.nume<e2.nume el. n1..line==e2. nume && el. p.ei-c e z v p e.n i } ; ClasaCompaElevi CompaElevii Sotaea descescdtoae a unui tab/au unidimensional Pentu a sota descescato un tablou unidimensional, tebuie sa uilizam cca de-a doua foma a funcjie! de sotae, specificand ca al teilea paametu citeiu de sotae (un functo sau a funcue de compaae). Pentu clemente de tipui pedefinite sau definite de utlllzao cu opeatoul > supaincacat, se poate utiliza functoul pedefinit geate<'l'> (). Pentu a putea utiliza aces functo, tcbuic sa includcm fisieui antet functional. } ; Functoul geate este dcfinit astfel : template<class T> ( PROGRAMAREA in L1MBAJUL CC++ PENTRU LJCEU stuct geate:binay_function <T,T/hoal> heal opeato() (canst T& x, canst T& y) canst { etun x>yi Daca a ae conponente de tip int, Yom sota descescao elemcntele sale astfe : sotia,a+n, geate<int>(); hoel CompaElevi (canst elev& el, canst elev& e2) ( etun el.nume>e2.nume! el.nume==e2.nume && el.pen>e2.pen; canst n accfasi mod pocedan, de exempju, $i pentu un vecto ell clemente de tip factie (deoaece pentu aceasta clasa am supaincacat opeatoul» : sot (a,a+n, geate<factie>(»); Sotaea descescdtoae a unui tahlou unidimensional de elevi in cazuj in cae opeatoul > nu este supaincacai pentu tipul elemcntelo pe cae tebuie sa Je sotam, tebuie sa definim un functo sau 0 funcue pentu compaaea elememelo. in cazul vecoului de elevi, sillgua modificae pe cae tebuie sa o facem penu a obtine odonae lexicogafica descescatoae este schimbaea citeiului de sotae in functia CompaElevi () : Sotaea stabild using.namespace stdi int ni :lnt p[nmax] STL. CONCEPTE GENERALE Sotaea stabila conseve odinca initiala sabija se utilizeaza functia stable_sot (), nata ell functia sot ( ). int main () {i.nt ii cout «"n="i cin»ni fa (i=l;.i c e n : i..h ) p[ij=ii do {fa (i=l; i<=n; i++) cout«p[i]«' while (next_pemutation (p+l,p+n+1j ); etun 0; a elementclo egale. Pentu de asemenea in doua vaiante, Complexitatea sotan stabile este de O(n log i) (in cazul memoie suplimcntaa suficienta) sau O(n Loq-i) ill caz conta. Geneaea de pemutai template <class Bidiectionallteato> ;'bool next-pemutation (Bidiectionallceato pim, ; Bidiectionallteato ultim) İtemplate <class Bidiectionallteato, class Compae> baol next-pemutation (Bidiectionallteato pim, ; Bidiectionallteato ultim, Compae comp) i sotae asemaj.n cout«' \n' } 129 cae extsta Functia next-pennutation () eaanicaza elcmemele din domeniul [pim, ultim) astfel 'incat sa constituie pemutaea imediat unaoae din punc de vedee lexicogafic. mplicit, elementele se conpaa ell opeatoul <. Daca sc uliizeaza cea de-a doua vaianta, compaaea elenentelo va fi ealizata cu ajutoul functoului c omp, Functia cumeaza tue daca caanjaea a fast posibila. Vom utiliza aceasta functie pentu a genea n odine exicogafica toate pemutaile de odin n. n acest seop Yom utilize un vecto p, pe cae 11 vom initialize ell cea mai mica pemutaedin punct de vedce Jexicogafic (1,2,..., n). La fiecae pas afisam pemutaea cuenta si geneampemutaea umaoae. Poeedeul se epea cat (imp geneaea'umatoaei pemutai este posibifa. #include <iostean> #include <algoithm> #define NMAX 50

66 'i PROGRAMAREA in LMBAJUL C/C ++ PENTRU LCEU Daca doim geneaea pemutailo odine lexicogafica invesa. vom initializa vectoul p ell eea mai mae pemutae (n, n-l,..., 1) i la fiecae pas, dupa afisaea pemutaii cuente, geneam pecedenta pennutae apelaud functia pev-penutation () fo (i=l; i<=n; i++) p[ij=n-i+l; do {fo (i=l; i<=n; i++l cout c cp Li j c c ' 'i cout«' \n';} while (pev---pemutation(p+l,p+n+l)); Anagamele unui cuvant o anagama este un cuvant cae ae aceleasl thee ca si cuvantul dat, eventual int-o alta odiue, De exemplu, cuvintele tamaa i amata sunt anagame. Geneaea anagamelo unui cuvant este un pocedeu simila ell geneaea pemutailo. Exista totusi un aspect la cae tebuie sa tim atenti : daca incepem geneaea anagamelo cu cuvanul citit, yom obtine doa anagamcle mai mai din punct de vedee lexicogafic decat acesta. Din acest motiv, inainte de a tncepe gcncaea, Yom odona cescato liteele cuvanului citit (pentu a obtine cea mai mica anagams posibila). #include <iosteam> #include <algoithm> #define NMAX 50 usng namespace stdj sting s; int ma i.nl) {cin»s; sot(s.begin(), s.end()) do cout«s«,l vn ' ; while (next-pemutation(s.begin(),s.end())j etun 0; Pogamul evidentiaza faptul ca functia de geneae a umatoaei pemuai functioneaza j in cazuj in cae in domeniul specificat valoile nu sunt distincte. Geneaea siului Fibonacci Vom genea int-un tablou unidimensional pimii n temeni din siul Fibonacci, utilizand funcua geneate (). n acest scop, vom declaa un functo TF, obiect a1 clasei TemenF. Clasa TemenF ae datele 11!e.mbe 1 si 2 (doi temeni consecutivi din siul Fibonacci) si opeatoul () supaincacat. Aces opeato etuneaza umatoul temen din siul Fibonacci i actualizeaza coespunzato f 1 si f 2 : #include <iosteam> #include <algoithm> int n; intf[loo]; STL. CONCEPTE GENERALE class TemenF {public: int 1, 2; int opeato () () {int 3= 2+ 1; 1=f2; 2= 3; etun 3; ) TF;!! using namespace std; int main() {cout «,n=; cin»n; f[oj=tf. l=o; [lj=tf. 2=1; /initializae geneate(f+2, +n, TF) j //geneae fo (int i=o; i<n; i++) cout«f[ij«' etun 0; Execitii i pobleme ecapitulative 1. Sa consideam un tablou unidimensional a ell elemente eale, plasate pe pozitiile 1, 2,..., i, Cae dinte unatoaele vaiante soteaza cescato elementele vectoului a? a. sot(l,n); c. sot(a+l,a+n+l) b. sot (a+l, a-i-n ) i d. in acest caz nu este posibila sotaea eli sot ( ). 2. Cae dinte umatoaele expesii ae valoaea tue daca in eontaineul C nu exista elemente (este vid) : a. C.begin()==O b. C.end()==O c. C.begin () ==C.end() +1 d. C.begin() ==C.end() 3. Cae dinte umatoaele afinatii sunt adevaate?.. a. Gice containe, indifeent de tipuj acestuia, tebuie sa dispuna de constuctoi pivati. b. Algoitmii inteactioneaza ell containeele pin intemediul iteatcilo. c. Un obiect al unei clase sablon se numeste functo. d. Pentu a indica un element al unui containe putem utiliza un iteato. e. Gice containe contine functiile membe begin () i end ( ). f. Gice iteato, indifeent de tipul acestuia, supota opeaua de decenentae. g. Un pedicat este un functo cae etuucaza 0 valoae de tip bool. 11. Opeatoul + este supaincacat astfel Dcat sa pennita adunaea dinte un iteato bidiectional si un integ. i. Gice iteato poate fi deefeentiat ell opeatoul una "1< : ':! 1 '--' -J -' -

67 " - i. -' : ; -', -t -'" -:,, 132 PROGRAMAREA in LMBAJUL C/C ++ PENTRU LCEU j. Algoitmii sunt functii membe ale claselo containe. k. Pentu a soa descescato ejementele unui containe, intotdeauna poate f utilizat ca paametu al functiei sot () functoul pedefinit geate. 4. Gencaji aleatoiu un tablou unidimensional ell n clemente natuale < 10000, uilizand funcua geneate (). 5. Sa consideam un tablou unidimensional ell numee nauale eli eel putin tei cife. Utilizand functia fo...,:.each (), eliminati din fiecae element a1 tabloului cifa din mijloc (dadi elementuj ae numa impa de cife), espectiv cifele din mijjoc (daca elementul ae numa pa de cife). 6. Sa consideam umatoaea stucua : stuet DataC {int an, luna, zi; }; Din flsieul text datel. in se cieste un numa natual n, apoi 0 'succesiune de n date calendansnce, cae una pe 0 Jinie, scise sub foma: zi-luna-an Datele calendaistice vo fi memoate int-un vecto cu elcmente de tip DataC. Odonati datele conologic, folosind functia sot (,) din STL in u-ei vaiante : a. supaincacati opeatoul < ; b. implementaji citeiuj de sotae ca functie ; c. implementati citeiul de sotae ca functo. n mod simila, sotati i datele stocate (in acelasi mod) in fisieul date2. in. Utillzand algoitmii din STL, deteninati si afisati : d. dateje calendaistice cae se afla in ambele fisiee ; e. datele calendaistice din cele doua fisiee, in odine conologica. 7. Fisieul dictiona. in contine cel mult "de HnH, pe fiecae linie fiind scisa 0 definitie de foma: temen=desciee Rezolvati, utilizand algo-itmii din STL, umatoacle ceinte : a. Cititi continutul fisieului dictiona. in i constuiti un tablou unidimensional ale caui componente sunt peechi.(pai) fomate dint-un temen si descieea coespunzatoae. b. Seati temenii din dictiona in odine lexicogafica. e. Cititi de la tastaua un cuvant i cautau-! eficient in dictiona. Daca ali gas it in dictlona cuvantul, afisati descieea coespunzatoae. in caz conta aflsau mesajul nu exis ta. d. Cautati in dictiona si aflsati pe eean toae anagamele cuvantului citit de la tasatua. e. Stiind ca numele popii tncep cu majuscuta, eaanjati temenii din dicpona astfel incat la inceput sa fie numele popii in odine lexicogafica, apoi estul cuvintelo, de ascmcnea in odine cxicogaflca. 5. Containee secventiale Containeele secvenjiale pedefinite in STL sunt vec t o. dcquc;' list si, incepand cu C++, aay i fowad_list. in capitolul pecedent am mentionat 0 seie de elemente 'comune tutuo containeelo din STL. n continuae von pezenta ejementele speeifice fiecaui tip de containe Clasa vecto Pentu a utiliza aceasta clasa, tebuie sa includem isieul antet vecto: #include <ve c.toz-> Clasa vecto implemeneaza 0 stuctua de date similaa eu tablouije unidimensionale (vectoii din limbajul C). Elementele containeului sunt de acelasi tip i sunt nemoae int-o zona continua de memoie. Ca unnae, elementele containeului pot fi accesate atat pin intemediul iteatoilo, cat si pin intemediul pointeilo. teatoii containeului vecto suniteatoi cu acees aleatoiu. Difeenja sennificaiva consta in faptul ca memoia necesaa pentu ejementele vectoului este alocata dinamic. n acest scop, c1asa vecto utilizeaza un alocato (implicit, acesta estc un obiect al clasei pedefinhe a j l o'cat.o -). Constuctoii!ii destuctoul Constuctoii clasci vecto sunt : Constuctoul implicit (faa paameti) - cceaza un vecto vid (taa elemente). Exemplu vecto<int> a' EJect: cceaza un vecto vid cu clemente de tip int Constucto de umplee (jill) - ceeaza un vecto cu numa specificat de clemente; in cazul in cae se specifics si 0 valoae ca al doilea paametu, elementeje vectoului sum initial izate ell valoaca specificate. ---

68 134 PROGRAMAREA in LMBAJUL C/C++ PENTRU LCEU CONTANERE SECVENTALE 135 Exemplu vecto<int> a(100,0) i Ceeaza un vecto cu 100 de elemente de tip int i initializeaza cu 0 toate elementele. vecto<doube> b(1000); Ceeaza un vecto cu 1000 de elemente de tip double, taa initializae. Constucto bazat pe un domeniu (ange) - ceeaza un vecto in cae copiaza in odine toate ejementele dint-un domeniu specificat, Exemplu sting s : cin»s; vecto<cha> d(s.begin(), s. ed t ) ) ; Ceeaza un vecto de dimensiune egala cu dimensiunea siului s i copiaza in vecto fiecae caacte din siul s. Constucto de copiee - ceeaza 0 copie a unui vecto. Destuctoul - distuge obiectul, elibeand memoia alocata dinamic. Complexitaie Pentu constuctoul de umplee Cll initializae, constuctoul bazat pe un domeniu i constuctoul de copiee, complexitatea este iniaa ; ceilalti constuctoi necesita timp constant.. Functiile membe cae etuneazd iteatoi.clasa vecto contine functiile begin (), end (), begin (), end () Cll semnificatia uzuala. ncepand cu C++ 11, exista i functiile coespondente cae euneaza const_iteato (cbegin (), cend ()., cbegin (), cend t ) ). Functiile membe efeitoae La dimensiunea vectoului Alatui de functiile uzuale size ( ), empty () i max_size () in clasa vecto sunt definite i umatoaele functii nembe publice : capacity () size_type capacity{) const noexcept; Reuneaza dimensiunea zone! de memoie alocata pentu vecto, expimata in numa de elemente ; memoia alocata nu ese obligatoiu egala eli numaul efectiv de eleinente din 'vecto (a putea fi mal mae, pentu a pcnnie inseaea uno noi clemente taa a fi necesaa eajocaea memoiei). eseve () void eseve (size_type n) Asigua fapul ca vectoul ae memoie alocata pentu eel putin n elemente. Dad! mcmoia alocata pentu vecto este mai midi de n clemente, se aloca memoia necesaa (posibil in timp linia), in caz conta apelul functiei neavand niciun efect. esize() void esize (size_type n); void esize (size_type n, const value_type& val) ; Redimensioneaza spatiul de memoie alocat vectoului astfel incat sa contina exact n clemente. Daca dimensiunea cuenta a vectoului este mai mae de n elemente, se pasteaza doa pimele n clemente ale vectoului (celelalte fiind distuse). Daca diniensiunea cuenta a vectoului este mai mica de n elemente, se adauga elementele necesae la sfasitul vectoului (eventual iniializandu-sc elementele adaugate cu valoaea val)..shink_to_fit () 111) void shink_to_fit(); Redimensioneaza memoia alocata vectoului astfel incat sa fie egala cu numaul de.clcmene din vecto. Accesoi Accesul la elementele membe publice : opeatoul de indexae [] Retumcaaa 0 cfctnta cate elementuj situat pe pozltia n in vecto (pozitiile fiind numeotate de la 0). at () efeence at (size_type n) i canst_efeence at (size_type n) unui vecto se ealizeaza cu ajutouj umatoaelo functii efeence opeato[] (size_type n) i const,._efeence opeato f] (size_type n) const; canst; Retuneaza 0 efeinta cate elementul situat pe pozitia n in vecto. Spe deosebie de opeatoul de indexae, functia at () veifica validitatea pozitiei n i "aundi" exceptia out_of_ange in cazuj in cae n z s Lz e (). font () efeence font(); canst efeence qnt() const;.,!, :' w 1 -J

69 - " -' l.. f L j', ' 136 inset () iteato iteato template iteato PROGRAMAREA in LMBAJUL CJC++ PENTRU LCEU Rctuucaza 0 cfeina ente pinul element din vecto (spe deosebie de begin (), cae euneazs un iteato). back () efeence back{)j canst_efeence back() Ca pentu oice containe, este supaincacat opeatoul de atibuie e, funcia memba swap (), functia clea (), functiile inset () i ease (). in plus, SUiH definite umatoaele funcni membe publice cae modifies veeau : pushback ( ) canst; Retuncaza 0 cfeinja cate ultimul element a] vecoului (spe deosebie de end (), cae etuneaza un iteao ce indica pozlua de dupa ultimul element). data () (llj t alue type* data() noexcepti f const- value_type* data () canst noexcept: i Retumeaza un pointe cae contine adesa de incepu a zonei de memoie in cae sunt stocae elenentele vectoului. Teae functiile de acces se executa in inp constant. Funcjiile membe cae modified vectoul void push_back (const value_type& val) ; nseeaza un nou element la sfasitul vectoului i copiaza in acest element valoaea val. Dimensiunea vectoului va ccse eu 1 si, ca umae, este posibij sase execute ealocaea memoiei. popback ( ) void pop_back () Elimina i dlstuge ultimu element din vecto. Dimensiunea vecoutui va scadea eu 1. inset (const_iteata paz, const valuetype& val); inset{const_iteata paz, size_type n, const value_type& val); <class nputteato> inset (const_iteato paz, nputteato pim, nputteato ultim); Se inseeaza unul sau mal multe clemente in vecto in poz1ta specificait de i :iteatoul poz. Ca umae, dimensiunea vectoului va ceste eu numaul de clemente LJ lnseae si este posibij sa se execute eajoeaea nemoiei..pima'vaianta inseeaza - valoaea val, a doua vaianta (filf) inseeaza n elemente avand vajoaea val, a teia assign () CONTANERE SECYENTALE vaianta inseeaza -elemenele din domeniul iteato cae indica pimul element inseat. ease () template <class nputlteato> void assign (nputlteato pim, nputlteato ultim) void assign (size_type n, const valuetype& val); Functia ealizeaza 0 atibuie, nlocuind elementele vectoului eu elementele din domeniul [pim, ultim), espectiv cu n clemente cu valoaea val. in cazul in cae capacitatea vectoului este mai mica decat numaul de elemente din doneniu, espectiv decat n, se aloca memoia necesaa. Complexitatea opea/iila de inseae/eliminae push_back (J pop_back (J inset ( ) 0(1) 0(1) _.O(n) Obsevatii assign () O(n) 137 [pim, ul tim). Punctia euncaza un iteato ease (iteato poz) ; iteato ease (iteata pim, iteata ultim) ; Elimina i distuge din vecto elementul indieat de iteatoul poz, espectiv toate elementele din domeniul [pim, ultim), Ca umae, dimensiunea vectoului va scadea cu numaul de clemente eliminate. Functia euneazf un iteato cae indica pozitia de dupa ultimul element el ininat. 1. Functiile pop_back (), ease () si clea () nu ellbeeaza memoia alocata elementelo eliminate. Nici functiile esi ze () sau eseve () nu educ dimensiunea mcmoiei alocate. Pentu ca aeeasta sa fie exact 'memoia necesaa, se poate utiliza lncepand cu C++ 11 algoitmul shink_to_fit (). Pentu compilatoae mai vechi, putem apela -la 0,,mecheie'l ceez unvectoempoa pe cae 11 inteschimb eu vectoul pe cae il edimensionam. Ceaea vectoujui tempoa 0 vom ealiza utilizand constuctoul de copiee. Sa pesupunem ca veetoul este denumit v, iata 0 modalitate de a dimensiona exact memoia alocaa vectoului v in timp inia: v e c t.o <T'> (v).swap (v) ; 2. ncepand cu C+ + 11, functiile inset () $i assign () au 0 die 0 va-ianta cae pimeste ca paametu 0 lista de initializae. 0 lisa de inltial lzae este un obiect al clasei sablon ini t i a.l i.z e-jlis t; cae se constuieste automat pe baza unei liste de valoi (0 succesiune de valoi sepaate pin vlgula, ncadata intc acolade). De asemenea, au fost intoduse inca doua functii membe denumite emplace () sl emplace_back (), cae constuiesc i inseeaza un element int-o anumita pozhie.

70 Desi nil le-an pezentat, incepand ell C++ 11 exista vesi-uni ale uno functii nembe cae au paameti de tip value_type&&: void Push_back (valuetype&& val)j iteato inset (const_iteato paz, Opeatoii elationali PROGRAMAREA TN LMBAJUL CC++ PENTRU L1CEU value_type&& val); Constuqia Tip&& a fost intodusa incepand ell C 'pentu a indica 0 efeinja a 0 vajoae de tip value (ight-value, valoae cae poate fi plasata dea in membul dep al unei atibuii). n limbajul C, 0 valoae tempoaa cae putea fi plasata dea in membul dep al unei atibuii nu ea mcdificabila. Acest nou tip indica faptul ca 0 valoae tenpoaa cae este plasata n membul dept al unei atibuii, poate fi tuodificaa dupa ce a fost ceata, Acest tip a fost intodus din motive de eficienta a implementaii, pentu a indica muaea valo-ii espective'. De exemplu, in vaiantele de nai sus, vajoaea spccificata ca paametu a] functiei push_back (), espectiv inset () este mutata in vecto (nu copiata). Pentu clasa vecto sunt supaincacai tali opcaotl elationali, compaaea a doi vecto] ealizandu-se din punet de vedee lexicogafic. AplicaJia. Caloii A devenit 0 adevaata ats sa alcatuiesti un meniu Cae sa fie bogat da sa conpna cat mai puine caloii. Fiecae podus ae lnscis pe el pocenul de gasnni pe cae le contine i numaul de caloii. Din pacate, acest lucu nu se inampla j a piaa. Vazand aceasta, un taan inventiv, cae ofea spe vanzae un numa de n poduse, a facut un mic ca1cul i a deteminat, penu fiecae dinte podusele ofeite spe vanzae, numaul de cajoii pe cae le condne inteaga cantitae din podusul espectiv. Taanul a scis pe cate 0 eticheta numeele astfel deteminate i a pus fiecae eicheta langa podusul coespunzto,'avand gija ca dupa flecae vanzae sa coecteze in mod coespunzao numaul inset-is pe eticheta. 0 gospodina ce dispune de 0 anumita sums de bani S pentu cumpaatun doeste sa cumpee poduse de la ace] taan astfel incat sa che]tuiasdi inteaga suma S de cae dispuhe, da sa duca acasa cat mai mule caloii. Gospodinei 11 este indifeent ce poduse cumpaa i in ce cantitati, scopul flind ca podusele cunpaae sa contina in otalitate cel mai mae numa de caloii. Ceinfd ,<.;', CONTANERE SECVENTALE doua valoi natuale, epezentand numaut de caloii deteminat de taan pentu podus si cat costa inteaga cantitate din podusul espectiv. Ultima linie a fisieulul de intae va contine 0 valoae natuala S epezentand suma de cae dispune gospodina pentu cumpaatui, Date de iesie Fisieul de iesie caloii. out va contine pe pima Jinie 0 valoae cala cu patu zecimale, epezentand numaul maxim de-caloii continute in podusele cumpaate. Restictii 1 :5: n :5: s S S Numaul de caloii si petuile sunt valoi naualc s RezutatuJ afisat este consideat coect daca eoaea este mai mica decat 10-3 Exemple caloii.inlcaloii.out , Soliqie Explicapi Rezultatul se obtinc pin cumpaaea imegala a poduselo 2, 4 i 5 i a % din podusuj 3. Pill calcul sc obseva faptul ca : *150/100 = (Olimpiada Municipala de nfomatica, asi, 2010) Poblema este 0 efomulae a poblemei ucsacului, vaianta continua. Metoda de ezolvae este Geedy: - sotam podusele dupanumaul decaloii pe cae le pot obtine din podusul espectiv cu 1 leu; - cat timp podusul cuent poate fi cunpaat in integimc (petul sau este mai mic sau ega decat suma disponibila), l cumpaam (adaugam la total caloiile achizitionate, ia din suma disponibila scadcm petul podusului) ; - la final, daca mai exista un 'podus, cumpaam un pocent din acesta, in funqie de suma disponibila; caloiile obtinute se calculeaza ell egula de tei simpui. ;!,,, """ '-' Sa se detemine cantitatea maxima de caloii ce poate fi cumpaadi. Date de intae Fi ieul de intae caloii. in va contine pc pima linie un numa natual n. epezentand numauj de poduse. Fiecae dinte umatoaele n linii va contine caw 1. Explicalia este cxtem de succinta. Thomas Becke a ealizai 0 pezenlac foale claa i cletaliata cae ponle fi consultatii la adesa: efecnces/section Ol.htmL Pentu implementae, definim clasa Podus, cae ae doua date membe: cal (numaul de caloii pentu integul podus) i pet (petul podusujui); supaincacam ca functie memba opeatoul > : stuct Podus int cal, pet i bool opeato>(const P6aus & pl' const { etun cal*p.pet>pet*p.cal; ) ;...; -,

71 '- -',,!,- " i ',, n,.., J40 PROGRAMAREA in LMBAJUL C/C--+ PENTRU LCEU Declaam vectoul de poduse p asfel : vecto<podus> p; Pentu a nu fi necesae ealocai de memoie, ezevgm de la incepu memoia necesaa pentu vectoul p : f: p. eseve (n) ; Din fisieul de intae citim succestv cae un podus (in vaiabija auxiliaa x de tip P-ocius j si adaugam n-vecto podusul x apeland functia push_back () Podus Xj fo (int i=o; i<n; i++) {fin»x.cal»x.pet; p.push_back{x); } Penu sotaea descescaoac a poduselo din vectoul.p, apelam functia sot () : sot(p.begin(}, p.end(), geate<podus>()}i Pentu a ezolva poblema, pacugem elementele vectoului p folosind un iteato it, atat timp cat podusul cuent poate fi cumpaat integal: vecto<fodus>: :iteato it; ", fo (it=p.begin(); it!=p.end(); it++). if (it->pet <= S) : { total+=it->cal;..! S-=it->pet; ) ej.se beak; i. Aceeasi pacugee 0 puteam.scie "nomal", utilizand opeatoul de indexae : fo (int j=o; j<n; j++) : if (p[jj.pet <= s) : { total+=p[jj.cal; S-=p(jJ.pet; : else beak; La final, daca mai exisa un podus disponibil, cumpaam 0 podus, in functie de suma amasa : if (itl=p.end() total+= (double) S*it->cal/it->pet; Pogamul complet aata astfel : #include <fstean> #include <vecto> #include <algoithm> #include <functional> #include <iomanip> using namespace std; ifsteam fin{"caloii.in") ofsteam,fout("caloii.out") stuct Podus faciune din acest COl':TANERE SECVENTALE (int cal, pet; boo opeato> (const Podus & p) canst { etun cal*p.pet>pet*p.cal; } } ; int main() {int n, S; double total=o; Podus x; fin»ni vecto<podus> Pi p. eseve (n) i fo (int i=oi i<d; i++) {fin»x.cal»x.peti p.push_back(x); ) fin»s; sot(p.begin(), p.end(), geate<podus>()) vecto<podus>: :iteato it; fo (it=p.begin(); it!=p.end() it++) if (it->pet<=s) { total+=it->cal; S-=it->pet; else beak; if (itl=p.end()) total+= (double) S*it->cal/it->pet; fout«setpecision(12)«total«'\n'; fout.close(); etun Oi Aplicatia 2. Zid onel a- constuit D tunui fomate din'hl' h2 :.., espeotiv h-, cubui (fiecae cub avand latua 1). Tatal sau i-a popus sa faca un zid de lungime n. n acest scop, tebuie sa fie alese niste.tunui dinte cele n constuite astfel incat. eaanjand cubuile din tunuile alese, sa se obtina un zid de lungnne D. Zidul tebuie sa fie fomat din exact n tunui avand.aceeaiinaltime. Date de intae Fisieul de intae zid. in coinne pe pima linie un numa natual n cae epczina numaul de tunui. Pe cea de-a doua luuc sum sclse n numee natuale sepaate pin cae un spatiu, epezentand inaltimile ecto n tunui. Date de iesie.fisieul de iesic z i d. au t; va contine pe pima linic un numa natua] k., epezentand numaul de tunui alese pentu a consttui zidul. Pe cea de-a doua linie vo f J4J

72 142 seise k numee natuale sepaate pin.cae un spatiu, epczentand inaltimile celo k tunui alese pentu constuiea zidului. Restictii si pecizdi 0 < n S < hi S 1000, pentu oice i=l, 2,..., n Exemplu Soliqie zid.in zid.out Explicatie 5 3 Se fomeaza un zid de iungime n Si inaljime q 2 Poblema este 0 aplicatie diects a pincipiului cutici al lui Diichlet. Pentu a alege 0 submultime de tuuui eu suma inaltimilo divlzibila cu n, vom consui siul sumelo patiale sl=h 1 ; s2=h 1 +h 2 ;.. sn=h 1 +h h n Exista doua cazui: 1. in siul sumelo patiale exists lsisn, astfel incat Si%n==O. in acest caz, 0 solutie posibila este femata din tunuile 1, 2,..., L. 2. n siul sumelo patiale si%n:t:o, pentu oice 1sisn. in acest caz avem n estui cae iau valoi in multimea {1, 2,..., n -1}. Confom pincipiului cutiei al lui Diichlet, exista lsi<jsn, astfel incat si%n==sj%n. 0 solutie posibila este i+l, i+2,..., j (deoaeee (sj-sd %n==o). Exista numeoase nodalitati de a implementa aeest algottm. Scopul nostu este de a ilusta modul de funcponae a componentelo SJ'L, pin umae : 1. Citim succesiv cele n tnaltini i e adaugam in vectoul "h (pentu cae am ezevat in pealabil memoia necesaa) : vecto<int> h; h. eseve (n) ; fo (i=o; i<n; i++) { fin»x; h.push_back(x); 2. Constuim siul sumelo peiale s, utilizand algoimul numeic patial_swn () vecto<int> s; s. eseve (n) ; patial_sum(h.begin() PROGRAMAREA in LMBAJUL C/C ++ PENTRU LlCEU OJ 1 OJ h.end(), s:begin{)) EBm (.campion 2005) int main () int i,j,k, x, cate, gasit; fin»n; vecto<int> h; h _eseve (n) i fo (i=o; i<n; i++) {fin»x; h.push_back(x) CONTAN ERE SECVENTALE 3. 'pansfoman sumele panale in esui, utilizand algoitmuj foeach () : fo_each(s.begin(), void est (int& x) } s.begin()+n, est); Funct ia est () tansfoms un numa integ in estul impatiii sale la n : oid est (int& x) { x=x%n; 4. Cautam, utilizand algoitmul find (), 0 valoae egala cu 0 in siul estuilo, etinand in iteatoul poz pozitia pe cae se afla pima valoae egala cu 0 : t vecto<int>: : i teato poz; i poz=find(s.begin(), s.begin()+n, 0); Daca poz! =s.begin () +n, ne aflam in pimul caz (a fost identificat un est nul), in caz conta, ne aflam in eel de-al do ilea caz i tebuie sa identificam doua estui egale. Pogamul complet aata astfel : #'include <fsteam> #include <algoithm> #include <numeic> #include <vecto> using namespace std; Lfst e am tint "zi.d c Li") otsteam fout("zid.out") int n; { x=x%nj vecto<int> s; s. eseve (n) ; patial_sum(h.begin(), h.end(), s.begin()) fo_each(s.begin(), s.begin() --i, vecto<int>::iteato poz; poz=find(s.begin(), s.begin()+n, 0) est); if (Poz!=s.begin()+n) //cazul 1 {cate=poz-s.begin()+l; fout«cate«'\n' ; fo (i=o; j c c a t e : i++) fout«h[i.j«'- fou Lc c ' vn ' 143, '--'.-, _0 w

73 ! l j -«,., -' 144 else {fo j--; i--; fout«j -i«\n j fo (k=i+l; k<=jj ) fout. close () etun 0; Apiicaiia 3. Lucul cu matice in STL nu exista 0 clasa speciala pentu lucul ell matice. 6 man-ice poate fi. implementata ca un vecto de vecoi. De exemplu, sa implemental11 0 matice v ell n linii si m coloane $1 componente de tip into in acest scop Yom declaa un v e c t o - ell componente de tip v ect o c Ln s, $i alocam memoie pentu vectoul de n linii: Vecto< vecto<int> > v(n); Vom "umple" maticea ell numeele natuale de la 1 Ja n "m (consideand pacugeea pe linii). Pentu a nu ealoca memoie la fiecae element adaugat, petttu fiecae link alocam memo-ia pentu m clemente : int cont=oj fo (i=o; i<n; i++) (v i]. eseve (m) ; PROGRAMAREA in LMBA.UL CCH- lcazul 2 (gasit::::i::::o; i<n &&!gasit; fo (j::::i+l; j<n && if (sli]==slj]) k++) PENTRU L1CEU i++)!gasit; j++l 9asit=lj fout«h[kj«' fout«' \n' j fo (j=o; j<mi j++) v[i].push_back{++cont); ) CONTAN ERE SECVENTALE Clasa specializata vecto<bool> in fisieul antet vecto este definita sl 0 clasa specializata : vecto<bool> (vectoiavfl.l1d clemente de tip bool). Spunem ca aceasia clasa este specializata deoaece, pentu economic de memoie, 0 valoae de tip boal este implenentata pe un bit, nu pe un byte. Pentu aceasta clasa, iteatoii 1}i pointeii au fost nodificati astfel incat sa indice un bit, ia tipul efeence este definit ca 0 clasa ce pemite aceesaea ficcaui bit din epezentae. in acest mod, utilizatoul acestui containe specializat beneficiaza de 0 intefata similaa cu cea a unui vecto, taa a constientiza efectiv lucul eu biti. Functii membe suplimentae flip() void flip () ; scntmba n timp linia fiecae bit din containe (tue devine false, ia false devine tue). swap () void swap (vecto& x) i static void swap (efeence efl, efeence ef2) ; Functia swap () este supaincacata astfel incat sa pennita, pin cea de-a doua foma, inteschinbaea a doua elemente ale unui vecto<bool>. 145, n continuae putem peluca aceasa matice ca pe 0 matice "nannaa" (opeatoul de indexae fiind supaillcacat) : #include <iosteam> #include <vecto> using namespace std: int main () {int n, m, i, j, Xi cin»n»m; vecto< vecto<int> > v{n); int cont=o; fo (i=o; i<n; i++) { v[ij.eseve(m) fo (j=o; j<m; j.++) v l i j. push_back (++cont) ; fo (i=o; i<1"1; i+.t-) fo (j=o; j<m; j++l ccu t e cc j jj fj]«' c out cc : \n' i etun 0; i i Clasa speciatizata hash<vecto<bool> > lncepand cuc+ + 11, este definita 0 spec.ializae i pentu clasa v ect.o.-cfioo L>, denumita hash. Aceasta specializae ae supaincacat opeatoul ape} de functie t, cae eumeaaa 0 valoae hash calculata in functie de toate elenentele din veetoul espectiv. Aceasta valoae flash penitc containeeio v ect.o cbool> sa poaa fi utilizate dep cheie in containec asociativc nesotate. Aplicatia 4. Ciuul lui Eatostene Yom genea toate uumeclc pime <VMAX pin metoda ciuului lui Eaostcuc. Ciuul va fi epezentat ca un vecto<bool >, initializat eu valoaca t: ue (ciulil va fi tue daca i cstc numa pim, espectiv false caz conta). Pacugem ciuul si, daca i cste nuna pim, atune! eliminant din ciu toti multiplii lui -i. #include #include <iosteam> <vecto>

74 146 PROGRAMAREA in LMBAJUL C/C-H PENTRU UCEU #define VMAX using namespace stdj vecto<bool> ciu(vmax, tue); int main () {int i, ji fo (i=2 j i*i<vmax; i++) if (ciu[i]) ii este pim //elimin din ciu multiplii neeliminati ai fo (j=i; j*i<vmax; /afisez numeele pime j++j ciu[j*i]=false; fo (i=2; i<vmax; i++) if t c i u j j j j etun a i coct c.e j e e. 'i ) AplicaJia 5. Repezentaea unui gafpin liste de adiacenpi Yom epezenta un gaf neoientat pin lisle de adiacena si apoi YOm descompune gaful in componente conexe, utilizand pacugeca DFS. Pentu a epezenta listele de adiacena, utilizam un vecto v ell NMAX clemente de tip vecto<int> (unde ell NMAX am notat numaut maxim de vafu-i din gaf), vecto< vecto<int> > V(NMAx) ;.Citin succesjv cae 0 muchie x y din gaf $i inseam pe x n ista de adiacenjg a lui Y $i pe y in Hsta de adiacenta a lui x : fin»x»y; v[x].push_back(y); v[yj.push_back(x); n cazuj in cae gaful este oientat, y nu mai tebuie adaugat in lista de adiacenja a lui x. Pentu a etine daca un vaf a fast sau uu vizilat, utilizam un vecto<bool>, denumit viz, pe cae l initializam ell false. #include <fsteam> #include <vecto> #define NMAX 1001 using namespace std; ifsteam fin("gaf.in");, '.'fsteam f out; ("gaf. out") ; 1nt n; vecto< vecto<int> > v (NMAX) ; vecto<bool> viz(nmax, false); void dfs(int x) {viz [x] =tue; fout«x«' '; fo (int i.=(l; i<vlx].size();.i++) ) if (!viz[v[xj[ijj) dfs(v[x][i]); lui ---- i CONTANERE SECYENTALE int main () {int m, i, X, Y, nc=oi fin»n»m; fo (i=o;.i cm, i++) {fin»x»yi v[xj.push_back(y) v[y]. push_back (x) fo (i=li i<=n; i++) if (!viz[i]) {fout«"componenta conexa "«++nc«'\n' dfs(i); f out;«-c ' 'vn ' j } f ou t;. close () etun 0; Obsevatie o alta implementae posibila a f sa alocam static vectoul de linii, ia liniile ce contin listeje de adiacenta sa fie alocate dinamic (utilizand clasa vecto). Declaatia gafului epezentat pin 1iste de adiacenta in accs caz va fi : l vect o cd.ne> G [NMAX] i Accaste declaatie aloca un vecto cu NMAX componente de tip v e c o -e i n t.> (unde N.tA.X este numaul maxim de vafu! din gaf). 5.2.Clasa deque Pentu a utiliza aceasta clasa, tebuie sa includem fiseul antet deque : #include <deque> Cuvantul deque (ponunjat "dec") este un aconim pentu double ended queue (coada cu doua capete sau coada ell dubla pioitate). Clasa deque implementeaza 0 suctua de date alocata dinamic., in cae se ealizeaza eficient opeatii de eliminae/extagee 1a ambe1e capete. Spe deosebie de clasa vecto, nu se gaanteaza ca elementele sunt stocate int-o zona continua de memoie. ci sum stocate in "blocui". Acest mod de stocae pemite implementaea eficicnta a inseailo j extageilo de a ambele capete -51 ofea un plus de eflcienta cand se luceaza cu secvente mai, in cae ealocaile de memoie sunt costisitoae. eatoii clasei d e que SU11l iteatoi cu acccs aleatoiu, ca si in cazul vectoilo, da implementaea lo este tnai complcxa, fiind nccesaa pacugeca mai mulo blocui de clemente. lucfata c1asei deque este cxtem.de asenanatoae eu cea a clasei vecto, pin umae von pczenta succint fuuctiite membe al clasci. 147 T i - -) c..j

75 148 PROGRAMAREA in L1MBAJUL CC++ PENTRU LCEU CONTANERE SEC VENT ALE c Constuctoii si destuctoul Constuctofi clasei deque sunt: similai ell constuctof clasei vecto, fiind supatncacati constuctoul implicit, coustuctoul de umplee, constuctoul bazaj pe un domeniu i constuctoul de copiee. Destuctoul distuge obiectul, elibenind memoia alocata dinamic. Functiile menbe cae modified containeul deque Ca pentu oice containe. este supaindicat opeatoul de atibuie funcua memba' swap (), -funcua clea (), functiile inset () i ease (). Asemanato cu cele din clasa vcc t.c sunt definite funciile memhe pushbock( ), pop_back (), assign (), emplace (), emplace_back (). in plus, sum definite unnaoaele functii membe :,. Exemple deque<int> a; Ceeaza un deque eli 0 elemente de tip into pushfont () void push_font (canst value_type& val) ; nseeaza un element ell valoaea val a inceput (inainte de pimul element). deque<int> a(loo,o); pop_font () : --, - Cceaza un deque ell 100 de elemente de tip int si initializeaza ell a toate elementeje. sting s;, cin»s i i deque<cha> d (s. begin ( ), a. end ( ) ) ; Ceeaza un deque de dimensiune egala ell dimensiunea siului s si copiaza in deque fiecae caacte din siul a. Functiiie membe cae etuneaza iteatoi Clasa deque contine functiile begin (), end (), begin ()" end () eu semnificana uzuala. lnccpand cu C++ exists si functiile coespondente cae etumeaaa c one t; iteato (cbegin (), c end (), cbegin (), cend ()). void pop_font() i Elimina si distuge pimul element. Opeatiile push_font () si p.op--..:font ( ) Obsevatie Functiile inset () si ease () pemit inseaea, espectiv stegeea elementelo de oiunde din containe, inc1usiv din inteio (in acesi caz iteatoii. pointeii $i.efeintele sunt invalidate). Opeatoii elationali se executa in timp constant. Pentu clasa deque sunt supaincacati toi ope-atoii elatiouali. compaaea ealizandu-se din punct de vedee lexicogafic. -; i l, -- Functiile membe efeitoae 10 dimensiune Ataul de functiile uzuale size (), empty f) si max_size () in clasa deque sunt definite functiile membe publiee esize () si, inccpand eu C+ + 11, shink_tofit (), in mod simila eu eele din clasa vecto. Punctiile capacity () :i eee-vet ) nu sunt disponibile. Accesoi Aplicatia 6. Secveg Sa consideam secventc consntuite numai din paanteze otunde!}i paaneze patate, adica din caactcclej ) [ l. Pin definijie, 0 secventa de paantczc este egulata daca se obtine aplicand unatoaele eguli : 1. () si l l sunt sec vente egulate; 2. Daca A este cgulata, atunci (A) i [A] sunt secvente egulate; 3. Dad! A!ii B sunt egulate, atunci AB este secvenja egulate. -e- - Accesul la elementele unui deque se calizeaza in mod simila eu accesul la elementele unui vecto eu ajuoul opeatoului de indcxac l l Si a functiilo mcmbe at (), font(), back (). De exemplu, () () [J si [( ( ) ) ] [] sunt egulate, in timp ce ] [ sau [(] sau { [ }] nu sunt egulate. Se consideti 0 secvenja de paantcze. La fiecae pas se insecaza 0 paamezf (otunda sau patata, deschisa sau inchisa) la inceputul sau.la sfasuul secveutei.

76 , 150 Ceinja Scieti tin pogam cafe sa dctem inc, dupa fiecae pas, lungimca celei mai scute subsecvente egulate (fomate din caacee consecutive ale secvcntei) Cae contine paanteza inseata a pasul especiv. Date de iniae Fisieul de iesie secveg. out conpne N Jlnii. Pe cea de a i-a linie va fi afiata iungimea celei mai scute subsecvente egulate cae contine paanteza inseaa a pasul i. Daca nu exista 0 astfel de subsecventa, pe linia i yeti afisa o. Restictii Lungimea secventei initiale de paanteze este S ::; N s; Exemple PROGRAMAREA in UMBAJUL C/C ++ PENTRU UCElJ Fisieul de inn-ac secveg. in contine pe pima lillie secventa iniliala de paanteze. Pe cea de-a doua linie a fisieului de inn-ae se afla un nuna natual N cc epcztnta numaul de pasi. Fiecae dinte umatoaele N Jinii contine un nuna natual A si un caacte C sepaate pint-un singu spauu. Dad! A este 0 (zeo) atunci caacteul C este inseat a nceputul secventei ; daca A ese 1 atune! caacteul C este inseat la sfasiul secventei. Date de iesie Soltqie secveg. in secveg.out secveg.in secveg.out ( ] 0 J ) a ) 2 0 ) 6 a ) a ( a ( a ( Vom utihza doua cozi eu dubla pnoitatc : (campion 2(04) 1. coada cu dubfa pioitae a eu clemente de tip cha in cae inseam succesiv caacteele din siul initial, apoi pe cele specificate in opeatiile din flsic ; 2. coada cu dubla pioitae b eu elemente de tip int; b [i ] = lungimea secvcnjei egulate cae ncepe la pozitia i. nitial inseam in odine toate caacteele siului citit in coada ell dubla pio-iate a. Pentu a pasta odinea, fiecae nou eaacte va 11 insea ia sfastul cozi. Cand inseam 0 paanteza inchisa a sfasiul cozii, ja pe ultima pozlpc ill a estc paanteza deschisa coespunzatoae, deducem ca se fomeaza 0 sccveua egutaa ell lungimca cu 2 mal mac dedit eea deja existents pe accasta poztuc. Pin umae,' eliminant din cozile a, cspectiv b clcncntelc finale (adica climinam din a sceventa egulata ---- foinata deja), apoi actualizam,in b lungimea secvenlei cae [ncepe pe ultima poziue. ifsteam fin ( "secveg. in") j ofsteam fout (" secveg. out") deque<cha> ai deque<int> bi sting Si ) a. push back (c) etun 0 i CONTAN ERE SECVENTALE cunujand lungimea sccventel egulate eliminate. n caz conta, inseam in a la final caacteuj ddt, ia ill b inseam la final valoaea 0 (fiiudca aceasta este lungimea secventei egulate fomate eli caacteul ddt). Cand tebuie sa mseam a tnceputul cozii a 0 paanteza deschisa, ia Ja neeputuj cozii a ea paanteza jnchisa coespunzatoae. se fomcaza 0 secventa egulas cu 2 mai mae i executiiu aceleasi opeatii ca in cazul pecedent, da la nceputul cozilo cu dubla pioitate, ffinclude <fsteam> #include <deque> using nespace std; inline bool deschis(cha c) { etun c==' (' c==' [ '; ) inline cha peeche(cha c) ( if (c==-') ) etun (' i if (c==' ( ') etun '} ; if (Co;=- ] ') etun,[ j if (c== [ ') etun,] ; int la_sfasit(cha c) int et; if ( la.empty() && ldeschis(c) && a.back()==peeche(c) {et=b.back()+2; /ietin lungimea scventei egdle b.pop_back(); a.pop_back() //elimin secventa egulata fomata b[b.size()-l]+=et; //actualizez in b lungimea secventei egulate etun et; b. push_back (a) j int la_inceput(cha c) int et; if (la.empty() && deschjs(c) && a.font()==peeche(c) ) {-etcb. E-ot; () +2; / y-e t S.n lungimea secventei egulat,e a.pop font() j b.popfoj1t(} j. b[oj += -e t: 15l...J i...j, 0...J

77 i i, l.,. -' i 15" PROGRAMAREA N LlMBAJUL C/C++ PENTRU LJCEli etun et; ) a.push_font(c)j b.push_fant(o); etun OJ int main ( ) cha c : int i, paz, n; fin»s; b.push_back(o); fo (i=oi i<s.size(); ++i) la_sfasit(s[i]); fin»n; fo (i=o; i<n; ++i) {fin»poz»c; if (paz) fout«la_sfasittc)«'\d'; else fout«la_inceput(c)«'\n'; ) fout. close () ; etun 0; Exemple list<int> a; CONTANERE SJ:-XVENTALE Ceeaza 0 Esdi ell 0 clemente de tip into list<int> a(l'oo, 0); Ceeaza 0 lsta ell 100 de clemente de tip int i illitializeaza ell 0 toatc elementele. sting 5; cin»s; :: list<cha> d(s.begin(}, s.end()); \ Ceeaza 0 lista de dimensiune egala cu dimensiunea iului s si copiaaa in llsta fiecae caacte din siul s. Functiile membe cae etuneaz/i iteatoi Clasa list contine functiile begin (), end (), begin (), end () eu semni ficatia uzuala, [ncepand eu C++ 11, exista i functiile eoespondeme cae etu- neazll const_iteato (cbegin (), cend (), cbegin (), cend ()). 153,,! --!, --t i, i 5.3. Clasa list Pentu a utiliza aceasta clasa tebuie sa ineludem fisieul antet list: #include <list> Clasa list implementeaza 0 stucua de date cae penite inseaea i extageea elementelo din stucua in mod eficient, indifeent de pczijia acestoa, pecun sl pacugeea clementelo in ambele scnsut. Ca inplenentae, elementele containeului list sum oganizate ca 0 ista dubju lnhin!uita. )teatoii pentu containeul list: sunt bidiectionali, ceca ce "insean1na ca nu avem acces diect Ja elementele unei liste, da putem pacuge elementele in anbele sensui. Un posibil dezavantaj al aeestui containe este memoia supjimentaa neccsaa pentu memoaea legatu-ilo tn lisa. Constuctoii i destuctoul Constuctoii clasei list sun similai ell constuciofi claselo vecto i deque fiind supaincacap constuctoul implicit, constuetoul de umplee. eonstuctoul bazat pe un doneniu si eonstuetouj de copiee. Destuctoul distuge obiectul, elibednd memoia alocata dinamic. Exceptand constuctoul implicit, toi constuctof sl destuetoul au complexitate liniaa, Functiile membe efeitoae la dimensiunea iistei in c1asa list sunt disponibije numai functiile uzuale size (), empty () i max_size (). Accesoi Este posibil accesul doa la pimul i la ulinul element allistei (functia font () etumeaza 0 efeinta la pimul element, ia functia back () etuneaza 0 ctelnta Ja ultimul element a1 listei}. Functiile membe cae modijica lista Ca pentu o-ice containe, sunt supaindicai opeatoul de atibuie =, functia memba swap (), fuuctia clea (), functiile inset () sl ease (). Ascmanao ell cele din clasa d ecue sum definite fuuctiile ncmbe.puahlbac k (), push. font (), pop._back (), pop_font (), assign (). emplace (i. emplace_back () i emplace font ( ). Opeatiile specifice Clasa containe list: contine functii menbe publice cae pemit efectuaea uno!' opeatii specifiee ell liste :

78 i PROGRAMAREA in UMBAJUL CC-H PEl\'TRU UCEU CONTANERE SECVENTALE 155 splice) void splice(iteato paz, void splice(i'ceato paz, void splice{iteato poz, u L tim) ; emove (-) void emove (const value_type& val); list& x ) j list& X, iteato i) ; list& x, iteato pim, iteato Functia splj ce () muta in containeul cuen, Ja pozma indicata de iteatoul poz, clemente din lista x. Pima foma mua toate elementele din x, a doua foma mua dea elementul indica1 de iteatoul i, ia a teia foma muta elementele din x aflate in domeniul [pim, ultim). n uma accsci opeatii dimensiunea listei cueme l)i a istei x se nodifica. Functia splice () se executa in thup constant pentu pimele doua fome, espectiv in timp linia, functie de dimensiunea doneniului pentu a teia foma. Puncna emove () elimlna si dlsuge in limp linia toate elementele dill Hsa cuenta egale cu valoaea val. Realizeazf inteclasaea listei cuente cu -lism x, mutand elementele din x in \ista cuenta pe poz.itiile cocspunzatoac. Evident, sc consldca ca initial elementele din!ism cuenta si elememele din lista x sunt deja odonate -cescato considcand opeatoul < (pentu pima foma), espectiv odonate confom citeiului specificat de pedicatul bina camp (pemu a doua foma). nteclasaca se ealizcaza in timp linia. sot () void sot () template <class Compae> void sot (Compae comp); Odoneaza elemcutele listei cuente cescato consideand opeatoul < (pentu pima foma), espectiv consideand eiteiul specificat de pcdicatul bina camp (pcntu a doua foma), mutand elementele listei. Complcxitatca algoitmului de sotae este O(N log N), unde cu N am notat numaul de clemente din lisla. evese () void evese () emove f (J nvescaza in timp linia odinea elementelo din ista cuenta. temp2ate <class Pedicate> void emove if (Pedicate ped).puncna emove_i f () cllmtna i distuge in (imp linia toate elementele din ista cuenta pentu cae pedicatul ped ae valoaea tue. unique () void unique(); temp1ate <class BinayPedicate> void unique (BinayPedicate binay-ped); Dupa apelaea pimei fome a functiel unique ( ), lisa cucnta nu va mai contine clemente consecutive de valoi egale (duplicatele fiind eliminate). Dupa apelaea celei de a doua fome a functiei unique (), ista cucna nu.va mal contine elemente consecutive pentu cae pedicatul bina binay_ped sa etuneze valoaea tue. Dint-o succesiune de valo! pcntu cae binay_'ped euncaza tue pentu oicae doua valoi consecutive, se pasteaza doa pima valoae, celelalte fiind eliminate. Elemcntele eliminate sum distuse. Complexuatea functiei unique () cste llniaa. mege () void mege (list& xl; template <class Compae> void mege (1 is t& x, Conpec comp) i Opeatoii elationali Opcatoti clationali au fest supaincacati pentu clasa f owad_l i s t, compaaea ealizandu-se din punct de vedee lexicogafic. Aplicatia 6. Coment Elevii de clasa a XJ-a au un sisem popiu de a-si ansmite comentaiile la omana. in uma tndejungatel lo colaboai, si-au fomat un sistem de elatii astfel meat, oieae a fi doi elevi, unul pimestc comentaii de Ja celalalt. Evident, oice conentaiu pimit poate fi tansmis mai depate. Ceinja Pesupunand ca n clasa a X-a sunt N elevi, numeotati distinct de la 1 la N, :;;i ca sistenul de elatii dinte elevi ese cunoscut, scieji un pogam cae sa gnseasca 0 modalitae pin cae un comentaiu, ansmis de unul dinte elevi, sa ajunga pe la toi elevii 0 singua data. Date de intae Ftsieul de intae c omeit. in confine pe pima linie numaul natual N, epezcntand numaul de elevi. Pe umatoacle N* (N-) /2 linii se aila pcechi x y de nuncc natuale distincte cuptusc inte 1 -i N, cu scmnificatia c;j elcvul x tansmite comentani elevul ui y. '-' '-!,, -' '--'

79 - L - i,,, -' i Date de iesie Restiqii 2.s; N.,;. 100 Daca ex ista mai multe solutii, se va detemina una stngua. Exemplu Soliqie PROGRAMARBA in LMBAJUL CC ++ PENTRU UCEU Fisieul de iesie c omei t. ou t; contine pe pima linie 0 succcsiune de N numenatuale distince cupnnse ine 1.)i N, epezentand odinea 111 cae elevii pime.sc comentaiul, cement.in cement. out Olimpiada Municipala de nfomatica asi, 2002 Putem asocia poblemei un gaf oientat in cae vafu-ile sunt elevii; cxista ac de la vaful x la vaful y daca elcvul x tansmite comentaii elevului v. Din enuntul poblcmei deducem ca gaful ese complet $i antisimetic (oicae a fi doi elevi x i y exista exact un ac nte x i y), adica este gaf uneu, Poblema solicits constuiea unui dum hamiltonian acest gaf (dum cae tece pin fiecae vaf al gafului exact 0 data). Puten demonsta ca n 'o icc gaf tuneu exista un dum hamiltonian. Demonstatia este constuctiva $i va sta a baza algoitmului nostu. Vom alege un vaf oaecae din gaf (de exemplul vaful 1) i constuin un dum elemental' maximal ponind din acest vaf. nitial' dumul. este fomat dint-un singu vaf xje L. Catimpeste posibil, 'exindem dumul in deapta (mai exact, deteminant un vaf y cae nu apatine dumujui si pentu cae exista ac de la ultimul vaf de pe dum la y i adaugam pe y a sfasitul dunului}. n mod simila, extindem cat limp este posibil dumul in stanga (deteminam un vaf y cae nu apatine dumulut si pentu cae exista ac de la y la pimul vaf aj dumului -51 'il insean pe y pe pima pozitie pe acest dum). Sa notan cu Xl, X2,..., Xk dumul elementa maximal astfel ceat, Exista doua cazui posibile : 1. dumu ceat contlne toate vafuile gafului ; 'in acest caz ne-am atins scopuj: am constuit un dum hamiltonian; 2. dumul ceat nu confine toate vafuile gafului ; n acest caz cxlsa un vaf y cae nu apatine dumului.. Refeite la acest vaf y putem face umaoaele afimatii : e,i-ista.c dc'la XJ la y(in caz cona, dumul nu a fi maximal, ci a putea fi extins in stanga inseand pc y naintea lui xj; int main () citie() Dct e u.ne () Scie() ; etun,0'; CONTANERE SECVENTlALE _ exista ac de a 'y a Xl-; (in caz conta, dumul nu a fi maximal. deoaece am putea extinde dumul in deapta, adaugand pe y dupa xj ; exista eel putin 0 peeche de vafui consecutive pe dum x x", astfcl incat cxista acul (Xi,y) si acul (y,xi+l) (in caz conta nu am putca pleca din Xl cu ace cate y si sa ajungem in Xk cu ace plecand din y) : nseam pc y pe acest dum inte Xi si Xi+l, obtinand un dum elementa ell lungimea cu 1 mai mae; pocedeul se epeta cat timp dumul nu este hamiltonian. Yom epezenta gaful pin matice de adiacenta deoaece numaul maxim de vafui din gaf este elativ mic (100) si este necesa sa identifican ace atilt in funcjie de extemitaea lo initiala, cat si in functie de extemitaea lo flnala. Dumul va fi un obiect de tip list denumit d, deoaece sunt necesae opeatii de inseae eficiente ill divese pozitii. Pentu a veifica eficient daca un vaf apatine sau nu dumului cuent vom utiliza un vecto<booj.> denumit uz (valoaea false sennificand faptul ca vaful nu apajine dumului). Pogamul implementeaza pocedeul descis in demonstatia existentei dumului hamiltonian. #include <fstean> #include <list> #include <vecto> #define NMaxVf 101 using nanespace std; int n; bool G[NMaxVfJ [NMaxVfJ vecto<bool> uz; list<int> dj void Citie () veid Detenina(); void Scie () X lj..,.' ---+ Xi ---+ Xi+l lj Xk 157

80 J58 PROGRAMAREA N UMBAJUL CC++ PENTRU LlCEU CONTi\NERE SECVENTA1_E 15 void -Cd t L-e (l {ifsteam fin {vcomen. in") ; int x, y, ffi, i; fin»n; u2vecto<bool>(n+l,falsel m:::::n*(n-ll/2; fo (i=o; i<m; ++i) {fin»x»y; G[x] [yj:::::tue; fin. close () ) void Seie () (ofsteam f out; ( "coment. out" ) ; list<int>::iteato it; fo (it:::::d.begin(); it!=d.end(); ++it) fout«*it«' fout«' \11'; fout.close(); ) int cautped(int vi) {fo (int i=1; i<=n; i++l if (!uz[i] && G[i] [vf]) etun i etun 0; ) int cautsucc(int vf) {fo lint i=1; i<=nj i++) if (!uz[i] && G[viJ [ij) etun i; etun 0- void Detemina ( ) {int X; list<int>: :iteato it; linitializam dumul eu vaful 1 uz[1]=tue; d_push_back{l) j lextindem dumul cate deapta, cat timp este posibil do {x=cautsuce(d.back() ; if (x) {d.push_baek(x); uz[x]=tue;) } while (x) /lextildem dumul cate deapta, cat timp este posibil do {x=cautped(d.font()}; if (x) {d.push_font(x); uz[xj=tue;) } while (x); fo (X2i x<=n; x++) if (! u z l x l x nu apatine d -umu Lu i. {/caut pozitie de inseae fo (itd.begin(l; G[*it] l x L, +-lil); /inseez pe X d.insetlil,xl ) 5.4. Clasa fowad_list i_n pozilia cuenta Clasa fowad_list a fast intodusa in STL lnccpand cu C+ -- ] 1 si, pentu a o utiliza, tebuie sa includem fisieu! antet fowad_list: )i #include <fowad_list> Clasa fowad_list implementeaza 0 stucua de date cae pe-mie nscaea i extagcea elementelc n timp constant, indifeem de pozlna acestoa. Ca implementae, elementele containeului fowad_list sunt oganizate ca 0 ista simplu inhinuita.cu alte cuvinte, spe deosebie de Las t, unde fiecae element conjinea doua egatui (una cate umaoul element din lisui si una cate pecedentul element din lista), in fowad_list se etine doa 0 singua legaua, catc umatoul clement din Jista. Pin umae, se educe dimensiunea memo-iei supfimcnac neccsaa pentu nemoaea legauilo. teatoii containeului fowad_list sunt iteatoi de naintae (fowad iteatos), pin umae pacugeea clcmcntelo este posibila doa n-un singu sens (de Ja inceput cate sfasit).. Constuctoii, destuctoul i opeatoul de atibule ::: sunt similai clasei La.nt.. Ven evidentia n conunuae difeentele specificc clasei fowad_list, pcntu difeitele categoni de functil. Functiile membe efeitoae fa dimensiunea listei Containeul fowad._i.ist este singuul containe standad cae, din motive de eficienta, nu dispune de funcjia size (). Astfel, lu mai este neccsaa etineea i acualizaea pemanents a dimensiuuii cuente a listei, Singuele fuucjii disponibile efeioae 1 1 dimensiunca coutaineului sum empty () i maxsize (). Pentu a afla numaul de clemente din listii se poate utiliza algoitmul distance. De exemplu, dace FL este un obtect de tip t'owad_list, pentu a detenina in vaiabila n numaul de elemente din ista FL putem apela functia distance avand ca paameti inceputul i sfasltul listci : ' n=distance(fl.begin(), FL.end()) -' -', -',, '-' -'

81 160 PROGRAMAREA in LMBAJUL CC++ PENTRU L1CEU CONTANERE SECVENTALE 161 l j --' l, -. -', -,. n i :! Accesoi Este posibil accesul dea la pimul element al listei uillzand functia f ont ( ), cae euncaza 0 efemta la pimul element. Functiile membe cae etuneaza iteatoi Clasa fowad_list contine functiile uzuale begin (), end (), cbegin () si cend () cu semnificatia uzuala. in plus, sunt definite doua functii denumite befoe_begin (), espectiv cbefoe_begin () cae euneaza un iteato, espectiv const_iteato cae indica pozitia dinaintea pimului element din lista. Evident, acest iteato nu poate f dcefcentiat, ci poate fi folosit pentu a indica aceasta pozitie in apejui ale functiilo emplace_afte (), inset_afte (), ease_afte () sau splice_afte (). Functiile membe cae modified lista Asemanato clasei list sunt definite functiile membe push_font (), pop_font (), assign (), emplace (), emplaceif on t; (), esize (), swap () si clea (). Umatoaele funcjil sunt specifiee clasei fowad list : inset_afte ( ) iteato inset_afte(const_iteato paz, const value_type& val); iteato inset_afte (const_iteata paz, size_type T, t const value_type& val); template <class nputteato> iteato inset_afte(const_iteatol paz, nputteato pim, nputlteato ultim} iteato " ease_af t e ( ) lnset_afe(const_lteatopoz, initialize_lis<value_type>ill Punctia inset_afte () useeaza in lista cuena.vdupa elementul indicat de iteatoul paz, un element cu valoaea val (pima foma), n elemente ell valoaea val (a doua foma), copii ale elementelo din domeniul [pim, ul t.d.m) (a teia foma) sau copii ale elementelo din lista de initializae li (ultima foma). Functia euncaza ca ezulta un iteato cae indica pozijia pimuiui element insea. ieato ease_afte (canst lteato paz) i i t.e a t o e a s e afte (const_ L t.e a t.o- pol, const lteata ultim) Funcna e- a sej a.ft e - (.) elimina din lista clenicj1tul de dupa ccl indicat de iteatouj paz (pima foma), espectiv elemcmele din dolllcniul (paz, ul tim). l.! Functia eumeaza un iteato cae indica poz.itia elemcntului cae umeaza dupa ultimul element eliminat. eplec ejaf t e () template <class... Ags> iteata empj.ace_.afe(const_it_eatopaz, Ags&&.. p) i Functia emplace_afte () constuieste un clement (uilizand consuctoul coespunzato paametilo specificati dupa itcatoul poz) $i inseeaza elementul ceat dupa eel indicat de poz. Obsevatie Functiile inset_afte () $i emplace_afte () pot fi utilizate $i pentu inseaea unui element 1a incepuul listei, daca iteatoul paz indica pozitla pecedenta pimului element din lista (tteatoul etunat de functia be e_begin()). in mod simila poate fi stes din lists pimul element cu functia ease_afte (). Opeatiile specifice Clasa containe fowad_list contine functiile membe publice emove (), emove_i f ( ), sot ( ), evese ( ), unique ( ), mege () cu efect simila celo din clasa list. Functia splice () a fost inlocuita cu functia splice_afte () : apl t cej e f t e- () vciid yoid void splice_afte (const i teato poz, splice_afte (const_iteato poz, const_iteato i)i splice_afte (const_iteato poz, Obsevatie const_iteato pim, fowad_list& 1"1,); fowad_list& FL, fowa:::-d_list& 1;'L, const_ltel-alo u L Lm) Functia ap Lc.cej af t et) mum 111 containeul cuent, dupa elementul indicat de iteatoul poz, clemente din lista FL. Pima foma muta toate clementcle dill FL, a doua foma mua doa elemcntul indicat de ieatoul i, ta a teia foma mua elementele din FL aflate in domeniul [pim, ultim). in uma acestci opeatii dimensiunea listei cuente si a listei FL se modifica. Deoaece nu este necesaa pacugeea listei in ambele sensut. pentu implementaea solutiei poblemei Content am fi putu utiliza $i 0 lists simpju inantuita (Eo wa d j La e t). Desigu, a fl tebuit sa etinem pemanent poz.iia pecedenta celei in cae ealizan inseaea, ceea ce a fi condus la un cod mat putin elegant. J

82 j,,,.., DnV-,n" "A" D:: A, in LMBAJUL C/C+-j PEN'Hl) L1CEU CONTANERE SECVENTALE Clasa aay Clasa aay a fast intodusa incepand ell C si poate fi uilizaa daca includem fisieul antet aay: 1\ #include <aay> Accasta class hnplcmcneaza a succesiune de dimensiune flxa femata din ele.' mente de acelasi tip, socate tnt-o zona continua de memoie. Aceasta stuctue este foate asemanatoae eu tablouile unidimensionale din limbajul C, da dispune de 0 seie de functii membe cae fae posibila utilizaea acestoa 111 mod simila cu eelelalte containee standad. Spe deosebie de clasa vecto, memoia ajocata elementelo unui. aay este fixa, nu se aloca dinamic, Pin umae, dimensiunea unui aay nu poate f modifleets dinamic j nu este necesa sa fie stocata inten. Declaaea unui obiect de tip 'aay: aay<tip, Dim> ob; undc Tip epezinta tipul comun al elementelo, ia Dim dimensiunea flxa (nunaul de elemente). De exemplu, pentu a declaa un aay a cu 10 clemente de tip int: aay<int, 10> a; Functiile membe cae etuneazd iteatoi Clasa aay contine functiile begin (), end ( ), begin (), end (), cbegin (), cend ( ), c-beqln ( ), cend (), eu semnificana uzuala. Functiile membe efeitoae la dimensiune Singuele functii membe efeitoae la diincnsiune sunt size (), empty () i max_size {}. Punctiile size () i l.tax_size () euneaza aceeasi valoae, dimensiunea fixa specificata la declaae. Accesoi Accesul Ja elementele unui aay se ealizeaza in mod simila cu aceesul la elementele unui vecto, cu ajutoul opeatouiui de indexae [J si a functiilo membe at {}, font (), back (). Este de asemenea implementaa functia memba data () cae euneaza un pointe can-e lnceputul zonei de mcno-ie cae conunc elementele containeului. Funciile membe cae modified containeul aay Ca pentu oice containe, este supaincacaa functia memba swap () cae inteschimba in Limp linia elementele a doua containee. n plus, este definita functia memba fill () : void fill (const value_type& val) ; Atibuie tutuo elementelo din containe valoaea val. Opeatoii elationali Pentu clasa aay sunt supaincacati toti opeatcii elationali, ealizandu-sc din punct de vedee lexicogafic Execitii i pobleme popuse 1. Ce va afisa pe ecan umatoaea secventa de instuctiuni : vecto<cha> v1; vecto<cha> v2(loo); vl=v2; v L [0] ==' s ' ; a.vecto<float> vl(oo); c.vecto<float> v1; vl.esize(loo) ; '«vl.capacity()«'\n' ; cot«v1.size{)«' vl.esize(10) ; cout«v1. size () «' '«vl. capacity ()«' vn ' ; a. Nimic, deoaecc aceasta sccventa poduce b. eoae la executie (v1 este vid, pin umae 0 0 nu ne putem efei la vl! 01) ; ; c ; d compaaea 2. Cae dmte umatoaele secvente ceeaza un vecto eu 1 00 componente eate : b.vecto<float> vl; v1.eseve(loo) ; d. vecto<float> vl; vl=vecto<float> (loo) ; 3. Ce se va afisa pe ecan dupa executaea umatoaei secvente de instuctiuni, dad! de la tastatua se intoduce Mama ae mee. stiylg Sj cin»sj vecto<cha> v1(s.begin(}+1, s.end()); cout«v1. size ()«' "<cv. capacity{)«' \n ',, 1, i ". "-!, :...;

83 '')4 PROGRAMARFA in LMBAJUL C!C++ P NTRU L1CEU CONTANERE SECVENTALE 16S -l i., l i,.,. vl.inset{vl.begin()+2,s.begin{), s.end()); cout«vl. size () -cc ' '«vi. capaci t.y ()«' \n' ; vl.ease(vl.end()-l) ; c out c-cvl. size ( )«' \ <ev L. capacity () «' \n' ; fo (int i=o; i<vl.size{); i++) cout«vl[i]; 4. Pesupunand ca este necesaa 0 sucua de date secventiala cae sa pemits inse. ai i extagei de elemente doa de la inceputul sau sfasitul secventei, cae containe cpezinta cea mai eficienta implementae? Justificati aspunsul. a. vecto i b. deque; c. list; d. Nlciunul dime acestea. 5. Cae dinte umatoaele secvenje afiseaza elementele listei v? 1: list<i.nt> v a. fo b. c. tint i=o; i<v.size() cout«v[i]«' ++i) list<int>: :iteato it; fo (it=q; it<v.size{); ++it) cout«*it«' :list<int>: :iteato it; fo (it=v.b:9in(); it<v.end() ++it) 11. : c out c c e Lt;«c ' ; d. ++it} J2. ' list<int>: :iteato it; : fo (i t.=y..begin ( ) it! -a. end ( ) : c out c-c e Lt;«.c ' j 6. Ce elemente contin listele v1 i v2 dupa e;.ceutaea umatoael secveute : int i; list<int> v1; fo (i=1; i<5; ++i) vl.pusd_back(i); list<int> v2; fo (i=1; i<9; i+=2) v2.push_back(i); v L. mege (v2) ; 7. Ce elemene contin listele v1 i v2 dupa executaea umatoaei secvente : int i; list<int> v; fo (i=1; i<5; ++1) vl.push_back(i) J.is t<.int> vz. fo (i=1; i<8; ++i) v2.push_back(i) v2.evese() ; list<int>: :iteato itl=vl.begin(), it2=v2.begin{) itl++; it2++; v1.spliee(it1, v2, it2, v2.end(») i 8. Ce se va afisa pc ecan in uma executiei umatoaei secvente : deque<int> d; fo (int 1=1; i<5; ++i) d.push_back(i}; deque<int>: :iteato it=d.begin(}+2; d.ease(itl,- cout.«*it«' 9. Consideand umaoaca definitie a functiei Laf e L () bool lafel(cha el, cha e2) (sting s("aeiouaeou"),- etun s. find (el) <sting: : npos&&s. find (c2) <sting =; pos : Ce coutine lista d dupa execuaea umatoaei secveute? sting s ("Mamaia si Aida vobeau n eaosvj : list<cha> o(s.begin(), s.end())i d. unique (lafel),- 10. Pentu cae dinte umatoaele declaatli, constuctia it+l este valida? a.vecto<cha>; :iteato it; c. deque<int>::iteato it; b. list<double>= :iteato it; d. Niciuna dinte vaiautele pecedeme. Cae dinte umaoaele instuctiuni elimins pimul element din containeul deque<int> d: a. d.pop_font(); c. d. ease (d. begin () ) ; b. d.ease(d,font(») d. d.pop () ; Consideand llsta list<cha> d, utilizati functia memba unique () pcnu 3 elinina din lista spatule edundanc. 13. Considcand vcctoul vecto<int> v, scicti 0 secveua de instuctiuni cae sa elimine toate elementele pae din vecto. Real izatl aceeasi opeatic pentu lista list<int> d, int-o maniea difeita. Peutu cae dinte cele doua containee eliminaea se ealizeaza mai eficient? 14. Utilizand clasa specializata vecto<bool>, implenentati opeatiile eli multimi de numee natuale <VMAX (euniune, intesectie, difeenta, difeenta simctica). Compaati opeatiile astfel implementate ell vaianta ee utilizeaza vecto<int> i algoitmii standad de lucu cu multimi din STL. 15. Anne Vasile jcaca (din nou! ) jocul sau pefeat eu impuscatui. Pcsonajul Sal! ae 1a bau N ane, acte in N husc spectate, uumeotate de la 1 a N. Anna. din husa L ae puteea pb j (1"";i.<N).!

84 J 166 PROGRAMAREA in LMBAJUL CC++ PENTRU LCEU CONTANERE SECVENTALE 167 in camea amelo a gasit Manne, asezate pe pcetc, in M locadi. numeotate de la 11a M. Pentu flecac anna j (l:s:js:m) este cunoscuta puteea sa PCj_ Vasile poate inlocui ame pe cae e ae la bau ell anne aflate pe peete in camea amelo. La 0 inlocuie el ia ama de pe peete din locajia j (l,:::';j'::;m) i 0 pune a bau in husa i (l.:'o:i::::n), ia ama din husa i 0 pune pe peete in locatia j, Ceinta Scieti un pogam cae sa detemine sum a maxima a puteilo amelo pe cae e va avea a bau Vasile dups efecuaea nlocuiilo. Date de intae Fisieul de intae anne. in coniine pe pima linie numeeje natuale N M, epezentand numaul de ame pe cae e ae la bau, espectiv numaul de anne aflate in camea amelo. Pe a doua linie se afla N numee natuale pb i pb 2 pb N cpezcntand in odine puteile amejo pe cae Vasile e ae la bau, Pe a teia linie se afla M nunee natuale pel PC2... PCM cpezcntand in odine puteile amelo aflate in camea amelo. Numeele scise pe aceeasi linie sunt sepaate pin spatiu. Date de iesie Flsieul de iesie ame. out va contine 0 singua linie pe cae va fl scisa suma maxima a puteilo amelo de la baul lui Vasile, dupa efectuaea inlocuiilo. Restictii 1:s;. N, M s: 1000 Puteile amelo sunt nunee natuale s: Exemple ame.in anne.out Ohnjpiada Judeteana de nfonnanca, Segm Sa consideam N scgmente nchise situate pe axa OX. Pentu fiecae segment se cunose extemitaea initiala x i extcmitaea finala v. Ceinpi Sa se detemine a multime femata dint-un numa minim de puncte distincte de abscise integi situate pe axa OX, eu popietatea ca oice segment conine eel putin doua punete din multime. Dale de intae Pisieul de ntae s egm. in contine pe pima linie numaul :natua"} \J. Pe unnatoaele N inii sunt descise cele N segmeme, cate un segment pe 0 linie. Pentu fiecae segment sunt specificate doua numee natuale sepaate pin spatiu x. epezentand extemiatile segmentului. Date de iesie Pisieul de iesie e eqm. aut va contine doua linii. Pe pima linie este scis un l1uma natua] MN, epezentand nunaul minim de puncte din multimea deteminata. Pe cea de a doua linie sunt scise MN numee natuale in odine stict cescatoae, sepaate pin spatiu, epezentand abscisele punctelo din nultime. Resticjii 1 N s: 3000 o < x < y < 10 6 Daca exista mai multe solutli, aflsan oicae dinte acestea. Exemple eesm, in segm.out y.campion Campus Un si de numee se nuneste campus daca indephneste simultan conditiile : 1. a. contine D numa impa de elemente ; 2. b. elementul de la mijlocul siului ese mai mae sau egal cu toate elementele cae i1 pecede i mai mic sau egaj cu toate elementele cae succeda. D exemplu, siul (1, 6, 2, 8, 18, 28, 9) este compus. Secventa ah a;,:, a3,..., ai se numeste pefix de lungime i al siului a. Ceiua Sa se detemine lungimea celu! nai lung pefix compus al unui si de numee. Dale de intae Fisieul de intae campus. in contine pe pima linie un nuna natual N epczeutand numaul de valoi din si. Pe cea de a doua l.inie sunt scise N numee integi sepaate pin cate un spatiu. epezentand siul. Date de iesie Fisieul de icslc campus. out va contine 0 singua linie, pe cae va fi scis uu singu nuua natual epezentand lungimea maxima a unui pefix compus, u :...J -' u...j...j

85 168 PRQGRAMARFA CN LMBAJUL CC++ PENTRU LCEU Restictii l.; a Exemplu N, ai':::;; lo",pentuoicel:si::;;n campus. in Secvop 7 campus. out. Explicatii Exista doua pcfixe compusc : ( ). (1) i.campion 2008 Fie N un Hilma natual i A un vecto. nitial A [i ] =i, pentu o-ice i = L 2, "', N. Asupa acestui vecto se pot aplica opeatii de doua tipui : Opeatic St D S EJeCT e inveseaza subsecvema din vecto cae incepe ia pozitia St i sc cmina a pozftia D (lsstsdsn). De exemplu, pcntu N=10, aplicand opeajia 2 7 obtinem vectou! ' s St D Sc afiseaza suma elementelo din subsecventa cae ncepe pe pozijia St i se temina pe pozijia D (l':<:;stdsn). De exemplu, pentu N=10, aplicand S 2 7 sc aflseaza coxanerf SECVENTALE Exemplu secvop.in secvop.out S S 5 10 Explicafie Vectoul initial : s 2 11 afiea:lli suma clcmentelo de la pozit ia 2 la poznia \ 11: = invescaz1i elemcmele din subsccvent a de la pozit ia 10 la pozitia 15. Se obtine vectoul : inveseaza elementele din subsccvcnt a de la pozit ia 1 la pozitia 1.O. Se obtine vectoul : ' S afieaza suma elemcme10 de la poziia 5 la pozi!ia 10 nclusiv : =21.campion Chei Vasile l,i pasteaza economiile in N pucelu,i-pu,culila de ceam1c a neaga. pucelush sunt numeotali de la 1 }a N. Fiecae pucelus ae un capac cae poate fi deschis cu cheia coespunziitoae. n pucelui Vasile a pus bani, da 5 i chelle de la pucelu'ii. Desigu, Vasile line minte in cae pucelusi a pus cheile. Fiindca vea sa-si cumpee 0 masina noua, Vasile ae nevoie de toti banii din pucelu,i. Pentu a obline banii dint-un pucelus el poate spage pucelu,u] sau poate deschide capacul ell cheia (daca 0 ae). Ceinla Cunos cfmd distibulia cheilo in pucelusi, sa se detemine nnl11anl minim de pucelusi pe cae tebuie sa ii spaga Vasile astfe1 incat sa poata obtine toti banii.,..., Ceinpi Scieti un pogam cae sa execute 0 Date de intae Restic!ii 1 :; K : a < N S 10 9 in ti ieul de intae se atla eel putin 0 secvenja data de opeaii. Fisieul de intae s ecvop _in contine pe pima linie doua nunee natuale sepaate pin spatiu N i K (unde Neste dimensiunea vectoului, ia K este numaul de opeatii ce tebuie sa fie executate). Pe unatoaele K linii sunt scise K opeatii, cae 0 opeatic pe 0 linie.. Aceste opeatii sunt scise in -odlnea hi cae tebuic sa fie executate. 0 opeatie este descisa pim-un caacte ( sau s) umat de spaiu, apoi de indicele St, apoi de spatiu, 'apoi de indicele p (lsstsdsn). Dae de ie'ie Fi ieul de ie ie secvop. out va contine atatea linii Cate opeatii de tipul 2 (opeaii de sciee) se afla in fi ieul de intae. Pc linia i va fi scis ezultatul afi at de eea de-a i-a opeatie de sciee din fi ieuj de intae. opea!ie de sciee. Date de intae Fi'iieul de intae chei. in contine pe pima linie un numa natual N, epezentand nwn aul de pucelu,i. Pe fiecae dinte mmatoaele N linii este scis cae un numa natual cnpins mte 1.,i N; numaul de pe linia i + 1 epezinta nnmaul pucelusulv' in cae este plasata chela de la pucelusul i. Dale de ieie Fi ieul de iesi'e chei. cut va contine singu nuna namal epezentand nunaul spa i pentu a obline toti banii. Resticfie 1 :::;N s:; Exemple chei..:i..n i4 o 'singua linie pe cae minim de pucelusi ce va f scis un ebuie sa' fie chei..out E'( fica ;e 2 Cheile de la pucelu:;;ii 1 :;;i 3 sc afla in pucejuul 2. Chcia-de la puceluljul 2 sc afla in pucclulju] 1. Cheia de 1a puceluuj 4 se afla in pucelm;,;ul 4. Numaul minim de pucelui ce tcbuie sil fie spaqt cslc 2 (spagem pucclu;ul 2 $i puceluul 4). 4 Numa-Tul minim de pucelu:;;i ce tcbuie sa fie span i estc 4..calnpion 2010

86 6. Clasele adapto Clasele adapto pentu containee sunt definite pe baza unci alte clase containe, asiguand 0 functionalitate estansa pentu aceasta. Exista tei clase adapto pedefinite in STL, bazate pe containee secventiale : queue (coada), stack (stiva), i pioity_queue (coada ell pioitate) Clasa adapto queue (coada) Clasa adapto queue este definite pentu a ealiza opeatiile specifice unci stuctui de date de tip FFO (Fist n Fist Out). nt-o astfel de stuctua denumita coada - elementele sunt inseate a un capat al acesteia (sfasitul cozii) i. extase de la celalalt capat (inceputul cozii). Pentu a utiliza aceasta class tebuie sa includem fisieul antet queue: #include <queue> Declaatia clasei adapto queue: template <class T, class Containe=deque<T> > class queue; Obsevati ca aceasta clasa sablon ae doi paamem : - T - epezlnta tipul elementelo containeului ; _ Containe - epezinta clasa containe cae este utilizata pentu memoaea elementelo : implicit aceasta este clasa deoue. Constuctoii si destuctoul Pentu clasa adapto queue sunt definiti constuctoul implicit, constuctoul de copiee i destuctoul, cae distuge obiectul, elibeand memoia alocata dinamic. Exemple queue<int> Ci CLASELE ADAPTOR 171 Ceeaza a coada denumita C cu 0 elemente de tip int. Containeul utilizat pentu stocaea elementelo cozii este eel, implicit, adica deque. queue<pai<int, int> > cp; Ceeazf 0 coada denumita Cp eli 0 elemente de tip pai<int, int>. Containeul util izat pentu stocaea elementelo cozii este eel implicit. queue<sting, list<sting> > Csi; Ceeaza 0 coada denumita Csi eli 0 clemente de tip sting. Containeul utilizat pentu stocaea elementelo cozii este list<sting>. sting si = "gigel" i deque<cha> dlsi.begin(), si.end{)); queue<cha> Cc{dcoada); Am ceat 0 coada denumita CC cu elemente de tip cha, pe cae am initializat-o ell continutul containeului deque d. nitializaea a fost posibila deoaece a fost utilizat constuctoul de copiee al clasei d eque, cae este clasa containe supot, in acest caz. Functiile membe efeitoae la dimensiunea containeului Sum definite functiile uzuale size ()!}i empty (). Functia size () ctuncaza numaul de elemente din coada, ia functia empty () etuneaza valoaea logica tue in cazul in cae coada este vida. Accesoi Pentu a coada este pemis accesul doa la pimul!}i la ultimul element din coada functiile membe fan t () si back () ctumcaza 0 efeinta la pimul, espectiv la ultimul clement 'al cozii: Functiile membe cae modified containeul Avand in vedee faptul ca -accasta clasa implementcaza stuctua de date de tip FFO, sunt definite doa doua functii membe cae modifies containeul : push () void push (canst value_type& val) i nseeaza un element cu valoaea valla sfasiul cozii. pop() void pop (.) Elimina si distugc pimul element din coada. -' '-, : '-'

87 ! i,, -: - - : PROGRAMAREA N LMBAJUL CtC ++ PENTRU LlCEU CLASELE ADAPTOR [ncepand cu C este definita si funcna membu emplace () cae COostuieste si inseeaza un element la sfasitul cozii, pecum i functia memba swap () cae inteschimba coada cuenta ell cea specificata ca paametu. Opeatoii elationali Resticjle intotdeauna exists 0 succesiune de mutai cae duce a configuatia flnala. magic.in magic.out Expliccuii A D Pcntu clasa queue sunt supaincacati ot! opeatoii elationali, eompaaea " 8 ==> ==> 5 2 " 8 ealizandu-se din punet de vedee exicogafic Obsevatii (.campion 2007) 1. Toate opeatiile asupa eontaineului se executa timp constant. 2. ncepand ell C++ 11 este definita i functia independents swap () cae schinba inte ele continuul celo doua containee queue indicate ca paameti. Aplicatia 1. Magic Jocul Tabla Magid. este compus din opt piese patatc. numcotate cu valoile de 1a 1 la 8, dispusc pe deus linii, 'simila unui tablou bidimensional cu 2 linii si 4 eoloane. 0 configuatie posibila este eea din figua unnacae : t±b±h--u 6 3 2J2J "Sunt posibile nodificai ale configuatiei pin utilizaca umatoaelo muta-i : Mutaea A: Paatele depe pozitiile T[l] ll T[11 121, '[2] [ll. T" 2 J [2 J se otesc in sensul acelo de eeasonic. Mutaca B: Patatele de pe pozitiile T[l] [2]. Til] [3J. T12] [2]. T [2) [3 J se otesc in sensul acelo de ceasonic. Mutaea C: Patatelc de pe pozitiile T [1 J [3 J. T [1) [4 J. T [2 J [3 J T [2] [4] se otesc ill sensul acelo de ceasonic." Mutaea D: Patatele de pe pozitiile T [1] [1] -5i T [2] [1] se ineschimba. Ceinpi Scieti un pogam cae sa detemine numiiul minim de mutai necesae pentu a ajunge de la 0 configuatie initiala a 0 configuatie finala. Date de intae Fisieul de intae magic. in contine pe pimele doua linii cate 4 valoi epezentand configuatia initiala, ia pe umatoaele doua linii cate 4 valo! epezentand configuatia: finala. Date de iesie Fisieul magic. out va contine 0 singu' liniepe cae se va seie nu111aul minim de mutai necesae pentu a tansfoma contigun1lia iniliala in configuaia finahl Exemplu Solutie Yom util iza 0 coada pentu a etine toate configuatiile posibile cae se pot obtine ponind de la configuatia initiala. La inceput, coada va contine doa configuatia initiala. Agoitmu de geneae consta in aplicaea umatoilo pasi : _ Extagem din coada configuatia cuenta ; Pentu fiecae dinte cele 4 mutai posibilc geneam noua configuatie. Daca aceasta noua configuatie nu a fost geneata anteio, atunci 0 inseam in coada, macam faptul ca am intodus-o in coada i etinem totodata inca 0 configuatic pacusa in plus, adica numaul de mutai necesae pentu obtineea acestei noi configuatii. Algoitmul se opeste atunci cand extagcm din coada conflguatia final a, acest lucu fiind intotdeauna posibil. Pentu a veifica daca 0 configuatie este deja n co ada C, am definit functia pe.mjo d (), cae asociaza oicaei configuatii un numjl natual unic. Ne bazam pc faptul ca oice configuatie este de fapt 0 penutae a nultimii -[ 1., 2, 3, 4 J 5, 6, 7, 8}, numaul total al configuatiilo posibile fiind 8! (40320). Functia pem_od () asoclaza unei pemutan numaul de odue al acestcia dadi am genea pemutanlc multimii {l, 2 J 3,4,5,6 J 7, 8} n odine lexicogafica.. Pentu a etine multimea configuatiilo dejageneate utilizam un vecco-ebooi > viz (viz [x] =tue cand configuana cu numaul de odine x a fast deja geneata). Pogamul complet aata astfel : #include <cstdio> #include <queue> #include <algoithm> #include <vecto> #define Nmax 10 #define nfile "magic. in" #define OutFile "magic.out" using namespace std.i stuct Element { int conf, ni } st, fin; 173

88 174 PROGRAMAREA in UMBAJUL C/C++ PENTRU LCEU queue <Element> Qj vecto <boel> viz(50000, false); int ST[Nmax], FN [Nmax], f[nmax]; void pem_od (int pj, int &n) { :tnt i, ], pw[nmax]; n =: 0; fo (i :::: 0; i < Nmax; i++) pw[ij :::: 0; fo (i :::: 1; i <= 8; i++) {n += (p[i] - pwz-lp l i Ll - * f(8-i]; fo (j ::: p [i J + 1; j <= 8 i j ++) pw [j] ++; void od_"pem (int o-d, int p [] ) { int i, ], a, ny, pw[nnax], v[nnax]; fo (i :::: OJ i < Nnax; i++) pw[i]=v[i]=o; fo (i :::: 1; i <= 8; i++) { a=od/f [8-iJ; n=o; fo (j ::: 0; j < 8; j ++) if (!v[jj) {if (n == a) ( p[i]=j+l, v[j]=l; beak; ) n++; } od -= (p i] -pw [p i] J -ll *f [8-i]; fo (j=p[i]+l; j<=8; j++) pw[j)++; void copy (int A[], int B[J) { fo (int i = 1; i <= 8; i++) A(iJ=B[i]; :tnt calcu ( ) {Element X, y; int t, X[Nmax], Y[Nmax]; Q.push(stli viz[st.conf] :::: tue; while c : Q. empty ( ) ) {x = Q.font() iq.pop();/extag configuatia cuenta if (x.conf == fin.conf) etun X.Di /am gasit else {od-pem (x.cont, X); y.n = X.D + 1; lmiscae tip A copy {Y. X) i t=y[2j; Y[2J=Y[lJ,Y[1]=Y[5], Y[5]=Y[6J; pemod (Y, y.conf); if.('!vj.zly.conf]) { Q.push (y); viz[y.confj = tue; lmiscae tip B Y[6]=t; CLASELE ADAPTOR copy (Y, X); t=y[3j; Y[3]=Y[2J,Y[2]=Y[6],Y[6JoY[7J; Y[71"t; pem_od {Y, y.confl; if (!viz[y.conf]) { Q.push (y); viz[y.conf] = tue; } /miscae tip C copy (Y, X; t=y[4]; Y(4J=Y[3J,Y(3]=Y[7j,Y[7J=Y[8]; Y[8J=t; pemod(y, y.conf); if (!viz [y. conf]) { Q.push (y); viz[y.conf] = tuei } //miscae tip D copy (Y, X) i swap (Y[l], Y[5]), pem_od (Y, y.confl i etun 0; if (!viz [y. conf] 1 { Q.push (y); viz[y.conf] int main () {int i; feopen (nfile, "", st:din) i feopen (OutFile, "W ", s t.dout j fo (f[oj=i=li i<nmaxi ++i) f[ij=f[i-1j*i; fo (i=l; i<=8; ++il scanf.('.'%d", &ST[i] ),; fo (i=l; i<=8i ++i) scanf ("%d", &FN[i] l; pem_od(st, st.conf); pem_od(fn, fin.conf}; pintf ("%d\n", cat cu t l. etun 0; Aplicatia 2. Alee tue; } Pacul oasului a fast neglijat mult timp, astfel ca acum toate aleile sunt distuse, Pin umae, anul acesta Pimaia si-a popus sa faca eamenajai. pacul ae foma unui patat cu 1atua de n meti i este inconjuat de un gad cae ae exact doua potio Poiectantii de la Pinaie au ealizat 0 hata a pacului i au tasat pe hata un eaoiaj eae impate paeul in nxn zone patate eu 1aua de 1 metu. Astfel hata pacului ae aspectul unei man-ice patatice eu n linii si n eojoane. Liniile st espectiv coloanele sunt numeotate de la 1 1a n. Elementele maticei coespund zonelo patate de latua 1 metu. a astfel de zona poatc sa contina un copac sau este libea. Edilii oasului doesc s _pavez,e ell un numa minim de dale patate cu latua de 1 metu zoneje libee (taa copaci) ale pacului, astfel incat sa se obdna 0 alee continua de la 0 poata la alta. 17S w w

89 176 PROGRAMAREA in L1MBAJUL etc ++ PENTRU LCEU CLASELE ADAPTOR 177!,, c- l ; -' Ceinpi Scieti un pogam cae sa detemine numaul mnun de dale necesae penu consuica unci alei continue de la 0 poata la ccalalta. Date de intae Fisieul de intae alee. in contine pe pima linie doua valoi natuale n $i m, sepaate pint-un spatiu, epezentand dimensiunea pacului, espectiv numaul de copaci cae se gasesc in pae. Fiecae dinte umatoaele m linii contine die doua numee natuale x $1 y, sepaate pint-un spatiu, epezentand pozitiile copacilo in pae (x epezinta linia, ia y epeznta coloana zonei in cae se afla copacul). Ultima linie a fisieului contine patu numee natuale xl yl x2 y2, sepaate pin cae un spatiu, epezentand pozitiile celo doua poti (xl si y1 epezinta linia l;i espectiv coloana zonei ce contine pima poata, ia x2 si y2 epez.inta linia i espectiv eoloana zonei ce contine cea de-a doua poata). Date de iesie Fisieul de iesie alee _out va contine a singua linie pe cae va fi scis un numa natual cae epezinta numaul minim de dale necesae pentu constuiea aleii. Restiqii 1 n :::;: :<; m < n *n Aleea este continua daca oicae doua placi consecutive au a laua comuna. Aleea tncepe ell zona unde se gaseste pima poata si se temina cu zona unde se gaseste cea de-a doua poata. Poz.itiile poti1o sunt distincte si coespund uno zone ibee. Pentu dateje de test exists intotdeauna solutie. Exemplu alee.in alee.out Exptlcuii o modalitate de a constui aleca cu nuna minim de dale cste : DO x- --,, OOx xo DO x - xod (cu X am maca copacii, cu - zoncle ibce. ia cu 0 dalelc aleii). (Olimpiada Jucctcana.dc nfomatica, asi, 2007) Soliqie Este 0 poblema "clasidi" a caei ezolvae se bazeaza pc algoitmul lui Lce'. Vom utiliza 0 matice A in cae initial vou etine valoaea 0 penu zonele bbce, espectiv valoaea - i pentu zonele in cae se afla un copac. Ulteio, pe masua ce exploam maticea in scopul decminant unci alei de lungime minima vom etine in matice pentu pozitiile exploate un nunta natual cae cpczinta distanta minima de la pozitia pimei poti la pcz.itia cspcciva (expimata ill numaul de dale necesae pentu constuiea aleii). Pozitiile din matice cae au fast exploate e vom etine int-o coada, 'ill odinea exploaii lo. Deoaece idemificaea unei poz.itii se face pin doue coodonate (inie, coloana), un element al cozii va fi fomat dint-o peeche, deci coada este definita :. queue<pai<int, int> > Ci Vom pacuge maticea incepand eli pozttia pime! poti. a[ixj [iy] = 1; //pima dala C.push (make_pai (ix, iy)) ;/plasez in coada La fiecae pas vom extage din coada 0 pozitie 'pai -c i.n, int> XXi xx = C.font(); /detemin pimul element din coada C.pOP(}i /elimin pimul element din coada Vom exploa toti cei patu vecini libei neexploati ai pozitiei extase i ii yom intoduce in coada. Cand exploam un vecin, etinem 'in maticca A pe pozitia sa distants minima calculata pin adaugaca a distanta cuena a valoii 1. Pocedeul se epeta cat timp coada nu este vida si poz.itia in cae se afla cea de-a doua poata nu a fast exploaa. Rezultatul se va obine n maticca A, pc pozlna celei de a doua potio Pogamulcomplet aaa astfel : #include <cstdio> #include <queue> using nanespace std; const int dx[5] {O, -1, 0, const int dy[5] = {O, 0, 1, queue<pai<int, int> > C; Lzt;' a[178] [178]; int ix, iy, ox, oy, x, Yi int n t W; 1, 0); O. -1); J. Pentu apofundaca algoitmului lui Lee puteti utlliza sofwac-ul educational.atgoinnut tui Lee", pezcntat pc Ahiva cducalionaui.campion' Omp: lcampion.cdli;o/ahiva/l."o pczcman: dctaliata a stuctuilo stiva i coada eu aplica\ii PUlci consulta in capilolul 5 din volumul al lucilii Pogamaea in limbajul C/C+ -+ pcntu liceu.

90 178 PROGRAMAREA in UMBAJUL C/C++ PENTRU LlCEU CLASELE ADAPTOR 179 int main () {:i.nt k, i, j; pai<int, int> xx, YYi FLE *f :::: fopen("alee.in", ""); FLE *g :::: fopen (" alee. out" "w"); fscanf (, "%d%d", &n, &m); fo (k :::: 1; k <= m; k++l ( fscanf(f, "%d%d", &i, &j); ali] [jj = -1; fscant Lf, "%d%d%d%d" J &ix, &iy, &ox, &oy); f c Los e f ) ; fo (i :::: 1; i <= n; i++) /bodae ali] [O)=a[i) ne t j e a l O'l [ij=a[n+1) [ij=-l; a[ix] [iy] :::: 1; lpima dala C.push{nake-pai(ix, iy)); //pun in coada while (!C.empty()&& a[oxj [oy]==o) (xx=c.font{l; C.pop(); fo (k :::: 1; k <= 4; k++l {yy.fist :::: xx.fist + dx[kj; yy.second :::: xx.second + dy[k]; if (a[yy.fist] [yy.secondj==o) Aplicatia 3. Algoitmul Bellman-Fod optimizat Algoitmul Bellman-Fod" detenina dumuile de cost minim de la un vaf din gaf 1a fiecae dinte cejelalte vafui, identificand eventualele cicuite de cost negativ. in foma lui "standad", complexitatea algoitmului Bellman-Fod este On'), unde ell n am notat numaul de vafui din gaf. mplementaea algoitmului Bellman-Fod poate fi optimizata utilizand 0 coada. Repezentaea infomatiilo /extag element din coada lie libe (a [yy. fist] [:yy. second] :::: a[xx.fist) [xx. second] + 1; C.push(make-pai(yy.fist, yy.second»); } ) ) fpintf(g, "%d\n", a[ox] [oy]); fclose (g) j etun 0; //scie ezultat Vom epezenta gaful pin liste de adiacenta eli costui. Mai exact pentu fiecae vaf x din gaf etinem acele ell extemitatea initiala x tn-un vecto de peechi de numee integi (pai<int, int»; pimul numa din peeche (fist) epezinta extemitatea finale a acului, ia al doilea numa din pecche (second) epezmta costu.acul:ui espectiv, 2. 0 pczeutae dealiata a algoitmului Bellman-Fod poate fi consuhata in capitolul 1 din vojumul al -lea al lucati Pogamaea in limbajul C/C+ + pentu liceu. vecto < pai<int, int> > G [NMAX] i Costuile dunuilo mininele vom ctine in vectoul dmin (dnin [x] dumujui minim de la vaful xo a vaful x; daca nu exista dum de a dmin'lx] ==NF, unde NF este 0 consanta suficient de mae).! int du.n [NMAXJ ; costu xo la x, Yom utiliza 0 coada C, in cae insean vafuile gafului, pe masua ce calculam costuile dumuijo minime. queue<int> C; Pentu a detecta daca exista cicuite de cost negativ, tebuie sa contoizam de cae oi a fast intodus in coada fiecae vaf. Pentu aceasta vom utiliza un vecto n,. n [x J epezentand de cae o! a fast intodus in coada vaful x. Daca n [x J»i deducem ca am identificat un cicuit de cost negativ (vaiabija Jogica n ecet t.v etine acest lucu).! int n [NMAX] ; nitial: &nin[x]=nf, pentu oice x * xo si diin[xo]=0 l)l inseam in coada C vaful de stat xo. Cat timp in coada C mai exista vafut si nu am identificat un cicuit de cost negativ : - extagem un vaf x din C ; pacugem lista de adiacenta a lui x si incecam sa optimizam costuile dumullo vafuilo y cae sunt extemitati finale ale acelo cae pleaca din x. Vafuile y pentu cae costul dumului de Ja xo la y a fost optimizat sunt intoduse in coada ($i contoizam acest lucu in n [y] ). #include <cstdio> #include <vecto> #include <queue> #define NF #define NMAX using namespace std; int n, xo; vecto < pai<int,int> > G[NMAX]; int dnin [NMAX] j.. int n [NMAX] ; bool negativi queue<int> Ci void citie() i void bellman_fod(); void afisae(); int main ().{ citie() bellman_fod ( ) ; afisae{); -J., '1

91 180 PROGRAMAREA in LlMBAJUL CC++ PENTRU LCEU CLASELE ADAPTOR 181! i ' -' ' --«: 1.,, : etun 0 i void citie ( ) {int it o, X, y, c; FLE * fin=fopen("bellmanfod.in", "O); fscanf (fin, "%d %d 'sd" &n, &n, &xo) i fo (i=o; i<m; i++j { fscanf(fin, "%d %d %d", &x, &y, &c); G[x].push_back(make-pai(y,c)) i } void bellman_fod() {vecto< pai<int,int> > : :iteato it; int.i, x; fo (i=l; i<=n; ++i) dmin[ij=nf; dmin[xoj=o; C, push (xo ) ; while (lc.empty()&&!negativ) {x=c.font(); C.pop(); fo (it::: G[x].begin(); it!= G[x].end(); ++it) if (dmin[it->fist] > dmin[xj+it->second) { dmin[it->fist]=dmin[x]+it->second; n[ it->fist ]++; C.push{it->fist); if (n[it->fist»n) negativ=tue; void afisae ( ) {FLE * fout=fopen("bellmanfod.out", "w"); if (negativ) fpintf(fout,"cicuit de co st negativ!\n"); else { fo (int i=l; i<=n; i++) if (i!=xo) fpintf(fout,"%d ", dmin[i]!=nf?d.nin[i] :0); fpintf (fout, "\n"); ) fclose{fout) ; ) Obsevatii Daca doim sa econstmnm dumuje, este necesa ca pentu fiecae vaf y sa ejinen pec [y] = vaful cae il peceda pc y pe dumuj minim de a xo la y ; (vaful xo nu ae pecedent, deci p -ec.[xo] :::: 0).. Cand costul dumului minim de la xo la un vaf y se schimba, emiem in pec [y] vj:fuj x cae epez.intii extcmitatea initialf a acului cae a detemiuat optimizaea. 2. Complexitatea teoeica a algoitmului Bellman-Fod este de O(n-m), insa in pactice se compota mult -mai bine, devenind compaabil cu algoitmul lui Dijksta Clasa adapto stack (stiva) Clasa adapto stack este definita pentu a ealiza opeatiile speciflce unei stuctui de date de tip LFO (Last n Fist Out). int-o astfel de stucua denumita stiva - elementele sunt inseate i extase la un singu capat. denunit vaful stivei. Pentu a utiliza aceasta clasa tebuie sa includem fisieul antet s t ack'. #include <stack> Declaatia clasei adapto stack: template <class T, class Containedeque<T> > class stacki Obsevati ca aceasta clasa sablon ae doi paaneti : - T - epezinta tipul elementelo containeului ; - Containe - epezinta clasa containe cae este utilizata pentu memoaea elementelo; implicit aceasta este c1asa deque. Constuctoii si destuctoul Pentu c1asa adapto stack sunt definiti constuctoul implicit, constuctoul de copiee, pecum si destuctcul cae dlstuge obiectul, elibeand memoia alocata. [ Exemple stack<int> S; Ceeaza 0 stiva denumita S ell a clemente de tip into stack<pai<int, int> > sp; Ceeaza 0 stiva denumita Sp ell 0 elemente de tip pai<int, list<int> L{50, 0); stack<int, list<int> > SL(lista); Ceeaza 0 lista L ell 50 de elemente avand valoaea 0, apoi ceeaza 0 stiva SL ell 50 de clemente de tip int, copiind elementele din lista ceaa. Opeajia de initializae a stivei ell elementele din lista a fast posibila deoaece clasa containe supot pentu stiva SL este list. '..' int>.

92 182 Accesoi Singuul element dint-o stiva la cae avem acces este eel din vaful stivcl Functia memba top () euncaza 0 cfeing cate elementuj din vaful stivei, Opeatoii elationali AplicaJia 4. Reaqii PROGRAMAREA N LMBAJUL C/C++ PENTRU LCEU Functiile membe efeitoae la dimensiunen containeului Sunt disponibiie functia size (), cae euneazs numaul de clemente din stiva :i funcjia empty ( ), cae euneaza valoaea tue in cazul in Cae stiva este vida. Functiile membe cae modified containeul jnt-o stiva sunt pemise doua opeani : inseaca unui element Ja vaful stivei l"void push (canst value_type& val); nseeaza un element ell valoaea valla vaful stivei cuente. extageea ejementului din vaful stivei void pop ( ) ; Elimina i distuge elementul din vaful stivei. Aces! element este ultimul cae a fost inseat in stiva. Ca j in cazul adaptoului queue, incepand cu C sunt definite functia memba emplace ( ), cae ceeaza si inseeaza un element la vaful stivei, i functia memba swap ( ), cae inteschinba stiva cuenta cu stiva specificata ca paametu.. Pentu clasa stack sunt supaincacai Toi 'opeaoii elationali, - compaaea ea1izandu-se din punct de vedee lexicogafic. lncepand cu C este definita ] funcua indepcndenta swap () cae schimba tnte ele continuul eel o doua eontainee stack indicate ca paamcti. Acestea tebuie sa fie de acelasi tip, chia daca dimensiunea lo difea. Sa consideam 0 secventa de n substane chimice S==S1, 52,..., Sn. SubstanteJe Sunt numeotate distinct de 1a 1 1a n i fiecae substana apae in secvel1a 5 0 singua datil. Sa consideam 0 subsecvena Sij==Sj8i+...Sj i sa nota111 cu minij $i maxij cel mai mic, espectiv cel mai mae numa din subsecventa. Subsecvenla espectiva constituie un i.nteva dadl en contine toate nulnele natuale cupinse lnte minij.;;i maxij -- CLASELE ADAPTOR Cu substanteje din secventa s se vo efecua difeite expeimente. in timpul unui xpeiment pot eacjiona doua substante alauatc s, si Si+l doa daca numeele lo e odine sunt consecutive. in uma eactiei se obtine 0 noua substana. femata din, ubstane[e cae au eactionat, notata (Si, Si+l). Mai mult, substantele cbtinute pot eacpona daca ele sunt alauate, ia pin euniea subsecventelo de subsante ce e ( ompun se objtne un inteval. Expeimentul este declaat eusit daca in final, unand egulile de mai sus, se obtine 0 singua substanta femata din toae cele n substante ( n secventa s, aceasta fiind declaata stabila. De exemplu, pentu n==6 substante i secventa 8=6,3,2,1,.4,5 se poate poceda stfel :, 1Eapa Configuapa initiala Acjiune Reactioncaza substanta 2 ell substanta 1 Reactioneaza substanta 4 ell substama 5 Reactioneaza substanja 3 ell substanta (2,1) Reactioneaza substanja (3,2,1) ell substanja (4,5) Reactioneaza substanta 6 cu substanta (3,2,1,4, 5) Configuauc , (2,1) (4,5) 6 13, (3,2,1,4,5) (6,3,2,1,4,5) Nu din oice secventa de substante se poate obtine in uma eactiilo a substanta nalii stabila. Ceiua Scieti un pogam cae sa detemine pentu 0 secventa data de substante daca in na eactiilo ce se podue confom egulilo din enun; ezulta 0 substanta stabila, Date de intae Fisfeul de intae eactii. in contine pe pima linie numaul natual n, numaul de substante. Pe cea de-a doua linie se afla un numa natual m, epezentand umaul de secvente de cae n -substauje din fisieul de intae. Ptccae dinte matoaele m linii contine cae n numce naun-ale-distincte: sepaate p'in cae un patiu, cpczentand 0 secventa de n substante. 1 1, j Date de iesie, Fisieul de iesie eactii. out contine, pentu fiecae secventa de substente din sieul de intae, cae 0 linie, pe cae este afisata valoaea 1, daca pentu secventa espectiva se poate obtine 0 substanta stabila, sau valoaea 0, in caz conta. RestiCJii 2 ::; n ::; '::; m :s; 20.. La un moment dat pot eactiona doa doua substanle, i,..j! i L..J 1..J

93 n!,,,, - n 184 Exemplu eactii.in eactii.out PROGRAMAREA in LMBVUL C/C-t--t- PENTRU LCEU 6 1 stabila 4 0 nestabila stabila 4 1 stabila Explicatii (Olimpiada Nationala de nfomatica, Galaji, 2009) Solutie Se utillzeaza 0 slva S, ale caci clemente sunt subsecvente P, p+l,... p+k ale multinii {l, 2,...,n}. De fapt, un element al stivei va avea doa doua componente. elementul minim i espectiv elementul maxim din subsecvenja. n geneal, pentu a adauga 0 substanta s la stiva S, se veifica daca substanta din vaful stivei s fomeaza 0 noua substanta inpeuna ell s, eli alte cuvinte daca euniunea celo doua setui de valo! este 0 substanta (confom egulii). n caz afimativ, se extage substanta din vaful stivei S, se fomeaza noua substanta, apoi se epeta pasii anteioi (veificae, extagec, fomae substanta noua). Daca euniunca a doua setui de valoi (substante) nu fomeaza 0 noua substanta, aunci ultima substanta nou-obtinuta se pune in vaful stivei s. Astfel, setul de substante este pacus 0 singua data; se considea initial fiecae element ca fiind 0 subsana sepaaa i se adauga fiecae dinte aceste substante la S, in modul descis mai sus. Daca, -la teminaea'- pac-ugeii -seului de valoi, stiva -5 contine un singu element (0 singua substanta), adieu valoile 1 i n, substanta flnala este stabile. Pogamul complet aaa astfej : _ #include < steam> #include <stack> using namespace std; stuct SUBST isubstanta '-e t a.nu c a pin minim si maxim { int minim, maxim; }; stack<subst> S; FLE *f. *g; int n, m, x, Substanta; SUBST SVaf, SNoua; bool OK (SUBS']' R, SUEST Rx) _ /veifica daca se pot combina { etun! (R.maxi.m-eL! :::Rx_miim&&Rx. ma.x.i.m-s L! :::R'. minim) CLASELE ADAPTOH 185 oid Reuniune(SUBST R, SUBST &Rx)llcombina cele 2 substante Rx.minim == min (Rx.minim, R.minim); Rx.maxim == max(rx.maxim, R.maxim); int main () f::: fopen("eactii.in", "")j 9 ::: fopen ( eactii. out", "w"); fscanf (f, "%d%d", &n, &m); fo (; n; --m) /ia pe and fiecae configuatie {while{!s.empty(») S.POP(}i GolesteStiva fo (Substanta=lj Substanta<==nj ++Substanta) { fscanf(f, "%d", &x); SNoua.minim::: x; SNoua.maxim == x;11 etin if (!S. empty (» daca am e Lenen t e in stiva ( SVaf:S.top(); while (OK(SVaf, SNoua)) /daca DA ( S.pop(); Reuniune(SVaf, SNoua) if (! S. empty ( ) ) Svaf ::: S.top(}; else beak; ) S. push (SNoua) ; else /este pima substanta S.push(SNoua); 110 pun diect in stiva J fpintf(g,"%d\n",s.size()====1?1:0); } fclose(f}; fclose(g); etun 0; Aplicatia 5, Ceiati } Tealand este un egat cae se extindc pemanent. Fontiea egatului este un poligon convex, in vafunle cauia sunt constuite cetai pentu apaaea segmenelo de fontiea adiacente. La fiecae extindee a egatujui fontiea se modifica : se constuiesc cetap not, ia unele cetati. constuite anteio ii pied olul de puncte de apaae. in toate cetatile se afla ganizoanc. Pentu a micsoa cheltuielile pentu intetineea amatei, MegaBit, egele Tealandului, a decis sa demobilizeze ganizoanele din cetatile cae nu mai au olul de puncte de apaae (nu se mai afla pe fontiea egaului). ---

94 , i-j 186 PROGRAMAREA N LMBAJUL C/C ++ PENTRll LCEU Ceinpi Scieti un pogam, cae va detemine din cae cetati vo fi demobilizate ganizoanele. Date de intae Pima linie a fisleului de intae cetati. in conune Ull numa integ N numaul de cetati din Tealand. Uneaza N linii cc contin cate doua numee integi Xi ys, sepaate pin spatiu - coodonatele cetatilo. Dale de iesie Fisieul de iesle cetati. out va contine 0 singua linie pe cae va fi afisat numaul de cetati din cae pot fi demobilizate ganizoanele. Restictii 3 S; N S; _10 9 ::; xi, Yi S; 10 9 Exemplu cetati.in cetati.out Exptiouie Soliqie o. (vcampion 2009) PuncteJe cae au ol de apaae sunt vafuile infasuatoii convexe. Pentu a detennina infasuatoaca convexa vom utiliza algoitmul lui Gaham', Pogamul conplet aas astfel : #include <estdio> #inelude <algoitun> #inelude <stack> #inelude <vecto> #define Nmax using namespace std; 3. 0 pezemac detaliata a algoitmului lui Gaham poate f consultaa in capitolul 6 din volumul al ll-lea al ucaii Pogamaea in fimbajuf CC+ + pouu liceu. ; stuct pudet { double x y, tg;} aux; int T, i, paz, p, p, p2; double xmin, ymin; veeta<punct> v (Nmax) ; stack<int> ; int aie (double x3, double y3) { double aia etun (aia >= CLASELE ADAPTOR 187 xl, double yl, double x2, double y2, double (x3-xl) * (y2-yl) - (x2-xll * (y3-yl); 0); ) int cmp(punet a, punet b) { etun a.tg < b.tg; } int main (l { FLE * f ::: f open {vce t a t L, in", "") i FLE * 9 = fopen("eetati.out", "w") i fseanf (f, "%d", &n); fscanf(f, ''%f %f'', s-v l t l.cc, &v[l].yl; poz ::: 1; xnin ::: v[l].xi ymin = v[l] Yi fo (i ::: 2; i <= ni i++) { fscanf Lf ''%f %f'', &v [i]. x, &v [i ]. y) ; if(v[i].x<xmin ) (v[i].x:::=xmin && v[i].y<ymin») poz = i, xmin = v[i].x, ymin ::: v[ij Yi aux::: v[lj; v[l] ::: v[poz]; v[pozj ::: aux; v(l].x :::: 'v l Lj v y :::;0; lpun v[l] in oigine v[n + 1] ::: v[1]; linchei in acelasi punct S.push(O); lfietiv pe paz a S.push(l); 111 pe pima pozitie fo (i :::: 2; i <::: n; i++) lpentu celelalte puncte { v[i].x-::: xmin; v[i}.y-::: ymin; itanslatez punctul if (.T[i_J.._x=;:-: _0) v[,i.tg:=1-«30illtangenta infinit else v[i].tg ::: v[ij.y/v[ij.xi itg caleulata ) sot(v.begin() + 2, v.begin() T, cmp)illadonez fo (i ::: 2; i <= n + 1; i++l 'pentu fiecae punct; { S. push (i) ; lpun punctul in stiva p=s.top() i S.pop(); lconside ult:imele 3 puncte pl"s.top(); S.pop(); p2=s. top () ; while (S.size(»l && aielv[pl].x,v[pl].y,v[p].x,v[p].y,v[p2].x,v[p2].yl) {S.push(p); /elimin punctul din nijloc p=s.top(); S.pop(); //conside ia ultimele 3 pl=s.topl); S.pop() ;//puncte p2=s.t"p() ; ) S.push(pl); /epun pe stiva ultimele 2 punete L.J...,J --.;, W w.j 1 1..J i _0 1 1

95 188 PROGRAMAREA in L1MBAJUL C/C++ PENTRU L1CEU CLASELE ADAPTOR 189 S.push (p); } fpintf(g,"ld\n", n-(s.size()c2)); fclose(f); fclose(g); etun 0; Constuctoii initializeaza citeiul de compaae, pecum i un obiect containe. Al doilea constucto inseeaza in containe elementele din domeniul [pim, u Lt Lm), apoi apeleaza algoitmul make_heap () pentu a oganiza elementele din containe ca un max-heap. ", -«"! \-., 6.3. Clasa adapto pioity_queue Pentu a utiliza aceasa clasa tebuie sa includen fislcul ante! queue: #include <queue> Containeul adapto pioity_queue implementeaza 0 stucua de date abstacta denunlta coada cu pioitate cae penite executaea eflcienta a opeatiilo de inseae a unui element i de extagee a maximului. Eiemenele containeulul sunt stuctuate ca un max-heap", :template <class T, class Containe=veco<T>, ; class Compae=less<typenane Containe: :value_type> > ; class pioity_queue; Din declaatia clasei obsevati ca exista tei tipui specificate ca paameu : T - epezinta tipul elementelo suctuni ; Containe - cpezinta clasa containe cae este utilizata pentu menoaea elementelo : implicit aceasta este clasa vecto; clasa containe utilizata tebuie sa dispuna de iteatoi cu acces aleato. Compae - cpezina citeiul utilizat pentu compaaea elementelo - 0 functie sau un functo cae conpaa doua clemente si eumeaza un ezula de tip boo1 ; implicit acesta este opeatoul <. Constuctoii si destuetoul Constuctoii clasei pioity_queue SUn[: Constucoul de initializae : explicit pioity_queue (canst Compae& comp = Compae(), : canst Contain& ctn=containe{)); Ccustucoul bazat pe un domeniu template <class nputlteato> pioity_queue (nputteato pim, nputlteato ultim, const Compae& camp = Compae(), canst Containe& cn = Containe()); 4. Accasta stuctua de date cste dealia pezenata in capitojul 3 din. voiumuj aj H-lea al ucaf Pogamaea n limbaju! C/C + + pentu iiccu, '1 Exemple pioity_queue<int> pql; Ceeaza 0 coada cu pioitate vida; elementele sunt de tip int si containeul cae le stocheaza este cel implicit, adica vecto; citeiul de conpaae este eel implicit (opeatoul <). pioity_queue<int, vecoc t n t>-. geate<int> > pq2"; Ceeaza 0 coada eu pioitate vida; elementelc sunt de tip int si containeul cae e stocheaza este eel implicit, adica vecto; citeiul de compaae este functoul geate (cae utilizeaza opeatoul»; astfel se obtine un min-heap. sting s ( "Ana ae mee") ; pioity_queue<cha> pq3 (s.begin(),s.begin+s); Ceeaza 0 coada eu pioitate in cae plascaza pimele 5 caactee din siul s si le oganizcaza ca max-heap; containeul cae e socheaza ese eel implicit, adica vecto; citeiul de compaae estecel implicit (opeatoul -c}, stuct Punet { double x, Y; fiend beel opeato «canst Punct&,. canst Punet&) ) ; heel opeato «const Punct& pl, censt Punct& p2) { etun pl.x<p2.x pl.x==p2.x && pl.y<p2.y; } Am definit un tip denumit Punct (epezentand un punct p in coodonatele sale cateziene) si am supaincacat opeaoul < pentu tipul Punct. i pioity_queue<punet> pq4; Ceeaza 0 coada Cll pioitate vida cu clemente de tip Punct; se utihzcaza containeul implicit (vecto) i opeatoul -c pentu compaae. class CompaPunct {public: bool opeato () {canst Punct& pl, const Punct& p2j { etun p L _x<p2. x pl. x""""p2. x && pj. y<p2. y; } } ; a alta vaiana de implementae a fi sa definim un functo de coml?lae a punctelo. l- pioity_queue<punct, deque<punct>, compapunct> pq5;

96 190 Am ceat 0 coada ell pioitate cu elemente de tip Punc t., oontaineuj utilizat pentu stocaea elementelo este deque, ia compaaca se ealizeaza eu fuuctonn CompaPunct. Functiile membe publice Clasa adapto pioity_queue ae 0 inefatg simpla, foate asemanatoae cu intefata casei queue: hoel empty() Obsevatii jinale canst; Reumeaza tue daca numaul de elemente este O. size_type size() canst; Retuneaza numaul de elemente. const value_type& top{) Retuneaza 0 canst; efeinta la pimul element (eel ell pioitatea maxima). void push (canst value_type& va) ; nseeaza vajoaea val; functia apeleaza push_back () din containeul supot, apoi apeleaza push_heap () pentu a estaua popieatea de heap. [ void pop ( ) ; PROGRAMAREA TN UMBJ\JUL CC++ PENTRU L1CEU Extage elementul eu pioitatea maxima; este apelata functia pop_heap ( ), apoi pop_back () pentu containeul supot. template <class... Ags> void emplace (Ags&&... ags)i Functie spccfflca C++ 1'1, ceeaza un element (apeland constuctoul adecvat in functie de paametii specificati) i inseeaza elementul ceat. 11 void swap (pioity_queue& x) noexcept; nteschimba coada eu pioitate cuenta cu coada eu pioitate x, tansmisa ca paametu (functie disponibila incepand cu C++ 11). ncepand cu C++ 11, este supaincacata funcpa swap () si ca functie indepedenta (nenemba a clasei). 1. Elementele dint-un pioity_queue fiind stuctuate ca un heap, opeatiile push () si pop () se executa in tinp logaitmic. Pentu stack si queue acese opeant se executa in timp constant Niciuna dinte clasele adapto stack, queue i pioity_queue nu dispune de iteatoi. 3. Opea{iile definite pentu clascle adapto utilizeaza funetii ale clasci containe SUpOTt. De exemplu, pentu toate cele 3 clase adapto standad, clasa containe supon cbuie sa aiba definila funqia push_back()'(utilizatade-funqia push() ale claselo adapto). Clasele stack i pioi ty_queue utilizeaza pentu CLASELE ADAPTOR functia pop () funcua clasei supot pop_back ( ), in timp de clasa queue utilizeaza pentu functia pop () funcj!a clasei supot pop_font (). n ceea ce pivcste accesul la elemente, pentu clasa adapto queue sunt necesae functiile font () si back (), pentu clasa stack este necesaa functia back (), ia pentu pioity_queue este neccsaa funcpa font (). 4. Opeato-ii elationali nu sunt supaincacati pcnu pioi tyqueue, da sum supaincacati penu stack si queue, consideand odinea lexicogafica. Aplicatia 6. Piloti Vasile ae 0 companie de tanspot aeian, Pentu a se mentine pe piaa, e tebuic sa educa cheltuielile cat mai mult posibil. La compania sa exista N piloti (N pa). Pilotii sunt numeotati de 1a 1 la N in odinea cescatoae a vastei (pilotul 1 este eel. mai tana, pilotul N eel mai batan). Vasile tebuie sa fomeze N/2 echipaje. Un echipaj este fomat din doi pilot! (capitanul si asistentul sau). Capitanul tebuie sa fie mai in vasta dedit asistentul Sail. in contactu] fiecaui pilot sunt pcvazute coua salaii: unul pentu cazul in cae el este capitan al echipajului, celalalt pcntu cazul in cae el este asistent. Evident, pentu oice pilot salaiul sau de capitan este mai mae decat salaiul sau de asistent. Salaiile pot sa difee de la un pilot la altul. Chia se poate intampla ca salaiul capitanuiui sa fie mai mic decat salaiul asistentului ssu. Pentu a chelui cat mai putini bani pe salaiile pilotilo, Vasile tebuie sa detemine 0 distibuie optinala a pilotilo pe echipaje. Ceiuii Scieti un pogam cae sa detemine suma minima neccsaa pentu a plati salaille pilotilo. Date de intae Fisieul de intae pdlo t a. in contine pe pfma linie un numa natual N epezentand numaul de piloti. -Pc unatoaele N linii:- sunt infot-matii despe salaiile pilotilo. Pe linia i + 1 se afla doua numee natuale c :;i a sepaate pint-un spatiu (c epczinta salaiul pilotului i pe post de capitan, ia a epez.inta salaiul pijotului i pe post de asistent). Date de iesie Fisieul de iesie piloti. out va contine 0 singua linie suma minima necesaa pcntu a plati salaiile celo N piloti. Resticfii 2 :5 N : , N pa Pentu oice pilot, 1 a < c ::; pe cae va fi aflsata.j, ', l...j, ' '.-;, u '- i

97 - -«- i, 192 PROGRAMAREA N LMBAJUL CC '-'1 PENTRL! ucn. 1 CLASELE ADAPTOR '93 Exemple Solutie piloti.in piloti.out. piloti.in piloti.out (vcampion 2004) Metoda de ezolvae este Geedy. Pimul pilot tebuie sa fie asistent (fiind eel mai tana). Dinte 'pilotii 2 $i 3 unul tebuie sa fie asistent. Dinte pilotii 4, 5 si eel cae a dimas dinte 2 i 3 unul tebuie sa fie asistent. Deci la fieeae doi pilot! cititi tebuie sa aleg unul dinte cei existent! cae sa fie plasat pe post de asistent (alegeea se face dinte toti pilotii citip deja i cae nu au fost stabiliti ca asistenti). Citeiul de alegec : difeenta dinte salaiuj sau de capitan i salaiul sau de asistent sa fie maxima. Pentu a detemina suma totals minima necesaa pentu a plati salaiile pilotilo, vom utiliza 0 vaiabila ez. Cand citesc un pilot, voi considea ca el este capitan $i voi adauga salaful lui de capitan la ez, ia difeenta dinte salaiul sau de capitan i salaiul sau de asistent a vel insea int-un max-heap H. Da dupe fiecae doua citii tebuie sa aleg un asistent. n acest scop, voi extage maximul din max-heap-ui H. Din ez voi scadea maximul extas (ceea ce inseamna ca pilotul coespunzato devine asistent)"., #include <fsteam> #include <queue> using nanespace std;.of-s t.eem fout ( "piloti. out" ) ifsteam fin ("piloti. in") ; pioityqueue<int> int main (void) {int n, ez = 0, capitan, asistent, ij fin»nj fo (i=oj i<n; ++i) { fin» capitan» asistent; ez += capitan; H.push(capitan-asistent) ; if'li%2==01 { ez -=H.top()i H.pop() Hi } fou t «ez < '\n j fout. close () etun OJ Aplicatia 7. Ksecv Fie un si ab a2,..., a., de Nnumee integi 1?i K un numa natual. 0 secventa ai, a -a, a,... =>,, aj din si spunem ca este x-secvena daca exista eel mult,k numee stict mai mad decat ai. De exemplu, pentu N=10, siul a=3,6,4,2,l,lo,9,s,8,-z Si K=3,. 6, 4,2, 1, 10,9, 5, 8 este x-secvenja pentu ca sunt exact 3 numee stict mai mai decat 6. La fel, 5, 8 17 este x-secventa pentu ca sum doa doua numee stict mai mai decat S.. Ceiua Scieti un pogam cae sa detemine inceputul i sfasitul penu cea mai lunga x-secventa din si. Date de intae Eisieul de intae ksecv. in contine pe pima linie numeele natuale N!;i K, ia pe a daua linie elementele a, a2... an ale stului. sepaate p in cae uu spatiu. Date de iesie Fisieul de iesie ksecv. aut va contine pe pima l.inic doua nunee natuale incmax si sfmax sepaate p'int-un spatiu, epezentand indicii de inceput si de sfasit a1 x-sccventei de lungime maxima. Dacs sunt mai multe solutii, se va scie aceea pentu cae incnax este minim..restiqii 3 ::; N < :s; K :5: N '-10 9 ::; ai ::; 10 9, pentu oice i intc 1 i N. Exemplu k s ecv. in ksecv.out Explicatii Cea mai lunga j-sccvcnts estc cea cae incept ') la pozitia 2 si se inchcie la poxitia 9, adtca , in accasta secventiil cxistand 3 numcc stict nai mat dedit 6. (.campion 2011) 5. 0 implcucntac taa SlL poae f cousultata in capilolul :3 din volumul al ll-lea at lucaii Pogamaea n limbojut CC-+- -l- pennu ticeu,

98 194 PROGRAMAREA in LlMBAJUL C/C+-+ PENTRU LJCEU CLASELE ADAPTOR 195 Solutie Vom pacuge siul a element ell element j la fiecae pas i mcecam sa constuim cea mai lunge K-secvenla cae incepe ell ai' Pentu aceasta tebuie Sa tinem evidenta elementelo stict mai mai decat ai' Cand numaul acesto clemente este egal ell K (sau am teminat de pacus siul a) atunci am obtinut 0 x-secvenjs naximala, 0 compaam eli cea mai unga K-secventa si 0 etinem daca este cazul. Apoi incecam sa constuim 0 alta x-secventa. Pentu a nu obtine un algoitm patatic, in constuctia secventei umatoae ne vom baza pc secvenja cuenta, Sa no am eli x incepuul x-secventei cuente i ell a, elementul cuent pe cae il analizam din siul a. Exista doua cazui posibile : xai' in acest caz nu ac sens sa consuim x-secventa cae incepe cu ai, deoaece lungimea acesteia nu va fi mai mae decat lunginea maxima cuenta. x-ca,. n aces! caz vom constui x-secventa cae incepe cu ai. in k-secvenja cuenta noi aveam K elemente mai mai decat x. Dinte acestea uncle sun! mai mai decat ai, altele nu. Elementele cae sunt mai nai decat ai e contoizam in secventa cae va incepe cu ai, da celelalte nu. P'in umae, tebuie sa _eliminam din stuctua de date in cae tinem evidenta elementelo > x din secventa cuenta pe cele mai mid (adica.cele cae sunt :5 a.j). Deducen ca stuctua de date in cae etinen cvldenja elenentelo > x tebuie sa pemits executaea eficiena a doua opeatii : extageea minimului si inseaea. Pin umae tebuie sa fie un min-heap. Revenind: extagem din min-heap eel mai mic element, cat timp acesta este,5;;ai' Apoi completam secventa cae incepe cu ai (adica adaugsm elemente la sccventa atat limp cat min-heap-us nu ae lungimea > K). Accasta va deveni secventa cuenta, ia pocedeul descis se epcta. #include <cstdio> #include <queue> #define NMAX using namespace stdi int n, k,: Lqma.x, incmax, sfmax; int a [NMAX] ; pioity_queue<int, vecto<int>, geate<int> > H; int main() {int i, x, sf; FLE * fin=fopen("ksecv.in",""); FLE *fout=fopen ("ksecv. out ", "w'") ; fscanf (fin, "%d %d", &n, &k) i fo (i=o; dcn : i++) fscanf (fin, "%d",&a[i] 1 x=a[o]-l; 8f=0; fo (i=o; i<n; i++) if (a[i]>x) /eonstuim 0 k-seeventa incepand eu ali] {//eliminan din heap elementele <-= a[ij while (!H.empt.y()" && H:top()<'=a[i]} H.pop() /adaugam elemente cat timp e posibil while (sf<n) if (a[sf]<=a[i]) sf++; else if (H.size()<kl {H.push(a[sf]) i Sf++i} else beak; /compa lungimea seeventei cuenle cu 19max if (lgmax«sf-i») {lgmax=sf-i; incmax=i+l; sfmax=sf;} xea [ij; ) f p Lntf (fout, "%d %d\n", incmax, sfmax) fclose (fout) ; etun 0; Aplicatia 8. Algoitmul lui Kuskal optimizat Algoitmul lui Kuskal'' constuieste un aboe patial de cost minim pentu un gaf neoientat conex i pondeat. Metoda utilizata este Geedy: cat timp este posibil, selcctam 0 muchie de cost minim cae nu a mai fost selectata si cae nu fomeaza ciclui cu muchiile deja selectate. Nunaul de muchii selectate va fi n-l (unde eu n am notat numaul de vafui din gaf). Pentu a selccta eficient 0 muchie de cost minim, vom oganiza muchiile ca un min-heap, in funcne de cost. Pentu a testa dace 0 muchie fomeaza ciclui cu muchiile deja selectate, tebuie sa tinem evidenta componentelo eonexe fomate eu muchiile deja selectate. Pentu 0 implemencae eficienta von utiliza algoitmii Union-Find 7 optimizati, Repezentaea infomatiiio 1. Vom defini un stuct denumit Muchie in cae etinem extemiatile unci muchii $i costul aeesteia. Supaincacam opeatoul > pentu compaaea muchiilo (deoaece dohn sa oganizam muchiile ea un min-heap). 2. in coada cu pioitate H etinem muchiile gafului, oganizate ca un min-heap in functie de cost. 3. n vectoul sol vom etine muchiile ce foneaza aboele patial de cost minim; in costmin etinen suma costuilo muchiilo selectate. 4. Pentu a epezenta conponentele conexe ale gafului(cae sunt multimi disjuncte de muchii), vom considea ca fiecae componenta conexa este Ull aboe. Repezentam aboii pin efeinte ascendente (mai exact, pentu fiecae vaf x etinem tata [x] = nodul pa-inte al lui x, espectiv a dadi x este adacina aboelui). Opeatia Find (xl detemina adacina aboelui din cae face pate x (i. pentu 6. 0 desciec dclalialll ;;i a impjememae pcntu algoitmullui Kuskal puctic9nsulta!n cupilolul din volumul al ll-lea al lucaii Pogamaea in limbajul C/C+ + penu licel/. 7. Repezeniaca multimilo disjunctc i implcmentaea oplimizata a algoitmilo Union-Find se afla in capiiolul 3 din volumul al -tea al lucaii Pogamaea in limbajul C/C+ -- pemu liceu. ;! U G...j J...j...j

99 !,, t :,..., "',,, 196 PROGRAMAREA in LlMBAJUL C/C++ PENTRU LTCEU eficienta, compeseaza dumul de la x la adaclna). Opcatia Union (c. c2) unifica aboii coespunzaon componentejo conexe ci si c2 (adacina aboelui ell inaltimea mai mica devine fiul adaclnii celuilalt). Pentu a implenenjg opeatia Union eficient este necesa sa edncm i inaltimea fiecaui aboe fomat (h lx l = tnalimca aboelui eli adacina x). #include <fsteam> #include <queue> #define NMAX lool using nespace std; stuct Muchie {int X, Yi double coat; i fiend bool opeato > (const Muchie&,const Muchie&) } ;. bool. opeato > (const Muchie& ml, const Muchie& m2) { etun ml.cost>m2.cost; } pioity_queue<muchie, vecto<muchie>, geate<muchie> > Hi veeto<muehie> sol; int tata[nmaxj int h [NMAX) ; int n; double eostnin; void Citie(); void Afisae(); int Find (int); void Union (int, int}; int main (l {int c'l. cz Muehie n; ci t d e t j while (sol.size()<n-1) leat timp nu am se1eetat cele n-1 muchii {lextag din H muehia de cost minim m=h. top ); H. pop ( ) ; idetemin componentele conexe din cae fac pate lextemitatile muchiei se1ectate m cl=find(m.x); c2=find{m.y); if (cl!=c2) 11m nu fomeaza cic1ui cu muchiile se1eetate {/selectez aeeasta muchie oos t.mi n- em. cost; sol. push_back (m) ; lunific c cmpoeeit e Le coexe ale e?ct;:nitatilo:;;- 8nioniel, c2)";. Afisae () etun 0; CLASELE ADAPTOR 197 void Citie() {Muehie m; int i, nm; FLE * fin=fopen ("kuskal. in", " tl ) ; fscanf(fin,"%d%d", &n, &nm); fo (i=o; i<nm; i++) {fscanf (fin, "ltd %d %1 ", &n.x, &m.y, &n.cost); H. push 1m); } void Afisae () {FLE * fout=fopen{"kuskal.ou,t", "w"}; fpintf(fout, "%.21f\n", costmin); fo (int i=o; i<n-l; i++) fpintf(fout,"%d %d\n",solli).x,sol[i}.y) felose(fout) },int Find tint xl {int =x; /deteminam adacina aboelui while (tata[)l =tataf]!!compesam dumul int y=x, aux; while (yl=) { aux=tata lyl : tata [y]'=; 'yea ux: etun y. void Union (int el, int c2) ( if (h[clj>hlc2]) ese {tata[cl)=c2; if (hlcl]=h[c2]) tatalc2]=cl; hlc2]++; Aplicatia 9. Algoitmul lui Dijksta optimizat Algoitmu1 lui Dijksta" detenina un dum de cost minim de la vaful de stat xo la fiecae dinte celelalte vafui ale unui gaf pondee dat. R. 0 desclec dctafiata st 0 implcmcuac pcntu algoitmul lui Dijksta putcti consulta in capltolul din volumul al ll-lea al lucaii Pogamaeo tn inmajut OC+ + pentu ticeu,

100 p 198 PROGRAMAREA in LMBAJUL C/C +-1 PENTRU LleEU Repezentaea infomatiilo Yom epezenta gand p in liste de adiacenja eli costui. Mai exact penu fiecae vaf x din gaf etinen acele eli exteuiatea initiala x int-un vecto de peechi de numee integi (pet -c f.n t, int»; pimul numa din peeche (fist).. epezinta extenitatea flnala a acului, ia a1 doilea numa din peeche (second) epezinta cosul acului espccttv. using namespace std; int n, x Oi vecto < pai<int,int> > GtNMAXJ Lnt; dm.i.n lnvjl;...x] int pec[nmax] FLE ",. fout; CLASELE ADAPTOR 199 L..j "-' fl vecto < pai<int,int> > G(NMAX] i Costuile dumuilo minime e vom eline in vectoul dnin (dnin [x] = cosnu dumului minim de 1a vaful xo la vaful x; daca nu exista dum de la x 0 a x, dmin [xl =NF, unde NF este 0 constanta suficient de mae). int dnin [NloAX] ; Pentu a econsitui dumuile, este necesa ca pentu fiecae vaf x sa etinem pec [x] = vaful cae l peceda pe x pe dumul minim de Ja xo la x; (vaful xo nu ae pecedent, deci pec [xo] =0). int pec [NMAX] ; class CompaVf {public: hool opeato () (const int& x. const int& y) { etun dmin[x] >dmin [y] ; ) ; pioityqueue<int, vecto<int>, CompaVf> H; void citie(); void dijksta(); void afisae();, Yom utiliza 0 coada cu pioitate H, in cae insean vafuile gafului pe masug ee acestea sunt pacuse, astfel ncat a fieeae pas sa putem exage vaful pentu cae dmin este minim (min-heap). pioity_queue<int, vecto<int>, CompaVf> H; -Compsi-v- este functoul cae compaa doua vafun : 'class CompaVf {public: : hool opeato (l (const int& x, const int& y) { etun dmin[x]>dmin[y] }; nitial: dmin [x] =NF, pentu oice x if:- xo i dmin [xo] =0 ; pec lx l =xo, pentu olce x if:- xo i pe.c [xo] =0; inseam in coada ell pioitate H vaful de stat xn. Cat timp in coada ell pioitate H mai exista vafui : extagem un vaf vfmin din H (vaful situat la distanja minima de xo) ; pacugem lista de adiacenta a vafului vfmin si incecam sa optimizam costuile dumuilo vafuilo cae sunt extemitati finale ale aeelo cae pleaca din vfmin. #include <cstdio> #include <vecto> 1finclude <queue> #define NF ildefine N1'-1AX' 5000.J. int main () ( citie() ; dijksta () afisae () ; etun 0; ) void citie () {int i, ill, X, y, Ci FLE * fin=fopen("dijksta.in","") fscanf (fin, "%d %d %d", &n, &m, &xo); fo (i=o; i<m; i++) {fscanf(fin,"%d %d %d_t,.&x., &y,.. &c)j G[x].push_back(make-pai(y,cJJ; } " } void dijksta () {int i, vfmin; fo (i=l; i<=n; i++l {dmin[i]=nf; pec[i]=xo;} dmin[xo]=o; pec[xo]=oi H.push(xO) ; while (!H.empty()) {vfmin=h.top(); H.pop(); fo (i=o; i<g[vfminj.size{); i++) lpacug lista de adiacenta a lui vfmin if Ldm.i n [G [vfmin] [i]. fist) > dminlvfmini+g.[vfmin) [i].secod) loptimizez cmtn tc Lvu-Ln lli.fist] dmin lv Eu.n l +G [v f mi.n j [i J second;...; : i

101 200 PROGRAMAREA N UMBAJUL CC++ PENTRU LCEU CLASELE ADAPTOR 201 pec[g[vfmin] [il.fistj=vfmin; H.push(GLvfmin] [i].fist) i ) Ce se va afisa pe ecan n cazul n cae declaatia obiectului C este : a. s t a ok-c Ln t.> c; b. pioity queue-c Lt.> C;, ) -!,! -'! void dum tint xl {if (x ) {dum(pec[x}) ; fpintf(fout, "%d ) void afisae ( ) {fout=fopen ("dijksta. out" "W") ; fo (int i=l; i<=n; i++) if (il=xo) if (dmin[i]==nfl fpintf (fout, "O\n"); el.se ( fpintf(fout, "%d: dnin [i ] ; dum(i) ; fpintf (fout, \n") ; ) fclose (fout) i ) Obsevatii x) 1. Acelasi vaf poate fi inseat in coada ell pioitate H de mai multe oi. Ca umae, implementand astfel algcitmul lui Dijksta, dimensiunea nemoiei necesae pentu coada eli pioitate H este de Ojm), unde ell n am notat numaul de ace din gaf. Memoia ueccsaa pentu H a putea fi de O(n) (unde ell n am notat numaul 'de vafui. din gaf), doa dace atunci cand cptimizam cosul dumului cate un vaf y nu il inseam H, ci velflcam deca el exista sau nu in H. Daca y nu exista n H, il inseam. Daca y exista deja in H, nu il inseam, ci ponovam in heap pe y, confom noii sale valoi. Peutu aceasta a tebui sa implemcntam noi opeatiile eu heap-ul pentu a putea eline i pozitia fiecaui element n heap. 2. Complexitatea agoitmului lui Dijksta implementat ell heap este O(m log n) Execitii i pobleme popuse 1. Sa consideam umatoaea secventa de opeatii : C.push(7);C.pushllO ;C.push(2) ;C.push131 ;C.push(251; while : C. empty ( ) ) '{ -cout cec. top ()«' C.pop (); ) 2. Scien 0 secventa femata dlnt-un numa minim de opeatii push ( ), pop () i afisaea-elementului de a vaf (top ( ) dupa executia caeia. plecand de a 0 stiva initial vida, obtinem pe ecan cuvantul mama. 3. Cae dinte umatoaele secvente afiseaza elcuentele din coada eu pioitate H? pioity_queue<int>h; a. i fo (int i=oi i<h.size() b. c. d. b. j sting 5 ( "mama" ) ;.. stack<cha> H(s) i++) f. pioity_queue<int>: :iteato it; t fo (it=h.begin(); it!=h.end(); ++it) cout«h[ij«' while (! H. empty ()) COlit«H. pop ( )«' '; c. t list<sting> L (5, "mama ") ; queue<sting, list<sting> > H (Ll ; d. pioity_queue<int, deque<int>, geate> H;,. cout«*it«' while (! H. empty ( }) {cout«h. top ( )«' '; H. pop ( ) ; } 4. Cae dinte umatoaele declaatii pentu obiectul H sunt coecte? a. l pioity_queue<int, list<int> > Hi 5. Cae dinte umaoacle afinnatii sunt adevaate? a. Gice clasa poate fi utilizata dept clasa supo pentu containeul adapto queue. b. Opeatoul de indexae nu este supetncacat pentu clasa adapto stack. c. La declaaca unui obiect de tip queue u-ebuie sa specificam tipul elementelo, containeul supot, pecum si citeiuj de compaae a elementelo. d. Pcntu toate containeele adapto standad din STL inseaea si exageea elenentelo din containe se eal izeaza n timp constant. e. Niciuna dinte afimatiile pecedente.

102 '!" " 202 PROGRAMAREA in LlMBAJUL C/C++ PENTRU LlCEU 6. mplementati pacugeea in latime (BFS) a unui gaf, util.izand c1asa queue. 7. mplenentati algoitmul lui Pim de deteminae a unui aboe patial de Cost minim, optimizandu- pin utilizaea unui heap. Pentu implementae, uttlizaj, clasa adapto pioity_queue. 8. mplementati algoitmul Fod-Fulkeson de detenninae a unui flux maxim int-o etea de tanspot, util izand biblioteca STL. 9. Swap o poanteme coecta se obtine aplicand una dinte umatoaele eguli : siul vid este 0 paantezae coecta ;. daca s este 0 paantezae coecta, atunei (s) este a paantezae coeca, ia cele doua paanteze (!ji ) cae incadeaza siul s sum denumite paaueze peeche : daca 51' 52'..., 5",- sunt paanezan coece atunci siul Sk obinut pin concatenaea acestoa este 0 paantezae coecta. De exemplu siuile (), () (), (())!ji (() () ) () epezinta paantezai coecte, 'in timp ce ) t, () () (!ji (() () ) ) ) nu sunt paantczai coecte. Fie 5 un si cae cpezinta 0 paantezae cocca. Pentu fiecae dinte paantezee peeche din siul S asociem un cost egal cu difeenta dinte pozitia pe cae se afla in S paanteza inchisa i pozida paantezei deschise peeche. Poz.itiile in si le considean numeotate incepand cu 1. Costul total al unci paantezai coecte il epezinta suma costuilo tutuo paantezelo peeche din aceasta. De exemplu, siul (() ()) este fomat din tei paanteze peeche, situate pe pozitiile 2 si 3, 4 si 5 si espectiv 1 si 6. Costu total al paantezaii este Numim opeatic swap imeschimbaea a doua paanteze situate n si pe pozitii alauate. Aceasta opeatic cstc validd doa dad! siu nou obtinut este la andul sau 0 paantezae coecta i daca noua paantezac ae costul total stict mai mic decat cea initiala. Ceillli Scieti un pogam cae cite te 0 succcsiune de N caactee epezenand 0 paantezae coecta!jl detcmina : a) Costul total asociat paantczaii dtite ; b) Costu minim a1 unci paantezai obtinute pill efectuaea unci singue opeatii swap valide asupa paamczaii citite ; c) Numaul de posibilitati de a efectua 0 singua opeat.ie swap valida asupa paantezaii ini\iale pemu a ebtine cestu dcteminat confom ceintei b). linit Date de iuae de intae swap. in contine pe pima linie numaul natual N $i pc a doua 0 succcsiune de N caactee cpezeitano. 0 paantezaccoecta, Fiieul Date de iesie CLASELE ADAPTOR 203 Fisieul de iesie swap. out va conpne pe pima linie un numa natual epezcntand costul paantezaii citite. A doua linie va contine un numa natual epezemand costul minim deteninat confom celntci b) sau valoaea -1 cand nu se poate efectua nici 0 opeatie swap valida asupa paantezaii citite. A teia linie a fisieului va contine un numa natual epezcntand aspunsul la cetnta c) sau 0 daca numaul afisat confom ceintei b) a fost -l. Restictie 2 :0:;; N.s Exemplu swap. in swap. out Explicajii 8 6 Pemu ccinta a) costul paamezaii estc Executand 0 opeatic swap ine paantczclc de pc pozitiile 4 s! 5 se 1 obtinc stul () ( ) () () cae ae costul 4, aceasa fiind singua posibilitatc de a obtine acest cost. Olimpiada Nanonala de nfomatica pentu Gimnaziu, Valet Vasile luccaza 'int-o paeae. Sacina lui este sa scoata masinlle clientilo din pacae. Teenul de pacae este deptunghiula, fomat din nxm zone ideuicc, aanjate pe n linii si m coloane. Lini ile sunt numeotate de a 1 la n, ia coloanele de la 1 la m. esiea din pacae este in coltul pacaii si ae coodonatele (1, 1). in fiecae zona se poate afla 0 masina, un stalp sau poate fi ibea. Pacaea este.plina, singua zona libea fiind iesiea din,pacae. Pin umae, este foate complicat sa scoti a masina din pacae. Pentu a-s! face loc, Vasile poate muta 0 masina din zona n cae este plasatji 'in una dinte zonele invecinate, dace aceasta este libea. Evident, stalpii nu pot fi mutati. doa mastuilc. Doua zone sunt invecinate daca se afla pc aceeai linie, pe coloane consecutive, sau pe aceeai coloana,_p.e Jinij consecutive. Cein li Scieti un pogam cae sa detemine numaul minim. de mutai de maini pc eae tebuie sa e execute Vasile pentu a seoate 0 ma!jina din pacae, daca acest lucu este posibil. Date de intae Fiieul de intae valet. in contine pc pima linie numeele natuale n i n sepaate pin spatiu. Umcaza n linii, fiecae continand cate n caactec din 1l1ultimea {,. " '#', 'c', 'X'}. Caacteu '.' indica zona libea. Caacteul '#' indica un staip. Caaeteul 'c' indica 0 ma$ina paeadi. Caacteul 'x' indica ma$ina pc cae Vasile tebuie sa 0 sceam din pacae. in fiieul de inae exista un singu caacte 1 x' :;;i un.sij1gu caacte _'. '. plasat in ccltlil, (," 1,)..J "p'-!caii. '-' -- -' L...!

103 'C:. c-' -' -. - l;,...,". 204 PROGRAMAREA N LMBAJUL etc +-+ PENTRU LCEU Date de tesie Fisieul de iesie valet. out va contine 0 singua lillie pe cae va f scis numaul minim de muta-i pe cae tebuie sa e efectueze Vasile pentu a scoate masina din pacae, daca acest lucu este posibil. in caz conta, pe pima inie se va scie cuvantul imposib:i.l. Restiaie 1 n, m -s; 50 Exemple 11. Pedeceso.campion 2011 Considean un si de N numee natuale distince al, e a, "" an' Pentu fiecae temen ai defluim pedecesoul sau, daca exisa, ca fiind cel mai din deapta tenen aj, cu j<i si aj<ai De exemplu, pentu siul 8, 12,2,4,3,10,9,7,5,6, numaul 8 este pedecesoul lui 12, 3 este pedecesoul lui 5, in tinp ce 10, 4 i 2 nu sunt pedeceso-ii niciunui numa. Ceinta Scien un pogam cae detemina cae numee din si nu sunt pedecesoi ai niciunui ali numa. Date de intae "Eisieul de'<intae pedeceso. iti 'Cbnine pe pima inie numaul 'natual N epezentand nunaul de temeni ai siului. Pe utuatoaea linie se gasesc, sepaati pin cate un spajiu, temenii al, a2, "', an ai iului. Date de'iqie Fiieul de ie ie pedeceso. out.va contine 0 singua linie pc cae va fi scis un singu numa natual epezentand nwllauj de temeni ai l}iului cae nu sum pedecesoi ai niciunui alt numa. RestiCfii valet. in valet.out valet.in valet.out 3 3 imposibil #X.eX eee eee e#e 3 N S ai S , pentu aiee l:;in Exemplu CLASELE ADAPTOR,- pedeceso.in pedeceso.out ')05.campion Ceza in Roma antlca exista n case senatoialc distincte, cae una pentu fiecae dinte cei n senato! ai Republicii. Casele senatoiale sunt numeotate de la 1 la n, inte oicae ooua case existand legatui diecte sau,indiecte. 0 legatua es(' diccta daca ea nu mai tece pin ale case scnaoialc intemediae. Edilii au pavat uncle dinte legjltu'ile diecte dinte doua case (numind 0 astfel de legatua pavata " stada"), astfel incat inte oicae doua case senatoiale sa existe 0 singua succesiunc de stazl pin cae se poate ajunge de la a casa senatoiala a cealalta. Toi senatoii tebuie sa paticipe la sedtntelc Senatului. in aces scop, ei se deplaseaza cu lectica. Gice senato cae se deplaseaza pe 0 stada plateste 1 ban pentu ca a fast tanspotat ell lectica pe acea stada. La alcgeea sa ea pim consul, Ceza a ponis ca va data Roma cu 0 lectica gatuita cae sa cicule pe un numa de k stazi ale Ronei astfel incat oice senato 'cae va cicua pe staaile espective sa poata folosi lectica gatuita taa a plati. Stazile pe cae se deplascaza lectica gauita tebuie sa fie legate inte ee (zboul, metoul sau telepotaea ncfiind posibile la acea veme). in plus, Ceza a pomis sa stabileasca sediul salii de sedinte a Senatului int-una dinte casele senatoiale af1ate pe taseul lecticii gatuite. Poblema este de a alege cele k sazi i anplasaea sediului salii de sedinte a Senatului astfel incat, pin folosiea tanspotului gatuit. senatoii, in dumul lo spe sala de scdintc. sa faca economii cat mai nsemnate. in calculul costului total de tanspot, peutu toti senatoii, Ceza a considea di fiecae senato va calatoi exact 0 data de la casa sa pana la sal a dg_epil! Ceinpi a S.,!LUJt!i. Scieti un pogam cae detemina costul minim cae se poate obline pin alegeca adecvata a eelo k stazi pc cae va cicula lectica gatuita i a locului dc amplasae a saw de edin!a a Senatului. Date de iluae Fiieul ceza. in contine pe pima linie doua valoi n k sepaate pint-un satiu epezentand numaul total de senatoi i numaul de stdizl pe cae cicuja lectiea gatuita. Pe umatoaele n-l hnii se afla cate doua valoi i i j sepaate pint-un spatiu, eu semnifieatia di inte casele i i j exista stada.,-

104 206 PROGRAMAREA N LMBAJUL etc ++ PENTRU LCEV i' Date de iesie Pe pima linie a fisieului ceza. out 'se va scie costul total minim al tauspotaii tlltuo senatoilo pentu 0 alegee optima a celo k stazi pc cae va cicula tecica gatuita si a ocului unde va fi amplasaa sala de sedinte a Senatului. Restictii 1 < n S 10000, O'<k-cn a s L, j5n, ii'j Stazile din fisieul de intae cpezina doua stazi distincte. Exemple ceza.in ceza.qut 11 Explicatii Costul minim sc cbtine. de exemplu, pcntu alegeea celo 3 stazi inte casele , i a salii de scdinte a Senatufui in casa 8: Exista gi alte alegci pentu Cae se obtinc solujia 11. Olimpiada Judeteana de nfomatica Containee asociative n biblioteca STL sunt definite patu containee asociative sotate: set, multiset, map!}i multimap. [ncepaud eli C++ 11, biblioteca STL include i containee asociative nesotate: unodeed_set, unodeed_multiset, uno-de-ecjmap iunodeed_multimap. in caduj containeelo asociative elementele nu sunt identificate pin pozitia acestoa in cadul containeului, ci pin intemcdiul unci clzei. in cazul containeelo asociative sotate, elementele sunt stocate in odinea cheilo, confom unui citeiu de compaae specificat. Pentu containeele asociative, opeaiile de inseae, stegee si cautae se ealizeaza foate eficient Containeele asociative sotate set i?i multiset Containeul set stocheaza clemente distincte int-a anunita odine. Vom denumi un containe de tip set multime. Elementele tu-o multlme sunt identificate pin valoaca lo. Cu alte cuviuc, in cazuj containeului asociativ set, cheia i valoaea coincid. Containeul nultiset este asemanato, difeenta constand in fapul di valoile nu sunt distincte (ele se pot epeta). Vom denumi un containe de tip nultiset multimultime. Pentu a utiliza aceste clase tebuie sa includem fisieul antet set: #include <set> Declaatia clasei set: template < class T, class Compae class Alloe > class seti = less<t>, allocato<t> > Clasa sablon set ae tei ipui specificate ca paaneti: T - tipul valoilo stocate ; Compae - citeiul uilizat pentu conpaaea elememelo (implicit se utilizeaza opeatoul -c) ; Alloe - tipul obiectului utilizat pentu alocaca memolei pentu elementele containcului ; implicit acesta esc allocat:o<t>. '-' w /1, ',, -...J

105 -',- -' Constuctoii si destuctoul Exemple set<int> c; class Conplnt {public: heel opeato(} (censt int& x, canst int& y) { etun x%10<y%10; } ; PROGRAMAREAN.LMBAJUL CC++ PENTRU LlCEU Declaatia este stmllaa i pentu multiset. Citeiul de sotae specificat tebuie sa fie antisimeic (daca Compae {x, Yl este tue, atunci Compae (y x} este false), tanzitiv (dad Compae (x, y) este tue si Compae (y, z) este tue, atunci Compae (x, z) este tue) i ieflexiv (Compae (x, x) este false). Acelasl citeiu de sotae este utilizat i pentu a veifica daca elementele sunt distincte (x i y sun consideate cgale daca atat Compae (x, y), cat si Compae (y x ) au valoaea false). Clasele set $i multiset nu pemit modificaea elementelo stocate in containe, insa pemit inseaea unui element si extageea unui element. teatoii containeelo set/multiset sunt bidiecuonali. Desi standadul STL nu specifica explicit acest lucu, elementele containeelo set/multiset sunt oganizate inten ca un aboe bina de cautae echilibat (mai exact, un aboe osu-si-negu). Acest lucu pemite ca opeatiile de cautae, inseae si extagee sa se ealizeze in timp logaitmic. Pentu clasele set/multiset sunt definiti constuctoul implicit (cae ceeaza un containe vid), constuctoul bazat pe un domeniu (cae ceeaza un containe ill cae copiaza elementele dint-un domeniu spccificat), constuctoul de copiee i destuctoul, cae distuge obiectul, elibcand memoia alocata dinamic. ncepand cu C+ + 11, sunt definiti constuctoul de initializae (cae ceeaza un containe in cae plaseaza elementele specificate tnt-o lista de initial izae) si constuctoul de mutac (cae ceeaza un containe in cae muta elementele dint-un containe specificat). Ceeaza 0 multine (set) denumita C cu 0 clemente de tip into Odinea.:!ementelo este cea implicita, defiuita de opeatoul -c., sting s (vmana" ) ; set<cha> d (s _begin () S. end () );.. Ceeaza un containe de tip set in cae plaseaza caacteele distincte din iul s, odinea caacteelo fiind cea impiciui «). Continutul comail1eului s este am. f multiset<cha> d(s.begin(), s.end(»; Ceeaza un containe de tip multiset in cae plaseaza toate caacteele din $iul 5, odinea caacteelo fiind cea implicita «). Continutul containeului ms este aamm. Sa consideam c1asa Compnt, cae pemite compaaea a doi integi consideand doa ultima cifa : T Accesoi CONTAlNERE ASOCATVE Vom declaa $i von popula un vecto a de numec de tip int: vecto<int> a; a. push back (12) ; a. push back (102) ; a. push_back (56) ; a_push_back(213) ;a.push_back(2121 ;a.push_back(14); a.push_back(151 ;a.push_back(56}; Vecoul a contine acum valoile 12, 102, 56, 213, 212, 14, 15, 56. Vom cea doua multimi utilizand collstuctoul bazat pe un domeniu :.15et<int> cl (a.begin{), a.end(»);.' set<int, CompLnt.> c2{a.begin{) a.end()); in cl vo fi plasate elementele distincte din vectoul a, 'in odine cescatoae, consideimd odinea definita de opeatoul -c : ,213. in cz vo fi plasate elementele din vectoul a, elemcnte distincte luand in consideae ultima cifa, in odinea ccscatoac descisa de compnt: ! multiset<int, Complnt> c3 (a.begin(), a v ed L),; n c3 sunt plasate toate elementele din vectoul a, in odine ccscatoae. luand in consideae doa ultima cifa : Functiile membe efeitoae la dimensiunea containeului Pentu c1asele set/multi.set sunt definite funqiile empty (), size () i max_size (), cu semnificatia uzuala. Containeele set/multiset contin functiile membe begin (), end (), begin ( ), end () cae etuneaza iteatoi cu semnificat ia uzuala. [ncepand cu C+ + 11, sunt definite i functiile cbegin (), cend (), cbegin (), cend { ), cae etuneazaconst i teato. Reamintim ca elenentele acesio containee sunt constante (nu pot fi ll1odificate),' deci neaoni indica elemente coustantc. De asemenea, etineti ca elcmentele cot1taineelo set./multiset sunt odonate (confom citeiului de soae specificat la dec1aac). Pin umae, pimul element al containeului este pimul confom odinii specificate ("cel mai mic"). ia ultimul element este ultimul confom odinii specificate ("eel mal mae")... FunCfiile membe cae modificii containeul T'.1seae 1 pai<iteato bool> inset (canst value_type& val! ;! nseeaza" un element cu vajoaea val. Pentu contalneu ' f' set unc!a etuneaza" i. 0 peechede valoi. pima valoae din peeche (fisc) fiind un iicalo cae indica, elementul noll inseaf (sau pozitia celui cchivalent.cll acesta existent set); a doua valoae din peeche (second) este tue daca inseaca s-a e.aizat cu succcs, espectiv false dad inseaea 11U a fast efectuata deoaece 0 valoae cchivalenta, 209

106 210 PROGRAMAREA N UMBAJUL C/C+- (it.eata paz, PENTRlJ LCEU exista deja in containe. n cazuj in cae containeul este de tip mult.d s e t, inseaeil se ealizeaza ntotdeauna, pin unnae functia nu cuncaza () pceche de valoj ci dea iteatoul cae indica pozitia elcmcntuluinou inseat. iteat.o inset const value.. t.ype& val) ; nseeaza un element cu valoaea val,.incepand cautaca pczipel de inseae ell pozitia indicata de iteatoul paz. Pozijia paz epezinta dea a indicatie pcntu functia inset, ca pozitie de inceput a cautaii, si daca pozitia pe cae tebuie inseata valoaea val este dupe paz, atunci inseaea este opimizata. template <class nputlteato> void inset (nputlteato pim, nputlteata ultim) ; nseeaza in containeul set/multiset elementeje din domeniul [pim, ultim). template <class... Ags> pai<iteato,bool> emplace (Ags&&... p); Disponibila din C++ 11, functia emplace () ceeaza si apoi inseeaza un element in containe. template <class... Ags> iteata emplace_hint(constiteatopoz, Elinina din set/multiset toate elemeutelc din domeniuj [pim, ul tim). void clea(); Elimlna toate elemenele din containe. nteschimbae void swap (set& x) ; void swap (multiset& x); Ags&&... p)j 'T' ",. - Dispcnibila din C+ + 11, functia emplace_hint () cecaza si apoi inseeaza un element n containe, cautaea pozitiei de inseae incepand cu pozitia indicata de iteatoul poz. Extagee void ease (iteato poz) j Extage din set/multiset elcmentul indicat de iteatoul poz. size_type ease (const value_type& val);.",--. Cauta in set/multiset valoaea val si extage din set/multiset toate elementele cae au aceasta valoae. Functia etuneaza numaul de elemente eliminate (pentu containeul set 1 sau 0, dupa cum valoaea a fost sau nil gasita). void ease (iteato pim, iteato ultim) j Functie meniba cae inteschimba containeul cuent cu contalneul x ansmls ca paametu. 1 Opeatiile de cdutae CONTANERE ASOCATVE iteato find (const value cype& val) Exemplu const; Cauta in set/multiset valoaea val j eumeaza un itcato cae indica 0 :pozitie pe cae se afla aceasta valoae. Daca valoaea val nu a fost gasita, functia etuneaza iteatoul end ( ). l size_type count (const value_type& val) const; Retuneaza numaul de elemente din containe echivalente (din pespectiva citeiului de sotae) cu valoaea val. Pentu set, aceasta functie poate etuna doa 0 sau 1, deoaece valoile sunt distincte. ' i iteato lowe_bound (const value_type& val) const; Retumeaza un iteato cae indica pozitia pimului element din containe cae nu il pecede pe val (acest element contine 0 valoae echivalenta eu val sau mai mae decat val, consideand citeiul de sotae specificat la declaae). Daca toate elementele din containe peceda valoaea val, atunci functia etuneaza iteatoul end( ).!"iteato uppe_bound (const value_type& val) constj Retumeaza un iteatb cae indica pozitia pimului element din containe cae it succeda pe val (acest element contine 0 valoae mai mae dedit val, consideand.citeiul de sotae specificat Ja declaae). Daca un astfel de element nu exista, atunci functia etuneaza iteatoul end"). pai<iteato,iteato> equal_ange(const value_type& val) canstj Functia euneaza 0 peeche de iteatoi. Punul iteato din peeche (fist) este lowe_bound (). ia al doilea iteato (second) este uppe_bou:l:.? (). Yom deflni unset; si un multiset pe caele initializam eu caacteele dint-un si : sting Si t ' ab-acadeb.a" ) ; set<cha> s(si.begin(), Si.end()) j multiset<cha> ms(si.begin(}, Si.end()} Putem pacuge multinea s i multimulimea ms, afisand caacteele: set<cha>: :iteato s_it; multiset<cha>:: iteato os_itj fo (s_it:::s.begin() s it!=s.end() ++s it) cout«*s_itj ooutc c tvn ' ; fo (ms_it=ms.begin() ms it!=ms.end(}: ++ms_itl caut«*ns_it; oout.c ' vn ' ; '--" w u -1 _.,! J --' --' --'

107 ,, :- -i -,...,,, Pe ecan se va aflsa : abcd aaaaabbcd Pe ecan se va afisa : Daca executam aceeasi secventa pentu caacteul p (cae nu apae in si), objinem : Aplicatia 1. Sea PROGRAMAREA N LMBAJUL CC++ PENTRU LCEU Putem detemina lowe_bound () i uppe_bound () pentu caacteul b in ambele conainee : bb cc s_it=s.lowe_bond( 'b ' ) i ms_i t e s. lowe_bound ( b' ) cout«*s_it«*ms_it«'\n'i s_it=s.uppe_bound('b')j ms_it=s.uppe_bound('b'l cout«*s_it«*ms_it«'\n'i Pe mae va avea loc 0 impotanta batalie tne N vapoae. Vapoaele sun! consideate niste puncte si sunt date pin coodonatele ]01" cateziene x si y. Din motive geu de inteles, vapoaele nu pot ataca dedit vapoaele cae se afla la stanga i mai jos (nai exact, un vapo la pozitia xl, yl poate ataca alt vapo Ja pozitia x2, y2 daca i numai daca xl>x2 lji y1>y2). Pentu ca aceasta baalie ae lac in zona Tiunghiului Bemudelo, vapoaele apa (se telepoteaza) pe and in zona bataliei. Vapoaele sunt numeotate 1, 2,..., N in odinea apaitiei lo. in momemuj in cae un vas apae, daca exista alt vas cae a apaut deja i cae poate sa 11 atace pe eel nou, vasul nou este distus instantaneu. Daca nu, vasul eel nou amane pe mae i distugeioate vasele pe cae e poate ataca. Ceinja Dandu-se coodonatele la cae apa pe and -vapoaelc, sa se afle pentu fiecae vapo daca este distus sau nu in monentul apaitiei sale, si daca nu este distus, sa se pecizeze numaul total de vapoat;: amase pe mae dupa epaitia sa. Date de intae Pe pima linie a fisieului de intac sea. in Sf; afla uumaul natual N epezentand numaul de vapoac ee vo apaea pc mae. Pc tiecac dinte umatoaele N linii sunt descise in odine pozitii1e vapoaelo. Mai exact pc cca de a i-a linie dinte cdc N se afla doua numec integi sepaate pin spatiu epezentand coodonatele x _yale vap9ului i (lin). Exemple CONTANERE ASQCATVE Date de iesie Fisieul de iesie sea. out va coninc N linii. Pe inia i se va scie -1 daca vapolll i estc distus in momentul apaitiei sau un numa tneg stict poz.itiv epezentand numaul de vapoae de pe mae dupa apaitia vapoului i in caz conta. Restictii 1,; N Coodonatele sunt numee integi stict pozitive mai mid sau egalc ell Nu vo exista doua vase cu aceeasi coodonata x sau eu aceeasi coodonata y. sea.in sea. out Explicatii 5 1 Vapoul amane pc mae Vapoul2 amane pc mae i distugc vapoul Vapoul 3 ese distus de vapouj Vapoul 4 estc distus de vapoul Vapoul 5 amane pc mae, impeuna cu vapoul Pegatiea lotului national de infomatica 2004 Soliqie Un vas va fi epezenat pin pecchea coodonate1o sale (x,y). Multimea vaselo o vom epezenta ca un s ec. Peechilc vo f odonate implicit stict cescato dupa coodonata x (abscisa). Cum nu exista doua vase.cll aceeasi abscisa, la odonae coodonata y nu conteaza, set< pai<int, int> > Vase; Cand citim un vas (X-t Y ), cautamtn set plmul vas (xl,yl) pcntu cae x L>x (acesta se obtine iu timp oganuuic cu functia 1..1-ppe_bound ( i ). Daca un astfel de vas exista i odonata sa yl>y, atunci acest vas va distugc vasu1 (x, y) i afisam -1. Sa obscvam ca este sufident sa facem compaana cu (xl, yl) =uppe_bound (). Dad! am pesupune pin educee 1a absud ca exista un alt vas (x2, y2) cu x2>xl>x si y2>y>yl, atunci vasul (x2, y2) a fi tebuit sa distuga vasul (xl, yl), dec! acesta a fl fost eliminat din set la un pas anteio. Sa analizam acum ce se inampla daca (x y) nu cste distus de un alt vas existent in set. in acest caz, va tebui sa eliminam din set toate vasee pe cae vasu1 x. y) e distuge. Vom pacuge multimca in sens inves, incepand de 13 uppe_.bound () spe inceput (aid sunt vase1e (xl, yl) cu xl<x) i e vom tege (ell functia ease ()) pe cele pentu cae yl<y. $i aid tebuie sa mai facem 0 obsevatie: dind intillnim un vas (xl, y1) pentu,cae x1<x i yl>y,.nu ae Tost sa-continua-m pacugeea, ne opim, deoaece inaintea acestul vas nu mal 'pot- exista---vase cae a putea fi -distuse de (x, y) 213

108 c..; 214 PROGRAMAREA in LMBAJUL CC++ PENTRU LCEU CONTANERE ASOCATVE 215 (deoaece a fi fast distuse de (xl, yl) la un pas anteio). Deducem ca vasele cae tebuie eliminate foneaza un domeniu (cae se teming eu uppe_bound () i Pot fi stese toate deodata, mplementaea utilizand tipul set din STL devine foate simpla $i ae complexi_ tatea O(N log N).! #include <cstdio> #include <set> using nespace std; set< pai<int,int> > Vase; int main () FLE *fin = fopen("sea.in", ""); FLE *fout =.fopen{"sea.out", "w"l; int x, y, n, i; set< pai<int,int> >: :iteato' t, t2, tl; fscanf(fin, "%d", &n); fo (i=o; i<n; i++) { fscanf (fin, "%d %d"" &x, &y) i t = Vase. uppe_bound (make-pai (x, Y)) i if (t!= Vase.end() && t->second > Y) { fpintf(fout, "-l\n"); continue; ) if {! Vase. empty ( ) 1 {fo (.tl=t2=t, --tl; t2!=vase.begin() && tl->second < y; t2 = tl, --tl); Vase.ease(t2, t); ) Vase. inset (make-pai (x. y}) ; fpintf{fout, "%d\n", Vase.size()); } f c Lose t Eout j ; etun 0; Aplicatia 2. Mico Mesteul Vasile ae 0 fima de micopocesoae. Pe 1 ianuaie el isi planifica activitatea pentu umatoaele n zile. Analizand gaficul de poductie pentu cele n zile, Vasile stie ca in ziua i fima sa poate poduce eel mult Pi micopocesoae, costul de poductie al unui micopoceso fiind CPi (lin). Analizand situatia comenzilo, Vasile stie ca in ziua i el tebuie sa liveze exact n-, micopocesoae (li.:s;:n). Micopocesoaele cae nu sunt livate pot fi timise a depozit pentu a fi utilizate ulteio. in noaptea dinte zilele i i i+j. pot fi, depozitate eel. plult"d i micopocesoae, costul depozitaii unui micopoceso 'j fiind cd i (li<n). Ceintd, Scieti un pogam cae sa detemine cae este suma minima pc cae mesteul 1- Vasile tebuie sa 0 cheltuiasca pentu poductie si depozitae astfel lncat sa 1 satisfaca toate comenzile pemu cele n zile. t -: de inn"ae' Fisieul de intae mico. in contine pe pima linie numaul natual n. Pe unatoaele n linii se afla infomatii despe poductie i comenzi. Mai exact, pe cea de a i-a linie dinte cele n se ana [ei numee natuale sepaate pin spatii : Pi CPi n, (lsi5n). Pe umatoaele n-j. linii se afla infomatii despe depozitae. Mai exact, pe linia i dinte cele n-l (15i:::;n-J.) se afla doua numee natuale sepaate pin spatiu d i cd i. Date de iesie Fisieul de iesie mico. out va contine 0 singua linie pe cae va fi scis un singu numa integ : suma minima necesaa pentu satisfaceea utuo comenzilo sau valoaea -1 dad! acest lucu nu este posibil. Restictii si pecizai 1 n '. a Pi, CP,b n, 10 9, pentu lsisn a d i, cd, :5, 10 9, pentu lc::;:i:5,n-l Exemplu mico. in mico. out Soliqie Expticatie in pima zi pot fi poduse maxim 10 micopocesoac. la 4 lei inicopocesoul, i tebuie sa fie livat un singu nicopoceso, Cost penu ziua 1 : 4 lei. Peste noaptc pot f stocate doa 7 mico pocesoae. La costul de 3 lei bucata. 7 3 A doua zi sunt podusc doua micopocesoae cu 2 lei bucata i 3 5 tcbuie sa fie livate sasc. Yom liva cclc doua nicopocesoae podusc plus 4 din depozi (stocatc din pima zi). Cost pcntu ziua 2 : 2*2+(4+3)*4=32. A teia zi pot fi pod use maxim 11 micopocesoae la cosul de 10 lei bucata i tebuie sa fie ltvac 8 micopocesoae. Este pcfeabil sa livam B pocesoae poduse in ziua 3 cu 10 lei bucata. adica in total 80 lei. Cost total: = 116. Competition, 2011 Metoda utilizatil este Geedy. Pacugem in odinc ccle n zile. Pe pacus constuim un multiset de peechi (cost, cantitate). La teceea de la ziua i cate ziua i+l, tebuie adunata la toate elementele din mu. c Ls e t;.valoanea c dj, in.zma.i. adaugan ll. mljt.a a c t; costul de poductie CP.i, si extagem din multi set vaiaua optima de a satua ceeea n i., i - w -' -' -'

109 -' -- ' l J -t i "16 PROGR,\MAREA in UMBAJUL C/C ++ PENTRU LCEU CONTANERE ASOCATVE 2]7 De asenenea, tebuie sa luan in consideae si estictiile de depozitae: pentu a nu depasi d i, extagem din multiset cele mai costisitoae elemente. Pogamu conplet aata astfcl : #include <cstdio> #include <vecto> #include <set> #define NYiliX #define, #define P pai<2ong long, ifdefine mp make-pai using namespace std; int> int main () {feopen("mico.in". "t", stdin) i feopen("mico.out", "wt", stdout); int 11, i; scanf ("%d", &n) i vecto<int> pin), cp(n), n(n), din), cd(n); fo (i=o; i<11; i++) scanf("%d %d %d", &p[ij, &cp[i], &n[i); fo (i=o; i<n-1; i++) scanf("%d!>d", &d[i), &cd[ij); multiset<p > q; long long costdep = 0, total = 0, ez = 0; fo (i=o; i<n; i++) lpaeug in odine eele n zile {q.inset(mp(cp[i.]-costdep, p[i])); ladaug micopoc.esoaele poduee in ziua i total += p[i]; llivez eele n[ij micopocesoae necesae while (!q.empty{) && n[ij > 0) ( lpaeug multisetul q multiset<p >: :iteato it = q.begin{); P souce = *it; int cate = min (n [ij, souce. second); lvoi liva cate nicopocesoae souce. second -= cate; n[ij -= cate; ez += cate * (costdep + souce.fist); ladun costul micopocesoaelo livate q.ease{it) ; if (souce.second > 0) q.inset(souce)i total -::: c;ate;, if (n[ij > 0) lpoblema nu ae solutie {ez = -1; beak; } //adun costuile de depozitae if (i!= n-1) {costdep += cd[i]; lextag din depozit elemente cat timp depasesc llcapacitatea de depozitae while (total> ali]) {multiset<p >: :iteato it = q.end(); --it; P last = *it; q. ease (it) ; long long cate = total-dill total -= last.second; if (last.sec0nd > cate) } pintf{"%lld\l",ez) etun OJ Aplicatia 3. Egal ( last.second -= int(cate)i q.inset(last) i total += last.second; Toata lumca tl sne pe TactoMam, cel cae numaa nodui din aboi mai epede decat isi numaa altii degctelc de la maiui. Zilele tecute, TactoMam s-a gandit sa se "joace" eu N seifui. Cele N seifui sum dispuse sub foma unui aboe (gaf conex aciclic). Consideam vaful 1 ea adacina 'a aboelui. Fiecae seif ae asociata o cheie cu cae seiful poate fi deschis. Din pacate (sau din fe icie), pot exista doua sa,mai multe seifui cae pot fi deschise eu acecasi cheie. Ceiuii Scicti un pogam cae, pentu fiecae seif x, detemina cae este cheia cae deschide eele mai multe seifui din subaboele eu adacina in x. Date de intae Fisieul de intae egal. in conpnc pe pima linie numaul natual N, cpezentand numaul de seifui. Pe umatoaelc N-l linii se gasesc catc doua numee x y, semnificand ca exista muchie n aboe inte seiful x i seiful y. Pe ultima linie se afla N numee natuale, al i-lea numa epezentand chela cae deschidcseifuli.

110 218 Date de iesie PROGRAMAREA in LMBAJUL c/c-- pentru LCEli in fisieul de iesie egal. o u t vetl afisa N linii. Linia i va contine doua numee natuale sepaate pin spatiu, epezentand cheia cae deschide cele mai multe seifui in subaboele ell adacina i si de cae oi apae aceasta in subaboe. Restictii 1 N s n cazul in cae exista mai multe chei ell acelasi numa maxim de apaitu se va afisa eea minima; Memoia disponibila pentu stiva este de maxim 8 MB ] Exemplu Soltqie egal.in egal.out: Algoitmiada 2011 Pentu fiecae nod x din aboe constuim un containe de tip map M, unde M [ c J =n, daca in subaboele cu adacina x cheia c apae de n oi, Pentu aceasta, vom pacuge aboele DFS incepand ell vaful 1. Dupa ce toti fiii vafului x au fast pocesati. putem constui i containeul map pentu vaful x, unificand containeele map asociate fiilo. E posibil sa depasim memoia disponibila. pin umae. dupil ce unificam comaineele fiilo, e putem goli. Da pentu aeeasta, la --- fiecae nod cc, dupa ce am calculat containeul map coespunzato. deeminam si etinem chela ell nuua maxim de apaitii, #include <cstdio> #include <vecto> #include <map> #define NMAX using nanespace stdj int Nj vecto<int> G[NMAX]; map<int, int> M[] int c[nmax], cmax[nmaxj, n[nvillx]; vecto<boo1> viz(nmax, false); map<int, int>: :iteato it; void citie(}; void D'S (int) ; CONTANERE ASOCATVE "= void afisae(); i int main () {citie() ; DFS ll; afisae () ; etun 0; void citie () {FLE * fin=fopen("egal.in", ""}; int t. X, y; fscanf {fin, "%d", &N}; fo {i=o; i<n-l; i++} ( fscanf(fin, "%d %d", &x, &y); G[x].push_backlY); G[y). push_back x) ; ) fo (i=l; i<=n; i++) fscanf(fin, "%d", &c[i]); void DFS(int x) {int i, maxim, chmax; viz [x] =tue; fo (i=o; i<g [x] _size (); ++i) {if l!viz[g[x][ij]) {DFSG[x] [ij); fo lit=m G x][i] ]. begin ) ; it!=m[g[x] [i] ].end{); ++it) M [x] [it->fist) +=it-c-second. M [G x] i] ]. clea ) ; } Mix] [c[x) ]+"; maxim=o; fo (it=m[x].begin(); itl=m[x]. end () i ++it} if (it->second>maxim) {maxim=it-,>second; chmax=it->fist; cmax[x]=chmax; n[x]=maxim; } void afisae () ( FLE * fout=fopen("egal.out", "w"); int x; fo (x=l; x<=nj x++) fpj,nf(fout,"%d %d\n", cma[xl, n]) f c-lo s e f du t ) } ' : 1

111 220 PROGRAMAREA in LMBAJUL cic:--. PENTRU LCEU CONTAN ERE ASOCATVE 221,, -t i -- -,,, '- \ : 7.2. Containeele asociative sotate map Oi multimap Containeul map stocheaza clemente constituite din-o conblnape femata dint-o cheie i 0 valoae asociata cheii. Elementele sunt identificate in mod unic pin intemediul cheii (ell alte cuvinte eheile sunt distincte) si sunt odonate cescato dupa cheie, confom unui citeiu de sotae specificat. Conaineul tul.lmap este asemanato, difeenta constand in faptul di cheile nu sunt neapaa distincte, pot exista mai multe elemente cu aceeasi cheie. Pentu a utiliza aceste clasc tebuie sa includem fisieul antet map: #include <map> Declaatia clasei map: template < class Key, class T, class Compae less<key>, class Alloe = allocato<pai<const Key,T> > > class map; Clasa sablon map ae patu tipui specificate ea paameti : Key - tipul cheii ; T - tipul valotlo ; - Compae citeiul utilizat pcntu compaaca cheilo (implicit se utilizcaza opeatoul <); cieiul de sotae este un pedicat bina cae pimcste ca paameti doua chei (sa spunem cl, c2) si etuneaza tue dac5. cl pcceda confom cieiului de sotae pe c2 ; Alloe - tipul obiecului utilizat pentu alocaea memoiei pentu elenentele containeului ; implicit acesta estc al1ocato<pai<const Key, T>. Declaatia este-similaa $i pentu mult.lma'p. in eazul claselo map/multimap este definit tipul value_type epczentand tipul elemeutelo din containe, ca peeche cheie-valoae astfcl : typedef pei -e.con.se Key, '> value type; Clasele map si nultimap nu pemit modificaea diccta a cheilo elementelo stocate n containe, taa a afeeta integltatca stuctuii. Daca este necesaa modifieaea chcii, extagen din stucua elemcntul eu chela veche ;:;i inseati un element eli 110ua cheie. lteatoii containeelo me.pzmultimap sunt bidiectionali. Desi standadul STL nu specifidi explicit acest lucu, elementele comaineelo map/multimap sunt oganizate inten ca un ahoe bina de diutae echilibat. Acest lucu pemite ca opeatiile de cautae, inseae i extagec sa se ealizeze in timp.l?gaittljic.,.._" _.:. >c Constuctoii si destuctoul Pentu c1asele na.p ZuLtimap sunt definiti constuctoul implicit (ceeaza un containe vid), constuctoul bazat pc un domeniu (ceeaza un containe in cae copiaza elementele dint-un domeniu specifieat), constuctoul de copiee i dcsucoul, cae distuge obiectul, elibcand memoia alocata dinamic. lncepand ell C++ 11, sunt definiji constuctoul de initializae (ceeaza un containe tn cae plaseaza elementele specificate int-o lista de initializae) i constuctoul de mutae (ceeaza un containe in cae muta elementele dint-un containe specificat). Exemple.map<sting,int> C; Ceeaza un containe de tip map in cae cheile sum de tip sting, ia.valotle asociae cheilo sunt de tip into Elementele sunt stocate in odinea lexicogafica a cheilo. t map<int,sting,compnt> c2; Ceeaza un containe de tip map in cae cheile sunt de tip int.. ia valoile.asociate cheilo sunt de tip sting. Elementele sunt stocate in odinea cheilo deflnita de clasa Compnt, cae pemite compaaea a doi integi in functie de ultima cita (deflntta in sectiunea pecedenta). Functiile membe efeitoae la dimensiunea couaineului Pentu clasele ma'p ZnuLtimap sunt definite functiile empty ( ), size () si max_size (), eu semnificatia uzuala., Accesoi Containeele map/multimap contin functiile membe begin (), end ( ), begin (), end () cae etuneaza ieatoi eu semnificatia uzuala. [ucepand eu C+ + 11, sunt definite si functiilc ebegin ( ), cend ( ), ebegin ( ), cend ( ), cae etuneaza cons t.jd t exa t o. Reanintim ca elenentele containeclo map/ multimap sunt odonate dupa chei (confom citeiului de sotae specificat la dec1aae). Pin umae, pimul element al containeului ese pimul confom odinii specificate ("cel cu chela cea mai mica"), ia ultimul element este ultimul confom odiii specificate (.,cel cu chela cca mai mae"). Functiile nembe cae modifica COnlaineul lnseae _. Comaineele map/mul tinap au supaindicate funqii ni."eni.be pentu inseae, ell acelai fomat ca 1a clasele set/multiset, pentu inseaea unui sillgu element.

112 222 PRQGRAMAREA in LlMBAJUL C/C ++ PENTRU UCEU inseaea unui element, indicand 0 pozitie de lncepu a cautan pozitie de inseae, cspcctiv inseaea -unui domeniu. ncepand cu C+ + 11, sunt disponibile si inseaea ell mutae, inseaea uno elemente dint-ohsta de initializae, pecum -5i funcjiile emplace () i emplace_hint () cae ceeaza i inseeaza un cjemcnt. Extagee in clasele map/mul timap este supaincacata funcpa ease () n mod simila cu clasele set/multiset:, segeea unui element a caui pozitie este specificata pint-un iteato, segeea elenentelo dint-un domeniu specificat i espectiv stegeea unui element specifica pin cheia sa (n multimap vo fi stese toate elemenele ell cheia espectiva). Exista de asemenea functia memba clea () cae stege toate elenentele din containe. nteschimbae Functia memba swap () inteschinba containcul cuen cu containeul tansmis ca paametu, Opea/We de cautae Aceleasi functii map/multimap: equal_ange (). dent, dupa cheie. Opeatoul de indexae Exemplull Vom constui un containe de tip map in cae eheije sunt denumii ale lunilo anului, ia valoaea asociata este un nul1a integ epezentiil1d numaul de zile din luna espectiva : : map <sting, int> cl i :, map <sting,int>: :iteato it; de cautae ca la set/multiset sunt definite si pentu c1asele find ( ), count ( ), uppe_bound ( ), lowe_bound ( ), in cazul clasejo map/multimap, cllutaea se ealtzeaza, evi- Un element specific conaineului map consta in faptul caopeaoul de indexae este supaincacat. Acest opeato pemite efeiea diecta la 0 valoae dint-un containe de tip map pin intemedlul cheii asociate. Fie C un containe de tip map. Constuctia C [k] epczmta 0 efctnta la valoaea, asociata cheii k (daca 0 astfel de cheic exista in containeul c). Daca in containeul C nu exists cheia k, atunci se inseeaza in C eheia k i este cuuata 0 efemta la valoaea asociata eheii k. Datoita opeatici de cauac efectuate, execujia aeestui opeato necesita timp logaimic. lncepand eu C+ + 11, este definita si functia memba at (), cae funcnoneaza in mod simila (pineste ca paametu 0 cheie i euneaza valoaea asociata cheii). Difeenja eonsa in faptul ca in cazu in cae cheia nu exisa in containe, functia at () "atunea" exeeptia out_of_ange.! CONTATNERE ASQCATVE 223 cl["ianuaie"]=31i c1["febuaie"]=28i c1["apilie"]:::::30; c1["mai"j=31; fo (it=c1,begin(); it!=cl.end(); ++it) cout«it->fist«' '«it->seeond«'\n'i Dupa execuna acestei secvenje de instuctiuni pe eean va fi afisat : apilie 30 febuaie 28 ianuaie 31 mai 31 Obsevati ca lunile au fost afisate in odinea lexicogaflca a denumiii. Opeatoul de indexae a inseat cheile in containeul el, ia pin atibuie am seta valoaea asociaa cheii. Sa analizam si efectul umatcaei atibuii : cl [" febuaie" ] 29; Daca veji aflsa din nou continutul containeului c 1. vei obseva ca luna febuaie nu a fost din nou inseata in containe, ci doa S-3 nodiflcat valoaea asociata, Exemplul2 Vom constu! acelasi containe pin inseai succesive, eu functia inset () map <sting,int> c2; map <sting,int>::iteato it2; cz.inset (make-pai ( "ianuaie", 31) ) ; c2. inset (make-pai ( "febuaie",28) ) e2. inset (make-pai ( -mei, 31) ) ; c2. inset (make-pai ( "apilie",31) ) ; c2. inset (make-pai (" febuaie", 29) ) ; fo (it2=c2.begin(); it2!=c2.end(); ++it2l cout c-ect2->fist«" «it2->second«' \n '; Executand aceasa secventa veti obseva ea-pentu luna "febuaie" se afiseazil 28 (deoaece chela "fe'bz-ue Le" exisa deja in containe, nu a mai fast inseata 0 data, intucat in map chelle sunt distincte). Daca veti inlocui n declaatii map ell nultimap, dupa executaea secventei de instuctiuni, obtineti pe ecan : apilie 31 febuaie 28 febuaie 29 ianuaie 31 mai 31 Acest ucu se inampja deoaeee intt-un containe de tip mul timap putem insea de mai multe 'oi aeeea i cheie-, -' -' : 1 ;..J

113 ,,, i 214 PROGRAMAREA,iN LlMBNUL CC++ PENTRU LCEU CONTANERE ASOCATJVE 215 Exemplul3 Daca ill containeul cl din pimul exemplu am insea cheia Febuaie, am obseva ca aceasta chele se inseeaza, deoaece compaatla cheilo se ealizeaza facand difeenta inte majuscule si minuscule. Pentu a evia 0 astfel de situatie, YOm defini 110i un citeiu de compaae (Comp S) cae compaa siuile, facand abstactie de difeenta dinte majuscule si minuscule: class CampS {public: beel opeato () {censt st: ing& x, censt sting& y) {cha cx[x.size()+l], cy[y.size()+lj; stcpy(cx,x.cst(}); stcpy(cy,y.c_st{)}; stlw(cx); stlw(cy); etun stcmp(cx,cy)<o; } ; Obsevati ca am tansfomat siuile din sting in si C, am tansfomat majusculele in minuscule (cu functia stlw O.), apoi am ealizat compaaea siuilo tansfonnate eu stcmp (). Vom defini acum containeul c3 utilizand acest citeiu de compaatie. apoi vom insea valoi $i vom ohseva ca lunile stocate in containe sunt distincte : map <sting,int, CampS> c3; map <sting,int, CampS>: :iteato it3; c3 l " ianuaie"] =31; c3["febuaie"j=28; c3 ["apilie"] =30; c3 ["mai"] =31; c3 ["Febuaie" J =29; fe (it3=c3.begin(); it3!=c3.end() ; ++it3) cout«it3->fist«' '«it3->second«'\n'; c out;«-c' \n' ;, Executand aceasta secventa de instuctiuni, obtinem pe ecan : apilie 30 febuaie 29 ianuaie 31 mai 31 Aplicatia 4. Bacon Bacanul din colt e un tip de teaba. in fiecae seaa imi fac cumpaatuile 1a el $i de multe oi l gasesc stand paua taziu pentu,.a face casa". Mai exact, el analizeaza 1ista vanzailo din ziua espectiva si totalizeaza aceste vanzai pe poduse, obtinand astfel un document denumit situatia vanzanlo. in -listavanzailo apae 0 liniepentu ftecaevanzaefacuta sub foma: nume-podus * cantitate ' Cantitatea este expimata intotdeauna in unitatea de masua specifica podusu1ui. Nunele podusujui este sepaat de cantitate pin caacteu1 * (asteisc) pecedat si!umet de cae un singu spatiu. De exemp1u: Cascaval * 2 Bee Tubog * 6 Vaza * 1 Bee Tuhog * 2 Cascaval * 3 in situatia vanzailo, podusele tebuie sa apaa in odine alfabetica. cate un podus pe 0 linie. Pe linia coespunzatoae unui podus este scis numele acestuia umat de * si apoi de cantitatea totals vauduta din podusul espectiv. Caacteul * tebuie sa fie peceda i umat de cate un singu spatiu. De exemplu, pentu lista de vanzai pecedenta situatia vanzailo aata astfe1 : Bee Tubog * 8 Cascaval * 5 Vaza * 1 Fiindca!}i eu sunt un tip de teaba Si nu e mae 1ucu sa-i fac un pogam cae sa geneeze situatia vanzailo, as vea sa fac acest ucu, da... niciodata nu am timp. Ceiud Scieti un pogam cae sa citeasca ista vanzailo dint-o zi si cae sa geneeze siuatia vanzailo. Date de intae Pisieul de intae bacan. in contine pe pima linie numaul natual n, epezentand numaul de vanzai efectuate in ziua espectiva. Umeaza n linii, pe fiecae linie fiind descisa 0 sing3 vanzae, sub fonna dinenunt. Date de iesie Pisleul de iesie bacan. out va contine pe pima linie numaul natual p epezentand numaul de poduse distincte vandute in ziua cspecfva. Pe umatoacle p linii sunt descise podusele vandute, sub foma speclficata in enun], Restictii si pecizai 1 -on-o Nunaul de poduse vandute; 1000 Numele unui podus contine maxim 20 de caactee (litee mai, litee mici i spatii). Evident, un Bune nu incepe Si nu se temina cu spatiu. La 0 vanzae cantitatea nu depaseste 100 de unitati,

114 '26...:,.:."'... v11.1'>.d11. ; LNtHAJUL CfC++ PbNTKU LlCEU Exemplu Solutie bacan.in bacan.out 5 3 Cascaval * 2 Bee Tubog * 8 Bee Tubog * 6 Cascaval * 5 Vaza * 1 Vaza. 1 Bee Tubog 2 Cascaval * 3.campion 2006 Vom citi lista vanzailo linie eli linie int-un sting. De pe fiecae linie extagem cantitatea i denumiea podusuhii. Pentu aceasta identificam pozitia paz a caacteului sepaato *, apoi extagem subsiul s 1 cae incepe la pozitia 0 si ac poz-l caactee (acesta este denumiea), espectiv subsiul cae incepe la pozitia poz+2 si tine pana la sfasitul siulul (aceasta este cantitatea). Convetim siul cae contine cantitatea int-un numa integ x. Vom constui un containe de tip map V in cae cheile sunt denumiile poduselo, ia cantitatile sunt valoile asociate. map <sting, int> V; La fiecae linie citita actuallzam cantitatea existenta in containeul V pentu podusuj espectiv : V[sl] +=x; Reamintin modul de functionae a opeatoului de indexae: cheia s 1 este cantata in map; daca ea nu exista este inseata ; V [s 1] epezinta 0 efeinta a valoaea asociata acestei chei. Complexitatea va fi O(N log ND), unde Neste dimensiunea listei de vailzai, ia ND dimensiunea situanc! vanzallo (numaul de poduse distincte). #include <fsteam> #include <map> #include <sting> #include <cstdlib> using namespace std; ifsteam fin("bacan.in"); ofsteam fout tvbecan. out") ; map <sting,int> V; int main () '! {int n, i paz,'-x; : sting s, sl;! fin»n; fin. get () ; fo (i=o; i<n; i++) ( getline(fin, s); poz=s. find (, *, ) ; sl=s. subst (poz+2) CONTANERE ASOCATVE 227 //extag cantitatea 110 convetesc in integ x=atoi(sl.data()}; sl=s.subst(o,poz-l) ;/extag numele V[sl]+=x; lactualizez map } fout«v.size()«'\n' map<sting,int>::iteato it; fo (it=v.begin(); it!=v.end(); ++it} fout«it->fist«u * "«it->second«'\n'; fout.close U ; etun 0; Aplicatia 5. Radio Laua a dezvoltat ecent 0 pasiune pentu siuile de caactee geneate aleatoiu. Ca sa ajute sa teaca mai uso peste sesiune, pietenii ei s-au gandit sa 0 inveseleasdi si i-au cumpaat un astfel de s de lungime N, continfmd doa litee mid ale alfabetului englez. De dimineaja, Laua a mceput sa asculte muzica la adio si a auzit M cuvinte, toate avand aceeasi lungime L, cae i-au placut foate mult. Aceste cuvinte sunt fomate tot din litee mid ale alfabetului englez. Acum ea i-a doi sa vada, pentu fiecae cuvant, daca acesta apae ca subsecventa in siul pinit cadou. Cum cuvintele sunt destul de lungi, Laua nu este sigua ca le-a auzit coeet, da este convinsa ca nu a inteles gesit mai mul de K litee din fiecae cuvant. Asada, voi tebuie sa ti spuncti, pentu fiecae din celce cuvinte, daca extsta 0 subsecventa de lungime T.J it) _ul pimit cadou astfel incat cuvantul si subsecven!a sa difee in cel mult K pozitil... " Date de intae Pe pima linie a fisieului de intae adio. in se afla patu numee integi N M L K, avand senificatia din, enunt. Pe umatoaea linie, se afla N caactee nesepaate pin spatii ce epezinta siul pimit cadou de fata. Pe unatoaele M linii, se afla cate L caactee nesepaate pin spatii, ce epezinta cuvintele pc cae Laua le-a auzit la adio (asa cum le-a inteles ea). Date de iesie Pisieul de iesie adio.out va contine M linii. Pe linia 1- (l:s::im) yeti afisa 1 daca exists 0 subsecventa in siul pimit cadou de fate cae sa difee in eel mult de K 0., in caz conta. pozitii de al i-.le.:a.c}jyant din flslcul de intae, e:pectiv i, '-", 1 1 u '-" : 1

115 ., -.,...,!, j l,... fj,--.,- 228 Restictii si pecizai Sotujie PRQGRA.MAREA in UMBAJUL C/C++ PENTRULlCEU 1 :s: N :s: < M :s: :s: K :s: :s: L :s: 2500 Pint-un si de litee mici geneat aleato se intelege un st n pozttie. oicae diute itee ae aceeasi pobabilitate de apaitie. Exemplu adio. in anaaemee 1 oaane 1 aaeme enee adio.out cae pe fiecae Pegjiuea lotului national de infomatica, 2010 Yom analiza succesiv cele M cuvinte. Sa notam eu 8 siul de lungimc N i eu C cuvantul euent (de lungime L). Yom denumi distanta dime doua secvente de aceeasl lungime numaul de pozitii pentu cae eaacteele din eele doua secvente sunt difeite. o pima idee a fi sa veificam pentu fieeae subsecventa de lungime L a siului -S daca distauta dinte C si subsecventa espectiva este :;;K. Avand in vedee lungimea siului S si numaul de cuvinte ce tebuie testate, aceasta abodae este mult pea costisitoae ca timp. nceeam pin umae sa educem numaul de compaatli tnte secvente. Pentu aceasta, ven impati cuvanul cuent C in K+1 subsccvente de lungime egala cu Lg=L! (K+1) (eventualele itee amase la sfasit le vom ignoa). Pentu a educe numaul de conpaatii tnte secvente, vom compaa valoilc hash ale secventelo i, doa in caz de egalitate a valailo' hasli, vomcoinpaasecventele, pentu a calcula distants dinte acestea. Pin umae von caleula valoaea hash pentn fiecae secventa de lungime Lg din siul s. Yom consui un containe de tip map in cae pentu fiecae valoae hash etinem pozitiile de inceput ale secventelo dins cae au valoaea hash espectiva. t map< int, veeto<int> > hash; Pentu fiecae subsecventa de lungime Lg: din cuvantul euent C calculan valoaea hash 1 vcfficam daca aceasta valoae hash apae in contatneul de tip map hash. Daca C "se potivcstc" ell 0 subsecventa din s, obligatoiu eel putin una dinte eele K+1 subsecvente ale sale tebuie sa se "potiveasca" eu una dinte subsecventele de lungime Lg le lui s. Daca valoaea hash a unei secvente de lungime Lg din C a fast gasita in containeul hash, atunci pacugem vectoul asociat aeestei valoihash i veificam pentu fiecae pozitiedetncepu dinlista dacli secventade lunghhe-l"cae ncepc a pozitia espectiva se "potivete" ell cuvanul cuent (in sensul ca distanta este :;;K). 1.,,, CONTANERE ASQCATVE Faptul ca siul initial este geueat aleato gaantcaza ca pentu fiecae valoae hash nu Val' exista multc pozitii de inceput cocspunzatoac. dec! nu se vo face multe coupaatii nte secven;e. #include <estdio> #inelude <map> #inelude <vecto> #define NMAX #define MOD #define LMAX 2505 #define BASE 37 using namespace std; int N, M, L, K; cha S [NMAXJ ; map< int, veeto<int> > hash; cha C[LMA.X]; int dist(cha *a, cha *b, int n); void buildhash(int Lg); boel sepotiveste(int paz); int main () {feopen("adio.in", "", stdin); feopen("adio.out", "w", stdout); vecto<int>: :iteato it; int ie, i, j, hashval, ez; scanf ("%d %d %d %d", &N, &M, &L, &K); "scan tv as v 5); int Lg = L!{K+1}; buildhash (Lg) ; fo (ic = 0; ic < M; ++ic) { scanf ("%s", C); fo (ez=i=o; i+lg<=l; ilg) {fo (hashval=j =0; j'<lg; -++j) hashval=(hashvai*base+(c[i+jj-'a'})%mod; if (hash. find (hashval)!= hash.end()) fo (it=hash[hashval].begin(); it!=hash[hashval].end() i++it) ez 1= SePotiveste(*it - i); } pintf("%d\n", ez); int dist(cha *a, cha *b, int n) (int sol=o; fo lint i=o; i<n; ++i) sol+=a[i]!=b[i];..etun sol;.. 229,

116 230 PROGRAMAREA in LMBAJUL C/C++PENTRU LlCEU void buildhash(int Lg) {int hashval = 0, i, coef=1; fo (i=o; i<lg-l && i<n; ++i) hashval=(hashval * BASE + (S[i] - 'a') % MOD: fo (i=l; i<lg; ++i) coef = coef * BASE % MOD; fo (i=lg-l; i<n; ++i) { hashval = (hashval*base + (S[i]-'a')) % MOD: hash [hashval].push_back{i-lg+l); hashval = (hashval - coef*(s[i-lg+l]-'a'») % MOD; if (hashval < 0) hashval += MOD; } bool SePativeste(int poz) { if (paz < 0 paz + L > N) etun 0; etun dist(s + poz, C, L) <= K; CONTATNERE ASOCATTVE scanf("%s", S); int Lg = L (K+1) buidhash (Lg) ; fo (ie = 0; ic < M; ++ie) { scanf("%s", C); fo (ez=i=o; i+lg<=l; i+=lg) {fo (hashval=j=o; j<lg; ++j) hashval=(hashval*base+{c[i+j]-'a'))%mod; pim=hash.lowe_bound(hashval); ultim=hash.uppe_bound(hashval); fo (it=pim; it!= ultim; ++it) ez 1= SePotiveste(it->second - } pintf("%d\n", ez); i); '31, '-.! Putem implementa aceeasi solutie utilizand un multimap in cae inseam fiecae peeche femata dint-o valoae hash si pozitla de inceput coespunzatoae, ji multimap< int, int > hash; n acest mod nu mai fomam un vecto de pozitii de ncepu pentu fiecae valoae hash. n functia buildhash () singua modificae flind nodul de inseae in containe: void buildhash(int Lg) {int hashval = 0, i, coef=l; fo (i = 0; i < Lg-l && i < N; ++i) hashval = (hashval * BASE + (S[i] - 'a'» % MOD; fo (i = 1; i < Lg; ++i) coef = caef * BASE % MOD; fo (i = Lg-1; i < N; ++i) { hashval = (hashval*base + (S[i]-'a'») % MOD; hash.inset(make-pai(hashval,i_lg+1»; hesfiva = thasbvel - eoed*(s[i-lg+l]-'a'») % MOD; if (hashval < 0) hashval += MOD; Cand cautam 0 valoae hash in multimap, vom utiliza functiile lowe_bound () si uppebound () pentu a detemina domeniul de apaitie al valoii (in mod echiva1ent se putea utiliza funcna equal_ange ()). Apoi pacugem acest domeniu si venflcam secventele pentu fiecae pozitie de inccpu din domeniu. Functia oain () se nodifica astfel : int main () { feop.en (" adio. in", "", stdin); feopen(" adio.out", "W ", stdout); mu Lt.dma.p-c Lt;, int.;,>.:",:.i.teato it, pim, ultim;.int ie', i, j,. 'hahvai, e;.' scanf("%d %d %d %d", &N, &M, &L, &K)! } 7.3. Containeele asociative nesotate Pentu a utiliza contalneele asociative nesotate unodeed_set Si unodeed_oultiset, tebuie sa inc1udem fisieul antet unodeed_set: #include <unodeed_set> n mod simila, pentu unodeed_map i unodeed_oultimap, tebuie sa includem fisieul antet unodeed_map: #include <unodeed_map> in geneal, toate consideajiile efeitoae la containeele asociative sotate aman valabile, difeenjele povenind de la oganizae intena a containeelo asociative nesotate. Yom mentiona in continuae doa aspectele pin cae difea : 1. Elementele dint-un containe asociativ nesotat, evident, nu sunt mentinute nt-o anumita odine. 2. nten, elementele unui containe asociativ nesotat sunt oganizate sub foma unei tabele de dispesie (tabela hash). Astfel elementele sunt gupate in blocui denumite buckets, in functie de valoea hash calculata pentu cheia elementu1ui espectiv (eamintim ca pentu containeele setmultiset cheia i valoaea coincid). 3. Datoita modului de oganizae sub foma tabelelo de dispesie, accesul la un element individual a1 containeului este foate apid (opeatiile fiind mai eficiente decat in cazul containeelo asociative sotate), insa pacugeea unui domeniu se ealizeaza mai pujin eficient. 4. teatoii claselo asociative nesotate sunt iteatoi de inaintae. c.:...j, 1 --

117 ,...,,...,,..., : j -t. :,..., 232 PROGRAMAREA in LMBAJUL etc ++ PENTRU LlCEU Declaaea containeelo asocianve nesotate difea de declaaea containeelo asociative sotate datoita modului difeit de oganizae intene (nu mai este specificat citeiul de sotae, in schimb tebuie speciflcata functia hash i un pedicat cae sa pemita identificaea egalitatii cheilo). Deoaece declaajiile containeelo asociative nesotate sum asemanatoae, von exemplifica doa declaatiile pentu unodeed_set i unodeed_map: template < class Key, class Hash = hash<key>, class Ped = equal_tc<key>, class Allcc = allccato<key> > class unodeed_set; Declaaea containeelo asociative nesotate Paametii cae intevin in declaatie sunt : Key - tipul cheilo/valoilo stocate in containe; Hash - functo una (sau pointe 1a 0 functie) cae pimeste ca paametu 0 valoae de acelasi tip cu cheia si eumcaza valoaea hash calculata pentu cheia espectiva.; implicit este utijizat functoul standad hash () (declaat in fisieul antet functional); Ped - pedicat bina cae pimeste ca paameti doua valo! de acelasi tip cu cheile si etuneaza tue daca cele doua chei pimite ca paametn sunt consideate ecbivalente ; implicit este utilizat functoul standad equal_to ( ) (declaat in fisieul antet functional), cae utilizeaza compaatia eu e e ; Alloc - defineste modelul de alocae a memoiei; allocato. Declaatia clsei unodeed_map: Constuctoii si destuctoul implicit este utilizata clasa templae < class,key, class T, class Hash = hash<key>, class Ped = equal_to<key>, c1ass Alloc = class unodeed_map; allocato< pai<const KeY,T> > > Obsevati ca in declaatia clasei uno'de edjmap intevine inca un tip (T) epezentand tipul valo-ilo asociate cheilo. Pentu containeele asociative nesotate sunt supatucacau constuctoul implicit, constuctoul de copiee, de mutae, constuctoul bazat pe un domeniu liii constuetoul bazat pe 0 lista de- initial'izae. i Exemple unodeed_set<sting> cl; Functiile membe publice CONTANERE ASOCATVE 233 Ceeaza un obiect de tip unodeed_set denumit cl CU 0 clemente de tip sting; este utilizat functoul hash () implicit si functoul equal_to pentu conpaaea cheilo. unodeed_set<sting> c2 ( {"ana"," ion", "dan"} ); Cecaza un obiect de tip unodeed_set denumit c2 initializat cu 3 clemente de tip sting; este utilizat functoul hash () implicit si funetoul equal_to pentu eompaaea eheilo. unodeed_set<sting> c3 (c2.begin(), c2.end()}; Cceaza un obieet de tip unodeed_set denunit c3 initializat ell elementele din domeniu! specificat, i unodeed_set<sting> c4 (c2); Ceeaza obiectul de tip unodeed_set denumit c4, copiind elementele din c2. Containeele asociative nesotate au 0 intefata similaa eu containeele asociative satate. Exista aceleasi functii pentu deteminaea dimensiunii i aceleasi functii de modifieae a containeului. Datoita faptului ca iteatoii sunt iteatoi de inaintae, sunt disponibile numai functiile begin ( ), end (), cbegin ( ), cend ( ). in ceea ce piveste functiile de cautae, sunt disponibile. functiile find ( ), count (') i equal_ange ( ). Exista in plus functii efeitoae la tabela hasli : size_type bucket_count() donst noexcept; Retuneaza numude blocui (liuckets) existe?te in containe. size_type max_bucket_count{) canst noexcept; Retuneaza numaul maxim de blocui (buckets) ce pot exista in containe. s i.zej ype bucket_size ( size_type n ) canst; Reuneaza numaul de clemente din bloeul cu numaul n din containe (n<bucket_count (). size_type lau clcet; ( const key_type& k ) canst; Reuneaza numaul blocujui din cae face pate cheia k. float load_facto() canst noexcepc; Reuneaza factoul de incacae a contaiueului (apotul dime numaul de clemente din containe sf uumaulde blocui exisene). Factoul de inclicae detemini'! pobabilitatea de apaitie a coliziunilo in tabela de dispcsie.

118 ..., PROGRAMARE/\ N LMBAJUL etc ++ PENTRU LlCEU CONTANERE ASOCATVE 235 float max_load_facto() Pima foma eumeaza factoul maxim de incacae a tabelei de dispesie. A doua foma stabileste z ca faetoul maxim de incacae a tabelei de dispesie. in cazul ill cae factoul de incacae cucnt este > z, se econstuieste tabela de dispesie (ehash). mplicit factoul maxim de incacae ese 1. O. void ehash ( size_type n ); Daca numaul de blocui (buckets) este ::::n, se econstuieste tabela de dispesie (ehash) astfel incat numaul de buckets sa fie < n. Reconstuctia tabelei de dispesie se ealizeaza automat oi de cate oi factoul de incacae depaseste facoul maxim de incacae. Complexitatea acestei opeatii este liniaa ' in medic, da poate fi patanca in eazul eel mai defavoabil. void eseve ( size_type n ) i conse noexcepti void max_load_facco ( float z ) i Modifidi numaul de blocui din containe astfel incat sa fie adecvat pentu a etine eel putin n elemene. Este posibij sa apaa necesitaea econstuiii abelei de dispesie (daca i> bucket_count*max_load_factol. 2. Cae dinte umatoacle declaatii pentu obiectul M sunt coecte? a. b Execitii i pobleme popuse 1. Sa consideam umatoaea secventa de opeatii : set<int, list> Mj 1: map<cha> Mj c., list<sting> L (5 "mama" ) i : multimap<sting, list<sting> > M(L) i d. C.inset(lO)iC.inset(l) ic.inset(5)j C.inset(l) ic.inset(-30)j fo (it=c.begin()i it!=c.end()j ++it) ' map<int, vecto<int>, geate<int> > Mj. cout«*iti Ce se va afisa pe ecan in cazul in cae declaatia obiectului c este : a. s e t cit.> C i b. multiset<int> Ci -, """',\-: 3. Consideand umatoaea declaatie : map<int,int> C; Cae dinte umatoaele instuctiuni sunt coecte sintactic? a.c[-50]=6; c. C.inset(make-pai(-SO,6)j Da in cazul in cae obiectul C este declaat astfel : multimap<int,int> C; b. C.inset(-50,6)i d. C.push_back(-50,6); 4. Cae diute umatoaele afimatii sunt adevaate? a. in containeele set i multiset cheile &i valoile asociate coincid. b. Nu este pemisa modificaea unei valoi int-un containe de tip s e t Zmu Lt.Laet.. c. Nu este pemisa modificaea unei chei int-un containe de tip napznultimap. d. Pentu toate containeele asociative sotate, elementele sunt oganizate inten ca un aboe bina de cautae echilibat. e. Pimul element dint-un set/multiset este eel eu valoaea cea mai midi, confom citeiului de sotae specificat la declaae. f. Pimul element dint-un map/mul timap este eel cu chela cea mai midi, confom citeiului de sotae specificat 1a declaae. g. EJementele unui containe asociativ sotat pot fi paeuse in ambele sensui. h. Opeatiile de cautae, inseae i stegee pentu containee asociative sotate se executa in timp iogaitmic. i. Accesaea unui element int-un containe asociativ nesotat este mal apida decat accesaea unui element dint-un containe asociativ sotat. J. Niciuna dinte afimatiile pecedente. 5, Ce se va afisa pe ecan dupa executia umatoaei secvente de mstucjiuni? map<int, deque<int>, geate<int> > M; ap.<int,deque<int>, geate<int> >::iteato it; degue<int> : : ftea'to i td; M[20].push_back(3);M[2]. push_back 15) ;M[20].push_back(300); M[200]. push_back (13) ;M[20J.push_back (1) ;M[2]. push_back (0) ; M[20]. push_back (33) ;M[50].push back(ll ;M[200].push_back(8) fo (it=m.begin(); it!=m.end(); ++it) {cout«it->fist«' '; fo(itd=it->second.begin() ;itd!:=ic.->second.end() ;++itd) cout«*itd«' c out,«' vn ' i } 6. Ce se va afisa pe ecan dupa executia umatoaei secventc de instucl iuni '! multimap<sting,int> M; ntl:1timap<sting,.int>: :iteato it; l'j. inset (make_pa:i. ("l-ma", 1)-) im. inset. (ma kejpei.i ' l -Xea ", 2) );" M. inset (make-pai ( "Ana",3) ) i M. inset (make_pai ( "on", 4) ) ; M. inset (make-pai ( "Ana", 5) ) j M_a n ss e t. (make pail ( "Dan", 6) ) : : i., i...' -' -'

119 --«:- 236 M.inset (make-pai ( "Dan" 7) ) ; M. inset (make-pai ( "Dan", 8) ) i fo (it=m.begin(); it!=m.end(); ++itl cout«it->fist«' '«it->second«' \n'; i t=m. lowe_bound (" Ana") i cout«it->fist«' '«it.-c-ee cod-c-c ' vn ' ; it=m. uppe_bound ("Ana") i cout«it->fist«' '«it->second«'\n'; it=m.lowe_bound{ "Dana"); cout«it->fist«' '«it->second«' \n' ; i it=m.uppe_bound("dana"); cout«it->fist«' '«it c s-s Plsleul de intae stones. in contine pe pima linie un numa natual T, epezentand numaul deseui..de.date deest. in continuae, pe liniile 2i si 2i+l este descis at i-lea set de date de test. Pe linia 2 i este scis numaul natual n, ia pe linia 2i +1 sunt n numee natuale sepaate pin spatii, epezentand dimensiunile celo n gamczi, Date de iesie eoond-ce ' vn ' ; 7. Obsevatia eli in cazul poblemei Egal (aplicatia 3) nu este necesa ca in contai, neul map elementele sa fie odonate dupa cheie. mplementati mai eficient solutia acestei pobleme, utilizand unodeed_map. 8. Stones Se dau n gamezi de piete, pe cae doim sa le combinam in-o singua gamada, Pentu aceasta, putem alege doua ganezl i sa le combinam obtinand astfel 0 singua gamada, Pocedeul se epeta pana cand, in final, obtinem 0 singua gamada. Atunci cand combinam doua gamez, consunam enegie egala cu numaul de piete aflate in cele doua ganezi cae se combina. De exemplu, daca vom eombina 0 gamada femata din 3 piee eu 0 gamada femata din 5 piete consumul de enegie va fi egal cu 3+5=8. Ceinta Date fiind n gamezi de piete, deteminati eonsumul minim de enegie necesaa pentu a combina gamezile in una singua. Date de intae PROGRAMAREA in UMBAJUL C/C+-+ in fisieul de iesie stones. out se vo scie T inli, tate una pentu fiecae set de date de test. Pe a a-a linie se va scie un numa natual epezentand consumu! minim de enegie necesaa pentu combinaea ganezilo din al i-lea set de date. Restiqii a < n $: Numaul de piee din oice gamada este :S;100. PENTRU UCEU 1 Jl j. j Exemplu Exemplu pikachu.in CONTANERE ASOCATTVE stones.in stones. out Univesitatea TANJN, Concus de selectie ACM Pikachu Miuna i pateneul ei de aventua, Pikachu, sunt in fata unei noi povodii. Cele doua pesonaje au ajuns Binga un lant muntos 'fomat din N vafui asezate in linie deapta unul dupa altul. Pentu fiecae vaf muntos se cunoaste inaltimea lui. Folosindu-se de puteile sale extaodinae, Pikachu este capabil sa scada sau sa ceasca tnaltimea unui vaf muntos eu a unitate tn-o secunda. Din motive necunoscute muttotlo de and, cei doi pieteni vo sa obtina cel putin K vafu'i montane consecutive cae au aceeasi inajtime int-un timp cat mai scut. Ceiuii Deteminati timpul minim in cae Plkachu poate indeplini aceasta sacina. Date de intae Fisieul de intae pikachu. in va contine pe pima linie doua numee N si K avand semnificatia din enunj. Pe eea de-a doua linie se vo gasi N numee natuale epezentand inaltimile vafuilo muntoase. Date de iesie Fisieul de iesie pikachu. out va contine un singu numa natual T, epezentand timpul minim necesa pentu a obtine eel putin K vafui consecutive ell aceea ii inalnme.. Restictii si pecizai 1 s: N s: ::;; K ::;; N inaltimile munjilo sunt numee poiitive cae se pot epezenta pe inegi de 32 de biti eu semn Rezultatul se poate epezenta pe un integ de 64 de biti cu senn ---.,.-- Expliccuie 237

120 1 '..-". 238 PROGRAMAREA in LMBAJUL etc ++ PENTRU LeEU 10. Submcuix Miuna a gasit pe fundul maii 0 matice ell n.linii si m coloane avand elementele numee natuale. Din motive necunoscute, Miunel vea sa afle cae este eea mal mae submatice patanca ce contine maxim k numee distince. Ceinta Scieti un pogam cae sa detemine latua maxima a unei submatice cae espects conditiile lui Miunel. Date de intae Fisieul de intae submatix. in contine pe pima linie tei numee natuale n m k sepaate pin cate un singu spatiu avand semnificatia din enunt, Pe umatoaele n linii se gasesc cae m nwnee natuale sepaate pin spatiu epezentand valoile din matice.. Date de iesie Fisieul de iesie submatix. aut va contine 0 singua linie pe cae va fi scis un singu numa natual, laua submaticei cautate. Restictii si pecizai 1:S:: n, m s; 300 l:s::k:s::n*'m Exemple submatix.in submatix.out Explicatie Submaticea avand coltul din sanga sus pe pozijia (2, 3) i latua 3 conune doa elemenele 3, 5 i " '''-5 6-7, Olimpiada Najionala de nfomatica, Solutii i indicatii 1. Pincipiile pogamaii oientate pe obiect 1.e;2.c. 2. Pogamaea oientatd pe obiecte fn C++. c; 2. d; 3. a; 4. b, c; 5. c; 6. b; 7. a, b, c; 8. c; 9. a.cu d i C cu d; 10. b; 11.d.; 12.b; 13.a,c; 14.b; 15.b; 16.b; l7.b; 18.d; i9.c; 20.c,e; 21.d; 22. d; 23. b, c; 24. c, f; 25. a. 28. Euclid Vom incepe cautaca solutiei de 1a sfasn : ultima impatie tebuie sa aiba estul O. Aceste doua numee vo fonna pimele elemente ale siului de solutie : (ei i e2)' n concluzie, ea este divizibil ell el. Luand in consideae ca ne iteeseaza cea mai mica peeche cu aceasta popietate c> ej e L i e 2 = 2. Confom penultimului pas al algoitmului lui Euclid e3 mod e 2=el' Adica ne inteeseazacea mai mica...valoae pentu e) mod 2.=:_1 ==> e3=3. Din asta va ezulta ca e.. mod e3=e 2. Adica e 4 mod 3=2 i cea mai mica valoae cae ndeplineste conditia este e4=5.,. Se obseve ca siul se poate defini ell ecuenta e, =1, e 2=2, ek==-,,, elementele sale sunt numee Fibonacci: 1, 2, 3, 5, 8, 13,.. ' ek-l+ ej.:..2 $i. Aceasta metoda gaanteaza, pe, de 0 pane, numaul de past maxim in algoitmuj lui Euclid, iape de alta pate, solutia minima in cazu1 existenjci mai multc peechi cu acelasi numa de pasi, Sa obsevam acea popietate a algoitmului lui Euclid, confom caeia, daca mpatim un numa mai mic cu un numa mai mae, cele ooua numee se vo invesa. AstfeJ putem castiga inca un pas in favoaea solutiei. in concluzie, solutia finala va fi femata din ultimele doua clemente ale siului cescao el<e2<e3<... <e;..l<epn. Numaul de pasl va f p. Avand in vedec maimea datelo de intae, poblema se va ezolva pe numee maio!...1 t,...1

121 240 SOLUT NDCAT SOLUT o5j NDCATil 241 ", i,..., 3. Eiemente de pogamae geneica l.c;2.d;3.c 6. Unific a. Se consnuieste vectoul de fecventa al cifelo. b. deea de a pacuge vectoul $i de a ealiza eliminaile confom enunjului este ineficienta. Ven citi succesiv numeele $i te vom intoduce int-o stiva. La fiecae pas analizam elementul cuent $i elementul din vaful stivei. Daca ese posibil, ealizan unificaea (extagem din stlva elementul de la vaf in acest caz). Nu intoducem insa numaul citit (sau ezultaul obtinut la pecede-uta unifieae) decal atunci cand suntem sigui ca nu mai este posibila 0 alta unificac,d,-,ci poeedeul deseis se epeta cat timp valoaea din vaful stivei $i valoaea- cuentil se pot unifica). 0 aemie specials la unificae tebuie acodea eifejo egale -eu STL. Concepte geneale 1. c; 2. d ; 3. b, d, g, i : 4. Constuim 0 functie de geneae a numeelo aleatoii (ea posibila $j definiea unui functo, da vaianta Cll functia e mai simpiaj : int GenT () { etun (and () %10000) ; Geneaea unui vecto v fomat din numee aleatoii se poate ealiza cu algoitmul geneate () astfel: geneate(f, f+n, GenT); 5. Consutm functia elimin (), cae elimina eifa/eifele din mijloeul numaului : void elimin(int& x) {int 19, ii vecta<int> Ci //extag cifele lui x si e plasez in c in adine invesa while (x) {c.push_back{x%lo) i x/::oo;} /tcalculez lungimea lui x Lqec. size () i //canstuiesc a daua jumatace fo (x::oo, i::olg-li i>lg/2; i--) x-x*10+c[i] //sa una sau daua cife din mijlac i--lg%2?1:2i //cancatenez pima jumatate while (i:>=o) x=x*lo+c [i--j i Pentu a tansfoma toate valoilc dint-un vecto v: fo-::::-_ea.ch(v.begin(), v.end() elimip);" 5. Containee secventiale 1. c; 2. a. c, d; anxama ; 4. b; 5. d; 6. Lista vl va contine , ia ista v2 va fi vida. 7. Lista vl va contine ia ista v2 va contine Mama si Ada vobe nes 10. a, C: 11. a, c ; 15. Ame Solupa 1. Yom utiliza metoda Geedy. Sotam amele de la bau ccscao dupa punctaj. Sotam i amele din camea amelo cescao dupa punctaj. Pacugem in odine cescaoae amele de la bau i le inlocuim pe cele mai miei ame de la bau ell cele mai mai din eamea amejo (dea daca puneajul se uiaeste). Solutia 2. Utilizand inteclasaea a doi vectoi sotan (puteile amelo), insuman pimele n valoi din eei doi veetoi sotaji descescato. Solutia 3. Se odoneaza cescao siul puteilo amelo de la bau $i descesctito siul puteilo amelo de pe peete. Se inlocuieste anna ell cea mai mica putee cu ama eu putee maxima dinte cele aflae pe peete (daca este posibil) i asa mai.depate pana cand nu mai putem alege nimic de pe peete (pbipci) sau nu mai avem anne la dispozitie (m-en}. Suma initials a puteilo pbi va ceste la fieeae nlocuie eu difeenta PCi-pb i 16. Segm Metoda utilizaa este Geedy. Vom defini un tip denumit segment, ea fiind 0 clasa in cae etinem doug date membe: extemitatea initiahi i eea finala, Yom sota segmentele cescato dupa extemitatea finala ; daca exists mai multe segmente ell aceeast extemitate finala, le sotam descescao dupa extemitatea initiala (pentu aceasta putem supalncaca opeatoul <). Vom utiliza doua vaiabile Last si PevLast in cae etinem ultimul punct selectat in multime (ell abseisa maxima pana la momentul cuent) i espeetiv penuitimul punct selecat in muljime. Pacugem acuj11 segmenele in odine. Dad. Las t (ultimul punet selectat) nu apatine segnentului cuent, atunci includem in multime doua noi punete (extemitatea finala a segmentului cuent $i extemitatea finals -1). Daca Last apatine segmentului cuent, veificam oaca $i PevLast: apatine segmentului cuent. Dacg nu, vom include in multime extemitatea finala a segmentului cuent. 17. Campus Poblema se ezolva utilizand un dequeue. Scopul stuctuii ese de a poccsa la fieeae moment elementul minim din deapta e]cmemullli cucnt, pe un inteval eu lungime egaia eu eea a intevalului dine incepuuj 1jiu]ui 1ji elementlll cucnt. Pentu a ealiza acest uem, elememele iului sum pacusc de Ja deapt3,spe stangaiji int9duse in dequeue pin patea deapta impeuna eu un "imp de in'tae" asociat (0 pentu ejementul eel mai din deapt3, 1 pentu unnatoul ee.).

122 u 242 SOLUT NDCAT SOLUTl S NDCATl 243 Elementul inodus la un moment dat "elimina" elementele din deapta dequeue-ului Penu a "ezolva" acest 'cicuit vom spage un pucelus de pe cicuit. cae au valoi mai mai sau egaje eli ej deoaeceniciunuj uu mai poate epezena Apoi facem 0 pacugee DFS din pucelusul spat, pentu a deschide toti pucelusii element minim a deapta. Pentu accesaea 1a un moment dat a unui minim a deapta cae se pot deschide cu cheile cae se objin. Complexitate (memo-ia i timp) :O(N). valid (minimul la deapta unui element cu numaul de odine i (io) cae se affa suficient de apoape de i pentu a tl indus in pefixul cental in i), se vo elimina mai lntai din capaul din stanga elementele cae au "expiat" (adica acele elemente cae sunt 6. Clasele adapto minime la deapa, da se afla pea depate de elementul cuem pentu a inta in 1. componenta pefixului). Acest lucu ll ealizam utilizand timpii de intae ai elementelo a in dequeue. Timpul de intae cae ne intceseaza este eel al elementului inedia b umato sasitutui pefixului cuent. Daca pefixu1 cuent este dat de mijjocuj i, aunci e1enentul cautat este pe pozitia 2* i in si. Confom conventiei de noae a timpilo de intae, suma dinte timpuj de intae in dequeue i nunaul de odine din siul initial aj unui element este i c L, AstfeJ, deducem ca timpul imia de intae cautat este (n-l) -2*i. n acest moment, in capatu! din sanga al dequeue-u1ui se afla minimul la deapta valid diutat. Daca elementul cucnt este nai mae decat ninimul sau din deapta $i este ia andul sau maxim a stanga (mai mae decat toate elementele din stanga sa) aunci el detemina un pefix compus. 18. Secvop Yom utiliza 0 lisa dublu injanluia in cae vom eline intevale1e ce se obtin in uma opeatiilo de invesae (un containe de tip list). nitial lista este constluita dint-un singu element cae epezinta intevalul [1, N]. La fiecae opeatie de invesae X Y: se detenina elemenul siua pe pozitia x ; -se patitioneazll inevalul in cae se afla elementul siuat pe pozitia x in doua intevale; se detemina ejementul suuat pe pozuia y ; se pantnoneaza intevalul in cae se ana elementu1 siua pe pozitia y in ooua intevale; se pacug elementele listei situate inte pozitiile x sl Y i se inveseaza intevaleje coespunzatoae. Pentu a calcula suma elenentelo s x Y este suficient sa pacug toae elenentele din!ista coepunzatq.?l, inteva1elq si!uate)me intevalulhlcae se afla poziia x $i intevalul in cae se a-fjil poziia Y, s detemina sun elementelo din fiecae inteval $i se insumeaza sumele. Evident, 0 atenie speciaja tebuie sa acodam exact intevalelo in cae se afla pozitia x $i espectiv poziia Y (aici nu tebuie calculata suma din tat imevalul $i doa pana la pozitia X, espectiv Y). 19. Chei Puen asocia pobjemei un gaf oientat astfel : 1. vafuile gafului sunl cei N pucelu$j.(numeotati de la 1 la N) ; 2. exista ac de la vaful i Ja \laful j daca cheia puce1u ului j se aim. in pucelu$uj i (i va fi numit pedecesou1lui j). Acesta este un gaf paticula (fiecae vaf j ae exact un pedeceso - notat pe [j J). Vom,.epezenta gafului pin liste de adiacenta. De asemenea vom utiliza un vecto chei: chei [i] ""0, "daca pucelu:5u! i nu a fast deschis, sau n+l, dacii puceluuj i. '-! (OSl dschis. Cat imp mai exista pucelu$i cae nu au fast deschii : alcgcm pimul pucelu inchis; po mind din accst pucelu, constuim "dumul" inapoi pana oblinem un cicuit. 2. S.push( 'a'); S.push( 'm'); cdut«s.top(); s.pop();.ccu t e e s. top () ; S.push('m'); cout«s.top()i s.pop(); coue-ee s. top () ; 3. d; 4. c; 5. b; 9. Swap a) Rezolvaea pesupune folosiea unei stive in cae sunt pastate poz.itiile paanezelo deschise, neimpeecheate Ja momenul cuen. Pentu ezolvaea pimului punct c3.j.1d este imalnia 0 paanteza nchisa se adauga Ja costul total costul paantezei pecche fomate din vaful stivei i paanteza inchisa cuenta. Notam eu C t o t cosul deteminat a punctul a. b) Costul minim cae se poate objine in uma efecuaii unci singue opeatii swap asupa paantezaii initiate este ega1 cu Ceee- 2. Daca exista eel putin 0 posibilitate de a efectua 0 opeajie swap, se va afisa C t o t - 2, a1tfel se va afisa -1 c) Exista patu tipui de peechi de paaneze cae pot fi inteschimbate: ) - se obtine acelasi si deci acelasi cost; ( ( - se obtlne acelasi si deci acelasi cost; ) ( - se obtine un i ell cost suplimenta 2. Oicc. astfel de caz. este edus.-ja situalia umatoae: $iul () () se tans'fo111 i (()); - () - se obine un i cu un cost mai mk eu 2: Oice astfel de caz este edus 1a situatia umatoae: iul (()) se tansfoma in () (). Rezolvaea se face asemanato cu puncu1 a): se pacuge iul iniial constuind stiva in acela$i mod i se comoizeaza de,cate oi se imajnesc paanteze peeche de cost 1. Mai exista un caz paticula in cae iul de la stanga peechii () este paantezat coect, caz in cae swap-ul este invalid deoaece nu se obme 0 paamezae coeca. Exemplu pentu paantezaea {(») (), imeschimband paamezele de pe poziiile 5 i 6 se obline -?iul invalid ( ( ) ) ) {. Pentu a evita situalia pezentata se veifidi daca stiva nu este vida. 10. Valet o configualie este identificata pin poziia ma;:;inii pe cae doim sa 0 scoatem din pacae (ex, ey) i pozitia JocuJui libe (hx, by). Pentu simpjitate (i economic.de memoie) v9m coditica conflgu31ia pin-un numa integ in cae ultimele doua cife sum ex, unnatoa"e1e doua cy, umatoaele dou hx i pimele doua hy. Yom ezolva poblema efecuand un Lee pe configualij:..

123 --,... L J -t 244 SOLUT S NDlCATH SOLUT s: NDCATil '45 1. lnitializam coada ell configuatia initiala (ex, cy t, 1) 2. Cat timp coada nu ese vida i masina nu a ajuns la iesle : - extagen un element din coada _ analizam succesiv vecinii spatiului libel' pe cae se ami masini pacate (adica pozitii vecine pe cae nu sunt stalpi) $i geneam noile configuatii, mutand masinile. invecinate in spauu! libel'; pentu fiecae configuatie geneaa etinem numaul de muuli efectuae pentu a ajunge in configuatia espectiva, apoi intoducem coifiguatia in coada. 11. Pedeceso Solutia optima va utiliza 0 stiva st de lungime n $i un vecto viz, tot de lungine n (viz [k] =-1 daca elementul de pe pozitia k din siva ae succeso sau 0 daca nu ae). Obsevan ca, dad la un moment dat avem in si 0 subsecventa de foma a[i) >a[i+l] >...»a Lj l, atunci este evident di. un element a [k] (j e k si a [j) <a lkl ) ae ca pedeceso pe a [j ], deci ceilalti temeni ai subsecventei nu mai pot avea pedecesoi. Vom intoduce succesiv in siva elementele siului. La fiecae pas, in stiva e1ementeie vo fi pastae in odine stict ccscatoae. Cand citim un element x din si, avem cazuile : 1. x este mai mae decat elenenul din vaful suvei. in acest caz, nscam pe x in suva. 2. x este mai mic decat vaful stivci. Aunci vom extage din stiva toate elementele stivei stict mai mai decat x, ia cele macate in viz cu 0 le comotzam ca fiind fiia pedecesoi. Apoi, a. daca stiva e vida, il punen pe x in suva nenacat (nu ae pedecesoi. lncal ) ; b. deca stiva nu e vida, elenentul din vaf il macam ell 1 (ae pedeceso pe x) i apoi il adaugam pe x nemacat in stiva. " La sfasit. golim stiva pentu a contciza sl elementele amase in stiva nevizitatc. Deoaece fiecae element din si este intodus 0 singua datil in stiva i 0 singua data este extas, complexitatea algoitmului este O(n). 12. Ceza Se poatc utiliza metoda Geedy. Se eliminf succesiv, dinte funzele existentc la un moment dat, funza de cost minim. Toate noduile au costul initial 1. La eliminaea unei funze, se incementeaza cu 1 costul tatajui acesteia. Validitatea metodei ezulta din obsevatia"ca, la eliminaea unei fuiz'e oai-edle", tatal acesteia ;-oate deveni" ftun'za-la andu! lui, da cu un cost',stict mai mae decat al funzei eliminate. Funzele se pot oganiza ca un min-heap, stuctua cae se actualizea{:1i in timp logaitmic. 7. Containee asociative 1. a ; b ; 2. d; 3. map: ac; multimap: c 4. a, b, c, d, e, f, g, h, i; Ana 1 Ana 3 : Ana 5 Dan 6 Dan 7 Dan 8 on 4 Xena 2 Ana 1 Dan 6 on 4 on 4 8. Stones Metoda este Geedy: la fiecae pas se eunesc cole nai mici gamezi. Oganizati gamezile ca un mu1tiset. 9. Pikachu VOl11 analiza cazul in cae Neste egal cu K. in aceasta situatie aspunsul optim se obtine aducand elementele la valoaea medianei (definim mediana unui si cu N elemente ca fiind al N/2-lea element in odine cescatoae). Aceasta este 0 afimatie cunoscua. demonstatla poate fi gasita in catea ntoducee in algoitmi de Comen, Leisseson j Rivest. Pentu cazuile in cae K este mai mic deceit N, obsevam ca nu ae os sa consideam subsecvente de lungime mal mae dedit K. Pentu subsecventa cae ncepe pe pima pozijie puten calcula use mediana i costul aduceii ceiojaltee1emente la aceasta valoae in complexitate O(K log K). in continuae vom pocesa unuatoaelc subsccvenje in odine, incccand sa ecalculam mediana sl cosul in mod eficient. Costul ceut este ega] ell (K/2)*mediana-suna elementelo mai mici ca mediana + suma elementelo mai mai ca mediana- (K-K/2-1) *mediana. Obsevam ca doua subsccvente consecutive difea pin doa doua clemente. De aid tagem concluzia ca avem nevoie de 0 stuctua de date cae sa supote in mod eficient unatoaele opeatii : inseaea unui element, stegeea unui element, gasiea medianei. Pentu aceste' opeajii puem folosi un aboe de intevale sau un aboe echilibat (este suficient un set din STL). Costul se poate ecalcula la fiecae pas in timp constant. 10. Submatix '_c.-. Vom calcula pentu fiecae pozitie latua maxima a submaticei patatice cae ae coltul din deapta jos in pozitia espectiva i cae contine maxim k numee distincte. Vom etine aceste valoi int-o matice best. Obsevam ca best[i] [j] :::; best[i-l] [j -1] + 1. Vom ea1cula valoile maticei best pentu fieeae diagonala independent. in momentul in cae doim sa tecem dint-o stae (i, j) in staea (i +1, j +1), vom inceca sa extindem patatul cu coltul in (i j) cu 0 unitate. Daca noua submatice va conine mai mult de k numee distincte, 0 vom micoa atilt cat este neeesa - mic oaea se face pastand coltul din deapta jos in (i+l, j+l). Pemu a putea efcctua apid opeatiile descise, vom nomaliza yaloile din matice i ne vom mentine un vecto de fecvente. Aceastii solutie ae complexitatea O(N 3 ), deoaece pentu fiecae diagonala vom paeuge fiecae element al matiei de maxim doua oi. ",...

ACCIDENTUL MAJOR-DE LA ÎNCEPUTURI ŞI PÂNĂ AZI

ACCIDENTUL MAJOR-DE LA ÎNCEPUTURI ŞI PÂNĂ AZI COMPONENTELE PROCESELOR DE STRUCTURARE LA NIVEL TERITORIAL pof.univ.d. Daniela-Luminiţa Constantin, Pof.univ.d. Conelia Pâlog, Pof.univ.d. Tudoel Andei, Lect.univ.d. Eika Tuşa, Lect.univ.d. Cistina Tandaş,

Mai mult

Microsoft Word - CURS06.doc

Microsoft Word - CURS06.doc 3. DINAMICA PUNCTULUI MATERIAL. 3.1. PRINCIPIILE MECANICII. Am văzut pe pacusul capitolului pecedent, cinematica, că ştiind o lege de mişcae: x(t) sau v(t) sau a(t), şi condiţiile iniţiale: poziţia iniţială,

Mai mult

Olimpiada Națională de Astronomie şi Astrofizică Aprilie 2019 Proba Teoretică Juniori Barem SUBIECTUL I (2p) 1. De câte ori credeți că ați înconjurat

Olimpiada Națională de Astronomie şi Astrofizică Aprilie 2019 Proba Teoretică Juniori Barem SUBIECTUL I (2p) 1. De câte ori credeți că ați înconjurat SUBIECTUL I (p) 1. De câte oi cedeți că ați înconjuat Soaele odată cu ământul, de când v-ați născut: a) de un numă de oi egal cu număul de zile pe cae le aveți de la naștee b) de un numă de oi egal cu

Mai mult

PROGRAMARE ORIENTATA PE OBIECTE

PROGRAMARE ORIENTATA PE OBIECTE Curs 2 Principiile Programării Orientate pe Obiecte Programare Orientată pe Obiecte Tehnici de programare Programarea procedurală Modul în care este abordată programarea, din punct de vedere al descompunerii

Mai mult

Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane Axa prioritară 1 Educaţia şi

Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane Axa prioritară 1 Educaţia şi Poiect cofiaţat di Fodl Social Eoea i Pogaml Oeaţioal Sectoial Dezvoltaea eelo Umae 007-03 Aa ioitaă Edcaţia şi fomaea ofeioală î ijil ceşteii ecoomice şi dezvoltăii ocietăţii bazate e coaş tee Domeil

Mai mult

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011 Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011 I. NOŢIUNI TEORETICE A. Suprascrierea metodelor O clasă derivată

Mai mult

E_d_fizica_tehnologic_2019_bar_01_LRO

E_d_fizica_tehnologic_2019_bar_01_LRO Exenul de bacalaueat național 09 Poba E.d) Fizică BAREM DE EALUARE ŞI DE NOTARE aianta Se punctează oicae alte modalităţi de ezolvae coectă a ceinţelo. Nu se acodă facţiuni de punct. Se acodă 0 puncte

Mai mult

Slide 1

Slide 1 8.3 ARBORI ŞI AXE Aboii sunt ogane e maşini cu mişcae e otaţie estinate să susţină alte ogane e maşini în mişcae e otaţie şi să tansmită momente e tosiune în lungul axei lo. tansmit momente e tosiune sunt

Mai mult

PROBLEME PALNE {N COORDONATE POLARE

PROBLEME PALNE {N COORDONATE POLARE TLE Lec\ia7 LEC I 7 : PROBLEME PLNE {N COORDONTE POLRE PP(CONTINURE;PROBLEME POLR SIMETRICE ( 7. Paticulaiz`i ale poblemei Mitchell ( fig. 7.a ; 7.b ; 7.c a b c Fig. 7. Cazui paticulae ale poblemei Mitchell

Mai mult

Microsoft Word - 9-Modelarea sistemului mecanic.doc

Microsoft Word - 9-Modelarea sistemului mecanic.doc 9. MODELAREA SISTEMULUI MECANIC Modelaea fidelă a păţii mecanice a unui sistem electomecanic este la fel de impotantă ca şi modelaea maşinilo electice cae acţioneaă aceste sisteme. Sistemele mecanice sunt

Mai mult

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Microsoft Word _POO_Lab_1_Modificari_v01.htm Laborator POO - 00 (draft) 00-00 / 0//00 00_POO_Lab Modificari_v0.htm POO Laborator Modificarea programelor Java. Studiu de caz: programul Salut.java. Varianta care utilizeaza un argument al programului

Mai mult

tehnologii web

tehnologii web Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Tehnologii Web Lector univ. dr. Adrian Runceanu 1 Curs 7 Limbajul PHP (partea II) 2

Mai mult

Microsoft Word - O problema cu bits.doc

Microsoft Word - O problema cu bits.doc O problemă cu bits 1 Tiberiu Socaciu Enunţul Pe pagina Proful de Mate de pe Facebook 2 am primit de la un elev de clasa a IX-a următoarea provocare 3 : Vom oferi două soluţii, una folosind manipulări de

Mai mult

Programarea şi utilizarea calculatoarelor

Programarea şi utilizarea calculatoarelor Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Programarea calculatoarelor Lect.dr. Adrian Runceanu Curs 3 Elemente introductive ale

Mai mult

Ingineria Sistemelor de Programare

Ingineria Sistemelor de Programare Ingineria Sistemelor de Programare Agregarea si Mostenirea mihai.hulea@aut.utcluj.ro 2019 Compozitia si agregarea Relatia dintre obiecte raspunde afirmativ la intrebarea are un/are o Exemple: Telefonul

Mai mult

Paradigme de Programare

Paradigme de Programare Paradigme de Programare Conf. dr. ing. Andrei Olaru andrei.olaru@cs.pub.ro cs@andreiolaru.ro Departamentul de Calculatoare 2019 9 : 1 / 38 Cursul 9 Concluzie Paradigma Funcțională 9 : 2 / 38 Cursul 9:

Mai mult

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici Operatii pe biti Operatorul conditional Operatori Logici

Mai mult

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011 Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011 I. NOŢIUNI TEORETICE A. Ce este un fir de execuţie? Înainte de a defini conceptul de fir

Mai mult

Laborator 3

Laborator 3 Laborator 3 Programare III săptămâna 8-12.10.2018 OBIECTIVE: - Folosirea modificatorilor unei clase (public, abstract, final) - Folosirea modificatorilor de acces în declaraţiile membrilor unei clase Noţiuni:

Mai mult

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa a două funcţii care au acelaşi nume În C++ acest lucru

Mai mult

Top

Top PROGRAMARE ORIENTATĂ PE OBIECTE Tratarea excepțiilor O excepție este o eroare care poate să apară la rularea unui program. Exemple: încercarea de deschidere a unui fișier ce nu există depășirea limitelor

Mai mult

Slide 1

Slide 1 1 PROIECTAREA ALGORITMILOR Lect. univ. dr. Adrian Runceanu 1 Curs Alocarea dinamică de memorie în C++ Conţinutul cursului 1. Tipuri de date. Conceptul de pointer 3. Operatori specifici pointerilor 4. Aritmetica

Mai mult

Lucrarea 10

Lucrarea 10 Lucrarea 10. Studierea facilitatilor senzoriale, de calcul si de comunicatie ale unei placi de tip Arduino 1. Obiectivul lucrarii Lucrarea isi propune sa prezinte facilitatile de calcul, senzoriale si

Mai mult

Paradigme de programare

Paradigme de programare Curs 4 Transparență referențială. Legare statică / dinamică. Modelul contextual de evaluare. Transparență referențială Cuprins Efecte laterale Transparență referențială 2 Efecte laterale Efecte laterale

Mai mult

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Logică și structuri discrete Limbaje regulate și automate Marius Minea   marius/curs/lsd/ 24 noiembrie 2014 Logică și structuri discrete Limbaje regulate și automate Marius Minea marius@cs.upt.ro http://www.cs.upt.ro/ marius/curs/lsd/ 24 noiembrie 2014 Un exemplu: automatul de cafea acțiuni (utilizator): introdu

Mai mult

Proiectarea Sistemelor Software Complexe

Proiectarea Sistemelor Software Complexe Proiectarea Sistemelor Software Complexe Curs 4 Arhitecturi de Sistem Software Bazate pe Tehnologii Middleware. Obiecte Distribuite. Rolul unui arhitect software este foarte asemănător cu cel al unui arhitect

Mai mult

Microsoft Word - CarteC.doc

Microsoft Word - CarteC.doc Transmiterea parametrilor unei funcții Parametrii se transmit de la funcţia apelantă la funcţia apelată prin intermediul stivei. La apelul unei funcţii, pe stivă se crează o înregistrare de activare, care

Mai mult

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011 Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011 I. NOŢIUNI TEORETICE A. Instrucţiuni condiţionale 1. Intrucţiunea

Mai mult

SUBPROGRAME

SUBPROGRAME SUBPROGRAME Un subprogram este un ansamblu ce poate conţine tipuri de date, variabile şi instrucţiuni destinate unei anumite prelucrări (calcule, citiri, scrieri). Subprogramul poate fi executat doar dacă

Mai mult

Microsoft Word - Raspunsul la niste provocari. Partea III..doc

Microsoft Word - Raspunsul la niste provocari. Partea III..doc Răspunsul la niște provocări. Partea a III-a. Re-citirea problemei cu alți ochelari Tiberiu Socaciu Preambulul Ca urmare a unei provocări primite pe pagina Proful de Mate de pe Facebook 1, de la un elev

Mai mult

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode] Detalii de implementare. Declararea variabilelor, transmiterea parametrilor catre subprograme. Declararea variabilelor variabile globale -declarate in afara oricarei functii variabile locale -declarate

Mai mult

C10 – Funcţii test 2D

C10 – Funcţii test 2D Anxa : Funcţii tst D Considam lctonul aflat înt-o goapă cuantică d potnţial în pnţa unui dono poitiv. Considăm că mişcaa lctonului st ciculaă în planul (x, y). Acasta ipotă pmit alga factoului hidognoid

Mai mult

MergedFile

MergedFile PROIECT DIDACTIC Clasa a VI-a Matematică Proiect didactic realizat de Nicoleta Popa, profesor Digitaliada, revizuit de Ioan Popa, profesor Digitaliada Textul și ilustrațiile din acest document începând

Mai mult

E_d_Informatica_sp_MI_2015_bar_02_LRO

E_d_Informatica_sp_MI_2015_bar_02_LRO Examenul de bacalaureat naţional 2015 Proba E. d) Informatică Varianta 2 Filiera teoretică, profilul real, specializările: matematică-informatică matematică-informatică intensiv informatică Toate subiectele

Mai mult

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja far Mohammed ibn Musâ al- Khowârizmî în cartea sa intitulată

Mai mult

CURS

CURS Capitolul Cuvinte-cheie SOAP, XML, REST, ASP.NET, client web, PHP, NuSOAP IH.12.1. Introducere Ce înseamnă serviciile web? Ele înseamnă invocarea la distanță a metodelor, prin web; limbaje și platforme

Mai mult

PPSD

PPSD Modele paralele SPMD Modelul SPMD Comunicarea prin mesaje Message Passing Interface Modelul SPMD Modelul SPMD (Single Program Multiple Data) Acesta este un model adecvat calculatoarelor MIMD In cele ce

Mai mult

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema Laborator 2 - Încapsularea Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema 2.2 Să se modifice funcţiile referitoare la cerc astfel încât parametrul CERC să fie

Mai mult

Microsoft Word - CarteC.doc

Microsoft Word - CarteC.doc INSTRUCŢIUNILE LIMBAJULUI C (2) Instrucţiuni repetitive Instrucţiunea while Instrucţiunea while are formatul: while(expresie) Expresie DA Instrucţiune NU Instrucţiunea while produce în primul rând evaluarea

Mai mult

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de dezvoltare bazată pe un microcontroller ATmega 328P pe 8 biți cu 32kB memorie flash. Placa de dezvoltare conține:

Mai mult

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Logică și structuri discrete Relații. Funcții parțiale Marius Minea   marius/curs/lsd/ 20 octombrie 2014 Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius@cs.upt.ro http://www.cs.upt.ro/ marius/curs/lsd/ 20 octombrie 2014 Relații în lumea reală și informatică Noțiunea matematică de

Mai mult

EXCEL FĂRĂ SECRETE Grafice şi diagrame

EXCEL FĂRĂ SECRETE Grafice şi diagrame EXCEL FĂRĂ SECRETE Grafice şi diagrame Cuprins 1. Introducere... 3 2. Crearea graficelor în Excel... 3 3. Mutarea şi copierea graficelor... 11 2 EXCEL FĂRĂ SECRETE- Grafice şi diagrame 1. Introducere Informaţiile

Mai mult

CERCURI REMARCABILE ASOCIATE UNUI TRIUNGHI CERCURI EXÎNSCRISE Natura vorbeşte în limbajul matematicii: literele acestei limbi sunt cercuri, tri

CERCURI REMARCABILE ASOCIATE UNUI TRIUNGHI CERCURI EXÎNSCRISE Natura vorbeşte în limbajul matematicii: literele acestei limbi sunt cercuri, tri CERCURI REMARCABILE ASOCIATE UNUI TRIUNGHI 19 3. CERCURI EXÎNSCRISE Natura vorbeşte în limbajul matematicii: literele acestei limbi sunt cercuri, triunghiuri şi alte guri geometrice. Galileo Galilei 3

Mai mult

Microsoft Word - lab4.doc

Microsoft Word - lab4.doc Lucrarea 4 Moştenire şi polimorfism Cuprins Relaţia de moştenire în Java...1 Reguli de vizibilitate în contextul relaţiei de moştenire...2 Constructorii şi moştenirea...4 Operatorul instanceof...4 Redefinirea

Mai mult

Microsoft Word - transformari.doc

Microsoft Word - transformari.doc Elemente de geometie computţionlă. Sisteme de coodonte. Tnsfomăi 3D. Sistem de e de coodonte ientt dept: su ientt stâng: su Punct Un punct P din R 3 se pote peci pin: Coodonte cteiene: P) Coodonte omogene:

Mai mult

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiilor (engl. Information Retrieval, IR) constă în găsirea

Mai mult

Manual de utilizare Room Booking System

Manual de utilizare Room Booking System Manual de utilizare Room Booking System Cuprins 1. Autentificare 2. Utilizare aplicatie 2.1. Manage Reservation 2.2. Rooms 2.3. Manage Users 2.4. View Reservations 3. Sectiuni Adaugare/Editare 3.1 Adauga

Mai mult

Metode de programare Proiectarea algoritmilor

Metode de programare Proiectarea algoritmilor Metode de programare Asist.univ.dr. Simona Elena Vârlan Structura curs 2 ore de curs ambele specializări, titular curs Simona Elena Vârlan (cabinet D213, vineri) 2 ore de laborator o dată la două săptămâni,

Mai mult

Analiz¼a Matematic¼a - Curs 6 M¼ad¼alina Roxana Buneci

Analiz¼a Matematic¼a - Curs 6 M¼ad¼alina Roxana Buneci Analiz¼a Matematic¼a - Curs 6 M¼ad¼alina Roxana Buneci Cuprins 4 Spaţii topologice (continuare din cursul 5) 3 4.6 Spaţiul R n............................ 3 5 Calcul diferenţial 7 5. Derivatele funcţiilor

Mai mult

PowerPoint Presentation

PowerPoint Presentation Ocilatoae inuoidale Geneatoae de emnale: inuoidal, detunghiula, tiunghiula, ama, etc. Obtineea unui emnal inuiodal: tiunghi tanf. functional inu geneae emnal inuoidal, etea electiva in fecventa in bucla

Mai mult

Declararea variabilelor

Declararea variabilelor Platforma 3. 1 Instructiuni diverse Declararea variabilelor Tipuri de Date Tipul de dată al unui obiect/variabila specifica tipul informaţiei pe care acel obiect îl poate stoca. Exemplu: numere întregi,

Mai mult

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o manieră de concepere a programelor, potrivit unor reguli bine definite şi independent de limbajul de programare. Scopul

Mai mult

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (vezi Program C) - BUILD: operație complexă prin care

Mai mult

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax:

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax: Documentație pentru accesarea platformei e-learning de catre profesori Platforma de e-learning a facultății poate fi accesată la adresa http://fspac.ubbcluj.ro/moodle. Conturile profesorilor sunt create

Mai mult

LOGICA MATEMATICA SI COMPUTATIONALA Sem. I,

LOGICA MATEMATICA SI COMPUTATIONALA  Sem. I, LOGICA MATEMATICĂ ŞI COMPUTAŢIONALĂ Sem. I, 2017-2018 Ioana Leustean FMI, UB Partea III Calculul propoziţional clasic Consistenţă şi satisfiabilitate Teorema de completitudine Algebra Lindenbaum-Tarski

Mai mult

PowerPoint Presentation

PowerPoint Presentation Circuite Integrate Digitale Conf. Monica Dascălu Curs Seminar Laborator notă separată Notare: 40% seminar 20% teme // + TEMA SUPLIMENTARA 40% examen 2014 CID - curs 1 2 Bibliografie Note de curs Cursul

Mai mult

MyBRD Net Ghid practic de utilizare a Dispozitivului token

MyBRD Net Ghid practic de utilizare a Dispozitivului token MyBRD Net Ghid practic de utilizare a Dispozitivului token 1 2 Dispozitiv Token. Ce este el. Este un dispozitiv care calculează o cod unic, cu ajutorul căruia tu, ca utilizator al aplicației MyBRD Net,

Mai mult

Spatii vectoriale

Spatii vectoriale Algebra si Geometrie Seminar 2 Octombrie 2017 ii Matematica poate fi definită ca materia în care nu ştim niciodată despre ce vorbim, nici dacă ceea ce spunem este adevărat. Bertrand Russell 1 Spatii vectoriale

Mai mult

Fâciu N. Maria-Ema CASA CORPULUI DIDACTIC BRĂILA PROGRAM DE FORMARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A SERIA 1 GRUPA 2 CURSANT: Fâciu N. M

Fâciu N. Maria-Ema CASA CORPULUI DIDACTIC BRĂILA PROGRAM DE FORMARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A SERIA 1 GRUPA 2 CURSANT: Fâciu N. M CASA CORPULUI DIDACTIC BRĂILA PROGRAM DE FORMARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A SERIA 1 GRUPA 2 CURSANT: PROIECTUL UNITĂŢII DE ÎNVĂŢARE ALGORITMI Notă: filmele didactice, dezbaterile, jocurile

Mai mult

Curs 10

Curs 10 Ingineria Programării Design Patterns Modele de proiectare Curs Ovidiu Gheorghieş, ogh@infoiasi.ro Adriana Gheorghieş, adrianaa@infoiasi.ro Model View Controller Cel mai popular model de proiectare Dezvoltat

Mai mult

Tablouri (continuare)

Tablouri (continuare) Vector Dinamic DYNAMIC ARRAY Observații 1. Un tablou este static: nu pot fi inserate sau şterse celule. 2. Vector - tablou unidimensional 3. Reprezentarea vectorilor este secvenţială, adică elementele

Mai mult

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Testare automata: exista un mecanism pentru executia fara

Mai mult

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace 174 12 Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este aceasta văzută de programatorul în limbaj de nivel înalt.

Mai mult

1 UNIVERSITATEA "DUNĂREA DE JOS" din GALAŢI Facultatea: INGINERIE ELECTRICĂ ŞI ELECTRONICĂ Domeniul: INGINERIE ELECTRICA Specializarea: ELECTRONICĂ DE

1 UNIVERSITATEA DUNĂREA DE JOS din GALAŢI Facultatea: INGINERIE ELECTRICĂ ŞI ELECTRONICĂ Domeniul: INGINERIE ELECTRICA Specializarea: ELECTRONICĂ DE 1 UNIVERSITATEA "DUNĂREA DE JOS" din GALAŢI Facultatea: INGINERIE ELECTRICĂ ŞI ELECTRONICĂ Domeniul: INGINERIE ELECTRICA Specializarea: ELECTRONICĂ DE PUTERE ŞI ACŢIONARI ELECTRICE, 1. românii, (EPAE-R)

Mai mult

PowerPoint-Präsentation

PowerPoint-Präsentation Universitatea Transilvania din Braşov Laboratorul de Vedere Artificială Robustă şi Control Metode Numerice Curs 01 Introducere Gigel Măceșanu 1 Cuprins Obiectivele cursului Organizare: Structura cursului

Mai mult

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZENTAREA LUCRARII DE LABORATOR Lucrarea de laborator isi propune sa prezinte modul de creare a blogurilor cu wordpress.com. WordPress

Mai mult

Gabriela Grosu / EDCO 1 SEMINAR NR. 9, REZOLV ¼ARI EDCO, AIA 1:5: Ecuaţii diferenţiale liniare de ordinul întâi şi ecuaţii reductibile la acestea: ecu

Gabriela Grosu / EDCO 1 SEMINAR NR. 9, REZOLV ¼ARI EDCO, AIA 1:5: Ecuaţii diferenţiale liniare de ordinul întâi şi ecuaţii reductibile la acestea: ecu Gabriela Grosu / EDCO SEMINAR NR. 9, REOLV ¼ARI EDCO, AIA :5: Ecuaţii diferenţiale liniare de ordinul înâi şi ecuaţii reducibile la acesea: ecuaţii Bernoulli, ecuaţii Riccai :5:: Ecuaţii diferenţiale liniare

Mai mult

PHP (II)

PHP (II) PHP şi MySQL Bazele de date sunt colecţii de date, aranjate într-o anumită formă Operaţii : - Crearea bazei de date; - Conectarea la baza de date; - Inserarea datelor in baza de date; - Ștergerea datelor

Mai mult

-

- Cursul 6 Expresii în C/C++ (I) https://docs.microsoft.com/en-us/cpp/cpp/expressions-cpp După cum am văzut, într-un program de calcul scris în limbajul C/C++ prelucrarea datelor se realizează printr-o serie

Mai mult

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine numărul de operaţii efectuate de către un algoritm care determină

Mai mult

Sisteme de operare

Sisteme de operare Kismet Universitatea Transilvania din Brasov Lect.dr. Costel Aldea costel.aldea@gmail.com Ce este kismet? Kismet este un detector de retele wireless 802.11, un sniffer si un mecanism de detectare a intruziunilor.

Mai mult

I

I METODA VECTORIALĂ ÎN GEOMETRIE prof. Andrei - Octavian Dobre Această metodă poate fi descrisă după cum urmează: Fiind dată o problemă de geometrie, după explicitarea şi reprezentarea grafică a configuraţiei

Mai mult

Microsoft Word - 6. Codruta_Curta - Valeria_Gidiu.doc

Microsoft Word - 6. Codruta_Curta - Valeria_Gidiu.doc MONEY SENSE- UN PROGRAM DE EDUCAŢIE FINANCIARĂ ŞI NU NUMAI Nora Codruţa Curta, Liceul Teoretic Mihai Eminescu Cluj-Napoca Valeria Gîdiu, Colegiul Tehnic Augustin Maior Cluj-Napoca 1. Introducere Expresie

Mai mult

Programarea şi utilizarea calculatoarelor

Programarea şi utilizarea calculatoarelor Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Programarea calculatoarelor Lect.dr. Adrian Runceanu Curs 6 Instrucţiunile limbajului

Mai mult

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior Universitatea Babeş-Bolyai Cluj-Napoca 1.2 Facultatea Matematică şi Info

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior Universitatea Babeş-Bolyai Cluj-Napoca 1.2 Facultatea Matematică şi Info FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior Universitatea Babeş-Bolyai Cluj-Napoca 1.2 Facultatea Matematică şi Informatică 1.3 Departamentul Informatică 1.4 Domeniul

Mai mult

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj 2.3.5.2 Modul Modbus ASCII Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj este trimis ca doua caractere ASCII (de exemplu, octetul 0x7A este transmis ca doua caractere 0x37 = 7, respectiv

Mai mult

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx SDA (PC2) Curs 9 Liste / Grafuri / Arbori Iulian Năstac Lista dublu înlănțuită Recapitulare Într-o astfel de listă fiecare nod conţine doi pointeri: unul spre nodul următor şi unul spre nodul precedent.

Mai mult

iul13_mart26_tropar_arhanghel_Troparele hramului.qxd.qxd

iul13_mart26_tropar_arhanghel_Troparele hramului.qxd.qxd LA UN ARHANGHEL 13 iulie, 26 martie Tropar, glas 4 T Rt s după Nanu Virgil Ioan @m20! 11!0010!! 1a!1 M ai ma re vo ie vo du le al oş ti lor ce reşti te ru O'!!0'!!A b

Mai mult

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n=1723237 Cifre = {1,2,3,7 Se cere să se utilizeze subprograme care să comunice între ele şi

Mai mult

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai Cluj-Napoca superior 1.2 Facultatea Facultatea de Mate

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai Cluj-Napoca superior 1.2 Facultatea Facultatea de Mate FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai Cluj-Napoca superior 1.2 Facultatea Facultatea de Matematică şi Informatică 1.3 Departamentul Departamentul

Mai mult

Microsoft Word - c6.doc

Microsoft Word - c6.doc Proiectarea structurata top-down a programelor complexe Aplicatie Sa se scrie un program care citeste un fisier continand un text format din cuvinte si determina si afiseaza grupe de cuvinte, grupate in

Mai mult

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere Scopul acestei lucrări de laborator este de a familiariza

Mai mult

MergedFile

MergedFile PROIECT DIDACTIC Clasa a V-a Informatică și T.I.C. Proiect didactic realizat de Anișoara Apostu, profesor Digitaliada, revizuit de Radu Tăbîrcă, inspector școlar Informatică Textul și ilustrațiile din

Mai mult

PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri

PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri noi de date, inexistente pana in momentul acela in

Mai mult

Universitatea Politehnica Bucureşti Departamentul de Fizică Concursul Ion I. Agârbiceanu 2013 Proba teoretică. Rezolvări 1. a). Ecuaţiile de mişcare s

Universitatea Politehnica Bucureşti Departamentul de Fizică Concursul Ion I. Agârbiceanu 2013 Proba teoretică. Rezolvări 1. a). Ecuaţiile de mişcare s Univesitte Politehnic Bucueşti Deptentul e Fizică Concusul Ion I. Agâbicenu Pob teoetică. Rezolvăi. ). Ecuţiile e işce sunt: x && = bx& y && = by& g,5 p Coniţiile iniţile: x ) = y() =, x& () = v cosθ,

Mai mult

Microsoft Word - Curs_09.doc

Microsoft Word - Curs_09.doc Capitolul 7. Proiectarea conceptuală Scop: reprezentarea cerinţelor informale ale aplicaţiei în termenii descrierii complete şi formale dar independent de criteriul folosit pentru reprezentare în sistemul

Mai mult

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai Cluj-Napoca superior 1.2 Facultatea Facultatea de Mate

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai Cluj-Napoca superior 1.2 Facultatea Facultatea de Mate FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai Cluj-Napoca superior 1.2 Facultatea Facultatea de Matematică şi Informatică 1.3 Departamentul Departamentul

Mai mult

Instructiuni pt. depunerea declaratiei A4200 Declaratia A4200 se construieste pornind de la o colectie de fisiere XML, reprezentand fiecare o zi fisca

Instructiuni pt. depunerea declaratiei A4200 Declaratia A4200 se construieste pornind de la o colectie de fisiere XML, reprezentand fiecare o zi fisca Instructiuni pt. depunerea declaratiei A4200 Declaratia A4200 se construieste pornind de la o colectie de fisiere XML, reprezentand fiecare o zi fiscala, precum si un XML rezumat al perioadei numit in

Mai mult

MIdland CT210 manual

MIdland CT210 manual Manual de utilizare in Limba Romana Statie radio Profesionala Midland CT210 Caracteristici Putere emisie: 4W (VHF/UHF) Canale: 128 Coduri securitate: 50 CTCSS si 104 DCS Putere ajustabila: Da, Hi/Low Vox

Mai mult

PowerPoint Presentation

PowerPoint Presentation Meoe Numece e Rezolvae a Ssemelo e Ecuaț Deențale Ș.l. D. ng. Levene CZUMBIL E-mal: Levene.Czumbl@em.uclu.o WebPage: p://uses.uclu.o/~czumbl Se conseă un ssem e ecuaţ eenţale onae cu conţle nţale e ma

Mai mult

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A 1. Operatii cu matrici 1 Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A+B (adunare), aa (inmultire cu scalar), A-B scadere), AT (Transpusa),

Mai mult

Slide 1

Slide 1 ELECTROTEHNICĂ ET An I - ISA CURS 13 Conf.dr.ing.ec. Claudia PĂCURAR e-mail: Claudia.Pacurar@ehm.ucluj.ro REGIMUL TRANZITORIU AL CIRCUITELOR ELECTRICE LINIARE Generaliăţi Definiţie Regimul elecrocineic

Mai mult

Anexa nr. 2 FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior UNIVERSITATEA DE VEST TIMISOARA 1.2 Facultatea FIZICA 1.3 De

Anexa nr. 2 FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior UNIVERSITATEA DE VEST TIMISOARA 1.2 Facultatea FIZICA 1.3 De Anexa nr. 2 FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior UNIVERSITATEA DE VEST TIMISOARA 1.2 Facultatea FIZICA 1.3 Departamentul FIZICA 1.4 Domeniul de studii FIZICA 1.5

Mai mult

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc Software pentru ordonarea multirang a componentelor unei colectivităţi S e prezintă un algoritm pentru dispunerea elementelor unei colectivităţi în raport cu mai multe criterii şi un software aferent,

Mai mult

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx Curs SDA (PC2) Curs 4 Structuri de date (continuare) Iulian Năstac 10. Funcţii pentru alocarea dinamică a memoriei (Recapitulare) Alocarea dinamică este caracteristica prin care un program poate obţine

Mai mult

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior Universitatea Alexandru Ioan Cuza din Iaşi 1.2 Facultatea Facultatea de

FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior Universitatea Alexandru Ioan Cuza din Iaşi 1.2 Facultatea Facultatea de FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior Universitatea Alexandru Ioan Cuza din Iaşi 1.2 Facultatea Facultatea de Matematica 1.3 Departamentul Matematica Didactic 1.4

Mai mult