Sunteți pe pagina 1din 18

Tema -Tehnici de cautare Cautarea este una dintre cele mai des intalnite subprobleme in programare.

Ea constituie o parte esentiala din numeroasele procese de prelucrare a datelor. Cautarea este mult simplificata daca datele in care efectuam aceasta operatie sunt sortate (ordonate, aranjate) intr-o anumita ordine (cuvintele in ordine alfabetica, numerele in ordine crescatoare sau descrescatoare). Aceatsta este de doua tipuri : 1) Cautare secventiala : a) intr-un sir oarecare b) intr-un sir ordonat 2) Cautare binara intr-un sir ordonat 1) Cautarea secventiala este unul dintre cei mai simplii algoritmi studiati. El urmareste sa verifice apartenenta unui element la un sir de elemente de aceeasi natura sau a unui numar la un sir de numere. a) Cautarea secventiala se poate face intr-un vector (sir) cu elementele neordonate. Astfel complexitatea algoritmului este liniara : Ex: include !iostream."# int main() $ int n,v%1&&',i,gasit(&,x) cout!!*+ati n : ,)cin##n) cout!!*+ati nr pe care trebuie sa-l cautam: ,)cin##x) for (i(&)i!n)i--) $ cout!!*v%.!!i-1!!.'(*)cin##v%i') / i(1) 0"ile ( (i!(n) 11 (2gasit) ) $ if (v%i'((x) gasit(1) i--) / if (gasit) cout!!x!!* se afla in vector*)

else cout!!x!!* nu se afla in vector*) return &) / b) Cautarea secventiala intr-un tablou (sir) ordonat se face aproximativ la fel ca la un tablou neordonat, diferenta constand in faptul ca in tabloul ordonat cautarea se opreste atunci cand este intalnit un element cu o c"eie mai mare. 3arcurgem sirul de la un capat la celalalt si se compara numarul de cautat cu fiecare numar din sir. 4n ca5ul in care s-a gasit corespondenta(egalitate), un indicator flag este po5itionat. 6a sfarsitul parcurgerii sirului, indicatorul ne va arata daca numarul cautat apartine sau nu sirului. Ex: include!iostream."# using namespace std) int main() $ int n,x,i,gasit,a%7&') cout!!*+ati numarul de elemente ale sirului : ,) cin##n) cout!!*+ati numarul de cautat : ,) cin##x) cout!!*+ati elementele sirului*!!endl) gasit(&) for(i(&) i!n) i--) $ cout!!*a%.!!i!!.'( ,) cin##a%i') if (a%i'((x) gasit(1) / if (gasit((&) cout!!*8umarul nu apartine sirului 2*!!endl) else cout!!*8umarul apartine sirului 2*!!endl) return &) / 9) Cautarea binara este un algoritm de cautare folosit pentru a gasi un element intr-un sir ordonat (tablou unidimensional:vector). Algoritmul functionea5a pe ba5a te"nicii divide et impera. Elementul cautat este ,verificat* cu mijlocul vectorului. +aca elementul este egal cu mijlocul,cautarea se termina. 4nsa daca nu sunt egale, se compara valoarea mijlocului cu cea a elementului de cautat. +aca elementul este mai mare se continua cautarea de la mijlocul listei pana la sfarsit, iar daca este mai mic se continua cautarea de la inceput pana la mijloc. Ex: include !iostream."#

int main() $ int mij,n(;,i,x(1&,v%;'($<,7,=,1&,9&,<7,;>/,st,dr,g(&) st(&) dr(n-1) mij((st-dr):9) 0"ile ( (st!dr) 11 (2g) ) $ if (v%mij'((x) $g(1)brea?)/ else if (v%mij'!x) st(mij-1) else if (v%mij'#x) dr(mij-1) / if (g) cout!!x!!* se afla in vector pe po5itia ,!!mij) else cout!!x!!* nu se afla in vector*) return &) / @peratiile de cautare sunt executate frecvent de catre oameni in viata de 5i cu 5i, ca de exemplu cautarea unui cuvant in dictionar sau cautarea unui numar in cartea de telefon. +esc"idem cartea la intamplare,dorim sa cautam numele ,3opa Andrei ,. Aerificam daca numele se afla in prima partea a cartii sau in a doua parte. Continuam cautarea in portiunea respectiva, actiunea se repeta pana la gasirea numelui. Exercitii 1) Be citesc de la tastatura ,n* numere intregi compuse din cel mult C cifre. +eterminati si afisati minimul si maximul dintre numerele citite. Explicatia exercitiului: 3asul 1: Be citeste primul numar al secventei) 3asul 9: Be atribuie minimului (maximului) valoarea de la pasul 1) 3asul D: Be citeste urmatorul numar al sceventei 3asul <: Be compara minimul (maximul) cu valoarea citita la pasul D) 3asul 7: +aca valoarea de la pasul D este mai mica decat minimul (mai mare decat maximul) atunci minimului (maximului) i se atribuie valoarea citita la pasul D 3asul >: +aca mai sunt valori de comparat in secventa se reia pasul D, iar daca nu minimul (maximul) este disponibil pentru afisare sau prelucrare. include!iostream."# int main() $long i,n,nr,min,max) mai sunt valori,

cout!!*8umere citite(*)cin##n) cout!!*8umarul(*)cin##nr) for(i(1)i!n)i--) $cout!!*8umarul(*)cin##nr) if(nr#max) max(nr) if(nr!min) min(nr) / cout!!*EnFaximul citit(*!!max) cout!!*EnFinimul citit(*!!min) return &) / n nr min,max ( numarul de numere ce se citesc de la tastatura) ( numarul ce se citeste in mod repetat) ( minimul si maximul ce se determina.

9) Be citesc de la tastatura: numarul natural ,n* (&!n<7&) si apoi ,n* numere naturale cu maxim < cifre fiecare. Afisati acestea pe o singura linie de ecran, separate prin spatiu, dar in ordinea inverse a introducerii lor de la tastatura. Explicatia exercitiului: 3asul 1: Be citeste ,n*, apoi se citesc cele ,n* numere si se memorea5a intr-un vector ca valori ale elementelor x%1', x%9', G, x%n') 3asul 9: Be parcurge vectorul secvential, pe indici descrescatori, afisandu-se pe ecran valorile elementelor x%n', x%n-1',G, x%i' separate prin spatiu. include!iostream."# int main() $ int n,x%71',i) cout!!*cate numere se dauH*)cin##n) for(i(1)i!(n)i--) for(i(n)i#(1)iI) cout!!x%i'!!* ,) return &) / $ / cout!!*x%.!!i!!.'(*)cin##x%i')

D) Consideram un tablou unidimensional ,v* de n elemente deja sortat, si trei variabile: ,i*, ,s* si ,m*. Aerificati daca mijlocul vectorului:tabloului unidimensional este egal cu elementul cautat. Explicatia exercitiului: Acest algoritm se incadrea5a in clasa algorimilor elaborate conform te"nicii de programare Divide et Impera. Fetoda verifica de mai multe ori daca mijlocul tabloului unidimensional este egal cu elementul cautat: 1: 4n ca5ul in care este egala, variabila m repre5inta po5itia elementului in vector) 9: +aca nu se indeplineste conditia de egalitate se trece la verificarea po5itiei elementului cautat in vector. D: +aca elementul cautat este mai mic decat elementul din mijlocul vectorului, variabila ,s* ia valoarea lui ,m* iar daca nu variabila i ia valoarea lui m. Jotul se repeta cat timp i este mai mic decat s. include!iostream# using namespace std) int n,x,v%1&',m) int caut (int s, int d) $ if(s#d) return -1) else $ m ((s-d):9) if (x((v%m') return m) if (x!v%m') return caut(s,m-1)) else return caut(m-1,d)) / / int main() $ cout!!*n,x ,) cin##n##x) cout!!*dati ,!!n!!* elemente (in ordine crescatoare).En*) for (int i(1)i!(n)i--) cin##v%i') cout!!*elementul ,!!x!!* a fost gasit pe po5itia: ,!!caut (1,n))

return &) / i ( inceput) m ( mijloc) s ( sfarait ) <) Be citeste de la tastatura numarul natural ,n* (&!n<7&) si apoi ,n* numere naturale cu maxim C cifre fiecare. Afisati toate cifrele impare existente in toate cele n numere date. Cifrele vor fi luate in considerare exact in ordinea de la intrare. +aca toate numerele sunt alcatuite doar cu cifre pare afisati mesajul 8K EL4BJA. Explicatia exercitiului: 3asul 1: Be citeste n, apoi se citesc cele n numere si se memorea5a intr-un vector ca valori ale elementelor x%1', x%9',G,x%n') 3asul 9: Be initiali5ea5a lungimea vectorului auxiliar cu &) 3asul D: Be parcurge vectorul x secvential, pe ranguri descrescatoare,cu scopul de a accesa cifrele fiecarui numar. @rice cifra impara intalnita se va adauga la vectorul M ca si noua componenta. 3asul <: +aca lungimea vectorului M a ramas &se scrie mesajul 8K EL4BJA, iar in ca5 contrar se executa pasul 7) 3asul 7: Be parcurg elementele lui M pe ranguri descrescatoare si se afisea5a acestea fara separator. include!iostream."# int main() $ int n, M%71',i,c) long x%71') cout!!*cate numere se dauH*)cin##n) for(i(1)i!(n)i--) int 6(&) for(i(n)i#(1)iI) 0"ile(x%i') $ $ / c(x%i'N1&) if(cN9) 6--) M%6'(c) x%i':(1&) / if(26) cout!!*8K EL4BJA*) else $ / cout!!*x%.!!i!!.'(*)cin##x%i')

for(i(6)i#(1)iI) cout!!M%i') return &) / O ( vectorul auxiliar) 6 ( lungimea vectorului auxiliar. 7) Consideram un vector ,a*, cu ,n* elemente deja sortate. Aerificati daca mijlocul vectorului este egal cu elementul cautat si afisati cum ca elementul cautat apartine sirului. Explicatia exercitiului: Algoritmul compar numarul de cautat cu elementul aflat la mijlocul sirului (element care se mai numeste si pivot): 1: 4n ca5ul in care cele doua elemente coincid cautarea s-a inc"eiat cu succes) 9 +aca numarul de cautat este mai mare decat pivotul, se continua cautarea in aceeasi maniera in subsirul delimitat de pivot si capatul sirului initial) D: +aca numarul de cautat este mai mic decat pivotul se continua cautarea in aceeasi maniera in subsirul delimitat de pivot si inceputul sirului initial. include!iostream."# using namespace std) int main() $ int i, n, x, st, dr, mijl, gasit, a%7&') cout!!*4ntroduceti numarul elementelor vectorului : ,)cin##n) cout!!*4ntroduceti elementul de cautat : ,)cin##x) for(i(&)i!n)i--) $ cout!!*a%.!!i!!.'( ,)cin##a%i') st(&) dr(n-1) gasit(&) 0"ile (st!(dr 11 gasit2(1) $ mijl((st-dr):9) if (a%mijl'((x) gasit(1) else if (x!a%mijl') dr(mijl-1) else st(mijl-1) /

/ if (st#dr) cout!!*8u s-a gasit elementul cautat 2*!!endl) else cout!!*Elementul cautat apartine sirului 2*!!endl) return &) / Tema -Metode de sortare A. Notiuni teoretice 1.Cosideratii generale Ce dificila ar fi consultarea unui dictionar ,daca nu ar avea cuvintele aranjate in ordine alfabetica.Analog,ordinea articolelor din memoria calculatorului are implicatii majore asupra vite5ei si simplitatii algoritmilor care le prelucrea5a. 8u vom insista asupra enormelor aplicatii ale sortarii dar mentionam ca frabricantii de calculatoare estimea5a ca peste 97N din timpul de rulare al calculatoarelor este ocupat de sortare in conditiile in care toate solicitarile sunt luate in considerare. 2.Terminologie C"iar daca dictionarele definesc sortarea ca pe un proces de separare si aranjare al lucrarilor dupa clase si fel, u5ual programatorii folosesc cuvantul sortare in sens de aranjare a lucrurilor intr-o ordine ascendenta sau descendenta. Be poate utili5a si termenul de ordonare. 3. e!initie "roblema sortarii consta in rearanjarea unei colectii aflate in memoria interna astfel incat c"eile articolelor sa fie ordonate crescator ( eventual descrescator). #.Clasi!icarea algoritmilor$strategii generale) %. %lgoritmi de sortare &rin com&aratii 1. 'ortare &rin interschimbare 9. 'ortare &rin insertie 'ortarea &rin insertie directa si sortare &rin insertie binara 'ortare &rin metoda 'hell

3.Sortare prin selectie Selectie naiva Selectie sistematica B. Algoritmi de sortare prin distribuire 1. Sortarea cuvintelor

9. Distribuire prin segmentare C.Algoritmi de sortare prin numarare D.Sortare topologica E.Algoritmi de sortare utilizand metoda Divide et impera 1. Sortarea prin interclasare 9. Sortarea rapida A. Algoritmi de sortare prin comparatii Au la ba5a determinarii permutarii, comparatii la fiecare moment intre doua elemente a%i' si a%j' din tabloul ce se sortea5a.+upa scopul compararii avem algoritmi definiti astfel: 3rin rearanjarea valorilor a%i' si a%j' in ordine(intersc"imbare) sortarea &rin metoda bulelor$(ubble'ort) 3rin inserarea uneia din valori intr-o subsecventa deja ordonata(insertie). insertie directa sortarea S!E"" # pentru vectori de mari dimensiuni) 3rin selectia unei valori ce se reparti5ea5a pe po5itia finala a ei (selectie) selectia naiva mai rapida decat a bulelor,dar mai putin eficienta comparativ cu: selectia sistematica ce presupune parcurgerea a doua etape: - constructia proprietatii Peap(a) pentru o secventa data -selectarea elementului maximal in mod repetat din secventa curenta ( refacand apoi Peap pentru secventa ramasa) %nsamblul $)ea&) repre5inta o modalitate frecventa de organi5are a datelor utili5ata foarte mult de calculul paralel. (.%lgoritmi de sortare &rin distribuire Algoritmii de sortare prin distribuire presupunand ca se cunosc informatii privind distributia acestor elemente (informatii suplimentare despre elementele). Ktili5am aceste informatii pentru a distribui elementele secventei de sortat in ,pac"ete* ce se vor sorta in acelasi mod prin alta metoda, iar apoi le combinam obtinand lista finala sortata. Algoritmi de sortare a cuvintelor (RadixSort) Ba presupunem ca avem n fise, iar fiecare contine un nume ce identifica in mod unic fisa.Ba sortam manual fisele.6e impartim in pac"ete,fiecare pac"et cupri5and toate fisele ce incep cu aceeasi litera.Apoi sortam fiecare pac"et dupa a doua litera.. s.a.m.d. +upa sortarea pac"etelor le recombinam obtinand o lista liniara sortata. Aceasta metoda poate fi formali5ata intr-un algoritm de sortare a sirurilor de cuvinte (caractere). 3resupunem ca elementele secventei de sortat repre5inta sirul de lungime fixata m ce se definesc peste un alfabet de ? litere. 3utem presupune ca elementele de sortat repre5inta nmere scrise in ba5a ?. +e aceea sortarea cuvintelor este numita in limba engle5a ,radix sort*(radix(ba5e). C.Algoritmul de sortare prin numarare Consta in a numara pentru fiecare element a(i) cate elemenete ,strict mai mici decat el, exista. 8umerele obtinute sunt memorate intr-un vector ?.3e ba5a lui vom rearanja elementele lui a intr-un

alt vector b. D. Sortarea topologica Consideram ca relatia de ordine este partiala. +e ex a9!a1 ,a9!aD!a<. 3roblema consta in crearea unei liste liniare compatibila cu relatia de ordine: daca Ai!Aj atunci Ai precede pe Aj in lista finala.4n exemplul anterior lista finala poate fi (a9,a1,aD,a<) sau (a9,aD,a1,a<) sau (a9,aD,a<,a1). E.Sortare untilizand metoda Divide et impera $.Sortarea rapida #%uic& Sort) repre5entata in 1C>9. 3entru re5olvare este necesara o procedura care trasea5a o portiune de vector cuprinsa intre indicii dati de p si Q. Rolul acestei proceduri este de a po5itiona prima componenta a%p' pe o po5itie ? suprinsa intre p si Q astfel incat toate componentele vectorului curinse intre p si ?-1 sa fie mai mici sau egale decat a%?' si toate componentele vectorului cuprinse intre ?-1 si Q sa fie mai mari sau egale decat a%?'. 2.Mergesor. Kn alt algoritmcare se ba5ea5a pe metoda ,+ivide et 4mpera* este algoritmul de interclasare a doi vectori sortati.El produce ca re5ultat tot un vector sortat, care contine elementele celor doi vectori care se interclasea5a.+Eci pentru a sorta elementele vectorului a , il vom partitiona in doua vom sorta sirurile a%1'Ga%m',a%m-1'Ga%n' apoi vom interclasa subsirurile sortate. Reprezentarea algoritmilor de sortare in pseudocod .Sortarea prin metoda !ulelor ("u!!le Sort) Be parcurge vectorul (operand intersc"imbarii de elemente ,,vecine*)atat timp cat mai exista o parec"e ( a%i',a%a-i' ) cu a%i'#a%a-i'. repeta modificat(fals pentru i(1,8-1 executa daca a%i'#a%i-1' atunci sc"imba a%i',a%i-1' modificat adevarat sf daca sf pentru pana cand modificat(fals Acest algoritm se mai numeste si ,sortarea &rin selectie si interschimbare* , ,sortarea prin propagare* sau ,metoda lenta de sortare* datorita numarului mare de operatii care trebuie effectuate.Buccesul algoritmului este asigurat de trecerea succesiva prin tablou,pana cand acesta este sortat,cu specificatia ca , la fiecare trecere , elementele successive 4 si i-1 pentru care a%i'#a%i-1', vor fi intersc"imbate. Fetoda poate fi imbunatatita daca ,dupa fiecare trecere , se va retine ultima po5itie din tablou in care a avut loc o intersc"imbare, iar trecerea urmatoare se va efectua doar pana la acea po5itie. 4n ca5ul in care la o trecere nu a avut oc nicio intersc"imbare algoritmul se va inc"eia. 3entru o si mai buna optimi5are se poate inlocui trecerea prin tablou intr-un sens cu trecerea in dublu sens .4n acest ca5 , daca la doua treceri successive, intre doua elemente 4 si i-1 nu a avut loc o intersc"imbare atunci la trecerile urmatoare nu se vor inregistra intersc"imbari. Cu toate optimi5arile aduse acestei sortari, ea se dovedeste a fi cu mult mai lenta decat sortarea prin insertie,fiind insa preferata de unii datorita simplitatii, ce nu ridica problem de implementare. 3entru valori suficient de mari ale dimensiunii vectorului ce urmea5a a fi sortat se recomanda utili5area unor algoritmi ce au o complexitate mai redusa si, prin urmare, ofera un timp de calcul mai mic.

include!iostrem."# void main ( ) $ int n,i,aux,terminat,a%7&') cout!!*4ntroduceti dimensiunea vectorului : ,)cin##n) for(i(&)i!(n-1)i--) $ cout!!*a%.!!i!!.'(*) cin##a%i') / terminat(&) 0"ile(2terminat) $ terminat(1) for(i(&)i!n-1)i--) if(a%i'#a%i-1') $ aux-a%i') a%i'(a%i-1') a%i-1'(aux) terminat(&) / / cout!!*Aectorul ordonat este este : ,) for(i(&)i!-n-1)i--) cout!!a%i'!!* ,) cout endl) / 2.Metoda &rin selectie directa @ versiune a metodei de ba5a BelectBort este urmatoarea: pentru i(1,8-1 executa pentru j(i-1 , 8 executa daca a%i'#a%j' atunci sc"imba a%i',a%j' sf daca sf pentru sf pentru Bi aceasta metoda reali5ea5a in final acelasi lucru,insa pe pescurs se modifica si po5itia altor elemente care nu satisfaac conditia de ordine.+aca in algoritmul initial avem Ssc"imbaT doar de n ori, in acest algoritm Ssc"imbaT poate apare de mai multe ori.Complexitatea acestuia este n x n ( n la patrat).

Consideram un vector de elemente compatibile intre ele si dorim sa le ordonam crescator. 3entru aceasta comparam primul element cu toate elementele cu toate elementele care urmea5a dupa el.+aca gasim un element mai mic decat primul atunci le intersc"imbampe cele doua.Apo continuam cu al doilea element al sirului, pe care,de asemenea il comparam cu toate elementele care urmea5a dupa el si in ca5 de inversiune intersc"imbam cele doua elemente.Apo procedam la fel cu al treilea element al sirului iar procesul continua astfel pana la penultimul element al sirului care va fi comparat cu ultimul element din sir. include!iostream."# void main ( ) $ int i,j,n,aux,a%7&' ) cout!!*4ntroduceti numarul de elemente din sir : ,)cin##n) cout!!*4ntroduceti numerele*!!endl) for(i(&)i!n)i--) $ cout!!*a%.!!i!!.'(*)cin##a%i') / ::urmea5a algoritmul de sortare for(i(&)i!n-i)i--) for(j(i-1)j!n)i--) if (a%j'!a%i' ) $ aux-a%j') a%i'(a%j') a%j'-aux) / ::urmea5a afisarea sirului sortat cout!!*Birul sortat este:*!!endl) for(i(&)i!n)i--) cout!!a%i'!!* ,) cout!!endl) / 3.'ortarea &rin insertie Bortarea prin insertie se ba5ea5a pe aceleasi principii ca si cele aplicate de majoritatea jucatorilor de carti,adica dupa ridicarea uncei carti de pe masa,aceasta se asea5a in pac"etul din mana la locul potrivit.Cu alte cuvinte,consideram ca avem vectorul sortat a, iar la ivirea unui nou element care se va adauga vectorului,el va fi pus pe locul potrivit printr-o insertie in interiorul vectorului. *nsertie directa.Este cea mai simpla implementare a algoritmului si se face in felul urmator: Be considera ca primele i elemente al vectorului sunt deja sortate.3entru elementul al (i-1)-lea,din tabloul initial,se va gasi po5itia in care trebuie inserat printre primele i elemente.Joate elementele tabloului de la acasta po5itie si pana la i vor fi deplasate cu o po5itie mai la dreapta iar po5itia eliberata va fi ocupata de elemntul i-1.

pentru j(1 ,8-1 executa x(a%j') i(j-1) cat timp ((i#(&) 11 (x!a%i')) a%i-1'(a%i' i(i-1) sf cat timp a%i-1'(x sf pentru *nserare ra&ida.+eoarece vectorul destinatie este un vector ordonat crescator, cautarea po5itiei in care va fi inserat a%i' se poate face nu secvential ( ca in ca5ul inserarii directe) ci prin algoritmul de cautare binara.Bubvectorul destinatiei este impartit in doi subvectori,se examinea5a relatia de ordine dintre elementul de la mijlocul subvectorului si elementul a%j' si se stabileste daca elemntul a%i' va fi inserat in prima jumatate sau in a doua jumatate.@peratia de divi5are a subvectorului continua pana se gaseste po5itia in care urmea5a sa fie inserat a%i'.

include!iostream."# void main ( ) $ int i,j,n,aux,a%7&') cout!!. introduceti dimensiunea sirului: .!!endl)cin##n) cout!!.+ati elementele sirului:.!!endl) for(i(&)i!n)i--) $ cout!!.a%.!!i!!.'(.)cin##a%i') / for(j(1)j!n)j--) $ aux(a%j') i(j-1) 0"ile (aux!a%i' 11 i#(&) $ a%i-1'(a%i') i(i-1) / a%i-1'(aux) / cout !!.Birul ordonat este:.) for(i(&)i!n)i--) cout!!a%i'!!. .) cout!!andl) / "+,(-EME 1. Bubprogramul ordonare primeste prin parametrul x un tablou unidimensional cu cel mult 1&& de elemente ,numere reale, iar prin parametrul n un numar intreg ce repre5inta numarul efectiv de elemente ale tabloului x. Bubprogramul ordonea5a crescator elementele tabloului si furni5ea5a tabloul ordonat prin tot parametru x. Bcrieti un program C:C-- care citeste de la tastatura doua numere naturale n si m (1!(n!(1&& si m!(n) , si apoi un sir de n numere reale distincte. Uolosind apeluri utile ale subprogramului ordonare,programul afisea5a pe prima linie a ecranului cele mai mari m elemente din sirul citit (in ordinea crescatoare a valorilor lor), iar pe a doua linie a ecranului, cele mai mici m elemente din sir ( in ordinea descrescatoare valorii lor). 8umerele afisate pe aceeasi linie vor fi

separate prin cate un spatiu. daca n(C m(D sirul este (1<.9,>&,-;.7,-99,DD.=,=&,<,1&,D) atunci se va afisa pe ecran: DD.= >& =& D -;.7 -99 include!iostream."# include!iomanip."# float a%1&&',m,n) void ordonare (float x%1&&',int n) $int i,j,final(&,aux) 0"ile (final((&) $ $final(1) for (i(1)i!(n-1)i--) if(x%i'#x%i-1') (final(&)aux(x%i')x%i'(x%i-1')x%i-1'(aux)/ / / / void citire ( ) $ do $ cin##n##m)/ 0"ile ((n!1) V V (n#1&&) V V (m!1) V V (m#n))) for(int i(1) i!(n)i--) cin##a%i') / void main ( ) $ citire ( ) ) ordonare (a,n) ) for (int i(n-m-1 ) i!(n) i--) cout!!set0(>)!!setprecision(9)!!a%i') cout!!endl) for(i(m)i#(1)i--) cout!!a%i'!!. .) / 9. Bcrieti programul C:C-- care citeste de la tastatura un numar natural n (1!(n!(CC),impar, si construiesete in memorie un tablou unidimensional A((A1,A9,...,An) cu elementele multimii $1,9,...,%(n-1):9', iar elementele de pe po5itii pare sirului descrescator n,n-1,..., %(n-1):9'-1. pentru n(11 se va construi tabloul A: 1 11 9 1& D C < = 7 ; > Elementele tabloului se afisea5a pe ecran,separate prin cate un spatiu. include!iostream."# ofstream f(.sir.txt.)) int a%1&&&&',n) void main( ) $int i) 0"ile (n!& V V n9((&)) a%1'(1) for (i(9)i!n)i(1-9) $ a%i-9'(i:9-1) a%i'(n-1-i:9) /

for(i(1)i!(n)i--) cout!!a%i'!!. .) / D) Uisierul matrice.txt contine pe primul rand doua valori naturale m si n repre5entand numarul de linii si respectiv coloane ale unei matrice a,iar pe urmatoarele m linii cate n valori intregi cu maxim < cifra fiecare, separate prin cate un spatiu,repre5entand elementele matricei a. Be cere sa se afise5e pe ecran un sir de 9W(n-m)-< numere ordonate crescator ,sir format din elementele alfate pe c"enarul exterior al matricei a. C"enarul exterios este format din prima linie,ultima linie,prima coloana si ultima coloana. Alegeti un algoritm de re5olvare eficient din punct de vedere al gestionarii memoriei. daca fisierul matrice.xt contine: D < >;1C D&9= 7<=7 se va afisa: 1 D < 7 7 > ; = = C Bcrieti programul C:C-- corespun5ator. include!iostream."# include!fstream."# ifstream f(.matrice.txt.)) void main( ) $ int s(&,n,m,i,j,t,a%1&&',x) f##m) f##n) t(&) for(i(1)i!(n)i--) $t--)f##a%t')/ for(j(9)j!(m-1)j--) for(i(1)i!(n)i--) $f##x) if(i((1 V V i((n) $t--)a%t'(x/ / for(i(1)i!(n)i--) (t--)f##a%t') for(i(1)i!t)i--) for(j(j-1) j!(t)j--) if (a%i'#a%j') $int aux-a%i') a%i(a%j') a%j'(aux) / for (i(1)i!(t)i--) cout!!a%i'!!. .) f.close( ) / <) Bcrieti un program C:C-- care citeste de la tastatura un numar natural nenul n (n!(1&&& ) si apoi n numere naturale, de maximum < cifre fiecare,repre5entand elementele unui tablou unidimensional. 3rogramul afisea5a mesajul X+AX in ca5ul in care elementele tabloului pot fi rearanjate astfel incat sa forme5e o progresie aritmetrica, iar in ca5 contrar afisea5a mesajul X8KX . daca n(> si tabloul unidimensional are valorile 7 1& D& 17 97 9& --# at se va afisa X+AX .

include!iostream."# include!conio."# int n,a%1&&') void main( ) $ do $printf(.Nd n(.)) ::cout!!.n(.) scandf(.d.,1 n))cin##n) 0"ile(n!(& V V n#1&& ) for(int i(1)i!(n)i--) $printf(.a%Nd'( .,i) ::cin##a%i') int t.man) do $t(&) for(int i(1)i!n)i--) if (a%i'#a%i-1' ) $man(a%i')a%i'(a%i-1') a%i-1' (man) t(1) / 0"ile(t) ) int ?) ?(a%9'-a%1') t(1) for(i(9)i!n11t)i--) if(a%i-1'-a%i' 2(?) if(t) printf(En +A.)) ::cout!!.+A. else printf(.En 8K.) ::cout!!.8K.)getc"()) / 7) Uisierul text 8KFERE.48 contine , pe mai multe linii,cel mult D&&&& de numere naturare nenule mai mici sau egale decat 7&&,despartite prin cate un spatiu.Bcrieti programul C:C-- care afisea5a pe ecran, in ordine descrescatoare, despartite prin cate un spatiu, toate numerele care au aparut exact o singura data in fisierul 8KFERE.48 . +aca fisierul 8KFERE.48 contine numerele: 9 9D D< D = C C 9D > = C 9 < 7 9D C Be vor afisa urmatoarele: D< > 7 < D include!iostream."# void main ( ) $ int v%7&&',n,i,x) for(i(1)i!(7&&)i--) v%i'(&) do$ fin##x) v%x'(v%x'-1) / 0"ile(2fin.eof( ) )) i(7&&)

0"ile(i#(1) $ if(v%i'((1)cout!!i!!. .)i-/ fin.close( )) / >) Be dY un tablou a cu n elemente Zntregi. BY se reali5e5e sortarea crescYtoare a elementelor tabloului. a I tabloul unidimensional) n I lungimea tabloului) aux I pentru intersc"imbul elementelor (de acela[i tip cu elementele tabloului)) i I contor (utili5at pentru parcurgerea tabloului)) f I variabilY logicY (se utili5ea5Y pentru a [ti dacY s-a fYcut cel pu\in o opera\ie de intersc"imbare la parcurgerea tabloului). Be ini\iali5ea5Y variabila f cu 1 (adicY se presupune cY [irul este sortat)) Be Zncepe parcurgerea tabloului plec]nd de la i(& (primul element al tabloului)) Be comparY elementul a%i' cu elementul urmYtor a%i-1': +acY a%i' # a%i-1' atunci se reali5ea5Y intersc"imbul celor douY elemente [i variabila f prime[te valoarea &) Be trece la urmYtoarea po5i\ie Zn tablou prin incrementarea lui i) Be continua parcurgerea tabloului fYc]nd compara\iile necesare p]nY c]nd i ajunge la valoarea n-9) Be reia algoritmul Zncep]nd cu pasul 1 c]t timp f(&, C]nd f rYm]ne 1 atunci ZnseamnY cY tabloul este sortat crescYtor (la ultima parcurgere nu s-a reali5at nici un interc"imb de elemente). include!iostream."# int a%9&',aux,f) unsigned int n,i) void main (void) $ cout!!.n(.) cin##n) for (i(&)i!n)i--) $ cout!!.a%.!!i-1!!.'(.) cin##a%i') / do $ f(1) for(i(&)i!n-1)i--) if (a%i'#a%i-1') $ aux(a%i') a%i'(a%i-1') a%i-1'(aux) f(&) / / 0"ile(2f)) cout!!.sirul sortat este.!!endl) for (i(&)i!n)i--) cout!!a%i'!!. .) /