Sunteți pe pagina 1din 0

Structura repetitiv

Repetiia necondiionat
Repetiia condiionat iniial
Repetiia condiionat final
Probleme propuse
Soluiile problemelor propuse
Capitolul
4

n multe situaii este necesar s relum o anumit operaie (un anumit set de in-
struciuni). n asemenea situaii i arat utilitatea structurile repetitive.
Repetiia unei operaii se poate executa n dou moduri:
Necondiionat tim exact de cte ori trebuie s relum secvena de instruciuni;
Condiionat se reia secvena n funcie de valoarea de adevr a unei condiii.

Atunci cnd avem o reluare condiionat a unei secvene de operaii, condiia de re-
luare ar putea fi verificat nainte sau dup executarea operaiei. n acest sens vom
vorbi despre structura repetitiv cu test iniial, respectiv structura repetitiv cu test
final.

n descrierea prin scheme logice a algoritmilor nu exist blocuri (figuri geometrice)
utilizate pentru a indica existena unei repetiii. Pentru a marca repetiia vom redireci-
ona sgeile, astfel nct s indicm existena unei reveniri la o instruciune anterior
efectuat.

4.1. Repetiia necondiionat
Vom utiliza o asemenea instruciune atunci cnd cunoatem cu exactitate numrul de
repetri necesar pentru finalizarea operaiei.
Forma general a instruciunii n pseudocod o vom nota:

pentru contor=iniial,final execut:
secvena { instruciuni reluate }
sfrit pentru

Schema logic general a instruciunii repetitive cu numr cunoscut de pai n
cazul n care variabila contor este incrementat:
38 4. Structura repetitiv


Singura instruciune permis la revenire este cea de incrementare/decrementare a
contorului.
n Pascal vom avea dou forme sub care o astfel de instruciune se poate imple-
menta:

for contor:=initial to final do
instruciune
i
for contor:=initial downto final do
instruciune

Aceast instruciune se execut dup cum urmeaz: deoarece iniial i final sunt ex-
presii, mai nti se evalueaz valorile lor. Apoi, se verific relaia dintre valoarea ini-
ial i final. n cazul formei cu to, dac iniial are valoare mai mare dect final, se iese
din instruciune, n cazul formei cu downto se consider instruciunea terminat dac
iniial are valoare mai mic dect final. n cazul ambelor forme, dac nu s-a ieit din
instruciune, se atribuie variabilei contor valoarea iniial i se execut instruciune.
Dup fiecare reluare se testeaz dac variabila contor a atins exact valoarea final. Da-
c nu, atunci se modific acest contor i se repet instruciunile de executat.
Dac valoarea iniial este mai mic dect valoarea final atunci contorul se incre-
menteaz (se mrete). Altfel, contorul se decrementeaz (se micoreaz). n schema
logic, vom utiliza n al doilea caz instruciunea contor:=contor-1.
n Pascal, modul de modificare a contorului este precizat prin utilizarea cuvntului
cheie to pentru incrementare, respectiv downto pentru decrementare.
Dac avei de reluat dou sau mai multe instruciuni n cadrul buclei for, sintaxa
limbajului v oblig s utilizai instruciunea compus.
4. Structura repetitiv 39

Pentru a nu avea probleme legate de imposibilitatea ieirii din aceast bucl v
recomandm s nu utilizai niciodat printre instruciunile de repetat instruciuni care
modific n mod explicit valoarea variabilei contor. Structura repetitiv necondiionat
utilizeaz o variabil contor care numr repetiiile i care este modificat implicit.

4.2. Repetiia condiionat iniial
Se utilizeaz acest mod de reluare a unei secvene de instruciuni atunci cnd nu cu-
noatem numrul de reluri necesare n rezolvare, ns tim cu exactitate ce condiie
trebuie s se verifice pentru a relua secvena de instruciuni.

Forma general n reprezentare cu schem logic:



ct timp condiie execut
secven { instruciuni reluate }
sfrit ct timp
while condiie do
instruciune

Aceast instruciune se execut dup cum urmeaz: mai nti se evalueaz condiie.
Dac este verificat, atunci se execut secvena de instruciuni i se testeaz din nou
condiia etc... n momentul n care valoarea de adevr a condiiei devine fals, se
ncheie repetiia i se iese din instruciune.

Observaie
Numrul minim de repetiii ale secvenei este 0, deoarece se poate ntmpla ca de
la nceput s nu se verifice condiia.

Avei grij, trebuie ca n urma execuiei secvenei de instruciuni s se modifice cel
puin una dintre variabilele care apar n condiie. n caz contrar, este posibil ca odat
intrai n structura repetitiv s nu o mai putei prsi (caz n care spunem c am pro-
vocat o bucl infinit).
n Pascal, instruciune poate fi orice instruciune, iar dac dorim s se execute mai
multe, le vom grupa ntr-una compus.
40 4. Structura repetitiv

4.3. Repetiia condiionat final
Acest tip de structur repetitiv este asemntor primului i se utilizeaz atunci cnd
dorim s verificm dac mai este necesar s relum secvena de instruciuni dup ce
am parcurs-o odat.
Forma ei, reprezentat cu schem logic:



repet
secven { instruciuni reluate }
pn cnd condiie
repeat
secven de instruciuni
until condiie

Aceast instruciune se execut dup cum urmeaz: mai nti se execut secvena
de instruciuni apoi se evalueaz condiia. Dac nu este verificat, atunci se execut
secvena de instruciuni i se testeaz din nou condiie etc... n momentul n care se
condiie devine adevrat, se ncheie repetiia i se iese din instruciune.

Observaie
Numrul minim de repetiii ale secvenei este 1.

4.4. Probleme propuse

4.4.1. Ani biseci
O problem important n astrologie este determinarea anilor biseci (ani cu 366 de
zile). Un an se consider bisect dac este multiplu de 4, dar nu este multiplu de 100.
Dintre anii eliminai conform acestui criteriu sunt considerai biseci cei care sunt
multipli de 400.
Scriei un program care determin i afieaz toi anii biseci ntre an1 i an2.

Date de intrare
De la tastatur se vor citi valorile an1 i an2.

Date de ieire
Se vor afia anii biseci din intervalul de ani [an1..an2], separai prin cte un spaiu.
4. Structura repetitiv 41

Restricii i precizri
1600 an1, an2 2200.

Exemple
Intrare
an1=1990
an2=2005


an1=1890
an2=1904
Ieire
1992 1996 2000 2004



1892 1896 1904
Explicaie
1992, 1996 i 2004 sunt multipli de 4
i nu sunt multipli de 100. 2000 este
multiplu de 400.

1892, 1896 i 1904 sunt multipli de 4
i nu sunt multipli de 100. 1900 nu
este an bisect, deoarece este multiplu
de 100 i nu este multiplu de 400.

4.4.2. Tabr
ntr-o tabr de var particip b biei i f fete. n aceast tabr se organizeaz diverse
jocuri i concursuri. Pe noi ne intereseaz un anumit joc, la care trebuie s participe un
numr ct mai mare de echipe, formate din biei i fete. Toate echipele trebuie s fie
formate din acelai numr nrb de biei i acelai numr nrf de fete. Trebuie s scriei
un program care determin numrul maxim de echipe care se pot forma i numrul nrb
de biei, respectiv numrul nrf de fete, care intr n componena fiecrei echipe. Pen-
tru ca jocul s poat fi organizat trebuie s se formeze cel puin dou echipe identice.

Date de intrare
Se vor citi numrul b de biei i numrul f de fete, participani la tabr.

Date de ieire
Pe prima linie se va afia numrul de echipe care se pot forma, iar pe linia urmtoare
se vor afia dou valori ntregi, reprezentnd numrul nrb de biei, respectiv numrul
nrf de fete care intr n componena fiecrei echipe. Cele dou valori vor fi separate
prin spaiu. Dac nu se pot forma cel puin dou echipe identice se va afia mesajul:
'Nu ne putem juca :-('.

Restricii i precizri
10 b, f 200;
Datele de intrare sunt ntotdeauna corecte.

Exemple
Intrare
b=10 f=15


b=12 f=25
Ieire
5
2 3

Nu ne putem juca :-(
Explicaie
Se pot forma cel mult 5 echipe
din nrb = 2 biei i nrf = 3 fete
Nu se pot forma dou echipe identice.
42 4. Structura repetitiv

4.4.3. Suma mai multor numere naturale
S presupunem c avei n cutii i cunoatei masa fiecrei cutii (n kilograme), fr s
v intereseze ce conine. Trebuie s determinai capacitatea minim de transport a unui
autovehicul care ar fi n stare s transporte ntr-un singur drum toate aceste cutii.
Capacitatea de transport a unui autovehicul este egal cu masa maxim a ncrc-
turii pe care acesta o poate transporta.

Date de intrare
Se d numrul n a cutiilor i masa fiecrei cutii.

Date de ieire
Vei afia capacitatea minim a vehiculului care poate efectua transportul.

Restricii i precizri
1 n 10;
Fiecare cutie are masa ntre 0 i 1000 kg.
Dac masa unei cutii nu se afl n intervalul precizat se va afia mesajul:
'Cutie periculoas!' i se va opri execuia programului.

Exemplu
Intrare
n=5
700 500 800 100 600
Ieire
2700

Explicaie
Vehiculul trebuie s poat transporta n
total cel puin 2700 kg.

4.4.4. Bile colorate
Am inventat pentru voi un joc. Pe mas avei bile de n culori i cunoatei numrul de
bile existente din fiecare culoare. Singura operaie permis este extragerea a k bile de
aceeai culoare din grmad. V dau voie s determinai o singur dat valoarea lui k
i apoi, la fiecare operaie de extragere, s luai de pe mas k bile, toate de aceeai cu-
loare. Trebuie s luai toate bilele de pe mas, folosind ct mai puine operaii de ex-
tragere.
Pentru ca s accept soluia voastr trebuie s mi spunei dou lucruri:
1. Cte bile de aceeai culoare vei lua de pe mas la o extragere?
2. Cte operaii de extragere vei efectua?

Date de intrare
Se d numrul de culori n i numrul de bile din fiecare culoare.

Date de ieire
Vei afia numrul de bile de aceeai culoare extrase ntr-o operaie i numrul opera-
iilor efectuate. Cele dou valori le vei afia pe aceeai linie, separate prin spaiu.
4. Structura repetitiv 43

Restricii i precizri
2 n 10;
Numrul de bile din fiecare culoare este un numr ntreg din intervalul [1,1000].
Odat determinat valoarea k, nu mai avei voie s o modificai.
Datele de intrare sunt ntotdeauna corecte.

Exemplu
Intrare
n=5
14 63 42 56 77
Ieire
7 36
Explicaie
Se vor extrage la fiecare operaie cte 7 bile de ace-
eai culoare. Numrul de extrageri este egal cu 36.

4.4.5. irul lui Fibonacci
Unul dintre irurile de termeni de o importan deosebit n matematic este irul lui
Fibonacci. Acest ir este definit astfel:
primii doi termeni ai si sunt egali cu 1;
ncepnd cu al treilea termen, fiecare termen este egal cu suma celor mai mari doi
termeni de rang mai mic dect al su.

Se d numrul natural strict pozitiv n. Calculai i afiai al n-lea termen al irului
Fibonacci!

Date de intrare
Se d un numr natural strict pozitiv n.

Date de ieire
Se va afia valoarea termenului de rang n din irul lui Fibonacci.

Restricii i precizri
1 n 20;
Prin rang se nelege numrul de ordine al termenului n ir (al ctelea termen este).
Datele de intrare sunt ntotdeauna corecte.

Exemple
Intrare
n=5

n=2
Ieire
5

1
Explicaie
Termenul de rang 5 are valoarea 5.

Termenul de rang 2 are valoarea 1.


44 4. Structura repetitiv

4.5. Soluiile problemelor

4.5.1. Ani biseci
Conform enunului, se vor afia ca ani biseci anii care sunt multipli de 4, dar nu sunt
multipli de 100 i anii care sunt multipli de 400. Deci, vom avea o condiie mixt n
care vom verifica divizibilitile (resturile mpririlor pe mulimea numerelor ntregi):

((an mod 4=0) and (an mod 100<>0)) or (an mod 400=0)

Prima idee de a rezolva problema este de a genera cu o instruciune repetitiv de tip
pentru toi anii, ncepnd cu an1 pn la an2 i de a verifica proprietatea de an bisect
pentru fiecare valoare a contorului an.
Dac vrem s reducem numrul anilor de verificat, deci implicit i timpul de execu-
ie, putem s ne bazm pe faptul c toi anii biseci sunt multipli de 4 (dar nu toi anii
multipli de 4 sunt ani biseci). Observm c dac un anumit an (an) este bisect, atunci
i anul an + 4 este bisect cu condiia s nu fie multiplu de 100. n concluzie, vom ve-
rifica dac an1 este sau nu bisect. n caz de rspuns negativ, vom cuta primul an bi-
sect mai mare dect an1:

Algoritm AnBisect:
citete an1,an2
an an1 { cutm primul an bisect care este an1 }
ct timp nu (((an mod 4=0) i (an mod 1000)) sau
(an mod 400=0)) execut:
an an + 1
sfrit ct timp
ct timp an < an2 execut:
{ dac un an este multiplu de 100, dar nu i de 400, }
{ atunci NU este considerat bisect i l srim }
dac (an mod 100=0) i (an mod 4000) atunci
an an + 4
sfrit dac
scrie an
an an + 4 { trecem la urmtorul an bisect }
sfrit ct timp
sfrit algoritm

Analiznd numrul operaiilor, observm c n primul algoritm trebuie s verificm
an2 an1 + 1 numere, ceea ce nseamn evaluarea a 3(an2 an1 + 1) expresii logice.
n al doilea algoritm avem cel mult trei pai n primul ct timp (deci se evaluea-
z 33 expresii logice) i 2 ([(an2 an1 + 1)/4] + 1) expresii de evaluat n al doilea
ct timp.
4. Structura repetitiv 45

Reprezentarea algoritmului cu schem logic:



4.5.2. Tabr
Ultima restricie precizeaz c datele de intrare sunt ntotdeauna corecte adic, se afl
ntotdeauna n intervalul precizat de primele dou restricii. Deci, am scpat de prima
problem.

Acum trebuie s analizm textul problemei pentru a afla ce avem de calculat.
Toate echipele trebuie s fie formate din acelai numr de biei. Deci, num-
rul de echipe trebuie s fie printre divizorii lui b.
Toate echipele trebuie s fie formate din acelai numr de fete. Deci, numrul
de echipe trebuie s fie printre divizorii lui f.
46 4. Structura repetitiv

Numrul de echipe trebuie s fie maxim i echipele trebuie s aib componen
identic. Deci, trebuie s aflm cel mai mare divizor comun al lui b i f.
Dac cele dou valori sunt prime ntre ele (au cmmdc = 1) se va afia mesajul 'Nu
ne putem juca :-('.

Pentru determinarea celui mai mare divizor comun vom utiliza algoritmul lui
Euclid care folosete o strategie bazat pe mpriri repetate.
Fie a i b dou numere naturale. Fr s restrngem generalitatea, putem presupune
c a < b (Dac nu este aa, le putem interschimba...).
1. Dac a se mparte exact la b, atunci b este cmmdc.
2. Dac a nu se mparte exact la b, atunci putem scrie:
a = q*b + r (*)
unde: q = ctul mpririi
r = restul mpririi
3. Observm urmtoarea proprietate: cmmdc (fiind cel mai mare divizor al lui a i b)
acesta divide i pe a i b, dar divide i pe r pe baza relaiei (*). Cum r este mai mic
dect b i b este mai mic dect a, la pasul urmtor vom decide:
Dac r = 0, suntem n situaia precizat la 1. cmmdc = b
Dac r 0, pe baza observaiei de la 3. vom nlocui pe a cu b, pe b cu r i vom
cuta cmmdc al noului a i noului b. Prin urmare, problema aflrii cmmdc dintre a i b
se reduce la problema aflrii cmmdc dintre b i r deci, vom reveni la pasul 1 cu a b
i b r.
4. Algoritmului se ncheie atunci cnd la pasul 1 obinem un rest egal cu 0. Ultimul
rest nenul va reprezenta cmmdc dintre a i b.

Algoritm Euclid:
citete a,b
r rest[a/b] { primul rest al mpririi ntregi al lui a la b }
ct timp r 0 execut: { ct timp restul nu este 0 continum mpririle }
a b
b r
{ calculm restul mpririi ntregi pentru noul a (fostul b) i noul b (fostul r) }
r rest[a/b]
sfrit ct timp
scrie b
sfrit algoritm

Observaie
Nu s-a verificat relaia dintre a i b, deoarece chiar dac a < b, la prima mprire a
lui a la b se obine rest egal cu a, i cele dou numere se interschimb datorit
algoritmului lui Euclid, fr ca noi s trebuiasc s le interschimbm explicit.
4. Structura repetitiv 47

S descriem acum rezolvarea problemei utiliznd schema logic:



4.5.3. Suma mai multor numere naturale
Trebuie s determinai suma celor n valori ntregi date, care reprezint masele cutiilor.
ns, trebuie s fii ateni la un lucru: dac o cutie are o mas negativ sau prea mare
(peste 1000 kg) nu trebuie doar s o neglijai, ci s oprii execuia programului afind
mesajul corespunztor ('Cutie periculoas!').

Algoritm Suma:
citete n
s 0 { iniializarea sumei cu 0 }
pentru i=1,n execut:
citete m { citirea pe rnd a maselor cutiilor }
dac (m < 0) sau (m > 1000) atunci
{ dac o cutie este periculoas afim mesajul corespunztor }
scrie 'Cutie periculoasa!'
Oprire forat algoritm { i oprim execuia programului }
sfrit dac
48 4. Structura repetitiv

{ dac execuia programului ajunge aici, cutia este n regul i masa ei va fi }
s s + m { adunat la masa total a celorlalte cutii ncrcate deja }
sfrit pentru
scrie s
sfrit algoritm

Reprezentarea algoritmului cu schem logic:



Observaii
Compilatorul Borland/Turbo Pascal iniializeaz cu 0 toate variabilele numerice
(globale), dar aceast iniializare automat nu se realizeaz de ctre toate compila-
toarele.
Oprirea execuiei programului n limbajul Pascal se realizeaz cu ajutorul instruc-
iunii Halt. Acesta este de fapt apelul unui subprogram care are ca efect ntreru-
perea programului. Studiai n Help rolul acesteia, precum i a lui Break i Exit.
Determinai diferenele dintre ele.


4. Structura repetitiv 49

4.5.4. Bile colorate
ntotdeauna problema are o soluie (k = 1) ns aceast soluie nu garanteaz obinerea
numrului minim de extrageri. Pentru a obine numrul minim de extrageri, trebuie s
utilizai o valoare ct mai mare a lui k. Pe de alt parte, deoarece ntr-o extragere nu
este permis s avei dect bile de aceeai culoare, nseamn c pentru a elimina de pe
mas toate bilele de o anumit culoare, trebuie ca numrul de bile de culoarea respecti-
v s fie multiplu de k (k s fie divizor al acestei valori).
Deci, va trebui s determinai valoarea lui k care este simultan divizor al tuturor ce-
lor n valori, reprezentnd numrul de bile din fiecare culoare i aceast valoare trebuie
s fie maxim (adic, cel mai mare divizor comun al celor n valori).
Observm c aceast problem este de fapt o generalizare a problemei 4.4.2. Pentru
rezolvarea ei va trebui s utilizm algoritmul lui Euclid n mod repetat:
Pas 1. Determinm cmmdc pentru primele dou valori.
Pas 2. Determinm cmmdc dintre cmmdc obinut la pasul 1 i cea de a treia valoare.
Pas 3. Determinm cmmdc dintre cmmdc obinut la pasul 2 i valoarea a patra.

Pas n-1. Determinm cmmdc dintre cmmdc obinut la pasul n-2 i valoarea a n-a.


50 4. Structura repetitiv

Observaie
O rezolvare interesant ar nsemna s ncercm s reinem toate cele n valori (divi-
zori). Dintre aceste valori se determin minimul. Valoarea de calculat fiind cel mai
mare divizor comun a celor n numere, acesta este, evident, i cel mai mare divizor al
minimului. Deci vom cuta cel mai mare divizor al minimului care totodat este i di-
vizor al celorlalte valori. Implementarea acestui algoritm va fi un exerciiu util atunci
cnd vom nva s lucrm cu tablouri.

4.5.5. irul lui Fibonacci
Deoarece primii doi termeni ai irului sunt pozitivi, iar ceilali termeni se calculeaz ca
sum a doi termeni precedeni, nseamn c irul Fibonacci este un ir cresctor. Deci,
fiecare termen va fi mai mare dect toi termenii de rang mai mic dect el. Deducem
de aici c va trebui s utilizm urmtoarea formul de calcul:
( )

+
= =
=
rest n ) 2 ( ) 1 (
2 sau 1 dac 1
n f n f
n n
n f
S calculm civa dintre termenii irului Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
89, 144,

Vom utiliza urmtorul algoritm:
Fiecare termen, odat calculat, intervine ca termenul de rang maxim n calculul ur-
mtorului termen, iar termenul care avea rangul maxim n calcularea sa devine terme-
nul de rang precedent (cu 1 mai mic) n calcul.
Exemplu
Fie n = 5, caz n care trebuie s obinem pentru f(5) valoarea 5

i f1 f2 f3 = f1 + f2
Valori iniiale 1 1 2
3 1 2 3
4 2 3 5
5 3 5 5

Am putea rezuma algoritmul prezentat mai sus cu formula calculeaz-mut-mut:
f1 reine ntotdeauna termenul de rang i 2, f2 reine termenul de rang i 1, n f3 se
efectueaz calculul termenului de rang i, apoi se mut valoarea din f2 n f1 i valoarea
din f3 n f2.

Algoritm Fibonacci:
citete n
f1 1
f2 1
4. Structura repetitiv 51

dac n 2 atunci
scrie f2 { dac n = 1 sau n = 2, f1 = 1 i f2 = 1 }
altfel
pentru i=3,n execut:
f3 f1 + f2 { calculm valoarea termenului curent }
f1 f2 { mutm valoarea lui f2 n f1 }
f2 f3 { mutm valoarea lui f3 n f2 }
sfrit pentru
scrie f3 { afiarea rezultatului pentru n > 2 }
sfrit dac
sfrit algoritm

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