Sunteți pe pagina 1din 88

Doina Buldur

CULEGERE PROBLEME
DE
INFORMATIC
-TURBO PASCAL-

CUPRINS
I. Instruciuni de introducere, afiare i calcul..............................................................................................................
II. Instruciunea de decizie ; algoritmi cu ramificaii.......................................................................................................

Comparri ntre valorile a dou variabile........................................................................................................................................


Compararea valorii unei variabile cu o constant...........................................................................................................................
Testarea ctului sau a restului mpririi ntregi...............................................................................................................................
Operatori logici................................................................................................................................................................................
Probleme diverse...........................................................................................................................................................................
III. Instruciuni de ciclare , algoritmi ciclici..11
Stabilirea limitelor buclei for utiliznd regula celor trei pahare......................................................................................................14
Mai multe bucle for incluse una n alta (imbricate)........................................................................................................................14
Calcule de sume i produse..........................................................................................................................................................15
Utilizarea instruciunilor de ciclare pentru repetarea unor aciuni.................................................................................................16
Algoritmi de nsumare, contorizare, determinare a min i max.....................................................................................................17
Algoritmul de mprire n cifre a unui numr................................................................................................................................18
Algoritmul lui Euclid.......................................................................................................................................................................21
Probleme diverse..........................................................................................................................................................................22
IV.
Variabile booleene..............................................................................................................................................27
V.
Generarea aleatoare a numerelor......................................................................................................................29
Funcia random i procedura randomize.......................................................................................................................................29
VI.
Tablouri cu o dimensiune (vectori)......................................................................................................................31
Introducere, parcurgere, afiare....................................................................................................................................................31
Parcurgere cu instruciunea for.....................................................................................................................................................31
Utilizarea altor instruciuni de ciclare pentru parcurgerea vectorilor.............................................................................................32
Sume, produse, contorizri, min, max...........................................................................................................................................34
Ordonarea elementelor unui vector...............................................................................................................................................39
Deplasarea elementelor unui vector.............................................................................................................................................41
Verificarea unor proprieti............................................................................................................................................................42
Construirea unor vectori................................................................................................................................................................45
VII.
Tablouri cu dou dimensiuni (matrici).............................................................................................................48
Introducere, parcurgere integral, afiare.....................................................................................................................................48
Parcurgere parial a unui tablou bidimensional...........................................................................................................................50
Eliminarea, adugarea i schimbarea poziiei liniilor i coloanelor...............................................................................................52
Verificarea unor proprieti............................................................................................................................................................54
Construirea unui tablou.................................................................................................................................................................55
VIII.
iruri de caractere ( tipul string).....................................................................................................................56
Parcurgere, testarea elementelor..................................................................................................................................................56
Scoaterea cuvintelor dintr-un text.................................................................................................................................................58
IX.
Alte tipuri de date structurate..............................................................................................................................60
Tipul mulime.................................................................................................................................................................................60
Tipul nregistrare...........................................................................................................................................................................62
Stive, liste, cozi alocate static.......................................................................................................................................................62
X.
Ali algoritmi de lucru cu date structurate............................................................................................................65
Interclasarea.................................................................................................................................................................................65
Parcurgere circular a unui ir......................................................................................................................................................65
Operaii cu numere mari................................................................................................................................................................67
Modelarea unor relaii...................................................................................................................................................................68
Determinarea unor secvene maximale........................................................................................................................................69
Probleme de geometrie...............................................................................................................................................................69
XI.
Utilizarea subprogramelor...................................................................................................................................72
Proceduri.......................................................................................................................................................................................72
Funcii............................................................................................................................................................................................73

I.

INSTRUCIUNI DE INTRODUCERE, AFISARE SI CALCUL

1) S se afieze triunghiul

*
**
***
2) S se introduc un caracter de la tastatur i s se afieze un triunghi asemntor folosind caracterul introdus.
3) Se d un numr natural n. Afiai un triunghi de forma
n
n+2 n+2
n+4 n+4
n+4
n+6 n+6
n+6
n+6
(CNI-etapa judeean, Petroani, 2005)
4) ntr-o tabr numrul de biei este cu 10 mai mare dect cel al fetelor. Dac se citete de la tastatur numrul de fete,
s se spun ci elevi sunt n tabr. Exemplu: date de intrare: 50 date de ieire: 110.
5) ntr-un autobuz care pleac n excursie sunt 7 copii. De la nc dou coli urc ali copii, numrul acestora citindu-se de
la tastatura. Ci copii au plecat n excursie? Exemplu: Date de intrare: 15 20 Date de ieire: 42 copii.
6) Un brdu este mpodobit cu globulee albe, roii i albastre. Numrul globuleelor albe se citete de la tastatur. Cte
globulee are brduul, tiind c numrul de globulee roii este cu 3 mai mare dect numrul de globulee albe, iar
globuleele albastre sunt cu 2 mai puine dect totalul celor albe i roii. Exemplu: Date de intrare: 12 Date de ieire: 52.
7) Ion i Vasile joac urmtorul joc: Ion spune un numr iar Vasile trebuie s gseasc cinci numere consecutive,
cresctoare, numrul din mijloc fiind cel ales de Ion. Exemplu : Ion spune 10, Vasile spune 8 9 10 11 12. Ajutai-l pe
Vasile s gseasc rspunsul mai repede.
8) Doi copii au primit acelai numr de mere Introducnd de la tastatur numrul de mere primte, afiai cte mere are
fiecare copil dup ce primul copil mnnc un mr i d unul celuilalt copil. Exemplu : Date de intrare : 10 Date de
ieire : primul copil 8 mere al doilea copil 11 mere.
9) Maria vrea s verifice dac greutatea i nlimea ei corespund vrstei pe care o are. Ea a gsit ntr-o carte urmtoarele
formule de calcul ale greutii i nlimii unui copil, v fiind vrsta : greutate=2*v+8 (n kg), nlime=5*v+80 (n cm).
Realizai un program care s citeasc vrsta unui copil i s afieze greutatea i nlimea ideal, folosind aceste
formule.
10)
Se introduc de la tastatur trei cifre. Afiai pe aceeai linie 5 numere formate cu aceste cifre luate o singur dat.
Exemplu : date de intrare : 3 4 2 Date de ieire : 324 342 243 234 432.
11)
Date trei numere, s se calculeze toate sumele posibile de cte dou numere. Afiarea s cuprind i termenii
sumei, nu numai valoarea ei. Exemplu: Date de intrare : 2 13 4 Date de ieire: 2+13 =15 2+4=6 13+4=17.
12)
Afiai tabla nmulirii cu numrul n. Exemplu: pentru n=5, se va afia pe vertical 1x5=5 2x5=10 3x5=15 4x5=20
5x5=25 6x5=30 7x5=35 8x5=40 9x5=45 10x5=50.
13)
Se introduc lungimea i limea unui dreptunghi. S se afieze cuvntul PERIMETRU urmat de valoarea
perimetrului acelui dreptunghi.
14)
Dan are de fcut mai multe exerciii de transformare n centimetri a unei mrimi date n metri. Realizai un
program care s citesc valoarea n metri i s o afieze n centimetri. Exemplu: date de intrare: 72 date de ieire: 7200
cm.
15)
S se scrie un program care citete un numr de ani i calculeaz numrul de luni, zile i ore corespunztoare.
Se consider c un an are 365 zile. Exemplu: date de intrare: 2 date de ieire: 24 luni 730 zile 17520 ore.
16)
Mriuca ine evidena iepurilor din cresctorie. Ea i noteaz ci iepuri sunt la nceputul fiecrei luni, ci au murit
i ci s-au nscut n cursul fiecei luni. Putei s realizai un program care, primind aceste date, s afieze la sfritul
fiecrei luni ci iepuri sunt n cresctorie? Exemplu : Date de intrare : nr. Iepuri la nceput de luna 10 nr. iepuri morti 2
nr. iepuri nascuti 6 Date de ieire : 14 iepuri.
17)
ntr-o gospodrie sunt 4 gini. Introducei n calculator prin variabilele a, b, c, d numrul de ou pe care-l d
fiecare gin ntr-o zi. Afiai cte ou se obin ntr-o sptmn.
18)
Se introduc n calculator dou date n variabilele a i b. S se fac un program care s schimbe ntre ele valorile
acestor variabile i s afieze noile valori ale lui a i b.

O nav parcurge distana d ( n km ) dintre dou staii orbitale n a sptmni i b zile. S se determine viteza
navei exprimat n km/or.

19)

II.

INSTRUCTIUNEA DE DECIZIE ; ALGORITMI CU RAMIFICATII

Comparri ntre valorile a dou variabile


1) Date dou numere, afiai-l pe cel mai mic. Exemplu : Date de intrare : 44 32 Date de ieire : 32.
2) Se introduc vrstele a doi copii. Afiai care copil este mai mare i diferena de vrst dintre cei doi. Exemplu : Date de
intrare : 6 13 date de ieire : al doilea copil este mai mare cu 7 ani.
3) Se introduc punctajele a doi sportivi. Afiai-le n ordine descresctoare. Exemplu: Date de intrare 100 134 Date de
ieire: 134 puncte 100 puncte
4) Dintr-o cutie cu trei numere se extrag dou numere. Cunoscnd suma celor dou numere extrase, s se afieze
numrul rmas n cutie. Exemplu : date de intrare : numere existente in cutie 5 12 8 suma numerelor extrase 13 date
de ieire : 12.
5) Se dau dou numere. S se nmuleasc cel mai mare cu doi i cel mai mic cu trei i s se afieze rezultatele.
Exemplu : date de intrare : 3 7 date de ieire : 9 14
6) Se introduc dou numere ntregi. S se testeze dac primul numr este predecesorul (succesorul) celui de-al doilea i
s se afieze un mesaj corespunztor. Exemple : date de intrare : 2 4 date de ieire : Nu ; date de intrare : 5 6 date
de ieire : Da.
Problema 1
var a,b,mic: integer;
begin
write(introdu doua numere ); read(a,b);
if a<b then mic:=a else mic:=b;
writeln(cel mai mic este , mic);
end.

Problema 2
var x,y: integer;
begin
write(varsta primul copil =);read(x);
write(varsta al doilea copil =); read(y) ;
if x>y then
writeln (primul copil este mai mare cu ,x-y, ani)
else
writeln (al doilea copil este mai mare cu ,y-x, ani);
end.

Problema 3
var a,b: integer;
begin
write(introdu cele doua punctaje );
read(a,b);
if a<b then writeln(b, ,a)
else writeln(a, ,b);
end.

Problema 4
var n1,n2,n3,s:integer;
begin
write(introdu trei numere );read(n1,n2,n3);
write(introdu suma a doua nr );read(s);
write(in cutie a ramas numarul );
if n1+n2=s then write(n3);
if n1+n3=s then write(n2);
if n2+n3=s then write(n1);
end.

Problema 5
var a,b: integer;
begin
write(introdu doua numere ); read(a,b);
if a>b then writeln (a*2, ,b*3)
else writeln (b*2, ,a*3);
end.

Problema 6
var a,b: integer;
begin
write(introdu doua numere ); read(a,b);
if a=b-1 then writeln(a, e predecesorul lui ,,b)
else writeln(a, nu e predecesorul lui ,,b)
end.

Compararea valorii unei variabile cu o constant


1) Se introduc dou numere nenule i un semn de operaie (+,-,*,/). S se efectueze cu cele dou numere operaia
introdus i s se afieze expresia care s-a calculat urmat de semnul = i de valoarea ei. Exemplu : Date de intrare 10
6 * Date de ieire 10*6=60.
2) Se introduc trei date de forma numr ordine pacient, valoare glicemie. Afiai numrul de ordine al pacienilor cu
glicemia mai mare dect 100. Exemplu : Date de intrare nr 6 glicemie 90 nr 10 glicemie 107 nr 21 glicemie 110
Date de ieire 10 21
3) Ionel spune prinilor doar notele mai mari sau egale cu 7. ntr-o zi el a luat trei note. Introducei-le n calculator i afiai
acele note pe care le va comunica i prinilor. Exemplu : Date de intrare 8 7 5 Date de ieire 8 7.
4) Se introduc dou numere. Dac al doilea numr este diferit de 0, s se afieze ctul dintre primul i al doilea, iar dac
este nul, s se afieze mesajul mprire imposibil. Exemple : Date de intrare 10 3 Date de ieire 3.33 Date de
intrare 45 0 date de ieire Impartire imposibila.
5) Un lift pentru copii accept o greutate de maxim 100 kg. Introducnd n calculator greutile a doi copii, specificai prin
afiarea unui mesaj corespunztor, dac POT INTRA AMBII COPII sau INTRA PE RAND. Exemple : Date de intrare :
greutati copii 87 50 Date de ieire : Intra pe rand Date de intrare 45 52 Date de ieire Pot intra ambii copii.
6) Ionel are voie s se uite la TV 20 de ore pe sptmn. Se introduc numrul de ore ct se uit la TV n fiecare zi din
sptmn. S se verifice dac va fi pedepsit sau nu. Exemplu: Date de intrare: 3 4 2 2 5 6 1 Date de ieire: Va fi
pedepsit.
7) S se scrie un program care determin greutatea ideal a unei persoane cunoscnd nlimea, vrsta i sexul
persoanei. Formulele de calcul sunt: Gmasculin = 50 + 0.75 * (inaltime - 150) + (varsta - 20) / 4, Gfeminin = Gmasculin
10, unde nlimea este exprimat n cm i vrsta n ani. Sexul se citete sub forma unui caracter, f sau m. Exemplu:
Date de intrare: inaltime= 160 varsta=21 sex=f Date de ieire: greutate= 47.75 kg.
8) Scriei un program care s permit alegerea unei opiuni dintr-un anumit meniu afiat pe ecran: se afieaz meniul
1. suma
2. produs
se introduc dou numere i se alege o operaie din meniu prin introducerea numrului de ordine. Pe ecran s apar
expresia i valoarea calculat.
Problema 1
var a,b: real; s: char;
begin
write(doua numere nenule); readln(a,b);
write( o operatie ); readln(s);
case s of
+: writeln(a,+,b,=,a+b);
-: writeln(a,-,b,=,a-b);
*: writeln(a,*,b,=,a*b);
/: writeln(a,/,b,=,a/b:6:2);
else write(semn incorect);
end ;
end.
Problema 3
var a,b,c: byte;
begin
write( ce note a luat Ionel?); read(a,b,c);
write(Ionel spune parintilor notele );
if a>=7 then write(a, );
if b>=7 then write(b, );
if c>=7 then write(c, );
end.

Problema 2
var a,b,c,x,y,z: byte;
begin
write(numar pacient, glicemie ); readln(a,x);
write(numar pacient, glicemie ); readln(b,y);
write(numar pacient, glicemie ); readln(c,z);
writeln(Pacienti cu glicemie mare);
if x>100 then writeln(a);
if y>100 then writeln(b);
if z>100 then writeln(c);
end.
Problema 4
var a,b: integer;
begin
write(doua numere ); read(a,b);
if b<>0 then writeln(catul=,a/b:5:2)
else writeln(impartire imposibila);
end.

Problema 5
Problema 6
var x,y: byte;
var a,b,c,d,e,f,g : byte ;
begin
begin
write( greutatile copiilor );read(x.y);
write(numar ore zilnic );read(a,b,c,d,e,f,g);
if x+y>100 then writeln( INTRA PE RAND)if a+b+c+d+e+f+g>20
then writeln(va fi pedepsit)
else writeln(INTRA AMBII COPII);
else writeln(nu va fi pedepsit);
end.
end.
Problema 7
var i,v: byte; s: char;g: real;
begin
write(inaltime, varsta, sex:);
readln(i,v); readln(s);
write(greutatea ideala:);
g:=50+0.75*(i-150)+(v-20)/4
if s=m then writeln(g, kg);
if s=f then writeln(g-10, kg);
end.

Problema 8
var
a,b,o: integer;
begin
writeln(1. suma); writeln(2. produs);
write(introdu doua numere );readln(a,b);
write(alege operatia (1 sau 2) ); read(o);
if o=1 then writeln(a,+,b,=,a+b);
if o=2 then writeln(a,*,b,=,a*b);
end.

Testarea ctului sau a restului mpririi ntregi


1) Se dau trei numere. S se afieze aceste numere unul sub altul, afind n dreptul fiecruia unul dintre cuvintele PAR
sau IMPAR. Exemplu : Date de intrare : 45 3 24 Date de ieire : 45 impar 3 impar 24 par.
2) Se dau dou numere nenule. S se verifice dac primul se mparte exact la al doilea. Exemplu : Date de intrare : 45 7
Date de ieire : Nu.
3) Se dau dou numere. S se afieze acele numere care se mpart exact la 7. Exemplu : Date de intrare : 34 28 Date
de ieire : 28.
4) M iubete un pic, mult, cu pasiune, la nebunie, de loc, un pic,. Rupnd petalele unei margarete cu x petale, el (ea)
m iubete . Exemplu: Date de intrare: x=10 Date de ieire: de loc.
5) La un concurs se dau ca premii primilor 100 de concureni, tricouri de culoare alb, roie, albastr i neagr, n aceast
secven. Ionel este pe locul x. Ce culoare va avea tricoul pe care-l va primi? Exemplu : date de intrare : x=38 date de
ieire : rosie.
6) ntr-o tabr, bieii sunt cazai cte 4 ntr-o csu, n ordinea sosirii. Ionel a sosit al n-lea. n a cta csu se va afla?
Exemplu : date de intrare : n=69 date de ieire : casuta 17.
7) Elevii clasei a V-a se repartizeaz n clase cte 25 n ordinea mediilor clasei a IV-a. Radu este pe locul x n ordinea
mediilor. n ce clasa va fi repartizat (A, B, C, D sau E)?. Exemplu : date de intrare : x=73 date de ieire : C.
8) n Galaxia Reckya toate ceasurile au doar 4 ore. tiind c Gygely s-a nscut la ora 1 i c va tri m ore, s se spun la
ce or va muri Gygely. (m<=50). Se d numrul m. Se cere ora la care va muri Gygely.
Ceasul arat astfel
1
4
2
3
Exemplu: Date de intrare: m=10 Date de ieire: 3.
Problema 1
Problema 2
var a,b,c: integer;
var x,y: integer;
begin
begin
write(trei numere:); read(a,b,c);
write(introdu doua numere ); read(x,y);
if a mod 2=0 then writeln(a, par)
if x mod y=0 then
else writeln(a, impar);
writeln(x, se imparte exact la ,y)
if b mod 2=0 then writeln(b, par)
else
else writeln(b, impar);
writeln(x, nu se imparte exact la ,y)
if c mod 2=0 then writeln(c, par)
end.
else writeln(c, impar);

end.
Problema 3
var a,b:integer;
begin
write(introdu doua numere ); read(a,b);
write(numere care se impart la 7:);
if a mod 7 =0 then write(a, );
if b mod 7 =0 then write(b, );
writeln;
end.

Problema 4
var x: integer;
begin
write(cate petale are margareta?); read(x);
write(ma iubeste );
case x mod 5 of
1: writeln(un pic);
2: writeln(mult);
3: writeln(cu pasiune);
4: writeln(la nebunie);
0: writeln(deloc);
Problema 5
end;
var x: integer;
end.
begin
Problema 6
write(pe ce loc este Ionel?); read(x);
var n, casuta: integer;
write(Ionel primeste un tricou de culoare ); begin
case x mod 4 of
write(al catelea a sosit Ionel?); read(n);
1: writeln(alba);
write(Ionel este cazat in casuta nr. );
2: writeln(rosie);
if n mod 4=0 then casuta:=n div 4
3: writeln(albastra);
else casuta:=n div 4 +1;
0: writeln(neagra);
writeln(casuta);
end;
end.
end.
Problema 7
var x, clasa: integer;
begin
write(al catelea este Radu?); read(x);
write(Radu este inscris in clasa a V-a );
if x mod 25=0 then clasa:=x div 25
else clasa:=n div 25 +1;
case clasa of
1: writeln(A);
2: writeln(B);
3: writeln(C);
4: writeln(D);
5: writeln(E);
end;
end.

Problema 8
var m,o: integer;
begin
write(m=); read(m);
o:=m mod 4 +1;
writeln(Gygely va muri la ora ,o);
end.

Operatori logici
1) Se dau trei numere diferite. S se afieze cel mai mare i cel mai mic. Exemplu : Date de intrare 45 34 78 Date de
ieire max=78 min=34.
2) Se dau trei numere diferite. Afisai-le n ordine cresctoare. Exemplu : Date de intrare 4 2 6 Date de ieire 2 4 6.
3) Se dau trei numere diferite. Afiai numrul a crei valoare este cuprins ntre valorile celorlalte dou. Exemplu : Date de
intrare 12 14 10 Date de ieire 12.
4) Se introduc trei date de forma numr curent elev, punctaj. Afiai numrul elevului cu cel mai mare punctaj. Exemplu :
Date de intrare nr crt 7 punctaj 120 nr crt 3 punctaj 100 nr crt 4 punctaj 119 Date de ieire punctaj maxim are elevul
cu nr crt 7.
5) Se introduc trei numere. S se verifice dac formeaz o secven de numere consecutive. Exemple: Date de intrare 3
4 5 Date de ieire Da Date de intrare 4 5 7 Date de ieire Nu.

6) La ora de matematic Gigel este scos la tabl. Profesoara i dicteaz trei numere i i cere s verifice dac cele trei
numere pot fi laturile unui triunghi. Ajutai-l pe Gigel s afle rezultatul. Scriei un program care primete numerele lui
Gigel, care sunt mai mici ca 32000, i returneaz DA sau NU. Observaie: Trei numere pot fi laturile unui triunghi numai
dac fiecare este mai mic ca suma celorlalte dou. Exemple: Date de intrare 3 5 7 Date de ieire Da Date de intrare
2 5 9 Date de ieire Nu.
7) S se verifice dac o liter introdus este vocal sau consoan. Exemplu : Date de intrare a Date de ieire vocala.
8) Se introduc vrstele a 3 persoane. Afiai vrstele cuprinse ntre 18 i 60 de ani. Exemplu : Date de intrare 56 34 12
Date de ieire 56 34.
9) Date dou numere, afiai acele numere care se mpart exact la 7 i la 11. Exemplu : Date de intrare 154 213 Date de
ieire 154.
10) Se dau dou numere. S se verifice dac numrul mai mare se mparte exact la cel mai mic. Exemplu : Date de intrare
10 250 Date de iere 250 se imparte exact la 10.
11) Cunoscnd data curent exprimat prin trei numere ntregi reprezentnd anul, luna, ziua precum i data naterii unei
persoane, exprimat la fel, s se fac un program care s calculeze vrsta persoanei respective n numr de ani
mplinii. Exemplu : Date de intrare data curenta 2005 10 25 data nasterii 1960 11 2 Date de iere 44 ani.
Problema 1
var a,b,c: integer;
begin
write(introdu trei numere ); read(a,b,c);
if (a<b) and (a<c) then writeln(min=,a);
if (b<a) and (b<c) then writeln(min=,b);
if (c<b) and (c<a) then writeln(min=,c);
if (a>b) and (a>c) then writeln(max=,a);
if (b>a) and (b>c) then writeln(max=,b);
if (c>b) and (c>a) then writeln(max=,c);
end.

Problema 2
var a,b,c: integer;
begin
write(introdu trei numere ); read(a,b,c);
if (a<b) and (b<c) then writeln(a, ,b, ,c);
if (a<c) and (c<b) then writeln(a, ,c, ,b);
if (b<a) and (a<c) then writeln(b, ,a, ,c);
if (b<c) and (c<a) then writeln(b, ,c, ,a);
if (c<b) and (b<a) then writeln(c, ,b, ,a);
if (c<a) and (a<b) then writeln(c, ,a, ,b);
end.

Problema 3
Problema 4
var a,b,c: integer;
var a,b,c,x,y,z: integer;
begin
begin
write(introdu trei numere ); read(a,b,c);
write(numar, punctaj:); readln(x,a);
if ((a>b)and(a<c))or((a>c)and(a<b)) then
write(numar, punctaj:); readln(y,b);
writeln(a);
write(numar, punctaj:); readln(z,c);
if ((b>a)and(b<c))or((b>c)and(b<a)) then
if (a>=b) and (a>=c) then writeln(max=,x);
writeln(b);
if (b>=a) and (b>=c) then writeln(max=,y);
if ((c>b)and(c<a))or((c>a)and(c<b)) then
if (c>=a) and (c>=b) then writeln(max=,z);
writeln(c);
end.
end.
Problema 5
var a,b,c: integer;
begin
write(introdu trei numere ); read(a,b,c);
if (a+1=b)and(b+1=c) then
writeln(consecutive)
else writeln(neconsecutive);
end.

Problema 6
var a,b,c: integer;
begin
write(laturile triunghiului:); read(a,b,c);
if (a<b+c) and (b<a+c) and (c<a+b) then writeln(Da)
else writeln(Nu);
end.

Problema 7
Problema 8
var a: char;
var a,b,c: integer;
begin
begin
write(introdu o litera mica );
write( trei varste: ); read(a,b,c);
readln(a);
if (a>=18) and (a<=60) then writeln(a);
case a of
if (b>=18) and (b<=60) then writeln(b);
a,e,i,o,u: writeln(vocala)
if (c>=18) and (c<=60) then writeln(c);
else writeln(consoana);
end.
end;
end.
Problema 9
Problema 10
var a,b: integer;
var a,b: integer;
begin
begin
write(doua numere ); read(a,b);
write(doua numere ); read(a,b);
write(se impart exact la 7 si la 11:);
if (a>b) and (a mod b=0) then
if (a mod 7=0) and (a mod 11=0) then
writeln(a; se imparte exact la ;b)
writeln (a);
else if (b>a) and (b mod a=0) then
if (b mod 7=0) and (b mod 11=0) then
writeln(b; se imparte exact la ;a)
writeln (b);
else
end.
writeln(nu avem imp. exacta)
end.
Problema 11
var
ac,an,zc,zn,lc,ln,v: integer ;
begin
write(data curenta (an,luna,zi) );
readln(ac,lc,zc);
write(data nasterii (an,luna,zi) );
readln(an,ln,zn);
v:=ac-an;
if (lc<ln) or ((lc=ln) and (zc<zn)) then
v:=v-1;
writeln(varsta actuala=,v, ani);
end.

Probleme diverse
1) Andrei primete ntr-o zi trei note, nu toate bune. Se hotrte ca, dac ultima not este cel puin 8, s le spun
prinilor toate notele primite iar dac este mai mic dect 8, s le comunice doar cea mai mare not dintre primele
dou. Introducei notele luate i afiai notele pe care le va comunica prinilor. Exemple : Date de intrare 6 9 9 Date
de ieire 6 9 9 ; Date de intrare 8 5 7 Date de ieire 8.
2) Se consider trei numere ntregi. Dac toate sunt pozitive, s se afieze numrul mai mare dintre al doilea i al treilea
numr, n caz contrar s se calculeze suma primelor dou numere. Exemple: Date de intrare 45 23 100 date de
ieire 100 ; Date de intrare 34 -25 10 Date de ieire 9.
3) S se afieze cel mai mare numr par dintre doua numere introduse n calculator. Exemple : Date de intrare 23 45
Date de ieire nu exista numar par ; Date de intrare 28 14 Date de ieire 28 ; Date de intrare 77 4 Date de ieire 4.
4) Pe o mas de biliard sunt bile albe, roii i verzi. Din fiecare culoare sunt bile de dou dimensiuni: mari i mici. S se
afieze cte bile sunt n total pe masa de biliard. Un juctor vrea s-i spunei care bile sunt mai multe , cele mici sau
cele mari, afind numrul lor. De ce culoare sunt bilele cele mai numeroase? Precizai numrul lor. Exemplu: Date de
intrare Nr. bile albe mici: 2 Nr. bile albe mari: 3 Nr. bile rosii mici: 1 Nr. bile rosii mari: 4 Nr. bile verzi mici: 3 Nr. bile verzi
mari: 4 Date de ieire Totalul bilelor: 17 Mari: 11 bile Verzi: 7 bile
5) La ferma de gini Copanul este democraie. Fiecare gin primete exact acelai numr de boabe de porumb. Cele
care nu pot fi mprite vor fi primite de curcanul Clapon. S se spun cine a primit mai multe boabe i cu ct. n caz de
egalitate, se va afia numrul de boabe primite i cuvntul "egalitate". Datele se vor citi n urmtoarea ordine: numrul
de gini, iar dupa aceea numrul de boabe de porumb. Exemplu: Date de intrare 100 4050 Date de ieire: Curcanul
mai mult cu 10 boabe.
Problema 1
Problema 2
var x,y,z: byte;
var a,b,c,s: integer;
begin
begin
write(introdu cele trei note ); read(x,y,z)
write(introdu trei numere );read(a,b,c);
if z>=8 then writeln(spune toate notele)
write(Afisare:);
else if x>y then writeln (spune nota ,x)
if (a>=0) and (b>=0) and (c>=0)
else writeln (spune nota ,y);
then if b>c then writeln (b) else writeln(c)
end.
else writeln (a+b);
end.
Problema 3
Problema 4
var a,b: integer;
var amc,amr,rmc,rmr,vmc,vmr,smc,smr,a,r,v: integer;
begin
begin
write(doua numere ); read(a,b);
write(numar bile albe-mici,mari ); read(amc,amr);
if a>=b then
write(numar bile rosii-mici,mari ); read(rmc,rmr);
begin
write(numar bile verzi-mici,mari ); read(vmc,vmr);
if a mod 2=0 then writeln(a)
writeln(total bile ,amc+amr+rmc+rmr+vmc+vmr);
else if b mod 2=0 then writeln(b) smc:=amc+rmc+vmc;
end
smr:=amr+rmr+vmr;
else
if smc>smr then writeln(mici ,smc );
if b mod 2=0 then writeln(b)
if smc=smr then writeln(mici si mari ,smc);
else if a mod 2=0 then writeln(a); if smr>smc then writeln(mari ,smr);
end.
a:=amc+amr; r:=rmc+rmr; v:=vmc+vmr;
Problema 5
if (a>=r) and (a>=v) then writeln(albe ,a);
Var g,b,bg,bc: integer;
if (r>=a) and (r>=v) then writeln(rosii ,r);
begin
if (v>=a) and (v>=r) then writeln(verzi ,v);
write( nr. gaini ); readln(g);
end.
write(nr. boabe ); readln(b);
bg:=b div g;{boabe primite de fiecare gaina}
bc:=b mod g;{boabe primite de curcan}
if bg>bc then writeln(gainile ,bg-bc);
if bc>bg then writeln(curcanul ,bc-bg);
if bc=bg then writeln(egalitate);end.

10

III.

INSTRUCTIUNI DE CICLARE , ALGORITMI CICLICI

Utilizarea instruciunilor de ciclare pentru generare de numere


1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)

S se afieze toate numerele de forma a23a care se mpart exact la 6.


Un lift coboar de la etajul a la etajul b. Afiai toate etajele pe care le parcurge. Exemplu : Date de intrare 8 3
Date de ieire 8 7 6 5 4 3.
S se afieze tabla nmulirii cu n. Exemplu : Date de intrare n=5 date de ieire 1x5=5 2x5=10 3x5=15 4x5=20
5x5=25 6x5=30 7x5=35 8x5=40 9x5=45 10x5=50.
S se afieze perechile de numere a i b care satisfac relaiile a+b=1000; 17 divide pe a i 19 divide pe b.
S se genereze primii n termeni ai irului 1,1,2,2,2,3,3,3,3,4,4,4,4,4,.
S se afieze primii n termeni ai irului lui Fibonacci : 0,1,1,2,3,5,8,13,21.
Se d un numr. S se scrie, dac se poate, ca sum de dou numere impare. Exemple : date de intrare 24 Date
de ieire 24=1+23 24=3+21 24=5+19 24=7+17 24=9+15 24=11+13 ; Date de intrare 33 Date de ieire Nu se poate.
Se d un numr. S se scrie, dac este posibil, ca sum de dou numere consecutive. Exemple : Date de intrare 5
Date de ieire 5=2+3 ; Date de intrare 6 Date de ieire Nu se poate.
Dndu-se un numr natural n, s se gseasc toate posibilitile de scriere a acestui numr ca sum de numere
consecutive. Exemplu : Date de intrare 15 Date de ieire 15=1+2+3+4+5 15=4+5+6 15=7+8.
S se afieze toi divizorii unui numr natural dat. Exemplu : Date de intrare 12 Date de ieire 1 2 3 4 6 12.
Se introduce un numr. S se verifice dac este numr prim. Exemple: Date de intrare 23 date de ieire Prim ;
Date de intrare 45 Date de ieire Nu este prim.
S se afieze primele n numere prime. Exemplu: Date de intrare n=6 Date de ieire 2 3 5 7 11 13.

Problema 1
var a,n :integer ;
begin
writeln(numere care se divid cu 6:);
for a:=1 to 9 do
begin
n:=a*100+200+30+a;
if n mod 6=0 then writeln(n);
end;
end.

Problema 2
var a,b,e :integer ;
begin
write(etaj de plecare:);read(a);
write(etaj de sosire:);read(b);
writeln(liftul parcurge etajele);
for i:=a downto b do writeln (i);
end.

Problema 3
var f,n :integer ;
begin
write(n=); read(n);
for f:=1 to 10 do writeln(f,x,n,=,f*n);
end.

Problema 4
var a,b,n :integer ;
begin
for a :=17 to 983 do
begin
b :=1000-a ;
if (a mod 17=0) and (b mod 19=0) then
writeln(a, ,b) ;
end ;
end.

Problema 5
var t,v,i,n : integer ; {t=nr. termeni afisati, v= valoarea termenilor, i=numar de valori egale }
begin
{ se observa ca i=v+1)
write(n=) ; read(n) ;
t :=1 ; v :=1 ; i :=1 ;
while t<=n do begin
write(v, ) ;
t :=t+1 ;
i :=i+1 ;

11

if i>v+1 then begin v :=v+1 ; i :=1 end ;


end ;
end.
Problema 6
var a,b,t,v,n : integer ; {a,b=termeni consecutivi in sir, t numara termenii}
begin
write(n=) ; read(n) ;
a :=0 ; b :=1 ; write (a, ,b, ) ; t :=3
repeat
v :=a+b ;
write(v, ) ;
t :=t+1 ;
a :=b ;
b :=v ;
until t>n ;
end.
Problema 7
var n,t1,t2 : integer ;
begin
write(numar=) ; read(n) ;
if n mod 2=1 then begin writeln(problema nu are solutie) ; halt end ; {problema are solutie numai}
t1 :=1 ;
{pt. numere pare}
repeat
t2 := n - t1 ;
if t2 mod 2=1 then writeln(n,=,t1,+,t2) ;
t1 :=t1+2 ;
until t1>n div 2 ;
end.
Problema 8
var n,t,w : integer ;
begin
write(numar=) ; read(n) ;
if n mod 2=0 then begin writeln(problema nu are solutie) ; halt end ;
{problema are solutie numai pt. numere impare}
{problema se poate rezolva printr-un singur calcul matematic pornind de la expresia n=t+(t+1), altfel se cauta primul termen
cu o bucla for}
for t :=1 to n div 2 do
begin
w :=n-t ;
if w=t+1 then writeln(n,=,t,+,w) ;
end ;
end.
Problema 9
var n,t,w,s,i : integer ;
begin
write(numar=) ; read(n) ;
for t :=1 to n div 2 do
begin
s :=t ;
{primul termen al sumei}
w :=t+1 ;
{al doilea termen al sumei}
repeat
{ w va lua valorile celorlalti termeni ai sumei}
s :=s+w ;
w :=w+1 ;

12

until s>=n ;
if s=n then
begin
for i :=t to w-2 do write(i,+) ;
writeln(w-1,=,n)
end ;
end ;
end.
Problema 10
var n,d : integer ;
begin
write(numar=) ; read(n) ;
writeln(divizorii lui ,n, sunt :) ;
for d :=1 to n do if n mod d=0 then write(d, ) ;
end.
Problema 11
var n,i: integer ; prim: boolean ;
begin
write(numar=) ; read(n) ;
prim :=true ;
if (n=1) or (n=0) then prim :=false
else
for i :=2 to n div 2 do
if n mod i=0 then prim :=false ;
if prim then writeln(numar prim) else writeln(numarul nu este prim) ;
end.
sau, fara variabile booleene, folosind proprietatea numerelor prime de a avea doar doi divizori
var n,i,c : integer ;
begin
write(numar=) ; read(n) ;
c :=0 ;
for i :=1 to n do if n mod i=0 then c :=c+1 ;
if c=2 then writeln(numar prim) else writeln(numarul nu este prim)
end.
Problema 12
var n,i,j,nr : integer ; prim :boolean ;
begin
write(cate numere prime ?) ; read(nr) ;
n :=2 ;
j :=0 ;
{j memoreaza cate numere prime s-au gasit}
repeat
prim :=true ;
for i :=2 to n div 2 do if n mod i=0 then prim :=false ;
if prim then begin witeln(n, ) ; j :=j+1 end ;
n :=n+1 ;
until j=nr ;
end.

13

Stabilirea limitelor buclei for utiliznd regula celor trei pahare


1) Un lift parcurge distana dintre dou etaje a i b. S se afieze toate etajele parcurse, n ordinea atingerii lor. Exemple :
Date de intrare a=4 b=7 Date de ieire 4 5 6 7 ; Date de intrare a=10 b= 8 Date de ieire 10 9 8.
2) Se dau numerele a, b i c. S se scrie un program care s afieze n ordine cresctoare toate numerele care se divid cu
a sau b i sunt mai mici dect c.
Indicaie: Se stabilete cu regula celor trei pahare ca n b s fie numrul mai mare i n a cel mai mic i bucla se ia de la
b la c.
3) S se calculeze suma numerelor naturale cuprinse ntre dou numere date ( dintr-un interval). Exemplu: Date de intrare:
capetele intervalului 3 6 Date de ieire suma=9.
Problema 1
Problema 2
var a,b,e: integer;
var a,b,c,n,x: integer;
begin
begin
write(introdu valoarea etajelor );read(a,b); write(introdu a, b si c );read(a,b,c);
write(liftul parcurge etajele );
write(nr. care se impart la ,a, sau ,b mai mici decat ,c);
if a<b then for e:=a to b do writeln(e)
if a>b then begin x:=a; a:=b; b:=x; end;
else for e:=a downto b do write(e); for n:=b to c do if (n mod a=0) or (n mod b=0) then writeln(n);
end.
end.
Problema 3
var n,s,a,b,x: integer;
begin
write(introdu doua numere ); read(a,b);
if a>b then begin x:=a; a:=b; b:=x; end;
s:=0;
for n:=a to b do s:=s+n;
writeln(suma=,s);
end.

Mai multe bucle for incluse una n alta (imbricate)


1)
2)
3)
4)

S se determine toate tripletele de numere a, b, c cu proprietile: 1<a<b<c<100; a+b+c se divide cu 10.


S se afieze toate numerele de dou cifre care adunate cu rsturnatul lor dau 55.
Se cere listarea numerelor cuprinse ntre 100 i 599, avnd cifrele n ordine cresctoare i suma cifrelor egal cu 18.
S se nlocuiasc literele cu cifre n scderea urmtoare:
a b c b e-

edab
----------ebce
Problema 1
var a,b,c: integer;
begin
for a:=2 to 97 do
for b:=a+1 to 98 do
for c:=b+1 to 99 do
if a+b+c mod 10=0 then
writeln(a, ,b, ,c);
end.

Problema 2
var a,b,n,nr: integer;
begin
for a:=1 to 9 do
for b:=1 to 9 do
begin
n=a*10+b
nr=b*10+a
f n+nr=55 then writeln(n);
end;
end.

14

Problema 3
var s,z,u: integer;
begin
writeln(Rezultate:);
for s:=1 to 5 do
for z:=s+1 to 8 do
for u:=z+1 to 9 do
if s+z+u=18 then writeln(s,z,u);
end.

Problema 4
var a,b,c,d,e: integer;
begin
a:=1;
for b:=0 to 9 do
for c:= 0 to 9 do
for d:=0 to 9 do
for e:=0 to 9 do
if a*10000+b*1000+c*100+b*10+e-(e*1000
+d*100+a*10+b)=e*1000+b*100+c*10+e
+d*100+a*10+b)=e*1000+b*100+c*10+e then
begin writeln(a,b,c,b,e); writeln( ,e,d,a,b);
writeln(------); writeln( ,e,b,c,e); end;

end.
Calcule de sume i produse
1) S se calculeze 7+14+21+28++98, 3*6*9*12**33
2) S se calculeze sumele s1=1+2+3++n
s2=1*2+2*3+3*4++(n-1)*n
s3=1+1*2+1*2*3++1*2*3**n
s4=12+22+32++n2
s5=1/2+2/3+3/4++n/(n+1)
s6=2-3+4-5+-99+100
s7=1+2+22+23+24++2n
3) Se introduc succesiv numere nenule pn la introducerea numrului 0. S se afieze suma tuturor numerelor introduse.
Exemplu: Date de intrare 3 5 4 2 0 Date de ieire 14.
4) Se citesc numere de la tastatur pn la introducerea unui numr impar divizibil cu 3. S se afieze suma tuturor
numerelor pare introduse. Exemplu: Date de intrare 7 4 6 2 1 9 Date de ieire 12.
Problema 1
var t: byte; s,p: longint;
begin
s:=0;
for t:=1 to 14 do s:=s+t*7;
p:=1;
for t:=1 to 11 do p:=p*(t*3);
writeln(suma=,s);
writeln(produs=,p);
end.

Problema 2
var t,n: integer;s2,s7: longint;
begin
s2:=0; s7:=0; write(n=); read(n);
for t:=1 to n-1 do s2:=s2+t*(t+1);
writeln (s2=,s2);
p:=1;
for t:= 0 to n do begin s7:=s7+p; p:=p*2; end;
writeln (s7=,s7);
end.

Problema 3
var n: integer; s:longint;
begin
s:=0;
repeat
write(numar=); read(n);
if n<>0 then s:=s+n;
until n=0;
writeln(suma numerelor introduse =,s)
end.

15

Utilizarea instruciunilor de ciclare pentru repetarea unor aciuni


1) Se dau numerele a i n. S se afieze numrul a urmat de n zerouri. Exemplu : Date de intrare a=34 n=5 Date de
ieire 3400000.
2) Se dau un numr n i un numr prim k. S se specifice la ce putere apare k n descompunerea n factori primi a
numrului n. Exemplu : Date de intrare n=12 k=2 Date de ieire 2.
3) S se afieze descompunerea unui numr dat n factori primi. Exemplu : Date de intrare 12 Date de ieire 12 = 2^2
3^1.
4) Un copac crete zilnic cu 0.75 cm. La plantare avea 1 m. S se afieze dup cte zile ajunge la nlimea de 12 m. La
ce nlime ajunge dup o lun (30 zile)?
5) Pentru a o elibera pe Ileana Cosnzeana, Ft-Frumos trebuie s parcurg x km. El merge zilnic a km, dar Zna-ceaRea l duce n fiecare noapte cu b km napoi, b<a. Dup cte zile o elibereaz? Exemplu: Date de intrare x=10 a=4
b=1 Date de ieire 3 zile.
6) A fost odat un balaur cu 6 capete. ntr-o zi Ft Frumos s-a suprat i i-a tiat un cap. Peste noapte i-au crescut alte 6
capete la loc. A doua zi Ft Frumos iar i-a tiat un cap dar peste noapte balaurului i-au crescut alte 6 capete i tot aa
timp de n zile. n cea de a (n+1)-a zi, Ft Frumos s-a plictisit i a plecat acas! Scriei un program care citete de la
tastatur n, numrul de zile, i care afieaz pe ecran cte capete avea balaurul dup n zile. Exemplu: pentru n=3 se va
afia 15 capete.
(ONI 2002 cl.a V-a)
7) A fost odat ca niciodat, a fost un cangur care cretea ntr-un an precum alii n zece. ntr-o zi a nceput s fac srituri.
i a srit pentru nceput 7 metri. A doua zi a srit, n plus fa de ziua precedent, de zece ori mai mult. n a treia zi a
reuit s sar, n plus fa de prima zi, de zece ori mai mult dect n ziua a doua. n a patra zi a srit, n plus fa de
prima zi, de zece ori mai mult dect n ziua a treia. i tot aa mai departe. Scriei un program care calculeaz ci metri
a srit cangurul, n total, n n zile. Exemplu: pentru n=3 se va afia 861 m.
(ONI Focani 2003 cl.a V-a)
8) Se citesc de la tastatur numere naturale pn cnd suma numerelor pare este mai mare dect k. Cte numere au fost
introduse i care este suma numerelor pare? Exemplu: Date de intrare: K=12
5 8 1 2 2 3 6 Date de ieire: 7
(numere) 18 (suma celor pare)
( P.N.C. Bucureti, Cupa Mrior 2005)
Problema 1
var a,n,k: integer;
begin
write(introdu numerele a si n:); read(a,n);
write(a);
for k:=1 to n do write(0);
end.
Problema 3
var n,factor,exp: integer;
end.
write(n=); read(n);
factor:=2;
repeat
exp:=0;
while n mod factor=0 do
begin
exp:=exp+1;
n:=n div factor;
end;
if exp<>0 then writeln(factor,^,exp) ;
factor:=factor+1;
until n=1;
end.

Problema 2
var n,k,c: integer;
begin
write(introdu numerele n si k:); read(n,k);
c:=0;
if n mod k=0 then begin while (n mod k=0) and (n<>0) do
begin n:=n div k; c:=c+1 end;
end;
writeln(k, apare la puterea ,c);

begin

Problema 4
var zi: integer; inalt: real;
begin
inalt:=1; zi:=0;
repeat
inalt:=inalt+0.75;
zi:=zi+1;
until inalt>=12;
writeln(Dupa ,zi, zile copacul ajunge la inalt. de ,inalt:5:2, m);
inalt :=1;
for zi:=1 to 30 do inalt:=inalt+0.75;
writeln(Dupa o luna copacul ajunge la inaltimea de ,inalt, m);
end.

16

Problema 5
Problema 6
var a,b,x,dist,zi: integer;
var n, zi, nrcap: integer;
begin
begin
write(valorile pt. x, a, b ); read(x,a,b);
write(numar zile=); read(n);
dist:=0; zi:=0;
nrcap:=6;
write(Fat Frumos ajunge la Ileana );
for zi:=1 to n do
repeat
begin
s:=s+a;
nrcap:=nrcap-1;
zi:=zi+1;
if zi<n then nrcap:=nrcap+6;
if s<x then s:=s-b;
end;
until s>=x;
writeln(dupa ,n, zile balaurul avea ,nrcap, capete);
writeln (dupa ,zi, zile);
end.
end.
Problema 7
var n,sar,dist,zi: integer;
begin
write(numar zile ); read(n);
sar:=7; dist:=7;
for zi:=2 to n do begin
sar:=sar*10+7; dist:=dist+s; end;
writeln(dupa ,n, zile cangurul sare ,dist, m);
end.
Algoritmi de nsumare, contorizare, determinare a min i max
1) Se citesc pe rnd 4 numere ntregi. S se numere cte dintre ele au restul 7 la mprirea cu 13. S se afieze aceste
numere i produsul celorlalte numere. Exemplu: Date de intrare 20 15 30 46 Date de ieire Numere: 20 46 Total: 2
Produs: 450.
2) Se citesc pe rnd temperaturile medii ale fiecrei luni a unui an, ca numere ntregi. S se afieze cu dou zecimale
media anual a temperaturilor pozitive i a celor negative. Exemplu: Date de intrare -5 -3 1 8 12 17 20 21 18 10 6
-2 Date de ieire medie_poz=13.66 medie_neg=-3.33.
3) Se citesc numere naturale strict pozitive pn la ntlnirea numrului 0. S se numere cte dintre ele sunt pare,
presupunnd c cel puin primul element este nenul. Exemplu: Date de intrare 4 3 6 5 7 7 0 Date de ieire 2 numere
pare.
4) Se introduc datele de natere a n copii, sub forma an, numr lun, zi. S se afieze ci copii sunt nscui pe 1 iunie i
ci copii sunt nscui n 1994, 1995 i 1996. Exemplu: Date de intrare n=3 an=1994 luna=12 zi=3 an=1990 luna=6
zi=1 an=1995 luna=6 zi=1 Date de ieire 2 copii nscui la 1 iunie 2 copii nscui n 1994 1995 1996.
5) Se citesc de la tastatur numere ntregi pozitive atta timp ct suma lor nu depete 1000. S se scrie un program
care s afieze cea mai mic i cea mai mare valoare a acestor numere. Exemplu: 550 345 100 45 Date de ieire
max=550 min=100.
6) Se citesc mediile a n elevi, ca numere reale. S se afieze cea mai mare i cea mai mic medie. S se verifice dac
sunt corigeni. Exemplu : Date de intrare n=4 9.50 4.25 9.66 6.33 Date de ieire max=9.66 min=4.25 1 corigent.
Problema 1
Problema 2
var a,c,p: integer;
var sp,sn,cp,cn,a,i: integer;
begin
begin
c:=0;p:=1;
sp:=0;sn:=0;cp:=0;cn:=0;
for i:=1 to 4 do begin
for i:=1 to 12 do begin
write(numar=);read(a);
write(temp. luna ,i,:); read(a);
if a mod 13=7 then c:=c+1 else p:=p*a;
if a>=0 then begin sp:=sp+a; cp:=cp+1 end
end;
else begin sn:=sn+a; cn:=cn+1 end;
writeln(c, nr. care dau rest 7 la imp. cu 13); end;
writeln(produsul celorlalte=,p);
writeln(media anuala a temp. pozitive=,sp/cp:6:2);
end.
if cn<>0 then writeln(media an. a temp. neg.=,sn/cn:6:2)

17

Problema 3
var c,a: integer;
begin
c:=0;
repeat
write(numar=); read(a);
if (a mod 2=0) and (a<>0) then c:=c+1;
until a=0;
writeln(ai introdus ,c, numere pare);
end.
Problema 5
var s,n,i,r:integer; m:real;
begin
writeln(introdu numere :);
s:=0; i:=0;
while s<=1000 do begin
read(n);
s:=s+n;
i:=i+1;
end;
m:=s/i;
writeln( media numerelor este=,m:7:3);
end.

else writeln(nu s-au inreg.temp.medii lunare neg.);


end.
Problema 4
var a,l,z,n,c1,c,i: integer;
begin
c1:=0; c:=0;
write(cati copii?); read(n);
for i:=1 to n do begin
write(an,luna,zi:); read(a,l,z);
if (z=1) and (l=6) then c1:=c1+1;
if (a=1994)or(a=1995)or(a=1996) then c:=c+1;
end;
writeln(c1, copii nascuti la 1 iunie);
writeln(c, copii nascuti in 1994,1995,1996);
end.
Problema 6
var n,i,c: integer; max,min,m: real;
begin
min:=10; max:=0; c:=0;
write(cate medii?); read(n);
for i:=1 to n do begin
write(media=); read(m);
if min>m then min:=m; if max<m then max:=m;
if m<5 then c:=c+1;
end;
writeln(cea mai mare medie=,max:5:2);
writeln(cea mai mica medie=,min:5:2);
if c=0 then writeln(nu sunt corigenti)
else writeln(sunt ,c, corigenti);

end.
Algoritmul de mprire n cifre a unui numr
1) Se dau trei numere a,b,c, de cte dou cifre, nenule, fiecare. Folosind cifrele unitilor celor trei numere se va genera un
numr x de trei cifre, iar cu cifrele zecilor se va genera un numr y de trei cifre. S se afieze x i y. Exemplu : date de
intrare a=24 b=13 c=64 date de ieire x=434 y=216.
2) Se introduce un numr natural cu maxim 9 cifre. S se determine i s se afieze numrul de cifre, cea mai mare cifr i
suma tuturor cifrelor acestui numr. Exemplu: Date de intrare 24356103 Date de ieire 8 cifre max=6 min=0 suma=24.
3) Cte cifre pare sunt ntr-un numr dat? Exemplu : Date de intrare 34425346 Date de ieire 4 cifre.
4) S se verifice dac la scrierea unui numr, introdus de la tastatur, cifrele pare i impare alterneaz. Exemplu : date de
intrare 347092 date de ieire da.
5) n cte zerouri se termin un numr de maxim 9 cifre, introdus de la tastatur? Exemplu : Date de intrare 20034000
Date de ieire 3 zerouri.
6) Se introduce un numr. S se verifice dac este palindrom. Exemple : Date de intrare 12321 Date de ieire Da ; Date de
intrare 23034 Date de ieire Nu.
7) S se afieze toate numerele palindroame mai mari dect 10 i mai mici dect un numr dat, n. Exemplu : Date de
intrare n=110 date de ieire 11 22 33 44 55 66 77 88 99 101.
8) Se introduce un numr natural n cu maxim 8 cifre, nenule i distincte, mai mici ca 9. S se afieze cifrele numrului n
ordine descresctoare. Indicaie: fiecare cifr c se nmulete cu 10c, se adun aceste numere i se afieaz fr
zerouri. Exemplu: pentru n=354, s-ar face urmtoarele calcule: 4*104+5*105+3*103=54300 i se va afia 543 .

18

9) Dat un numr ntreg de maxim 9 cifre, s se afieze numrul de apariii al fiecrei cifre. Exemplu : Date de intrare
364901211 Date de ieire 0 apare de 1 ori 1 apare de 3 ori 2 apare de 1 ori 3 apare de 1 ori 4 apare de 1 ori 5
apare de 0 ori 6 apare de 1 ori 7 apare de 0 ori 8 apare de 0 ori 9 apare de 1 ori.
10) Afiai cte cifre distincte conine un numr nenul. Exemplu : date de intrare 234323 Date de ieire 3 cifre.
11) Se dau dou numere naturale a,b cu maxim 9 cifre. a) S se determine cifrele distincte comune numerelor a i b.
b) S se afieze numrul cel mai mare format din toate cifrele lui a i b
Exemplu : pentru a=2115 b=29025 se va afia a) 2 5 b) 955222110
(OJI, clasa a V-a, 2004)
12) Se introduc dou numere, a i b, a<b<5000000. S se afieze ultima cifr a sumei tuturor numerelor aflate ntre a i b.
Exemple: Date de intrare a=12 b=14 date de ieire 9 ; date de intrare
a=1000000 b=3000000 date de ieire 0.
13) Se dau dou numere avnd acelai numr de cifre. Cte cifre trebuie modificate pentru a transforma un numr n
cellalt ? Exemplu : pentru n1= 2135 i n2= 7139 este necesar modificarea a dou cifre.
Problema 1
Problema 2
var a,b,c,ua,za,ub,zb,uc,zc,x,y:byte;
var n,s,c,max,cifra : longint ;
begin
begin
write(a,b,c=); read(a,b,c);
write(introdu un numar ) ; read(n) ;
ua:=a mod 10; ub:=b mod 10; uc:=c mod 10; c :=0 ; max :=0 ; s :=0 ;
za:=a div 10; zb:=b div 10; zc:=c div 10;
repeat
x:=ua*100+ub*10+uc; y:=za*100+zb*10+zc; cifra :=n mod 10 ; s:=s+cifra ; c :=c+1 ;
writeln(x=,x, y=,y);
if max<cifra then max :=cifra ;
end.
n :=n div 10 ;
until n=0 ;
writeln(numarul are ,c, cifre) ;writeln(suma cifrelor=,s) ;
writeln( cea mai mare cifra este ,max) ;
end.
Problema 3
var n: longint ;cifra,c : byte ;
begin
write(introdu un numar ) ; read(n) ;
c :=0 ;
repeat
cifra :=n mod 10 ;
if cifra mod 2=0 then c :=c+1 ;
n :=n div 10 ;
until n=0 ;
writeln(numarul are ,c, cifre pare) ;
end.

Problema 4
var n, cifra1, cifra2: longint ; alt :boolean ;
begin
write(numar=) ; read(n) ;
alt :=true ; cifra1 :=n mod 10 ; n :=n div 10 ;
repeat
cifra2 :=n mod 10 ;{se memoreaza cate 2 cifre consecutive}
{se verifica daca suma lor este impara}
if (cifra1+cifra2) mod 2<>1 then alt :=false ;
cifra1 :=cifra2 ; n :=n div 10 ;
until n=0 ;
if alt then writeln(avem alternanta)
else writeln(nu avem alternanta) ;
end.
Problema 5
Problema 6
var n,cifra,c : longint ; gata: boolean ;
var n,ndat,nrast,cifra : longint ;
begin
begin {constr. nr. rasturnat pe masura ce scot cifrele}
write(introdu un numar nenul ) ; read(n) ; write(introdu numarul :) ; read(n) ;
c:=0 ; gata :=false ;
ndat :=n ; nrast :=0 ;
repeat
repeat
cifra :=n mod 10 ;
cifra :=ndat mod 10 ;
if cifra=0 then c :=c+1 else gata :=true ;
nrast :=nrast*10+cifra ;
n :=n div 10 ;
ndat :=ndat div 10 ;
until gata ;
until ndat=0 ;
writeln(numarul se termina cu ,c, zerouri) ; if n=nrast then writeln(ESTE PALINDROM)
end.
else writeln(NU ESTE PALINDROM) ;

19

Problema 7
var n,x,ndat,nrast,cifra : longint ;
begin
write(n=) ; read(n) ;
writeln(NUMERE PALINDROAME) ;
for x :=10 to n do begin
ndat :=x ; nrast :=0 ;
repeat
cifra :=ndat mod 10 ;
nrast :=nrast*10+cifra ;
ndat :=ndat div 10 ;
until ndat=0 ;
if x=nrast then writeln(x, ) ;
end ;
end.

end.
Problema 8
var n,cifra,i,p,s,srast : longint ;
begin
write(numar cu cifre intre 1 si 8, distincte=) ; read(n) ;
s :=0 ;
repeat
cifra :=n mod 10 ;
p :=1 ; for i :=1 to cifra do p :=p*10 ;
s :=s+cifra*p ;
n :=n div 10
until n=0 ;
srast :=0 ;
{formez rasturnatul lui s fara cifrele de 0}
repeat
cifra :=s mod 10 ;

Problema 9
if cifra<>0 then srast :=srast*10+cifra ;
var n,c,nc,m,cifra : longint ;
s :=s div 10 ;
begin
until s=0 ;
write(introdu un numar ) ; read(n) ;
repeat {afisez rasturnatul lui srast, fara a forma acest numar}
for c :=0 to 9 do
cifra :=srast mod 10 ;
begin
write(cifra, ) ;
nc :=0 ;
srast :=srast div 10 ;
m :=n ;
until srast=0 ;
repeat
end.
cifra :=m mod 10 ;
if cifra=c then nc :=nc+1 ;
m :=m div 10 ;
until m=0 ;
writeln(cifra ,c, apare de ,nc, ori) ;
end ;
end.
Problema 10
Problema 11
var n,c,nc,m,cifra,nrcifre: longint ;
var a,b,m,cifra,nr :longint ; nr1,nr2 :boolean ;
begin
begin
write(introdu un numar ) ; read(n) ;
write(a,b=) ; read(a,b) ;
nrcifre :=0 ;
write(a) ) ;
for c :=0 to 9 do
for c := 0 to 9 do
begin
begin
nc :=0 ;
nr1:=false ; m:=a ;
m :=n ;
repeat
repeat
cifra :=m mod 10 ; if cifra=c then nr1:=true;
cifra :=m mod 10 ;
m :=m div 10 ;
if cifra=c then nc :=nc+1 ;
until m=0 ;
m :=m div 10 ;
nr2:=false; m:=b ;
until m=0 ;
repeat
if nc<>0 then nrcifre:=nrcifre+1 ;
cifra :=m mod 10 ; if cifra=c then nr1:=true;
end ;
m :=m div 10 ;
writeln(numarul contine ,nrcifre, distincte) ;
until m=0 ;
end.
if nr1 and nr2 then write(c, );

20

Problema 12
var a,b,s,n: longint ;
write (a,b (a<b) :) ; read(a, b) ;
s:=0 ; for n:=a to b do s:= s + n mod 10 ;
writeln(ultima cifra=,s mod 10) ;
end.

end ; writeln ;
write( b) ) ; {iau toate cifrele de la 0 la 9 si vad de cate ori apare begin
fiecare atat in a cat si in b}
for c :=9 downto 0 do
begin
nr :=0 ; m :=a ;
repeat
cifra :=m mod 10 ; if cifra=c then nr:=nr+1;
m :=m div 10 ;
until m=0 ;
m :=b ;
repeat
cifra :=m mod 10 ;
if cifra=c then nr:=nr+1;
m :=m div 10 ;
for i :=1 to nr do write(c) ;
{cifra c se afiseaza de atatea ori de cate ori apare in a si b}
end ;
end.

Algoritmul lui Euclid


1) Se dau dou numere nenule. S se afieze cmmdc i cmmmc al lor. Exemplu : Date de intrare 12 32 Date de ieire
cmmdc=4 cmmmc 96.
2) Se dau numitorul i numrtorul unei fracii. S se simplifice, dac se poate, i s se afieze fracia simplificat.
Exemplu : Date de intrare 12 32 Date de ieire 3/8.
3) Se dau trei numere. Determinai i afiai cmmmdc al lor. Exemplu : Date de intrare 12 32 38 Date de ieire 2.
4) Se d numrul n, s se afieze toate numerele mai mici ca el prime cu el. Exemplu : date de intrare n=10 date de ieire
1 3 7 9.
5) ntr-o tabr particip b biei i f fete. Se organizeaz un joc la care trebuie s participe un numr ct mai mare de
echipe, formate din acelai numr nrb de biei i nrf de fete. Trebuie s scriei un program care determin numrul
maxim de echipe care se pot forma i numrul nrb de biei i, respectiv numrul nrf de fete, care intr n componene
fiecrei echipe. Dac nu se pot forma cel puin dou echipe identice, afiai Nu ne putem juca. Exemple: pentru b=10
f=15 se va afia: 5 echipe cu 2 baieti 3 fete, pentru b=12 f=25 se va afia Nu ne putem juca.
6) Se citesc de la tastatur patru numere ntregi diferite de zero. Numerele reprezint n ordinea citirii: numrtorul i
numitorul primei fracii, respectiv numrtorul i numitorul celei de a doua fracii. S se adune cele doua fracii i s se
afieze numrtorul i numitorul sumei. Exemplu: Date de intrare: 6 18 12 24 Date de ieire: 5 6.
Problema 1
Problema 2
var a,b,r: integer ;
var a,b,r,numarator,numitor: integer ;
begin
begin
write(introdu doua numere ) ; read(a,b) ; write(introdu numaratorul si numitorul ) ; read(a,b) ;
repeat
numarator :=a ;numitor :=b ;
r:=a mod b ;
repeat
a :=b ;
r:=a mod b ;
b :=r ;
a :=b ;
until r=0 ;
b :=r
write(cmmdc=,a) ;
until r=0 ;
end.
numarator:=numarator div a ; numitor :=numitor div a ;
writeln(fractia=,numarator,/,numitor) ;
end.
1 C++
#include<iostream>
usingnamespace std;
void main()

21

{
int a, b, r, x, y;
cout << "Programul calculeaza c.m.m.d.c. si c.m.m.m.c a doua numere date" << endl;
cout << "Introduceti primul numar : ";
cin >> a; x=a;
cout << "Introduceti al doilea numar : ";
cin >> b; y=b;
while(b!=0) {
r=a%b; // calculeaza restul impartirii lui a la b
a=b;
b=r;
}
cout << "c.m.m.d.c al numerelor "<< x << " si " << y << " este : " << a << endl;
cout << "c.m.m.m.c al numerelor "<< x << " si " << y << " este : " << x*y/a << endl;
}
Problema 3
Problema 4
var a,b,c,r: integer ;
var n,m,r: integer ;
begin
begin
write(introdu trei numere ) ; read(a,b,c) ;
write(introdu un numar ) ; read(n) ;
repeat {aflu cmmmdc dintre a si b}
writeln(numere prime cu ,n) ;
r :=a mod b ; a :=b ; b :=r ;
for m :=2 to n-1 do begin
until r=0 ;
x :=n ;y :=m ;
repeat
repeat r :=x mod y ; x :=y ; y :=r until r=0 ;
{aflu cmmmdc dintre c si cmmmdc dintre a si b}
if x=1 then write(m, ) ;
r :=a mod c ; a :=c ; c :=r ; until r=0 ;
end ;
writeln(cmmmdc=,a) ;
end.
end.
Probleme diverse
1) S se afieze toate numerele pn la 100 care au patru divizori.
2) Dintre numerele mai mici ca 1000, care au cei mai muli divizori ?
3) Se dau n numere. n cte zerouri se va termina produsul lor? Exemplu : date de intrare n=4 5 4 10 25 date de ieire 3
zerouri.
4) Se d un numr natural n, n<=100 i o cifr k din mulimea {2,3,5,7}. Se cere s se afieze exponentul lui k n
descompunerea n factori primi a produsului 1*2*3**n. Exemplu: date de intrare n=8 k=2 date de ieire 7. (ONI 2003
clasa a V-a)
5) Se introduc temperaturile medii msurate n fiecare lun a unui an. S se afieze valoarea celei mai mari temperaturi
negative i a celei mai mici temperaturi pozitive a acelui an. Exemplu: date de intrare -4 -6 0 5 10 20 24 25
17 8 -1 -7 date de ieire max negative=-1 min pozitive=5.
6) Se citete un numr natural n cu cel mult 9 cifre i se cere s se afieze o piramid format din cifrele lui astfel: pe
prima linie cifra (sau cifrele) din mijloc, pe a doua cele 3 (sau 4 ) cifre din mijloc, etc. pe ultima s fie scris numrul dat.
Exemplu: n=237855 se va afia 7 8
378 5
2 3 7 8 5 5
7) Dat valoarea unui numr natural, se cere s se tipreasc n scriere roman.
8) Se citesc pe rnd caracter cu caracter elementele unei expresii matematice, caracterele citite pot fi doar cifre i +, -, * ,/
i =, pn la ntlnirea semnului =. Operaiile se fac n ordinea introducerii lor, fr a se ine seama de prioritate.
Calculatorul s afieze rezultatul expresiei.
9) O broscu se deplaseaz efectund cte o sritur de lungime p cm la fiecare secund. Dup fiecare n secunde
broscua devine mai obosit, iar lungimea sriturii pe care o face se njumtete. Scriei un program care s citeasc
de la tastatur lungimea iniial a sriturii, p, numrul de secunde dup care broscua i injumtete saltul, n, precum

22

10)

a)
b)
c)
11)

12)

13)

14)

15)

i durata total a deplasrii broscuei T (exprimat n secunde) i care s determine distana total pe care a parcurs-o
broscua. Distana total determinat va fi afiat pe ecran cu dou zecimale. Restricii: p, n, T sunt numere naturale; p,
n, T<30000;T/n<16 Exemplu Pentru n=10, p=20 i T=33, distana total pe care se deplaseaz broscua este 357.50
cm.
(ONI, Galaciuc 2001, clasa a V-a)
La un concurs de matematic particip elevi din mai multe coli din diferite orae. Pentru a se putea deosebi ntre ele
lucrrile lor, fiecare lucrare este codificat printr-un numr natural cu 3 cifre, s zicem abc, unde a este codul oraului, b
este codul colii din oraul a iar c este codul unui elev din coala b din oraul a. Ex.: lucrarea cu codul 328 este lucrarea
elevului cu codul 8 de la coala cu codul 2 din oraul cu codul 3. Se cunosc: un cod (al lucrrii unui elev H, prietenul
nostru), numrul n de lucrri i codurile acestora. Cerin: Se cere s se rezolve cerinele:
Verificai dac H este premiant sau nu.
Determinai numrul de premii luate de elevii din oraul lui H
Determinai numrul de premii luate de elevii din coala lui H
Exemplu: date de intrare codH 123 n=4 133 221 123 125 Date de ieire a) da b) 3 c) 2
(OJI, clasa a V-a, februarie 2004)
O carte are N pagini. Pe paginile care au numrul asociat divizibil cu K i nedivizibil cu H se afl poze. Cerin: pentru N,
K, H citite de la tastatur se cere s se afieze ultima cifr a sumei numerelor asociate paginilor care au poze, dac
problema nu are soluie se va afia mesajul: Imposibil!
Restricii 0<N<1000000001 0<K,HN. Exemplu Pentru N=20, K=3, H=2 se va afia 7
(CNI Satu-Mare 2003 clasa a V-a)
ntr-o parcare sunt n maini care au numere de nmatriculare provizorii (numere ntregi, din cel mult 5 cifre). Mainile
sunt aezate n ordinea de citire a numerelor de nmatriculare. S se afieze poziiile pe care se afl mainile pentru
care suma cifrelor numrului de nmatriculare este impar ( n<= 20).
Exemplu: pt. n=5 i numerele de nmatriculare: 634 90281 63721 30361 70915 se vor afia poziiile: 1 3 4
(CNI Satu-Mare 2002 clasa a V-a)
n vacan la mare dup ce se plictisete de plaj i ap, Ionic este mai tot timpul n Parcul de distracii. Dintre toate
locurile de distracie el a ales tirul. Astfel, ntr-o sear Ionic obine S puncte, dup un anumit numr de trageri (cel puin
dou trageri). tiind c la toate tragerile efectuate a obinut puncte i c dup fiecare tragere el progreseaz constant,
adic obine cu un punct mai mult dect la tragerea anterioar, se cere s se determine toate modalitile de obinere a
punctajelor (cu suma lor egal cu S). Date de intrare: de la tastatur se va citi valoarea lui S (numr natural nenul
998877). Date de ieire: Pentru fiecare soluie se va afia pe cte un rnd numrul de trageri i punctajul primei trageri
cu un spaiu ntre ele, iar la sfrit pe ultima linie se va afia mesajul Numar solutii, urmat de numrul de soluii.
Exemplu: Pentru S=15 pe ecran se va afia:
5 1 2 7 3 4
Numr soluii 3
(ONI
Glciuc 2002 clasa a V-a)
Pentru a descoperi numrul cheii ce trebuie s o foloseasc pentru a putea s o elibereze pe Ileana Cosnzeana, FtFrumos are de rezolvat urmtoarea problem: Pentru numrul citit pe u, trebuie s calculeze suma divizorilor i, dac
aceast sum este un numr prim, atunci codul este egal cu suma cifrelor numrului citit. n caz contrar, codul este egal
cu suma cifrelor impare ale numrului citit. Ajutai-l pe erou s descopere numrul cheii. Exemple: date de intrare 472
date de ieire cheia 7 ; Date de intrare 4 date de ieire cheia 4.
(CNI-etapa judeean, 2005)
Se dau dou numere avnd acelai numr de cifre. Cte cifre trebuie modificate pentru a transforma un numr n
cellalt? Exemplu: date de intrare n1=2135 n2=7139 date de ieire 2 cifre.
(CNI-etapa judeean, 2005)

Problema 1
Problema 2
var n,d,c:integer;
var max,n,nr,d,c: integer;
begin
begin
writeln(Numere care au patru divizori);
max:=0;
for n:=6 to 100 do begin
for n:=2 to 1000 do begin
c:=0;
c:=0;
for d:=1 to n do if n mod d=0 then c:=c+1;
for d:=1 to n do if n mod d=0 then c:=c+1;
if c=4 then write(n, );
if max<c then begin max:=c; nr:=n; end;
end;
end;
writeln;
writeln(primul numar cu cei mai multi divizor este ,nr);

23

end.
end.
Problema 3
Problema 4
var n,e2,e5,a,i: integer;
var n,k,c,a,i,exp: integer;
begin
begin
write(n=); read(n);
write(introdu numerele n si k:); read(n,k);
e2:=0; e5:=0; {vor memora suma
exp:=0; {exp. lui k va fi suma exponentilor lui k in desc. in factori
exp. lui 2 si 5 din descomp. fiecarui nr}
primi a nr. pana la n}
for i:=1 to n do begin
for i:=2 to n do begin
write(numar=); read(a);
c:=0;
if a mod 2=0 then while a mod 2=0 do
if i mod k=0 then begin
begin a:=a div 2; e2:=e2+1;
end;
a:=i; {nu se poate modifica val. lui i in bucla for}
if a mod 5=0 then while a mod 5=0 do
while (a mod k=0) and (a<>0) do begin
begin a:=a div 5; e5:=e5+1;
end;
exp:=exp+c; a:=a div k; c:=c+1 end;
end;
end;
{cum pentru fiecare pereche 2, 5 din produs
end;
se obtine un zero, nr. de zerouri este egal cu writeln(exponentul lui ,k, este ,exp);
min(e2,e5)}
end.
if e2<e5 then
Problema 6
writeln(prod. se termina in ,e2, zerouri) var e,i,j,c: byte {c=numar cifre, e=numar maxim de cifre
else
eliminate pe o latura }
writeln(prod. se termina in ,e5, zerouri); n,nr,f,r: longint; {r=nr ramas dupa elimin. cifrelor de pe extreme }
end.
begin
Problema 5
write(n=); read(n);
var min,max,t,i: integer;
c:=0; nr:=n;
begin
repeat {se deermina c, numarul de cifre al numarului n}
max:= -50; min:= 50;
c:=c+1; nr:=nr div 10; until nr=0;
for i:=1 to 12 do begin
e:=(c-1) div 2;
write(temperatura in luna ,i); read(t);
for i:=e downto 0 do begin
if (max<t) and (t<0) then max:=t;
f:=1;
if (min>t) and (t>0) then min:=t;
for j:=1 to i do f:=f*10;
end;
r:=n div f;
{se elimina f cifre de la sfarsit}
writeln(max negative=,max);
f:=1;
writeln(min pozitive=,min);
for j:=1 to c-2*i do f:=f*10;
end.
r:=r mod f;
{se elimina cifrele de la inceput}
writeln(r:c-i);
Problema 7
var x: longint;
begin
writeln(numar=); read(x);
writeln(scrierea romana a numarului dat:);
while x>=1000 do begin write(M); x:=x-1000 end;
if x>=900 then begin write(CM); x:=x-900 end
else if x>=500 then begin write(D); x:=x-500 end
else if x>=400 then begin write(CD); x:=x-400 end;
while x>=100 do begin write(C); x:=x-100 end;
if x>=90 then begin write(XC); x:=x-90 end
else if x>=50 then begin write(L); x:=x-50 end
else if x>=40 then begin write(XL); x:=x-40 end;
while x>=10 do begin write(X); x:=x-10 end;
if x>=9 then begin write(IX); x:=x-9 end

24

end;

end.

else if x>=5 then begin write(V); x:=x-5 end


else if x=5 then begin write(IV); x:=x-4 end;
while x>=1 do begin write(I); x:=x-1 end;
end.
Problema 8
var op,c:char; nr:longint; i: integer; e: real;
begin
writeln(introdu expresia aritmetica, caracter cu caracter:);
{expresia introdusa se presupune ca va fi corecta}
nr:=0;
repeat {se formeaza primul termen}
readln(c); case c of
0..9: nr:=nr*10+ord(c)-48;
end;
until (ord(c)<48) or (ord(c)>57);
e:=nr; nr:=0; op:=c;
repeat readln(c); case c of
0..9: nr:=nr*10+ord(c)-48;
+,-,*,/: begin case op of
+: e:=e+nr;
-: e:=e-nr;
*: e:=e*nr;
/: e:=e/nr;
end;
op:=c; nr:=0
end;
end;
until c==;
case op of
{se face ultima operatie cu ultimul numar introdus}
+: e:=e+nr;
-: e:=e-nr;
*: e:=e*nr;
/: e:=e/nr;
end;
writeln(valoarea expresiei=,e:10:3);
end.
Problema 9
var d,p:real; s,n,t:word;
begin
write(p, n, t =); read(p,n,t);
d:=0; s:=0;
repeat
d:=d+p; s:=s+1; if s mod n=0 then p:=p/2;
until s=t;
writeln(d=,d:10:2, cm);
end.
Problema 10
var cod,cd,ah,ch,x,bh,n,,premiant,nrpremoras,nrpremsc,i: integer;
begin
write(codul prietenului:); read(cod);
ah:=cod div 100; ch:=cod mod 10; x:=cod mod 100; bh:=x div 10;
write(cate lucrari?); read(n);
writeln(introdu codurile celor ,n, lucrari:);

25

premiant:=false; nrpremoras:=0; nrpremsc:=0;


for i:=1 to n do begin
write(cod=); read(cd);
a:=cd div 100;
c:=cd mod 10;
x:=cd mod 100;
b:=x div 10;
if cd=cod then premiant:=true;
if a=ah then nrpremoras:=nrpremoras+1;
if (b=bh) and (a=ah) then nrpremsc:=nrpremsc+1;
end;
if premiant then writeln(H este premiant!) else writeln(H nu este premiant);
writeln(nrpremoras, premii din orasul lui H);
writeln(nrpremsc, premii din scoala lui H);
end.
Problema 11
var n,k,h,i,s: longint; posibil: boolean;
begin
write(cate pagini sunt?); read(n);
write(k,h=); read(k,h);
s:=0;
for i:=1 to n do if (i mod k=0) and (i mod h<>0) then begin s:=s+i mod 10; posibil:=true end;
if posibil then writeln(ultima cifra=,s mod 10) else writeln(Imposibil);
Problema 12
var a: longint; i,n,c,s: byte;
begin
for i:=1 to n do begin
write(numar inmatriculare:); read(a);
s:=0;
repeat
c:= a mod 10;
s:=s+c; a:=a div 10;
until a=0;
if s mod 2=1 then writeln(pozitia ,i);
end;
end.
Problema 13 vezi problema 10 cap.III Instruciuni de ciclare, algoritmi ciclici. Utilizarea instruciunilor de ciclare pentru
generare de numere
Problema 14
var x, d, sc,c,sci : integer ;
begin
write(numar citit pe usa ) ; read(x) ;
s:=0; {suma divizorilor lui x}for d:=1 to x do if x mod d=0 then s:=s+d;
{verific daca s este prim}prim:=true; for i :=2 to s div 2 do if s mod i=0 then prim :=false ;
if prim then begin sc :=0 ; repeat c :=s mod 10 ; sc :=sc+c ; s :=s div 10 until s=0 ;writeln(cod=,sc) ; end
else begin sci :=0 ; repeat c :=s mod 10 ; if c mod 2=1 then sci :=sci+c ; s :=s div 10 until s=0 ; writeln(cod=,sci) ;
end ;
end.
Problema 15
var
begin
write(doua nr. Cu acelasi numar de cifre ); readln(a,b);
c:=0; {numara cate cifre de pe aceeasi pozitie in cele doua numere, sunt diferite}
repeat

26

ca:=a mod 10; cb:=b mod 10;


if ca<>cb then inc(c);
a:=a div 10; b:=b div 10
until a=0;
writeln(trebuie modificate ,c, cifre);
end.

IV.

VARIABILE BOOLEENE

1) Ctlina are o maimu care a nvat s scrie la tastatur. Pentru aceast sptmn trebuie s nvee s scrie trei
cuvinte de maximum 10 caractere. Din pcate, maimua se grbete i apas greit pe taste. Ajutai-o pe Ctlina s
verifice cnd maimua a scris corect cele trei cuvinte. Date de intrare: cele trei cuvinte i cuvintele introduse de
maimu. Programul se va opri atunci cnd maimua a reuit s scrie corect toate cele trei cuvinte indiferent de ordinea
introducerii sau de numrul de cuvinte greite introduse. Separarea intre cuvinte se face apsnd tasta Enter. Exemplu:
Pentru cuvintele: Palat calculator jungla, maimuta poate tasta: palat Calutin jungla Pialat Cucalator calculator Palat se
va afia AI REUSIT!
(www.contaminare.ro)
2)
Cine se uit la televizor ?
Ana, Barbu, Clin, Dumitru i Elena petrec mpreun o zi de iarn.
Dac Ana privete la TV, la fel face i Barbu
Fie Dumitru, fie Elena, fie amndoi privesc la TV
Fie Barbu, fie Clin privete la TV, dar nu amndoi
Dumitru i Clin fie privesc, fie nu privesc la TV, dar asta numai mpreun
Dac Elena privete la TV atunci Ana i Dumitru se uit i ei
Indicaie : se vor folosi variabilele booleene a,b,c,d,e care vor avea valoarea true sau false dup cum propoziiile Ana
se uit la TV , Barbu se uit la TV , etc. sunt adevrate sau false.
3)
Cine minte ?
ntr-o mprejurare n care sunt implicai a, b i c se fac urmtoarele afirmaii : a susine c b minte, b susine c c minte,
c susine c a i b mint. Cine minte i cine spune adevrul ?

Problema 2
var a,b,c,d: boolean; q: byte;
begin
q:=0; {q numara conditiile}
for a :=false to true do
for b := false to true do
for c := false to true do
for d := false to true do
for e := false to true do
begin
if a<=b then q:=q+1 ;
if e<=(a and d) then q :=q+1 ;
if d or e then q :=q+1 ;

27

if b xor c then q :=q+1 ;


if not(d xor c) then q :=q+1 ;
if q=5 then begin
if a then writeln(Ana se uita la TV) ;
if b then writeln(Barbu se uita la TV) ;
if c then writeln(Calin se uita la TV) ;
if d then writeln(Dumitru se uita la TV) ;
if e then writeln(Elena se uita la TV) ;
end ;
q :=0 ;
end ;
end.

Problema 3
var a,b,c :boolean ;
begin
for a :=false to true do
begin
b :=not a ;
c :=not b ;
if (a or b) xor c then begin
if a then writeln(a spune adevarul) else writeln(a minte) ;
if b then writeln(b spune adevarul) else writeln(b minte) ;
if c then writeln(c spune adevarul) else writeln(c minte) ;
end ;
end ;
end.

28

V.

GENERAREA ALEATOARE A NUMERELOR

Funcia random i procedura randomize


1) S se simuleze aruncarea unui zar de n ori afindu-se valoarea feei i s se afieze de cte ori a aprut valoarea 6.
2) Se arunc 2 zaruri pn la obinerea unei duble. S se afieze suma punctelor.
3) Se extrag n bile dintr-o urn, notate de la 1 la 20. Valoarea bilei va fi generat de calculator. S se afieze cea mai mare
valoare extras.
4) Dintr-o urn cu bile albe i negre se extrage pe rnd cte o bil, de n ori. Afiai cte bile albe i cte negre au fost
extrase.
5) S se fac un test de nmulire cu dou numere cuprinse ntre 0 i 10, generate de calculator, care s cuprind cel mult
5 ncercri.
Problema 1
var f,n,c,i: word;
begin
write(cate aruncari?); read(n);
writeln(valori obtinute la aruncari:); randomize;
for i:=1 to n do begin f:=random(6)+1; writeln(aruncarea ,i,: ,f ); if f=6 then c:=c+1; end ;
writeln(fata 6 s-a obtinut de ,c, ori) ;
end.
Problema 2
var s,z1,z2 : word ;
begin
writeln (valori obtinute la aruncari :) ; randomize ;
s :=0 ;
repeat
z1 :=1+random(6) ;
z2 :=1+random(6) ;
s :=s+z1+z2 ;
writeln(z1, ,z2) ;
until z1=z2 ;
writeln(suma=,s) ;
end.

29

Problema 3
var n,max,b,i : word ;
begin
write(numarul bilelor extrase :) ; read(n) ;
max :=0 ; randomize ; writeln(s-au extras bile cu numerele :) ;
for i :=1 to n do begin
b :=1+random(20) ; write(b, ) ;if max<b then max :=b ;end ;
writeln ;writeln(valoarea maxima extrasa=,max) ;
end.
Problema 4
var n,ca,cn,b,i : word ;
begin
write(numarul bilelor extrase :) ; read(n) ;
ca:=0 ; cn :=0 ; randomize ; writeln(s-au extras bile de culoare :) ;
for i :=1 to n do
begin b :=random(2);
{codificam culorile : alb=0, negru=1}
if b=0 then begin ca :=ca+1 ;write(alba, ) end else begin cn :=cn+1 ;write(neagra, ) end ;
end ;
writeln ; writeln(ca, bile albe ,cn, bile negre) ;
end.
Problema 5
var n1,n2,raspuns,i,j,n : word ;
begin
randomize ; write(cate intrebari ?) ; read(n) ;
for j :=1 to n do begin
n1 :=randomize(11) ;n2 :=randomize(11) ;i :=0 ;
repeat writeln(cat face ,n1,x,n2, ?); readln(raspuns) ; i :=i+1 ;until (raspuns =n1*n2) or i=5 ;
end ;
end.

30

VI.

TABLOURI CU O DIMENSIUNE (VECTORI)

Introducere, parcurgere, afiare. Parcurgere cu instruciunea for


1) Se citesc 4 numere de maxim 9 cifre. S se afieze pe vertical, specificndu-se i poziia pe care o ocup n ir.
Exemplu: Date de intrare 5 3 7 6 Date de ieire 5
pozitia 1
3
pozitia 2
7
pozitia 3
6
pozitia 4
2) Se d un ir de 10 numere naturale. S se afieze pe dou rnduri, pe primul rnd cele pare i pe al doilea cele impare.
Exemplu: Date de intrare 4 3 2 5 6 8 9 0 1 5
Date de ieire 4 2 6 8 0
3 5 9 1 5
3) Se introduc 10 litere, s se afieze n ordinea invers introducerii. Exemplu: Date de intrare a b r a c a d a b r Date de
ieire r b a d a c a r b a.
4) Un acrostih este o poezie la care, citind nceputul fiecrui vers, se obine un mesaj. S se introduc un acrostih, vers cu
vers, i s se afieze mesajul dat de primele litere. Exemplu: pentruVreau s dorm
Rd n somn
Este ca un drog
Acest drag somn
Uitat n pat
Se va afia VREAU
5) Introducei n numere ntr-un vector i un numr d. Afiai acele numere din irul dat care sunt divizibile cu d. Exemplu:
date de intrare n=5 numere: 5 7 10 23 15 d=5 Date de ieire 5 10 15.
6) Robin Hood se afl la un concurs de tras cu arcul. Acolo el trebuie s obin punctajul x doar din trei sgei(sageata
1+sageata2+sageata3=punctajul x). inta este format din n cercuri concentrice (unul n altul). Fiecare cerc are un
anumit punctaj. S se spun valorile cercurilor n care trebuie s trag Robin Hood pentru a obine punctajul x. Dac
exist mai multe soluii, s se printeze toate. Dac nu exist soluii, s se printeze imposibil. Date de intrare: pe prima
linie n i x, pe a doua linie valoarea fiecrui cerc. Date de ieire: soluiile sau imposibil. Exemplu: Intrare:n=3 x=4 valori
cercuri 1 2 3 4 Ieire: 1 1 2 (explicaie: 1+1+2=4)
Problema 1
var x: array[1..10] of longint; i: byte;
begin

31

writeln(introdu 10 numere); for i:=1 to 10 do read(x[i]);


writeln(Ai introdus numerele:); for i:=1 to 10 do writeln(pozitia ,i:3,x[i]:12);
end.
Problema 2
var x: array[1..15] of real; i: byte;
begin
writeln(introdu 15 numere); for i:=1 to 15 do read(x[i]);
writeln(numerele intregi:); for i:=1 to 15 do if x[i]=int(x[i]) then write(trunc(x[i]):10);
writeln(numerele fractionare:); for i:=1 to 15 do if x[i]<>int(x[i]) then write(x[i]:10:3);
end.
Problema 3
var c: array[1..10] of char; i: byte;
begin
writeln(introdu pe rand 10 litere); for i:=1 to 10 do readln(c[i]);
writeln(literele in ordine inversa:); for i:=10 downto 1 do write(c[i]);
end.
Problema 4
var v: array[1..100] of string; n,i: byte;
begin
write(cate versuri are acrostihul?); readln(n);
writeln(introdu pe rand versurile); for i:=1 to n do readln(v[i]);
writeln(Mesajul:); for i:=1 to n do write(v[i][1]);
end.
Problema 5
var x: array[1..100] of integer; d,n,i: integer;
begin
write(cate numere?); read(n);
writeln(numerele:); for i:=1 to n do read(x[i];
write(d=); read(d);
writeln(numere divizibile cu ,d); for i:=1 to n do if x[i] mod d=0 then write(x[i]:7);
end.
Problema 6
var p: array[1..50] of byte; x,n,i,j,k: byte; sol:boolean
begin
write(cate cercuri?); read(n);write(x=);read(x);
writeln(valoarea cercurilor:); for i:=1 to n do read(p[i];
sol:=false;
for i:=1 to n-2 do
for j:=i to n-1 do
for k:=j to n do
if p[i]+p[j]+p[k]=x then begin sol:=true; writeln(p[i]:3,p[j]:3,p[k]:3) end;
if not sol then writeln(imposibil);
end.
Utilizarea altor instruciuni de ciclare pentru parcurgerea vectorilor
1) S se afieze elementele unui vector pn la prima valoare nul. Dac nu exist nici un 0, se vor afia toate numerele i
mesajul Nici un element nul. Exemplu: Date de intrare: numar elemente=5, numere 3 6 8 0 2 3 Date de ieire 3 6 8.
2) Se introduc n numere reprezentnd punctajele obinute la un concurs. S se afieze primele k punctaje mai mari dect o
valoare b, necesar calificrii la o etap superioar. Dac nu sunt suficieni concureni care s fi obinut punctaj peste b,
s se afieze i mesajul Candidati insuficienti. Exemplu: Date de intrare n=3 punctaje: 45 23 78 k=2 b=50 Date de
ieire 78.

32

3) Se introduc un numr par de numere. S se adune cte dou numere consecutive i s se afieze sumele obinute.
Exemplu: Date de intrare: numar elemente: 6, numere 5 4 3 6 5 5 Date de ieire 9 9 10.
4) Se introduc pe rnd n caractere. S se afieze pe ce poziie apare prima dat caracterul spaiu. Exemplu: Date de
intrare n=10 caractere i n f o c l u b 7 Date de ieire 5.
5) Cpitanul Jack O'Neel se afl pe o nav spaial. Nava are lungimea de n camere i limea de o camer. El se afl n
camera numrul 1. n fiecare camer se afl un dispozitiv de teleportare. Acest dispozitiv te poate teleporta ntr-o alt
camer din cele n. S se spun dac O'Neel poate ajunge n camera h. Date de intrare: Pe prima linie numrul n i
numrul h. Pe a doua linie sunt n numere, fiecare numr indic n ce camer l transmite pe Jack O'Neel teleportorul din
acea camer. Date de ieire: Dac O'Neel poate ajunge n camera h se va printa "DA" i camerele prin care a trecut.
Dac nu poate ajunge n camera h s se printeze "NU". Obs: Dac O'Neel trece de dou ori prin aceeai camer,
acesta nu mai ncearc s ajung n camera h i se va printa "NU". Exemple: Date de intrare: n=5 h=4 teleportari: 2 3 4
1 3 Date de ieire:
DA 1 2 3 4 Date de intrare: n=4 h=4 teleportari:1 2 3 4 date de ieire: NU

Problema 1
var x: array[1..100] of integer; n,i: integer;
begin
write(cate numere? ); read(n);
writeln(introdu numerele ); for i:=1 to n do read(x[i]);
i:=1; while (x[i]<>0) and (i<=n) do begin write(x[i]:7); inc(i); end;
if i>n then write(nici un element nul);
end.
Problema 2
var x: array[1..100] of integer; n,i,k,b,c: integer;
begin
write(n=); read(n); writeln(introdu punctajele); for i:=1 to n do read(x[i]);
write(k=); read(k); write(b=); read(b);
i:=1; c:=0;
repeat
if x[i]>b then begin write(x[i]:7); inc(c) end;
inc(i);
until (c>=k) or (i>n);
if c<k then writeln(Candidati insuficienti);
end.
Problema 3
var x: array[1..100] of integer; n,i,s: integer;
begin
write(introdu un numar par ); read(n);
writeln(introdu numerele ); for i:=1 to n do read(x[i]);
writeln(sumele a cate doua numere consecutive:);
i:=1; repeat s:=x[i]+x[i+1]; write(s, );i:=i+2;until i>n;
end.
Problema 4
var x: array[1..100] of char; n,i: integer;
begin
write(cate caractere?); readln(n); writeln(introdu pe rand caracterele ); for i:=1 to n do readln(x[i]);
i:=1; while (x[i]<> ) and (i<=n) do inc(i);
if i>n then writeln(nu s-a gasit spatiu) else writeln(primul spatiu apare pe pozitia ,i);
end.

33

Problema 5
var t,p: array[1..100] of byte; n,i,h,cam,k: byte; sol:boolean;
begin
write(cate camere?); read(n); write(in ce camera vrea sa ajunga?); read(h);
writeln(introdu teleportarile ); for i:= 1 to n do read(t[i]);
sol:=true; cam:=1; i:=1; p[i]:=cam:
repeat
cam:=t[cam];
for k:=1 to i do if cam=p[k] then sol:=false;
inc(i); p[i]:=cam;
until (not sol) or (h=cam);
if sol then begin write(da ); for k:=1 to i do write(p[k]:3); writeln end
else writeln(nu);
end.

Sume, produse, contorizri, min, max


1) S se afieze suma valorilor pozitive i suma valorilor negative din n numere date. Exemplu: Date de intrare n=6
numere 6 9 -8 7 5 3 Date de ieire: S poz= 22 S neg=-16.
2) Se introduc temperaturile msurate n n zile. S se afieze media temperaturilor negative i media celor pozitive.
Exemplu: Date de intrare n=5 temperaturi 23 24 23 25 22 Date de ieire 23.40
3) Din n numere ntregi introduse n calculator doar unul este nul i nu este primul sau ultimul. Afiai suma numerelor din
faa acestui 0 i suma celor de dup el. Exemplu: Date de intrare n=5 numere 4 5 1 0 7 Date de ieire s1=10 s2=7.
4) ntr-un ir de numere ntregi, s se afieze suma elementelor de pe poziiile pare i suma celor de pe poziii impare.
Exemplu: Date de intrare n=6 numere 3 1 5 4 6 7 Date de ieire simp=14 spar=12.
5) Se introduc n calculator i se memoreaz vrstele a n brbai. Afiai ci au vrsta mai mare dect 50 i mai mic
dect 70 de ani. Exemplu: Date de intrare n=4 varste 56 45 76 65 Date de ieire 2 barbati.
6) La o cur de slbire de k zile se nscriu n persoane, fiecare cu greutatea g(i). tiind c greutatea ideal este mai mare
sau egal cu a i mai mic sau egal cu b, iar persoanele urmeaz tratamente diferite astfel: cei sub greutate ideal se
ngra 1 kg pe zi, cei peste greutatea ideal slbesc 1 kg pe zi, cei cu greutatea ideal i pstreaz greutatea, aflai a)
numrul de persoane cu greutate ideal la nceputul tratamentului ; b) numrul persoanelor cu greutate ideal dup cele
k zile de tratament. Exemplu: n=10 k=7 a=40 b=50 i 38 41 48 50 54 58 60 42 32 se va afia a) 4 persoane b) 7
persoane. (InfoStar Aiud 1998 clasa a VI-a)
7) Date n numere naturale, cte sunt prime cu 7? Dar cu 10? Exemplu: Date de intrare n=6 numere 5 7 14 20 12 15 Date
de ieire: prime cu 7: 4 nr, prime cu 10: 1 nr.
8) Se introduc n numere egale cu 0, 1 sau 2. S se scrie un program care s determine pe ce poziie apare primul 0, de
cte ori apare fiecare cifr i care este cifra folosit cel mai puin. Exemplu: Date de intrare n=7 numere: 1 1 0 2 1 0 1
Date de ieire: pozitie primul zero 3, cifra 0 apare de 2 ori cifra 1 apare de 4 ori cifra 2 apare de 1 ori, cel mai putin: 2 .
9) Afiai cte numere au forma aaa , din n numere date. Exemplu: Date de intrare n=3 numere 123 222 434 Date de
ieire 1 nr.
10) Se introduc nlimile, exprimate n cm, a n copii. Afiai nlimea celui mai nalt i nlimea celui mai scund copil. Care
este diferena de nlime ntre ei? Exemplu: Date de intrare: n=5 inaltimi 120 118 120 115 100 117 Date de ieire
imax=120 cm imin=100 cm diferenta=20 cm.
11) Se dau n numere. S se determine cea mai mic valoare i s se afieze de cte ori apare ea n ir. Exemplu: Date de
intrare n=8 numere 6 4 7 5 8 5 9 5 Date de ieire min=5 apare de 3 ori.
12) Se introduc n numere ntregi. Dintre numerele mai mici ca 100, afiai numrul cu valoarea cea mai mare. Exemplu:
Date de intrare: n=4 numere 120 98 34 105 Date de ieire: 98.

34

13) S se calculeze suma componentelor pozitive, produsul celor negative i numrul componentelor nule ale unui vector cu
n numere reale. Exemplu: Date de intare: n=7 numere 1 0 -4 -3 0 5 -1 Date de ieire: s=6 p=-12 c=2.
14) Un lot de pmnt este mprit n n parcele dreptunghiulare, numerotate de la 1 la n. Se citesc perechile de numere care
reprezint lungimea i limea fiecrei parcele. S se afieze suma ariilor parcelelor i valoarea celei mai mari
suprafee. Exemplu: Date de intrare: n=3, lungime=10 latime=5 lungime=15 latime=10 lungime=12 latime=5 Date de
ieire: suma=260 max=150.
15) S se nlocuiasc fiecare element dintr-un ir numeric cu media aritmetic a celorlalte n-1 elemente ale sale. Exemplu:
Date de intrare: n=3 numere 1 2 3 Date de ieire: 2.5 2 1.5
16) Mo Crciun sosete n mijlocul copiilor oferind fiecrui copil un cadou cu o anumit valoare (numrul copiilor se citete
de la tastatur, precum i valorile cadourilor, n lei). S se spun:
-ct a cheltuit Moul pentru cumprarea cadourilor (n moi, 1 leu=6 moi)
-dac Moul are sau nu un copil preferat, adic dac exist un copil al crui cadou s aib valoarea mai mare dect
suma valorilor cadourilor tuturor celorlali copii. Dac exist, afiai DA, urmat de indicele copilului, n caz contrar afiai
NU. Exemplu: dac n=5 valori cadouri: 10 50 6 5 20, se va afia: Mosul a cheltuit 546 mosi
DA 2
(InfoStar, Aiud 1995 clasa a VI-a)
17) Un pitic vrea s urce o scar care are n trepte de nlimi date, ordonate cresctor. nlimile treptelor sunt n cm i sunt
valori ntregi. Acolo unde diferena ntre dou trepte consecutive este de 1 cm piticul urc fr dificulti, unde diferena
este mai mare dect 1 cm piticul trebuie s ia o pastil care i d putere s sar pe treapta urmtoare. Cunoscnd
nlimile treptelor, prima fiind obligatoriu 0, piticul vrea s afle care este numrul minim de pastile de care are nevoie
pentru a urca scara i de asemenea care este cea mai mare diferen dintre dou trepte consecutive. Exemplu: pentru
n=9 i nlimile treptelor 0 3 4 6 7 10 19 20 21, se va afia: numar minim de pastile =4 diferenta maxima=9
(InfoStar, Aiud 1996 clasa a VI-a)
18) Copiii dintr-o clas merg la cules de portocale. Se citete de la tastatur numrul de copii din clas i cte portocale a
cules fiecare copil. tiind c cel care spune c a cules cele mai multe portocale i cel care spune c a cules cele mai
puine portocale mint, s se spun cte portocale au cules mpreun toi copiii din clas care spun adevrul. Exemplu:
date de intrare : 5 (nr. de copii din clas) 69 25 14 329 54 date de ieire: 148.
VII.
Se citesc de la tastatur n numere naturale. S se spun cte din ele sunt cu 3 cifre.
VIII.
ntr-o clas sunt x copii. Acetia merg ntr-o pia n care sunt n vnztori de mere. Se citete de la
tastatur numrul de mere ale fiecrui vnztor. Copiii vor cumpra mere doar de la vnztorii care au
cel puin 3 mere pentru fiecare copil. Ci vnztori ndeplinesc aceast condiie? Exemplu: Date de
intrare: x=25 (numrul de copii) n=5 (numrul de vnztori) 280 456 78 50 75 Date de ieire: 4
(vnztori) (P.N.C. Bucureti, Cupa Mrior 2005.)
IX.
Se consider n mulimi. Fiecare mulime conine numai numere consecutive. Pentru a da aceste
mulimi este suficient s dm primul i ultimul element. Scriei un program care s determine
elementele interseciei celor n mulimi. Date de intrare: De la tastatur se citete numrul n. Apoi
perechi de numere, cte una pe un rnd, separate prin cte un spaiu, care reprezint cel mai mic,
respectiv cel mai mare element din fiecare mulime. Date de ieire: Pe ecran se va afia pe prima linie
elementele interseciei cu cte un spaiu ntre ele. Restricii i precizri: 0 < n < 31 Elementele
mulimilor sunt numere naturale < 41.
Exemplu: date de intrare: n=3 perechi: 5 10 2 9 4 11 Date de ieire: 5 6 7 8 9.
Problema 1
var x: array[1..100] of integer; n,i,sp,sn: longint;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
sn:=0; sp:=0; for i:=1 to n do if x[i]>0 then sp:=sp+x[i] else sn:=sn+x[i];
writeln(suma numerelor pozitive:,sp); writeln(suma numerelor negative:,sn);
end.
Problema 2
var t: array[1..365] of integer; n,i,sp,sn,cp,cn: integer;
begin
write(n=); read(n); writeln(introdu temperaturile); for i:=1 to n do read(t[i]);

35

sp:=0; sn:=0; cp:=0; cn:=0;


for i:=1 to n do if t[i]>=0 then begin inc(cp); sp:=sp+t[i] end
else begin inc(cn); sn:=sn+t[i] end;
if cp<>0 then writeln(media temperaturilor pozitive=,sp/cp:4:2)
else writeln(nu s-au inregistrat temperaturi pozitive);
if cn<>0 then writeln(media temperaturilor negative=,sn/cn:4:2)
else writeln(nu s-au inregistrat temperaturi negative);
end.
Problema 3
var x: array[1..100] of integer; n,i,j,sf,sd: longint;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
sf:=0; sd:=0;
{sf=suma numerelor din fata lui 0, sd=suma numerelor de dupa 0}
i:=1; while x[i]<>0 do begin sf:=sf+x[i]; inc(i) end;
for j:=i+1 to n do sd:=sd+x[i];
writeln(suma numerelor pana la 0=,sf); writeln(suma numerelor de dupa 0=,sd);
end.
Problema 4
var x: array[1..100] of integer; n,i,sp,si: longint;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
sp:=0; si:=0; for i:=1 to n do if i mod 2=0 then sp:=sp+x[i] else si:=si+x[i];
writeln(suma numerelor de pe pozitii pare=,sp); writeln(suma numerelor de pe pozitii impare=,si);
end.
Problema 5
var x: array[1..100] of integer; n,i,c: integer;
begin
write(n=); read(n); writeln(introdu varstele); for i:=1 to n do read(x[i]);
c:=0; for i:=1 to n do if (x[i]>50) and (x[i]<70) then inc(c);
writeln(c, barbati au varsta cuprinsa intre 50 ani si 70 ani);
end.
Problema 6
var g: array[1..50] of byte; n,k,a,b,c,z,i: integer;
begin
write(cate persoane?); read(n); write(cate zile?); read(k); write(limitele greutatii ideale ); read(a,b);
writeln(introdu greutatea fiecarei persoane:); for i:=1 to n do read(g[i]);
c:=0; for i:=1 to n do if (g[i]>=a) and (g[i]<=b) then inc(c);
writeln(a.) c, persoane);
for z:=1 to k do
for i:=1 to n do begin
if g[i]<a then g[i]:=g[i]+1;
if g[i]>b then g[i]:=g[i]-1;
end;
c:=0; for i:=1 to n do if (g[i]>=a) and (g[i]<=b) then inc(c);
writeln(b.) c, persoane);
end.
Problema 7

36

var x: array[1..100] of integer; n,i,c7,c10: integer;


begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
c7:=0; c10:=0;
for i:=1 to n do begin
If x[i] mod 7<>0 then inc(c7);
if (x[i] mod 2<>0) and ( x[i] mod 5<>0) then inc(c10);
end;
writeln(c7, numere prime cu 7 ,c10, numere prime cu 10);
end.
Problema 8
var x: array[1..100] of integer; n,i,c0,c1,c2: integer;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
i:=1; while x[i]<>0 do inc(i); writeln(primul 0 apare pe pozitia ,i);
c0:=0; c1:=0;c2:=0;
for i:=1 to n do
case x[i] of
0: inc(c0);
1: inc(c1);
2: inc(c2);
end;
writeln(cifra 0 apare de ,c0, ori); writeln(cifra 1 apare de ,c1, ori); writeln(cifra 2 apare de ,c2, ori);
if (c0<c1) and (c0<c2) then writeln(cel mai putin apare 0);
if (c1<c2) and (c1<c0) then writeln(cel mai putin apare 1);
if (c2<c1) and (c2<c0) then writeln(cel mai putin apare 2);
end.
Problema 9
var x: array[1..100] of integer; n,i,c,u,sz,s,z:integer;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
c:=0;
for i:=1 to n do begin
u:=x[i] mod 10;
sz:=x[i] div 10;
z:=sz mod 10;
s:=sz div 10;
if (u=z) and (z=s) then inc(c);
end;
writeln(c, numere de forma aaa);
end.
Problema 10
var x: array[1..100] of integer; n,i,min,max: integer;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
min:=maxint; max:=-maxint;
for i:=1 to n do begin
if min>x[i] then min:=x[i];
if max<x[i] then max:=x[i];
end;

37

writeln(max=,max, min=,min, diferenta=, max-min);


end.
Problema 11
var x: array[1..100] of integer; n,i,min,c: integer;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
min:=maxint; c:=0;
for i:=1 to n do if min>x[i] then min:=x[i];
for i:=1 to n do if min=x[i] then inc(c);
writeln(min=,min, apare de ,c, ori);
end.
Problema 12
var x: array[1..100] of integer; n,i,max: integer;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
max:=-maxint; for i:=1 to n do if (max<x[i]) and (x[i]<100) then max:=x[i];
writeln(cel mai mare numar mai mic decat 100 este ,max)
end.
Problema 13
var x: array[1..100] of integer; n,i,c: integer; s,p: longint;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
s:=0; c:=0; p:=1;
for i:=1 to n do if x[i]>0 then s:=s+x[i]
else if x[i]<0 then p:=p*x[i]
else inc(c);
writeln(suma=,s, produs=,p, numar valori nule=,c);
end.
Problema 14
var a,b: array[1..100] of integer; n,i: integer; s,max: longint;
begin
write(n=); read(n);
for i:=1 to n do begin writeln(introdu lungimea si latimea parcelei ,i); read(a[i], b[i]); end;
s:=0; max:=-maxlongint;
for i:=1 to n do begin
s:=s+a[i]*b[i];
if max<a[i]*b[i] then max:=a[i]*b[i];
end;
writeln(suma suprafetelor=,s, cea mai mare suprafata=,max);
end.
Problema 15
var x: array[1..100] of real; n,i,: integer; s,m: real;
begin
write(n=); read(n); writeln(introdu numerele); for i:=1 to n do read(x[i]);
s:=0; {se calculeza suma tuturor numerelor} for i:=1 to n do s:=s+x[i];
for i:=1 to n do begin
m:=(s-x[i])/(n-1);
{se calculeaza media celorlalte n-1 elemente}
x[i]:=m
end;
for i:=1 to n do write(x[i]:10:3);

38

end.
Problema 16
var c: array[1..100] of longint; n,i: integer; s: longint; fav: boolean;
begin
write(cati copii?); read(n); writeln(introdu valorile cadourilor); for i:=1 to n do read(c[i]);
s:=0; for i:=1 to n do s:=s+c[i]; writeln(Mosul a cheltuit ,s*6, mosi);
fav:=false; for i:=1 to n do if c[i]>s-c[i] then begin fav:=true; writeln(DA ,i) end;
if not fav then writeln(NU);
end.
Problema 17
var t: array[1..100] of integer; c,dif,max,n,i,: integer;
begin
write(cate trepte?); read(n); writeln(introdu inaltimile treptelor ); for i:=1 to n do read(t[i]);
c:=0; max:=-maxint;
for i:=1 to n-1 do begin
dif:=t[i+1]-t[i];
if dif>1 then inc(c); if max<dif then max:=dif; end;
writeln(piticul are nevoie de ,c, pastile); writeln(diferenta maxima=,max);
end.
Ordonarea elementelor unui vector
1) Se dau n numere reale. S se afieze n ordine cresctoare. Exemplu:Date de intrare: n=4 numere:7 -3 9.8 0 Date de
ieire 3 0 7 9.8
2) Se d un vector cu n componente ntregi. Se cere s se afieze primele k componente n ordine cresctoare iar celelalte
n ordine descresctoare. Exemplu: n=7 k=3 irul 23 12 18 4 0 23 5 se va afia 12 18 23 23 5 4 0
3) N numere naturale introduse de la tastatur s se afieze astfel: numerele pare n ordine cresctoare i cele impare n
ordine descresctoare. Exemplu: pentru n=7 i irul 2 5 3 1 8 5 4 se va afia 2 1 3 5 4 5 8.
4) Prin ordonarea elementelor unui vector format din n caractere, s se afieze de cte ori apare fiecare caracter.
Exemplu: Date de intrare: n=4 elemente: a 4 g a Date de ieire: a apare de 2 ori g apare de 1 ori 4 apare de 1 ori.
5) Cunoscnd numele i nlimea a n elevi, n<=100, s se afieze numele acestora n ordinea descresctoare a nlimii.
Exemplu: Date de intrare: n=3 nume: Ion inaltime: 120 nume:Ana inaltime:114 nume: Dan inaltime 130 Date de ieire:
Dan Ion Ana
6) La un concurs particip n sportivi. Se cunosc rezultatele fiecrui sportiv. S se afieze cele mai bune trei rezultate, n
ordine descresctoare a performanei. Exemplu: pentru n=5 i rezultatele 156 187 23 97 86 se va afia 187 156
97.
7) Se cunosc punctajele obinute de cei n elevi participani la un concurs de informatic. tiind c doi elevi primesc acelai
premiu numai dac au punctaje egale, s se determine ci elevi primesc Premiul I, ci Premiul II i ci Premiul III.
Cerin: Scriei un program care citete de la tastatur numrul concurenilor precum i punctajele acestora, luate din
borderoul de corectare, i determin i afieaz pe ecran pe cte o linie numrul de elevi pentru fiecare din cele trei
premii. Restricii: numrul n al elevilor nu depete 300 iar punctajul fiecruia este un numr natural cel mult egal cu
100. Exemplu: Pentru n=10 si punctajele: 58 79 34 12 58 40 79 58 30 58 se vor afia numerele: 2 4 1 ceea ce
nseamn c 2 elevi primesc Premiul I (cei care au obinut 79 puncte), 4 elevi obin Premiul II (cei cu 58 puncte) i un
elev (cel cu 40 puncte) primete Premiul III.
8) Se introduc n numere de cte una sau dou cifre. S se afieze aceste numere n ordinea cresctoare a primei lor cifre.
Exemplu: pentru n=5 i numerele 34 2 5 62 25 se va afia 2 25 34 5 62 sau 25 2 34 5 62.
Problema 1
Ordonarea prin inversiuni
var a: array[1..100] of integer;
i,x,n: integer; sortat: boolean;
begin
write(n=); read(n); writeln(introdu numerele);for i:=1 to n do read(a[i]);
repeat

39

sortat:=true;
for i:=1 to n-1 do if a[i]>a[i+1] then begin x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; sortat:=false end;
until sortat;
writeln(sirul ordonat crescator:); for i:=1 to n do write(a[i]:7);
end.
Ordonarea prin selecie (determinarea min)
var a: array[1..100] of integer;
i,j,n,min,x,pmin: integer;
begin
write(n=); read(n); writeln(introdu numerele);for i:=1 to n do read(a[i]);
for i:=1 to n-1 do begin
min:=a[i]; pmin:=i;
for j:=i+1 to n do if min>a[j] then begin min:=a[j]; pmin:=j end;
x:=a[pmin]; a[pmin]:=a[i]; a[i]:=x;
end;
writeln(sirul ordonat crescator:); for i:=1 to n do write(a[i]:7);
end.
Problema 2
var a: array[1..100] of integer; n,i,k,z: integer; s: boolean;
begin
write(n=); read(n); writeln(introdu numerele ); for i:=1 to n do read(a[i]); write(k=); read(k);
repeat
s:=true;
for i:=1 to k-1 do if a[i]>a[i+1] then begin z:=a[i];a[i]:=a[i+1];a[i+1]:=z;s:=false end;
until s;
repeat
s:=true;
for i:=k+1 to n-1 do if a[i]<a[i+1] then begin z:=a[i];a[i]:=a[i+1];a[i+1]:=z;s:=false end;
until s;
writeln(sirul in noua ordine); for i:=1 to n do write(a[i]:6);
end.
Problema 3
var a: array[1..100] of integer; n,i,j,min,z,max,pmin,pmax: integer;
begin
write(n=); read(n); writeln(introdu numerele ); for i:=1 to n do read(a[i]);
for i:=1 to n-1 do begin
{ordonare cu metoda determinarii min (max)}
if a[i] mod 2=0 then begin
min:=a[i]; pmin:=i;
for j:=i+1 to n do if (min>a[j]) and (a[j] mod 2=0) then
begin
min:=a[j];
pmin:=j
end;
z:=a[i]; a[i]:=a[pmin]; a[pmin]:=z;
end
else begin
max:=a[i]; pmax:=i;
for j:=i+1 to n do if (max<a[j]) and odd(a[j]) then
begin
max:=a[j];

40

pmax:=j
end;
z:=a[i]; a[i]:=a[pmax]; a[pmax]:=z;
end;
end;
writeln(sirul in noua aranjare ); for i:=1 to n do write(a[i]:6);
end.
Problema 4
var a: array[1..100] of char; n,I,c,j: integer; s: boolean; x: char;
begin
write(n=); readln(n); writeln(introdu caracterele ); for i:=1 to n do readln(a[i]);
repeat
{ordonez crescator sirul de caractere}
s:=true;
for i:=1 to n-1 do if a[i]>a[i+1] then begin x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; s:=false end;
until s;
i:=1;
repeat
{parcurg sirul prin doua cicluri}
c:=1;
j:=i+1;
while (a[j]=a[i]) and (j<=n) do begin inc(j); inc(c) end;
writeln(caracterul ,a[i], apare de ,c, ori);
i:=j;
until i>n;
end.
Problema 5
var h: array[1..100] of integer; e: array[1..100] of string;
z,n,i: integer; s: boolean;x: string;
begin
write(n= ); read(n); writeln(nume elev, inaltime:); for i:=1 to n do begin readln(e[i]); readln(h[i]); end;
repeat
s:=true;
for i:=1 to n-1 do if h[i]<h[i+1] then begin z:=h[i]; h[i]:=h[i+1]; h[i+1]:=z; s:=false
x:=e[i]; e[i]:=e[i+1]; e[i+1]:=x
end;
until s;
writeln(Nume elev:20, Inaltime:4); for i:=1 to n do writeln(e[i]:20, h[i]:4);
end.
Deplasarea elementelor unui vector
1) S se insereze cifra 0 pe prima poziie a unui vector dat, fr a utiliza un alt vector. Exemplu: Date de intrare: n=4
numere: 5 3 7 8 Date de ieire: 0 5 3 7 8.
2) Se introduc n numere n calculator. S se rearanjeze elementele din ir astfel nct primul element al irului dat s apar
pe ultima poziie. Exemplu: Date de intrare: n=3 numere: 1 2 3 Date de ieire: 2 3 1.
3) Se introduc n numere n ordine cresctoare i un numr k. S se insereze acest numr n irul dat astfel nct s
rmn sortat cresctor. Exemplu: Date de intrare: n=4 k=100 numere: 90 95 110 120 Date de ieire: 90 95 100 110
120.
4) Definim operaia de compactare a unui tablou ca fiind eliminarea zerourilor. Dac ntlnim un element nul toate
elementele situate la dreapta sa vor veni cu o poziie mai in fa, n locul su. Se d un tablou cu n elemente intregi.
Compactai-l. Exemplu: Date de intrare: n=4 numere: 9 0 0 5 Date de ieire: 9 5.

41

5) S se aeze toate elementele egale cu o valoare v dintr-un ir de n numere date, la sfritul irului. Exemplu: Date de
intrare: n=4 v=5 numere: 5 6 5 3 Date de ieire: 6 3 5 5.
6) Se introduc n calculator dou tablouri de dimensiunem, respectiv n, i un numr k, k<=m. S se intercaleze n primul
tablou, dup poziia k, tabloul al doilea.
Problema 1
var v: array[1..100] of integer; n,i: integer;
begin
write(numar elemente= ); read(n); writeln(introdu elementele ); for i:=1 to n do read(v[i]);
{se face o deplasare a tuturor elementelor spre dreapta cu o pozitie}
for i:=n downto 1 do v[i+1]:=v[i];
{i=pozitia care se deplaseaza}
v[1]:=0; writeln(noul sir:); for i:=1 to n+1 do write(v[i]:6)
end.
Problema 2
var v: array[1..100] of integer; x,n,i: integer;
begin
write(numar elemente= ); read(n); writeln(introdu elementele ); for i:=1 to n do read(v[i]);
x:=v[1];
{se face o deplasare spre stanga a elementelor, fara primul}
for i:=2 to n do v[i-1]:=v[i]; {i=pozitia care deplaseaza}
v[n]:=x;
{se aseaza primul element la sfarsit}
writeln(noul sir:); for i:=1 to n do write(v[i]:6);
end.
Problema 3
var v: array[1..100] of integer; k,n,i: integer;
begin
write(numar elemente= ); read(n); writeln(introdu elementele, in ordine crescatoare); for i:=1 to n do read(v[i]);
write(k=); read(k);
{se cauta primul element mai mare decat k, pe pozitia lui se va aseza k}
i:=1; while (v[i]<k) and (i<=n) do inc(i);
if i>n then v[n+1]:=k
{k este mai mare decat toate numerele, se aseaza la sfarsit}
else begin for j:=n downto i do v[j+1]:=v[j]; {deplasare spre dreapta } v[i]:=k; end;
writeln(noul sir:); for i:=1 to n+1 do write(v[i]:7);
end.
Problema 4
var v: array[1..100] of integer; c,n,i,j: integer;
begin
write(numar elemente ); read(n); writeln(introdu elementele ); for i:=1 to n do read(v[i]);
i:=1; c:=0;
{c=numarul elementelor nule}
repeat
if v[i]=0 then begin
{deplasare spre stanga a elementelor de dupa zero}
for j:=i+1 to n-c do v[j-1]:=v[j];
inc(c);
end;
if v[i]<>0 then inc(i); {se poate intampla sa avem mai multe 0 consecutive, se
until i>n-c;
mareste i numai daca pe pozitia respectiva este un element nenul}
writeln(elementele nenule:); for i:=1 to n-c do write(v[i]:7);
end.
Problema 5
var a: array[1..100] of integer; v,n,i,j: integer;
begin
write(numar elemente ); read(n); writeln(introdu elementele ); for i:=1 to n do read(a[i]);
write(v=); read(v);
for i:=1 to n do if a[i]=v then begin
{deplasare spre stanga}
for j:=i+1 to n do a[j-1]:=a[j];

42

a[n]:=v;
end;
write(noul sir:); for i:=1 to n do write(a[i]:7);
end.
Verificarea unor proprieti
1) Se introduc dou iruri de numere cu acelai numr de elemente. S se verifice dac valorile lor, n ordinea dat, sunt
proporionale. Exemplu: Date de intrare: n=3 sir1: 1 2 3 sir2: 3 6 9 Date de ieire: Da.
2) S se verifice dac un vector dat este monoton cresctor.
3) S se caute un numr x printre n numere ntregi generate de calculator avnd valori ntre 0 i 100. Dac se gsete
valoarea respectiv s se afieze ultima poziie n care apare, dac nu se gsete, s se afieze mesajul numar
inexistent
4) Un tren este format din n vagoane de clasa I-a i a II-a. eful de tren nu vrea s fie mai mult de k vagoane de aceeai
clas unul dup altul. Introducndu-se o aranjare a vagoanelor, s se testeze dac exist mai mult de k vagoane de
acelai fel consecutive. Se va afia un mesaj corespunztor. n caz afirmativ, s se afieze i poziia de nceput a
subirurilor cu mai mult de k elemente de acelai fel. Exemplu: Date de intrare: n=6 k=3 tip vagoane: 1 1 2 2 2 2 Date de
ieire: Da, pozitia de inceput 3.
5) Date dou iruri de numere, a cu n elemente i b cu m elemente, m< n, s se verifice dac b este subir al lui a.
Exemplu: Date de intrare: n=4 elemente a: 1 2 3 4 m=2 elemente b: 2 4 date de ieire: da.
6) Se d un ir de numere reale. S se verifice dac irul este o progresie aritmetic (diferena dintre oricare dou numere
alturate este aceeai, de exemplu: 1,4,7,10,13)
7) S se verifice dac n numere date formeaz o mulime (elementele sunt distincte), ordonnd elementele. Exemple: Date
de intrare: n=4 numere: 4 6 2 6 Date de ieire: Nu ; Date de intrare: n=3 numere: 3 5 2 Date de ieire: Da.
8) S se verifice dac doi vectori cu aceeai lungime au aceleai elemente, ordonnd ambii vectori n prealabil. Exemple:
Date de intrare: n=3 primul vector: 4 2 6 al doilea vector: 6 2 4 Date de ieire: Da; Date de intrare: n=2 primul vector: 4 2
al doilea vector: 3 4 Date de ieire: Nu.
Problema 1
var a,b: array[1..100] of integer; n,i: integer; v: real; prop: boolean;
begin
prop:=true;
write(numar elemente= ); read(n); writeln(introdu elementele primului sir );
for i:=1 to n do begin read(a[i]); if a[i]=0 then prop:=false; end;
writeln(introdu elementele celui de al doilea sir );
for i:=1 to n do begin read(b[i]); if b[i]=0 then prop:=false; end;
if not prop then begin writeln(nu sunt proportionale); halt end;
v:=a[1]/b[1];
for i:=2 to n do if a[i]/b[i]<>v then prop:=false;
if prop then writeln(Sunt proportionale) else writeln(Nu sunt proportionale);
end.
Problema 2
var a: array[1..100] of integer; n,i: integer; cresc: boolean;
begin
cresc:=true;
write(numar elemente= ); read(n); writeln (introdu elementele sirului); for i:=1 to n do read(a[i]);
for i:=1 to n-1 do if a[i]>a[i+1] then cresc:=false;
if cresc then writeln(sir crescator) else writeln(sirul nu e crescator);
end.
Problema 3
var a: array[1..100] of integer; n,i,x: integer; gasit: boolean;
begin
write(numar elemente= ); read(n);

43

randomize; for i:=1 to n do a[i]:=random(101);


write(valoarea cautata:); read(x);
gasit:=false;
for i:=1 to n do if a[i]=x then gasit:=true;
if gasit then begin
writeln(element existent);
i:=n; while a[i]<>x do dec(i);
writeln(ultima pozitie ,i);
end
else writeln(numar inexistent);
end.
Problema 4
var v: array[1..30] of byte; n,i,k,nv: integer; gasit: boolean;
begin
write(numar elemente= ); read(n); writeln(introdu succesiunea vagoanelor ); for i:=1 to n do read(v[i]);
write(k=); read(k);
gasit:=false; i:=1;
repeat
nv:=1;
if v[i]=v[i+1] then while (v[i]=v[i+1]) and (i<=n) do begin inc(nv); inc(i) end
else inc(i);
if nv>k then begin gasit:=true; writeln(incepand cu pozitia ,i+1-nv) end
until i>n;
if not gasit then writeln(nu exista mai mult de ,k, vagoane cosecutive de aceeasi clasa)
else writeln(exista mai mult de ,k, vagoane de aceeasi clasa);
end.
Problema 5
var a,b: array[1..100] of integer; n,m,,i,j: integer; subsir, este: boolean;
begin
write(n= ); read(n); writeln(elementele lui a); for i:=1 to n do read(a[i]);
write(m= ); read(m); writeln(elementele lui b); for i:=1 to m do read(b[i]);
subsir:=true;
for j:=1 to m do begin
{se verifica daca fiecare element din b este in a}
este:=false;
for i:=1 to n do if b[j]=a[i] then este:=true;
if not este then subsir:=false;
end;
if subsir then writeln(b este subsir al lui a) else writeln(b nu este subsir al lui a);
end.
Problema 6
var a: array[1..100] of integer; n,r,i: integer; prog: boolean;
begin
write(numar elemente= ); read(n); writeln(elementele sirului:); for i:=1 to n do read(a[i]);
prog:=true; r:=a[2]-a[1];
for i:=1 to n-1 do if a[i+1]-a[i]<>r then prog:=false;
if prog then writeln(progresie aritmetica) else writeln(nu e progresie aritmetica);
end.
Problema 7
var a: array[1..100] of integer; n,i,x: integer; s: boolean;
begin
write(n=); read(n); writeln(introdu numerele ); for i:=1 to n do read(a[i]);
repeat
s:=true;

44

for i:=1 to n-1 do if a[i]>a[i+1] then begin x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; s:=false end;
until s;
s:=true;
for i:=1 to n-1 do if a[i]=a[i+1] then s:=false;
if s then writeln(multime) else writeln(nu este multime);
end.
Problema 8
var a,b: array[1..100] of integer; n,i: integer; e: boolean;
begin
write(numar elemente ); read(n);
writeln(introdu elementele primului sir); for i:=1 to n do read(a[i]);
writeln(introdu elementele celui de al doilea sir); for i:=1 to n do read(b[i]);
repeat
{ordonez crescator primul sir}
s:=true;
for i:=1 to n-1 do if a[i]>a[i+1] then begin x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; s:=false end;
until s;
repeat
{ordonez crescator al doilea sir}
s:=true;
for i:=1 to n-1 do if a[i]>a[i+1] then begin x:=b[i]; a[i]:=b[i+1]; b[i+1]:=x; s:=false end;
until s;
e:=true;
for i:=1 to n do
{compar element cu element cele doua siruri}
if a[i]<>b[i] then e:=false;
if e then writeln(siruri egale) else writeln(siruri diferite);
end.
Construirea unor vectori
1) Ciurul lui Eratostene: S se formeze un vector care s conin elementele prime mai mici dect un numr dat n, n<1000,
utiliznd procedeul de excludere prezentat n manualul de matematic (excluderea se va face prin inlocuirea
elementului cu 0 i nu se vor afia elementele nule).
2) ntr-o nchisoare cu n celule se afl, la un moment dat, n deinui. Se ia hotrrea s fie eliberai anumii deinui,
alegerea lor fcndu-se ntr-un mod special. n nchisoarea aceea erau tot n gardieni. Procedeul de determinare a
deinuilor ce vor fi eliberai este urmtorul: gardianul k pleac de la celula k i mergnd din k n k celule, schimb starea
uilor pe la care trece,1<=k<=n. n final anumite celule vor rmne deschise, deinuii respectivi fiind eliberai. Putei afla
care? Iniial toate uile sunt nchise. Exemplu: n=50 vor fi eliberati cei din celulele 1 4 9 16 25 36 49.
3) S se formeze vectorul primelor n elemente ale irului lui Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13,21,.... (f[1]=0, f[2]=1, f[i]=f[i1]+f[i-2]).
4) Se introduc n numere ntregi. Elementele diferite s se memoreze ntr-un alt vector. S se afieze acest nou vector.
Exemplu: Date de intrare: n=4 numere: 1 2 2 1 Date de ieire: 1 2.
5) S se formeze i s se afieze vectorul care s conin elementele nenule dintr-un vector dat.
6) S se extrag dintr-un vector elementele care au ultima cifr egal cu k i s se formeze cu ele un alt vector. S se
afieze cei doi vectori. Exemplu: Date de intrare: n=3 k=7 numere: 17 23 47 Date de ieire: 17 47.
7) Se dau n numere ntregi. Folosind un alt vector, s se aeze numerele pare la nceput. Exemplu: Date de intrare: n=4
numere: 3 4 6 5 Date de ieire: 4 6 3 5.
8) Prin contorizare i utilizarea unui vector ajuttor, ntr-un ir de numere date s se grupeze la nceput numerele
deficiente, apoi cele perfecte i la sfrit cele abundente. (Numim numr deficient cel care este mai mare dect suma
divizorilor mai mici ca el, numr perfect cel care este egal cu acest sum i abundent numrul mai mic dect aceast
sum). Exemplu: Date de intrare: n=5 numere: 6 12 3 4 10 Date de ieire: 3 4 10 6 12.
9) Dat un numr n, s se memoreze ntr-un vector toate numerele mai mici ca n prime cu n. S se afieze n ordine
descresctoare. Exemplu: Date de intrare: n=10 Date de ieire: 9 7 3.

45

10) Se citete un numr natural cu cifre nenule. S se determine cel mai mic i cel mai mare numr format din cifrele
acestui numr. Exemplu: Date de intrare: n=26341 Date de ieire: min=12346 max=64321.
11) S se insereze ntre oricare dou elemente alturate ale unui ir numeric dat media lor aritmetic. Exemplu: date de
intrare: n=3 numere: 2 4 5 Date de ieire: 2 3 4 4.5 5.
12) Se d irul 1,2,2,3,3,3,4,4,4,4,5,... . Dat un numr k, s se afieze elementul de pe poziia k.
Problema 1
var c:array[2..1000] of byte; n,i,j: byte;
begin
write(n=); read(n); for i:=2 to n do c[i]:=i;
{c contine toate numerele de la 2 la n}
i:=2;
{i=pasul cu care se parcurge sirul pentru eliminare}
repeat
if c[i]<>0 then begin
j:=i;
{j=pozitia de plecare }
repeat j:=j+i; c[j]:=0 until j>=n;
end;
inc(i);
until i> n div 2;
writeln(numerele prime pana la ,n); for i:=2 to n do if c[i]<>0 then write(c[i], );
end.
Problema 2
var u:= array[1..100] of byte; n,k,pas,i: integer;
begin
write(n=); read(n);for i:=1 to n do u[i]:=1; {u memoreaza starea usii: 0=deschisa, 1=inchisa}
for k:=1 to n do begin
pas:=k;
repeat
case u[pas] of
0: u[pas]:=1;
1: u[pas]:=0;
end;
pas:=pas+k;
until pas>n;
end;
writeln(vor iesi detinutii de la celulele cu numarul:); for i:=1 to n do if u[i]=0 then write(i:3);
end.
Problema 3
var f: array[1..100] of integer; n,i: integer;
begin
write(numar termeni=); read(n);
f[1]:=0; f[2]:=1; for i:=3 to n do f[i]:=f[i-1]+f[i-2];
for i:=1 to n do write(f[i]:4);
end.
Problema 4
var v,d: array[1..100] of integer; n,j,k,i: integer; apare: boolean;
begin
write(numar termeni=); read(n);write(elementele sirului:); for i:=1 to n do read(v[i]);
k:=1;
{k=indicele in vectorul nou, d}
for i:=1 to n-1 do
begin
{testez daca valoarea v[i] mai apare spre dreapta in v}
apare:=false;
for j:=i+1 to n do if v[i]=v[j] then apare:=true;

46

if not apare then begin d[k]:=v[i]; inc(k) end; {trec in d valorile care nu vor mai apare}
end;
d[k]:=v[n];
writeln(elementele diferite: ); for i:=1 to k do write(d[i]:4);
end.
Problema 5
var v,w: array[1..100] of integer; n,k,i: integer;
begin
write(numar termeni=); read(n);
write(elementele sirului:); for i:=1 to n do read(v[i]);
k:=1;
{k=indicele in vectorul format}
for i:=1 to n do if v[i]<>0 then begin w[k]:=v[i]; inc(k) end;
writeln(elementele nenule: ); for i:=1 to k-1 do write(w[i]:4);
end.
Problema 6
Ca la Problema 5, se testeaza daca v[i] mod 10=k.
Problema 7
var v,w: array[1..100] of integer; n,ni,k,i: integer;
begin
write(numar termeni=); read(n); write(elementele sirului:); for i:=1 to n do read(v[i]);
k:=1;ni:=0;
{k=indicele in noul vector, ni=cate numere impare sunt in v}
for i:=1 to n do if v[i] mod 2=0 then begin w[k]:=v[i]; inc(k) end
else begin inc(ni);w[n+1-ni]:=v[i] end;
writeln(elemente pare urmate de elemente impare: ); for i:=1 to n do write(w[i]:5);
end.
Problema 8
var v,w: array[1..100] of integer; n,na,nd,np,d,s,k,i: integer;
begin
write(numar termeni=); read(n); write(elementele sirului:); for i:=1 to n do read(v[i]);
nd:=0;
{aflu cate numere deficiente sunt}
for i:=1 to n do begin
s:=0; for d:=1 to v[i]-1 do if v[i] mod d=0 then s:=s+d;
if v[i]>s then inc(nd);
end;
k:=nd;
{numerele perfecte se pun incepand cu pozitia k+1}
nd:=0; na:=0; np:=0;
{contorii pentru numere deficiente, abundente, perfecte}
for i:=1 to n do begin
s:=0; for d:=1 to v[i]-1 do if v[i] mod d=0 then s:=s+d;
if v[i]>s then begin inc(nd); w[nd]:=v[i]; end;
if v[i]=s then begin inc(np); w[k+np]:=v[i]; end;
if v[i]<s then begin inc(na); w[n+1-na]:=v[i]; end;
end;
writeln(numere deficiente, perfecte, abundente: ); for i:=1 to n do write(w[i]:4);
end.
Problema 9
var p: array [1..100] of integer; a,b,r,i,n,j: integer;
begin
write(n=); read(n);
j:=1;
{indicele in noul sir}
for i:=2 to n-1 do
begin
a:=n; b:=i;
{calculez cmmdc dintre n si i}
repeat r:=a mod b; a:=b; b:=r until r=0;
if a=1 then begin p[j]:=i; inc(j) end;

47

end;
writeln(numere prime cu ,n, mai mici ca el); for i:=j-1 downto 1 do write(v[i]:5);
end.
Problema 10
var c: array [1..100] of byte; i,j,x: integer; n: longint; sortat:boolean;
begin
write(numar=); read(n);
j:=1;
{indicele in vectorul avand ca elemente cifrele numarului dat}
repeat
c[j]:=n mod 10;
n:=n div 10;
inc(j)
until n=0;
repeat
{sortez crescator vectorul cifrelor, cu j-1 elemente }
sortat:=true;
for i:=1 to j-2 do if c[i]>c[i+1] then begin sortat:=false; x:=c[i];c[i]:=c[i+1];c[i+1]:=x end;
until sortat;
writeln(cel mai mic numar: ); for i:=1 to j-1 do write(c[i]);
writeln(cel mai mare numar: ); for i:=j-1 downto 1 do write(c[i]);
end.
Problema 11
var v,w: array[1..100] of real; i,j,n: integer;
begin
write(cate numere?); read(n); writeln(introdu numerele); for i:=1 to n do read(v[i]);
j:=1;
{indicele in noul sir}
for i:=1 to n-1 do begin w[j]:=v[i]; w[j+1]:=(v[i]+v[i+1])/2; j:=j+2 end;
w[j]:=v[n];
writeln(sirul nou: ); for i:=1 to j do write(w[i]:5);
end.
Problema 12
var x: array [1..200] of byte; j,k,p,t: integer;
begin
write(k=); read(k);
p:=1; t:=1;
{p=pozitia in sir, t=valoare termen}
while p<k do begin
j:=1;
repeat
x[p]:=t;
{se atribuie valoarea t de t ori incepand cu pozitia p}
inc(p); inc(j)
until (p>k) or (j>t);
inc(t);
end;
writeln(pe pozitia ,k, se afla numarul ,x[k]);
end.

VII.

Tablouri cu dou dimensiuni (matrici)

Introducere, parcurgere integral, afiare

48

1) Se d un tablou bidimensional cu m linii i n coloane, 1m,n50, cu componente ntregi i un numr ntreg k. Se cere
s se afieze tabloul cu componentele mrite cu k.
Exemplu: Date de intrare: m=2 n=3 k= 5 elemente:
1 2 3 Date de ieire: 6 7 8
4 5 6
9 10 11
2) Se introduc dou matrici cu m linii i n coloane. S se afieze matricea sum a celor dou matrici date.
3) Se introduce o matrice cu m linii i n coloane. S se afieze elementele astfel nct liniile s devin coloane. Exemplu:
m=2, n=3 matricea 1 2 3
se va afia
1 4
4 5 6
2 5
3 6
4) S se afieze suma i produsul tuturor elementelor unei matrici cu m linii i n coloane cu componente reale. Cte
elemente sunt ntregi?
Exemplu: Date de intrare: m=2 n=2 matrice: 4 5 3
Date de ieire: s=15 p=120 6 numere intregi
112
5) Dat un tablou bidimensional cu n linii i n coloane, afiai cea mai mare component i poziiile pe care le ocup.
Exemplu: Date de intrare: n=2 matrice: 4 7
Date de ieire: max=7 pozitii 1 2 2 2.
57
6) Se consider un tablou care imagineaz tabla de ah. Se citesc un numr de linie i un numr de coloan care vor
reprezenta poziia unui cal pe tabl. S se afieze coordonatele elementelor tablei pe care poate sri calul. Exemplu:
Date de intrare: 2 2 Date de ieire: 1 4 4 1 4 3 3 4.
Problema 1
var a: array[1..50,1..50] of integer; i,j,n,m: byte; k: integer;
begin
write(m,n=); read(m,n); writeln(introdu numerele );
for i:=1 to m do for j:=1 to n do read(a[i,j]);
write(k=); read(k);
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j]+k:5)
writeln;
end;
end.
Problema 2
var a,b: array[1..50,1..50] of integer; i,j,n,m: byte;
begin
write(m,n=); read(m,n); writeln(introdu numerele din prima matrice);
for i:=1 to m do
for j:=1 to n do read(a[i,j]);
writeln(introdu numerele din a doua matrice);
for i:=1 to m do
for j:=1 to n do read(b[i,j]);
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j]+b[i,j]:5);
writeln;
end;
end.
Problema 3
var a: array[1..50,1..50] of integer; i,j,n,m: byte;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do for j:=1 to n do read(a[i,j]);
for j:=1 to n do begin for i:=1 to m do write(a[i,j]:5); writeln; end;
end.

49

Problema 4
var a: array[1..50,1..50] of real; i,j,n,m,c: byte; s,p: real;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do for j:=1 to n do read(a[i,j]);
s:=0; p:=1; c:=0;
for i:=1 to m do
for j:=1 to n do begin s:=s+a[i,j]; p:=p*a[i,j]; if a[i,j]=int(a[i,j]) then inc(c); end;
writeln(suma=,s:10:3); writeln(produs=,p:10:3); writeln(c, numere intregi);
end.
Problema 5
var a: array[1..50,1..50] of integer; i,j,n: byte; max: integer;
begin
write(n=); read(n); writeln(introdu numerele );for i:=1 to n do for j:=1 to n do read(a[i,j]);
max:=-maxint;
for i:=1 to n do for j:=1 to n do if max<a[i,j] then max:=a[i,j];
writeln(cea mai mare componenta are valoarea ,max, si se afla pe pozitiile );
for i:=1 to n do for j:=1 to n do if max=a[i,j] then write( [,i,,,j,] );
end.
Parcurgere parial a unui tablou bidimensional
1) S se afieze suma elementelor de pe coloana k a unei matrici cu m linii i n coloane, kn. Exemplu: Date de intrare:
m=2 n=4 k=1 matrice
4 3 6 8 Date de ieire:
s=11.
7490
2) Se introduc punctajele realizate de m concureni la n probe sub forma unei matrici cu m linii i n coloane. Afiai
punctajul total realizat de fiecare concurent. Exemplu: Date de intrare: m=3 n=2 punctaj concurent 1: 7 9 punctaj
concurent 2: 10 8 punctaj concurent 3: 9 9 Date de intrare: concurent1 16 concurent2 18 concurent3 18.
3) Se d o matrice ptratic cu dimensiunea n,n. Afiai suma elementelor de pe diagonala principal i de pe diagonala
secundar.
4) Ducnd cele dou diagonale ntr-o matrice ptratic, se obin patru zone triunghiulare. Afiai suma componentelor din
interiorul fiecrei zone.
5) Se d un tablou cu m linii i n coloane. Se cere s se afieze suma componentelor de pe marginea tabloului. Exemplu:
Date de intrare: m=3 n=4 matrice 6 4 1 0 Date de ieire : s=32.
1533
0827
6) Se d o matrice cu n linii i n coloane. S se afieze suma componentelor ce se afl pe ptrate concentrice ale matricii
date. Ex: pentru n=4 i tabloul 1 1 1 1 se va afia
suma patrat 1=30
2222
suma patrat 2=10
3333
4444
7) Afiai valoarea maxim de pe fiecare coloan a unei matrici cu m linii i n coloane.
8) Se d un tablou cu m linii i n coloane avnd componente cifre zecimale. Fiecare linie a tabloului reprezint cifrele a m
numere naturale. Se cere s se afieze pe acelai rnd cifrele sumei celor m numere date.
Exemplu: pentru
numerele 914, 9211, 3547, 23 se introduce matricea cu m=4, n=4 0 9 1 4
9211
3547
0023
i se va afia suma 1 3 6 9 5.
9) O persoan are de cumprat p produse din m magazine. S se fac un program care s indice, pentru fiecare produs,
magazinul n care acesta are preul minim. Cunoscnd cantitile ce trebuie cumprate pentru fiecare produs, s se
determine suma ce urmeaz a fi cheltuit. Exemplu: p=2 m=3 i preurile aezate ntr-o matrice cu p linii i m coloane:
50000 48000 49500

50

11000 11500 11500


se va afia: produs 1 pret minim in magazin 2
minim in magazin 1 , cunoscnd cantitile 5 7, suma necesar va fi de 317000 lei.
Problema 1
var a: array[1..50,1..50] of integer; i,j,n,m,k: byte; s: longint;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
write(coloana k:); read(k);
s:=0; for i:=1 to m do s:=s+a[i,k];
writeln(suma=,s);
end.
Problema 2
var a: array[1..50,1..50] of integer; i,j,n,m: byte; s: longint;
begin
write(numar concurenti, numar probe=); read(m,n);
writeln(introdu punctajele ); for i:=1 to m do for j:=1 to n do read(a[i,j]);
for i:=1 to m do begin s:=0; for j:=1 to n do s:=s+a[i,j]; writeln(concurentul ,i, are punctajul ,s); end;
end.
Problema 3
var a: array[1..50,1..50] of integer; i,j,n: byte;sp,ss: longint;
begin
write(n=); read(n); writeln(elementele tabloului ); for i:=1 to n do for j:=1 to n do read(a[i,j]);
sp:=0; ss:=0;
for i:=1 to n do begin sp:=sp+a[i,i]; ss:=ss+a[i,n+1-i] end;
writeln(suma pe diagonala principala=,sp); writeln(suma pe diagonala secundara=,ss);
end.
Problema 4
var a: array[1..50,1..50] of integer; i,j,n: byte; s1,s2,s3,s4: longint;
begin
write(n=); read(n); writeln(introdu numerele ); for i:=1 to n do for j:=1 to n do read(a[i,j]);
s1:=0; s2:=0; s3:=0; s4:=0; {s1=triunghi stanga, s2=triunghi sus, s3=triunghi dreapta}
for i:=1 to n do
{s4=triunghi jos}
for j:=1 to n do begin
if (i>j) and (i+j<n+1) then s1:=s1+a[i,j];
if (i<j) and (i+j<n+1) then s2:=s2+a[i,j];
if (i<j) and (i+j>n+1) then s3:=s3+a[i,j];
if (i>j) and (i+j>n+1) then s4:=s4+a[i,j];
end;
writeln(suma 1=,s1); writeln(suma 2=,s2); writeln(suma 3=,s3); writeln(suma 4=,s4);
end.
Problema 5
var a: array[1..50,1..50] of integer; i,j,n,m: byte; s: longint;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do for j:=1 to n do read(a[i,j]);
s:=0;
for j:=1 to n-1 do s:=s+a[1,j];
{se aduna de pe prima linie, mai putin ultimul element}
for i:=1 to m-1 do s:=s+a[i,n]; {se aduna de pe ultima coloana, mai putin ultimul element}
for j:=n downto 2 do s:=s+a[m,j]; {se aduna de pe ultima linie, mai putin primul element}
for i:=m downto 2 do s:=s+a[i,1]; {se aduna de pe prima coloana, mai putin primul element}
writeln(suma=,s);
end.
Problema 6
var a: array[1..50,1..50] of integer; i,j,n: byte; s: longint;

51

produs 2 pret

begin
write(n=); read(n); writeln(elementele matricii:); for i:=1 to n do for j:=1 to n do read(a[i,j]);
for i:=1 to n div 2 do begin
s:=0;
for j:=i to n-i do s:=s+a[i,j];{se aduna elementele de pe linia i, fara primele i-1 si ultimele i}
for j:=i to n-i do s:=s+a[j,n+1-i];{se aduna elementele de pe colona a i-a de la dreapta, fara
primele i-1 si ultimele i}
for j:=n+1-i downto i+1 do s:=s+a[n+1-i,j];{se aduna elementele de pe linia a i-a de jos in sus,
fara primele i si ultimele i-1}
for j:=n+1-i downto i+1 do s:=s+a[j,i];{se aduna elementele de pe coloana i, fara primele i si
ultimele i-1}
writeln(suma patrat ,i,=,s);
end;
if n mod 2=1 then
writeln(suma patrat ,i+1,=,a[i+1,i+1]);{daca n este impar, ultimul patrat}
end.
{se reduce la un singur element}
Problema 7
var a: array[1..50,1..50] of integer; i,j,n,m: byte; max: integer;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do for j:=1 to n do read(a[i,j]);
for j:=1 to n do
begin
max:=-maxint;
for i:=1 to m do if max<a[i,j] then max:=a[i,j];
writeln(coloana ,j, max=,max);
end;
end.
Problema 8
var a: array[1..50,1..50] of byte; s: array[1..50] of byte; i,j,n,m,c: byte;
begin
write(m,n=); read(m,n);
for i:=1 to m do begin
writeln(introdu cifrele numarului ,i, (n cifre):); for j:=1 to n do read(a[i,j]);
end;
c:=0;
{c=cifra zecilor la suma pe o coloana}
for j:=n downto 1 do
begin
s[j]:=c; for i:=1 to m do s[j]:=s[j]+a[i,j];
if s[j]>9 then begin c:=s[j] div 10; s[j]:=s[j] mod 10; end else c:=0;
end;
if c<>0 then write(c:2); for j:=1 to n do write(s[j]:2);
end.
Problema 9
var a: array[1..50,1..50] of longint; c: array[1..50] of integer;
i,j,m,p,mag: byte; min,s: longint;
begin
write(p,m=); read(p,m); writeln(introdu preturile din fiecare magazin);
for i:=1 to p do begin write(produs ,i,: );for j:=1 to m do read(a[i,j]); end;
writeln(introdu cantitatile pentru fiecare produs );
for i:=1 to p do begin write(produs ,i,: ); read(c[i]); end;
s:=0;
{s=suma necesara}
for i:=1 to p do
begin
min:=maxlongint;
{calculez minimul pe fiecare linie}

52

for j:=1 to m do if min>a[i,j] then begin min:=a[i,j]; mag:=j end;


writeln(produs ,i, are pret minim in magazin ,mag);
s:=s+c[i]*min;
end;
writeln(suma necesara:,s);
end.
Eliminarea, adugarea i schimbarea poziiei liniilor i coloanelor
1) Se introduce o matrice cu m linii i n coloane. Se cere ca prin operaii de interschimbare de linii s se obin o matrice
cu elementele de pe prima coloan ordonate cresctor. Exemplu: Date de intrare: m=2 n=3 matrice: 7 4 9 Date
de ieire:
184
184
540
540
749
2) Se dau o matrice de dimensiune m,n i un numr k, km. S se elimine linia k din matrice.
3) Se dau o matrice de dimensiune m,n i un vector cu n elemente. S se adauge aceste elemente ca linie k n matricea
dat.
4) Se d o matrice cu m linii i n coloane cu elemente 0 sau 1.Determinai o matrice cu m+1 linii i n+1 coloane care are un
numr par de 1 pe fiecare linie i fiecare coloan.
5) S se afieze suma vecinilor fiecrui element al unei matrice de m linii i n coloane. Exemplu: m=3, n=2 pentru
matricea
1 2
se va afia
9 8 18 17 13 12.
3 4
5 6
Problema 1
var a: array[1..50,1..50] of integer; i,j,n,m: byte; x: integer ; cresc: boolean;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
repeat
cresc:=true;
for i:=1 to m-1 do if a[i,1]>a[i+1,1] then begin
{inversez liniile i si i+1}
for j:=1 to n do begin x:=a[i,j]; a[i,j]:=a[i+1,j]; a[i+1,j]:=x end;
cresc:=false;
end;
until cresc;
for i:=1 to m do begin for j:=1 to n do write(a[i,j]:5); writeln; end;
end.
Problema 2
var a: array[1..50,1..50] of integer; i,j,n,m,k: byte;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
write(k=); read(k);
for i:=k to m-1 do
{se aduce linia i+1 peste linia i, incepand cu linia k+1}
for j:=1 to n do a[i,j]:=a[i+1,j];
dec(m);
{scad dimensiunea matricii}
for i:=1 to m do begin for j:=1 to n do write(a[i,j]:5); writeln; end;
end.
Problema 3
var a: array[1..50,1..50] of integer; v: array[1..50] of integer; i,j,n,m,k: byte;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
write(k=); read(k); write(elementele care se introduc:); for j:=1 to n do read(v[j]);
for i:=m downto k do{se aduce linia i peste linia i+1, incepand cu ultima linie pana la linia k}

53

for j:=1 to n do a[i+1,j]:=a[i,j];


for j:=1 to n do a[k,j]:=v[j];
{se introduc noile valori pe linia k}
inc(m);
{cresc dimensiunea matricii}
for i:=1 to m do begin for j:=1 to n do write(a[i,j]:5); writeln; end;
end.
Problema 5
var a: array[0..50,0..50] of integer; i,j,n,m: byte; s: longint;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
for i:=1 to m do begin a[i,0]:=0; a[i,n+1]:=0 end; {bordez matricea cu elemente nule}
for j:=0 to n+1 do begin a[0,j]:=0; a[m+1,j]:=0 end;
for i:=1 to m do
for j:=1 to n do
begin
s:=a[i-1,j-1]+a[i-1,j]+a[i-1,j+1]+a[i,j-1]+a[i,j+1]+a[i+1,j-1]+a[i+1,j]+a[i+1,j+1];
write(s:5);
end;
end.
Verificarea unor proprieti
1) S se verifice dac o matrice ptratic de dimensiune n,n este simetric (elementele simetrice fa de diagonala
principal sunt egale). Exemplu: Date de intrare: n=3 matrice:
3 4 5 Date de ieire: Da
417
570
2) Se d un tablou cu m linii i n coloane. S se determine numrul de linii care au toate elementele egale.
3) S se verifice dac dou matrici cu aceeai dimensiune sunt egale (au componentele de pe aceeai poziie egale).
4) Se introduc mediile a m elevi dintr-o clas, la n materii. S se verifice dac n acea clas sunt elevi repeteni (cel puin
trei corigene). n caz afirmativ, s se specifice i ci sunt.
5) S se verifice dac o matrice are toate elementele distincte.
6) Se da o matrice ptratic cu n linii i n coloane. Stabilii dac este un ptrat magic. (Suma pe linie egal cu suma pe
coloan i cu suma pe fiecare diagonal)
Problema 1
var a: array[1..50,1..50] of integer; i,j,n: byte; sim: boolean;
begin
write(n=); read(n); writeln(introdu elementele ); for i:=1 to n do for j:=1 to n do read(a[i,j]);
sim:=true;
for i:=1 to n do for j:=1 to n do if a[i,j]<>a[j,i] then sim:=false;
if sim then writeln(matrice simetrica) else writeln(matrice nesimetrica);
end.
Problema 2
var a: array[1..50,1..50] of integer; i,j,n,m,c: byte; egale: boolean;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
c:=0;
{c=numarul liniilor cu elemente egale}
for i:=1 to m do begin
egale:=true;
for j:=1 to n-1 do if a[i,j]<>a[i,j+1] then egale:=false;
if egale then inc(c);
end;
writeln(matricea are ,c, linii cu elemente egale);
end.
Problema 3

54

var a,b: array[1..50,1..50] of integer; i,j,n,m: byte; egale: boolean;


begin
write(m,n=); read(m,n);
writeln(introdu numerele din prima matrice);for i:=1 to m do for j:=1 to n do read(a[i,j]);
writeln(introdu numerele din a doua matrice); for i:=1 to m do for j:=1 to n do read(b[i,j]);
egale:=true;
for i:=1 to m do
for j:=1 to n do if a[i,j]<>b[i,j] then egale:=false;
if egale then writeln(Matrici egale) else writeln(Matrici neegale);
end.
Problema 4
var a: array[1..50,1..50] of real; i,j,n,m,c,cor: byte;
begin
write(m,n=); read(m,n);writeln(introdu mediile ); for i:=1 to m do for j:=1 to n do read(a[i,j]);
c:=0;
for i:=1 to m do begin
cor:=0;
for j:=1 to n do if a[i,j]<5 then inc(cor);
if cor>=3 then inc(c);
end;
if c<>0 then writeln(sunt ,c, repetenti) else writeln(nu sunt repetenti);
end.
Problema 5
var a: array[1..50,1..50] of integer; v: array[1..250] of integer; i,j,k,n,m: byte; dif: boolean;
begin
write(m,n=); read(m,n); writeln(introdu numerele ); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
dif:=true;
k:=0; {liniarizez matricea, creez vectorul v din elementele matricii}
for i:=1 to m do for j:=1 to n do begin inc(k); v[k]:=a[i,j] end;
for k:=1 to m*n-1 do for j:=k+1 to m*n do if v[k]=v[j] then dif:=false;
if dif then writeln(elemente diferite) else writeln(nu sunt diferite);
end.
Construirea unui tablou
1) S se construiasc un tablou ptratic de dimensiune n,n cu primele n*n numere pare. Exemplu: n=3 se va afia
2 4 6
8 10 12
14 16 18
2) Se d un numr natural n. Vrem s construim un tablou ptratic cu n linii i n coloane avnd elementele n mulimea {-1,
1} astfel nct produsul elementelor de pe fiecare linie, respectiv coloan s fie 1. Cerin: Afiai unul din tablourile cu
proprietile de mai sus. Restricii: 0<n<26. Exemplu: pentru n=4 o soluie posibil este
1 1 1 1
1 1 1 1
-1 1 1 1
1 1 -1 1
(CNI Satu-Mare 2002 clasa a VI-a
Problema 1
var a: array[1..50,1..50] of integer; i,j,n,nr: byte;
begin
write(n=); read(n);
nr:=2;
for i:=1 to n do
begin

55

for j:=1 to n do begin


a[i,j]:=nr; nr:=nr+2; write(a[i,j]:4);
end;
writeln;
end;
end.
Problema 2
var a: array[1..50,1..50] of integer; i,j,n: byte;
begin
write(n=); read(n);{construiesc matricea cu 1 pe diagonala principala si 1 in rest}
for i:=1 to n do for j:=1 to n do if i<>j then a[i,j]:=1 else a[i,j]:=-1;
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:4);
writeln
end;
end.

VIII.

iruri de caractere ( tipul string)

Parcurgere, testarea elementelor


1) S se afieze cu litere mari un text dat, de maxim 255 caractere. Exemplu: Date de intrare text: Cerc dE InfO Date de
ieire CERC DE INFO.
2) S se afieze numrul de vocale dintr-un text scris cu litere mici, memorat ntr-o variabil string.
3) S se scrie toate prefixele unui cuvnt dat; prin prefix se nelege irul format din primele caractere ale cuvntului, minim
un caracter, maxim toate. Exemplu: prefixele pentru tablou sunt: t ta tab tabl tablo tablou.
4) S se afieze toate sufixele unui cuvnt. Exemplu: cuvntul tablou, sufixele: u ou lou blou ablou tablou.
5) S se stabileasc proprietatea de palindrom a unui cuvnt. Exemplu: cuvntul cojoc este palindrom.
6) S se afieze literele folosite i frecvena fiecreia ntr-un text de maxim 255 de caractere.
7) Se d un text cu cel mult 255 caractere i o secven continu de litere. Cuvintele din text sunt separate prin unul sau
mai multe spaii. Se cere s se determine numrul de apariii a grupului de litere dat, n text. Exemplu: text: Alina merge
sa cumpere mere, grup de litere: me, se va afia 2.
8) S se codifice un text dat afind n locul fiecrei litere codul ei ASCII. S se afieze textul codificat, cu un spaiu ntre
coduri i trei spaii pentru un spaiu n text. Exemplu: textul: Am un mar se va afia 65 109 117 110 109 97 114.
9) ntr-un text dat, s se nlocuiasc o liter dat cu o alt liter dat de la tastatur. Exemplu: Date de intrare: text
abracadabra litera inlocuita c litera cu care se inlocuieste g Date de ieire abragadabra.
10) S se verifice dac dou cuvinte date au aceleai litere. Exemplu: Date de intrare: mar ram Date de ieire: Da
11) S se introduc n calculator un numr cu mai mult de 10 cifre, sub form string, i s se afieze cu cifrele grupate cte
trei, de la dreapta la stnga, grupele fiind separate de punct. Exemplu: numrul 12345678900 va fi afiat ca
12.345.678.900.
12) Se d un ir de caractere. Eliminai din acest ir toate caracterele numerice pe care le conine. Exemplu: Date de
intrare: sir: Ana are 3 mere date de Ieire: Ana are mere
13) Se citesc de la tastatur n litere mici, cu n < 15. S se formeze dou cuvinte astfel nct primul s conin numai vocale
iar cellalt numai consoane. Primul va fi afiat cuvntul care are mai multe litere, iar in caz de egalitate cel care conine
numai vocale. Exemplu: Date de intrare: 12 a v p o i n e r g e a s date de ieire: aoieea vpnrgs.
14) ntr-o urn se gsesc bile albe i roii. n fiecare bil exist cte un numr de la 1 la 50. Ionel i Petric doresc s se
joace i inventeaz urmtorul joc: Fiecare din cei doi copii extrage cte 5 bile i numerele din bilele extrase sunt apoi
alturate formnd un numr. Ctig cel care a obinut cel mai mare numr. Exemplu: Ionel extrage bilele cu numerele
10, 23, 1, 15, 48. Numrul este 102311548. Petric extrage bilele cu numerele 1, 15, 24, 25, 26. Numrul este

56

115242526. A ctigat Petric. Realizai programul Pascal ce stimuleaz jocul celor doi prieteni.
(CJI, Petroani, 2005)
Problema 1
var text: string; i: byte;
begin
write(text:); readln(text);
for i:= 1 to length(text) do write( upcase(text[i]));
end.
Problema 2
var text: string; c,i: byte;
begin
write(text:); readln(text);
c:=0; for i:= 1 to length(text) do if (text[i]=a) or (text[i]=e) or (text[i]=i) or (text[i]=o) or (text[i]=u) then inc(c);
writeln(textul contine ,c, vocale);
end.
Problema 3
var cuv: string; i: byte;
begin
write(cuvant:); readln(cuv);
for i:= 1 to length(cuv) do writeln(copy(cuv,1,i));
end.
Problema 4
La fel ca la Problema 3, se schimba doar parametrul pozitie din functia copy: avem writeln(copy(cuv, length(cuv)+1-i ,i));
Problema 5
var cuv: string; lc,i: byte; pal: boolean;
begin
write(cuvant:); readln(cuv);
lc:=length(cuv); pal:=true;
for i:= 1 to (lc div 2) do if cuv[i]<> cuv[lc+1-i] then pal:=false;
if pal then writeln(palindrom) else writeln(nu este palindrom);
end.
Problema 6
var text: string; i,c: byte; l: char;
begin
write(text:); readln(text);
for l:=a to z do begin
{se numara aparitiile fiecarei litere}
c:=0; for i:=1 to length(text) do if text[i]=l then inc(c);
if c<>0 then writeln(litera ,l, apare de ,c, ori);
end;
end.
Problema 7
var text,cuv: string; c,l,i: byte;
begin
writeln(text:); readln(text); writeln(grup de litere:); readln(cuv);
l:=length(cuv); c:=0;
for i:=1 to length(text)-l do if copy(text,i,l)=cuv then inc(c);
writeln(secventa ,cuv, apare de ,c, ori);
end.
Problema 8
var text: string; i: byte;
begin
writeln(text:); readln(text);

57

for i:=1 to length(text) do if text[i]<> then write(ord(text[i]), ) else write( );


end.
Problema 9
var text,textnou: string; l1,l2: char; i: byte;
begin
writeln(text:); readln(text);
writeln(litera care se inlocuieste:); readln(l1); writeln(litera cu care se inlocuieste:); readln(l1);
texnou:=;
{initial sirul vid, dupa bucla for va avea ca valoare noul text}
for i:=1 to length(text) do if text[i]=l1 then textnou:=textnou+l2 else textnou:=textnou+text[i];
writeln(noul text:,textnou);
end.
Problema 10
var cuv1,cuv2: string; l: char; i: byte; ord: boolean;
begin
writeln(primul cuvant:); readln(cuv1); writeln(al doilea cuvant:); readln(cuv2);
repeat
{ordonez alfabetic literele din cele doua cuvinte}
ord:=true;
for i:=1 to length(cuv1)-1 do if cuv1[i]>cuv1[i+1] then begin
l:=cuv1[i]; cuv1[i]:=cuv1[i+1]; cuv1[i+1]:=l ;ord:=false;
end;
until ord;
repeat
{ordonez alfabetic literele din cele doua cuvinte}
ord:=true;
for i:=1 to length(cuv2)-1 do if cuv2[i]>cuv2[i+1] then begin
l:=cuv2[i]; cuv2[i]:=cuv2[i+1]; cuv2[i+1]:=l ;ord:=false;
end;
until ord;
if cuv1=cuv2 then writeln(cuvinte cu aceleasi litere) else writeln(nu au aceleasi litere);
end.
Problema 11
var n: string; r,i: byte;
begin
writeln(numar:); readln(n);
r:=length(n) mod 3;
{r=numarul de cifre din prima grupa}
if r>0 then begin for i:=1 to r do write(n[i]); write(.); end;
i:=r+1;
while i<length(n) do begin write(n[i],n[i+1],n[i+2]),.); i:=i+3 end;
end.
Scoaterea cuvintelor dintr-un text
1) Se consider un text memorat ntr-o variabil string. S se scrie un program care numr cuvintele din text, separatorii
folosii fiind spaiul, punctul, virgula.
2) O linie citit de la tastatur cuprinde cuvinte separate prin spaii. Se cere s se afieze lungimea minim i maxim a
cuvintelor din linie.
3) Se citete de la tastatur un text cu maxim 255 caractere, cuvintele fiind separate de spaiu, punct, virgul i caracterele
?,!. Se cere s se afieze unul sub altul cuvintele din text. Exemplu: pentru textul: Pleaca Ion la mare? Se va afia:
Pleaca
Ion
la
mare
4) S se afieze n ordine alfabetic cuvintele formate din dou litere dintr-un text dat. Exemplu: Date de intrare: tu ai fost
la mare Date de ieire ai la tu.

58

5) Se d un text cu cel mult 255 caractere, litere mici i mari ale alfabetului englez i spaii. Se cere s se afieze cuvintele
din text de lungime maxim. Exemplu: Ionica vrea sa mearga cu Mircea al mare, se va afia: Ionica mearga Mircea.
6) Se introduc de la tastatur dou texte prin dou variabile de tip string. Se cere s se afieze cuvintele comune celor
dou texte, tiind c dou cuvinte pot fi separate prin unul sau mai multe spaii. Exemplu: pentru textele: Ion merge la
peste i Dan merge la Ion, se va afia : Ion merge la.
7) Se d un text t format din mai multe cuvinte (maxim 100 de cuvinte sau 1000 de caractere) separate prin spaiu citit de
la tastatur. S se introduc ntr-un dicionar toate cuvintele distincte din acel text. Acest dictionar va fi ordonat alfabetic
n sens cresctor de la A la Z. Exemplu: "acesta este un text de proba cu doi de este", afiare: acesta cu
de doi
este proba text un. Observaii: textul se introduce de la tastatur fr ghilimele i se d Enter pentru a termina
introducerea lui in memorie; nu se introduc caractere speciale, sau chiar daca textul are semne de punctuaie, se va
considera ca separator intre cuvinte spaiul;
cuvintele n dicionar vor fi scrise cu liter mic
Problema 1
var t: string; i,c,k: byte;
begin
write(text:); readln(t);
c:=0; k:=0;
{contorizeaza alternanta spatiu caracter diferit de spatiu}
for i:=1 to length(t) do if t[i]= then k:=c else c:=k+1;
writeln(textul are ,c, cuvinte);
end.
Problema 2
var ch: char; c, lmin, lmax: integer;
begin
c:=0; lmin:=255; lmax:=1;
repeat
read(ch);
if (ch= ) and (c>0) then begin
if c<lmin then lmin:=c;
if c>lmax then lmax:=c;
c:=0;
end;
if ch<> then inc(c);
until eoln;
if c>0 then begin
if c<lmin then lmin:=c;
if c>lmax then lmax:=c;
end;
writeln(lungime maxima:,lmax); writeln(lungime minima:,lmin);
end.
Problema 3
var t, cuv: string; i: byte;
begin
writeln(text:); readln(t);
i:=1;
repeat
case t[i] of
,.,,,?,!: inc(i);
else begin
cuv:=;
while (i<=length(t)) and (t[i]<> ) and (t[i]<>.) and (t[i]<>,) and (t[i]<>?) and (t[i]<>!)
do begin cuv:=cuv+t[i]; inc(i) end;
writeln(cuv);
end;

59

end;
until i>length(t);
end.
Problema 4
Se scot cuvintele din text ca la Problema 4, iar in loc de writeln(cuv) se testeaza daca cuv are lungimea 2; daca da, se
memoreaza intr-un vector de string-uri, care apoi se ordoneaza crescator si se afiseaza.
Problema 5
var text: string; cuv: array[1..255] of string; {va contine cuvintele din text}
n,i,k,max: byte;
begin
write(text:); readln(text);
n:=length(text); i:=1; k:=0; {i=indicele in string, k=numar cuvinte, indice in vectorul cuv}
while i<n do begin if text[i]<> then begin
inc(k); cuv[k]:=;
while (text[i]<> ) and (i<n) do begin cuv[k]:=cuv[k]+text[i]; inc(i) end;
end;
max:=0; {calculez max dintre lungimile cuvintelor din cuv}
for i:=1 to k do if max<length(cuv[i]) then max:=length(cuv[i]);
for i:=1 to k do if max=length(cuv[i]) then writeln(cuv[i]);
end.
IX.

Alte tipuri de date structurate

Tipul mulime
1) Se dau n (1<=n<=30) iruri de caractere (litere mici i mari ale alfabetului englez i cifrele sistemului zecimal). S se
determine caracterele folosite n toate irurile de caractere. Exemplu: Date de intrare n=3 siruri
Abcdammbc123ads
Sgssa89822221iuAsd
Hgds921kjdkAsda
Se va afia A d s 1 2.
2) Se dau dou mulimi a i b cu componente numere naturale mai mici sau egale cu 255. Se cere s se determine
mulimile: ab, ab, a-b. Exemplu: Date de intrare: multimea a 1 2 3 4 7 5 multimea b 4 5 8 Date de ieire: reuniune 1
2 3 4 5 7 8 intersectie 4 5 diferenta 1 2 3 7.
3) Se dau n, 1<=n<=30, mulimi cu elemente numere naturale mai mici sau egale cu 255. Se cere se afle elementele
interseciei mulimilor. Exemplu: Date de intrare: m=3 multime1 1 2 3 4 5 multime2 2 4 7 1 multime3 4 5 2 9 Date
de ieire: intersectie 2 4.
4) Se citesc, din linii diferite, n cuvinte cuprinznd litere mici ale alfabetului latin. Se cere s se afieze literele distincte din
fiecare cuvnt citit i literele distincte ntlnite n toate cele n cuvinte. Exemplu:Date de intrare: numar cuvinte=2
cuvant1: backspace cuvant2: program Date de ieire: litere cuvant1: a b c e k p s litere cuvant2: a g m o p r litere
total: a b c e g k m o p r s.
5) Se dau dou numere n baza 16 cu cel mult 255 cifre. Se cere s se afieze cifrele comune celor dou numere.
Exemplu: Date de intrare: 1A67Fb 56DB345AA Date de ieire: 6 A B.
6) Se introduc numele medicamentelor indicate i contraindicate n 10 boli. Se cere s se afieze numele medicamentelor
care se pot administra unui pacient care sufer de mai multe boli din cele 10.
7) Se consider maxim 10 mulimi de numere de tip byte. S se verifice dac sunt disjuncte.
Problema 1
var
a,b: set of char;
x:array[1..30] of string;
n,i,j:integer; c:char;
begin
write(n=); readln(n);
{n=numar cuvinte}

60

a:=[a..z,A..Z,0..9];{a=initial, e multimea tuturor caracterelor ce pot aparea}


for i:=1 to n do
begin
write(sirul , i, ); readln(x[i]);
b:=[];
{se construieste al i-lea sir de caractere}
for j:=1 to length(x[i]) do b:=b+[x[i][j]];
a:=a*b;
{a devine intersectia ceruta}
end;
for c:=a to z do if c in a then write(c, );
for c:=A to Z do if c in a then write(c, );
for c:=0 to 9 do if c in a then write(c, );
end.
Problema 2
var a,b,c: set of byte; x,i,m,n: byte;
begin
write(numar elemente ale multimii a ); readln(m);
a:=[]; writeln(introduceti pe rand elementele multimii a);
for i:=1 to m do begin readln(x); a:=a+[x] end;
write(numar elemente ale multimii b ); readln(n);
b:=[]; writeln(introduceti pe rand elementele multimii b);
for i:=1 to n do begin readln(x); b:=b+[x] end;
c:=a+b;
for i:=1 to 255 do if i in c then write(i, );
writeln;
c:=a*b;
for i:=1 to 255 do if i in c then write(i, );
writeln;
c:=a-b;
for i:=1 to 255 do if i in c then write(i, );
writeln;
end.
Problema 3
var a: array[1..30] of set of byte; x,i,n: byte; c:set of byte;
begin
write(numar multimi ); readln(n);
for i:= 1 to n do
begin
a[i]:=[];
writeln(introduceti elementele multimii ,i, separate de spatiu, terminati cu Enter );
read(x);
while not eoln do begin a[i]:=a[i]+[x]; read(x); end; {se construieste a i-a multime}
end;
c:=[0..255];
{c=initial, multimea tuturor valorilor posibile, in final va fi intersectia}
for i:= 1 to n do c:=c*a[i];
for i:=0 to 255 do if i in c then write(i, );
end.
Problema 4
var
cuv, total:set of a..z;
lit:a..z; n:byte; i:integer;
begin
write(numar cuvinte );read(n);
total:=[]; {total va contine literele distincte din toate cuvintele, reuniunea lor}
for i:=1 to n do

61

begin
cuv:=[]; writeln(cuvantul ,i, :); {se construieste cuvantul }
while not eoln do begin read(lit); cuv:=cuv+[lit]; end;
total:=total+cuv;
writeln(cuvantul introdus are urmatoarele litere distincte:);
for lit:=a to z do if lit in cuv then write(lit:3);
writeln;
end;
writeln(litere distincte din toate cuvintele:);
for lit:=a to z do if lit in total then write(lit:3);
end.
Problema 5
{pentru fiecare boala, va trebui sa reunim medicamentele indicate si sa scadem cele contraindicate ; pentru aceasta, la
fiecare boala vom forma multimea medicamentelor indicate si cea a celor contraindicate; medicamentele trebuie codificate
deoarece tipul de baza al unei multimi nu poate fi string}

Tipul nregistrare
1) Elevii dintr-o coal vor s fac un top al celor mai bune 10 melodii pentru fiecare sptmn. Ajutai-i s realizeze un
program prin care se introduc n date de forma titlu melodie, interpret, numr puncte acumulate, numr puncte primite i care
afieaz primele 10 titluri, n ordinea descresctoare a punctelor.
2) Dintr-un lot de n persoane care s-au nregistrat cu nume i data naterii, trebuie selectate acele persoane care au
mplinit 18 ani la 1 ianuarie 2006. Datele de intrare cuprind valoarea lui n i cele n perechi de date de forma nume yy
mm dd i sunt coninute de fiierul date.int, iar datele de ieire conin numele cerute afiate pe vertical pe ecran.
3) La o staie meteo se trec datele n fiierul temp.int sub forma data temperatura. S se prelucreze aceste date afinduse zilele n care temperatura a fost maxim.
4) ntr-o clas de maxim 25 de elevi, fiecare a primit cte unul din calificativele suficient, bine i foarte bine la fiecare din
cele 10 materii. Datele se introduc n calculator sub forma: nume elev numr de calificative suficient numr de
calificative bine numr de calificative foarte bine. S se afieze n ordine descresctoare statistica notrii (numrul de
suficient, de bine i foarte bine) i numele elevului cu cele mai multe calificative fb.
Problema 1
type melodie=record
titlu: string[20];
interpret: string[15];
pac: byte;
pobt: byte;
end;
var top: array[1..100] of melodie; x:melodie; sort:boolean; I,n:byte;
begin
write(n=); readln(n);
for i:=1 to n do begin readln(top[I].titlu);readln(top[I].interpret); readln(top[I].pac, top[I].pobt);end;
{actualizez punctajul acumulat} for i:=1 to n do top[I].pac:=top[I].pac+top[I].obt;
repeat
sort:=true;
for i:=1 to n-1 do if top[i].pac<top[i+1].pac then begin
x:=top[i];top[i]:=top[i+1]; top[I+1]:=x; sort:=false
end;

62

until sort;
for i:=1 to 10 do writeln(top[i].titlu:20, top[i].interpret:15);
end.

Stive, liste, cozi alocate static


1) Se consider o stiv iniial vid, care poate conine litere. Ilustrai printr-un program efectul urmtoarelor operaii:
insereaz R, insereaz A, insereaz M, insereaz A, extrage un element, extrage un element, insereaz V.
2) Se consider coada ... P A S C A L ,,, (P reprezint nceputul iar L sfritul cozii). Ilustrai efectul urmtoarelor operaii:
extrage un element, extrage un element, insereaz C, extrage un element, insereaz U, insereaz L.
3)
Se consider urmtorul sistem de manevrare a vagoanelor ntr-un depou. Din
dreapta, intr n depou n vagoane numerotate de la 1 la n, n ordinea cresctoare a
numerelor. Construii un tren cu vagoanele numerotate n ordine descresctoare, de
Linie de ieire
Linie de
la n
la 1.
intrare
Depou

4) n condiiile problemei precedente, dorim s construim un tren special: vagoanele cu numr pa rvor merge la un moment
dat n alt direcie dect cele impare, din acest motiv toate vagoanele cu numr par trebuie s fie plasate la nceputul
trenului n ordinea cresctoare a numerelor lor, iar cele cu numr impar la sfritul trenului, n ordinea descresctoare a
numerelor lor. Cum procedai?
5) Se citete de pe o linie de la tastatur o succesiune de paranteze rotunde deschise i nchise pn la ntlnirea
caracterului punct. ntlnirea unei paranteze deschise determin introducerea acesteia ntr-o coad. ntlnirea uneia
nchise determin extragerea unui element din coad- Verificai dac parantezele din ir se nchid corect i determinai
dimensiunea maxim a cozii (numrul maxim de paranteze deschise n coad la un moment dat). Exemple: Date de
intrare: (()). Date de ieire: corect dim max=2; date de intrare (((). Date de ieire: incorect dim max=3; date de intrare:
()). Date de ieire: incorect dim max=1.
6) Se consider un caroiaj dreptunghiular cu n linii i m coloane, n care pe anumite poziii sunt plasate obstacole. n
poziia iniial (x0,y0) se afl plasat un mobil. S se determine, pentru toate poziiile n care ajunge mobilul, distana
minim de la poziia iniial a mobilului msurat n deplasri elementare (o deplasare elementar este o deplasare cu o
poziie la stnga, la dreapta, sus sau jos). Exemplu: Date de intrare: m=5 n=5 x0=3 y0=3 pozitie obstacole
12
Date de ieire:
-2 -1 -1 5 4
unde -1=obstacol, -2=inaccesibil
13
-1 2 1 -1 3
24
2 1 0 1 2
43
3 2 -1 -1 3
44
4 3 4 5 4
21
Problema 3
type vagon:1..100; {depoul funct. ca o stiva, vom introduce toate vag. in depou si le vom extrage pe toate}
var s:array[1..50] of vagon ; n,i,vf: vagon;
begin
write(numarul de vagoane );readln(n);
if n>50 then writeln(prea multe vagoane)
else
begin
vf:=0; {initializez stiva}
for i:=1 to n do begin inc(vf) ; s[vf]:=i; end;
{formez trenul extragand vagoanele din depou}
while vf<>0 do
{cat timp depoul nu este gol}
begin write(s[vf], ); dec(vf); end;

63

writeln;
end;
end.
Problema 5
var c:array[1..100] of char;
inceput, sfarsit, lgmax:0..100;
p: char; corect:boolean;
begin
writeln(introdu sirul de paranteze );
sfarsit:=0; inceput:=1;
{initializez coada]
corect:=true; lgmax:=0; {lgmax retine lungimea maxima a cozii}
repeat
read(p);
if p=( then begin {inserez o paranteza deschisa in coada}
inc(sfarsit); c[sfarsit]:=(;
if sfarsit/inceput+1>lgmax then lgmax:=sfarsit-inceput+1;
end
else if p=) then {verific daca pot extrage un element din stiva}
if inceput<=sfarsit then inc(inceput) {am extras un element}
else corect:=false;
until p=.;
if inceput<=sfarsit then corect:=false;
if corect then writeln(corect dim max=,lgmax) else writeln(incorect dim max=,lgmax);
end.
Problema 6
Const dx:array[1..4] of -1..1=(-1,0,1,0);
dy:array[1..4] of -1..1=(0,1,0,-1); {deplasarile pe linie si coloana}
type element=record
l,c:0..21; {pozitia in caroiaj}
d: word; {distanta minima pana la pozitia l,c}
end;
var a: array[0..21,0..21] of integer;
n,m,x0,y0,I,j:integer; k:1..4;
c:array[0..100] of element; {vectorul coada}
incc,sfc:0..100;
{inceputul, sfarsitul cozii}
x,y:element;
fin, fout: text;
{fisierele de intrare si iesire}
begin
assign(fin,careu.in);reset(fin); readln(f,n,m); readln(fin, x0,y0);
for i:=1 to n do
for j:=1 to m do a[I,j]:=-2; {initializarea careului cu -2=pozitie inaccesibila}
while not seekeof(fin) do
begin readln(fin,I,j); a[I,j]:=-1 end; {citesc si marchez in caroiaj obstacolele}
for i:=1 to n do begin a[I,0]:=-1; a[I,m+1]:=-1 end;
{bordez matricea a cu obstacole pentru a nu verifica
for i:=1 to m do begin a[0,i:=-1; a[n+1,i]:=-1 end;
marginile}
x.l:=x0; x.c:=y0; x.d:=0; a[x0,y0]:=0;
incc:=1; sfc:=1; c[incc]:=x;
while incc<=sfc do begin
{se parcurge caroiajul}
x:=c[incc); inc(incc);
for k:=1 to 4 do begin
{ma deplasez in cele patru directii posibile}
y.l:= x.l+dx[k]; y.c:=x.c+dy[k];

64

if a[y.l,y.c]=-2 then begin y.d:=x.d+1; a[y.l,y.c]:=y.d; inc(sfc); c(sfc):=y;end;


{daca pozitia nu a mai fost parcursa se face mutarea }
end;
end;
assign(fout,careu.out); rewrite(fout);
for i:=1 to n do begin for j:=1 to m do write(fout, a[I,j]:3); writeln(fout); end;
close (fin); close(fout);
end.

X.

ALTI ALGORITMI DE LUCRU CU DATE STRUCTURATE

Interclasarea
1) Se cere s se interclaseze dou iruri de numere reale, ordonate cresctor. Prin interclasare se nelege crearea unui
nou ir ordonat , format din elementele irurilor date. Exemplu: Date de intrare: nr. elemente din primul sir=3, primul
sir=3 6 9, nr. elemente din al doilea sir=4, al doilea sir=1 2 5 9. Date de iesire: 1 2 3 5 6 9.
2) Pe dou rafturi din bibliotec avei mai multe cri. Se cunoate inltimea n cm a fiecrei cri i faptul c, pe fiecare
raft, crile sunt aranjate de la stnga la dreapta n ordine descresctoare a nlimii. Mutai toate crile pe un al treilea
raft pe care s fie ordonate tot descresctor. Afiati nlimile crilor de pe acest al treilea raft. Exemplu: Date de intrare:
numar carti pe primul raft: 5 inaltimi: 18 18 17 15 15 numar carti pe al doilea raft: 3 inaltimi: 15 14 12 Date de ieire: 18
18 17 15 15 15 14 12.
Ffff
Problema 1
var a,b,c: array[1..100] of integer;
n,m,i,j,k: integer;
begin
write(numar elemente din primul sir ); read(m); write(numar elemente din al doilea sir ); read(n);
write(elementele sirului a ordonate crescator );for i:=1 to m do read(a[i]);
write(elementele sirului b ordonate crescator );for i:=1 to n do read(b[i]);
for i:=1 to m+n do c[i]:=0;
i:=1; j:=1; k:=1;
{indicii vectorilor a,b,c}
repeat
if a[i]<=b[j] then begin c[k]:=a[i]; inc(i) end
else begin c[k]:=b[j]; inc(j) end;
inc(k);
until (i>m) or (j>n);
while (i<=m) do
begin c[k]:=a[i]; inc(i); inc(k) end; {se copiaza elem. ramase in a}
while (j<=n) do
begin c[k]:=b[j]; inc(j); inc(k) end; {se copiaza elem. ramase in b}

65

writeln(sirul interclasat:); for k:=1 to m+n do write(c[k]), );


end.
Parcurgere circular a unui ir
1) Numerele de la 1 la n sunt aezate n ordine cresctoare pe circumferina unui cerc astfel c n ajunge situat lng 1.
ncepnd cu numrul s se marcheaz numerele din k n k, n ordinea cresctoare a lor, pn cnd un numr este
marcat de 2 ori. Cte numere au rmas nemarcate?
2) Oaza Lacotrop din deertul Etpas este nconjurat de n portocali care conin fructe, dispui sub form de cerc i
numerotai de la 1 la n, n sensul acelor de ceas. Maimua Gino pornete de la un portocal m i numr, n sensul acelor
de ceas, k portocali care conin fructe. Culege toate fructele din portocaul de pe poziia k. Continu numrtoarea
ncepnd cu portocalul urmtor celui din care a cules, dar care conine fructe. n final rmne un singur portocal p
necules, n care Gino i face adpost. Cerin: Cu ce portocal m trebuie s nceap numrtoarea pentru ca s-i fac
adpost exact n portocalul p?. Date de intrare: fiierul portocal.in conine pe o singur linie, numerele n, k i p, separate
printr-un spaiu. Date de ieire: fiierul portocal.out conine pe prima linie numrul natural m cerut. Restricii:
2<=n<=1000, 1<=k<=10000, 1<=p<=1000. Exemplu: portocal.in 6 8 5 portocal.out 3.
(ONI, Focani,
clasa a VII-a, 2003)
3) Jocul Nu te supra, frate! se joac de ctre doi jucatori. Pe o pist circular cu n csue numerotate de la 1 la n, n
ordinea dat de sensul acelor de ceasornic, se afl nscrise valorile 0, 1 i 10. Cei doi juctori vor avea fiecare cte un
pion i vor porni pe rnd, din csua 1. ncepe juctorul 1. Fiecare juctor va muta pionul su conform cu valoarea
obinut prin aruncarea zarului, cumulnd sau pierznd puncte n funcie de csua n care ajunge. Fiecare juctor
citete valoarea zarului cnd i vine rdul.
Jocul are urmatoarele reguli:
1. Ctigtorul poate fi:
- juctorul care ajunge primul din nou n csua cu numrul 1, indiferent de punctaj (exceptnd cazul n care are
punctaj 0)
- n cazul n care se termin irul aruncrilor cu zarul, nseamn c juctorii s-au plictisit i ctig cel care a
cumulat mai multe puncte, iar dac au punctaje egale ctig cel care se afl n csua cu numr de ordine mai
mare.
2. Dup aruncarea zarului, juctorul mut pionul cu attea csue ct indic valoarea zarului, n ordinea acelor de
ceasornic, ncepnd numrtoarea cu csua urmtoare poziiei pe care se afl. Prima csu nu conine valoarea
0 (zero).
3. Dup mutare pot apare urmtoarele situaii:
- ajunge ntr-o csu cu valoarea 0 (zero) juctorul este penalizat, pierde toate punctele acumulate i reia
jocul din pozitia 1
- ajunge ntr-o csu cu valoarea 10 primete un bonus de 10 puncte
- ajunge ntr-o csu cu valoarea 1 primete 1 punct
- ajunge ntr-o csu n care se afl cellalt pion (cu excepia csuei 1, cnd ctig) juctorul care ajunge
ultimul este penalizat, pierde toate punctele i reia jocul de la csua 1.
Cerin Determinai juctorul ctigtor, poziiile fiecrui juctor pe cerc i punctajul fiecrui juctor.
Date de intrare n fiierul JOC.IN se dau:
- Pe prima linie numrul n al csuelor din cerc.
- Linia a doua conine o succesiune de n valori (0, 1 sau 10), separate printr-un spaiu, reprezentnd valoarea
fiecrei csue.
- Linia a treia conine numrul de aruncri cu zarul
- Linia a patra conine o succesiune de valori ntregi cuprinse ntre 1 i 6, separate printr-un spaiu,
reprezentnd aruncarea cu zarul.
Date de ieire Fiierul JOC.OUT va conine 3 linii cu urmtoarele informaii:
- pe prima linie: juctorul ctigtor
- pe a doua linie: poziia i punctajul juctorului numrul 1
- pe a treia linie: poziia i punctajul juctorului numrul 2.
Restricii 7<=n<=100

66

Exemple
JOC.IN
10
1 1 1 1 1 10 0 1 1 0
8
36241353
JOC.IN
7
1 1 0 10 1 10 1
16
6424621356332145
JOC.IN
12
1 10 1 1 0 10 1 1 1 10 0 1
4
5633

JOC.OUT
2
6 10
13
JOC.OUT
1
13
10
JOC.OUT
2
9 11
10 11
(OJI, clasa a VII-a, 2004)

Problema1
var c: array[1..100] of integer; n,i,t,s,k: integer; gata: boolean;
begin
write(cate numere=); read(n); write(pasul=); read(k); write(pozitia de start=); read(s);
for i:=1 to n do c[i]:=0;
{c[i]=de cate ori s-a marcat pozitia i pe cercul numerelor}
c[s]:=1; gata:=false; t:=s; {t=valoarea numerelor care se marcheaza}
while not gata do begin
t:=t+k;
if t > n then t:=t mod n;
if c[t]=0 then c[t]:=1 else begin
m:=0; gata;=true;
for i:=1 to n do if c[i]=0 then m:=m+1;
writeln(au ramas ,m, numere);
end;
end;
end.
Operaii cu numere mari
7) S se afieze toate valorile 2n , pentru n cuprins ntre 31 i 50.
7) S se fac un program care s afieze pe ecran suma a dou numere ntregi, de maxim 100 de cifre, citite din fiierul
termeni.int.
7) Se citesc dou numere naturale ca iruri de caractere, avnd lungimea maxim de 25. S se afieze produsul
numerelor sau un mesaj de eroare dac datele de intrare sunt eronate. Datele de intrare pot fi citite de la tastatur sau
din fiierul de tip text INT.INP care conine dou linii, cte un numr pe linie. Datele de ieire pot fi afiate pe ecran sau
scrise n fiierul de tip text IES.OUT, precizndu-se produsul obinut.
Exemplu: dac numerele citite sunt: 13478654 54390123 se va afia produsul 733105648934442.
7) Se citete un numr natural foarte mare, de maxim 50 cifre. Verificai dac este palindrom afind un mesaj
corespunztor.

67

Problema 1
var a: array [1..40] of byte; i,k,p,j: integer;
begin
{se initializeaza a[i] cu 0, de la 1 la 39 si a[40] cu 1}
for i:=1 to 39 do a[i]:=0; a[40]:=1;
for i:=1 to 50 do begin
{i =exponentul puterii lui 2}
p:=0;
{p=cifra zecilor care va fi adunata la componenta urmatoare}
for j:=40 downto 1 do begin
a[j]:=a[j]*2+p; if a[j]>10 then begin a[j]:=a[j]-10; p:=1 end;
else p:=0;
end;
if i>30 then begin k:=1;
repeat
{nu afisez zerourile din fata numarului}
if a[k]=0 then inc(k);
until a[k]<>0;
write(2,^,i,=);
for j:=k to 40 do write(a[j]);
writeln;
end;
end;
end.
Modelarea unor relaii
1)

Numim celebritate o persoan care este cunoscut de toat lumea, dar nu cunoate pe nimeni. Se pune
problema de a identifica o celebritate, dac exist, ntr-un grup de n persoane pentru care se cunosc relaiile dintre
persoane.
2)
Pe o matrice de m linii i n coloane, fie o populaie de virui care evolueaz astfel: un virus moare izolat cnd
are mai puin de 2 vecini i sufocat cnd are mai mult de 3 vecini; un virus apare pe un loc liber dac are 2 sau 3 vecini;
un virus triete 3 generaii dac are condiii prielnice de mediu. Virusul de generaie i se codific prin i, cu 1<=i<=3.
Inexistena virusului se codific prin 0. S se afieze configuraia populaiei de virui dup g generaii. Observaie: un
virus poate avea cel mult 4 vecini: N, S, E, V. Datele de intrare se citesc din fiierul virus. inp cu urmtoarea structur:
m n g
a[1,1] a[1,2] a[1,n]
a[2,1] a[2,2] a[2,n]

a[m,1] a[m,2] a[m,n]


Datele de ieire se trec n fiierul virus.out. Exemplu:
Virus.inp
3
3
2
2 1 0
2 2 3
0 1 3

Virus.out
0 3 0
0 1 0
2 0 0

(CNI, Piatra Neam, clasa a VIII-a, 2001)


3) La un simpozion particip n persoane. Unele persoane cunosc alte persoane din sal, altele nu. Calculatorul care
monitorizeaz reuniunea trebuie s comunice care este cea mai cunoscut persoan. Pentru aceasta persoanele
se numeroteaz de la 1 la n i se introduc n calculator perechi de forma i, j care semnific faptul c persoana i
cunoate persoana j, pn la marcajul de sfrit de fiier.
Problema 1
var r: array[1..50,1..50] of byte; {r[i,j]= 0 sau 1 dupa cum i nu cunoaste sau cunoaste pe j}

68

i,j,n,cl,cc: byte; celebr: boolean;


begin
write(numar persoane=); read(n); celebr:=false; writeln(introduceti relatiile dintre persoane);
for i:=1 to n do
for j:=1 to n do
if i=j then a[i,i]=1
else begin writeln(persoana ,i, cunoaste sau nu persoana ,j,?(1 sau 0)); read(p[i,j]); end;
for i:=1 to n do
begin
cl:=0; cc:=0;
{cl=numarul de 0 pe linia i, cc=numarul de 1 de pe coloana i}
for j:=1 to n do begin
if p[i,j]=0 then inc(cl);
if p[j,i]=1 then inc(cc);
end;
if (cl=1) and (cc=n) then begin writeln(persoana ,i, este o celebritate); celebr:=true end;
end;
if not celebr then writeln(nu exista celebritate);
end.

Determinarea unor secvene maximale


1) ntr-un text de maxim 255 caractere, s se afieze cea mai lung secven de caractere identice. Dac sunt mai multe
secvene, se va afia prima. Exemplu: text: aabsssdadaaab se va afia sss.
2) Se consider un ir de maxim 255 litere c1, c2, , cn nu neaprat distincte, din alfabetul englez. Cerine: a) s se
determine poziia p i lungimea l a secvenei maxime format din litere consecutive egale din irul dat (1<=p, 1<=n); b)
s se determine literele distincte i frecvena lor de apariie n irul iniial; c) din irul literelor distincte de la punctul b), s
se afieze cte posibiliti de aranjare a 3 litere diferite sunt. Date de intrare se citesc din fiierul olimp71.inp ce are
urmtoarea structur: n c1 c2 cn. Datele de ieire sw vor afia pe ecran. Exemplu: olimp71.inp 6 abbacx, se va
afia a) p=2 l=2 b) a b c x 2 2 1 1 c) 24
(CNI,
Piatra-Neam, clasa a VII-a, 2001)
Problema 1
var text: string; lc,lmax,poz,i: byte;
begin
write(text:); readln(text);
lc:=1; lmax:=1; poz:=1;
{lc=lungimea curenta a secventei de caractere egale, lmax=lungime
maxima, poz=pozitia pimului caracter din secventa solutie}
for i:= 1 to length(text)-1 do if text[i]=text[i+1] then inc(lc)
else begin
if lc>lmax then begin lmax:=lc; poz:=i+1-lmax; end;
lc:=1;
end;
if lc>lmax then begin lmax:=lc; poz:=i+1-lmax; end; {test pt. ultima secventa}
writeln(cea mai lunga secventa:); for i:= 1 to lmax do write(text[poz]);
end.

69

Probleme de geometrie
1) Din fiierul dreptunghi.int se citesc coordonatele capetelor diagonalei unui dreptunghi cu laturile paralele cu axele de
coordonate.. Scriei n fiierul puncte.out cte puncte de coordonate ntregi sunt n interiorul sau pe laturile
dreptunghiului. Exemplu:
fiierul dreptunghi.int:
-2.5 3
fiierul puncte.out
4 -1.75
35
2) Cte puncte cu coordonate ntregi sunt continute ntr-o sfer de raz R cu centrul n originea sistemului de cooronate?
Se consider c R este un numr natural, R<=30. Amintim c distana dintre un punct cu coordonatele (x,y,z) i originea
sistemului de coordonate se determin dup formula d=sqrt(x*x+y*y+z*z). Exemplu: pentru R=4, programul va afia
257. (ORI, Moldova, clasele VI-IX, 2001)
3) Se citesc de la tastatur trei numere reale pozitive, care reprezint lungimile laturilor unui triunghi. Scriei un program
care s determine aria i lungimile nlimilor triunghiului. Specificai i natura acestui triunghi: echilateral, isoscel,
dreptunghic, dreptunghic isoscel sau oarecare.
4) Se dau n puncte n plan p1, p2, , pn prin coordonatele lor carteziene i un dreptunghi cu laturile paralele cu axele prin
coordonatele colului din stnga sus i colului din dreapta jos. Cerin: determinai numrul de puncte dintre p1, p2, ,
pn care sunt n interiorul dreptunghiului, respectiv numrul de puncte de pe cele dou diagonale. Date de intrare: n
fiierul puncte.in pe prima linie se afl n, pe urmtoarele n linii coordonatele punctelor p1, p2, pn separate printr-un
spaiu, iar pe urmtoarele dou linii se afl coordonatele colurilor dreptunghiului. Date de ieire: n fiierul text
puncte.out se vor scrie numerele cerute cu un spaiu ntre ele. Restricii: 0<n<100, coordonatele sunt numere naturale <
3000. Exemplu:
Puncte.in
puncte.out
8
5 4
34
24
56
51
42
06
22
32
15
51
(CNI, Satu-Mare, clasa a VIII-a, 2003)
5) n curtea din spatele casei unui gospodar triau nestingherite mai multe familii de furnicue, organizate n mai multe
muuroaie. Una dintre furnicue l aude ntr-o zi pe gospodar spunndu-i soiei sale c vrea s amplaseze un obiect
chiar n zona n care se aflau muuroaiele. Furnicua le anun i pe celelalte, ns netiind s aprecieze exact unde va
fi amplasat acel obiect, furnicuele au nevoie de ajutorul vostru. Dac afl care din muuroaie se afl n pericol, ele se
pot adposti fr grij n cele care sunt n siguran. Cunoscndu-se numrul de puncte (muuroaie) M, coordonatele x
i y ale celor M puncte prin numrul vrfurilor poligonului (obiectului) i coordonatele vrfurilor, determinai muuroaiele
care sunt n pericol s fie distruse de obiectul care va fi amplasat de gospodar. Date de intrare: Fiierul de intrare
furnici.in conine pe prima linie un numr ntreg pozitiv M, care reprezint numrul de muuroaie. Pe urmtoarele M linii
se gsesc cte dou numere ntregi pozitive, separate printr-un singur spaiu, care reprezint coordonatele punctelor
(muuroaielor). Urmtoarea linie conine un singur numr ntreg pozitiv N care reprezint numrul de vrfuri ale
poligonului. Cele N linii care urmeaz conin cte dou numere ntregi pozitive, separate prin cte un spaiu, care
reprezint coordonatele pentru vrfurile poligonului. Poligonul poate fi convex sau concav. Date de ieire: Fiierul de
ieire furnici.out va conine M linii. Pe fiecare dintre acestea se va scrie unul dintre mesajele "in siguranta!" sau "in
pericol" dac muuroaiele de furnici din fiierul de intrare se gsesc n exteriorul, respectiv n interiorul poligonului.
Punctele corespunztoare muuroaielor vor fi tratate n ordinea n care apar n fiierul de intrare. Restricii i precizri:
furnici.out
se consider c un muuroi este n pericol atunci cnd coordonatele
sale sunt coninute n interiorul poligonului sau
cnd muuroiul se gsete pe una dintre laturile acestuia;3 <N <50;
in 1siguranta!
<M <100.

Exemplu
in pericol!
furnici.in
in siguranta!
5
in siguranta!

70

in pericol

80 100
400 170
230 160
340 347
230 350
6
100 165
380 200
400 140
520 350
395 310
220 360
(ginfo ian. 2004)
6) Introducei n calculator coordonatele, abscisa i ordonata, a n puncte astfel nct s nu existe patru puncte coliniare.
Determinai numrul de paralelograme care se pot forma unind cte patru din aceste puncte. Datele de intrare se citesc
din fiierul puncte.int care va avea pe prima linie numrul n i pe urmtoarele n linii coordonatele punctelor separate
prin spaiu. Afiarea rezultatului se va face pe ecran. Exemplu:
puncte.int
7
22
33
54
16
82
71
65

pe ecran
6

7) Se dau n puncte n plan prin coordonatele lor (numere naturale mai mici sau egale cu 50). S se determine centrul i
raza unui cerc care s conin toate punctele date n interior sau pe circumferin, avnd centrul n unul din punctele
introduse.
8) S se calculeze aria unui poligon convex A1, A2,, An (3<=n<=100) dat prin coordonatele vrfurilor sale, numere
naturale mai mici dect 50. Indicaie: se va descompune poligonul in triunghiuri de forma A1AiAi+1.
9) Se dau n, n>=3, puncte n plan prin coordonatele lor numere ntregi din intervalul [0,500]. S se afieze numrul de
triunghiuri isoscele care se pot forma unind cte trei din cele n puncte.
10) Se dau n, n>=3, puncte ]n plan prin coordonatele lor, numere ntregi mai mici dect 50. S se afieze tripletele de
coordonate ale punctelor care determin triunghiuri de arie maxim.
11) Se dau n, n >=4, puncte n plan prin coordonatele i culoarea lor (numere naturale mai mici sau egale cu 50). S se
afieze coordonatele vrfurilor dreptunghiurilor cu laturile paralele cu axele ale cror vrfuri au aceeai culoare.
12) Se d un dreptunghi prin coordonatele vrfurilor sus-stnga i jos-dreapta, i n puncte n plan prin coordonatele lor
numere naturale mai mici dect 500. Se cere s se determine numrul de puncte care se afl n interiorul
dreptunghiului, pe dreptunghi i n exteriorul lui.

71

IX.

UTILIZAREA SUBPROGRAMELOR

Proceduri
1) Pentru citirea a n date de forma nume elev, nota1, nota2, nota3 i pentru calculul mediei fiecrui elev, s se scrie
procedura Citire. S se realizeze urmtorul cap de tabel ntr-o procedur Tabel:
***************************
* Nume elev
* Medie *
***************************
i s se afieze rezultate printr-o procedur
Scriere. S se modifice procedura Tabel astfel nct s permit realizarea capului de tabel utiliznd n locul * un alt
caracter, citit de la tastatur n programul principal.
2) S se ordoneze cresctor irul format din n nume de elevi folosind o procedur cu doi parametrii, de interschimbare a
valorilor.
3) S se listeze primele n numere prime, verificnd calitatea de prim a unui numr ntr-o procedur cu un parametru.
4) Se introduc numrtorul i numitorul a dou fracii. S se afieze cele dou fracii i suma lor sub forma ireductibil. Se
va folosi o procedur cu doi parametrii, de simplificare a unei fracii.
5) Se introduc n date de forma nume elev, punctaj. Uiliznd procedura Meniu s se afieze un meniu de forma
1. Afisare in ordine alfabetica
2. Afisare in ordinea descrescatoare a punctajelor
prin care utilizatorul poate alege modul de vizualizare al datelor introduse. Afiarea datelor i sortarea lor se va face prin
procedurile Afisare i Sortare.
6) Se introduc dou numere ntregi. S se afieze n cte zerouri se termin produsul lor, fr a calcula produsul. Se va
ine seama c un zero la sfrit se obine nmulind un 2 cu un 5 n descompunere celor dou numere n factori primi.
Se va crea o procedur cu doi parametrii, de determinare a exponentului la care apare un numr prim n
descompunerea n factori primi a unui numr.
7) Se introduc dou numere n i k. Utiliznd o procedur de calculul puterii unui numr, s se afieze n la puterea k.
Problema 1
type elev=record
nume:string[15];
n1,n2,n3:byte;
end;
var e:array[1..100] of elev; s:array[1..100] of real; n:byte;
procedure tabel;
var i:byte;

72

begin
for i:=1 to 30 do write(*); writeln;
writeln(*,Nume elev:15, *,Medie:7, *);
for i:=1 to 30 do write(*); writeln;
end;
procedure citire;
var i:byte;
begin
write(n=); readln(n);
for i:=1 to n do with e[i] do begin readln(nume); readln(n1,n2,n3); s[i]:=(n1+n2+n3)/3 end;
end;
procedure scriere;
var i:byte;
begin
for i:=1 to n do writeln(*,e[i].nume:15, *,s[i]:4:2, *);
end;
begin
citire; tabel; scriere;
end.
Problema 2
type data=record
nume:string;
puncte:byte
end;
var x:array[1..100] of data; I,n,a:byte;
procedure meniu;
begin
writeln(1.Afisare in ordine alfabetica);
writeln(2.Afisare in ordinea descrescatoare a punctajelor);
end;
procedure sortare;
var sort:boolean; v:data;
begin
repeat
sort:=true;
for i:=1 to n-1 do
if ((x[i].puncte<x[i+1].puncte) and (a=2)) or ((x[i].nume>x[i+1].nume) and (a=1)) then
begin
v:=x[i]; x[i]:=x[i+1];x[i+1]:=v;
sort:=false;
end;
until sort;
end;
procedure afisare;
begin
writeln(Nume elev:20, punctaj:15);
for i:=1 to n do writeln(x[i].nume:20, x[i].puncte:15);
end;
begin
write(n=); readln(n);
for i:=1 to n do begin readln(x[i].nume);readln(x[i].puncte) end;
meniu; writeln(Alege 1 sau 2 );
sortare; afisare;

73

end.
Funcii
1) S se verifice dac numele a k elevi se afl ntr-un ir de n nume, utiliznd o funcie Cautare.
2) Citii un ir de n numere ntregi i afiai cea mai mare cifr a numerelor de pe poziii pare i cea mai mic cifr a celor
de pe poziii impare. Se va realiza cte o funcie pentru determinarea cifrei maximale i a celei minimale.

X.

FIIERE TIP TEXT

1) S se determine i s se afieze numrul de linii dintr-un fiier tip text i numrul de caractere de pe fiecare
linie.
2) S se verifice dac ntr-un fiier tip text sunt linii albe, care conin numai caracterele spaiu i TAB
3) S se afieze pe ecran un fiier text, linie cu linie.
4) S se transfere coninutul unui fiier tip text ntr-un alt fiier tip text, sub aceeai form.
7) S se fac un top al melodiilor (vezi problema 1 din Capitolul IX, Tipul nregistrare) utiliznd un fiier pentru citirea
titlului, a interpretului i a punctajului acumulat. Punctajul sptmnal obinut se va citi de la tastatur. Afiarea topului
se va face pe ecran. Se va actualiza cmpul puntaj acumulat din fiierul de intrare.
Hhhhh
Problema 1
Var x:char; c:integer; f:text;
Begin
Assign(f,date.int); reset(f);
C:=0;
Repeat
While not eoln(f) do begin read(f,x); write(x) end;
Inc(c); readln(f); writeln;
Until eof(f);
Writeln(c, linii);
Close(f);
end.

74

XI.

PREGATIRE PENTRU FAZA NATIONALA A ONI SI CNI


Clasa a V-a

1)

n Orintia, exist o floare care face strict x semine . Fiecare smn este fertil i n decurs de un an, din ea se
dezvolt cte o floare care va face alte x semine fertile. Dup k ani, florile orintiene dispar, dar rmn urmaele lor.
Grdinarul Perolino, pe care l intereseaz cte flori vor fi n grdina lui dup z ani, tiind c n primul an au fost f flori de
tipul amintit, v roag s l ajutai la numrarea florilor. Date de intrare
f: numrul iniial de flori
x : numrul de semine
produse de fiecare floare
k : durata de
via a unei flori
z : anul
n care grdinarul face recensmntul
Date de ieire :
t : numrul de flori aflate n grdin la sfritul anului z. Restricii:1<=f<=10, 1<=x<=6, 1<=k<=5, 1<z<5. Exemplu: Intrri
f=1 x=2 k=3 z=3 Ieire 8 flori.
Explicaie:
anul 1 1 floare 2 semine
anul 2 3 flori 6 semine
anul 3 8 flori (3 + 6 1)
(CNI, clasa a V-a, SatuMare, 2004)
2) Nicu are N dischete cu aceeai capacitate 1400 Ko. Dischetele sunt numerotate cu 1, 2, , N i pe fiecare dischet are
o poriune din ea ocupat cu diverse fiiere. Dischetele 1, 2, , N au ocupate o1, o2, , oN Ko fiecare. Nicu afl c
prietenul su George are un joc frumos de dimensiune x Ko. Dup multe negocieri cu George, Nicu are acceptul de a
copia jocul.
Cerin: Din cele N dischete alegei ct mai puine pentru a copia jocul (dac este posibil). Cnd nu este posibil afiai
mesajul Nu se poate copia jocul!
(CNI Satu-Mare 2003 clasa a V-a)
3) Afiai primele dou numere prime alturate dintre cele n numere ntregi date.
Cnd acestea nu exist, afiai mesajul: fr soluie ( n<= 20). Exemplu:
Pentru n=7 i numerele 1 18 41 13 9 7 5
se va afia perechea 41 13
pentru n=6 i numerele 2 8 7 2 5 4
se va afia perechea 7 2
pentru n=5 i numerele 4 12 8 5 4
se va afia mesajul fr soluie
(CNI Satu-Mare 2002 clasa a V-a)
4) Pentru un n natural dat, sa se determine toate numerele prime mai mici sau egale cu n pentru care oglinditul
corespunztor este tot un numr prim (n<100). Exemplu: n=20, printre numerele gsite sunt i 13, cu oglinditul 31, i 17,
cu oglinditul 71.
(CNI Piatra-Neam 2001, clasa a V-a)
5) Un schior i dorete un traseu care s conin cel puin un pisc (vrf) i cel puin o vale. Dac traseul este caracterizat
(ca altitudini relative) de cifrele componente ale unui numr dat, ajutai-l s stabileasc dac l parcurge sau nu.

75

6)

7)
8)
9)

10)

11)

12)

13)

14)

15)

Exemplu: traseul 5745 poate fi parcurs, traseele 123 i 68556 nu pot fi parcurse.
(CNI Piatra-Neam 2001, clasa a V-a)
Se consider un ir cu n numere naturale mai mici dect 32000, n < 30. Se cere:
a) s se afieze un numr din ir
care are n scrierea sa ct mai multe cifre distincte. Dac exist mai multe numere cu aceast proprietate se va afia
primul element dintre ele. b) s se determine o succesiune cu numr maxim de componente din ir care are proprietatea
c fiecare component a succesiunii are acelai numr de cifre distincte n scrierea sa.
Exemplu: pentru n=9 i
irul 865, 15, 144, 231, 1591, 1998, 6235, 14, 4201se va afia a) 6235 b) 231 1591 1998
(CNI 1998 clasa a V-a)
Se citesc n, numr natural mai mic dect 100, i n numere naturale nenule mai mici dect 30000. Se cer: a) ultima cifr
a numrului x[1]+x[2]+...x[n] b) ultima cifr a numrului x[1] x[2]+x[3]+...x[n] Exemplu: pentru n=3 i numerele 11 4 3
se va afia a) 8 b) 1
(CNI 1998 clasa a V-a)
Se dau patru numere naturale a, b, c, d. S se afieze sub form de fracie ireductibil cea mai mic fracie subunitar i
cea mai mic fracie supraunitar folosind cele patru numere. Exemplu: pentru a=2 b=5 c=6 d=16 se vor afia fraciile
1/8 i 6/5
(CNI Sinaia 1997 clasa a V-a)
Se consider n stlpi de nlimi h[1], h[2], h[3]... h[n] metri. La baza fiecrui stlp se afl cte un melc codificat prin
numrul stlpului. Fiecare melc i urc ziua p[i] metri i coboar noaptea q[i] metri (p[i]>=q[i]). S se afieze melcii n
ordinea n care ating vrfurile stlpilor. Exemplu: pentru n=3 i h[1]=2 p[1]=1 q[1]=0, h[2]=4 p[2]=4 q[2]=4, h[3]=5 p[3]=1
q[3]=0 se va afia 2 1 3.
(CNI Sinaia 1997 clasa a V-a)
Fie A un ir de n numere naturale, 8<=n<=256, i p un numr natural dat. a) s se precizeze dac p este numr prim
b) s se afieze de cte ori apare p n A i pe ce poziii
c) dac numrul p nu apare n A, s se nsereze
numrul p pe o poziie k, 1<=k<=n, unde k este dat de la tastatur, deplasnd spre dreapta elementele aflate pe
poziiile k+j, 0<=j<=n-k+1.
(CNI Buteni 1994 clasa a V-a)
De la tastatur se citesc n elemente ale unui ir de numere. S se scrie un program care interschimb dou secvene
de lungimi l1 i l2 care ncep din poziiile p1, reapectiv p2. Elementele care nu sunt cuprinse n cele dou secvene pot fi
mutate astfel nct interschimbarea s se poat face. Exemplu: pentru n=9, irul 1,2,3,4,5,6,7,8,9, p1=2 l1=2 p2=6 l2=3,
rezultatul este 1 6 7 8 4 5 2 3 9.
(CNI Nvodari 1993 clasa a V-a)
Dndu-se dou numere n, k s se determine 2*k numere prime situate n centrul listei numerelor prime din intervalul
[1,n], n cazul n care n interval este un numr par de numere prime, i 2*k-1 numere din centrul listei de numere prime,
n cazul n care numrul de numere prime este impar. Dac numrul 2*k ( resp. 2*k-1) este mai mare dect numrul de
numere prime din intervalul considerat, atunci se vor afia toate numerele prime din interval. Restricii: 1<=n<=10000,
1<=k<=30, k<n. Exemplu: n=21 k=2 se va afisa
5 7 11 13
( ONI, clasa a V-a, Focani, 2003)
n fiecare zi nelucrtoare din sptmn Pinochio spune cte o minciun datorit creia nasul acestuia crete cu cte p
cm pe zi. Smbta i duminica, cnd vine bunicul Gepeto acas, pentru a nu-l supra prea tare, Pinochio reuete s
nu spun nici o minciun, ba chiar uitndu-se n oglind observ c n fiecare din aceste zile lungimea nasului su
scade cu cte 1 cm pe zi. Cnd ncepe o nou sptmn, rmnnd singur acas Pinochio continu irul minciunilor.
Care este dimensiunea nasului lui Pinochio dup k zile (zilele ncep cu luni ) tiind c iniial nasul su msura n cm?
Exemplu: pentru n=2 p=1 k=8 se va afia 6 cm.
(ONI 2003 clasa a V-a)
Gigel este un tip ciudat. Lui i place s i impresioneze colegii exprimnd duratele numai n secunde. De exemplu, dac
l vei ntreba ct e ceasul el i va rspunde cte secunde s-au scurs de la ora 0.00 din ziua respectiv. Dac ai s-l
ntrebi ce vrst are, el i va rspunde cte secunde au trecut de cnd s-a nscut.
Colegii lui Gigel au hotrt c nu e cazul s se lase impresionai; ca urmare au nevoie de un program care s
citeasc de la tastatur un numr natural N (N2000000000) care reprezint vrsta lui Gigel exprimat n secunde i
care va afia pe ecran ci ani, cte luni i cte zile are Gigel (orele i minutele rmase sunt considerate
nesemnificative). Scriei acest program pentru colegii lui Gigel!
Nu uitai c anii biseci sunt cei divizibili cu 4, dar nedivizibili cu 100 sau divizibili cu 400. De exemplu 1992 i 2000
au fost ani biseci. Dar anul 1900 nu a fost bisect. Anii biseci au 366 de zile, spre deosebire de ceilali care au doar 365.
Considerm c ne aflm n ultima zi de coal (15 iunie 2002).
Exemplu :Pentru N=69206400 programul va afia :Gigel are 2 ani, 2 luni si 10 zile.
(ONI Glciuc 2002 clasa a V-a)
Fie un numr p (1p4) dat de la tastatur. S se scrie pe ecran toate numerele n de p cifre cu proprietile urmtoare:
1) n-1 i n+1 sunt numere prime 2) suma cifrelor lui n este tot un numr prim. De exemplu, pentru p=2, numrul n=12

76

face parte din soluie deoarece n-1=11, n+1=13 sunt prime iar suma cifrelor lui n este 1+2=3, tot un numar prim. Dac
nu exist nici un numr n cu p cifre care s verifice aceste proprieti, se va da un mesaj.
(Marele Premiu PACO, 2001)
16) Copa bate la poarta Orintiei, dar poarta e programat s nu se deschid dect dup ce se introduc, ntr-o caset cu s
spaii (3<=s<=10), s cifre strigate de portar. Portarul a strigat 1, Copa a butonat 1, n primul spaiu de la stnga la
dreapta. Portarul a strigat 0, i n timp ce Copa butona 0 n spaiul al doilea, 1 a devenit 2 n spaiul anterior. Portarul a
strigat 7. Copa scria 7 n spaiul al treilea, iar n primul spaiu 2 devine 3, iar n al doilea spaiu 0 devine 1. i tot aa,
pn la al s-lea spaiu, cnd Copa reuete s scrie toate cifrele i apare tot codul. i poarta se deschide, dar
surpriz, mai era o poart, iar codul acesteia, N, era cel mai mic numr format din ct mai multe dintre cifrele codului
anterior, astfel nct nici o cifr s nu se repete. Obs.: Dup 9 urmeaz 0. Disperat de atta informatizare, Copa v cere
sprijinul s calculai cel de-al doilea cod N. Exemplu: Date de intrare
s=10 cifre strigate de portar: 1 0 7 9 7
3 6 9 4 6 Date de ieire 102456789
(ONI Focani
2003 clasa a V-a )
Clasa a VI-a
1) Doi copii vopsesc un gard din scnduri pe care le vom numerota de la 1 la n astfel: primul ia o cutie de vopsea roie cu
care vopsete scndurile cu numrul p, 2p, 3p, etc. Al doilea procedeaz la fel, ncepe de la acelai capt al gardului
dar ia o cutie de vopsea albastr i vopsete din q n q scnduri. Astfel, cnd vor termina de vopsit, gardul va avea
multe scnduri nevopsite, unele scnduri vopsite n rou, altele n albastru, iar altele n violet. Cunoscnd numerele n, p
i q afiai: a) cte scnduri rmn nevopsite b) cte scnduri sunt vopsite n rou c) cte scnduri sunt vopsite n
albastru d) cte scnduri sunt vopsite n violet
(ONI 2002 clasa a VI-a)
2) Se d un vector cu n (1n30) elemente numere naturale, cu maxim 8 cifre. Se cere: a) S se afieze cte elemente din
vector sunt valori-pant (numere care privite de la stnga sau de la dreapta au cifrele n ordine cresctoare, de exemplu
136, 931).
b) S se afieze cea mai mare i cea mai mic valoare-pant i poziiile pe care se afl acestea n vector. Exemplu:
Dac se citete n=6 i elementele 126 9621 1212 3678 9231 9621 , programul va afia: numar valori-panta= 4
cea mai mare valoare-panta=9621 pe pozitiile 2 6 cea mai mica valoare-panta=126 pe pozitiile 1.
(ONI 2003 clasa VI-a)
3) Fratele cel mic al lui Gigel primise de la Mo Crciun un joc de cuburi colorate. Gigel l-ar fi nsoit pe cel mic la joc, mai
ales cnd acesta nira cele n cuburi unul dup altul, iar lui i treceau prin cap tot felul de cerine pe care profesorul lui
de informatic le-ar fi putut scorni: a. s vedem cte culori sunt n total; b. care culoare este folosit pentru cele mai
multe cuburi; c. ce cub ar trebui scos din ir astfel nct s se formeze din cuburile rmase un ir ct mai lung de cuburi
alturate de aceeai culoare.
Se citesc de la tastatur n, numrul de cuburi, n<50, i o succesiune de n numere de culori, de la 1 la 10. Dac la
cerinele a, b, c sunt mai multe soluii, se vor preciza toate. Exemplu: n=15 culorile 5 2 5 2 2 3 3 2 3 5 3 3 3 2 2 se va
afia a. 3 b. 2 3 c. Pozitia 10.
(ONI Focani 2003 clasa a VI-a)
4) Profesorul de sport al clasei a VI-a B de la o coal din Focani vrea la nceputul orei s aeze elevii pe terenul de sport,
la raport, ntr-o anumit ordine. Pentru acest lucru, elevii sunt bine instruii, astfel nct, aeznd pe ultimul rnd n elevi,
celelalte rnduri de elevi se creeaz singure dup regula: - pe poziia i a unui rnd se va aeza un elev, dup cum
urmeaz: dac pe rndul din spate, pe poziiile i i i+1 stau fie numai biei, fie numai fete, atunci se va aeza o fat, iar
dac pe aceste poziii stau elevi de sex opus, se va aeza un biat.
Conform acestei reguli, pe rndul cu numrul de ordine i (i{1, 2, , n}) se vor aeza i elevi. Numrul de elevi din clas
este n(n+1)/2.
Cerin: Pentru n dat i un ir de n numere 0 i 1 (0 reprezint codificarea pentru o fat, iar 1 pentru un biat), care
reprezint irul de elevi de pe ultimul rnd, se cere s se determine numrul de biei din clas.
Date de intrare: De la tastatur se citesc datele de pe dou linii: pe prima linie n, pe linia a doua un ir de n numere
0 i 1, separate printr-un spaiu ce reprezint irul de elevi de pe ultimul rnd. Date de ieire: Pe ecran se va afia
numrul de biei din clas. Restricii: 1 n 20.
Exemplu: Pentru datele de intrare: 5 1 0 0 1 1 se va afia: 8
(ONI Focani 2003 clasa a VI-a)
5) Gigel a primit spre pstrare un set de n cutii de greuti nu neaprat distincte. El a cntrit cutiile i pentru fiecare
greutate distinct a notat pe o foaie, n ordine cresctoare a greutilor, numrul de cutii cu greutatea respectiv.

77

Deoarece fratele su mai mic avea prostul obicei s se joace cu numerele scrise de el pe foaie, Gigel s-a gndit s
calculeze un numr de control dup urmtorul algoritm: ncepnd de la primul numr a grupat numerele de apariii ale
greutilor cte trei (dac i rmn numere negrupate la sfrit, le ignor). Dac ntr-un grup sunt numai numere pare
sau numai impare noteaz grupul cu cifra 1, altfel l noteaz cu cifra 0. Din irul astfel obinut, se formeaz un numr
care are ca valoare cifra zecilor egal cu numrul de valori 1 i cifra unitilor egal cu numrul de valori 0, obinndu-se
astfel numrul de control.
Cerin: Citind greutile cutiilor, s se determine numrul de control i s se verifice dac este numr prim. Date de
intrare: Se citete de la tastatur numrul n urmat de greutile cutiilor. Date de ieire:Se va scrie pe ecran numrul de
control, urmat de valoarea 0 sau 1 pe linia urmtoare. Pe urmtoarea linie se va afia 1 dac numrul este prim,
respectiv 0 n caz contrar.
Restricii:1 n 100. Fiecare greutate este un numr natural, mai mic sau egal cu 200
Exemplu: Date de intrare n=21 1 3 2 6 2 6 2 8 9 8 8 9 10 8 11 18 11 12 14 15 17
Date de ieire 31 1. Explicaie: Dup ordonare se obine irul: 1 2 2 2 3 6 6 8 8 8 8 9 9 10 11 11 12 14 15 1 18. Se
obine apoi: 1 3 1 2 4 2 1 2 1 1 1 1 1 care grupate cate trei dau valorile 1 1 0 1, din care se obine numrul de control 31,
care este numr prim.
(OJI 2004 clasa a VI-a)
6) Vntorul ef al regelui Arthur a primit nsrcinare s vneze primele rae ce se ntorc din rile calde. Regele fiind un tip
cu idei fixe, i-a cerut vntorului s vneze raele albe cu sgei albe, iar raele negre cu sgei negre. Raele vin n
rnduri (stoluri) din ce n ce mai mari: mai nti una, apoi dou, trei, cinci, opt, treisprezece, .a.m.d. Se observ c
numrul de rae dintr-un rnd este egal cu numrul de rae de pe cele dou rnduri anterioare. Raele fiind nite creaturi
ordonate zboar n rnduri, n care nu vei putea gsi dou rae de aceeai culoare alturate, fiecare rnd ncepnd cu o
ra alb.
Vntorul tie c dac a nceput s doboare o ra, trebuie s le doboare pe toate de pe rndul acesteia, deoarece
supravieuitoarele vor alerta celelalte rae i ele nu se vor mai ntoarce niciodat, iar vntorul nostru i va pierde
slujba.Cerin: tiind c vntorul a primit ka sgei albe i kb sgei negre, trebuie s determinai cte rnduri de rae a
dobort i cte sgei de fiecare tip i-au rmas, tiind c el vrea s-i pstreze slujba. Date de intrare: Se citesc de la
tastatur numerele ka i kb (n aceast ordine). Date de ieire: Se va afia pe ecran:
- numrul de rnduri doborte
- numrul de sgei albe rmase
- numrul de sgei negre rmase.
Restricii: 0ka, kb2.000.000.000 Exemplu: Pentru ka=9 i kb=10 Se va afia: 4 2 6. Explicaie: Pentru exemplu
avem rndurile (A- ra alb, N- ra neagr) de rae:
A
AN
ANA
ANANA
(CJI 2004 clasa a VI-a)
7)S se genereze dou iruri A i B de numere naturale, elementele lui A s fie cuprinse ntre 0 i 99, iar ale lui B ntre 1 i
999. Cele dou iruri au acelai numr de elemente, specificat de la tastatur. S se genereze un ir C dup
urmtoarea regul: C[i]=A[i]-B[i], dac A[i] este par i B[i] impar, C[i]=A[i]+B[i], dac A[i] este impar i B[i] par,
C[i]=A[i]*B[i], dac A[i] i B[i] sunt ambele fie pare, fie impare. S se afieze cte patru elemente pe un rnd, elementele
irului A, ale irului B i apoi ale lui C.
(CNI 1987 clasa a VI-a)
8) O coal are maxim 7 serii de clase a VI-a, notate A, B, C, D, E, F. S se scrie un program care s genereze o
planificare a ntlnirilor sportive ntre aceste clase, astfel nct fiecare s se ntlneasc o singur dat cu alt clas.
ntlnirile au loc zilnic, cte una n fiecare zi, cu excepia duminicilor. Programarea ntlnirilor ncepe cu ziua de miercuri,
1 iunie 1988 i arat astfel:
miercuri
1 iunie
VI A VI B
joi
2 iunie
VI A VI C
...................................................
(CNI 1988 clasa a VI-a)
9)Se d un vector de numere naturale mai mici dect 101 i un numr natural a. S se nsereze ntre dou componente
vecine, a cror diferen n valoare absolut este mai mare sau egal cu a, media lor aritmetic, pentru ca n final s
rezulte un vector n care diferena absolut dintre dou elemente este mai mic dect a.
(CNI Nvodari 1989 clasa a VII-a)
10) Fie un ir de n fracii (1n5) de forma a[i]/b[i], 1in) cu 0a[i]255, 1b[i]8.
a) S se simplifice fracia de pe poziia k, k dat de la tastatur.

78

b) S se calculeze suma fraciilor avnd ca rezultat fracia ireductibil p/q.


c) S se calculeze ct la sut reprezint numrul q din suma p+q
(CNI Buteni 1994 clasa a VI-a)
11) Pe o tij se afl n discuri avnd diametre diferite, 1<= n<=100. Se cere aranjarea lor n ordinea descresctoare a
diametrelor de jos n sus. n scopul aranjrii n ordinea cerut se poate efectua un singur tip de operaie: cu ajutorul
unei cleme se prind un numr oarecare k de discuri,2<k, ncepnd cu cel mai de sus se scot de pe tij i se ntorc,
introducndu-le din nou pe tij. Date de intrare: n= numar discuri, a1,a2..,an=diametrele discurilor,1<=ai<=999. Date de
ieire: fiecare schimbare const din dou linii de forma k=numrul discurilor prinse i x1,x2,,xn=noua configuraie a
tijei. Exemplu: n=5 diametrele 5 3 2 1 4 se va afia k=4 5 4 1 2 3 k=3 5 4 3 2 1.
(CNI Sinaia 1996 clasa a VI-a)
12) Se consider un numr n de copii care poart tricouri de baschet ce au pe spate imprimate un numr de la 1 la n. Ei
joac urmtorul joc: se aeaz pe un cerc ntr-o ordine oarecare toi cei n copii; profesorul, pornind de la un elev ncepe
s numere k elevi, cel de-al k-lea fiind eliminat din cerc; de la urmtorul dup cel eliminat continu numrtoarea pn
la k, eliminndu-l pe cel la care s-a oprit numrtoarea, .a.m.d.
Cunoscndu-se numerele n i k (n,k<=50), s se determineordinea n care se aflau iniial dispui copiii pe cerc, astfel
nct acetia s fie eliminai n ordinea 1,2,,n. Se va afia pe o linie numrul de ordine al juctorilor situai iniial pe
cerc ncepnd cu numrul 1. Exemplu: date de intrare: n=5 k=2 Date de ieire: 1 5 2 4 3.
(CNI Sinaia 1997 clasa a VI-a)
13) n vacan Gigel a uitat tehnica de nmulire a dou numere. Ca s-l ajute, bunica l-a nvat o metod veche: Dac a i
b sunt cele dou numere care trebuie nmulite, le vom scrie unul lng altul i vom forma sub fiecare cte o coloan
conform urmtoarelor reguli:
1) sub a se acrie partea
ntreag a lui a/2, iar sub b se scrie 2*b
2) se aplic pasul 1) pn cnd
numrul de pe coloana lui a este 1
3) produsul se obine adunnd
numerele din coloana lui b care corespund, pe linie, unor numere impare din coloana lui a. Exemplu: a=45, b=19,
a

b
45

produs
19
19+
22
38
11

76
5

76
152
2

152
304
1

608

608
===

855
(CNI Piatra-Neam 2001 clasa a VI-a)
14) Nicu merge la Metro s-i cumpere rechizite colare. Pe fiecare obiect cumprat se afl un cod de produs alctuit din
cel mult 10 liniue verticale. Pentru fiecare cod Nicu asociaz un numr de cod astfel: pentru fiecare liniu asociaz o
cifr, lungimea liniuei. n acest mod fiecare obiect are asociat un numr natural. Cerin: Pentru cele n obiecte
cumprate i date prin numrul de cod se cere s se afieze cte numere palindroame exist cu proprietile: sunt mai
mici strict dect cel mai mare numr de cod, nu sunt printre numerele de cod date. Restricii: 0<n<26, cel mai mare
numr de cod este mai mic dect 3001. Exemplu: pentru n=7 i numerele de cod 8 20 22 44 108 55 88 se va afia
15 (deoarece avem urmtoarele numere palindroame: 0 1 2 3 4 5 6 7 9 11 33 66 77 99 101).
(CNI Satu-Mare
2003 clasa a VI-a)
15) La concursul Mititelu Gates, pentru buna desfurare a competiiei este necesar o suma dat S; n acest scop s-a
creat o list de n (n<1000) persoane care pot i vor s sponsorizere acest eveniment. Fiecare din cele n persoane a
confirmat participarea i suma oferit. Determinai valorile selectate pentru sponsorizarea concursului, tiind c numrul
persoanelor trebuie s fie minim i suma total s acopere cheltuielile.(unitatea de msur este milionul)
Exemplul 1 : N=8 S=30
2.5 3 2 5 15 7 4 1 Se va afia: 15 7 5 3
Exemplul 2 : N=7 S=37
5.5 4.5 2 17 2 5.5 10
Se va afia: 17 10 5.5 4.5
16) Un grup de elevi formeaz o coloan care are m rnduri, m15, cu n elevi pe rnd, n6. De pe fiecare rnd este ales
cel mai scund elev, iar dintre alei, cel mai nalt primete un steag. Al doilea steag este repartizat n mod similar, se
alege de pe fiecare rnd cel mai nalt elev, iar dintre alei, cel mai scund. n cazul n care exist mai muli elevi cu
aceeai nlime, se alege primul dintre ei. S se scrie un program care s afieze nlimile purttorilor de steag;
valorile m, n i nlimile elevilor se citesc de la tastatur. Exemplu: m=3 n=4 rndul 1: 120 130 140 150 rndul 2:

79

110 120 130 130 rndul 3: 140 140 150 150 ; primul steag este dat elevului din poziia (3,1), cu nlimea 140, iar al
doilea steag elevului din poziia (2,3), cu nlimea 130.
(CNI 1989 clasa a V-a)
17) ntr-un parc cu castani un copil gsete o zon cu 12 dale, aranjate sub forma unui dreptunghi cu 4 linii i 3 coloane.
Copilul i noteaz numrul de castane de pe fiecare dal, ncepnd cu dala de pe prima linie i prima coloan,
continund linie cu linie (notiele copilului se introduc de la tastatur). El pornete de pe prima dal (unde nu sunt
castane), se poate muta de pe o dal pe alta doar pe linie sau pe coloan. Copilul adun castanele de pe fiecare dal
pe care ajunge i face un numr de k mutri (k citit de la tastatur). Comanda unei mutri de pe o dal pe alta se va
face apsnd pe una dintre tastele A, B, C sau D, unde mutrile posibile sunt definite astfel:
A pe linia anterioar;
B pe coloana urmtoare;
C pe linia urmtoare;
D pe coloana anterioar.
a. Se cere s se afieze cte castane a adunat copilul dup fiecare mutare.
b. Copilul se joac cu cifrele numrului total de castane, obinut la punctul a., conform urmtoarelor exemple:
173 > 11 > 2, 8 > 8, 14 > 5, 97 > 16 > 7, 1989 > 27 > 9
Ce cifr obine copilul la punctul (b.) pentru numrul obinut la punctul (a.), dup mutarea k? Obs.: Copilul nu va primi
comenzi prin care s ias de pe dale.
Exemplu: Pentru urmtoarea repartiie de castane pe dale
0
5
7
3
1
2
10
8
4
6
1
1
i pentru k = 4:
a.
Comenzi de la tastatur:
Rezultat afiat pe ecran
B
5
C
6
B
8
C
12
b.
12 > 3
(CNI Satu-Mare 2002 clasa a VI-a)
18) Marius are o org de lumini de form dreptunghiular cu n linii i m coloane de beculee. Funcionarea orgii este
automat, automodificndu-se o dat la 1 secund simultan toate becurile, dup urmtoarea regul: dac un bec are un
numr par de becuri vecine aprinse (n stnga, dreapta, sus i jos) atunci i schimb starea (dac este aprins se stinge,
iar dac este stins se aprinde), ns dac are un numr impar de becuri vecine aprinse i pstreaz starea. tiind
configuraia iniial a orgii determinai cum va arta orga dup k secunde? Restricii:1<=n,m<=100, 1<=k<=500 Date de
intrare: n m dimensiunile orgii, k timpul de rulare a orgii, n linii, fiecare avnd m elemente separate printr-un spaiu,
reprezentnd strile becurilor. Starea unui bec este data prin 1, daca becul este aprins i 0, daca este stins. Date de
ieire: n linii cu m elemente de 0 i 1 reprezentnd configuraia orgii dup k secunde, elementele fiind separate printr-un
spaiu.
Exemplu: Date de intrare: 4 4 3
1001
1100
0111
0000
Rspuns: 0 1 0 0
1111
0011
1111
Explicaie:
1001
1100
1110
0100
1100 0011
1110
1111

80

0111 1001
1011
0011
0000
1000
1010
1111
Not: Dac un element are 0 becuri vecine aprinse, se consider c are un numr par de becuri vecine aprinse
(CNI Satu-Mare 2004 clasa a VI-a)
19) Se consider un text cu lungimea maxim de 255 caractere. Textul este format din cuvinte separate de cel puin un
spaiu. Se cere s se gseasc cuvintele de lungime maxim i toate literele care se regsesc simultan n toate aceste
cuvinte.
(CNI Nvodari 1992 clasa a V-a)
20) Se citesc dou mulimi M1 i M2 de cuvinte precum i un numr natural k. S se aeze cuvintele mulimii M1 unele sub
altele astfel nct literele lor de pe poziia k s formeze pe vertical un cuvnt din mulimea M2. S se afieze unele sub
altele cuvintele din mulimea M1 dup ce au fost ordonate corespunztor. Exemplu: M1=[carte, acesta, arid, rac],
M2=[ cutie, abac, acar, cort], k=2, rezultatul
carte
acesta
rac
arid .
(CNI Nvodari 1992 clasa a VII-a)
21) Se introduce un text format din cuvinte desprite prin oricte spaii i avnd maxim 255 de caractere, toate majuscule.
a) S se afieze toate cuvintele din text, unul dup altul
b) S se gseasc lungimea celui mai mic cuvnt c)
Se citete un cuvnt de la tastatur; s se afieze toate cuvintele din text care au aceeai lungime i sunt formate din
exact aceleai litere cu ale cuvntului dat.
(CNI Buteni 1994 clasa a VII-a)
22) Se consider un ir de cel mult 100 caractere, format din literele mici ale alfabetului englez. Se numete o blb o
secven de caractere care apare n ir de cel puin dou ori i una dup alta. Exempu: abbcabab are blbele b i ab.
a) S se determine cea mai lung blb din irul considerat (ca numr de caractere) b) S se codifice irul dat
nlocuind fiecare caracter cu ultima cifr a lui 2 la puterea x, unde x este codul ASCII asociat literei respective. Exemplu:
Date de intrare abbcabab date de ieire a) ab b) 24482424.
(CNI 1997 clasa a VI-a)
23) Se citete de la tastatur un numr natural n, n<=15). Pentru a codifica un text scris cu cel mult primele n litere mici din
alfabetul englez, se folosesc cele mai mici n numere naturale care au exact 3 divizori. Pentru litera a se folosete cel
mai mic numr cu aceast proprietate, pentru b cel mai mic numr diferit de cel folosit pentru a, etc. a) S se afieze
cele n numere folosite la codificare b) pentru un text dat de la tastatur cu maxim 20 de litere, se cere s se afieze
codificarea textului. Exemplu: pentru n=2 i textul aabbaa, se va afia a) 4 9
b) 449944.
(CNI Sinaia 1998 clasa a VI-a)
24) Se dau dou numere a,b cu maxim 8 cifre. Dup fixarea a dou cifre, cte una din fiecare numr, aceste cifre se
interschimb ntre ele, obinndu-se alte dou numere a, b. De exemplu, din numerele a=23, b=416, fixnd prima cifr
din a i a doua cifr din b, dup interschimbarea lor se obin numerele a=13, b=426. S se determine a i b, astfel
nct suma a+b s fie maxim. Exemplu: a=23, b=416, suma maxim se obine pentru 63 i 412.
(CNI Sinaia 1998 clasa a VI-a)
25) Membrii cercului de electronic de la Clubul Copiilor din Aiud au realizat un robot care tie s se deplaseze la comand.
Astfel comanda Nx deplaseaz robotul x metri spre nord, comanda Ey, Vz, St, deplaseaz robotul respectiv y metri spre
est, z metri spre vest, t metri spre sud (x,y,z,t numere naturale). Un grup de copii dau o serie de comenzi robotului
pentru a-l rtci. La comanda STAI robotul se oprete. Cunoscnd comenzile date, ajutai membrii clubului ca prin
maxim 2 comenzi s readuc robotul n punctul de plecare. Exemplu: N 3 V 5 S 3 E 4 E 5 N 2 STAI robotul
revine la comenzile V 4 S 2.
(InfoStar, Aiud 1997 clasa a VI-a)
26) Se citete de la tastatur un text de maxim 255 de caractere. Singurul separator ntre cuvinte este considerat caracterul
spaiu (SPACE).
a. Se va afia pentru fiecare cuvnt: poziia cuvntului n text, adic al ctelea cuvnt este; numrul de litere; suma
codurilor ASCII ale literelor
b. Se va afia frecvena de apariie a fiecrui cuvnt n text. (CNI Satu-Mare 2002 clasa a VI-a)
27) Sinbad Marinarul viseaz c se afl ntr-o peter cu comori. Peste tot se aflau cufere pline cu bijuterii i monezi de aur.
i n timp ce Sinbad se minuna, se auzi o voce care spuse: Exist o cale de a ajunge aici i dac reueti toate aceste
comori vor fi ale tale. Aceast peter se afl n vrful muntelui Ararat , dar duhurile rele vor ncerca s te opreasc. Tu
trebuie s le nvingi n lupt dreapt. Pentru a deschide petera trebuie s-i aminteti cte duhuri ai nvins i s rosteti
cu voce tare formula magic, care este cel mai mic numr care are att prima cifr ct i numrul de cifre egal cu

81

numrul duhurilor nvinse de tine. n plus, acest numr trebuie s aib proprietatea c orice secven de dou cifre
consecutive trebuie s fie numere prime diferite. n acest moment, Sinbad s-a trezit i vrea s plece n cutarea comorii.
Nu se teme de duhurile rele, dar tie cte calcule necesit cutarea formulei magice (i mai tie c la matematic nu se
descurc foarte bine). De aceea, v roag s-l ajutai.
Sinbad v va spune numrul n egal cu numrul duhurilor nvinse de el, iar voi trebuie s-i spunei formula magic.
n cazul n care nu exist un astfel de numr, transmitei-i c Nu exist. Exemplu: n=3 se va afia 311.
(ONI 2002 clasa a VI-a)
28) Gigel are de rezolvat urmtoarea problem: se consider numrul natural N format din maxim 9 cifre, distincte dou
cte dou i n care nu exist cifra 0. Gigel va trebui s fac bileele pentru fiecare cifr din numr, bileele pe care le va
pune ntr-o cciul, conform urmtorului algoritm: iniial pornete de la ultima cifr a numrului (cifra unitilor) i pune
n cciul bileelul pe care este scris aceast cifr. Dac aceasta este o valoare par, ncepe parcurgerea numrului
spre dreapta, n caz contrar spre stnga, parcurgerea fcndu-se cu un numr de pai egal cu cifra respectiv. n
parcurgerea unui numr spre dreapta se consider c dup ultima cifr urmeaz prima (cea mai semnificativ cifr a
numrului), dup aceasta urmeaz a doua, etc., iar n deplasarea spre stnga dup prima cifr (cea mai semnificativ
cifr a numrului) urmeaz ultima cifr (cifra unitilor), apoi penultima, etc., iar parcurgerea ncepe cu cifra din numr
imediat de lng cifra scris pe ultimul bileel introdus n cciul, respectnd sensul parcurgerii. De exemplu, dac
numrul nostru este 1346, Gigel pornete de la cifra 6, iar biletul pe care s-a scris aceast cifr l pune n cciul.
Parcurge numrul spre dreapta, fcnd 6 pai; trece prin cifrele: 1,3,4,6,1 i se oprete la cifra 3. Deci, n cciul va
pune bileelul pe care este scris cifra 3.
Algoritmul continu pn cnd se termin toate bileelele sau cnd ajunge la o cifr pentru care bileelul cu
valoarea respectiv a fost introdus deja n cciul.
Cerin: n cazul n care algoritmul se ncheie ntruct Gigel a pus toate bileelele n cciul, se va afia cifra de pe
ultimul bileel introdus n cciul, iar n cazul n care Gigel ajunge n timpul parcurgerii la o cifr pentru care bileelul
corespunztor a fost introdus deja n cciul, se va afia valoarea acestei cifre
Date de intrare: Se va citi de la tastatur numrul natural N format din cel mult 9 cifre distincte dou cte dou, n
care nu exist cifra 0.
Datele de ieire: Se va afia pe ecran cifra la care Gigel a ajuns n momentul opririi algoritmului.
Exemple :
1) N=412
Gigel ncepe cu cifra 2 (bileelul cu cifra 2 este pus de Gigel n cciul); fiind valoare par, parcurge spre dreapta
i se oprete la cifra 1, bileelul cu aceast cifr fiind pus n cciul. Cifra 1 fiind impar, continu parcurgerea spre
stnga i se oprete la cifra 4 i pune astfel i ultimul bileel n cciul. Din acest moment nu mai exist bileele nepuse
n cciul i se va afia deci cifra 4 .
2) N=1243
Gigel ncepe cu cifra 3 (bileelul cu cifra 3 este pus de Gigel n cciul); fiind valoare impar, parcurge spre
stnga i se oprete la cifra 1, bileelul cu aceast cifr fiind pus n cciul. Cifra 1 fiind impar, continu parcurgerea
spre stnga i se oprete tot la cifra 3, dar nu mai exist bileelul cu cifra 3 pentru a putea fi pus n cciul. Se va afia
deci, cifra 3.
(ONI Focani 2003 clasa a VI-a)
29) Simpatie mare ntre Ionel i Mrioara, doi elevi venii n tabr la Glciuc! Pentru a scpa de indiscreia colegilor, cei
doi hotrsc s-i trimit mesaje, unul altuia, folosind o metod simpl de criptare: textul de criptat se scrie pe o foaie,
aranjnd literele cuvintelor ntr-un tablou avnd cte 5 caractere pe fiecare linie. Spaiul dintre cuvinte este i el caracter.
Textul astfel aranjat pe un numr suficient de linii pentru a ncape, se citete pe coloane, de sus n jos i de la stnga la
dreapta. n locul spaiilor dintre cuvinte se pun puncte. Tot puncte se pun i la sfritul textului, attea cte spaii libere
sunt rmase la sfritul textului pus n tablou. Exemplu: Pentru textul: Te astept dupa cina la ora 8 se va aranja:
1
T
t
d
c
l
a

2
e
e
u
i
a

3
P
P
N

4
a
t
a
a
o

5
s

82

se va codifica: Ttdclaeeuia..ppn.8ataao.s...r.
Decodificarea mesajului se va face nvers codificrii.
Ajutai-i, realiznd un program care s codifice i s decodifice mesajele celor doi copii. Pentru diferenierea
mesajelor ce trebuie codificate, de cele care trebuie decodificate, primul caracter al mesajului va fi C sau c pentru
codificare, respectiv D sau d pentru decodificare. Aceste caractere, vor fi lipite de prima litera din textul mesajului.
Intrare: CAm un mar
Ieire: A.mm.aurn.
ntrare: dTaGia.aubllcaaa.r.c.
Ieire: Tabara la Galaciuc
(ONI Glciuc 2002 clasa a VI-a)
30) S se calculeze anul, ziua, luna i ora revenirii unei rachete pe Pmnt cunoscnd anul, ziua, luna i ora plecrii i
durata zborului n minute. Zborul dureaz cel mult un an. (CNI Nvodari 1989 clasa a VI-a)
31) Ministerul numerelor are de cteva zile un nou ef. Acesta a dorit s fac o serie de schimbri n ministerul pe care l
conduce i a nceput reorganizarea cu mulimea numerelor naturale n 2 etape: mai nti toate numerele naturale au
fost aezate fr spaiu (sau alt separator) ntre ele. Dup aceast prim etap, mulimea numerelor naturale arta
astfel: 123456789101112131415161718192021222324... A doua etap a reorganizrii a constat n formarea unor noi
grupe: o grup de o cifr, o grup de 2 cifre, o grup de 3 cifre i aa mai departe. Astfel, grupele reorganizate sunt:
1, 23, 456, 7891, 01112, 131415, 1617181, 92021222, 324252627 . Cerin: Pentru un numr natural N dat, s se
afieze prima i ultima cifr din cea de-a N-a grup de cifre obinut dup reorganizare, valori separate printr-un
spaiu. Restricii: 1<=N<=250. Exemplu: Pentru N=8 se va afia: 9 2 (deoarece 9 i 2 sunt prima, respectiv ultima cifr
din grupa a 8 a care este 92021222 )
(ONI Focani 2003 clasa a VI-a)
Clasa a VII-a
1) Se d o expresie aritmetic care conine operatorii +, - i operanzii a, b, c. Cunoscnd valorile operanzilor a, b, c se cere
s se determine valoarea expresiei. Date de intrare: n fiierul expresie.in se d pe prima linie valorile operanzilor a, b, c
(separai prin cte un spaiu), iar pe linia a doua expresia. Date de ieire: n fiierul expresie.out se va scrie valoarea
expresiei. Restricii: a,b,c<32000 i sunt numere naturale nenule
Expresia este corect din punct de vedere matematic i are cel mult 1000 de caractere
Exemplu: expresie.in 7 8 3 a+c-b+c expresie.out 5
(www.contaminare.ro)
2) Se d o secven de maxim 1000 de caractere (numai litere mari i mici ale alfabetului englez i cifre). Cerin:
se cere s se determine cel mai mare numr din secven. Date de intrare: n fiierul nrmax.in se d pe o singur linie,
secvena. Date de ieire: n fiierul nrmax.out se va scrie numrul cerut. Restricii: secvena de caractere din fiier are
maxim 1000 de caractere i cel puin un caracter. Exemplu: nrmax.in A78bx899f7g9
nrmax.out 899 . Observaie: dac nu exist soluie n fiierul nrmax.out se va scrie numrul -1.
3) Pe o insul, dup multiple experimente chimice se produce un fenomen extrem de periculos. Viespile se nmulesc
foarte repede producnd pagube mari. Guvernatorul ia hotrrea ca dup n zile s se evacueze insula. Se cere s se
determine numrul de viespi existente n ziua de plecare, tiind c n prima zi dup fenomen sunt p viespi, n a doua zi q
viespi, iar n zilele cu numrul de ordine k (3kn) numrul de viespi este egal cu de patru ori numrul de viespi din ziua
k-1, minus numrul de viespi din ziua a k-2. Date de intrare: |n fiierul text VIESPI.IN se afl pe prima linie n, iar pe a
doua linie p i q cu un spaiu ntre ele. Date de ieire: |n fiierul text VIESPI.OUT se va scrie pe prima linie numrul de
viespi dup cele n zile. Restricie
1n,p,q100. Exemplu: VIESPI.IN 4 2 3 VIESPI.OUT 37
(ONI. Clasele 7-8, 2001)
4) Gigel are o panglic alctuit din benzi de 1 cm lime, colorate n diverse culori. Panglica are N benzi colorate cu C
culori, culori pe care le vom numerota de la 1 la C. Gigel vrea ca la ambele capete ale panglicii s aib aceeai culoare,
dar cum nu poate schimba culorile benzilor, singura posibilitate rmne tierea unor buci de la capete. Cerin: Scriei
un program care s determine modul de tiere a panglicii astfel nct la cele dou capete s fie benzi de aceeai
culoare, iar lungimea panglicii obinute s fie maxim. Date de intrare: Fiierul de intrare PANGLICA.IN conine:
pe prima linie numerele naturale N i C separate printr-un spaiu;
pe urmtoarele N linii descrierea panglicii: pe fiecare linie un numr natural de la 1 la C, reprezentnd n ordine culorile
fiilor ce alctuiesc panglica.
Date de ieire: Fiierul de ieire PANGLICA.OUT va conine urmtoarele 4 numere:
pe prima linie numrul de fii rmase;
pe linia a doua numrul culorii care se afl la capete;
pe linia a treia cte fii trebuie tiate de la nceputul panglicii iniiale;

83

pe linia a patra cte fii trebuie tiate de la sfritul panglicii iniiale.


Restricii i precizri 2N10000 1C200 Dac exist mai multe soluii alegei pe cea n care se taie ct mai
puin din partea de nceput a panglicii.
Exemplul 1
Exemplul 2
PANGLICA.IN
PANGLICA.OUT
PANGLICA.IN
PANGLICA.OUT
63
4
52
4
1
2
1
2
2
1
2
1
1
1
1
0
3
2
2
2
3
(ONI, clasa a 7-a,2002)
5) Gigel s-a ntlnit din nou cu Maria la Concursul Naional de Informatic de la Satu Mare. Pentru a comunica astfel nct
ceilali colegi s nu neleag mesajele lor ei folosesc o metod de criptare a informatiilor conform urmtoarelor reguli:
1. Ei formeaz dicionarul cuvintelor utilizate n mesaj, spaiul ce separ cuvintele fiind considerat i el un cuvnt.
2. Apoi determin k, ce reprezint cea mai mic putere a lui 2 astfel nct numrul cuvintelor din dicionar s fie mai mic
dect 2k.
3. n urmtoarea etap ei sorteaz cuvintele din dicionar n ordine alfabetic cresctoare.
4. Fiecare cuvnt din dicionar se codific prin corespondentul n baza 2 a poziiei cuvntului, exprimat pe k bii.
5. Se grupeaz biii astfel obinui n grupe de 8 completnd dac este cazul cu 0 ultima grup.
6. Fiecare grup se transform ntr-o valoare zecimal, rezultnd astfel codul ASCII a unui caracter ce reprezint codul
criptat.
NOT: Cuvintele din mesaj includ doar caractere mici din alfabetul englez,sunt separate prin spaiu, iar lungimea unui
cuvnt nu depete 10 caractere.
Datele de intrare se citesc din fiierul COD.IN ce are o singur linie. Primul caracter din linie reprezint tipul operaiei,
criptare (c). Imediat dup caracterul c urmeaz mesajul de criptat. n dicionar nu pot exista mai mult de 15 cuvinte
(inclusiv spaiul). Datele de ieire se scriu n fiierul COD.OUT ce conine mesajul criptat urmat imediat de cuvintele din
dicionar separate prin spaiu. EXEMPLU:
COD.IN
COD.OUT
cmama are mere
e are mama mere
(ATENIE! ntre are exist dou spaii)
(CNI, clasa a 7-a, Satu Mare, 2002)
6) ntr-un fiier de intrare NUMERE.IN exist una sau mai multe linii. Pe fiecare linie exista cel puin dou numere urmate
apoi de unul din caracterele p, m, n sau i separate prin spaiu. Caracterele de sfrit de linie au urmtoarele
nelesuri. p cte numere sunt prime din numerele date pe linia respectiv, m determinarea mediei aritmetice a
numerelor din linia respectiv exprimat cu dou zecimale, n numrul de numere prime din intervalul nchis a celor
dou numere din linia respectiv
i inversul fiecrui numr din linia respectiv cu dou zecimale. Datele de ieire se scriu n fiierul NUMERE.OUT
avnd pe fiecare linie rezultatele cerinelor fiecrei linii din fiierul de intrare.
Not: Toate datele de intrare se consider corecte. Numrul maxim de linii este 10. Pe o linie nu poate exista mai mult
de 10 numere (acolo unde acest lucru este permis) Numerele utilizate sunt naturale i nu depesc 64000.
Exemplu:
NUMERE.IN
NUMERE.OUT
13 21 27 29 p
2
12 5 i
0,08 0,20
(CNI, clasa a 7-a, Satu Mare, 2002)
8) Se consider un vector unidimensional x cu n componente numere naturale distincte, cel mult egale cu 32000.
Cerin: Scriei un program care s construiasc vectorul y cu elemente din mulimea {1,2,,n} astfel nct oricare ar fi
numerele naturale i,j cu proprietatea c 1<=i<=n, 1<=j<=n i x[i] < x[j] s avem y[i]<y[j]. Date de intrare; fiierul siruri.in
va conine: pe prima linie numrul n iar pe linia a doua componentele vectorului x separate printr-un spaiu. Date de
ieire: fiierul siruri.out va conine pe prima linie componentele vectorului y separate printr-un spaiu. Restricii:
1<=n<=100, componentele vectorului x sunt numere naturale cel mult egale cu 32000. Exemplu:
siruri.in
Siruri.out

84

6
12 3 7 16 10 1

5 2 3 6 4 1

(OJI, clasa a VII-a, 2004)


9) George pleac n excursie la munte. Pentru aceast excursie el dorete s-i ia un rucsac cu haine. Rucsacul are un
volum de depozitare egal cu V cm3. George stabilete n haine utile pentru excursie (numerotate cu 1, 2, , n). Hainele
au fiecare cte un volum egal cu v1, v2, , vn cm3. Din pcate, exist posibilitatea ca acestea s nu intre toate n
rucsac. George ajunge la concluzia c hainele sunt mpachetate i presate i micoreaz volumul fiecare cu p1, p2, ,
pn la sut. Cerin: Determinai numrul maxim de haine ce pot fi introduse n rucsac. Date de intrare: n fiierul text
excursie.in pe prima linie se va afla v i n separate printr-un spaiu, pe a doua linie se afl v1, v2, , vn separate prin
cte un spaiu, iar pe linia a treia p1, p2, , pn separate de cte un spaiu. Date de ieire: n fiierul excursie.out se va
scrie numrul cerut. Restricii: 0<n<100, 0<v<30000, v1, v2, , vn sunt numere naturale <30000, p1, p2, , pn sunt
numere naturale <100. Exemplu:
excursie.in
excursie.out
980 4
2
1600 200 10000 800
50 20 10 10
(CNI, Satu-Mare, clasa a VII-a, 2003)
10) Un turist aflat n Valea Romeului, aude din vzduh n cuvinte. Aici exist o piatr fermecat care atunci cnd un cuvnt
se izbete de ea, eman un ecou similar cu cuvntul dar spus de la sfrit . Ajutai turistul s gseasc grupele formate
din cuvnt i ecoul su. Exemplu: date de intrare: n=7 i cuvintele: cam des sed oamenii la al doilea mac Date de
ieire: cam mac des sed la al .
(Info-Star, clasa a VII-a, 1996)
Problema 1
Var e:string; a,b,c,expr,i:integer; f,g:text;
Begin
Assign(f,expresie.in); reset(f); Assign(g,expresie.out); rewrite(g);
Readln(f,a,b,c); readln(f,e);
expr:=0;
for i:=1 to length(e) do
case e[i] of
a: if e[i-1]=- then expr:=expr-a else expr:=expr+a;
b: if e[i-1]=- then expr:=expr-b else expr:=expr+b;
c: if e[i-1]=- then expr:=expr-c else expr:=expr+c;
End;
Writeln(g,expr);
Close(f); close(g);
End.
Problema21
Var s:string; max,i, er, c, n:integer; f,g:text;
Begin
Assign(f,nrmax.in); reset(f); Assign(g,nrmax.out); rewrite(g);
Readln(f,s);
Max:=0; n:=0;
For i:=1 to length(s) do
if (ord(s[i]>=ord(0)) and (ord(s[i]<=ord(9)) then begin val(s,c,er); n:-n*10+c end
Else begin if max<n then max:=n; n:=0 end;
Writeln(g,max);
Close(f); close(g);
End.
Clasa a VIII-a

85

1) Se consider o list de litere mici ale alfabetului, fiecare avnd o anumit pondere. Se cere completarea unui careu
ptratic, astfel nct s se obin ponderea maxim pe coloane. Pentru aceasta se dau urmtoarele definiii:
1.
Se numete cuvnt un ir de litere mici, cu proprietatea c nu exist x consoane sau y vocale consecutive i nu pot
exista 2 caractere identice consecutive.
2.
Se numete cuvnt de gen masculin, un cuvnt care ncepe i se termin cu consoana.
3.
Se numete cuvnt de gen feminin, un cuvnt care ncepe i se termin cu vocal.
4.
Se numete cuvnt de gen neutru, un cuvnt care ncepe cu consoan i se termin cu vocal, sau ncepe cu
vocal i se termin cu consoan.
Datele se citesc dintr-un fiier cu urmtoarea structur:

pe prima linie se citete dimensiunea careului (n), x i y cu spaiu ntre ele

pe linia a doua sunt date coordonatele punctelor negre (linie i coloan) separate prin spaiu

pe linia a treia se dau numrul de cuvinte masculine, feminine i neutre utilizate la completarea careului

ncepnd cu linia a patra se d perechea pondere caracter separate prin spaiu


Numele fiierului se introduce de la tastatur.
Datele de ieire se scriu n fiierul cu numele CNI.OUT care are urmtoarea structur:

pe primele n linii, careul ( punctele negre vor fi marcate prin caracterul * )

pe linia n+1 se va scrie ponderea maxim obinut


Exemplu:
FIIERUL DE INTRARE:
CNI.OUT
433
cadc
2341
ab*a
413
cdab
100 c
*abc
80 b
1160
90 a
70 d
(CNI, clasa a 8-a, Satu Mare, 2002)
2) Se dau urmtoarele corespondene pentru numerele naturale.
0 corespunde 0
1 corespunde 143
2 corespunde 307
3 corespunde 453
7 corespunde 1273
10 corespunde 1747
11 corespunde 2113
576 corespunde 160377
S se determine codificarea numerelor citite din fiierul cu numele CNI.IN (fiecare numr fiind citit de pe o linie). Datele
de ieire se vor scrie n fiierul CNI.OUT
Exemplu:
CNI.IN
CNI.OUT
10
1747
0
0
7
1273
(CNI, clasa a 8-a, Satu Mare, 2002)
3) Se consider urmtorul ir, construit astfel nct fiecare element al lui, cu excepia primului, se obine din cel precedent: 1,
11, 21, 1211, 111221, ...Termenii din ir sunt numerotai ncepnd cu 1. Cerin: Dat n, un numr natural, s se
determine cel de-al n-lea termen din irul dat. Date de intrare: Din fiierul text SIR.IN se citete numrul natural n. Date
de ieire: Pe prima linie a fiierului text SIR.OUT se va scrie al n-lea termen al sirului. Restricii 4 n 35, numrul de
cifre ale unui termen nu depete 17000.
Eemple
SIR.IN
SIR.OUT
4
1211

86

SIR.IN
5

SIR.OUT
111221

(OJI, 2002, clasa a 8-a)


4) Se d un cuvnt format numai din litere mici. Numim anagram un cuvnt format din literele cuvntului dat, schimbnd
eventual ordinea literelor. De exemplu o anagram a cuvntului tamara este cuvntul armata. Evident, un cuvnt poate
fi considerat o anagram a lui nsui.
Cerin: Scriei un program care s genereze toate anagramele unui cuvnt dat, n ordine lexicografic.
Date de intrare: Fiierul de intrare ANAG.IN conine pe prima linie cuvntul dat.
Date de ieire: Fiierul de ieire ANAG.OUT va conine n ordine anagramele cuvntului dat, cte una pe linie.
Restricii i precizri: Cuvntul dat are cel mult 10 de litere mici, cuvntul x=x1x2...xn precede cuvntul y=y1y2...yn dac
exist un indice k{1,2,...,n} astfel nct xi=yi, i{1,2,...,k-1}, iar litera xk precede n alfabet litera yk.
Exemplu
ANAG.IN
ANAG.OUT
ana
aan
ana
naa
(OJI, 2002, clasa a VIII-a)
5) S ne imaginm o reea format din noduri situate n punctele de coordonate ntregi, fiecare nod fiind unit prin bare
paralele cu axele de coordonate de cele 4 noduri vecine. Un pianjen este plasat iniial n originea sistemului de
coordonate. La fiecare secund, pianjenul se poate deplasa din nodul n care se afl n unul dintre cele 4 noduri
vecine.
Cerin: Scriei un program care s determine n cte moduri se poate deplasa pianjenul din poziia iniial, ntr-o
poziie final dat, n timpul cel mai scurt. Date de intrare: Fiierul de intrare SPIDER.IN conine pe o singur linie
abscisa i ordonata punctului final, separate prin spaiu: x y
Date de ieire:n fiierul de ieire SPIDER.OUT se va afia pe prima linie numrul de moduri determinat Nr
Restricii 0<x,y80. Exemplul 1
Exemplul 2
SPIDER.IN
SPIDER.OUT
12
3
SPIDER.IN
SPIDER.OUT
23

10

(ONI. Clasele VII-VIII, 2001)


6) Lidorienii i senopictii sunt n conflict pentru ronul fermecat, fiind arbitrai de orintieni, alei de prile beligerante drept
judectori. Orintia a propus: Ronul fermecat va fi ascuns printre ali k roni cu acelai aspect, dar toi realizai dintr-un
material mai greu dect originalul, avnd masa, standard, diferit de cea a ronului femecat. Pentru a-l descoperi, v
gandii c avei la dispoziie o balan i toi cei k+1 roni. Lidorienii, apoi senopictii vor spune un singur numr,
reprezentnd numrul maxim de cntriri admis (numrul acesta nu se obine cntrind un ron de mai multe ori i nici
cntrind de ct mai multe ori ronii; cntrirea presupune s existe, pe fiecare bra al balanei, un numr egal de roni (11, 2-2, etc.) pentru descoperirea ronului fermecat. Dac nici una dintre pri nu spune numrul corect, atunci ronul
fermecat va rmne n Orintia. Dac ambele pri spun numrul corect, ronul va rmne tot la orintieni.. Cerin
Sarcina voastr este s indicai ara care ctig ronul fermecat: Lidoria -L, Senopictia S, Orintia O. Date de intrare
Fisierul ron.in are pe prima linie numrul k, iar pe linia a doua dou numere RL, respectiv RS separate printr-un spaiu.
RL reprezint rspunsul lidorienilor, iar RS rspunsul senopictilor.Date de ieire Fisierul ron.out contine una din literele
L, S i O.Restricii 1 < k < 10000 RL, RL sunt numere naturale cel mult egale cu k
ron.in
7
13
ron.in
4
22

ron.out
O

Explicaie: maximul admis este 2, deci ronul


fermecat rmne n Orintia

ron.out
O

Explicaie: maximul admis este 2, dar fiind


egalitate, ronul rmne n Orintia

Exemple

87

7)

(OJI, clasa VIII-a, 2004)


Se consider n dreptunghiuri avnd laturile paralele cu axele de coordonate. Fiecare dreptunghi este specificat
prin coordonatele extremitilor unei diagonale. Toate coordonatele sunt numere naturale. S se calculeze aria
suprafeei comune tuturor celor n dreptunghiuri (intersecia) i perimetrul suprafeei acoperite de dreptunghiurile
considerate. Date de intrare: numrul n i 2*n perechi de numere naturale mai mici dect 100 Date de ieire: aria
interseciei, coordonatele vrfurilor figurii rezultate prin intersecie, peerimetrul figurii rezultate prin reuniune.
(CNI, Nvodari, clasa a VIII-a, 1992)

Bibliografie:
Doru Popescu Anastasiu
Culegere de probleme de informatic, All Educaional, 2000
Marinel erban
Qbasic, Petrion
Mihai Mocanu
333 probleme de programare, Teora
Dan Negreanu
Probleme de matematic rezolvate cu calculatorul, Teora
www.contaminare.ro

88

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