You are on page 1of 96
& 3 a a a) i g 5 cs 3 oh Viad Hutanu Tudor Sorin ils pwr INFORMATICA INTENSIV (filiera teoreticd, profilul real, specializarea matematici-informaticd, intensiv informatica) Ciclul superior al liceului, clasa a XI-a Editura L&S Soft Bucuresti Copyright 2006 © Las SOFT Toate drepturile asupra acestet luerdri apartin editurli L&S SOFT. Cuprins Reproducerea integral sau partial a textului din aceasta carte este posibil& doar eu acordul in scris al editurii L&S SOFT. Manualul a fost aprobat prin Ordinul ministrului Educatiei i Cercetarii nt, 4446 din 19.08.2006 in urma evaluatii calitative organizate de catre Capitolul 1. Alocarea dinamic& a memoriei. i Consiliul National pentru Evaluarea gi Difuzarea Manualelor si este realizat in conformitate cu programa analitica aprobata prin Ordin al 1.1. Generalitat 4 13.02 2006. 12, Variable de tp pointer... : ministrului Educatiei si Cercetarii nr. 3252 din 13.02. 112.1 Viable dep pair in Basal 12.2, Vanable de tp porter in Gr Reforont!stingiil: 1, Abcare dnamies a merorel,. eta 2. acer aria Pc Prof. Dr, Victor Mitrana, Facultatea de Matematica, Universitatea Bucurest 1.3.2. Alocarea dinamicd in C++... Prof. grad I Valiana Patrigor, Colegiul National Bilingy George Cosbuc tibiae picpuse Raspunsut Tiparut executat la 8.0. LUMINATIPO er Str Luigi Galvani nr, 20 bis, sector 2, Bucuresti Capitolul 2. Liste liniare ...... a es 23 Anul parr: 2008 244, Defi fistelor Pree 23 22 Liste tniare alocate simp inlanflt. 24 ——$——_____ 222.1. Prezentare general... 2 Deserierea CIP a Bibliotecii Nationale n Romaniei 222.2. Crearea 3 afigarea isicior 4 2.23 Opera acura une sts | 28 HUTANU, VLAD 2.2.4 Aplicai ale lstelor linia... 34 Informaticd intensiv : manual pentru ciclul superior al toa2 come eee eres liceului : clasa a XI-a - (filiera teoretie’, profilul real, specializarea 22.43, Operali cu poinoame.... a. eater } matematici-informaticd, intensiv informatics) / Vlad Hujanu, Sorin 29. Laon este tl “39 n earea une iste Iniare aiocald dubia iia af Tudor. - Bucuresti : Editura L & S Soft, 2006 2.3.2, Addugarea unel inregistrari la dreapta....... 7 51 ISBN (10) 973-88037-0-5; ISBN (13) 978-973-88037-0-1 2.33. Adaugarea uneiinregistar a stanga.. TNs 2.3.4. Adéugarea uneiinregista in inter iste a) 1. Tudor, Sorin 2.36. Stergerea une! Ivegistal din interior iste vga 2.36, Stergerea une! inregistrari a stanga/dreapta lst 33 004075.35) 2.3.7. Listarea de ia stanga la creapta liste. {.004(075.35) 38, Listarea do la creapta fa stanga liste 2.4. Stiva implementata ca lst liniara simpiu Tnlanuit 25, Coada implementa ca ft iniaré simply ent Probleme propuse... 7 Raspunsur la testele gril. Editura L&S sort: & Adresa: Str. Stinjeneilor nr. 8, bl. 29, sc. A, et. 1, apt. 12, Sector 4, Bucuresti; Capitolul 3, Metoda Divide et Impera.........sccssseeee 3.1, Prezentare goneral8....ssess Telefon: 021-3321315; 021-6366344; 0722-530390; 0722-573701; BARE faloarea maxima dinr-un vector. Fax: 021-3321315; 3.2.2, Sortatea prin interclasar, E-mail: tsorin@Is-infomat.ro; 3.23. Sortarea rapida.. 3.2.4, Turnutile din Hanoi. Web Site: www.ls-infomat.ro. 3.2.5. Problema taieturior.. Cuprins de gratia... 3.3.1.1. Generalt (vatianta Pasca), 3.3.1.2. Generalitati (varianta C+), 2.8.1.8, Solarea culcrior gi procesul de desenare Pascal ieee) 8.3.2, Curba lui Koch pentru un triunghi echilateral 33.3, Cua lui Koch pentuun pa. 3.8.4. Arborele Probleme propuse RSpUNSUTi orn eree Capitolul 4, Metoda Backtracking, 43, rezetaren metodel a tcand se 412 Pani cre sia baza metodelboctracking. 414 Gimli immer meds tacky 411.4 Problema elon dame 42. Mal pine nin progremul sure 43 Cant meare se core osrgu sce. Eerie probleme colori Nie. 48. Aptcai sie metodo backtracking n combinatca. a. generalize itl oS 442. Proeuscaterian ; 443. Gonare at sir na rie 44.4 Generaoa combnor : 445, Generarea aranementelo 448, Gonorarea tutor partior mali (2,2 45; Aa pin proba cre exo pr lzaeamatloel aciecing. 114 154. Conor. ee 4152. Generaroa patos wel numa naturel 4150, Pteta uno sumo ou banonte dolor data. 4, Proboma bit 458 Problema bio 456, Sania cali Probleme propuse. Indica Capitolul 5. Metoda Greedy ...... 5.1, Generalitati. 15.2. Probleme peniru care matoda Greedy conduce ia sotaia orien. 5.2.1, Suma maxim’. 52.2, Problema planifcari spectacolelor... 5.2.3, Problema rucsaculul (cazul continu)... 5.2.4. 0 problema de maxim... 5.8. Greedy eurist, 5.8.1. Plata unei st 5.8.2 Séritura calull....... a tl 5.3.3, Problema comis-voiajouli. eee Probleme propuse 7 Raspunsuri / Indica Manual de Informatic’ pentru clasa a XI-a 5 Capitolul 6, Programare dinamica ...... 145 6.1. Generali . en cece ctesstct ens AB: 6.2. Problema trlunghiulul, 6.3. Subsir cresc&tor de lungime maxima... 64. 0 problema cu sume, 6.5. Problema rucsacului (cat 6.6, Distanfa Levenshtein.....0.0 6.7. Ineruitrea optima a unui gir de matrice. 6.8. Probleme cu orcinea lexicografics @ permutarilor. 174 6.9. Numérul pattitilor unei muitimi cu n elemente.. 17 Probleme propuse. i a 180 Indicati i F 183 Capitolul 7. Grafuri neorientate ... 7.4. Introducere 72. Defiita gr 7.4, Graf complet. 7.8. Graf partial, subgraf. 7.8, Parcurgerea grafurior neoreta.. 78, Graf conax. 7.9. Componente conexe. 7.0. Cietur . 7.11. Cicks eulerian, graf euierian.. 7.12, Grafurl bipartite... 7.18. Grafuri hemiltoniene. Capitolul 8. Grafuri orientate ........ 8.1, Noflunea de graf orientat...,. 8.2. Memorarea graturior orientate 8.3, Graf partial, subgra........ 8.4, Parcurgarea grafurlior. Drumur, Circuito, 8.5. Graf complet si graf tumeu. 8.6. Graf tare conax. Componente tare conexe. 8.7, Drumuri de cost mintth.c.rnu fs 8.7.1. Introducere.... 8.7.2. Algorimul Roy-Floya.. 8.7.3. Utlizarea algoritmul Roy. Floyd pont Programul va utiliza atéta memorie cat are nevoie. Nu intotdeauna se poate cunoagte, de la inceput, de cat memorie are nevoie, aceasta se decide in timput executari, in functie de datele de intrare. In plus, daca o variabilé nu mai este necosara, exist& posibilitatea sa eliberam memoria ocupata de aceasta. O astfel de abordare conduce ia micgorarea substantial a necesarului de memorie a unui program. Capitolul 1, Alocarea dinamic’ a memoriei in varianta Borland a limbajelor Pascal gi C++, memoria din segmentul de date nu este intotdeauna suficient’, ea este limitata la 64K. Apoldnd la Heap, se mareste memoria disponibila. Anumite structuri de date, pe care le vom studia in am@nunt, se implementeazé cu usurinté in Heap. Un exemplu In acest sens sunt listele liniare, dar acestea sunt prezentate in capitolul urmaitor. 1.2. Variabile de tip pointer 1.2.1, Variabile de tip pointer in Pascal ‘Am ‘nvitat faptul c& memoria interna poate fi privita ca o succesiune de octetl, Pentru ai distinge, acestia sunt numerotati. Definifia 1.3. Numarul de ordine al unui octet se numoste adresa lui. Orice variabila ocupa un numar de octeti succesivi. De exemplu, 0 variabita de tip integer ooupa doi octefi, variabitel, RB Definitia 1.4. Adresa primului octet al variabilei se numeste adresa Observatie. Nu trebuie confundats adresa unei variabile cu valoarea pe care aceasta 0 memoreazal Memorarea adreselor variabilelor se face cu ajutorul variabilelor de tip pointer. = Variabilele de tip pointer se caracterizeaza prin faptul c& valorile pe care le pot memora sunt adrese ale altor variabile. Ele nu pot fi citite, nu pot fi tiparite in mod direct gi, cu 0 exceptie, continutul lor nu poate fi modificat in uma unor operatii aritmetice (de exemplu, nu puter incrementa o asttel de variabild), Limbajul Pascal face distinetie intre natura adreselor care pot fi memorate. Asttel, exist adrese ale variabilelor de tip integer (formand un tip identificat prin sintagma uzuala "pointer cétre variablle de tip integez”), adrese ale variabilelor de tip real (‘pointer catre variabile de tip rea"), adrese ale varlabilelor de tip string ("pointer cétre variabile de tip sting”). Din acest motiy, tipul pointer esto variat. 1 Tn ultimele versiuni ale celor dou jimbaje, memoria din segmentul de date nu mai este limitat&, ci se poate folosi Intreaga memorie disponibila. Din acest punct de vedere, daca se folosesc aceste versiuni, avantajul "memoriel in plus* nu mai poate fi luat in considerare. Manual de informatica’ pentru clasa a Xi-a 9 > && Tipul unei stfel de variabile pointer se declaré ca mal jos: type nune=*tip. 1, Veriabile de tip pointer catre variabile de tip integer. Varlabilele agri, aax2, pot refine adrese ale vatiabilelor de tip intreg. type adr_ints*integer) var adrl,adr2:adz_int) numariinteger) Foc ® Variable de tp pointer catte variable de tip reat. Variable adrewa, b v poate refine adrese ale variabilelor de tip real. type adi : var adzeaa: adz_real; _ 3. Variablle de tip pointer catre variabile de tip inreg. Tipul inzeg este tip record. Variabila adr_inz, poate retine adrese ale variabllelor de tipul inreg. type inregerecord pune rstring[10]7 prenune:string{10]; varata:byte; end; type adr_inregs*inreg: var adr_inrtadr_inreg Observatii intre variabilele de tip pointer sunt permise atribuiri doar tn cazul in care au acelagi tip pointer (retin adrese catre acelagi tip de variabile).. Exemplu: adri, adr2:Sinteger; adr3! *real: Atribuirea adri:=adea este corect4, iar atribuirea adr3:=ade2 nu este coracta. Chiar gi in cazul in care avem tipurile identice, dar descrise diferit, atribuirea nu este posibild. Atribuirea din exemplul de mai jos este eronat, Exemplu: type adrosentintegers var adeliadzese; adraisinteger; adr2inadedy 10 Capitolul 1, Alocarea dinamicé a memoriei Pentru a obfine adresa unei variabile oarecare se foloseste operatorul “a” prefixat. Adresa va fi memorata de o variabii’ pointer catre tipul variabilel a cael adresd a fost returnata de operatorul “e", Pomind de la o variabil& de tip pointer care memoreazi adresa unei variabile, cu alutorul operatorului “*", posttixat, se poate adresa continutul Variabitei a cérei adresd este memoratd. 1. in programul urmator, variabilel x, care este de tip intege: airibule valoarea 3. Variabilei a, de tip pointer catro integer, i se atribule adresa lul x. Pornind de la continutul variabilei a, se afiseaza continutul variabil type adrint=*integer; var a:adzint xtintegers begin t=) arndac; weiteln(a*); ena. 2, in programul urmator, variabilei v, de tip tnxeg, | se atribuie o valoare. Variebilei adresa, de tip pointer catre tnzeg, ise atribuie adresa lui v. Pornind de fa continutul variabi . 8@ afigeaza continutul variabilei v. type adrinreg="inreg; Enregerecord numeratcings varsta:integers end; need? adresa:adrinreg; weiteln(adresa*.nune,' ', adresa*.varsta); ond, Manual de informatica pentru clasa a Xl-a u 1.2.2. Variabile de tip pointer in C++ ‘Am Invatat faptul c& memoria intema poate fi privita cao succesiune de octeti, Pentru 2-idistinge, acestia sunt numerotati Dofinifia 1.3. Numarul de ordine al unui octet se numeste adresa lui. x rice variabila ocups un numar de octefi succesivi. De exemplu, 0 Variabilé de tip Ant ocupa doi octefi (in varianta Bortand C++ 3.0). GS Definitia 1.4. Adresa primului octet al variabilel se numeste adresa variable f Observatit ¥ —Nutrebuie confundats adresa unel variable cu veloarea pe care aceasta 0 memoreazai Y-Uneori in Jo do adresa a unel variable vor folos termenul pointer! Memorarea adreselor variabilelor se face ou ajutorul variabilelor de tip pointer. = Variabilele de tip pointer se caracterizeaza prin taptul c& valorile pe care le pot memora sunt adrese ale altor variabile, Limbajul C++ face distincffe intre natura adreselor care pot fi memorate. Astfel, exist adrese ale variabilelor de tip int, adrese ale variabilelor de tip float, adrese ale variabilelor de tip chax, eto. Din acest motiv si tipul variabilelor de tip pointer este diferit. = Tipul unei variabile de tip pointer se declar’ ca mai jos: tip *nune. 1. Variabile de tip pointer c&tre variabile de tip int. Variabilele adr gi ‘ade2 pot retine adrese ale variabilelor de tip int. Privii declaratia de mai jos: dnt tadri, *adr2; 2. Variabile de tip pointer catre variabile de tip £1oat. Variabila adresa, poate refine adrese ale variabllelor de tip Eeat: float* adress; 2 Capitolul 1, Alocarea dinamic& a memorlei 2) 3 Variabite de tip pointer catre variabile de tip eLev, care la réndul for Exc: suntde tip weruet. Variable a gi b, pot retin adrese ale variabillor de tipul etev. struct elev {char mune [201, prenuna[201; float nota_nate, nota_infor int varstar ” elev “a,b; L Obsorvatii Y — Caracterul “s* poate fi agezat in mai multe feluri, dupa cum se observa: Ant* adety int * adriy int tadri ¥ Pentru a declara mai multe variabile de acest tip, caracterul "*" se trece de fiecare data: 7 int *adri, ‘adr2, *adr3; Y — Odeclatatie de genul "int* ade1, ade2y" are semnificatia cA adr este de tip pointer cétre ane, in vreme ce adr2 este de tip int. Atentle! Aici se greseste deseor => Adresa unei variabile se obfine cu ajutorul operatorutul de referentlere “e", care trebuie s& preceada numeie variabilei: aNume_variabilay adrisknumar; - variabilei adr | se atribuie adresa variabilei numar. Ex: = Fiind dat& o vatiabilé de tip pointer catre variablle de un anume tip, care memoreaz’ o adresa a unei variabile de acel tip, pentru a obfine continutut variabilei a cérei adres& este memoratd, se utlizeaz’ operatorul unar “*", ‘numit gi operator de dereferengiere. 1. Variabila a este initializata cu 7, lar variabila eax este initilizaté cu adresa lui a. Secvenfa afigeazé confinutul variabilei a (7), pornind de la adresa ol, retinutd de ade: Ant ae7, tadrecay cout<". Acesta accoseazé un camp al unei structuri pornind de la un pointer (adresa) catre acea structura. El are prioritatea maxima - vezi tabelul operatorilor. Tipdrirea se poate face si aga: cout <prenune; ‘inte variabile de tip pointer sunt permise atribuiri doar in cazul in care au ‘acelagi tip pointer (retin adrese c&tre acelasi tip de variable). Exemplu: int *adri, raara) float vadr3; 77 Anivializart Atibulrea “adrisadr2" este corecta, iar atribuirea ‘adr3=adx2" nu este corecta. In aceste condi, va puteti intreba: cum putem atribui continutul unei variabile de tip pointer catre tipul x, altel variabile de tip pointer c&tre tipul y? in definitiv, amandoua retin 0 adresé... in acest caz, se utilizeazé operatorul de conversie explicita. De aceasta dat’, pentru exemplul anterior, atribulrea: *ady3=(£loat*)ade?" este corect’,

You might also like