0 evaluări0% au considerat acest document util (0 voturi)
15 vizualizări92 pagini
Lucrarea se adreseaza elevilor de clasa a 12-a care se pregatesc pentru
sustinerea examenului de atestat la Informatica.
Contine un set de probleme rezolvate in limbajul Pascal.
Lucrarea se adreseaza elevilor de clasa a 12-a care se pregatesc pentru
sustinerea examenului de atestat la Informatica.
Contine un set de probleme rezolvate in limbajul Pascal.
Lucrarea se adreseaza elevilor de clasa a 12-a care se pregatesc pentru
sustinerea examenului de atestat la Informatica.
Contine un set de probleme rezolvate in limbajul Pascal.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
ATESTAT - 2003 - 1 - Se citesc numere naturale pn la
introducerea a dou numere consecutive egale. Afiai toate perechile de numere citite consecutiv, care sunt prime ntre ele.. Rezolvare: Dou numere naturale A i B, diferite de 0, sunt prime ntre ele dac l au pe 1 ca singur divizor comun. Altfel spus, CMMDC al celor dou numere este egal cu 1. Nu este obligatoriu ca A i B s fie ele nsele prime. Exemplu: 15 i 16 NU sunt numere prime, dar sunt prime ntre ele, pentru c CMMDC (15, 16) = 1. Conform enunului, dac se citesc numere, nu se tie de la nceput cte (nu se d un n = numrul de numere ce se vor citi), deci va trebui s le numrm cu un contor i. Numerele pe care le vom introduce vor fi preluate ntr- un vector X. Definim o funcie CMMDC pentru a calcula CMMDC al dou numere consecutive (cele dou numere vor fi dou elemente consecutive din vectorul X). Program ATESTAT_2003_1_NUMERE_PRIME_INTRE_ELE ; CONST nmax = 100; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; VAR x : vect or ; n, i : i nt eger ; function CMMDC ( A, B : i nt eger ) : i nt eger ; var aux, R : i nt eger ; begi n i f A < B t hen begi n aux : = A; A : = B; B : = aux end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 4 R : = A MOD B; whi l e R <> 0 do begi n A : = B; B : = R; R : = A MOD B end; CMMDC : = B end; { sf ar si t f unct i e CMMDC } Begin { PROGRAM PRINCIPAL } i := 1; {cont or car e numar a numer el e i nt r oduse} wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ; {i nt r oducempr i mul numar } r eadl n ( x [ i ] ) ; REPEAT {i nt r oducemur mat oar el e numer e} i : = i + 1; wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ; r eadl n ( x [ i ] ) ; UNTI L ( x [ i ] = x [ i - 1] ) ; {pana ce apar doua numer e consecut i ve egal e} n := i; {n = t ot al numer e i nt r oduse = i } f or i : = 1 t o n - 1 do begi n i f CMMDC ( x [i], x [i+1] ) = 1 t hen wr i t el n ( x [ i ] , ' si ' , x [ i +1] , ' sunt pr i me i nt r e el e' ) ; end; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 5 ATESTAT - 2003 - 2 - Se citesc numere naturale pn la introducerea unui numr prim cu 12. Afiai toate numerele care sunt prime cu suma cifrelor lor. Rezolvare: Dou numere sunt prime ntre ele dac CMMDC al celor dou numere este 1 (vezi problema anterioar). Introducem primul numr, notat cu x. Verificm dac x este prim cu 12 i dac DA, oprim algoritmul; dac nu, verificm dac este prim cu suma cifrelor sale. Pentru c vom introduce mai multe numere, dar nu tim de la nceput cte anume, introducerea urmtoarelor numere se va face ntr-un ciclu WHILE. Definim o funcie CMMDC pentru a calcula CMMDC al dou numere. Definim o funcie NUMARACIFRE, pentru a numra cifrele unui numr natural. Definim o procedur DETCIFRE, care determin cifrele unui numr i le depune ntr-un vector. Definim o funcie SUMACIFRE, care nsumeaz cifrele unui numr. Program ATESTAT_2003_2_NUMERE_PRIME_CU_SUMA_CIFRELOR_LOR ; CONST nmax = 100; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; VAR y : vect or ; S, x, n, i : i nt eger ; function CMMDC ( A, B : i nt eger ) : i nt eger ; var aux, R : i nt eger ; begi n i f A < B t hen begi n aux : = A; A : = B; Probleme rezolvate de programare Subiecte propuse la ATESTAT 6 B : = aux end; R : = A MOD B; whi l e R <> 0 do begi n A : = B; B : = R; R : = A MOD B end; CMMDC : = B end; { sf ar si t f unct i e CMMDC } function NUMARACIFRE ( z : i nt eger ) : i nt eger ; var nr ci f : i nt eger ; begi n i f z = 0 t hen nr ci f : = 1 el se begi n nr ci f : = 0; whi l e z > 0 do begi n z := z DIV 10; nrcif := nrcif + 1 end; end; NUMARACI FRE : = nr ci f ; end; { sf ar si t f unct i e NUMARACI FRE } Probleme rezolvate de programare Subiecte propuse la ATESTAT 7 procedure DETCIFRE ( z : i nt eger ; VAR y : vect or ) ; { det er mi na ci f r el e l ui z si l e depune i n vect or ul y } begi n n : = NUMARACI FRE ( z ) ; i : = n; whi l e i >= 1 do begi n y [ i ] := z MOD 10; z := z DIV 10; i := i - 1 end; end; { sf ar si t pr oc. DETCI FRE } function SUMACIFRE ( z : i nt eger ) : i nt eger ; var s : i nt eger ; begi n DETCIFRE ( z, y ); S : = 0; f or i : = 1 t o n do begi n S : = S + y [ i ] end; SUMACI FRE : = S; end; { sf ar si t f unct i e SUMACI FRE } Begin { PROGRAM PRINCIPAL } wr i t e ( ' Dat i x = ' ) ; {I nt r oducer ea primului numr} r eadl n ( x ) ; while CMMDC ( x, 12 ) <> 1 do {testm dac x este prim cu 12} begi n S : = SUMACIFRE ( x) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 8 i f CMMDC ( x, S) = 1 t hen wr i t el n ( ' x = ' , x, ' est e pr i mcu suma ci f r el or sal e S = ' , s) el se wr i t el n ( ' x = ' , x, ' NU est e pr i m cu suma ci f r el or sal e S = ' , s) ; wr i t e ( ' Dat i x = ' ) ; {Introducerea urmtoarelor numere} r eadl n ( x ) ; end; r eadl n; end. ATESTAT - 2003 - 3 - Fie x un numr natural. Stabilii care este factorul prim care, n descompunerea lui x, apare la puterea maxim. Rezolvare: Notm cu d un posibil divizor al lui x. Evident, d poate lua valori consecutive ncepnd de la 2 pn la x, dar nu orice valoare ntre 2 i x este i divizor al lui x. Contorul nr numr de cte ori x se mparte exact la un d >=2. Dup fiecare mprire exact a lui x la d, noul x devine x DIV d. Repetm (ntr-un ciclu WHILE) aceste calcule att timp ct x > 1. Probleme rezolvate de programare Subiecte propuse la ATESTAT 9 Plecm cu d de la valoarea 2 i nu de la 1, pentru a evita un ciclu infinit n urma atribuirii x := x DIV d. Dac s-ar iniializa d cu 1, n urma atribuirii x := x DIV d, noua valoare a lui x ar rmne ntotdeauna = x, deci divizorul d = 1 s-ar numra de o infinitate de ori (gsindu-l pe 1 ca divizor de o infinitate de ori, nu s-ar mai trece niciodat la d =2, prin atribuirea d := d + 1). Reinem n variabila max cel mai mare numr de mpriri ale lui x la un divizor d. Notm cu divizor divizorul pentru care numrul de mpriri este max. Program ATESTAT_2003_3 ; {determin divizorul care apare la puterea maxim } VAR x, d, nr , MAX, di vi zor : i nt eger ; Begin { PROGRAM PRINCIPAL } wr i t e ( ' Dat i x = ' ) ; r eadl n ( x) ; d : = 2; {pr i mul di vi zor posi bi l } max : = 0; {i ni t i al i zar e MAX} nr : = 0; {i ni t i al i zar e numar de i mpar t i r i al e l ui x l a d} whi l e x > 1 do begi n I f x MOD d = 0 t hen {daca x se i mpar t e l a d} begi n nr : = nr + 1; x : = x DI V d; i f max < nr t hen begi n max : = nr ; wr i t el n ( ' Di vi zor ul ' , d, ' apar e de ' , max, ' or i ' ) ; di vi zor : = d; Probleme rezolvate de programare Subiecte propuse la ATESTAT 10 end end el se begi n d : = d + 1; nr : = 0 end; end; wr i t el n; wr i t el n ( ' Di vi zor ul ' , divizor, ' apar e l a put er ea maxi ma = ' , max) ; r eadl n end. ATESTAT - 2003 - 4 - Se citesc pe rnd n numere naturale. Afiai-le pe cele care sunt termeni ai irului lui Fibonacci. Rezolvare: Presupunem c numerele x NU sunt introduse n ordine. Folosim o bucl exterioar n care introducem cte un x. Folosim o bucl interioar n care generm un nou termen FIBONACCI, ct timp numrul x introdus rmne > termenul FIBONACCI generat. Termenii irului FIBONACCI se rein n vectorul FIBO. Probleme rezolvate de programare Subiecte propuse la ATESTAT 11 Program ATESTAT_2003_4_Fibonacci ; CONST nmax = 100; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; VAR FI BO : vect or ; x, n, i , j : i nt eger ; Begin { PROGRAM PRINCIPAL } wr i t e ( ' Dat i nr . de numer e nat ur al e, n = ' ) ; r eadl n ( n ) ; f or i : = 1 t o n do {bucla exterioar} begi n wr i t e ( ' Dat i x = ' ) ; r eadl n ( x) ; FI BO [ 1] : = 1; {iniializarea primilor termeni ai irului} FI BO [ 2] : = 1; j : = 3; whi l e x > FI BO [ j ] do {bucl a interioar} begi n FI BO [ j ] : = FI BO [ j - 1] + FI BO [ j - 2] ; j : = j + 1 end; {sf ar si t bucla interioar} i f x = FI BO [ j ] t hen wr i t el n ( ' x = ' , x, ' est e t er men FI BO' ) el se wr i t el n ( ' x = ' , x, ' NU est e t er men FI BO' ) Probleme rezolvate de programare Subiecte propuse la ATESTAT 12 end; {sf ar si t bucl a exterioar} r eadl n end. ATESTAT - 2003 - 5 - Se citesc pe rnd n numere naturale. Afiai perechile de numere citite succesiv, care sunt termeni ai irului lui Fibonacci. Rezolvare: Definim funcia VERIFICA, pentru a testa dac un numr este termen FIBONACCI. Numerele pe care le introducem se vor reine ntr-un vector x. Pentru introducerea vectorului, definim procedura CITESTEVECTOR. Program ATESTAT_2003_5_Fibonacci ; CONST nmax = 100; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; VAR x, FI BO : vect or ; n, i , j : i nt eger ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 13 function VERIFICA ( z : i nt eger ) : BOOLEAN; var OK : BOOLEAN; begi n OK : = FALSE; FI BO [ 1] : = 1; FI BO [ 2] : = 1; i f ( z = 1) t hen OK : = TRUE; j := 3; whi l e z > FI BO [ j ] do begi n FI BO [ j ] : = FI BO [ j - 1] + FI BO [ j - 2] ; j : = j + 1 end; i f z = FI BO [ j ] t hen OK : = TRUE; VERI FI CA : = OK; end; { sf ar si t f unct i e VERI FI CA } procedure CITESTEVECTOR ( VAR v : vect or ; n : i nt eger ) ; begi n f or i : = 1 t o n do begi n wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ; r eadl n ( v [ i ] ) ; end; end; Begin { PROGRAM PRINCIPAL } wr i t e ( ' Dat i nr . de numer e nat ur al e, n = ' ) ; r eadl n ( n ) ; CITESTEVECTOR ( x, n) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 14 f or i : = 1 t o n- 1 do begi n i f ( VERI FI CA ( x[ i ] ) = TRUE ) AND ( VERI FI CA ( x[ i +1] ) = TRUE ) t hen wr i t el n ( x [ i ] , ' si ' , x [ i + 1 ] , ' sunt t er meni FI BO' ) el se wr i t el n ( x [ i ] , ' si ' , x [ i + 1 ] , ' NU sunt t er meni FI BO' ) ; end; r eadl n end. ATESTAT - 2003 - 6 - S se genereze toate numerele de 5 cifre care au doar cifre pare i sunt divizibile cu 13. Rezolvare: Notm cu a, b, c, d, e cifrele numrului x. Verificarea se va face pentru toate numerele x cuprinse ntre 20000 i 88888. Se definete o funcie CIFREPARE, care verific dac toate cifrele numrului x sunt pare. Probleme rezolvate de programare Subiecte propuse la ATESTAT 15 Program ATESTAT_2003_6 ; VAR x, y, z, t , u, v, a, b, c, d, e : l ongi nt ; function CIFREPARE( z : i nt eger ) : BOOLEAN; begi n e : = x MOD 10; y : = x DI V 10; d : = y MOD 10; z : = y DI V 10; c : = z MOD 10; t : = z DI V 10; b : = t MOD 10; v : = t DI V 10; a : = v MOD 10; i f ( a MOD 2 = 0) AND ( b MOD 2 = 0) AND ( c MOD 2 = 0) AND ( d MOD 2 = 0) AND ( e MOD 2 = 0) t hen CI FREPARE : = TRUE ELSE CI FREPARE : = FALSE; end; { sf ar si t f unct i e CI FREPARE } Begin { PROGRAM PRINCIPAL } f or x : = 20000 t o 88888 do begi n i f ( CI FREPARE ( x) = TRUE ) AND ( x MOD 13 = 0 ) t hen begi n wr i t el n ( ' x = ' , x, ' ar e t oat e ci f r el e par e si se di vi de l a 13' ) ; wr i t el n ( ' Apasat i ENTER' ) ; r eadl n end; end; r eadl n end. ATESTAT - 2003 - 7 - S se genereze toate numerele de 6 cifre, care au cifrele ordonate descresctor, prima i ultima cifr fiind impare. Probleme rezolvate de programare Subiecte propuse la ATESTAT 16 Rezolvare: Notm cu a, b, c, d, e, f cifrele numrului x. Definim funcia VERIFICA (x), care determin cifrele lui x si apoi face verificrile impuse de problem. Numerele testate sunt cuprinse ntre 987653 i 654321. Program ATESTAT_2003_7 ; VAR x, y, z, t , u, v, w, a, b, c, d, e, f : l ongi nt ; function VERIFICA ( z : l ongi nt ) : BOOLEAN; begi n f : = x MOD 10; {det er mi nar ea ci f r el or l ui x} y : = x DI V 10; e : = y MOD 10; z : = y DI V 10; d : = z MOD 10; t : = z DI V 10; c : = t MOD 10; v : = t DI V 10; b : = v MOD 10; w : = v DI V 10; a : = w MOD 10; Probleme rezolvate de programare Subiecte propuse la ATESTAT 17 i f ( a > b) AND ( b >c) AND ( c >d) AND ( d >e) AND ( e >f ) t hen begi n i f ( a MOD 2 <> 0 ) AND ( f MOD 2 <> 0) t hen VERI FI CA : = TRUE el se VERI FI CA : = FALSE end el se VERI FI CA : = FALSE; end; { sf ar si t f unct i e VERI FI CA } Begin { PROGRAM PRINCIPAL } f or x : = 987653 downt o 654321 do begi n i f VERI FI CA ( x) = TRUE t hen begi n wr i t el n ( ' x = ' , x ) ; wr i t el n ( ' Apasat i ENTER' ) ; r eadl n end; end; r eadl n end. ATESTAT - 2003 - 8 - S se determine toate cuvintele de 5 litere ce conin mcar dou vocale i au a 2-a liter m. Rezolvare: Generm cuvintele folosind un ir de caractere cuvant de lungime =5. Pe poziia 2 din cuvant va fi ntotdeauna litera m, deci cuvant [2] := 'm'. Pe celelalte 4 poziii (1, 3, 4, 5) din cuvant vom plasa consoane i vocale. Pentru aceasta, folosim 4 bucle FOR n care contorii de tip CHAR vor fi chiar Probleme rezolvate de programare Subiecte propuse la ATESTAT 18 elementele irului cuvant de pe poziiile 1, 3, 4, 5 (cuvant [1], cuvant [3], cuvant [4], cuvant [5]), care vor lua valori de tip CHAR de la a la z. Pentru fiecare poziie din irul cuvant testm dac pe poziia respectiv se afl o vocal i dac DA, numrm acea vocal, folosind contorul nrvocale. Dup generarea unei combinaii de vocale i consoane care compun un cuvnt (la sfritul buclei FOR de la interior), testm dac nrvocale >= 2 i dac DA, numrm cuvntul care satisface condiiile problemei (majorm contorul i) i afim cuvntul. La nceputul buclei FOR situate cel mai interior, trebuie s iniializm, de fiecare dat, contorul care numr vocalele, scriind nrvocale := 0; Program ATESTAT_2003_8 ; uses cr t ; var cuvant : st r i ng; i , nr vocal e : i nt eger ; Begin { PROGRAM PRINCIPAL } i := 0; {i = cont or car e numr cuvi nt el e pe car e l e vomgener a} cuvant [2] := 'm'; Probleme rezolvate de programare Subiecte propuse la ATESTAT 19 f or cuvant [ 1] : = ' a' t o ' z' do begi n f or cuvant [ 3] : = ' a' t o ' z' do begi n f or cuvant [ 4] : = ' a' t o ' z' do begi n f or cuvant [ 5] : = ' a' t o ' z' do begi n nrvocale := 0; {contor ce numr vocalele di n cuvant} i f cuvant [ 1] I N [ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen nr vocal e : = nr vocal e + 1; i f cuvant [ 3] I N [ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen nr vocal e : = nr vocal e + 1; i f cuvant [ 4] I N [ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen nr vocal e : = nr vocal e + 1; i f cuvant [ 5] I N [ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen nr vocal e : = nr vocal e + 1; i f nr vocal e >= 2 t hen begi n i := i + 1; wr i t el n ( ' i = ' , i ) ; wr i t el n ( ' cuvant ul = ' , cuvant [ 1] , cuvant [ 2] , cuvant [ 3] , cuvant [ 4] , cuvant [ 5] ) ; end; r eadl n end end; end; end; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 20 ATESTAT - 2003 - 9 - S se afieze toate matricile ptratice n x n care conin pe fiecare linie i coloan un singur 1, n rest 0. Rezolvare: Aceast problem este asemntoare cu problema celor n regine, pe care o vom adapta la cerinele de mai sus. Asociem unei regine o cifr de 1. Problema reginelor cere s se plaseze n regine pe o tabl de ah de dimensiune n x n, astfel nct oricare dou regine s nu se atace. Pentru ca dou regine s nu se atace, ele trebuie s nu fie situate pe aceeai linie, pe aceeai coloan sau pe aceeai diagonal. La noi, rolul reginelor va fi jucat de elementele egale cu 1 din matricea ptratic n x n. n cazul problemei noastre, vom renuna la cerina ca elementele matricii egale cu 1 s nu fie plasate pe aceeai diagonal. Pe fiecare linie trebuie s fie plasat cte o regin. Deci, pentru ca poziia reginelor s fie complet determinat, este suficient s reinem, pentru fiecare regin, coloana n care este plasat, ntr-un vector soluie f, de dimensiune n, unde f [i] reprezint coloana n care este plasat regina de pe linia i. Generarea matricilor n condiiile problemei se face apelnd la un algoritm backtracking. Observaii: Notm cu x, respectiv i o linie oarecare i cu f [x], respectiv f [i], coloana pe care se gsete regina de pe linia x, respectiv linia i. Condiiile interne: a). f [x] =1, 2, ..., n, pentru oricare x =1, 2, ..., n b). Dou regine nu pot fi plasate pe aceeai coloan se va exprima analitic astfel: f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n. Definim o procedur AFIARE astfel: Probleme rezolvate de programare Subiecte propuse la ATESTAT 21 n momentul apelrii procedurii, este evident c s-a gsit o soluie pe care o numrm scriind: Nrsol := Nrsol + 1 i apoi afim Nrsol. Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem nevoie de un contor poziional col care va lua valori de la 1 la n. n procedur, col este o coloan curent, iar f [lin] este tot o coloan, i anume coloana pe care se gsete regina de pe linia lin. Procedura va tipri " * " dac pe coloana curent col exist o regin, adic atunci cnd col = f [lin], i va tipri "o" dac aceast condiie nu este satisfcut. Program ATESTAT_2003_9 ; uses cr t ; const nrmaxregine = 8; {8 sau alt valoare} t ype vect or sol ut i e = ar r ay [ 0. . nr maxr egi ne] of 0. . nr maxr egi ne; var f : vect or sol ut i e; n, x, i : 0 . . nr maxr egi ne; ok : bool ean; nr sol : wor d; procedure AFISARE; var i , j : 0 . . nr maxr egi ne; begi n nr sol : = nr sol + 1; wr i t el n; wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ; f or i : = 1 t o n do begi n f or j : = 1 t o n do begi n i f j = f [ i ] t hen wr i t e ( ' 1 ' ) el se Probleme rezolvate de programare Subiecte propuse la ATESTAT 22 wr i t e ( ' o ' ) end; wr i t el n; end; wr i t el n; r eadl n end; { sf ar si t pr ocedur a } Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e ( ' I nt r oducet i numar ul de pat r at el e n = ' ) ; r eadl n ( n) ; nr sol : =0; x : = 1; { vi r f ul st i vei } f [ x] : = 0; whi l e x > 0 do { ci t t i mp st i va nu est e vi da } begi n whi l e f [ x] < n do { ci t t i mp exi st a val or i di sponi bi l e } begi n f [ x] : = f [ x] + 1; ok : = t r ue; Probleme rezolvate de programare Subiecte propuse la ATESTAT 23 f or i : = 1 t o x - 1 do begi n i f ( f [ i ] = f [ x] ) t hen begi n ok : = f al se; end end; i f ok = t r ue t hen { val oar ea est e val i da } begi n i f x = n t hen { st i va est e pl i na } AFISARE el se begi n x := x + 1; {PAS INAINTE} f [ x] : = 0 end; end; end; { sf ar si t WHI LE i nt er i or } x := x 1 {PAS INAPOI} end; { sf ar si t WHI LE ext er i or } r eadl n end. ATESTAT - 2003 - 10 - S se genereze toate permutrile mulimii {1, 2,... n} cu condiia ca orice dou numere alturate ale unei permutrii s fie prime ntre ele. Rezolvare: Definim o funcie CMMDC pentru a calcula CMMDC al dou numere. Funcia CMMDC va fi apelat n procedura PERMUT, pentru a se testa dac dou numere alturate ale unei permutri sunt prime ntre ele. Cu excepia acestei verificri impuse de enunul problemei Probleme rezolvate de programare Subiecte propuse la ATESTAT 24 de fa, procedura PERMUT are acelai coninut ca i cel de la generarea permutrilor de ordinul n. Program ATESTAT_2003_10_PERMUTARI ; uses cr t ; const nmax = 100; t ype vect or = ar r ay [ 1. . nmax] of i nt eger ; var f : vect or ; sol , n, i : i nt eger ; OK : bool ean; function CMMDC ( A, B : i nt eger ) : i nt eger ; var aux, R : i nt eger ; begi n i f A < B t hen begi n aux : = A; A : = B; B : = aux end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 25 R : = A MOD B; whi l e R <> 0 do begi n A : = B; B : = R; R : = A MOD B end; CMMDC : = B end; { sf ar si t f unct i e CMMDC } procedure VERIFICA ( k : i nt eger ; f : vect or ; VAR CONTI N : bool ean ) ; LABEL 10; begi n CONTI N : = TRUE; f or i : = 1 t o k - 1 do begi n i f f [ i ] = f [ k] t hen begi n CONTI N : = FALSE; GOTO 10 end; end; 10: end; procedure SCRIE ; begi n sol : = sol + 1; wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ; f or i : = 1 t o n do begi n wr i t e ( f [ i ] : 3 ) end; wr i t el n end; procedure PERMUTA ( m: i nt eger ) ; LABEL 20; Probleme rezolvate de programare Subiecte propuse la ATESTAT 26 var k : i nt eger ; CONTI N : bool ean; Begi n {nceput procedur PERMUTA} k : = 1; f [ k] : = 0; whi l e k > 0 do begi n CONTI N : = FALSE; whi l e f [ k] < mdo begi n f [ k] : = f [ k] + 1; VERIFICA ( k, f , CONTI N) ; i f CONTI N = TRUE t hen GOTO 20 end; 20: i f ( CONTI N = TRUE ) AND ( k = n) t hen begi n OK : = TRUE; Probleme rezolvate de programare Subiecte propuse la ATESTAT 27 f or i : = 1 t o n - 1 do begi n i f CMMDC ( f[i], f[i-1] ) <> 1 t hen OK : = FALSE end; i f OK = TRUE t hen SCRIE; end; i f ( CONTI N = TRUE ) and ( k < n) t hen begi n k : = k + 1; f [ k] : = 0 end; i f CONTI N = FALSE t hen k : = k - 1 end; {sfrit WHILE exterior} end; {sfrit procedur PERMUTA} Begin { PROGRAM PRINCIPAL } cl r scr ; sol : = 0; wr i t e( ' Dat i n = ' ) ; r eadl n ( n) ; wr i t el n; PERMUTA (n); i f sol = 0 t hen wr i t el n ( ' Nu exi st a sol ut i e' ) ; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 28 ATESTAT - 2003 - 11 - S se genereze toate variantele de punctaje ce aparin {1, 2,... 10} obinute la n examene, astfel nct punctajul obinut s fie minim. Rezolvare: Generarea combinaiilor de note se face dup algoritmul BACKTRACKING. Folosim un vector max n care memorm nota maxim obinut la fiecare din cele n examene. Evident, vectorul max va avea n elemente. n algoritmul de generare a produsului cartezian din lucrarea amintit, am notat cu f [x] o valoare numeric dintr-o poziie x. Adaptm aceste notaii la problema noastr: n loc de x notm cu poz poziia n care se gsete o not n combinaia de note care va fi generat i cu nota [poz], nota de pe poziia poz. Poziia poz va lua valori de la 1 la n (n =total examene). Evident, nota va fi un vector cu max [i] elemente, unde i este numrul de ordine al unui examen. Probleme rezolvate de programare Subiecte propuse la ATESTAT 29 Program ATESTAT_2003_11_Produs_cartezian_EXAMENE; uses CRT; t ype vect or = ar r ay [ 1. . 20] of i nt eger ; {20 = nr . de examene} var i , poz, n : i nt eger ; max, not a : vect or ; S, mi n : i nt eger ; procedure SCRIE; begi n wr i t e ( ' { ' ) ; f or i : = 1 t o n - 1 do begi n wr i t e ( not a[ i ] , ' , ' ) ; end; wr i t e ( not a[ n] , ' ' ) ; wr i t e ( ' } ' ) ; wr i t el n; end; Begin { PROGRAM PRINCIPAL } CLRSCR; wr i t e ( ' I nt r oducet i numar ul de EXAMENE, n = ' ) ; r eadl n ( n) ; wr i t el n; wr i t el n ( Pent r u f i ecar e examen, pr eci zat i car e est e not a MAXI MA ) ; wr i t el n ( ' Scr i et i 10 pt . not e de l a 1 l a 10 : ' ) ; wr i t el n; f or i : = 1 t o n do begi n wr i t e ( ' Pent r u examenul ' , i , ' Car e est e not a MAXI MA ? ' ) ; r eadl n ( max [ i ] ) ; end; wr i t el n; Wr i t el n ( ' Punct aj ul mi ni m= suma not el or l a f i ecar e examen' ) ; wr i t e ( ' Pr eci zat i punct aj ul MI NI M pe car e vr et i sa- l obt i net i , Mi n = ' ) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 30 r eadl n ( mi n) ; poz : = 1; {nceput algoritm BACKTRACKING} not a [ poz] : = 0; whi l e poz > 0 do begi n i f nota [poz] < max [poz] t hen begi n not a [ poz] : = not a [ poz] + 1; i f poz = n t hen begi n S : = 0; f or i : = 1 t o n do S := S + nota [i] ; i f S = min t hen SCRIE; end el se begi n poz := poz + 1; {PAS NAI NTE} not a [ poz] : = 0 end end el se poz := poz 1 {PAS NAPOI } end; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 31 ATESTAT - 2003 - 12 - Afiai numere prime mai mici dect un numr n citit de la tastatur, care rmn prime i dup ce au fost inversate. Rezolvare: Definim o funcie PRIM, cu rezultat de tip BOOLEAN, care testeaz dac un numr este prim. Definim o funcie INVERS care inverseaz elementele unui ir. n programul principal, nainte de a inversa un numr x, l transformm mai nti ntr-un ir cu funcia STR. Dup inversare, transformm irul obinut ntr-un numr cu funcia VAL. Testm dac numrul obinut prin inversare este i el prim. Program ATESTAT_2003_12 ; uses cr t ; var i nver sul , si r : st r i ng; a, b, i , x, n, i nvx : i nt eger ; function PRIM ( x : i nt eger ) : bool ean; var nr di v, di vi z : i nt eger ; begi n nr di v : = 0; di vi z : = 1; whi l e di vi z <= x do begi n i f x MOD di vi z = 0 t hen nr di v : = nr di v + 1; di vi z : = di vi z + 1 end; i f nrdiv = 2 t hen PRI M : = TRUE el se PRI M : = FALSE; end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 32 function INVERS ( s : st r i ng) : st r i ng; var i nv : st r i ng; begi n i nv : = ' ' ; f or i : = LENGTH ( s) DOWNTO 1 do begi n i nv : = i nv + s [ i ] end; I NVERS : = i nv ; end; Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e( ' Dat i n = ' ) ; r eadl n ( n) ; wr i t el n; f or x : = 1 t o n do begi n STR ( x, si r ) ; i nver sul : = INVERS ( si r ) ; VAL ( i nver sul , a, b) ; i nvx : = a; Probleme rezolvate de programare Subiecte propuse la ATESTAT 33 i f PRI M ( x) = TRUE t hen begi n i f PRIM ( i nvx) = TRUE t hen begi n wr i t el n ( ' x = ' , x, ' = pr i m' ) ; wr i t el n ( ' i nvx = ' , i nvx, ' = pr i m' ) ; end; end; end; r eadl n end. ATESTAT - 2003 - 13 - Se citete un vector cu n componente numere ntregi. S se determine CMMDC al valorilor din vector. Rezolvare: Definim funcia CMMDC cu care calculm CMMDC al dou numere. Calculm CMMDC al primelor dou numere din vector (x1 si x2) i l notm cu C[1]. ncepnd de la i = 2 pn la n, facem atribuirile: x [i] := C [i-1]; C [i] := CMMDC ( x [i], x [i+1] ) Altfel spus, calculm CMMDC dintre CMMDC-ul anterior i urmtorul element al vectorului. Program ATESTAT_2003_13 ; uses cr t ; const nmax = 100; t ype vect or = ar r ay [ 1. . nmax] of i nt eger ; var x, C : vect or ; sol , n, i : i nt eger ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 34 function CMMDC ( A, B : i nt eger ) : i nt eger ; var aux, R : i nt eger ; begi n i f A < B t hen begi n aux : = A; A : = B; B : = aux end; R : = A MOD B; whi l e R <> 0 do begi n A : = B; B : = R; R : = A MOD B end; CMMDC : = B end; { sf ar si t f unct i e CMMDC } Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e( ' Dat i n = ' ) ; r eadl n ( n) ; wr i t el n; Probleme rezolvate de programare Subiecte propuse la ATESTAT 35 wr i t el n ( ' Dat i vect or ul ' ) ; wr i t el n; f or i : = 1 t o n do begi n wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ; r eadl n ( x [ i ] ) ; end; C [1] := CMMDC ( x[1], x [2] ); f or i : = 2 to n-1 do begi n x [i] := C [i-1]; C [i] := CMMDC ( x [i], x [i+1] ) end; wr i t el n ( ' CMMDC = ' , C [n-1] ) ; r eadl n end. ATESTAT - 2003 - 14 - Se citesc 2 numere naturale A < B. S se tipreasc toate numerele PALINDROAME dintre A i B. Un numr este PALINDROM dac, citit direct i invers, rezultatul este acelai (dac este egal cu inversul su). Exemplu: 323 este PALINDROM. Rezolvare: Definim o funcie NRCIFRE pentru a numra cifrele unui numr natural. Definim o funcie PALINDROM n care: - determinm numrul de cifre pentru un numr natural; - extragem din numrul natural cifrele i le depunem ntr-un vector y; - verificm dac vectorul y este simetric (PALINDROM). Probleme rezolvate de programare Subiecte propuse la ATESTAT 36 n programul principal, apelm funcia PALINDROM pentru toate numerele naturale dintre A i B i le afim doar pe acelea care sunt palindroame. Program ATESTAT_2003_14 ; uses cr t ; VAR A, B, x, n, nr ci f , i : i nt eger ; OK : bool ean; y : ar r ay [ 1. . 100] of i nt eger ; function NRCIFRE ( x : i nt eger ) : i nt eger ; begi n i f x = 0 t hen nr ci f : = 1 el se begi n nr ci f : = 0; whi l e x <> 0 do begi n nr ci f : = nr ci f + 1; x : = x DI V 10 end; end; NRCI FRE : = nr ci f end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 37 function PALINDROM ( x : i nt eger ) : bool ean; begi n n : = NRCI FRE ( x) ; f or i : = n DOWNTO 1 do begi n y [ i ] : = x MOD 10; x : = x DI V 10; end; OK : = TRUE; f or i : = 1 t o n DI V 2 do begi n i f y [ i ] <> y [ n- i +1] t hen OK : = FALSE end; PALI NDROM : = OK end; Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e ( ' Dat i A = ' ) ; r eadl n ( A) ; wr i t el n; wr i t e ( ' Dat i B = ' ) ; r eadl n ( B) ; wr i t el n; cl r scr ; f or x : = A t o B do begi n i f PALINDROM ( x) = TRUE t hen wr i t el n ( ' x = ' , x, ' est e PALI NDROM' ) ; { el se wr i t el n ( ' x = ' , x, ' NU est e pal i ndr om' ) ; } {r eadl n; } end; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 38 ATESTAT - 2003 - 15 - Se citete un vector cu n componente ntregi. Care este cea mai mare sum care se poate forma cu ele? Exemplu: n =4, iar numerele citite sunt 1, 3, 2, -7. Se va tipri 5. Rezolvare: Numerele ntregi introduse vor fi reinute ntr-un vector x. Numerele ntregi introduse pot fi pozitive, negative sau nule. Evident, suma cea mai mare ce se poate obine din ntregul ir de numere va rezulta prin nsumarea doar a numerelor pozitive. Notm cu Spoz suma numerelor strict pozitive. ntr-o bucl FOR, vom aduga la aceast sum cte un termen, doar dac acest termen este strict > 0. Program ATESTAT_2003_15 ; uses cr t ; VAR Spoz, n, i : i nt eger ; x : ar r ay [ 1. . 100] of i nt eger ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 39 Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e ( ' Dat i n = ' ) ; r eadl n ( n) ; wr i t el n; wr i t el n ( ' Dat i vect or ul ' ) ; f or i : = 1 t o n do begi n wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ; r eadl n ( x [ i ] ) ; end; wr i t el n; Spoz : = 0; f or i : = 1 t o n do begi n i f x [i] > 0 t hen Spoz := Spoz + x [i]; end; wr i t el n ( ' Spoz = ' , Spoz) ; r eadl n end. ATESTAT - 2003 - 16 Interschimbai coloanele unei matrici cu m linii i n coloane astfel nct, n linia k, elementele s fie ordonate cresctor. Rezolvare: Ordonm linia k. n cursul procesului de ordonare, o parte din elementele liniei k se interschimb ntre ele. n paralel cu ordonarea, interschimbm i coloanele corespunztoare elementelor de pe linia k supuse interschimbrilor. Probleme rezolvate de programare Subiecte propuse la ATESTAT 40 Program ATESTAT_2003_16 ; uses cr t ; VAR OK, m, n, i , j , k : i nt eger ; A : ar r ay [ 1. . 100, 1. . 100] of i nt eger ; aux : i nt eger ; Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e( ' Dat i m= ' ) ; r eadl n ( m) ; wr i t el n; wr i t e ( ' Dat i n = ' ) ; r eadl n ( n) ; wr i t el n; wr i t e ( ' Dat i l i ni a k = ' ) ; r eadl n ( k) ; wr i t el n; Probleme rezolvate de programare Subiecte propuse la ATESTAT 41 wr i t el n ( ' Dat i mat r i cea' ) ; f or i : = 1 t o mdo begi n f or j : = 1 t o n do begi n wr i t e ( ' Dat i A [ ' , i , ' , ' , j , ' ] = ' ) ; r eadl n ( A [ i , j ] ) ; end; end; REPEAT {Ordonm linia k, pr i n met oda BUBBLE- SORT} OK : = 0; j : = 1; REPEAT i f A [ k, j ] > A [ k, j +1] t hen begi n f or i : = 1 t o mdo begi n aux : = A [ i , j ] ; A [ i , j ] : = A [ i , j +1] ; A [ i , j +1] : = aux; OK : = 1; end; end; j : = j + 1; UNTI L ( j > n - 1) ; UNTI L ( OK = 0) ; wr i t el n; wr i t el n ( ' Mat r i cea or donat a est e' ) ; f or i : = 1 t o mdo begi n f or j : = 1 t o n do begi n wr i t e ( ' A [ ' , i , ' , ' , j , ' ] = ' , A [ i , j ] , ' ' ) ; end; wr i t el n; end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 42 r eadl n end. ATESTAT - 2003 - 17 - Se citete un text i o succesiune de caractere. De cte ori ntlnim aceast succesiune n cadrul textului ? Rezolvare: Apelm funcia POS (subir, ir) i determinm poziia unde apare subir n ir. Dac poziia determinat este <> 0, atunci majorm contorul nrapariii, care numr apariiile subirului n ir. De asemenea, dac poziia determinat este <> 0, tergem din irul dat caracterele, de la poziia 1, pe o lungime = poziia + LENGTH (subir) 1, unde poziia este valoarea determinat cu funcia POS. Probleme rezolvate de programare Subiecte propuse la ATESTAT 43 Program ATESTAT_2003_17 ; uses cr t ; var si r , subsi r : st r i ng; pozi t i a, nr apar i t i i : i nt eger ; OK : bool ean; Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e( ' Dat i si r ul = ' ) ; r eadl n ( si r ) ; wr i t el n; wr i t el n ( ' Dat i subsi r ul = ' ) ; r eadl n ( subsi r ) ; wr i t el n; nraparitii := 0; OK := TRUE; { pr esupun ca subsi r ul exi st a } whi l e ( si r <> ' ' ) AND ( OK = TRUE ) do begi n pozi t i a : = POS ( subsi r , si r ) ; i f pozi t i a <> 0 t hen begi n nr apar i t i i : = nr apar i t i i + 1 ; DELETE ( si r , 1, pozi t i a + LENGTH ( subsi r ) - 1 ) end el se OK : = FALSE end; wr i t el n ( ' nr apar i t i i = ' , nr apar i t i i ) ; r eadl n end. ATESTAT - 2003 - 18 - Problema celor 8 regine. S se afieze toate posibilitile de a se aeza, pe o tabl de ah, 8 regine fr s se atace ntre ele. Rezolvare: Probleme rezolvate de programare Subiecte propuse la ATESTAT 44 Problema reginelor cere s se plaseze n regine pe o tabl de ah de dimensiune n x n astfel nct oricare dou regine s nu se atace. Pentru ca dou regine s nu se atace, ele trebuie s nu fie situate pe aceeai linie, pe aceeai coloan sau pe aceeai diagonal. Pe fiecare linie trebuie s fie plasat cte o regin. Deci, pentru ca poziia reginelor s fie complet determinat, este suficient s reinem, pentru fiecare regin, coloana n care este plasat, ntr-un vector soluie f, de dimensiune n, unde f [i] reprezint coloana n care este plasat regina de pe linia i. Generarea matricilor care afieaz poziiile reginelor, n condiiile problemei, se va face apelnd la un algoritm backtracking. Observaii: Notm cu x, respectiv i o linie oarecare i cu f [x], respectiv f [i] coloana pe care se gsete regina de pe linia x, respectiv linia i. Condiiile interne: a). f [x] =1, 2, ..., n, pentru oricare x =1, 2, ..., n b). Condiia dou regine nu pot fi plasate pe aceeai coloan se va exprima analitic astfel: f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n. c). Dou regine nu pot fi plasate pe aceeai diagonal. Dac regina de pe linia i, coloana f [i] este pe aceeai diagonal cu regina de pe linia x, coloana f [x], atunci triunghiul dreptunghic care se formeaz are unghiurile de 45 grade, este deci isoscel (catetele sale vor fi egale), ceea ce se poate scrie astfel: | i - x | = | f [ i ] - f [ x ] | Cum acest lucru nu este permis de problem, condiia dou regine nu pot fi plasate pe aceeai diagonal se va exprima astfel: | f [i] - f [x] | <> | i - x | pentru orice i, x =1, 2, ..., n Probleme rezolvate de programare Subiecte propuse la ATESTAT 45 Definim o procedur AFIARE astfel nct: n momentul apelrii procedurii, evident s-a gsit o soluie pe care o numrm scriind: Nrsol := Nrsol +1 i apoi afim Nrsol. Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem nevoie de un contor poziional col care va lua valori de la 1 la n. n procedur, col este o coloan curent, iar f [lin] este tot o coloan, i anume coloana pe care se gsete regina de pe linia lin. Procedura va tipri " * " dac pe coloana curent col exist o regin, adic atunci cnd col = f [lin], i va tipri "o" dac aceast condiie nu este satisfcut. Program ATESTAT_2003_18_REGINE ; uses cr t ; const nr maxr egi ne = 8; t ype vect or sol ut i e = ar r ay [ 0. . nr maxr egi ne] of 0. . nr maxr egi ne; var f : vect or sol ut i e; n, x, i : 0 . . nr maxr egi ne; ok : bool ean; nr sol : wor d; procedure AFISARE; var i , j : 0 . . nr maxr egi ne; begi n nr sol : = nr sol + 1; wr i t el n; wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ; f or i : = 1 t o n do begi n f or j : = 1 t o n do Probleme rezolvate de programare Subiecte propuse la ATESTAT 46 begi n i f j = f [ i ] t hen wr i t e ( ' * ' ) el se wr i t e ( ' o ' ) end; wr i t el n; end; wr i t el n; r eadl n end; { sf ar si t pr ocedur a } Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e ( ' I nt r oducet i numar ul de pat r at el e n = ' ) ; r eadl n ( n) ; nrsol: =0; x : = 1; { vi r f ul st i vei } f [ x] : = 0; while x > 0 do { ct t i mp st i va nu est e vid nceput algoritm } begi n { backtracking } while f [ x] < n do { ct t i mp exist valori disponibile } begi n f [ x] : = f [ x] + 1; Probleme rezolvate de programare Subiecte propuse la ATESTAT 47 ok : = t r ue; f or i : = 1 t o x - 1 do begi n i f ( f [ i ] = f [ x] ) OR ( ABS ( i - x) = ABS ( f [ i ] - f [ x] ) ) t hen begi n ok : = f al se; end end; i f ok = t r ue t hen { val oar ea este valid } begi n i f x = n t hen { st i va este plin } AFI SARE el se begi n x := x + 1; {PAS NAINTE} f [ x] : = 0 end; end; end; { sf ar si t WHI LE i nt er i or } x := x 1 {PAS NAPOI} end; { sf ar si t WHI LE ext er i or } r eadl n end. ATESTAT - 2003 - 19 - Se dau dou numere naturale n i k. S se genereze toate combinrile de n elemente luate cte k. Rezolvare: Aplicm algoritmul BACKTRACKING pentru generarea combinrilor. Program ATESTAT_2003_19_COMBINARI_BACKTRACKING_1 ; uses CRT; CONST Probleme rezolvate de programare Subiecte propuse la ATESTAT 48 Kmax = 20; { nr . max a l ui k } Nmax = 50; { nr . max a l ui n } TYPE f unct i e = ar r ay [ 1 . . Kmax ] of 0 . . Nmax; VAR k, poz, i : 1 . . Kmax; { se consi der a k <= n } n : 0 . . Nmax; f : f unct i e; I MAG : set of 1 . . Nmax; { I MAG = mul t i mea i magi ni l or el ement el or di n A } { adi ca f [ poz] } Begin { PROGRAM PRINCIPAL } cl r scr ; REPEAT wr i t e ( ' k = ' ) ; r eadl n ( k) ; UNTI L ( k >= 1 ) AND ( k <= Kmax) ; REPEAT wr i t e ( ' I nt r oducet i un n >= ' , k, ' n = ' ) ; r eadl n ( n) ; i f n < k t hen wr i t el n ( ' Pent r u acest n = ' , n, ' Nu exi st a sol ut i i ' ) UNTI L ( n >= k) AND ( n >= 1 ) AND ( n<= Nmax ) ; wr i t el n; Probleme rezolvate de programare Subiecte propuse la ATESTAT 49 poz : = 1; {poz = vrful stivei } f [ poz] : = 0 ; whi l e poz > 0 do { ct t i mp st i va nu est e vid } begi n whi l e f [poz] < n - k + poz do { a doua condiie intern } begi n f [ poz] : = f [ poz] + 1; i f poz = k t hen { dac stiva este plin } begi n f or i : = 1 t o k do begi n wr i t e ( ' f [ ' , i , ' ] = ' , f [ i ] , ' ' ) ; end; wr i t el n; wr i t el n end el se begi n poz := poz + 1 ; { I NSERARE i n STI VA } f [ poz] : = f [ poz - 1] end; end; { sf ar si t WHI LE i nt er i or } poz := poz - 1; { EXTRAGERE di n STI VA = PAS I NAPOI } end; { sf ar si t WHI LE ext er i or } r eadl n end. ATESTAT - 2003 - 20 - S se genereze toate irurile de lungime n formate numai din literele A i M, iruri Probleme rezolvate de programare Subiecte propuse la ATESTAT 50 care s nu aib dou litere A alturate. Numrul n (0 < n < 13) se citete de la tastatur. Fiecare ir va fi scris pe cte un rnd al ecranului fr spaiu ntre litere. Rezolvare: Problema const n generarea produsului cartezian al mulimilor de caractere. Generarea combinaiilor de litere se face dup algoritmul BACKTRACKING. Algoritmul de generare a produsului cartezian va genera valori numerice cuprinse ntre 1 i elementul maxim al unei mulimi implicate n acest produs. Cum pe noi ne intereseaz combinaiile de litere a i m, vom asocia unui numr din cte o mulime o liter, astfel: dac f [i] = 1, atunci sir [i] = a dac f [i] = 2, atunci sir [i] = m. Nu ne intereseaz dect aceste valori ale lui f [i]. Procedura SCRIE se va apela n mod opional, pentru a observa modul de generare a produsului cartezian n varianta sa numeric. Procedura SCRIETEXT va afia doar combinaiile de litere a i m. Funcia boolean VECINI testeaz dac avem litera a pe dou poziii vecine. Funcia boolean EXIST verific dac n ir exist i cifra 1. n acest fel se vor elimina combinaiile care nu-l conin pe 1 (adic acele combinaii de litere care nu conin litera a i care, deci, nu ne intereseaz). Vectorul nrelem reine numrul de elemente al fiecrei mulimi din produsul cartezian. Poz = poziia unui element ntr-o mulime a produsului cartezian. Probleme rezolvate de programare Subiecte propuse la ATESTAT 51 Program ATESTAT_2003_20_Produs_cartezian_AMA ; uses CRT; t ype vect or = ar r ay [ 1. . 20] of i nt eger ; var i , poz, n : i nt eger ; nr el em, f : vect or ; si r : st r i ng; procedure SCRIE; {procedura opional} begi n wr i t e ( ' { ' ) ; f or i : = 1 t o n - 1 do begi n wr i t e ( f [ i ] , ' , ' ) ; end; wr i t e ( f [ n] , ' ' ) ; wr i t e ( ' } ' ) ; wr i t el n; end; procedure SCRIETEXT; begi n f or i : = 1 t o n do begi n i f f [ i ] = 1 t hen si r [ i ] : = ' a' ; i f f [ i ] = 2 t hen si r [ i ] : = ' m' ; wr i t e ( si r [ i ] , ' ' ) ; end; wr i t el n; end; function VECINI: bool ean; var OK : bool ean; begi n OK : = FALSE; f or i : = 1 t o n - 1 do begi n i f ( f [ i ] = 1 ) AND ( f [ i + 1] = 1) t hen OK : = TRUE end; VECI NI : = OK end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 52 function EXISTA : bool ean; { ver i f i ca daca i n si r exi st a si ci f r a 1 } var OK : bool ean; begi n OK : = FALSE; f or i : = 1 t o n do begi n i f f [ i ] = 1 t hen OK : = TRUE end; EXI STA : = OK; end; Begin { PROGRAM PRINCIPAL } CLRSCR; wr i t e ( ' St abi l i t i numar ul de mul t i mi , n = ' ) ; r eadl n ( n) ; f or i : = 1 t o n do begi n wr i t e ( ' Cat e el ement e ar e mul t i mea ' , i , ' : ' ) ; r eadl n ( nr el em[ i ] ) ; end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 53 poz : = 1; f [ poz] : = 0; whi l e poz > 0 do begi n i f f [ poz] < nr el em[ poz] t hen begi n f [ poz] : = f [ poz] + 1; i f poz = n t hen begi n i f ( NOT VECINI) AND ( EXISTA) t hen begi n {SCRI E; } {apel opt i onal al acest ei pr ocedur i } SCRIETEXT; End; end el se begi n poz : = poz + 1; {PAS INAINTE} f [ poz] : = 0 end end el se poz : = poz 1 {PAS INAPOI} end; r eadl n end. ATESTAT - 2003 - 21 - Generarea permutrilor de n elemente, n >0. Rezolvare: Aplicnd algoritmul BACKTRACKING, vom genera permutrile de ordinul n n variant iterativ. Program ATESTAT_2003_21_PERMUTARI_ITERATIV; Probleme rezolvate de programare Subiecte propuse la ATESTAT 54 uses cr t ; const nmax = 100; t ype vect or = ar r ay [ 1. . nmax] of i nt eger ; var f : vect or ; sol , n, i : i nt eger ; procedure VERIFICA ( k : i nt eger ; f : vect or ; VAR CONTI N : bool ean ) ; LABEL 10; begi n CONTI N : = TRUE; f or i : = 1 t o k - 1 do begi n i f f [ i ] = f [ k] t hen begi n CONTI N : = FALSE; GOTO 10 end; end; 10: end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 55 procedure SCRIE ; begi n sol : = sol + 1; wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ; f or i : = 1 t o n do begi n wr i t e ( f [ i ] : 3 ) end; wr i t el n end; procedure PERMUTA ( m: i nt eger ) ; LABEL 20; var poz : i nt eger ; CONTI N : bool ean; begi n poz : = 1; f [ poz] : = 0; while poz > 0 do begi n CONTI N : = FALSE; while f [ poz] < mdo begi n f [ poz] : = f [ poz] + 1; VERIFICA ( poz, f , CONTI N) ; i f CONTI N = TRUE t hen GOTO 20 end; {sf ar si t WHI LE i nt er i or } 20: i f ( CONTI N = TRUE ) AND ( poz = n) t hen SCRIE; i f ( CONTI N = TRUE ) and ( poz < n) t hen begi n poz : = poz + 1; {PAS INAINTE} f [ poz] : = 0 end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 56 i f CONTI N = FALSE t hen poz : = poz 1 {PAS INAPOI} end; {sf ar si t WHI LE ext er i or } end; {sf ar si t pr ocedur a PERMUTA} Begin { PROGRAM PRINCIPAL } cl r scr ; sol : = 0; wr i t e( ' Dat i n = ' ) ; r eadl n ( n) ; wr i t el n; PERMUTA (n); i f sol = 0 t hen wr i t el n ( ' Nu exi st a sol ut i e' ) ; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 57 ATESTAT - 2003 - 22 - S se afieze termenii irului lui Fibonacci, pentru un n dat. Rezolvare: Termenii irului vor fi reinui ntr-un tablou FIBO. Generarea termenilor se va face n variant iterativ. Program ATESTAT_2003_22 ; CONST nmax = 100; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; VAR FI BO : vect or ; n, i : i nt eger ; Begin { PROGRAM PRINCIPAL } wr i t e ( ' Dat i numr aul de t er meni , n = ' ) ; r eadl n ( n) ; FI BO [ 1] : = 1; FI BO [ 2] : = 1; f or i : = 3 t o n do begi n FI BO [ i ] : = FI BO [ i - 1] + FI BO[ i - 2] ; end; f or i : = 1 t o n do begi n wr i t el n ( FI BO [ i ] , ' = ' , FI BO [ i ] ) end; r eadl n end. ATESTAT - 2003 - 23 - Fie A un ir cu n elemente ntregi, n > 0. S se ordoneze cresctor folosind metoda bulelor. Probleme rezolvate de programare Subiecte propuse la ATESTAT 58 Rezolvare: Definim procedura ORDONEAZA, bazat pe algoritmul de sortare BUBBLE-SORT. Definim procedura TIPARESTE, care afieaz vectorul sortat. Program ATESTAT_2003_23_BUBBLE_SORT ; uses CRT; const nmax = 30; t ype vect or = ar r ay [ 1. . nmax] of i nt eger ; var a : vect or ; i , n : i nt eger ; procedure ORDONEAZA ( var x: vect or ; m: i nt eger ) ; var k, j , aux: i nt eger ; begi n r epeat k: = 0; j : = 1; Probleme rezolvate de programare Subiecte propuse la ATESTAT 59 r epeat i f x[ j ] < x [ j +1] t hen begi n aux : = x[ j ] ; x[ j ] : = x[ j +1] ; x[ j +1] : = aux; k : = 1 end; j : = j + 1 unt i l ( j > m- 1) unt i l ( k = 0) ; end; procedure TIPARESTE ( x: vect or ; m: i nt eger ) ; begi n f or i : = 1 t o mdo begi n wr i t el n ( ' x [ i ] = ' , x [ i ] ) end end; Begin { PROGRAM PRINCIPAL } clrscr; wr i t e ( ' I nt r oducet i n = ' ) ; r eadl n ( n) ; wr i t el n; f or i : = 1 t o n do begi n wr i t e ( ' a [ i ] = ' ) ; r eadl n ( a [ i ] ) end; wr i t el n; r eadl n; clrscr; wr i t el n; ORDONEAZA ( a, n) ; TIPARESTE ( a, n) ; wr i t el n; r eadl n Probleme rezolvate de programare Subiecte propuse la ATESTAT 60 end. ATESTAT - 2003 - 24 - Fie A i B doi vectori cu cte m, respectiv n elemente numere ntregi (m >0, n >0), ordonai cresctor. S se interclaseze, n vectorul C, vectorii A i B. Rezolvare: Program ATESTAT_2003_24_INTERCLASARE ; uses CRT; CONST nmax = 50; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; vect or t ot = ar r ay [ 1. . 2*nmax] of i nt eger ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 61 var m, n, i , j , k : i nt eger ; A, B : vect or ; C : vect or t ot ; Begin { PROGRAM PRINCIPAL } cl r scr ; wr i t e ( ' Dat i numar ul de el ement e al e vect or ul ui a, m= ' ) ; r eadl n ( m) ; wr i t e ( ' Dat i numar ul de el ement e al e vect or ul ui b, n = ' ) ; r eadl n ( n) ; wr i t el n; wr i t el n ( ' Dat i pr i mul vect or SORTAT : ' ) ; wr i t el n; f or i : = 1 t o mdo begi n wr i t e ( ' A [ ' , i , ' ] = ' ) ; r eadl n ( A [ i ] ) ; end; wr i t el n; wr i t el n ( ' Dat i al doi l ea vect or SORTAT' ) ; wr i t el n; f or j : = 1 t o n do begi n wr i t e ( ' B [ ' , j , ' ] = ' ) ; r eadl n ( B [ j ] ) ; end; k : = 0; i : = 1; j : = 1; WHI LE ( i <= m) AND ( j <= n) do begi n i f A [ i ] <= B [ j ] t hen begi n k : = k + 1; C [ k] : = A [ i ] ; i : = i + 1; end Probleme rezolvate de programare Subiecte propuse la ATESTAT 62 el se begi n k : = k + 1; C [ k] : = B [ j ] ; j : = j + 1; end; end; WHI LE i <= mdo begi n k : = k + 1; C [ k] : = A [ i ] ; i : = i + 1 end; WHI LE j <= n do begi n k : = k + 1; C [ k] : = B [ j ] ; j : = j + 1 end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 63 wr i t el n; wr i t el n ( ' Vect or ul r ezul t at i n ur ma i nt er cl asar i i est e: ' ) ; wr i t el n; f or k : = 1 t o m + n do begi n wr i t el n ( ' C [ ' , k, ' ] = ' , C [ k] ) ; end; r eadl n end. ATESTAT - 2003 - 25 - Fie X un vector ordonat cu n elemente numere ntregi, n > 0 i elem o valoare ntreag, citit de la tastatur. S se decid dac elem se gsete n vectorul X, folosind metoda Divide et Impera. Rezolvare: Program ATESTAT_2003_25_Cautare_Binara_Recursiva ; uses CRT; t ype vect or = ar r ay [ 1. . 20] of i nt eger ; VAR x : vect or ; el em, n, i : i nt eger ; GASI T : bool ean; {GASI T = TRUE daca el ement ul a f ost gasi t si FALSE daca nu} procedure CAUTA ( i ncep, sf : i nt eger ; VAR GASI T : bool ean ) ; var m: i nt eger ; begi n I F i ncep <= sf t hen begi n m: = ( i ncep + sf ) DI V 2; i f el em= x [ m] t hen Probleme rezolvate de programare Subiecte propuse la ATESTAT 64 GASI T : = t r ue el se i f el em< x [ m] t hen CAUTA ( i ncep, m- 1, GASI T) el se CAUTA ( m+1, sf , GASI T) end ELSE GASI T : = f al se end; {sf ar si t pr ocedur a} Begin { PROGRAM PRINCIPAL } CLRSCR; wr i t e ( ' n = ' ) ; r eadl n ( n) ; f or i : = 1 t o n do begi n wr i t e ( ' x [ ' , i , ' ] = ' ) ; r eadl n ( x[ i ] ) ; end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 65 wr i t el n; wr i t e ( ' Dat i el ement ul caut at , el em= ' ) ; r eadl n ( el em) ; CAUTA ( 1, n, GASI T) ; i f GASI T = t r ue t hen wr i t el n ( el em, ' exi st a' ) el se wr i t el n ( el em, ' nu exi st a' ) ; r eadl n end. ATESTAT - 2003 - 26 - Fie n numere ntregi a1, a2, ... an, cu n > 0. S se determine CMMDC al celor n numere, prin metoda DEI. Rezolvare: Prin metoda DEI (Divide-Et-Impera) se determin CMMDC pentru prima jumtate a vectorului, apoi pentru cea de-a doua jumtate, dup care vom reuni rezultatele. Program ATESTAT_2003_26_CMMDC_DEI ; CONST nmax = 100; TYPE vect or = ar r ay [ 1. . nmax] of i nt eger ; VAR x : vect or ; C, n, i : i nt eger ; function CMMDC ( A, B : i nt eger ) : i nt eger ; var aux, R : i nt eger ; begi n i f A < B t hen begi n aux : = A; A : = B; B : = aux end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 66 R : = A MOD B; whi l e R <> 0 do begi n A : = B; B : = R; R : = A MOD B end; CMMDC : = B end; { sf ar si t f unct i e CMMDC } function DIVCOM ( i ncep, sf : i nt eger ) : i nt eger ; { det er mi na CMMDC pr i n DEI } VAR mi j , C1, C2 : i nt eger ; begi n i f i ncep = sf t hen DI VCOM : = x [ i ncep] el se begi n i f sf - i ncep = 1 t hen DI VCOM : = CMMDC ( x [ i ncep] , x [ sf ] ) Probleme rezolvate de programare Subiecte propuse la ATESTAT 67 el se begi n mi j : = ( i ncep + sf ) DI V 2; C1 : = DI VCOM ( i ncep, mi j ) ; C2 : = DI VCOM ( mi j + 1, sf ) ; DI VCOM : = CMMDC ( C1, C2) end end end; { sf ar si t f unct i e DI VCOM } Begin { PROGRAM PRINCIPAL } wr i t e ( ' Dat i nr . de el ement e al e vect or ul ui , n = ' ) ; r eadl n ( n) ; f or i : = 1 t o n do begi n wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ; r eadl n ( x [ i ] ) end; C : = DI VCOM ( 1, n) ; wr i t el n ( ' C = ' , C) ; r eadl n end. ATESTAT - 2003 - 27 - Fie A un ir cu n numere ntregi, n > 0. S se ordoneze cresctor folosind metoda sortrii prin numrare. Rezolvare: Descrierea metodei: Iat o situaie concret: la ora de educaie fizic elevii trebuie s se aeze n ordinea cresctoare a nlimii. Fiecare elev va numra ci colegi sunt mai mici ca nlime dect el. Astfel, dac un elev E va ti c are 15 Probleme rezolvate de programare Subiecte propuse la ATESTAT 68 colegi mai mici dect el, atunci elevul E se va aeza pe poziia 16. Metoda de sortare prin numrare const n urmtoarele: Fie A un vector cu n elemente. Se va crea un vector NR astfel nct : NR [i] ="numrul de valori din A mai mici dect A[i]". Folosim un vector auxiliar C, n care vom prelua elementele sortate ale vectorului A. Fiecare element A[i] va fi trecut n C n poziia NR [i] + 1. Pentru exemplul de mai sus, pentru elevul E, NR [i] = 15, iar poziia pe care trebuie s-o ocupe E n vectorul sortat va fi 16, deci NR [i] + 1. Program ATESTAT_2003_27_SORTARE_PRIN_NUMARARE ; uses CRT; const nmax = 100; t ype vect or = ar r ay [ 1. . 10] of i nt eger ; var A: vect or ; i , n: i nt eger ; procedure CITIRE ( var A: vect or ; n: i nt eger ) ; var i : i nt eger ; begi n f or i : =1 t o n do begi n wr i t e ( ' Dat i A [ ' , i , ' ] = ' ) ; r eadl n ( A [ i ] ) ; end; end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 69 pr ocedur e AFISARE ( v: vect or ; m: i nt eger ) ; begi n f or i : = 1 t o mdo begi n wr i t el n ( ' A [ ' , i , ' ] = ' , v [ i ] ) end end; procedure ORDONARE ( var A: vect or ; n: i nt eger ) ; var NR, C: vect or ; j , i : i nt eger ; begi n {Pentru fiecare element A[i] se numr n A ct e el ement e sunt mai mi ci dect A [ i ] ; numrul obinut n urma numrrii se trece n NR [ i ] } f or i : = 1 t o n do NR [i] := 0; f or i : = 2 to n do begi n f or j : = 1 to i - 1 do begi n i f A [ i ] > A [ j ] t hen NR [i] := NR [i] + 1 ELSE NR [j] := NR [j] + 1; End; { sfrit for interior} end; {sfrit for exterior} {Vom cr ea vect or ul t empor ar C, n care se rein elementele n ordine cresctoare, i apoi l vom copi a n A. Dac A [i] ar e NR[i] el ement e mai mi ci dect el , at unci , n vect or ul or donat , A [i] va fi n poziia NR [i] + 1}. f or i : = 1 t o n do C [ NR [i] + 1 ] := A [i]; {copi em n A el ement el e l ui C} f or i : =1 t o n do A [i] := C [i]; Probleme rezolvate de programare Subiecte propuse la ATESTAT 70 end; {sf ar si t pr ocedur a ORDONARE} Begin { PROGRAM PRINCIPAL } clrscr; wr i t e ( ' Dat i numar ul de el ement e al e vect or ul ui , n = ' ) ; r eadl n ( n) ; CITIRE (A, n); ORDONARE (A, n); AFISARE (A, n); end. ATESTAT - 2003 - 28 - S se citeasc din fiierul VEC.TXT, vectorul V de ntregi i s se calculeze apoi media aritmetic a elementelor pozitive. Rezolvare: Atenie ! Fiierul VEC.TXT trebuie s existe pe discul C: i s conin valori. Dac nu exist, l vom crea, ca mai jos, dup care l vom accesa, citind din el ntregi, n condiiile problemei. Program ATESTAT_2003_28 ; VAR f : f i l e of i nt eger ; Spoz, poz, x, v, n, i : i nt eger ; Med : r eal ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 71 Begin { PROGRAM PRINCIPAL } ASSI GN ( f , ' C: \ VEC. TXT' ) ; r ewr i t e ( f ) ; { CREAREA lui VEC.TXT } wr i t e ( ' Dat i numar ul de i nt r egi di n f i si er , n = ' ) ; r eadl n ( n) ; wr i t el n ( ' I nt r oducet i el ement el e f i si er ul ui ( pozi t i ve si negat i ve) ' ) ; f or i : = 1 t o n do begi n wr i t e ( ' Dat i un i nt r egul al ' , i , ' l ea x = ' ) ; r eadl n ( x) ; wr i t e ( f , x) ; end; RESET ( f ) ; {pr egat i r e f i si er pent r u ci t i r e} Spoz : = 0; { i ni t i al i zar e suma pozi t i ve } poz : = 0; whi l e not EOF ( f ) do begi n READ ( f , v) ; { ci t esc o component a di n f } i f v > 0 t hen begi n poz : = poz + 1; Spoz : = Spoz + v; end; end; i f poz > 0 t hen begi n Med : = Spoz / poz; wr i t el n ( ' Medi a pozi t i vel or = ' , Med) ; end el se wr i t el n ( ' Nu exi st a numer e pozi t i ve' ) ; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 72 ATESTAT - 2003 - 29 - S se calculeze maximul elementelor matricii A (m, n) i s se adauge la sfritul fiierului text MAT.TXT. Rezolvare: Vom folosi un algoritm cunoscut pentru determinarea maximului dintr-un ir de numere. Program ATESTAT_2003_29 ; CONST nmax = 30; TYPE mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of r eal ; VAR A : mat r i ce; f : f i l e of r eal ; m, n, i , j : i nt eger ; x, Max : r eal ; Begin { PROGRAM PRINCIPAL } ASSI GN ( f , ' C: \ MAT. TXT' ) ; r ewr i t e ( f ) ; r epeat wr i t e ( ' Dat i m= ' ) ; r eadl n ( m) unt i l ( m>= 1) AND ( m<= nmax) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 73 r epeat wr i t e ( ' Dat i n = ' ) ; r eadl n ( n) unt i l ( n >= 1) AND ( n <= nmax) ; wr i t el n ( ' Dat i mat r i cea' ) ; f or i : = 1 t o mdo begi n f or j : = 1 t o n do begi n wr i t e ( ' Dat i A [ ' , i , ' , ' , j , ' ] = ' ) ; r eadl n ( A [ i , j ] ) ; end; end; max : = A [ 1, 1] ; f or i : = 1 t o mdo begi n f or j : = 1 t o n do begi n i f max < A [ i , j ] t hen Max : = A [ i , j ] end; end; wr i t el n ( ' Max = ' , Max) ; RESET ( f ) ; whi l e not EOF ( f ) do begi n r ead ( f , x) end; wr i t e ( f , max) ; RESET ( f ) ; READ ( f , x) ; Max : = x; wr i t el n ( ' Max ci t i t di n f i si er est e = ' , max) ; r eadl n end. ATESTAT - 2003 - 30 - S se scrie la sfritul fiierului text DIV.TXT toi divizorii naturali ai numrului ntreg x. Probleme rezolvate de programare Subiecte propuse la ATESTAT 74 Rezolvare: Folosim algoritmul de verificare a primalitii unui numr ntreg. Program ATESTAT_2003_30 ; VAR f : f i l e of i nt eger ; x, d, di vi z : i nt eger ; Begin { PROGRAM PRINCIPAL } ASSI GN ( f , ' C: \ DI V. TXT' ) ; r ewr i t e ( f ) ; wr i t e ( ' Dat i x = ' ) ; r eadl n ( x) ; x : = ABS ( x) ; {daca x est e negat i v i l f acem> 0 } di vi z : = 1; whi l e di vi z <= x do begi n i f x MOD di vi z = 0 t hen wr i t e ( f , di vi z ) ; di vi z : = di vi z + 1 end; Probleme rezolvate de programare Subiecte propuse la ATESTAT 75 RESET ( f ) ; wr i t el n ( ' Ci t i mf i si er ul ' ) ; whi l e not EOF ( f ) do begi n r ead ( f , d) ; wr i t el n ( ' Di vi zor = ' , d) end; r eadl n end. ATESTAT - 2003 - 31 - S se determine toate modalitile de plat a unei sume S (S >= 0 i S <= 1.000.000) cu bancnote de valoare dat: b1 =1000, b2 =5000, b3 = 10.000, b4 =100.000. Rezolvare: Varianta 1 Program ATESTAT_2003_31_Bancnote_1_Platile_unei_sume_Bac kTracking ; uses CRT; VAR s : ar r ay [ 0. . 20] of i nt eger ; f , b : ar r ay [ 1. . 20] of i nt eger ; {f [ poz] = numar ul de bancnot e de t i pul b [ poz] } nr sol , Suma, m, poz, i , j : i nt eger ; {m = numarul de tipuri de bancnote } {poz = pozi t i a unei bancnot e i n suma} Begin { PROGRAM PRINCIPAL } cl r scr ; nr sol : = 0; wr i t e ( ' Dat i o suma < 1. 000. 000, Suma = ' ) ; r eadl n ( Suma) ; wr i t e ( ' Ci t e t i pur i de bancnot e f ol osi t i , ( l a noi m= 4) m= ' ) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 76 r eadl n ( m) ; f or i : = 1 t o mdo begi n wr i t e ( ' Dat i val oar ea bancnot ei de t i pul ' , i , ' b [ ' , i , ' ] =' ) ; r eadl n ( b[ i ] ) end; s[ 0] : = 0; f [ 1] : = 0; poz : = 1; while poz > 0 do begi n while ( poz <= m) AND ( f [ poz] * b[ poz] < Suma - s[ poz- 1] ) do begi n f [ poz] : = f [ poz] + 1; s[ poz] : = s[ poz- 1] + f [ poz] * b[ poz] ; I F s[ poz] = Suma t hen begi n i f poz > 1 t hen begi n nr sol : = nr sol + 1; wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ; wr i t e ( Suma, ' = ' , f [ 1] , ' * ' , b[ 1] ) ; f or j : = 2 t o poz do begi n wr i t e ( ' + ' , f [ j ] , ' * ' , b[ j ] ) end; end end Probleme rezolvate de programare Subiecte propuse la ATESTAT 77 ELSE begi n poz := poz + 1; {PAS INAINTE} f [ poz] : = 0; {f [ poz] : = f [ poz- 1] - 1; } end { f [ poz] >= f [ poz- 1] } end; {sf ar si t WHI LE i nt er i or } poz := poz-1; {PAS INAPOI} end; { sf ar si t WHI LE ext er i or } r eadl n end. Varianta 2 Program ATESTAT_2003_31_Bancnote_2_Platile_unei_sume_Bac kTracking; t ype st i va = ar r ay[ 1. . 100] of l ongi nt ; var st , a, b: st i va; n, k, s, i : Longi nt ; as, ev: bool ean; Procedure Init ( k: i nt eger ; var st : st i va) ; begi n st [ k] : = - 1 End; Procedure Succesor ( var as: bool ean; var st : st i va; k: i nt eger ) ; var s1, i : l ongi nt ; begi n i f ( st [ k] < b[ k] ) and ( k <= n) t hen begi n s1 : = 0; f or i : =1 t o k do s1 : = s1 + st [ i ] * a[ i ] ; as : = ( s1 < s) end Probleme rezolvate de programare Subiecte propuse la ATESTAT 78 el se as : = f al se; i f as t hen st [ k] : = st [ k] + 1 End; Procedure Valid ( var ev: bool ean; st : st i va; k: i nt eger ) ; var i : i nt eger ; begi n ev : = t r ue End; Function Solutie( k: i nt eger ) : bool ean; var i , s1: l ongi nt ; begi n s1 : = 0; f or i : = 1 t o k do s1 : = s1 + st [ i ] *a[ i ] ; sol ut i e : = ( s=s1) End; Procedure Scrie; var i : i nt eger ; begi n wr i t el n ( s, ' l ei se pl at esc cu: ' ) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 79 f or i : = 1 t o k do begi n i f st [ i ] >0 t hen wr i t el n ( st [ i ] : 2, ' de ' , a[ i ] , ' l ei ' ) ; end; wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' ) ; r eadl n End; Begin { PROGRAM PRINCIPAL } n : = 4; a[ 1] : = 1000; a[ 2] : = 5000; a[ 3] : = 10000; a[ 4] : = 100000; wr i t e ( ' Suma = ' ) ; r eadl n ( s) ; f or i : = 1 t o n do begi n b[ i ] : = s di v a[ i ] end; k : = 1; Init (k, st); whi l e ( k > 0) do begi n r epeat succesor (as, st, k); i f as t hen valid (ev, st, k); unt i l ( not as) or ( as and ev) ; i f as t hen i f solutie (k) t hen SCRIE el se begi n k : = k+1; init (k, st); end el se Probleme rezolvate de programare Subiecte propuse la ATESTAT 80 k : = k- 1 end; r eadl n END. ATESTAT - 2003 - 32 - S se parcurg, prin sritura calului, o tabl de ah, netrecnd de dou ori prin aceleai poziii sau omind o anumit poziie. Rezolvare: Program ATESTAT_2003_32_SARITURA_CALULUI ; uses CRT; CONST mmax = 8; { nr . de l i ni i } nmax = 8; { nr . de col oane } TYPE mat r i ce = ARRAY [ 1. . mmax, 1. . nmax] of i nt eger ; { mat r i cea TABLEI DE SAH } Probleme rezolvate de programare Subiecte propuse la ATESTAT 81 VAR SOL : mat r i ce; { SOL = mat r i cea sol ut i i l or } { SOL [ i , j ] = 0 daca nu s- a t r ecut pr i n pozi t i a ( i , j ) } { <> 0 daca s- a t r ecut pr i n pozi t i a ( i , j ) } m, n, nr sol , i , j : i nt eger ; { ( i , j ) = pozi t i a pe t abl a de sah } procedure SCRIE; begi n wr i t el n; wr i t el n ( ' Apasat i o t ast a ' ) ; wr i t el n; r eadl n; nr sol : = nr sol + 1; wr i t el n ( ' Sol ut i a ' , nr sol , ' : ' ) ; wr i t el n; f or i : = 1 t o mdo begi n f or j : = 1 t o n do begi n wr i t e ( ' ' , SOL [ i , j ] : 3, ' ' ) ; end; wr i t el n; wr i t el n; end; r eadl n; CLRSCR end; { sf ar si t pr ocedur a SCRI E } procedure TRASEU ( i , j , pas : i nt eger ) ; begi n I F ( i I N [ 1. . m] ) AND ( j I N [ 1. . n] ) t hen begi n Probleme rezolvate de programare Subiecte propuse la ATESTAT 82 i f SOL [ i , j ] = 0 t hen begi n SOL [ i , j ] : = pas ; i f pas = m* n t hen SCRIE el se begi n TRASEU (i-2, j+1, pas + 1 ); TRASEU (i-1, j+2, pas + 1 ); TRASEU (i+1, j+2, pas + 1 ); TRASEU (i+2, j+1, pas + 1 ); TRASEU (i+2, j-1, pas + 1 ); TRASEU (i+1, j-2, pas + 1 ); TRASEU (i-1, j-2, pas + 1 ); TRASEU (i-2, j-1, pas + 1 ); end; SOL [ i , j ] : = 0; end; end; end; { sf ar si t pr ocedur a } Probleme rezolvate de programare Subiecte propuse la ATESTAT 83 Begin { PROGRAM PRINCIPAL } CLRSCR; wr i t e ( ' Dat i numar ul de l i ni i ( cel put i n 5) , m= ' ) ; r eadl n ( m) ; wr i t e ( ' Dat i numar ul de col oane ( egal cu numar ul de l i ni i ) , n = ' ) ; r eadl n ( n) ; f or i : = 1 t o mdo begi n f or j : = 1 t o n do begi n SOL [ i , j ] : = 0 end; end; nr sol : = 0; CLRSCR; TRASEU (1, 1, 1); i f nr sol = 0 t hen wr i t el n ( ' Nu exi st a sol ut i e' ) ; wr i t el n; r eadl n END. ATESTAT - 2003 - 33 - S se parcurg n lime un graf neorientat. Rezolvare: Varianta 1: Algoritmul este descris n lucrarea Ctlin Tnase Note de curs, Ediia II, 2008. Program ATESTAT_2003_33_Parcurgere_graf_in_latime_BF_Bre adth_First ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 84 uses CRT; VAR VI ZI TAT : ar r ay [ 1. . 20] of 0. . 1; {el ement el e vect or ul ui VI ZI TAT sunt : } { = 1, daca un var f a f ost vi zi t at } { = 0, i n caz cont r ar } A : ar r ay [ 1. . 20, 1. . 20] of i nt eger ; { A = mat r i cea de adi acent a} n : i nt eger ; { n = nr . de nodur i } m: i nt eger ; { m= nr . de muchi i } i , j : i nt eger ; { i , j = i ndecsi } v : i nt eger ; { v = var f cur ent } x, y : i nt eger ; { x, y = ext r emi t at i al e unei muchi i } pr i m, ul t i m: i nt eger ; { poi nt er i cat r e "pr i mul " / "ul t i mul " el em. al cozi i } C : ar r ay [ 1. . 20] of i nt eger ; { C = coada i n car e depunemvar f ur i l e nevi zi t at e, veci ne al e unui var f } begi n CLRSCR; wr i t el n; wr i t e ( ' Dat i numar ul de var f ur i , n = ' ) ; r eadl n ( n) ; wr i t el n; Probleme rezolvate de programare Subiecte propuse la ATESTAT 85 wr i t e ( ' Dat i numar ul de muchi i , m= ' ) ; r eadl n ( m) ; wr i t el n; f or i : = 1 t o n do begi n f or j : = 1 t o n do begi n A [ i , j ] : = 0 {i ni t i al i zar e el ement e mat r i ce de adi acent a cu 0} end; end; wr i t el n; wr i t el n ( ' Dat i ext r emi t at i l e muchi i l or ' ) ; wr i t el n; f or i : = 1 t o mdo begi n wr i t el n ( ' Pent r u muchi a ' , i , ' , dat i ext r emi t at i l e' ) ; wr i t e ( ' Pr i ma ext r emi t at e, x = ' ) ; r eadl n ( x) ; wr i t e ( ' A doua ext r emi t at e, y = ' ) ; r eadl n ( y) ; wr i t el n; A [ x, y] : = 1; A [ y, x] : = 1; end; wr i t el n; wr i t e ( ' Dat i var f ul de pl ecar e, i = ' ) ; r eadl n ( i ) ; wr i t el n; C [ 1] : = i ; {pr i mul el ement di n coada est e var f ul de pl ecar e} f or j : = 1 t o n do begi n VI ZI TAT [ j ] : = 0; end; pr i m: = 1; {poi nt ar e cat r e pr i mul el ement al cozi i } ul t i m: = 1; {poi nt ar e cat r e ul t i mul el ement al cozi i } Probleme rezolvate de programare Subiecte propuse la ATESTAT 86 VI ZI TAT [ i ] : = 1; whi l e pr i m<= ul t i mdo begi n v : = C [ pr i m] ; f or j : = 1 t o n do begi n i f ( A [ v, j ] = 1) AND ( VI ZI TAT [ j ] = 0) t hen begi n ul t i m: = ul t i m+ 1; {se depune un var f i n coada i n pozi t i a "ul t i m"} C [ ul t i m] : = j ; VI ZI TAT [ j ] : = 1; end; {end I F } end; {end FOR } pr i m: = pr i m + 1; end; {end WHI LE} Probleme rezolvate de programare Subiecte propuse la ATESTAT 87 wr i t el n ( ' Li st a nodur i l or , i n par cur ger e BF, pl ecand di n nodul ' , i , ' , est e : ' ) ; f or j : = 2 t o ul t i mdo begi n wr i t e ( C [ j ] , ' ' ) ; end; r eadl n end. Varianta 2: Program ATESTAT_2003_33_Parcurgere_graf_in_latime_cu_pro cedura_recursiva ; t ype mat = ar r ay [ 1. . 20, 1. . 20] of i nt eger ; vect = ar r ay [ 1. . 20] of i nt eger ; var v : mat ; t , coada : vect ; n, k, j , i , p : i nt eger ; procedure PBF ( i : i nt eger ) ; { Par cur ger e Breadth First } {pr ocedur a r ecur si va} var j : i nt eger ; begi n f or j : =1 t o n do i f ( v [ coada [ i ] , j ] = 1 ) and ( t [ j ] = 0) t hen begi n k : = k+1; coada [ k] : = j ; t [ j ] : = 1 ; end; i f i <n t hen PBF ( i +1) ; end; Begin { PROGRAM PRINCIPAL } wr i t e( ' n = ' ) ; r eadl n( n) ; f or i : = 1 t o n do begi n Probleme rezolvate de programare Subiecte propuse la ATESTAT 88 t [ i ] : = 0; f or j : = i +1 t o n do begi n wr i t e ( ' Legat ur a i nt r e ' , i , ' si ' , j , ' = ' ) ; r eadl n ( v[ i , j ] ) ; v[ j , i ] : = v[ i , j ] ; end; end; wr i t e ( ' Dat i Nodul de plecare, p = ' ) ; r eadl n ( p) ; coada [ 1] : = p; t [ p] : = 1; k : = 1; PBF (p); f or i : =1 t o n do wr i t e ( coada[ i ] , ' - >' ) ; wr i t el n; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 89 ATESTAT - 2003 - 34 - S se determine un ciclu ntr-un graf astfel nct s se treac prin toate punctele grafului, iar costul drumului s fie minim. Rezolvare: Se folosete algoritmul cunoscut de determinare a unui ciclu ntr-un graf. Program ATESTAT_2003_34_Graf_cost_minim ; var A: ar r ay [ 1. . 20, 1. . 20] of i nt eger ; {mat r i cea de adi acent a} s: ar r ay [ 1. . 20] of i nt eger ; n, i , j , v, v1, v2, mi n, cost : i nt eger ; Begin { PROGRAM PRINCIPAL } Wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ; Readl n ( n) ; wr i t el n ( Dat i mat r i cea de adi acent a A ) ; f or i : = 1 t o n - 1 do f or j : = i + 1 t o n do begi n wr i t e ( ' Dat i A [ ' , i , ' , ' , j , ' ] = ' ) ; r eadl n ( A [ i , j ] ) ; A [ j , i ] : = A [ i , j ] end; f or i : =1 t o n do begi n S [ i ] : = 0; {mat r i cea de adi acent a est e pat r at i ca, avand t oat e} A [ i , i ] : = 0 {el ement el e di agonal ei pr i nci pal e egal e cu zer o } end; wr i t e ( ' Dat i Nodul de pornire, v = ' ) ; r eadl n ( v) ; S [ v] : = 1; v2 : = v; cost : = 0; wr i t el n ( v) ; Probleme rezolvate de programare Subiecte propuse la ATESTAT 90 f or i : = 1 t o n- 1 do begi n mi n : = 30000; f or j : = 1 t o n do i f ( A [ v2, j ] <> 0) and ( S [ j ] = 0) and ( mi n > A [ v2, j ] ) t hen begi n mi n : = A [ i , j ] ; v1 : = j end; v2 : = v1; S [ v2] : = 1; cost : = cost + mi n; wr i t e ( v1, ' - > ' ) ; end; cost : = cost + A [ v2, v] ; wr i t el n ( v) ; wr i t el n ( ' Cost t ot al = ' , cost ) ; r eadl n end. Probleme rezolvate de programare Subiecte propuse la ATESTAT 91 ATESTAT - 2003 - 35 - S se afieze toate posibilitile de aranjare pe o caset a n melodii, codificate cu numere de la 1 la n, astfel nct melodia X s urmeze dup melodia Y (x i y sunt dou valori citite). Se consider n < 10. Rezolvare: Program ATESTAT_2003_35_Caseta_cu_melodii ; uses cr t ; const nmax = 100; t ype vect or = ar r ay [ 1. . nmax] of i nt eger ; var f : vect or ; SOLUTI I : TEXT; {f i si er t ext de pe di sc i n car e vomr et i ne sol ut i i l e} sol , n, i , x, y : i nt eger ; procedure VERIFICA ( k : i nt eger ; f : vect or ; VAR CONTI N : bool ean ) ; LABEL 10; begi n CONTI N : = TRUE; f or i : = 1 t o k - 1 do begi n i f f [ i ] = f [ k] t hen begi n CONTI N : = FALSE; GOTO 10 end; end; 10: end; procedure SCRIE ; begi n sol : = sol + 1; wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ; f or i : = 1 t o n do begi n wr i t e ( f [ i ] : 3 ) ; wr i t e ( SOLUTI I , f [ i ] : 3 ) ; end; wr i t el n ( SOLUTI I ) ; wr i t el n {Li ni e de spat i er e} end; function POZMELODIE ( x, y : i nt eger ) : BOOLEAN; Probleme rezolvate de programare Subiecte propuse la ATESTAT 92 Var OK : bool ean; begi n OK : = FALSE; f or i : = 1 t o n - 1 do begi n i f ( f [ i ] = y) AND ( f [ i + 1 ] = x ) t hen OK : = TRUE; end; POZMELODI E : = OK end; procedure PERMUTA ( m: i nt eger ) ; LABEL 20; var k : i nt eger ; CONTI N : bool ean; Probleme rezolvate de programare Subiecte propuse la ATESTAT 93 begi n k : = 1; f [ k] : = 0; while k > 0 do begi n CONTI N : = FALSE; while f [ k] < mdo begi n f [ k] : = f [ k] + 1; VERIFICA (k, f, CONTIN); i f CONTI N = TRUE t hen GOTO 20 end; {sf ar si t WHI LE i nt er i or } 20: i f ( CONTI N = TRUE ) AND ( k = n) t hen begi n i f POZMELODIE (x, y) = TRUE t hen SCRIE; end; i f ( CONTI N = TRUE ) and ( k < n) t hen begi n k : = k + 1; {PAS INAINTE} f [ k] : = 0 end; i f CONTI N = FALSE t hen k : = k - 1 {PAS INAPOI} end; {sf ar si t WHI LE ext er i or } end; {sf ar si t pr ocedur a PERMUTA} Begin { PROGRAM PRINCIPAL } cl r scr ; assi gn ( SOLUTI I , ' C: \ SOLUTI I . t xt ' ) ; {Sol ut i i l e se vor scr i e si i n f i si er ul C: \ SOLUTI I . TXT} Probleme rezolvate de programare Subiecte propuse la ATESTAT 94 r ewr i t e ( SOLUTI I ) ; sol : = 0; wr i t e( ' Dat i nr . de mel odi i ( < 10 ) n = ' ) ; r eadl n ( n) ; wr i t e ( ' Dat i mel odi a nr . x = ' ) ; r eadl n ( x) ; wr i t e ( ' Dat i mel odi a nr . y = ' ) ; r eadl n ( y) ; wr i t el n; PERMUTA (n); i f sol = 0 t hen wr i t el n ( ' Nu exi st a sol ut i e' ) ; r eadl n end. De exemplu, pentru n =5 X =3 Y =4 se vor afia pe ecran (respectiv se vor scrie n fiierul C:\SOLUTII.TXT) soluiile: 1 2 4 3 5 1 2 5 4 3 1 4 3 2 5 1 4 3 5 2 1 5 2 4 3 1 5 4 3 2 2 1 4 3 5 2 1 5 4 3 2 4 3 1 5 2 4 3 5 1 2 5 1 4 3 2 5 4 3 1 4 3 1 2 5 4 3 1 5 2 4 3 2 1 5 4 3 2 5 1 4 3 5 1 2 4 3 5 2 1 5 1 2 4 3 5 1 4 3 2 5 2 1 4 3 5 2 4 3 1 5 4 3 2 1