Anda di halaman 1dari 168

1

CUL EGERE DE P ROBL EME





A U T O R I :
p r o f . A l i n a C l a n
p r o f . D a n i e l C o d r e
p r o f . G e o r g e t a M a n a f u
p r o f . A n t o a n e l a B l u
p r o f . D a n i e l a H a s s a n




C o o r d o n a t o r :
p r o f . T a n a N e g r o i u D r g h i c i







2

P r e f a

I er ar hi a l i mbaj el or de pr ogr amar e est e n
z i l el e noast r e deosebi t de bogat i var i at . Ea
se poat e descr i e cel mai cor ect nt r - un spa i u
mul t i di mensi onal n car e di mensi uni l e sunt
r epr ez ent at e de car act er i st i ci l e l i mbaj el or . n
aceast i er ar hi e l i mbaj ul Pascal ocup un l oc
speci al pr i n f apt ul c est e l egat de concept ul de
st r uct ur ar e a pr ogr amel or . n per i oada 1960 -
1970 ut i l i z ar ea i nt ensi v a i nst r uc i uni l or de
sal t necondi i onat a condus l a apar i i a
pr ogr amel or de t i p " spaghet t i " i ncr edi bi l de
compl exe, gr eu de n el es i de modi f i cat . Un
moment i mpor t ant a f ost of er i t de anul 1966
cnd s- a demonst r at c pent r u or i ce pr ogr am
car e ut i l i z eaz i nst r uc i uni de sal t necondi i onat
exi st un pr ogr am echi val ent , car e ut i l i z eaz
numai st r uct ur i l e i f i wh i l e.
Pe l i ni a acest or pr eocupr i al e vr emi i ,
Ni ckol aus Wi r t h a i nt r odus n 1971 l i mbaj ul
Pascal . Scopul i ni i al a f ost de a pr ez ent a un
l i mbaj car e s pr omovez e t ehni ci l e de
pr ogr amar e st r uct ur at . Ani i car e au ur mat au
ar t at c acest l i mbaj a f ost r epede asi mi l at n
l umea cal cul at oar el or i a r mas ca op i une a
mul t or a di nt r e i nf or mat i ci eni . Mai mul t , pent r u
cal i t i l e sal e el est e i ast z i o op i une a
i nst i t u i i l or academi ce, f acul t i l or , col i l or i
nu numai .
Lucr ar ea de f a nu est e o si mpl cul eger e
de pr obl eme i ni ci o cul eger e de t est e pent r u
pr ogr amar ea n l i mbaj ul Pascal , aa cum s- ar
pr ea l a pr i ma veder e. St r uct ur at pe t r ei
capi t ol e, l ucr ar ea r euet e s sur pr i nd
pr i nci pal el e el ement e l egat e de abor dar ea
al gor i t mi c a r ez ol vr i i unor pr obl eme cu
cal cul at or ul i s si nt et i z ez e aspect el e
f undament al e al e pr ogr amr i i n l i mbaj ul Pascal .
Mer i t ul pr i nci pal al acest ei cr i const n
t r at ar ea gr adat a no i uni l or , conci z i unea i
r i goar ea expuner i i . Pr i n al eger ea f cut cu
pr i vi r e l a pr obl emel e t r at at e, s- a r eal i z at o
l egt ur nat ur al i di r ect cu manual el e de
mat emat i c di n gi mnaz i u. Ci t i t or ul va i dent i f i ca
uor pr obl emel e l egat e de di vi z i bi l i t at e, cel mai
mar e di vi z or comun, cel mai mi c mul t i pl u
comun, f r ac i i , ar i i , vol ume.
Exi st , aadar , suf i ci ent e mot i ve s cr edem
c pent r u cel car e va avea cur i oz i t at ea i
r bdar ea s par cur g acest mat er i al se vor
l mur i mul t e di n t ai nel e pr ogr amr i i
cal cul at or ul ui . i acest a est e numai un nceput ,
deoar ece de ndat ce ai r eui t s descui
secr et el e pr ogr amr i i , est e f oar t e gr eu s
r enun i l a dr umul car e i se deschi de.


P r o f . u n i v . d r . N i c o l a e n d r e a n u
Culegere de probleme
167

C U P R I N S
Capitolul 1: Noiuni introductive
1.1. Rezol varea unei probl eme cu aj utorul cal cul atorul ui ...4
1.2. I ntroducere n l i mbaj ul Turbo Pascal
1.2.1. Identificatori. Constante. Tipuri de date. Variabile. Expresii.7
1.2.2. Citirea/scrierea datelor12
Rspunsuri17
Capitolul 2: Structuri de control
2.1. Structura l i ni ar...20
2.1.1. Teste24
2.1.2. Probleme propuse..27
Rspunsuri28
2.2. Structura al ternati v
2.2.1. Instruciunea if...31
2.2.2. Teste41
2.2.3. Probleme propuse..44
2.2.4. Instruciunea case.45
2.2.5. Teste50
2.2.6. Probleme propuse..54
Rspunsuri55
2.3. Structura repeti ti v
2.3.1. Instruciunea while..63
2.3.2. Probleme propuse..69
2.3.3. Instruciunea repeat.76
2.3.4. Probleme propuse..82
2.3.5. Instruciunea for88
2.3.6. Probleme propuse..94
2.3.7. Teste while99
2.3.8. Teste repeat..101
2.3.9. Teste for..103
Rspunsuri..105
Capitolul 3: Tipul tablou
3.1. Tabl ouri uni di mensi onal e - vectori 109
3.1.1. Teste.119
3.1.2. Probleme propuse123
Rspunsuri.126
3.2. Tabl ouri bi di mensi onal e - matri ci . 147
3.2.1. Teste.155
3.2.2. Probleme propuse158
Rspunsuri..159
Culegere de probleme


BIBLIOGRAFIE






Limbajul Pascal Doina Rancea Editura Computer Libris Agora 1997
Informatic Manual pentru clasa a IX-a Profilul matematic-informatic
Bogdan Ptru, Mariana Miloescu, Editura Teora.
Matematic Manual pentru clasa a V-a
G.Turcitu, C. Basarab, T.Dragonu; N.Ghiciu, I.Rizea, .Smarandache, Editura RADICAL 1997
Matematic Manual pentru clasa a VI-a,
G.Turcitu, I.Rizea, I.Chiriac, C. Basarab, M. Duncea, P.Ciungu, Editura RADICAL 1998
Gazeta de informatic
Matematic - culegere de probleme; Crbunaru

168
Culegere de probleme Noiuni introductive

Capitolul 1.

NOIUNI INTRODUCTIVE
1.1. Rezolvarea unei probleme cu ajutorul calculatorului.

Prezentarea etapelor de rezolvare a unei probleme cu ajutorul calculatorului. Descrierea schemei logice i
a pseudocodului. Prezentarea structurilor de control.

1.2. Introducere n limbajul Turbo Pascal.
1.2.1. Identificatori. Constante. Tipuri de date. Variabile. Expresii.

Se propun spre rezolvare 5 teste gril.

1.2.2. Citirea/scrierea datelor.

O scurt prezentare a procedurilor de citire/scriere.
Sunt prezentate exemple i se propun spre rezolvare 3 teste.
3
Culegere de probleme Noiuni introductive
1.1. Rezolvarea unei probleme cu ajutorul calculatorului.

Pentru ca un calculator s rezolve o problem trebuie executat un program. Realizarea unui program presupune
parcurgerea etapelor: analiza problemei, descrierea algoritmului de rezolvare, elaborarea programului i verificarea
programului.
Analiza problemei const n determinarea datelor iniiale ale problemei (le vom numi date de intrare), a rezultatelor
problemei (le vom numi date de ieire) i descrierea metodei de rezolvare a problemei (o vom numi funcia programului).
Descrierea algoritmului de rezolvare const n determinarea algoritmului ce rezolv problema dat. Pentru descrierea
algoritmilor exist dou forme de prezentare: schema logic i pseudocodul (sau limbajul algoritmic).
Schema logic este reprezentat prin figuri geometrice, specifice fiecrui tip de operaie, legate ntre ele prin sgei
pentru a evidenia ordinea de execuie a operaiilor. n interiorul figurii geometrice se scrie operaia corespunztoare, acest
ansamblu formnd un bloc. Astfel, ntr-o schem logic pot s apar blocurile:

a) de start i de stop

4




b) de citire




c) de scriere



d) de atribuire




e) de decizie



De asemenea, n descrierea schemei logice se folosesc conectori pentru a lega grupuri de blocuri. Acetia au urmtoarea
form:

unde n este numrul conexiunii.


Pseudocodul (sau limbajul algoritmic) este alctuit din instruciuni care ncep, n general, cu un cuvnt cheie care
definete operaia de baz din algoritm. Instruciunilor pseudocodului le corespund instruciuni din limbajele de programare,
ceea ce uureaz transcrierea algoritmului ntr-un program al unui limbaj de programare.
Fiecare algoritm va fi prezentat sub forma unei secvene de text, pe care o vom numi procedur.
Aceasta va ncepe cu numele su i va fi urmat de cuvntul nseamn. Instruciunile vor fi desprite de ; i ncadrate de
cuvintele nceput i sfrit; de asemenea, aceste cuvinte pot grupa mai multe instruciuni formnd o instruciune compus.

START STOP
Citete list de variabile
Scrie list de ex presii
variabil expresie n
condiie
NU DA
n
n
Culegere de probleme Noiuni introductive
Instruciunile pseudocodului sunt:
1) Instruciunea de atribuire. Are forma variabila :=expresie. Variabila primete valoarea expresiei.
2) Instruciunea de citire. Are forma Citete(v1, v2, , vn). Citete valori pentru variabilele v1, v2, , vn.
3) Instruciunea de scriere. Are forma Scrie(e1, e2, , en). Afieaz valorile expresiilor e1, e2, , en.
4) Instruciunea de ramificare. Are forma dac condiie atunci instruciune1 altfel instruciune2.. Se testeaz condiia dat i se
execut instruciunea instruciune1 dac condiia este adevrat, respectiv instruciune2 dac condiia nu este adevrat.
Ramura altfel instruciune2 este opional. Dac lipsete, nseamn c nu se execut nimic dac condiia nu este adevrat.
5) Instruciunea de ciclare ct timp. Are forma ct timp condiie execut instruciune. Se testeaz condiia i dac este
fals instruciunea se oprete, iar dac este adevrat se execut instruciunea i se continu cu testarea condiiei din nou.
Pentru a descrie algoritmi clari trebuie respectate regulile de concepere a algoritmilor conform principiilor programrii
structurate.Pentru aceasta se utilizeaz trei structuri de control: secvenial (secvena), alternativ (decizia) i repetitiv
(ciclul).

Structura secvenial:

instruciune1;
instruciune2;
..

5
instruciunen











Structura alternativ:

dac condiie atunci instruciune1 altfel
instruciune2













Structura repetitiv:

ct timp condiie execut instruciune












Programarea structurat poate folosi alte structuri de control pentru elaborarea algoritmilor. Acestea sunt: structura
alternativ multipl, structura repetitiv cu test final i structura repetitiv cu contor.

Structura alternativ multipl






n caz c expresie este
expr1 : instruciune1;
expr2 : instruciune2;

exprn : instruciunen:
Instruciune1
Instruciune2
condiie
DA NU
Instruciune1 Instruciune1
condiie
DA NU
instruciune
Culegere de probleme Noiuni introductive

6
altfel instruciunen+1
gata
Structura repetitiv cu test final

repet
instruciune1;
instruciune2;

instruciunen;
pn cnd condiie
Structura repetitiv cu contor

pentru x := expresie1 la expresie2 [cu pasul p ] execut
instruciune

Observaie: n cazul n care p=1, atunci nu se mai specific
pasul.


Elaborarea programului nseamn transcrierea algoritmului obinut ntr-un program al unui limbaj de programare. n
lucrarea de fa, vom folosi limbajul de programare Turbo Pascal.
Verificarea programului reprezint introducerea mai multor date de intrare i corectarea erorilor gsite cu acest prilej.

Culegere de probleme Noiuni introductive

1.2. Introducere n limbajul Turbo Pascal.

1.2.1. Identificatori. Constante. Tipuri de date. Variabile. Expresii.

TEST 1



T1.1 Indicai identificatorii utilizator incoreci:

a) 2x b) sol c) _sol d) doi
e) x1+x2 f) trei& g) trei h) x*

T1.2 Specificai constantele ntregi:

a) 200 b) 200 c) 89.4 d) 2e
e) 2.0 f) 6/2 g) 6785 h) 0.2

T1.3 Care din urmtoarele constante ntregi sunt
incorecte?

a) 223.8 b) 345 c) 67 d) 2E4

T1.4 Care din urmtoarele constante reale sunt corecte?

a) 2e-4 b) 234 c) 12.0
d) 0 e) 45E2 f) 451.95

T1.5 Indicai expresiile pentru care tipul rezultatului
evalurii este ntreg:

a) 50/2 + 10 b) 51 mod 2 + 3*24 10
c) 45 div 7 >= 0 d) 75 - 50 = 25
T1.6 S se indice expresiile a cror valoare de adevr este
true:

a) ord(true) < ord(false) b) abs(2) > 4
c) sqr(25) < 5 d) odd(33)

T1.7 S se indice expresiile a cror valoare este false:

a) ord(false) > ord(true) b) odd(67)
c) sqrt(25) <= 5 d) sqr(13) > sqrt(13)

T1.8 Fie x=7.5, y=3, z=5, u=true i v=false. Indicai
expresiile pentru care tipul rezultatului evalurii este
boolean:

a) (x > 9) and ((y>1) or v) b) u or v
c) z mod y = 2 d) x + y + z < 20

T1.9 Se consider condiia logic: amndou variabilele a
i b au valoarea true. Specificai modul de scriere al
acesteia n limbajul Pascal.

a) a or b; b) b and a;
c) (a=true) or (b=true); d) a and b.

7
Culegere de probleme Noiuni introductive

TEST 2



T2.1 Indicai identificatorii utilizator incoreci:

a) y9 b) unu_ c) 56 d) zero
e) k1 f) d&g g) min h) n!

T2.2 Specificai constantele ntregi:

a) -4579 b) 0.0 c) +67 d) 6+9
e) 0 f) 75.0 g) 100 h) 99e

T2.3 Care din urmtoarele constante ntregi sunt
incorecte?

a) +5674 b) +9.0 c) -45 d) 784

T2.4 Care din urmtoarele constante reale sunt incorecte?

a) 78 b) 0.0 c) +56.98
d) 3e9 e) -87 f) 1E-10

T2.5 Indicai expresiile pentru care tipul rezultatului
evalurii este ntreg:

a) 67 mod 9 > 2 b) 45 + 19 = 64
c) 45 + 5 9/3 d) (34 div 7) * (82 mod 9)

T2.6 S se indice expresiile a cror valoare este true:

a) (sqr(9) = 81) or (sqrt(9) = 3) b) abs(-56) >= 4
c) not (56 div 9 <=7) d) not odd(876)

T2.7 S se indice expresiile a cror valoare este false:

a) not (-5 < 5) and (-4 < 4) b) sqrt(144) > 10
c) not (sqr(4) < sqr(5)) d) abs(-8) > abs(-4)
e) (-3 >0) or (3<0) f) not (sqr(3)<10)

T2.8 Fie A=65, B=B, C=C, D=D i q=true. Indicai
expresiile pentru care tipul rezultatului evalurii este char:

a) chr(A); b) succ(B) = C;
c) ord(D); d) (chr(A)=A) = q;
e) pred(C); f) chr(ord(succ(D))).

T2.9 Se consider condiia logic: toate variabilele x, y, z
sunt pozitive. Specificai modul de scriere al acesteia n
limbajul Pascal.

a) x and y and z;
b) (x >= 0) and (y>=0) and (z>=0);
c) (x>0) and (y>0) and (z>0);
d) (x>0) or (y>0) or (z>0).

T2.10. Se consider expresia:


2
y) * (x + y * x + y + x * y) + (x

Care este modul de scriere al acesteia n limbajul Pascal?

a) (x+y)*sqr(x+y)+x*y+sqrt(x*y);
b) (x+y)*sqrt(x+y)+x*y+sqr(x*y).

8
Culegere de probleme Noiuni introductive
TEST 3

T3.1 Indicai identificatorii utilizator coreci:

a) craiova b) Elena Cuza c) 13
d) treisprezece e) salut f) identificator
g) salut! h) hgjfjlsd i) integer

T3.2 Care din urmtoarele definiii de tipuri specific zilele
lucrtoare ale sptmnii:

a) type zi=(luni, mari, miercuri, joi, vineri);
b) type zi_lucrtoare=(luni, mari, miercuri, joi, vineri);
c) (luni, mari, miercuri, joi, vineri).

T3.3 Se consider urmtoarea declaraie:

Var a : (alb, gri, negru);

Alegei tipul corect al variabilei a.

a) subdomeniu; b) byte; c) enumerare.

T3.4 Se consider urmtoarea declaraie:

Var a : 0..9;

Alegei tipul corect al variabilei a.

a) integer; b) byte; c) subdomeniu.



T3.5 Fie declaraiile:

Var n, m, o : longint;
Indicai expresiile corecte.

a) n and m and o b) n div m / 2
c) succ(o)+succ(m)+succ(n)
d) (m shl 3) or (n shr 3)
e) (m/2 div n) + (n/2 div m)
f) m>0 and n>0 and o>0

T3.6 Indicai definiiile de constante corecte:

a) const EC=Colegiul Naional Elena Cuzas Craiova;
b) Const nota : byte = 3;
c) const trei=5;
d) const var=0;
e) const k=1.5;
f) const litera=A.

T3.7 S se specifice declaraiile de variabile corecte:

a) var fffggg : integer;
b) var t1, t2, t3 : 0..9;
c) var x, y : real; m, n : byte;
d) var f, g : single, i, j : char;
e) var sol1, sol2 : double; culori : (rou, verde);
f) var x1, x2 : shortint;
y1, y2 : a..z;
z1, z2 : word;

T3.8. Se consider condiia logic: fracia x/y este
subunitar.
Care este modul de scriere al acesteia n limbajul Pascal?

a) ((x/y)<1); b) (x/y)<1 and (x/y)>0;
c) abs(x)<abs(y); d) ((x/y)<1) or ((x/y)>0).

9
Culegere de probleme Noiuni introductive

TEST 4

T4.1 Se consider urmtoarea declaraie:

Var a : (iarna, primavara, vara, toamna);

Alegei tipul corect al variabilei a.

a) char; b) string; c) enumerare.

T4.2 Se consider urmtoarea declaraie:

Var litere : A..Z;

Alegei tipul corect al variabilei litere.

a) subdomeniu; b) char; c) enumerare.

T4.3 Care dintre urmtoarele definiii de tipuri specific
corect cifrele zecimale:

a) type cifra=(0,1,2,3,4,5,6,7,8,9);
b) type cif=0..9;
c) type cifra={0,1,2,3,4,5,6,7,8,9};
d) type type cifra=1..9;

T4.4. Se consider urmtoarea declaraie:

Var j : (rosu, galben, albastru);

S se specifice tipul variabilei j.

a) char; b) enumerare; c) string.

T4.5. Fie declaraiile:

Var x, y, z : real;

Indicai expresiile corecte.

a) ((x +y+z) div 3)+ ((x +y+z) mod 3);
b) x and y and z;
c) not (x*y*z)+x*y*z;
d) abs(x+y+z) int(x)-int(y)-int(z);
e) sqrt(x)+sqrt(y)+sqrt(z)+sqr(x)+sqr(y)+sqr(z);
f) trunc(round(x)+round(y)+round(z));
g) round(x+4*(y-z)-67.5/(y+z)).

T4.6. Indicai definiiile de constante corecte:

a) const consoana=o;
b) Const nr=1.3456;
c) const mesaj=salutare;
d) Const fgfd=9;
e) Const nr : single = 10.0;
f) const ok : string = excelent.

T4.7. S se specifice declaraiile de variabile incorecte:

a) var l, k : single; o, p : string[5];
b) var h : integer = 3;
c) var a, b, c : char;
d) var x111, y111 : shortint;

T4.8. Se consider condiia logic: variabila a este un numr
par. Care este modul de scriere al acesteia n limbajul
Pascal?

a) a mod 2 = 0; b) a div 2 = 0
c) a / 2 = 0; d) not (odd(a))

10
Culegere de probleme Noiuni introductive
TEST 5

T5.1 Indicai identificatorii utilizator incoreci:

a) litera mica b) 1x c) x1
d) real e) variabila f) constanta
g) sir h) a&b i) tip

T5.2 Care din urmtoarele definiii de tipuri specific numere
naturale:

a) type naturale = 10..1000;
b) type naturale = shortint;
c) type naturale = 0..9;
d) type.naturale = 0..2000;
e) type naturale = word;

T5.3 Se consider urmtoarea declaraie:

Var nr : 2000..4000;

Alegei tipul corect al variabilei nr.

a) word; b) subdomeniu; c) longint.

T5.4 Indicai tipurile de date ntregi:

a) integer; b) word; c) single; d) longint;
e) shortint; f) byteint; g) double; h) char.

T5.5 Fie declaraiile:

Var a, b, c : char;

Indicai expresiile corecte.

a) ord(a)+ord(b)+ord(c)
b) ord(succ(a))*ord(succ(b))
c) pred(a)+pred(b)+pred(c)
d) ord(upcase(a))*ord(upcase(b))*ord(upcase(c))
e) (a + b) div 2
f) 255-ord(a)-ord(b)-ord(c)
g) chr(255-ord(pred(c)))

T5.6 Indicai definiiile de constante incorecte:

a) Const oras=Craiova;
b) const numar : byte = 127.0;
c) const integer = 1;
d) const nr:=7.5;
e) const tara=romania;
f) const unu : shortint = -1;

T5.7 S se specifice declaraiile de variabile incorecte:

a) var a : integer, b : real;
b) var 1x, 2x : double;
c) var x : byte; x : char;
d) var lit1, lit2 : char;
e) var sir1, sir2, sir3 : string; s1, s2, s3 : char;
f) var _suma, _produs : boolean;

T5.8. Se consider urmtoarea expresie:


( )
k/6
m + 5 * a + b
* y + x +
c/2 + b
a


Care este modul de scriere al acesteia n limbajul Pascal?

a) (a/b+c/2)+sqrt(x+y)*((b+a)*5+m)/k/6
b) (a/(b+c/2))+sqrt(x+y)*((b+a)*5+m)/(k/6))

11
Culegere de probleme Noiuni introductive
1.2.2. Citirea/scrierea datelor

1.2.2.1 Citirea datelor

Citirea datelor se efectueaz prin executarea procedurilor standard Read i Readln.
Apelul procedurii Read are forma: Read(v1, v2, , vn)
Apelul procedurii Readln are forma: Readln(v1, v2, , vn)
Variabilele v1, v2, , vn pot avea numai tipurile: Char, ntreg sau interval de ntregi, real sau string.
Diagramele de sintax ale apelurilor acestor proceduri sunt:



12








apel
Read
Read (
Identificator
(de variabil)
)
,







Exemple: Se consider urmtoarele declaraii de variabile:
Var a : Real; b : Integer; c, cc : char; d : Boolean; e : (rou, galben, albastru); f : Byte; g : Word;

Apeluri ale procedurilor
Read i Readln
Linii introduse de la tastatur
Valorile variabilelor din lista de
argumente a procedurilor de citire
Read(a,b,c) 40.0 4DA<CR> a=40.0; b=-4; c=D
Readln(f,g,a) 200 20000<CR>40<CR> f=200; g=20000; a=40.0
Read(c,a,g,b) E-4 300 -99<CR> c=E; a=-4.0; g=300; b=-99
Read(a,b,c) 1E-4 75e<CR> a=0.0001; b=75; c=e
Read(c,cc,b) DA1000<CR> c=D; cc=A; b=1000

Apeluri ale procedurilor
Read i Readln
1

Linii introduse de
la tastatur
Observaii
Read(f,a,c) 300 5 Da<CR> Valoarea maxim a unei variabile de tip Byte este 255.
Readln(b,d) 200 true<CR> Datele de tip Boolean nu se pot citi.
Read(g,a) -35 23.78<CR> Datele de tip Word sunt pozitive.
Read(e,a,f) rosu 3.89 25<CR> Datele de tip enumerare nu se pot citi
Read(a,b,c,f) -5-6.9c200<CR> Lipsesc separatorii (blanc, TAB sau Enter) ntre valorile numerice -5 i 6.9.

1
Aceste apeluri sunt incorecte.
apel
Readln
) (
Identificator
(de variabil)
Readln
,
Culegere de probleme Noiuni introductive
1.2.2.2 Scrierea datelor

Scrierea (afiarea) datelor se efectueaz cu procedurile standard Write i Writeln.
Apelul procedurii Write are forma: Write(e1, e2, , en)
Apelul procedurii Writeln are forma: Writeln(e1, e2, , en)
Variabilele v1, v2, , vn pot avea numai tipurile: Char, Boolean, ntreg, real sau string.
Diagrama de sintax a apelului procedurii Write este:


13







Diagrama de sintax a apelului procedurii Writeln este:









Exemple:

Apeluri ale procedurilor
Write i Writeln
Liniile afiate
Write(A,#10,A) A
A
Writeln(A); Write(A:4) A
A
Write(AAAA:3) AAAA
Write(AAAA:5) AAAA
Writeln(A,false);
Write(A,false:7)
Afalse
A false
Apeluri ale procedurilor
Write i Writeln
Liniile afiate
Write(A,(4>2):7) A true
Write(A,30,20) A3020
Write(A,30:3,20:3) A 30 20
Write(25.50) 2.5500000000E+01
Write(-25.50:7) -2.5E+02
Write(-25.50:7:2) -25.50
Write(25.50:5:1) 25.5
Write(25.50:5:0) 25

,
apel
Write
Write
(
expresie
)
,
:
expresie
:
expresie
apel
Writeln
Writeln
(
expresie
)
:
expresie
:
expresie
Culegere de probleme Noiuni introductive
TEST 1



T1.1. Se consider urmtoarele declaraii:

Var a : real; b : integer; c : char;

S se indice valoarea cu care se iniializeaz variabila b
n urma apelului:

Read(a,b,c)

tiind c linia de comand cuprinde

30 -40 %


a) -4 b) 40 c) 0

T 1.2. Se consider urmtoarele declaraii:

Var m : shortint; n : single;
o : char; p : word;

S se indice valoarea cu care se iniializeaz variabila o
n urma apelului:

Read(m,n,o,p)

tiind c linia de comand cuprinde

100 30.5 2

a) b) E c) E

T 1.3. Se consider urmtoarele declaraii:

Var e : boolean; f, g : single;
h : byte; i : integer; j, k : char;

i apeluri ale procedurii Read pentru care se indic linia
de intrare corespunztoare. S se specifice apelurile incorecte.

a) read(e, i, k)

false 23 a

b) read(f,h,g,k,j)

12.3 344 3.9yes

c) read(h,j,i)

100 200

T.1.4. S se afieze cuvintele ELENA CUZA sub forma:

E
L
E
N
A
C U Z A


T 1.5. S se iniializeze variabilele reale a, b, c cu valori, apoi
s se afieze un tabel cu valorile ptratelor acestora.


14
Culegere de probleme Noiuni introductive
TEST 2



T2.1. Se consider urmtoarele declaraii:

Var s : string; t : shortint; u : longint;

S se indice valoarea cu care se iniializeaz variabila
s n urma apelului:

Read(t,u,s)

tiind c linia de comand cuprinde

100 300 100 eeeee

a) eeeee b) eeeee c) 100 eeeee

T 2.2. Se consider urmtoarele declaraii:

Var i : integer; j : comp;
k : byte; m : char;

S se indice valoarea cu care se iniializeaz variabila i
n urma apelului:

Read(j,i,k,m)

tiind c linia de comand cuprinde

25 5000 45 a

a) 5000a b) 5000 c) 5

T 2.3. Se consider urmtoarele declaraii:

Var f, g : single;
h : byte; i : integer; j, k : char;

i apeluri ale procedurii Read pentru care se indic
linia de intrare corespunztoare. S se specifice apelurile
incorecte.

a) read(f, i, k)

323 50000l

b) read(h, g, j)

44 44.678 j

c) read(k,f,i)

kk 5 5

T.2.4. S se afieze cuvntul CUZA sub forma:


C
U U
Z Z
A A
Z Z
U U
C

T 2.5. S se iniializeze variabilele reale a, b, c cu valori, apoi
s se afieze un tabel cu valorile rdcinilor ptrate ale
acestora.

15
Culegere de probleme Noiuni introductive
TEST 3



T3.1. Se consider urmtoarele declaraii:

Var
i : char;
j : byte;
k : string;

S se indice valoarea cu care se iniializeaz variabila i
n urma apelului:

Read(j,i,k)

tiind c linia de comand cuprinde

30 pascal

a) p b) c) p

T 3.2 S se specifice ce se afieaz n urma execuiei
urmtorului apel al procedurii Write:

Write(*****:5,$$$$$:7)

a) *****$$$$$ b) ***** $$$$$ c) *****$$$$$$$

T 3.3. Se consider urmtoarele declaraii:

Var
f : string; g : integer;
h : char; i : real;

i apeluri ale procedurii Read pentru care se indic
linia de intrare corespunztoare. S se specifice apelurile
incorecte.

a) read(g,i,f)

32000 9 00000aaaa

b) read(h, g, i)

a 55 e-2

c) read(i,h,f)

22.77 zzzzzzzzz

T.3.4 S se afieze cuvntul ELENA sub forma:

E E
L L
E E
N N
A
N N
E E
L L
E E

T 3.5. S se iniializeze variabilele reale a, b, c cu valori, apoi
s se afieze valoarea true dac acestea pot fi lungimi ale
laturilor unui triunghi sau false, n caz contrar.



16
Culegere de probleme Noiuni introductive


17





1.2. Introducere n limbajul Turbo Pascal.

1.2.1. Identificatori. Constante. Tipuri de date. Variabile. Expresii.

Test 1.

T1.1. a, e, f, h. T1.2. a, b, g. T1.3. a, d. T1.4. a, c, e, f. T1.5.
b. T1.6. d. T1.7. a. T1.8. a, b, c, d. T1.9. b, d.

Test 2.

T2.1. c, f, h. T2.2. a, c, e, g. T2.3. b. T2.4. a, e. T2.5. d.
T2.6. a, b, d. T2.7. a, c, e, f. T2.8. a, e, f. T2.9. c. T2.10. b.


Test 3.

T3.1. a, d, e, f, h. T3.2. a, b. T3.3. c. T3.4. c. T3.5. a, b, c, d.
T3.6. a, b, c, e, f. T3.7. a, b, c, e, f. T3.8. c.

Test 4.

T4.1. c. T4.2. a. T4.3. b. T4.4. b. T4.5. d, e, f, g. T4.6. a, b,
c, d, e, f. T4.7. b. T4.8. a, d.

Test 5.

T5.1. a, b, d, h. T5.2. a, c, e. T5.3. b. T5.4. a, b, d, e. T5.5.
a, b, d, f, g. T5.6. b, c, d. T5.7. a, b, c. T5.8. b.


1.2.2. Citirea/scrierea datelor

Test 1.

T1.1. b. T1.2. a. T.1.3.a (datele de tip boolean nu se pot citi),
b (valoarea maxim a unei variabile de tip Byte este 255)
T 1.4.
writeln('E',#10,'L',#10,'E',#10,'N',#10,'A',#10,'C','U':2,'Z':2,'A':2)
RSPUNSURI
T 1.5.
readln(a,b,c);
writeln('*********************');
write('*',a:8:2,'*':2,sqr(a):8:2,'*':2);writeln;
write('*',b:8:2,'*':2,sqr(b):8:2,'*':2);writeln;
write('*',c:8:2,'*':2,sqr(c):8:2,'*':2);writeln;
write('*********************');

Culegere de probleme Noiuni introductive

18
Test 2

T 2.1. c. T 2.2. b. T 2.3. a (valoarea maxim a unei variabile
de tip Integer este 32767), c (f este de tip Single, nu Char)
T 2.4.
writeln('C':4);
writeln('U':3,'U':2);
writeln('Z':2,'Z':4);
writeln('A','A':6);
writeln('Z':2,'Z':4);
writeln('U':3,'U':2);
writeln('C':4)
T 2.5.
readln(a,b,c);
writeln('*********************');
write('*',a:8:2,'*':2,sqrt(a):8:2,'*':2);writeln;
write('*',b:8:2,'*':2,sqrt(b):8:2,'*':2);writeln;
write('*',c:8:2,'*':2,sqrt(c):8:2,'*':2);writeln;
write('*********************')




Test 3

T 3.1. b. T 3.2. b. T 3.3. b (naintea lui e ar fi trebuit s fie
una sau mai multe cifre)
T 3.4.
writeln('E','E':8);
writeln('L':2,'L':6);
writeln('E':3,'E':4);
writeln('N':4,'N':2);
writeln('A':5);
writeln('N':4,'N':2);
writeln('E':3,'E':4);
writeln('L':2,'L':6);
writeln('E','E':8);

T 3.5.
readln(a,b,c);

write((a>0)and(b>0)and(c>0)and(a+b>c)and(a+c>b)a
nd(b+c>a))

Culegere de probleme Structura liniar
Capitolul 2.
STRUCTURI DE CONTROL
2.1. Structura liniar.


Descrierea instruciunilor de atribuire i compus. Rezolvarea a 5 probleme ce utilizeaz aceste instruciuni. Se
analizeaz problemele, se descriu algoritmii ce rezolv problemele (schem logic i pseudocod ) i se scriu programele
Pascal ce transcriu algoritmii respectivi.
Se propun spre rezolvare 3 teste ce cuprind exerciii de tip gril i dezbaterea unor probleme.
Se propune scrierea unor programe Pascal care s rezolve problemele date.

2.2. Structura alternativ.

Se descriu instruciunile if i case. Se rezolv 5 probleme ce utilizeaz fiecare aceast instruciune. Se analizeaz
problemele, se descriu algoritmii de rezolvare (schem logic i pseudocod) i se scriu programele Pascal ce transcriu
algoritmii respectivi.Se propun spre rezolvare 3 teste ce cuprind exerciii de tip gril, dezbaterea unor probleme i
scrierea unui program Pascal pentru o problem dat.
Se propune scrierea unor programe Pascal care s rezolve problemele date.

19
Culegere de probleme Structura liniar
2.1. STRUCTURA LINIAR

Structura liniar cuprinde operaii care se execut secvenial. Aceast structur este generat de instruciunile de atribuire, compuse sau
procedurale. n lucrarea de fa, vom studia instruciunea de atribuire i instruciunea compus.

1. Instruciunea de atribuire

20
Instruciune
compus
begin Instruciune
end
;
START
Citete v1, v2
mn(v1+v2)/2
Scrie m
STOP

Diagrama de sintax a instruciunii de atribuire este urmtoarea:

Executarea acestei instruciuni const n urmtoarele:
- se evalueaz expresia;
- variabila (funcia) primete valoarea expresiei; dac tipul expresiei nu
coincide cu cel al variabilei (funciei), valoarea expresiei se
convertete nainte de atribuire n tipul identificatorului.


2. Instruciunea compus
Instruciunea
de atribuire
Identificator
(de variabil)
:=
expresie
Identificator
(de funcie)

Diagrama de sintax a instruciunii compuse este urmtoarea:

Executarea instruciunii compuse const n executarea instruciunilor
cuprinse ntre delimitatorii begin i end, n ordinea n care acestea apar.

Problema1. Un automobil a parcurs distana dintre dou localiti, la ducere cu km/h, iar la ntoarcere cu km/h. Aflai media vitezelor.
1
v
2
v

Rezolvarea problemei:

Date de intrare: viteza la ducere v1, viteza la ntoarcere v2.
Date de ieire: se afieaz media vitezelor, m.
Funcia programului: se calculeaz media celor dou viteze care este
media lor aritmetic, adic
2
2 v 1 v
.
Schema logic:
m









Culegere de probleme Structura liniar
Algoritmul n pseudocod:

medie_viteze nseamn:
nceput
scrie(Viteza la ducere);
citete(v1);
scrie(Viteza la intoarcere);
citete(v2);
m:=(v1+v2)/2;
scrie(Media vitezelor este , m)
sfrit.


Programul Pascal :

program viteze;
var v1, v2, m : real;
begin
write(Viteza la ducere este );
readln(v1);
write(Viteza la intoarcere);
readln(v2);
m:=(v1+v2)/2;
write(Viteza medie este ,m:10:2)
end.

Problema 2. Un dreptunghi are limea de l1 metri i lungimea de l2 metri. Aflai perimetrul ptratului care are aria egal cu a dreptunghiului.

Rezolvarea problemei:
Date de intrare: limea l1 i lungimea l2 a unui dreptunghi.
Date de ieire: se afieaz perimetrul ptratului p.
Funcia programului: se calculeaz perimetrul ptratului astfel: se determin aria ptratului care este egal cu aria dreptunghiului, adic produsul
dintre l1 i l2, se calculeaz lungimea laturii ptratului care este rdcina ptrat a ariei ptratului, apoi se calculeaz perimetrul ptratului.

Schema logic:

21
START


Citete l1, l2


aria l1*l n 2


l s n qrt(aria)
STOP



pn4*l


Scrie p


Algoritmul n pseudocod:

Perimetru_ptrat nseamn:
nceput
scrie(Lime dreptunghi = );
citete(l1);
scrie(Lungime dreptunghi = );
citete(l2);
aria:=l1*l2; l:=sqrt(aria); p:=4*l;
scrie(Perimetrul ptratului =,p)
sfrit.






Programul Pascal:

program perimetru;
var l1, l2, aria : word; l, p : real;
begin
write(Lime dreptunghi = ); read(l1);
write(Lungime dreptunghi = );
read(l2);
aria:=l1*l2;
l:=sqrt(aria);
p:=4*l;
write(Perimetrul patratului = ,p:10:2)
end.



Culegere de probleme Structura liniar
Problema 3. Un obiect cost S lei. Calculai preul obiectului dup o scumpire cu p% i apoi o reducere cu q%.

Rezolvarea problemei:
Date de intrare: preul obiectului S, procentul de scumpire p, procentul de reducere q.
Date de ieire: se afieaz noul pre al obiectului care este dat de valoarea variabilei pr.
Funcia programului: se calculeaz preul obiectului dup o scumpire cu p%, adic S+S*p/100; acest pre fiind pstrat n variabila ps. Dup o
reducere cu q%, adic ps-ps*q/100 care este pstrat n variabila pr, se obine preul obiectului.

Schema logic

22
















Algoritmul n pseudocod:


pre_obiect nseamn:
nceput
citete(S,p,q);
ps:=S+S*p/100;
scrie(Pre dup scumpire = ,ps);
pr:=ps-ps*q/100;
scrie(Pre dup reducere = ,pr);
sfrit.






Programul Pascal:


program obiect;
var s, ps, pr, p, q : real;
begin
readln(s,p,q);
ps:=s+s*p/100;
write(Pret dup scumpire = ,ps:5:2);
pr:=ps-ps*q/100;
write(Pret dup reducere = ,pr:5:2);
end.





START
Citete S,p,q
psnS+S*p/100
Scrie ps
prnps-ps*q/100
Scrie pr
STOP

Problema 4. Media aritmetic a patru numere naturale este ma1. Gsii un numr care mpreun cu cele patru numere s dea media
aritmetic ma2.

Rezolvarea problemei:
Date de intrare: media aritmetic a patru numere naturale ma1; media aritmetic a unui numr i a celor patru numere la care ne-am referit
anterior - ma2.
Date de ieire: se afieaz numrul cutat, acesta fiind dat de valoarea variabilei nr.
Funcia programului: se determin numrul astfel: se calculeaz suma celor patru numere s1=4*ma1, se calculeaz suma dintre cele patru
numere i numrul cutat s2=5*ma2, apoi se obine numrul prin calculul diferenei dintre s2 i s1, aceast diferen fiind atribuit variabilei
nr.

Culegere de probleme Structura liniar
Schema logic:


23
START
Citete ma1,ma2
s1n4*ma1
s2n5*ma2
nrns2s1
Scrie nr
STOP













Algoritmul n pseudocod:


numr nseamn:
nceput
citete(ma1,ma2);
s1:=4*ma1;
s2:=5*ma2;
nr:=s2-s1;
scrie(Numrul este ,nr)
sfrit.




Programul Pascal:


program numr;
var ma1, ma2, s1, s2, nr : real;
begin
readln(ma1,ma2);
s1:=4*ma1;
s2:=5*ma2;
nr:=s2-s1;
write(Numrul este ,nr:5:0)
end.





Problema 5. S se calculeze media ponderat a numerelor reale a i b cu ponderile p, respectiv q.

Rezolvarea problemei:
Date de intrare: numerele reale a i b; numerele naturale p i q care reprezint ponderile lui a, respectiv b.
Date de ieire: se afieaz valoarea variabilei mp care reprezint media ponderat a numerelor considerate.
Funcia programului: se calculeaz media ponderat a numerelor a i b cu ponderile p, respectiv q :
q p
q * b p * a
mp

.
Schema logic:
START


Citete a,b,p,q


mpn(a*p+b*q)/(p+q)


Scrie mp


STOP

Algoritmul n pseudocod:

media_ponderat nseamn:
nceput
scrie(a = ); citete(a);
scrie(Ponderea lui ,a, = );citete(p);
scrie(b = ); citete(b);
scrie(Ponderea lui ,b, = );citete(q);
mp:=(a*p+b*q)/(p+q);
scrie(Media ponderat este ,mp)
sfrit.


Programul Pascal:

Program medie_ponderat;
Var a, b, mp : real; p, q : word;
begin
write(a= );readln(a);
write(Ponderea lui ,a, = );readln(p);
write(b= );readln(b);
write(Ponderea lui ,b, = );readln(q);
mp:=(a*p+b*q)/(p+q);
write(Media ponderat este ,mp:5:2)
end.
Culegere de probleme Structura liniar

24
2.1.1. TESTE
TEST 1
T1.1. S se verifice corectitudinea sintactic pentru urmtoarele
programe:

a)
program test11;
var a, b, s : byte;
begin
readln(b,a);
s=a+b;
write(s)
end.
b)
program test12;
var x, y : real;
begin
read(x,y);
x:=x+y;
y:=x-y;
writeln(y,x);
end;

T1.2. Dac a i b sunt variabile reale, iar x i y sunt variabile ntregi,
identificai instruciunile de atribuire scrise corect:

a) a:=a+4; b) x:=a*b; c) a*b:=x;
d) a:=x+y; e) 27:=y; f) y:=(x+a/b)/2;
g) b:=(a+x/y)/2; h) a:=x+y*b-a/3.

T1.3. Se consider definiia i declaraiile:

Const b=3;
Var
a : integer;
i : word;

Dup efectuarea urmtoarelor operaii alegei care este varianta corect
pentru valoarea variabilei a.

i:=3; write(b = ,b); a:=i*b; write(a=,a);

Rspunsul este: I) 3 II) 6 III) 9.

T1.4. Se consider declaraiile:

var
q,p : boolean;
i,j : byte;

Dup efectuarea urmtoarelor operaii alegei care este varianta corect
pentru valoarea variabilei q.

i:=7; j:=200; q:=true;
p:=(i>6) and (j<=200);
q:=not p;

Rspunsul este: I) false II) true III) 207.

T1.5. Introducei i executai urmtorul program Pascal. Stabilii
funcia sa.

program stabilete1;
var a, b, ma, mg : real;
begin
writeln('Stabilete funcia programului.');
write('a = ');read(a);write('b = ');read(b);
ma:=(a+b)/2;
mg:=sqrt(a*b);
write(ma :7:2, ,mg:7:2)
end.
Culegere de probleme Structura liniar

25
TEST 2

T2.1. S se verifice corectitudinea urmtoarelor programe:

a)
program test21;
const i=10;
var a : word;
begin
read(a);
i:=a;
write(i,a)
end.
b)
const j=15;
var a, b : double;
begin
read(a,b);
a=b+j;
b:=a+j;
writeln(a,b);
end

T2.2. Dac x,y i z sunt variabile booleene, iar a, b i c sunt variabile
reale, identificai instruciunile de atribuire scrise corect:

a) x:=y+z; b)a:=b+c;
c) y:=x xor z; d) z:=x or y and (c=0);
e) c:=(a*c+a/c)/2; f) y:=x and z and y;
g) b:=(a+b)/2; h) c:=(a>0) and (b>0) and (c>0).

T2.3. Se consider urmtoarele declaraii:

Var n1, n2, n3 : integer;
x, y, z : real;

Dup efectuarea urmtoarelor operaii alegei care este varianta corect
pentru valoarea variabilei x.

x:=7.0; n1:=5; n2:=0; n3:=10;
y:=(n1+n2+n3)/3; z:=(x+y)/2; x:=y+z+n1+n2+n3;

Rspunsul este: I) 16 II) 26.0 III) 7.

T2.4. Se consider definiia i declaraiile:

Const x=5;
Var
y : shortint;
n : single;

Dup efectuarea urmtoarelor operaii alegei care este varianta corect
pentru valoarea variabilei n.

y:=-100; n:=1.0; n:=y+n; y:=y+x; n:=y+n;

Rspunsul este: I) 194.0 II) 1.0 III) 194.0.

T2.5. Introducei i executai urmtorul program Pascal. Stabilii
funcia sa.

program stabilete2;
var x, y, z : shortint;
begin
writeln('Stabilete funcia programului.');
read(x,y);
z:=x+y; writeln(z);z:=x-y; writeln(z);
z:=x*y; writeln(z);z:=x div y; writeln(z);
end.
Culegere de probleme Structura liniar

26
TEST 3

T3.1. S se verifice corectitudinea sintactic pentru urmtoarele
programe:

I)
var n1, n2, n3 : single;
BEGIN
readln(n1,n2);
n3=n1*n2;
write(n3 = ,n3)
END.

II)
const n=15;
var a, b : shortint; c : real;
begin
readln(a,b);
c=(a+b)/n;
write(Produsul = ,c)
end.

T3.2. Dac n1 i n2 sunt variabile de tip byte, iar c1 i c2 sunt
variabile de tip char, identificai instruciunile de atribuire scrise corect:

a) c1:=chr(n1); b) chr(n2):=c2;
c) c1:=chr(ord(c2)); d) c2:=chr(ord(c1));
e) n1:=ord(c2); f) n2:=ord(c1);
g) n1:=n1 div n2; h) n1+n2:=ord(c1)+ord(c2).

T3.3. Se consider urmtoarele definiii i declaraii:

Const n1=1.0; n2=2.0;
Var n : real;
i : byte;

Dup efectuarea urmtoarelor operaii alegei care este varianta corect
pentru valoarea variabilei n.

i:=6; n:=(n1+n2)/i; i:=3; n:=(n1+n2)/i;

Rspunsul este: I) 0.5 II) 1 III) 1.0.

T3.4. Se consider definiiile i declaraiile:

Const j=2; k=3;
Var a, b, c : single;

Dup efectuarea urmtoarelor operaii alegei care este varianta corect
pentru valoarea variabilei c.

a:=10.0; b:=20.0; c:=30.0
c:=(a+b)/j; c:=(a+b)/k;

Rspunsul este: I) 30.0 II) 15.0 III) 10.0.

T3.5. Introducei i executai urmtorul program Pascal. Stabilii
funcia sa.

program stabileste3;
const n=2;
var m, n1, n2, n3 : double;
begin
writeln('Stabileste functia programului.');
readln(n1,n2,n3);
m:=(n1+n2+n3)/(n+1);
write(m:5:2)
end.
Culegere de probleme Structura liniar
2.1.2. Probleme propuse

27




1. Se citesc numerele naturale b i f care reprezint numrul de biei
respectiv de fete dintr-o clas. S se afieze raportul dintre:a)
numrul bieilor i numrul fetelor; b) numrul fetelor i numrul
bieilor.

2. Se citesc numerele naturale b i f care reprezint numrul de biei
respectiv de fete dintr-o clas. S se afieze raportul procentual
dintre:a) numrul bieilor i numrul elevilor; b) numrul fetelor i
numrul elevilor.

3. Alexandru a economisit S lei i i depoziteaz ntr-o banc cu o
dobnd de p% pe an, pentru un termen de l luni. S se afieze
dobnda obinut dup l luni. S, p i l sunt numere naturale care
se citesc de la tastatur.

4. Un teren a fost cultivat astfel: p1% cu porumb, p2% cu gru, p3% cu
orz i restul de q ha cu floarea-soarelui. S se afieze aria ntregii
suprafee, precum i ariile suprafeelor cultivate cu porumb,
gru,respectiv orz.Numerele pozitive p1, p2, p3 i q se citesc de la
tastatur.

5. Se citesc numerele pozitive a, b i c. Un bazin paralelipipedic are
lungimea a m, limea b m i adncimea c m. S se afieze
volumul bazinului.

6. O persoan doarme, n medie, 8 ore pe zi. S se afieze cte ore va
consacra somnului o persoan care triete N ani. N este un numr
natural care se citete de la tastatur.

7. Se citesc numerele naturale l1, l2 i x. O curte n form de
dreptunghi, cu dimensiunile de l1 m i l2 m, trebuie asfaltat cu un
strat gros de x cm. S se afieze aria suprafeei asfaltate i volumul
asfaltului.

8. Se citesc numerele naturale n1, n2, n3 i t care reprezint notele
luate de Bianca pe semestrul I la matematic - la oral, respectiv la
tez. S se afieze media semestrial cu dou zecimale i apoi
rotunjirea la un numr ntreg a acestei medii.

9. Se citesc numerele ntregi pozitive a i b. S se rezolve ecuaia cu o
necunoscut ax+b=0.

10. Se citete numrul natural l care reprezint latura unui cub. S se
afieze volumul cubului, suma lungimilor muchiilor i suma ariilor
feelor.
Rezolvai problemele utiliznd
limbajul de programare Pascal
Culegere de probleme Structura liniar

28
RSPUNSURI


Structura liniar.

Test 1.
T1.1 a) Instruciunea de atribuire s=a+b este incorect. Forma corect este s:=a+b. b) Orice program Pascal se termin cu caracterul .. Deci, n
loc de ; avem .. T1.2 a),d),g),h). T1.3 III. T1.4 I. T1.5 Acest program Pascal afieaz media aritmetic, respectiv media geometric a dou numere
reale, a i b.

Test 2.
T2.1 a) Instruciunea de atribuire i:=a este incorect deoarece n stnga operatorului := avem un identificator de constant. b) Instruciunea de
atribuire a=b+j este incorect. Forma corect este a:=b+j. Orice program Pascal se termin cu .. Deci dup cuvntul cheie end se pune
caracterul .. T2.2 b), c), d), e), f), g). T2.3 II. T2.4 I. T2.5 Programul Pascal determin suma, diferena, produsul, respectiv ctul a dou numere
ntregi.

Test 3.
T3.1 I) Instruciunea de atribuire n3=n1*n2 este incorect. Forma corect este n3:=n1*n2. II) Instruciunea de atribuire c=(a+b)/n este incorect.
Forma corect este c:=(a+b)/n. T3.2 a), c), d), e), f), g). T3.3 III. T3.4 III. T3.5 Programul Pascal determin media aritmetic a trei numere reale.

Probleme propuse

1.
program clasa;
var
f, b : word;
r1, r2 : real;
begin
write(Nr. fetelor = ); read(f);
write(Nr. baietilor = ); read(b);
r1:=f/b;
write(Raportul dintre nr. fetelor si nr. baietilor = ,r1);
r2:=b/f;
write(Raportul dintre nr. baietilor si nr. fetelor = ,r2)
end.

2.
program clasa;
var
f, b : word;
r1, r2 : real;
begin
write(Nr. fetelor = ); read(f);
write(Nr. baietilor = ); read(b);
r1:=b*100/(f+b);
write(Raportul procentual dintre nr. baietilor si nr. elevilor
= ,r1:5:2);
r2:=f*100/(f+b);
write(Raportul procentual dintre nr. fetelor si nr. elevilor =
,r2:5:2);
Culegere de probleme Structura liniar

29
end.

3.
program dobanda;
var
p, S, l : word;
x, y : real;
begin
write(Suma = ); readln(S);
write(Dobanda = ); readln(p);
write(Nr. luni = ); readln(l);
x:=S*p/100;
write(Dobanda pe un an = ,x:5:2)
y:=x*l/12;
write(Dobanda pe ,l, luni = ,y:5:2)
end.

4.
program teren;
var p1, p2, p3, q, t, p, g, o : real;
begin
write(Teren cu porumb (%)=); readln(p1);
write(Teren cu grau (%)=); readln(p2);
write(Teren cu orz (%)=); readln(p3);
write(Teren cu floarea-soarelui (ha)=); readln(q);
t:=q*100/(100-p1-p2-p3);
write(Aria terenului (ha) =,t:5:2);
p:=t*p1/100; write(Teren cu porumb (ha)=,p:5:2);
g:=t*p2/100; write(Teren cu grau (ha)=,g:5:2);
o:=t*p3/100; write(Teren cu orz (ha)=,o:5:2);
end.

5.
program bazin;
var a, b, c, vol : real;
begin
write(Lungime bazin = ); readln(a);
write(Latime bazin = ); readln(b);
write(Adancime bazin = ); readln(c);
vol:=a*b*c;
write(Volum bazin = ,vol)
end.

6.
program ore_somn;
var N : byte;
somn : longint;
begin
write(Varsta persoana = ); readln(N);
somn:=8*365*N;
write(Persoana doarme ,somn, ore.)
end.

7.
program curte;
var
l1, l2, x, aria : word;
vol : real;
begin
writeln(Dimensiunile curii:);
write(l1 (m) = ); readln(l1);
write(l2 (m) = ); readln(l2);
write(Grosimea asfaltului (cm) = ); readln(x)
aria:=l1*l2;
writeln(Aria suprafeei asfaltate = ,aria);
vol:=aria*x*0.01;
write(Volumul asfaltului = ,vol:5:2, m);
end.

8.
program medie;
var
Culegere de probleme Structura liniar

30
n1, n2, n3, t, med2 : byte;
med1 : real;
begin
writeln(Notele la oral);
write(Nota 1 = ); readln(n1);
write(Nota 2 = ); readln(n2);
write(Nota 3 = ); readln(n3);
write(Nota la teza = ); readln(t);
med1:=(n1+n2+n3)/3;
med1:=(3*med1+t)/4;
writeln(Media semestrial (cu 2 zecimale)= ,med1:5:2);
med2:=round(med1);
write(Media semestrial (rotunjita) = ,med2);
end.

9.
program ecuaie;
var
a, b : word;
x : real;
begin
write(a = );readln(a);
write(b = );readln(b);
x:=-b/a;
write(Solutia = ,x:5:2)
end.

10.
program cub;
var l, sm, sa, vol : word;
begin
write(Latura cub = ); readln(l);
vol:=l*l*l;
writeln(Volum cub = ,vol);
sm:=12*l;
writeln(Suma muchii = ,sm);
sa:=6*l*l;
write(Suma ariilor feelor = ,sa)
end.
Culegere de probleme Structura alternativ

2.2. STRUCTURA ALTERNATIV

2.2.1. Instruciunea IF

Instruciunea IF are dou forme.

Forma 1:

31

IF condiie THEN
instruciune1
ELSE
Instruciune2
Forma 2:

IF condiie THEN
instruciune



Condiie este o expresie boolean, instruciune1, instruciune2 i instruciune sunt instruciuni Pascal. Executarea
instruciunii IF se realizeaz astfel:
- se evalueaz condiia;
- dac valoarea sa este true se execut instruciune1i se trece la instruciunea urmtoare, altfel se execut instruciune2,
dac folosim forma 1 a instruciunii, iar dac folosim forma 2 nu se execut nimic.

Diagrama de sintax a instruciunii IF este urmtoarea:
Instruciunea
IF


Problema 1. Se d un numr natural n. S se determine dac acest numr este ori par, ori impar.

Rezolvarea problemei:
Date de intrare: numrul natural n.
Date de ieire: se afieaz pe ecran unul din urmtoarele mesaje:
- Numr par, n cazul n care n este numr par;
- Numr impar, n cazul n care n este numr impar;
Expresie
(boolean) Instruciune 1 IF
THEN ELSE
Instruciune 2
Culegere de probleme Structura alternativ
Funcia programului: Se determin dac un numr este par sau impar. Pentru aceasta se verific valoarea de adevr a condiiei
n mod 2 = 0 (restul mpririi lui n la 2 este egal cu zero). n cazul n care este adevrat aceast condiie nseamn c numrul
dat este par, n caz contrar, adic condiia este fals numrul dat este impar.


Schema logic:

32
START


n mod 2 = 0
Citete n


DA NU



Scrie Numr par Scrie Numr impar





STOP


Algoritmul n pseudocod:

Par_impar nseamn:
nceput
scrie(n = );citete(n);
dac n mod 2 = 0 atunci scrie(Numr par)
altfel scrie(Numr impar)
sfrit.


Programul Pascal:

program par_impar;
var n : integer;
begin
write(n = ); readLn(n);
if n mod 2 = 0 then write(Numar par)
else write(Numar impar)
end.

Problema 2. Se citesc de la tastatur trei numere. S se afieze cel mai mare numr citit.

Rezolvarea problemei:
Date de intrare: cele trei numere care sunt date de variabilele a, b i c.
Date de ieire: cel mai mare numr citit (care este dat de variabila max dac se alege soluia I).
Funcia programului:
Soluia I:
Se determin cel mai mare numr citit astfel:
- se consider c cel mai mare numr citit este a. Deci variabila max va primi valoarea variabilei a;
- se compar max cu b. n cazul n care valoarea lui b este mai mare dect valoarea lui max, atunci max va
primi valoarea lui b;
Culegere de probleme Structura alternativ
- se compar max cu c. n cazul n care valoarea lui c este mai mare dect valoarea lui max, atunci max va
primi valoarea lui c.

Schema logic:

33































Algoritmul n pseudocod:
START


Maxim1 nseamn:
Citete a,b,c
nceput
scrie(a = ); citete(a);
scrie(b = ); citete(b);
max na
scrie(c = ); citete(c);
max:=a;
dac b>max atunci max:=b;
dac c>max atunci max:=c;
scrie(Maximul este ,max)
sfrit.


Programul Pascal:


program maxim1;
var a,b,c,max : integer;
begin
write('a = ');read(a);
write('b = ');read(b);
write('c = ');read(c);
max:=a;
if b>max then max:=b;
if c>max then max:=c;
write('Maximul este ',max)
end.

Scrie max
b>max
DA
max nb
c>max
DA
max nc
STOP
NU
NU
Culegere de probleme Structura alternativ

Soluia II:
Se determin cel mai mare numr astfel:
Se compar a i b. Avem dou situaii:
- Cel mai mare numr este a i se compar a i c. Dac maximul este a, se afieaz acesta i algoritmul se
ncheie. n caz contrar, se compar b i c. Dac b<c atunci maximul este c, se afieaz acesta i algoritmul se
ncheie. n caz contrar, maximul este b, se afieaz acesta i algoritmul se ncheie.
- Cel mai mare numr este b i se compar b i c. Dac b>c atunci maximul este b, se afieaz i algoritmul se
ncheie. n caz contrar, se compar a i c. Dac c< a atunci maximul este c, se afieaz i algoritmul se ncheie.
n caz contrar, maximul este a, se afieaz i algoritmul se ncheie.


Schema logic:
START
Algoritmul n pseudocod:


Citete a,b,c
maxim2 nseamn:
nceput
scrie(a = );citete(a);
34
a>b
DA NU
scrie(b = );citete(b);
scrie(c = );citete(c);
NU
b>c
DA
Scrie b
NU
c>a
DA NU
Scrie c Scrie a
a>c
DA
Scrie a
dac a>b atunci
dac a>c atunci scrie(a)
altfel
dac b<c atunci scrie(c)
b<c
DA NU
altfel scrie(b)
altfel
Scrie c Scrie b
STOP
dac b>c atunci scrie(b)
altfel
dac c>a atunci scrie(c)
altfel scrie(a)
sfrit.





Culegere de probleme Structura alternativ

Programul Pascal:

35


program maxim2;
var a,b,c,max : integer;
begin
write('a = ');read(a);
write('b = ');read(b);
write('c = ');read(c);
if a>b then

if a>c then write(a)
else
if b<c then write(c)
else write(b)
else
if b>c then write(b)
else
if c>a then write(c)
else write(a)
end.

Problema 3. Se dau trei numere a, b, c. S se testeze dac ele pot fi lungimile laturilor unui triunghi.

Rezolvarea problemei:
Date de intrare: numerele reale a, b, c.
Date de ieire: se afieaz unul dintre urmtoarele mesaje: Numerele date pot fi lungimi ale laturilor unui triunghi, Numerele
date nu pot fi lungimi ale laturilor unui triunghi
Funcia programului: se determin dac numerele date pot fi lungimi ale laturilor unui triunghi. Pentru aceasta, numerele
trebuie s fie pozitive i suma oricror dou numere s fie mai mare dect cellalt numr.

Schema logic:















Algoritmul n pseudocod:


Triunghi nseamn:
nceput
citete(a,b,c);
dac (a>0) I (b>0) I (c>0) I (a+b>c) I (a+c>b) I
(b+c>a)
atunci
scrie(Numerele date pot fi lungimi ale laturilor
unui triunghi)
altfel scrie(Numerele date nu pot fi lungimi ale
laturilor unui triunghi)
sfrit.


START
(a>0) I (b>0) I (c>0) I
(a+b>c) I (a+c>b) I (b+c>a)
DA NU
Scrie Nr date nu pot fi
lungimi ale lat. unui triunghi
Scrie Nr. date pot fi lungimi
ale lat. unui triunghi
Citete a,b,c
STOP
Culegere de probleme Structura alternativ

Programul Pascal:


program triunghi;
var a, b, c : integer;
begin
readln(a,b,c);
if (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b)
and (b+c>a) then
write(Numerele date pot fi lungimi ale laturilor unui
triunghi)
else write(Numerele date nu pot fi lungimi ale laturilor
unui triunghi)
end.

Problema 4. Se citesc de la tastatur numerele abci xyz cifr cu cifr. S se verifice care dintre ele este mai mic.

36
START
Rezolvarea problemei:
Date de intrare: dou numere pentru care se dau cifrele lor. Astfel, primul
numr are cifrele date de variabilele a,b i c, iar cel de-al doilea numr are
cifrele date de variabilele x, y i z.
Citete a,b,c,x,y,z
a<x
DA NU
Scrie a,b,c
Date de ieire: se afieaz pe ecran cel mai mic numr dintre cele dou numere
sau mesajul Sunt egale., dac cele dou numere sunt egale.
b>y
DA NU
Scrie x,y,z
b<y
DA NU
Scrie a,b,c
a>x
DA NU
Scrie x,y,z
c<z
DA NU
Scrie a,b,c
c>z
DA NU
Scrie x,y,z
Scrie Sunt egale
Funcia programului: se verific care dintre cele dou numere este mai mic.
Pentru aceasta se compar cifrele sutelor, cifrele zecilor, respectiv
cifrele unitilor celor dou numere.
Dac din compararea cifrelor sutelor celor dou numere rezult c
una este mai mic atunci acest numr este mai mic, se
afieaz pe ecran i algoritmul se ncheie. n cazul n care
obinem c cele dou cifre sunt egale, se trece la
compararea cifrelor zecilor celor dou numere. Dac
rezult c una este mai mic atunci numrul
corespunztor este mai mic, se afieaz pe ecran
i algoritmul se ncheie. n cazul n care
obinem c cele dou cifre sunt egale, se
trece la compararea cifrelor unitilor.
Dac rezult c una dintre cifre
este mai mic atunci numrul
corespunztor este mai
mic, se afieaz pe
ecran i algoritmul
se ncheie. n cazul n care
obinem c cele dou cifre sunt egale, nseamn c cele dou
numere sunt egale, se afieaz mesajul Sunt egale. i
algoritmul se ncheie.
STOP
Culegere de probleme Structura alternativ

37
Algoritmul n pseudocod:


Numere nseamn:
nceput
scrie('a = '); citete(a); scrie('b = '); citete(b);
scrie('c = '); citete(c); scrie('x = '); citete(x);
scrie('y = '); citete(y); scrie('z = '); citete(z);
dac a<x atunci scrie('abc = ',a,b,c)
altfel dac a>x atunci scrie('xyz = ',x,y,z)
altfel dac b<y atunci scrie('abc = ',a,b,c)
altfel dac b>y atunci scrie('xyz = ',x,y,z)
altfel dac c<z atunci scrie('abc=',a,b,c)
altfel
dac c>z atunci scrie('xyz =
',x,y,z)
altfel scrie('Sunt egale.')
sfrit.







Programul Pascal:


program numere;
var a,b,c,x,y,z : integer;
begin
write('a = ');read(a); write('b = ');read(b);
write('c = ');read(c); write('x = ');read(x);
write('y = ');read(y); write('z = ');read(z);
if a<x then write('abc = ',a,b,c)
else
if a>x then write('xyz = ',x,y,z)
else
if b<y then write('abc = ',a,b,c)
else
if b>y then write('xyz = ',x,y,z)
else
if c<z then write('abc = ',a,b,c)
else
if c>z then write('xyz = ',x,y,z)
else write('Sunt egale.')
end.


Problema 5. Un copil merge pe o osea i trece prin dreptul unui marcaj A pe care exist o specificaie n kilometri, metri,
centimetri i milimetri, apoi merge o distan d dat n milimetri. S se determine punctul B n care ajunge dup parcurgerea
distanei d. Punctul B se va specifica prin kilometri, metri, centimetri i milimetri. De exemplu dac punctul A este dat de:
36km, 999m, 99 cm, 9mm i d=2001mm, atunci B este dat de 37km, 2m, 0cm,0mm.

Rezolvarea problemei:
Date de intrare:Specificaia n kilometri, metri, centimetri i milimetri a unui marcaj A dat de variabilele akm, am, acm,
respectiv amm. Distana parcurs (n milimetri) dat prin variabila d.
Date de ieire: specificaia punctului B n care se ajunge dup parcurgerea distanei d plecnd din punctul A. Aceasta este dat
de ctre valorile variabilelor bkm, bm, bcm, bmm care se afieaz pe ecran.
Funcia programului: Se determin specificaia punctului B n care se ajunge parcurgnd distana d din punctul A.

Culegere de probleme Structura alternativ
Schema logic:
1
START


38




































Citete akm,am,acm,amm,d
bkmnakm
bmnam
bcmnacm
bmmnamm
d>0
DA
d div 10 < 1
DA
bmmnbmm+d bmmnbmm+d mod 10
dnd div 10
NU
NU
1
bmm div 10 <> 0
bcmnbcm+bmm div 10
bmm nbmm mod 10
DA NU
NU
d>0
DA
d div 10 < 10
DA
bcmnbcm+d mod 10 bcmnbcm+d
dnd div 10
NU
NU
bcm div 100 <> 0
DA
n bm bm+bcm div 100
n bcm bcm mod 100
2
Culegere de probleme Structura alternativ

39
2

3
dnd div 1000

NU
d>0
DA
d div 10<100

Scrie bkm,bm,bcm,bmm
DA
bmnbm+d bmnbm+d mod 10


NU
STOP



Algoritmul n pseudocod:


Sosea nseamn:
nceput
citete(akm, am, acm, amm); citete(d);
bkm:=akm; bm:=am; bcm:=acm; bmm:=amm;
dac d>0 atunci
nceput
NU
bm div 1000 <> 0
DA
dac d div 10 < 1 atunci
bkmnbkm+bm div 1000
bm nbm mod 1000
bmm:=bmm+d
altfel bmm:=bmm + d mod 10;
d:=d div 10
sfrit;
dac bmm div 10 <> 0 atunci
nceput
bcm:=bcm + bmm div 10; NU
d>0
DA
bmm:=bmm mod 10
d div 10<100
DA
bkmnbkm+d bkmnbkm+d mod 10
sfrit;
dac d>0 atunci
NU
nceput
dac (d div 10 < 10) atunci bcm:=bcm+d
altfel bcm:=bcm + d mod 10;
d:=d div 100;
sfrit;
dac bcm div 100 <> 0 atunci
nceput
3
bm:=bm + bcm div 100;
bcm:=bcm mod 100
Culegere de probleme Structura alternativ

40
sfrit;
dac (d>0) atunci
nceput
dac d div 10 < 100 atunci bm:=bm+d
altfel bm:=bm + d mod 10;
d:=d div 1000;
sfrit;
dac bm div 1000 <> 0 atunci
nceput
bkm:=bkm + bm div 1000;
bm:=bm mod 1000
sfrit;
dac d > 0 atunci
dac d div 10 < 100 atunci bkm:=bkm+d
altfel bkm:=bkm + d mod 10;
scrie(bkm,'km ', bm,'m ', bcm,'cm ', bmm,'mm');
sfrit.


Programul Pascal:


program sosea;
var akm,am,acm,amm,d,bkm,bm,bcm,bmm : longint;
begin
readln(akm);readln(am);readln(acm);readln(amm);readln(d);
bkm:=akm; bm:=am; bcm:=acm; bmm:=amm;
if d>0 then
begin
if d div 10 < 1 then bmm:=bmm+d
else bmm:=bmm + d mod 10;
d:=d div 10
end;
if bmm div 10 <> 0 then
begin
bcm:=bcm + bmm div 10;
bmm:=bmm mod 10
end;
if d>0 then
begin
if (d div 10 < 10) then bcm:=bcm+d
else bcm:=bcm + d mod 10;
d:=d div 100;
end;
if bcm div 100 <> 0 then
begin
bm:=bm + bcm div 100;
bcm:=bcm mod 100
end;
if (d>0) then
begin
if d div 10 < 100 then bm:=bm+d
else bm:=bm + d mod 10;
d:=d div 1000;
end;
if bm div 1000 <> 0 then
begin
bkm:=bkm + bm div 1000;
bm:=bm mod 1000
end;
if d > 0 then
if d div 10 < 100 then bkm:=bkm+d
else bkm:=bkm + d mod 10;
write(bkm,'km ');write(bm,'m ');write(bcm,'cm
');write(bmm,'mm');
end.



Culegere de probleme Structura alternativ

41
2.2.2. TESTE
TEST 1

T1.1. Ce determin executarea secvenei de program?

readln(a,b,c);
if a<=b then b:=b+c;
a:=a+c
else c:=a+b;

T1.2. Se consider declaraiile:

Var
a, b, c : integer;
x, y, z : boolean;

Indicai instruciunile if corect scrise.

a) if a+b>c then write(c,este mai mic dect suma
numerelor ,a, i ,b);
b) if a>0 and c<1 then writeln(a*c); else write(a+c);
c) if x and (b>0) then write(b);

T1.3. Se consider declaraiile:

Var a, b, c : integer;

Dup efectuarea urmtoarelor operaii alegei care este
varianta corect pentru valoarea variabilei a.

a) a:=5; c:=3; if a mod 3 > 1 then b:=a+2; a:=b+c;

Rspunsul este: I) 7 II) 5 III) 10.

b) b:=1; c:=7; if c < 7 then a:=1 else b:=c+1; a:=b-1;

Rspunsul este: I) 1 II) 7 III) 0.

c) c:=4; a:=4; if a+c>0 then a:=a-2 else b:=a-2; a:=a+2;

Rspunsul este: I) 4 II) 2 III) 6.

T1.4. Introducei i executai urmtorul program Pascal.
Stabilii funcia sa.

program stabilete1;
var d, n : byte;
begin
writeln('Stabileste funcia programului.');
write('n = ');read(n);
write('d = ');read(d);
if n mod d = 0 then writeln('Da.')
else writeln('Nu.')
end.

T1.5. Scriei programul Pascal pentru rezolvarea urmtoarei
probleme.
Se citete o liter i se stabilete dac aceasta este
vocal.
Culegere de probleme Structura alternativ
TEST 2.

T2.1. Ce determin executarea secvenei de program?

read(y,x0,x1,eps);
if (y>=x0) and (y<=x1) then y:=(x0+x1)/2;
else x0:=x0+eps; x1:=x1+eps;

T2.2. Se consider declaraiile:

Var
a0, a1, x : word;
s1, s2 : string[5];

Indicai instruciunile if corect scrise.

a) if a0+a1> x then write(a0+a1);
b) if a0<x and a1>x then writeln(x);
c) if s1 and (a0>0) then writeln(s2); else writeln(s1);

T2.3. Se consider declaraiile:

Var x, y, z : byte;

Dup efectuarea urmtoarelor operaii alegei care este
varianta corect pentru valoarea variabilei x.

a) x:=7; z:=3; if x mod 3 < 2 then y:=z+2; x:=y+z;

Rspunsul este: I) 7 II) 2 III) 8.

b) y:=0; z:=2; if z < 7 then x:=1 else z:=y+1; x:=z-1;

Rspunsul este: I) 2 II) 1 III) 0.

c) x:=4; y:=8;
if x+y<=12 then x:=x-2 else x:=x+2; x:=y+2;

Rspunsul este: I) 10 II) 2 III) 6.

T2.4. Introducei i executai urmtorul program Pascal.
Stabilii funcia sa.

program stabilete2;
var x : real;
begin
writeln(Stabileste functia programului.);
write(x = );readln(x);
if x=0 then write(zero)
else if x>0 then write(pozitiv) else write(negativ);
end.

T2.5. Scriei programul Pascal pentru rezolvarea urmtoarei
probleme.
Fie n= xzy un numr natural de trei cifre. Cunoscnd
cifrele x, y i z, s se testeze dac n este divizibil cu
numrul 3

42
Culegere de probleme Structura alternativ

43
TEST 3.

T3.1. Ce determin executarea secvenei de program?

read(b);
if b:=0 then write(Numar nul.)
else write(Numar nenul.);

T3.2. Se consider declaraia:

Var a : word;

Indicai instruciunile if corect scrise.

a) if a > 0 then write(Numr negativ);
b) if a:=0 then writeln(Numr nenul);
c) if a<0 then write(Nr negativ); else write(Nr pozitiv);

T3.3. Se consider declaraiile:

Var s1, s2, s3 : integer;

Dup efectuarea urmtoarelor operaii alegei care este
varianta corect pentru valoarea variabilei s1.

a) s1:=75; if s1 div 4 < 2 then s2:=s1+2 else s2:=s1+4;
s1:=s2+2;

Rspunsul este: I) 81 II) 79 III) 77.

b) s2:=10; s3:=12;
if s2 < 7 then s1:=1 else s3:=s3+1; s1:=s3;

Rspunsul este: I) 1 II) 13 III) 12.

c) s1:=20; s3:=40;
if s1 div s3 > 0 then s2:=0 else s2:=1; s1:=s2;

Rspunsul este: I) 20 II) 0 III) 1.

T3.4. Introducei i executai urmtorul program Pascal.
Stabilii funcia sa.

program stabilete3;
var a, b, c : word;
begin
writeln(Stabilete funcia programului.);
readln(a,b,c);
if ((a*a+b*b=c*c) or (b*b+c*c=a*a) or (c*c+a*a=b*b))
then write(a,b,c, sunt pitagorice.)
else write(a,b,c, nu sunt pitagorice.)
end.

T3.5. Scriei programul Pascal pentru rezolvarea urmtoarei
probleme.
Se dau trei numere a,b i c. S se testeze dac acestea
formeaz un triunghi isoscel.
Culegere de probleme Structura alternativ
2.2.3. PROBLEME PROPUSE

44









1. Se citete un numr n. S se verif ice dac
numrul este pozitiv sau negativ.
2. Se citesc numerel e nenul e n i m. Dac cel e
dou numere sunt pozitive atunci se cal cul eaz
suma acestora, n caz contrar se cal cul eaz
produsul acestora.
3. Se citesc numerel e x i y. Dac f racia x/y
este subunitar atunci s se cal cul eze raportul
dintre y i x.
4. Se citesc numerel e a i b. Dac cel e dou
numere sunt dif erite atunci se cal cul eaz dif erena
acestora. Observaie: se va scdea numrul mai mic
din numrul mai mare.
5. Se citesc numerel e x, y, z. S se af ieze cel
mai mic numr citit.
6. Se citesc numerel e a, b, c. S se af ieze
aceste numere n ordine cresctoare.
7. Se citesc numerel e a, b, c. S se af ieze
aceste numere n ordine descresctoare.
8. Se citesc numerel e ntregi x i y. S se
l l ui y. verif ice dac x este divizor a
9. Se citesc numerel e ntregi n i m. S se
verif ice dac n este divizibil cu m.
10. S se verif ice dac numrul ntreg a, citit
de l a tastatur, este divizibil cu 3.
11. S se verif ice dac numrul ntreg n, citit
de l a tastatur, este divizibil cu 4.
12. Se citete vrsta unei persoane
( exprimat n ani) i se af ieaz dac este major
sau minor.
13. Se citete o l iter i se af ieaz un mesaj
dac ea este consoan sau vocal .
14. Fie n= xzy un numr natural de trei cif re.
Cunoscnd numai cif rel e x, y i z, s se testeze
dac n este divizibil cu numrul 9.
15. Fie n= vxyz un numr natural de patru
cif re. Cunoscnd numai cif rel e v, x, y i z, s se
testeze dac n este divizibil cu numrul 7.
Rezolvai problemele utiliznd
limbajul de programare Pascal.
Culegere de probleme Structura alternativ
2.2.4. Instruciunea CASE.


Instruciunea case transcrie o structur condiional mai general dect structura IF-THEN-ELSE, care permite alegerea
nei alternative din mai multe posibile. Sintaxa acestei instruciuni este urmtoarea: u


Instruciunea
CASE

45
case
Expresie
(ordinal)
Alternative
(case)
of end instruciune
else



alternative
case









Expresia ordinal din diagram se numete selector, iar constantele, al cror tip trebuie s fie identic cu al selectorului,
se numesc constante case. Construcia constanta1 .. constanta2 dintr-o alternativ case semnific toate valorile aparinnd
intervalului definit de cele dou constante.
case se realizeaz astfel: Executarea instruciunii
I) Se evalueaz selectorul;
II) Se caut alternativa case care cuprinde valoarea selectorului. Dac se gsete o asemenea alternativ, se execut
instruciunea care o urmeaz. n caz contrar, se execut instruciunea care urmeaz cuvntului cheie else, n lipsa
acestuia nu se execut nimic.


roblema 1. Se citete numrul de ordine al unei zile a sptmnii i se afieaz denumirea sa. P

Rezolvarea problemei:
Date de intrare: numrul de ordine al unei zile nr.
Date de ieire: Se afieaz denumirea zilei ce are numrul de ordine nr.
constanta1
Instruciune
:
..
Constanta2
;
,
Culegere de probleme Structura alternativ

46
uncia programului: se determin denumirea unei zile dac se cunoate numrul su de ordine. F

lgoritm n pseudocod: A

mn: Zi nsea
nceput
citete(nr);
n caz c nr este
1 : scrie(LUNI);
2 : scrie(MARI);
; 3 : scrie(MIERCURI)
4 : scrie(JOI);
5 : scrie(VINERI);
6 : scrie(SMBT);
7 : scrie(DUMUNIC);
l scrie(Nr. citit necorespunzator.); altfe
gata
frit s



Programul Pascal:

program zi;
: 1..7; var nr
begin
e ordine al zilei ');readln(nr); write('Nr. d
case nr of
1 : writeln('LUNI');
2 : writeln('MARTI');
CURI'); 3 : writeln('MIER
4 : writeln('JOI');
5 : writeln('VINERI');
6 : writeln('SAMBATA');
7 : writeln('DUMINICA');
lse writeln('Nr. citit necorespunzator.') e
end
end.

roblema 2. Se citete un numr i se determin dac acesta este cifr zecimal. P

Rezolvarea problemei:
Date de intrare: numrul nr.
Date de ieire: se afieaz mesajul 'CIFRA ZECIMALA' dac numrul citit este cifr zecimal, n caz contrar, afindu-se mesajul
Nr. citit nu este cifra zecimala.'.
uncia programului: Se determin dac numrul citit este cifr zecimal. F

lgoritmul n pseudocod: A


imal nseamn: Cifra_zec
nceput
mr );citete(nr); scrie(Citii un nu
n caz c nr este
0..9 : scrie(CIFR ZECIMAL);
altfel scrie('Nr. citit nu este cifra zecimala.');
ta
Sfrit.
_zecimala;
ga



Programul Pascal:

m cifra progra
Culegere de probleme Structura alternativ

47
e writeln('Nr. citit nu este cifra zecimal.'); var nr : byte;
begin
write('Cititi un numar ');readln(nr);
case nr of
0..9 : writeln('CIFRA ZECIMAL');
els
end
nd. e




roblema 3. Se citete o liter i se determin dac aceasta este vocal sau consoan. P

Rezolvarea problemei:
Date de intrare: litera l.
nu s-a citit o liter. Date de ieire: se afieaz un mesaj dac litera citit este vocal, consoan sau
uncia programului: se determin dac litera citit este vocal sau consoan. F


lgoritmul n pseudocod: A


eamn: Litera ns
nceput
tera '); citete(l); scrie('Cititi o li
lm:=upcase(l);
n caz c lm este
U : scrie(Vocal); A,E,I,O,
altfel
ie(Consoan) dac (lm>A) and (lm<=Z) atunci scr
ltfel scrie(Nu s-a introdus o liter.) a
gata
frit. s


Programul Pascal:


program litera;
m : char; var l,l
begin
tera ');read(l); write('Cititi o li
e(l); lm:=upcas
case lm of
','I','O','U' : write('Vocala'); 'A','E
else
onsoana') if (lm>'A') and (lm<='Z') then write('C
else write('Nu s-a introdus o litera.')
end
end.

roblema 4. Se citete numrul de ordine al unei luni calendaristice i se va afia anotimpul corespunztor acestei luni. P

Rezolvarea problemei:
Date de intrare: numrul unei luni, luna.
Date de ieire: Denumirea anotimpului corespunztor lunii calendaristice.
Culegere de probleme Structura alternativ

48
uncia programului: se determin anotimpul din care face parte luna calendaristic. F

lgoritmul n pseudocod: A


nseamn: Anotimp
nceput
l lunii = ); scrie(Numru
citete(luna);
n caz c luna este
12,1,2 : scrie(IARNA);
ARA); 3..5 : scrie(PRIMV
6..8 : scrie(VARA);
9..11 : scrie(TOAMNA);
altfel scrie(Nu este numrul unei luni);
ata g
frit. s


Programul Pascal:


; program anotimp
na : 1..12; var lu
begin
ul lunii = ');readln(luna); write('Numar
case luna of
12,1,2 : writeln('IARNA');
ARA'); 3..5 : writeln('PRIMAV
6..8 : writeln('VARA');
9..11 : writeln('TOAMNA');
lse writeln('Nu este numarul unei luni.') e
end
end.

roblema 5. Se dau trei numere a, b, c. S se testeze dac ele pot fi lungimi ale laturilor unui triunghi. P

Rezolvarea problemei:
Date de intrare: numerele a, b, c.
. Date de ieire: se afieaz un mesaj dac cele trei numere pot fi lungimi ale laturilor unui triunghi
uncia programului: se determin dac numerele a, b, c pot fi lungimi ale laturilor unui triunghi. F

lgoritmul n pseudocod: A


nseamn: Triunghi
nceput
scrie(a = ); citete(a);
scrie(b = ); citete(b);
scrie(c = ); citete(c);
n caz c (a>0) I (b>0) I (c>0) I (a+b>c) I (a+c>b) I
(b+c>a) este
adevrat : scrie('Lungimile date pot forma un
fals : scrie('Lungimile date nu pot forma un
.');
gata

triunghi.');

riunghi t

sfrit.


Programul Pascal


Culegere de probleme Structura alternativ

49
);readln(c);

alse : writeln('Lungimile date nu pot forma un triunghi.');
end.
program triunghi;
var a,b,c : integer;
begin
write('a = ');readln(a);
write('b = ');readln(b);
write('c = '
case (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and
(b+c>a) of
true : writeln('Lungimile date pot forma un triunghi.');
f
end






Culegere de probleme Structura alternativ

50
2.2.5. TESTE
TEST 1

T1.1. Ce determin executarea urmtorului program?

var b : string[2];
begin
readln(b);
case b of
d : write(Litera d.);
n : write(Litera n);
end
end.

T1.2. Se consider declaraiile:

var b : boolean; h : real; k : longint;

Indicai instruciunile case corect scrise.

a) case b of
true : writeln(adevarat);
false : writeln(fals);
end;
b) case h of
4.0 : writeln(patru);
5.0 : writeln(cinci);
6.0 : writeln(sase);
end;
c) case k of
10 : writeln(zece);
100 : writeln(suta);
end;

T1.3. Se consider declaraiile:

Var l, m, n : integer; v : boolean; a, q : single;

Dup efectuarea urmtoarelor operaii alegei care este
varianta corect pentru valoarea variabilei a.

a) l:=1; a:=1.0;
case l of
2 : begin writeln(nr. par); a:=2.0 end;
1 : begin write(nr. impar); a:=3.0 end;
else write(Nr. diferit de 1 si 2.)
end;

Rspunsul este: I) 1.0 II) 2.0 III) 3.0.

b) m:=4; n:=1; v:=(m>2) and (n<2);
case v of
false : a:=0.0;
true : a:=1.0;
else a:=2.0;
end;

Rspunsul este: I) 0.0 II) 1.0 III) 2.0

c) q:=3.0; a:=0.0; read(n);
case n of
1 : a:=1.0;
2 : a:=2.0;
3 : a:=3.0;
end;
a:=4.0;

Rspunsul este: I) 4.0 II) 0.0 III) 3.0.

T1.4. Scriei programul Pascal pentru rezolvarea urmtoarei
probleme.
Se citete o liter i se stabilete dac este majuscul.
Culegere de probleme Structura alternativ

51
TEST 2

T2.1. Ce determin executarea urmtorului program?

var a : boolean;
begin
a:=true;
case a of
false : writeln(FALS);
true : writeln(ADEVRAT);
end
end.

T2.2. Se consider declaraiile:

Var a : shortint; l, m : char; s : string;

Indicai instruciunile case incorect scrise.

a) case s of
da : writeln(DA);
nu : writeln(NU);
else writeln(posibil);
end;
b) case l of
a : begin m:=upcase(l); writeln(m) end;
b : writeln(B); end;
c) case a of
-128 : writeln(Limita inferioar.)
127 : writeln(Limita superioar);
end;

T2.3. Se consider declaraiile:

Var v : boolean; a, b : byte; c, d : real;

Dup efectuarea urmtoarelor operaii alegei care este
varianta corect pentru valoarea variabilei v.

a) b:=2; c:=2.0;
v:=(b>=2) or (c>=2);
case v of
true : writeln(condiie adevarata);
false : writeln(condiie fals);
end;

Rspunsul este: I) false II). true

b) a:=4;
case a of
10 : begin writeln(Elev de nota 10.); v:=true end;
else v:=false;
end;

Rspunsul este: I) true II).false.

c) d:=5.0;
b:=8;
case b of
1,2,3,4 : begin
write(Nepromovat);
v:=(d>=5) and (b>=5) end;
else if (b>4) and (b<11) then v:=false;
end;

Rspunsul este: I) false II) true.

T2.4. Scriei programul Pascal pentru rezolvarea urmtoarei
probleme.
Se citete un numr natural i s se afieze dac este
de ordinul unitilor, zecilor, sutelor sau miilor.
Culegere de probleme Structura alternativ

52

TEST 3

T3.1. Ce determin executarea urmtorului program?

const c=0;
var b : byte;
begin
b:=5;
case b of
0 : writeln(c);
1 : writeln(c+1);
2 : writeln(c+2);
end;
writeln(b)
end.

T3.2. Se consider declaraiile:

Var g, h : integer; j : real;

Indicai instruciunile case corect scrise.

a) case g of
10..99 : writeln(sute);
100..999 : write(zeci);
end;
b) case j of
0..9 : write(unitati);
else writeln(nu sunt unitati)
end;
c) case odd(h) of
true : write(impar);
false : write(par);
end;


T3.3. Se consider declaraiile:

Var q : shortint; b : real; a : integer;

Dup efectuarea urmtoarelor operaii alegei care este
varianta corect pentru valoarea variabilei q.

a) b:=4.6;
case (b>4) of
true : q:=1;
false : q:=0;
end;

Rspunsul este: I) 0.0 II) 0 III) 1.

b) a:=10; q:=3;
case succ(a) of
10 : q:=4;
11 : q:=5;
end;

Rspunsul este: I) 3 II) 5 III) 4.

c) q:=20;
case ord(q)>20 of
false : q:=21;
true : q:=22
end;

Rspunsul este: I) 21 II) 22 III) 20.

T3.4. Scriei programul Pascal pentru rezolvarea urmtoarei
probleme.
Se citete un numr i se afiaz dac este pozitiv,
negativ sau zero.
Culegere de probleme Structura alternativ
2.2.6. PROBLEME PROPUSE



53











1. Se citete numrul de ordine al unei zil e a
sptmnii i se verif ic dac este l ucrtoare sau
nel ucrtoare.
2. Se citete numrul de ordine al unei l uni
cal endaristice i se va af ia denumirea acesteia i
anotimpul corespunztor acestei l uni.
3. Se citete un numr ntreg i s se af ieze
dac este de ordinul unitil or, zecil or, sutel or sau
miil or.
4. Se citesc dou numere de ordinul zecil or, a i
b. Dac a este pozitiv, atunci se af ieaz dif erena
dintre a i b, n caz contrar, se af ieaz suma dintre
a i b.
5. Se citete un numr natural n cuprins ntre 2
i 7. S se af ieze numel e pol igonul ui convex cu n
l aturi.
6. Se citete un numr natural i se af ieaz
dac este par sau impar.
7. Se citete vrsta unei persoane ( exprimat n
ani) i se af ieaz dac este major sau minor.
8. Fie n= xzy un numr natural de trei cif re.
Cunoscnd numai cif rel e x, y i z, s se testeze dac
n este divizibil cu numrul 3.
9. . Fie n= vxyz un numr natural de patru cif re.
Cunoscnd numai cif rel e v, x, y i z, s se testeze
dac n este divizibil cu numrul 11.
10. Se ci t esc numerel e nenul e n i m. Dac cel e
dou numere sunt pozi t i ve at unci se
acest ora, n caz cont rar se cal cul e
acest ora.
11. S
cal cul eaz suma
az produsul
se apese o t ast i s se
af i eze crui t i p de t ast e i apar i ne.

Rezolvai problemele utiliznd
limbajul de programare Pascal.
Culegere de probleme Structura alternativ
RSPUNSURI

Structura alternativ.
1. Instruciunea IF

Test 1.
T1.1. Eroare, deoarece pe ramura lui then se gsesc dou
instruciuni.Corect ar fi ca pe ramura lui then s avem
instruciunea begin b:=b+c; a:=a+c end. T1.2. a, c. T1.3. a) III;
b) II; c) I. T1.4. Programul Pascal citete dou numere de tip
byte(d i n) i afiaz mesajul Da. dac d este divizor al lui n
sau mesajul Nu. dac d nu este divizor al lui n.
T1.5.
program vocala;
var l,lm : char;
begin
write('Citii o litera ');readln(l);
lm:=upcase(l);
if (lm='A') or (lm='E') or (lm='I') or
(lm='O') or (lm='U') then
writeln(l,' este vocal.')
end.

Test 2.
T2.1. Eroare, deoarece s-a scris ; naintea lui else. T2.2. a.
T2.3. a) III; b) II; c) I. T2.4. Programul Pascal citete de la
tastatur un numr real i afiaz un mesaj corespunztor
dac numrul este zero, pozitiv sau negativ.
T2.5.
program divizibil_3;
var x,y,z : byte;
begin
write('x=');readln(x);
write('z=');readln(z);
write('y=');readln(y);
if (x+y+z) mod 3 = 0 then write(x,z,y,' este divizibil cu 3.')
else write(x,z,y,' nu este divizibil cu 3.')
end.

Test 3.
T3.1. Eroare, deoarece condiia pus (b:=0) nu este expresie
boolean, ci instruciune de atribuire. T3.2. a. T3.3. a) I; b) II;
c) III. T3.4. Programul Pascal citete trei numere de tip word i
determin dac acestea sunt numere pitagorice.
T3.5.
program isoscel;
var a,b,c : integer;
begin
write('a=');readln(a);
write('b=');readln(b);
write('c=');readln(c);
if (a>0) and (b>0) and (c>0) and (a+b>c) and (b+c>a) and
(a+c>b) then
if (a=b) or (b=c) or (a=c) then writeln('Laturile formeaz un
triunghi isoscel.')
else writeln('Laturile nu formeaz un triunghi isoscel.')
else writeln('Nr. date nu pot forma un triunghi.')
end.

54
Culegere de probleme Structura alternativ
Probleme propuse.

1.
program pozitiv_negativ;
var n : double;
begin
write('Citii un numr ');
readln(n);
if n>0 then write(n,' este pozitiv.')
else if n<0 then write(n,' este negativ.')
else write('S-a citit zero.')
end.

2.
program numere;
var n, m : double;
begin
write('n = '); readln(n);

55
write('m = '); readln(m);
if (n>0) and (m>0) then write('Suma = ',n+m:5:2)
else write('Produsul = ',n*m:5:2)
end.

3.
program fracie;
var x, y : integer;
begin
write('x = '); readln(x);
write('y = '); readln(y);
if abs(x)<abs(y) then write(y/x:5:2)
else write('Fracia este supraunitar.')
end.

4.
program numere;
var a, b : real;
begin
write('a = ');readln(a);
write('b = ');readln(b);
if a<>b then
if a<b then write(b:5:2,'-',a:5:2,'=',b-a:5:2)
else write(a:5:2,'-',b:5:2,'=',a-b:5:2)
else write('Numerele citite sunt egale.')
end.

5.
program minim;
var x,y,z : integer;
begin
write('x=');readln(x);
write('y=');readln(y);
write('z=');readln(z);
if x<y then
if x<z then write('Minim=',x)
else
if y<z then
write('Minim=',y)
else write('Minim=',z)
else
if y<z then write('Minim=',y)
else
if x<z then write('Minim',x)
else write('Minim=',z)
end.

6.
program cresctor1;
var a,b,c : integer;
begin
write('a=');readln(a);
Culegere de probleme Structura alternativ

56
write('b=');readln(b);
write('c=');readln(c);
if a<b then
if b<c then write(a,',',b,',',c)
else
if c>a then write(a,',',c,',',b)
else write(c,',',a,',',b)
else
if a<c then write(b,',',a,',',c)
else
if b<c then write(b,',',c,',',a)
else write(c,',',b,',',a)
end.
Sau:
Program cresctor2;
var a,b,c,aux : integer;
begin
readln(a,b,c);
if a>b then
begin
aux:=a; a:=b; b:=aux
end;
if b>c then begin
aux:=b; b:=c; c:=aux
end;
if a>b then begin
aux:=a; a:=b; b:=aux
end;
write(a,' ',b,' ',c)
end.

7.
program descresctor1;
var a,b,c : integer;
begin
write('a=');readln(a);
write('b=');readln(b);
write('c=');readln(c);
if a>b then
if b>c then write(a,',',b,',',c)
else
if a>c then write(a,',',c,',',b)
else write(c,',',a,',',b)
else
if a>c then write(b,',',a,',',c)
else
if b>c then write(b,',',c,',',a)
else write(c,',',b,',',a)
end.
Sau:
program descresctor2;
var a,b,c,aux : integer;
begin
readln(a,b,c);
if a<b then
begin
aux:=a; a:=b; b:=aux
end;
if b<c then begin
aux:=b; b:=c; c:=aux
end;
if a<b then begin
aux:=a; a:=b; b:=aux
end;
write(a,' ',b,' ',c)
end.

8.
program divizor;
var x,y : longint;
begin
write('x = ');readln(x);
Culegere de probleme Structura alternativ

57
write('y = ');readln(y);
if y mod x = 0 then write(x,' este divizor al lui ',y)
else write(x,' nu este divizor al lui ',y)
end.

9.
program divizibil;
var n,m : longint;
begin
write('n = ');readln(n);
write('m = ');readln(m);
if n mod m = 0 then write(n,' este divizibil cu ',m)
else write(n,' nu este divizibil cu ',m)
end.

10.
program divizibil_3;
var a : longint;
begin
write('a = ');readln(a);
if a mod 3 = 0 then write(a,' este divizibil cu ',3)
else write(a,' nu este divizibil cu ',3)
end.

11.
program divizibil_4;
var n : longint;
begin
write('n = ');readln(n);
if n mod 4 = 0 then write(n,' este divizibil cu ',4)
else write(n,' nu este divizibil cu ',4)
end.

12.
program vrsta;
var v : integer;
begin
write('Vrsta = ');readln(v);
if (v<1) or (v>130) then write(v,' nu poate fi vrsta unei
persoane.')
else
if v<18 then write('Persoana este minor.')
else write('Persoana este major.')
end.

13.
program litera;
var l,lm : char;
begin
write('Litera=');read(l);
lm:=upcase(l);
if (lm='A') or (lm='E') or (lm='I') or (lm='O') or (lm='U')
then write('Vocala')
else if (lm>'A') and (lm<='Z') then write('Consoana')
else write('Nu s-a introdus litera.')
end.

14.
program divizibil_9;
var x,y,z,s : byte;
begin
write('x=');readln(x);
write('z=');readln(z);
write('y=');readln(y);
s:=x+y+z;
if s mod 9 = 0 then write(x,z,y,' este divizibil cu 9.')
else write(x,z,y,' nu este divizibil cu 9.')
end.

15.
program divizibil_7;
var v,x,y,z : byte; n : word;
Culegere de probleme Structura alternativ

58
begin
write('v=');readln(v);
write('x=');readln(x);
write('y=');readln(y);
write('z=');readln(z);
n:=z+y*10+x*100+v*1000;
if n mod 7 = 0 then write(n,' este divizibil cu 7.')
else write(n,' nu este divizibil cu 7.')
end.

2. Instruciunea CASE

Test 1.

T1.1. Eroare, deoarece selectorul instruciunii case nu este
expresie ordinal. T1.2. a, c. T1.3. a) III; b) II; c) I.
T1.4.
program majuscula;
var l : char;
begin
write('Litera = ');readln(l);
case l of
'A'..'Z' : writeln('Este MAJUSCUL.');
else writeln('Nu este majuscul.')
end
end.

Test 2.

T2.1. Se afiaz pe ecran mesajul ADEVRAT. T2.2. a. T2.3.
a) II; b) II; c) I.
T2.4.
program numr;
var nr : word;
begin
write('nr = ');readln(nr);
case nr of
0..9 : writeln(nr,' este de ordinul unitilor');
10..99 : writeln(nr,' este de ordinul zecilor');
100..999 : writeln(nr,' este de ordinul sutelor');
1000..9999 : writeln(nr,' este de ordinul miilor');
else writeln(nr,' este de ordin mai mare dect al miilor.')
end
end.

Test 3.

T3.1. Se afiaz pe ecran valoarea variabilei b, adic 5. T3.2. a,
c. T3.3. a) III; b) II; c) I.
T3.4.
program pozitiv_negativ;
var n : real;
begin
write('n = ');readln(n);
case n>0 of
true : writeln(n:5:2,' este pozitiv.');
false : if n=0 then writeln(n:4:2,' este zero.')
else writeln(n:5:2,' este negativ.')
end end.
Culegere de probleme Structura alternativ

59
Probleme propuse.

1.
program zi_lucrtoare;
var zi : 1..7;
begin
write('Nr. de ordine al zilei ');readln(zi);
case zi of
1..5 : writeln('Zi lucrtoare');
6,7 : writeln('Zi nelucrtoare');
else writeln('Nu este nr. de ordine al unei zile.')
end
end.

2.
program lun_anotimp;
var luna : 1..12;
begin
write('Numarul lunii = ');readln(luna);
case luna of
12 : begin write('Luna decembrie');write(' IARNA') end;
1 : begin write('Luna ianuarie'); write(' IARNA') end;
2 : begin write('Luna februarie');write(' IARNA') end;
3 : begin write('Luna martie');write(' PRIMAVARA') end;
4 : begin write('Luna aprilie');write(' PRIMAVARA') end;
5 : begin write('Luna mai');write(' PRIMAVARA') end;
6 : begin write('Luna iunie');write(' VARA') end;
7 : begin write('Luna iulie');write(' VARA') end;
8 : begin write('Luna august');write(' VARA') end;
9 : begin write('Luna septembrie');write(' TOAMNA') end;
10 : begin write('Luna octombrie');write(' TOAMNA') end;
11 : begin write('Luna noiembrie');write(' TOAMNA') end;
else writeln('Nu este numarul unei luni.')
end;
writeln
end.


3.
program numr;
var nr : integer;
begin
write('nr = ');readln(nr);
case nr of
-9..9 : writeln(nr,' este de ordinul unittilor');
-99..-10,10..99 : writeln(nr,' este de ordinul zecilor');
-999..-100,100..999 : writeln(nr,' este de ordinul sutelor');
-9999..-1000,1000..9999 : writeln(nr,' este de ordinul miilor');
else writeln(nr,' este de ordin mai mare dect al miilor.')
end
end.

4.
program numere;
var a,b : integer;
begin
write('a = ');readln(a);
write('b = ');readln(b);
case a of
10..99 : case b of
-99..-10,10..99 : writeln(a,'-',b,'=',a-b);
else writeln(b,' nu este de ordinul zecilor.')
end;
-99..-10 : case b of
-99..-10,10..99 : writeln(a,'+',b,'=',a+b);
else writeln(b,' nu este de ordinul zecilor.')
end;
else writeln(a,' nu este de ordinul zecilor.')
end
end.
Culegere de probleme Structura alternativ

60

5.
program figura;
var nr : byte;
begin
write('nr = ');readln(nr);
case nr of
3 : writeln('Triunghi');
4 : writeln('Patrulater');
5 : writeln('Pentagon');
6 : writeln('Hexagon');
7 : writeln('Heptagon');
else
if nr<3 then writeln('S-a citit un numr mai mic dect 3')
else writeln('S-a citit un numar mai mare decat 7')
end
end.

6.
program par_impar;
var n : word;
begin
write('Numrul natural = ');readln(n);
case odd(n) of
true : writeln(n,' este impar');
false : writeln(n,' este par');
end
end.

7.
program minor_major;
var v : integer;
begin
write('Vrsta persoanei = ');readln(v);
case v of
1..17 : writeln('Persoana este minor);
else
if (v<1) or (v>130) then writeln('Vrsta imposibil')
else writeln('Persoana este majora');
end
end.

8.
program numr;
var x,y,z : byte;
begin
write('x = ');readln(x);
write('y = ');readln(y);
write('z = ');readln(z);
case (x+y+z) mod 3 = 0 of
true : writeln(x,z,y,' este divizibil cu 3.');
false : writeln(x,z,y,' nu este divizibil cu 3.');
end
end.

9.
program divizibil_11;
var v,x,y,z : byte;
begin
write('v = ');readln(v);
write('x = ');readln(x);
write('y = ');readln(y);
write('z = ');readln(z);
case (z+y*10+x*100+v*1000) mod 11 = 0 of
true : writeln(v,x,y,z,' este divizibil cu 11.');
false : writeln(v,x,y,z,' nu este divizibil cu 11.');
end
end.

10.
program calcule;
var m,n : double;
Culegere de probleme Structura alternativ

61
begin
write('m = ');readln(m);
write('n = ');readln(n);
case (m>0) and (n>0) of
true : writeln('Suma este ',m+n:5:2);
false : writeln('Produsul este ',m*n:5:2);
end;
end.

11.
program tip_tast;
var tast : char;
begin
write('Apsai o tast ');readln(tast);
case tasta of
'a'..'z','A'..'Z' : writeln('Liter);
'0'..'9' : writeln('Cifra zecimal');
else writeln('Tasta special');
end
end.





Culegere de probleme Structura repetitiv
2.3. STRUCTURA REPETITIV


2.3.1. Instruciunea WHILE

I nstruci unea while descri e structura repeti ti v ( ci cl i c) cu test i nii al . Ea se mai numete instruciune de cicl are
( cicl u) cu test iniial sau instruciune de cicl are condiionat anterior. Are forma:

whi l e expresi e (bool ean) do
i nst ruc i une;

Di agrama de si ntax a acestei i nstruci uni este urmtoarea:

Instruciunea
while
while expresie(boolean)
do
instruciune




Expresi a di n di agram se numete condiie de cicl are, i ar i nstruci unea reprezi nt corpul cicl ul ui.
Executarea i nstruci uni i while const n urmtoarele:
1) -se evalueaz expresia boolean;
2) -dac expresia are valoarea true, se execut instruciunea specificat dup cuvntul cheie do i se revine la pasul 1;
-dac expresia are valoarea false, executarea programului continu cu instruciunea care urmeaz dup instruciunea while.


Problema 1.

1. S se cal cul eze suma S=1+ 2 ++ n.

Rezol varea probl emei:
Date de intrare: numrul ntreg pozi ti v n.
Date de ieire: suma i produsul pri mel or n numere ntregi pozi ti ve.
Funcia programul ui: Determi n suma S=1+2++n i produsul P=1*2*..*n. Pentru aceasta se i nii al i zeaz suma cu
zero i produsul cu 1. Vom fol osi o vari abi l i care va pri mi pe rnd val ori l e cel or n numere. I nii al l ui i i vom
atri bui val oarea 1. Trecerea l a numrul urmtor se real i zeaz pri n mri rea l ui i cu 1( i ncrementarea l ui i) .

62
Culegere de probleme Structura repetitiv

63











NU

DA







Al goritmul n pseudocod:

Suma_produs_n nseamn:
nceput
Scri e( n>0: ) ;ci tete( n) ;
S:=0; P:=1;
i : =1;
Ct ti mp i <=n execut
nceput
S:=S+i ;
P:=P*i ;
i :=i +1
sf ri t;
scri e( Suma este= ,S) ;
scri e( Produsul este= , P)
sfri t.




Programul Pascal :
START

Program sum_produs_n;
var i , s, p, n: i nt eger;
CITESTE n
begi n
wri t e( n>0: ); readl n(n);
S:=0
s: =0;
p: =1;
P:=1
i : =1;
whi l e i <=n do
i:=1
begi n
s: =s+i ;
p: =p*i ;
i<=n
SCRIE S
i : =i +1
end;
S:=S+i
SCRIE P
wri t e( Suma est e , s);
wri t e( Produsul est e , p)
P:=P*i
readl n
STOP
end.
i:=i+1


Problema 2.

Afl ai numerel e natural e x i y ti i nd c . 180 y * x x
2 3
= +

Rezol varea probl emei:
Date de intrare: nu se i ntroduc date de l a tastatur.
Date de ieire: val ori l e l ui x i y;

Funcia programul ui: Determi n val ori l e l ui x i y care veri fi c egal i tatea . Val ori l e posi bi l e al e
l ui x sunt:
180 y * x x
2 3
= +
5 , 1 . Val ori l e posi bi l e al e l ui y sunt 179 , 1 . I ni i al l ui x i vom atri bui val oarea 1.Pe rnd pentru
fi ecare val oare a l ui x se testeaz val ori l e posi bi l e al e l ui y i se veri fi c care ndepl i nesc egal i tatea.
Trecerea de l a o val oare l a al ta att pentru x ct i pentru y se real i zeaz pri n mri rea vari abi l el or cu 1.


Culegere de probleme Structura repetitiv


64




DA


NU NU


DA

NU
DA








Al goritmul n pseudocod:

Numere nseamn:
nceput
x:=1;
ct ti mp x<=5 execut
nceput
y:=1;
ct ti mp y<=179 execut
nceput
dac x*x*x+x*x*y=180
atunci
scri e( x, ,y) ;
y:=y+1;
sfri t;
x: =x+1;
sfri t
sfri t.



Programul Pascal :
STOP
START
x:=1
x<=5 y:=1
x
3
+x
2
*y=18
y<=179
SCRIE
x,y
y:=y+1
x:=x+1

program numere;
var x, y: byt e;
begi n
x: =1;
whi l e x<=5 do
begi n
y: =1;
whi l e y<=179 do
begi n
i f x*x*x+x*x*y=180 t hen
wri t el n(x, ' ' , y);
y: =y+1;
end;
x: =x+1;
end;
readl n
end.


Problema 3.
S se determi ne numerel e de forma 3 b 2 a care sunt di vi zi bi l e cu 11 unde a, b sunt ci fre zeci mal e.

Rezol varea probl emei:
Date de intrare: nu se i ntroduc de l a tastatur.
Date de ieire: numerel e de forma 3 b 2 a di vi zi bi l e cu 11.

Funcia programul ui: Determi n val ori l e l ui a i b pentru care numerel e de forma 3 b 2 a sunt di vi zi bi l e cu 11.
Val ori l e posi bi l e al e l ui a sunt 1,9, i ar al e l ui b sunt 0,9.Pentru ca a2b3 s fi e di vi zi bi l e cu 11 trebui e ca
restul mpri ri i acestor numere l a 11 s fi e zero.


Culegere de probleme Structura repetitiv



65




NU

DA


NU

DA




DA NU





START
a:=a+1
a<=9
b:=0
b<=9
a*1000+2*100
+b*10+3=0
Scrie
a,'2',b,'3'
b:=b+1
a:=1
STOP
Al goritmul n pseudocod:

Di v_11 nseamn:
nceput
a:=1;
ct ti mp a<=9 execut
nceput
b:=0;
ct ti mp b<=9 execut
nceput
dac
( a*1000+b*10+203) mod11=0
atunci
scri e( a, 2 ,b, 3 ) ;
b:=b+1;
sfri t;
a:=a+1;
sfri t;
sfri t.





Programul Pascal :

program di v_11;
var a, b: byt e;
begi n
a: =1;
whi l e a<=9 do
begi n
b: =0;
whi l e b<=9 do
begi n
i f (a*1000+b*10+203) mod
11=0
t hen wri t el n(a, ' 2' , b, ' 3' , ' ' );
b: =b+1;
end;
a: =a+1;
end;
readl n
end.
Culegere de probleme Structura repetitiv
Problema 4.

S se afi eze toi di vi zori i numrul ui natural nenul n.

Rezol varea probl emei:
Date de intrare: numrul natural nenul n.
Date de ieire: di vi zori i numrul ui natural nenul n.
Funcia programul ui: Determi n di vi zori i numrul ui natural nenul n. Pentru a veri fi ca dac un numr
natural nenul d este di vi zor al numrul ui n vom testa dac restul mpri ri i l ui n l a d este zero( n mod
d=0) .ti m c ori ce numr natural n, di feri t de 0 i 1 are ca di vi zori i mpropri i numerel e 1 i n. Di vi zori i
propri i vor fi pri ntre numerel e dp , 2 unde dp=

2
n
. Dac n=1 atunci si ngurul su di vi zor este 1.
Exempl u: Pentru n=50:
-di vi zori i si sunt:1, 2, 5, 10, 25, 50.
-di vi zori i i mpropri i sunt: 1, 50.
-di vi zori i propri i sunt: 2, 5, 10, 25.

66



NU


DA





NU DA


DA NU







Al goritmul n pseudocod:

Divizori nseamn:
srie('n>0:');
citete(n);
scrie('Divizorii lui ',n,' sunt: 1 ');
dac n>1 atunci
nceput
dp:= n div 2;
d:=2;
ct timp d<=dp execut
nceput
dac (n mod d=0) atunci scrie(d,' ');
d:=d+1;
sfrit;
scrie(n);
sfrit;
sfrit.



Programul Pascal :
START
Citeste n
program divizori;
var n,d,dp:integer;
begin
write('n>0:');
readln(n);
write('Divizorii lui ',n,' sunt: 1 ');
if n>1 then
begin
dp:= n div 2;
d:=2;
while d<=dp do
begin
if (n mod d=0) then write(d,' ');
d:=d+1;
end;
writeln(n);
end;
readln
end.
Scrie
n>1
(Divizorii
lui,'n',sunt:1 ')
dp:=ndiv2
d:=2
nmodd=0 d<=dp
Scrie d Scrie n
d:=d+1
STOP
Culegere de probleme Structura repetitiv

Problema 5.

Se dau dou numere avnd acel ai numr de ci fre. Cte ci fre trebui e modi fi cate pentru a transforma un
numr n cel l al t? ( De exempl u, pentru numerel e 2135 i 7139 este necesar modi fi carea a dou ci fre) .

Rezol varea probl emei:
Date de intrare: cel e dou numere date de vari abi l el e n1 i n2.
Date de ieire: numrul de ci fre care trebui e modi fi cate dat de vari abi l a nr.

Funcia programul ui: Determi n numrul de ci fre care trebui e modi fi cate. Se compar numerel e ci fr cu
ci fr. Pentru a obi ne ci frel e unui numr se fac mpri ri succesi ve l a 10, resturi l e obi nute fi i nd ci frel e
numarul ui . I nii al , nr are val oarea zero. Dac se gsesc dou ci fre di feri te mri m val oarea l ui nr cu 1.

67









NU

DA






DA

NU




Al goritmul n pseudocod:

numere_egal e nseamn:
nceput
scri e( ' n1=' ) ;
ci tete( n1) ;
scri e( ' n2=' ) ;
ci tete( n2) ;
nr:=0;
ct ti mp n1<>0 execut
nceput
r1:=n1 mod 10;
r2:=n2 mod 10;
dac r1<>r2 atunci
nr:=nr+1;
n1:=n1 di v 10;
n2:=n2 di v 10;
sfri t;
scri e( ' Nr. de ci fre ce trebui e
modi fi cate = ' ,nr)
sfri t.


START
Citete n1
Program Pascal :
program numere_egal e;
var
Citeste n2
n1, n2, r1, r2: l ongi nt ;
nr : byt e;
begi n
wri t e(' n1=' ); readl n(n1);
wri t e(' n2=' ); readl n(n2);
nr: =0;
whi l e n1<>0 do
begi n
r1: =n1 mod 10;
r2: =n2 mod 10;
i f r1<>r2 t hen nr: =nr+1;
n1: =n1 di v 10;
n2: =n2 di v 10;
end;
wri t e(' Nr. de ci f re ce t rebui e
modi f i cat e = ' , nr)
end.
nr:=0
r1<>r2
r2:=n2mod10
r1:=n1mod10
n1<>0
nr:=nr+1
n1:=n1div10
n2:=n2div10
STOP
Scrie nr
Culegere de probleme Structura repetitiv
2.3.2. PROBLEME PROPUSE









1. Cal cul ai:
a) S=1
2
-2 +3 -
2 2 2
n
b) S=
4 3 2
1

+
5 4 3
2

+ +
) 3 ( ) 2 ( ) 1 ( + - + + n n n
n

c) S=1+
2
1
+
3
1
++
n
1

d) P=( 1-
2
2
1
) ( 1-
2
3
1
) ( 1-
2
4
1
) ( 1-
2
n
1
)
2. S se determine numerel e f ormate din cinci
cif re de f orma abcde care dau restul 12 l a
mprirea cu 1999.
3. Se citesc n numere de l a tastatur. S se
af ieze numerel e divizibil e cu 5.
4. S se determine cif rel e x i y astf el nct
9 15xy N.
5 . S se determine numerel e de f orma xyz 72
divizibil e cu 36.
68
6. Gsii f raciil e de f orma
30
3 2 y x
ireductibil e.
7. S se cal cul eze media aritmetic i media
geometric a primel or n numere ntregi pozitive.
8. S se determine f raciil e de f orma
y 3 x
a 5 b 7
care se
simpl if ic cu 18.
9. S se cal cul eze suma i produsul divizoril or
proprii ai unui numr citit.
10. Un numr este perf ect dac este egal cu suma
divizoril or si ( excl uzndu-l pe el ) . Exempl u
6=1+2+3. S se determine dac un numr ntreg
dat este perf ect sau nu.
11. Se d un numr natural n. S se determine
cif ra maxim din numr.
12. S se verif ice dac un numr natural este
pal indrom sau nu( un numr este pal indrom dac
el coincide cu numrul f ormat din cif rel e sal e
l uate n ordine invers) .
13. Af l ai a i b astf el nct a *( a+b) =168.
2
14. S se verif ice dac un numr natural
n este prim sau nu. e
-
N
Culegere de probleme Structura repetitiv
69
REZOLVAREA PROBLEMELOR


1. a
program suma1;
var i , n, semn, S: i nt eger;
begi n
wri t e(' n=' );
readl n(n);
S: =0;
i : =1;
semn: =1;
whi l e i <=n do
begi n
S: =S+semn*sqr(i );
i : =i +1;
semn: =-semn;
end;
wri t e(' Suma est e =' , S);
readl n
end.


1. b.
program w1b;
var i , n: i nt eger;
s: real ;
begi n
wri t e(' n=' );
readl n(n);
i : =1;
s: =0;
whi l e i <=n do
begi n
s: =s+i / ((i +1)*(i +2)*(i +3));
i : =i +1;
end;
wri t e(' Suma est e=' , s: 5: 2);
readl n
end.


1. c.
program sumac;
var i , n: i nt eger;
s: real ;
begi n
wri t e(' n=' );
readl n(n);
s: =0;
i : =1;
whi l e i <=n do
begi n
s: =s+1/ sqrt (i );
i : =i +1;
end;
wri t e(' Suma est e=' , s: 5: 2);
readl n
end.


1. d.
program w1d;
var i , n: byt e;
p: real ;
begi n
wri t e(' n=' );
readl n(n);
i : =2;
Culegere de probleme Structura repetitiv
70
p: =1;
whi l e i <= n do
begi n
p: =p*(1-1/ sqr(i ));
i : =i +1;
end;
wri t el n(' produsul est e=' , p: 6: 4);
readl n
end.



2.
program w_2;
var a, b, c, d, e: byt e;
begi n
a: =1;
whi l e a<=9 do
begi n
b: =0;
whi l e b<=9 do
begi n
c: =0;
whi l e c<=9 do
begi n
d: =0;
whi l e d<=9 do
begi n
e: =0;
whi l e e<=9 do
begi n
i f (a*10000+b*1000+c*100+d*10+e)mod
1999=12
t hen wri t e(a, b, c, d, e, ' ' );
e: =e+1;
end;
d: =d+1;
end;
c: =c+1;
end;
b: =b+1;
end;
a: =a+1;
end;
readl n
end.


3. program di vi zi bi l e;
var n, nr, i : i nt eger;
begi n
i : =1;
wri t e(' n=' );
readl n(n);
whi l e i <=n do
begi n
wri t e(' nr=' );
readl n(nr);
i f nr mod 5=0 t hen wri t el n(nr, ' est e di vi zi bi l cu
5' )
i : =i +1;
end;
readl n
end.


4.
program nr_apar i ne;
var x, y: byt e;
begi n
x: =0;
whi l e x<=9 do
begi n
Culegere de probleme Structura repetitiv
71
y: =0;
whi l e y<=9 do
begi n
i f
sqrt (15009+x*100+y*10)=i nt (sqrt (15009+x*100+y*10)
t hen wri t e(' 15' , x, y, ' 9' );
y: =y+1;
end;
x: =x+1;
end;
readl n
end.
5.
program di vi zi bi l e;
var x, y, z: byt e;
begi n
x: =0;
whi l e x<=9 do
begi n
y: =0;
whi l e y<=9 do
begi n
z: =0;
whi l e z<=9 do
begi n
i f ((72000+x*100+y*10+z) mod 36=0) t hen
wri t e(' 72' , x, y, z, ' ' );
z: =z+1;
end;
y: =y+1;
end;
x: =x+1;
end;
end.


6.
program f rac i i ;
var x, y: byt e;
begi n
x: =0;
whi l e x<=9 do
begi n
y: =0;
whi l e y<=9 do
begi n
i f ((2030+x*100+y)mod 2<>0)
and((2030+x*100+y)mod 3<>0)
and((2030+x*100+y)mod 5<>0) t hen wri t e('
2' , x, ' 3' , y, ' / ' , ' 30 ' );
y: =y+1;
end;
x: =x+1;
end;
readl n
end.
Sau
program fractii;
var x,y:byte;
begin
x:=0;
while x<=9 do
begin
y:=1;
while y<=9 do
begin
if (( y<>2) and(y<>4) and (y<>6) and (y<>8))
and((5+x+y)mod 3<>0)and(y<>5)
then write(' 2',x,'3',y,'/','30 ');
y:=y+1;


Culegere de probleme Structura repetitiv
72
end;
x:=x+1;
end;
readln
end.
7.
program medi a_a_g;
var i , n, s, p: i nt eger;
ma, mg: real ;
begi n
wri t e(' n>0: ' );
readl n(n);
i : =1;
s: =0;
p: =1;
whi l e i <=n do
begi n
s: =s+i ;
p: =p*i ;
i : =i +1;
end;
ma: =s / n;
wri t el n(' Medi a ari t met i c est e ' , ma: 6: 3);
mg: =sqrt (p);
wri t e(' Medi a geomet ri c est e ' , mg: 6: 3);
readl n
end.

8.
program si mpl i f _18;
var a, b, x, y: byt e;
begi n
b: =0;
whi l e b<=9 do
begi n
a: =0;
whi l e a<=9 do
begi n
x: =1;
whi l e x<=9 do
begi n
y: =0;
whi l e y<=9 do
begi n
i f (((7050+b*100+a)mod 18=0) and
((x*100+30+y)mod 18=0))
t hen wri t e(' 7' , b, ' 5' , a, ' / ' , x, ' 3' , y, ' ' );
y: =y+1;
end;
x: =x+1;
end;
a: =a+1;
end;
b: =b+1;
end;
readl n
end.
9. program suma_prod_div;
var n,d,s,p,dp:word;
begin
write('Nr. este:');readln(n);
s:=0;
p:=1;
if n>1 then
begin
dp:=n div 2;
d:=2;
while d<= dp do
begin
if n mod d=0 then
begin
s:=s+d;
Culegere de probleme Structura repetitiv
73
p:=p*d;
end;
d:=d+1;
end;
end;
writeln('Suma divizorilor este:',s);
writeln('Produsul divizorilor este:',p);
readln
end.


10. program nr_perfect;
var n,d,dp,s,nf:word;
begin
write('n=');
readln(n);
s:=1;
if n>1 then
begin
dp:=n div 2;
d:=2;
while d<=dp do
begin
if n mod d =0 then s:=s+d;
d:=d+1;
end;
end;
if n=s then write(n,' este perfect')
else Write(n, ' nu este perfect');
readln
end.

11. program cifra_max;
var i,max,r:byte;
nr:longint;
begin
write('Introducei numrul ');
readln(nr);
max:=nr mod 10;
nr:=nr div 10;
while nr<>0 do
begin
r:=nr mod 10;
if r>max then max:=r;
nr:=nr div 10 ;
end;
write('Cifra maxim este ',max );
readln
end.
12. program nr_palindrom;
var n,n1,n2:longint;
c:byte;
begin
write('n=');
readln(n);
n1:=n;
n2:=0;
while n>0 do
begin
c:=n mod 10;
n2:=n2*10 +c;
n:=n div 10;
end;
if n1=n2 then write(n1,'este palindrom')
else write(n1,'nu este palindrom');
end.





Culegere de probleme Structura repetitiv
74
13. program numere;
var a,b:byte;
begin
a:=1 ;
while a<=5 do
begin
b:=1;
while b<=167 do
begin
if (a*a*(a+b)=168) then write(' ',a,' ',b,' ');
b:=b+1;
end;
a:=a+1;
end;
readln
end.





14.
program nr_prim;
var n,d:word;
prim:boolean;
begin
write('n>0:');
readln(n);
if n=1 then write(n,'nu este prim')
else if n mod 2=0 then
if n=2 then write(n,'este prim')
else write(n,'nu este prim')
else
begin
prim:=true;
d:=3;
while d<=trunc(sqrt(n)) do
if n mod d=0 then
begin
prim:=false;
d:=n;
end
else d:=d+2;
if prim then write(n,' este prim')
else write(n,' nu este prim');
end;
readln
end.



Culegere de probleme Structura repetitiv
2.3.3. Instruciunea REPEAT

I nstruci unea repeat descri e structura repeti ti v cu test fi nal . Ea se mai numete instruciune de cicl are
( cicl u) cu test f inal sau instruciune de cicl are condiionat posterior. Are forma:
repeat
i nst ruc i une1;
i nst ruc i une2;
.
i nst ruc i unen;
unti l expresi e bool ean;
Di agrama de si ntax a acestei i nstruci uni este urmtoarea:

Instruciunea
repeat
repeat instruciune
until
expresie(boolean)
;






Expresi a di n di agram se mai numete condiie de ieire din cicl u, i ar i nstruci uni l e cupri nse ntre repeat i
until formeaz corpul ci cl ul ui .

Executarea i nstruci uni i repeat const n urmtoarel e:
1) se execut i nstruci uni l e cupri nse ntre repeat i unt i l ;
2) se eval ueaz expresi a bool ean:
-dac val oarea ei este f al se se revi ne l a 1) i se execut di n nou i nst ruc i une1i nst ruc i unen;
-dac val oarea expresi ei este t rue, programul conti nu cu i nstruci unea urmtoare.
Observaie: Spre deosebi re de i nstruci unea whil e corpul i nstruci uni i repeat se execut cel pui n o dat.


Problema 1.

Se ci tete un numr natural n. S se cal cul eze suma ci frel or sal e.

Rezol varea probl emei:
Date de intrare: numrul natural n.
Date de ieire: suma ci frel or numrul ui dat de vari abi l a s.
75
Culegere de probleme Structura repetitiv
Funcia programul ui: Determi n val oarea sumei ci frel or numrul ui natural n. Ci frel e numrul ui se obi n pri n
mpri ri succesi ve l a zece, resturi l e obi nute fi i nd ci frel e numrul ui .



76













NU

DA
START
S:=0
S:=S+n mod 10
Citete n
n:=n div 10
n=0
Scrie S
STOP




Al goritmul n pseudocod:

suma_cifre nseamn:
nceput
scrie(' n=' );
citete(n);
s:=0;
repet
s:=s + n mod 10;
n:=n div 10;
pn cnd n=0;
scrie(' Suma cifrelor
numrului citit este ' ,s);
sfrit.





Programul Pascal :

program suma_ci f re;
var n : l ongi nt ;
s, r : byt e;
begi n
wri t e(' n=' );
readl n(n);
s: =0;
repeat
s: =s + n mod 10;
n: =n di v 10;
unt i l n=0;
wri t el n(' Suma ci f rel or numrul ui
ci t i t est e ' , s);
readl n
end.



Problema 2.
Afl ai fraci i l e de forma
yx
7 x 1
care se si mpl i fi c pri n 3.
Rezol varea probl emei:
Date de intrare: Nu se ci tesc date de l a tastatur.
Date de ieire :fraci i l e de forma
yx
7 x 1
care se si mpl i fi c cu 3
Culegere de probleme Structura repetitiv
Funcia programul ui: Determi n val ori l e l ui x i y pentru care fraci i l e de forma
yx
7 x 1
se si mpl i fi c cu 3.
Val ori l e posi bi l e al e l ui x sunt 0,9, i ar al e l ui y sunt 1,9. Trecerea de l a o val oare l a al ta att pentru x ct i
pentru y se real i zeaz pri n mri rea vari abi l el or cu 1. Pentru ca aceste fraci i s se si mpl i fi ce cu 3 trebui e ca
numerel e 7 x 1 i yx s fi e di vi zi bi l e cu 3.Vom fol osi cri teri ul de di vi zi bi l i tate cu 3: dac suma ci frel or unui
numr natural este di vi zi bi l cu 3 atunci numrul consi derat se di vi de cu 3.

77


NU





NU


DA









NU


DA DA



Al goritmul n
pseudocod:

Div_3 nseamn:

nceput
x:=0;
repet
y:=1;
repet
dac ((8+x) mod
3=0) and ((y+x) mod
3=0)
atunci
scrie(' 1' ,x,' 7/' ,y,x,'
' );
y:=y+1;
pn cnd y>9;
x:=x+1;
pn cnd x>9;
START
x:=0
sfrit.
y:=1

Programul Pascal :

program di v_3;
((8+x)mod3=0) and
var x, y: byt e;
begi n
x: =0;
repeat
y: =1;
repeat
i f ((8+x) mod 3=0)
and ((y+x) mod 3=0)
t hen
wri t el n(' 1' , x, ' 7/ ' , y, x, ' ' );
y: =y+1;
unt i l y>9;
x: =x+1;
unt i l x>9;
end.


((y+x)mod3=0)
y:=y+1
Scrie('1',x,'7/',y,x)
y>9
x:=x+1
x>9
STOP
Culegere de probleme Structura repetitiv
Problema 3.

S se determi ne medi a ari tmeti c a n numere ntregi pozi ti ve i ntroduse de l a tastatur.

Rezol varea probl emei:
Date de intrare: numrul ntregi l or pozi ti vi i ntrodui de l a tastatur este memorat n vari abi l a n , i ar
numerel e respecti ve sunt memorate n vari abi l a nr.
Date de ieire: medi a ari tmeti c a cel or n numere este memorat n vari abi l a ma.
Funcia programul ui: se determi n medi a ari tmeti c a cel or n numere ntregi . Pentru aceasta se cal cul eaz
mai nti suma cel or n numere apoi aceasta se mparte l a n obi nnd astfel medi a ari tmeti c.

78
















NU
DA

NU
DA




Al goritmul n
pseudocod:
med_aritm
nseamn:
nceput
scrie( n= )
citete(n);
i:=1;
s:=0;
repet
repet
scrie(' nr.' ,i,' este=' );
citete(nr);
pn cnd nr>0;
s:=s+nr;
i:=i+1;
pn cnd i>n;
ma:=s/n;
scrie( Media
aritmetic
este=' ,ma:6:2);
sfrit.





START

Programul Pascal :
Program med_ari t m;
Citete n
var
i , s, n, nr : i nt eger;
i:=1
ma : real ;
begi n
S:=0
wri t e(' n=' );
readl n(n);
i : =1;
s: =0;
repeat
repeat
wri t el n(' nr. ' , i , ' est e= ' );
readl n(nr);
unt i l nr>0;
s: =s+nr;
i : =i +1;
unt i l i >n;
ma: =s/ n;
wri t e(' Medi a ari t met i c
est e=' , ma: 6: 2);
end.
Citete nr
nr>o
S:=S+nr
STOP
Scrie ma
ma:=S/n
i>n i:=i+1
Culegere de probleme Structura repetitiv
Problema 4. S se determi ne maxi mul a n numere i ntroduse de l a tastatur.
Rezol varea probl emei:
Date de intrare: cel e n numere care sunt memorate, pe rnd, n vari abi l a nr.
Date de ieire: maxi mul cel or n numere memorat n vari abi l a max.
Funcia programul ui: Se determi n maxi mul cel or n numere i ntroduse de l a tastatur. Max pri mete val oarea
pri mul ui numr i ntrodus de l a tastatur. Se compar max cu nr, dac nr>max atunci max pri mete val oarea
l ui nr apoi se trece l a numrul urmtor. n caz contrar se trece l a urmtorul numr. Dup ce a fost
comparat cu toate cel e n numere maxi mul se afieaz i al gori tmul se nchei e.



79







NU

DA





DA NU






Al goritmul n pseudocod:
Maxim nseamn:
nceput
scrie('n=');
citete(n);
scrie('Primul numr este :');
citete(nr);
max:=nr;
i:=2;
repet
scrie('Numrul ',i,' este:');
citete(nr);
dac nr>max atunci max:=nr;
i:=i+1;
pn cndl i>n;
scrie('Maximul este:',max);
sfrit.




Programul Pascal :
START
Citete n Citete nr
max:=nr
i:=2
Citeste nr
nr>max
max:=nr
i:=I+1
i>n
Scrie
maximul
este max
STOP
program maxim;
var max,nr:integer;
i,n:byte;
begin
write('n=');
readln(n);
write('Primul numr este :');
readln(nr);
max:=nr;
i:=2;
repeat
write('Numrul ',i,' este:');
readln(nr);
if nr>max then max:=nr;
i:=i+1;
until i>n;
writeln('Maximul este:',max);
readln
end.


Culegere de probleme Structura repetitiv
Problema 5.

S se determi ne toate numerel e natural e de trei ci fre care se di vi d pri n suma ci frel or l or.

Rezol varea probl emei:
Date de intrare: nu sunt i ntroduse date de l a tastatur.
Date de ieire: numerel e natural e de trei ci fre care se di vi d pri n suma ci frel or l or.
Funcia programul ui: se determi n numerel e natural e de trei ci fre care se di vi d pri n suma ci frel or l or. Pentru
aceasta se veri fi c numerel e natural e di n i nterval ul [ 100, 999] dac ndepl i nesc condi i a cerut.



START

80





DA

NU





NU

DA

DA
NU DA

NU


Al goritmul n pseudocod:

Numere nseamn:
nceput
a:=1;
repet
b:=0 ;
repet
c:=0;
repet
dac
(a*100+b*10+c) mod
(a+b+c)=0 atunci
scrie(' ' ,a,b,c,' ' ) ;
c:=c+1
pn cnd c>9;
b:=b+1;
pn cnd b>9;
a:=a+1;
pn cnd a>9;
sfrit.

.


Programul Pascal:

program numere;
a:=1
var a, b, c, s: byt e;
begi n
b:=0
a: =1;
repeat
b: =0 ; (a*100+b*10+c)
m
c:=0
od(a+b+c)=0
repeat
c: =0;
repeat
i f (a*100+b*10+c)
mod (a+b+c)=0 t hen
wri t e(' ' , a, b, c, ' ' ) ;
Scrie(a,b,c)
c:=c+1
c: =c+1
unt i l c>9;
c>9
b: =b+1;
unt i l b>9;
STOP
a: =a+1;
b:=b+1
unt i l a>9;
end.
a>9 b>9 a:=a+1
Culegere de probleme Structura repetitiv

2.3.4. PROBLEME PROPUSE










1. Cal cul ai:
a) S=1-
3
1
+
5
1
-
1 - n 2
1

b) P=
2
1

4
3

n 2
1 - n 2

c) S=
3 1
1
4
+
5 3
2
4

++
) 1 2 ( ) 1 2 (
4
+ n n
n

d) S=
2
2
1
-
2
6
1
+
2
) 2 4 (
1
n
2. S se determine suma ptratel or a n numere
ntregi introduse de l a tastatur.

3. Af l ai numerel e natural e abc tiind c a i c
sunt impare, iar abc divizibil cu 3.
4. Af l ai numerel e natural e abc tiind c a i c
sunt pare, iar abc divizibil cu 4.
5 Af l ai f raciil e de f orma
24
7 9 x y
ireductibil e,
unde y este cif r par.
6. Se citesc dou numere de l a tastatur. S se
determine dac sunt numere gemene ( dou
numere sunt gemene, dac sunt prime i
dif erena dintre cel mai mare i cel mai mic este
2) .
7. S se determine toate numerel e natural e de
trei cif re care se divid prin produsul cif rel or l or.
8. Se d un numr ntreg. S se verif ice dac
acest numr este ptrat perf ect. Dac da s se
af ieze numrul al crui ptrat perf ect este.
9. Af l ai x i y astf el nct x 425 i y 1 s f ie prime
ntre el e ( cel mai mare divizor comun al l or s f ie
1) .
10. Af l ai numerel e prime f ormate din trei
11. S se determine mini
cif re .
mul a n numere
introduse de l a tastatur.
12. Af l ai numerel e prime de ordinul zecil or astf
nct numerel e obinute prin inve
el
rsarea ordinii
cif rel or s f ie tot numere prime.
. S se deter 13 mine numerel e natural e de f orma
xyz astf el nct yz xy + N e
81
Culegere de probleme Structura repetitiv
82
REZOLVAREA PROBLEMELOR
1.a)
program suma;
var i , n, semn: i nt eger; s: real ;
begi n
wri t e(' n=' ); readl n(n);
i : =1; s: =0; semn: =1;
repeat
s: =s+semn*(1/ (2*i -1)); i : =i +1; semn: =-semn;
unt i l i >n;
wri t e(' Suma est e=' , s: 6: 2); readl n
end.

b)
program produs;
var i , n: i nt eger; p: real ;
begi n
wri t e(' n=' ); readl n(n);
i : =1; p: =1;
repeat
p: =p*((2*i -1)/ (2*i )); i : =i +1;
unt i l i >n;
wri t e(' Produsul est e ' , p: 6: 2); readl n
end.

c)
program suma;
var i , n: i nt eger; s: real ;
begi n
wri t e(' n=' ); readl n(n);
i : =1; s: =0;
repeat
s: =s+sqr(sqr(i ))/ (2*i -1)*(2*i +1); i : =i +1;
unt i l i >n;
wri t e(' Suma est e ' , s: 6: 2); readl n
end.
d) program suma;
var n,i,semn:integer; s:real;
begin
write('n='); readln(n);
s:=0; i:=1; semn:=1;
repeat
s:=s+(semn*1/((4*i-2)*(4*i-2))); i:=i+1; semn:=-semn;
until i>n;
write('Suma este=',s:6:2); readln
end.

2.
program suma_nr;
var i , n, nr: i nt eger; s: l ongi nt ;
begi n
wri t e(' n=' ); readl n(n);
i : =1; s: =0;
repeat
wri t e(' Nr. ' , i , ' est e ' ); readl n(nr);
s: =s+sqr(nr); i : =i +1;
unt i l i >n;
wri t e(' Suma est e ' , s); readl n
end.

3.
program di v_3;
var a, b, c: byt e;
begi n
a: =1;
repeat
b: =0;
repeat
c: =1;
repeat
i f (a+b+c)mod 3=0 t hen wri t e(' ' , a, b, c, ' ' );
Culegere de probleme Structura repetitiv
83
c: =c+2;
unt i l c>9;
b: =b+1;
unt i l b>9;
a: =a+2;
unt i l a>9; readl n
end.

4.
program di v_4;
var a, b, c: byt e;
begi n
a: =2;
repeat
b: =0;
repeat
c: =0;
repeat
i f (b*10+c)mod 4=0 t hen wri t e(' ' , a, b, c , ' ' );
c: =c+2;
unt i l c>8;
b: =b+1;
unt i l b>9;
a: =a+2;
unt i l a>8; readl n
end.

5. program fractii;
var y,x:byte;
begin
y:=0;
repeat
x:=1;
repeat
if ((16+x+y) mod 3<>0) then
write('9',y,'7',x,'/6 ');
x:=x+2;
until x>9;
y:=y+2;
until y>9; readln
end.

6.
program nr_gemene;
var nr1,nr2,divz,m:longint; d:byte; prim1, prim2 : boolean;
begin
write('nr1='); readln(nr1); write('nr2='); readln(nr2);
d:=abs(nr1-nr2);
if d<>2 then write('Numerele nu sunt gemene')
else begin
prim1:=true;
if nr1 mod 2 = 0 then prim1:=false
else begin
divz:=3; m:=trunc(sqrt(nr1)) ;
repeat
if nr1 mod divz = 0 then prim1:=false;
divz:=divz+2
until divz > m;
end;
if not prim1 then write('Numerele nu sunt gemene')
else begin
prim2:=true;
if nr2 mod 2 = 0 then prim2:=false
else begin
divz:=3; m:=trunc(sqrt(nr2)) ;
repeat
if nr2 mod divz = 0 then prim2:=false;
divz:=divz+2
until divz > m;
end;
if prim2 then write(nr1,'si',nr2,'sunt gemene')
else write('Numerele nu sunt gemene') ;
Culegere de probleme Structura repetitiv
84
end;
end
end.

7.
program div_prod;
var x,y,z:byte; p:word;
begin
p:=1; x:=1;
repeat
y:=1;
repeat
z:=1;
repeat
p:=x*y*z;
if (x*100+y*10+z) mod p=0 then write(x,y,z,' ');
z:=z+1;
until z>9;
y:=y+1;
until y>9;
x:=x+1;
until x>9;
end.

8.
program nr_patrat;
var n:word;
begin
write('n='); readln(n);
if sqrt(n)=int(sqrt(n)) then write('este patratul lui',sqrt(n):6:0)
else write('nu este patrat perfect');
readln
end.

9.
program prime;
var x,y:byte; a,b,r:word;
begin
x:=0;
repeat
y:=0;
repeat
a:=4250+x; b:=10+y;
repeat
r:=a mod b; a:=b; b:=r;
until r=0;
if a=1 then write(' 425',x,'/1',y,' ');
y:=y+1;
until y>9;
x:=x+1;
until x>9; readln;
end.

10. program nr_prime;
var n,d:integer; prim:boolean;
begin
n:=101;
repeat
prim:=true; d:=3;
while d<=trunc(sqrt(n)) do
if n mod d=0 then begin
prim:=false;
d:=n;
end
else d:=d+2;
if prim then write(n,' ');
n:=n+2;
until n>999; readln
end.

11.
program minim;
Culegere de probleme Structura repetitiv
85
var min,nr:integer; i,n:byte;
begin
write('n='); readln(n);
write('Primul numar este :'); readln(nr); min:=nr; i:=2;
repeat
write('Numarul ',i,' este:'); readln(nr);
if nr<min then min:=nr;
i:=i+1;
until i>n;
writeln('Minimul este:',min); readln
end.

12.
program prime;
var a,b,nr,nrinv,divz,m: byte;prim1, prim2 : boolean;
begin
a:=1;
repeat
b:=1;
repeat
nr:=a*10+b; prim1:=true;
if nr mod 2 = 0 then prim1:=false
else begin
divz:=3; m:=trunc(sqrt(nr));
repeat
if nr mod divz = 0 then prim1:=false;
divz:=divz+2
until divz > m;
end;
if prim1 then begin
nrinv:=b*10+a; prim2:=true;
if nrinv mod 2 = 0 then prim2:=false
else begin
divz:=3; m:=trunc(sqrt(nrinv)) ;
repeat
if nrinv mod divz = 0 then
prim2:=false;
divz:=divz+2
until divz > m;
end;
if prim2 then writeln(a,b);
end;
b:=b+1;
until b>9;
a:=a+1;
until a>9; readln end.

13.
program nr_naturale;
var x,y,z:byte;
begin
x:=1;
repeat
y:=1;
repeat
z:=0;
repeat
if sqrt(x*10+y*11+z)=int(sqrt(x*10+y+y*10+z)) then
write(x,y,z,' ');
z:=z+1;
until z>9;
y:=y+1;
until y>9;
x:=x+1;
until x>9; readln
end.
Culegere de probleme Structura repetitiv
2.3.5. Instruciunea FOR


I nstruci unea for descri e structura repeti ti v cu contor. Ea se mai numete cicl u cu contor sau instruciune
de cicl are cu numr cunoscut de pai. Este descri s de urmtoarea di agram de si ntax:



86




instruciunea
for
for
identificator
:
Expresie 1
to
downto
Expresie 2
do
Instruciune


I denti fi cator este numel e unei vari abi l e si mpl e de ti p ordi nal , numi t contor.Expresi e1 i expresi e2 sunt
expresi i ordi nal e, avnd acel ai ti p cu contorul . I nstruci unea reprezi nt corpul ci cl ul ui .

I nstruci unea for are formel e:
I )
for v:=ei to ef do
i nstruci une;
unde:
-v este o vari abi l numi t contor
-ei i ef sunt expresi i ordi nal e avnd acel ai ti p cu v
-instruciune este o i nstruci une Pascal
Vari abi l a v este i ni i al i zat cu val oarea
expresi ei ei.
Dac ei are un ordi n mai mi c dect ef se
execut instruciune pentru val ori cresctoare al e
l ui v ncepnd cu ei i termi nnd cu ef. Val ori l e l ui
v sunt consecuti ve.
Dac ei are un ordi n mai mare dect ef se
trece l a i nstruci unea i medi at urmtoare.
Dac cel e dou expresi i au aceeai val oare, se
execut o si ngur dat i nstruci unea.
I I )
for v:=ei downto ef do
i nstruci une;
unde:
-v este o vari abi l numi t contor
-ei i ef sunt expresi i ordi nal e avnd acel ai ti p cu v
-instruciune este o i nstruci une Pascal
Vari abi l a v este i ni i al i zat cu val oarea
expresi ei ei.
Dac ei are un ordi n mai mare dect ef se
execut i nstruci une pentru val ori descresctoare
al e l ui v ncepnd cu ei i termi nnd cu ef. Val ori l e
l ui v sunt consecuti ve.
Dac ei are un ordi n mai mi c dect ef se trece
l a i nstruci unea i medi at urmtoare.
Dac cel e dou expresi i au aceeai val oare, se
execut o si ngur dat i nstruci unea.

Culegere de probleme Structura repetitiv
Problema 1.
Se dau dou numere natural e a i b de forma: a= 2 x i b= x 2 . Pentru toate perechi l e de numere ( a,b) s se
determi ne cel mai mare di vi zor comun i cel mai mi c mul ti pl u comun.
Rezol varea probl emei:
Date de intrare :cel e dou numere memorate n vari abi l el e a, b.
Date de ieire: cel mai mare di vi zor comun dat de vari abi l a b i cel mai mi c mul ti pl u comun
Funcia programul ui: Determi n cel mai mare di vi zor comun al numerel or a i b. Pentru aceasta vom fol osi
al gori tmul l ui Eucl i d:
Pasul 1:se cal cul eaz restul mpri ri i l ui a l a b
Pasul 2: dac restul este zero atunci cmmdc=b. Al tfel se rei a pasul 1 pentru noi l e val ori al e l ui a i b,
respecti v b i rest

b
a
.Cel mai mi c mul ti pl u comun este ctul di ntre produsul numerel or( a i b) i cel mai
mare di vi zor comun al l or.


87



DA


NU










DA

NU



Al goritmul n pseudocod:
cmmdc_cmmmc nseamn:
nceput
pentru x:=1 pn la 9 execut
nceput
a:=x*10+2; b:=20+x;
p:=a*b;
r:=a mod b;
ct timp r<>0 execut
nceput
a:=b;
b:=r;
r:=a mod b;
sfrit;
scrie('cmmdc al numerelor ',x,'2
si ','2',x,' este ',b,' ');
scrie(' cmmmc al numerelor
',x,'2 si ',' 2',x,' este ',p div b,' ');
sfrit;
sfrit.
x:=1
START
Programul Pascal :
program cmmdc_cmmmc;
var x,a,b,r,p:word;
begin
for x:=1 to 9 do
begin
a:=x*10+2; b:=20+x;
p:=a*b;
r:=a mod b;
while r<>0 do
begin
a:=b; b:=r;
r:=a mod b;
end;
write('cmmdc al numerelor ',x,'2 si
','2',x,' este ',b,' ');
writeln(' cmmmc al numerelor ',x,'2
si ',' 2',x,' este ',p div b,' ');
end;
end.
a:=x*10+2 b:=20+x r:=amodb
r<>0
a:=b
b:=r
r:=amodb
Scrie('cmmdc al nr',x,
'2' si '2',x,'este ' ,b,' ')
Scrie('cmmmc al nr',x, '2'
si '2',x,'este ' ,pdivb,' ')
x:=x+1 x<,=9
STOP
Culegere de probleme Structura repetitiv

Problema 2. Afl ai perechi l e de numere natural e de forma 3 1x i 1 3x pri me ntre el e.
Rezol varea probl emei:
Date de intrare: nu se i ntroduc date de l a tastatur.
Date de ieire: numere natural e de forma 3 1x i 1 3x pri me ntre el e.
Funcia programul ui: Determi n numerel e de forma 3 1x i 1 3x pri me ntre el e. Pentru aceasta se va proceda
astfel : -se afl cel mai mare di vi zor comun
-dac cel mai mare di vi zor comun al cel or dou numere este 1, atunci numerel e sunt pri me ntre el e.

START

88

x:=0









NU



DA


DA

NU





NU DA
Al goritmul n
pseudocod:

numere_prime nseamn:
nceput
pentru x:=0 pn la 9
execut
nceput
a:=103+x*10;
b:=301+x*10;
repet
r:=a mod b;
a:=b;
b:=r;
pn cnd r=0;
dac a=1 atunci
scrie('1',x,'3',' 3',x,'1 ');
sfrit;
sfrit.




Programul Pascal :

program numere_prime;
var x:byte;
a,b,r:word;
begin
for x:= 0 to 9 do
begin
a:=103+x*10;
b:=301+x*10;
repeat
r:=a mod b;
a:=b;
b:=r;
until r=0;
if a=1 then writeln('1',x,'3',' 3',x,'1 ');
end;
readln
end.



a:=103+x*10
b:=301+x*10
r:=a mod b
a:=b
r=0
b:=r
a=1
Scrie('1',x,'3','3',x,'1')
x:=x+1
STOP x<=9
Culegere de probleme Structura repetitiv
Problema 3.

ti i nd c i s se afi eze el ementel e mul i mi i } n A ,..., 2 , 1 =
{ }
m ,..., 2 , 1 = B ( ) } B b A a b a B A e e = , , .

Rezol varea probl emei:
Date de intrare: val ori l e l ui m i n.
Date de ieire: el ementel e muli mi i ( ) } B b A a b a B A e e = , ,

Funcia programul ui: Determi n el ementel e de forma ( a,b) unde aA bB. El ementel e muli mi i A sunt
generate de vari abi l a a, el ementel e muli mi i B sunt generate de vari abi l a b. Vari abi l a a pri mete pe rnd
val ori l e n 1, . Vari abi l a b va memora, pe rnd, val ori l e m 1, .
Exempl u: A={ 1,2,3} , B={ 1,2} .
B A ={ ( 1,1) , ( 1,2) , ( 2,1) ,( 2,2) ,( 3,1) ,( 3,2) } .


START

89















DA

NU NU

DA


Al goritmul n pseudocod:

Produs_cartezi an( n,m) nseamn:
nceput
scrie ('n=');
citete (n);
scrie ('m=');
citete (m);
pentru a:=1 pn la n execut
pentru b:=1 pn la m execut
scrie(' (',a,',',b,') ');
sfrit.








Programul Pascal :

program prod_cart;
var a,b,n,m:integer;
begin
write('n=');readln(n);
write('m=');readln(m);
for a:=1 to n do
for b:=1 to m do
writeln(' (',a,',',b,') ');
readln
end.
Scrie a,b
Citete n
a:=1
a<=n
b:=1
b<=m
b:=b+1
a:=a+1
STOP
Citete m
Culegere de probleme Structura repetitiv
Problema 4.
Determi nai numerel e de forma x= ab care veri fi c condi i a N e + a x
Rezol varea probl emei:
Date de intrare: nu se i ntroduc date de l a tastatur.
Date de ieire: numerel e de forma x= ab care veri fi c condi i a N e + a x
Funcia programului: Determin valorile lui a i b pentru care numerele de forma x= ab veri fi c condi i a N e + a x
Valorile posibile ale lui a sunt 9 , 1 , iar ale lui b sunt 9 , 0 . Condiia este verificat dac atunci cnd extragem radicalul numrul
obinut are partea zecimal nul. Dac condiia este verificat se afieaz numerele.
START

90










DA


NU



DA NU



Algoritmul n pseudocod:

Numere nseamn:
Pentru a:=1 pn la 9
execut
pentru b:=0 pn la 9 execut
nceput
x:=a*10+b;
if
sqrt(x+sqrt(a))=int(sqrt(x+sqrt(a)))
then
scrie(x,' ');
sfrit;
sfrit.




a:=1

program numere;
var x,a,b:byte;
b:=0
begin
for a:=1 to 9 do
for b:=0 to 9 do x:=a*10+b
begin
x:=a*10+b;
if
sqrt(x+sqrt(a))=int(sqrt(x+sqrt(a)))
then
int(sqrt(x+sqrt(a))
=
Scrie x
sqrt(x+sqrt(a))
write(x,' ');
end;
b:=b+1
readln
end.


DA

NU
a:=a+1 b<=9
a<=9
STOP
Culegere de probleme Structura repetitiv
Problema 5.S se determi ne fraci i l e de forma
yx
xy 1
i reducti bi l e.
Rezol varea probl emei:
Date de intrare: nu se i ntroduc date de l a tastatur. Date de ieire: fraciile de forma
yx
xy 1
i reducti bi l e.
Funcia programului: Determin valorile lui x i y pentru care fraciile de
forma
91
START
Scrie('Fraciile ireductibile sunt')
x:=0 y:=1
a:=100+x*10+y
b:=y*10+x
x:=a mod b
a:=b
b:=r
r=0
a=1
Scrie('1',x,y,'/',
y,x, )
y:=y+1
y<=9
x:=x+1
x<=9
STOP
NU
DA
NU
DA
NU
DA
NU
DA
yx
xy 1
sunt i reducti bi l e. Valorile posibile ale lui x sunt 9 , 0 , iar ale
lui y sunt xy 1 9 , 1 . Pentru ca fraciile s fie ireductibile trebuie ca
yx i s fi e pri me ntre el e.





Al goritmul n pseudocod:

fracii_ired nseamn:
nceput
scrie('Fraciile ireductibile sunt:');
pentru x:=0 pn la 9 execut
pentru y:=1 pn la 9 execut
nceput
a:=100+x*10+y;
b:=y*10+x;
repet
r:=a mod b;
a:=b;
b:=r;
pn cnd r=0;
dac a=1 atunci
scrie('1',x,y,'/',y,x,';')
sfrit;
sfrit.




Programul pascal:

program fracii_ired;
var x,y:byte;
a,b,r:word;
begin
write('Fractiile ireductibile sunt:');
for x:=0 to 9 do
for y:=1 to 9 do
begin
a:=100+x*10+y;
b:=y*10+x;
repeat
r:=a mod b;
a:=b;
b:=r;
until r=0;
if a=1 then write('1',x,y,'/',y,x,';')
end;
readln
end.
Culegere de probleme Structura repetitiv

2.3.6. PROBLEME PROPUSE

1. Cal cul ai:
a) S=2
4
+4 ++( 2n)
4
4
b) P=1*( -3) *5*( -7) * *( ( 2n-1) )
c) S=
) 1 + n 3 ( * ) 2 - n 3 (
1
+ ... +
7 * 4
1
+
4 1
1

d) S= 1+
2
n
1
...
2
3
1
2
2
1
+ + +
2. S se cal cul eze media semestrial l a
matematic a unui el ev. Formul a pentru
cal cul area mediei semestrial e este
4
3 T MO+
, unde
MO este media aritmetic a notel or de l a oral , iar
T este nota de l a tez.
3. Af iai f raciil e de f orma
c d
b a
4
3
care se
simpl if ic cu 12.
4. Determinai numerel e de f orma 2 abc ( a, b, c
dif erite ) divizibil e cu 4, unde ab este un ptrat
perf ect.
5. S se determine numerel e de f orma y x2 7 care
dau restul 5 prin mprirea l a 12.
6. S se determine numerel e natural e de trei
cif re xyz cu proprietatea c
2 2 2
34
z y x + +
este un
numr natural .
7. S se determine toate numerel e de f orma y x4
care mprite l a 15 s dea restul 12.
8. Determinai numerel e de f orma b a2 care sunt
ptrate perf ecte.
9. Af l ai x, yN astf el nct x
2
+y
2
=832 i cel mai
mare divizor comun al numerel or x i y este 8.
10. Af l ai x i y astf el nct numerel e x 5 i y 2 s
f ie prime ntre el e.
11. Se introduc de l a tastatur n numere ntregi.
S se cal cul eze suma numerel or negative.
12. S se determine cif rel e x i y astf el nct
N y x e 2 1 .
13. S se determine toate triunghiuril e isoscel e
dif erite care au perimetrul p( nr. ntreg) .
92
Culegere de probleme Structura repetitiv
93
REZOLVAREA PROBLEMELOR

1a)
1. a)
program suma;
var i,n:integer; s:longint;
begin
write('n='); readln(n);
s:=0;
for i:=1 to n do
s:=s+sqr(sqr(2*i));
write('Suma este=',s); readln
end.

b)
program f1b;
var i,p,semn,n:integer;
begin
write('n='); readln(n);
p:=1; semn:=1;
for i:=1 to n do
begin
p:=p*semn*(2*i-1);
semn:=-semn;
end;
write('Produsul este ',p); readln
end.

c)
program suma;
var i,n:integer; s:real;
begin
write('n='); readln(n);
s:=0;
for i:=1 to n do
s:=s+1/((3*i-2)*(3*i+1));
write('Suma este=',s:6:2);
readln
end.

d)
program suma;
var i,n:integer; s:real;
begin
write('n='); readln(n);
s:=0;
for i:=1 to n do
s:=s+1/sqr(i);
writeln('Suma este ',s:6:2); readln
end.

2.
program media;
var i,s,nr,n,t:integer; mo,ms:real;
begin
s:=0;
write('Introduceti numarul de note pe care le are elevul in
oral:'); readln (n);
for i:=1 to n do
begin
write('Introduceti nota nr. ', i , ' din oral: '); readln(nr);
s:=s+nr;
end;
mo:=s/n;
writeln('Media notelor oral:',mo:6:3);
write('Introduceti nota de la tez:');
readln(t);
ms:=(3*mo+t)/4;
write('Media semestriala este:',ms:6:3); readln
end.
Culegere de probleme Structura repetitiv
94

3.
program fracii;
var a,b,c,d:byte;
begin
for a:=1 to 9 do
for b:=0 to 9 do
for d:=1 to 9 do
for c:=0 to 9 do
if((d*100+40+c)mod 12=0) and((a*100+30+b) mod 12
=0) then write(a,'3',b,'/',d,'4',c,' ');
end.

4.
program div_4;
var a,b,c:byte;
begin
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
if ((a<>b) and (b<>c))and((c*10+2) mod 4=0)and
(sqrt(a*10+b)=int(sqrt(a*10+b)))
then write(' ',a,b,c,'2',' ');
end.

5.
program numere;
var x,y:byte;
begin
for x:=0 to 9 do
for y:=0 to 9 do
if((7020+x*100+y)mod 12=5) then write(' ','7',x,'2',y,' ');
end.

6.
program nr_nat;
var x,y,z:byte;
begin
for x:=1 to 5 do
for y:=0 to 5 do
for z:=0 to 5 do
if (34 /(sqr(x)+sqr(y)+sqr(z)))=int(34
/(sqr(x)+sqr(y)+sqr(z)))
then write(' ',x,' ',y,' ',z,' ');
end.

7.
program numere;
var x,y:byte;
begin
for x:=1 to 9 do
for y:=0 to 9 do
if (x*100+40+y) mod 15=12 then write(' ',x,'4',y,' ');
readln
end.

8.
program nr_perfecte;
var a,b,c:byte;
begin
for a:=1 to 9 do
for b:=0 to 9 do
if sqrt(a*100+20+b)=int(sqrt(a*100+20+b) )
then write(' ',a,'2',b,' ')
end.

9.
program cmmdc;
var a, b, r, dei mp, i mp: word;
begi n
f or a: =1 t o 28 do begi n
f or b: =1 t o 28 do begi n
i f (sqr(a)+sqr(b))=832 t hen begi n
Culegere de probleme Structura repetitiv
95
dei mp: =a;
i mp: =b;
repeat
r: =dei mp mod i mp;
dei mp: =i mp;
i mp: =r;
unt i l r=0;
i f dei mp=8 t hen wri t el n(a: 2, ' ' , b: 2) ;
end;
end;
end;
readl n
end.

10.
program numere;
var x,y:byte; a,b,r:word;
begin
write('Numerele prime ntre ele sunt:');
for x:=0 to 9 do
for y:=0 to 9 do begin
a:=50+x; b:=20+y;
repeat
r:=a mod b; a:=b; b:=r;
until r=0;
if a=1 then write(x, ' si,y,';')
end;
readln
end.

11.
program nr_neg;
var nr,s,i,n:integer;
begin
write('n='); readln(n);
s:=0;
for i:=1 to n do begin
write('nr='); readln(nr);
if nr<0 then s:=s+nr;
end;
write('Suma este',s); readln;
end.

12.
program numere;
var x,y:byte;
begin
for x:=0 to 9 do
for y:=0 to 9 do
if sqrt(1020+x*100+y)=int(sqrt(1020+x*100+y))
then write(' x=',x,' y=',y,'; ');
readln
end.

13.
program tr_isoscel;
var a,b,p,c,t:integer;
begin
write('p='); readln(p);
t:=p-3;
for a:=1 to t do
begin
c:=p-2*a; b:=a;
if c>0 then
writeln(a:4,b:4,c:4);
end;
readln
end.

Culegere de probleme Structura repetitiv

2.3.7. TESTE WHILE

TEST 1


T1.1.Identificai erorile din urmtoarul program care trebuie s
calculeze produsul 1*2*3:

a)var p:byte;
begin
p:=1;i:=1;
while i<=3 do;
begin
p:=p*i;
i:=i+1;
end; write(p)
end.

T1.2.Ce va tipri urmtoarea secven de program?

96

















T1.3.Ce modificri trebuie aduse urmtorului fragment de
program pentru a calcula suma primelor n numere
impare(s=1+3++2n-1)?
i:=1;
s:=0;
readln(n);
while i <=n do
s:=s+(2*i-1);
i:=i+1;
writeln(s);
a) suma trebuia iniializat cu 0;
b) instruciunile s:=s+(2*i-1); i:=i+1; trebuie ncadrate de begin i end;
c) contorul i trebuie mrit cu 2 uniti: i:=i+2.

T1.4.Introducei i executai urmtorul program. Stabilii funcia sa.
i) x:=3;
y:=25;
while x<y do
x:=x+5;
Writeln(x, ,y);
a)3 25 b)23 25 c)28 25
ii) s:=0;

i:=7;
while i<=5 do
s:=s+i;
writeln(s);
a)5 b)0 c)7
iii) p:=1;
program numere;
var s,n,r:byte;
begin
write(n=); readln(n);
s:=0;
while n<>0 do begin
r:=n mod 10;
semn:=-1;
i:=1;
while i<=3 do begin
p:=p*semn*i;
semn:=-semn;
i:=i+1;
end; write(p);
a)3 b)6 c)-6
s:=s+r;
n:=n div 10;
end;
write(s);
end.

T 1.5. S se afieze divizorii impari ai unui numr citit de la
tastatur.
Culegere de probleme Structura repetitiv

TEST 2

97
T2.1.Se consider urmtoarea secven de program:

while m<>n do
if m>n then m:=m-n
else n:=n-m;
writeln(m);

Ce valoare se va afia pentru m=12 n=18.


T.2.2.Care dintre urmtoarele secvene de program calculeaz
suma:
s:=1+ 10 ... 2 + + .












T.2.3. Ce modificri trebuie aduse secvenei de program de mai
jos pentru a calcula produsul primelor 5 numere ntregi pozitive?


n:=1;
while n <= 5 do;
begin
p:=p*n;
n:=n+1
end;
writeln(p);


T2.4. Introducei i executai urmtorul program. Stabilii
funcia sa.

Program exemplu;
Var i,n:integer;
begin
Write(n=);
b)s:=1;
i:=2;
while i<=10
do
begin
s:=s+sqrt(i);
i:=i+1;
end;
c)s:=1; a)s:=0;
i:=1;
while i<=10 do
begin
s:=s+sqrt(i);
i:=i+1;
end;
readln(n);
i:=2
while i<=10
do
begin
s:=s+sqr(i);
i:=1;
while i<=n div 2 do
begin
if n mod i=0 then write(i:4);
i:=i+1;
i:=i+1;
end
end;
;
write(n:4);
end.


T 2.5. Se citesc de la tastatur n numere reale. S se se
determine minimul acestor numere.
Culegere de probleme Structura repetitiv

2.3.8. TESTE REPEAT

TEST 1
T1.1.Identificai erorile sintactice din urmtoarele secvene de
instruciuni:
a) m:=5;
98
Repeat
m:=m+5;
Until m:=100;

b) p:=1;
writeln(Puterile numarului 2:);
repeat
p:=p*2;
writeln(p);
write(Continuati? (Y/N):);
readln(c);
until c=N or c=n ;

T1.2. Ce vor tipari urmtoarele fragmente de program ?
i) a:=0;
repeat
a:=a+2;
until a>10;
Writeln (a);
a)8 b)10 c)12

ii) a:=0;b:=100;
repeat
a:=a+5;
until a>b;
Writeln (a);
a)5 b)100 c)105

T1.3. Pentru a calcula a
5
numrul a la puterea 5 folosim
urmtoarea secven:








a) p:=1;
i:=0;
repeat
p:=p*i;
i:=i+1;
until i<5;
write
b)p:=1;
i:=1;
repeat
p:=p*a;
i:=i+1;
until i>5;
write
c)p:=1;
i:=1;
repeat
p:=p*a;
i:=i+1;
until a<5;
write (p); (p); (p);

T.1.4. Ce modificri trebuie aduse secvenei de program de mai
jos pentru a calcula media aritmetic a primelor n numere
naturale?
program media_aritmetic;
var i,n,m_a:integer;
begin
write('n=');readln(n);
m_a:=0;
i:=0;
repeat
m_a:=m_a+i;
i:=i+1;
until i>n;
write('Media aritmetic este ',m_a/n:5:2);
end.

T1.5. S se determine toate numerele prime formate din dou
cifre.
Culegere de probleme Structura repetitiv

99
TEST 2


T 2.1. Ce va tipri urmtoarea secven de program pentru n=3?

c) readln(n);
i:=1;s:=0;
repeat
s:=s+i;
i:=i+1;
until i<n;
writeln (s);

a) 1 b) n*(n+1)/2 c) Nu se poate calcula suma.

T 2.2. Ce va afia urmtoarea secven de program?

program expresie;
var i,n,e,a:integer;
begin
write('n=');readln(n);
e:=0;
for i:=1 to n do begin
writeln(a=);
readln(a);
e:=e+a;
end;
write(e);
end.

a) suma primelor n numere naturale;
b) suma a n numere ntregi citite de la tastatur;
c) media aritmetic a primelor n numere naturale.

T2.3. Ce modificri trebuie aduse urmtorului fragment de
program pentru a afia cifrele numrului ntreg n?

write(n=);
readln(n);
repeat
r:=n mod 10;
write(r, );
n:=n div 10;
until n<>0;

a) Instruciunea write(r, ); trebuie nlocuit cu write(n, );
b) Instruciunea n:=n div 10; trebuie nlocuit cu n:=n/10;
c) Condiia n<>0 trebuie nlocuit cu r<>0;
d) Condiia n<>0 trebuie nlocuit cu n=0.

T 2.4. Fie urmtoarea secven de program:

s:=0;
i:=1;
while i<n do
begin
s:=s+i;
i:=i+1;
end;

Transcriei aceast secven folosind n locul instruciunii while
instruciunile for, respectiv repeat.

T 2.5. S se afieze produsul primelor n numere pare.



Culegere de probleme Structura repetitiv

2.3.9. TESTE FOR


TEST 1

T1.1.Identificai erorile sintactice din urmtoarele programe:

100
a)var i:byte;
begin
for i=0 to 9 then
write(i:3);
end.



T1.2.Ce va tipri urmtoarea secven de program?

i) a:=5; s:=0;
For i:=1 to a do
s:=s+i;
Writeln(s);

a) 0 b)15 c)6

ii) s:=0;
for i:=5 to 7 do
s:=s+i;
writeln(s);

a) 5 b)18 c)7

T1.3.Care dintre urmtoarele secvene de program calculeaz
suma:
s:=1 +2 ++100 .
2 2 2

b)var p,i:real;
begin
p:=1;
for i:=1 to 5 do
p:=p+1/i;
writeln(p);
end.
a)s:=0;
for i:=1 downto 100 do
s:=s+i*i;

b)s:=1;
for i:=2 to 100 do
s:=s+sqr(i);

c)s:=0;
for i:=100 to 1 do
s:=s+sqrt(i);

T1.4.Introducei i executai urmtorul program.Stabilii funcia
sa.

program numere;
var x,y:integer;
begin
for x:=0 to 9 do
for y:=0 to 9 do
write('2',x,y,'3 ');
end.

T1.5. S se afieze valoarea urmtoarei expresii:
S=1*2 + 2*3 + + n*(n+1)

Culegere de probleme Structura repetitiv

TEST 2


T2.1. Care din urmtoarele cicluri conin erori sintactice ?

a)For i:=0 to 9 do s:=s+i;

b) For i:=0.1 to 0.9 do write(i, );

c)readln(n);
prim:=true; program expresie;
var i,n,e,a:integer;
begin
write('n=');readln(n);
For i:=1 to sqrt(n) do
If n mod i=0 then prim:=false;
If prim=true then writeln(Numarul este prim);

T2.2. Ce va tipri urmtoarea secven?

i) s:=0;
for i:=1 to 5 do;
s:=s+i;
Writeln(s);
a) 0; b)5; c)15.

ii) p:=1;
semn:=1;
for i:=2 to 4 do
begin
p:=p*semn*i;
semn:=-semn;
end;
writeln(p);
end;

a)2 b)24 c)-24


T2.3. Ce va afia urmtorul program?

e:=0;
for i:=1 to n do begin
writeln(a=);
readln(a);
e:=e+a;
end;
write(e);
end.

a) suma primelor n numere naturale;
b) suma a n numere ntregi citite de la tastatur;
c) media aritmetic a primelor n numere naturale.

T 2.5.S se determi ne numerel e de forma y2x si x2y care
sunt pri me ntre el e.
101
Culegere de probleme Structura repetitiv

102

RSPUNSURI
Teste WHILE
T 1.1. variabila i nu a fost declarat;
- dup cuvntul cheie do nu se scrie ;.
T 1.2. c) ; b); b).T 1.3. b). T 1.4. Programul calculeaz suma
cifrelor unui numr.
T 1.5.
program divizori_impari;
var n,d,dp:word;
begin
write('Nr. este:');readln(n);
if n>1 then begin
writeln(Divizorii impari sunt:1);
dp:=n div 2; d:=3;
while d<= dp do begin
if n mod d=0 then write(d:4);
d:=d+2;
end;
if n mod 2 =1 then write(n:4);
end;
end.

T 2.1. Se va afia cel mai mare divizor comun al numerelor m i
n: 6. T 2.2. a), b). T 2.3. Produsul trebuie iniializat cu 1, iar
dup cuvntul cheie do se elimin ;.T 2.4. Afieaz divizorii
numrului n.
T 2.5.
Program minim;
var nr,i:byte; a,min:real;
begin
write('nr='); readln(nr); write('a='); readln(a);
min:=a; i:=2;
while i<=nr do begin
write('a='); readln(a);
if a<min then min:=a;
i:=i+1;
end;
write('Minimul este: ',min:5:2 );
readln
end.


Teste REPEAT
T 1.1. a) m:=100 trebuie s fie condiie, deci n locul operatorului
:= vom avea operatorul =.
b) N i n sunt constante de tip caracter, deci trebuie ncadrate
de apostrofuri. Pentru evaluarea corect a condiiei, aceasta
trebuia scris astfel:
(c=N) or (c=n)
T 1.2. i) c); ii) -c). T 1.3. b)
T 1.4. - variabila m_a trebuie declarat de tip real;
- contorul i trebuie incrementat n ciclul repeat: i:=i+1.
T1.5.
program numere;
var a,b,n,k:integer; prim:boolean;
begin
a:=1;
repeat
b:=0;
repeat
n:=a*10+b; k:=2; prim:=true;
repeat
if n mod k=0 then begin
prim:=false;
k:=n;
end
else k:=k+1;
Culegere de probleme Structura repetitiv

103
until k>trunc(sqrt(n));
if prim then write(a,b,' ');
b:=b+1;
until b>9;
a:=a+1;
until a>9;
readln
end.

T 2.1. a). T 2.2. b). T 2.3. d).
T 2.4.
s:=0; s:=0;
i:=1; for i:=1 to n-1 do
repeat s:=s+i;
s:=s+i;
i:=i+1;
until i=n;

T 2.5.
program produs;
var n,a,p:word;
begin
write('n=');readln(n);
p:=1; a:=1;
repeat
p:=p*2*a; a:=a+1;
until a>n;
write(p)
end.


Teste FOR
T 1.1. a) La iniializarea contorului n ciclul for se scrie :=, nu
egal (=). n ciclul for trebuie scris cuvntul cheie do, nu then.
Corect este: for i:=0 to 9 do
b) contorul ciclului for, i, este de tip ntreg, nu real.
T 1.2. i)- b); ii) -b). T 1.3. b)
T 1.4. Afieaz numerele de 4 cifre, cu cifra miilor 2 i cifra
unitilor 3.
T 1.5.
program expresie;
var i,n,s:integer;
begin
write('n='); readln(n);
s:=0;
for i:=1 to n do s:=s+i*(i+1);
write('Expresia este=',s);
end.

T 2.1. b) Prima i ultima valoare a indicelui din ciclul for trebuie s
fie de tip ordinal i nu real. c) funcia sqrt(n) returneaz o valoare
de tip real care nu este un tip ordinal.
T 2.2. i)-c); ii)-c). T 2.3. b).
T 2.4.
program nr_prime;
var x,y:byte; a,b,r:word;
begin
write('Numerele prime ntre ele sunt:');
for x:=1 to 9 do
for y:=1 to 9 do
begin
a:=x*100+20+y; b:=y*100+20+x;
repeat
r:=a mod b; a:=b; b:=r;
until r=0;
if a=1 then write(x,2,y,' ',y,2,x,' ')
end;
readln
end.

Culegere de probleme Tipul tablou
Capitolul 3.


TIPUL TABLOU


3.1. Tablouri unidimensionale - vectori.

Descrierea tipului tablou. Rezolvarea a 9 probleme ce utilizeaz acest tip. Se analizeaz problemele, se
descriu algoritmii ce rezolv problemele i se scriu programele Pascal ce transcriu algoritmii respectivi.
Se propun spre rezolvare 4 teste ce cuprind exerciii de tip gril i dezbaterea unor probleme.
Se propune scrierea unor programe Pascal care s rezolve problemele date.

3.2. Tablouri bidimensionale - matrici.

Rezolvarea a 8 probleme ce utilizeaz acest tip. Se analizeaz problemele, se descriu algoritmii ce
rezolv problemele i se scriu programele Pascal ce transcriu algoritmii respectivi.
Se propun spre rezolvare 3 teste ce cuprind exerciii de tip gril i dezbaterea unor probleme.
Se propune scrierea unor programe Pascal care s rezolve problemele date.



104
Culegere de probleme Tipul tablou - Vectori

105

3.1. TABLOURI UNIDIMENSIONALE - VECTORI
Tipul tablou este un tip de date structurat, ce conine o mulime finit de elemente de acelai tip.
Elementele unui tablou sunt ordonate dup unul sau mai muli indici.
In funcie de numrul de indici tablourile se clasific n :
tablouri unidimensionale (ce conin doar un indice) numite i vectori;
tablouri multidimensionale (ce conin mai muli indici)
tablouri bidimensionale (ce conin doi indici) numite i matrici;
tablouri tridimensionale (ce conin 3 indici) etc.

Specificarea tipului tablou se face sub urmtoarea form:

ARRAY[tip1 , tip2 , , tipn] OF tip_baz;
unde:
tip1, tip2, , tipn - reprezint tipul indicilor. Tipul indicilor este un tip ordinal. Nu se accepta tipul integer, longint etc., ci subdomenii
ale acestora.
tip_baz - reprezint tipul elementelor tabloului i poate fi orice tip simplu sau structurat.
De obicei pentru declararea indicilor se folosete tipul interval (subdomeniu).
Exemple:
type
vector1=array[1..20] of integer; { vector cu 20 elemente ntregi, cu indici ntregi }
vector2=array['A'.. 'G'] of real; { vector cu 7 elemente reale, cu indici de tip caracter literele A, B, , G }
matrice=array[1..10,1..10] of char; { matrice cu 100 elemente de tip caracter(10 elemente pe linie x10 elemente pe coloan)
cu indici ntregi }
Culegere de probleme Tipul tablou - Vectori


106
Problema 1. Se citete un vector cu n elemente ntregi. S se afieze elementele vectorului.

Rezolvarea problemei:
Date de intrare: n - numrul elementelor vectorului, a[i] 1in, elementele vectorului.
Date de ieire: a[i] 1in, elementele vectorului.
Fucia programului: Pentru citirea vectorului a se parcurg dou
etape:
- citirea dimensiunii vectorului - instruciunea readln(n);
- citirea celor n elemente ale vectorului n prima instruciune for:
for i:=1 to n do begin
write('a[',i,']='); readln(a[i]);
end;
Contorul i din ciclul for va indica poziia elementului citit n
vector astfel pentru i=1 se citete elementul a[1]pentru i=n se
citete ultimul element, a[n].
Afiarea vectorului realizeaz scrierea pe ecran element cu
element prin a doua instruciune for:
for i:=1 to n do write(a[i], );


Citire dimensiune: n=3
Citire vector
Execuie for (1):
Pas 1: i:=1; Citete a[1]: 4
Pas 2: i:=2; Citete a[2]: 3
Pas 3: i:=3; Citete a[3]: 2
Afiare vector
Execuie for (2):
Pas 1: i:=1; Afieaz a[1]: 4
Pas 2: i:=2; Afieaz a[2]: 3
Pas 3: i:=3; Afieaz a[3]: 2




Algoritmul n pseudocod:
Citire_afiare nseamn:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
Pentru i:= 1 la n execut
Scrie(a[i])
Sfrit.







Programul Pascal:
program citire_afisare_vector;
var i,n:integer;
a:array[1..20] of integer;
begin
write('Nr. de elemente, n=');readln(n);
writeln('Dati elementele vectorului');
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do write(a[ i ], );
end.

Problema 2. Calculul sumei elementelor unui vector de n numere reale.
Rezolvarea problemei:
Date de intrare: n - numrul elementelor vectorului, a[i] 1in, elementele vectorului.
Date de ieire: s - suma elementelor vectorului.
Funcia programului: Determinarea sumei elementelor din vector. Variabila s se iniializeaz cu 0, iar n cadrul ciclului for la aceast
variabil se adaug pe rnd elementele vectorului for i:=1 to n do s:=s+a[i];
Culegere de probleme Tipul tablou - Vectori


107

n : 3
a : (4,2,5)
Iniializare: s:=0
Execuie for:
Pas 1: i:=1; s:=s+a[1]=0+4=4
Pas 2: i:=2; s:=s+a[2]=4+2=7
Pas 3: i:=3; s:=s+a[3]=7+5=12
s : 12




Algoritmul n pseudocod:
Suma nseamn:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
s:=0;
Pentru i:= 1 la n execut
s:=s+ a[i];
Scrie(s)
Sfrit.



Programul Pascal:
program suma;
var i,n:integer;
a:array[1..20] of real;
s:real;
begin
write('Nr. de elemente, n=');
readln(n);
writeln('Dati elementele vectorului');
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
s:=0;
for i:=1 to n do
s:=s+a[i];
writeln(Suma este: ,s:7:2);
end.

Problema 3. Se citete un vector a cu n numere naturale. Sa se afieze elementele pare aflate pe poziii impare.

Rezolvarea problemei:
Date de intrare: n - numrul elementelor vectorului, a[i] 1in, elementele vectorului.
Date de ieire: a[i] elementele cu proprietatea dat.
Funcia programului: Se parcurge vectorul cu ajutorul ciclului for; dac sunt ndeplinite simultan condiiile:
a[i] mod 2=0 elementul a[i] este par;
i mod 2=1 - elementul a[i] este pe poziie impar,
se afieaz elementul a[i].
Obs. a) Condiiile trebie s fie ndeplinite simultan, deci se folosete operatorul AND pentru compunerea celor dou condiii
b) Dac parantezele ar lipsi din condiia (A[i] mod 2=0) and (i mod 2=1), s-ar efectua mai nti operaia a AND a[i], pentru c
operatorul multiplicativ AND este prioritar fa de operatorul de relaie =.
Culegere de probleme Tipul tablou - Vectori


108
n : 3
a : (3,2,6)
Execuie for:
Pas 1: i:=1; a[1]=3, (a[1] mod 2=0) (False) ,
(i mod 2=1) (True)
Pas 2: i:=2; a[2]=2, (a[2] mod 2=0) (True),
(i mod 2=1) (False)
Pas 3: i:=3; a[3]=6, (a[3] mod 2=0) (True),
(i mod 2=1) (True)
sunt ndeplinite ambele condiii, deci se
afieaz al treilea element, 6.








Algoritmul n pseudocod:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
Pentru i:= 1 la n execut
Dac (a[i] mod 2=0) and (i mod 2=1)
atunci Scrie(a[i])
Sfrit











Programul Pascal:
program elemente_pare;
var i,n:byte;
a:array[1..20] of word;
begin
write('Nr. de elemente, n=');readln(n);
Writeln('Dai elementele vectorului');
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
writeln('Elementele pare sunt: ');
for i:=1 to n do
if (A[i] mod 2=0) and (i mod 2=1)
then write(a[i],' ' );
end.

Problema 4. Se citete un ir de numere ntregi. S se afieze elementele care sunt numere prime si poziiile acestora n vector.

Rezolvarea problemei:
Date de intrare: n - dimensiunea vectorului; a[i] 1in, elementele vectorului.
Date de ieire: a[i] - numerele prime din vector; i - poziia elementului prim a[i].
Funcia programului: Parcurgerea vectorului se realizeaz n ciclul for de contor i.
Pentru fiecare element a[i] al vectorului se caut divizorii si - numerele cuprinse ntre 2 i trunc(sqrt(a[i])) n cadrul ciclului for de
contor k. Se presupune la nceput c fiecare numr a[i] este prim - prim:=TRUE - i dac se gsete un divizor propriu al su variabila prim
ia valoarea FALSE, indicnd ca numrul nu este prim.
Obs. Dac se renuna la funcia trunc, variabila sqrt(a[i]) va fi numr real, ceea ce va determina eroare de sintax n instruciunea for.




n : 3 a : (2 , 6 , 11) Execuie for (contor i):
Culegere de probleme Tipul tablou - Vectori


109
Pas 1: i:=1; a[1]=2; prim:=TRUE
n ciclul for de contor k nu se
execut
nici un pas deoarece
2>trunc(sqrt(2)).
Pas 2: a[2]=6; prim:=TRUE
Execuie for (contor k):
trunc(sqrt(a[3]))=2
Pas 2.1: k=2;
Avem condiia: a[2] mod k=0
(T) prim:=FALSE deci
a[2] nu e prim
Pas 3: a[3]=11; prim:=TRUE
Execuie for (contor
k):trunc(sqrt(a[3]))=3
Pas 3.1: k=2;
Condiia: a[2] mod k=0
este fals
Pas 3.2: k=3;
Condiia: a[3] mod k=0
este fals
Condiia prim=TRUE este
adevrat, deci se afieaz
elementul 11 aflat pe poziia 3.


Algoritmul n pseudocod:
Prime nseamn:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
Pentru i:= 1 la n execut
nceput
prim:=TRUE;
Pentru k:=2 la trunc(sqrt(a[i])) execut
Dac a[i] mod k=0 atunci
prim:=FALSE;
Dac prim:=TRUE atunci
Scrie(a[i],i);
sfrit
Sfrit.
Programul Pascal:
program prime;
var a:array[1..20] of integer;
k,i,n,m:integer;
prim:boolean;
begin
write('n=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do begin
prim:=true;
for k:=2 to trunc(sqrt(a[i])) do
if a[i] mod k=0 then
prim:=false;
if prim then
writeln(a[i],' pe pozitia ',i);
end;
end.


Problema 5. Se d un vector de n numere reale. S se determine elementul minim din vector.

Rezolvarea problemei:
Date de intrare: n, a[1], a[2], a[3], , a[n]
Date de ieire: min - elementul minim din vector
Funcia programului: Determinarea elementului minim din vector se realizeaz astfel:
- se iniializeaz variabila min cu primul element din vector, a[1];
- se parcurge vectorul ncepnd cu elementul al doilea. Dac un element a[i] al vectorului este mai mic dect min deci condiia
a[i]<min e adevrat- atunci variabilei min i se atribuie valoarea acelui element - min:=a[i].
Vectorul este parcus n totalitate n momentul n care se termin ciclul for; n acest moment variabila min este egal cu valoarea
elementului minim din vector. Elementele vectorului sunt reale, deci variabila min va fi de tip real.
n : 3
a : (4 , 2 , 5)
Iniializare: min:=4
Execuie for:
Pas 1: i:=2; cond. a[2]<min (T)
min:=a[2]=2
Culegere de probleme Tipul tablou - Vectori


110
Pas 2: i:=3; cond. a[3]<min (F),
min rmne neschimbat
Se afieaz minimul din vector: 2.










Algoritmul n pseudocod:
Minim nseamn:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
min:=a[1];
Pentru i:= 2 la n execut
Dac a[i]<min atunci min:= a[i]
Scrie(min);
Sfrit.









Programul Pascal:
program Minim;
var a: vector=array[1..20] of real;
n,i:integer;
min:real;
begin
write('n='); readln(n);
for i:=1 to n do
begin
write(a[,i,]=);
readln(a[i]);
end;
min:=a[1];
for i:=2 to n do
if a[i]<min then min:=a[i];
writeln(Minimul este , min:6:2);
end.

Problema 6. Se d un vector de n numere ntregi. S se ordoneze cresctor elementele vectorului.
Rezolvarea problemei:
Date de intrare: n, a[n]
Date de ieire: vectorul ordonat a[n]
Funcia programului: Vectorul a este ordonat dac elementele sale ndeplinesc condiia: a[1]a[2]a[n].
n acest program se folosete metoda bulelor pentru ordonarea elementelor vectorului.
Prin aceast metod se parcurge vectorul element cu element i se efectueaz interschimbri ale elementelor nvecinate pn cnd
vectorul devine ordonat.
naintea fiecrei parcurgeri presupunem c vectorul este ordonat variabila ordonat ia valoarea True.
La o parcurgerea a vectorului se compar elementele nvecinate, a[i] i a[i+1]. Dac nu respect condiia de ordonare, aceste elemente
se interschimb i variabila ordonat ia valoarea false (vectorul nu este nc ordonat).
Dac la sfritul unei parcurgeri nu s-a efectuat nici o interschimbare, variabila ordonat rmne la valoarea true, deci vectorul este
ordonat i prelucrarea lui se oprete.
Interschimbarea elementelor a[i] i a[i+1] se realizeaz cu ajutorul variabilei auxiliare t, care reine elementul a[i] pentru ca valoarea
acestuia s nu fie tears prin atribuirea a[i]:=a[i+1].
n : 3 a : (7,8,6)
Execuie repeat:
Iteraie 1: ordonat=TRUE
Execuie for:
Iteraie 1.1: i=1; cond a[1] > a[2]
(F),
Culegere de probleme Tipul tablou - Vectori


111
vectorul rmne neschimbat
Iteraie 1.2: i=2; cond a[2] > a[3] (T)
ordonat:=FALSE
Vectorul a : ( 7 , 8 , 6 ) devine
a : ( 7 , 6 , 8 )
cond. ordonat=TRUE (F)
Iteraie 2: ordonat=TRUE
Execuie for:
Iteraie 2.1: i=1; cond a[1] > a[2] (T)
ordonat=FALSE
Vectorul a : ( 7 , 6 , 8 ) devine
a : ( 6 , 7 , 8 )
Iteraie 2.2: i=2; cond a[2] > a[3] (F),
cond. ordonat=TRUE (F)
Iteraie 3: ordonat=TRUE
Execuie for:
Iteraie 3.1: i=1; cond a[1] > a[2] (F),
vectorul rmne neschimbat
Iteraie 3.2: i=2; cond a[2] > a[3] (F),
vectorul rmne neschimbat
cond. ordonat=TRUE (T)
Vectorul este ordonat, deci nu se vor
efectua interschimbri. Variabila ordonat
rmne neschimbat - la valoarea FALSE;
astfel condiia ordonat=TRUE este
adevrat, fapt
care determin ieirea din ciclul repeat i
afiarea n continuare a vectorului
ordonat.

Algoritmul n pseudocod:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
Repet
ordonat:=TRUE;
Pentru i:= 1 la n-1 execut
Dac a[i]>a[i+1] atunci nceput
ordonat:=FALSE;
t:= a[i];
a[i]:=a[i+1];
a[i+1]:=t
sfrit;
Pn cnd ordonat=TRUE;
Pentru i:= 1 la n execut
Scrie(a[i]);
Sfrit.
Programul Pascal:
Program Ordonare_vector;
var a:array[1..20] of integer;
n,i,t:integer;
ordonat:boolean;
begin
write('n='); readln(n);
for i:=1 to n do readln(a[i]);
repeat
ordonat:=TRUE;
{Parcurgerea vectorului}
for i:=1 to (n-1) do begin
if a[i]>a[i+1] then begin
ordonat:=FALSE; {Vectorul
nu este ordonat}
{Interschimbarea elementelor}
t:=a[i];
a[i]:=a[i+1];
a[i+1]:=t;
end ;
end ;
until ordonat=TRUE;
for i:=1 to n do write(a[i],' ');
end.

Problema 7. Se citesc de la tastatur un vector de dimensiune n i un numr ntreg x. S se determine dac numrul x se
gasete printre elementele vectorului.

Rezolvarea problemei:
Date de intrare: x - numrul ntreg; n - dimensiunea vectorului; a[i] 1in, elementele vectorului.
Date de ieire: Un mesaj care indic existena sau inexistena numrului n vector.
Funcia programului: Se folosete metoda de cutare secvenial, care const n parcurgerea vectorului pn cnd este gsit numrul
dat sau se ajunge la sfritul vectorului.
Culegere de probleme Tipul tablou - Vectori


112
Iniial se presupune c numrul x nu se gsete n vector (gasit:=FALSE). Dac un element a[i] al vectorului este egal cu numrul x,
variabil boolean gsit ia valoarea TRUE i n acest caz se va afia mesajul 'Nr. este in ir'.
n : 2, x: 3
a : (3 , 5)
Iniializare: gsit:=FALSE
Execuie for:
Pas 1: i:=1; cond. a[1]=x (T)
gsit:=TRUE
Pas 2: i:=2; cond. a[2]=x (F)
Cond. gsit=TRUE (T) Se afieaz mesajul
: 'Nr. este n vector'

DI: n : 2; x: 6
a : (5,4)
Iniializare: gsit:=FALSE
Execuie for:
Pas 1: i:=1; cond. a[1]=x (F)
Pas 2: i:=2; cond. a[2]=x (F)
Variabila gsit a rmas la valoarea iniial,
FALSE, deci se afieaz mesajul : 'Nr. nu este
n vector'
Algoritmul n pseudocod:
Cutare_secvenial nseamn:
nceput
Citete(x, n);
Pentru i:= 1 la n execut
Citete(a[i]);
gsit:=false;
Pentru i:= 1 la n execut
Dac a[i]=x atunci gsit:=TRUE;
Dac gsit=TRUE atunci
Scrie('Nr. este n ir')
altfel
Scrie('Nr. nu este n ir')
Sfrit.






Programul Pascal:
Program Cautare_secvenial;
var x,n,i:integer;
a:array[1..100] of integer;
gasit:boolean;
begin
write('Nr. cutat ');readln(x);
write('n=');readln(n);
gsit:=false;
for i:=1 to n do readln(a[i]);
for i:=1 to n do
if a[i]=x then gsit:=true;
if gsit=true then
writeln('Nr. este n sir')
else
writeln('Nr. nu este n sir');
end.

Problema 8. Se citesc un vector de n elemente i un numr natural k, aflat n intervalul [1..n] . S se realizeze eliminarea
elementului aflat pe poziia k n vector.
Rezolvarea problemei:
Date de intrare: n, a[1], a[2], , a[n]; k poziia elementului care se elimin.
Date de ieire: vectorul a de dimensiune n-1 obinut prin eliminarea elementului dat.
Funcia programului: Citirea poziiei k a elementului care se elimin se reia pn cnd numrul k se gsete n intervalul valid [1..n] -
instruciunea repeat.
Elementele a[1], a[2], , a[k-1] rmn pe poziiile iniiale.
Elementul a[k] va fi eliminat, prin deplasarea elementelor a[k+1], a[k+2], ,a[n] cu o poziie spre stnga. Aceast deplasare se
realizeaz prin ciclul: for i:=k to n-1 do a[i]:=a[i+1]; prin care peste elementul a[i] se scrie valoarea elementului succesor, a[i+1], ncepnd
cu elementul de indice k din vector. Aceste operaii sunt reprezentate n schema, unde numerele (1), (2), (n-k+1) reprezint ordinea operaiilor:

Culegere de probleme Tipul tablou - Vectori


( 1) ( 2) ( n- k) ( n- k+1)
a[k-1]
a[1] a[2] . .
a[k] a[k+1] a[n] a[n-1] . .



n=5; a=(7,4,3,8,9)
k=3
Execuie for:
Pas.1 i:=3, a[3]:=a[4]=8
Vectorul devine a=(7,4,8,8,9)
Pas.2 i:=4, a[3]:=a[4]=8;
Vectorul devine a=(7,4,8,9,9)
n=n-1=4
a:(7,4,8,9)















Algoritmul n pseudocod:
Elimin_element nseamn:
nceput
Citete(n);
Pentru i:= 1 la n execut
Citete(a[i]);
Repet
Citete(k)
Pn cnd(k>0) and (k<=n)
Pentru i:= k la n-1 execut
a[i]:=a[i+1];
n:=n-1;
Pentru i:=1 la n execut
Scrie(a[i])
Sfrit.









Programul Pascal:
program elimin_element;
var a:array[1..20] of integer;
k,i,n:integer;
begin
write(n=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
write('Dai poziia elem care se elimin:');
repeat
readln(k);
until(k>0)and(k<=n);
for i:=k to n-1 do
a[i]:=a[i+1]; {Deplasarea elementelor}
n:=n-1; {Dimensiunea vectorului scade
cu o unitate}
writeln('Noul vector este');
for i:=1 to n do write(a[i],' ');
end.
113
Culegere de probleme Tipul tablou - Vectori


114
Problema 9. Se citete un numr ntreg pozitiv. S se afieze cifrele numrului.

Rezolvarea problemei:
Date de intrare: n - numrul pozitiv.
Date de ieire: cifre - vectorul de dimensiune k care conine cifrele lui n.
Funcia programului: Cifrele numrului se determin prin mpriri repetate la 10. O cifr a numrului este dat de restul mpririi
numrului la 10, rest care se memoreaz n vectorul cifre. Ctul reprezint noul numr asupra cruia i vom aplica n continuare
mpririle la10. Astfel primul rest va fi cifra unitilor, al doilea rest, cifra zecilor etc.
mpririle se termin n momentul n care ctul devine 0: c=0 - condiia din instruciunea repeat.
Obs.: 1. Dac se introduce o secven se cifre care ncepe cu 0, zerourile din fa se vor elimina automat prin condiia instruciunii repeat.
2.Varibila k reine n final numrul de cifre ale numrului i dimensiunea vectorului cifre. Cifrele numrului sunt memorate n
vector ordine invers, deci vectorul va fi afiat cu opiunea downto a instruciunii for.
n : 34
Iniializare: k:=0
Execuie repeat:
Pas 1: r:=34 mod 10=4
k:=k+1=1; cifre[1]:=4 cifra
unitilor
c:=34 div 10=3
n:=c=3
cond. c=0 (F)
Pas 1: r:=3 mod 10=3
k:=k+1=2; cifre[2]:=3 cifra
zecilor
c:=3 div 10=0
n:=c=0
cond. c=0 (T) - se ncheie
parcurgerea
ciclului repeat
Se afieaz vectorul cifre n ordine
invers:
3 , 4


Algoritmul n pseudocod:
Cifre_numr nseamn:
nceput
Citete(n);
k:=0;
repet
r:=n mod 10;
k:=k+1;
cifre[k]:=r;
c:=n div 10;
n:=c;
pn cnd c=0;
Pentru i:=k la 1 execut
Scrie(cifre[i])
Sfrit.







Programul Pascal:
program cifre_numr;
var cifre:array[1..20] of byte;
i,k,c,n,r:integer;
begin
write('Dai numrul'); readln(n);
k:=0;
repeat
r:=n mod 10; {Determinarea
ultimei cifre}
{Memorarea cifrei n vector }
k:=k+1; cifre[k]:=r;
c:=n div 10;
n:=c; {Reactualizarea numarului}
until c=0;
writeln('Cifrele numrului sunt:');
for i:=k downto 1 do
write(cifre[i],' ');
end.
Culegere de probleme Tipul tablou - Vectori


115
3.1.1. TESTE
TEST 1

T1.1. Indicai care din urmtoarele declaraii de vectori sunt
incorecte:

a) a:array[1..10] of char;
b) a:array[-5,5] of real;
c) a:array[20] of integer;

T1.2. Indicai care din urmtoarele secvene reprezint citirea
elementelor unui vector:

a) for i:=1 to n do
write('A[',i,']=');
readln(A[i]);

b) for i:=1 to n do
readln('A[',i,']=',A[i]);

c) for i:=1 to n do
begin
write('A[',i,']= ');
read(A[i]);
end;

T1.3. Ce afieaz urmtoarea secvena de program?

for i:=1 to n do
if (a[i] mod 2)=0 and (i mod 2)=1 then
Writeln('Elementul are proprietatea cerut');

a) Elementele divizibile cu 2 aflate pe poziii impare;
b) Elementele divizibile cu 2 aflate pe poziii pare;
c) Elementele pare sau elementele aflate pe poziii impare.

T1.4. Se citesc doi vectori de aceeai dimensiune. Urmtorul
fragment de program:
p:=1; s:=0;
for i:=1 to n do begin
s:= x[i]+ y[i]; p:=p*s;
end;
writeln(p);
va tipri valoarea expresiei:
a) E=(x
1
+y
1
)(x
2
+y
2
) (x
n+y
n
)
b) E=x
1
y
1
+ x
2
y
2
+ x
n
y
n

T1.5 Se d un vector de n el emente real e. S se
real i zeze el i mi narea el ementul ui al 3-l ea di n vector.

Culegere de probleme Tipul tablou - Vectori


116
TEST 2


T2.1. Care sunt dimensiunile tablourilor urmtoare?

Type a=array[-5..5] of char;
b=array[0..255] of real;
c=array[A..H] of integer;

a) 5 255 8 b)10 256 8 c) 11 256 8

T2.2. Secvena urmtoare de program:

verif:=TRUE;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]=a[j] then verif:=FALSE;
If verif then writeln(Vectorul are proprietatea cerut);

testeaz dac:
a) Elementele vectorului sunt distincte;
b) Elementele nvecinate ale vectorului sunt distincte;
c) Exista un anumit numr n vector,
T2.3. Se consider urmtoarele declaraii:
var a:array[1..10] of real;
ti,i,j,n:integer;
tr:real;
Indicai care secven realizeaz interschimbarea elementelor a[i]
i a[j]:

a) a[i]:=a[j]; b) ti:=a[j]; c) tr:=a[i];
a[j]:=a[i]; a[i]:=a[j];
a[i]=ti; a[j]=tr;

T2.4. Ce afieaz urmtoarea secvena de program?

nr:=0;
for i:=1 to n do
if a[i] >0 then nr:=nr+1;
writeln(nr);

T2.5. Realizai un program care ordoneaz descresctor elementele
unui vector cu elemente reale.
Culegere de probleme Tipul tablou - Vectori


117

TEST 3

T3.1. Se consider declaraiile:

var i:byte;
a:array[1..10] of integer;

Care din urmtoarele atribuiri sunt eronate?
a) a[5]:=10/4;
b) a[20]:= 8 div 3;
c) a[1]:=trunc(sqrt(12));
d) a[4]:=a[3] mod 2;

T3.2. Ce proprietate au elementele vectorului a, n cazul n care
variabila verif are valoarea TRUE, dup executarea urmtoarei
secvene de program:

i:=1; verif:=TRUE;
while (i<=n) and verif do
if a[i]-a[i+1]<=0 then i:=i+1
else verif:=FALSE;

a) elementele vectorului sunt negative;
b) elementele vectorului sunt n ordine cresctoare;
c) elementele vectorului sunt n ordine descresctoare;
Cum se poate rescrie condiia a[i]-a[i+1]<=0?


T3.3. Inserarea unui element x pe poziia p ntr-un vector se
realizeaz prin secvena:

a) for i:=p to n do a[i+1]:=a[i];
a[p]:=x;
b) for i:=n downto p do a[i+1]:=a[i];
a[p]:=x;
c) for i:=n+1 downto p+1 do a[i]:=a[i-1];
a[p]:=x;

T3.4. Se consider urmtoarele instruciuni:

For i:= 1 to n do begin
prim:=TRUE;
instruciune;
if prim then
writeln(a[i], este prim);
end;

Pentru ca grupul de instruciuni s realizeze determinarea
numerelor prime din vectorul a de dimensiune n, instruciune
trebuie nlocuit cu:

a) for k:=2 to a[i] do
if a[i] div k=0 then prim:=FALSE;
b) for k:=2 to a[i]-1 do
if a[i] div k=0 then prim:=FALSE;
c) for k:=2 to sqrt(a[i]) do
if a[i] mod k=0 then prim:=FALSE;
d) for k:=2 to trunc(sqrt(a[i])) do
if a[i] mod k=0 then prim:=FALSE;

T3.5. Realizai programul care afieaz numerele prime dintr-un
vector.
Culegere de probleme Tipul tablou - Vectori


118
TEST 4

T4.1. Indicai care din urmtoarele declaraii sunt corecte;

a) a:array[a..z] of byte;
b) n:word;
a,b:array[1..n] of integer;
c) a:integer;
a,b:array[1..10] of real;

T4.2. Ce erori conine urmtorul program care trebuie s
calculeze media aritmetic a n numere ntregi?

Program test;
Var i,n:integer;
a:array[1..20] of integer;
Begin
for i:=1 to n do
write('a[',i,']=');
readln(a[i]);
for i:=1 to n do
s:=s+ a[i];
s:=s/n;
writeln(Media aritmetica este, s:6:2),
End.






T4.3. Care din urmtoarele instruciuni realizeaz deplasarea
elementelor unui vector cu o poziie spre dreapta?
a) for i:=1 to n do a[i]:=a[i+1];
b) for i:=1 to n do a[i+1]:=a[i];
c) for i:=n downto 1 do a[i+1]:=a[i];
d) for i:=n downto 1 do a[i]:=a[i+1];

T4.4. Alegei secvenele de program care realizeaz inversarea
elementelor unui vector:
a) for i:=1 to n do begin
t:=x[i];
x[i]:=x[i+1];
x[n+1-i]:=t;
end;
b) for i:=n downto 1 do begin
t:=x[i];
x[i]:=x[i+1];
x[n+1-i]:=t;
end;
c) for i:=1 to n div 2 do begin
t:=x[i];
x[i]:=x[n+1-i];
x[n+1-i]:=t;
end;

T4.5. Real i zai programul care determi n maxi mul i
mi ni mul di ntr-un vector de 10 numere ntregi .

Culegere de probleme Tipul tablou - Vectori

3.1.2. PROBLEME PROPUSE






1. Se citete un vector "a" de el emente ntregi. Sa
se af ieze numerel e din vector:
a) divizibile cu 7;
b) divizibile cu 3 si cu 5;
c) divizibile cu 7 sau cu 11;
d) numere divizibile cu un numr k dat.
2. Se d un vector de numere ntregi. S se
determine el ementel e vectorul ui, i poziiil e aacestora,
care au urmtoarel e proprieti:
a) sunt numere impare.
b) sunt numere perfecte numerele care sunt egale cu
suma divizorilor lor.
c) Elementele vectorului care sunt ptrate ale unor
numere .
3. S se af ieze val oril e expresiil or:
a) E:= a
1
2
+a
2
2
+ +a
n
2

b) E:= (a
1
+a
2
+ +a
n
) ( b
1
+b
2
+ +b
n
)
c) E:= a
1
b
n
+ a
2
b
n=1
+ +a
n
b
1

d) E:=
a
b
a
b
... +
1
1
2
2
+ +
a
b
n
n

119
unde a i b sunt vectori cu n elemente ntregi, citii de la
tastatur.

4. ntr-un vector sunt reinute val oril e produsel or
achiziionate de un magazin pe timp de o l un
el ementul a[i] reprezint val oarea total , l a cumprare, a
produsul ui cu numrul de ordine i. Presupunnd c l a
vnzare se percepe un comision unic de 20%, s se
determine dif erena dintre val oarea total l a vnzare i
val oarea l a cumprare a produsel or.
5 Se d un vector de n el emente. S se real izeze
el iminarea:
a) primului element;
b) unui element x citit de la tastatur, n cazul n care
acesta exist n vector.
6. La un examen de admitere el evii au f ost supui
unei probe el iminatorii. Notel e obinute de el evi sunt
citite ntr-un vector de dimensiune n, unde n reprezint
numrul de candidai. S se real izeze el iminarea din
vector a el evil or nepromovai ( cu nota mai mic de 5) i
s se af ieze mediil e cel or ce vor participa l a probel e
ul terioare.
7. Se d un vector de n el emente. S se real izeze
inserarea unui el ement dat:
a) la nceputul vectorului;
Culegere de probleme Tipul tablou - Vectori
120
b) la sfritul vectorulu
c) pe o poziie dat j.
i;
8. Se da un vector de n el emente. Sa se introduc
ntre f iecare pereche de el emente consecutive din vector
media l or aritmetica.
9. Se citesc dou mul imi, sub f orma a doi vect
se determine:
ori A

ic, se cal if ic n
se inute de cei doi
sp
d n
af
vectori ordonai
cr
i B. S
)
c) mulimea C=A \ B (diferena mulimilor A i B)
10. Se d un vector de numere nt
a) mulimea C=A B (reuniunea mulimilor A i B)
b) mulimea C=A B (intersecia mulimilor A i B
regi. S se
decid dac numerel e sunt distincte sau nu.
11. Se citesc doi vectori de aceai dimensiune n.
S se af ieze vectorul sum al cel or doi vectori.
12. Se d un vector de n el emente. Sa se determine
maximul i minimul din vector.
13. Se d un vector de n el emente real e. S se
determine maximul din vector i poziiil e n care
el ementul maxim apare.
14. ntr-un vector sunt memorate mediil e general e
dintr-o cl as cu n el evi. S se af ieze numrul de ordine
al el evil or care au l uat premiul I el evul sau el evii cu
media cea mai mare.
15. Se presupune c un magazin a vndut un
numr de n produse n f iecare din ul timel e dou l uni
( nomencl atorul de produse a rmas acel ai) . n doi
vectori sunt citite numrul de buci vndute din f iecare
produs n cel e dou l uni. Se real izeaz o situaie total
pe cel e dou l uni a produsel or vndute, iar produsul cu
cea mai mic vnzare se va el imina din nomencl ator. S
se determine numrul de ordine al acestui produs.
16. Se d un vector de n el emente ntregi. S se
verif ice dac este ordonat cresctor.
17. Se d un vector de n el emente. S se ordoneze
descresctor vectorul .
18. Se consider semif inal el e unui concurs de
atl etism. ntr-un vector sunt memorai timpii pe care i-au
obinut sportivii participani l a o semif inal . Cunoscnd
c primii doi sportivi, cu timpul cel mai m
mi inal , s se determine timpuril e ob f
ortivi cal if icai.
19. S se memoreze ntr-un ve
a) primii 10 multipli ai unui numr dat
ctor:
a;.
;
c) divizorii primi ai unui numr dat a;
b) divizorii unui numr dat a
d) primele n numere prime;
e) numerele prime pana la un numr dat m.
20. Se d un vector de n el emente. S se genereze
doi vectori astf el nct primul s conin el ementel e
pozitive, iar cel de-al doil ea, pe cel e negative.
21. ntr-un vector sunt memorate mediil e l a sf rit
e a l a o anumit materie dintr-o cl as cu n el evi. S se
ieze numrul de el evi promovai i numrul el evil or
corige
22. Se citete un numr natural n. S se determine:
a) suma cifrelor sale;
b) cifra maxim din numr.
ni din cl as.
23. Se d un vector de dimensiune n. S se af ieze
cel mai mare divizor comun al cel or n numere.
24. Se citesc de l a tastatur doi
esctor. S se genereze un nou vector care cuprinde
Culegere de probleme Tipul tablou - Vectori
121
toete el ementel e cel or doi vectori, n ordine cresctoare
( probl ema intercl asrii a doi vectori) .
ntr-un vector sunt reinute sumele solicitate de cei care au obinut
aprobarea pentru mprumut; poziia n vector este dat de ordinea
25. O banc acord mprumuturi subvenionate, valoarea
total a acestor mprumuturi netrebuind s depeasc o sum S.
depunerii cererilor. S se determine ci solicitani vor primi creditul.

Culegere de probleme Tipul tablou - Vectori
122
RSPUNSURI

T1.1. La punctul b) indicii trebuie desprii prin .. nu
prin ,. La punctul c) lipsete a doua limit a
intervalului la declararea tipului indicelui.
T1.2. c). La punctul a se execut n ciclul for numai
instruciunea de citire. La puncul b) primul parametru i
al treilea parametru ai instruciunii read sunt constani,
ceea ce nu este permis.
T1.3. a). Condiiile au urmtoarea semnificaie:
a[i] mod 2 - testeaz elementele pare;
i mod 2 - testeaz indicii impari.
Deoarece apare operatorul logic AND, trebuie
ndeplinite amndou condiiile simultan, deci punctul
c) este exclus.
T1.4. a). Expresia este un produs de sume. Se calculeaz
mai nti suma dintre dou elemente, dup care se
adaug la produsul total.
T1.5 Se aplic algoritmul problemei 8.
Modificri:
- se declar vectorul a ca avnd elemente reale;
- poziia k este dat, k=3.

program elimin_elementul3;
var a:array[1..20] of real;
i,n:integer;
begin
write('Dimensiunea
vectorului:');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=3 to n-1 do
a[i]:=a[i+1];
n:=n-1;
writeln('Noul vector este');
for i:=1 to n do write(a[i]:5:2,' ');
end.

T2.1. c)
T2.2. a). Punctul c) se elimin deoarece testul se efectueaz
numai asupra elementelor din vector, iar punctul b), deoarece
contorii i i j nu genereaz elemente nvecinate.
Punctul a) se poate verifica parcurgnd algoritmul pe pai,
considernd doi vectori, unul care respect concluzia dat, iar
cellat nu.
T2.3. c)
Atribuirea de la punctul a) terge valoarea elementului a[i].
La punctul b) tipurile variabilei temporale ti nu corespunde cu
tipul elementelor vectorului.
T2.4. Numrul elementelor pozitive din vectorul a.
T2.5. Se aplic algoritmul problemei 5, schimbndu-se condiia
a[i]>a[i+1] cu condiia a[i]<a[i+1].
Program Ordonare_descresctoare;
var a:array[1..20] of integer;
n,i,t:integer;
ordonat:boolean;
begin
write('n='); readln(n);
for i:=1 to n do readln(a[i]);
repeat
ordonat:=TRUE;
for i:=1 to n-1 do begin
if a[i]<a[i+1] then begin
ordonat:=FALSE; {Vectorul nu
este ordonat}
{Interschimbarea elementelor}
Culegere de probleme Tipul tablou - Vectori
123
t:=a[i];
a[i]:=a[i+1];
a[i+1]:=t;
end ;
end ;
until ordonat=TRUE;
for i:=1 to n do write(a[i],' ');
end.

T3.1. a),b). La punctul a) se efectueaz o mprire cu
rezultatul de tip real, care nu corespunde cu tipul
elementelor tabloului.
La b) se depete dimensiunea maxim a vectorului
indicele 20 este mai mare dect dimensiunea declarat,
10.
T3.2. b). Condiia a[i]-a[i+1]<=0 se poate rescrie astfel
a[i]<=a[i+1], deci se verific dac vectorul este ordonat
cresctor.
T3.3. b). Pentru a insera un element pe o poziie p
trebuie deplasate elementele vectorului cu o poziie la
dreapta, ncepnd cu ultimul element pn la elementul
a[p], dup care se memoreaz elementul x n poziia p.
T3.4. d)
T3.5. Vezi problema 4.

T4.1. a). La punctul b) dimensiunea superioar este o
variabil, iar la punctul c) este variabila a este declarat
de dou ori.
T4.2. 1) nu este citit dimensiunea vectorului, n.
2) n primul ciclu for se execut numai
instrucuinea write; pentru a executa i citirea
elementelor vectorului trebuie ca instruciunile write i
readln s fie cuprinse ntre begin i end.
3) Variabila s trebuie declarat de tip real.
T4.3. c).
T4.4. c). Secvena de la punctul c) schimb elementele
din prima jumtate a vectorului cu cele din a doua
jumtate, n timp ce la primele dou puncte aceast schimbare
se face de dou ori, revenindu-se la vectorul iniial.
T4.5 Se aplic algoritmul problemei 5, la care se adaug
iniializarea maximului i condiia pentru maxim: a[i]>max:
Variabilele max, min i elementele vectorului vor fi declarate
de tip ntreg.

program Minim_maxim;
var i,n, max, min:integer;
a:array[1..10] of integer;
begin
for i:=1 to 10 do begin
write('a[',i,']=');
readln(a[i]);
end;
max:=a[1];
min:=a[1];
for i:=2 to 10 do begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
writeln('Maximul este:',max);
writeln('Minimul este:',min);
end.
Culegere de probleme Tipul tablou - Vectori
124

1.a. Se aplic algoritmul problemei rezolvate 3. Pentru
ca un element s fie divizibil cu 7 se verific condiia:
a[i] mod 7=0
program divizori;
var i,n:integer;
a:array[1..20] of integer;
begin
write('Nr. de elemente, n=');readln(n);
writeln('Dati elementele ');
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
writeln('Elementele divizibile cu numrul 7 sunt:');
for i:=1 to n do begin
if a[i] mod 7=0 then
write(a[i],' ')
end;
readln;
end.

1.b. Acelai program, ns condiia subliniat se
nlocuiete cu:
(a[i] mod 3=0) AND (a[i] mod 5=0)
Pentru ca numrul s fie divizibil simultan cu 3 i 5
se folosete operatorul conjunctiv AND.

1.c. Acelai program, condiia subliniat se nlocuiete
cu:
(a[i] mod 7=0) OR (a[i] mod 11=0)
Operatorul OR semnific faptul c este de ajuns s fie
ndeplinit numai una din condiiile (a[i] mod 7=0) sau
(a[i] mod 11=0) pentru a avea condiia general
adevrat.

1.d. Programele anterioare se completeaz cu citirea numrului
k, iar condiia de divizibilitate devine:
a[i] mod k=0

program divizibile_k;
var i,n,k:integer;
a:array[1..20] of integer;
begin
write('Nr. de elemente, n=');readln(n);
write('Dai numarul:');readln(k);
writeln('Dai elementele ');
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
writeln('Elementele divizibile cu ',k,' sunt:');
for i:=1 to n do begin
if a[i] mod k=0 then
write(a[i],' ')
end;
readln;
end.

2.a. Se aplic algoritmul problemei rezolvate 3.

program impare;
var i,n:integer;
a:array[1..20] of integer;
begin
write('Nr. de elemente, n=');readln(n);
writeln('Dai elementele ');
for i:=1 to n do begin
write('a[',i,']=');
Culegere de probleme Tipul tablou - Vectori
125
readln(a[i]);
end;
writeln('Elementele impare sunt:');
for i:=1 to n do begin
if a[i] mod 2=1 then
write(a[i],' pe poziia ',i )
end;
end

2.b. Un numr este perfect dac este egal cu suma
divizorilor si, inclusiv 1.
De exemplu, numrul 6 este perfect: 6=1+2+3.
Etape:
- parcurgerea vectorului;
- iniializarea sumei s;
- Pentru a genera posibilii divizori ai elementului a[i]
se folosete instruciunea repetitiv for k:=1 to a[i]
div 2.
- Dac variabila k este divizor al lui a[i] - a[i] mod
k=0 atunci k se adaug la suma divizorilor, s.
- Condiia ca numrul a[i] s fie perfect este: s=a[i].

program numere_perfecte;
var i,n,k,s:integer;
a:array[1..20] of integer;
begin
write('Nr. de elemente, n=');readln(n);
writeln('Dai elementele ');
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
writeln('Elementele perfecte sunt');
for i:=1 to n do begin
s:=0; {Iniializarea sumei}
for k:=1 to a[i] div 2 do
if a[i] mod k=0 then {Daca a[i] este divizor}
s:=s+k; {se adauga la suma}
if s=a[i] then write(a[i],' pe pozitia ',i)
end;
readln;
end.

2.c. Prin funcia sqrt extragem radicalul din fiecare element al
vectorului. Dac rezultatul este un numr ntreg, atunci
elementul a[i] este ptratul numrului sqrt(a[i]).
Pentru a verifica dac numrul sqrt(a[i]) este ntreg, se testeaz
condiia:
sqrt(a[i])= int(sqrt(a[i]))
unde funcia int extrage partea ntreag a unui numr.

program ptrate;
var a:array[1..20] of longint;
i,n:integer;
begin
write('n=');readln(n);
for i:=1 to n do begin
write(a[,i,]=);
readln(a[i]);
end;
writeln(Numerele sunt);
for i:=1 to n do begin
if sqrt(a[i])= int(sqrt(a[i])) then
write(a[i], pe pozitia ,i);
end;
end.





Culegere de probleme Tipul tablou - Vectori
126

3.a. Expresia reprezint o sum de ptrate. Pentru
fiecare element se realizeaz ridicarea la ptrat - a[i]*a[i]
- dup care se adaug la sum.

program expresie_a;
var a:array[1..40] of integer;
n,i:integer;
s:longint;
begin
write('n=');readln(n);
for i:=1 to n do readln(a[i]);
s:=0;
for i:=1 to n do
s:=s+a[i]*a[i];
write('Valoarea expresiei este: ',s);
end.

3.b. Expresia este un produs de sume. Mai nti se
realizeaz nsumarea elementelor celor doi vectori, dup
care se nmulesc cele dou sume. Ordinea pailor
algoritmului este dat de paranteze i de ordinea
efecturii operaiilor.
program expresie_b;
var a,b:array[1..40] of integer;
n,i:integer;
s1,s2,e:longint;
begin
write('n=');readln(n);
for i:=1 to n do begin {Citirea primului vector}
write('a[',i,']=');
readln(a[i]);
end;
for j:=1 to n do begin {Citirea celui de al doilea vector,
de aceeai dimensiune cu primul}
write('b[',j,']=');
readln (b[j]);
end;
s1:=0;s2:=0;
for i:=1 to n do
begin
s1:=s1+a[i]; {Suma elementelor primului vector}
s2:=s2+b[i]; {Suma elementelor vectorului al doilea}
end;
e:=s1*s2;
write('Valoarea expresiei este: ',e);
end.

3.c. Expresia este o sum de produse.
Se observ c suma indicilor unui termen al sumei este n+1,
deci termenul general este a[i]*b[n-i+1].
Produsul a[i]*b[n-i+1] se adaug la variabila s, care va constitui
valoarea expresiei.

program expresie_c;
var a,b:array[1..40] of integer;
n,i:integer;
s:longint;
begin
write('n=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do begin
write('b[',i,']=');
readln (b[i]);
end;
s:=0;
for i:=1 to n do
Culegere de probleme Tipul tablou - Vectori
s:=s+a[i]*b[n-i+1];
write('Valoarea expresiei este: ',s);
end.

3.d. Expresia este o sum de fracii. Pentru ca
mpririle s se poat efectua, se pune condiia ca
elementul b[i] s fie nenul.
Rezultatul mpririi a[i]/b[i] este un numr real, deci
variabila s va fi declarat de tip real.

program expresie_d;
var a,b:array[1..40] of integer;
n,i:integer;
s:real;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do begin
write('b[',i,']=');
readln (b[i]);
end;
s:=0;
for i:=1 to n do
if b[i]<>0 then s:=s+a[i]/b[i];
127
a[n-1]
a[1] a[2]
a[n]
. .
write('Valoarea expresiei este: ',s:8:2);
end.

4. Calculul valorii totale a produselor se realizeaz n
instruciunea for subliniat, prin nsumarea elementelor
vectorului. Diferena este dat de cei cele 20% din
valoarea total s:
s:= 0.2*s;
program Diferena_valoare;
var a:array[1..20] of longint;
n,i:integer;
s:real;
begin
write('Numrul de produse:'); readln(n);
writeln('Dai valoarea de cumprare a produselor ');
for i:=1 to n do begin
write('Preul produsului ',i,': ');
readln(a[i]);
end;
s:=0;
for i:=1 to n do
s:=s+a[i];
s:= 0.2*s;
write('Diferena dintre valoarea total de cumprare si cea de
vnzare este: ',s:7:0);
end.

5.a. Eliminarea primului element se realizeaz prin rescrierea
elementului a[i] cu valoarea elementului succesor, a[i+1], - for
i:=1 to n-1 do a[i]:=a[i+1]; - dup schema:
(1) (2) (n-1) (n)



unde (1) , (2) ... (n-1), (n)
reprezint
ordinea efecturii
operaiilor.
Astfel primul element va fi ters, iar celelalte se deplaseaz cu o
poziie spre stnga; dimensiunea vectorului scade cu o unitate.


Culegere de probleme Tipul tablou - Vectori
128
program elimin_1_vector;
var a:array[1..20] of integer;
i,n:integer;
begin
write('n=');readln(n);
for i:=1 to n do readln(a[i]);
for i:=1 to n-1 do
a[i]:=a[i+1];
n:=n-1;
write('Noul vector este');
for i:=1 to n do
write(a[i],' ');
end.

5.b. Algoritmul combin cutarea elementului x n
vector cu eliminarea acestui element, dac a fost gsit n
vector.
Cutarea elementului x se realizeaz n seciunea
subliniat; dac a fost gsit valoarea lui x n vector, se
reine poziia acestuia k -, iar valoarea gsit ia valoarea
TRUE. n acest caz se realizeaz eliminarea elementului
de pe poziia k, conform algoritmului problemei 8.
program eliminare_x;
var a:array[1..20] of integer;
k,i,n,x:integer;
gasit:boolean;
begin
write('Dimensiunea vectorului:');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
write('Dai elementul care se elimin: ');
readln(x);
{Cutarea elementului x n vector}
gasit:=FALSE;
i:=1;
while not gasit and (i<=n) do
begin
if x=a[i] then begin
gasit:=TRUE; {Elementul a fost gsit}
k:=i; {Se reine poziia elementului din vector }
end;
i:=i+1;
end;
{Eliminarea elementului x, de pe poziia k}
if gasit then begin
for i:=k to n-1 do
a[i]:=a[i+1];
n:=n-1;
writeln('Noul vector este');
for i:=1 to n do
write(a[i],' ');
end
else writeln(Elementul ,x, nu se afl n vector);
end.

6. Problema se bazeaz pe algoritmul eliminrilor succesive.
Vectorul se parcurge cu instruciunea while; dac este gsit un
elev respins condiia a[i]<5 se realizeaz eliminarea elevului de
pe poziia i, o dat cu scderea numrului elementelor din vector
n:=n-1 - , iar poziia n vector pentru care se va realiza testarea
va rmne neschimbat atribuirile i:=i-1 i i:=i+1 se anuleaz.
n caz contrar se va trece la urmtoarea poziie din vector - i:=i+1.
Obs. Problema se poate extinde prin adugarea cerinei ca elevii
promovati s fie afiai n ordinea mediilor. n acest caz vectorul
a nou obinut va trebui ordonat descresctor.

program proba;
var a:array[1..20] of real;
Culegere de probleme Tipul tablou - Vectori

i,j,n:integer;
begin
write('Dai numrul de elevi: ');readln(n);
for i:=1 to n do begin
write('Media elevului ',i,' ');
readln(a[i]);
end;
i:=1;
while i<=n do
begin
if a[i]<5 then
begin
for j:=i to n-1 do {Eliminarea elementului a[i]}
a[j]:=a[j+1];
i:=i-1;
n:=n-1;
end;
i:=i+1; {Trecerea la urmtorul element}
end;
writeln('Mediile elevilor promovai ');
for i:=1 to n do
write(a[i],' ');
129
a[n-1]
end.

7.a. Pentru inserarea unui numr pe prima poziie din
vector se parcurg urmtoarele etape:
- deplasarea tuturor elementelor cu o poziie spre
dreapta, deplasare nceput cu ultimul element,
pentru a nu se terge elementele vectorului;
- atribuirea valorii lui x primului element al vectorului.




Dimensiunea vectorului va crete cu o unitate.
program insert_1_vector;
var a:array[1..20] of integer;
k,i,n,x:integer;
begin
write('Dimensiunea vectorului: ');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
write('Dai elementul care se insereaz: ');
readln(x);
for i:=n downto 1 do {Deplasarea spre dreapta}
a[i+1]:=a[i];
a[1]:=x; {Inserarea numrului x}
n:=n+1;
writeln('Noul vector este');
for i:=1 to n do write(a[i],' ');
end.
7.b. Numrul x se va aduga pe poziia n+1, adic dup ultimul
element al vectorului.

program insert_n+1_vector;
var a:array[1..20] of integer;
k,i,n,x:integer;
begin
write('Dimensiunea vectorului: ');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
write('Dai elementul care se insereaz: ');
readln(x);
a[n+1]:=x; {Inserarea nr. x pe poziia n+1}
n:=n+1;
writeln('Noul vector este');
for i:=1 to n do
write(a[i],' ');
end.
a[1] a[2]
a[n]
. .
(n) (n-1) (3) (2)
Culegere de probleme Tipul tablou - Vectori
130

7.c. Inserarea elementului x pe poziia j se realizeaz
astfel:
- primele elemente ale vectorului, a[1], a[2], , a[j-1],
rmn neschimbate.
- se deplaseaz elementele a[j], a[j+1], , a[n] cu o
poziie spre dreapta;
- se insereaz elementul x pe poziia j.
Instruciunea for i:=n downto j do a[i+1]:=a[i];
deplaseaz elementele a[j]a[n] cu o poziie spre
dreapta. Astfel se elibereaz poziia j pe care se va copia
elementul x.

program insert_j_vector;
var a:array[1..20] of integer;
k,i,n,x:integer;
begin
write('Dimensiunea vectorului: ');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
write('Dai elementul care se insereaz: ');
readln(x);
write('Dai poziia pe care se insereaz elementul: ');
readln(j);
for i:=n downto j do {Deplasarea spre dreapta}
a[i+1]:=a[i];
a[j]:=x; {Inserarea elementului x}
n:=n+1;
writeln('Noul vector este');
for i:=1 to n do
write(a[i],' ');
end.

8. Se calculeaz media aritmetic, ma, dintre dou elemente
consecutive a[i] i a[i+1] pentru 1in i se insereaz pe poziia
i+1. Deci n cadrul vectorului se vor aduga n-1 numere.
Se adapteaz algoritmul anterior pentru inserarea a n-1
numere.
n ciclul while, care parcurge vectorul, se efectueaz
urmtoarele operaii:
- se calculeaz media aritmetic;
- se insereaz media aritmetic pe poziia i+1;
- se trece la urmtorul element al vectorului iniial;
- se mrete dimensiunea vectorului.
Vectorul final va conine 2*n-1 elemente.

program insert_ma_vector;
var a:array[1..20] of real;
i,j,n,m:integer;
ma:real;
begin
write('Dimensiunea vectorului: ');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
i:=1;
m:=2*n-1; {m - numrul de elemente ale noului vector}
while i<m do
begin
ma:=(a[i]+a[i+1])/2; {Calculul mediei aritmetice}
for j:=n downto i do {Deplasarea elementelor}
a[j+1]:=a[j];
a[i+1]:=ma;
i:=i+2; {Trecerea la urmtorul element}
n:=n+1;
end;
writeln('Noul vector este');
for i:=1 to m do
Culegere de probleme Tipul tablou - Vectori

write(a[i]:6:2);
end.

9.a. Se presupune c elementele citite ale vectorilor a i
b sunt distincte, deoarece vectorii memoreaz elementele
unor mulimi.
n vectorul c n care se vor memora elementele
mulimii reuniune se copiaz toate elemente vectorului
a:
for i:=1 to n do
c[i]:=a[i];
n continuare n vectorul c se copiaz elementele
vectorului b care nu se afl n a. Se parcurge vectorul b
- for j:=1 to m do i se compar cu toate elementele
vectorului a :
for i:=1 to n do
if a[i]=b[j] then comun:=TRUE;
Variabila comun are urmtoarele valori:
.

=
altfel - FALSE
multime vectorul la deja adaugate
elementele de diferit este b[j]nu elementul daca - TRUE
comun
Dac se gsete un element a[i] egal cu elementul
b[j] atunci variabila comun ia valoarea TRUE, iar b[j] nu
se mai memoreaz n vectorul c.
Dac nici un element al tabloului a nu este egal cu
elementul b[j], atunci variabila comun rmne la
valoarea FALSE, iar b[j] se adaug n vectorul c.
Variabila k reprezint dimensiunea vectorului reuniune,
c.

program reuniune;
var a,b,c:array[1..40] of integer;
m,n,i,j,k,l:integer;
comun:boolean;
131
begin
write('Nr. de elem ale primei mulimi ');
readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
write('Nr. de elem ale celei de-a doua mulimi');
readln(m);
for j:=1 to m do begin
write('b[',j,']=');
readln (b[j]);
end;
for i:=1 to n do {Adugarea elementelor vectorului a la
vectorul c}
c[i]:=a[i];
k:=n;
for j:=1 to m do {Parcurgerea vectorului b}
begin
comun:=FALSE;
for i:=1 to n do {Parcurgerea vectorului b}
if a[i]=b[j] then comun:=TRUE; {Elementul b[j] se
gsete in mulime}
if not comun then
begin {Dac elementul nu se gseste in mulime}
k:=k+1;
c[k]:=b[j]; {se adaug noului vector}
end;
end;
write('Reuniunea celor dou mulimi este: ');
for i:=1 to k do
write(c[i],' ');
end.

9.b. Se presupune c elementele citite ale vectorilor a i b sunt
distincte.
Culegere de probleme Tipul tablou - Vectori
132
Fiecare element a[i] fixat prin ciclul for i:=1 to n do se
compar cu toate elementele vectorului b. Dac se
gsete un element b[i] egal cu elementul a[i], atunci
elementul a[i] se adaug n vectorul intersecie, c:
if a[i]=b[j] then begin
k:=k+1; c[k]:=a[i];
end;

program intersecie;
var a,b,c:array[1..40] of integer;
m,n,i,j,k,l:integer;
begin
write('Nr. de elem ale primei mulimi ');
readln(n);
write('Nr. de elem ale celei de-a doua
mulimi');
readln(m);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for j:=1 to m do begin
write('b[',j,']=');
readln (b[j]);
end;
k:=0;
for i:=1 to n do {Parcurgerea vectorului a}
for j:=1 to m do {Parcurgerea vectorului b}
if a[i]=b[j] then {Dac se gsesc dou elemente
egale}
begin
k:=k+1;
c[k]:=a[i]; {Se adaug la vectorul intersecie}
end;
write('Intersecia celor dou mulimi
este:');
for i:=1 to k do
write(c[i],' ');
end.

9.c. Variabila boolean comun determin egalitatea dintre dou
elemente ale vectorilor a i b i are valorile:
Comun=TRUE dac avem a[i]=b[j]
=FALSE dac avem a[i]<>b[j]
Fixm elementul a[i] prin ciclul for i:=1 to n do i presupunem
c acest element nu este egal cu nici un element al tabloului b -
comun:=FALSE.
Parcurgem n continuare vectorul b i verificm dac elementul
a[i] este egal cu un element al vectorului b. Dac aceast condiie
este ndeplinit atunci variabila comun ia valoarea TRUE:
for j:=1 to m do
if a[i]=b[j] then comun:=TRUE;
Dac pentru nici un element b[j] nu este ndeplinit, condiia
de egalitate, atunci elementul a[i] se adaug n vectorul diferen.

program diferen
var a,b,c:array[1..40] of integer;
m,n,i,j,k,l:integer;
comun:boolean;
begin
write('Nr. de elem. ale primei mulimi ');
readln(n);
write('Nr. de elem ale celei de-a doua
mulimi');
readln(m);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for j:=1 to m do begin
write('b[',j,']=');
Culegere de probleme Tipul tablou - Vectori
readln(b[j]);
end;
k:=0;
for i:=1 to n do
begin
comun:=FALSE;
for j:=1 to m do
if a[i]=b[j] then comun:=TRUE;
if not comun then {Dac a[i] nu se regsete
printre elementele vectorului b}
begin
k:=k+1;
c[k]:=a[i]; {Se adaug la vectorul diferen}
end;
end;
write('Diferena celor dou mulimi este:');
for i:=1 to k do
write(c[i],' ');
end.

10. Variabila boolean distinct are valorile:
distinct
=

contrar caz in FALSE


distincte sunt vectorului elementele dac TRUE
Presupunem c numerele sunt distincte
distinct:=TRUE.
Prin primul ciclu while parcurgem vectorul.
Elementul a[i] se compar cu elementele care urmeaz
dup el. Dac dou elemente ale vectorului sunt egale -
condiia a[i]=a[j] - atunci variabila distinct ia valoarea
FALSE, caz n care elementele vectorului nu sunt
distincte.
Instruciunile while se execut atta timp ct:
- nu s-a ajuns la sfritul vectorului i<=n sau j<=n;
- nu s-au gsit dou elemente egale distinct=TRUE.

program elemente_distincte;
var i,j,n:integer;
distinct:boolean;
a:array[1..20]of integer;
begin
write('n=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
i:=1;
distinct:=TRUE;
while (i<n) and (distinct=TRUE) do {Parcurgerea vectorului}
begin
j:=i+1;
while (j<=n) and (distinct=TRUE) do {Compararea cu
elementele care urmeaz dup elementul curent, a[i]}
begin
if a[i]=a[j] then {Testm dac dou elemente sunt egale}
distinct:=FALSE;
j:=j+1;
end;
i:=i+1;
end;
if distinct then
writeln('Numerele sunt distincte')
else
writeln('Numerele nu sunt distincte');
end.

11.
const MAX=50;
type vector=array[1..MAX] of real;
var a,b,s : vector;
133
Culegere de probleme Tipul tablou - Vectori
134
n,i : 1..MAX;
begin
write('n = ');readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a[i])
end;
for i:=1 to n do
begin
write('b[',i,']= ');
readln(b[i])
end;
for i:=1 to n do s[i]:=a[i]+b[i];
writeln('Elementele vectorului suma');
for i:=1 to n do write(s[i]:10:2);
readln
end.

12. Programul este asemntor cu problema 5,
adugndu-se iniializarea i condiia pentru
determinarea maximului:
a[i]>max.

program Minim_maxim;
var i,n,max,min:integer;
a:array[1..20] of integer;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
max:=a[1];
min:=a[1];
for i:=2 to n do
begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
writeln('Maximul este:',max);
writeln('Minimul este:',min);
end.


13. Se observ c ntr-un vector valoarea maximului poate apare
pe mai multe poziii.
Ex. Pentru vectorul a: (4,3,4,1) maximul se gsete pe poziiile 1
i 3.
Etapele parcurse sunt urmtoarele:
- se determin maximul din vector, conform algoritmului
anterior;
- se compar valoarea max cu toate elementele vectorului. Se
vor afia toate poziiile i pentru care este ndeplinit condiia:
a[i]=max.

program Maxim_poz;
var i,n:integer;
max:real;
a:array[1..20] of real;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
{Determinarea maximului}
max:=a[1];
for i:=2 to n do
Culegere de probleme Tipul tablou - Vectori
135
if a[i]<max then max:=a[i];
write('Maximul este ',max,' si se gaseste pe pozitiile ');
{Determinarea poziiilor n care apare maximul}
for i:=1 to n do
if a[i]=max then write(i,', ');
end.

14. Se aplic algoritmul de la problema anterioar
elementul maxim este reprezentat de media cea mai
mare.

15.
Vectorul tot conine totalul bucilor vndute pentru
fiecare produs vndut n ultimele 2 luni. Variabila min
va conine numrul minim de buci vndute pentru un
produs. Se va parcurge vectorul tot i se compar
elementele sale cu valoarea variabilei min; poziiile
elementelor vectorului tot egale cu valoarea variabilei
min reprezentnd produsele care se elimin din
nomenclator.

const MAX=100;
type vector=array[1..MAX] of word;
var l1,l2,tot : vector;
n,i : 1..MAX;min : word;
begin
write('n = ');readln(n);
for i:=1 to n do
begin
write('l1[',i,']= ');
readln(l1[i])
end;
for i:=1 to n do
begin
write('l2[',i,']= ');
readln(l2[i])
end;
for i:=1 to n do tot[i]:=l1[i]+l2[i];
min:=tot[1];
for i:=2 to n do
if min>tot[i] then min:=tot[i];
for i:=1 to n do
if min=tot[i] then writeln('Se elimin produsul ',i);
readln
end.



16. Variabila boolean gsit are valorile:
gsit= TRUE vectorul nu este ordonat cresctor
= FALSE vectorul este ordonat cresctor
Se parcurge vectorul i se compar elementele nvecinate. Dac
este ndeplinit condiia a[i]>a[i+1] elementele a[i] i a[i+1] nu se
gsesc n ordinea cerut atunci gsit ia valoarea TRUE, deci
vectorul nu este ordonat cresctor.

program verif_ord_vector;
type vector=array[1..20] of integer;
var a:vector;
n,i:integer;
gasit:boolean;
begin
write('n='); readln(n);
for i:=1 to n do readln(a[i]);
gasit:=FALSE;
for i:=1 to (n-1) do
begin
if a[i]>a[i+1] then
gasit:=TRUE;
end ;
if gsit then writeln('Vectorul nu este ordonat cresctor')
else writeln('Vectorul este ordonat cresctor')
end.
Culegere de probleme Tipul tablou - Vectori
136

17. Se aplic algoritmul de la problema rezolvat 5,
schimbndu-se condiia de interschimbare a elementelor
nvecinate - a[i]>a[i+1] - prin condiia a[i]<a[i+1].

program Ordonare_vector_desc;
type vector=array[1..20] of integer;
var a:vector;
n,i ,t:integer;
gasit:boolean;
begin
write('n='); readln(n);
for i:=1 to n do readln(a[i]);
gasit:=TRUE;
while gasit do
begin
gasit:=FALSE;
for i:=1 to n-1 do
begin
if a[i]<a[i+1] then
begin
gasit:=TRUE;
t:=a[i];
a[i]:=a[i+1];
a[i+1]:=t;
end ;
end ;
end ;
for i:=1 to n do write(a[i],' ');
readln;
end.


18. Vectorul t va conine timpii obinui de sportivi. Se
sorteaz n ordine cresctoare elementele vectorului t,
apoi se afieaz primele 2 elemente ale sale, care reprezint
timpii primilor 2 sportivi calificai.

const MAX=100;
type vector=array[1..MAX] of word;
var t : vector;
n,i : 1..MAX;aux : word;
sortat : boolean;
begin
write('n = ');readln(n);
for i:=1 to n do
begin
write('t[',i,']= ');
readln(t[i])
end;
repeat
sortat:=true;
for i:=1 to n-1 do
if t[i]>t[i+1] then begin
aux:=t[i];
t[i]:=t[i+1];
t[i+1]:=aux;
sortat:=false
end
until sortat=true;
writeln('Timpii obinui de primii 2 sportivi calificai sunt:');
writeln(t[1]);
writeln(t[2]);
readln
end.

19.a. Spre deosebire de majoritatea programelor antrerioare care
aveau ca date de intrare elementele unui vector, grupa de
probleme 19 au ca date de intrare un numr pe baza cruia se
genereaz vectori cu anumite proprieti.
Culegere de probleme Tipul tablou - Vectori
137
n acest caz contorul ciclului for genereaz att
primele 10 numere naturale cu care trebuie nmulit
numrul a pentru a obine multiplii ct i indicii
vectorului, deci poziiile pe care se memoreaz multiplii.

program multipli;
var i,a:integer;
m:array[1..20]of integer;
begin
write('a=');readln(a);
for i:=1 to 10 do
m[i]:=a*i;
write('Prumii 10 multipli ai numrului ',a,' sunt:');
for i:=1 to i do
write(m[i],' ');
end.

19.b. Algoritmul de determinare a divizorilor unui
numr este cunoscut. n primul ciclu for, prin variabila i
se genereaz posibilii divizori ai lui a. Dac i este divizor
este ndeplinit condiia a mod i=0 atunci i se va
memora n vector pe poziia k. Se observ c variabilele i
i k nu coincid ca valoare. Variabila i se incrementeaz
automat prin ciclul for, iar variabila k se incrementeaz
numai dac i este divizor al lui a. Variabila k reine n
final dimensiunea vectorului divizor.

program divizori;
var k,i,a:integer;
divizor:array[1..20]of integer;
begin
write('a=');readln(a);
k:=0;
for i:=1 to a div 2 do {Generarea posibililor divizori}
if a mod i=0 then {Dac contorul i este divizor}
begin
k:=k+1;
divizor[k]:=i; {se adaug vectorului divizor}
end;
k:=k+1;
divizor[k]:=a;
write('Divizorii numrului a sunt:');
for i:=1 to k do
write(divizor[i],' ');
readln;
end.

19.c. Generarea posibililor divizori ai numrului a se realizeaz la
fel ca n programul precedent. n plus, apare secvena de
determinare a numrului prim, studiat n problema 4. Dac i
este divizor al numrului a se verific dac acest numr este
prim prin instruciunile:
prim:=TRUE;
for j:=2 to trunc(sqrt(i)) do
if i mod j=0 then prim:=FALSE;
if prim then {se adaug la vectorul divizori}

program divizori_primi;
var k,i,j,a:integer;
prim:boolean;
divizor:array[1..20]of integer;
begin
write('a=');readln(a);
k:=0;
for i:=2 to a div 2 do
if a mod i=0 then {Determinarea unui divizor}
begin
{Verificm dac divizorul este prim}
prim:=TRUE;
for j:=2 to trunc(sqrt(i)) do
if i mod j=0 then prim:=FALSE;
if prim then
Culegere de probleme Tipul tablou - Vectori
138
begin
k:=k+1;
divizor [k]:=i;
end;
end;
prim:=TRUE;
for j:=2 to trunc(sqrt(a)) do
if a mod j=0 then prim:=FALSE;
if prim then begin
k:=k+1;
divizor [k]:=i;
end;
if k=0 then {n vectorul divizor nu s-a adugat nici un
numr}
writeln('Numrul a nu are divizori ')
else
begin
write('Divizorii primi ai numrului a sunt:');
for i:=1 to k do
write(divizor[i],' ');
end;
end.

19.d. Aceast problem face parte din categoria mai
larg a generrii unui anumit numr de elemente care
au o proprietate dat. Se observ c nu putem spune cu
exactitate ct va fi al n-lea numr.
n acest caz se folosesc dou variabile:
a genereaz posibilele numere prime;
k numr cte numere prime am gsit.
Variabila a genereaz numerele consecutive ncepnd
cu 2. n ciclul while se testeaz dac numrul a este
prim (analog cu problema anterioar) caz n care a se
adaug la vectorul prime, variabila k crescnd cu o
unitate. Variabila a se incrementeaz indiferent dac
valoarea anterioar a fost sau nu numr prim.
Condiia ciclului while este pus n funcie de variabila k,
ieirea din ciclu fcndu-se cnd s-au determinat cele n numere
prime (while k<=n do).

program n_numere_prime;
var k,n:integer;
i,a:longint;
prim:boolean;
prime:array[1..20]of integer;
begin
write('n=');readln(n);
a:=2;k:=1;
while k<=n do {Ciclul while se repet pn cnd gsim cele n
numere}
begin
prim:=TRUE;
for i:=2 to trunc(sqrt(a)) do {Generm posibilii divizori}
if a mod i=0 then {Verificm dac numrul a este prim}
prim:=FALSE;
if prim then {Dac a este prim}
begin
prime[k]:=a; {se adaug n vectorul prime}
write(prime[k],' ');
k:=k+1;
end;
a:=a+1; {Se trece la testarea urmtorului numr}
end;
end.

19.e. Principiul de rezolvare este acelai cu al programului
anterior. Singura diferen apare la condiia cilului while, care
este n funcie de variabila a, ieirea din ciclu fcndu-se cnd s-
a determinat ultimul numr prim mai mic dect a - while a<=n
do ...


Culegere de probleme Tipul tablou - Vectori
139
program numere_prime;
var k,n,i,a:longint;
prim:boolean;
prime:array[1..20] of longint;
begin
write('n=');readln(n);
a:=2;k:=1;
while a<=n do {Ciclul while se repet pn cnd gsim
numerele prime pn la n}
begin
prim:=TRUE;
for i:=2 to trunc(sqrt(a)) do
if a mod i=0 then
prim:=FALSE;
if prim then
begin
prime[k]:=a;
write(prime[k],' ');
k:=k+1;
end;
a:=a+1;
end;
end.

20. Ca date de intrare avem dimensiunea i elementele
vectorului a. Pe baza acestui vector se genereaz cei doi
vectori: b i c:
- vectorul b, cu indicele k1, reine numerele pozitive;
- vectorul c, cu indicele k2, reine numerele
negative.
Parcurgerea vectorului a se face cu instruciunea for
i:=1 to n do, deci indicele i al lui a crete automat.
n cadrul ciclului se testeaz dac elementul curent
a[i] este pozitiv, caz n care indicele k1 crete cu o
unitate, iar a[i] se adaug la vectorul b pe poziia k1.
Dac a[i] este negativ, se adaug n vectorul c pe poziia k2.
n final dimensiunea vectorului b este k1, iar a vectorului c,
k2.

program nr_pozitive_negative;
var i,k1,k2,n:integer;
a,b,c:array[1..20]of integer;
begin
write('n=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do
begin
if a[i]>0 then begin {Numrul a[i] este pozitiv}
k1:=k1+1;
b[k1]:=a[i]; {i se adaug n vectorul b}
end
else if a[i]<0 then begin {Numrul a[i] este negativ}
k2:=k2+1;
c[k2]:=a[i]; {i se adaug n vectorul c}
end;
end;
writeln('Numerele pozitive sunt:');
for i:=1 to k1 do write(b[i],' ');
writeln;
writeln('Numerele negative sunt:');
for i:=1 to k2 do write(ci],' ');
end.





Culegere de probleme Tipul tablou - Vectori
140
21. Vectorul a conine mediile celor n elevi.
Variabila nr_p reine numrul elevilor promovai, iar
nr_c al celor corigeni.
Cele dou valori se vor incrementa n funcie de
valoarea de adevr a condiiei a[i]>=5 .

program nr_promovai;
var i,nr_p,nr_c,n:integer;
a:array[1..30] of real;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
nr_p:=0;
nr_c:=0;
for i:=1 to n do
if a[i]>=5 then
nr_p:=nr_p+1
else
nr_c:=nr_c+1;
writeln('Numarul elevilor promovai este:',nr_p);
writeln('Numrul elevilor corigeni este:',nr_c);
end.

22.a. Programul se bazeaz pe algoritmul problemei
rezolvate nr. 8. n ciclul repeat se detemin pe rnd
cifrele numrului i se adaug la variabila sum, s.

program sum_cifre_numr;
var cifre:array[1..20] of byte;

i,k,c,n,r:integer;
begin
write('Dai numrul'); readln(n);
k:=0;
repeat
r:=n mod 10; {Determinarea ultimei cifre}
k:=k+1; cifre[k]:=r; {Adugarea ultimei cifre n vector}
c:=n div 10; {c - numrul obinut prin eliminarea
ultimei cifre}
n:=c;
until c=0;
{Suma elementelor vectorului}
for i:=1 to k do
s:=s+cifre[i];
writeln(' Suma cifrelor numrului este:',s);
end.

22.b. Determinarea cifrei maxime din numr se poate mpri n
dou subprobleme:
- determinarea cifrelor unui numr;
- afiarea maximului dintr-un ir de numere.
Se memoreaz cifrele n vectorul cifre, de dimensiune k i se
dermin maximul elementelor vectorului.

program cifre_numr;
var cifre:array[1..20] of byte;
i,k,c,n,r:integer;
begin
write('Dai numrul');
readln(n);
k:=0;

{Determinarea cifrelor}
repeat
r:=n mod 10;
k:=k+1; cifre[k]:=r;
c:=n div 10;
Culegere de probleme Tipul tablou - Vectori
141
n:=c;
until c=0;
{Determinarea maximului}
max:=a[1];
for i:=2 to k do
if cifre[i]>max then max:=a[i];
writeln(Cifra maxim este ,max);
end.


23. Rezolvarea acestei probleme urmrete determinarea
c.m.m.d.c. dintre mai multe numere, numere memorate
n elementele vectorului a. n variabila d1 se determin
c.m.m.d.c. al primelor dou elemente ale vectorului. n
continuare se determin c.m.m.d.c. dintre numrul d1
i al treilea element al vectorului. Procedeul se repet
pn cnd se parcurge tor vectorul. n acest moment n
variabila d1 se obine c.m.m.d.c. al elementelor
vectorului.

program cmmdc_vector;
var i,d1,d2,r,n:integer;
a:array[1..20]of integer;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
d1:=a[1];
for i:=2 to n do
begin
d2:=a[i];
{Determinarea c.m.d.c. dintre variabila d1 si elementul curent}
repeat
r:=d1 mod d2;
d1:=d2;
d2:=r;
until r=0;
end;
writeln('CMMDC este ',d1);
end.

24. Elementele vectorilor a i b trebuie date de la tastatur n
ordine cresctoare.
Indicii vectorilor sunt urmtorii:
i pentru vectorul a;
j pentru vectorul b;
k pentru vectorul c;
Prin ciclul while se parcurg ambii vectori.
Dac un element al vectorului a este mai mic dect un element
al vectorului b, elementul primului vector se adaug n vectorul c
i se mresc indicii vectorilor a i c.
Altfel se adaug n vectorul c elementul corespunztor al
vectorului b i se mresc indicii vectorilor b i c.
n cazul n care s-a ajuns la sfritul unui vector i din cellalt
vector au rmas elemente neparcurse, atunci acestea se vor
aduga vectorului c. Acesta va avea n final n+m elemente care se
afieaz prin ultima instruciune for.

program intercl;
var a, b, c:array[1..50] of integer;
m,n,i,j,k,l:integer;
begin
write('n='); readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
Culegere de probleme Tipul tablou - Vectori
142
write('m='); readln(m);
for j:=1 to m do begin
write('b[',j,']=');
readln (b[j]);
end;
i:=1; j:=1; k:=0; {Iniializarea contorilor}
while(i<=n) and (j<=m) do {Parcurgem vectorii a i b
pn
se ajunge la sfaritul unuia dintre ei}
begin
k:=k+1;
if a[i]<b[j] then begin
c[k]:=a[i]; {Dac elementul a[i] este mai mic,
acesta este adugat vectorului c}
i:=i+1; {Deplasare la urmtorul element din
vectorul a}
end
else begin
c[k]:=b[j]; {Dac elementul b[j] este mai
mic, acesta este adugat vectorului c}
j:=j+1; {Deplasare la urmatorul element din
vectorul b}
end;
end;
{Adugarea elementelor rmase dintr-un vector}
if i<=n then {Dac au mai rmas elemente n vectorul
a }
for l:=i to n do {acestea se adaug n vectorul c}
begin
k:=k+1;

c[k]:=a[l];
end
else {Dac au mai rmas elemente n vectorul b }
for l:=j to m do {acestea se adaug n vectorul c}
begin
k:=k+1;
c[k]:=b[l];
end;
{Afiarea vectorului c}
for i:=1 to k do
write('c[',i,']=',c[i]);
end.

25. Presupunem c sunt n cereri. Suma total aprobat pentru
aceste cereri se citete n variabila s. Elementele vectorului a
memoreaz valoarea fiecrei cereri depuse.
n ciclul while se determin numrul de cereri aprobate astfel:
dac se aprob cererea cu numrul de ordine i, se scade din
valoarea total s valoarea acelei cererei, a[i].
Ciclul while se repet atta timp ct:
(k<n) nu s-au selectat toate cererile k reine numrul de
ordine al cererii aprobate.
(s>0) se mai pot aproba cereri pentru c suma total nu s-a
epuizat.
La sfrit se afieaz numrul total de cereri aprobate - k-1 - i
valoarea acestora.

program cereri;
type vector=array[1..30] of longint;
var
a:vector;
i,k,n,s:integer;
begin
writeln('Dai suma total');
readln(s);
writeln('Dai numrul de cereri');
readln(n);
writeln('Dai valoarea fiecrui mprumut');
for i:=1 to n do
begin
Culegere de probleme Tipul tablou - Vectori
143
Write('Suma ',i,' ');
Readln(a[i]);
end;
k:=1;
While (k<=n) and (s>0) do
begin
s:=s-a[k];
k:=k+1
end;
Writeln('S-au aprobat ',k-1,' cereri: ');
for i:=1 to k-1 do
writeln(' Cererea ',i,' de valoare ',a[i]);
end.

Culegere de probleme Tipul tablou - Matrici

3.2. Tablouri bidimensionale - matrici.
Problema 1. Se citete de la tastatur o matrice cu n linii i m coloane. S se determine elementele pare i poziiile acestora n matrice.
Rezolvarea problemei:
Date de intrare: n - numrul de linii; m - numrul de coloane; a[i,j], 1 i n, 1 j m - elementele matricei
Date de ieire: a[i,j] - elementele pare ale matricei, i - linia, j - coloana pe care se afl elementul.
Funcia programului: Iniial se vor citi dimensiunile matricei, n i m.
Matricea se citete element cu element, cu ajutorul a dou cicluri for mbricate. Contorul i al primului for va reprezinta linia matricei,
iar j, coloana acesteia.
Parcurgerea matricei se realizeaz cu cele dou instruciuni for mbricate, etap n care verificm dac elementului actual, a[i,j] este
par (a[i,j] mod 2=0).
Dac este ndeplinit condiia, se afieaz elementul i poziia acestuia n matrice (liniile i,j).

Forma general a unei matrice cu n linii i m
coloane este:
A=

n,m n,j n, n,
i,m i,j i, i,
,m ,j , ,
,m
,j , ,
a ..... .....a a a
...... ....... .......... ...... ......
a .. a . ... a a
.. ........ . ...... ......
a ...... .a .... a a
a ...... ...a .. a a
2 1
2 1
2 2 1 2 1 2
1
1 2 1 1 1
.... . .
.... ........
.
.

Primul indice i reprezint linia, iar indicele
j, coloana matricei.
ncadrarea intre limite a indicilor i i j - 1 i
n, 1 j m - se transpune n limbajele de
programare prin dou cicluri for mbricate:
for i:=1 to n do
for j:=1 to m do
Prin primul ciclu for se fixeaz linia i, iar prin
al doilea ciclu, dup j, se parcurge linia i.
n=2 (2 linii), m=3 (3 coloane)
A=

9 7 4
1 6 5
Citirea primei linii - i=1:
a[1,1]=5, a[1,2]=6, a[1,3]=2
Citirea liniei a doua - i=2:
a[2,1]=4, a[2,2]=7, a[2,3]=9
Parcurgerea matricei
Pe prima linie se afieaz
Elementul 6 cu indicii 1 i 2
Pe a doua linie se afieaz
Elementul 4 cu indicii 2 i 1
Algoritmul n pseudocod:
Pare nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete (a[i,j]);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
dac a[i,j] mod 2=0 atunci
Scrie(a[i,j], i, j);
Sfrit.

Programul Pascal:

var a : array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write('Dai nr. de linii ');readln(n);
write('Dai nr. de coloane ');readln(m);
writeln('Introducei elementele
matricei');
for i:=1 to n do {Citirea elementelor
matricei}
for j:=1 to m do begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
for j:=1 to m do
if a[i,j] mod 2=0 then
writeln('Elem ',a[i,j], linia ,i,
coloana ,j);
end.
144
Culegere de probleme Tipul tablou - Matrici

Problema 2. Se d o matrice cu n linii i m coloane. S se afieze elementele aflate pe ultima coloan.

Rezolvarea problemei:
Date de intrare: n - numrul de linii; m -
numrul de coloane; a[i,j], 1 i n, 1 j m -
elementele matricei.
Date de ieire: a[i,m], 1in - elementele de
pe ultima coloan.
Funcia programului: Elementele de pe
ultima coloan pot fi asociate unui vector
de dimensiune n. Indicii acestor elemente
se genereaz astfel:
indicele al doilea, al coloanei, rmne
fixat la valoarea m;
primul indice, al al liniei, este dat de
contorul unui ciclu for de forma
for i:=1 to n do
write(a[i,m])
n=2, m=3, a=

9
2
7 4
6 5
se afieaz elementele
2
9

Algoritmul n pseudocod:
Coloana nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete(a[i,j]));
Pentru i:=1 la n execut
Scrie(a[i,m])
Sfrit.










Programul Pascal:

program coloana;
var a:array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write('Dati nr. de linii ');readln(n);
write('Dati nr. de coloane ');readln(m);
for i:=1 to n do
for j:=1 to m do begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln(Elementele de pe ultima coloan
sunt:);
for i:=1 to n do
writeln(a[i,m]);
end.

Problema 3. Se d o matrice cu n linii i m coloane. S se determine media aritmetic a elementelor de pe o linie dat k.

Rezolvarea problemei:
Date de intrare: n - numrul de linii; m - numrul de coloane; a[i,j], 1 i n, 1 j m - elementele matricei; k- numrul de ordine al liniei
matricei.
Date de ieire: ma - media aritmetic a elementelor de pe linia k.
Funcia programului: Elementele de pe linia k au forma a[k,j], 1jm, unde indicele liniei, k, este fixat . Se nsumeaz elementele n ciclul
for dup j, dup care se mparte suma la m - numrul de elemente de pe linia matricei.
Obs. Linia unei matrice poate fi asociat unui vector: n matrice se fixeaz indicele liniei i se se parcurg elementele de pe acea linie cu
un ciclu for al crui contor genereaz indicele j al coloanei:
For j:=1 to m do
Prelucreaz a[k,j]
145
Culegere de probleme Tipul tablou - Matrici

Algoritmul n pseudocod:
Medie_linie nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete(a[i,j]);
Citete(k);
m_a:=0;
Pentru j:=1 la m execut
m_a:=m_a+a[k,j];
m_a:=m_a/m;
Scrie(m_a)
Sfrit.
Programul Pascal:
program medie_linie;
var a:array[1..20,1..20] of integer;
n,m,k,i,j:integer;
m_a:real; {m_a se obine prin
mprire real}
begin
write('Dai nr. de linii ');readln(n);
write('Dai nr. de coloane ');readln(m);
for i:=1 to n do
for j:=1 to m do begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
write('Dai nr. de liniei ');readln(k);
m_a:=0;
for j:=1 to m do m_a:=m_a+a[k,j];
m_a:=m_a/m;
Writeln('Media aritmetic a elem. de pe
linia ',k,' este ',m_a:7:2);
end.




Problema 4. Se d o matrice cu n linii i m coloane cu elemente reale. S se detemine maximul elementelor din matrice.

Rezolvarea problemei:
Date de intrare: n - numrul de linii; m -
numrul de coloane; a[i,j], 1 i n, 1 j m -
elementele matricei.
Date de ieire: max - maximul elementelor
matricei.
Funcia programului: Variabila max se
iniializeaz cu valoarea primului element al
matricei, a[1,1]. Cu cele dou cicluri for
mbricate se parcurge matricea; dac se
gsete un element a[i,j] mai mare dect max,
acesta i schimb valoarea: max:= a[i,j].
n=3, m=2, a=

8 9
6 8
7 6
Iniializare max=a[1,1]=6
Elementul max i schimb valoarea de 3 ori:
max:=a[1,2]=7
max:=a[2,1]=8
max:=a[3,1]=9 care este maximul
elementelor din matrice.
Algoritmul n pseudocod:
Maxim_matrice nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete(a[i,j]);
max:=a[1,1];
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Dac max<a[i,j] atunci max:= a[i,j];
Scrie(max)
Sfrit.



Programul Pascal:
program maxim_matrice;
var a:array[1..20,1..20] of real;
max:real; n,m,i,j:integer;
begin
write('n=');readln(n);
write('m=');readln(m);
for i:=1 to n do
for j:=1 to m do readln(a[i,j]);
max:=a[1,1];
for i:=1 to n do
for j:=1 to m do
if max<a[i,j] then max:=a[i,j];
write('Elementul maxim este:' ,
max:5:2);
end.
146
Culegere de probleme Tipul tablou - Matrici


Problema 5 . Se dau n numere naturale. S se genereze o matrice care conine pe fiecare linie primii 5 multipli ai numerelor.

Rezolvarea problemei:
Date de intrare: n - numrul de numere
naturale.
Date de ieire: a[i,j], 1 i n, 1 j 5 -
elementele matricei.
Funcia programului: Pentru dou numere
date (de exemplu 2 i 3), matricea va
arta astfel:
2 4 6 8 10
3 6 9 12 15


Numerele citite sunt memorate n
elementele primei coloane, elemente de
forma a[i,1], 1in.
n continuare se parcurge matricea
pentru a calcula multipli. Se fixeaz
numrul de pe poziia i printr-un ciclu for
al crui contor este i. Se parcurge linia i
printr-un ciclu for de contor j. Pentru a
obine cel de-al j-lea multiplu, se
nmulete numrul iniial a[i,1] cu j.
Obs. Afiarea elementelor unei matrici
se realizeaz parcurgnd matricea prin
cele dou cicluri for i afind elementul
curent, a[i,j].
Pentru a marca spaiile dintre elementele
unei linii se folosete afiarea cu format,
iar pentru a trece la o linie nou,
instruciunea writeln:
for i:=1 to n do begin
for j:=1 to 5 do write(a[i,j]:5);
writeln;
end ;

Algoritmul n pseudocod:

Multiplii nseamn:
nceput
Citete(n);
Pentru i:=1 la n execut
Citete(a[i,1]);
Pentru i:=1 la n execut
Pentru j:=2 la 5 execut
a[i,j]:=j*a[i,1];
Pentru i:=1 la n execut
Pentru j:=2 la 5 execut
Scrie(a[i,j])
Sfrit.


Programul Pascal:

program multiplii_matr;
var a:array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write('Dai nr. de numere ');readln(n);
for i:=1 to n do begin
write('Numrul ',i,');
readln(a[i,1]);
end;
for i:=1 to n do
for j:=2 to 5 do
a[i,j]:=j*a[i,1];
for i:=1 to n do begin
for j:=1 to 5 do
write(a[i,j]:5);
writeln;
end ;
end.


Problema 6 . Pentru o matrice ptratic dat, s se afieze elementele de pe diagonala principal i elementele de pe diagonala secundar.

Rezolvarea problemei:
Date de intrare: n - numrul de linii i coloane; a[i,j], 1 i,j n, - elementele matricei.
Date de ieire: a
i,i
,1in - elementele de pe diagonala principal; a
i,n+1-i
,1in - elementele de pe diagonala secundar.
Funcia programului: Elementele de pe diagonala principal au proprietatea c indicele de linie este egal cu cel de coloan - i=j.
Indicii elementelor de pe diagonala secundar respect condiia: i+j=n+1 j=n+1-i. Deci aceste elemente sunt de forma a
i,n+1-i
,1in.

147
Culegere de probleme Tipul tablou - Matrici


Din matricea ptratic de dimensiune n
dat mai jos:
- elementele de pe diagonala principal
a
1,1
, a
2,2
. . . a
nn
- elementele de pe diagonala secundar
a
1,n
, a
2,n-1
. . . a
n1

A=
a a
a a
1,1 1,n
2,2 2,n 1
a ................................ a
a ................................ a
............ ................................ ....... .....
........
1,2
1,n 1
2,1 2,n

.... ................................ ....... .....


a a ......... ...... ..... ....... .....
............ ................................ ....... .....
a
i,1 i,2
a a
a
i,n i 1 i,i
n,1
+
n,2 n,n 1
................................ a

a
n,n
Ex: n=3, A=

11 10 12
5 9 7
6 3 4
Elementele de pe diagonala principal:
4 9 11
Elementele de pe diagonala secundar:
6 9 12


Algoritmul n pseudocod:
Diagonale nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la n execut
Citete(a[i,j]);
Pentru i:=1 la n execut
Scrie(a[i,i]);
Pentru i:=1 la n execut
Scrie(a[i,n-i+1]);
Sfrit.






Programul Pascal:

program diagonale;
var a:array[1..20,1..20] of integer;
n,i,j:integer;
begin
write('Dai dimensiunea matricei ');
readln(n);
for i:=1 to n do
for j:=1 to n do readln(a[i,j]);
writeln('Elementele de pe diagonala
principal::');
for i:=1 to n do write(a[i,i],' ');
writeln;
writeln('Elementele de pe diagonala
secundar:');
for i:=1 to n do write(a[i,n-i+1],' ');
end.


Problema 7 . Se dau dou matrci cu dimensiuni egale, n,m. S se afieze suma celor dou matrici.

Rezolvarea problemei:
Date de intrare: n - numrul de linii; m - numrul de coloane; a[i,j], b[i,j], 1 i n, 1 j m - elementele celor dou matrici.
Date de ieire: c[i,j], 1 i n, 1 j m - elementele matricei sum.
Funcia programului: Dimensiunile celor dou matrice citite trebuie s fie egale.
nsumarea matricilor presupune adunarea elementelor aflate pe aceleai poziii n cele dou matrice:
c[i,j]:=a[i,j]+b[i,j] pentru 1 i n, 1 j m.
Deoarece la afiare indicii i, j vor fi generai de variabilele contor ele celor dou cicluri for mbricate, afiarea se realizeaz n secvena
de calcul.

148
Culegere de probleme Tipul tablou - Matrici



Pentru dou matrice a i b de dimensiuni
n i m matricea sum s se obine nsumnd
elementele cu aceai indici din cele dou
matrice:
C
n,m
=

+ + + +
+ + +
+ + +
+ +
n,m n,m n,j n,j n, n, n, n,
i,m i,m i,j i,j i, i, i, i,
,m ,m ,j ,j , , , ,
,m ,m ,j ,j , , , ,
b a ..... b .....a b a b a
... .......... ... .......... .......... .... .......... .... ..........
b a ... +b a . ... b a b a
..... .. .... .......... . .... .......... .... ..........
b a ...... +b .a .... b a b a
b a ....... +b ...a .. +b a b a
2 2 1 1
2 2 1 1
2 2 2 2 1 2 1 2 1 2 1 2
1 1 1 1 1 1 2 1 1 1 1 1
.... . .
........ ........
.
.


n=2, m=3,
a= ,

9 7 4
2 6 5
b=

6 2 7
5 0 3
Matricea sum este
c=

15 9 11
7 6 8

Algoritmul n pseudocod:
Suma nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete(a[i,j]);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete(b[i,j]);
Pentru i:=1 la n execut
Pentru j:=1 la m execut nceput
c[i,j]:= a[i,j]+b[i,j];
Scrie(c[i,j])
Sfrit
Sfrit.

Programul Pascal:

program suma_matrice;
var
a,b,c:array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write('Dati nr. de linii ');readln(n);
write('Dati nr. de coloane ');readln(m);
writeln('Introduceti elementele primei
matrice');
for i:=1 to n do
for j:=1 to m do begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln('Introduceti elementele matricei
a doua');
for i:=1 to n do
for j:=1 to m do begin
write('b[',i,',',j,']=');
readln(b[i,j]);
end;
writeln('Matricea suma este:');
for i:=1 to n do begin
for j:=1 to m do begin
c[i,j]:=a[i,j]+b[i,j];
write(c[i,j]:5);
end;
writeln;
end ;
end.

Problema 8. Mediile obinute de elevii unei clase sunt memorate ntr-o matrice astfel:pe linia i, toate cele m medii ale elevului
cu numrul de ordine i;
pe coloana j, mediile la un anumit obiect a tuturor celor n elevi la toat clasa.
S se determine:
a) mediile generale ale elevilor, c) elevii corigeni;
b) elevul (sau elevii) cu cea mai mare medie general; d) media general a clasei.

149
Culegere de probleme Tipul tablou - Matrici



Rezolvarea problemei:
Date de intrare: n - numrul de elevi; m -
numrul de materii; a[i,j], 1 i n, 1 j
m mediile celor n elevi la materiile
date.
Date de ieire:
a) m_e[n] vector cu n componente
care reine mediile generale ale
fiecrui elev;
b) i - numrul de ordine al elevului
(elevilor) cu media maxim;
c) i - numrul de ordine al elevilor
corigeni;
d) m_g - media general a clasei.
Funcia programului: Programul este o
combinare a problemelor studiate
anterior.
Prezentm ca exemplu matricea asociat
pentru trei elevi i mediile acestora la
dou materii.
materia 1 materia 2
150

9 8 1

a) Numrul de elemente ale vectorului
m_e este egal cu n - numrul liniilor
matricei a.
- Ciclul for dup i fixeaz linia
matricei, contorul i fiind i indice
pentru vectorul m_e.
- Iniializarea elementului m_e[i] se
face la nceputul fiecrei linii,
- calculul mediei se face prin
nsumarea elementelor de pe linia
i: m_e[i]:=m_e[i]+a[i,j]. iar dup
parcurgerea liniei se mparte m_e[i]
la numrul de coloane ale matricei,
m.
Pentru exemplul considerat se
calculeaz m_e[1]:=8.5, m_e[2]:=6.5,
m_e[3]:=8.5.
b) Pentru determinarea elevilor cu media
maxim se parcurg dou etape:
Determinarea maximului
elementelor din vectorul mediilor,
m_e;
Afiarea poziiilor elevilor care au
media maxim prin parcurgerea
vectorului i compararea elementului
curent, m_e[i], cu elementul maxim,
max.
Se afieaz elevii cu numrul de
ordine 1 i 3, care au media 8.5.
c) Pentru un elev cu numrul de ordine
i se parcurge linia corespunztoare i
se determin dac are medii sub 5 -
a[i,j]<5 - caz n care variabila boolean
corigent ia valoarea true.
Se afieaz elevul cu numrul
de ordine 2.
d) Variabila m_g se determin prin
nsumarea tuturor elementelor
matricei, prin formula:
m_g:=m_g+a[i,j]. Dup parcurgerea
matricei se mparte variabila m_g la
numrul de elemente ale matricei,
n*m: m_g:=m_g/(n*m).
n cazul nostru media general este
7.5.


10 7 3 elev
7 4 2 elev
elev




Algoritmul n pseudocod:
Medii nseamn:
nceput
Citete(n,m);
Pentru i:=1 la n execut
Pentru j:=1 la m execut
Citete(a[i,j]);
Pentru i:=1 la n execut nceput

m_e[i]:=0;
Pentru j:=1 la m execut
m_e[i]:=m_e[i]+a[i,j];
m_e[i]:= m_e[i]/m;
sfrit;
Pentru i:=1 la n execut
Scrie(m_e[i]);
max:=m_e[1];
Pentru i:=2 la n execut
Dac m_e[i]>max atunci
max:=m_e[i];
Pentru i:=1 la n execut
Dac m_e[i]=max atunci
Scrie(i);
Pentru i:=1 la n execut nceput
corigent:=FALSE;
Pentru j:=1 la m execut
Dac a[i,j]<5 atunci
corigent:=TRUE;
Culegere de probleme Tipul tablou

151
Dac corigent=TRUE atunci
Scrie(i);
Sfrit;
m_g:=0;
Pentru i:=1 la n execut
Pentru j:=1 la m execut
m_g:= m_g+a[i,j];
m_g:=m_g/(n*m);
Scrie(m_g)
Sfrit.

Programul Pascal:

program medii_clasa;
var a:array[1..30,1..30] of real;
m_e:array[1..30] of real;
n,m,i,j:integer;
max,m_g:real;
corigent:boolean;
begin
write('Dai nr. de elevi ');
readln(n);
write('Dai nr. de materii ');
readln(m);
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
{Calculul mediilor pe fiecare linie (pentru
fiecare elev n parte)}
for i:=1 to n do begin {Alegerea elevului i}
m_e[i]:=0; {Iniializarea mediei pentru
fiecare elev}
for j:=1 to m do {Calculul mediilor
elevului i}
m_e[i]:=m_e[i]+a[i,j];
m_e[i]:=m_e[i]/m;
writeln('Elevul cu numrul de ordine ',i,'
are media ',m_e[i]:4:2);
end;

{Determinarea elevilor cu media cea
mai mare}
max:=m_e[1];
for i:=2 to n do {Determinarea
mediei maxime}
if max<m_e[i] then max:=m_e[i];
writeln('Elevii cu media cea mai mare, '
,max:4:2, ' au numarul de ordine ');
for i:=1 to n do {Determinarea cu
media maxima}
if max=m_e[i] then write(i,' ');
{Determinarea elevilor corigenti}
writeln('Elevii corigeni au
numrul de ordine ');
for i:=1 to n do
begin
corigent:=FALSE;
for j:=1 to m do {Se verific mediile
pentru fiecare elev }
if a[i,j]<5 then corigent:=TRUE;
if corigent then write(i,' ');
end;
writeln;
{Determinarea mediei generale}
m_g:=0; {Iniializarea mediei
generale}
{Parcurgerea matricei}
for i:=1 to n do
for j:=1 to m do
m_g:=m_g+a[i,j];
m_g:=m_g/(n*m);
writeln('Media general a clasei este ',
m_g:4:2);
end.









3.2.1. TESTE
TEST 1
Culegere de probleme Tipul tablou

152

T1.1. Indicai care din urmtoarele declaraii de matrice sunt
corecte:

a) a:array[1..20] of real;
b) b:array[10,10] of integer;
c) c:array[0..10,1..20] of byte;
d) d:array[a..g,1..8] of char;

T1.2. Elementele aflate pe prima linie a unei matrice cu m
coloane sunt afiate de instruciunea:
a) for j:=1 to m do write(a[1,j], );
b) for j:=1 to m do writeln(a[i,j]);
c) for i:=1 to m do write(a[i,1]);

T1.3. Urmtoarea secven de program:

for i:=1 to n do
for j:=1 to m do
if a[i,j] <> 0 then
writeln('Elementul ',a[i,j]);


afieaz
a) Elementele diferite de 0 din matrice;
b) Poziiile elementelor nenule din matrice;
c) Elementele impare din matrice.

T1.4. Se consider urmtorul program:

program matrice;
const n=3;
var a:array[1..20,1..20] of integer;
i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
if i=j then a[i,j]:=1
else a[i,j]:=0;
for i:=1 to n do begin
for j:=1 to n do
write(a[i,j], );
writeln;
end.

Ce valori va afia programul?

T1.5. S se calculeze maximul i minimul elementelor din
ultima coloan a unei matrice cu elemente ntregi.





TEST 2

T2.1. Indicai cte elemente au tablourile urmtoare:
Culegere de probleme Tipul tablou

153
a) array[1..5,1..10] of byte;
b) array[-2..2,0..5] of byte;
c) c:array[a..g,1..8] of word;

T2.2. Indicai care secvene realizeaz citirea i care
realizeaz afiarea elementelor dintr-o matrice:

a) for i:=1 to n do begin
for j:=1 to m do
write(a[i,j], );
writeln;
end;

b) for i:=1 to n do
for j:=1 to m do
write('a[',i,',',j,']=');
readln(a[i,j]);

c) for i:=1 to n do
for j:=1 to m do begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;


T2.3. Maximul elementelor dintr-o matrice cu n linii i m
coloane este deteminat de urmtoarea secven de program:


a) max:=a[1,1];
for i:=1 to n do
for j:=1 to m do
if max>=a[i,j] then max:=a[i,j];
b)max:=a[1,1];
for i:=1 to n do
for j:=1 to n do
if max>a[i,j] then max:=a[i,j];
c)max:=a[1,1];
for i:=1 to n do
for j:=1 to m do
if max<a[i,j] then max:=a[i,j];


T2.4. Determinai funcia urmtorului program

program matrice;
var a:array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write(n= ');readln(n);
write(m= ');readln(m);
for i:=1 to n do
for j:=1 to m do
readln(a[i,j]);
for i:=1 to n do write(a[i,m],' ');
end.

T2.5. S se afieze elementele nenule aflate pe diagonala
principal a unei matrice ptratice.
Culegere de probleme Tipul tablou

154
TEST 3

T3.1. Indicai erorile ce apar n urmtoarele secvene de
program:

a) i,j,n,m:integer;
a:array[1..n,1..m] of real;
b) var b[1..5,1..10]:integer;
c) var i,n:integer;
c:array[1..10,1..10] of integer;
begin
readln(n);
for i:=1 to n do
c[i]:=n/2;
end.

T3.2. Urmtoarea secven de program:

s:=0;
for i:=1 to n do
for j:=1 to m do begin
s:=s+a[i,j];
writeln('Suma elem. este ',s);

determin:
a) Suma elementelor aflate pe linia i;
b) Suma elementelor aflate pe coloana j;
c) Suma elementelor din matrice;

T3.3. Ce determin executarea urmtorului program?
program diagonale;
var a:array[1..20,1..20] of integer;
n,i,j:integer;
begin
write('Dai dimensiunea matricei ');readln(n);
for i:=1 to n do
for j:=1 to n do readln(a[i,j]);
nr:=0
for i:=1 to n do
if a[i,n-i+1] div 2 =0 then nr:=nr+1;
writeln(nr);
end.

T3.4. S se corecteze greelile aprute n urmtorul program,
astfel nct acesta s calculeze suma elementelor de pe ultima
coloan a unei matrice ptratice de dimensiune n.

program suma_coloana;
var a:array[1..20,1..20] of integer;
n,i,j:integer;
begin
write('n=');readln(n);
for i:=1 to n do
for j:=1 to m do
write('a[',i,',',j,']=');
readln(a[i,j]);
for j:=1 to n do
s:=s+a[n,j]
writeln(Suma elementelor de pe ultima coloan este:,s);
end.

T3.5. S se afieze elementele care sunt multipli de 3, aflate pe
coloane pare, dintr-o matrice cu n linii i m coloane.



Culegere de probleme Tipul tablou Matrici

3.2.2. PROBLEME PROPUSE
















1. Se citete o matrice cu n linii i m coloane. S se afieze elementele
pozitive aflate pe:
ce cu elemente reale, astfel nct n
c toare.

n fiind identificat printr-un numr
e i i j se intersecteaz;
ar
se determine strada (sau strzile) cu numr maxim de intersecii.
a) coloan dat de la tastatur;
b) ultima linie.
2. S se determine media aritmetic a elementelor unei matrice cu
elemente reale.
3. Fiind dat o matrice i un numr ntreg s se determine dac acel
numr se regsete n elementele matricei. in caz afirmativ s se afieze
poziiile n care apare.
4. Fiind dat o matrice, s se adauge dup ultima linie un vector care
conine suma elementelor de pe fiecare coloan.
5. Se citesc o matrice, un vector i un numr care reprezint numrul
unei coloane ale matricei. S se insereze vectorul n matrice pe locul
ocupat de coloana k.
6. S se determine minimul de pe fiecare coloan a unei matrice
date.7. Fiind dat o matrice, s se afieze numrul de ordine al fiecarei
linii pentru care produsul elementelor acesteia este nenul.
8. Fiind dat o matrice s se determine linia (liniile) cu cele mai multe
elemente pare.
9. Fiind dat o matrice s se determine linia (liniile) cu cele mai multe
elemente care sunt multipli de 5.
10. Interschimbai coloanele unei
olo a
matri
c
e:
a) deasupra diagonalei principale;
an k elementele s fie n ordine cres
11. S se afieze elementele aflat
b) sub diagonala principal;
c) deasupra diagonalei secunadare;
d) sub diagonala secundar.
12. S se genereze o matrice patratica, cu n linii si n coloane, care conine pe
diagonala principal cifra 1, iar n rest 0.
13. Se consider mrul
de ea se
construiete astfel:
a[i,j]:=1 dac elevul cu numrul de ordine i a primit manualul cu numrul j;
a[i,j]:=0 n caz contrar .
S se adauge matricei un vector de n elemente care conine numrul de
manuale date la fiecare materi ,
o matrice cu m linii i m coloane, unde n reprezint nu
copii al unei clase, iar m numrul de materii ale acelei clase. Matric
e un vector de m elemente care conine numrul de
manuale luate de fiecare elev i un numr aflat pe poziia n+1,m+1 care conine
numrul total de manuale date.
14. tr-un ora sunt n strzi, fiecare strad
de ordine. Se construiete matricea interseciilor astfel:
a[i,j]=1 dac strzil
a[i,j]=0 n caz contr
S
155
Culegere de probleme Tipul tablou Matrici
156

a b)
T1.4. Matricea cu cifra 1 pe diagonala principal (condiia
i=j)i 0 n rest:

0 1 0
0 0 1

.
a:array[1..20,1..20] of integer;
e coloane ');readln(m);
entele matricei');
begin
e('a(',i,',',j,')=');
]);
ax<a[i,m] then max:=a[i,m];
];
eln('Maximul este: ',max);

r dup,
a trebuie ca
i end.
i b) se determin minimul.
e pe ultima coloan, m.
matricei ');readln(n);
begin

if a[i,i]<>0 then write(a[i,j],' ')
pe diagonala principala, iar
conditia a[i,i]<>0, elementele nenule}
RSPUNSURI

T1.1. c), d). La puctul a) este declarat un vector, iar l
trebuie declarate tipuri ordinale pentru specificarea
indicilor (Ex. b:array[1..10,1..10] of integer).
T1.2. a) La punctul b) elementele de pe linia i, iar la
punctul c), elementele de pe coloana 1.
T1.3. a) elementele nenule determinate de condiia a[i,j]
<> 0.


1 0 0

T1.5
program minim_max_linie;
var
n,m,max,min,i,j:integer;
begin
write('Dati nr. de linii ');readln(n);
write('Dati nr. d
writeln('Introduceti elem
for i:=1 to n do
for j:=1 to m do
writ
readln(a[i,j
end;
max:=a[1,m];
min:=a[1,m];
for i:=2 to n do begin
if m
if min>a[i,m] then min:=a[i,m
end;
writ
writeln('Minimul este: ',min);
end.

T2.1. Se nmulesc numrul de elemente de pe linie cu numrul
de elemente de pe coloan.
a) 5x10=50 b) 5x6=30 c) 7x8=56
T2.2. a) Afiarea c) Citirea. La punctul b) se execut n ciclurile
, ia for numai afiarea poziiilor elementelor din matrice
citirea elementului a[n,m]. Pentru a se realiza citire
dou instruciuni s fie ncadrate de begin cele
T2.3. c). La punctele a)
T2.4. Afieaz elementele d
T 2.5.
program diag_nenule;
var
a:array[1..20,1..20] of integer;
n,i,j:integer;
begin
a write('Dati dimensiune
for i:=1 to n do
1 to n do for j:=
write('a(',i,',',j,')=');
); readln(a[i,j]
end;
writeln('Elementele nenule de pe diagonala principala:');
for i:=1 to n do
; {a[i,i] - fixeaza elementele de
end.


T3.1. a) Marginile superioare - n i m - ale matricei a sunt
variabile. Pentru a aloca matricei un anumit spaiu de memorie
trebuie ca marginile superioare s fie constante.
b) Dup identificatorul matricei trebuie s apar :array, iar
Culegere de probleme Tipul tablou Matrici
157
n
ce -
e nu
to n
.
entelor se face dup ultima linie, nu
r fi fost:
m Multipli3_coloane_pare;
f integer;
(n);
n(m);
;
{Conditia j mod 2=0determina elementele care se afla pe
coloane pare}
end.
ainte de tipul elementelor, cuvntul cheie of.
c) 1)Identificatorul c este declarat ca o matrice de
elemente ntregi.
2) Selecia unui element este fcut dup un indi
c[i] - corect fiind selectarea dup doi indici.
3) mprirea n/2 se efectueaz numai asupra
numerelor reale, nu i a celor ntregi, aa cum este
declarat variabila n.
T3.2. c) pentru c este parcurs ntreaga matrice prin cele
dou cicluri for.
T3.3. Numrul elementelor pare aflate pe diagonala
secundar.
T3.4. n ciclul for j:=1 to m do apare variabila m car
a fost declarat i nici citit. Corect ar fi fost for j:=1
o, a fiind o matrice ptratic d
nsumarea elem
coloan. Corect a

for j:=1 to n do
s:=s+a[j,n]
T3.5.
progra
var n,m,i,j:integer;
a:array[1..20,1..20] o
begin
write('n=');readln
m=');readl write('
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
write('Elementele cu proprietatea ceruta sunt ');
for i:=1 to n do
for j:=1 to m do
if (a[i,j] mod 3=0) AND (j mod 2=0)then write(a[i,j],' ')
{Conditia a[i,j] mod 3=0 determina elementele care sunt multipli
} de 3


Culegere de probleme Tipul tablou Matrici
158
1.a) Se aplic un algoritm asemntor celui din problema
rezolvat 2. Se parcurge coloana k i se afieaz
elementele pozitive de pe aceast coloan:
for i:=1 to n do
if a[i,k]>0 then
writeln(a[i,k]);

program afisare_coloana_k;
var
a:array[1..20,1..20] of integer;
n,m,k,i,j:integer;
begin
write('Dati nr. de linii ');readln(n);
write('Dati nr. de coloane ');readln(m);
writeln('Introduceti elementele matricei');
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
write('Dati numarul coloanei ');readln(k);
writeln('Elementele pozitive de pe coloana '
,k,' sunt ');
for i:=1 to n do
if a[i,k]>0 then
writeln(a[i,k]);
end.

1.b) Se parcurge linia n i se testeaz dac elementul
curent a[n,j] este pozitiv:
for j:=1 to m do
if a[n,j]>0 then
write(a[n,j],' ');
program afisare_ultima_linie;
var
a:array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write('Dati nr. de linii ');readln(n);
write('Dati nr. de coloane ');readln(m);
writeln('Introduceti elementele
matricei');
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
writeln('Elementele pozitive de pe ultima linie:');
for j:=1 to m do
if a[n,j]>0 then
write(a[n,j],' ');
end.

2. Media aritmetic a elementelor aflate pe o linie s-a
determinat la problema rezolvat 3. Modificrile aprute sunt:
- nsumarea elementelor se face pentru ntreaga matrice (cele
dou cicluri for mbricate) i nu pentru o singur linie;
- mprirea se face la numrul de elemente a matricei, n*m.

program medie_aritm;
var
a :array[1..20,1..20] of real;
n,m,i,j:integer;
m_a:real;
begin
write('Dati nr. de linii ');readln(n);
write('Dati nr. de coloane ');readln(m);
writeln('Introduceti elementele ');
for i:=1 to n do
for j:=1 to m do begin
Culegere de probleme Tipul tablou Matrici
159
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
{Calculul mediei aritmetice}
m_a:=0;
for i:=1 to n do
for j:=1 to m do begin
m_a:=m_a+a[i,j];
end;
m_a:=m_a/(m*n);
writeln('Media aritmetic este: ',
m_a:5:2);
end.

3. Aceast problema se poate considera o extindere a
algoritmului de cutare secvenial, studiat la problema
rezolvat 7, de la vectori.
Etape:
- Se presupune la nceput c elementul x nu se
regsete n n matrice gasit:=FALSE .
- Se parcurge matricea
- dac este ndeplinit condiia x=a[i,j] , se afieaz i
i j, linia, respectiv coloana pe care se gsete
elementul; totodat gsit ia valoarea TRUE.
- dac elementul nu se gsete printre elementele
matricei, variabila gsit rmne cu valoarea FALSE.

program cutare;
var a:array[1..20,1..20] of integer;
n,m,i,j,x:integer;
gsit:boolean;
begin
write('Dai nr. de linii ');readln(n);
write('Dati nr. de coloane ');readln(m);
writeln('Introduceti elementele matricei');
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
write('Dati numarul ');readln(x);
{C[utarea elementului x}
gasit:=FALSE;
for i:=1 to n do
for j:=1 to m do
if x=a[i,j] then begin
gasit:=TRUE;
writeln('Elementul dat se afl pe linia ',i,', coloana ',j);
end;
if gasit=FALSE then writeln('Elementul ',x,' nu se afla in
matrice');
end.

4. Pentru a reine suma elementelor de pe fiecare coloan se
creaz o nou linie, cu numrul n+1. Astfel elementul a[n+1,j]
va reine suma elementelor de pe coloana j.
Calculul elementului a[n+1,j] se face astfel:
- se fixeaz coloana j;
- se iniializeaz elementul a[n+1,j] cu 0;
- se nsumeaz elementele de pe coloana j,
incrementndu-se indicele liniei:
for i:=1 to n do
a[n+1,j]:=a[n+1,j]+a[i,j];
Matricea final va avea n+1 linii.


program suma_coloane;
var a:array[1..20,1..20] of integer;
n,m,i,j:integer;
begin
write('Dati nr. de linii ');readln(n);
Culegere de probleme Tipul tablou Matrici
160
write('Dati nr. de coloane ');readln(m);
writeln('Introduceti elementele matricei');
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
for j:=1 to m do {Se fixeaza coloana j}
begin
a[n+1,j]:=0; {Initializarea elementului suma pentru
fiecare coloana}
for i:=1 to n do {Se parcurge coloana j}
a[n+1,j]:=a[n+1,j]+a[i,j];
end;
n:=n+1;
for i:=1 to n do begin
for j:=1 to m do
write(a[i,j]:4);
writeln;
end;
end.

5. Rezolvarea problemei respect urmtoarele etape:
- coloanele m, m-1,,k+1, k se deplaseaz n aceast
ordine cu o poziie spre dreapta;
- inserarea vectorului in locul coloanei k; contorul i va
parcurge att liniile matricei ct i elementele
vectorului:
for i:=1 to n do
a[i,k]:=v[i];
- se incrementeaz numrul de coloane cu o unitate.

program adaug_coloana;
var
a:array[1..20,1..20] of integer;
v:array[1..20] of integer;
n,m,k,i,j:integer;
begin
write('Dai nr. de linii ');readln(n);
write('Dai nr. de coloane ');readln(m);
writeln('Introducei elementele matricei');
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
write('Dai nr. coloanei ');readln(k);
writeln('Introducei elementele vectorului');
for i:=1 to n do begin
write('v(',i,')=');
readln(v[i]);
end;
{Deplasarea coloanelor cu o poziie spre dreapta }
for j:=m downto k do {Deplasarea incepe cu ultima coloan}
for i:=1 to n do
a[i,j+1]:=a[i,j];
{Inserarea vectorului in locul coloanei k}
for i:=1 to n do
a[i,k]:=v[i];
m:=m+1; {Numrul de coloane crete cu o unitate}
writeln('Noua matrice este:');
for i:=1 to n do begin
for j:=1 to m do

write(a[i,j]:5);
writeln;
end;
end.

6. Liniile matricei pot fi considerate ca vectori de dimensiune m;
astfel pentru fiecare linie se poate aplica algoritmul de
Culegere de probleme Tipul tablou Matrici
161
determinare a minimului din vector problema rezolvat
5 de la vectori.
Pentru a determina minimul pe fiecare coloan se
parcurg urmtorii pai:
- se fixeaz coloana n ciclul for dup j:
- se iniializeaz minimul pentru fiecare coloan
(min:=a[1,j]);
- se parcurge coloana cu ciclul for dup i i se
testeaz condiia de minim:
for i:=2 to n do
if min>a[i,j] then min:=a[i,j];
- se afieaz minimul pe coloana j.

program minim_coloane;
type
matrice=array[1..20,1..20] of integer;
var n,m,i,j,min:integer;
a:matrice;
begin
write('n=');readln(n);
write('m=');readln(m);
for i:=1 to n do
for j:=1 to m do begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
{Determinarea minimului}
for j:=1 to m do {Fixarea coloanei}
begin
min:=a[1,j]; {Iniializarea minimului cu primul element
al
coloanei}
for i:=2 to n do {Parcurgerea coloanei}
if min>a[i,j] then min:=a[i,j]; {Schimbarea valorii
minimului}
writeln('Minimul de pe coloana ',j,' este ',min);
end;
end.

7. Programul are la baz algoritmul problemei rezolvate 2.
Pentru a calcula produsul pe linii se parcurg urmtorii pai:
- se fixeaz linia n ciclul for dup i:
- se iniializeaz minimul pentru fiecare linie (p:=1);
- se parcurge linia i cu ciclul for dup j:
for j:=1 to m do
p:=p*a[i,j];
- se testeaz dac produsul este nenul, caz n care se
afieaz linia i.

program produs_linie;
var
a:array[1..20,1..20] of integer;
n,m,i,j,p:integer;
begin
write('Dai nr. de linii ');readln(n);
write('Dai nr. de coloane ');readln(m);
writeln('Introducei elementele matricei');
for i:=1 to n do
for j:=1 to m do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
writeln('Liniile cu proprietatea cerut sunt');
for i:=1 to n do {Fixarea liniei}
begin
p:=1;
for j:=1 to m do {Parcurgerea liniei}
p:=p*a[i,j];
if p<>0 then write(i,' ');
end;
end.

Culegere de probleme Tipul tablou Matrici
162
write('n=');readln(n);
8. Algoritmul problemei trebuie s determine numrul de
numere pare de pe fiecare linie i determinarea
maximului dintre aceste numere. Numrul de numere
pare este contorizat n vectorul nr, unde nr[i] reine
numrul numerelor pare din linia i, iar variabila max,
maximul din acest vector. Astfel problema se reduce la o
problem de numrare i determinare a maximului dintr-
un vector.
Etape:
- iniializarea maximului cu valoarea 0;
- fixarea liniei:
- se iniializeaz elementul nr[i] pentru fiecare linie
(nr[i]:=0);
- se parcurge linia i i se testeaz condiia de paritate
- a[i,j] mod 2=0 caz n care se incrementeaz
elementul nr[i], corespunztor liniei i din matrice -
nr[i]:=nr[i]+1;
- dac nr[i] depete numrul maxim de numere
gsit pn n acest moment, se schimb valoarea
variabilei max cu elementul nr[i]:
if max<nr[i] then max:=nr[i];
Ultima instruciune for afieaz numrul de linii cu
numr maxim de numere pare, prin compararea
elementelor vectorului nr cu numrul maxim gsit (e
posibil s fie mai multe astfel de numere).
program nr_pare_linie;
var n,m,i,j,max:integer;
a:array[1..20,1..20] of integer;
nr:array[1..20] of integer;
begin
write('n=');readln(n);
write('m=');readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
max:=0;
for i:=1 to n do
begin
nr[i]:=0;
for j:=1 to m do
if a[i,j] mod 2=0 then nr[i]:=nr[i]+1;
if max<nr[i] then max:=nr[i];
end;
write('Linia (liniile) cu proprietatea cerut sunt ');
for i:=1 to n do
if max=nr[i] then write(i,' ');
end.

9. Se preia programul de la problema anterioar; se schimb
numai condiia de divizibilitate: elementul matricei nu trebuie
s fie par - a[i,j] mod 2=0 ci trebuie s se divid cu 5 - a[i,j]
mod 5=0.

10. Se poate adapta algoritmul de ordonare a unui vector;
coloana k poate fi considerat vectorul care se ordoneaz.
Pentru a observa diferena dintre matricea iniial se va citi
matricea a pe linii. Dup fiecare element citit pe o linie se
tasteaz spaiu, iar la sfritul liniei, tasta Enter.
Pentru interschimbarea liniilor i i i+1, se parcurg liniile i se
interschimb elementele aflate pe aceeai coloan: a[i,j] i
a[i+1,j].

Program Ordonare_coloana;
var n,m,i,j,k:integer;
t:real;
gasit:boolean;
a:array[1..10,1..10] of real;
begin
Culegere de probleme Tipul tablou Matrici
write('m=');readln(m);
for i:=1 to n do begin
write('Linia ',i,' '); {Citirea liniei i}
for j:=1 to m do
read(a[i,j]);
end;
write('Dai numrul de ordine al coloanei:'); readln(k);
{Ordonarea coloanei k}
gasit:=TRUE;
while gasit do {Ct timp coloana nu este ordonat}
begin
gasit:=FALSE; {Presupunem coloana ordonat}
for i:=1 to n-1 do {Parcurgerea coloanei}
begin
if a[i,k]>a[i+1,k] then {Se interschimba liniile i si i+1}
for j:=1 to m do {Parcurgerea liniilor i i i+1}
begin
gasit:=TRUE; {Coloana nu este ordonata
(elementele a[i,k] si a[i+1,k] nu respecta conditia de
ordine)}
t:=a[i,j];
a[i,j]:=a[i+1,j];
a[i+1,j]:=t;
end ;
end ;
end ;
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:5:2);
writeln;
end;
readln;
end.

11. Se consider matricea:
A:

n n, n,1
i i, 1 i n i,
1 n 2, 2,2
n 1, 1,1
a a
a
a a
a a
1 n n, n,2
i,2 i,1
n 2, 2,1
1 n 1, 1,2
a ....... .......... .......... a
..... ....... ....... .......... .......... ...... ......
..... ....... .... ...... .....a a a
..... ....... ....... .......... .......... ...... ......
..... ....... ....... .......... .......... ...... ......
a ....... .......... .......... a
a ....... .......... .......... a
Observm relaiile dintre indicii elementelor aflate deasupra
diagonalei principale:
- indicele i ia pe rnd valorile 1,2,,n-1, deci condiia pentru i
este i<=n-1 se stabilete un interval de valori pentru i;
- valoarea indicelui j este cu o unitate mai mare dect indicele i:
j>=i+1 se stabilete o relaie pentru j.
Pentru elementele aflate sub diagonala principal avem
relaiile:
- i>=2 elementele se afl pe primele n-1 linii;
- j<=i-1 elementele se afl deasupra diagonalei principale
(valorile indicelui j cresc o dat cu indicele i, dar rmn cu o
unitate mai mici).


Pentru afiare se parcurge matricea i se afieaz:
- elementul matricei, dac indicii acestuia respect simultan
cele dou condiii;
- caracterul x n caz contrar.

program diagonala_principal;
var
a:array[1..20,1..20] of integer;
n,i,j,s:integer;
begin
163
Culegere de probleme Tipul tablou Matrici
164
write('Dai dimensiunea matricei ');readln(n);
for i:=1 to n do
for j:=1 to n do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
writeln('Elementele aflate deasupra diagonalei
principale');
for i:=1 to n do
begin
for j:=1 to n do
if (i<=n-1)and (j>=i+1) then
write(a[i,j]:4)
else
write(' ':4);
writeln;
end;
writeln('Elementele aflate sub diagonala principal');
for i:=1 to n do
begin
for j:=1 to n do
if (i>=2)and(j<=i-1) then
write(a[i,j]:4)
else
write(' ':4);
writeln;
end;
end.

Pentru elementele aflate deasupra diagonalei secundare
avem relaiile:
- i<=n-1 elementele se afl pe primele n-1 linii;
- j< n-i+1 elementele se afl deasupra diagonalei
secundare ( valorile indicelui j scad pe msur ce crete
indicele i).
Pentru elementele aflate sub diagonala secundar avem
relaiile:
- i>=2 primele elemente se afl pe linia a doua;
- j<n-i-1 elementele se gsesc sub diagonala secundari.

program diagonala_secundara;
var a:array[1..20,1..20] of integer;
n,i,j:integer;
begin
write('Dati dimensiunea matricei ');readln(n);
for i:=1 to n do
for j:=1 to n do begin
write('a(',i,',',j,')=');
readln(a[i,j]);
end;
writeln('Elementele aflate deasupra diagonalei secundare');
for i:=1 to n do begin
for j:=1 to n do
if (i<=n-1) and (j<n-i+1) then
write(a[i,j]:4)
else
write(' ':4);
writeln;
end;
writeln('Elementele aflate sub diagonala secundara');
for i:=1 to n do
begin
for j:=1 to n do
if (i>=2) and (j>n-i+1) then write(a[i,j]:4)
else write(' ':4);
writeln;
end;
end.

Culegere de probleme Tipul tablou Matrici
12. Condiia ca un element s se gseasc pe diagonala
principal este: i=j indicele de linie trebuie s fie egal cu
cel de coloan. Deci elementelor a[i,j] care ndeplinesc
condiia i=j li se atribuie valoarea 1, iar n rest, 0.

program matr_1_0;
var
a:array[1..20,1..20] of integer;
n,i,j:integer;
begin
write('n=');readln(n);
for i:=1 to n do
for j:=1 to n do
if i=j then a[i,j]:=1 {Elem. de pe diag. principala}
else a[i,j]:=0;
for i:=1 to n do begin
for j:=1 to n do
write(a[i,j]:5);
end ;
end.

13. Elementele matricei a au valorile 0 sau 1.
Pe linia i se memoreaz manualele primite de elevul cu
numrul de ordine i.
Ex. m 1 m 2 m 3 m 4
165

0 0 1 1 elev

1 1 0 1 3 elev
0 1 1 1 2 elev
1
n acest caz elevul al 2-lea a primit primele 3 manuale, fapt
indicat de elementele cu valoarea 1 de pe linia a 2-a.
Numrul de manuale luate de elevul i se calculeaz n
noua coloan, m+1, a matricei astfel:
- se fixeaz linia prin ciclul for dup i;
- se parcurge linia i i se adun, pe rnd, elementele a[i,j]
ale acestei linii la elementul a[i,m+1], care reprezint
numrul de manuale primite de elevul i;
Numrul de elevi care au primit un manual j se calculeaz
pe linia n+1:
- se fixeaz coloana j;
- se adun elementele de pe coloana j la elementul a[n+1,j],
care reprezint numrul de elevi care au primit manualul
j.
Numrul total de manuale primite se calculeaz n
elementul a[n+1,m+1], care nsumeaz elementele de pe toate
coloanele matricei.

program manuale;
type matrice=array[1..30,1..20] of integer;
var n,m,i,j,maxg:integer;
a:matrice;
begin
write('n=');readln(n);
write('m=');readln(m);
for i:=1 to n do
for j:=1 to m do begin
write('a[',i,',',j,']='); readln(a[i,j]);
end;
{Numarul de manuale luate de elevi}
for i:=1 to n do
begin
a[i,m+1]:=0;
for j:=1 to m do
a[i,m+1]:=a[i,m+1]+a[i,j];
writeln('Elevul ',i,' a luat ',a[i,m+1],' manuale');
end;
a[n+1,m+1]:=0;
{Numarul de manuale la o materie}
for j:=1 to m do
begin
Culegere de probleme Tipul tablou Matrici
a[n+1,j]:=0;
for i:=1 to n do
a[n+1,j]:=a[n+1,j]+a[i,j];
writeln('Pt materia ',j,' s-au dat ',a[n+1,j],' manuale');
a[n+1,m+1]:=a[n+1,m+1]+a[n+1,j];
end;
writeln('S-a dat un nr total de',a[n+1,m+1],' manuale');
end.

14. Datele de intrare se memoreaz ntr.o matrice
ptratic ale crei elemente respect condiiile:
a[I,j]=
{
j si i strazile re int tii sec er int exista nu daca , 0
j strada cu teaza sec er int se i strada daca , 1

Matricea a este simetric (a[I,j]=a[j,I]=evident, dac
strada I se intersecteaz cu I).
n vectorul inters se vor memora numrul de intersecii
pentru fiecare strad, iar variabila max va reine numrul
maxim de intersecii.

program intersectii;
type matrice=array[1..40,1..40] of integer;
vector=array[1..40] of integer;
var n,m,i,j,max:integer;
inters:vector;
a:matrice;
begin
write('n=');readln(n);
for i:=1 to n do begin
a[i,i]:=0;
for j:=i+1 to n do begin
write('a[',i,',',j,']='); readln(a[i,j]); {Citirea unui
element}
a[j,i]:=a[i,j]; {Iniializarea elementului simetric cu
aceeai valoare}
end;
end;
for i:=1 to n do {Fixarea strzii I}
begin
inters[i]:=0; {Iniializarea numrului de intersecii pentru
strada I}
for j:=1 to n do
inters[i]:=inters[i]+a[i,j]; {Contorizarea interseciei cu
fiecare strad j}
end;
{Determinarea numarului maxim de strzi}
max:=0;
for i:=1 to n do if max<inters[i] then max:=inters[i];
writeln('Strazile cu numar maxim de intersectii sunt: ');
for i:=1 to n do if max=inters[i] then write(i,' ');
end.
166

Anda mungkin juga menyukai