Sunteți pe pagina 1din 56

DIVIDE ET IMPERA Folsoind metoda sa se afiseze suma primelor n numere naturale. N se citeste de la tastatura.

PRIMA METODA var n:byte; function suma(p,u:byte):integer;{p-pozitia primului element din sirul p..u, u-pozitia ultimului element din sirul p..u} var m:byte;s1,s2:integer; begin if(p=u) then suma:=p {daca sirul are un singur element suma este egala cu valoarea elementului} else begin m:=(p+u)div 2;{gasim pozitia elementului din mijloc} s1:=suma(p,m);{s1-suma elementelor din prima parte a sirului} s2:=suma(m+1,u);{s2-suma elementelor din cea de-a doua parte a sirului} suma:=s1+s2;{suma elementelor din sirul p..u este suma celor elementelor din cele 2 subsiruri} end; end; begin write('n=');readln(n); writeln('suma=',suma(1,n));{primul element se afla pe pozitia 1 iar ultimul pe pozitia n} end. A DOUA METODA var n:byte;s:integer; procedure suma(p,u:byte; var s:integer);{p-pozitia primului element, u-pozitia ultimului element din sirul p..u; s-suma elementelor din sir} var m:byte;s1,s2:integer; begin if(p=u) then s:=p {daca sirul are un singur element suma elementelor din sir este egala cu valoarea elementului} else begin m:=(p+u)div 2;{gasim pozitia elementului din mijloc} suma(p,m,s1);{s1-suma elementelor din prima parte a sirului p..u} suma(m+1,u,s2);{s2-suma elementelor din a doua parte a sirului p..u} s:=s1+s2;{suma elementelor din sir este egala cu suma dintre cele 2 rezultate ale subsirurilor} end; end; begin write('n=');readln(n); s:=0;{initializam suma cu 0} suma(1,n,s);{primul element se afla pe pozitia 1, ultimul element se afla pe pozitia n} writeln('suma=',s); end. Sa se afiseze suma elementelor unui sir de n numere intregi. PRIMA METODA var a:array[1..10]of integer; n:byte; function suma(p,u:byte):integer;{p-pozitia primului element din sir, u-pozitia ultimului element din sir} var m:byte; begin if(p>u) then suma:=0 {aceasta conditie nu este obligatorie. Daca se intampla una stfel de caz, functia returneaza valoarea 0 deoarece s-au terminat de adunat toate elementele din subsir} else if (p=u) then suma:=a[p] {daca avem un singur element suma elementelor din sir este egala cu valoarea elementului} else begin m:=(p+u)div 2;{gasim pozitia elementului din mijloc} suma:=suma(p,m)+suma(m+1,u);{pentru a afla rezultatul trebuie sa adunam rezultatele obtinute pentru cele 2 subsiruri} end; end;

procedure citire;{citirea datelor de intrare} var i:byte; begin write('n=');readln(n); for i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; end; begin citire; writeln('suma=',suma(1,n));{primul element se afla pe pozitia 1 iar ultimul se afla pe pozita n} end. A DOUA METODA var a:array[1..10]of integer; n:byte;s:integer; procedure suma(p,u:byte;var s:integer);{p-pozitia primului element, u-pozitia ultimului element, s-suma elementelor de pe pozitiile p..u} var m:byte;s1,s2:integer; begin if(p=u) then s:=a[p] {daca avem un singur element atunci suma elementelor din sir este egala cu aceasta valoare} else begin m:=(p+u)div 2;{gasim pozitia elementului de la mijloc} suma(p,m,s1);{s1-suma elementelor aflate pe primele pozitii din sir} suma(m+1,u,s2);{s2-suma elementelor aflate in cea de-a doua parte a sirului} s:=s1+s2;{suma elementelor din sir se gaseste adunand cele 2 rezultate ale celor 2 subsiruri} end; end; procedure citire;{citim datele de intrare} var i:byte; begin write('n=');readln(n); for i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; end; begin citire; s:=0;{initializam suma elementelor din sir} suma(1,n,s);{primul element se afla pe pozitia 1, ultimul pe pozitia n} writeln('suma=',s); end. Sa se gaseasca valoarea minima dintr-un sir de n numere intregi. PRIMA METODA var a:array[1..100]of integer; n:integer; procedure citire;{citirea datelor de intrare} var i:byte; begin write('n=');readln(n); For i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; end; function minim(p,u:integer):integer; {p-pozitia primului element, u-pozitia ultimului element} var m:byte;m1,m2:integer;

begin if(p=u) then minim:=a[p] {daca sirul are un singur element atunci valoarea minima este egala cu valoarea elementului} else begin m:=(p+u)div 2;{gasim pozitia elementului din mijloc} m1:=minim(p,m);{m1 - valoarea minima din prima parte a sirului} m2:=minim(m+1,u);{m2-valoarea minima din cea de-a doua parte a sirului} if (m1>m2) then minim:=m2 {verificam care dintre cele 2 valori este mai mica. min - valoarea minima rezultata in urma comparatiei (rezultatul problemei)} else minim:=m1; end; end; begin citire; write('valoarea minima=',minim(1,n));{primul element se afla pe pozitia 1, ultimul element se gaseste pe pozitia n} end. A DOUA METODA var a:array[1..100]of integer; n,min:integer; procedure citire;{citirea datelor de intrare} var i:byte; begin write('n=');readln(n); For i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; end; procedure minim(p,u:integer;var min:integer);{p-pozitia primului element din sir,u-pozitia ultimului element din sir, min-valoarea minima rezultata} var m:byte;m1,m2:integer; begin if(p=u) then min:=a[p] {daca sirul are un singur element atunci valoarea minima este egala cu valoarea acestui element} else begin m:=(p+u)div 2;{gasim pozitia elementului din mijloc} minim(p,m,m1);{m1-valoarea minima din prima parte a sirului} minim(m+1,u,m2);{m2-valoarea minima din cea de-a doua parte a sirului} if (m1>m2) then min:=m2 {rezultatul problemei min - valoarea minima dintre cele 2 valori rezultate} else min:=m1; end; end; begin citire; min:=a[1];{initializam valoarea minima} minim(1,n,min);{primul element din sir se gaseste pe pozitia 1 iar ultimul se gaseste pe pozitia n} write('valoarea minima=',min); end. Turnurile din hanoi Se dau trei tije notate a, b, c si n discuri de diamtre diferite. Initial, pe tija a se gasesc toate discurile pus in ordine crescatoare a diamtrelor lor (cel c u diametrul cel mai mare este pus la baza). Sa se mute toate discurile de pe tija a pe tija b, folosind tija c ca tija intermediara, respectand urmatoarele conditii: - de fiecare data se muta un singur disc - un disc se poate pune numai deasupra unui disc cu diametru mai mare. Daca avem un singur disc, mutam discul pe tija b si problema este rezolvata. (a ->b) Daca avem doua discuri: mutam primul disc pe tija c, al doilea disc pe tija b, apoi discul de pe tija c il mutam pe

tija b. (a->c,a->b,b->c) Daca n>2 problema se complica, in sensul ca trebuie mult mai multe mutari de efectuat. Pentru rezolvare vom folosi metoda Divide et impera. Conform algoritmului general avem: Imparte. Se descompune problema in 2 subprobleme: prima va contine n-1 discuri iar a doua un singur disc. Stapaneste. Mutam cele n-1 discuri de pe tija a pe tija c folosind tija intermediara b prin apeluri succesive ale subprogramului recursiv. Se muta discul ramas pe b, apoi se muta discurile de pe tija c pe tija b prin intermediul tijei a. Combina. Combinarea solutiilor nu este necesara datorita faptului ca prin mutarea discurilor se realizeaza si secventa de rezolvare a problemei initiale. functia muta are structura: muta(numar discuri,de pe discul, pe discul,prin intermediul discului) var n:byte; procedure muta(n:byte;a,b,c:char);{muta n discuri de pe a pe b prin intermediul tijei c} begin if(n=1)then writeln(a,'->',b) {mutam discul ramas pe tija a pe tija b} else begin muta(n-1,a,c,b);{mutam n-1 discuri de pe a pe c prin intermediul tijei b} writeln(a,'->',b);{mutam discul ramas pe tija a pe dija b} mutaxx(n-1,c,b,a);{mutam cele n-1 discuri de pe tija c pe tija b prin intermediul tijei a } end; end; begin write('n=');readln(n); muta(n,'a','b','c');{mutam n discuri de pe tija a pe tija b prin intermediul tijei c; a,b,c sunt numele discurilor} end. METODA BACKTRACKING Se dau n multimi fiecare multime avand elementele 1...m. Sa se afiseze produsul cartezian a celor n multime. Afisarea sa se realizeze intr-un fisier. Observam ca valoarea elementului minim de pe fiecare coloana este 1 iar valoarea elementului maxim este m. Elementul x[k] poate fi adaugat la solutie indiferent de elementele aflate pe pozitiile 1...k -1 din solutie. Avem solutie daca numarul de elemente din vectorul solutie este egal cu numarul multimilor (n). var x:array[1..50]of byte; k,n,m:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean);{nu exista restrictii la adaugarea elementului x[k]} begin valid:=true; end; function solutie(k:integer):boolean;{avem solutie daca numarul de elemente din vectorul solutie este egal cu numarul multimilor (n)} begin if(k=n) then solutie:=true else solutie:=false; end; procedure afisare(k:integer);{afisarea vectorului solutie} var i:byte; begin for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0;{intializam cu valoarea elementului minim-1} while(k>0) do begin valid:=false; {x[k] nu e valid pentru a fi adaugat in solutie}

while(not valid)and(x[k]<m) do {cat timp nu s-a gasit un element x[k] valid pentru solutie si mai sunt valori pe care le poate avea x[k]} begin x[k]:=x[k]+1; {trecem la verificarea urmatoarei valori pentru x[k]} posibil(k,valid); end; if(not valid) then k:=k-1 {daca s-au verificat toate valorile pe care le paote avea x[k] si nu am gasit un element valid ne intoarcem la pozitia elementului anterior si continuam cautarea de aici} else if(solutie(k)) then afisare(k) {daca avem solutie o afisam} else begin {daca am gasit un element x[k] valid si nu am ajuns la o solutie} k:=k+1; x[k]:=0; end; end; end; begin write('numarul de multimi=');readln(n); write('numarul de elemente din fiecare multime=');readln(m); assign(f,'prod.txt'); rewrite(f); back; close(f); end. Sa se afiseze toate modalitatile de a aranja n obiecte numerotate 1...n. (generarea permutarilor) Observam ca: - valoarea elementului minim este 1 iar valoarea elementului maxim este n - elementul x[k] nu poate fi adaugat la solutie daca a mai aparut in solutie pe vreuna din pozitiile 1...k -1 (elementul nu se repeta) - avem solutie cand am reusit sa asezam cele n obiecte var x:array[1..50]of byte; k,n:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i:integer; begin valid:=true; {presupunam ca x[k] poate fi adaugat la solutie} for i:=1 to k-1 do {verificam repetitia elementului x[k]: daca a mai aparut in sir x[k] nu poate fi adaugat la solutie} if(x[k]=x[i])then valid:=false; end; function solutie(k:integer):boolean; begin if(k=n) then solutie:=true {avem solutie daca s-au adaugat la solutie n elemente} else solutie:=false; end; procedure afisare(k:integer); var i:byte; begin {afisam vectorul solutie} for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin

x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('numarul de obiecte=');readln(n); assign(f,'perm.txt'); rewrite(f); back; close(f); end. Se dau n obiecte. Sa se gaseasca toate modalitatile de a aranja intr-un sir m dintre cele n obiecte (generarea aranjamentelor) Observam ca: - valoarea minima este 1 si valoarea maxima este n - avem solutie daca aranjam m obiecte - x[k] poate fi adaugat la solutie daca nu a mai fost adaugat (elementele din solutie nu se repeta) var x:array[1..50]of byte; k,n,m:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i:integer; begin valid:=true; {elementele nu se repeta} for i:=1 to k-1 do if(x[k]=x[i])then valid:=false; end; function solutie(k:integer):boolean; begin {avem solutie daca au fost aranjate m obiecte} if(k=m) then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i:byte; begin {afisam vectorul solutie} for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin

k:=k+1; x[k]:=0; end; end; end; begin write('numarul de obiecte=');readln(n); write('m=');readln(m); assign(f,'aranj.txt'); rewrite(f); back; close(f); end. Se dau n obiecte numerotate de la 1...n. Sa se gaseasca toate posibilitatile de a aranja cate m obiecte din cele n astfel incat multimile de elemente sa nu se repete. Observam ca: - valoarea elementului minim este 1; valoarea elementului maxim este n - elementele din solutie nu se repeta - pentru a nu se repeta multimile de elemente (adica solutia 1 2 3 este aceiasi cu 2 1 3, 1 3 2...) elementele sunt introduse in solutie in ordine crescatoare/descrescatoare. Alegem varianta in care elementele sunt in ordine crescatoare. - avem solutie cand am introdus in solutie m elemente var x:array[1..50]of byte; k,n,m:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i:integer; begin valid:=true; {elementele din solutie nu se repeta} for i:=1 to k-1 do if(x[k]=x[i])then valid:=false; {multimile de solutii nu se repeta: elementele sunt in ordine crescatoare} if(k>1) then if(x[k]<x[k-1]) then valid:=false; end; function solutie(k:integer):boolean; begin {avem solutie daca au fost introduse in vectorul solutie m elemente} if(k=m) then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i:byte; begin {afisam vectorul solutie} for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k)

else begin k:=k+1; x[k]:=0; end; end; end; begin write('numarul de obiecte=');readln(n); write('m=');readln(m); assign(f,'comb.txt'); rewrite(f); back; close(f); end. Sa se aseze n dame pe o tabla de sah cu n linii si n coloane astfel incat sa nu se poata ataca una pe alta. Aceasta problema este de fapt problema de generare a permutarilor, insa, de data aceasta, vom afisa o schema a tablei de sah pentru a arata pozitiile unde se gasesc turele. 2 ture se pot se ataca daca sunt pe aceiasi linie sau pe aceiasi coloana. Datorita faptului ca vom completa pe rand liniile de pe tabla de sah, punand pe fiec are linie cate o tura, nu este nevoie sa punem conditii pentru a nu a aprea 2 ture pe aceiasi linie. x[k] reprezinta coloana de pe linia k ocupata de tura. Nu este gresit nici daca afisarea se face ca si la permutari insa este greu de urmarit pozitia turel or pe tabla. In plus, la aceasta problema vom numara si solutiile. Numarul de solutii pentru n=5 este de 120. Observam ca numarul minim este 1 (prima coloana) si numarul maxim este n(ultima coloana). Datorita faptului ca vom completa liniile succesiv, acestea nu au cum sa se repete, prin urmare singura conditie este sa nu se repete coloanele. Avem solutie daca s-au asezat pe tabla toate cele n ture. var x:array[1..50]of byte; k,n,nr:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i:integer; begin valid:=true; for i:=1 to k-1 do if(x[k]=x[i])then valid:=false;/*2 ture nu se pot afla pe aceiasi coloana*/ end; function solutie(k:integer):boolean; begin /*avem solutie cand am asezat toate cele n ture*/ if(k=n) then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin nr:=nr+1; writeln(f,'solutia ',nr); for i:=1 to k do begin for j:=1 to k do if (x[i]=j) then write(f,'T ') /*daca pe linia i este completata coloana j, vom specifica acest lucru*/ else write(f,'* '); writeln(f); end; writeln(f); end; procedure back; begin k:=1;

x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('numarul de linii si coloane=');readln(n); assign(f,'ture.txt'); rewrite(f); nr:=0; back; close(f); end. Sa se aseze n nebuni pe o tabla de sah cu n linii si n coloane fara a se putea ataca unul pe altul. Vom aseza, pe rand, cate un nebun pe linie, prin urmare liniile nu se repeta. x[k] - coloana ocupata pe linia k de catre un nebun. 2 nebuni se pot ataca unul pe altul daca ei se gasesc pe aceiasi diagonala. Putem gasi formula pentru diagonala punand pe axa XOY pe x[k], x[i], i, k care reprezinta de fapt, coloanele si respectiv liniile pe care se afla cei 2 nebuni. Vom schita astfel pe OX coloanele x[k], x[i] si pe OY liniile k si i. Vom avea astfel 4 situatii si vom deduce ca cei 2 nebuni se gasesc pe aceiasi diagonala daca abs(x[k]-x[i])=abs(k-i). Remintim ca functia abs se foloseste pentru calcularea modulului. Observam ca valoarea minima este 1 (prima coloana) si valoarea maxima este n (ultima coloana). Avem solutie cand au fost asezati toti cei n nebuni, fiecare pe cate o linie. 2 nebuni nu se pot ataca daca se gasesc pe aceiasi diagonala. var x:array[1..50]of byte; k,n,nr:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i:integer; begin valid:=true; for i:=1 to k-1 do if(abs(x[k]-x[i])=abs(k-i))then valid:=false; /*cei doi nebuni nu trebuie sa se atace - nu trebuie sa fie pe aceiasi diagonala*/ end; function solutie(k:integer):boolean; begin /*avem solutie cand am asezat pe tabla cei n nebuni*/ if(k=n) then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin nr:=nr+1; writeln(f,'solutia ',nr); for i:=1 to k do begin for j:=1 to k do if (x[i]=j) then write(f,'N ')

else write(f,'* '); writeln(f); end; writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('numarul de linii si coloane=');readln(n); assign(f,'nebuni.txt'); rewrite(f); nr:=0; back; close(f); end. Sa se aseze n dame (regine) pe o tabla de sah cu n linii si n coloane astfel incat sa nu se poata ataca una pe alta. Problema este o combinatie intre problema turelor (prima problema de pe pagina) si problema nebunilor (cea de-a doua problema de pe pagina). 2 dame nu se pot ataca daca nu se gasesc pe aceiasi linie, coloana sau diagonala. Punand damele pe rand, cate una pe o line k=1...n nu e nevoie sa verificam daca damele se gasesc pe aceiasi linie. 2 dame se gasesc pe aceiasi coloana daca exista i=1...k-1 astfel incat x[k]=x[i]. 2 dame se gasec pe aceiasi diagonala daca exista i=1...k-1 astfel incat abs(x[k]-x[i])=abs(k-i). Observam ca valoarea minima este 1(prima coloana) si valoarea maxima este n (ultima coloana). Avem solutie cand s-au depus toate cele n dame. In functia posibil vom trata cazurile in care prin depunerea unei regine pe linia k in pozitia x[k] exista posibilitatea ca pe tabla de sah sa fie 2 dame care sa se poata ataca una pe alta. var x:array[1..50]of byte; k,n,nr:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i:integer; begin valid:=true; for i:=1 to k-1 do if(abs(x[k]-x[i])=abs(k-i))or(x[i]=x[k])then valid:=false; /*2 dame nu pot sa se afle pe aceiasi coloana sau pe aceiasi diagonala*/ end; function solutie(k:integer):boolean; begin /*am ajuns la o solutie cand s-au depus pe tabla toate cele n dame*/ if(k=n) then solutie:=true else solutie:=false;

end; procedure afisare(k:integer); var i,j:byte; begin /*afisam solutia*/ nr:=nr+1; writeln(f,'solutia ',nr); for i:=1 to k do begin for j:=1 to k do if (x[i]=j) then write(f,'D ') else write(f,'* '); writeln(f); end; writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('numarul de linii si coloane=');readln(n); assign(f,'dame.txt'); rewrite(f); nr:=0; back; close(f); end. Sa se scrie un numar n ca suma de numere naturale. Observam ca: - valoarea minima este 1 si valoarea maxima este n - avem solutie cand suma elementelor din vectorul solutie este egala cu n - adaugam elementul x[k] la solutie daca suma elementelor din solutie nu depaseste n. Observatie: Algoritmul urmator poate fi imbunatatit - sa nu se repete multimile de elemente - daca x[k] nu este valid nici urmatoarele elemente de la x[k]+1...n nu sunt valide. var x:array[1..50]of byte; k,n:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i,s:integer; begin valid:=true; /*x[k] poate fi adaugat la solutie doar daca prin adaugarea lui suma elementelor din vectorul solutie nu depaseste n*/ s:=0; for i:=1 to k do s:=s+x[i];

if s>n then valid:=false; end; function solutie(k:integer):boolean; /*avem solutie daca suma elementelor din solutie este egala cu n*/ var i,s:integer; begin s:=0; for i:=1 to k do s:=s+x[i]; if(s=n) then solutie:=true else solutie:=false; end; procedure afisare(k:integer);/*afisam solutia*/ var i,j:byte; begin for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('n=');readln(n); assign(f,'suma.txt'); rewrite(f); back; close(f); end. Sa se afiseze n ca suma de m numere naturale. Spre deosebire de problema precedenta avem solutie daca suma elementelor din solutie este n si numarul de elemente din solutie este m. var x:array[1..50]of byte; k,n,m:byte;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i,s:integer; begin valid:=true;/*adaugam pe x[k] la solutie daca si numai daca prin adaugare suma elementelor din solutie nu depaseste n*/ s:=0; for i:=1 to k do s:=s+x[i]; if s>n then valid:=false; end; function solutie(k:integer):boolean;/*avem solutie daca numarul de elemente din solutie este m si suma elementelor din solutie este n*/ var i,s:integer;

begin s:=0; for i:=1 to k do s:=s+x[i]; if(s=n)and(k=m) then solutie:=true else solutie:=false; end; procedure afisare(k:integer);/*afisam solutia*/ var i,j:byte; begin for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('n=');readln(n); write('m=');readln(m); assign(f,'suma.txt'); rewrite(f); back; close(f); end. Sa se scrie n ca suma de numere prime. Observam ca valoarea minima este 1 si valoarea maxima poate fi n (daca n este numar prim). Aceast rationament poate fi optimizat. Avem solutie daca suma elementelor din vectorul solutie este n. Putem adauga elementul x[k] la solutie daca este prim si daca prin adaugarea lui suma elementelor din vectorul solutie nu depaseste valoarea n. (puteti modifica algortimul astfel: in cazul in care x[k] este numar sa se verifice daca prin adaugarea lui la vectorul solutie suma elementelor din vectorul solutie nu depaseste n. var x:array[1..50]of byte; k,n,m:byte;valid:boolean; f:text; function prim(n:integer):boolean;/*functia pentru a verifica daca un numar este prim - functia poate fi optimizata*/ var i:integer; begin prim:=true; if(n<=1) then prim:=false; for i:=2 to n div 2 do if n mod i=0 then prim:=false; end; procedure posibil(k:integer;var valid:boolean); var i,s:integer;

begin valid:=true; if not prim(x[k]) then valid:=false;/*verificam daca x[k] este numar prim*/ s:=0; for i:=1 to k do s:=s+x[i]; if s>n then valid:=false;/*adaugam pe x[k] la solutie daca prin adaugarea lui x[k] suma elementelor din vectorul solutie nu depaseste n*/ end; function solutie(k:integer):boolean; var i,s:integer; begin /*avem solutie daca suma elementelor din vectorul solutie este egala cu n*/ s:=0; for i:=1 to k do s:=s+x[i]; if(s=n)then solutie:=true else solutie:=false; end; procedure afisare(k:integer);/*afisam solutia*/ var i,j:byte; begin for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin write('n=');readln(n); assign(f,'suma.txt'); rewrite(f); back; close(f); end. Dintr-o cusca trebuie scosi n lei si m tigrii (m<=n). Sa se afiseze toate posibilitatile de a scoate animalele din cusca astfel incat sa nu iasa doi tigrii unul dupa altul. Vom codifica cu 0 leii si cu 1 tigrii. Acest mod de codificare nu este unic! Observam ca: - valoarea minima este 0 iar valoarea maxima este 1 - avem solutie daca numarul de tigrii este m si numarul de lei este n - x[k] poate face parte din solutie daca: * in cazul in care x[k] reprezinta codul unui tigru x[k-1] trebuie sa reprezinte codul unui leu *din cusca nu se pot scoate mai multi de n lei si mai multi de m tigrii.

var x:array[1..50]of integer; k,n,m:integer;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i,tig,lei:integer; begin valid:=true; /*numaram leii si tigrii din solutie*/ tig:=0;lei:=0; for i:=1 to k do if(x[i]=0) then lei:=lei+1 else tig:=tig+1; if(tig>m)or(lei>n) then valid:=false; /*nu putem scoate din cusca mai multi de n lei si mai multi de m tigrii*/ if(k>1)and(x[k-1]=1)and(x[k]=1) then valid:=false; /*nu putem scoate din cusca 2 tigrii unul dupa altul*/ end; function solutie(k:integer):boolean; var i,tig,lei:integer; begin /*avem solutie daca in vectorul solutie numarul de tigrii este m si numarul de lei este n*/ tig:=0;lei:=0; for i:=1 to k do if(x[i]=0) then lei:=lei+1 else tig:=tig+1; if(tig=m)and(lei=n) then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin /*Afisam solutia gasita*/ for i:=1 to k do if(x[i]=0) then write(f,'leu ') else write(f,'tigru '); writeln(f); end; procedure back; begin k:=1; x[k]:=-1;/*initializam cu valoarea minima=0 -1*/ while(k>0) do begin valid:=false; while(not valid)and(x[k]<1) do /*valoarea maxima este 1*/ begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=-1;/*initializam cu valoarea minima -1*/ end; end; end; begin write('nr lei=');readln(n); write('nr tigrii=');readln(m); if(m>n) then begin write('eroare');halt;end; /*daca avem mai multi tigrii decat lei rezolvarea problemei este imposibila*/ assign(f,'leitig.txt'); rewrite(f); back;

close(f); end. Sa se afiseze toate posibilitatile de a inchide corect n paranteze. Codificam parantezele astfel: ( cu 0 si ) cu 1. Pentru n=6 solutiile sunt: ((())) (()()) (())() ()(()) ()()() Observam ca valoarea minima este 0 si valoarea maxima este 1. Avem solutie daca numarul de paranteze inchise este n/2 si numarul de paranteze deschise este n/2. Adaugam elementul x[k] la solutie daca: - in cazul in care este primul element din sir trebuie sa fie ( - numarul de paranteze deschise trebuie sa fie mai mare sau egal cu numarul de paranteze inchise - numarul de paranteze inchise si numarul de paranteze deschise nu pot depasi n>2. Observatie: pentru a putea construi sirul de paranteze n trebuie sa fie numar par. var x:array[1..50]of integer; k,n,m:integer;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i,pd,pi:integer; begin valid:=true; pd:=0;pi:=0; for i:=1 to k do if(x[i]=0) then pd:=pd+1 else pi:=pi+1; if(pd>n div 2)or(pi>n div 2) then valid:=false;/*numarul de paranteze inchise si numarul de paranteze inchise nu pot depasi n/2*/ if(pd<pi) then valid:=false;/*numarul de paranteze deschise trebuie sa fie mai mare sau egal cu numarul de paranteze inchise*/ if(k=1) then if(x[k]=1) then valid:=false;/*prima paranteza trebuie sa fie deschisa*/ end; function solutie(k:integer):boolean; var i,pi,pd:integer; begin /*avem solutie daca numarul de paranteze inchise si numarul de paranteze deschise este n/2*/ pd:=0;pi:=0; for i:=1 to k do if(x[i]=0) then pd:=pd+1 else pi:=pi+1; if(pd=n div 2)and(pi=n div 2) then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin /*afisam solutia*/ for i:=1 to k do if(x[i]=0) then write(f,'(') else write(f,')'); writeln(f); end; procedure back; begin k:=1; x[k]:=-1;/*initializam x[k] cu valoarea minima-1*/ while(k>0) do begin valid:=false;

while(not valid)and(x[k]<1) do /*valoarea maxima este 1*/ begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=-1;/*initializam cu valoarea minima -1*/ end; end; end; begin write('n=');readln(n); assign(f,'paran.txt'); rewrite(f); if(n mod 2=1) then begin write('imposibil');halt;end; back; close(f); end. Pentru n cuburi se cunosc dimensiunea laturii si culoarea. Sa se afiseze toate posibilitatile de a construi turnuri din cate m cuburi stiind ca: - doua cuburi de aceasi culoare nu pot fi puse unul langa altul - un cub cu latura mai mare nu poate fi pus peste un cub cu latura mai mica. Exemplu: n=4 si m=3 Avem 4 cuburi. Pentru fiecare citim culoarea si dimensiunea laturii. rosu 4 galben 3 rosu 2 verde 3 Se va afisa: 1(rosu 4) 2(galben 3) 1(rosu 4) 4(verde 3) 2(galben 3) 3(rosu 2) 2(galben 3) 4(verde 3) 4(verde 3) 2(galben 3) 4(verde 3) 3(rosu 2) dupa modelul numar_cub(culoare dimensiune) Observam ca: - valoarea minima este 1 si valoarea maxima este n (cuburile sunt numeroate de la 1...n) - avem solutie cand in vectorul solutie avem m cuburi - respectam conditiile din enunt. In plus, un cub nu poate fi pus de doua ori in acelasi turn. var x:array[1..50]of integer; k,n,m:integer;valid:boolean; f:text; cul:array[1..50]of string; dim:array[1..50]of byte; procedure posibil(k:integer;var valid:boolean); var i,pd,pi:integer; begin valid:=true; /*cuburile nu se repeta*/ for i:=1 to k-1 do if(x[i]=x[k]) then valid:=false; if(k>1) then if(cul[x[k-1]]=cul[x[k]]) then valid:=false;/*nu pot fi puse unul peste altul 2 cuburi de aceiasi culoare*/ if(k>1) then if(dim[x[k-1]]<dim[x[k]]) then valid:=false;/*un cub cu latura mai mare nu poate fi pus peste un cub cu dimensiunea laturii mai mica*/

end; function solutie(k:integer):boolean; var i,pi,pd:integer; begin /*avem solutie cand am pus in turn m cuburi*/ if k=m then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin for i:=1 to k do write(f,x[i],'(',cul[x[i]],' ',dim[x[i]],') '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; procedure citire; var i:byte; begin write('n=');readln(n); write('m=');readln(m); for i:=1 to n do begin write('culoarea cubului ',i,':');readln(cul[i]); write('dimensiunea laturii pentru cubul ',i);readln(dim[i]); end; end; begin citire; assign(f,'turn.txt'); rewrite(f); if(n mod 2=1) then begin write('imposibil');halt;end; back; close(f); end. Sa se afiseze numerele toate numerele cu cel mult n cifre care sunt formate numai din cifre pare care nu se repeta. Observam: - valoarea minima este 0 si valoarea maxima este 9. - avem solutie daca numarul de elemente din solutie este cel mult n, prin urmare, dupa ce afisam o solutie cautam urmatoarele elemente pe care le putem adauga solutiei pentru a gasi si alte solutii. - x[k] face parte din solutie daca: * prima cifra din numar nu trebuie sa fie 0 (acest caz poate fi optimizat in rezolvarea problemei)

* cifrele sunt numere pare *cifrele nu se repeta var x:array[1..50]of integer; k,n,m:integer;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i,pd,pi:integer; begin valid:=true; /*cifrele nu se repeta*/ for i:=1 to k-1 do if(x[i]=x[k]) then valid:=false; if(x[k]mod 2=1) then valid:=false; /*cifrele sunt numere pare*/ if(k=1)and(x[k]=0) then valid:=false;/*prima cifra e diferita de 0*/ end; function solutie(k:integer):boolean; var i,pi,pd:integer; begin /*Avem solutie daca in vectorul solutie avem cel mult n cifre*/ if k<=n then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=-1;/*initializam cu valoarea minima -1*/ while(k>0) do begin valid:=false; while(not valid)and(x[k]<9) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then begin afisare(k); /*trecem la cautarea unei alte solutii pornind de la cea gasita*/ k:=k+1; x[k]:=-1; end else begin /*trecem la urmatorul element din vectorul solutie*/ k:=k+1; x[k]:=-1; end; end; end; begin write('n=');readln(n); assign(f,'nr.txt'); rewrite(f); back; close(f); end. Sa se afiseze toate posibilitatile de a construi drapele cu 3 culori stiind ca: - avem culorile galben, portocaliu, rosu, visiniu, verde, albastru - culorile nu se repeta

- culoarea din mijloc nu poate fi galben sau rosu. Codificam culorile: 1 galben 2 portocaliu 3 rosu 4 visiniu 5 verde 6 albatru Observam ca valoarea minima este 1 si valoarea maxima este 6. Avem solutie cand am reusit sa depunem 3 culori. In procedura posibil tratam restrictiile din enunt. var x:array[1..50]of integer; k,n:integer;valid:boolean; f:text;s:string; procedure posibil(k:integer;var valid:boolean); var i,pd,pi:integer; begin valid:=true; /*culorile nu se repeta*/ for i:=1 to k-1 do if(x[i]=x[k]) then valid:=false; if(k=2) then if(x[k]=1)or(x[k]=3) then valid:=false; /*in mijloc nu poate fi galben sau rosu*/ end; function solutie(k:integer):boolean; var i,pi,pd:integer; begin /*Avem solutie cand am reusit sa facem un steag cu 3 culori*/ if k=3 then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin for i:=1 to k do if(x[i]=1)then write(f,'galben ') else if(x[i]=2) then write(f,'portocaliu ') else if(x[i]=3) then write(f,'rosu ') else if(x[i]=4) then write(f,'visiniu ') else if(x[i]=5) then write(f,'verde ') else write(f, 'albastru '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<6) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin assign(f,'steaguri.txt');

rewrite(f); back; close(f); end. Sa se inscriptioneze pe un CD n melodii numerotate de la 1...n astfel incat: - melodiile sa nu se repete - melodia 2 sa nu apara inaintea melodii 1 Observam ca valoarea minima este 1 (melodia cu numarul de cod 1) si valoarea maxima este n (melodia cu codul n). Avem solutie cand am inscriptionat cele n melodii. Cand inscriptionam, trebuie sa avem grije ca: - melodia 2 sa nu fi fost inscriptionata inaintea melodii 1 - melodiile sa nu se repete var x:array[1..50]of integer; k,n:integer;valid:boolean; f:text; procedure posibil(k:integer;var valid:boolean); var i,pd,pi:integer; begin valid:=true; /*melodiile nu trebuie sa se repete*/ for i:=1 to k-1 do if(x[i]=x[k]) then valid:=false; if (x[k]=1) then /*daca trebuie sa inscriptionam melodia 1 trebuie sa vedem da ca inainte a fost inscriptionata melodia 2*/ for i:=1 to k-1 do if(x[i]=2) then valid:=false; end; function solutie(k:integer):boolean; var i,pi,pd:integer; begin /*avem solutie cand s-au inscriptionat cele n melodii*/ if k=n then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin for i:=1 to k do write(f,x[i],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin

write('n=');readln(n); assign(f,'melodii.txt'); rewrite(f); back; close(f); end. Se citeste de la tastatura un cuvant. Sa se afiseze toate anagramarile cuvantului. Problema se reduce la generarea permutarilor a n obiecte. In acest caz n este lungimea sirului iar elementele sirului sunt codificate cu numere de la 1..n, numere ce reprezinta pozitia initiala a elementelor in sir. s[x[k]] - elementul aflat in sir pe pozitia x[k]; x[k] reprezinta pozitia elementului in sirul initial (observatie: in algoritmul pe care o sa-l prezentam o sa ne rezumam la afisare fara a schimba structura sirului). Obsrvam ca: - elementul maxim este 1 si cel minim este n (codurile=indicii elementelor din sir) - elementele din solutie nu trebuie sa se repete - vom afisa caracterul de pe pozitia corespunzatoare - avem solutie cand s-au introdus in vectorul solutie toate cele n elemente var x:array[1..50]of integer; k,n:integer;valid:boolean; f:text;s:string; procedure posibil(k:integer;var valid:boolean); var i,pd,pi:integer; begin valid:=true; /*elementele nu trebuie sa se repete*/ for i:=1 to k-1 do if(x[i]=x[k]) then valid:=false; end; function solutie(k:integer):boolean; var i,pi,pd:integer; begin /*avem solutie cand s-au introdus in vectorul solutie toate cele n elemente*/ if k=n then solutie:=true else solutie:=false; end; procedure afisare(k:integer); var i,j:byte; begin /*Afisam caracterul corespunzator fiecare pozitii*/ for i:=1 to k do write(f,s[x[i]],' '); writeln(f); end; procedure back; begin k:=1; x[k]:=0; while(k>0) do begin valid:=false; while(not valid)and(x[k]<n) do begin x[k]:=x[k]+1; posibil(k,valid); end; if(not valid) then k:=k-1 else if(solutie(k)) then afisare(k) else begin k:=k+1; x[k]:=0; end; end; end; begin

write('dati sirul=');readln(s); n:=length(s); assign(f,'sir.txt'); rewrite(f); back; close(f); end. structuri de control Se cite te un num r natural n. S se determine cifra maxim din num r, folosind un subprogram. #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } cout<<"k=";cin>>k; if(k<1||k>n) {cout<<"stergerea nu se poate efectua";exit(0);} } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } void sterge(int k) { for(int i=k;i<n;i++) a[i]=a[i+1]; n--; } void main() { citire(); sterge(k); afisare(); } Se introduce de la tastatur un num r ntreg n. Se cere s se calculeze i s se afi eze: a) media aritmetic a cifrelor pare; b) produsul cifrelor impare #include<iostream.h> long unsigned int n; void medie(long unsigned int n) { int u; int c=0,s=0; while(n!=0) { u=n%10; n=n/10; if(u%2==0){c++;s=s+u;} } cout<<"media aritmetica a cifrelor pare="<<(float)s/c<<endl; } void produs(long unsigned int n) {

int p=1,u; while(n!=0) { u=n%10; n=n/10; if(u%2==1)p=p*u; } cout<<"produsul cifrelor impare="<<p<<endl; } void main() { cout<<"n=";cin>>n; medie(n); produs(n); } Se cite te de la tastatur un num r ntreg mai mare sau egal cu 1000. Se cere s se stabileasc dac num rul dat este palindrom sau nu, folosind un subprogram. #include<iostream.h> #include<stdlib.h> long unsigned int n; void palindrom() { int u; long unsigned int x=n,m=0; while(n!=0) { u=n%10; n=n/10; m=m*10+u; } if(m==x) cout<<"palindrom\n"; else cout<<"nu e palindrom"; } void main() { cout<<"n=";cin>>n; if(n<1000){cout<<"numarul trebuie sa fie >=1000\n";exit(0);} palindrom(); } Se cite te de la tastatur un num r ntreg. Se cere s se stabileasc dac este perfect sau nu, folosind un subprogram. Un num r este perfect dac este egal cu suma divizorilor s i proprii plus 1. #include<iostream.h> #include<stdlib.h> int n; void perfect() { int s=0; for(int i=1;i<=n/2;i++) if(n%i==0)s=s+i; if(s==n) cout<<"numar perfect\n"; else cout<<"numarul nu e perfect\n"; } void main() { cout<<"n=";cin>>n; perfect(); } Se cite te de la tastatur un num r ntreg .

Se cere s se calculeze i s se afi eze suma divizorilor proprii precum i num rul acestora. #include<iostream.h> #include<stdlib.h> long unsigned int n; void divizori() { int s=0; int c=0; for(int i=2;i<=n/2;i++) if(n%i==0){s=s+i;c++;} cout<<"suma divizorilor proprii="<<s<<"nr de div proprii="<<c; } void main() { cout<<"n=";cin>>n; divizori(); } Se cite te de la tastatur un num r natural nenul n. Se cere s se calculeze i s se afi eze urm toarea sum : 1+1*2+1*2*3+1*2*3*4+...+1*2*...n . #include<iostream.h> int n; void suma() {float s=0,p=1; for(int i=1;i<=n;i++) {p=p*i; s=s+p;} cout<<"s="<<s<<endl; } void main() { cout<<"n=";cin>>n; suma(); } Se cite te de la tastatur un num r natural nenul n. Se cere s se calculeze i s se afi eze urm toarea sum : 1+1/(1*2)+1/(1*2*3)+...+1/(1*2*3*...*n). #include<iostream.h> int n; void suma() {float s=0,p=1; for(int i=1;i<=n;i++) {p=p*i; s=s+1/p;} cout<<"s="<<s<<endl; } void main() { cout<<"n=";cin>>n; suma(); } VECTORI Se cite te un vector cu n componente ntregi. Se cere: a) S se ordoneze cresc tor elementele vectorului; b) S se permute circular stnga elementele vectorului ordonat cu o pozi ie. #include<iostream.h> int a[100],n; void citire() { cout<<"nr de elemente n=";cin >>n;

for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<" "; cout<<endl; } void sortare() { int aux; for(int i=1;i<=n-1;i++) for(int j=i+1;j<=n;j++) if(a[i]>a[j]) {aux=a[i];a[i]=a[j];a[j]=aux;} } void permutare_stanga() { int aux=a[1]; for(int i=1;i<n;i++) a[i]=a[i+1]; a[n]=aux; } void main() {citire(); afisare(); sortare(); cout<<"dupa sortare\n"; afisare(); cout<<"dupa permutare\n"; permutare_stanga(); afisare(); } Se cite te un vector cu n componente ntregi. Se cere: a) S se elimine din vector elementele nule dac acestea exist ; b) S se nlocuiasc fiecare element al noului vector cu media aritmetic a celorlalte elemente din vector. #include<iostream.h> int a[100],n; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } } void afisare(int a[100],int n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } void elimina_nule() { int b[100]; int j=0; for(int i=1;i<=n;i++) if(a[i]!=0) {j++;b[j]=a[i];} cout<<"fara elemente nule\n"; afisare(b,j); } void inlocuire()

{ float b[100]; for(int i=1;i<=n;i++) { b[i]=0; for(int j=1;j<=n;j++) if(j!=i) b[i]=b[i]+a[j]; b[i]=b[i]/(n-1); } cout<<"dupa inlocuire"; for(i=1;i<=n;i++) cout<<b[i]<<" "; cout<<"\n"; } void main() {citire(); cout<<"elementele citite\n"; afisare(a,n); elimina_nule(); inlocuire(); } Se d un ir x de n elemente ntregi. S se caute ultimul element impar mai mare dect 15. #include<iostream.h> int x[100],n; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"x["<<i<<"]=";cin >>x[i]; } } void afisare(int a[100],int n) { for(int i=1;i<=n;i++) cout<<x[i]<<" "; cout<<endl; } void cauta() {int i=n;int gasit=0; while(gasit==0&&i>0) { if(x[i]>15 && x[i]%2==1) gasit=1; else i--; } if(i>0)cout<<x[i]; else cout<<"nu s-a gasit niciun element impar mai mare ca 15\n"; } void main() {citire(); cauta(); } S se scrie un program care : a) cite te un vector cu n componente numere reale. b) terge un element din vector care se afl pe o pozi ie dat k. #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++)

{cout<<"a["<<i<<"]=";cin >>a[i]; } cout<<"k=";cin>>k; if(k<1||k>n) {cout<<"stergerea nu se poate efectua";exit(0);} } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } void sterge(int k) { for(int i=k;i<n;i++) a[i]=a[i+1]; n--; } void main() { citire(); sterge(k); afisare(); } S se scrie un program care determin media aritmetic a elementelor pare dintr-un vector folosind un subprogram (procedur sau func ie). #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } float medie_pare() { float s=0; int c=0; for(int i=1;i<=n;i++) if(a[i]%2==0){c++;s=s+a[i];} if(c!=0)cout<<"media elementelor pare="<<s/c<<endl; else cout<<"nu exista elemente pare\n"; } void main() { citire(); medie_pare(); } Se cite te de la tastatur un num r natural nenul n i alte n numere ntregi . Se cere : a) Suma elementelor pare de pe pozi ii impare b) Media aritmetic a elementelor pozitive. #include<iostream.h>

#include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } float medie_pozitive() { float s=0; int c=0; for(int i=1;i<=n;i++) if(a[i]>0){c++;s=s+a[i];} if(c!=0)cout<<"media elementelor pare="<<s/c<<endl; else cout<<"nu exista elemente pare\n"; } void suma() { int s=0; for(int i=1;i<=n;i++) if(a[i]%2==0&&i%2==1)s=s+a[i]; cout<<"suma elementelor pare de pe pozitii impare="<<s<<endl; } void main() { citire(); medie_pozitive(); suma(); } Se cite te de la tastatur un num r natural nenul n i alte n numere ntregi. Se cere s se afi eze cte elemente prime con ine irul citit ( se va folosi un subprogram pentru a stabili c un num r este prim sau nu). #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } int prim(int n) { if(n<2)return 0; int i=2; while(i<=n/2)

if(n%i==0) return 0; else i++; return 1; oid cate_prime() { int c=0; for(int i=1;i<=n;i++) if(prim(a[i]))c++; cout<<"nr elemente prime="<<c<<endl; } void main() { citire(); cate_prime(); } Se cite te de la tastatur un num r natural nenul n i alte n numere ntregi. Se cere s se afi eze num rul de apari ii n ir ale unui num r citit de la tastatur . #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } cout<<"k=";cin>>k; } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } void nr_aparitii() { int c=0; for(int i=1;i<=n;i++) if(a[i]==k)c++; cout<<k<<" apare de "<<c<<" ori\n"; } void main() { citire(); nr_aparitii(); afisare(); } Se cite te de la tastatur un num r natural nenul n i alte n numere ntregi. Se cere s se afi eze valoarea minim din ir , precum i num rul s u de apari ii n cadrul irului. #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } }

void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } int min() { int m; m=a[1]; for(int i=1;i<=n;i++) if(m>a[i])m=a[i]; return m; } void cate_min() { int m=min(); int c=0; for(int i=1;i<=n;i++) if(m==a[i]) c++; cout<<"nr de elemente minime="<<c<<endl; } void main() { citire(); cout<<"val min="<<min(); cate_min(); } Se cite te un vector cu n componente numere reale. S se nlocuiasc ultimele k elemente ale vectorului cu valoarea 1. Valoarea k este dat de la tastatur (k<n). #include<iostream.h> #include<stdlib.h> int a[100],n,k; void citire() { cout<<"nr de elemente n=";cin >>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin >>a[i]; } cout<<"k=";cin>>k; if(k<1||k>=n) {cout<<"date incorecte";exit(0);} } void afisare() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } void inlocuieste() { for(int i=n-k+1;i<=n;i++) a[i]=-1; } void main() { citire(); afisare(); inlocuieste(); afisare(); }

Se citesc de la tastatur numere ntregi pn la citirea num rului 13. Se cere s se calculeze i s se afi eze cte numere prime s-au citit precum i num rul celor neprime. #include<iostream.h> #include<stdlib.h> long unsigned int n; void perfect() { long unsigned int s=0; for(int i=1;i<=n/2;i++) if(n%i==0)s=s+i; if(s==n) cout<<"numar perfect\n"; else cout<<"numarul nu e perfect\n"; } void main() { cout<<"n=";cin>>n; perfect(); } Siruri de caractere Se cite te de la tastatur un cuvnt. S se afi eze num rul ini ial de caractere ale cuvntului i apoi s se tearg toate vocalele din cuvnt. #include<iostream.h> #include<string.h> #include<conio.h> void main() {int i; char s[100]; cout<<"s=";cin.get(s,100); cout<<"Sirul are: "<<strlen(s)<<" caractere"<<endl; strlwr(s); for(i=0;i<strlen(s);i++) if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u') strcpy(s+i,s+i+1); cout<<"sirul fara vocale="<<s; } Se citesc de la tastatur 2 iruri de caractere. S se verifice dac sunt egale (la fel) f r a se face deosebire ntre literele mari i literele mici. #include<iostream.h> #include<string.h> #include<conio.h> char s1[100],s2[100]; void citire() { cout<<"primul sir: ";cin.get(s1,100);cin.get(); cout<<"al doilea sir ";cin.get(s2,100); } void compara() {int x; x=stricmp(s1,s2); strlwr(s1);strlwr(s2); //transformam cele doua siruri in siruri numai cu litere mici if(x>0) cout<<"Primul sir este mai mare\n "; else if(x==0) cout<<"Siruri sunt egale\n "; else cout<<"Al doilea sir este mai mare decat primul \n "; } void main() {citire();

compara(); } Fi ierul litere.txt con ine un text scris cu litere mari pe una sau mai multe linii. Se cere: a) S se afi eze litera ( literele) care apare de cele mai multe ori; b) S se afi eze vocalele din text. #include<iostream.h> #include<string.h> #include<fstream.h> #include<io.h> ifstream f("litere.txt"); int n; char a[100]; void citire() {int i; i=0; f>>a[i]; while(!f.eof()) {cout<<a[i]; i++; /*pt nu a avea surprize ca fisierul sa nu aiba decat majuscule transformam sirul in majusculele*/ strupr(a); f>>a[i]; } n=i; f.close(); } void maxim() { int b[50]; cout<<"\n numarul de caractere="<<n<<"\n"; int k=0; for(char c='A';c<='Z';c++){ b[k]=0; for(int j=0;j<n;j++) if(c==a[j]) b[k]++; k++; } int max=b[0]; for(int i=1;i<k;i++) if(max<b[i])max=b[i]; cout<<"caracterele cu numar maxim de aparitii="<<max<<endl; for(i=0;i<k;i++) if(b[i]==max)cout<<char(65+i)<<" "; } void vocale() {char voc[]="AEIOU"; cout<<"\nvocalele din text\n"; for(int i=0;i<n;i++) for(int j=0;j<strlen(voc);j++) if(a[i]==voc[j])cout<<a[i]<<" "; cout<<"\n"; } void main() {citire(); maxim(); vocale(); }

Se cite te un text ntr-o variabil de tip string, in care cuvintele se despart prin spa ii. Se cere: a) s se afi eze cuvintele n ordine alfabetic ; b) s se numere cuvintele cu minim 4 vocale distincte. #include <iostream.h> #include <conio.h> #include <string.h> char cuv[10][10]; int n; void sortare() { char aux[10];int x; for(int i=1;i<n;i++) for(int j=1+i;j<=n;j++) {x=strcmp(cuv[i],cuv[j]); if(x>0){ strcpy(aux,cuv[i]); strcpy(cuv[i],cuv[j]); strcpy(cuv[j],aux); } } for(i=1;i<=n;i++)cout<<cuv[i]<<" "; cout<<endl; } int nrvocale(char s[10]) {char vocale[]="aeiou";int c;int nr=0; strlwr(s); for(int i=0;i<strlen(vocale);i++) { c=0; for(int j=0;j<strlen(s);j++) if(vocale[i]==s[j])c++; if(c!=0)nr++; } if (nr>=4)return 1; else return 0; } void vocale4() { for(int i=1;i<=n;i++) if(nrvocale(cuv[i])==1)cout<<cuv[i]<<" "; cout<<"\n"; } int main() {char a[100],*p,separator[]=" "; int i=0,nr=0; cout<<"Dati sirul:";cin.get(a,100); strcpy(p,a); p=strtok(p,separator); while (p) {strcpy(cuv[++nr],p); p=strtok(NULL,separator);} cout<<"Sunt "<<nr<<" cuvinte:"<<endl; for (i=1;i<=nr;i++) cout<<cuv[i]<<endl; n=nr; sortare(); vocale4(); return 0; } fisiere1

n fi ierul date.in sunt scrise mai multe cuvinte cte unul pe fiecare linie din fi ier. Se cere: a) S se determine num rul de cuvinte din fi ier; b) S se afi eze cuvintele care ncep cu o vocal . Obs. Nu se va face distinc ie ntre litere mari i mici. #include<iostream.h> #include<string.h> #include<fstream.h> ifstream ff("date.in"); int n; char a[100][100]; void citire() {int i; i=1; ff>>a[1]; while(strcmp(a[i],"")!=0) {i++; ff>>a[i];strlwr(a[i]);//transformam majusculele in litere mici } n=i-1; } void cuvinte() { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<"\n numarul de cuvinte="<<n<<"\n"; cout<<"cuvintele care incep cu vocala\n"; for (i=1;i<=n;i++) if ((a[i][0]=='a')||(a[i][0]=='e')||(a[i][0]=='i')||(a[i][0]=='o')||(a[i][0]=='u')) cout<<a[i]<<" "; } void main() {citire();cuvinte();} Fi ierul litere.txt con ine un text scris cu litere mari pe una sau mai multe linii. Se cere: a) S se afi eze litera ( literele) care apare de cele mai multe ori; b) S se afi eze vocalele din text. #include<iostream.h> #include<string.h> #include<fstream.h> #include<io.h> ifstream f("litere.txt"); int n; char a[100]; void citire() {int i; i=0; f>>a[i]; while(!f.eof()) {cout<<a[i]; i++; /*pt nu a avea surprize ca fisierul sa nu aiba decat majuscule transformam sirul in majusculele*/ strupr(a); f>>a[i]; } n=i; f.close(); }

void maxim() { int b[50]; cout<<"\n numarul de caractere="<<n<<"\n"; int k=0; for(char c='A';c<='Z';c++){ b[k]=0; for(int j=0;j<n;j++) if(c==a[j]) b[k]++; k++; } int max=b[0]; for(int i=1;i<k;i++) if(max<b[i])max=b[i]; cout<<"caracterele cu numar maxim de aparitii="<<max<<endl; for(i=0;i<k;i++) if(b[i]==max)cout<<char(65+i)<<" "; } void vocale() {char voc[]="AEIOU"; cout<<"\nvocalele din text\n"; for(int i=0;i<n;i++) for(int j=0;j<strlen(voc);j++) if(a[i]==voc[j])cout<<a[i]<<" "; cout<<"\n"; } void main() {citire(); maxim(); vocale(); } Fi ierele cuv1.txt i cuv2.txt con in cuvinte, cte un cuvnt pe linie n ordine alfabetic . S se construiasc fi ierul cuv3.txt care s con in toate cuvintele din cele dou fi iere, n ordine alfabetic . #include<iostream.h> #include<io.h> #include<string.h> #include<fstream.h> ifstream f1("cuv1.txt"); ifstream f2("cuv2.txt"); ofstream f("cuv3.txt"); char a[100][10],b[100][10],c[200][10]; int n,m; void citire_f1() { n=0; while(!f1.eof()) {f1>>a[n]; n++;} f1.close(); } void afisare_f1() { cout<<"\nfisierul cuv1.txt are "<<n<<" cuvinte\n"; for(int i=0;i<n;i++) cout<<a[i]<<"\n"; } void citire_f2() { m=0;

while(!f2.eof()) {f2>>b[m]; m++;} f2.close(); } void interclasare() { int x,k; int i=0,j=0; while(i<n&&j<m) {x=strcmp(a[i],b[j]); if(x>0){f<<b[j]<<endl;j++;} else {f<<a[i]<<endl;i++;} } //daca nu s-au afisat toate sirurile din a if(i<n) for(k=i;k<n;k++){f<<a[k]<<endl;} //daca nu s-au afisat toate sirurile din b if(j<m) for(k=j;k<m;k++){f<<b[k]<<endl;} f.close(); } void afisare_f2() { cout<<"\nfisierul cuv2.txt are "<<m<<" cuvinte\n"; for(int i=0;i<m;i++) cout<<b[i]<<"\n"; } void main() {citire_f1(); afisare_f1(); citire_f2(); afisare_f2(); interclasare(); } Fie fi ierul bingo.txt cu maxim 90 de numere naturale. Se cere: a) s se calculeze cmmdc al numerelor din fi ier; b) valoarea maxim din vector i pozi iile pe care se afl . #include<iostream.h> #include<io.h> #include<fstream.h> ifstream f("bingo.txt"); int a[90],n; void citire() {n=0; while(!f.eof()) f>>a[++n]; n--; f.close(); } void afisare() { cout<<"\nin fisier sunt "<<n<<" numere\n"; for(int i=1;i<=n;i++)cout<<a[i]<<" "; cout<<"\n"; } int cmmdc(int a,int b) { while(a!=b) if(a>b)a=a-b;

else b=b-a; return a; } void cmmdcn() { int c=cmmdc(a[1],a[2]); for(int i=3;i<=n;i++) c=cmmdc(c,a[i]); cout<<"cmmdc="<<c<<endl; } void maxim() { int max=a[1]; for(int i=1;i<=n;i++) if(max<a[i]) max=a[i]; cout<<"max="<<max<<endl; cout<<"pozitiile: "; for(i=1;i<=n;i++) if(a[i]==max) cout<<i<<" "; cout<<endl; } void main() { citire(); afisare(); cmmdcn(); maxim(); } fisiere2 n fi ierul text A2.IN se afl pe prima linie num rul natural n, n<1000. S se scrie n fi ierul A2.OUT pe prima linie separate prin spa ii numerele prime mai mici dect n, iar pe a doua linie separate prin spa ii primele n numere prime. #include<iostream.h> #include<io.h> #include<string.h> #include<fstream.h> ifstream f1("a2.in"); ofstream f2("a2.out"); int n; int prim(int n) { if(n<2) return 0; for(int i=2;i<=n/2;i++) if(n%i==0) return 0; return 1; } void citire() { f1>>n; f1.close(); } void afisare() { for(int i=2;i<=n;i++) if(prim(i)==1)f2<<i<<" "; f2<<endl; if(n>0){ int k=1; f2<<2<<" ";

i=3; while(k<n) {if(prim(i)==1){f2<<i<<" ";k++;} i+=2;} } f2.close(); } void main() { citire(); afisare(); } Din fi ierul matrice.txt se preiau de pe prima linie num rul de linii, respectiv de coloane, iar pe urm toarele linii elementele de pe fiecare linie a matricei, desp r ite prin spa ii. S se determine produsul numerelor pare de pe coloane impare i suma numerelor impare de pe coloane pare i s se afi eze n fi ierul rez.dat, fiecare pe cte o linie. #include<iostream.h> #include<io.h> #include<string.h> #include<fstream.h> ifstream f1("matrice.txt"); ofstream f2("rez.dat"); int a[50][50],n,m; void citire() { int x; f1>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) f1>>a[i][j]; f1.close(); } void afisare() { f2<<"Matricea este:\n"; for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) f2<<a[i][j]<<" "; f2<<endl; } } void produs() { float p; for(int j=1;j<=m;j++) { if(j%2==1) {p=1; for(int i=1;i<=n;i++) if(a[i][j]%2==0)p=p*a[i][j]; f2<<"produsul numerelor pare de pe coloana "<<j<<" este "<<p<<endl; } } } void suma() { float s; for(int j=1;j<=m;j++) { if(j%2==0)

{s=0; for(int i=1;i<=n;i++) if(a[i][j]%2==1)s=s+a[i][j]; f2<<"suma numerelor impare de pe coloana "<<j<<" este "<<s<<endl; } } } void main() { citire(); afisare(); produs(); suma(); f2.close(); } Fi ierul date.in con ine pe fiecare linie n l imea i numele unei persoane separate printr-un spa iu. Se cere: a) S se ordoneze alfabetic persoanele nscrise n fi ier; b) S se afi eze n l imea medie a acestora. #include<iostream.h> #include<io.h> #include<string.h> #include<fstream.h> ifstream f("date.in"); char nume[100][20]; int n; float inalt[100]; void citire() { n=0; while(!f.eof()) {n++; f>>inalt[n]>>nume[n]; } f.close(); } void afisare() { for(int i=1;i<=n;i++) cout<<inalt[i]<<" "<<nume[i]<<endl; } void sortare() { char aux[20]; float aux1; int x; for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) {x=strcmp(nume[i],nume[j]); if(x>0) {strcpy(aux,nume[i]); strcpy(nume[i],nume[j]); strcpy(nume[j],aux); aux1=inalt[i]; inalt[i]=inalt[j]; inalt[j]=aux1; } } }

void media() {float s=0; for(int i=1;i<=n;i++) s=s+inalt[i]; cout<<"media inaltimilor="<<(float)s/n; } void main() { citire(); cout<<"datele citite\n"; afisare(); sortare(); cout<<"numele in ordine alfabetica \n"; afisare(); media(); } matrici Se cite te o matrice cu n linii i m coloane i elemente numere ntregi. Se cere: a) S se determine elementele minime de pe fiecare linie; b) S se numere elementele pare de pe perimetrul matricei. #include<iostream.h> int a[30][30],n,m; void citire() {int i,j; cout<<"n=";cin>>n; cout<<"m=";cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) {cout<<"a["<<i<<"]["<<j<<"]"; cin>>a[i][j]; } } void minim_linie() {int min; for(int i=1;i<=n;i++) {min=a[i][1]; for(int j=1;j<=m;j++) if(min>a[i][j])min=a[i][j]; cout<<"min pe linia "<<i<<":"<<min<<endl; } } void perimetru() { int nr=0; for(int j=1;j<=m;j++) if(a[1][j]%2==0){cout<<a[1][j]<<" ";nr++;} for(int i=2;i<=n;i++) if(a[i][m]%2==0){cout<<a[i][m]<<" ";nr++;} for(j=1;j<=m-1;j++) if(a[n][j]%2==0){cout<<a[n][j]<<" ";nr++;} for(i=2;i<=n-1;i++) if(a[i][1]%2==0){cout<<a[i][1]<<" ";nr++;} cout<<"nr="<<nr; } void afisare() { for(int i=1;i<=n;i++) {

for(int j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<"\n"; }} void main() { citire(); afisare(); minim_linie(); perimetru(); } Se cite te o matrice p trat de dimensiune nxn i elemente numere ntregi. Se cere: a) S se afi eze numerele prime de pe diagonala principal ; b) S se formeze un vector cu elementele matricei parcurse n ordine pe coloane. #include<iostream.h> int a[30][30],n,m; void citire() {int i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {cout<<"a["<<i<<"]["<<j<<"]"; cin>>a[i][j]; } } void afisare() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<"\n"; } } int prim(int n) { if(n<=1) return 0; int i=2; while(i<=n/2) if(n%i==0) return 0; else i++; return 1; } void diagonala() { cout<<"elementele prime de pe diagonala principala\n"; for(int i=1;i<=n;i++) if(prim(a[i][i]))cout<<a[i][i]<<" "; cout<<endl; } void vector() {int b[900],i,j; cout<<"parcurgerea matricii pe coloane\n"; int nr=0; for(j=1;j<=n;j++) for (i=1;i<=n;i++) b[++nr]=a[i][j]; for(i=1;i<=nr;i++)

cout<<b[i]<<" "; cout<<"\n";} void main() { citire(); afisare(); diagonala(); vector(); } Se cite te o matrice cu n linii i m coloane. Se cere: a) S se formeze un vector n care se vor re ine elementele maxime de pe fiecare coloan a matricei; b) S se ordoneze vectorul format la punctul a. #include<iostream.h> int a[30][30],n,m,b[30]; void citire() {int i,j; cout<<"n=";cin>>n; cout<<"m=";cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) {cout<<"a["<<i<<"]["<<j<<"]"; cin>>a[i][j]; } } void maxim_linie() {int max; for(int j=1;j<=m;j++) {max=a[1][j]; for(int i=1;i<=m;i++) if(max<a[i][j])max=a[i][j]; b[j]=max; cout<<"max pe coloana "<<j<<max<<endl; } } void sortare() {int aux; cout<<"elementele sortate\n"; for(int i=1;i<=m-1;i++) for(int j=i+1;j<=m;j++) if(b[i]>b[j]) {aux=b[i];b[i]=b[j];b[j]=aux;} for(i=1;i<=m;i++)cout<<b[i]<<" "; cout<<endl; } void afisare() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<"\n"; }} void main() { citire(); afisare(); maxim_linie();

sortare(); } Se d o matrice x, cu n linii i n coloane, cu elemente ntregi. S se determine num rul elementelor din matrice care sunt < 24 i se g sesc deasupra diagonalei principale pe linii pare. #include<iostream.h> int a[30][30],n,m; void citire() {int i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {cout<<"a["<<i<<"]["<<j<<"]"; cin>>a[i][j]; } } void afisare() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<"\n"; } } void afis_deasupra_diagonala_principala() { for(int i=1;i<=n-1;i++) { for(int j=i+1;j<=n;j++) cout<<a[i][j]<<" "; cout<<"\n"; } } void contor() {int c=0; for(int i=1;i<=n-1;i++) { if(i%2==0) for(int j=i+1;j<=n;j++) if(a[i][j]<24)c++; } cout<<"c="<<c<<endl; } void main() { citire(); cout<<"matricea este\n"; afisare(); cout<<"elementele de deasupra diagonalei principale\n"; afis_deasupra_diagonala_principala(); contor(); } matrici2 Se d o matrice x, cu n linii i n coloane. S se determine maximul elementelor pare de pe coloana p. #include<iostream.h> int x[30][30],n,m; void citire()

{int i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {cout<<"x["<<i<<"]["<<j<<"]"; cin>>x[i][j]; } } void afisare() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<"\n"; } } void maxim_coloana_p() { int p; cout<<"nr coloanei p="; cin>>p; int max=-1; for(int i=1;i<=n;i++) if(x[i][p]%2==0) if(x[i][p]>max) max=x[i][p]; if(max>-1)cout<<"max="<<max<<endl; else cout<<"nu exista nr pare pe coloana p\n"; } void main() { citire(); cout<<"matricea este\n"; afisare(); maxim_coloana_p(); } Se consider o matrice cu m linii i n coloane, elementele matricei sunt numere ntregi. S se determine elementul minim de pe o coloan c, dat de la tastatur . #include<iostream.h> int x[30][30],n,m; void citire() {int i,j; cout<<"m=";cin>>m; cout<<"n=";cin>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) {cout<<"x["<<i<<"]["<<j<<"]"; cin>>x[i][j]; } } void afisare() { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<"\n"; } } void minim_coloana_p()

{ int c; cout<<"nr coloanei c="; cin>>c; int min=x[1][c]; for(int i=1;i<=m;i++) if(x[i][c]%2==0) if(x[i][c]<min) min=x[i][c]; cout<<"min="<<min<<endl; } void main() { citire(); cout<<"matricea este\n"; afisare(); minim_coloana_p(); } Se cite te un num r natural n. S se creeze o matrice care con ine: - cifrele num rului pe diagonala principal ; - valoarea elementelor r mase n matrice, s con in valoarea 0. #include<iostream.h> int a[30][30],n,lin; int nr_cifre(int n) { int nr=0; while(n!=0) {nr++;n=n/10;} return nr; } void matrice_cu_0() {lin=nr_cifre(n); for(int i=1;i<=lin;i++) for(int j=1;j<=lin;j++) a[i][j]=0; } void diagonala(int n) {int nr=0; while(n!=0) {nr++; a[nr][nr]=n%10; n=n/10; } } void afisare() { for (int i=1;i<=lin;i++) {for(int j=1;j<=lin;j++) cout<<a[i][j]<<" "; cout<<"\n"; } } void main() {cout<<"n=";cin>>n; matrice_cu_0(); diagonala(n); afisare(); } Se cite te o matrice cu m linii i n coloane, cu elemente numere ntregi.

S se interschimbe dou linii l1 si l2 (date), ntre ele, folosind un subprogram. #include<iostream.h> int x[30][30],n,m; void citire() {int i,j; cout<<"m=";cin>>m; cout<<"n=";cin>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) {cout<<"x["<<i<<"]["<<j<<"]"; cin>>x[i][j]; } } void afisare() { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<"\n"; } } void interschimbare_linii() { int l1,l2,aux; cout<<"linia l1=";cin>>l1; cout<<"linia l2=";cin>>l2; for(int i=1;i<=n;i++) { aux=x[l1][i]; x[l1][i]=x[l2][i]; x[l2][i]=aux;} } void main() { citire(); cout<<"matricea este\n"; afisare(); interschimbare_linii(); afisare(); } matrici 3 Se introduce de la tastatur o matrice p tratica de ordin n. Se cere s se calculeze i s se afi eze: a) suma tuturor elementelor ; b) suma elementelor de pe diagonala principal . #include<iostream.h> int x[30][30],n,m; void citire() {int i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {cout<<"x["<<i<<"]["<<j<<"]"; cin>>x[i][j]; } } void afisare()

{ for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<"\n"; } } void suma() { int s=0; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) s=s+x[i][j]; cout<<"suma elementelor din matrice="<<s<<endl; } void suma_diagonala_principala() { int s=0; for(int i=1;i<=n;i++) s=s+x[i][i]; cout<<"suma de pe diagonala principala="<<s<<endl; } void main() { citire(); cout<<"matricea este\n"; afisare(); suma(); suma_diagonala_principala(); } Se introduce de la tastatur o matrice p trat de ordin n cu elemente numere ntregi. Se cere s se calculeze i afi eze: a) suma elementelor de deasupra diagonalei principale ; b) suma elementelor de sub diagonala secundar . #include<iostream.h> int x[30][30],n,m; void citire() {int i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {cout<<"x["<<i<<"]["<<j<<"]"; cin>>x[i][j]; } } void afisare() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<"\n"; } } void deasupra_dp() { int s=0; for(int i=1;i<=n-1;i++) {for(int j=i+1;j<=n;j++)

{cout<<x[i][j]<<" ";s=s+x[i][j];} cout<<endl; } cout<<"suma elementelor de deasupra diagonalei principale="<<s<<endl; } void sub_ds() {int s=0; for(int i=2;i<=n;i++) {for(int j=n-i+2;j<=n;j++ ) {cout<<x[i][j]<<" ";s=s+x[i][j];} cout<<endl; } cout<<"suma elementelor de sub diagonala secundara="<<s<<endl; } void main() { citire(); cout<<"matricea este\n"; afisare(); cout<<"deasupra diagonalei principale\n"; deasupra_dp(); cout<<"sub diagonala secundara\n"; sub_ds(); } Se introduce de la tastatur o matrice cu m linii i n coloane cu elemente numere ntregi . Se cere s se calculeze i s se afi eze minimul pe o linie l a matricei (l num r natural citit de la tastatur l<=m). #include<iostream.h> #include<stdlib.h> int x[30][30],n,m; void citire() {int i,j; cout<<"m=";cin>>m; cout<<"n=";cin>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) {cout<<"x["<<i<<"]["<<j<<"]"; cin>>x[i][j]; } } void afisare() { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<"\n"; } } void minim_l() { int l,min; cout<<"linia l=";cin>>l; if(l<1||l>m){cout<<"eroare";exit(0);} min=x[l][1]; for(int i=1;i<=n;i++) if(x[l][i]<min)min=x[l][i]; cout<<"min="<<min; }

void main() { citire(); cout<<"matricea este\n"; afisare(); minim_l(); } structuri La o sta ie de benzin exist mai multe ma ini caracterizate prin num r, marc Se cere: a) S se determine num rul ma inilor Dacia; b) S se ordoneze ma inile dup culoare. #include<iostream.h> #include<string.h> #include<conio.h> typedef struct {char marca[20],culoare[20],med[20]; int nr;}masina ; masina a[20]; int n,x,k; void citire() {int i; cout<<"n=";cin>>n; for (i=1;i<=n;i++) {cout<<"a[i].marca: ";cin>>a[i].marca; cout<<"a[i].culoare: ";cin>>a[i].culoare; cout<<"a[i].numar: ";cin>>a[i].nr; } } void nr_dacia() { int i; int nr=0; for (i=1;i<=n;i++) {x=strcmp(a[i].marca,"dacia"); if (x==0) nr=nr+1;} cout<<"numarul de masini Dacia este "<<nr<<"\n"; } void sortare() { int i,j;masina aux; for (i=1;i<=n-1;i++) for (j=i+1;j<=n;j++) {x=strcmp(a[i].culoare,a[j].culoare); if(x>0) {aux=a[i]; a[i]=a[j]; a[j]=aux; } } for (i=1;i<=n;i++) cout<<a[i].culoare<<" "<<a[i].marca<<" "<<a[i].nr<<endl; } void main() { citire(); nr_dacia(); sortare(); } i culoare.

Pentru eviden a produselor cosmetice dintr-un depozit, se define te o structur cu urm toarele informa ii: codul produsului, denumire, pre ul produsului. Citi i informa iile tuturor produselor i afi a i produsele cu noile pre uri (valoarea lui x este 7 dac codul produsului este mai mic dect 500. i 11 n caz contrar). Afi a i produsele cu cel mai mare pre dup scumpire. #include<iostream.h> #include<string.h> #include<conio.h> typedef struct {int cod,c,p,pret; char den[20];}produse; produse a[20]; int n,i,c,p; void citire() { cout<<"Dati numarul de produse ";cin>>n; for (i=1;i<=n;i++) {cout<<"codul produsului ";cin>>a[i].cod; cout<<"pretul produsului ";cin>>a[i].pret; cout<<"denumirea produsului ";cin>>a[i].den;} } void rezolvare() { for (i=1;i<=n;i++) if(a[i].cod<500) a[i].pret=7; else a[i].pret=11; for (i=1;i<=n;i++) cout<<"pretul "<<a[i].den<<" este "<<a[i].pret<<"\n"; cout<<endl; for (i=1;i<=n;i++) if(a[i].pret==11) cout<<a[i].den<<"\n"; } void main() { citire(); rezolvare(); } Se citesc de la tastatur numele i media general a n elevi. Se cere s se afi eze lista elevilor n ordinea descresc toare a mediilor. #include<iostream.h> #include<string.h> typedef struct elev{ char nume[50]; float medie; }; elev a[100],aux; int n; void citire() {int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"a[i].nume: ";cin>>a[i].nume; cout<<"a[i].medie: ";cin>>a[i].medie; } } void sortare() {int i,j; for(i=1;i<n;i++)

{for(j=i+1;j<=n;j++) if(a[i].medie<a[j].medie) {aux=a[i]; a[i]=a[j]; a[j]=aux; } } } void afisare() {int i; for(i=1;i<=n;i++) cout<<a[i].nume<<" "<<a[i].medie<<endl; } void main() {citire(); cout<<"lista de elevi\n"; afisare(); sortare(); cout<<"dupa sortare\n"; afisare(); } Structuri de control Se cite te un num r natural n. S se determine cifra maxim din num r, folosind un subprogram. using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n; public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } public void maxcifra() { int u; int max = 0; /*impartim numarul in cifre si reinitializam maximul de cate ori gasim o cifra mai mare decat maximul*/ while (n != 0) { u = n % 10; n = n / 10; if (max < u) max=u; } Console.WriteLine("cifra maxima="+ max); } static void Main(string[] args) { numar x = new numar(); x.maxcifra(); Console.ReadKey(); } } Se introduce de la tastatur un num r ntreg n. Se cere s se calculeze i s se afi eze:

a) media aritmetic a cifrelor pare; b) produsul cifrelor impare using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n; public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } public void medie()//media cifrelor pare { int u; int nn=n; int s = 0; while (n != 0) { u = n % 10; n = n / 10; if (u%2==0) s=s+u; } Console.WriteLine("suma cifrelor pare=" + s); n = nn; } public void produs()//produsul cifrelor impare { int u; int nn = n; int p = 1; while (n != 0) { u = n % 10; n = n / 10; if (u % 2 == 1) p = p * u; } Console.WriteLine("produsul cifrelor impare=" + p); n = nn; } static void Main(string[] args) { numar x = new numar(); x.medie(); x.produs(); Console.ReadKey(); } } Se cite te de la tastatur un num r ntreg mai mare sau egal cu 1000. Se cere s se stabileasc dac num rul dat este palindrom sau nu, folosind un subprogram. using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n;

public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } public void palindorm() { int u; int nn = n;/*retinem valoarea lui n*/ int m = 0; /*construim numarul oglindit*/ while (n != 0) { u = n % 10; n = n / 10; m = m * 10 + u; } if (nn == m) Console.WriteLine("palindrom"); else Console.WriteLine("Numarul nu e palindrim"); } static void Main(string[] args) { numar x = new numar(); x.palindorm(); Console.ReadKey(); } } Se cite te de la tastatur un num r ntreg. Se cere s se stabileasc dac este perfect sau nu, folosind un subprogram. Un num r este perfect dac este egal cu suma divizorilor s i proprii plus 1. using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n; public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } void perfect() { int s = 0; for(int i=1;i<=n/2;i++) if (n%i==0)s=s+i; if(n==s)Console.WriteLine("numar perfect"); else Console.WriteLine("Nu e numar perfect"); } static void Main(string[] args) { numar x = new numar(); x.perfect(); Console.ReadKey(); } } Se cite te de la tastatur un num r ntreg .

Se cere s se calculeze i s se afi eze suma divizorilor proprii precum i num rul acestora. using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n; public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } void divizori() { int s = 0; int nr = 0; for(int i=2;i<=n/2;i++) if (n % i == 0) { s = s + i; nr++; } Console.WriteLine("suma divizorilor proprii="+s); Console.WriteLine("numarul de divizori proprii=" + nr); } static void Main(string[] args) { numar x = new numar(); x.divizori(); Console.ReadKey(); } } Se cite te de la tastatur un num r natural nenul n. Se cere s se calculeze i s se afi eze urm toarea sum : using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n; public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } void suma() { int s = 0; int p = 1; for (int i = 1; i <= n; i++) { p = p * i; s = s + p; } Console.WriteLine("valoarea expresiei ="+s); } static void Main(string[] args) { numar x = new numar(); x.suma(); Console.ReadKey();

1+1*2+1*2*3+1*2*3*4+...+1*2*...n .

} } Se cite te de la tastatur un num r natural nenul n. Se cere s se calculeze i s se afi eze urm toarea sum : 1+1/(1*2)+1/(1*2*3)+...+1/(1*2*3*...*n). using System; using System.Collections.Generic; using System.Linq; using System.Text; public class numar { int n; public numar() { Console.WriteLine("dati numarul "); this.n = int.Parse(Console.ReadLine()); } void suma() { double s = 0; double p = 1; for (int i = 1; i <= n; i++) { p = p * i; s = s + 1/p; } Console.WriteLine("valoarea expresiei =" + s); } static void Main(string[] args) { numar x = new numar(); x.suma(); Console.ReadKey(); } }

S-ar putea să vă placă și