Sunteți pe pagina 1din 104

C a p i t o lul I I:

P r in c i p ii l e p r o g r am r i i s t r u c t u r at e
I I . 1. N o i u ne a d e st ru c tu r
Reamintim:
n cadrul unui algoritm se pot efectua trei tipuri de operaii: de intrare /
ieire, de atribuire (calcul) i de decizie. Algoritmul efectueaz aceste operaii n
scopul transformrii datelor de intrare n date de ieire. Operaiile algoritmului se
reprezint n pseudocod prin instruciuni.
Apare ns firesc ntrebarea: n ce ordine se execut operaiile n cadrul
unui algoritm ? n mod normal succesiv, de la prima pn la ultima:
operaia 1 operaia 2 ...
operaia n

Dar ntr-un program pot aprea ramificaii i salturi de la o instruciune


la alta, care schimb aceast ordine. Mai mult, vom vedea n conntinuare c exist
i posibilitatea de a repeta de mai multe ori execuia unor aciuni. Prin urmare,
orice algoritm se caracterizeaz printr-o anumit structur, care indic ordinea
execuiei operaiilor. Mai exact, prin structur nelegem o form de mbinare a
operaiilor cu care lucreaz algoritmii.
Programarea structurat este de o importan vital n realizarea unor programe
ct mai clare i mai uor de urmrit, mai ales n cadrul algoritmilor lungi i complexi.
S-a demonstrat n mod incontestabil c pentru realizarea oricrui program
sunt suficiente trei tipuri de structuri:
liniar;
alternativ (de selecie);
repetitiv.
n continuare ne propunem s analizm pe rnd cele trei tipuri de structuri enumerate.

II . 2 . S t ru ctu r a l in i a r
n primul exemplu de pseudocod prezentat n capitolul I, cel al
algoritmului pentru calculul ariei unui triunghi, am ntlnit toate tipurile de
operaii pe care le poate efectua un algoritm: citirea datelor de intrare (baza b i
nlimea h a triunghiului), luarea unei decizii n funcie de valoarea de adevr a
>0) i (h>
>0)",
calculul ariei triunghiului (atribuirea
condiiei "(b>
A
(b*h)/2 ), afiarea datelor de ieire (aria A).
12

Vom defini structura liniar astfel:


Orice operaie din categoria celor mai sus exemplificate constituie o
structur liniar.
S1
S2
Dac S1 i S2 sunt structuri de orice tip, atunci
S1
este o structur liniar.

Generaliznd afirmaia anterioar, ajungem la structura


liniar alturat.

S2
...
Sn

Demonstraia este foarte simpl. Dac S1 i S2 sunt structuri liniare, atunci i


ansamblul (S1,S2) este o structur liniar. Apoi, dac S3 este tot o structur liniar, avem
un ansamblu de dou structuri liniare, (S1,S2) i (S3). Aceasta, conform afirmaiei
anterioare, alctuiete tot o structur liniar, (S1,S2,S3). Analog se demonstreaz c
(S1,S2,S3,S4) este tot o structur liniar .a.m.d.

I I . 3. S tr u c t u ra a l te r n a t i v ( de s e l ec t i e )
I I .3 .1 . S t r u c t u r a d e s e l e c t i e s i mp l
Structura de selecie simpl, mai numit i structura de tip "dacaltfel", introduce o ramificaie n program, n funcie de valoarea de adevr a
unei condiii. Mai concret, se testeaz o condiie, formulat cu ajutorul unei
expresii logice, pe care o denumim generic prin meta-simbolul <expresie>.
Aceast expresie logic poate avea, dup cum bine tii deja, doar dou valori: 1
(condiie adevrat) sau 0 (condiie fals). n funcie de valoarea ntlnit n
momentul testrii, se va executa una din cele dou "ramuri" posibile ale structurii
de selecie simpl, i anume:
dac <expresie> are valoarea 1, adic n cazul n care condiia aferent este
adevrat, se execut o anumit secven de instruciuni, pe care o denumim simbolic prin
<secvena_1>. Aceast secven se numete "corpul ramurii "dac");
n caz contrar (condiia nu este ndeplinit iar <expresie> are valoarea
FALSE), se execut o alt secven de instruciuni, pe care o codificm prin
<secvena_2> (corpul ramurii "altfel").
n pseudocod, structura de selecie
simpl descris mai sus ar putea fi
reprezentat astfel:

dac (<expresie>) atunci


<secvena_1>
altfel
<secvena_2>

Aa cum am mai spus i n capitolul I, nu exist un limbaj pseudocod


standard, fiecare utilizator avnd libertatea de a-i stabili propriul set de reguli de
sintax. Pentru a v obinui de la bun nceput cu regulile de sintax ale limbajului
C++, le vom introduce rnd pe rnd i n pseudocod. Deocamdat stabilim dou
astfel de "legi":
13

la sfritul fiecrei instruciuni de atribuire, citire i afiare, se pune


caracterul "punct i virgul";
expresia logic <expresie> din linia "dac" se cuprinde ntre dou
paranteze rotunde.

Exemplu:
Ne propunem s proiectm pseudocodul unui algoritm care determin i
afieaz maximul a dou numere ntregi a i b citite de la tastatur.
Citim de la tastatur numerele a i b. Apoi se
comparm numerele, memornd pe cel mai mare
dintre ele n variabila max.
dac a este mai mare sau egal cu b
(condiie care se scrie prin expresia logic "a>=b")
a;
atunci maximul este a, adic facem atribuirea max
n caz contrar maximul va fi evident b, i
b.
marc acest fapt prin atribuirea max
n final se afim maximul max.

citete a,b;
dac (a>=b) atunci
max a;
altfel
max b;
scrie max;

Observaii:


n cazul n care secvena de instruciuni <secvena_1> sau


<secvena_2> conine mai mult de o instruciune, ea trebuie cuprins
ntre cuvintele cheie "nceput" i "sfrit". n exemplul anterior,
fiecare dintre cele dou secvene era alctuit doar din cte o instruciune
de atribuire, "max
a", respectiv "max
b;".
Pentru ca un pseudocod s arate ct mai limpede, recomandm ca instruciunile
ce alctuiesc corpurile "ramurilor" "dac" i "altfel" s fie aliniate ceva mai
nspre interior. Nu este obligatoriu, dar este mult mai sugestiv !

ntr-o structur de selecie simpl de tipul "dac-altfel", ramura


"altfel" poate s lipseasc. Asta nseamn c n cazul n care condiia nu este
ndeplinit, pur i simplu nu se execut nimic.

Ex e mp l u :
Iat n continuare o alt variant a algoritmului pentru determinarea maximului
a dou numere date a i b, n care folosim o structur de selecie fr ramura "altfel".
Evident, i de aceast dat trebuie s ncepem
cu citirea de la tastatur a numerelor a i b.
Presupunem mai nti c cea mai mare dintre cele dou
a. Apoi verificm
valori este a, fcnd atribuirea max
posibilitatea contrar, adic testm dac nu cumva
totui b este mai mare dect a; n caz afirmativ,
evident maximul celor dou numere va fi b, i marcm
b .
acest fapt prin atribuirea max
n caz de egalitate, maximul poate fi oricare
dintre cele dou numere, iar n varianta noastr
variabila max va rmne cu valoarea iniial a.
14

citete a,b;
max
a;
dac (b>a) atunci
max
b;
scrie max;

Aplicaie

R.II.1. Aria unui triunghi

Scriei pseudocodul unui algoritm care citete de la tastatur dou numere


reale i strict pozitive b i h, reprezentnd baza, respectiv nlimea unui triunghi,
apoi calculeaz i afieaz aria triunghiului. n cazul n care valorile introduse nu
pot reprezenta latura i nlimea unui triunghi, se va afia mesaj de eroare.
Reamintim formula ariei triunghiului: A=(b*h)/2.

Rezolvare
:

 Orice algoritm trebuie s nceap cu citirea datelor de intrare, n cazul de fa


baza triunghiului (adic o latur) i nlimea corespunztoare. Aa cum am artat n lecia
introductiv din capitolul I, instruciunea necesar este {citete b,h;}.
 Urmeaz testarea condiiilor pe care trebuie s le ndeplineasc datele de intrare. n
problema noastr, fiind vorba despre mrimi geometrice ntr-un triunghi, valorile lui b i h
trebuie s fie strict pozitive. Aceast testare se realizeaz cu ajutorul unei intruciuni de selecie
simpl de tipul "daca-altfel", care va introduce o ramificaie n program. ntruct baza i
nlimea trebuie s fie ambele mai mari ca 0 n acelai timp, cele dou condiii vor fi "legate"
prin operatorul "I logic", iar expresia logic compus aferent condiiei din linia "dac" este
"dac (b>0 I h>0)" (pus ntre paranteze, aa cum tii deja). Aadar:
 Dac este ndeplinit aceast condiie atunci:

calculm aria triunghiului; n acest scop, atribuim unei variabile A


valoarea expresiei (b*h)/2 ce reprezint aria;

afim valoarea variabilei A, cu ajutorul cuvntului cheie "scrie".


 n caz contrar, tiprim mesajul "date incorecte".
citete b,h;
dac (b>0 I h>0) atunci
nceput
A (b*h)/2;
scrie A;
sfrit
altfel
scrie 'Date incorecte';

ncercai singuri ! - Tema nr. T.1.


1. Scriei cte un algoritm care determin i afieaz:
a)
b)
c)

minimul a dou numere date.


maximul a trei numere date.
minimul a trei numere date.

2. Scriei cte un algoritm care calculeaz i afieaz:

a)

volumul unui trunchi de con V = h R 12 + R 22 + R 1 R 2 .

b)

Condiii: R1 , R 2 , h > 0 .
Aria unui paralelogram A = d1 d 2 sin a .

Condiii: d1 , d 2 > 0; a (0, ).


15

c)

Aria total a unui cilindru circular drept A = 2 R (R + G ) .


Condiii: R, G > 0 .

d)

Aria unui trapez oarecare A =

( b1 + b2) h
.
2

Condiii: b1 , b2 , h > 0 .

Structuri de selecie imbricate

ntr-o structur de selecie simpl, oricare dintre secvenele de instruciuni de


pe cele dou ramuri ale sale poate conine la rndu-i alte structuri de acelai gen. Se
obine astfel o aa-numit structur selectiv imbricat. n acest caz, fiecare ramur
"altfel" se asociaz ultimei ramuri "dac-atunci" dinaintea sa care nu a fost nc
asociat, aa cum arat schema din figura. Dac dorim s schimbm aceast asociere
implicit, vom folosi cuvintele cheie "nceput" i "sfrit".
dac (<c1>) atunci
dac (<c2>) atunci
<s1>
altfel
<s2>
altfel
<s3>

Exemple concrete de astfel de structuri imbricate vei ntlni n toate


aplicaiile care urmeaz.

Aplicaie

R.II.2. Interpretarea unui pseudocod dat

Se d secvena de algoritm de mai jos, prezentat n pseudocod, n care


toate variabilele identific numere reale:
citete a,b,c; dac (a > b +c) atunci nceput dac (b > = c )
atunci x ( a+b)/(2*c); altfel x 0 ; sfrit altfel
x ( a/c+b/c)/2; scrie x;
a) Rescriei secvena, folosind o aezare n pagin mai "aspectuas", cu
liniile de algoritm scrise una sub alta, i aliniate astfel nct s se vad fiecare
ramur "altfel" crei ramuri "dac" i corespunde.
b) Deducei ce se afieaz n urma execuiei secvenei, dac valorile citite
de la tastatur sunt a=9, b=5 i c=2.
c) Gsii un set de valori pentru variabilele a, b i c, astfel nct, n urma
execuiei algoritmului, s se afieze valoarea 0.
d) Rescriei algoritmul ntr-un mod mai scurt, folosind un numr mai mic
de ramuri de tip"dac-altfel".
e) Dac din algoritm am terge cuvintele "inceput" i "sfrit", efectul
execuiei algoritmului s-ar schimba, sau ar rmne acelai ? Justificai rspunsul.
16

a)

Rezolvare
:

citete a,b,c;
dac (a>b+c) atunci
nceput
dac (b>=c) atunci
x
(a+b)/(2*c);
altfel
x
0;
sfrit
altfel
x
(a/c+b/c)/2;
scrie x;

b)
Pentru a=9, b=5 i c=2, avem:
condiia "a>b+c" din prima instruciune de selecie este ndeplinit pentru
aceste valori (9>5+2), deci se execut ramura "dac" a acesteia, unde ntlnim o alt
instruciune de selecie de tipul "dac-altfel";
aici condiia "b>=c" este la rndul ei adevrat (5>=2), motiv pentru care se
(a+b)/(2*c);}, de unde rezult x=(9+5)/(2*2)=14/4=3.5.
execut atribuirea {x
Variabila x nu mai sufer nici o modificare a valorii sale, ntruct celelalte ramuri ale
instruciunilor "dac-altfel" imbricate nu sunt atinse. n concluzie, programul va afia
valoarea 3.5.
c)
Singurul loc din secven n care gsim o atribuire prin care variabila x primete
valoarea 0, este pe ramura "dac" a primei instrucini de selecie i pe ramura "altfel" a
celei de-a doua astfel de instruciuni. Cu alte cuvinte, valorile alese pentru a, b i c trebuie
s ndeplineasc prima condiie "a>b+c", i s nu ndeplineasc cea de-a doua condiie
b>=c". Un exemplu de astfel de valori ar fi a=9, b=3 i c=4, dar, evident, nu singurele.
d)
n secvena dat, avem trei instruciuni prin care variabilei x i se atribuie o
anumit valoare, dar, dintre acestea, dou sunt echivalente. Este vorba despre instruciunile
x
(a+b)/(2*c) i x
(a/c+b/c)/2, cauza fiind faptul c expresiile atribuite,
(a+b)/(2*c), respectiv (a/c+b/c)/2, nseamn de fapt acelai lucru. ntr-adevr, nu
este greu de observat c expresia (a/c+b/c)/2 se poate scrie i sub forma (a+b)/c/2,
adic (a+b)/(2*c). Prin urmare, cele dou ramuri care atribuie variabilei x aceeai
valoare pot fi comasate ntre ele. Care sunt situaiile ce conduc la aceste dou atribuiri
echivalente ?
una se petrece atunci cnd se intr pe ramura "dac" a primei instruciuni de selecie i
n acelai timp pe ramura "altfel" a celei de-a doua, adic atunci cnd "a>b+c I
b>=c";
cealalt are loc atunci cnd se intr pe ramura "altfel" a primei instruciuni de selecie,
adic pentru cazul contrar lui "a>b+c", care se traduce prin "a<=b+c".

17

Comasarea celor dou posibiliti ntr-o singur linie "dac" se face utiliznd
operatorul "SAU logic" (poate s se ntmple ori una ori cealalt dintre alternative, nu
amndou simultan). Aadar:
dac (a>b+c I b>=c) SAU (a<=b+c) atunci lui x i se atribuie valoare
expresiei (a+b)/(2*c);
n caz contrar, variabila x primete valoarea 0.
Lsm ca exerciiu rescrierea secvenei, operaiune care dup aceste explicaii ar
trebui s fie o simpl formalitate !
e)
n secvena dat, se vede foarte clar faptul c prima ramur "altfel" corespunde
lui "dac b>=c", iar al doilea "altfel" se asociaz cu "dac a>b+c". S vedem cum ar
arta secvena fr cuvintele cheie "nceput" i "sfrit":
citete a,b,c;
dac (a>b+c) atunci
dac (b>=c) atunci
x
(a+b)/(2*c);
altfel
x
0;
altfel
x
(a/c+b/c)/2;
scrie x;

Conform regulii prezentat pe larg n partea de teorie, ntr-un lan de instruciuni


"dac-altfel" imbricate, n mod implicit, n absena unor cuvinte cheie "nceput" i
"sfrit", fiecare ramur "altfel" se asociaz primului "dac" de dinaintea lui care nu
a fost nc asociat. Altfel spus, asocierile trebuie stabilite dinspre interiorul nspre
exteriorul secvenei. Mai exact:
pentru primul "altfel", cea mai apropiat ramur "dac" situat naintea sa
este "dac b>=c";
pentru al doilea "altfel", cutm de jos n sus primul "dac" de dinaintea sa
care nu a fost nc asociat, i ajungem astfel la "dac a>b+c".
Observm c a rezultat aceeai cuplare a perechilor "dac-altfel" pe care o
aveam n secvena iniial, cea care coninea i cuvintele "nceput" i "sfrit". Pe cale
de consecin, aceste cuvinte cheie erau complet inutile, iar eliminarea lor nu modific cu
nimic efectul execuiei algoritmului.

ncercai singuri ! - Tema nr. T.2.


1. Se d secvena de algoritm de mai jos:
citeste a,b,c; daca (a>b+c) atunci x
(a/c+b/c)/2;
(a+b)/(2*c);
altfel inceput daca (b>=c) atunci x
altfel x
0; sfarsit scrie x;
a) Rescriei secvena, folosind o aezare n pagin mai "aspectuas", cu
liniile de algoritm scrise una sub alta, i aliniate astfel nct s se vad fiecare
ramur "altfel" crei ramuri "dac" i corespunde.
18

b) Deducei ce se afieaz n urma execuiei secvenei, dac valorile citite


de la tastatur sunt a=2, b=5 i c=7.
c) Gsii un set de valori pentru variabilele a, b i c, astfel nct n urma
executrii secvenei s se afieze valoarea 0.
d) Rescriei algoritmul ntr-un mod mai scurt, folosind un numr mai mic
de ramuri de tip "dac-altfel".
e) Dac din algoritm am terge cuvintele "inceput" i "sfrit",
efectul execuiei algoritmului s-ar schimba, sau ar rmne acelai ? Justificai
rspunsul.
2. Fie urmtoarea secven descris n

pseudocod:

a) Ce valori se vor afia n urma


executrii secvenei, n cazul n care de la
tastatur se citesc valorile k=0, i=5 i j=6 ?
b) Dai un exemplu de valori pe care lear putea primi prin citire variabilele de intrare i,
j i k, astfel nct, n urma executrii secvenei,
s se afieze dou valori egale ntre ele.
c) Rescriei algoritmul ntr-un mod mai
scurt, folosind un numr mai mic de ramuri de
tip "dac-altfel".

3. Fie
urmtorul
algoritm descris
n pseudocod, n
care variabilele
x, y i z sunt
numere reale.

citete i,j,k;
dac (k>0) atunci
dac (i#j) atunci
x
0;
altfel
x
1;
altfel
x
2;
dac (i#j) atunci
dac (k>0) atunci
y
0;
altfel
y
2;
altfel
y
1;
scrie x,y;

citete x,y,z;
dac (y+z==0 SAU x+z==0 SAU x+y==0) atunci
scrie "FALS";
altfel
nceput
E
x/(z+y)+y/(x+z)+z/(x+y);
dac (2*E<3) atunci
scrie "FALS";
altfel
scrie "ADEVARAT"
sfrit

a) Ce se va afia pe ecran, dac de la tastatur se introduc valorile a=20,


b=55, c=6 ?
b) Gsii un set de valori pentru variabilele a, b i c astfel nct, n urma
executrii secvenei, s se afieze textul "FALS".
c) Rescriei secvena dat, inversnd ntre ele corpurile ramurilor "dac"
i "altfel" n cadrul primeia dintre cele dou instruciuni de selecie simpl (cu

modificarea corespunztoarea a condiiei).


19

Aplicaie

R.II.3. Funcie matematic

S se calculeze valoarea funciei matematice f(x ) , pentru o valoare a lui x


introdus de la tastatur:
x 2 + 1 , pentru x 3

f : R R , f(x ) = x 2 , pentru x ( 3 ,3)


x 2 4x + 5 , pentru x 3

Rezolvare
:

 Nu putem introduce n calculator o funcie algebric aa cum o cunoatem din


matematic, cu argument, domeniu, codomeniu i lege de asociere. Vom proceda n felul
urmtor: argumentul x al funciei va fi definit ca o variabil, iar valoarea sa se va citi de la
tastatur; conform valorii citite pentru x, trebuie aleas una dintre cele trei "ramuri" ale
funciei, adic una dintre expresiile x2+1, x-2 i x2-4x+5; pentru valoarea respectiv a lui
x, expresia aleas se evalueaz, obinndu-se o valoare pe care o atribuim unei variabile E.
x-2,
De exemplu, pentru x=1 se va alege ramura din mijloc a funciei. Rezult E
adic E=1-2=-1.
n concluzie, dup citirea lui x urmeaz un ir de testri:





dac x 3 , atribuim lui E valoarea expresiei x 2 + 1 ;


n caz contrar:
dac x ( 3 , 3) atribuim lui E valoarea expresiei x 2 (e suficient s
se verifice dac x < 3 );
n caz contrar, nu mai trebuie testat nimic (deoarece nu mai rmne dect
posibilitatea x 3 ) i atribuim lui E valoarea expresiei x 2 4 x + 5 .

citete x;
dac (x<=-3) atunci
E x*x+1;
altfel
dac (x<3) atunci
E x-2;
altfel
E x*x-4*x+5;
scrie E;

ncercai singuri ! - Tema nr. T.3.


1. Pentru fiecare dintre funciile matematice de mai jos, s se scrie cte un
program care afieaz valoarea funciei pentru o valoare a argumentului x citit de la
tastatur:
x + 1 , daca 0 < x < 1
a) f(x ) = 2
x 5 x + 6 , altfel

20

b)

2
x + x + 2 , pentru x < 1

f(x) = 3 x 1 , pentru 1 x 2
5x 2
x + 2 , pentru x > 2

Aplicaie

R.II.4. Ctul i restul

( B a ca l au r e at iu li e 2 0 0 8 , va r i a n t a 9 6)

R e a l i z a i u n a l g o r i t m c a r e c i t e t e d e l a t a s t a t u r d o u n u m er e n a t u r al e
d i s t i n ct e , a p o i af i e a z c t u l i r e s t u l m p r i r i i ce l u i m a i m a r e d i n t r e c e l e
d o u n u m e r e l a c e l m a i m i c d i n t r e e l e . D a c n u m e r el e s u n t e g a l e , s a u d ac
m p r i r e a n u s e p o at e e f ec t u a , s e v a a f i a m e s a j u l "E r o a r e " .
.

Rezolvare
:

 Algoritmul ncepe cu citirea de la tastatur a numerelor a i b. Prima condiie


care trebuie testat este aceea ca numerele s fie distincte, deci:
";
 dac cele dou valori sunt egale, atunci scrie mesajul " Eroare"
 n caz contrar:
 dac a este mai mare ca b, atunci trebuie afiat ctul mpririi lui a la b, dar
pentru aceasta este necesar ca mpritorul s fie nenul, deci:

dac b este diferit de 0, atunci scrie pe ecran ctul i restul mpririi lui
a la b, adic a/b i a%b , separate printr-un spaiu (v reamintim c, n
cazul n care operanzii a i b sunt ambii ntregi, expresia "a/b "
furnizeaz ctul ntreg al mpririi lui a la b, adic fr parte zecimal);

n caz contrar, scrie de asemenea mesajul 'Eroare';


 dac a este mai mic ca b, atunci trebuie afiat ctul mpririi lui a la b, i
urmeaz o testare similar cu cea de dinainte:

dac a este diferit de 0, atunci scrie pe ecran ctul i restul mpririi lui
b la a, separate printr-un spaiu;

n caz contrar, trebuie din nou afiat mesajul 'Eroare';


 Mai precizm c ramura "altfel" a primei instruciuni de selecie "dacaltfel" conine alte dou instruciuni "dac-altfel" (cu condiiile "dac a>b " i
"dac b>a "), motiv pentru care trebuie cuprins ntre cuvintele cheie "nceput" i
"sfrit". n absena acestor cuvinte, calculatorul va considera c pe ramura "altfel" a
primului "dac-altfel" se gsete doar urmtoarea instruciune, adic numai prima
dintre cele dou secvene "dac-altfel" care urmeaz (cel cu condiia "dac a>b ") ,
iar urmtorul "dac-alfel" (cel cu condiia "dac b>a ") va fi scos n afara seleciei
(reamintim n acest punct de vedere c o secven "dac-altfel" mpreun cu cele dou
ramuri i corpurile lor, este privit ca o singur instruciune).

 Nu n ultimul rnd trebuie remarcat c n loc de "dac b>a" puteam s


scriem pur i simplu "altfel". De ce ? Cazul contrar lui "a>b " este "a<=b ", dar situaia
"a==b " a fost tratat separat mai sus, deci rmne doar "a<b ", adic exact ceea ce testm
n respectiva linie "dac". Am preferat aceast variant, pentru c n cealalt am fi ajuns la
un lan de imbricri ale structurilor "dac-altfel" cu trei nivele, care ar fi fcut destul
21

de anevoioas nelegerea algoritmului. Celor care au ptruns deja profund n tainele


structurilor de selecie, le propunem s se ncumete s abordeze i cealalt versiune !
citete a,b;
dac (a==b) atunci
scrie 'Eroare';
altfel
nceput
dac (a>b) atunci
dac (b0) atunci
scrie a/b,' ',a%b;
altfel
scrie " Eroare"
";
dac (b>a) atunci
dac (a0) atunci
scrie b/a,' ',b%a;
altfel
scrie " Eroare"
";
sfrit

ncercai singuri ! - Tema nr. T.4.


1. Fiind date trei numere naturale nenule a, b i k, s se verifice
dac fracia a/b se simplific prin k. n caz afirmativ se va afia i fracia
simplificat. Se va testa i condiia ca numitorul fraciei s fie nenul.
2. Se citete de la tastatur un numr natural care reprezint un an
calendaristic. Realizai un algoritm care testeaz dac anul este bisect sau nu,
afind un mesaj corespunztor. Un an este bisect dac:
(este divizibil cu 4 I nu este divizibil cu 100) SAU
este divizibil cu 400.

Aplicaie

R.II.5. Laturi n triunghi

Se citesc de la tastatur trei numere reale a, b, c. S se verifice dac aceste


numere pot fi laturile unui triunghi i n caz afirmativ s se determine natura
triunghiului n funcie de laturi (echilateral, isoscel, oarecare). Trei numere pot fi
laturile unui triunghi, dac sunt pozitive i suma a oricare dou dintre ele este mai
mare dect al treilea.
Exemplu: Numerele a=4, b=4 i c=7 sunt laturile unui triunghi isoscel, iar
valorile a=2, b=3 i c=9 nu pot fi laturile unui triunghi (din cauz c 2+3<9).

Rezolvare
:

 Algoritmul ilustreaz funcionarea structurilor selective imbricate.


Citim numerele a, b, c, apoi testm dac ndeplinesc condiia de a fi laturile unui
triunghi: (a>0 I b>0 I c>0 I a+b>c I a+c>b I b+c>a)
22

 n cazul n care aceast condiie este adevrat, printr-o alt structur de


selecie determinm natura triunghiului, afind un mesaj:


dac triunghiul are perechi de laturi egale, adic (a==b I a==c), atunci
este echilateral (automat rezult i c b este egal cu c, conform tranzitivitii
relaiei de egalitate);
n caz contrar, triunghiul poate fi isoscel sau oarecare:

dac dou laturi sunt egale, (a==b SAU a==c SAU b==c), atunci
este isoscel;

n cazul contrar i celui anterior nu mai testm nimic, pentru c


triunghiul nu mai poate fi dect oarecare.

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
nceput
scrie "Numerele sunt laturi";
dac (a==b I b==c) atunci
scrie "Triunghi echilateral ";
altfel
dac (a==b SAU a==c SAU b==c) atunci
scrie "Triunghi isoscel ";
altfel
scrie "Triunghi oarecare ";
sfrit
altfel
scrie "Nu e triunghi ";

 Observai ce conine corpul ramurii "dac" aferent primei condiii: o


instruciune de afiare i o alt instruciune de selecie "dac-altfel". Din acest motiv,
ntreg corpul n cauz este cuprins ntre cuvintele "nceput" i "sfrit".


ncercai singuri ! - Tema nr. T.5.
1. Se citesc de la tastatur trei numere reale a, b, c. Scriei pseudocodul
unui algoritm care verific dac acestea pot fi unghiuri ale unui triunghi exprimate
n grade (sunt pozitive i suma lor este 180), iar n caz afirmativ s se determine
natura triunghiului (optuz-unghic, dreptunghic sau ascuit-unghic).
2. Se citesc trei numere ntregi a, b, c. Scriei pseudocodul unui

algoritm care verific dac aceste numere sunt n progresie aritmetic (trei numere
sunt n progresie aritmetic dac unul din ele este media aritmetic a celorlalte
dou), afind un mesaj sugestiv.

Aplicaie

R.II.6. Rezolvarea ecuaiei de gradul II

Scriei un algoritm pentru rezolvarea ecuaiei de gradul II de forma


a x 2 + b x + c = 0 , unde coeficienii a, b, c se citesc de la tastatur. Se vor trata toate

cazurile posibile.

23

Rezolvare
:

b
 Reamintim: = b 2 4ac , x 1,2 =
. Paii algoritmului sunt urmtorii:
2a




citim cei trei coeficieni ai ecuaiei n variabilele a,b,c;


rezolvm ecuaia de gradul II cu coeficienii a,b,c citii anterior, tratnd
toate cazurile:
dac a este egal cu 0:
dac b este egal cu 0, atunci: dac i c este egal cu 0 , atunci
ecuaia are o infinitate de soluii, iar dac c este diferit de 0
ecuaia este una imposibil; n ambele situaii nu se rezolv
ecuaia, tiprindu-se un mesaj, motiv pentru care ele au fost
comasate.
-c/b ,
n caz contrar, ecuaia devine bx + c = 0 cu rdcina x
care se afieaz;
b*b-4*a*c i:

n caz contrar: se calculeaz discriminantul: delta


dac delta < 0 , ecuaia nu are soluii i se afieaz un mesaj;
n caz contrar ( delta 0 ), calculm rdcinile
x1
(-b- delta ))/(2*a),
x2
(b+ delta ))/(2*a) pe care le afim.

Observaie: Modul n care introducem radicalul n program va fi prezentat n


capitolul urmtor. La nivel de pseudocod folosim simbolul cunoscut din matematic.
citete a,b,c;
dac (a==0) atunci
dac (b==0) atunci
scrie "Nu se rezolva ecuatia";
altfel
scrie -c/b;
altfel
nceput
delta b*b-4*a*c;
dac (delta<0) atunci
scrie "Nu are solutii reale";
altfel
nceput
x1 (-b+ delta )/(2*a);
x2 (-b- delta )/(2*a);
scrie x1,x2;
sfrit
sfrit

ncercai singuri ! - Tema nr. T.6.


1. Realizai un algoritm pentru rezolvarea unui sistem de dou ecuaii cu
dou necunoscute, de forma:

ax+b = m
cx+d = n
24

Coeficienii a, b, c, d, m, n, se citesc de la tastatur. Se va testa i condiia


de existen a sistemului, "a#0 I c#0 ". Se cer dou variante, aferente celor
dou metode de rezolvare cunoscute: metoda reducerii i metoda sustituiei.

Ai neles ?

Probleme cu rspuns scurt

Urmtorii trei itemi se refer la secvena de instruciuni de mai jos, n care toate
variabilele sunt de tip ntreg.
citete a,b,c;
x
1;
dac (not(a<=b) SAU not(a<=c))
nceput
dac (b>=c) atunci
scrie -x;
sfrit
altfel
dac (b<c) atunci
scrie x;

1. Ce valoare se va afia pe ecran, dac de la tastatur se citesc valorile a=2,


b=3, c=4 ?

2. Precizai un set de valori care ar putea fi citite pentru variabilele a, b i c,


astfel nct s se afieze valoarea -1.
3. Rescriei condiia din prima linie "dac", nlocuind-o cu o expresie logic
echivalent, astfel nct s nu fie folosit operatorul logic de negaie.
4. (Bacalaureat iulie 2008, varianta 44)
Care sunt valorile variabilelor a i b dup executarea secvenei de mai jos, dac
iniial ele aveau valori diferite ?
dac (a<b SAU a>b) atunci
nceput
a
1;
b
a;
sfrit
dac (a==b) atunci
b
0;

5. (Bacalaureat iulie 2009, varianta 91)

tiind c variabila ntreag nr memoreaz valoarea 5, stabilii ce mesaj se va afia


n urma execuiei secvenei de program de mai jos:
dac (nr<7) atunci
dac (nr<3) atunci
scrie "BINE";
altfel
scrie "FOARTE BINE";
altfel
scrie "RAU";

a) BINERU

b) FOARTE BINE

c) RAU

25

d) BINE

6. (Bacalaureat iulie 2009, varianta 90)


Care dintre urmtoarele instruciuni atribuie variabilei ntregi t valoarea -1 dac
i numai dac variabilele ntregi a i b sunt nenule i au semne diferite ?
a)
b)
c)
d)

dac
dac
dac
dac

(a>0 SAU b<0) atunci t


-1;
(a>0 I b<0) atunci t
-1;
(a*b<0) atunci t
-1;
(a*b>0) atunci t
-1;

7. (Bacalaureat iulie 2008, varianta 75)


Care dintre urmtoarele secvene de instruciuni n pseudocod testeaz dac
valoarea variabilei z este cea mai mare dintre valorile variabilelor x, y i z, iar n caz
afirmativ o afieaz ?
a)
b)
c)
d)

dac
dac
dac
dac

(x<y
(x<y
(x<y
(x>z

I y<z) atunci scrie z;


I x<z) atunci scrie z;
SAU y<z SAU x<z) atunci scrie z;
SAU y>z) atunci scrie z;

Aprofundare
Probleme rezolvate
R.II.7

Diferen minim

(Bacalaureat iulie 2008, varianta 93)


Pentru trei numere reale i distincte a, b i c citite de la tastatur, se cere
s se afieze o valoare ntreag x care ndeplinete proprietatea c suma distanelor
de la x la cele trei numere date, adic |x-a|+|x-b|+|x-c|, este minim (prin
definiie, distana dintre dou numere u i v, msurat pe axa real, este egal cu
modulul diferenei celor dou numere, adic |u-v|). Se cere o metod de

rezolvare eficient din punctul de vedere al timpului de executare i al spaiului de


memorie folosit.
Exemplu: pentru a=2.5, b=3.8 i c=7.1, suma minim este 4.8, i se
realizeaz pentru x=4.

Rezolvare
:

Notm cu min i max cea mai mic, respectiv cea mai mare valoare dintre cele
trei numere a, b i c, iar cu p acea valoare dintre cele trei care nu este nici minim nici
maxim. De ce avem nevoie de minimul i maximul dintre cele trei numere, vom vedea
ceva mai trziu.
26

Pentru a determina minimul min dintre a, b i c, determinm mai nti minimul


dintre a i b, apoi comparm acest minim cu c. Absolut similar procedm i pentru a
stabili maximul max al celor trei numere date.
Odat localizate minimul i maximul dintre cele trei numere date a, b i c, ca s
stabilim cine va fi al treilea numr, adic cel ce nu este nici minim nici maxim (notat cu p),
este suficient s aplicm o formul matematic. Astfel, dac din suma celor trei numere
scdem suma dintre minim i maxim, va rmne tocmai al treilea numr, deci
p
(a+b+c)-(min+max).
n continuare, pentru a lucra cu cele trei valori date, vom folosi variabilele
alternative min, max i p, n loc de a, b i c.
nainte de toate, trebuie observat faptul c, dac numrul cutat x s-ar afla n afara
intervalului [min,max], atunci suma distanelor ar crete fa de situaia n care x s-ar gsi
n interiorul respectivului interval (luai orice valori pentru cele trei numere date, i
convingei-v singuri de veridicitatea acestei afirmaii !). n consecin, x-ul cerut, pentru
care suma distanelor de la x la cele trei numere min, max i y este minim, se gsete cu
certitudine n interiorul intervalului [min,max]. O cale posibil de rezolvare a problemei
ar fi s trecem n revist toate numerele ntregi din intervalul [min,max], i pentru fiecare
astfel de numr s calculm respectiva sum a distanelor, n scopul de a localiza suma
minim, dar o astfel de metod este totalmente ineficient.
Pentru a gsi soluia eficient, mai avem nevoie de o observaie bazat pe logic:
pentru orice numr x din intervalul [min,max], valoarea expresiei |x-min|+|x-max|
este constant, adic nu depinde de x. ntr-adevr, |x-min|+|x-max|=x-min+max min i x
max ). n aceste condiii, suma distanelor |xx=max-min (pentru c x
min|+|x-max|+|x-p| este influenat numai de distana |x-p|. Cu alte cuvinte, este
suficient s gsim acel x pentru care distana |x-p| de la el la al treilea numr p este
minim. Dar, dac p este un numr real, indiferent de valoarea sa, ce numr ntreg x ar
asigura distana cea mai mic ? Evident, valoarea ntreag cea mai apropiat de p, adic
primul ntreg de dup p sau primul ntreg de dinaintea lui p pe axa numerelor (de exemplu,
pentru p=3.8, valorile ntregi posibile ale lui x pentru care distana |x-p| are cea mai
mic valoare posibil, ar putea fi x=4 sau x=3, pentru orice alt valoare a lui x rezultnd o
distan mai mare). Pentru a v convinge c poate aprea oricare din aceste dou cazuri,
iat dou exemple, unul care se ncadreaz n primul caz, iar cellalt n al doilea: (a=2.5;
b=7.1; c=3.8), respectiv (a=2.5; b=7.1; c=3.3). n ambele cazuri, min=a, max=b i
p=c, iar valorile posibile ale lui x sunt 3 i 4; calculai suma S=|x-min|+|x-max|+|xp| pentru ambele valori ale lui x, i vei constata c n primul caz suma cea mai mic este
cea obinut pentru x=4, iar n al doilea S-ul minim se realizeaz pentru x=3.
Pe caz general, valorile posibile ale lui x, adic numerele ntregi care "ncadreaz"
numrul real p pe ax, sunt [p] ("parte ntreag din p") respectiv [p]+1. Acum
continuarea algoritmului a devenit banal:
dm mai nti unei variabile x1 valoarea [p] i calculm suma S1
|x1min|+|x1-max|+|x1-p|;
atribuim unei alte variabile x2 valoarea [p]+1 i calculm suma S2
|x2min|+|x2-max|+|x2-p| (aceeai sum, dar memorat n S2);
comparm ntre ele S1 i S2, pentru a vedea care sum e mai mic, adic n care
dintre cele dou cazuri privitoare la valorile posibile ale lui x ne ncadrm.
Evident, cu ocazia acestui test afim suma minim, precum i valoarea lui x
pentru care se realizeaz (adic x1 sau x2).
27

citete a,b,c;
min
a;
dac (b<=min) atunci
min
b;
dac (c<=min) atunci
min
c;
max
a;
dac (b>=max) atunci
max
b;
dac (c>=max) atunci
max
c;
p
(a+b+c)-(min+max);
x1
[p];
S1
|x1-min|+|x1-max|+|x1-p|;
x2
[p]+1;
S2
|x2-min|+|x2-max|+|x2-p|;
dac (S1<S2) atunci
scrie S1,x1;
altfel
scrie S2,x2;

R.II.8

V r s ta u ne i p e r so a n e

Se cunoate data naterii unei persoane, definit prin intermediul a trei


variabile, reprezentnd ziua, luna i anul naterii. Fiind cunoscut i data curent
exprimat sub aceeai form, s se afieze un mesaj din care s rezulte dac la data
curent persoana n cauz a mplinit x ani. n determinarea vrstei n ani mplinii
se va ine cont de cazurile expuse n exemplul urmtor.
Presupunem c data curent este 23.09.2002.
dac persoana s-a nscut n 25.08.1962, ea a mplinit 40 ani (cazul 1);
dac data naterii este 28.09.1962 (cazul 2) sau 26.11.1962
(cazul 3), persoana are doar 39 de ani mplinii.

Rezolvare
:

Citim succesiv de la tastatur: ziua, luna i anul naterii persoanei n variabilele zn,
ln, an, apoi ziua luna i anul datei curente n variabilele zc, lc, ac, i n sfrit valoarea lui x.
Memorm n variabila nr_ani numrul de ani mplinii de ctre persoana
respectiv. Mai nti calculm nr_ani ca diferena ntre anul datei curente i anul naterii
persoanei. La prima vedere pare a fi suficient. Dac de exemplu suntem n anul 2003 iar
persoana s-a nscut n 1963, spunem n mod simplist c ea are 40 de ani. n realitate apare
urmtoarea ntrebare: persoana a mplinit deja 40 de ani, sau urmeaz s-i mplineasc
pn la sfritul anului ? Rspunsul l gsim n cazurile particulare exemplificate n enun.
Astfel, vom micora nr_ani cu 1, dac:
luna naterii este mai mare dect luna curent (cazul 2), SAU
luna naterii este egal cu luna curent i ziua naterii este mai mare dect ziua
curent (cazul 3).
n final comparm numrul de ani mplinii cu x, afind un mesaj corespunztor.
28

citeste zn,ln,an;
citeste zc,ac,lc;
citeste x;
nr_ani
ac-an;
dac (ln>lc SAU (ln==lc SI zn>zc))
nr_ani
nr_ani-1;
dac (nr_ani>=x)
scrie "Persoana are ",x, " ani impliniti"
altfel
scrie "Persoana nu a implinit ",x, " ani";

Probleme propuse

Tema nr. T.R.1.

Probleme suplimentare
1. S se rezolve ecuaia de gradul I de forma ax+b=0, unde coeficienii
a i b se citesc de la tastatur. Se va trata i cazul particular a=0.
2. Se citete de la tastatur msura unui unghi x exprimat n grade. S se
verifice dac unghiul aparine primului cadran al cercului trigonometric
(0,900)), iar n caz afirmativ s se afieze msura sa exprimat n radiani.
(x
3. (Bacalaureat iulie 2008, varianta 99)

Scriei un algoritm care citete de la tastatur trei valori distincte notate cu


a, b i c, apoi afieaz una dintre urmtoarele valori:
1, dac a<b i b>c ;
2, dac a>b i b<c ;
3, dac b este cea mai mare dintre valori;
4, dac b este cea mai mic dintre valori;
5, n toate celelalte cazuri posibile.
4. S se verifice dac trei numere naturale date a, b i c sunt pitagorice
(adic dac verific una dintre condiiile a 2 =b 2 +c 2 , b 2 =a 2 +c 2 , c 2 =a 2 +b 2 ).
5. Se citete de la tastatur o liter. Se cere s se verifice dac ea
este vocal sau consoan (considerm alfabetul englez n care vocalele sunt
'a', 'e', 'i' , 'o', 'u').
6. S se verifice dac un numr natural dat este ptrat perfect, afinduse un mesaj corespunztor.
Indicaii. Un numr natural x este ptrat perfect dac radical din x este egal cu
parte ntreag din radical din x. Exemplu: Numrul 4 este ptrat perfect ( 4 = 2 i
4 = [2 ] = 2 ), iar 5 nu este ( 5 = 2.23...
5 = [2.23...] = 2 ).

[ ]

[ ]

29

7. Fiind date trei numere reale a, b i c citite de la tastatur, s se


afieze n ordine cresctoare.
8. Fiind date trei numere reale a, b i c citite de la tastatur, s se
afieze n ordine descresctoare.

Probleme de nota 10
9. Cunoscnd msurile a dou unghiuri exprimate n grade, minute i
secunde, s se alctuiasc un algoritm care afieaz msura unghiului sum
exprimat n acelai mod. Exemplu: 23 0 34'55''+22 0 33'20''=46 0 8''15''
Indicaii. tim c un minut are 60 de secunde i un grad are 60 de minute. Se
adun mai nti secundele, apoi minutele i n final gradele. Dac suma secundelor
depete 60, am obinut un minut care se propag ctre adunarea minutelor sub form
de "transport", iar ceea ce rmne peste 60 reprezint numrul de secunde ale
rezultatului. La fel se ntmpl i la adunarea minutelor, putnd aprea un grad
transport ctre suma gradelor. n exemplul din enun: 55''+20''=75'' adic 15'' i
un minut transport; 34'+33'+1'=68' adic 8' i un grad transport; 230+220+10=460.
10. Se citesc de la tastatur dou numere ntregi x i y. Scriei un

algoritm care calculeaz valoarea expresiei:


max (x , y ) , daca x 2 y 2 > 1
a) E (x , y ) =
min (x , y ) , in caz contrar

b) f(x ) = max x 2 + x , 4x 2

11. (Bacalaureat iulie 2008, varianta 44)

Se consider urmtorul ir de numere naturale:


1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 ...

Pentru o valoare natural n citit de la tastatur (0<n<10000), se cere s


se precizeze care este termenul cu numrul de ordine n n irul prezentat.
Exemplu: pentru n=12, al doisprezecelea termen din ir este 5.
12. Se citete de la tastatur un numr natural cu exact patru cifre. S se
determine cea mai mare dintre cifrele numrului.
Indicaii. Se extrage ultima cifr a numrului x, ca fiind restul mpririi lui x
la 10 (x%10). Apoi ctul obinut (x/10) se mparte din nou la 10, noul rest fiind
penultima cifr, etc. Presupunem iniial c ultima cifr este cea maxim, memornd-o
ntr-o variabil cmax. Pentru fiecare dintre celelalte cifre, dac este mai mare dect
cmax, atunci ea devine noua cifr maxim.
13. Se citete de la tastatur un numr natural x alctuit din exact ase
cifre. Realizai un algoritm care afieaz numrul rezultat prin citirea cifrelor pare
ale lui x, n ordine invers, de la dreapta la stnga (cifrele impare se vor ignora).
Exemplu: pentru x=253849, programul va trebui s memoreze n variabila
y numrul 482.
30

14. Fr a efectua ridicarea la putere, s se afieze ultima cifr a


numrului 2n, unde valoarea lui n se citete de la tastatur.
Indicaii: Calculnd 2 la diverse puteri consecutive, se observ c ultima lor
cifr se repet din 4 n 4, mai puin n cazul n care exponentul este 0. Deci, vom mpri
exponentul la 4, ultima cifr fiind 2,4,8 sau 6 n funcie de rest, respectiv 1 atunci cnd
exponentul este 0.
15. (Bacalaureat iulie 2008, varianta 14)

Scriei un program eficient din punctual de vedere al timpului de executare


i al spaiului de memorie folosit, care citete de la tastatur un numr natural n
(n<1000) i afieaz pe ecran al n-ulea termen al irului:
1,1,2,2,1,2,3,3,3,1,2,3,4,4,4,4,
Indicaii: Observm c termenii irului pot fi mprii n n grupe astfel:
(1),(1,2,2),(1,2,3,3,3),(1,2,3,4,4,4,4),
Grupa cu numrul de ordine k este alctuit din valorile 1,2,,k-1, urmate de
valoarea k repetat de k ori. Prima grup conine 0+1 elemente, a doua grup 1+2
elemente, a treia grup 2+3 elemente, .a.m.d.. Numrul total al elementelor din primele
k
grupe
este
1+(1+2)+(2+3)+(3+4)++((k-1)+k)=(1+2+3++k1)+1+2+3++k=k(k-1)/2+k(k+1)/2=k2. Cu aceste consideraii putei determina
foarte uor grupa din care face parte al n-ulea termen, precum i poziia lui n cadrul
respectivei grupe.

I I .3 .2 . S t r uc t ur a d e s el ec ti e mu lt ip l
Am vzut c prin intermediul
instruciunii de selecie "dac-atuncialtfel", putem alegem o secven de
instruciuni din dou posibile, n funcie de
valoarea de adevr a unei condiii. De multe
ori apare ns necesitatea de a alege o
secven din mai multe posibile. Aceast
alegere se va face n funcie de valoarea unei
expresii numit selector. n cele mai multe
cazuri expresia-selector este o variabil.
Valorile selectorului n funcie de
care alegem secvena se vor numi cazuri.
Aadar:
Linia alege (<selector>)
se traduce prin alege unul din
mai multe cazuri posibile, n
funcie de valoarea variabilei
(<selector>. n limbajul
C++,
numele
variabilei
selector trebuie scris ntre
31

alege (<selector>)
nceput
cazul <val_1>:
nceput
<secvena_1>
ieire
sfrit
cazul <val_2>:
nceput
<secvena_2>
ieire
sfrit
...................
cazul <val_n>:
nceput
<secvena_n>
ieire
sfrit
altfel
nceput
<secvena_0>
ieire
sfrit
sfrit

paranteze rotunde. Pentru a v obinui nc de pe acum cu aceast


regul de sintax, o vom adopta i n pseudocod;
Fiecare dintre simbolurile <val_1>, <val_2>, ... <val_n>, reprezint o
valoare posibil a selectorului <selector>, sau un set de valori ale
acestuia separate prin virgul. Astfel, de exemplu, linia
cazul <val_1>: se traduce prin cazul n care selectorul are
valoarea sau setul de valori simbolizat() prin <val_1>;
Fiecrui caz i corespunde o secven de instruciuni, iar calculatorul va
alege unul dintre cazuri executnd secvena aferent n funcie de
valoarea selectorului. Astfel, n cazul n care selectorul are valoarea /
se execut secvena de instruciuni
setul de valori <val_1>
<secvena_1>, dac selectorul are valoarea / setul de valori <val_2>
are loc execuia secvenei <secvena_2>, .a.m.d.. Observai c pe
fiecare ramur, dup secvena de instruciuni aferent, urmeaz
cuvntul cheie ieire. Acest fapt se datoreaz modului n care
funcioneaz instruciunea de selecie multipl n limbajul C++: n
absena instruciunii ieire, compilatorul ar trece la analizarea
urmtoarelor cazuri, fiind posibil ca n mod accidental valoarea pe
care o are selectorul n acel moment s determine i execuia altor
ramuri ale instruciunii de selecie multipl. n felul acesta ar fi alterat
sensul instruciunii de selecie multipl, acela de a alege un singur caz
din mai multe posibile. Prezena cuvntului-cheie ieire la sfritul
fiecruia dintre cazuri, va determina compilatorul s abandoneze
complet instruciunea de selecie multipl dup execuia secvenei de
instruciuni aferent cazului selectat. Evident, tot corpul fiecrei
ramuri trebuie cuprins ntre cuvintele cheie nceput si sfrit
(chiar dac secvena de instruciuni aferent ramurii este alctui
dintr-o singur instruciune, mpreun cu instruciunea ieire sunt
deja dou instruciuni !);
Pe lng "ramurile" ce descriu cazurile, mai poate exista o ramur numit
"altfel". Aceasta se va executa dac valoarea selectorului nu este
cuprins n nici unul dintre cazurile anterioare <val_1>, <val_2>, ...,
<val_n>. Menionm ns c prezena ramurii "altfel" nu este
obligatorie, situaie n care dac nu este ndeplinit nici unul din cazurile
date, pur i simplu nu se va executa nimic.
ntreaga instruciune de selecie multipl trebuie s se ncheie cu cuvntul
"sfrit".

Ex e mp l u :
citete x;
alege x dintre
-1: y
x+2;
0: nceput
scrie "Ati introdus 0";

32

y
x;
sfrit
1: y
x-1;
altfel
nceput
scrie "Nu e -1,0,1 ";
y
100;
sfrit
sfrit
scrie y;

Se citete de la tastatur valoarea variabilei x, care este selectorul unei instruciuni


de selecie multiple. n funcie de valoarea citit a lui x, se alege unul din cele patru cazuri:
x+2 ;
dac s-a citit x=-1, atunci se face atribuirea y
dac s-a citit x=0, atunci se execut o secven de dou instruciuni cuprins ntre
x.
cuvintele "nceput" i "sfrit": afiarea unui mesaj i atribuirea y
dac s-a citit x=1, atunci are loc atribuirea y
x-1 ;
n sfrit, dac valoarea citit a lui x este diferit de -1,0,1, atunci se intr pe
ramura "altfel", care conine o instruciune de afiare i atribuirea
y
100 .
Dup cuvntul "sfrit" care marcheaz ncheierea instruciunii de selecie
multipl, urmeaz afiarea variabilei y.

Aplicaie

R.II.9. Alegere

S se alctuiasc un program care citete dou numere reale a i b, apoi


afieaz media aritmetic, suma ptratelor sau suma cuburilor celor dou numere,
n funcie de dorina utilizatorului.

Rezolvare
:

 Fie o variabil de selecie opt, n funcie de valoarea creia calculatorul va


alege opiunea utilizatorului. Anumite valori ale variabilei de selecie corespund aciunilor
posibile. Facem convenia c aceste valori sunt 1,2,3 (evident pot fi alese orice valori).
 Citim de la tastatur numerele a, b i valoarea variabilei opt. Apoi, cerem
calculatorului s testeze valoarea lui opt ntr-o instruciune de selecie multipl i s
aleag n funcie de aceast valoare aciunea pe care o va executa n continuare:
dac opt a primit valoarea 1 va calcula i va afia media aritmetic;
dac valoarea citit a lui opt a fost 2, va calcula suma ptratelor celor dou numere;
pentru opt=3 va afla suma cuburilor;
pentru orice alt valoare a lui opt n afar de 1,2,3, va tipri un mesaj de eroare
(aceasta este ramura "altfel" a instruciunii de selecie).
 Pentru fiecare dintre cele trei mrimi calculate, exist dou posibiliti:
s o memorm prin atribuire ntr-o variabil i apoi s afim variabila;
s o afim direct ca expresie.
33

citete a,b;
citete opt;
alege opt dintre
1: nceput
ma
(a+b)/2;
scrie ma;
sfrit
2: nceput
sp
a*a+b*b;
scrie sp;
sfrit
3: nceput
sc
a*a*a+b*b*b;
scrie sc;
sfrit
altfel scrie 'Eroare';
sfrit

citete a,b;
citete opt;
alege opt dintre
1: scrie (a+b)/2;
2: scrie a*a+b*b;
3: scrie a*a*a+b*b*b
altfel
scrie 'Eroare';
sfrit

ncercai singuri ! - Tema nr. T.9.


1. Scriei un algoritm care, n funcie de dorina utilizatorului, calculeaz
i afieaz: aria unui ptrat de latur L, sau aria unui cerc de raz r, sau aria unui
triunghi cu baza b i nlimea h.

Aprofundare
Probleme propuse

Tema nr. T.R.2.

Probleme suplimentare
1. Se citete de la tastatur un numr reprezentnd o zi calendaristic
dintr-o lun oarecare. S se afieze decada creia i aparine ziua.
2. Se citete de la tastatur o cifr ntre 1 i 7 reprezentnd o zi din
sptmn. S se afieze denumirea zilei. Zilele sptmnii sunt numerotate astfel:
1
luni, 2
mari, ..., 7
duminic.
3. Scriei un program care simuleaz funcionarea unui calculator de
buzunar: calculatorul "va citi" dou numere reale i unul din caracterele '+', '-', '*',
'/' reprezentnd operaiile aritmetice fundamentale, va efectua operaia dat de
caracterul citit, folosind drept operanzi numerele citite i va tipri rezultatul.
34

4. O persoan dorete s fac o excursie n Grecia, pe litoralul Mrii


Mediterane, prin intermediul unei agenii de turism. Preul excursiei variaz n
funcie de sezon, astfel: 150 Euro ntre 22 decembrie i 20 martie, 200 Euro ntre
21 martie i 20 iunie, 300 Euro ntre 21 iunie i 10 septembrie, i 250 Euro ntre
11 septembrie i 21 decembrie. Cunoscnd data pe care o alege persoana pentru a
pleca n excursia respectiv (citit de la tastatur prin intermediul a dou variabile
reprezentnd ziua i luna), s se afieze preul excursiei.

II . 4 . S t ru c tu r i re pe t i ti ve
I I .4 .1 . St r uc tur a r e pet itiv c u te s t inii a l

Aa cum n matematic o problem poate avea mai multe rezolvri, la fel


un algoritm poate fi proiectat n mai multe moduri. Apare aici urmtoarea
ntrebare: care dintre algoritmii aceleai probleme este mai eficient ?
S lum ca exemplu urmtoarea problem:

Exemplu: Se citesc trei numere ntregi. S se afieze suma lor.


Algoritmul este foarte simplu. Citim de la tastatur trei numere ntregi x, y, z,
apoi calculm suma lor S=x+y+z.
citete x,y,z;
S
x+y+z;
scrie S;

Pe ct de simplu, pe att de ineficient, din cauza ... risipei de variabile. Nu


exist alt soluie ? Ba da, ntruct enunul problemei nu ne oblig s adunm toate
numerele "deodat". Putem s le adunm pe rnd. Cum anume ? Citindu-le pe rnd
n aceeai variabil x i adugndu-le tot pe rnd la S.

Exemplu: S presupunem c cele trei numere sunt 11, 12, 13.


Atribuim lui S valoarea 0. Aceasta va fi valoarea iniial a lui S;
Citim primul numr 11 n variabila x, apoi l adugm la valoarea iniial a lui S. Cum
facem acest lucru ? Printr-o atribuire care la prima vedere s-ar putea s vi se par
foarte ciudat: S
S+x;
Vom spune: "adaug valoarea lui x la valoarea pe care o are S n acel moment i
memoreaz rezultatul tot n S", sau "noul S va fi egal cu vechiul S plus x".
avem S
S+x , adic S=0+11, S=11.
Citim al doilea numr 12 tot n variabila x, apoi l adugm la valoarea curent a lui S,
S+x . Se va obine S=11+12, adic S=23, care este tocmai
tot prin atribuirea S
suma primelor dou numere.
35

n continuare procedm analog:


S+x , deci S=23+13, S=36
citete x=13, apoi S
Aceast ultim valoare a lui S este chiar suma cerut, pe care o afim.
S
0;
citete x;
S
S+x;
citete x;
S
S+x;
citete x;
S
S+x;
scrie S;

Cu numai dou variabile am obinut un algoritm mult mai eficient din


acest punct de vedere, dar n care se poate observa cu uurin un alt inconvenient:
aceeai secven de dou instruciuni, alctuit din {citeste x;} i {S
S+x;}
se repet de trei ori ! Imaginai-v c dac avem de calculat suma a 100 de
numere, suntem nevoii s scriem aceeai secven de o sut de ori, ceea ce,
trebuie s recunoatei, nu e tocmai plcut. Care e soluia?
Vom proiecta o structur n care scriem secvena respectiv o singur dat
i comandm execuia ei de cte ori dorim. O astfel de structur se numete
structur repetitiv sau ciclu.

Exemplu:
Revenind la problema anterioar, cum putem proiecta un ciclu n care secvena de
instruciuni {citete x; S S+x;}, scris o singur dat, s se execute de trei ori ? n
primul rnd avem nevoie de o variabil, notat n continuare cu i, care s numere
execuiile. Mai exact, valoarea lui i va indica la a cta execuie a secvenei ne aflm.
Astfel, iniial, la prima execuie valoarea lui i va fi 1, apoi la a doua execuie va fi 2 i n
sfrit la a treia execuie vom avea i=3.
Fiecare execuie a secvenei va constitui un pas al ciclului. Dar la sfritul
fiecrui pas al ciclului, dup execuia celor dou instruciuni din secven, calculatorul
trebuie s mai fac nc ceva. Ce anume ? S mreasc cu 1 valoarea lui i pentru a marca
faptul c urmeaz s treac la pasul urmtor. Cum are loc mrirea valorii lui i cu 1 ? Prin
i+1 . Dei comparativ cu ceea ce tii din matematic aceast atribuire pare o
atribuirea i
ciudenie, ea este nu numai corect ci i foarte des folosit. O traducem astfel: "mrete
valoarea curent a lui i cu 1, i memoreaz rezultatul tot n i". Astfel, de exemplu, iniial
i=1, apoi la finele primului pas, prin execuia atribuirii i
i+1 se va obine i=i+1 adic
i=2 , apoi dup al doilea pas vom avea i=2+1 adic i=3 , .a.m.d. Operaia se numete
incrementarea lui i cu 1.
Am lmurit aadar faptul c la fiecare pas al ciclului se vor executa trei
instruciuni: cele dou instruciuni ale secvenei care trebuie s se repete, plus
incrementarea lui i.
citete x;
S
S+x;
i
i+1;

Prin urmare, plecnd de la valoarea iniial 1, contorul i se mrete la fiecare pas


36

cu o unitate. Dar acest lucru se va petrece la infinit ? Nu ! Procesul trebuie s se opreasc


n momentul n care variabila i a ajuns la valoarea 3, pentru c s-au "consumat" exact trei
execuii ale secvenei. Altfel spus, ciclul se execut ct timp valoarea lui i este mai mic
sau egal cu 3. Aceasta este aa-numita condiie de continuare a ciclului. n
pseudocod ea se scrie astfel:
ct timp (i<=3) execut

Din dorina de a respecta o cerin a limbajului C++ n materie de sintax, n


pseudocod vom scrie ntre paranteze expresia logic aferent condiiei din linia ct
timp (n cazul nostrum i<=3).
Dup aceast linie trebuie s urmeze firete corpul ciclului, adic secvena de
instruciuni care se execut la fiecare pas. Respectnd convenia de la instruciunile de
selecie, vom cuprinde corpul ciclului ntre cuvintele "nceput" i "sfrit" deoarece
conine mai mult de o instruciune. Dup cuvntul "sfrit" care marcheaz ncheierea
ciclului, mai urmeaz o singur instruciune, afiarea valorii finale a lui S.
Prin urmare pseudocodul acestei probleme poate fi scris n felul urmtor:
S
0;
i
1;
ct timp (i<=3) execut
nceput
citete x;
S
S+x;
i
i+1;
sfrit
scrie S;

Ca o sistematizare a ceea ce am prezentat pn acum, s urmrim paii ciclului,


presupunnd c cele trei numere citite de la tastatur pe rnd n variabila x sunt 11, 12, 13.
Iniial, S
0 i i
1;
Pas 1: i<=3 ? 1<=3 ? da
citete x=11; S
S+x , S=0+11=11; i
i+1 , i=1+1=2.
Pasul 2: i<=3 ? 2<=3 ? da
citete x=12; S
S+x , S=11+12=23; i
i+1 , i=2+1=3.
Pasul 3: i<=3 ? 3<=3 ? da
citete x=13; S
S+x , S=23+13=36, i
i+1 , i=3+1=4.
Pasul 4: i<=4 ? 4<=3 ? nu iese din ciclu
scrie S scrie 36.
Observai c practic ciclul a avut trei pai, deoarece corpul su s-a executat de
numai trei ori. La pasul al patrulea condiia "i<=3" a devenit fals, fapt care determin
ieirea din ciclu.
Atribuirea S
0 dinaintea ciclului se numete iniializarea lui S i este foarte
important. Dup cum ai vzut, la fiecare pas valoarea lui S se actualizeaz prin atribuirea
S
S+x , care se citete "noul S va fi vechiul S plus x". La fiecare pas ncepnd cu al
doilea, "vechiul S" este tocmai S-ul obinut la pasul anterior. Dar la primul pas nu putem
vorbi de "pasul anterior" ! Din acest motiv iniializarea lui S cu 0 naintea ciclului este
obligatorie, pentru a exista "vechiul S" la primul pas.
37

Desigur c algoritmul va funciona i dac n condiia din linia "ct


timp" n loc de 3 avem 4, 5, 6, sau orice alt valoare. Astfel, pornind de la
exemplul anterior, putem calcula suma a n numere, unde n poate lua orice valoare.

Exemplu:
S se calculeze suma a n numere naturale citite pe rnd de la tastatur
(unde n este cunoscut).
Ar trebui s fie clar faptul c, fa de pseudocodul prezentat anterior, apar doar
dou modificri: valoarea variabilei n trebuie citit de la tastatur naintea ciclului ct
timp (poate fi orict), iar ciclul se execut ct timp i<=n.
citete n; // citete numrul de numere n
S
0;
// iniializeaz cu 0 variabila S, care n final va fi suma celor n numere
i
1;
// contorul i numr paii ciclului; naintea primului pas iniializm i cu 1
ct timp (i<=n) execut
// ciclul se execut ct timp valoarea lui i este <=n
nceput
citete x;
// citete un numr n variabila x
S
S+x;
// adaug numrul citit x la suma S
i
i+1;
// incrementeaz contorul i, marcnd trecerea la pasul urmtor
sfrit
scrie S
// dup ieirea din ciclu, tiprete suma S a celor n numere

Mai notm faptul c ceea ce am prezentat pn acum se numete


structur repetitiv cu test iniial, sau ciclu cu test iniial, i c mai exist nc

dou tipuri de structure repetitive, pe care le vei nva ceva mai trziu.

Sintaxa: unui ciclu cu test iniial:


unde <expr> este o condiie
(expresie logic), iar <secv> este o
secven format dintr-una sau mai
multe instruciuni, numit
corpul
ciclului.

ct timp (<expr>) execut


<secv>

Principiul de funcionare:
Atta timp ct este ndeplinit condiia dat de <expr> (ct timp
expresia
<expr> are valoarea 1, corespunztoare valorii de adevr
ADEVRAT), execut corpul ciclului <secv>:
1) se evalueaz expresia logic <expr>
2) dac aceasta are valoarea 1, atunci se execut secvena <secv>, apoi
se revine la pasul 1) (ntre timp valoarea expresiei <expr> s-a putut
modifica);
n caz contrar se trece la instruciunea de dup ciclu.

Observaii:
Respectnd regula de sintax a limbajului C++, vom scrie ntre
paranteze rotunde expresia logic <expr> din linia ct timp;
38

n cazul n care corpul ciclului conine cel puin dou instruciuni,


acesta va fi cuprins ntre cuvintele "nceput" i "sfrit".
Testarea condiiei are loc la nceput, deci corpul ciclului poate s nu se
execute niciodat.

Alg ori tmi cu s t ruc tur i re pet it ive cu t es t ini ial


Sume i produse cu n termeni

Aplicaie

R.II.10. Produs de numere naturale impare

Scriei pseudocodul unui algoritm care calculeaz produsul numerelor


naturale impare mai mici sau egale dect o valoare n dat.
Exemplu: pentru n=8 rezult P=1357=105, pentru n=9 se va calcula
P=13579=945.

Rezolvare
:

 Citim valoarea lui n de la tastatur. Calculm produsul ntr-un ciclu cu test


iniial, folosind o variabil i, ale crei valori sunt pe rnd termenii sumei, 1,3,5,...
1 (prima valoare impar), P
1;
Iniial i
n:
Atta timp ct i
nmulete un termen cu produsul P al numerelor impare, i anume valoarea curent a lui i
P i , adic "noul P este vechiul P nmulit cu i");
(P
i+2 ).
variabila i ia urmtoarea valoare impar (i
Pentru a exista "vechiul P" la execuia primului pas al ciclului, variabila P trebuie
iniializat cu o valoare nainte de ciclu. Valoarea iniial a lui P este 1, ca s nu
influeneze rezultatul nmulirii de la primul pas, tiut fiind faptul c nmulirea cu 1 nu
P*i , P=1*1=1}.
modific rezultatul {P
citete n;
P
1;
i
1;
ct timp (i<=n) execut
nceput
P
P*i;
i
i+2;
sfrit
scrie P;

Pas 1:
Pas 2:
Pas 3:
Pas 4:
Pas 5:

Presupunem c s-a citit n=8. Iniial P


1 i i
1. Urmrim paii ciclului:
1<=8 da P
P*i , P=1*1=1
i
i+2 , i=1+2=3
3<=8 da P
P*i , P=1*3=3
i
i+2 , i=3+2=5
5<=8 da P
P*i , P=3*5=15
i
i+2 , i=5+2=7
7<=8 da P
P*i , P=15*7=105 i
i+2 , i=7+2=9
9<=8 nu iese din ciclu
Dup ieirea din ciclu, afieaz ultima valoare a lui P, adic P=105.
39

i<=n ?
i<=n ?
i<=n ?
i<=n ?
i<=n ?

ncercai singuri ! - Tema nr. T.10.


Scriei cte un algoritm, care, pentru o valoare a lui n citit de la tastatur,
rezolv fiecare dintre cerinele de mai jos:
1. Calculeaz suma numerelor naturale impare mai mici sau egale dect
n. Exemplu: Pentru n=9 S=1+3+5+7+9.
2. Afieaz numerele naturale divizibile cu 3 mai mici sau egale dect
n. Exemplu: Pentru n=7 se vor afia numerele 3 i 6.
3. Calculeaz suma primelor n numere naturale impare,
S=1+3+5+...+(2n-1) (atenie, nu este acelai lucru cu suma numerelor naturale
impare mai mici sau egale dect n cerut la problema 1! ) Exemplu: Pentru n=9
S=1+3+5+7+9+11+13+15+17.
4. Calculeaz valoarea expresiei E=3-7+11+...+(-1)n+1 (4n-1).
Exemplu: Pentru n=5 E=3-7+11-15+19.

iruri de numere citite pe rnd

Problemele urmtoare realizeaz prelucrri ale unor iruri de numere


ntregi sau reale.
Prin ir de numere nelegem o succesiune de numere care respect o
anumit ordine. Numerele care alctuiesc irul se vor numi elementele irului.
ntruct nc nu ai nvat structurile de date care permit memorarea
simultan a tuturor elementelor unui ir, ne vom limita deocamdat la o modalitate
mai primitiv dar eficient de prelucrare a unui ir: elementele irului se citesc
pe rnd, n aceeai variabil, pn la ntlnirea unei anumite valori sau condiii
care marcheaz sfritul irului. Cei mai uzuali algoritmi sunt aceia n care se
opereaz asupra unui ir de numere a crui citire se ncheie cu valoarea zero (care
nu face parte din ir). Exist dou modaliti de citire a unui astfel de ir:
numerele se citesc pe rnd n aceeai variabil atta timp ct nu s-a
introdus valoarea 0;
numerele se citesc pe rnd n aceeai variabil pn la introducerea valorii 0.

Algoritm Numere citite pe rnd ct timp nu s-a ntlnit valoarea 0


Numerele se citesc pe rnd, n aceeai variabil x, primul separat i celelalte ntrun ciclu "ct timp". n ciclu: se prelucreaz primul numr x (citit naintea ciclului),
apoi se citete urmtorul numr tot n variabila x i se revine la nceputul ciclului; dac
noul numr x este diferit de zero se prelucreaz, apoi se citete urmtorul numr x,
.a.m.d., atta timp ct x nu este zero.
40

Primul numr se citete separat, ca s aib ce valoare s prelucreze la primul pas


al ciclului. Cnd ntlnete x=0 iese din ciclu i nu ajunge s prelucreze valoarea zero (care
nu face parte din ir).
Exemplu: Fie irul -2,3,0; citete x=-2
Pas 1: x0 ? 20 da
prelucreaz x=-2, citete x=3
Pas 2: x0 ? 30 da
prelucreaz x=3, citete x=0
Pas 3: x0 ? 00 nu STOP

citete x;
ct timp (x0) execut
nceput

<prelucreaz x>
citete x;
sfrit

n cazul n care primul numr introdus (cel citit naintea ciclului) este 0, condiia din
linia "ct timp" este fals nc de la prima testare, deci ciclul nu se va executa niciodat.

Aplicaie

R.II.11. Numrare n ir de numere a crui citire se termin cu 0

Se d un ir de numere care se citesc pe rnd de la tastatur, atta timp ct


nu s-a introdus valoarea 0 (care nu face parte din ir). S se afieze cte numere
pozitive sunt n ir.

Rezolvare
:

 V-ai dat seama desigur c este vorba tocmai despre algoritmul de citire a
unor numere pe rnd, n aceeai variabil x, atta timp ct nu s-a introdus valoarea zero.
Tot ceea ce mai trebuie este s stabilim n ce const prelucrarea fiecrui x citit, la fiecare
pas al ciclului.
Problema cere s se numere cte dintre elementele citite sunt pozitive. Pentru
aceasta vom folosi o variabil nr. Cum anume realizm efectiv numrarea folosind
algoritmul prezentat mai sus ?
Iniializm nr cu 0.
Citim separat primul element al irului, n variabila x;
ntr-un ciclu, ct timp x este diferit de zero:
 testm dac elementul x tocmai citit este pozitiv. n caz afirmativ, mrim cu
1 valoarea lui nr, prin atribuirea nr
nr+1 (marcnd astfel faptul c am
ntlnit nc un element pozitiv n plus fa de cte erau pn n acel
moment). Aceasta este aciunea pe care am denumit-o generic "prelucreaz
x ";
 citim urmtorul element al irului, tot n variabila x.
Pseudocodul complet este urmtorul:
citete x;
nr
0;
ct timp (x0) execut
nceput
dac (x>0) atunci
nr
nr+1;
citete x;
sfrit
scrie nr;

41

ncercai singuri ! - Tema nr. T.11.


1. Se citesc de la tastatur pe rnd numerele unui ir, atta timp ct nu
s-a introdus valoarea 0 (aceasta nu face parte din ir). S se calculeze suma
elementelor pozitive i suma elementelor negative din ir.
Exemplu: pentru irul (-2,8,25,7,-3,9,0), se vor afia valorile 49 i 5.
2. Se citesc de la tastatur n numere naturale. Realizai un algoritm care

calculeaz media aritmetic a elementelor impare din ir.


Exemplu: pentru irul (-2,8,25,7,-3,9,0), rezultatul cerut este
(25+7+9+(-3))/4, adic 9.25.

Aplicaie

R.II.12. Maxim ntr-un ir de numere


a crui citire se termin cu 0

Se d un ir de numere care se citesc pe rnd de la tastatur, atta timp ct


nu s-a introdus valoarea 0 (care nu face parte din ir). S se afieze maximul dintre
elementele irului.

Rezolvare
:

 Citirea numerelor pe rnd, n aceeai variabil x, ct timp nu s-a introdus


valoarea zero, are loc dup acelai algoritm pe care l-am prezentat nainte: citim separat
primul element al irului n variabila x; apoi, ntr-un ciclu, ct timp x este diferit de 0,
prelucrm x-ul curent i citim urmtorul element tot n x. Folosim o variabil max, n care
actualizm permanent maximul.
n detaliu, algoritmul se desfoar astfel:
Citim separat primul element al irului, n variabila x;
Iniializm maximul max cu primul element x citit nainte;
ntr-un ciclu, ct timp x este diferit de zero:
 dac elementul memorat n variabila x este mai mare dect maximul curent
(x>max), atunci respectivul element devine noul maxim, fapt care se
x;
marcheaz prin atribuirea max
 citim urmtorul element al irului, tot n variabila x.
Pseudocodul complet este urmtorul:
citete x;
max
x;
ct timp (x0) execut
nceput
dac (x>max) atunci
max
x
citete x;
sfrit
scrie max

42

x, max=-2;
Exemplu: Fie irul -2, 3, 7, 1, 0; citete x=-2; max
Pas 1: x0 ? -20 da
x>max ? -2>-2 nu; citete x=3
Pas 2: x0 ? 30 da
x>max ? 3>-2 da max
x, max=3;
citete x=7
Pas 3: x0 ? 70 da
x>max ? 7>3 da max
x, max=7;
citete x=1
Pas 4: x0 ? 10 da
x>max ? 1>7 nu; citete x=0
Pas 4: x0 ? 00 nu STOP
Observai c, actualiznd permanent variabila max n maniera descris, n final
valoarea acestei variabile va fi cel mai mare element din tot irul, adic 7. Algoritmul
efectueaz o operaie inutil: ntotdeauna, la primul pas se va compara maximul cu el nsui,
deci nu exist posibilitatea ca valoarea variabilei max s se modifice. Am preferat acest mic
inconvenient in favoarea unui algoritm foarte didactic i cu un caracter mare de generalitate.

ncercai singuri ! - Tema nr. T.12.


1. Modificai algoritmul din problema rezolvat anterioar, astfel nct
el s afieze minimul dintre elementele pare ale irului.
Exemplu: pentru irul (8,-2,25,7,-3,9,0), se va tipri valoarea -2.
2. Se d un ir de numere citite pe rnd de la tastatur, atta timp ct nu
s-a introdus valoarea 0 (care nu face parte din ir). Proiectai pseudocodul unui
algoritm care determin produsul ptratelor perfecte din ir. Reamintim: un numr
x este ptrat perfect dac este egal cu parte ntreag din radical din x.
Exemplu: pentru irul (45,25,147,9,111,1231,0), se va afia valoarea
225, reprezentnd produsul ptratelor perfecte 25 i 9.

Prelucrarea cifrelor unui numr natural

Algoritm Extragerea cifrelor unui numr natural


Cifrele unui numr pot fi extrase de la dreapta la stnga, cu un algoritm bazat pe
un ciclu de mpriri la 10. Iniial dempritul este chiar numrul. Se mparte dempritul
la 10 i restul este ultima cifr a numrului, iar ctul devine demprit pentru urmtoarea
mprire. Se mparte noul demprit la 10, restul este penultima cifra, ctul devine din
nou demprit, se mparte noul demprit la 10, .a.m.d.. Procesul se repet ntr-un ciclu,
atta timp ct dempritul este diferit de 0.
834 10
830 83
4

83 10
80 8
3

8 10
0 0
8

Reamintim:
ctul mpririi ntregi a lui x la y este x / y;
restul mpririi ntregi a lui x la y se noteaz x % y;
43

0 10

Prezentm n continuare o variant n care extragerea cifrelor se face ntr-o


structur repetitiv cu test iniial.
Folosim dou variabile, c i d: n c reinem fiecare cifr extras, iar n d
actualizm dempritul la fiecare mprire. Cum spuneam, iniial dempritul este chiar
x . ntr-un ciclu, ct timp dempritul d este diferit
numrul x, deci se face atribuirea d
de 0, la fiecare pas:
Extragem o cifr c, care este tocmai restul mpririi dempritului la 10
d%10 ).
(c
Prelucrm cifra extras c;
Ctul mpririi tocmai efectuate, adic [d/10], va deveni noul demprit d
[d/10]).
pentru mprirea urmtoare (d
citete x;
d
x;
ct timp (d0) execut
nceput
c
d%10;
<prelucreaz c >
d
d/10;
sfrit

Exemplu: S descriem ciclul pentru x=179. Iniial, S=0; d=x, d=179.


Pasul 1: d0 ? 1790 ? da execut corpul ciclului
c
d%10, c=179 % 10, c=9; <prelucreaz cifra 9>;
d
[d/10], d=[179/10], d=17
Pasul 2: d0 ? 170 ? da execut corpul ciclului
c
d%10, c=17%10, c=7;
<prelucreaz cifra 7>;
d
[d/10], d=[17/10], d=1
Pasul 3: d0 ? 10 ? da execut corpul ciclului
c
d % 10, c=1 % 10, c=1;
<prelucreaz cifra 1>;
d
[d/10], d=[1/10], d=0
Pasul 4: d0 ? 00 ? nu abandoneaz ciclul.

Aplicaie

R.II.13. Suma cifrelor unui numr

Realizai un algoritm care calculeaz suma cifrelor unui numr natural x


citit de la tastatur.

Rezolvare
:
 V-ai dat desigur seama c vom folosi algoritmul de extragere a cifrelor de
mai sus, bazat pe un ciclu de mpriri ale unui demprit d la 10 (iniial dempritul este
chiar numrul x). Prelucrarea cifrei c extras la fiecare pas const n adugarea ei la
suma S a cifrelor lui x (unde S se iniializeaz cu 0). Mai concret:
Citim de la tastatur numrul x, apoi facem iniializrile d
x i S
0;

44

ntr-un ciclu, ct timp d este diferit de 0, la fiecare pas:


d % 10).
 extragem o cifr c, ca fiind restul mpririi dempritului la 10 (c
S+c; )
 adugm cifra c la suma cifrelor S (S
 ctul mpririi tocmai efectuate, adic d div 10, va deveni noul demprit
d pentru mprirea urmtoare (d
[d/10] ).

 Mai facem meniunea c n loc de c


d%10 i S
S+c, putem scrie direct
S
S+d%10 (adic s nu mai memorm cifra ntr-o variabil c). Am preferat aceast
variant care pune n eviden mai bine procesul de "extragere" a cifrelor unui numr
natural. Astfel v va fi mai uor s concepei ali algoritmi pentru prelucrarea cifrelor unui
numr.
Prezentm n continuare pseudocodul n ambele variante.
citete x;
d
x;
S
0;
ct timp (d0)
nceput
c
d % 10;
S
S+c;
d
d / 10;
sfrit
scrie S;

citete x;
d
x;
S
0;
ct timp (d0)
nceput
S
S+d % 10;
d
d / 10;
sfrit
scrie S;

ncercai singuri ! - Tema nr. T.13.


1. Afiai cte cifre pare i cte cifre impare conine un numr natural x
(cu maxim 8 cifre), citit de la tastatur.
Exemplu: dac se citete x=2354877, programul va afia numerele 3 i 4.
2. Se citete de la tastatur un numr natural m. S se afieze cifra de
rang k dat (rangul unei cifre este numrul su de ordine, numerotnd cifrele de la
dreapta la stnga).
Exemplu: pentru m=452855 i k=3, se va afia valoarea 8.
3. Se citete de la tastatur un numr natural m. S se afieze cifra
maxim a numrului dat.
Exemplu: dac se citete x=2934985, programul va afia cifra 9.

Algoritm Formarea oglinditului unui numr natural


Pentru a determina oglinditul unui numr x, se aplic algoritmul de extragere a
cifrelor descris n problema anterioar. Formm oglinditul din "mers" ntr-o variabil y.
Iniializm oglinditul y cu 0, apoi, la fiecare pas al ciclului, extragem o cifr c i
actualizm oglinditul dup relaia y:=y*10+c.
45

d
x;
// iniial dempritul d este numrul
y
0;
// iniializm oglinditul y cu 0
ct timp (d0) execut
// ciclul se repet ct timp dempritul este diferit de 0
nceput
c
d % 10;
// extragem o cifra c, ca restul mpririi dempritului la 10
y
y*10+c;
// actualizm oglinditul cu cifra extras
d
d / 10;
sfrit
// ctul mpririi fcute va fi demprit la mprirea urmtoare

Exemplu: fie numrul 831


y=0; d=x=831
831:10 c=831%10=1, y=0*10+1=1,
y=1*10+3=13,
83:10 c=83%10=3,
y=13*10+8=138,
8:10 c=8%10=8,
0:10 stop

d=[831/10]=83
d=[83/10]=8
d=[8/10]=0

Am obinut oglinditul lui 831, care este 138.

Aplicaie

R.II.14. Palindroame mai mici sau egale cu n

Numim "oglinditul unui numr natural x", numrul obinut prin citirea
cifrelor lui x n ordine invers, de la dreapta la stnga. Exemplu: oglinditul lui
2435 este 5342. Numim palindrom un numr natural egal cu oglinditul su (citit
invers este acelai numr). Exemplu: numrul 232 este palindrom.
Se citete de la tastatur un numr natural n (n<=20000). S se afieze
toate palindroamele mai mici sau egale dect n.
Exemplu: pentru n=135, se vor afia numerele:
1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99,101,111,121,131

Rezolvare
:

Pentru nceput citim valoarea lui n, apoi iniializm cu 1 o variabil i n care vom
parcurge numerele naturale mai mici sau egale dect n, adic 1,2,...,n.
Ct timp i<=n:

determinm oglinditul lui i cu algoritmul de mai sus, memorndu-l n


variabila y;

verificm dac numrul i este palindrom, adic dac este egal cu oglinditul
su y; n caz afirmativ l afim;
variabila i ia ca valoare urmtorul numr natural, prin atribuirea i
i+1.
citete n;
i
1;
ct timp (i<=n) execut
nceput
d
i;
y
0;
ct timp (d0) execut
nceput

46

c
d % 10;
y
y*10+c;
d
[d/10];
sfrit
dac (y==i) atunci
scrie i;
i
i+1;
sfrit

ncercai singuri ! - Tema nr. T.14.


1. (Bacalaureat, iulie 2002, varianta 4)

Se citesc de la tastatur dou numere naturale a i b, fiecare numr avnd


cel mult trei cifre. S se afieze pe ecran, cte unul pe linie, toate numerele
naturale situate n intervalul nchis determinat de a i b care au suma cifrelor 15.
Exemplu: pentru a=83 i b=125 se vor afia pe ecran valorile 87 i 96.
2. Se d un ir de numere citite pe rnd de la tastatur, atta timp ct nu
s-a introdus valoarea 0 (care nu face parte din ir). S se afieze acele elemente ale
irului care au proprietatea c suma cifrelor lor este divizibil cu o valoare p dat,
precum i numrul respectivelor elemente.
Exemplu: pentru irul (45,25,147,9,111,1231,0), i p=3, algoritmul va tipri
elementele 45, 147, 111 i 9, precum i valoarea 4 ce reprezint numrul acestor elemente.

3. Se citete de la tastur un numr natural n cuprins ntre 100 i 999.


Dintre numerele naturale mai mici sau egale dect n, s se afieze acelea care sunt
divizibile cu suma cifrelor lor.
Exemplu: pentru n=25, se vor afia numerele:
1,2,3,4,5,6,7,8,9,10,12,18,20,21,24

Interpretarea unui pseudocod dat

Aplicaie

R.II.15. Pseudocod cu ir de numere

(Bacalaureat iulie 2009, varianta 77)

Se consider algoritmul alturat, n


care toate variabilele sunt de tip ntreg.
a) Scriei valoarea care se va afia
dac se citesc, n acest ordine, valorile: 2, 4,
6, 5, 7, 3, 9, 8, 0.
b) Scriei un ir de date de intrare
format din cel puin trei valori care s
determine afiarea valorii 0.
c) Formulai un enun scurt care s
descrie aciunea algoritmului.
47

citete a;
k 0;
ct timp (a0) execut
nceput
citete b;
dac (a < b ) atunci
k k +1;
a b;
sfrit
scrie k;

Rezolvare
:

a)
Prima valoare din irul (2,4,6,5,7,3,9,8,0) este cea care se va citi separat n
variabila a naintea ciclului, iar celelalte se vor citi n ciclu, succesiv, n aceeai variabil b.
S urmrim paii ciclului:
Iniial a=2 i k=0.
Pasul 1: a0 ? 20 ? da citete b=4
a<b ? 2<4 ? da k
k+1, k=0+1, k=1
a
b , a=4
Pasul 2: a0 ? 40 ? da citete b=6
a<b ? 4<6 ? da k
k+1, k=1+1, k=2
a
b , a=6
Pasul 3: a0 ? 60 ? da citete b=5
a<b ? 6<5 ? nu
a
b , a=5
Pasul 4: a0 ? 50 ? da citete b=7
a<b ? 5<7 ? da k
k+1, k=2+1, k=3
a
b , a=7
Mai departe credem c putem prezenta doar schematic ceea ce se ntmpl:
La pasul 5: citete b=3, nu modific pe k (pentru c "7<3 " este fals) i face a=3;
k+1 respectiv k=4, apoi a=9;
La pasul 6: citete b=9, face k
La pasul 7: citete b=8, nu modific pe k, iar a=8;
b rezult a=0.
La pasul 8: citete b=0, nu modific pe k, i n urma atribuirii a
Acum condiia "a0 " din linia "ct timp" este fals, deci va iei din ciclu.
Valoarea final a lui k, afiat n ncheierea algoritmului, este k=4.

pas:

c)
Algoritmul citete primul numr n variabila a, apoi, n cadrul ciclului, la fiecare

citete un alt numr n variabila b;


compar numrul citit b cu valoarea lui a, iar dac b>a incrementeaz un
contor k (iniializat cu 0); cum ns n a avem numrul citit anterior, rezult c la fiecare
pas se compar dou numere consecutiv citite, iar contorul se mrete n cazul n care al
doilea este mai mare dect primul;
salveaz numrul citit b n variabila (pentru c la pasul urmtor vom citi o alt
valoare n variabila a, i din nou vom avea nevoie de "precedentul" pentru comparaie.
Acum enunul care s descrie aciunea algoritmului este cum nu se poate mai clar.
l formulm n dou moduri:
1. "Se citete un ir de numere atta timp ct nu s-a introdus valoarea 0. Scriei
un algoritm care stabilete de cte ori se ntmpl s avem dou elemente consecutive ale
irului n ordine cresctoare".
2. "Se citete un ir de numere atta timp ct nu s-a introdus valoarea 0. S se
afieze numrul perechilor de elemente ale irului consecutiv citite, cu proprietatea c al
doilea element al perechii este mai mare dect primul".

48

b)
Cu subpunctul c) deja rezolvat, rspunsul la subpunctul b) nu ar trebui s mai dea
bti de cap. Pentru ca valoarea final a lui k (cea afiat) s rmn cea iniial (adic 0),
este necesar ca n irul ales s alterneze monotonia, adic s nu existe dou elemente
consecutiv citite cu proprietatea c al doilea este mai mare dect primul. Un exemplu de
astfel de ir este (2,7,5,0).

ncercai singuri ! - Tema nr. T.15.


1. (Bacalaureat iulie 2009, varianta 70)
Se consider algoritmul alturat, descris n pseudocod, n care toate
variabilele memoreaz numere naturale.
a) Scriei ce valori se vor afia dac pentru x se citete valoarea 19, iar
pentru y se citete valoarea 4.
b) Scriei o valoare care poate fi citit pentru variabila x i o valoare care
poate fi citit pentru variabila y astfel nct valorile afiate n urma executrii
algoritmului s fie 2 1, n aceast ordine.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
d) Scriei un algoritm echivalent cu cel dat care s nu foloseasc nici un
fel de structur repetitiv.
citete x,y
n0;
ct timp (x>=y) execut
nceput
x
x-y;
n
n+1;
sfrit
scrie n,x
2. (Bacalaureat iulie 2009, varianta 68)

Se consider algoritmul alturat, descris n pseudocod.


S-a notat cu x%y restul mpririi numrului natural x la numrul natural
nenul y i cu [z] partea ntreag a numrului real z.
a) Scriei valoarea afiat dac pentru n se citete valoarea 52381.
b) Scriei o valoare care poate fi citit pentru variabila n astfel nct s se
afieze numrul 0.
c) Dac variabila n primete ca valoare cel mai mare numr natural par de
trei cifre, stabilii cte atribuiri se execut n total pe parcursul rulrii algoritmului.
citete n;
z
0;
ct timp (n>0) execut
nceput
c
n%10;
49

n
[n/10];
dac (c<5) atunci
z
z*10+2*c;
sfrit
scrie z;
3. (Bacalaureat iulie 2009, varianta 25)

Se consider algoritmul alturat descris n pseudocod. S-a notat cu y|x


faptul c x este divizibil cu y.
a) Scriei care sunt valorile ce se vor afia pentru a=10, b=20 i c=6.
b) Gsii un set de valori pentru variabilele a, b i c, astfel nct
algoritmul s nu afieze nici o valoare.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
d) Scriei o formul care s calculeze cte numere se afieaz dac ab .
citete a,b,c;
dac (a>b) atunci
nceput
t
a; a
b; b
t;
sfrit
ct timp (a<=b) execut
nceput
dac (c|a) atunci
scrie a;
aa+1;
sfrit
4. (Bacalaureat iulie 2009, varianta 31)

Se consider algoritmul alturat, descris n pseudocod. S-a notat cu [x],


partea ntreag a numrului real x.
a) Scriei valorile care se vor afia pentru a=9.
b) Scriei numrul valorilor din intervalul [1,5] care, citite pentru
variabila a, determin, dup executarea algoritmului alturat, memorarea valorii 1
n variabila b.
c) Scriei n pseudocod un algoritm echivalent cu cel dat, n care s nu se
utilizeze structuri repetitive sau subprograme recursive.
citete a;
k
0;
b
[(a+1)*(a+2)/2];
ct timp (b>=a) execut
nceput
b
b-a;
k
k+1;
sfrit
scrie b,k;

50

Aplicaie

R.II.16. Pseudocod cu cifrele unui numr

(Bacalaureat iulie 2009, varianta 88)


Pentru pseudocodul dat, n care a este un numr natural i toate celelalte

variabile sunt de tip ntreg, se cere:


a) Scriei numrul care se va afia dac se citete valoarea 123456;
b) Dai un exemplu de o valoare care poate fi citit n variabila a, astfel
nct structura repetitiv "ct timp" s aib exact trei pai.
c) Scriei o valoare cu exact cinci cifre care poate fi citit n variabila a,
astfel nct numrul afiat s fie cel format din toate cifrele lui a luate n ordine
invers;
d) Cte numere cu exact dou cifre ar putea constitui valori ale variabilei
de intrare a, astfel nct n urma executrii algoritmului s se afieze valoarea
citit de la tastatur ?
e) Formulai un enun scurt care s descrie aciunea algoritmului dat.
Notaii: x%y = restul mpririi lui x la y, i [x/y] = ctul mpririi lui x la y.
citete a;
p1;
b0;
ct timp (a 0 ) execut
nceput
ca%10;
dac (a % 2 = = 0 ) atunci
b b+c*p;
altfel
b b *10+c;
a a /10;
p p *10;
sfrit
scrie b;

Rezolvare
:

a)
Pentru a deduce valoarea afiat n cazul n care se citete numrul a=123456,
vom urmri pas cu pas evoluia ciclului "ct timp".
Plecm de la valorile iniale a=123456, p=1 i b=0.
Pasul 1: a0 ? da (pentru c 123456 este diferit de zero)
c
a%10 c=123456%10 , c=6 (restul mpririi la 10)
a%2==0 ? 123456%2==0 ? da b
b+c*p, b=0+6*1, b=6
p
p*10, p=1*10, p=10
a
[a/10] , a=[123456/10] , a=12345
Pasul 2: a0 ? da c=12345%10=5
12345%2==0 ? nu b=6*10+5=65
p=10*10=100 i a=[12345/10]=1234
51

Pasul 3: a0 ? da c=1234%10=4
1234%2==0 ? da b=65+4*100=465
p=100*10=1000 i a=[1234/10]=123
Pasul 4: a0 ? da c=123%10=3
123%2==0 ? nu b=465*10+3=4653
p=1000*10=10000 i a=[123/10]=12
Pasul 5: a0 ? da c=12%10=2
12%2==0 ? da b=4653+2*10000=24653
p=10000*10=100000 i a=[12/10]=1
Pasul 6: a0 ? da c=1%10=1
1%2==0 ? nu b=24653*10+1=246531
p=100000*10=1000000 i a=[1/10]=0
Pasul 7: a0 ? nu iese din ciclu
Aadar, dac s-a citit valoarea a=123456, algoritmul va afia numrul 246531.
e)
Algoritmul construiete numrul format din cifrele pare a numrului a luate de la
stnga la dreapta, urmate de cifrele impare ale lui a luate invers, de la dreapta la stnga.
Am rspuns mai nti subpunctului e), pentru c odat ce v-ai dat seama care este
aciunea algoritmului, v va fi mult mai uor s nelegei rezolvarea celorlalte subpuncte.
b)
Observm c:
la nceputul structurii repetitive "ct timp" se extrage n variabila c o cifr a
a%10);
numrului a, ca fiind restul mpririi lui a la 10 (c
la sfritul aceleai structuri, n variabila a se actualizeaz ctul mpririi
"vechiului a" la 10, pentru a pregti extragerea cifrei urmtoare (a
a/10).
Prin urmare, ciclul "ct timp" va avea atia pai cte cifre are numrul a. Deci,
pentru a se executa trei pai, putem citi n variabila a orice numr de trei cifre.
c)
Aa cum a rezultat din deducerea de la primul subpunct, doar cifrele impare ale
numrului a sunt luate n ordine invers, n vreme ce cele pare sunt abordate n ordine
natural. n consecin, pentru a obine la final un numr care s conin doar cifre de-ale
lui a luate n ordine invers, este necesar ca numrul a s fie alctuit numai din cifre
impare. Orice valoare impar cu cinci cifre constituie un rspuns corect al acestei cerine.
d)
Aa cum am subliniat deja, algoritmul extrage cifrele pare ale lui a n ordine
natural, de la stnga la dreapta. Deci, pentru a se obine la ieire exact valoarea numrului
memorat n a, este necesar ca acesta s conin numai cifre pare. n continuare, nu mai
trebuie altceva dect s aflm cte numere de dou cifre care conin doar cifre pare exist.
tiind c numerele de dou cifre sunt cele cuprinse ntre 10 i 99 inclusiv, mprim
domeniul lor n zece sub-intervale: [10,19], [20,29], ... [90,99]. Dintre acestea,
pic din start numerele cuprinse n subintervalele [10,19], [30,39], [50,59], [70,79]
i [90,99], deoarece prima lor cifr este impar. Au rmas cinci subintervale, cele cu
prima cifr par, din care trebuie alese doar numerele care au i a doua cifr par. Acestea
sunt n mod evident valorile pare din respectivele sub-intervale, n numr de cinci pentru
52

fiecare sub-interval. De exemplu, n subintervalul [20,29] avem cinci valori care conin
ambele cifre pare, i anume 20, 22, 24, 26 i 28. Cum avem cinci sub-intervale ori cinci
numere fiecare, rezult c n total sunt 25 de valori care ndeplinesc cerina acestui
subpunct.

ncercai singuri ! - Tema nr. T.16.


1. (Bacalaureat iulie 2009, varianta 45)

Se consider algoritmul alturat, descris n pseudocod. S-a notat cu x%z


restul mpririi numrului natural x la numrul natural nenul z.
a) Scriei valoarea care va fi afiat de algoritm dac se citesc, n aceast
ordine, valorile 12 i 3.
b) Dac valoarea citit pentru variabila y este 19, scriei care este cea mai
mare valoare care trebuie citit pentru x, astfel nct algoritmul s afieze numrul 0.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
citete x,y;
z1;
t
0;
ct timp (x>=z) execut
nceput
dac (x%z==y) atunci
tz;
zz+1;
sfrit
scrie t;
2. (Bacalaureat iulie 2009, varianta 79)
Se consider algoritmul alturat, reprezentat n pseudocod. S-a notat cu
x|y relaia x divide pe y sau y este divizibil cu x i cu [z] partea ntreag a
numrului real z.
a) Scriei valoarea care se va afia dac se citete numrul 245.
b) Scriei o valoare care poate fi citit pentru variabila a astfel nct s se

afieze o valoare egal cu cea citit.


c) Formulai un enun scurt care s descrie aciunea algoritmului.
citete a;
x
2;
k
0;
ct timp (a>1) execut
nceput
c0;
ct timp (x|a) execut
nceput
c
x;
a
[a/x];
sfrit
53

dac (c0) atunci


k
k+x;
x
x+1;
sfrit
scrie k;
3. (Bacalaureat iulie 2009, varianta 89)

Se consider algoritmul alturat, descris n pseudocod. S-a notat cu x%y


restul mpririi numrului natural x la numrul natural nenul y, iar cu [z] partea
ntreag a numrului real z.
a) Scriei numrul care se va afia dac se citete numrul n=3072941.
b) Scriei un numr format din exact 5 cifre, ele fiind n ordine strict
cresctoare, care poate fi citit astfel nct executarea algoritmului s determine
afiarea unui numr egal cu cel citit.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
citete n
t
n;
r
0;
ct timp (t>0) execut
nceput
dac ((t%10)%2==1) atunci
r
r*10+1;
altfel
r
r*10+t%10;
t
[t/10];
sfrit
n
0;
ct timp (r>0) execut
nceput
n
n*10+r%10;
r
[r/10];
sfrit
scrie n;

Ai neles ?

Probleme cu rspuns scurt

Urmtoarele dou probleme se refer la secvena de program de mai jos, n care


toate variabilele memoreaz numere naturale.
citete n;
S
0; k
1;
ct timp k<=n execut
nceput
S
S+k;
k
k+2;
sfrit
scrie S;

54

1. Cte valori poate primi variabila n, astfel nct, n timpul execuiei secvenei
s aib loc cu totul opt atribuiri ?
2. (Bacalaureat iulie 2008, varianta 11)

Ce reprezint rezultatul afiat n urma execuiei secvenei ?


a) suma numerelor naturale impare mai mici dect n;
b) suma numerelor naturale pare mai mici dect n;
c) suma numerelor naturale impare mai mici sau egale cu n;
d) suma numerelor naturale pare mai mici sau egale cu n.
3. (Bacalaureat iulie 2008, varianta 34)

n secvena de program de mai jos, ce valoare ar trebui scris n loc de "...", astfel
nct, n urma execuiei, s se afieze valoarea 165 ?
i
3; E
1;
ct timp (i<...) execut
nceput
dac (i%20) atunci
E
E+i*i;
i
i+1;
sfrit
scrie E ;
a) 8

b) 9

c) 10

d) 12

Urmtoarele trei probleme se refer la secvena de program de mai jos, n care


toate variabilele memoreaz numere naturale.
citete x,y;
x
x % 10;
y
y % 10;
dac (y<x) atunci
nceput
aux
...;
y
...;
x
...;
sfrit;
ct timp x<=y execut
nceput
scrie x*10+y;
x
x+1;
y
y+1;
sfrit;

4. Precizai ce identificatori de variabile trebuie scrii, n ordine, n locul celor


trei apariii ale simbolului "...", astfel nct instruciunea de selecie de tipul "dacatunci" s realizeze interschimbarea valorilor variabilelor x i y ntre ele.
a) x,aux,y
c) y,x,aux

b) y,aux,x
d) x,y,aux

5. (Bacalaureat iulie 2009, varianta 34)

Scriei care sunt numerele afiate, dac de la tastatur se citesc valorile x=248 i y=203.
6. (Bacalaureat iulie 2009, varianta 34)

Gsii un set de valori care ar putea fi citite n variabilele x i y, astfel nct prin
execuia secvenei date s se afieze exact cinci numere.
55

Algoritmi cu divizori i factori primi

Algoritm

Cel mai mare divizor comun a dou numere


- algoritmul lui Euclid cu diferene -

Exist dou variante ale algoritmului lui Euclid pentru determinarea celui mai
mare divizor comun a dou numere naturale: cu diferene, respectiv cu resturi. n
continuare v vom prezenta algoritmul lui Euclid cu diferene, urmnd ca n subcapitolul
"Structura repetitiv cu test final" s facei cunotin i cu algoritmul bazat pe resturi.

 Algoritmul lui Euclid cu diferene se


bazeaz pe scderi care se repet ntr-un ciclu. La
fiecare pas, se modific prin aceste scderi, fie a, fie
b . Dac a>b se modific a prin scderea a
a-b, iar
dac a<b se modific b prin scderea b
b-a . Cnd
cele dou numere a i b au devenit egale se oprete
ciclul, obinndu-se cel mai mare divizor comun care
este a (sau b). Deci ciclul se repet ct timp a este
diferit de b.

Pas 1:
Pas 2:
Pas 3:
Pas 4:

Exemplu:
Fie a=15; b=6;
ab ? 15
6 ? da
ab ? 9
6 ? da
ab ? 3
6 ? da
ab ? 3
3 ? nu

citete a,b;
ct timp (ab) execut
dac (a>b) atunci
a
a-b;
altfel
b
b-a;

a>b ? 15>6 ? da a
a-b a=15-6,a=9;
a>b ? 9>6 ? da a
a-b a=9-6, a=3;
a>b ? 3>6 ? nu b
b-a b=6-3, b=3;

iese din ciclu

C.m.m.d.c(a,b)=a=b=3

Observaie: Algoritmul prezentat mai sus nu va funciona dac cel puin unul din
numere este negativ sau zero. Pentru a evita aceste dou cazuri, poate fi pus condiia
>0) I (b>
>0)".
suplimentar "(a>

Aplicaie

R.II.17. Fracie zecimal

(Bacalaureat iulie 2009, varianta 25, enun adaptat)


Se citete de la tastatur un numr real pozitiv x, care are cel mult dou cifre

n partea ntreag i cel mult apte cifre dup punctul zecimal. Scriei un program care,
utiliznd un algoritm eficient din punctul de vedere al memoriei utilizate i al timpului
de executare, afieaz pe ecran, separate printr-un spaiu, dou numere naturale al
cror raport este egal cu x, i a cror diferen n modul este minim.
Exemplu: dac se citete x=0.375, se vor afia pe ecran numerele 3 i 8
(deoarece 3/8=0.375, iar expresia |8-3| este cea mai mic dintre toate diferenele n
modul dintre numitorii i numrtorii fraciilor prin care s-ar putea scrie valoarea
zecimal 0.375, celelalte fracii fiind 375/1000, 75/200, 15/40, etc).

56

Rezolvare
:

 Problema ne cere s scriem numrul real x ca fracie de forma p/q (unde p i


q sunt numere ntregi), iar dintre toate fraciile posibile, s o gsim pe aceea cu
proprietatea c diferena n modul dintre numrtor i numitor este cea mai mic, adic
valoarea expresiei |q-p|, este minim.
 Pentru a scrie un numr real x ca fracie, trebuie s-l nmulim i s-l mprim
cu o putere a lui 10, aleas astfel nct s dispar virgula zecimal. De exemplu,
0.375=375/1000 , 2.15=215/100 , etc.). Ca s gsim acea putere a lui 10, vom
nmuli pe x n mod repetat cu 10, atta timp ct valoarea lui x mai conine nc virgula
zecimal, adic atta timp ct x nu este un numr ntreg. tiind c orice numr ntreg
coincide cu partea ntreag din acel numr, fapt care nu este valabil n cazul numerelor cu
virgul zecimal, (de exemplu 2=[2] iar 2.25[2.25]), putem trage concluzia c ciclul
necesar se va executa ct timp x[x]. n variabila q, iniializat cu 1, vom memora
puterile succesive ale lui 10 prin care vom trece n timpul acestor nmuliri repetate.
Sintetiznd cele spuse, vom proiecta un ciclu n care, atta timp ct x[x], la
fiecare pas vom face dou operaii:
x*10;};
 nmulim pe x cu 10, memornd rezultatul tot n x {x
 nmulim pe q cu 10, pentru a trece la urmtoarea putere a lui 10
{q
q*10;}.
n final, valoarea lui x va reprezenta numrtorul fraciei, pe care l memorm
x;}, iar valoarea lui q va fi tocmai numitorul fraciei.
prin atribuire n variabila p {p
ntr-adevr, dac urmrim paii algoritmului pe numrul x=0.375 din exemplu, putem
vedea c aa stau lucrurile: iniial q=1, la pasul 1 avem x=0.375*10=3.75 i
q=1*10=10, apoi la pasul al doilea x=3.75*10=37.5 i q=10*10=100, i, n sfrit, la
ultimul pas x=37.5*10=375 iar q=100*10=1000. Dup atribuirea p
x , va rezulta
fracia p/q=375/1000.
 n continuare trebuie ns s inem cont de faptul c orice fracie de forma p/q
ar putea admite simplificri succesive, n cazul n care numrtorul i numitorul au divizori
comuni. Dintre toate fraciile echivalente obinute, una singur verific proprietatea c
diferena n modul dintre numitor i numrtor este cea mai mic, i anume cea care
asigur simplificarea la maximum. Revenind la exemplul din enun, fracia 375/1000 are
fraciile echivantente, 15/40 i 3/8, rezultate dup dou simplificri. Dintre acestea,
ultima, cea care asigur simplificarea la maximum, verific proprietatea cerut
(|40-15|=25), iar |8-3|=5).
Dar, ca s simplificm la maximum o fracie, nu este necesar s implementm
toate simplificrile succesive ntr-un ciclu ! tim din matematic faptul c o fracie de
forma p/q se simplific la maximum prin cel mai mare divizor comun al numrtorului i
numitorului. Ca atare, este suficient s aflm c.m.m.d.c. al numerelor p i q, pe care l vom
memora n variabila d. Pentru aceasta, folosim algoritmul lui Euclid cu diferene, prezentat
anterior, dar nu l aplicm direct numerelor p i q, ci unor copii ale acestora, a respectiv b
p i b
q ). De ce sunt necesare aceste copii ?
(pe care le obinem prin simplele atribuiri a
Pentru c algorimul lui Euclid modific numerele asupra crora se aplic, iar noi avem
nevoie de valorile lui p i q nealterate, pentru a putea face dup aceea simplificarea fraciei !

57

 Odat determinat d=c.m.m.d.c.(p,q), simplificm fracia p/q direct prin


d, cu atribuirile p
p/d i q
q/d , dup care, n final afim numrtorul p i numitorul
q al fraciei simplificate, care reprezint tocmai numerele cerute.
citete x;
q
1;
ct timp (x#[x]) execut
nceput
q
q*10;
x
x*10;
sfrit
p
x;
scrie p,q;
a
p;
b
q;
ct timp (a#b) execut
dac (a>b) atunci
a
a-b
altfel
b
b-a;
d
a;
p
p/d;
q
q/d;
scrie p,q;

ncercai singuri ! - Tema nr. T.17.


1. Metoda prezentat n problema rezolvat anterioar este o variant a
algoritmului lui Euclid. Algoritmul lui Euclid "clasic" pentru determinarea lui
c.m.m.d.c. a dou numere naturale a i b se bazeaz pe o succesiune de mpriri.
Iniial dempritul este a iar mpritorul este b. La fiecare mprire se obine un
rest r, apoi, n mod repetat, mpritorul devine demprit pentru mprirea
urmtoare i se mparte la restul r. Procesul se reia pn cnd obinem restul 0, iar
ultimul rest diferit de zero este cel mai mare divizor comun al lui a i b.
Exemplu:
Fie a=48 i b=14
48:14 restul 6;
14:6 restul 2;
6:2 restul 0

c.m.m.d.c(a,b)=2

Scriei un pseudocod pentru determinarea celui mai mare divizor comun a


dou numere numere naturale date a i b, folosind algoritmul de mai sus.
2. Se dau dou numere naturale a i b reprezentnd numrtorul respectiv
numitorul unei fracii. S se afieze fracia transformat n fracie ireductibil. O
fracie devine ireductibil simplicnd-o prin cel mai mare divizor comun al
numrtorului i numitorului, dac acesta este diferit de 1.

58

3. Dou numere naturale se numesc prime ntre ele dac cel mai mare
divizor comun al lor este 1. Pentru dou numere naturale n i q citite de la
tastatur, s se afieze numerele naturale mai mici sau egale dect n care sunt
prime cu q.
Exemplu: pentru n=18 i q=3 se vor afia numerele 1, 2, 4, 5, 7, 8, 10,
11, 13, 14, 16, 17.

Aplicaie

R.II.18. Numr prim

Se citete de la tastatur un numr natural x diferit de 0 i 1. Scriei un


algoritm care verific dac numrul citit este prim sau nu, afindu-se un mesaj
corespunztor.

Rezolvare
:

 Un numr natural x este prim, dac nu are nici un divizor propriu (adic nici
un divizor diferit de 1 i el nsui (valorile 1 i x nu intr n discuie, deoarece orice numr
natural x este divizibil cu 1 i cu el nsui). Posibilii divizori proprii ai lui x se caut printre
numerele naturale pn la jumtatea lui x. De ce ? De exemplu, pentru x=30, numerele mai
mari dect 15 nu au cum s fie divizori ai lui 30. Pe de alt parte, trebuie inut cont c
jumtatea unui numr impar nu este un ntreg (31:2=16.5), deci cnd spunem "jumtatea
lui x" ne referim la mprirea ntreag a lui x la 2, adic [x/2] (reamintim c atunci cnd
dempritul i mpritorul sunt numere ntregi, operatorul / furnizeaz ctul ntreg al
mpririi, fr partea zecimal). n concluzie, numerele printre care vom cuta divizorii lui
x sunt 2,3,.., [x/2].
Deoarece trebuie stabilit dac este adevrat (ndeplinit) o anumit condiie,
avem de-a face cu o testare logic. Este necesar o variabil cu sens logic, adic o variabil
care poate avea numai dou valori, i anume 1 i 0, corespunztoare celor dou stri
logice posibile, ADEVRAT respectiv FALS. Valoarea final a acestei variabile va indica
"starea" condiiei testate: 1 dac numrul x este prim (nu are divizori), respectiv 0 n caz
contrar. Denumim aceast variabil ok.
 Procedm prin metoda reducerii la absurd.
Presupunem iniial c numrul x nu are divizori, dnd variabilei ok valoarea 1;
Folosim un ciclu cu test iniial, n care contorul i va parcurge posibilii divizori ai
lui x; teoretic, acetia sunt 2,3,...,x-1; practic ns, este posibil ca prin variabila i s
nu treac toate aceste valori, deoarece vom proiecta ciclul de aa manier nct, n momentul
n care am gsit o valoare a lui i care este efectiv divizor al lui x, s se ias din ciclu,
abandonndu-se cutarea (deoarece tragem concluzia c numrul x, avnd cel puin un
divizor cert n persoana acelui i, nu mai poate fi prim). Cum realizm un astfel de ciclu ?
Iniializm i cu valoarea 2 (primul posibil divizor). Ct timp variabila i nu a parcurs nc
toi posibilii divizori (i<=x/2) I nu am gsit nc nici un divizor al lui x (ok==1):
 testm dac valoarea curent a lui i este divizor al lui x, adic dac restul
mpririi lui x la i este 0 (x%i==0). n caz afirmativ, numrul x nu mai
poate fi prim (am gsit un divizor cert al su, "n persoana" respectivului i),
i vom marca acest fapt dnd variabilei ok valoarea 0.
 trecem la urmtorul posibil divizor, prin incrementarea lui i (i
i+1).
59

ok
1;
i
2;
ct timp (i<= x / 2) I (ok==1) execut
nceput
dac (x % i==0) execut
ok
0;
i
i+1;
sfrit

 Este momentul s nelegei mai profund de ce condiia de continuare a


ciclului este ct timp (i<=x/2) I (ok==1). S zicem c la un pas al ciclului,
valoarea pe care o are i la acel pas este divizor al lui x. n acest caz, condiia "x%i==0"
din linia "dac" este ndeplinit, deci variabila ok va primi valoarea 0. Urmeaz
incrementarea lui i care ncheie pasul, apoi imediat dup aceea se revine n linia "ct
timp". Dar aici condiia "ok==1" nu mai este ndeplinit (variabila ok tocmai a primit
valoarea 0), fapt care dicteaz ntreruperea "forat" a ciclului. Adic exact ceea ce am
urmrit, s abandonm ciclul n momentul n care am gsit un divizor cert al lui x ! Dar cel
mai bine se va vedea cum stau lucrurile dac urmrii pas cu pas un exemplu de
funcionare.
Exemplu: Fie x=15.
Divizorii acestuia sunt 3 i 5. Pentru descoperirea lor, posibilii divizori care ar
trebui trecui prin variabila i sunt 2,3,...,x / 2, deci i=2,3,4,5,6,7.
1 i i
2
Iniial ok

Pasul 1: (i<=x/2) I (ok==1) ? da


x%i==0 ? 15%2=0 ? nu
i
i+1, i=2+1=3
Pasul 2: (i<=x/2) I (ok==1) ? da
x%i==0 ? 15%3=0 ? da ok
0
i
i+1, i=3+1=4
Pasul 3: (i<= x / 2) I (ok==1) ? nu iese din ciclu
Dup al doilea pas, valoarea 0 a variabilei ok marcheaz faptul c numrul x nu
mai este prim (am gsit pe i=3 ca divizor). Mai departe, se ncepe pasul al treilea, cu
testarea condiiei "(i<=x/2 I ok==1)" din linia "ct timp". Dar aceast condiie nu
mai este ndeplinit, pentru c variabila ok tocmai a primit valoarea 0, fapt care determin
ncheierea ciclului !
Acum se vede clar de ce am ataat i expresia "ok==1" la condiia din linia "ct
timp". Ce s-ar fi ntmplat n exemplul anterior dac condiia ar fi fost doar "ct timp
(i<=x/2)" ? La pasul al treilea nu s-ar mai fi ncheiat ciclul, ci s-ar fi testat mai departe n
mod inutil toi ceilali posibili divizori rmai, adic ciclul s-ar fi executat i pentru
i=4,5,6,7 ! Pierdere de timp, n contextul n care concluzia c numrul x=15 nu este
prim a rezultat fr echivoc dup pasul al doilea !
Dac n schimb x ar fi avut valoarea 13, atunci condiia "x%i=0" nu ar fi fost
ndeplinit niciodat, deci variabila ok ar fi rmas cu valoarea iniial 1 (ciclul s-ar fi
parcurs pn la capt, fr s se produc vreo ieire forat).

 n final se testeaz valoarea variabilei ok, i n funcie de aceasta se afieaz


un mesaj din care s reiese dac numrul x este prim sau nu.
60

 Prezentm n continuare pseudocodul complet .


citete x;
ok
1;
i
2;
ct timp (i<=x/2 I ok==1) execut
nceput
dac (x%i=0)
ok
0;
i
i+1;
sfrit
dac (ok==1) execut
scrie "Numrul este prim";
altfel
scrie "Numrul NU este prim";

 Chiar i aa, algoritmul nu este 100 % eficient, deoarece tot mai pot aprea
operaii inutile. S ncercm o mbuntire a lui, n sensul eliminrii tuturor situaiilor
redundante. n primul rnd, trebuie constatat faptul c numerele pare nu sunt prime,
deoarece au un divizor cert, n persoana lui 2. Excepie face numrul 2, care, chiar dac
este par, este considerat numr prim. n consecin vom introduce nite testri
suplimentare, caz n care pseudocodul ar arta schematic astfel:
citete x;
dac (x%2==0) atunci
dac (x==2) atunci
ok
1;
altfel
ok
0;
altfel
< aplic algoritmul de cutare a divizorilor >

Aadar se caut divizorii doar pentru numerele x impare. Dar numerele impare nu
pot avea divizori pari, deci ar fi util ca, dintre posibilii divizori ai lui x s-i parcurgem n
variabila i doar pe cei impari. Cum putem face acest lucru ? Iniializm naintea ciclului
pe i cu valoarea 3 (primul divizor impar), iar n ciclu, la sfritul fiecrui pas trecem la
urmtorul divizor impar prin atribuirea i
i+2 !
Pseudocodul mbuntit arat astfel:
citete x;
dac (x%2==0) atunci
dac (x==2) atunci
ok
1;
altfel
ok
0;
altfel
nceput
i
3;
ct timp (i<=x/2 I ok==1) execut
nceput
dac (x%i==0) atunci
ok
0;
i
i+1;
sfrit

61

sfrit
dac (ok==1) atunci scrie "Numrul este prim";
altfel scrie "Numrul NU este prim";

ncercai singuri ! - Tema nr. T.18.


1. Se citete de la tastatur un numr natural n. S se afieze toate
numerele naturale prime mai mici sau egale cu n.
Exemplu : pentru n=60, se vor tipri numerele:
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51,53,59.
2. Se d un ir de numere citite pe rnd de la tastur, care se termin cu
valoarea 0. S se afieze cte elemente numere prime conine irul citit.
Exemplu: pentru irul (26,51,13,125,59,0), programul va tipri
valoarea 3, deoarece n ir sunt trei numere prime, n spe 51, 13 i 59.

Aplicaie

R.II.19. Descompunerea unui numr n factori primi

S se afieze descompunerea unui numr natural dat x n factori primi,


evideniind factorii primi mpreun cu puterile la care apar n descompunere.
Exemplu: pentru x=720, descompunerea este 24325, iar programul va afia:
2 4
3 2
5 1

Rezolvare
:

Algoritmul const ntr-un ciclu care repet mprirea unui demprit d la un


posibil factor prim f, atta timp ct dempritul este mai mare ca 1. Iniial dempritul
este numrul dat x, i primul factor posibil f este 2.
La un pas al acestui ciclu, pentru valoarea curent a lui f:
facem, ntr-un alt ciclu mprirea ntreag a lui d la f, de cte ori este posibil, adic
atta timp ct restul mpririi este 0 ("ct timp d%f==0 execut"), i numrm n variabila
p cte mpriri s-au fcut (evident iniializm p cu 0 nainte de ciclu); la fiecare mprire,
[d/f], deoarece ctul devine demprit pentru mprirea
memorm ctul tot n d, (d
urmtoare) i cretem cu 1 numrul p al mpririlor (s-a mai fcut o mprire n plus fa de
cte erau). Valoarea lui p dup acest al doilea ciclu reprezint puterea la care apare factorul f n
descompunere, i dac p este diferit de zero, afim f mpreun cu puterea p.
f+1).
trecem la urmtorul factor posibil, incrementnd f (f
Exemplu:
540:2=270, 270:2=135, 135:3=45, 45:3=15, 15:3=5, 5:5:=1
540=22335.

factorul 2: 540:2=270, 270:2=135, 135:2


factorul 3: 135:3=45, 45:3=15, 15:3=5, 5:3
factorul 4: 5:4
factorul 5: 5:5=1, 1:5 stop
62

citete x; // citeste in variabila x numarul ce trebuie descompus


d
x; // initial deimpartitul este chiar numarul x
f
2; // in f se vor memora factorii; primul factor posibil este 2
ct timp (d>1) execut
nceput

// determina puterea p la care apare factorul f in descompunerea numarului


p
0;
ct timp (d%f==0) execut
nceput
d
d / f;
p
p+1
sfrit

// afiseaza factorul f impreuna cu puterea sa p


dac (p
0) atunci
scrie f,'^',p,'*';
f
f+1;
sfrit
sfrit

ncercai singuri ! - Tema nr. T.19.


1. (Bacalaureat iulie 2008, varianta 49)

Scriei pseudocodul unui algoritm care citete de la tastatur un numr


natural n (1<n<30000), apoi determin i afieaz pe ecran suma exponenilor
factorilor primi care apar n descompunerea lui.
Exemplu: pentru n=7000, descompunerea n factori primi este
n=23*53*71, iar programul trebuie s afieze valoarea 7/3+3+1.
2. Scriei pseudocodul unui algoritm care citete de la tastatur un
numr natural x (1<x<25000), apoi determin i afieaz pe ecran factorul prim
care apare la puterea cea mai mare n descompunerea lui x n factori primi. Dac
exist mai muli astfel de factori, se va afia doar ultimii dintre ei.
Exemplu: pentru x=540, descompunerea este x=23*33*5, iar factorul
cerut este 3.

63

Aprofundare
Probleme rezolvate
R.II.20

Cifre ntregi i cifre zecimale

(Bacalaureat iulie 2009, varianta 77, enun adaptat)

Scriei un program care citete de la tastatur trei numere naturale n, p i k


(0<n<100, 0<k<5, 0<p<5), precum i un ir de n numere reale, apoi determin i
afieaz pe ecran numrul de valori citite care au exact p cifre n partea ntreag i
mai mult de k zecimale.
Exemplu: pentru n=6, k=2, p=2 i irul (6.2 41.234 2 8.131
10.0012), programul va afia numerele 41.234 i 10.0012.

Rezolvare
:

Pentru nceput, citim de la tastatur valorile variabilelor n, p i k, apoi iniializm


cu 0 o variabil nr n care vom numra elementele irului ce ndeplinesc proprietile
cerute. ntruct tim c trebuie s citim un ir cu exact n termeni, vom proiecta un ciclu
"ct timp" n care contorul i va lua pe rnd valorile 1,2,...,n, i nu va avea alt rol
dect acela de a numra citirile. Aadar, iniializm pe i cu valoarea 1, i apoi, ntr-un
ciclu, ct timp i<=n, la fiecare pas vom executa urmtoarea succesiune de operaii:
 Citim un numr din ir n variabila x;
 Numrm n variabila nr1 cifrele din partea ntreag a lui x, aplicnd
algoritmul cunoscut de extragere a cifrelor. Iniializm nr1 cu 0 i un
[x]), apoi, ct timp d este diferit
demprit d cu partea ntrag a lui x (d
de zero, la fiecare pas:

trecem peste o cifr, mprind pe d la 10 (d


[d/10] );

incrementm cu 1 contorul nr1 care numr cifrele din partea ntreag


a lui x (nr1
nr1+1).
 n continuare trebuie s numrm n variabila nr2 cifrele din partea
zecimal a lui x. Pentru aceasta, iniializm nr2 cu 0, copiem pe x n y (prin
simpla atribuire y
x ), i, n mod repetat, nmulim pe y cu 10 memornd
rezultatul tot n y, pn cnd rezultatul este un numr ntreg. Dar pentru a
verifica dac un numr este ntreg, este suficient s testm dac el coincide
cu partea sa ntreag, deci ciclul de nmuliri se va executa atta timp ct y
este diferit de [y]. La fiecare pas:

nmulim pe y cu 10 (y
y*10);

incrementm cu 1 contorul nr2 care numr zecimalele


(nr2
nr2+1).
64

Dup ce am determinat numrul nr1 al cifrelor din partea ntreag i


numrul nr2 al zecimalelor pentru numrul x citit la pasul respectiv, mai
departe trebuie s testm condiia cerut, adic dac nr1 este egal cu p iar
nr2 este mai mare dect k (nr1==p I nr2>k). n caz afirmativ,
incrementm contorul nr care contabilizeaz cte dintre elementele irului
ndeplinesc proprietatea specificat n enun.
 n continuare, trecem la urmtorul pas al ciclului de citire, adic la urmtorul
element al irului, incrementnd cu 1 contorul i care numr citirile
(i
i+1)
n final, nu ne mai rmne altceva de fcut dect s afim valoarea lui nr.


citeste p,k,n;
nr
0;
i
1;
ct timp (i<=n) execut
nceput
citete x;
d
[x];
nr1
0;
ct timp (d#0) execut
nceput
d
[d/10];
nr1
nr1+1;
sfrit
y
x;
nr2
0;
ct timp (y#[y]) execut
nceput
y
y*10;
nr2
nr2+1;
sfrit
dac (nr1==p I nr2>k) atunci
nceput
scrie x;
nr
nr+1;
sfrit
i
i+1;
sfrit
scrie nr;

R.II.21

Amestecarea cifrelor

(Bacalaureat iulie 2008, varianta 17)


Pentru dou numere naturale m i n, cu maximum nou cifre fiecare, citite

de la tastatur, numere care au cifrele n ordine cresctoare, se cere s se afieze pe


ecran cel mai mare numr care se poate forma cu toate cifrele lui m i n la un loc.
Alegei un algoritm eficient de rezolvare.
Exemplu: pentru m=35679 i n=123789, se va tipri 99877653321.
65

Rezolvare
:

Problema pare dificil la prima vedere, dar dup ce vei nelege algoritmul o s vi
se par chiar banal. Practic, n mod repetat:
comparm ultima cifr a primului numr (m%10) cu ultima cifr a celui de-al
doilea (n%10); afim cea mai mare dintre aceste cifre i o eliminm din numrul n care am
localizat-o (cazul de egalitate a cifrelor poate fi plasat pe oricare dintre cele dou "ramuri" ale
instruciunii de selecie "dac-altfel" cu care facem compararea); cu alte cuvinte:
n%10, atunci afim valoarea m%10 ce reprezint ultima cifr a

dac m%10
lui m, apoi eliminm aceast ultim cifr din m, prin atribuirea m
[m/10]
(practic, ctul mpririi oricrui numr la 10 reprezint numrul n cauz
fr ultima cifr; de exemplu, 235:10 d ctul 23, 1469:10 d ctul 146,
etc.);

n caz contrar, numrul care are ultima cifr cea mai mare este n, deci afim
cifra n mod 10, i apoi o eliminm din n prin atribuirea similar
n
[n/10].
Acest ciclu se execut atta timp ct nu am epuizat ambele numere, respectiv ct
vreme ct mai sunt cifre de extras, comparat i eliminat, mai exact "ct timp (m>0 SAU
n>0)" (n momentul n care, de exemplu, numrul m a ajuns la o singur cifr, i anume
prima, dac facem [m/10] pentru a elimina i aceast cifr, vom obine ctul 0, deci
condiia "m%10>=n%10" din linia "dac" este fals, ceea ce nseamn c se va intra pe
ramura "altfel", unde se va afia una din cifrele rmase n nr !).
Iat n continuare pseudocodul complet:
citete m, n;
ct timp (m>0 SAU n>0) execut
dac (m%10>=n%10) atunci
nceput
scrie m%10;
m
[m/10];
sfrit
altfel
nceput
scrie n%10;
n
[n/10];
sfrit

R.II.22

P r ob le ma cr o it o r u lu i

Un croitor are o bucat de stof de lungime L dat, i vrea s obin numai


buci de stof de lungime mai mici sau egale dect un metru. Pentru aceasta,
procedeaz astfel: taie bucata de stof n jumtate, apoi taie fiecare bucat obinut
din nou n jumtate, .a.m.d. S se determine cte tieturi face croitorul pentru a
obine buci mai mici sau egale dect un metru.

Rezolvare
:

Citim mai nti de la tastatur lungimea bucii de stof L. Memorm lungimea


bucilor obinute la fiecare pas n variabila L0. Evident, iniial L0
L. Aciunea croitorului
66

poate fi descris ntr-un ciclu, care se repet atta timp ct lungimea bucilor L0 este mai
mare dect un metru (sau pn cnd lungimea devine mai mic sau egal cu un metru). La
fiecare pas, lungimea bucilor obinute este jumtate din lungimea bucilor avute la pasul
anterior, deci L0
L0/2. Astfel:
la primul pas, face o tietur (211), obine dou buci (21), iar lungimea
bucilor obinute este L/2;
la al doilea pas, face dou tieturi, obine 4 buci (22), iar lungimea bucilor
obinute este L/4;
................................................................................................................................
la pasul p sunt 2p1 tieturi, rezultnd 2p buci.
Memorm numrul de ordine al pasului curent n variabila p. Iniial p
1 i dup
fiecare pas crete cu unu numrul de ordine al pasului. Mai definim: nr= numrul de tieturi la
0).
un pas oarecare p, i nr_total= numrul total de tieturi (iniial nr_total
n ciclu, la fiecare pas p, atta timp ct lungimea bucilor L0 este mai mare dect
un metru:
- calculm noua lungime L0 a bucilor obinute la pasul respectiv (ca fiind vechea
lungime L0 mprit la 2), determinm numrul de tieturi fcute la respectivul
pas p (ca fiind nr = 2 p 1 ), adugm acest numr la numrul total de tieturi
nr_total+nr), i incrementm cu unu numrul de ordine p al
(nr_total
pasului deoarece urmeaz s trecem la pasul urmtor (p
p+1).
-

Pentru a determina numrul de tieturi fcute la pasul p, nr = 2 p 1 , folosim


relaia: nr=2 p-1 =2*2**2 (de p-1 ori).
Iniializm nr
1 i l calculm ntr-un ciclu n care de p-1 ori avem nr
nr*2.
n finalul programului se afieaz numrul total de tieturi nr_total.

citete L;
p
1;
nr_total
0;
L0
L;
ct timp (L0>
> =1) execut
nceput
L0
L0/2;
nr
1;
i
1;
ct timp (i<
<=p-1) execut
nceput
nr
nr*2;
i
i+1;
sfrit
scrie p;
nr_total
nr_total+nr;
p
p+1;
sfrit
scrie nr_total

67

I I .4 . 2 . S t r u c t u r a r e p e t i ti v c u t e s t f i n a l
Pentru ilustrarea acestui tip de ciclu, vom folosi tot exemplul dat la ciclul
cu test iniial.

Exemplu:
Se citesc de la tastatur trei numere ntregi. S se afieze suma lor.
Reamintim algoritmul pe scurt:
Variabila i, iniializat cu 0, numr ci pai are ciclul. La fiecare pas se execut
S+x; } i se incrementeaz valoarea lui i cu 1.
secvena de instruciuni {citete x; S
Ciclul se execut ct timp i<=3. n final se afieaz ultimul S.
S
0;
i
1;
ct timp (i<=3) execut
nceput
citete x;
S
S+x;
i
i+1;
sfrit
scrie S;

Aa cum deja tii, structura repetitiv folosit n exemplul de mai sus se


numete structur repetitiv cu test iniial (sau ciclu cu test iniial), deoarece
testarea condiiei are loc la nceput. n limbajul C++ putem ns implementa i o
aa-numit structur repetitiv cu test final, caracterizat prin faptul c testarea
condiiei are loc la sfrit.
O astfel de structur se mai numete i ciclu execut-ct timp.
Iat cum arat pseudocodul exemplului nostru transcris n varianta cu
structur repetitiv cu test final:
S
0;
i
1;
execut
nceput
citete x;
S
S+x;
i
i+1;
sfrit
ct timp (i<=3);
scrie S;

S urmrim execuia ciclului pas cu pas, dac de la tastatur se introduc n ordine


numerele 11, 12, 13:
0 ; i
1;
Iniial S
Pas 1: citete x=11; S
S+x, S=0+11=11; i
i+1, i=1+1=2; i<=3 ? 2<=3 ? da
Pas 2: citete x=12; S
S+x, S=11+12=23; i
i+1, i=2+1=3; i<=3 ? 3<=3 ? da
Pas 3: citete x=13; S
S+x, S=23+13=36; i
i+1, i=3+1=4; i<=3 ? 4<=3 ? nu
iese din ciclu.
68

Prezentm i varianta cu ciclu "execut-ct timp" a problemei dat ca


generalizare la cicluri cu test iniial.
S se calculeze suma a n numere naturale citite pe rnd de la tastatur
(unde n este un numr natural nenul, cunoscut).
Modificrile sunt minore i mult prea evidente pentru a mai necesita alte
comentarii: n loc de 3 vom avea n numere, unde n se citete de la tastatur naintea
ciclului.
citete n;
S
0;
i
1;
execut
nceput
citete x;
S
S+x;
i
i+1;
sfrit
ct timp (i<=n);
scrie S;

Sintaxa: general a ciclului cu test final:


execut
<secv>
ct timp (<expr>);

unde <expr> este o condiie (expresie logic), iar


<secv> este o secven format dintr-una sau mai
multe instruciuni, numit corpul ciclului.

Principiul de funcionare:
Repet execuia secvenei de instruciuni <secv>, pn cnd <expr> ia
valoarea de adevr "ADEVRAT" (pn cnd condiia devine adevrat).
1. se execut secvena de instruciuni <secv>;
2. se evalueaz expresia logic <expr>;

dac condiia dat de <expr> este adevrat, adic dac expresia <expr>
are valoarea 1, atunci se revine la pasul 1.;

n caz contrar, se iese din ciclu i se execut prima instruciune de dup


ciclu.

Observaii:


La fel ca i n cazul structurii repetitive cu test iniial, expresia <expr>


din linia ct timp se va pune ntre paranteze rotunde (aa cum
pretinde sintaxa limbajului C++);
n cazul n care secvena de instruciuni <secv> ce reprezint corpul
ciclului conine mai mult de o instruciune, ea va fi cuprins ntre acolad
deschis i nchis (la fel ca i la structura repetitiv cu test iniial);
Deoarece testarea are loc la sfrit, corpul unui ciclu cu test final se va
executa cel puin o dat.
69

Reluarea unor algoritmi care au fost prezentai i cu structuri cu test iniial

Aplicaie

R.II.23. Produs de numere naturale impare

Scriei un algoritm care calculeaz produsul numerelor naturale impare


nenule mai mici sau egale dect o valoare n dat.
Exemplu: pentru n=8 se va calcula P=1*3*5*7
Precizare: Aceast problem a fost rezolvat i n varianta cu ciclu cu test
iniial, n cadrul aplicaiei R.II.10. din lecia II.4.1. Structura repetitiv cu test
iniial.

Rezolvare
:

 Calculm produsul ntr-un ciclu, folosind o variabil i, ale crei valori sunt pe rnd
1 (prima valoare impar nenul), P
1 i
termenii produsului, 1,3,5,... Iniial i
executm un ciclu pe care l putem descrie astfel:
execut:
P*i ,
 nmulete valoarea lui i cu produsul P a numerelor impare (P
adic "noul P este vechiul P nmulit cu i"),
 variabila i ia urmtoarea valoare impar (i
i+2 )
ct timp valoarea lui i este mai mic sau egal dect valoarea lui n.
Pentru a exista "vechiul P" la execuia primului pas al ciclului, variabila P trebuie
iniializat cu o valoare nainte de ciclu. Valoarea iniial a lui P este 1, ca s nu
P*i=1*1}.
influeneze rezultatul nmulirii de la primul pas {P
citete n;
P
1;
i
1;
execut
nceput
P
P*i;
i
i+2;
sfrit
ct timp (i<=n)
scrie P;

Presupunem c s-a citit n=6. P


1 ; i
1;
Pas 1: P
P*i , P=1*1=1; i
i+2 , i=1+2=3;
i<=n ? 3<=6 da reia ciclul
Pas 2: P
P*i , P=1*3=3; i
i+2 , i=3+2=5
i<=n ? 5<=6 da reia ciclul
P*i , P=3*5=15; i
i+2 , i=5+2=7
Pas 3: P
i<=n ? 7<=6 nu abandoneaz ciclul
Dup ciclu, afieaz ultima valoare a lui P, adic P=15.

ncercai singuri !
Folosind structuri repetitive cu test final, scriei algoritmi pentru toate
problemele propuse n tema T.10. din lecia "2.4.1. Structura repetitiv cu test
iniial" (capitolul II).

Algoritm Citirea unui ir pe rnd pn la introducerea valorii 0


Numerele se citesc pe rnd, n aceeai variabil x, primul separat i celelalte ntrun ciclu execut-ct timp. n ciclu: se prelucreaz primul numr x (cel citit nainte de
ciclu), apoi se citete urmtorul numr tot n variabila x; se testeaz i dac nu este zero se
70

reia ciclul, se prelucreaz acest nou numr, apoi se citete urmtorul numr x, se testeaz,
.a.m.d., pn cnd se citete x=0. n acest moment, testnd valoarea lui x i constatnd c
este zero, se abandoneaz ciclul, deci nu prelucreaz valoarea zero. Primul x se citete
separat pentru a avea ce valoare s prelucreze la primul pas al ciclului.
citete x;
execut
nceput

<prelucreaz x>
citete x;
sfrit
ct timp (x0);

Aplicaie

Exemplu: Fie irul -2, 3, 0; citete x=-2


Pas 1: prelucreaz x=-2, citete x=3,
testeaz x0 ? 30 da
Pas 2: prelucreaz x=3, citete x=0,
testeaz x0 ? 00 nu STOP

R.II.24. Numrare ntr-un ir de numere


a crui citire se termin cu 0

Se d un ir de numere citite pe rnd de la tastatur, pn la ntlnirea


valorii 0 (care nu face parte din ir). Presupunnd c irul conine cel puin un
numr nenul, s se afieze cte numere pozitive sunt n ir.
Precizare: Aceast problem a fost rezolvat i n varianta cu ciclu cu test
iniial, n cadrul aplicaiei R.II.11. din lecia II.4.1. Structura repetitiv cu test
iniial, cu deosebirea c acolo numerele se citeau pe rnd ct timp nu s-a introdus
valoarea 0.

Rezolvare
:

 La fiecare pas al ciclului, n cadrul aciunii denumit generic "prelucreaz x",


se testeaz dac valoarea curent a lui x este pozitiv, iar n caz afirmativ se incrementeaz
cu 1 valoarea variabilei nr care numr cte elemente pozitive conine irul (nr este
iniializat cu 0 nainte de ciclu). Considerm c pseudocodul complet nu mai necesit alte
comentarii.
citete x;
nr
0;
execut
nceput
dac (x>0) atunci
nr
nr+1;
citete x;
sfrit
ct timp (x0);
scrie nr;

 Precizarea din enun conform creia irul conine cel puin un numr nenul
nltur un caz particular n care algoritmul de mai sus nu ar funciona. Dac prima valoare
introdus (cea citit naintea ciclului) este 0, atunci se intr n ciclu unde se cere o alt
citire care nu exist !

71

ncercai singuri !
Folosind structuri repetitive cu test final, scriei algoritmi pentru toate
problemele propuse n cadrul temelor T.11. i T.12., din lecia "2.4.1. Structura
repetitiv cu test iniial" (capitolul II).

Algoritm Extragerea cifrelor unui numr natural


Cifrele unui numr pot fi extrase de la dreapta la stnga, cu un algoritm bazat pe
un ciclu de mpriri la 10. Iniial dempritul este chiar numrul. Se mparte dempritul
la 10 i restul este ultima cifr a numrului, iar ctul devine demprit pentru urmtoarea
mprire. Se mparte noul demprit la 10, restul este penultima cifra, ctul devine din
nou demprit, se mparte noul demprit la 10, .a.m.d.. Procesul se repet ntr-un ciclu,
atta timp ct dempritul este diferit de 0.
834 10
830 83
4

83 10
80 8
3

8 10
0 0
8

0 10

Reamintim:
 ctul mpririi ntregi a lui x la y este x / y;
 restul mpririi ntregi a lui x la y se noteaz x % y;

 Prezentm n continuare o variant n care extragerea cifrelor se face ntr-o


structur repetitiv cu test iniial.
Folosim dou variabile, c i d: n c reinem fiecare cifr extras, iar n d
actualizm dempritul la fiecare mprire. Cum spuneam, iniial dempritul este chiar
x . Urmeaz ciclul propriu-zis:
numrul x, deci se face atribuirea d
Execut
 extragem o cifr c, care este tocmai restul mpririi dempritului la 10
d%10 ).
(c
 Prelucrm cifra extras c;
 ctul mpririi tocmai efectuate, adic [d/10], va deveni noul demprit
d pentru mprirea urmtoare (d
[d/10] ).
Ct timp dempritul d este diferit de 0 .
citete x;
d
x;
execut
nceput
c
d%10;

<prelucreaz c >
d
[d/10];
sfrit
ct timp (d0)

72

Algoritm Formarea oglinditului unui numr natural


Pentru a determina oglinditul unui numr x, se aplic algoritmul de extragere a
cifrelor descris n problema anterioar. Formm oglinditul din "mers" ntr-o variabil y.
Iniializm oglinditul y cu 0, apoi, la fiecare pas al ciclului, extragem o cifr c i
actualizm oglinditul dup relaia y:=y*10+c.
d
x;
// iniial dempritul d este numrul
y
0;
// iniializm oglinditul y cu 0
execut
nceput
c
d%10;
// extragem o cifra c, ca restul mpririi dempritului la 10
y
y*10+c; // actualizm oglinditul cu cifra extras
d
[d/10]; // ctul mpririi fcute va fi demprit la mprirea urmtoare
sfrit
ct timp (d0);
// ciclul se repet pn cnd dempritul devine 0

Exemplu: fie numrul 831


y=0; d=x=831
831:10 c=831%10=1,
83:10
c=83%10=3,
8:10
c=8%10=8,
0:10
stop

y=0*10+1=1,
y=1*10+3=13,
y=13*10+8=138,

d=[831/10]=83
d=[83/10]=8
d=[8/10]=0

Am obinut oglinditul lui 831, care este 138.

Aplicaie

R.II.25. Palindroame mai mici sau egale cu n

Numim "oglinditul unui numr natural x", numrul obinut prin citirea
cifrelor lui x n ordine invers, de la dreapta la stnga. Exemplu: oglinditul lui
2435 este 5342. Numim palindrom un numr natural egal cu oglinditul su (citit
invers este acelai numr). Exemplu: numrul 232 este palindrom.
Se citete de la tastatur un numr natural n (n<=20000). S se afieze
toate palindroamele mai mici sau egale dect n.
Exemplu: pentru n=135, se vor afia numerele:
1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 101 111 121 131

Precizare: Aceast problem a fost rezolvat i n varianta cu ciclu cu test


iniial, n cadrul aplicaiei R.II.14. din lecia II.4.1. Structura repetitiv cu test
iniial.

Rezolvare
:

 Pentru nceput citim valoarea lui n, cu validarea acesteia: execut citirea lui n, ct
timp valoarea pe care am introdus-o este mai mic dect 0 SAU mai mare dect 20000.
Iniializm cu 1 o variabil i n care vom parcurge numerele naturale mai mici
sau egale dect n, adic 1,2,...,n.
Execut

determinm oglinditul lui i cu algoritmul de mai sus, memorndu-l n


variabila y;
73

verificm dac numrul i este palindrom, adic dac este egal cu oglinditul
su y; n caz afirmativ l afim;
variabila i ia ca valoare urmtorul numr natural, prin atribuirea i
i+1.
Ct timp i<=n.
execut
citete n;
ct timp (n<0 SAU n>20000);
i
1;
execut
nceput
d
i; y
0;
execut
nceput
c
d%10; y
y*10+c; d
[d/10];
sfrit
ct timp (d0);
dac (y==i)
scrie i;
i
i+1;
sfrit
ct timp (i<=n);

ncercai singuri !
Folosind structuri repetitive cu test final, scriei algoritmi pentru toate
problemele propuse n cadrul temei T.14., din lecia "II.4.1. Structura repetitiv cu
test iniial" (capitolul II).

Aplicaie

R.II.26. Interpretarea unui pseudocod dat

(Bacalaureat iulie 2009,


varianta 8)

Se consider programul
pseudocod alturat, n care toate
variabilele pot primi ca valori doar
numere naturale.
a) Ce valoare se va afia pe
ecran, dac de la tastatur se citete
n=1764 ?
b) Scriei o valoare de trei
cifre care poate fi citit pentru variabila
n, astfel nct s se afieze valoarea 0.
c) Dai un exemplu de valoare
pe care ar putea-o primi variabila n,
astfel nct atribuirea pp+1 s se
execute de exact cinci ori.

citete n;
k
1;
d
2;
execut
nceput
p
0;
ct timp (n%d==0) execut
nceput
p
p+1;
n=[n/d];
sfrit
dac (p%2==1) atunci
k
0;
d
d+1;
sfrit
ct timp (n>1);
scrie k
74

d) Formulai un enun scurt care s descrie n cuvinte aciunea


algoritmului.
e) Rescriei algoritmul, nlocuind structura repetitiv "ct timp" cu o
structur repetitiv echivalent cu test final.
f) Scriei un algoritm echivalent cu cel dat, care s nu foloseasc nici un
fel de structur repetitiv.

Rezolvare
:

a)
Urmrim algoritmul pas cu pas pentru n=1764.
Iniial k=1 i d=2. Ciclul "execut-ct timp" se deruleaz astfel:
Pasul 1: p=0, intr n ciclul "ct timp":
Pasul 1.1.: n%d==0 ? 1764%2==0 ? da
p
p+1, p=0+1, p=1
n
[n/d], n=[1764/2], n=882
Pasul 1.2.: n%d==0 ? 882%2==0 ? da
p
p+1, p=1+1, p=2
n
[n/d], n=[882/2], n=441
Pasul 1.3.: n%d==0 ? 441%2==0 ? nu iese din ciclul "ct timp"
P%2==1 ? 2%2==1 ? nu
d
d+1, d=2+1, d=3
n>1 ? 441>1 ? nu reia ciclul "execut-ct timp".
Pasul 2: p=0, intr din nou n ciclul "ct timp":
Pasul 2.1.: 441%3==0 ? da
p
p+1, p=0+1, p=1
n
[n/d], n=[441/3], n=147
Pasul 2.2.: n mod d=0 ? 147 mod 3=0 ? da
p
p+1, p=1+1, p=2
n
[n/d], n=[441/3], n=49
Pasul 1.3.: n mod d=0 ? 49 mod 3=0 ? nu iese din ciclul "ct timp"
d
d+1, d=3+1, d=4
n>1 ? 49>1 ? da reia ciclul "execut-ct timp".
Urmeaz pasul 3, cu n=49 i d=4. Aici pleac din nou de la p=0, dar ciclul "ct
timp" nu se execut niciodat, deoarece 49%40. Drept consecin, nici instruciunea
d+1, de unde rezult
"dac" nu are nici un efect (0%21) i se execut doar atribuirea d
d=5.
La pasul 4, cu d=5, se petrece exact aceeai situaie ca la pasul 4, rezultnd n
final d=6. Nici pasul 5 nu este mai breaz, el conducnd doar la atribuirea d=7. Abia acum
se mai ntmpl ceva n ciclul "execut": se va executa ciclul "ct timp" de dou ori,
rezultnd mai nti n=7 i p=1, apoi n=1 i p=2. Nici la acest pas condiia "p mod 2=0"
din linia "dac" nu este ndeplinit, ns condiia "n>1" din linia "ct timp" a devenit
fals, fapt care produce ncheierea primului ciclu.
Observm c variabila k a rmas cu valoarea iniial 1, valoare care se va tipri n
ncheierea algoritmului.

75

d)
Aa cum am procedat pn acum la toate problemele de acest gen, rezolvm mai
nti subpunctul care ne cere s descriem aciunea algoritmului, pentru c astfel vom vedea
mai uor soluia celorlalte subpuncte.
n variabila d trec pe rnd numerele naturale ncepnd cu 2 (adic 2,3,4,...).
Pentru fiecare valoare a lui d, algoritmul face dou lucruri:
numr n variabila p de cte ori se mparte n la d, adic la ce putere apare d ca
factor n descompunerea lui n.
testeaz dac puterea p este impar, iar n caz afirmativ atribuie lui k valoarea 0
(unde k a fost iniializat cu 1 naintea primului ciclu).
Prin urmare, la ntlnirea unui factor d care apare la o putere p impar n
descompunerea lui n, variabila k primete valoarea 0, iar dac toi factorii apar la puteri
pare (cum a fost cazul lui n=1764 de la primul subpunct), atunci variabila k rmne cu
valoare iniial 1. Cu alte cuvinte, variabila k are sens logic, jucnd rolul unui "semafor",
pentru a testa, prin reducere la absurd, "starea" unei condiii. Acum enunul care s descrie
aciunea algoritmului este evident:
"Scriei un algoritm care citete de la tastatur un numr natural n, apoi verific
dac exist cel puin un factor care s apar la putere impar n descompunerea lui n n
factori, i afieaz rezultatul logic al testrii".
b)
Pentru ca variabila k s primeasc valoarea 0, este necesar ca numrul n s
conin cel puin un factor care s apar la putere impar n descompunere. Dac lum
factorul d=3 i puterea p=5, atunci trebuie ales un numr care s conin n descompunerea
sa pe 35, adic 243. ntruct se cere ca numrul cutat s aib exact trei cifre, acest 243
trebuie nmulit cu ceva astfel nct rezultatul s nu depeasc valoarea 999. O soluie ar
fi 243*4, adic 972. ntr-adevr, descompunerea lui 972 n factori este 35*22, iar pentru
factorul d=3 i puterea p=5 condiia "p%2==0 " care determin atribuirea "k=0" este
ndeplinit.
c)
Atribuirea p
p+1 are loc n cadrul ciclului "ct timp". Pentru ca ea s se
execute n total de cinci ori, putem alege, spre exemplu, cazul n care primul ciclu, cel de
tipul "execut-ct timp", are doi pai, i la primul pas atribuirea n cauz se execut de
trei ori iar la al doilea pas de dou ori. Altfel spus:
la primul pas al ciclului "mare", pentru d=2, s obinem n final p=3 (adic ciclul
"ct timp" din interior s aib trei pai, pentru c variabila p pleac de la valoarea 0);
dup al doilea pas, pentru d=3, s rezulte p=2.
Numrul n care respect succesiunea de pai descris mai sus este n=23*32, adic n=72.
Desigur, o soluie la fel de corect ar fi fost i n=22*33=108, sau n=21*34=162,
4
sau n=2 *31=48 (important este ca suma puterilor s fie 5).
e)
Condiia "ct timp n%d==0" se nlocuiete prin "execut ... ct timp
n%d0". Algoritmul echivalent este urmtorul:

76

citete n;
k
1;
d
2;
execut
p
0;
execut
p
p+1;
n
[n/d];
ct timp (n%d==0);
dac (p%2==1) atunci
k
0;
d
d+1;
ct timp (n>1);
scrie k

f)
Aa cum am spus, algoritmul afieaz valoarea 1, dac toi factorii din
descompunerea lui n apar numai la puteri pare. Aceast proprietate aparine numerelor
naturale care sunt ptrate perfecte (de exemplu 81=34, 144=24*32, etc.). Dar tim din
matematic faptul c un numr natural n este ptrat perfect, dac i numai dac "radical
din n este egal cu parte ntreag din radical din n". Prin urmare, putem concepe un
algoritm echivalent, care, fr s foloseasc nici un fel de structur repetitiv, nu face
altceva dect s testeze dac este ndeplinit condiia de mai sus. n caz afirmativ face
atribuirea k
1 , iar n caz contrar avem k
0 . Lsm ca exerciiu scrierea pseudocodului
aferent acestui algoritm, pentru c este de-a dreptul banal.

ncercai singuri ! - Tema nr. T.26.


1. (Bacalaureat iulie 2009, varianta 66)

Se consider algoritmul alturat,


0;
descris n pseudocod, n care s-a notat cu n
execut
a%b restul mpririi numrului ntreg a la
citete x;
numrul ntreg nenul b.
dac (x0) atunci
a) Scriei ce se afieaz n urma
dac (x%5==0) atunci
executrii algoritmului dac se citesc, n
n
n+1;
aceast ordine, valorile 10, 13, 46, 70, 35, 0.
altfel
b) Scriei un ir de valori care pot fi
n
n-1;
citite pentru variabila x, astfel nct
ct timp (x0);
programul s afieze, n urma executrii, dac n==0 atunci
mesajul DA.
scrie "DA";
c) Formulai un enun scurt care s
altfel
scrie "NU";
descrie aciunea algoritmului.
d) Scriei n pseudocod un algoritm
echivalent cu cel dat, n care s se nlocuiasc structura "execut...ct
timp", cu o structur repetitiv cu test iniial.

77

2 (Bacalaureat iulie 2009, varianta 75)


Se consider algoritmul alturat,
a
0;
descris n pseudocod, n care s-a notat cu
k

0;
[a/b]
ctul mpririi ntregi a
execut
numrului natural a la numrul natural
citete x;
nenul b.
ct timp (x>99) execut
a) Scriei ce se va afia dac se
x
[x/10];
citesc, n aceast ordine, valorile: 62521,
dac (x>9) atunci
2571, 2, 56, 614.
nceput
b) Scriei un set de date de intrare
a
a*100+x;
pentru care algoritmul s afieze valoarea
k
k+1;
12345678.
sfrit
ct timp (k4);
c) Formulai un enun scurt care
scrie a;
s descrie aciunea algoritmului.
d) Scriei n pseudocod un
algoritm echivalent cu cel dat, n care structura "execut...ct timp" s fie
nlocuit cu o structur repetitiv de alt tip.
3 (Bacalaureat iulie 2009, varianta 69)
Se consider algoritmul alturat,
citete x,y;
descris n pseudocod. S-a notat cu x%y
t
0; u
1;
restul mpririi numrului natural x la execut
numrul natural nenul y i cu [z]
dac (x%10>y%10) atunci
partea ntreag a numrului real z.
z
x%10;
a) Scriei valoarea afiat dac
altfel
pentru x se citete valoarea 4589 i
z
y%10;
pentru y se citete valoarea 723.
t
t+z*u;
b) Deducei ce valori pot fi
u
u*10;
citite pentru x i y astfel nct valoarea
x
[x/10];
afiat s fie 200.
y
[y/10];
ct timp (x0 I y0);
c) nlocuii structura de selecie
scrie t;
"dac-altfel" cu una echivalent, n

care atribuirile de pe ramurile "dac" i


"altfel" s fie inversate ntre ele.
d) Scriei n pseudocod un algoritm echivalent cu cel dat, n care s se
nlocuiasc structura "execut...ct timp" cu o structur repetitiv cu test iniial.

Algoritm

Cel mai mare divizor comun a dou numere


- algoritmul lui Euclid cu resturi -

Dac n subcapitolul "Structura repetitiv cu test iniial" v-am prezentat


algoritmul lui Euclid cu diferene, iat c a venit momentul s l nvai i pe cel cu resturi.
Acesta se bazeaz pe o succesiune de mpriri, cu extragerea restului la fiecare pas,
mpriri care se reiau pn cnd restul devine zero.
Iniial dempritul i mpritorul sunt chiar numerele a i b pentru care trebuie
calculat c.m.m.d.c. Proiectm un ciclu n care la fiecare pas:
78

extragem restul mpririi lui a la b i l


a%b );
memorm n variabila r (r
actualizm dempritul a: noul a va fi
b );
mpritorul anterior (a
actualizm mpritorul b: noul b va fi
restul mpririi anterioare (b
r );
Ciclul se repet pn cnd restul r devine 0.
n acel moment algoritmul se ncheie, iar cel mai mare
divizor comun al celor dou numere date este valoarea
final a lui a.
Mai trebuie fcut o precizare: pentru c se
mparte a la b, dac a este mai mic dect b, atunci
naintea declanrii algoritmului trebuie s
interschimbm cele dou numere ntre ele (prin
metoda paharelor).

citete a,b;
dac (a<b) atunci
nceput
temp
a;
a
b;
b
temp;
sfrit
execut
r
a%b;
a
b;
b
r;
ct timp (b#0);

Exemplu de funcionare:
Fie a=12 i b=30.
a<b ? 12<30 ? da facem interschimbarea valorilor lui a i b ntre ele:
temp
a , temp=12;
a
b , a=30;
b
temp , b=12.
Avnd acum a=30 i b=12, urmrim paii ciclului:
a%b , r=30%12 , r=6;
Pasul 1: r
a
b , a=12
b
r , b=6;
r=0 ? 6=0 ? nu reia ciclul
a%b , r=12%6 , r=0;
Pasul 2: r
a
b , a=6
b
r , b=0;
r=0 ? 0=0 ? da ncheie ciclul
Cel mai mare divizor comun al numerelor 12 i 30 este ultimul a, adic 6.

Aplicaie

R.II.27. Multiplii comuni

(Bacalaureat iulie 2008, varianta 34)

Se citesc de la tastatur trei numere naturale nenule x, y i p, avnd cel


mult trei cifre fiecare. Scriei un algoritm care afieaz pe ecran primii p multiplii
comuni ai celor dou numere x i y.
Exemplu: pentru x=180, y=120 i p=5, se vor afia numerele: 360, 720,
1080, 1440, 1800.

Rezolvare
:

 Dac notm cu m cel mai mic multiplu comun al numerelor x i y, atunci


evident primii p multiplii vor fi m,2*m,3*m,...,p*m. Pentru aceasta va trebui mai nti
s calculm cel mai mare divizor comun al celor dou numere x i y, dup care vom folosi
relaia c.m.m.m.c(x,y)=(x*y)/c.m.m.d.c(x,y).
79

n vederea determinrii c.m.m.d.c.(x,y), putem folosi algoritmul lui Euclid


prezentat mai sus, dar cu o modificare. n ce const aceasta ? Nu putem aplica algoritmul
anterior direct pe x i y, pentru c astfel s-ar modifica cele dou valori, iar noi avem nevoie
ulterior de ele intacte, ca s aflm c.m.m.m.c. Din aceast cauz va trebui s folosim nite
copii ale numerelor date x i y, pe care le vom nota cu a respectiv b. n loc s interschimbm
cele dou valori ntre ele n cazul n care prima este mai mic, vom memora de la bun nceput n
a pe cel mai mare dintre numerele x i y, iar n b pe cel mai mic dintre ele. Astfel:
x , b
y );

dac x>=y atunci n a memorm pe x iar n b pe y (a

n caz contrar, a i b vor primi valorile inversate (a


y , b
x ).
 n continuare aplicm aa cum am spus algoritmul lui Euclid pentru a i b, iar
la finele acestuia memorm n d cel mai mare divizor comun astfel calculat (care este
ultima valoare a variabilei a, adic d
a ). Acum cel mai mic multiplu comun al celor dou
(x*y)/d (produsul celor dou numere mprit
numere date se obine prin atribuirea m
(a*b)/d, ntruct variabilele a i b nu mai conin
la c.m.m.d.c, dar, atenie, nu m
numerele iniiale !).
 Odat determinat valoarea lui m reprezentnd cel mai mic multiplu comun al
lui x i y, nu ne rmne dect s parcurgem i s afim primii m multiplii, care, aa cum
am evideniat la nceputul rezolvrii, vor fi m,2*m,3*m,...,p*m. n acest sens, avem
nevoie de un ciclu, n care contorul i s parcurg pe rnd valorile 1,2,...,p, i n care la
fiecare pas s afim un multiplu de forma i*m. Dac alegem o structur repetitiv cu test
final, atunci iniializm i
1 , iar ciclul arat astfel:
Execut

afieaz multiplul curent, de forma i*m, urmat de un spaiu;

trece la urmtorul multiplu, prin incrementarea i


i+1;
Ct timp valoarea lui i este mai mic sau egal cu p.
citete x,y,p;
dac (x>=y) atunci
nceput
a
x; b
y;
sfrit
altfel
nceput
a
y; b
x;
sfrit
execut
r
a%b;
a
b;
b
r;
ct timp (r#0);
d
a;
m
(x*y)/d;
i
1;
execut
scrie i*m,' ';
i
i+1;
ct timp (i<=m);

80

ncercai singuri ! - Tema nr. T.27.


1. Se citesc de la tastatur trei numere naturale x, y i q. Scriei un
algoritm care determin i afieaz pe ecran multiplul comun al lui x i y cel mai
apropiat ca valoare de q.
Exemplu: pentru x=30, y=12 i q=132 multiplul cutat este 120, iar
pentru x=30, y=12 i q=175, se va afia multiplul 180.

2. (Bacalaureat iulie 2008, varianta 61)

Scriei un algoritm care citete de la tastatur trei numere naturale x, y i k


x<y
100000, k
1000), apoi afieaz pe ecran cele mai mari k numere prime
(1
din intervalul [x,y]. Valorile respective vor fi tiprite pe un singur rnd, separate
prin cte un spaiu. Dac intervalul [x,y] conine mai puin de k numere prime,
atunci se vor afia pe un rnd toate valorile prime gsite sepasrate prin cte un
spaiu, iar pe al doilea rnd se va scrie
3 5 7 11
mesajul "Insuficiente numere prime".
Insuficiente numere prime
Exemplu: pentru x=3, y=12 i k=5,
ecranul va arta ca n figur.

Ai neles ?

Probleme cu rspuns scurt

Urmtoarele dou probleme se refer la algoritmul de mai jos, descris n


pseudocod, n care s-a notat cu [a] partea ntreag a numrului real a, iar cu a%b restul
mpririi lui a la b.
citete n;
execut
n
[(n%100)/10]+[n/10];
ct timp n>=10;
scrie n;
1. (Bacalaureat iulie 2009, varianta 59)

Scriei ce valoare se va afia, dac de la tastatur se citete numrul n=76261.


2. (Bacalaureat iulie 2009, varianta 59)

Gsii o valoare care ar putea fi citit n variabila n astfel nct s se afieze


rezultatul 6.
Urmtoarele trei probleme se refer la algoritmul de mai jos, descris n
pseudocod, n care s-a notat cu [a] partea ntreag a numrului real a, iar cu a mod b
restul mpririi lui a la b.
citete x,y;
p
0;
execut
dac (y%2 0) atunci
p
p+x;

81

y
[y/2];
x
2*x;
ct timp (y>=1);
scrie p;
3. (Bacalaureat iulie 2009, varianta 33)

Scriei care este valoarea afiat, n cazul n care de la tastatur se citesc


numerele: x=5 i y=27.
4. (Bacalaureat iulie 2009, varianta 33)

Gsii un set de valori nenule care ar putea fi citite n variabilele x i y, astfel


nct rezultatul afiat dup execuia algoritmului s fie un numr cu cel mult dou cifre.
5. (Bacalaureat iulie 2009, varianta 33)

Identificai o instruciune prin care variabilei p i se atribuie valoarea unei expresii


aritmetice echivalent cu secvena dat (adic rezultatul evalurii expresiei este acelai cu
cel furnizat de ctre algoritm).
a) p
a+b;

b) p
ab;

c) p
a*b;

d) p
a mod b;

Aprofundare
Probleme propuse
R.II.28

El im in a re a u n ei ci fr e d i n tr - u n n um r

(Bacalaureat iulie 2008, varianta 22)

S se realizeze un algoritm care citete de la tastatur un numr natural n


(cu cel puin dou cifre i cel mult nou cifre, toate nenule), i determin toate
numerele obinute din n prin eliminarea cte unei singure cifre: mai nti cifra
unitilor, apoi cifra zecilor, apoi cea a sutelor, etc. Numerele astfel obinute vor fi
scrise pe ecran pe o singur linie, separate prin cte un spaiu ntre ele.
Exemplu: dac de la tastatur se citete n=12345, pe ecran se vor afia numerele:
1234 1235 1245 1345 2345

Rezolvare
:

n principiu, pentru a elimina o cifr oarecare c din interiorul unui numr natural
n, trebuie s procedm astfel:

formm numrul n1 alctuit cu cifrele aflate naintea cifrei c n cadrul


numrului dat n;
formm numrul n2 alctuit cu cifrele aflate dup cifra c n cadrul lui n;
"lipim" unul de altul numerele n1 i n2.
82

De exemplu, dac din numrul n=12345 dorim s eliminm cifra c=3, vom avea
n1=12, n2=45, iar numrul final rezultat dup "lipire" va fi 1245.

Aceast succesiune de etape trebuie cuprins ntr-un ciclu, astfel nct s se


elimine rnd pe rnd fiecare dintre cifrele lui n.
Fiind vorba despre un algoritm ceva mai complex, vom ilustra paii de mai sus pe
exemplul din enun.
ncepem cu regula de formare a numrului n2 aflat dup cifra c, pentru c este
mai simpl.
dac eliminm ultima cifr c=5, atunci vom avea n1=1234 i n2=0;
dac eliminm penultima cifr c=4, atunci n2=5, adic tocmai restul mpririi
lui n=12345 la 10;
la eliminarea cifrei c=3, vom avea n2=45, valoare care reprezint restul
mpririi lui n=12345 la 100.
pentru cifra c=2 rezult n2=345, care este restul mpririi lui n la 1000;
n sfrit, n cazul primei cifre c=1, vom avea n2=2345, adic n2 este restul
mpririi lui n la 10000.
Observm c, ncepnd cu a doua cifr, valorile succesive ale lui n2 reprezint
resturile mpririi lui n la urmtoarele numere: 10, 100, 1000, 10000. Altfel spus, la
fiecare pas, valoarea la care se mparte n se obine prin nmulirea cu 10 a valorii de la
pasul anterior. Aceast constatare ne permite s ciclm procedeul de obinere a lui n2.
Plecnd de la o valoare iniial p=1, la fiecare pas se obine n2 ca fiind restul mpririi lui
n la p (n2
n%p ), iar p se multiplic prin atribuirea p
p*10. Aceast abordare acoper i
primul pas, cel al extragerii ultimei cifre, cnd, aa cum am artat mai sus, n2 este 0: ntradevr, la primul pas avem p=1, iar n%p va da rezultatul 0 (restul mpririi oricrui numr
la 1 este ntotdeauna 0 !).
S vedem acum regula de formare a numrului n1 ce conine cifrele de dinaintea
cifrei eliminate c.
pentru cifra c=5, avem n1=1234, care este ctul mpririi lui n=12345 la 10;
pentru cifra c=4, avem n1=123, care este ctul mpririi lui n=12345 la 100;
pentru c=3 n1=12, adic tocmai ctul mpririi lui n la 1000
.a.m.d.
Pentru fiecare cifr c, fcnd comparaie ntre "extragerea" lui n2 i cea a lui n1,
putem remarca un lucru foarte important: dac pentru obinerea lui n2 se mprea numrul n la
o valoare p (care am stabilit mai nainte cum evolueaz), iat c pentru construirea lui n1 se
mparte acelai n la 10*p, reinndu-se de data asta ctul mpririi (n loc de rest). Acum
[n/(10*p)].
formula de calcul a lui n1 la fiecare pas al ciclului este evident: n1
Mai rmne de stabilit formula prin care se realizeaz "lipirea" lui n1 i n2.
Ilustrm tot pe exemplul nostru:
pentru c=5, avem p=1, n1=1234 i n2=0, iar numrul final va fi 1234, care se
poate scrie 1234*1+0;
pentru c=4 avem p=10, n1=123 i n2=5, iar numrul final va fi 1235, care se
poate scrie 123*10+5;
pentru c=3, avem p=100, n1=12 i n2=45, iar numrul final este 1245, care se
poate scrie 12*100+45.
Credem c este suficient pentru a va da seama c "lipirea" lui n1 i n2 nseamn
numrul de forma n1*p+n2 !
83

Sintetiznd, plecm de la un p=1 i scriem un ciclu, n care la fiecare pas


eliminm cte o cifr prin urmtoarele operaii succesive: formarea lui n2 cu atribuirea
n2
n%p , formarea lui n1 cu atribuirea n1
[n/(10*p)] , afiarea numrului n1*p+n2
care reprezint rezultatul "lipirii" dintre n1 i n2, i, n sfrit, actualizarea lui p prin
p*10 (pregtirea lui p pentru pasul urmtor). Dac ar fi s proiectm un ciclu
formula p
cu test final, se observ c acesta se repet atta timp ct n1 nu a ajuns la valoarea 0.
Pseudocodul complet este urmtorul:
citete n;
p
1;
execut
nceput
n2
n%p;
n1
n/(10*p);
scrie n1*p+n2;
p
p*10;
sfrit
ct timp (n1#0);

R.II.29

Concurs cu premii

La un concurs de orientare turistic s-au nscris mai muli concureni.


Probele ntrecerii se desfoar pe parcursul a trei zile, la finele acesteia fiecare
concurent acumulnd un anumit punctaj. Organizatorii concursului doresc s
acorde nite premii, dar valoarea total a premiilor nu poate depi suma de S lei
pe care o au la dispoziie. Din acest motiv nu pot fi premiai toi concurenii, ci
doar un numr de p sportivi, n spe cei clasai pe primele p locuri. Algoritmul de
mprire al banilor este urmtorul: ultimul dintre cei premiai primete X mii lei,
apoi, fiecreia dintre ceilali concureni premiai i se acord suma primit de ctre
sportivul de pe locul imediat urmtor plus 15% din suma respectiv. Ocupantul
locului I mai primete n plus nc L lei fa de suma ce-i revine conform
calculului anterior. De la tastatur se citesc valorile X, L i S. Scriei un algoritm
care determin i afieaz suma de bani primit de ctre fiecare concurent premiat,
precum i numrul p al concurenilor care au obinut un premiu.

Rezolvare
:
Citim de la tastatur

succesiv cele trei valori de intrare: X=premiul ultimului


concurent premiat, L=premiul suplimentar acordat n plus ctigtorului, S=suma n care
trebuie s se ncadreze premiile.
Memorm succesiv n variabila val valorile premiilor, n vt valoarea total a
acestora, i n p numrul concurenilor premiai. Iniial val=x (pentru ultimul concurent
premiat), vt=val, iar p=1.
Calculm premiile oferite concurenilor ntr-o structur repetitiv cu test final. La
fiecare pas:
premiul concurentului de la pasul respectiv va fi cu 15% mai mare dect suma
acordat concurentului anterior, lucru pe care-l marcm prin atribuirea
val
val+[(15/100)*val];
84

incrementm cu 1 numrul p al concurenilor premiai (p


p+1);
vt+val).
adugm premiul respectiv la valoarea total a premiilor (vt
Ciclul se execut ct timp vt+val+L<=S (valoarea total a premiilor nu poate
depi S, dar trebuie s rmn loc pentru premiul suplimentar L ce-i va reveni
ctigtorului).
citete X,L,S;
val
x;
scrie val;
vt
val;
p
1;
execut
val
val+[(15/100)*val];
scrie val;
p
p+1;
vt
vt+val;
ct timp (vt+val+L<=S);
scrie val+L,vt,p;

I I . 4.3 . St r uc t ura re p e ti tiv cu n umr f i x de p a i


Folosim acelai exemplu pe care am ilustrat celelalte dou tipuri de cicluri.

Exemplu:
S se calculeze suma a n numere naturale citite pe rnd de la tastatur
(unde n este cunoscut).
Reamintim variantele de rezolvare cu ciclu cu test iniial i final,
prezentate n leciile anterioare.
citete n;
S
0;
i
1;
ct timp (i<=n) execut
nceput
citete x;
S
S+x;
i
i+1;
sfrit
scrie S;

citete n;
S
0;
i
1;
execut
nceput
citete x;
S
S+x;
i
i+1;
sfrit
ct timp (i<=n);
scrie S;

n ambele variante, variabila i va lua pe rnd valorile 1,2,...,n, numrnd


citirile. Ciclul se oprete dup ce s-au fcut n citiri, adic dup ce variabila i a ajuns la
valoarea n.
La ncerput citim n, apoi iniializm S cu 0 i i cu 1. n ciclu, la fiecare pas:
citim un numr n variabila x;
adugm x-ul citit la suma S;
85

incrementm cu 1 variabila i; ea va indica la al ctelea numr am ajuns cu citirea.


Deosebirea dintre cele dou variante const n faptul c n prima testarea condiiei
are loc la nceputul ciclului (care astfel poate s nu se execute niciodat), iar n a doua las
sfrit (dup execuia cel puin a unui pas).

Dar nu putem s precizm exact ci pai va avea ciclul, fr a mai testa nici
o condiie ? Rspunsul este afirmativ. Trebuie s comunicm calculatorului ceva de
genul "execut ciclul pentru i=1,2,...,n". Aceast "comand" poate fi codificat
prin intermediul unui ciclu cu numr fix de pai, numit i ciclu cu contor.
Principala parte component a unui astfel de ciclu este linia pentru, prin care
specificm valorile pe care le va primi variabila i. n exemplul nostru, aceast
linie de pseudocod arat astfel:
pentru (i
1,2,,n) execut

Mai notm c variabila i are denumirea consacrat de contor al ciclului


deoarece contorizeaz, adic numr, paii acestuia.
n aceast versiune, pseudocodul complet al algoritmului din exemplu se
scrie astfel:
citete n;
S
0;
pentru (i
1,2,...,n)
nceput
citete x;
S
S+x;
sfrit
scrie S;

n cazul celorlalte dou tipuri de structuri repetitive (cu test iniial i cu


test final), am impus pseudocodului o sintax foarte apropiat de cea a limbajului
C++. Aici vom face o excepie. Este vorba despre linia pentru, pe care n
pseudocod am reprezentat-o ntr-un mod mai simplist, departe de felul n care
trebuie scris n programe. n limbajul C++, linia pentru are o sintax mai
complex, fiind alctuit din trei expresii: prima expresie trebuie s stabileasc
valoarea iniial a contorului, a doua va da condiia de continuare a ciclului, iar a
treia expresie are rolul de a modifica contorul, dndu-i valoarea pe care o va avea
la pasul urmtor.
Deocamdat, chiar i aceast form simplificat de pseudocod este
sufucient pentru a nelege n mare funcionarea ciclului: contorul i parcurge
valorile 1,2...n, i la fiecare pas, pentru fiecare valoare a lui i, se execut
corpul ciclului.

Observaii:
S facem o comparaie ntre aceast variant i celelalte dou variante anterioare.
Ce observm ?
n primul rnd remarcm faptul c cele dou instruciuni care trebuie s se
execute la fiecare pas al ciclului, i anume {citete x;} i {S
S+x; } sunt prezente n
toate cele trei variante.
86

n varianta cu ciclu cu numr fix de pai lipsete iniializarea lui i cu 1 dinaintea


1), precum i incrementarea lui i (i
i+1 ) din corpul ciclului. De ce ?
ciclului (i
ntruct ntr-un ciclu cu contor acestea se fac automat. n momentul n care ntlnete
ntr-un program linia "pentru i
(1,2,...,n) execut" (tradus firete n limbajul
de programare folosit), calculatorul "tie" c trebuie s dea lui i valoarea iniial 1 i c la
sfritul fiecrui pas trebuie s incrementeze pe i cu o unitate.

Pe caz general, nu este obligatoriu ca cele dou valori extreme ale


contorului s fie 1 i n. n capitolul IV vom vedea c n limbajul C++ ciclurile cu
contor admit forme mult mai generale, n care valorile contorului pot fi parcurse n
ordine invers i nu este obligatoriu s fie numere naturale consecutive !

Sintaxa: general a unui ciclu cu contor este:


pentru (<contor> <v1>,<v2>,...,<vn>)
<secv>

unde <v1>,<v2>,...,<vn> sunt valorile succesive ale contorului, iar


<secv> este o secven de instruciuni care reprezint corpul ciclului. La fel ca i
n cazul celorlaltor dou tipuri de ciclu, corpul ciclului cu contor va fi cuprins ntre
cuvintele "nceput" i "sfrit" dac conine mai mult de o instruciune.
n exemplul dat, observai c n corpul ciclului contorul nu e folosit n nici
un fel, el avnd strict rolul de a numra paii ciclului. n continuare vei regsi
numeroase aplicaii n care execuia corpului ciclului la fiecare pas este influenat
din plin de valoarea contorului.

Reluarea unor algoritmi care au fost prezentai i cu ciclu cu test iniial

Aplicaie

R.II.30. Produs de numere naturale impare

Scriei pseudocodul unui algoritm care calculeaz produsul numerelor


naturale impare mai mici sau egale dect o valoare n dat.
Exemplu: pentru n=8 rezult P=1357=105, iar pentru n=9 se va calcula
P=13579=945.
Precizare: Aceast problem a fost rezolvat i n varianta cu ciclu cu test
iniial, n cadrul aplicaiei R.II.10. din lecia II.4.1. Structura repetitiv cu test iniial.

Rezolvare
:

 Pentru nceput, citim de la tastatur valoarea lui n i iniializm cu 1 o


variabil P n care calculm produsul cerut. Folosim o structur repetitiv "pentru", n
care contorul i va parcurge pe rnd numerele naturale 1,2,...,n. La fiecare pas, pentru
fiecare dintre aceste valori ale lui i, testm dac i este un numr impar (adic dac restul
87

mpririi lui i la 2 este diferit de 0); n caz afirmativ nmulim pe i cu p i memorm


P*i).
rezultatul tot n P (adic actualizm valoarea lui P, prin atribuirea P
n final, afim produsul P al numerelor naturale impare mai mici sau egale cu n.
citete n;
P
1;
pentru (i
1,2,...,n) execut
dac (i%2 0) atunci
P
P*i;
scrie P;

ncercai singuri !
Folosind structuri repetitive cu contor, scriei algoritmi pentru toate
problemele propuse n cadrul temei T.10., din lecia "II.4.1. Structura repetitiv cu
test iniial" (capitolul II).

Aplicaie

R.II.31. Numr prim

Scriei un algoritm care verific dac un numr natural x diferit de 0 i 1,


este prim sau nu, afind un mesaj corespunztor.
Precizare: Aceast problem a fost rezolvat i n varianta cu ciclu cu test
iniial, n cadrul aplicaiei R.II.18. din lecia II.4.1. Structura repetitiv cu test iniial.

Rezolvare
:

 Noiunea de numr prim mpreun cu proprietile aferente au fost prezentate


detaliat n cadrul rezolvrii aceleiai probleme n lecia Structura repetitiv cu test
iniial. Un numr natural x este prim, dac nu are nici un divizor propriu (adic nici un
divizor diferit de 1 i el nsui (valorile 1 i x nu intr n discuie, deoarece orice numr
natural x este divizibil cu 1 i cu el nsui). Posibilii divizori proprii ai lui x se caut printre
numerele naturale pn la jumtatea lui x. Mai exact, numerele printre care vom cuta
divizorii lui x sunt 2,3,..,[x / 2].
 Deoarece trebuie stabilit dac este adevrat (ndeplinit) o anumit condiie,
avem de-a face cu o testare logic. Este necesar o variabil cu sens logic, adic o variabil
care poate avea numai dou valori, 1 i 0, aferente celor dou valori de adevr posibile,
ADEVRAT respectiv FALS. Valoarea final a acestei variabile va indica "starea" condiiei
testate: 1 dac numrul x este prim (condiia are valoarea de adevr ADEVRAT), respectiv
0 n caz contrar (condiia are valoarea de adevr FALS). Denumim aceast variabil ok.
 Procedm prin metoda reducerii la absurd.
presupunem iniial c numrul x este prim, dnd variabilei ok valoarea 1;
apoi, ntr-un ciclu cu contor, prin variabila i vor trece pe rnd toi posibilii
divizori ai numrului dat x. Acetia sunt 2,3,...,x/2;
88

la fiecare pas, pentru fiecare valoare a lui i, testm dac respectivul i este
divizor al lui x, adic dac restul mpririi lui x la i este 0 (x % i == 0). n
caz afirmativ, numrul x nu mai poate fi prim (am gsit un divizor cert al
su, "n persoana" respectivului i), i vom marca acest fapt dnd variabilei
ok valoarea 0.

 n final se testeaz valoarea variabilei ok, i n funcie de aceasta se afieaz


un mesaj din care s reiese dac numrul x este prim sau nu.
citete x;
ok
1;
pentru (i
2,...,x / 2)
dac (x % i==0)
ok
0;
dac (ok==1)
scrie 'Numrul este prim'
altfel
scrie 'Numrul NU este prim';

Exemplu: Fie x=15.


Divizorii acestuia sunt 3 i 5. Pentru descoperirea lor, prin variabila i trec toi
posibilii divizori, de la 2 la [x/2], deci i=2,3,4,5,6,7.
1
Iniial ok
Pasul 1: cu i=2: x % i==0 ? 15 % 2==0 ? nu nu execut nimic
Pasul 2: cu i=3: x % i==0 ? 15 % 3==0 ? da ok
0
................................................

Dup al doilea pas, valoarea 0 a variabilei ok marcheaz faptul c numrul x nu


mai este prim (am gsit pe i=3 ca divizor). Paii urmtori vor evolua la fel. Pentru i=5,
variabila ok va mai primi o dat valoarea 0, urmare a faptului c 5 este un nou divizor al
lui 15, deci n final valoarea variabilei ok va fi 0.
Dac n schimb x ar fi avut valoarea 13, atunci condiia "x % i==0" nu ar fi fost
ndeplinit niciodat, deci variabila ok ar fi rmas cu valoarea iniial 1.
n concluzie, valoarea final a lui ok ne indic dac numrul x este prim sau nu.
Nu ne rmne dect s testm ok i, n funcie de valoarea sa, s afim un mesaj sugestiv.
Observaie:

 Varianta corect de mai sus nu este optim. Pe exemplul parcurs, pentru


x=15, se observ urmtorul lucru: dovada c numrul x nu este prim s-a obinut deja dup
0 . n consecin, restul pailor
pasul al doilea, marcndu-se acest fapt prin atribuirea ok
ciclului se execut n mod inutil. Ar trebui ca imediat dup ce ok a devenit 0 s se
ntrerup ciclul. Algoritmul realizat cu o structur "ct timp", prezentat n cadrul
aceleiai aplicaii n lecia Structura repetitiv cu test iniial, nltur aceast deficien.
Va propunem s v reamintii algoritmul optim i s realizai o comparaie complet ntre
cele dou varinate.

89

Ali algoritmi care folosesc structuri repetitive cu contor

Aplicaie

R.II.32. Interpretarea unui pseudocod dat

(Bacalaureat iulie 2008, varianta 73)

Se
consider
citete a,b,p;
algoritmul alturat reprezentat n pseudocod, n care n r 0 ;
toate variabilele identific pentru (i a ,a+1,,b) execut
nceput
numere naturale (a<b). S-a
xi;
notat
cu
x%y
restul
ct timp (x 0 I x % p 0 ) execut
mpririi numrului natural
x [ x /p];
x la numrul natural nenul
dac (x 0 ) atunci
y, iar prin [x/y] ctul
n r n r +1;
mpririi ntregi a numrului
sfrit
scrie nr;
natural x la numrul natural
nenul y.
a) Scriei ce se va afia pe ecran, dac se citesc pentru a valoarea 24,
pentru b valoarea 35 i pentru p valoarea 5.
b) Dac a=110, iar p=18, scriei cel mai mare numr care poate fi citit
pentru b, astfel nct s se afieze valoarea 0.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
d) Scriei n pseudocod un algoritm echivalent cu cel dat, n care s se
nlocuiasc structura "ct timp...execut" cu o structur repetitiv de alt tip.
e) Scriei n pseudocod un algoritm echivalent cu cel dat, care s conin o
singur structur repetitiv, a doua structur repetitiv urmnd a fi nlocuit cu o
structur liniar.

Rezolvare
:

a)
S urmrim evoluia algoritmului pentru a=24, b=35 i p=5.
Iniial nr=0. n ciclu, contorul i parcurge succesiv valorile 24,25,...,35, deci
ciclul va avea nu mai puin de 12 de pai. Evident nu o s-i putem detalia pe toi, aa c va
trebui s ne dm seama de la primii pai cam ce se ntmpl.
Pasul 1: i=24, x=i=24, execut ciclul "ct timp":
Pasul 1.1.: x0 I x%p0 ? 240 I 24%50 ? da
x
[x/5], x=[24/5], x=4
Pasul 1.2.: x0 I x%p0 ? 40 I 4%50 ? da
x
[x/5], x=[4/5], x=0
Pasul 1.3.: x0 I x%p0 ? 00 I 4%50 ? nu iese din ciclu
Dup ciclul "ct timp", ieind cu valoarea x=0 , condiia "x0 " din linia
"dac" nu este ndeplinit.
90

Pasul 21: i=25, x=i=25, execut din nou ciclul "ct timp":
Pasul2.1.: x0 I x%p0 ? 250 I 25%50 ? nu iese din ciclu
De aceast dat condiia "x=0 " este ndeplinit, motiv pentru care face atribuirea
nr
nr+1, adic nr=0+1, nr=1.

Pentru a ne da seama ce reprezint valoarea lui nr, plecm de la ntrebarea "cnd


se incrementeaz nr ?". Atunci cnd se iese din ciclul "ct timp" cu o valoare a lui x
diferit de zero. n regul, dar cnd se ntmpl asta ? Dac privim derularea algoritmului
pe exemplul nostru, prezentat mai sus, observm c:
pentru x=24, deoarece condiia "x%p0 " a fost adevrat la primul pas, ea a
[x/p] , prin care x se mparte n mod repetat
rmas adevrat la infinit, iar atribuirea x
la p, se execut succesiv pn cnd x ajunge la valoarea 0. Practic, ieirea din ciclu este
determinat tocmai de acest moment, n care condiia "x0 " devine fals. Dac nu ar
exista i condiia "x0 ", am avea de-a face cu un ciclu infinit, ntruct cealalt condiie,
"x%p0 " este adevrat "n vecii vecilor". De fapt este ceva normal: dac un numr x nu
este divizibil cu p, atunci nici ctul mpririi lui x la p nu are cum s fie divizibil cu p !
pentru x=25, condiia "x%p0 " este fals chiar de la intrarea n ciclul "ct
timp", deci acest ciclu nu va avea nici un pas, iar la finele lui valoarea lui x este cea
iniial (adic 25 n cazul nostru). n consecin, condiia "x0 " din linia "dac" este
adevrat, fapt care conduce la incrementarea lui nr. Nu este deloc greu s v dai seama
c acest lucru se ntmpl pentru toate valorile lui x care sunt divizibile cu p ! n exemplul
de la primul subpunct, cu x=24,25,...,35 i p=5, incrementarea lui nr se petrece de trei
ori, pentru x=25, x=30 i x=35. n concluzie, algoritmul afieaz valoarea 3.
c)
Dup explicaiile anterioare, credem c v-ai dat seama care este aciunea
algoritmului. El contorizeaz cte dintre numerele naturale situate n intervalul [a,b]
sunt divizibile cu p.
e)
Pornind de la enunul de mai sus, putem concepe cu uurin o variant de
algoritm care s nu necesite al doilea ciclu, cel de tipul "ct timp". Practic, se parcurg n
contorul i toate numerele naturale de la a la b, i, pentru fiecare valoare a lui i se testeaz
dac este divizibil cu p, iar n caz afirmativ se incrementeaz nr. Iat pseudocodul:
citete a,b,p;
nr
0;
pentru (i
a,a+1,,b) execut
nceput
x
i;
dac (x%p==0) atunci
nr
nr+1;
sfrit
scrie nr;

d)
Practic, putem nlocui structura "ct timp <condiie> adevrat execut
<secven>", cu o structur echivalent cu test final de genul "execut <secven> pn
cnd <condiie> adevrat".
91

citete a,b,p;
nr
0;
a; a+1,,b) execut
pentru (i
nceput
x
i;
execut
x
[x/p];
ct timp (x0 SI x%p0);
dac x0 atunci
nr
nr+1;
sfrit
scrie nr;

b)
n cazul a=110 i p=18, contorul i pleac de la 110. Pentru ca variabila nr s
rmn cu valoarea iniial 0, trebuie ca i s nu ajung la o valoare divizibil cu 18 (n
momentul n care se ntlnete un numr divizibil cu 18 se incrementeaz nr !). Cum
primul numr natural divizibil cu 18 mai mare ca 110 este 126, rezult c contorul i poate
merge cel mult pn la 125. Deci valoarea lui b, care reprezint cellalt capt al
intervalului, poate fi oricare dintre numerele 110,111,...,125.

ncercai singuri ! - Tema nr. T.32.


1. (Bacalaureat iulie 2009, varianta 22)

Se consider algoritmul
citete n;
alturat, descris n pseudocod. S-a
dac (n<0) atunci
notat cu [a] partea ntreag a
n
-n;
numrului real a i cu y|x faptul
d
1;
c numrul ntreg y este divizibil
2,3,,[n/2]) execut
pentru (i
cu numrul ntreg nenul z.
dac (i|n) atunci
a) Scriei valoarea care se
d
i;
va afia pentru n=45.
scrie d;
b) Scriei toate valorile cu
exact dou cifre care pot fi citite pentru variabila n, astfel nct s se afieze
numrul 5.
c) Scriei o valoare pentru n, astfel nct n urma executrii algoritmului
obinut prin nlocuirea structurii "pentru (i
2,3,,[n/2]) execut" cu o
alta n care contorul parcurge aceleai valori dar n ordine invers, s se afieze
aceeai valoare, ca n algoritmul iniial.
d) Formulai un enun scurt care s descrie aciunea algoritmului.
e) Scriei un algoritm echivalent, n care structura repetitiv de tipul
"pentru" s fie nlocuit cu un alt gen de structur repetitiv.
2. (Bacalaureat iulie 2009, varianta 19)
Se consider algoritmul alturat, descris n pseudocod, n care s-a notat cu
cu x%y restul mpririi numrului natural x la numrul natural nenul y i cu [z]
partea ntreag a numrului real z.
92

a) Scriei numerele care se vor


afia n urma executrii algoritmului, dac citete a,b;
a
[a/10]%10*10+a%10;
se citesc valorile a=312 i b=1354.
b
[b/10]%10*10+b%10;
b) Scriei cte o valoare care
(i
a,a+1,,b) execut
pentru
poate fi citit pentru variabila a,
atunci
dac
([i/10]=i%10)
respectiv b, astfel nct algoritmul s
scrie i%10;
afieze exact dou valori.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
d) Scriei n pseudocod un algoritm echivalent cu cel dat, n care s se
nlocuiasc structura "pentru...execut" cu o structur repetitiv de alt tip.
3. (Bacalaureat iulie 2009,
varianta 71)

s
0;
citete n;
pentru (i
1,2,,n) execut
nceput
citete x;
ct timp (x>9) execut
x
[x/10];
1,2,,i-1) execut
pentru (j
x
x*10;
s
s+x;
sfrit
scrie s

Se consider algoritmul
alturat, descris n pseudocod. S-a
notat cu [a/b] ctul mpririi ntregi
a numrului natural a la numrul
natural nenul b.
a) Scriei valoarea ce se va
afia dac se citesc pentru n valoarea
5 i pentru x, n aceast ordine,
valorile: 523, 4256, 324, 4, 86935.
b) Dac n=4, scriei un ir
de valori care pot fi citite pentru x astfel nct s se afieze 1234.
c) Formulai un enun scurt care s descrie aciunea algoritmului.
d) Scriei n pseudocod un algoritm echivalent cu cel dat, care s utilizeze n
locul structurii "ct timp...execut" o structur repetitiv condiionat posterior.
4. (Bacalaureat iulie 2000,
varianta 4)

citete n,a;
nr
1; max
1;
2,3,..n) execut
pentru (i
nceput
citete b
dac (a==b) atunci
nr
nr+1
altfel
nceput
dac (nr>max) atunci
max
nr
nr
1
sfrit
a
b
sfrit
scrie max

Se consider urmtoarea
secven de instruciuni, scris n
pseudocod:
a) Ce se va afia pe ecran dac
se citesc n ordine valorile: 9 1 1 1 2
2 3 3 3 3?
b) Scriei o secven de
instruciuni echivalent care s utilizeze
o structur repetitiv ct timp.
c) Formulai un enun scurt care
s descrie aciunea algoritmului dat.

93

Aplicaie

R.II.33. Numere pare i divizibile cu 5

(Bacalaureat iulie 2008, varianta 27, enun adaptat)


Scriei un program care, pentru un numr natural n nenul de cel mult patru
cifre citit de la tastatur, afieaz, n ordine cresctoare primele n numere naturale
pare i divizibile cu 5, precum, i suma acestora.
Exemplu: pentru n=6 se vor afia numerele 10 20 30 40 50 60

Rezolvare
:

 Pentru nceput trebuie s citim valoarea lui n, i s iniializm cu 0 variabila S


n care vom actualiza suma numerelor cerute.
Dup cum tii, numerele pare i divizibile cu 5, fiind divizibile cu 2 i 5, sunt n
mod categoric divizibile i cu 10. Aadar problema se reduce la generarea primelor n
numere naturale divizibile cu 10. Acestea sunt de forma 10*k, unde k este un numr
natural (10=10*1, 20=10*2, 30=10*3, etc.). ntruct se cer primele n astfel de numere,
avem nevoie de un ciclu "pentru", n care contorul k va lua pe rnd valorile 1,2,...,n.
La fiecare pas:

afim un numr de forma 10*k (cel rezultat pentru valoarea lui k de la acel
pas), urmat de un spaiu;

adugm valoarea n cauz la suma S a tuturor numerelor generate


S+10*k}.
{S
 n final afim suma S a primelor n numere pare i divizibile cu 5.
citeste n;
S
0;
pentru (k
1,2,...,n) execut
nceput
scrie 10*k;
S
S+10*k;
sfrit
scrie S;

ncercai singuri ! - Tema nr. T.33.


1. Fiind date dou numere ntregi a i m, s se scrie o funcie care
returneaz valoarea lui am, calculat prin nmuliri repetate, dup formula
am=a*a*...*a (de m ori).
2. S se calculeze produsul a dou numere prin adunri repetate, dup
relaia a*b=a+a+...+a (de b ori).
3. Fiind dat un numr natural n citit de la tastatur, s se afieze
produsul numerelor naturale mai mici sau egale dect n (factorialul numrului
natural n, notat n!=12...n).
94

Aplicaie

R.II.34. irul lui Fibonacci

S se afieze primii n termeni ai irului lui Fibonacci. irul are primii doi
termeni egali cu 1 i fiecare din urmtorii termeni este egal cu suma dintre
termenul precedent i termenul ante-precedent.

Rezolvare
:

 Fie F1,F2,...,Fn primii n termeni ai irului. Conform definiiei avem:


F 1=1 , F 2=1 , F k=F k-1+F k-2 k
3
De exemplu: pentru k=3 F 3=F 2+F 1=1+1=2
pentru k=4 F 4=F 3+F 2=2+1=3

 Generm termenii irului ncepnd cu al treilea (F3, F4, ..., Fn) ntr-un ciclu:
indicele i ia pe rnd valorile 3,4,...,n, i pentru fiecare i se genereaz termenul Fi n
variabila fib. Memorm precedentul i ante-precedentul fiecrui termen n variabilele
prec i anteprec.
nainte de ciclu, iniializm prec i anteprec cu primii doi termeni ai irului F1
i F2 (prec
1 i anteprec
1 ), deoarece primii doi termeni vor fi precedentul i anteprecedentul pentru F3 generat la primul pas al ciclului (F 3 =F 2 +F 1 ). La fiecare pas, pentru
fiecare valoare a lui i, vom genera termenul Fi n variabila fib, ca fiind suma dintre
precedentul i ante-precedentul su (fib
prec+anteprec ) apoi vom stabili cine vor
fi precedentul prec i ante-precedentul anteprec pentru termenul urmtor:
fib prec anteprec
noul ante-precedent va fi cel care a fost precedent
la pasul curent adic prec (anteprec
prec ; )
F3 = F2 + F1
noul precedent pentru pasul urmtor va fi termenul
tocmai generat, adic fib (prec
fib )
F4 = F3 + F2
noul noul
prec anteprec
citete n;
prec
1;
anteprec
1;
scrie prec,anteprec;
pentru (i
3,...,n) execut
nceput
fib
prec+anteprec;
scrie fib;
anteprec
prec;
prec
fib;
sfrit

ncercai singuri ! - Tema nr. T.34.


1. Scriei un algoritm care, pentru o valoare a lui n citit de la tastatur,
determin i afieaz primii n termeni ai irului definit prin relaia de recuren:
95

a n + 1 = 1 + a 2n

() n 1, a0 = 1

2. Scriei un algoritm care, pentru o valoare a lui n citit de la tastatur,


determin i afieaz primii n termeni ai irului definit prin relaia de recuren:
xn = 2 xn 1 + xn 2

Aplicaie

() n 2 , x 0 = 0 , x 1 = 1

R.II.35. Triunghi de numere

S se afieze triunghiul de numere


alturat, pentru o valoare dat a lui n.

1
1 3
1 3 5
.............
1 3 5 ...... 2n
1

Rezolvare
:

Triunghiul are n linii pe care le numerotm cu 1,2,...,n. Folosim un ciclu


pentru, n care valorile contorului i vor fi numerele de ordine ale liniilor,
i=1,2,...,n, i la fiecare pas: afim linia cu numrul de ordine i pe un rnd al
ecranului, apoi mutm cursorul la nceputul rndului urmtor.
S vedem cum afim o linie i. Observm c pe linia 1 avem un element, pe linia
a doua dou elemente, pe linia a treia trei elemente etc., deci pe o linie oarecare i avem i
elemente. Numerotm elementele de pe linia i cu 1,2,...,i. Folosim un alt ciclu
pentru, n care valorile contorului j sunt numerele de ordine ale elementelor de pe linia
i, adic j=1,2,...,i; la fiecare pas, afim elementul cu numrul de ordine j. Acesta
este de forma 2*j-1, dup cum se poate observa din exemplul de mai jos n care
considerm linia i=3 cu elementele 1,3,5.
 j=1 elementul cu numrul de ordine 1 este 1=2*1-1
 j=2 elementul cu numrul de ordine 2 este 3=2*2-1
 j=3 elementul cu numrul de ordine 3 este 5=2*3-1
citete n;
pentru (i
1,...,n) execut
nceput
pentru (j
1,...,i) execut
scrie 2*j-1, ' ';
<salt la rnd nou>
>;
sfrit;
sfrit

ncercai singuri ! - Tema nr. T.35.


1. Scriei un algoritm care, pentru o valoare a lui n citit de la tastatur,
afieaz pe ecran urmtorul triunghi de numere.

96

2
2 4
2 4 6
............
2 4

6...... 2n

Exemplu: pentru n=4, se vor afia urmtoarele rnduri de numere:


2
2 4
2 4 6
2 4 6 8
2. Scriei un algoritm care, pentru o valoare a lui n citit de la tastatur,
afieaz pe ecran urmtorul triunghi de numere.
1 2 3 ..... n
..........
1 2 3
1 2
1

Ai neles ?

ntrebri cu rspuns scurt

1. (Bacalaureat iulie 2008, varianta 27)


Algoritmul de mai jos i propune s determine n variabila min cea mai mic
valoare dintre cele n numere ntregi citite de la tastatur, numere care sunt mai mici dect
100. Precizai valoarea iniial a variabilei min, care trebuie scris n loc de ..., astfel
nc algoritmul s aib efectul dorit.
citete n;
min...;
pentru i de la 1 la n execut
nceput
citete x;
dac x<min atunci minx;
sfrit;
scrie min;

a) 100

b) 1

c) 0

d) -MAXINT

2. (Bacalaureat iulie 2008, varianta 45)


Deducei care este valorea afiat n urma execuiei algoritmului reprezentat prin
pseudocodul de mai jos:
y 0; x0;
pentru (i1,2,3) execut
nceput
xy+i;
yx;
sfrit;
scrie x;

97

Urmtoarele dou probleme se refer la algoritmul de mai jos reprezentat n


pseudocod, n care toate variabilele identific numere naturale, iar prin a mod b s-a
notat restul mpririi lui a la b.
citete x;
p 1;
pentru (i1,2,,x) execut
p(p*4)%10;
scrie p;

3. (Bacalaureat iulie 2009, varianta 99)


Deducei ce valoare se va afia n urma execuiei algoritmului, dac de la tastatur
se citete x=8.
4. (Bacalaureat iulie 2009, varianta 99)
Scriei toate numerele naturale alctuite dintr-o singur cifr care ar putea fi citite
n variabila x, astfel nct, la finele execuiei algoritmului, s se tipreasc valoarea 4.
Urmtoarele dou probleme se refer la algoritmul de mai jos reprezentat n
pseudocod, n care toate variabilele identific numere naturale.
citete n;
k 0;
pentru (i1,2,,n) execut
pentru (j 1,2,,i) execut
nceput
scrie i+j;
k k+1;
sfrit;
scrie k;

5. (Bacalaureat iulie 2009, varianta 64)


Dac de la tastatur se citete valoarea n=4, care este antepenultimul numr afiat.
6. Dac de la tastatur se citete valoarea n=7, cte numere se afieaz n total
pe parcursul execuiei algoritmului ?
7. (Bacalaureat iulie 2009, varianta 64)
Deducei ce valoare ar putea fi citit n variabila n, astfel nct numrul 64 s fie
afiat de exact 20 de ori.

98

Aprofundare
Probleme rezolvate
R.II.36

Construirea unui ir

(Bacalaureat iulie 2008, varianta 23)

Se consider irul cresctor format din toate numerele naturale


{1,2,3,....}, luate n aceast ordine, n care fiecare numr se repet de exact k
ori. De exemplu, pentru k=4, irul astfel definit este:
1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,...

Scriei un algoritm care citete de la tastatur dou numere naturale n i k


(1 k 1 0 0 , 1 n 1 0 0 0 0 0 0 0 0 ), apoi, utiliznd un algoritm eficient din punctul
de vedere al spaiului de memorie i al timpului de executare, scrie primii n
termeni ai irului, n ordine descresctoare, separai prin cte un spaiu.
Exemplu: pentru n=17 i k=3, primii 17 termeni ai irului format cu
numerele din mulimea {1,2,3,...}, luate succesiv, n care fiecare numr se
repet de 4 ori este:
(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6)

iar pe ecran se va afia


6 6 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1

Rezolvare
:

n primul rnd, trebuie remarcat faptul c exist posibilitatea ca cea mai mare
valoare din ir (care va fi ultima n irul cresctor, respectiv prima n irul descresctor) s
nu se repete de exact k ori, aa cum se ntmpl cu celelalte valori. Aa stau lucrurile i n
exemplul din enun. Se cere repetarea de cte k=3 ori a fiecrei valori din mulimea
{1,2,3,...}, dar, cum sunt n=17 termeni, rezult c valorile 1, 2, 3, 4 si 5 se repet
ntr-adevr de cte trei ori fiecare, ns pentru valoarea 6 nu mai sunt disponibile dect
dou repetri (ca s se ajung n final la 5*3+2=17 termeni).
ntr-un astfel de caz, imediat dup citirea lui n i k, trebuie s afim separat acel
termen care se repet de un numr incomplet de ori. Se observ c valoarea respectivului
termen este [n/k]+1, iar el se repet de n%k ori (pe exemplu, pentru n=17 i k=3,
termenul este 6 adic tocmai 17/3+1, iar el se repet de 17%3 ori, adic de dou ori). Prin
urmare, vom scrie un ciclu "pentru" n care contorul i va parcurge succesiv valorile
1,2,...,n%k, i la fiecare pas afim valoarea [n/k]+1, urmat de un spaiu. Aceast
situaie special a ultimului termen apare numai atunci cnd n nu este divizibil cu k, adic
n%k0, dar nu este necesar punerea unei condiii de tipul "dac-altfel": n cazurile n
care n este divizibil cu k, adic n%k este 0, contorul ciclului "pentru" va evolua de la 1 la
0, deci acest ciclu special nu se va executa niciodat !
99

n continuare trebuie afiai n ordine descresctoare ceilali termeni, care se


repet fiecare de cte k ori. Dac termenul special a fost [n/k]+1, evident ceilali termeni
vor evolua descresctor de la [n/k] la 1, deci trebuie s proiectm un ciclu "pentru", n
care acetia s treac pe rnd printr-un contor v. Pentru fiecare termen v, ca s-l afim de
exact k ori, avem nevoie de un alt ciclu "pentru", n care contorul i va lua succesiv
valorile 1,2,...,k. La fiecare pas, la "intersecia" celor dou cicluri, afim valoarea lui
v, urmat de un spaiu.
citete n,k;
pentru (i 1,2,...n%k)
scrie [n/k] + 1, " ";
pentru (v n/k,...,2,1)
pentru (i 1,2,...,k)
scrie v, " ";

R.II.37

De sc o mpune r e

Fiind dat un numr natural n, s se gseasc toate posibilitile de a


descompune pe n n sum de numere naturale consecutive.
Exemplu: pentru n=15, descompunerile posibile sunt: 15=1+2+3+4+5,
15=4+5+6 i 15=7+8.

Rezolvare
:

Este evident c, indiferent de valoarea lui n, nu pot exista dou reprezentri de


aceeai lungime, sau avnd acelai prim element. Pe de alt parte, primul element al
oricrei reprezentri nu poate fi mai mare dect [n/2] (dac ar fi mai mare dect
jumtatea lui n atunci suma dintre primul element i consecutivul su ar depi deja n ! ).
ntr-un ciclu cu numr finit de pai, parcurgem n contorul i numerele naturale de
la 1 la [n/2], i pentru fiecare valoare a lui i ncercm s gsim (dac exist)
descompunerea care pleac de la i, astfel:
calculm succesiv n variabila S sumele S=i+(i+1), S=i+(i+1)+(i+2),..,
S=i+(i+1)+(i+2)+...+(i+k). Pentru aceasta, vom folosi o structur repetitiv cu test
iniial. Iniializm cu 0 suma S i contorul k, la fiecare pas adugm la S un termen de
forma (i+k), iar ciclul se execut ct timp (S+i+k<=n) I (k<=[n/2]+1); (v lsm s
deducei singuri de ce condiia trebuie s arate astfel);
dup ieirea din acest al doilea ciclu, dac valoarea lui S este egal cu n,
nseamn c S constituie o reprezentare a lui n ca sum de numere naturale consecutive.
citete n;
pentru (i 1,...,[n/2]) execut
nceput
S0;
k0;
ct timp (S+i+k<=n I k<=[n/2]+1) execut
nceput
S S+(i+k);
scrie i+k, "+";

100

sfrit
dac (S==n) atunci
scrie "Este";
altfel
scrie "Nu este";
sfrit

R.II.38

Tabla nmulirii

(Bacalaureat, iulie 2002, varianta 5)

Se citesc de la tastatur trei numere naturale f, a i b, fiecare numr avnd


cel mult trei cifre. S se afieze o "tabl" cu toate nmulirile de doi factori naturali
dintre care unul este obligatoriu f i care dau ca rezultate numai numere cuprinse
ntre a i b inclusiv. nmulirile vor fi afiate cte una pe linie, n ordinea
cresctoare a rezultatelor.
De exemplu, pentru f=5, a=8 i b=25 se va afia "tabla nmulirilor cu 5"
astfel:
2*5=10
3*5=15
4*5=20
5*5=25

Rezolvare
:
Mai nti citim de la tastatur numerele f, a i b. ntruct se cere ca aceste numere

s aib cel mult trei cifre, realizm i o validare a datelor: citirea lor se repet (se reia) pn
cnd introducem trei valori cuprinse ntre 0 i 999 inclusiv.
ntr-un ciclu, parcurgem n contorul i toate numerele naturale de la a la b
inclusiv. Pentru fiecare astfel de numr i, testm dac se mparte exact la f (i%f==0). n
caz afirmativ, nseamn c am gsit un numr natural c care nmulit cu f d ca rezultat
tocmai acel i situat ntre a i b. Evident, respectivul c reprezint chiar ctul mpririi lui i
la f (c i / f). nmulirea invers este c*f=i, n care c constituie primul factor iar f al
doilea factor. De exemplu, pentru f=5, a=8 i b=25, avem i=8,9,...,24,25, prima
valoare a lui i care se divide cu 5 este i=10, pentru care avem:
i % f=0, adic 10 % 5=0; ctul mpririi este c=[i/f], adic c=[10/5]=2, iar
nmulirea invers este 2*5=10; observai c primul factor este c, al doilea factor este f,
iar rezultatul este i !
execut
citete f,a,b;
ct timp (f<0 SAU f>=999 SAU a<0 SAU a>999 SAU b<0 SAU b>999);
pentru (ia,...,b)
dac (i % f==0)
nceput
c [i/f];
scrie c,'*',f,'=',i;
sfrit

101

Probleme propuse

Tema nr. T.R.3.

Probleme propuse pentru toate tipurile de cicluri


1. Fiind dat un numr natural n, scriei un algoritm pentru calculul
expresiei E =1*2+2*3+3*4+...+n*(n+1).
2. (Bacalaureat iulie 2009, varianta 11)

Scriei un algoritm care citete de la tastatur un numr natural nenul n,


precum i n numere naturale, cu maximum nou cifre fiecare, apoi calculeaz i
afieaz pe ecran, cte numere prime conine irul citit.
Exemplu: pentru n=5 i valorile 12 3 9 7 1 se va afia pe ecran
valoarea 2 (n irul dat exist dou numere prime i anume 3 i 7).
Indicaii: Citim numerele n aceeai variabil x, ntru-un ciclu n care contorul
i, cu valorile 1,2,,n, nu are are rol dect acela de a numra citirile. Pentru fiecare x
citit, testm dac este prim cu algoritmul cunoscut, iar n caz afirmativ incrementm un
contor care numr valorile prime (iniializat cu 0).
3. (Bacalaureat iulie 2008, varianta 77)
Se citesc de la tastatur un numr natural n i un ir de n numere ntregi.

Scriei un algoritm eficient care determin cea mai mare valoare negativ dintre cele
citite, precum i numrul de apariii ale acesteia n cadrul irului. n cazul n care irul
citit nu conine nici o valoare negativ, se va afia mesajul NU EXIST.
Exemplu: Pentru n=8 i numerele (10,3,-4,-7,-4,-9,11,-4), se vor afia
valorile -4 i 3, deoarece -4 este cel mai mare element negativ al irului i apare de 3 ori.
4. (Bacalaureat iulie 2008, varianta 53)

Se

citesc de la tastatur dou numere naturale n i p,


(1<n<1000,1<p<10). S se afieze pe ecran, cu spaiu ntre ele, acele numere
naturale mai mici sau egale cu n, care au toate cifrele mai mici sau egale cu p.
Exemplu: pentru n=15 i p=2, se vor afia numerele 0,1,2,10,11,12.
5. Realizai un algoritm care afieaz "cifra de control" a unui numr
natural, determinat astfel: se calculeaz suma cifrelor numrului, apoi suma
cifrelor sumei obinute, .a.m.d., pn cnd rezultatul este o singur cifr.
6. Dou numere naturale a i b se numesc gemene dac sunt prime i
diferena lor n modul este 2. S se afieze perechile de numere gemene care se
pot forma pe mulimea numerelor naturale mai mici sau egale cu n, unde valoarea
lui n se citete de la tastatur. Se cere un algoritm eficient de rezolvare.
Indicaii: Pentru a evita testarea condiiei privitoare la diferena n modul este
suficient s analizm perechile de numere de forma (i,i+2) cu i=1,2,...,n-2, i
pentru fiecare pereche s testm dac i i i+2 sunt ambele numere prime. Realizarea
unui algoritm eficient presupune:
s nu se parcurg divizorii inutili (vezi varianta cu ciclu cu test iniial a
algoritmului de numr prim);
s nu se mai testeze i+2 dac i nu este prim.
102

7. Se citete de la tastatur un numr natural n (100<=n<=999). Dintre


numerele naturale mai mici sau egale cu n, s se afieze acelea care sunt divizibile
cu suma cifrelor lor.
8. Dintre primele n numere naturale, s se afieze acelea care au exact k
divizori. Valorile lui n i k se citesc de la tastatur.
9. (Bacalaureat iulie 2009, varianta 97 - enun adaptat)
Se citesc de la tastatur dou numere naturale x i y, cu maxim patru cifre

fiecare. Scriei un algoritm care tiprete pe ecran suma numerelor pare cuprinse
ntre x i y inclusiv.
Exemplu: pentru x=12 i y=23, se va afia valoarea 102.
10. S se afieze toate numerele perfecte situate n intervalul [p,q ] , precum

i numrul acestora, unde p i q sunt dou numere naturale date (vezi problema 4).
11. S se afieze numerele prime de trei cifre care citite invers sunt tot numere prime.
12. Se dau dou numere natural n i p. S se stabileasc dac p este
prim i n caz afirmativ s se afieze la ce putere apare p ca factor prim n
descompunerea numrului n n factori primi.
13. Un numr natural se numete perfect dac este egal cu suma
divizorilor si. Exemplu: 6=1+2+3. S se verifice dac un numr natural dat este
perfect, afindu-se un mesaj corespunztor.
14. ntr-o urn se gsesc mai multe bile roii i albe, pe fiecare bil fiind
nscris un numr natural. S se extrag pe rnd bile, pn cnd am scos din urn
cel puin m bile albe sau n bile roii. Scriei un program care simuleaz aceast
operaie, citind de la tastatur numrul fiecrei bile extrase. n final, programul va
afia dac cel mai mic numr extras se gsete pe o bil alb sau roie.
15. Se citete de la tastatur un ntreg n, apoi n perechi de numere
naturale cuprinse ntre 0 i 30000. Dintre perechile citite s se afieze acelea cu
proprietatea c cele dou elemente ale perechii au aceeai sum a cifrelor.
16. (Bacalaureat iulie 2008, varianta 36)

Realizai un algoritm care afieaz pe ecran toate numerele pare alctuite


din exact dou cifre. Respectivele valori vor fi scrise pe mai multe linii de ecran,
cte cinci pe fiecare linie, separate prin cte un spaiu.
17. Se dau dou numere natural n i p. S se stabileasc dac p este
prim i n caz afirmativ s se afieze la ce putere apare p ca factor prim n
descompunerea numrului n n factori primi.
18. (Bacalaureat iulie 2008, varianta 41)

Realizai un algoritm care afieaz pe ecran toate numerele impare


alctuite din exact dou cifre. Respectivele valori vor fi scrise pe mai multe linii de
ecran, cte trei pe fiecare linie, separate prin cte un spaiu.
103

19. (Bacalaureat iulie 2009, varianta 62)

Scriei un algoritm care afieaz pe ecran primii 20 de termeni impari ai


irului lui Fibonacci (0,1,1,2,3,5,8,13,21,), cte 5 pe o linie. Termenii
afiai pe aceeai linie a ecranului vor fi separai ntre ei prin cte un spaiu.
20. Se d un ir de numere care se citesc pe rnd de la tastatur, atta
timp ct nu s-a introdus valoarea 0 (care nu face parte din ir). S se afieze
perechile de numere consecutiv citite cu proprietatea c al doilea element al
perechii este egal cu dublul primului.
21. Pentru un numr ntreg n dat, s se calculeze fiecare dintre
expresiile de mai jos:
b)
c)

E = 12 + 42 + 72 + ..... + (3n 2)2


E = 1 3 5 ... (2n 1)
E = 1 + 1 2 + 1 2 3 + ..... + 1 2 3 ... n

d)

E = 2 4 + 6 + .... + ( 1)n + 1 (2n )

a)

22. Se citesc de la tastatur dou numere ntregi x i n. Calculai

valoarea sumei:

S = x +

x3
x5
+
+ ... +
3
5

x 2n 1
(2n 1)

23. Un numr natural se numete perfect dac este egal cu suma


divizorilor si. Exemplu: 6=1+2+3. S se verifice dac un numr natural dat este
perfect, afindu-se un mesaj corespunztor.
24. ntr-o urn se gsesc mai multe bile roii i albe, pe fiecare bil fiind
nscris un numr natural. S se extrag pe rnd bile, pn cnd am scos din urn
cel puin m bile albe sau n bile roii. Scriei un program care simuleaz aceast
operaie, citind de la tastatur numrul fiecrei bile extrase. n final, programul va
afia dac cel mai mic numr extras se gsete pe o bil alb sau roie.
25. Se citete de la tastatur un ntreg n, apoi n perechi de numere
naturale cuprinse ntre 0 i 30000. Dintre perechile citite s se afieze acelea cu
proprietatea c cele dou elemente ale perechii au aceeai sum a cifrelor.
26. (Bacalaureat iulie 2009, varianta 87 - enun adaptat)

Se citesc de la tastatur dou numere naturale a i b unde a conine cel


mult nou cifre, iar b este strict mai mic dect numrul de cifre a lui a. Scriei un
algoritm care nlocuiete cu 0 ultimele b cifre ale numrului a i afieaz pe ecran
valoarea astfel obinut.
Exemplu: pentru a=1844657 i b=3, numrul tiprit este 1844000.
Indicaii: Trebuie s determinm ctul mpririi lui a la 10b, iar pe acesta s-l
nmulim cu 10b. De pild, pentru a=1844657 i b=3, avem 103=1000, apoi 1844657
div 1000=1844 i 1844*1000=1844000

104

27. (Bacalaureat iulie 2008, varianta 79)

Scriei un algoritm care elimin prima i ultima cifr dintr-un numr natural
n citit de la tastatur. Numrul dat poate avea minim 3 i maxim nou cifre.
Exemplu: pentru n=323958, se va afia pe ecran numrul 2395.
28. (Bacalaureat iulie 2009, varianta 97)
Se citete de la tastatur un numr natural n cu maxim nou cifre. Scriei

un algoritm care afieaz pe ecran numrul care se obine cu cifrele de rang impar
ale lui n luate n ordine natural, urmate de cifrele de rang par luate n ordine
invers. Prin rangul unei cifre nelegem poziia pe care o ocup cifra n cadrul
numrului, numrat de la dreapta la stnga.
Exemplu: pentru n=275839, algoritmul va tipri numrul 789352.
29. (Bacalaureat iulie 2008, varianta 98)

Se citete de la tastatur un numr natural n alctuit din cel mult opt cifre.
Scriei un algoritm care afieaz mesajul DA dac numrul dat are toate cifrele
identice, respectiv NU n caz contrar.
Exemplu: pentru n=77777, se va afia mesajul DA
30. (Bacalaureat iulie 2008, varianta 44)

Se citesc de la tastatur dou numere naturale n i k, unde n poate avea


maxim nou cifre i 0<k<10. Scriei un algoritm care afieaz numrul obinut
prin eliminarea primelor k cifre ale lui n. Dac valoarea lui k este mai mare dect
numrul de cifre ale lui n, se va afia mesajul IMPOSIBIL.
31. (Bacalaureat iulie 2009, varianta 76 - enun adaptat)

Scriei un algoritm care citete de la tastatur un numr natural m cu maxim


nou cifre i o cifr zecimal c aparinnd mulimii {0,1,2,...,9}, apoi
determin i afieaz numrul de cifre ale lui n care aparin intervalului [c-1,c+1].
Exemplu: pentru n=1233 i c=3 se va afia valoarea 3, iar pentru n=650
i c=3 algoritmul trebuie s tipreasc valoarea 0.
32. (Bacalaureat iulie 2009, varianta 89 - enun adaptat)

Se citesc de la tastatur valorile a trei variabile n, c1 i c2, unde n este un


numr natural format din cel mult nou cifre, iar c1 i c2 memoreaz cte o cifr.
Realizai un algoritm care nlocuiete cu cifra c2 fiecare apariie a cifrei c1 n
cadrul numrului n, i afieaz pe ecran valoarea astfel obinut. n cazul n care
cifra c1 nu se regsete n numrul n, valoarea lui n va rmne nemodificat.
Exemplu: pentru n=149448, c1=4 i c2=2 algoritmul va afia valoarea 129228.
33. (Bacalaureat iulie 2009, varianta 27 - enun adaptat)

Scriei un algoritm care citete de la tastatur dou numere naturale x i y,


cuprinse n intervalul [1,100], apoi formeaz n memorie numrul real ce are
proprietatea c partea sa ntreag este egal cu x, iar cifrele aflate dup punctul
zecimal sunt cifrele numrului y n aceeai ordine.
Exemplu: pentru x=12 i y=534, pe ecran trebuie s se afieze numrul 12.534.
105

Indicaii: Mai nti formm n memorie numrul z=0.y, adic numrul care are
partea ntreag 0 i partea zecimal alctuit din cifrele lui y. Pentru aceasta, mprim
n mod repetat pe y la 10, pn cnd ctul mpririi devine mai mic dect 1. Numrul
cutat va fi x+z. Pentru exemplul din enun, cu x=12 i y=534, avem z=0.534, iar
x+z=12+0.534=12.534.
34. (Bacalaureat iulie 2009, varianta 79 - enun adaptat)
Se citete de la tastatur un numr real x, care poate conine cel mult patru

cifre n partea ntreag i cel mult ase cifre dup punctul zecimal. Realizai un
algoritm care construiete n memorie i afieaz pe ecran numrul obinut prin
inversarea ntre ele a prii ntregi i a prii zecimale a prii lui x.
Exemplu: dac se citete valoare x=15.231, trebuie s se afieze numrul 231.15.
35. (Bacalaureat iulie 2008, varianta 15)

Se citete de la tastatur un numr natural n (n<100), apoi n numere


naturale din mulimea {1,2,3}. Se cere s se afieze cele n valori citite n ordine
cresctoare, folosind un algoritm eficient din punctul de vedere al timpului de
execuie i al spaiului de memorare utilizat.
n=19
i
valorile
citite
Exemplu:
pentru
3,3,3,3,2,1,2,1,3,2,1,3,2,1,1,3,3,2,3, se va afia pe ecran irul
1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3.
Indicaii: Folosim trei contoare c1, c2, c3, n care vom numra valorile de 1, 2,
respectiv 3 din ir. Citim pe rnd cele n valori n aceeai variabil x, ntr-un ciclu n
care contorul i=1,2,,n numr citirile. Pentru fiecare x citit, n funcie de valoarea
sa, incrementm contorul corespunztor. n final, folosim trei cicluri distincte, afim
numrul 1 de c1 ori, valoarea 2 de c2 ori i numrul 3 de c3 ori.
36. S se determine toate numerele de trei cifre cu proprietatea c suma
inverselor cifrelor lor este un numr subunitar, iar cifrele sunt n ordine strict
cresctoare. Exemplu: Numrul 245: 1/5+1/4+1/2=fracie subunitar.
Indicaii: se genereaz toate posibilitile de a scrie cifre n ordinea cresctoare
i se verific dac suma inverselor cifrelor este un numr subunitar. n caz afirmativ se
va afia numrul format cu cele trei cifre.
37. Se citesc un numr natural n i coeficienii a,b,c, ai unei ecuaii de
gradul II de forma ax2+bx+c=0. Fr a rezolva ecuaia, s se calculeze valoarea
expresiei Sn=x1n+x2n, unde x1 i x2 sunt rdcinile ecuaiei.
Indicaii: Avem S1=x1+x2=-b/a (relaia lui Wiette). Deoarece x1 este rdcin,
rezult c ax12+bx1+c=0 (1), i analog, ax22+bx2+c=0 (2). Adunnd cele dou relaii
obinem aS2+bS1+c=0. Mai departe nmulim relaia (1) cu x1 i relaia (2) cu x2 dup
care adunm, rezultnd aS3+bS2+cS1=0. Generaliznd, vom vedea aSn+bSn-1+cSn-2=0,
recuren care se poate calcula ntr-un ciclu.
38. S se calculeze puterea la care apare numrul prim p n
descompunerea numrului 1*2*3*...*n, pentru un n natural dat.
Exemplu: pentru n=36 i p=3, se va obine puterea 16.
106

Indicaii. Facem mai nti observaia c pentru un n foarte mare, este


imposibil memorarea produsului 1*2*3*...*n ca numr ntreg. De aceea, rezolvarea
trebuie s evite folosirea acestui produs. Dac p este numr prim, atunci din "p divide
a*b" rezult "p divide a" sau "p divide b". n consecin, vom determina puterea lui p n
dezvoltarea fiecrui factor al produsului 1*2*...*n i vom nsuma puterile obinute.
Cum p este prim, vom lua n considerare numai factorii de forma k*p, unde k va lua
valori de la 1 pn la "parte ntreag din n/p".
39. (Bacalaureat iulie 2008, varianta 51)

Se citete de la tastatur un numr natural nenul n cu cel mult nou cifre.


Scriei un algoritm care gsete i afieaz un numr natural k astfel nct produsul
1*2*3**k-1*k s aib o valoare ct mai apropiat de n.
Exemplu: pentru n=25 se va obine k=4 (1*2*3*4=24), iar pentru n=119
programul va afia numrul 5.
40. (Bacalaureat iulie 2008, varianta 17)

Scriei un algoritm care afieaz pe ecran, separate prin virgul, toate


numerele naturale de patru cifre care au prima cifr strict mai mic dect a doua, a
doua cifr strict mai mic dect a treia, i a treia cifr strict mai mic dect a patra.
Exemplu: cteva astfel de numere ar fi 1201, 1202, 1203,, 8979, 8989.
Indicaii: pentru a obine toate numerele de forma c1c2c3c4 care s respecte
monotonia dorit, adic c1<c2, c2>c3 i c3<c4, putem proiecta patru cicluri imbricate,
n care contoarele vor lua valorile c1=1,...,8, c2=c1+1,...,9, c3=0,...,c2-1 i
c4=c3+1,...,9. Numerele cutate sunt de forma c1*1000+c2*100+c3*10+c4.
41. (Bacalaureat iulie 2008, varianta 61)

Se citete de la tastatur un numr natural k (1<=k<=4). S se afieze


toate palindroamele de cinci cifre (adic numerele naturale de forma c1c2c3c4c5
pentru care c1=c5 i c2=c4) cu proprietatea c diferena n valoare absolut dintre
oricare dou cifre alturate este egal cu k (adic |ci-ci+1|=k, pentru orice
i
{1,2,3,4}).
Indicaii: singurele numere care satisfac proprietatea cerut au una din formele
(i,i-k,i,i-k,i)(i,i-k,i-2*k,i-k,i)(i,i+k,i,i+k,i)(i,i+k,i+2*k,i+k,i).
Folosim un ciclu n care contorul i va primi ca valori cifrele zecimale de la 1 la 9; pentru
fiecare i, afim numerele ce se ncadreaz n formele de mai sus, avnd ns grij s punem
i condiiile de existen a lor: i-k>=0, i-2*k>=0, i+k<=9, i+2*k<=9.

42. (Bacalaureat iulie 2008, varianta 78)

Scriei un program Pascal C/C++ care citete de la tastatur un numr


natural n (1 < n < 30000) i care determin i afieaz pe ecran numrul divizorilor
primi a lui n.
Exemplu: pentru n=24 se afieaz 2 (deoarece are 2 divizori primi: 2 i 3),
iar pentru numrul 60 se afieaz 3 (deoarece are 3 divizori primi: 2, 3 i 5).
43. (Bacalaureat iulie 2008, varianta 60)

Se citesc de la tastatur trei numere naturale de cel mult opt cifre fiecare n,
a i b i se cere s se afieze pe ecran cte numere naturale mai mici sau egale cu
n sunt multipli a lui a, dar nu sunt multipli a lui b. De exemplu, dac n=100,
107

a=12, b=8, rezultatul afiat va fi 4 (numerele mai mici sau egale cu 100 care sunt
multipli a lui 12 dar nu i a lui 8 sunt 12, 36, 60, 84).
a) Alegei o metod eficient de rezolvare i descriei n limbaj natural
metoda aleas justificnd eficiena acesteia (4-6 rnduri)
b) Scriei programul Pascal / C/C++ corespunztor metodei alese la punctul a.
44. (Bacalaureat iulie 2008, varianta 62)
a) Scriei un program n limbajul Pascal / C/C++ , eficient din punctul de

vedere al duratei de executare, care afieaz toate numerele naturale formate din
cifre identice, mai mari dect 10 i mai mici dect o valoare dat n,
n<= 2.000.000.000.
De exemplu pentru n=195, se afieaz: 11, 22, 33, 44, 55, 66, 77, 88, 99, 111.
b) Explicai n limbaj natural metoda utilizat, justificnd eficiena ei (4-6 rnduri).
45. (Bacalaureat iulie 2008, varianta 64)

Scriei un program Pascal / C/C++ care citete de la tastatur dou numere


naturale nenule n i m (n<100, m<100), determin i afiez pe ecran toate perechile
a, b de numere naturale nenule distincte, cel mult egale cu n, care au cel mai mic
multiplu comun egal cu m. Perechile se vor afia pe cate o linie, iar numerele
corespunztoare fiecrei perechi vor fi separate printr-un spaiu, ca n exemplu.
De exemplu, pentru n=6 i m=6 se afieaz perechile:
1
2
2
3

6
3
6
6

46. (Bacalaureat iulie 2008, varianta 78)

Se citesc de la tastatur mai multe numere naturale de cel mult 3 cifre. Se


tie c se citesc cel puin 2 numere i c citirea continu, numr cu numr, pn
cnd se citete un numr egal cu primul numr citit. S se scrie un program Pascal,
C/C++ care citete numerele i afieaz pe ecran media aritmetic a numerelor
pare citite precum i numrul acestora. Se va afia mesajul NU EXIST dac nu
exist nici un numr par printre cele citite. Alegei o metod de rezolvare care va
gestiona eficient memoria.
De exemplu, dac se citesc pe rnd numerele 5 6 2 7 9 6 8 5 se vor
afia pe ecran valorile 5.5 i 4.
47. (Bacalaureat iulie 2008, varianta 95)

Scriei un program care citete de la tastatur dou numere naturale a i b


(0a, b200000000) i n cazul n care exist cel puin o aceeai cifr n ambele
numere, afieaz mesajul DA, iar n caz contrar afieaz mesajul NU.
De exemplu, pentru a=83 i b=119 se va afia pe ecran mesajul NU, iar
pentru a=5003 i b=720 se va afia DA.

108

Probleme de nota 10
48. Se citesc de la tastatur mai multe iruri de numere ntregi, fiecare
ir terminndu-se cu valoarea 0. Citirea se ncheie prin introducerea de dou ori
consecutive a valorii 0. S se afieze elementul maxim din fiecare ir, precum i
maximul tuturor irurilor.
Indicaii: Pentru a asigura ncheierea citirii la ntlnirea a dou zerouri
consecutive procedm astfel: n ciclul de citire, nainte de citirea unui numr n
variabila x, salvm x-ul citit la pasul anterior ntr-o variabil prec cu sensul de
termen precedent(iniial citim primul x nainte de ciclu i precx). Astfel, citirea se
ncheie n momentul n care prec=0 i x=0.
Folosim dou variabile max i maxg, n care vom reine maximul fiecrui ir i
maximul global. Dup citirea fiecrui nou x, dac acesta este diferit de 0 actualizm
max (prin comparare cu max de la pasul anterior, unde iniial max-MAXINT), iar la
ntlnirea valorii 0 actualizm similar maxg (prin comparare cu max).
49. Se citete un ir de numere ntregi pn cnd se introduce de dou
ori consecutiv aceeai valoare. S se afieze cte ptrate perfecte sunt n ir.
Exemplu: dac irul este 13 9 56 400 8 25 17 17, acesta conine trei
ptrate perfecte (numerele 9, 400 i 25).
Indicaii. Citim numerele pe rnd ntr-un ciclu, n aceeai variabil x. Pentru
fiecare x citit, dac este ptrat perfect ( x = x ) incrementm un contor (iniializat
cu 0). La fiecare pas, nainte de citirea unui nou numr n variabila x, salvm x-ul
curent ntr-o variabil y. Astfel, ciclul se execut pn cnd x=y.

[ ]

50. Se numete numr "bine ordonat descresctor" un numr natural, cu


proprietatea c cifrele sale citite de la stnga la dreapta sunt n ordine
descresctoare. Exemplu: 9653. Scriei un algoritm care verific dac un numr
natural x dat este "bine ordonat descresctor", afind un mesaj.
Indicaii. Presupunem mai nti c numrul x este "bine ordonat cresctor",
iniializnd cu true o variabil boolean. Reinem prima cifr a lui x (x mod 10) n
variabila y. Apoi, ntr-un ciclu, extragem pe rnd celelalte cifre, folosind algoritmul
prezentat n acest capitol. La fiecare pas, dac cifra curent este mai mic dect cifra
anterior extras y, variabila boolean devine false (numrul nu mai poate fi bine
ordonat cresctor), apoi salvm cifra curent n y (cifra curent va deveni cea
precedent la urmtorul pas).
51. Un numr natural are aspect de munte, dac cifrele sale sunt n
ordine cresctoare pn la o anumit poziie k i n ordine descresctoare ncepnd
cu acea poziie. Exemplu: 235754. Pentru un numr natural n citit de la tastatur,
s se verifice dac are aspect de munte, afindu-se un mesaj corespunztor.
Indicaii. Mai nti se stabilete cte cifre are numrul, cu ajutorul unui ciclu
de mpriri la 10 similar cu cel folosit pentru extragerea cifrelor. Presupunnd c
numrul are n cifre, primele k cifre trebuie s fie n ordine cresctoare, iar restul de n-k
cifre n ordine descresctoare. Realizm n continuare o testare logic prin intermediul
unei variabile booleene ok, iniialzat cu true. Extragem separat ultima cifr. Apoi
ntr-un ciclu ncepem s extragem cifrele de la dreapta la stnga, ncepnd cu penultima,
109

mergnd cel mult pn la cifra de rang k (deci fcnd n-k-1 extrageri). La fiecare pas,
dac cifra extras este mai mic dect cifra obinut la extragerea anterioar, atunci ok
devine false. Dac la finele acestui ciclu ok a rmas true, atunci vom continua cu
extragerea restului cifrelor, de la rangul k pn la rangul 1, procednd absolut similar.
52. Pentru un ntreg n dat, s se afieze toate perechile de numere
naturale mai mici sau egale dect n cu proprietatea c cel mai mare divizor comun
al elementelor perechii este o valoare dat d.
Indicaii. Pentru n=4, perechile de numere naturale mai mici dect n sunt
(1,2), (1,3), (1,4), (2,3), (2,4) i (3,4). Pe caz general, sunt de forma (i,j)
cu i=1,2,...,n-1 i j=i+1,...,n. Formm aceste perechi n dou cicluri, i pentru
fiecare pereche (i,j) determinm cel mai mare divizor comun al elementelor perechii,
dup care testm dac rezultatul este egal cu d. Atenie, algoritmul de c.m.m.d.c. nu
poate opera direct asupra lui i i j, ntruct i i j sunt variabile contor n cicluri, iar
modificarea lor n interiorul algoritmului lui Euclid ar altera funcionarea ciclurilor.
53. Se citete de la tastatur un numr natural par. S se descompun n
sum de dou numere prime (conjectura lui Goldbach).
Indicaii: tiind c n=i+(n-i), formm toate perechile de forma (i,n-i), cu
i=1,2,...,n-1. Pentru fiecare dintre aceste perechi testm dac numerele care compun
perechea (i care nsumate dau n) sunt prime; n caz afirmativ am gsit o descompunere.
54. S se afieze primii n termeni ai irului:
1,2,1,1,2,3,4,3,2,1,1,2,3,4,5,6,4,3,2,1,1,2,....
unde valoarea lui n se citete de la tastatur.
Indicaii: n niruirea de mai sus putem mpri termenii n grupe astfel:
(1,2,1), (1,2,3,4,3,2,1), (1,2,3,4,5,4,3,2,1).... Observm c fiecare grup este
alctuit din numerele naturale de la 1 la 2*k n ordine cresctoare, urmate de numerele
de la 2*k la 1 n ordine descresctoare, unde k ia pe rnd valorile 1,2,3,... Pentru a
afia exact n termeni, vom folosi un ciclu cu test final n care contorul j va numra
termenii generai (ciclul executndu-se ct timp j<=n, unde iniial j:=1).
55. S se afieze al n-ulea termen al irului: 1,1,2,1,2,3,1,2,3,4,...,
unde valoarea lui n se citete de la tastatur.
Indicaii: irul este alctuit din numrul 1, numerele naturale de la 1 la 2,
numerele naturale de la 1 la 3, etc. Pe caz general, irul conine grupe de numere
naturale de la 1 la k, unde k=1,2,3,...
56. S se determine toate numerele de trei cifre cu proprietatea c suma
inverselor cifrelor lor este un numr subunitar, iar cifrele sunt n ordine strict
cresctoare. Exemplu: Numrul 245: 1/5+1/4+1/2=fracie subunitar.
Indicaii: se genereaz toate posibilitile de a scrie cifre n ordinea cresctoare
i se verific dac suma inverselor cifrelor este un numr subunitar. n caz afirmativ se
va afia numrul format cu cele trei cifre.
57. Se citesc de la tastatur dou numere ntregi a i b. S se verifice
dac cele dou numere sunt termeni consecutivi ai irului lui Fibonacci.
Indicaii. ntr-un ciclu while-do generm termeni ai irului atta timp ct
termenul obinut este mai mic sau egal dect a. Dup ieirea din ciclu testm dac
110

ultimul termen generat este mai mare dect a sau egal cu a. n primul caz rspunsul la
ntrebarea din enun este negativ. n al doilea caz determinm urmtorul termen i
verificm dac este egal cu b.
58. Se citesc un numr natural n i coeficienii a,b,c, ai unei ecuaii de
gradul II de forma ax2+bx+c=0. Fr a rezolva ecuaia, s se calculeze valoarea
expresiei Sn=x1n+x2n, unde x1 i x2 sunt rdcinile ecuaiei.
Indicaii: Avem S1=x1+x2=-b/a (relaia lui Wiette). Deoarece x1 este rdcin,
rezult c ax12+bx1+c=0 (1), i analog, ax22+bx2+c=0 (2). Adunnd cele dou relaii
obinem aS2+bS1+c=0. Mai departe nmulim relaia (1) cu x1 i relaia (2) cu x2 dup
care adunm, rezultnd aS3+bS2+cS1=0. Generaliznd, vom vedea aSn+bSn-1+cSn-2=0,
recuren care se poate calcula ntr-un ciclu.
59. (Bacalaureat iulie 2008, varianta 48)

Scriei un program C/C++ / Pascal care citete de la tastatur un numr


natural n (0< n <= 25 ) i un ir de n numere naturale cu cel mult patru cifre fiecare;
programul va determina i va afia pe ecran numrul maxim de factori primi
distinci care pot s apar n descompunerea n factori primi a unui numr din ir.
Exemplu: pentru n=6 i numerele 18 90 450 24 20 75 se afieaz 3
deoarece 90=2325 i 450=25232, fiecare coninnd trei factori primi, iar
celelalte numere citite au cte doi factori primi distinci.
60. (Bacalaureat iulie 2008, varianta 62)

International Standard Book Number (ISBN) este un cod unic utilizat


pentru identificarea fiecrei cri, format din 9 cifre urmate de o cifr de control
care poate fi o cifr sau caracterul x ce reprezint numrul 10. Semnificaia
cifrelor din cadrul unui cod ISBN de forma (a1a2.a10) este urmtoarea: (a1a2a3)
identific ara, (a4a5a6a7) identific editura, (a8a9) identific numrul asociat crii
iar
a10
reprezint
cifra
de
control
calculat
astfel
nct
a[1]1+a[2]2...+a[10]10 s fie divizibil cu 11. De exemplu 973 8934 05
2 este un cod ISBN si afieaz pe ecran cifra de control corespunztoare.
61. (Bacalaureat iulie 2008, varianta 68) dupa 9

Scriei un program Pascal / C/C++ care citete de la tastatur dou numere


naturale a i b cu acelai numr de cifre (0 < a < 30000 , 0 < b < 30000 ).
Programul va construi i afia pe ecran numrul natural c cu proprietatea
c fiecare cifr a acestuia este partea ntreag a mediei aritmetice a cifrelor situate
pe aceleai poziii n scrierea numerelor a i b.
Exemplu: Pentru a=3534 i b=5726, se va afia valoarea c=4625.
62. (Bacalaureat iulie 2008, varianta 86)

Se spune despre un numr natural c este superprim dac att el ct i


toate prefixele lui sunt numere prime. De exemplu, numrul 313 este un numr
superprim pentru c 313 este prim i prefixele: 3, 31 sunt numere prime.
Scriei un program Pascal / C/C++ care citete de la tastatur un numr natural
n cu cel mult opt cifre i care verific dac n este superprim. Programul afieaz pe
ecran mesajul DA dac numrul este superprim, astfel va afia mesajul NU.
111

63. (Bacalaureat iulie 2008, varianta 89)

Scriei un program Pascal / C/C++ care citete de la tastatur un numr


natural n cu cel mult nou cifre i care determin dac exist un numr natural k
cu proprietatea c n=123k. Dac exist un astfel de numr, programul va
afia pe ecran mesajul DA urmat de numrul k, separate printr-un spaiu, astfel va
afia mesajul NU.
Exemple: pentru n=720 se va afia DA 6 pentru c 6!!=720;
6!=123456; pentru n=721 se va afia NU.
64. (Bacalaureat iulie 2008, varianta 91)

Se citete de la tastatur un numr natural n, 0 < n < 1000000 . S se


afieze pe ecran, dac exist, un numr natural care este strict mai mare dect n i
care are exact aceleai cifre ca i n. Dac nu exist un astfel de numr, se va afia
mesajul NU EXIST.
De exemplu, pentru n=165, se poate afia valoarea 561.
a) Alegei un algoritm eficient ca timp de executare. Descriei metoda n
limbaj natural pe cel mult 4 rnduri.
b) Scriei programul Pascal / C/C++ corespunztor metodei descrise.
65. Realizai un program care afieaz rezultatele operaiilor de mai jos,
fr a efectua nmulirile i adunrile.
76*9+7=...
765*9+6=...
7654*9+5=...
.....
76543210*9+1=...
66. S se calculeze puterea la care apare numrul prim p n
descompunerea numrului 1*2*3*...*n, pentru un n natural dat.
Exemplu: pentru n=36 i p=3, se va obine puterea 16.
Indicaii. Facem mai nti observaia c pentru un n foarte mare, este imposibil
memorarea produsului 1*2*3*...*n ca numr ntreg. De aceea, rezolvarea trebuie s
evite folosirea acestui produs. Dac p este numr prim, atunci din "p divide a*b" rezult
"p divide a" sau "p divide b". n consecin, vom determina puterea lui p n dezvoltarea
fiecrui factor al produsului 1*2*...*n i vom nsuma puterile obinute. Cum p este
prim, vom lua n considerare numai factorii de forma k*p, unde k va lua valori de la 1
pn la "parte ntreag din n/p".
67. S se deseneze din caractere "stelu" un poligon regulat,
cunoscndu-se raza cercului circumscris, precum i numrul laturilor.
Indicaii: Coordonatele punctelor de pe cercul circumscris poligonului se
calculeaz cu formula x=x_c+r*cos(i*u) i y=y_c+r*sin(i*u), cu i=0,1,..,n-1
unde x_c i y_c sunt coordonatele centrului, iar unghiul u este a n-a parte din 360
grade.
68. S se reconstituie nmulirea din figur, tiind c fiecare liter i
fiecare "stelu" reprezint cifre de la 0 la 9. "Steluele" de la nceputul fiecrui
112

rnd precum i litera a nu pot reprezenta cifra 0, iar fiecare liter corespunde
unei cifre distincte. Afiai toate soluiile, precum i numrul acestora.
abcd *
abcd
______
*****
*****
*****
*****
___________
****abcd

Exemplu: o soluie este: (abcd)=9376.


69. Scriei un program care calculeaz ptratul unui numr natural cu
maxim 5000 de cifre care ncepe cu 3 i urmtoarele cifre sunt toate 6.
Observaie: Algoritmul va ine cont de faptul c ptratul unui numr cu
maxim 5000 de cifre nu se poate obine prin nmulirea direct a numrului cu el
nsui, ntruct depete chiar i capacitatea de reprezentare a tipului "ntreg
lung".
Exemplu: 36662=1344395556
70. Scriei un program care calculeaz ptratul unui numr de maxim
5000 de cifre care ncepe cu cifra 2 i urmtoarele cifre sunt toate 5. Rmne

valabil observaia fcut n problema anterioar.


Exemplu: 25555*25555=653058025
71. Se citete de la tastatur un numr natural x cu maxim nou cifre. S
se afieze toate numerele care se obin prin eliminarea pe rnd a cte unei singure
cifre din x, precum i cel mai mare dintre aceste numere.
Exemplu: pentru x=425978 rezult numerele: 42597, 42598, 42578,
45978, 25978, iar cea mai mare dintre acestea este 45978
Indicaii: Numrul rezultat prin eliminarea ultimei cifre se obine prin simpla
mprire a lui x la 10. Cu acest numr iniializm variabila max n care vom actualiza
maximul dintre numerele obinute prin eliminarea cte unei cifre.
Algoritmul pentru eliminarea celorlalte nr_c-1 cifre se bazeaz pe un ciclu al
crui contor k are doar rolul de a numra paii (k=2,3,...,nr_c, unde nr_c reprezint
numrul de cifre ale lui x, determinat cu algoritmul clasic de extragere a cifrelor). n
corpul ciclului folosim dou variabile intermediare p i q ale cror valori vor fi succesiv:
p=100,1000,... i q=10,100,... La fiecare pas:
memorm n d i r ctul respectiv restul mpririi lui x la 10;
formm n y numrul rezultat prin eliminarea cifrei de la pasul respectiv,dup
relaia y:=d*q+r mod q;
actualizm p i q: p=p*10 i q=q*10;
actualizm max: dac numrul rezultat y este mai mare dect max-ul curent,
atunci y devine noul maxim.
113

72. Activitatea computerelor de bord ale navetelor spaiale americane


este coordonat de nite reele sistolice, a cror funcionare se bazeaz pe nite
aa-numite "coduri sistolice". Un cod sistolic de lungime n este alctuit din 2n
secvene binare, fiecare astfel de secven avnd n cifre de 0 i 1. Notm cu
s1,s2,..,sn secvenele binare care compun codul sistolic de lungime n. Pornind
de la acesta, se poate obine codul sistolic de lungime n+1, pe care-l notm
t1,t2,..,tn,tn+1, aplicnd urmtorul algoritm:
se scriu n linii ce reprezint secvenele s1,s2,..,sn aferente codului
iniial de lungime n (fiecare astfel de secven pe cte un rnd), apoi, dedesupt, se
copiaz nc o dat aceste secvene exact n aceeai ordine;
pentru cele 2n+1 linii astfel formate, se creaz a n+1 coloan la sfrit;
pe aceast coloan, n primele 2n linii se scrie valoarea 0, iar n urmtoarele 2n
linii se scrie valoarea 1.
Se presupune cunoscut codul de lungime 1 alctuit din dou secvene de
cte o cifr: prima secven conine cifra 1, iar a doua secven conine cifra 0.
Exemplu: pornind de la codul sistolic de lungime n=1, vrem s obinem
codul de lungime 2.
1
0

"dublm" cele 2n adic 21 linii;


1
0
0
1

am obinut astfel un numr de 2n+1 adic 22 linii; crem a treia coloan


astfel: n primele dou linii punem 1, iar n urmtoarele dou linii scriem 0;
1
0
0
1

1
1
0
0

acesta este codul sistolic de lungime n=2; observai c cele patru


rnduri de cifre binare nu sunt altceva dect reprezentrile binare ale numerelor
naturale de la 0 la 2n-1, scrise ntr-o alt ordine dect cea natural; mai departe,
construim codul sistolic de lungime 3; ncepem tot aa, cu "dublarea" liniilor:
1
0
0
1
1
0
0
1

1
1
0
0
1
1
0
0

114

crem a treia coloan: n primele patru linii aceasta va conine valoarea


1, iar n urmtoarele patru valoarea 0;
1
0
0
1
1
0
0
1

1
1
0
0
1
1
0
0

1
1
1
1
0
0
0
0

115

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