Anda di halaman 1dari 196

INFORMATIC

clasa a IX-a

Autori:
prof. Simona Haidu
prof. Dana Vaida
prof. Eugen Ionescu

Coordonatori:
lector univ. dr. Clara Ionescu
prof. Adina Blan




Prefa



Atunci cnd am pornit la drum n proiectarea coninutului acestei cri, mai nti a tre-
buit s rspundem la o mulime de ntrebri: cui se adreseaz aceast carte, care sunt
obiectivele pe care le urmrim, att din punct de vedere al coninutului ct i al aspec-
telor didactice...

Este important ca de la nceput s clariIicm un aspect important: nu este vorba de
un manual obinuit care, pe baza unei programe colare, oIer cunotine acoperitoare,
intr n detalii care sunt necesare elevilor pentru a nelege i a dobndi concepte Iun-
damentale. Aceast carte se adreseaz acelor copii care sunt doritori de cunotine su-
plimentare, doresc s nvee mai repede i s ating perIormane n inIormatic, cu
precdere n algoritmic i programare. n consecin, cunotinele teoretice sunt pre-
zentate sumar, sunt ,orientate spre scopul clar de a crea deprinderile necesare pentru
a ,ataca ct mai repede problemele propuse spre rezolvare din domeniu.

nvmntul de inIormatic din Romnia a cunoscut multe succese. Absolvenii
Iostelor licee de inIormatic (nIiinate n 1972) azi sunt proIesori universitari, cercet-
tori, conductori de Iirme, cu un cuvnt: oameni de succes. Acest lucru se datoreaz i
calitii nvmntului din aceste coli, dar i Iaptului c inIormatica i atrgea pe cei
mai dotai tineri. Este la Iel i azi, dar nvmntul de inIormatic, pe de o parte s-a
extins (n sensul numrului de copii care nva inIormatic n Romnia), pe de alt
parte s-a redus (a sczut numrul de ore pe sptmn, alocate disciplinei de la 8 la 3).
Este clar c nu se poate lucra ,perIorman n 3 ore cu toi copiii, aa c a aprut ne-
cesitatea de a oIeri celor pasionai i doritori de perIorman un cadru suplimentar, un-
de se pot ocupa cu ceea ce i intereseaz.

Elevii din Romnia crora le place programarea pot participa la o serie de concur-
suri, simpozioane, tabere unde pot nva i pot arta ceea ce tiu. Olimpiadele de in-
Iormatic sunt cu precdere de algoritmic i programare. Prima condiie pe care un
elev trebuie s-o ndeplineasc pentru a avea succes la aceste olimpiade este s Iie n
stare s se gndeasc singur, s se concentreze i s aib curaj pentru implementarea
unei soluii originale. Fiecare proiect de algoritm, Iiecare program este o creaie nou
i trebuie s ndeplineasc toate cerinele i restriciile impuse n speciIicaiile proble-
6 Prefa

melor de rezolvat. Pentru a ajunge n situaia respectiv, este nevoie de multe exerciii,
de multe antrenamente. Aceste abiliti se pot Iorma doar rezolvnd multe, Ioarte mul-
te probleme.

n concluzie, cartea este mai mult o culegere de probleme dect un manual. n con-
cepia autorilor, ea totui trebuie parcurs n succesiunea capitolelor, aa cum sunt ele
niruite n carte. Recomandm acest lucru deoarece, cartea neIiind o versiune mbog-
it a unui manual elaborat conIorm programei colare, cunotinele din carte depesc
coninutul acestei programe, este nevoie de o abordare treptat a problemelor. Accen-
tum, de asemenea, c dac unii elevi au deja cunotine de programare (din gimnaziu,
de la Clubul Copiilor etc.), ei nu trebuie constrni, de exemplu, s nu Ioloseasc sub-
programe anterior capitolului n care se prezint acest concept. AltIel spus, orice pas
,nainte este permis, chiar binevenit, cu condiia ca rezolvitorii s respecte speciIica-
iile problemei.
ProIesorul este sItuit s lucreze cu elevii innd cont de ntrebrile i de rspunsu-
rile lor, s-i modeleze activitatea n Iuncie de nivelul grupului. Dac activitatea de-
curge Ir probleme, evident se poate avansa repede i se pot studia i probleme din
alte surse sau chiar din manualele care constituie continuarea celui de Ia. Se tie c
la olimpiade ,nu prea se ine cont de programa colar, iar la olimpiadele internaio-
nale exist o singur categorie de vrst: 14-18 ani.

Rezolvrile problemelor propuse sunt prezentate sub Iorm de explicaii i eventual
pseudocodul algoritmului. Textele surs le vei putea consulta n soItware-ul care nso-
ete aceste manuale. Nu avem pretenia c ntotdeauna am propus cea mai elegant i
cea mai eIicient rezolvare. Dac ne contactai i vei Ii de acord ca soluiile interesan-
te i originale ale dumneavoastr s devin publice, acestea vor Ii nglobate n soIt-
ware i vor Ii adugate noilor ediii ale manualelor.

V dorim succes!
Autorii














Programa ycolar


1. Generaliti

- Coninutul urmtoarei programe (ae:voltate pentru aoritorii ae cunotine soliae
in programare) nu preci:ea: limbaful ae programare. In funcie ae cerinele
elevilor i aisponibilitile profesorilor toate temele se pot trata reali:ana aplicaii
in limbaful Pascal i/sau C++. De asemenea, se vor face aplicaii i in FreePascal,
respectiv gnu C. Eviaent, nu sunt excluse nici meaiile vi:uale (Delphi, Jisual C,
JisualBasic sau Java).
- Coninutul programei este grupat in 32 ae sptmani pe parcursul crora aproxi-
mativ ain patru in patru sptmani se vor organi:a ,miniconcursuri` ain aomeniul
(aomeniile) ae cunotine aboraate aefa. Elevii vor lucra in conaiii similare viitoa-
relor concursuri la care vor participa. Evaluarea se va face automat, utili:ana
software-ul ae evaluare care va fi folosit i in celelalte sptmani pentru a verifica
lucrrile elevilor i a evalua moaul in care ei avansea:.

2. Obiective generale

Elevii participani vor fi capabili.
s analizeze enunuri de probleme care depesc nivelul programei colare;
s aleag tipul datelor, s creeze structuri de date adecvate n scopul modelrii
datelor de intrare i de ieire;
s proiecteze algoritmi de rezolvare pentru probleme;
s implementeze algoritmii proiectai utiliznd un limbaj de programare;
s prelucreze date structurate la nivel de componente i la nivel de structur;
s lucreze cu date organizate n Iiiere;
s lucreze cu subprograme;
s aleag algoritmul de ordonare, respectiv de cutare adecvat;
s Ioloseasc operatorii pe bii n vederea optimizrii programelor;
s prelucreze numere de orice dimensiune;
s lucreze recursiv n situaia n care acest lucru este necesar i nu aIecteaz timpul
de executare a programelor;
s rezolve probleme aplicnd metoda backtracking.
8 Programa colar


3. Gruparea temelor pe sptmni

Sptmnile 1-2: Recapitularea cunoytinelor acumulate n
gimnaziu
Obiective specifice:
Acei elevi care au participat la activitile centrului ae excelen la informatic in
gimna:iu sau au fost atrai spre concursuri ae programare vor efectua o recapitulare
sub conaucerea profesorului. Dar intotaeauna exist i elevi care iau contact cu algo-
ritmii i cu programarea aoar in clasa a 9-a. Activitatea se va aesfura in aa manie-
r incat inceptorii s-i afung ain urm pe cei avansai cat se poate ae repeae. In
acest scop, pentru aceti elevi, coninutul capitolului ae recapitulare se va ealona pe
trei-patru sptmani. Elevii capabili vor re:olva problemele propuse in acest capitol
pentru a fi evaluai i grupai in subgrupe in funcie ae nivelul ae cunotine.
- Structura programelor Pascal, Vocabularul limbajului
- Constante, tipuri standard de date, variabile, expresii
- Citirea i scrierea datelor
- Instruciuni
1. Probleme pentru nceptori: nvarea alIabetului, Ghiocei i viorele, Serviciul
pe clas, tierea copacilor, La scldat, Drumul spre coal.
2. Avansai: Numere prime... cu divizori, Matematica... pe calculator, La pescuit.
3. Exceleni: Serviciul de gard, Plasarea oglinzilor, Palindrom, Numere apropiate.

Sptmna 3: Fiyiere
Obiective specifice:
Elevii se vor familiari:a cu aate stocate pe suport electronic. Se tie c in timpul
reali:rii programelor i in timpul verificrii lor, acestea se testea: in moa repetat,
pentru aiverse aate ae intrare care, ae regul, sunt furni:ate in fiiere. De asemenea,
aatele ae ieire (re:ultatele) trebuie pstrate in format electronic. La marea maforita-
te a concursurilor ae programare aatele ae intrare sunt citite ain fiiere, iar cele ae
ieire sunt scrise in fiiere, motiv pentru care elevii trebuie s se familiari:e:e cu acest
aspect inc ae la inceput.
- Detalii generale despre Iiiere;
- Asignare, deschidere pentru scriere/citire, nchidere.
4. citirea unui numr dintr-un Iiier i scrierea sa n alt Iiier;
5. citirea tuturor numerelor dintr-un Iiier care conine cte un numr pe o linie i
scrierea lor n alt Iiier, cte unul pe o linie;
6. citirea datelor dintr-un Iiier care conine numere, mai multe pe o linie, i
scrierea lor ntr-un alt Iiier n aceeai Iorm;
Programa colar 9

7. citirea unei secvene de numere dintr-un Iiier i scrierea ei n alt Iiier;
8. citirea unor nume (iruri de caractere) dintr-un Iiier i scrierea lor ntr-un alt
Iiier;
9. citirea unui numr natural N dintr-un Iiier i scrierea ntr-un alt Iiier a tuturor
numerelor naturale cuprinse ntre 0 i N, cte unul pe o linie;
10. citirea unui numr natural N dintr-un Iiier i a N nume (aIlate pe urmtoarele
linii ale Iiierului) i scrierea celor N nume ntr-un alt Iiier;
11. copierea integral a coninutului unui Iiier ntr-un alt Iiier.

Sptmna 4: Calcule efectuate pe yiruri de date
fr pstrarea lor sub form de tablouri
Obiective specifice:
Elevii vor fi capabili s recunoasc clasa ae probleme in care, avana la aispo:iie
o secven ae aate (care trebuie prelucrate liniar) nu este necesar pstrarea lor sub
forma structurilor ae aate in memorie. De asemenea, vor inva s aplice ,teorema ae
programare` care prelucrea: secvene ae aate, care transmite re:ultatul unor aeci-
:ii.
- Iniializarea sumei (produsului) cu elementul neutru al operaiei;
- EIectuarea unor operaii n paralel cu citirea datelor n cazul problemelor care nu
necesit pstrarea irului de date n memorie;
- Realizarea proteciei explicite din interiorul programului n cazul unor posibile
depiri, i a unor date care nu corespund speciIicaiilor din enun.
1. citirea unor numere dintr-un Iiier i scrierea sumei lor ntr-un alt Iiier;
2. citirea unor numere dintr-un Iiier i scrierea produsului lor ntr-un alt Iiier;
3. citirea unor numere dintr-un Iiier i scrierea i scrierea mediei aritmetice ntr-
un alt Iiier;
4. citirea unor caractere dintr-un Iiier (unul pe linie) i scrierea irului de carac-
tere ntr-un alt Iiier.

Sptmna 5: Determinarea minimului, respectiv a maximului
Obiective specifice:
Elevii familiari:ai cu aate stocate pe suport electronic vor inva cum se reaeschi-
ae un fiier pentru citire, respectiv pentru scrierea in continuare a unor re:ultate in
acesta. De asemenea, ei vor fi capabili s re:olve probleme ae maxim i ae minim,
furni:ana, aac problema cere i po:iia (po:iiile) valorilor egale cu acestea. Cu
aceast oca:ie se familiari:ea: cu selecia, selectarea tuturor elementelor avana o
proprietate aat, i cu reali:area optim a acestora.
- Redeschiderea Iiierelor atunci cnd este necesar;
- Determinarea minimului/maximului dintr-un ir de date;
- Iniializarea minimului/maximului (cu elementul neutru sau cu primul element).
10 Programa colar

1. citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor pre-
cum i a primei poziii pe care apare acest minim;
2. citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor pre-
cum i a ultimei poziii pe care apare acest minim;
3. citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor pre-
cum i a tuturor poziiilor pe care apare acest minim;
4. citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor pre-
cum i a tuturor poziiilor pe care apare acest minim, urmat de maximul lor i
a tuturor poziiilor pe care apare acest maxim;
5. citirea unor nume dintr-un Iiier i aIiarea tuturor numelor care, din punct de
vedere lexicograIic, sunt ,mai mari dect ultimul nume din Iiier.

Sptmna 6: Concurs (I)
Obiective specifice:
Se va testa capacitatea elevilor ae a utili:a fiierele pentru citirea i scrierea aate-
lor. Jor fi trei probleme care vor fi re:olvate in aou ore.

Sptmna 7: Numere (I)
Obiective specifice:
Elevii vor fi capabili s prelucre:e numere pe ba:a cifrelor acestora, aate sub for-
m ae caractere sau numere i vor inva s aplice schema lui Horner.
- Descompunere/compunere numere n/din ciIre.
1. aIiarea ciIrelor unui numr;
2. determinarea numrului de ciIre ale unui numr;
3. determinarea celei mai mari (mici) ciIre a unui numr;
4. determinarea celei mai mari (mici) ciIre a unui numr i a poziiilor pe care
apare aceasta;
5. determinarea inversului unui numr;
6. generarea unui numr dintr-un ir de caractere care sunt ciIre (protecie n caz
de depire i de caractere care nu sunt ciIre);
7. veriIicarea Iaptului c un numr este palindrom;
8. determinarea tuturor numerelor palindroame dintr-un interval dat;
9. citirea unui numr real de Iorma x.y i aIiarea numrului y.x.

Sptmna 8: Numere (II)
Obiective specifice:
Elevii vor fi capabili s recunoasc problemele care cer stabilirea unei proprieti
al unui numr aat. Rspunsurile aate in ca:ul acestor probleme este bivalent (Da/Nu),
ain cau:a aceasta re:olvrile lor se vor testa pe ,pachete` ae teste. De asemenea, in
ca:ul in care se cere generarea unor numere, avana o proprietate cerut, vor exersa
Programa colar 11

,valorificarea` lor imeaiat (eventual scriinau-le imeaiat intr-un fiier) fr pstra-
rea acestora in memorie.
- VeriIicarea unei proprieti date a unui numr.
1. veriIicarea dac un numr este par;
2. numrarea divizorilor unui numr;
3. descompunerea unui numr n Iactori primi;
4. cel mai mare divizor comun a dou numere ntregi;
5. veriIicarea primalitii unui numr;
6. determinarea celui mai mic numr prim mai mare dect un numr dat;
7. determinarea celui mai mare numr prim mai mic dect un numr dat;
8. determinarea preIixelor prime ale unui numr;
9. determinarea suIixelor prime ale unui numr;
10. veriIicarea aspectului de ,vale a unui numr;
11. veriIicarea aspectului de ,munte a unui numr;
12. veriIicarea aspectului de ,vale a unui cuvnt;
13. veriIicarea aspectului de ,munte a unui cuvnt;
14. determinarea subirului avnd aspectul ,vale, respectiv ,munte dintr-un ir
dat.

Sptmna 9: Numere (III)
Obiective specifice:
Elevii vor fi capabili s genere:e secvene ae numere, avana o proprietate aat,
fr pstrarea lor in memorie.
- Generarea numerelor avnd o proprietate cerut
1. determinarea primelor N numere prime;
2. determinarea tuturor numerelor prime dintr-un interval;
3. determinarea tuturor numerelor de tip ,vale dintr-un interval;
4. determinarea tuturor numerelor de tip ,munte dintr-un interval;
5. determinarea tuturor numerelor de tip ,vale i a tuturor de tip ,munte
dintr-un interval;
6. generarea termenilor irului lui Fibonacci;
7. numere prietene;
8. alte numere speciale.

Sptmna 10: Numere (IV)
Obiective specifice:
Multe probleme cer (explicit sau implicit) ca un numr sau numerele aate s se
converteasc intr-o alt ba:. Aceste operaii se vor reali:a fr utili:are ae tablouri.
- Conversii de numere dintr-o baz n alta
1. conversie din baza 10 n baza 2;
12 Programa colar

2. conversie din baza 2 n baza 10;
3. conversie din baza 2 n baza 8 (16);
4. conversie din baza 8 (16) n baza 2;
5. conversie din baza 10 n baza b 10;
6. conversie din baza b 10 n baza 10;
7. conversie din baza a 10 n baza b 10;
8. conversie din baza 16 n baza 10;
9. conversie din baza 10 n baza 16;
10. conversie din baza a 36 n baza b 36;
11. conversie din baza 10 n baza b (orict de mare);
12. conversie din baza b (orict de mare) n baza 10;
13. conversie din baza a (orict de mare) n baza b (orict de mare).

Sptmna 11: Concurs (II)
Obiective specifice:
Se va testa capacitatea elevilor ae a manipula cifrele unui numr, ae a verifica
anumite proprieti ale acestora i ae a genera numere cu anumite proprieti. Jor fi
cinci probleme simple care se vor re:olva in aou ore.

Sptmna 12: Siruri (I)
Obiective specifice:
Elevii vor fi capabili s recunoasc acele probleme care necesit aeclararea unor
tablouri uniaimensionale, in consecin pstrarea aatelor in memorie pe parcursul
executrii programului. Ei se vor obinui cu prelucrarea lor. Se vor re:olva probleme
care, pe lang verificarea proprietii cer i returnarea (afiarea) po:iiei pe care se
afl acest (aceste) elemente.
- DeIinirea irurilor cu ajutorul tablourilor unidimensionale i rezolvarea probleme-
lor deIinite pentru sptmnile 4 i 5.
1. determinarea sumei elementelor unui ir;
2. determinarea minimului i maximului unui ir;
3. determinarea proprietii unui element dintr-un ir;
4. cutarea liniar a unui element ntr-un ir;
5. cutarea liniar a unui element ntr-un ir i determinarea tuturor apariiilor;
6. cutarea liniar a unui element ntr-un ir i eliminarea lui;
7. cutarea liniar tuturor elementelor dintr-un ir i eliminarea lor;
8. determinarea dublurilor ntr-un ir i eliminarea lor;
9. citirea a dou iruri (cu numr diIerit de elemente) i determinarea irului care
are suma elementelor maxim/minim;
10. citirea a N iruri (cu numr diIerit de elemente) i determinarea irului care are
suma elementelor maxim/minim;
Programa colar 13

11. citirea a N iruri (cu numr diIerit de elemente) i identiIicarea irului care are
cele mai multe elemente.

Sptmna 13: Siruri (II) - Ordonri
Obiective specifice:
Oraonarea este una aintre operaiile cele mai frecvente in aplicaii. Elevii vor fi
capabili, ca in funcie ae proprietile aatelor s aleag metoaa ae oraonare cea mai
potrivit. Metoae ae oraonare mai performante se vor inva aeoaat cu metoaa aivi-
ae et impera, respectiv structuri ae aate avansate. De asemenea, elevii vor face ais-
tincie intre verificarea proprietii unui element ain ir i proprietatea global a iru-
lui.
- Ordonarea irurilor
1. veriIicarea Iaptului c un ir este ordonat;
2. veriIicarea Iaptului c elementele unui ir sunt n progresie aritmetic (geome-
tric);
3. ordonare cu metoda bulelor;
4. sortare prin selecie;
5. sortare prin inserie;
6. sortare prin numrare.

Sptmna 14: Siruri (III) - Siruri ordonate
Obiective specifice:
Cutarea este operaia care poate fi efectuat cu algoritmi mult mai eficieni aac
aatele sunt oraonate sau sunt pstrate in structuri ae aate ae cutare. Elevii vor inv-
a algoritmul ae cutare binare fr a inva in aetalii metoaa aiviae et impera i se
vor familiari:a cu re:olvrile problemelor care cer aeterminarea celei mai lungi sec-
vene ae aate avana elemente consecutive ae o proprietate aat, folosina algoritmi li-
niari.
- Cutarea n iruri ordonate.
1. cutare binar;
2. interclasare a dou iruri;
3. cutare binar cu determinarea extremitilor apariiilor;
4. inserarea unui element ntr-un ir ordonat cu pstrarea ordinii;
5. eliminarea unui element ntr-un ir ordonat cu pstrarea ordinii;
6. determinarea dintr-un ir a dou subiruri pe baza unei proprieti date (crend
dou subiruri noi, crend un singur subir nou, ,pe loc);
7. determinarea dintr-un ir a mai multor subiruri pe baza a mai multor proprie-
ti date;
8. determinarea celei mai lungi secvene Iormat din elemente avnd o proprieta-
te dat;
14 Programa colar

9. determinarea celei mai lungi secvene care este Iormat din elemente avnd
suma maxim.

Sptmna 15: Polinoame
Obiective specifice:
Utili:area tablourilor nu este absolut necesar pentru a prelucra polinoame. Elevii
vor fi capabili s implemente:e operaii pe polinoame.
- Calcule cu polinoame
1. citirea unui polinom, dat prin grad i coeIicieni;
2. citirea unui polinom, dat prin monoame;
3. determinarea valorii unui polinom pentru un argument dat;
4. adunarea a dou polinoame;
5. nmulirea a dou polinoame;
6. mprirea a dou polinoame;
7. determinarea acelui polinom dintre N polinoame care pentru un argument dat
are valoare maxim.

Sptmna 16: Concurs (III)
Obiective specifice:
Se va testa capacitatea elevilor ae a lucra cu iruri. De asemenea, se va testa ca-
pacitatea ae a alege algoritmul ae sortare, respectiv cutare aaecvat, precum i meto-
aa aaecvat ae stocare a unui polinom. Jor fi trei probleme care vor fi re:olvate in
aou ore.

Sptmna 17: Tablouri multidimensionale (I)
Obiective specifice:
Teoria matricelor se inva in clasa a XI-a, aeci nu este nevoie ca elevii s fie in-
troaui in capitolul respectiv al matematicii. Tablourile ae numere sau ae caractere se
pot prelucra fr aceste cunotine. Elevii se vor obinui s aefineasc tablouri biai-
mensionale, s prelucre:e elementele acestor tablouri i s accese:e elementele tablo-
urilor biaimensionale, folosina expresii ae inaici.
- Calcule simple cu elementele unei matrice
1. suma elementelor unei matrice;
2. identiIicarea liniei i coloanei pe care se aIl minimul/maximul;
3. suma elementelor de pe diagonala principal;
4. suma elementelor de pe diagonala secundar;
5. suma elementelor de deasupra (de dedesubtul) diagonalei principale;
6. suma elementelor de deasupra (de dedesubtul) diagonalei secundare;
7. determinarea sumei celor opt vecini ai unui element;
Programa colar 15

8. determinarea sumelor elementelor aIlate n triunghiul de N, S, E i V delimitat
de diagonalele matricei.

Sptmna 18: Tablouri multidimensionale (II)
Obiective specifice:
Tablourile se pot parcurge in multe feluri. Elevii se familiari:a cu aceste parcur-
geri, formanau-i aexteritatea ae a se ,plimba` intr-o matrice biaimensional con-
form cerinelor.
- Prelucrarea tablourilor bidimensionale.
1. rotirea cu 90 de grade a unui tablou bidimensional;
2. determinarea matricei simetrice Ia de diagonala principal (secundar);
3. nlocuirea elementelor din triunghiul de nord cu cele din triunghiul de vest (i
variante);
4. parcurgerea pe diagonale a unei matrice;
5. parcurgerea n spiral a unei matrice;
6. determinarea poziiei punctului ,a ntr-o matrice;
7. calcularea sumelor de-a lungul laturilor matricelor ptratice;
8. veriIicarea unei proprieti globale a unui tablou bidimensional.

Sptmna 19: Tablouri multidimensionale (III)
Obiective specifice:
Tablourile biaimensionale se compun ae iruri ae iruri. Elevii se vor obinui s
stabileasc cana anume este avantafos s prelucre:e tablouri biaimensionale folosina
aceast proprietate, aaic manevrana iruri.
- Operaii cu matrice
1. produsul a dou matrice;
2. produsul a N matrice;
3. inversarea a dou linii/coloane;
4. ordonarea liniilor astIel nct elementele de pe diagonala principal/secundar
s Iie n ordine cresctoare/descresctoare;
5. interclasarea a N iruri ordonate;
6. veriIicarea triunghiularitii unei matrice (inIerior, superior triunghiular).

Sptmna 20: Tablouri multidimensionale (IV)
Obiective specifice:
In probleme pot s apar i tablouri cu mai multe aimensiuni aecat 2. Elevii ii vor
forma abiliti ae a prelucra asemenea tablouri.
- Prelucrarea tablourilor avnd dimensiune mai mare dect 2
1. suma elementelor unui tablou n-dimensional;
16 Programa colar

2. identiIicarea coordonatelor unui element dat (toate apariiile) ntr-un tablou n-
dimensional;
3. parcurgerea unui tablou tridimensional dinspre exterior nspre interior;
4. determinarea matricei dintr-un tablou tridimensional care are suma elemente-
lor maxim;

Sptmna 21: Concurs (IV)
Obiective specifice:
Se va testa capacitatea elevilor ae a lucra cu tablouri multiaimensionale. Jor fi
patru probleme care vor fi re:olvate in aou ore.

Sptmna 22: Articole
Obiective specifice:
Acele aate care se compun ain mai multe componente avana tipuri aiferite ae mul-
te ori se structurea: in articole. Elevii vor inva cum se aeclar eficient i cum se
prelucrea: asemenea aate. Ei vor re:olva probleme asemntoare cu cele ain viaa
cu :i ae :i, aplicana facilitile oferite ae meaiul ae programare ales.
- DeIinirea unor structuri de date de tip articol (inclusiv cu variante) i prelucrarea
lor.
1. crearea unui catalog pentru o clas;
2. aIiarea n ordine descresctoare dup medie a elevilor admii i alIabetic a
elevilor respini la un examen;
3. aIiarea tuturor elevilor care au domiciliul ntr-un anumit ora;
4. ordonarea elevilor n Iuncie de nlime i, pentru nlimi egale, n ordinea
greutii;
5. crearea unui Iiier care s conin articole privind crile dintr-o bibliotec;
6. crearea unui Iiier care s conin articole privind crile dintr-o bibliotec ast-
Iel nct n cazul manualelor s se speciIice disciplina, clasa pentru care este
valabil manualul, autorii etc., iar pentru crile care nu sunt manuale numrul
autorilor, autorii, titlul, editura etc. (se va lucra cu nregistrri cu variante);
7. crearea unui Iiier cu articole privind rezultatele participanilor la olimpiada
internaional de inIormatic.

Sptmna 23: Mulimi yi simularea lor
Obiective specifice:
Multe probleme necesit efectuarea operaiilor ain teoria mulimilor. In funcie ae
meaiul ae programare i ae proprietile concrete ale aatelor, acestea pot fi organi:a-
te in mulimi, sau se pot organi:a in alte structuri ae aate (tablouri) simulana opera-
iile respective.
Programa colar 17

- DeIinirea unor structuri de date de tip mulime (cu set n Pascal, i Ir) i prelu-
crarea lor
1. aIiarea reuniunii a dou mulimi de numere/litere;
2. aIiarea interseciei a dou mulimi de numere/litere;
3. aIiarea diIerenei a dou mulimi de numere/litere;
4. veriIicarea apartenenei unui numr (unei litere) la o mulime dat;
5. generarea claselor de echivalen pe baza perechilor de numere/caractere care
se aIl ntr-o relaie dat.

Sptmna 24: Aritmetica numerelor mari
Obiective specifice:
Dac un numr ae un anumit tip aepete cel mai mare numr posibil ae repre-
:entat cu toate cifrele exacte, aar problema necesit un re:ultat exact, operaiile arit-
metice care trebuie efectuate se vor simula, folosina iruri ae caractere. Aceste prelu-
crri necesit cunoaterea subprogramelor aefinite in unit-ul stanaara al meaiului pe
string-uri. Elevii vor re:olva probleme in care este necesar implementarea operaii-
lor aritmetice pe numere mari.
- Aritmetica numerelor mari
1. implementarea operaiilor cu numere mari (adunare, scdere, nmulire, mpr-
ire, restul mpririi ntregi, ridicare la putere, radical);
2. generarea primelor N (N ~ 60) termeni ai irului lui Fibonacci;
3. generarea valorii N! (N ~ 15);
4. calcularea valorii a
b
.

Sptmna 25: Operaii pe bii
Obiective specifice:
Elevii se vor familiari:a cu utili:area operatorilor care permit prelucrarea aatelor
pe bii. In re:olvarea ae probleme, utili:area acestora mrete performanele progra-
melor.
- Utilizarea operaiilor pe bii n scopul accelerrii anumitor operaii din algoritmi.
1. schimbarea semnului unui numr;
2. schimbarea valorii unui bit dintr-un numr;
3. codiIicarea i decodiIicarea unui numr pe baza unei chei;
4. interschimbarea a dou numere Ir variabil auxiliar, Iolosind operaia xor;
5. nmulirea i mprirea cu puteri ale lui 2;
6. numrarea biilor avnd valoarea 1 (sau 0) din reprezentarea unui numr n ba-
za 2;
7. descompunerea unui numr ntreg n octetul din stnga i octetul din dreapta;
8. obinerea reprezentrii n baza 2 a unui numr ntreg, Iolosind operaii pe bii;
9. rotirea ciIrelor binare ale unui numr ntreg;
18 Programa colar

10. schimbarea ciIrelor binare egale cu 1 n 0 i invers;
11. generarea tuturor submulimilor mulimii 1, 2, ., N};
12. generarea tuturor irurilor care conin numai valorile 0 i 1.

Sptmna 26: Concurs (V)
Obiective specifice:
Se va testa capacitatea elevilor ae a lucra cu tipurile articol i mulime, precum i
capacitatea ae a utili:a numerele mari i operaiile pe bii. Jor fi patru probleme care
vor fi re:olvate in aou ore.

Sptmna 27: Funcii yi proceduri
Obiective specifice:
Elevii au folosit aefa multe subprograme preaefinite, aar ei trebuie s fie capabili
s implemente:e re:olvarea unor subprobleme sub form ae subprograme proprii. Ei
vor implementa algoritmii ae re:olvare sub form generali:at, astfel incat acestea s
se poat reutili:a in re:olvarea mai multor probleme. Ja crete li:ibilitatea
programelor i se va uura aepanarea.
- Utilizarea Iunciilor i procedurilor (predeIinite i utilizator)
1. rezolvarea majoritii problemelor tratate, Iolosind subprograme;
2. rezolvarea unor probleme n care problema iniial se descompune n subpro-
bleme;
3. rezolvarea unor probleme n care un acelai subprogram se apeleaz n mod
repetat pentru date diIerite;
4. realizarea unui unit propriu care conine toate problemele rezolvate cu subpro-
grame i scrierea unor programe care Iolosesc acest unit.

Sptmna 28: Recursivitate
Obiective specifice:
Recursivitatea este un concept aes intalnit in programare. Ea totui trebuie aplica-
t cu grif, fr ca folosina-o s se mreasc inutil complexitatea algoritmilor. Sub-
programele recursive sunt li:ibile, compacte i se aplic mai ales asupra structurilor
ae aate aefinite recursiv sau in ca:ul problemelor ale cror moael matematic este ae-
finit in termeni recursivi. Se va reveni la recursivitate in clasa a X-a, cana se vor inv-
a liste i arbori.
- DeIinirea conceptului i rezolvarea unor probleme enunate n termeni recursiv.
1. inversarea ciIrelor din conIiguraia unui numr dat (Ir string-uri);
2. inversarea numerelor dintr-un ir dat (Ir tablouri);
3. calculul recursiv al Iactorialului;
4. calculul recursiv al celui mai mare divizor comun a dou numere ntregi;
Programa colar 19

5. calculul recursiv al termenilor unui ir pe baza unei relaii de recuren;
6. generarea submulimilor mulimii 1, 2, ., N};
7. determinarea obiectelor din care se compune o IotograIie.

Sptmna 29: Backtracking (I)
Obiective specifice:
Utilitatea metoaei backtracking este ,contestat` in literatura ae specialitate, to-
tui, avana in veaere c exist multe probleme pentru re:olvarea crora nu exist alt
metoa mai bun, elevii o vor cunoasc i vor inva s-o aplice aac este ca:ul sau
aac nu gsesc nici o alternativ viabil. Ei vor aeveni capabili s iaentifice aceast
clas ae probleme i s implemente:e re:olvri ae:voltate pe ba:a metoaei. La inceput
se vor trate probleme care prelucrea: iruri i cer furni:area tuturor soluiilor.
- DeIinirea metodei i identiIicarea clasei de probleme care se rezolv cu metoda
backtracking.
1. generarea tuturor permutrilor irului de numere 1, 2, ..., N,
2. aezarea a 8 regine pe tabla de ah, Ir ca acestea s se atace;
3. generarea produsului scalar a dou mulimi;
4. generarea tuturor aranjamentelor de N luate cte M,
5. generarea tuturor perechilor de paranteze care se nchid corect;
6. generarea tuturor Iunciilor injective cunoscnd mulimea de argumente i cea
a valorilor Iunciilor;
7. generarea tuturor Iunciilor surjective cunoscnd mulimea de argumente i
cea a valorilor Iunciilor;
8. generarea tuturor partiiilor unui numr dat;
9. generarea partiiilor mulimii 1, 2, ., N};
10. generarea tuturor turnurilor de cuburi n Iuncie de anumite proprieti date.

Sptmna 30: Backtracking (II)
Obiective specifice:
Elevii vor fi capabili s iaentifice clasa ae probleme care se re:olv cu metoaa
backtracking pe aate aefinite in aou aimensiuni.
- DeIinirea metodei i identiIicarea clasei de probleme care se rezolv cu metoda
backtracking n dou dimensiuni
1. ieirea din labirint;
2. labirint cu pereii celulelor pstrai pe bii;
3. aranjarea unor piese de tetris astIel nct se completeaz integral un drept-
unghi de dimensiuni date.

20 Programa colar

Sptmna 31: Backtracking (III)
Obiective specifice:
In ca:urile in care s-a hotrat aplicarea metoaei pentru probleme care necesit
aeterminarea unui minim, programul poate fi optimi:at. Elevii vor fi capabili s iaen-
tifice clasa ae probleme in care asemenea optimi:ri sunt posibile i vor inva s le
implemente:e. De asemenea, ei vor inva moaaliti prin care pot s msoare timpul
ae executare al propriului program i s-l opreasc in momentul in care ar urma ca
acesta s rule:e mai mult aecat timpul permis. Jor inva tehnici ae optimi:are, cum
ar fi scrierea in fiier a unor ,pachete ae re:ultate`, generarea unor re:ultate ale
problemei in timpul lucrului i introaucerea acestora in tablouri ae constante etc.
- DeIinirea metodei i identiIicarea clasei de probleme n care rezolvarea cu meto-
da backtracking necesit (i permite) optimizri.
1. determinarea turnului de cuburi de nlime minim;
2. determinarea drumului pe care broasca ajunge la lcust i se ntoarce la locul
de pnd pe supraIaa unui lac ngheat unde gheaa se rupe n urma eIecturii
sriturilor;
3. vizitarea unei matrice de dimensiuni M N astIel nct se creeaz un ir A ale
crui elemente sunt numerele din matrice; dou elemente aIlate pe poziii
consecutive n irul A trebuie s Iie vecine n matrice. Suma 1 A
1
2 A
2

. M N A
M N
trebuie s Iie minim.

Sptmna 32: Concurs (VI)
Obiective specifice:
Se va testa capacitatea elevilor ae a folosi tehnici recursive i ae a re:olva proble-
me prin metoaa backtracking. Jor fi aou probleme care vor fi re:olvate in aou ore.

Cuprins

Prefa ..................................................................................................................................... 5
Programa ycolar................................................................................................................ 7

1. Recapitulare..................................................................................................25
1.1. Structura programelor Pascal...................................................................................... 25
1.2. Vocabularul limbajului ............................................................................................... 27
1.3. Constante .................................................................................................................... 27
1.4. Tipuri standard de date ............................................................................................... 28
1.5. Variabile ..................................................................................................................... 32
1.6. DeIinirea constantelor................................................................................................. 32
1.7. Expresii....................................................................................................................... 33
1.8. Citirea i scrierea datelor ............................................................................................ 33
1.9. Instruciuni.................................................................................................................. 34
1.10. Probleme propuse ....................................................................................................... 38

2. Fiyiere de tip text yi prelucrri simple.................................................................. 46
2.1. Exploatarea unui Iiier de tip text ............................................................................... 46
2.2. Prelucrri simple ale datelor citite din Iiiere ............................................................ 47
2.3. Determinarea elementului minim/maxim................................................................... 50
2.4. Implementri sugerate ................................................................................................ 51
2.5. Probleme propuse ....................................................................................................... 52
2.6. Soluiile problemelor .................................................................................................. 57

3. Numere ............................................................................................................................. 65
3.1. Prelucrri ale numerelor ............................................................................................. 65
3.2. Implementri sugerate ................................................................................................ 68
3.3. Probleme propuse ....................................................................................................... 69
3.4. Soluiile problemelor .................................................................................................. 73

4. Numere speciale ............................................................................................................ 84
4.1. Numere perIecte ......................................................................................................... 85
4.2. Numere prietene ......................................................................................................... 86
4.3. Numere triangulare..................................................................................................... 88
4.4. Numere ptratice......................................................................................................... 88
4.5. Numere piramidale ..................................................................................................... 88
4.6. Numere pitagoreice..................................................................................................... 88
4.7. Numere prime............................................................................................................. 89
4.8. Numere Fibonacci....................................................................................................... 89
4.9. Implementri sugerate ................................................................................................ 91
4.10. Probleme propuse ....................................................................................................... 91
4.11. Soluiile problemelor .................................................................................................. 94
22 Cuprins

5. Conversii ........................................................................................................................ 102
5.1. Sisteme de numeraie................................................................................................ 102
5.2. Conversii ntre dou baze de numeraie.................................................................... 105
5.3. Operaii cu numere naturale n diverse baze de numeraie ....................................... 107
5.4. Criterii de divizibilitate n diverse baze de numeraie .............................................. 109
5.5. Implementri sugerate .............................................................................................. 111
5.6. Probleme propuse ..................................................................................................... 112
5.7. Soluiile problemelor ................................................................................................ 114

6. Tablouri unidimensionale ....................................................................................... 121
6.1. Atribuirea.................................................................................................................. 121
6.2. Selectarea unei componente ..................................................................................... 122
6.3. Declararea tablourilor unidimensionale.................................................................... 122
6.4. Citirea tablourilor unidimensionale .......................................................................... 122
6.5. AIiarea tablourilor unidimensionale........................................................................ 123
6.6. Prelucrri simple pe tablouri..................................................................................... 124
6.7. Implementri sugerate .............................................................................................. 137
6.8. Probleme propuse ..................................................................................................... 138
6.9. Soluiile problemelor ................................................................................................ 144

7. Subprograme................................................................................................................ 152
7.1. Noiunea de modul.................................................................................................... 152
7.2. Declararea i apelul unui subprogram ...................................................................... 153
7.3. Funcii i proceduri n Pascal.................................................................................... 156
7.4. Dezvoltarea programelor .......................................................................................... 159
7.5. Implementri sugerate .............................................................................................. 160
7.6. Probleme propuse ..................................................................................................... 161
7.7. Soluiile problemelor ................................................................................................ 163

8. Stiva ................................................................................................................................. 171
8.1. Operaii cu stive........................................................................................................ 172
8.2. Evaluarea expresiilor aritmetice ............................................................................... 174
8.3. Probleme propuse ..................................................................................................... 177
8.4. Soluiile problemelor ................................................................................................ 180

9. Ordonri yi cutri .................................................................................................... 191
9.1. Algoritmi de ordonare .............................................................................................. 191
9.2. Algoritmi de cutare ................................................................................................. 198
9.3. Interclasarea a dou tablouri unidimensionale.......................................................... 200
9.4. Implementri sugerate .............................................................................................. 202
9.5. Probleme propuse ..................................................................................................... 203
9.6. Soluiile problemelor ................................................................................................ 206


Cuprins 23

10. Siruri de caractere................................................................................................... 214
10.1. Operaii cu variabile de tip string........................................................................ 215
10.2. Subprograme predeIinite pentru string-uri ............................................................. 217
10.3. Implementri sugerate ............................................................................................ 217
10.4. Probleme propuse ................................................................................................... 218
10.5. Soluiile problemelor .............................................................................................. 222

11. Aritmetica numerelor mari.................................................................................. 228
11.1. Calcularea valorii 2
n
............................................................................................... 228
11.2. Probleme propuse ................................................................................................... 230
11.3. Soluiile problemelor .............................................................................................. 231

12. Tablouri bidimensionale ....................................................................................... 239
12.1. DeIiniie.................................................................................................................. 240
12.2. Operaii cu tablouri bidimensionale........................................................................ 242
12.3. Careuri magice........................................................................................................ 244
12.4. Implementri sugerate ............................................................................................ 248
12.5. Probleme propuse ................................................................................................... 249
12.6. Soluiile problemelor .............................................................................................. 258

13. Tablouri multidimensionale................................................................................. 279
13.1. Aplicaii cu tablouri tridimensionale ...................................................................... 280
13.2. Implementri sugerate ............................................................................................ 283
13.3. Probleme propuse ................................................................................................... 283
13.4. Soluiile problemelor .............................................................................................. 284

14. Polinoame.................................................................................................................... 288
14.1. DeIinirea noiunii de polinom................................................................................. 288
14.2. Forma algebric a polinoamelor ............................................................................. 289
14.3. Reprezentarea polinoamelor n memoria calculatorului ......................................... 290
14.4. Implementri sugerate ............................................................................................ 295
14.5. Probleme propuse ................................................................................................... 295
14.6. Soluiile problemelor .............................................................................................. 297

15. Mulimi......................................................................................................................... 306
15.1. Tipul mulime ......................................................................................................... 306
15.2. Operaiile posibile cu datele de tip mulime ........................................................... 307
15.3. Probleme propuse ................................................................................................... 309
15.4. Soluiile problemelor .............................................................................................. 312

16. Tipul nregistrare..................................................................................................... 320
16.1. Declararea unui tip nregistrare .............................................................................. 320
16.2. Operaii ................................................................................................................... 322
16.3. Implementri sugerate ............................................................................................ 323
24 Cuprins

16.4. Probleme propuse ................................................................................................... 323
16.5. Soluiile problemelor .............................................................................................. 326

17. Operaii pe bii .......................................................................................................... 331
17.1. Noiuni de baz....................................................................................................... 331
17.2. Reprezentarea numerelor n memorie..................................................................... 332
17.3. Operaii pe bii ........................................................................................................ 335
17.4. nmulire cu operaii pe bii .................................................................................... 338
17.5. Implementri sugerate ............................................................................................ 338
17.6. Probleme propuse ................................................................................................... 339
17.7. Soluiile problemelor .............................................................................................. 340

18. Recursivitate .............................................................................................................. 344
18.1. Noiunea de recursivitate ........................................................................................ 344
18.2. Proiectarea unui algoritm recursiv.......................................................................... 346
18.3. Execuia apelurilor recursive .................................................................................. 348
18.4. Recursivitate indirect (ncruciat) ....................................................................... 350
18.5. Greeli Irecvente n scrierea programelor recursive ............................................... 352
18.6. Cnd merit s utilizm tehnica recursivitii ?...................................................... 352
18.7. Implementri sugerate ............................................................................................ 353
18.7. Probleme propuse ................................................................................................... 353
18.8. Soluiile problemelor .............................................................................................. 356

19. Metoda backtracking.............................................................................................. 368
19.1. Backtracking iterativ............................................................................................... 369
19.2. Backtracking recursiv............................................................................................. 370
19.3. Implementri sugerate ............................................................................................ 371
19.4. Probleme propuse ................................................................................................... 372
19.5. Soluiile problemelor .............................................................................................. 378

Bibliografie ............................................................................................................. 394




Recapitulare

Structura programelor Pascal
Vocabularul limbajului
Constante
Tipuri standard de date
Variabile
Definirea constantelor
Expresii
Citirea yi scrierea datelor
Instruciuni
Probleme propuse
Capitolul
1


Limbajul Pascal a Iost conceput mai ales n scop didactic, urmrind predarea ,artei
programrii calculatoarelor conIorm principiilor programrii structurate. Limbajul
modeleaz natural concepte de baz n programare i permite implementri eIiciente.

1.1. Structura programelor Pascal
n descrierea unui program Pascal se diIereniaz aciunile de eIectuat i descrierea da-
telor de prelucrat. n structura unui program Pascal intr:
- antetul programului (opional) conine cuvntul rezervat Program urmat de
numele programului;
- declaraie (opional) a numelor unit-urilor care se vor Iolosi n program, introdu-
s de cuvntul rezervat uses;
- parte obligatorie Iormat dintr-un bloc, urmat de caracterul punct ('.').

Un unit este o colecie de declaraii de constante, tipuri, variabile i subprograme.
Un unit se compileaz i se utilizeaz n programele n care se dorete Iolosirea aces-
tor constante, tipuri, variabile i subprograme. Folosirea unit-urilor permite scrierea
unor programe mari care pot depi 64K. Dimensiunea unui program, ca i cea a unui
unit nu poate s depeasc 64K. Unit-urile standard, oIerite de mediul Borland Pascal
sunt: System, Dos, Graph, Crt etc. Unit-ul System este ncorporat n toate progra-
mele Pascal Ir s Iie necesar includerea declaraiei uses. Acest unit cuprinde pro-
cedurile i Iunciile cel mai des Iolosite.
26 1. Recapitulare

Blocul este cea mai important parte dintr-un program i cuprinde o seciune de de-
claraii (opional) i o seciune de program.
Declaraiile se pot preciza n orice ordine, pot alterna i se pot repeta. Acestea sunt
structurate astIel:
declaraii de constante;
deIiniii de tipuri;
declaraii de variabile;
declaraii de etichete;
declaraii de subprograme.
Instruciunile care se vor executa vor Ii scrise n seciunea de program. Aici se pot
apela subprograme declarate anterior (n partea de declaraii sau n unit-uri).
Iat un exemplu de program Pascal:
{ Intre acolade vom scrie comentarii. }
{ Acestea sunt texte explicative care nu se compileaza. }
{ Enuntul problemei: }
{ Fie a, b si c lungimile laturilor unui triunghi oarecare. }
{ Sa se calculeze perimetrul triunghiului si aria sa. }
{ Observatie: }
{ a, b si c sunt numere naturale strict pozitive. }
Program triunghi;
type pozitiv=1..MaxLongint;
var a,b,c,peri:pozitiv;
sp,aria:Real; { sp ==> semiperimetrul triunghiului }
Begin
repeat
Write('Introduceti lungimea laturii a-->'); ReadLn(a);
Write('Introduceti lungimea laturii b-->'); ReadLn(b);
Write('Introduceti lungimea laturii c-->'); ReadLn(c);
if a*b*c=0 then
WriteLn('Cel putin o latura are lungimea 0! Reluati!)
else
if (a<0) or (b<0) or (c<0) then
WriteLn('Lungimi negative! Reluati!')
until (a>0) and (b>0) and (c>0);
if (a+b>c) and (a+c>b) and (b+c>a) then begin
peri:=a+b+c;
WriteLn('Perimetrul triunghiului este: ',peri);
sp:=peri/2;
aria:=Sqrt(sp*(sp-a)*(sp-b)*(sp-c));
WriteLn('Aria triunghiului este: ',aria:10:2)
end else
WriteLn(a,' ',b,' ',c,' nu pot fi laturile unui triunghi!')
End.
1. Recapitulare 27

n seciunea type am deIinit tipul de date pozitiv cu valori mari, astIel putem
calcula perimetrul i aria unui triunghi, avnd lungimile laturilor numere pozitive care
pot depi valoarea de dou miliarde, dar trebuie s Iie mai mici sau egale cu valoarea
constantei MaxLongint (2147483647). Rezultatele le vom declara de tip Real, de-
oarece doar tipul acesta permite pstrarea rezultatului cu zecimale exacte.
Variabilele declarate n seciunea var sunt a, b, c, peri i au tipul pozitiv, iar
sp i aria sunt de tipul Real. Instruciunile din program apar ntre cuvintele rezerva-
te begin i end i sunt separate prin punct i virgul (;). Textele cuprinse ntre acola-
de ({}) sunt comentarii.

1.2. Vocabularul limbajului
Setul de caractere al limbajului cuprinde: literele mari i mici ale alIabetului englez,
ciIrele din baza 10 i caracterele speciale: +, -, *, /, ^, <, >, (, ), [, ], {, }, . , ,, :, ;,
#, $, @, _ i spaiul (blancul).
Iaentificatorii sunt Iormai din litere, ciIre i caracterul '_' (liniua de subliniere),
dar primul caracter dintr-un identiIicator nu poate Ii o ciIr. Este indicat ca numele
unui identiIicator s Iie ales dup semniIicaia lui n program. Lungimea numelui
identiIicatorului nu inIlueneaz lungimea codului obiect. Compilatoarele Pascal nu
Iac distincie ntre literele mari i literele mici.
IdentiIicatorii min, max2, Sum13a, prod sunt acceptai de compilatorul Pascal, n
schimb a+b, 5a, z y nu sunt identiIicatori (primul exemplu este o expresie, al doilea
ncepe cu ciIr, iar al treilea conine un spaiu).
IdentiIicatorii pot desemna nume ae programe, constante, tipuri, variabile, subpro-
grame, parametri, unit-uri etc. IdentiIicatorii care au semniIicaie Iixat, i care nu pot
Ii Iolosii dect n contextul n care sunt deIinii n limbaj, alctuiesc mulimea cuvin-
telor re:ervate ale limbajului.
IdentiIicatorii creai i reIerii de utilizator trebuie declarai n program ntr-o linie
surs scris anterior reIeririi.

1.3. Constante
Tipurile de constante ntlnite n limbajul Borland Pascal sunt:
- constantele intregi (1977, 6, 3, -127 sunt numere ntregi n baza 10; $afe2
este un numr n baza 16);
- constantele reale (-4.23, 0.0, 67E-2 este egal cu 6710
-2
= 0.67) ;
- irurile ae caractere pot Ii:
un ir de caractere imprimabile, cuprins ntre apostroIuri: 'elev';
un ir de numere ntregi de la 0 la 255, precedate Iiecare de caracterul #, scri-
se Ir separatori (concatenate);
28 1. Recapitulare

un ir de caractere de control (care au codurile ASCII ntre 1 i 31), exprima-
te Iiecare printr-un caracter precedat de ^ (^A este Ctrl+A);
iruri obinute prin concatenarea irurilor deIinite anterior;
- constante simbolice.

Dac dorim caracterul apostroI, atunci acesta trebuie dublat n ir:
'Windows''98'.
Constantele simbolice sunt desemnate printr-un identiIicator. Dac Iolosim aceste
constante oIerim programului claritate i independen Ia de eventualele modiIicri
ale acestor constante. O constant simbolic nu poate Ii modiIicat n timpul execuiei
programului.

1.4. Tipuri standard de date
Prin aat nelegem o entitate asupra creia poate opera calculatorul. Limbajele de ni-
vel nalt Iolosesc tipurile de date pentru abstractizarea reprezentrii unei date. Tipul ae
aat preci:ea: mulimea ae aate i operaiile care se pot efectua cu ea.

Tipurile simple de date sunt nestructurate i se mpart n: tipuri reale i tipuri orai-
nale. Un tip ordinal deIinete o mulime Iinit i ordonat de valori. Orice tip ordinal
are o valoare minim i una maxim. Orice valoare de tip ordinal are o valoare preae-
cesor (excepie Icnd minimul) i o valoare succesor (excepie Icnd maximul).

Tipuri de date

Reale
PredeIinite n
unit-ul System
ntregi
Boolean
Char
Enumerat
Tipuri simple de
date
(scalare,
nestructurale)
Ordinale
Utilizator
Subdomeniu (interval)
Tablou
String
Articol
(nregistrare)
Mulime
Structurate
Fiier

Tipul reper (pointer,
reIerin)


n unit-ul System exist deIinite Iunciile aplicabile unei valori de tip ordinal:
1. Recapitulare 29

Succ(x)
Furnizeaz succesorul lui x (dac x nu este maxim n tipul su) sau retur-
neaz prima valoare corespunztoare tipului (dac x coincide cu valoarea
maxim din tipul su); rezultatul are acelai tip ca i x.
Pred(x)
Furnizeaz predecesorul lui x (dac x nu este minim n tipul su) sau ulti-
ma valoare corespunztoare tipului (dac x coincide cu valoarea minim
din tipul su); rezultatul are acelai tip ca i x.
Ord(x)
Furnizeaz numrul de ordine pe care l are x n mulimea valorilor din ti-
pul lui x; rezultatul Iunciei este de tip ntreg.

Compararea valorilor ordinale x i y se poate Iace cu ajutorul operatorilor rela-
ionali: = (egal), <> (diIerit), <, >, <=, >=. Rezultatul comparrii este de tip Boolean,
adic poate avea valorile true sau false.
Prin reguli stabilite n limbaj, tipurile simple de date stau la baza alctuirii tipurilor
structurate.

1.4.1. Tipul Boolean (logic)
O variabil de tip Boolean poate avea dou valori: aaevrat sau fals. Exist mai muli
operatori logici care pot Ii aplicai asupra datelor booleene. Expresia va avea rezultat
de tip Boolean:
Operatori binari:
and i logic
or sau logic
xor sau exclusiv (x xor y este true numai dac x<>y)
not negaie logic (operator unar)

Valoarea false are asociat numrul de ordine 0, iar valoarea true are asociat nu-
mrul de ordine 1. Valorilor booleene li se pot aplica operatorii relaionali, obinnd
orice operaie logic dorit. Operatorul = exprim echivalena logic, iar operatorul <=
exprim implicaia logic (x<=y are valoarea false dac i numai dac x este true i
y este false).

1.4.2. Tipul Char
Setul extins de caractere ASCII reprezint domeniul de valori pentru o dat de tip
Char. O dat de tip Char se reprezint pe un octet (8 bii).
Exemple de date de tip Char: 'k', #10 (caracterul avnd codul ASCII 10), ''''
(caracterul apostroI), ^A caracterul care se obine prin apsarea tastelor Ctrl+A.
Funciile care sunt deIinite n unit-ul System pentru date de tip ordinal se pot utili-
za i pentru datele de tip Char.
- Succ('b') Iurnizeaz caracterul 'c'
30 1. Recapitulare

- Pred('c') Iurnizeaz caracterul 'b'
- Ord('C') Iurnizeaz codul ASCII al caracterului 'C', codul returnat este 67
- Chr(68) Iurnizeaz caracterul 'D'
Funcia Chr(n) returneaz caracterul al crui cod ASCII este egal cu numrul n.
Numrul n trebuie s se ncadreze n intervalul |0, 255|. Dac valoarea lui n este mai
mic dect 0, atunci Iuncia Chr genereaz caracterul care are codul ASCII egal cu
k 256 n, unde k este cel mai mic numr natural pentru care expresia k 256 n este
mai mare sau egal cu 0. Dac numrul n este mai mare dect 255, atunci Iuncia Chr
returneaz caracterul avnd codul ASCII egal cu restul mpririi ntregi a lui n la 256.
O valoare de tip Char se poate scrie i se poate citi. Datele de tip Char se pot compara
utiliznd operatorii relaionali.

1.4.3. Tipuri ntregi
n Pascal exist cinci tipuri ntregi predeIinite: Shortint, Integer, Longint, Byte,
Word. Domeniul de valori i modul de reprezentare se pot vedea n meniul Help.
Asupra datelor de tip ntreg se pot aplica urmtorii operatori aritmetici: (aduna-
rea), (scderea), * (nmulirea), div (mprirea ntreag), mod (restul mpririi n-
tregi a primului operand la al doilea) i operatorii pe bii: not (negaie, Iiecare bit egal
cu 1 devine 0 i Iiecare bit egal cu 0 devine 1), and (i logic Iace conjuncia bit cu bit
ntre operanzi), or (sau logic Iace disjuncia bit cu bit ntre operanzi), xor (sau exclu-
siv ntre operanzi), shl (deplaseaz la stnga un numr de poziii binare egal cu valoa-
rea celui de-al doilea operand; primii bii se pierd, n locul ultimilor bii se genereaz
valoarea 0), shr (deplaseaz la dreapta un numr de poziii binare egal cu valoarea ce-
lui de-al doilea operand; ultimii bii ai primului operand se pierd, pe primele poziii se
copiaz valoarea 0).
Operaia de deplasare la stnga cu o poziie este echivalent cu o nmulire a primu-
lui operand cu 2, iar deplasarea spre dreapta cu o poziie a unui numr pozitiv este
echivalent cu o mprire ntreag la 2. Aceste operaii de deplasare la stnga i la
dreapta a valorii biilor se realizeaz mult mai rapid dect atunci cnd se utilizeaz
operatorii * sau div.
Tipurile ntregi sunt tipuri ordinale. Fiecare numr ntreg are asociat un numr de
ordine care coincide cu valoarea respectiv. Operanzilor de tip ntreg li se pot aplica
Iunciile Succ, Pred, Ord i operatorii relaionali. Alte Iuncii care se pot aplica ope-
ranzilor de tip ntreg sau real i care returneaz un rezultat de tip ntreg sunt:
- Abs(n) returneaz valoarea absolut a argumentului n;
- Sqr(n) determin ptratul argumentului n;
- Trunc(n) Iurnizeaz cel mai mare ntreg mai mic sau egal cu n pentru n ~ 0, sau
cel mai mic ntreg, mai mare sau egal cu n, pentru n 0;
- Round(n) Iurnizeaz cel mai apropiat ntreg Ia de argumentul n.
1. Recapitulare 31

1.4.4. Tipuri reale
Datele de tip real primesc valori reale aparinnd domeniului de valori corespunztor
tipului respectiv. Calculele cu valori ntregi modeleaz exact aritmetica ntregilor, dar
operaiile cu date de tip real produc rezultate aproximative. Aceste aproximri provin
din erorile de rotunjire generate de numrul Iinit de ciIre semniIicative Iolosite n re-
prezentarea valorilor reale. Tipurile reale care exist n limbajul Pascal sunt: Real,
Single, Double, Extended, Comp. Domeniul de valori i modul de reprezentare se
pot vedea n meniul Help. Valorile datelor de tip Comp sunt numere ntregi cuprinse n
intervalul |0, 2
63
-1|. Dac din doi operanzi cel puin unul este de tip Real, atunci pu-
tem aplica operatorii: (adunare), (scdere), * (nmulire), / (mprire cu rezultat de
tip real; acest operator se poate aplica i operanzilor de tip ntreg, ns rezultatul va Ii
de tip real). Dac aplicm operatorii relaionali asupra unor operanzi de tip real vom
obine un rezultat de tip Boolean.
Tipurile reale nu sunt ordinale, prin urmare asupra valorilor reale nu putem aplica
Iunciile Ord, Succ, Pred.
Valorile reale pot Ii citite i scrise. Principalele Iuncii standard de lucru cu valori
reale sau ntregi se gsesc prezentate n meniul Help (Abs, Sqr, Sin, Cos, Arctan,
Ln, Exp, Sqrt, Int, Frac, Pi).

1.4.5. Tipuri ordinale definite de utilizator
n limbajul Pascal utilizatorul poate s deIineasc tipuri ordinale proprii: tipul enume-
rat i tipul subaomeniu.
Tipul enumerat modeleaz cazurile n care exprimarea nu este numeric. De exem-
plu, atunci cnd lucrm ntr-un program de tip agend cu zilele sptmnii, programul
va Ii mult mai lizibil dac se lucreaz chiar cu denumirea zilelor sptmnii i nu cu
numerele de ordine corespunztoare lor.
Un tip enumerat deIinete o mulime ordonat de valori prin enumerarea identiIica-
torilor care vor desemna valorile. Primul identiIicator desemneaz cea mai mic valoa-
re, cu numrul 0. Ceilali identiIicatori au numerele urmtoare, conIorm succesiunii
lor. Prelucrarea datelor de acest tip se Iace rapid, deoarece valorile corespunztoare se
reprezint n memorie prin numerele lor de ordine. Aceti identiIicatori sunt tratai n
program la Iel ca i constantele.
Fiind un tip special, diIerit de orice alt tip, nu putem utiliza identiIicatorii unui tip
enumerat n deIiniia altui tip enumerat.
Asupra datelor de tip enumerat nu se pot aplica operatori aritmetici. Datele de tip
enumerat se comport similar constantelor simbolice, de asemenea, nu se pot citi sau
scrie. Iniializarea datelor de tip enumerat se Iace prin atribuiri. Dac, de exemplu, am
declarat tipul:

type Saptamana=(luni,marti,miercuri,joi,vineri,sambata,duminica)
apelul Ord(marti) returneaz 2, Pred(marti) returneaz luni.
32 1. Recapitulare

Tipul subdomeniu se obine dintr-un tip ordinal deIinit anterior sau predeIinit,
numit tip de baz al subdomeniului. Mulimea valorilor acestui tip cuprinde un inter-
val de valori ale tipului de baz, ale crui limite se speciIic n deIiniia tipului subdo-
meniului. Constantele care reprezint limitele din stnga i dreapta ale subdomeniului
sunt de acelai tip ordinal, iar cea din stnga trebuie s Iie strict mai mic dect cea din
dreapta.

Operaiile permise asupra datelor de tip subdomeniu sunt cele permise de tipul de
baz al acestuia.

1.5. Variabile
Variabilele rein date, iar coninutul unei variabile poate Ii modiIicat pe parcursul exe-
cuiei programului. Fiecrei variabile i se asociaz un identiIicator i un tip de dat.
Tipul precizeaz mulimea ae aate din care poate lua valori variabila respectiv i ope-
raiile care pot Ii eIectuate cu acea variabil. Tipul se asociaz variabilei printr-o de-
claraie care poate utiliza iaentificatori ae tip sau poate reIeri un tip anonim. Dou ti-
puri anonime se consider diIerite, chiar dac descriu aceeai structur, dar identiIica-
torii aparinnd aceleiai liste ntr-o declaraii de variabile, Iolosind tipuri anonime,
vor avea tipuri identice.

Pentru Iiecare variabil declarat n program se aloc o zon de memorie n timpul
compilrii. Dimensiunea zonei de memorie pentru variabila respectiv depinde de ti-
pul variabilei.

1.6. Definirea constantelor
Constantele simbolice se deIinesc de ctre utilizator n seciunea const. Constantele
simbolice reprezint valori care nu se modiIic pe parcursul execuiei programului.
Constantele simbolice pot Ii de mai multe tipuri: intreg, real, boolean, ir ae caractere.

n limbajul Pascal se pot deIini constante cu tip care sunt variabile iniializate n Ia-
za de compilare. Valorile lor se pot modiIica n timpul execuiei programului. Folosi-
rea constantelor cu tip poate Ii avantajoas pentru iniializarea variabilelor avnd tipuri
structurate.

Exemple
const a=1977; { constanta simbolica }
Zi='marti';
Par:Boolean=Odd(a); { constanta cu tip }

1. Recapitulare 33

1.7. Expresii
O expresie descrie o regul de calcul ntr-un ir de operatori i operanzi. Fiecare ex-
presie evaluat returneaz un rezultat. n evaluarea unei expresii se respect prioritatea
operatorilor. Dac avem operatori cu aceeai prioritate, atunci se execut operaiile de
la stnga la dreapta. Dac dorim schimbarea ordinii, vom Iolosi paranteze rotunde).
Ordinea descresctoare a prioritii operatorilor este:

Prioritate Operator
1. (maxim) not, +, - (opratori unari)
2. and, *, / , div, mod, shl, shr (operatori multiplicativi)
3. or, xor, +, - (operatori aditivi)
4. (minim) =, <>, <, <=, >, >= (operatori relaionali)

O expresie este alctuit Iie dintr-o expresie simpl, Iie din dou expresii legate
printr-un operator relaional. n calculul valorii expresiei se vor evalua mai nti Iacto-
rii, apoi termenii, dup aceea expresiile simple, iar n Iinal expresia relaional.

1.8. Citirea yi scrierea datelor
Datele de intrare ale unui program se pot citi de la dispozitivul standard de intrare sau
dintr-un Iiier (o colecie de date stocat n memoria extern a sistemului de calcul).
Datele de ieire n urma execuiei unui program se pot aIia la dispozitivul standard de
ieire sau ntr-un Iiier reinut n memoria extern a sistemului de calcul.
Citirea datelor se realizeaz prin executarea procedurilor standard Read i ReadLn.
Scrierea datelor se realizeaz prin executarea procedurilor Write i WriteLn. Aces-
tea sunt declarate n unit-ul System.
Sintaxa apelului procedurii Read este: Read(listaevariabile), unde listae
variabile poate conine variabile de tip ntreg, real sau ir de caractere.
n urma apelrii Iiecrei variabile prezente n lista de variabile i se atribuie o valoa-
re. Valorile se iau de pe suportul extern, ncepnd din punctul n care s-a ajuns dup
citirea anterioar. Valorile sunt luate astIel nct s corespund tipului variabilei res-
pective. Dac acest lucru nu este posibil se va semnala eroare n execuie. De exemplu,
dac x este o variabil de tip ntreg, iar u i v sunt variabile de tip caracter, atunci in-
struciunea Read(x,u,v) atribuie o valoare ntreag variabilei x i cte o valoare de
tip caracter variabilelor u i v.
Dac pe suportul extern se aIl '125 A', atunci x va primi valoarea 125, variabila
u va primi valoarea ' ' (caracterul spaiu), iar v va primi valoarea 'A'. Dac suportul
extern conine '12.4 A', atunci execuia se va termina cu un mesaj de eroare ntruct
valoarea 12.4 nu are tipul ntreg. Tot cu eroare se va termina execuia dac pe supor-
tul extern avem 'text 15', deoarece prima valoare ntlnit nu este un numr ntreg.
34 1. Recapitulare

Procedura Write asigur transIerul inIormaiei din memoria intern pe suportul
extern. Apelul procedurii are Iorma general: Write(listaeexpresii). Lista de ex-
presii Pascal poate conine expresii de orice tip, cu excepia tipurilor structurate.
EIectul acestui apel este evaluarea expresiilor prezente n list, apoi tiprirea valo-
rilor obinute.
Pe suportul extern datele de transIerat se aIl scrise sau vor Ii tiprite pe o succesi-
une de nregistrri. Considerm c o nregistrare este constituit dintr-o secven de
date, urmat de marca de sIrit de linie. n cazul apelrii procedurilor Read i Write,
atunci cnd se epuizeaz o nregistrare se ncepe o alt nregistrare. Dar, adeseori este
necesar s se treac la o alt nregistrare nainte de a Ii epuizat precedenta. Pentru
aceasta se pot Iolosi procedurile ReadLn i WriteLn care au sintaxa i semniIicaia
procedurilor Read i Write, dar cer n plus ca la terminarea execuiei lor s se treac
la nceputul unei noi nregistrri.

1.9. Instruciuni

1.9.1. Instruciunea de atribuire
Instruciunea de atribuire are scopul de a da valori unor variabile. Ea are sintaxa:
variabila:=expresie;
unde variabila i expresie sunt de acelai tip. variabila i expresie pot Ii de tip ntreg,
real, boolean, enumerare sau orice alt tip structurat cunoscut n programul n care apa-
re instruciunea, cu excepia tipului Iiier.
Instruciunea mai nti evalueaz expresia din partea dreapt a semnului de atribui-
re ':='. Dac tipul expresiei i cel al variabilei sunt identice, atunci valoarea expresi-
ei este atribuit variabilei din stnga semnului de atribuire. Dac tipul variabilei i cel
al expresiei diIer, atunci se semnaleaz eroare, dar exist i excepii:
1. Dac tipul expresiei este Integer, iar cel al variabilei este Real, atunci se conver-
tete valoarea ntreag a expresiei ntr-o valoare real care se atribuie variabilei.

2. Dac tipul variabilei i cel al expresiei sunt de tip enumerat sau subdomeniu cu
acelai tip de baz i dac valoarea expresiei aparine tipului variabilei, aceast va-
loare se atribuie variabilei.

3. Dac variabila i expresia sunt de tip mulime, atunci este posibil ca unul sau am-
bele tipuri s Iie subdomenii ale aceluiai tip ordinal. Atribuirea este permis dac
valorile din mulimea rezultat sunt incluse n tipul de baz al variabilei din stnga
semnului de atribuire.

4. A patra excepie se reIer la tipul string (ir de caractere); tipul variabilei i cel al
expresiei putnd Ii tipuri string diIerite (iruri de caractere de lungimi diIerite).
Atribuirea este corect dac valoarea ei se poate atribui variabilei din stnga atribu-
irii.
1. Recapitulare 35

n partea stng a semnului de atribuire variabila poate Ii una simpl sau o compo-
nent a unui tablou sau a altui tip de dat structurat. Atribuirea A:=B este posibil da-
c A i B sunt variabile de acelai tip. n toate cazurile se cere ca partea dreapt a atri-
buirii s poat Ii evaluat n mod ,sigur (toate variabilele s Iie iniializate, sau citite,
eventual s aib valoare obinut din calcule precedente), altIel vom spune c variabila
B este neiniializat, iar atribuirea va putea genera rezultat eronat.

1.9.2. Instruciunea compus
Sintaxa unor instruciuni impune Iolosirea, n cadrul ei, a unei singure instruciuni.
Pentru a putea include n aceste locuri grupuri de instruciuni, n Pascal le vom grupa
ntr-o entitate simpl. Aceast entitate se numete instruciune compus i are sintaxa:

begin
instruciune
1
;
instruciune
2
;
...
instruciune
n

end;

n limbajul Pascal caracterul punct i virgul (;) separ dou instruciuni. El nu are
rolul de a marca sIritul acestora, ca atare, acest caracter nu ,trebuie scris n Iaa cu-
vntului end, dar acest lucru nu este interzis. n acest caz se consider c ntre ; i
end se aIl o instruciune via, avnd eIect nul.

1.9.3. Instruciuni condiionale
Exist dou instruciuni Pascal care permit execuia unor instruciuni n Iuncie de
ndeplinirea unor condiii: instruciunile if i case. Instruciunea if are sintaxa:
if conaiie then instruciune;
sau
if conaiie then instructiune
1
else instructiune
2
;
unde conaiie este o expresie logic, iar instruciune
1
i instruciune
2
sunt instruciuni
Pascal. n ambele variante instruciunea mai nti evalueaz expresia logic conaiie.
Dac valoarea obinut este true, atunci se execut instruciunea instruciune
1
cu care
se ncheie execuia instruciunii if. Dac valoarea obinut este false atunci, n
cazul variantei a doua se execut instruciunea instruciune
2
, iar n cazul primei va-
riante nu se execut nimic.

Exemplu
if x < 0 then v:=-x
else v:=x;
36 1. Recapitulare

Instruciunea case permite selectarea unei instruciuni dintr-o mulime de instruc-
iuni marcate, n Iuncie de valoarea unui selector. Sintaxa instruciunii este:

case expresieorainal of
listac: instruciune
1
;
listac: instruciune
2
;
...
listac: instruciune
n

|else instruciune
n1
|
end;

unde expresieorainal este o expresie de tip ordinal (selector), listac este o list de
constante case avnd tipul ordinal al expresiei expresieorainal. n listac n locul
unei constante poate s apar i un subdomeniu c
1
..c
2
(pentru o scriere mai condensat
n cazul n care constantele sunt consecutive).
EIectul instruciunii case const n evaluarea expresiei expresieorainal, obi-
nndu-se o valoare v, care constituie valoarea selectorului. Apoi se caut n listele
constantelor case valoarea egal cu v i se execut instruciunea din dreptul constantei
case egale cu v.
Dac nu exist nici o instruciune cu eticheta v atunci, n prezena cuvntului else,
se execut instruciunea care urmeaz dup acest cuvnt, altIel nu se execut nici o in-
struciune.

Exemplu
case a of
'A': Write('A');
'B': Write('B');
'C': Write('C')
else
Write('alta litera!!!')
end;

1.9.4. Instruciuni repetitive
n Pascal exist trei instruciuni care execut repetat o instruciune; acestea sunt: for,
while i repeat.

A. Instruciunea for
Aceast instruciune execut repetat (n numr cunoscut de pai) o instruciune n
Iuncie de valoarea unui contor. Ea are sintaxa:
for v:=lim
1
to lim
2
do instruciune;
sau
for v:=lim
1
downto lim
2
do instruciune;
1. Recapitulare 37

unde v este un identiIicator de variabil numit contor, iar lim
1
i lim
2
sunt expresii.
Toate au acelai tip ordinal. Valorile lui lim
1
i lim
2
se calculeaz o singur dat, la
nceputul execuiei instruciunii for. Variabila contor v va lua valori ntre limitele lim
1

i lim
2
cresctor, dac Iigureaz cuvntul to i descresctor, dac Iigureaz cuvntul
downto. SemniIicaia acestei instruciuni este dat de urmtorul algoritm:
1. se calculeaz valorile expresiilor lim
1
i lim
2
;
2. dac valoarea lui lim
1
s valoarea lui lim
2
atunci
v valoarea lui lim
1

repet
se execut instruciune
dac v valoarea lui lim
2
atunci
v Succ(v)
sfrit dac
pn cnd v = lim2
sfrit dac
n cazul Iormei for v:lim
1
downto lim
2
do instruciune vom schimba operatorii s
cu >, cu ~ i Iuncia Succ cu Prea. Contorul v poate Ii Iolosit n instruciune, dar
modiIicarea valorii sale de ctre programator nu este recomandat.

B. Instruciunea while
Aceasta este o instruciune repetitiv cu numr necunoscut de pai, anterior conaiio-
nat. Sintaxa ei este:
while conaiie do instruciune;
unde conaiie este o expresie logic. EIectul executrii instruciunii while este:
1. Evaluarea expresiei logice conaiie;
2. Dac valoarea expresiei este true, atunci se execut instruciune i se revine la pa-
sul 1, altIel execuia se termin.

AstIel se execut repetat o instruciune n Iuncie de valoarea de adevr a unei ex-
presii logice. Dac iniial expresia logic este Ials, execuia instruciunii respective nu
va avea loc niciodat.

C. Instruciunea repeat
Instruciunea repeat permite execuia repetat n numr necunoscut de pai a unui
grup de instruciuni. Instruciunea este posterior condiionat i are sintaxa:
repeat instruciuni until conaiie;
unde conaiie este o expresie logic. SemniIicaia instruciunii este:
1. Se execut instruciunile scrise ntre cuvintele repeat i until;
2. Se evalueaz expresia logic conaiie;
3. Dac valoarea expresiei este true, atunci execuia se termin, altIel se revine la
pasul 1.
38 1. Recapitulare

Observaii
- expresia conaiie nu se recomand a Ii Ioarte complicat, avnd n vedere c se
evalueaz la Iiecare pas;
- cel puin o variabil din expresia logic conaiie trebuie s-i schimbe valoarea
n mod obligatoriu, altIel exist pericolul ca instruciunea s se transIorme n
ciclu inIinit.

1.10. Probleme propuse
Problemele propuse n aceast seciune pot Ii rezolvate n cadrul unei evaluri/testri
eIectuate de proIesor, dup recapitulare, cu scopul stabilirii nivelului de cunotine a
elevilor. Problemele sunt grupate pe 3 niveluri:
1. nceptori
2. avansai
3. exceleni

1.10.1. nceptori

A. nvarea alfabetului
Copiii din clasele mici nva din greu alIabetul, pe cnd cei mai mari trag chiulul. n
clasa I un copil a ,pctuit pentru c a ncercat s vad cum este dac nu i nva
lecia pentru ora viitoare. nvtoarea l-a pedepsit, punndu-l s scrie n litere mari,
printre care acesta trebuie s scrie cel puin o dat toate literele mari pe care le-a nv-
at pn atunci.
Citii numrul de litere n pe care trebuie s le scrie copilul, precum i literele pe
care acesta le-a scris i scriei un program care veriIic dac n irul de litere apar sau
nu anumite litere de mai multe ori. AIiai literele care apar de mai multe ori (au nu-
mrul de apariii mai mare dect 1) i numrul apariiilor acestora.

Exemplu
Intrare
5
A B C A C
Ieire
A 2
C 2

B. Ghiocei yi viorele
Copiii din clasa a VI-a au mers la pdure dup ghiocei. Ei au cules ghiocei i viorele,
n total un numr de n Ilori de primvar. Au observat c ghioceii i viorelele au
crescut dup o anumit regul: ntre dou viorele era un ghiocel, apoi cte doi i tot
aa mai departe.
Citii un numr natural n, reprezentnd numrul Ilorilor i iniialele lor (G pentru
ghiocei, V pentru viorele) stabilii dac Ilorile se gsesc sau nu ntr-o conIiguraie care
1. Recapitulare 39

corespunde regulii descrise. AIiai un mesaj corespunztor ('DA' sau 'NU'), precum
i poziiile viorelelor.

Exemple
Intrare
n = 6
V G V G G V
Ieire
DA
1 3 6

Intrare
n = 5
G V G G V
Ieire
NU

C. Serviciul pe clas
La nceputul anului colar dirigintele a ntocmit planiIicarea serviciului n clas, Iiind
planiIicai cte doi elevi pentru Iiecare zi. Deoarece, elevii au declarat c doresc s Iie
de serviciu cte o Iat i un biat, dirigintele a stabilit urmtoarea regul: prima Iat
din catalog va sta cu primul biat, a doua cu al doilea i aa mai departe. Dirigintele
tie c are n elevi n clas, dar nu a numrat cte Iete i ci biei sunt, aa c se poate
ntmpla s constate la sIrit c unii copii au rmas Ir pereche.
Citii numrul de elevi, numele i genul lor ('f' pentru Iete, 'b' pentru biei),
apoi stabilii dac au rmas elevi Ir pereche i care sunt acetia.

Exemplu
Intrare
n=5
Ana f
Ioana f
Andrei b
Anca f
Paul b
Ieire
Fara pereche: Anca

D. Tierea copacilor
Pe drumul naional E81 sunt copaci numerotai n zig-zag (pe partea dreapt a drumu-
lui copacii sunt numerotai cu numere pare i pe stnga cu numere impare). La un mo-
ment dat au Iost alei copaci pentru tiere de pe Iiecare parte a drumului dup urm-
toarea regul: se va tia primul acel copac care este numerotat cu un numr ale crui
ciIre nsumate Iormeaz un ptrat perIect, apoi urmtorul copac avnd aceeai proprie-
tate i tot aa mai departe pn la captul drumului.
Citii numrul copacilor, apoi determinai ci copaci au Iost alei pentru tiere, pe
care parte a drumului sunt acetia, precum i numrul cu care au Iost numerotai. Nu-
merotarea copacilor ncepe de la 1.

40 1. Recapitulare

Exemplu
Intrare
n = 20
Ieire
6 copaci
de pe dreapta: 4 10 18
de pe stanga: 1 9 13

E. La scldat
La trandul din ora s-a organizat un concurs de not dotat cu premii. Din dorina de a
ctiga marele premiu s-au nscris i copii care nu tiau s noate. Pentru sigurana lor
ei nu au Iost acceptai n concurs. Deoarece concurenii aveau vrste diIerite, s-a hot-
rt ca la timpul Iiecrui concurent (msurat n secunde) s se adune vrsta acestuia.
Deoarece a nceput ploaia, s-a anunat c se oIer un abonament celui care scrie un
program care va stabili ordinea Iinal, pentru ca premierea s aib loc ct mai repede.

Fiierul de intrare STRAND.IN are urmtorul Iormat:
- pe prima linie este scris numrul n al copiilor nscrii; copiii sunt identiIicai cu nu-
mere cuprinse ntre 1 i n.
- pe linia a doua este scris numrul k al copiilor eliminai;
- pe linia a treia avem k numere, indicnd copiii eliminai;
- pe linia a patra sunt scrise n k numere care reprezint timpii celor rmai n con-
curs, n ordinea numerelor primite la nscriere;
- pe linia a cincia avem n k numere indicnd vrstele celor rmai n concurs, n or-
dinea numerelor primite la nscriere.

n Iiierul de ieire STRAND.OUT se va aIia ordinea Iinal a copiilor participani la
concurs. Pe Iiecare linie se va scrie unul sau mai multe numere, astIel nct numrul
de ordine a liniei s Iie egal cu poziia pe care copiii scrii pe linia respectiv au
terminat concursul.

Exemplu
STRAND.IN
7
2
1 3
60 55 58 55 70
8 14 10 10 9
STRAND.OUT
6
2 5
4
7

F. Drumul spre ycoal
Gigel este un elev cruia nu-i prea place coala i ar Iace orice s nu mai ajung acolo.
n a 43-a zi a anului colar mama sa l-a trimis la coal la ora P i P minute. El trebuia
s ajung la coal la ora S i S minute.

1. Recapitulare 41

n drum spre coal el se ntlnete cu civa prieteni care l in de vorb de la ora
D i D minute pn la ora DD i DD minute. Dac discut mai mult de 43 de minute,
atunci ei vor mai discuta nc 43 de minute.
Scriei un program care veriIic dac Gigel ajunge la timp la coal i n cazul n
care ajunge, s se determine ora i minutul la care a ajuns.
Durata deplasrii de acas pn la coal este de 43 de minute.

Date de intrare
Datele de intrare se citesc din Iiierul GIGEL.IN care are urmtorul Iormat:
- pe prima linie se aIl ora P i minutul P la care Gigel pleac de acas;
- pe a doua linie se aIl numrul N al prietenilor cu care se ntlnete Gigel pe drum;
- Iiecare dintre urmtoarele N linii conin ora D i minutul D de ntlnire i ora DD
i minutul DD la care se termin conversaia;
- pe ultima linie este scris ora S i minutul S la care trebuie s ajung Gigel la
coal.

Date de ieyire
Rezultatul se va tipri la ieirea standard. Dac Gigel ajunge la coal n timp util, se
va aIia cuvntul 'DA', iar dac nu, se va tipri cuvntul 'NU'. n cazul n care Gigel
reuete s ajung la coal, se va mai tipri ora i minutul la care ajunge.

Exemplu
GIGEL.IN
7 30
2
7 32 7 34
7 36 7 37
8 43
Ieire
DA
8 16

1.10.2. Avansai

A. Numere prime... cu divizori
Elevii clasei a V-a au nvat la matematic despre numerele prime c au exact doi
divizori: 1 i numrul nsui. La inIormatic au nvat c numerele se pot reprezenta
i n alte baze, nu doar n baza 10. Cei doi proIesori (cel de matematic i cel de
inIormatic) s-au gndit s le dea o tem copiilor de clasa a V-a, care s combine cele
dou inIormaii nvate. Ei vor trebui s gseasc toate numerele mai mici dect un
numr dat n, care au proprietatea c scrise n baza 10 nu sunt prime, dar scrise n alt
baz i citite n baza 10, sunt prime.
Scriei un program care gsete aceste numere, precum i bazele n care au aceast
proprietate.
42 1. Recapitulare

Exemplu
Intrare
n = 4

Ieire
numar in baza 10: 4 nu este prim
numar in baza 3: 31 (citit in baza 10 este prim)

B. Matematica... pe calculator
La lecia de matematic proIesorul le cere elevilor s eIectueze o nmulire a unor nu-
mere al cror produs depete ,limitele matematicii. Primul care va rezolva aceast
problem va avea media 10 n acel semestru. Unul dintre ei, Iiind mai iste i avnd
lng el un calculator de buzunar, a nceput s eIectueze nmulirile pe calculator, dar
a observat c n acest caz nici calculatorul de buzunar nu i este de Iolos. Dar dac tot
este el mai iste a apelat la inIormaticieni i i-a rugat: ,Primul care mi va rezolva
problema va primi temele corecte la matematic n tot acest semestru.
Se citesc n numere ntregi. Se cere s se determine produsul acestor numere.

Date de intrare
Pe prima linie a Iiierul de intrare PRODUS.IN se aIl un numr natural n, iar pe urm-
toarele n linii exist cte un numr ntreg.

Date de ieyire
Produsul celor n numere se va scrie n Iiierul de ieire PRODUS.OUT.

Restricii yi precizri
- 2 s n s 20;
- -25000 s x
i
s 25000.

Exemplu
PRODUS.IN
3
1234
-12345
2457
PRODUS.OUT
-37429274610

C. La pescuit
Elevii inIormaticieni, avnd prea multe concursuri de inIormatic, s-au gndit c ar Ii
bine s aib o perioad de recreere i au organizat un concurs de pescuit la care au
participat Ioarte muli concureni. Fiecare elev a prins peti de diIerite specii, speciile
Iiind identiIicate prin numere. Numrul petilor prini este acelai pentru Iiecare elev.
Se spune c ntre doi elevi exist relaie ae legtur dac ei au prins cel puin un pete
de aceeai specie, astIel Iormndu-se grupuri dintre copiii care au n ,prad cel puin
un pete comun.
1. Recapitulare 43

Determinai numrul de grupuri care se vor Iorma i aIiai membrii Iiecrui grup.

Date de intrare
Datele de intrare se citesc din Iiierul PESTI.IN care are urmtorul Iormat:
- pe prima linie este scris numrul n al elevilor;
- pe a doua linie avem numrul k al petilor prini de Iiecare elev;
- pe Iiecare dintre urmtoarele n linii avem cte k numere care indic specia Iiecrui
pete prins de un anumit elev.

Datele de ieyire
Fiierul PESTI.OUT are urmtorul Iormat:
- pe prima linie se va scrie numrul g al grupurilor Iormate;
- pe Iiecare dintre urmtoarele g linii se vor scrie numerele de ordine ale copiilor
care Iac parte din cte-un grup.

Exemplu
PESTI.IN
10
3
1 2 1
1 2 2
3 3 3
3 4 5
7 8 7
7 8 7
8 8 7
9 9 9
1 1 2
7 7 8
PESTI.OUT
4
1 2 9
3 4
5 6 7 10
8

1.10.3. Exceleni

A. Serviciul de gard
n vederea stabilirii serviciului de gard, la o unitate militar, comandantul nominali-
zeaz n soldai (S) i n gradai (G). Comandantul, tiind c la un moment dat n post
intr dou persoane i c oIierul responsabil i pune n pereche pe cei prevzui n lis-
t, primul cu ultimul, al doilea cu penultimul etc., stabilete ordinea n list, astIel n-
ct s nu se Iormeze perechi mixte (un soldat i un gradat). Comandantul mai tie c n
este numr par i va Iolosi aceast proprietate n momentul n care va ntocmi lista.
Scriei un program care aIieaz pe ecran lista din care oIierul va Iorma perechi,
conIorm cerinei. De asemenea, programul trebuie s aIieze i perechile care intr n
serviciu.
44 1. Recapitulare

Exemplu
Intrare
n=4
Chirila
Macarie
Coza
Domsa
Lador
Orlea
Hila
Pacurar
S, S, G, G, S, G, S, G

Ieire (o soluie posibil)
Chirila
Coza
Lador
Pacurar,
Domsa
Macarie
Orlea
Hila
Chirila - Hila
Coza - Orlea
Lador - Macarie
Pacurar Domsa

B. Plasarea oglinzilor
Se consider un ir de n elemente care au valorile 0 i 1. DeIinim operaia plasare a
dou oglinzi, una n stnga elementului de pe poziia i, iar alta n dreapta elementului
de pe poziia f. Aceast operaie are ca eIect interschimbarea elementelor egal deprta-
te de extreme a elementelor cuprinse ntre poziiile i i f, inclusiv.
Scriei un program care va citi dou iruri de lungime n i va stabili poziiile n care
vor trebui plasate cele dou oglinzi n cadrul primului ir, astIel nct n urma plasrii
oglinzilor, primul ir s devin identic cu al doilea ir.

Exemplu
Intrare
n = 8
0 0 1 1 0 1 1 0
0 1 0 1 1 0 1 0
Ieire
2 6

C. Palindrom
Unii matematicieni au Iost curioi i au nceput s se ,joace cu numerele; ei au
obinut tot Ielul de rezultate interesante. Pentru un numr oarecare x dat n baza b,
deIinim urmtorul proces iterativ: la primul pas se adun numrului x oglinditul su,
repetnd succesiv procedeul cu rezultatul obinut.

Exemplu
Fie n 87 i b 10.
- pasul 1: 87 78 165;
- pasul 2: 165 561 726;
- pasul 3: 726 627 1353;
- pasul 4: 1353 3531 4884.
1. Recapitulare 45

Ultimul rezultat este un palindrom care s-a obinut dup patru pai. ntrebarea pe
care ne-o punem este urmtoarea: pornind cu un numr oarecare, se ajunge ntotdeau-
na la un palindrom dup un numr Iinit de pai?
VeriIicai pentru un numr dat n dac se ajunge sau nu la un palindrom, procednd
conIorm descrierii de mai sus. Vei aplica procedeul de cel mult k ori. n cazul n care
numrul dat s-a transIormat n numr palindrom n cel mult k pai aIiai numrul de
pai necesari, precum numrul palindrom obinut, n caz contrar scriei n Iiier 'NU'.

Exemplu
Intrare
n = 87
n = 10
Ieire
4
4884

D. Numere apropiate
Se d un numr natural n (care conine cel mult 2457 de ciIre). Determinai cel mai
mic numr natural m > n care accept ca divizor un numr dat a (1 s a s 2457).
Numerele n i a se citesc de pe primele dou linii ale Iiierului NUMERE.IN, iar
numrul m va Ii scris pe prima linie a Iiierului NUMERE.OUT.

Exemplu
NUMERE.IN
14
5
NUMERE.OUT
15



Fiyiere de tip text yi
prelucrri simple

Exploatarea unui fiyier de tip text
Prelucrri simple ale datelor citite din fiyiere
Determinarea elementului minim/maxim
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
2



Un Iiier de tip text este o colecie de nregistrri unde nregistrrile sunt caractere (sau
iruri de caractere) structurate pe linii. Liniile sunt separate prin marcaje Iormate din
caracterele ,sIrit de linie (#10#13 adic LFCR).
Un astIel de Iiier se poate crea cu editorul din mediul de programare, prin program
sau cu orice alt editor cu care se pot crea Iiiere ASCII.
Lungimea liniilor Iiind variabil, nu se poate realiza un acces direct la o anumit li-
nie din Iiier.

2.1. Exploatarea unui fiyier de tip text
Variabila de lucru care se asociaz prin program unui Iiier de pe suport se declar n
seciunea de declaraii var:
iaentificator:7H[W;

Procedura predeIinit care realizeaz legtura ntre o variabil de tip Iiier i Iiie-
rul existent pe suport este $VVLJQiaentificator, numefiier unde numefiier este o
expresie de tip ir ae caractere (evident poate Ii o variabil sau o constant de tip ir
de caractere).

2.1.1. Deschidere/nchidere
Procedurile predeIinite create pentru a deschide, respectiv nchide un Iiier de tip text
identiIicat prin variabila I sunt:
- 5H:ULWHI: apelul acestei proceduri are ca eIect crearea Iiierului sau rescrierea
acestuia dac el exist; altIel spus, dac un Iiier de tip 7H[W este deschis cu 5H
:ULWH, vom putea scrie n acesta;
2. Fiiere ae tip text i prelucrri simple 47

- 5HVHWI: apelul acestei proceduri are ca eIect deschiderea Iiierului pentru citire,
indicatorul de Iiier aIlndu-se la nceputul Iiierului, adic, dup deschiderea lui,
poziia curent pentru citire este prima din Iiier;
- $SSHQGI: provoac poziionarea indicatorului pe marcajul de sIrit de Iiier n
vederea adugrii de nregistrri; precizm c scrierea ncepe din poziia curent
ceea ce nseamn suprascrierea marcajului de sIrit de Iiier, apoi continuarea
scrierii nregistrrilor dorite n Iiier;
- &ORVHI: realizeaz nchiderea Iiierului. Scrierea eIectiv a datelor n Iiierul de
ieire se realizeaz pe blocuri (pn la ,umplerea unui bloc acestea se pstreaz
temporar n zone tampon de memorie). Ultimele date (adic blocul nceput i ne-
umplut n ntregime) se scrie eIectiv n Iiier la nchiderea acestuia. Rezult c dac
nu nchidem Iiierul de ieire s-ar putea ca n Iiier s se transIere doar o parte din
rezultate, sau n cazul n care aceste rezultate Iceau parte dintr-un prim bloc nce-
put i neumplut, s avem Iiier vid.

2.1.2. Intrri/Ieyiri
Dintr-un/ntr-un Iiier de tip text se pot citi sau se pot scrie caractere, iruri de caracte-
re, numere ntregi i numere reale. Subprogramele care realizeaz citirea i scrierea
sunt:
- 5HDGID

D
Q
: are ca eIect citirea a n date din Iiier;
- 5HDG/QID

D
Q
: are ca eIect citirea a n date din Iiier, dup care urm-
toarea citire se va Iace de pe linie nou;
- :ULWHID

D
Q
: se realizeaz scrierea a n date n Iiier;
- :ULWH/QID

D
Q
: se realizeaz scrierea a n date n Iiier i a marcaju-
lui de sIrit de linie;
- 5HQDPHIQXPHBQRX: redenumete un Iiier la nivel Iizic, (adic pe suport);
- (RII: Iuncie boolean care returneaz valoarea WUXH dac urmtorul caracter
care ar urma s Iie citit din Iiier este marcajul de sIrit de Iiier i IDOVH altIel.
- (R/QI: Iuncie boolean care ntoarce valoarea WUXH dac urmtorul caracter
care ar urma s Iie citit din Iiier este marcajul de sIrit de linie sau marcajul de
sIrit de Iiier i IDOVH n caz contrar.

2.2. Prelucrri simple ale datelor citite din fiyiere
Prin prelucrare simpl vom nelege calcularea unor sume, proause, meaii (aritmetice
sau geometrice), cutarea unui element avnd o anumit proprietate, numrarea ele-
mentelor avnd o anumit proprietate.

48 2. Fiiere ae tip text i prelucrri simple

2.2.1. Sume yi produse
Orice sum trebuie iniializat cu elementul neutru Ia de adunare i anume cu 0.
Apoi, cu o prelucrare simpl se calculeaz suma. Singura problem care poate s apar
se reIer la Iaptul c mediile de programare nu ne atenioneaz cnd o astIel de sum
sau produs depete valoarea maxim posibil de reprezentat n cadrul tipului varia-
bilei sum. n anumite medii de programare exist totui posibilitatea de a cere contro-
larea depirii. De exemplu, dac n cazul urmtorului program simplu, poziionm op-
iunea Options/Compiler/Range checking pe ON, execuia acestuia se va ntrerupe cu
un mesaj de eroare: 5DQJH FKHFN HUURU, altIel se aIieaz un rezultat eronat (s 128)
Ir nici o atenionare.

Program7HVW
var[V%\WH
Begin
V
for[todo VV[ s nu va ,incape` pe un octet }
:ULWH/QV
End

Dar un program care se ntrerupe cu un mesaj de eroare nu ne poate mulumi. Chiar
dac nu se poate calcula suma de mai sus, programul nostru trebuie s se Iinalizeze ca
un produs Iuncional i s ne comunice Iie rezultatul corect, Iie s ne comunice printr-
un mesaj prevzut pentru asemenea cazuri c nu a Iost posibil Iinalizarea calculelor.
Problema proteciei Ia de depiri se poate nltura declarnd variabila sum de
un tip de date ,sigur. Dar pentru cazurile n care aceast soluie nu este la ndemn,
ne putem Ieri cu o decizie simpl. De exemplu, s presupunem c n cazul programu-
lui de mai sus vrem s tim care este valoarea cea mai mare a variabilei x care nc se
mai poate aduna, Ir s se produc depire. EIectul programului urmtor va Ii
aIiarea valorii 23.

Program7HVW
var[V%\WH
SUHDBPDUH%RROHDQ
Begin
V[
SUHDBPDUHIDOVH
while not SUHDBPDUHand[do
ifV[then begin
VV[
,QF[
end elseSUHDBPDUHWUXH
ifSUHDBPDUHthen:ULWH/Q8OWLPDGDWDVDDGXQDW[
else:ULWH/QV
End
2. Fiiere ae tip text i prelucrri simple 49

2.2.2. Medii
Pentru a calcula o medie aritmetic, mai nti se calculeaz o sum. Dac numrul ter-
menilor din sum se cunoate, media se calculeaz mprind suma la acest numr.
Dar se ntmpl Irecvent c n sum se adun doar anumite numere, de exemplu, doar
cele pozitive. Acestea se vor numra, n paralel cu calcularea sumei. S nu uitm s n-
trebm nainte de mprire, dac numrul termenilor din sum nu cumva este 0,
pentru a evita o mprire nepermis. De asemenea, n acest caz, Iie aIim un mesaj,
Iie realizm sarcinile speciIicate n enunul problemei.

2.2.3. Cutarea secvenial
Putem cuta un element avnd o valoare cunoscut sau avnd o anumit proprietate.
Rezultatul va Ii un rspuns: ,da, l-am gsit sau ,nu l-am gsit. ReIeritor la aceast
subproblem dorim s atragem atenia asupra Iaptului c o valoare cutat i gsit nu
trebuie cutat n restul datelor. Drept consecin nu vom cuta cu for, ci cu o struc-
tur repetitiv cu numr necunoscut de pai. n algoritmul urmtor presupunem c se
caut o valoare dat, denumit cutat, printre date de acelai tip, citite dintr-un Iiier.

AlgoritmFXWDUH
citeteFXWDW
citete[
ct timpnu urmea: marca ae sfarit ae fiieri [=FXWDWexecut:
citete[
sfrit ct timp
am ieit ain ciclu fie ain cau:a c s-a gsit elementul cutat, }
fie ain cau:a c urmea: marca ae sfarit ae fiier, in conclu:ie }
trebuie s aflm care ain cele aou ca:uri a conaus la prsirea ciclului }
dac[FXWDWatunci
scrie/DPJVLW
altfel
scrie 1XODPJVLW
sfrit dac
sfrit algoritm

Dac alegem versiunea n care lucrm cu o variabil logic, compararea elementu-


lui curent cu cel cutat o Iacem explicit n corpul structurii repetitive. De asemenea,
dac dintr-un motiv oarecare vrem totui s lucrm cu for, n Pascal avem posibilita-
tea s ntrerupem cutarea n momentul gsirii elementului cutat, apelnd subprogra-
mul %UHDN.


50 2. Fiiere ae tip text i prelucrri simple

2.3. Determinarea elementului minim/maxim
n Ioarte multe probleme intervine o subproblem n care se cere determinarea celui
mai mic sau celui mai mare element dintr-o mulime de date. Coninutul unui Iiier
poate Ii privit ca Iiind o astIel de mulime, bineneles, ct timp ne reIerim la un coni-
nut Iormat din acelai tip de date.
Prezentarea algoritmului o vom Iace pentru determinarea valorii minime dintre mai
multe date de tip ntreg care se citesc dintr-un Iiier de tip text. Variabila desemnat s
rein valoarea minimului (min) va Ii iniializat Iie cu prima valoare citit din Iiier,
Iie cu o valoare ,strin, aleas cu grij pentru a nu risca s Iie cea mai mic n com-
paraie cu datele din Iiier. (Aceast a doua soluie se recomand doar n cazul n care
prima variant nu este posibil sau este mult prea anevoioas.)
n algoritm, n continuare, se citesc pe rnd datele din Iiier i Iiecare se compar
cu valoarea curent a variabilei min care se actualizeaz dup caz.

Algoritm0LQLP
citeteQU
PLQQU
ct timp nu urmea: marca ae sfarit ae fiierexecut
citeteQU
dacPLQ!QUatunci
PLQQU
sfrit dac
sfrit ct timp
sfrit algoritm

n cazul maximului vom proceda similar, Iiind ateni la operatorul relaional utili-
zat. Este posibil, ca enunul s cear i numrul ae oraine al elementului minim (ma-
xim). n acest caz, pe ramura atunci din structura alternativ vom aduga i actuali-
zarea numrului de ordine care trebuie iniializat cu valoarea 1 (dac prelucrarea a n-
ceput cu elementul de indice 1) nainte de a intra n structura repetitiv ct timp. n
acest Iel, chiar dac n Iiier se aIl mai multe date egale cu valoarea cea mai mic, nu-
mrul de ordine va Ii al primului astIel de numr.
Dac ni se cere ultimul numr egal cu valoarea minim, trebuie doar s modiIicm
operatorul relaional ! n >.
Dac trebuie s aIim toate numerele de ordine ale datelor care sunt egale cu mi-
nimul, atunci trebuie s recurgem la o alt tehnic. Imediat dup iniializarea variabilei
min, scriem valoarea lui i numrul de ordine 1 in fiierul ae ieire. Urmeaz compara-
rea celorlalte date cu min. Dac numrul curent este mai mare dect min, nu trebuie s
Iacem nimic. n caz contrar vom ntreba dac numrul curent este egal cu min. n caz
aIirmativ, deschidem Iiierul de ieire pentru aaugare (n Pascal cu $SSHQG) i scri-
em n el numrul de ordine al elementului care a avut valoarea egal cu min. Dac nu-
2. Fiiere ae tip text i prelucrri simple 51

mrul curent este mai mic dect min, deschidem Iiierul pentru scriere (n Pascal cu
5H:ULWH) i scriem noua valoarea a minimului i numrul de ordine corespunztor.
AstIel, practic tergem vechiul coninut al Iiierului scriind n el rezultatul care, con-
Iorm stadiului prelucrrii, este corect. n Iinal, vom avea unul sau mai multe numere
de ordine care corespund elementelor egale cu valoarea minim scris n Iiier.
*)


2.4. Implementri sugerate
Pentru a v Iamiliariza cu modul n care trebuie rezolvate problemele n care intervin
operaii cu Iiier de tip text, v sugerm s ncercai s implementai algoritmi pentru:
1. citirea unui numr dintr-un Iiier i scrierea sa n altul;
2. citirea tuturor numerelor dintr-un Iiier care conine cte un numr pe o linie i
scrierea lor n alt Iiier, cte unul pe o linie;
3. citirea datelor dintr-un Iiier care conine numere, mai multe pe o linie, i scrierea
lor ntr-un alt Iiier n aceeai Iorm;
4. citirea unei secvene de numere dintr-un Iiier i scrierea ei n alt Iiier;
5. citirea unor nume (iruri de caractere) dintr-un Iiier i scrierea lor ntr-un alt Iiier;
6. citirea unui numr natural N dintr-un Iiier i scrierea ntr-un alt Iiier a tuturor nu-
merelor naturale cuprinse ntre 0 i N, cte unul pe o linie;
7. citirea unui numr natural N dintr-un Iiier i a N nume (aIlate pe urmtoarele linii
ale Iiierului) i scrierea celor N nume ntr-un alt Iiier;
8. copierea integral a coninutului unui Iiier ntr-un alt Iiier;
9. redeschiderea Iiierelor atunci cnd este necesar.

Pentru a v Iamiliariza cu prelucrri simple, cum sunt calculul sumelor, determina-
rea minimului/maximului, v sugerm s ncercai s implementai algoritmi pentru:
- calcularea sumei primelor N numere naturale;
- calcularea sumei unor date pstrate ntr-un Iiier de tip text;
- determinarea minimului/maximului dintr-un ir de date pstrate ntr-un Iiier de
tip text;
- iniializarea minimului/maximului (cu elementul neutru sau cu primul element);
- citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor precum
i a primei poziii pe care apare acest minim;
- citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor precum
i a ultimei poziii pe care apare acest minim;
- citirea unor numere dintr-un Iiier i scrierea ntr-un Iiier a minimului lor precum
i a tuturor poziiilor pe care apare acest minim.


*)
Aceti algoritmi se vor trata din nou n cazul n care datele vor Ii structurate n tablouri.
52 2. Fiiere ae tip text i prelucrri simple

2.5. Probleme propuse

2.5.1. Numr par
Stabilii dac printre numerele ntregi scrise ntr-un Iiier de tip text exist sau nu cel
puin un numr par.

Date de intrare
n Iiierul de intrare PAR.IN se aIl mai multe numere ntregi.

Date de ieyire
Dac n Iiier exist cel puin un numr par, n Iiierul de ieire PAR.OUT se va scrie
'$, altIel se va scrie 18.

Restricii yi precizri
- 0 s numr s 1000000000.

Exemplu
PAR.IN

PAR.OUT
'$

2.5.2. Numere pare ptrate perfecte n fiyier
ntr-un Iiier sunt scrise mai multe numere naturale. Alegei numerele pare care sunt
ptrate perIecte i scriei-le ntr-un alt Iiier.

Date de intrare
Numerele sunt scrise n Iiierul de intrare NUMERE.IN pe mai multe rnduri. Pe un
rnd sunt scrise un numr oarecare de numere, separate prin unul sau mai multe spaii.

Date de ieyire
Numerele pare care sunt ptrate perIecte se vor scrie cte unul pe linie, n Iiierul de
ieire NUMERE.OUT.

Restricii yi precizri
- 0 s numr s 1000000000.

Exemplu
NUMERE.IN


NUMERE.OUT


2. Fiiere ae tip text i prelucrri simple 53

2.5.3. Concatenare de fiyiere
Se consider dou Iiiere de tip text F1.IN i F2.IN. S se creeze un al treilea Iiier
de tip text F3.OUT care s conin toate datele din F1.IN, apoi ntreg coninutul Iiie-
rului F2.IN.

Date de intrare
Fiierele sunt speciIicate prin numele lor, F1.IN i F2.IN i au coninuturi oarecare
pe care le vom privi ca Iiind caractere. Acestea se vor citi ncepnd cu primul i termi-
nnd cu ultimul, pn la marca de sIrit de Iiier.

Date de ieyire
Fiierul F3.OUT va Ii Iormat din datele din Iiierul F1.IN, apoi o linie vid, dup care
urmeaz datele din Iiierul F2.IN.

Restricii yi precizri
- o linie din Iiier conine cel mult 255 de caractere.

Exemplu
F1.IN
$QDDUHPHUH

F2.IN
F
$VW]LSORX
F3.OUT
$QDDUHPHUH

linie via
F
$VW]LSORX
2.5.4. Caractere
Se consider dou numere naturale a i b care reprezint capetele unui interval de nu-
mere ntregi i un numr oarecare de caractere. Alegei dintre aceste caractere pe ace-
lea care au codurile ASCII cuprinse n intervalul |a, b|.

Date de intrare
Pe prima linie a Iiierului CARACTER.IN se aIl numerele a i b, separate printr-un
spaiu. Pe Iiecare dintre urmtoarele linii sunt scrise mai multe caractere.

Date de ieyire
Caracterele care corespund cerinei problemei se vor scrie n Iiierul CARACTER.OUT
pe aceeai linie, separate prin cte un spaiu.

Restricii yi precizri
- 0 s a s b s 255.
54 2. Fiiere ae tip text i prelucrri simple

Exemplu
CARACTER.IN

$QDDUHPHUH
CARACTER.OUT
$QDDUHPHUH


2.5.5. Medii
Cunoscnd mediile semestriale la disciplina informatic ale unor elevi dintr-o clas, s
se determine media semestrial a clasei la aceast disciplin.

Date de intrare
n Iiierul MEDII.IN sunt scrise mediile elevilor, cte un numr real pe Iiecare linie.

Date de ieyire
Media clasei se va scrie n Iiierul de ieire MEDII.OUT. Dac, din neIericire, nu se
poate calcula media, deoarece toi elevii au rmas corigeni, n Iiier se va scrie
mesajul: 1XVHSRDWHFDOFXODPHGLD

Restricii yi precizri
- mediile sunt numere reale, cu dou zecimale exacte;
- 3 s meaie s 10;
- mediile mai mici dect 5 nu particip la calcule.

Exemplu
MEDII.IN

MEDII.OUT

Explicaie
Media 4.67 nu particip la
calcule. Media aritmetic
s-a calculat din 3 medii.

2.5.6. Factorial
S se calculeze produsul primelor N numere naturale (Iactorialul)!

Date de intrare
n Iiierul de intrare FACT.IN este scris un singur numr natural.

Date de ieyire
Valoarea Iactorialului se va scrie n Iiierul de ieire FACT.OUT.

Restricii yi precizri
- 5 s N s 18
2. Fiiere ae tip text i prelucrri simple 55

Exemplu
FACT.IN

FACT.OUT


2.5.7. Vrste
Dintr-un Iiier de tip text se citesc numere naturale, reprezentnd anii de natere a unor
persoane. AIiai anul de natere i numrul de ordine a liniei din Iiier pe care se aIl
anul naterii al celei mai tinere persoane. Procedai la Iel n cazul celei mai vrstnice
persoane.

Date de intrare
Pe Iiecare linie a Iiierului ANI.IN se aIl un numr ntreg, reprezentnd anul naterii
unei persoane.

Date de ieyire
Pe prima linie a Iiierului de ieire ANI.OUT se va scrie anul de natere a celei mai ti-
nere persoane. Pe linia a doua se va scrie numrul de ordine a celei mai tinere per-
soane. Pe a treia linie se va scrie anul de natere a celei mai vrstnice persoane. Pe a
patra linie se scrie numrul de identiIicare a celei mai vrstnice persoane. Dac ntr-un
acelai an s-au nscut mai multe persoane, se vor Iurniza toate numerele de ordine co-
respunztoare, desprite prin cte un spaiu.

Restricii yi precizri
- 1900 s an s 2003.

Exemplu
ANI.IN

ANI.OUT



2.5.8. Caractere
Se consider un Iiier de tip text care conine caractere. AIiai, n ordinea n care apar
n Iiier acele caractere care sunt mai mari dect ultimul caracter din Iiier.

Date de intrare
Pe Iiecare linie a Iiierului de intrare CARACTER.IN se aIl un caracter.
56 2. Fiiere ae tip text i prelucrri simple

Date de ieyire
Pe prima linie a Iiierului de ieire CARACTER.OUT se va scrie ultimul caracter citit
din Iiierul de intrare. Pe urmtoarea linie se vor scrie caracterele cerute, separate prin
cte un spaiu.

Exemplu
CARACTER.IN
I
]

V
Z
U
W

Q
M
CARACTER.OUT
M
]VZUWQ

2.5.9. Pare, impare
Dintr-un Iiier de tip text se citesc mai multe numere naturale de pe Iiecare linie. Pen-
tru Iiecare linie din Iiier aIiai cea mai mic valoare par i cea mai mare valoare im-
par preciznd i numrul de ordine a liniei.

Date de intrare
Fiecare linie a Iiierului de intrare LINII.IN conine numere naturale, separate prin
cte un spaiu.

Date de ieyire
Fiierul de ieire LINII.OUT va avea tot attea linii cte linii exist n Iiierul de in-
trare. Pe Iiecare linie vor Ii scrise dou numere care reprezint cel mai mic numr par
i cel mai mare numr impar de pe linia corespunztoare a Iiierului de intrare.

Restricii yi precizri
- 0 numr s 32767;
- pe Iiecare linie din Iiierul de intrare exist att numere pare, ct i impare.

Exemplu
LINII.IN


LINII.OUT


2. Fiiere ae tip text i prelucrri simple 57

2.6. Soluiile problemelor propuse

2.6.1. Numr par
Aceast problem cere s stabilim dac printre o mulime de numere apare cel puin
un numr par.

Algoritm([LVWB3DUHB
JVLWfals
ct timp nu am afuns la sfaritul fiierului i nu JVLWexecut:
citeteQU citim alt numr }
JVLWJVLWsauQU este par
sfrit ct timp
dac JVLWatunci
scrie '$
altfel
scrie 18
sfrit algoritm

Dac vrem s evitm Iolosirea variabilei logice JVLW, putem proceda n Ielul ur-
mtor:

Algoritm([LVWB3DUHB
citeteQU
ct timp nu am afuns la sfaritul fiierului i numrul este impar execut:
citeteQU citim alt numr }
sfrit ct timp
dacnu am afuns la sfaritul fiierului sau QU este par atunci
aac nu urmea: marca ae sfarit ae fiier, inseamn c am gsit un numr }
par, altfel mai este posibil ca nr ain faa mrcii ae sfarit ae fiier s fi fost par }
scrie '$
altfel
scrie 18
sfrit algoritm

2.6.2. Numere pare ptrate perfecte n fiyier
Variabilele I i J de tip 7H[W se vor asocia Iiierelor NUMERE.IN, respectiv NUME-
RE.OUT. Numele Iiierelor precizate n enun sunt declarate sub Iorma unor constante
simbolice la nceputul programului. Bineneles, aceste constante de tip ir de caracte-
re s-ar Ii putut scrie ca parametri actuali n apelul procedurilor $VVLJQ. Primul Iiier
se deschide cu 5HVHWI, ceea ce nseamn c se va parcurge de la nceput n scopul
citirii datelor scrise n el. Al doilea Iiier se deschide cu 5H:ULWHJ pentru scriere.
58 2. Fiiere ae tip text i prelucrri simple

Se parcurge primul Iiier ct timp acesta conine date (pn la sIritul Iiierului).
Pentru Iiecare numr citit din Iiier se veriIic dac este ptrat perIect i dac este par.
Dac aceste condiii sunt ndeplinite, numrul se va scrie n Iiierul de ieire.

Algoritmul care realizeaz aceste operaii este:

Algoritm1XPHUHBSDUHBSWUDWHBSHUIHFWH
ct timpnu urmea: marcaful ae sfarit ae fiierexecut:
citeteQ ain fiier }
dacQ este numr par atunci
QU
ct timpQUQUQ execut:
QUQU
sfrit ct timp
dac QUQUQ atunci
scrieQ in fiier }
sfrit dac
sfrit dac
sfrit ct timp
sfrit algoritm

VeriIicarea proprietii de ptrat perIect se realizeaz genernd, pe rnd ptratele
numerelor naturale, ncepnd de la 2, deoarece nu are rost s generm ptratele unor
numere impare, acestea Iiind i ele impare. Ct timp un astIel de ptrat este mai mic
dect numrul, generm urmtorul ptrat. Dac acesta nu este mai mic, poate Ii egal cu
numrul dat sau poate Ii mai mare dect el. n caz de egalitate, scriem numrul n Iii-
erul de ieire.

2.6.3. Concatenare de fiyiere
Principalele obiective pe care ni le propunem n rezolvarea acestei probleme sunt:
- Iolosirea corect a subprogramelor predeIinite pentru Iiiere: $VVLJQ, 5HVHW,
5H:ULWH, $SSHQG, &ORVH;
- parcurgerea corect a unei linii i citirea marcajului de sIrit de linie;
- citirea i scrierea corect din i respectiv ntr-un Iiier de tip text;
- realizarea scrierii unei linii vide n Iiier.
Se parcurg pe rnd coninuturile celor dou Iiiere, caracter cu caracter. Fiecare ca-
racter citit se scrie n Iiierul F3.OUT. Cnd se ntlnete marcajul de sIrit de linie n
Iiierul de ieire se va Iace salt la linie nou. Dup ce primul din cele dou Iiiere de
intrare a Iost parcurs n ntregime, se scrie o linie vid n Iiierul de ieire.
Prezentm citirea datelor din Iiierul F1.IN i scrierea acestora n F3.OUT, precum
i scrierea liniei vide. Variabila F este de tip caracter.
2. Fiiere ae tip text i prelucrri simple 59

Algoritm FRQFDWHQDUH
ct timpnu urmea: marca ae sfarit ae fiier in Iexecut:
ct timp nuurmea: marca ae sfarit ae linie in Iexecut
citeteF se citete un caracter ain fiierul I }
scrieF se scrie caracterul in I }
sfrit ct timp
citetemarcaful ae sfarit ae linie in I
scriemarcaf ae sfarit ae linie in I
sfrit ct timp
scriemarcaf ae sfarit ae liniein I (se las o linie via)
Se copia: in aceeai manier coninutul fiierului F2.IN in F3.OUT.
sfrit algoritm

2.6.4. Medii
Problema cere determinarea unei medii aritmetice. n paralel cu citirea vom numra
termenii sumei pe baza creia se va determina media aritmetic, deoarece nu cunoa-
tem numrul datelor. Nu este suIicient s numrm pur i simplu datele, deoarece
eventualele medii mai mici dect 5, nu intr n calcule. n Iinal suma se mparte la
numrul termenilor, dac acest numr este diIerit de 0.

Algoritm0HGLL
V element neutru pentru aaunare }
QU numrul termenilor }
ct timpnu urmea: marca ae sfarit ae fiier execut:
citete PHGLH meaia curent in fiier }
dacPHGLH>atunci aoar meaiile mai mari sau egale cu 5 interesea: }
QUQU crete numrul termenilor }
VVPHGLH aaunm termenul curent }
sfrit dac
sfrit ct timp
dac QU= atunci aac avem cel puin o meaie mai mare sau egal cu 5 }
scrieVQU afim meaia aritmetic }
altfel
scrie1XVHSRDWHFDOFXODPHGLD
sfrit algoritm

2.6.5. Factorial
n aceast problem vom citi valoarea lui n i pe baza lui, cu ajutorul unei instruciuni
pentru, vom genera toate numerele naturale.

60 2. Fiiere ae tip text i prelucrri simple

Algoritm)DFW in p vom obine valoarea factorialului }
S element neutru pentru inmulire }
citete Q
pentruLQexecut:
SSL inmulim cu factorul curent }
sfrit pentru
sfrit algoritm

Dar s Iacem abstracie pentru moment de precizarea din enun cu privire la limite-
le lui n. S veriIicm programul de mai sus pe rnd pentru valorile 5, 8, ..., 25, ... 40,
poate i 50. n Iuncie de tipul variabilei p se pot ntmpla lucruri interesante. De
exemplu, dac rezultatul este declarat ca Iiind de tipul %\WH, vom obine , iar
. Dar ar trebui s Iie egal cu . Dac modiIicm tipul lui p din %\WH n
/RQJLQW i rulm programul pentru n 20, obinem (numr
negativ!), iar pentru n 50, . Dac o declarm pe p de tip 5HDO, programul se
ntrerupe pentru n ~ 33 cu mesajul de eroare: )ORDWLQJSRLQWRYHUIORZ!
S lum n considerare situaia n care se preIer ca rezultatul s Iie de tip /RQJ
LQW. Evident, ncercrile ne-au convins, c ncepnd cu o anumit valoare a lui n se
produce depire. Mai ales atunci cnd trebuie calculat Iactorialul unui n care constitu-
ie un rezultat calculat n program, ne trebuie ,un instrument care s ne protejeze de
neplceri, cum ar Ii obinerea unui rezultat Ials. Cel mai mare numr de tipul /RQJ
LQW, posibil de reprezentat n calculator este , reinut de constanta sim-
bolic a unit-ului System, numit n Pascal 0D[/RQJLQW. Ar urma s putem pune o n-
trebare de genul ifS!0D[/RQJLQWthen Dar este absurd s ntrebm dac
un numr este mai mare dect cel mai mare numr posibil...
n consecin, vom pune ntrebarea cu un pas nainte de eIectuarea nmulirii curen-
te care ar putea produce o depire n Ielul urmtor:

S
L
whileS!andLQdo begin
ifS!0D[/RQJLQWdivLthen
S
else begin
SSL
,QFL
end
end
...

Valoarea lui p se va testa n blocul apelant pentru a decide dac s-a putut calcula
Iactorialul cerut, sau nu, deoarece s-ar Ii produs o depire.
2. Fiiere ae tip text i prelucrri simple 61

2.6.6. Caractere
n aceast problem n Iiierul de intrare avem caractere ASCII care pot Ii ciIre, litere
sau alte semne. Avnd n vedere c dintre acestea trebuie s ,culegem caracterele
avnd codul ASCII n intervalul |a, b|, vom analiza Iiecare caracter citit din Iiierul de
intrare i dac acesta are codul ASCII n intervalul dat, l copiem n Iiierul de ieire.
Fie, de exemplu, coninutul Iiierului de intrare CARACTER.IN:

$QDDUHPHUH
Intervalul este |50, 125|. Se parcurg caracterele de pe a doua linie i se compar, pe
rnd, codurile ASCII ale caracterelor citite cu capetele intervalului. Codul ASCII al
unui caracter F se poate obine (n Pascal) Iolosind Iuncia 2UGF. De exemplu,
2UG$, 2UGQetc.
Pentru Iiierul dat ca exemplu, doar caracterele , i caracterul spaiu care
au codurile ASCII , , respectiv nu se aIl n intervalul cerut. n concluzie, n
Iiierul de ieire vom avea urmtoarele caractere, separate prin cte un spaiu:
$QDDUHPHUH

Algoritm &DUDFWHUH
citete DE
ct timp nu urmea: marcaful ae sfarit ae fiier in CARACTER.IN execut:
ct timp nu urmea: marcaful ae sfarit ae linie in CARACTER.IN execut:
citeteF
daccoaul ASCII al caracterului F > D i
coaul ASCII al caracterului F s E atunci
scrieF scriem in fiierul ae ieire }
sfrit dac
sfrit ct timp
citete marcaful ae sfarit ae linie ain CARACTER.IN
sfrit ct timp
sfrit algoritm

2.6.7. Vrste
Obiectivele propuse n aceast problem sunt:
- aIlarea valorii minime i maxime dintre valorile pstrate ntr-un Iiier de tip text;
- cutarea acestor valori n Iiier i raportarea poziiilor pe care valoarea minim,
respectiv maxim apare n Iiier;
- parcurgerea Iiierului text de mai multe ori, ceea ce presupune nchiderea i deschi-
derea lui n mod repetat.

AIlarea celei mai tinere persoane se reduce la aIlarea maximului din Iiier i se
realizeaz n algoritmul urmtor:
62 2. Fiiere ae tip text i prelucrri simple

Algoritm0D[LP
citeteQ
PD[Q
ct timp nu urmea: marcaful ae sfarit ae fiier execut:
citeteQ
dacPD[Qatunci
PD[Q
sfrit dac
sfrit ct timp
scriePD[
sfrit algoritm

Dup ce s-a scris pe prima linie a Iiierului de ieire valoarea maximului, urmeaz
s se regseasc aceast valoare n Iiierul de intrare. Regsirea se realizeaz prin re-
deschiderea Iiierului de intrare pentru parcurgere i cutarea valorii maxime. La Iie-
care apariie a maximului n Iiierul de intrare se scrie valoarea numrului de ordine a
liniei pe care se aIl o valoare egal cu valoarea maxim i un spaiu separator pentru
cazul n care se va mai scrie un numr de ordine n Iiier. Dup epuizarea elementelor
din Iiierul de intrare se scrie marcajul de sIrit de linie n Iiierul de ieire pentru ca
scrierea valorii minime s se realizeze pe rnd nou.

Algoritmul este:

Algoritm6FULH0D[LP
L numrul ae oraine al liniei in fiierul ae intrare }
ct timp nu urmea: marcaful ae sfarit ae fiier execut:
citeteQ
dacQPD[atunci
scrieL
sfrit dac
LL
sfrit ct timp
sfrit algoritm

Algoritmul pentru minim este analog cu cel descris mai sus, dar se poate proiecta
un algoritm care determin valoarea minim i maxim cu o singur parcurgere a Iii-
erului de intrare. Dac vom lucra astIel, structura repetitiv ct timp va conine pre-
lucrrile aIerente minimului i maximului, urmnd ca regsirea lor s se realizeze se-
parat, deoarece numerele de ordine corespunztoare maximului, respectiv minimului
trebuie s le aIim grupate.


2. Fiiere ae tip text i prelucrri simple 63

2.6.8. Caractere
Etapele rezolvrii acestei probleme sunt:
- citirea integral a Iiierului de intrare i scrierea ultimului caracter citit n Iiierul
de ieire;
- deschiderea Iiierului de intrare pentru o a doua parcurgere;
- scrierea n Iiierul de ieire a tuturor caracterelor din Iiierul de intrare care sunt
mai mari dect ultimul caracter citit (pstrat n variabila c).

Pentru gsirea caracterelor mai mari dect c n Iiierul de intrare, acesta se deschide
pentru parcurgere. Se citesc pe rnd cte un caracter b de pe Iiecare linie i se compar
cu c. Dac b este mai mare dect c, atunci acesta se scrie pe a doua linie n Iiierul de
ieire, urmat de caracterul spaiu.

Algoritm &DUDFWHU
ct timpnu urmea: marcaful ae sfarit ae fiier execut:
citeteF
sfrit ct timp
scrie F in c avem ultimul caracter citit ain fiierul ae intrare }
ct timp nu urmea: marcaful ae sfarit ae fiier execut:
citete E
dacFEatunci
scrieE in fiierul ae ieire scriem caracterele ,mai mari` aecat c }
sfrit dac
sfrit ct timp
sfrit algoritm

2.6.9. Pare, impare
Problema const n tratarea separat a Iiecrei linii din Iiierul de intrare n ideea gsi-
rii valorii minime pare i a valorii maxime impare.

Algoritm 0LQ0D[:
ct timp nu urmea: marcaful ae sfarit ae fiier execut:
PLQ0D[LQW suntem siguri c vom gsi unul mai mic }
PD[ suntem siguri c vom gsi unul mai mare }
ct timp nu urmea: marcaful ae sfarit ae linie execut:
citete Q
dac Q este par atunci
dac QPLQ atunci
PLQQ
sfrit dac
altfel
64 2. Fiiere ae tip text i prelucrri simple

dac Q!PD[ atunci
PD[Q
sfrit dac
sfrit dac
scrie PLQPD[
sfrit ct timp
sfrit ct timp
sfrit algoritm






Numere

Prelucrri ale numerelor
Construirea numrului ntreg din caractere cifre
Schema lui Horner
Descompunerea unui numr dat n cifre
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
3



3.1. Prelucrri ale numerelor
Atunci cnd scriem un numr (cu creionul, sau cu ajutorul tastaturii), aezm ciIre una
lng alta, dar semniIicaia irului de ciIre este clar pentru toat lumea. Nu ne vom
gndi la ceea ce vedem (pe hrtie sau pe monitor) ca la un ir de ciIre, ci ca la o singu-
r entitate, adic la un numr. Dac nu am scris i virgula zecimal, (sau punctul)
avem un numr ntreg.

3.1.1. Construirea numrului ntreg din caractere cifre
Schema lui Horner
Atunci cnd ntr-un program se citete un numr ntreg, au loc cteva operaii ascunse
de ochii utilizatorului. n primul rnd ciIrele constituie caractere care, imediat dup ce
au Iost citite din Iiierul standard sau unul creat de utilizator sunt veriIicate. ,Nimeni
nu tie de dinainte cte ciIre va avea numrul. De asemenea, nimeni nu tie dac, din
greeal nu va aprea ntre dou ciIre un caracter nepermis. Dar ce anume este neper-
mis? Caracterele spaiu, Tab i marca de sIrit de linie constituie separatori. AltIel
spus, apariia lor semnaleaz Iaptul c numrul nu mai are ciIre. Dar i marca de sIr-
it de Iiier semnaleaz acelai lucru, diIerena Ia de cele nirate anterior este c
marca de sIrit de Iiier nu joac rol de ,separator, ci de ,terminator. Revenind la
caracterele permise i nepermise, se vor respecta regulile sintactice ale limbajului de
programare Iolosit.
n cele ce urmeaz vom realiza un algoritm pentru citirea unor caractere din care
vom crea un numr ntreg, dac acest lucru va Ii posibil.

66 3. Numere


Exemplu
Fie irul de caractere introdus de la tastatur: 2015600 i dorim ca aceast valoare
s i se atribuie variabilei n de tip ntreg, reprezentat pe dou cuvinte (n limbajul Pas-
cal, tipul predeIinit este /RQJLQW, n C este ORQJ). n cele ce urmeaz vom continua
prezentarea conIorm ,posibilitilor din Pascal.
Dup ce se preia primul caracter nc nu se tie rangul ciIrei corespunztoare n
numr, dar ea trebuie totui prelucrat. Pentru a nelege ideea care poart denumirea
,schema lui Horner, vom scrie numrul sub Iorma unei sume:
2015600 10 (10 (10 (10 (10 (10 2 0) 1) 5) 6) 0) 0
2 10
6
0 10
5
1 10
4
5 10
3
6 10
2
0 10
1
0 10
0
.
Algoritmul se contureaz mai clar din tabelul urmtor:

cifra curent numr n construcie
0
2 2
0 20
1 201
5 2015
6 20156
0 201560
0 2015600

Algoritm+RUQHUB
Q iniiali:area numrului n }
ct timp mai exist cifre execut:
citete FLIUD cifra curent ae la stanga la areapta }
QQFLIUD introaucerea cifrei in numrul n }
sfrit ct timp
scrie Q
sfritalgoritm

Acest algoritm nu este ns suIicient de precis, dar mai ales nu este ,precaut. n
primul rnd el se bazeaz pe Iaptul c in moa garantat se citesc cifre. Deci ar trebui s
introducem i veriIicarea caracterului pentru a Ii siguri c vom prelucra ciIre.
A doua observaie se reIer la condiia din instruciunea repetitiv: trebuie s tim
cnd se termin de Iapt irul de caractere. i mai avem o problem: s-ar putea ca nu-
mrul n s nu poat Ii reprezentat pe spaiul rezervat n memoria calculatorului pentru
variabile de tipul lui n. n concluzie, trebuie s ne protejm programul de surprize ne-
plcute, care ar nsemna c un numr pozitiv nmulit cu 10 s devin n calculator nu-
mr negativ (sau pozitiv, dar mai mic) din cauza depirii spaiului de memorare alo-
cat. Apariia acestor erori se explic prin Iaptul c reprezentarea numrului nu mai n-
cape pe poziiile binare alocate i un bit semniIicativ ajunge pe bitul semn, iar restul
3. Numere 67


biilor din stnga se pierd. Dac pe bitul semn ajunge un bit egal cu 1, vom avea un
numr negativ, dac acesta este 0, numrul este pozitiv, dar din cauza biilor semniIi-
cativi de rang cel mai mare pierdui din reprezentarea numrului avem un ,rezultat
eronat (vezi problema Iactorial din capitolul 2).
Presupunem c n este declarat de tip /RQJLQW i este citit caracter dup caracter
(de tip &KDU) pn la marca de sIrit de linie. Algoritmul mbuntit este urmtorul:

Algoritm+RUQHUB
Q iniiali:area numrului n }
SUHDBPDUHfals
FDUDFWHUBVWULQfals
ct timp nuSUHDBPDUHi nu FDUDFWHUBVWULQi
nuurmea: marca ae sfarit ae linie execut:
citete FDUDFWHU caracterul curent ae la stanga la areapta }
dacFDUDFWHU este cifr atunci
FLIUDvaloarea numeric a caracterului
dac Q este mai mare aecat cel mai mare numr imprit la 10 atunci
QQFLIUD introaucerea cifrei in numrul n }
altfel
SUHDBPDUHaaevrat
sfrit dac
altfel
FDUDFWHUBVWULQaaevrat
sfrit dac
sfrit ct timp
dac SUHDBPDUHatunci
scrie '1XPDU SUHDPDUH
altfel
dac FDUDFWHUBVWULQatunci
scrie '&DUDFWHUVWUDLQ
altfel
scrieQ
sfrit dac
sfrit dac
sfritalgoritm

3.1.2. Descompunerea unui numr dat n cifre
Operaia ,invers, adic Iurnizarea ciIrelor unui numr este necesar ori de cte ori
dorim s realizm o prelucrare ciIr cu ciIr. Pentru a descompune un numr ntreg n
ciIre vom Iolosi operaiile de mprire ntreag i determinarea restului mpririi n-
tregi. Pentru aceste dou operaii n pseudocod vom Iolosi notaiile |m/n| i rest|m/n|.
68 3. Numere


ExempliIicm algoritmul pentru a determina dac numrul n dat este sau nu palin-
drom. Un numr palinarom are aceeai valoare dac l ,citim de la dreapta la stnga
i de la stnga la dreapta. AltIel spus, un numr palindrom este egal cu numrul Iormat
din ciIrele sale luate n ordine invers (acesta n algoritm este numit Ninvers).

Algoritm3DOLQGURP
citete Q
1LQYHUV iniiali:area numrului Ninvers }
&RSLH1Q
ct timp Q=execut: cat timp n mai are cifre }
FLIUDUHVW>Q@ cifra curent ae la areapta la stanga }
Q>Q@ eliminm ultima cifr ain numrul n }
1LQYHUV1LQYHUVFLIUD
construim numrul Ninvers cu schema lui Horner }
sfrit ct timp
dac 1LQYHUV&RSLH1atunci
scrie '3DOLQGURP'
altfel
scrie'1XHSDOLQGURP'
sfritalgoritm

3.2. Implementri sugerate
Pentru a v Iamiliariza cu modul n care trebuie rezolvate problemele n cadrul crora
intervin operaii cu ciIre, v sugerm s ncercai s implementai algoritmi pentru:
1. aIiarea ciIrelor unui numr;
2. determinarea numrului de ciIre ale unui numr;
3. determinarea celei mai mari (mici) ciIre a unui numr;
4. determinarea celei mai mari (mici) ciIre a unui numr i a poziiilor pe care apare
aceasta;
5. determinarea inversului unui numr;
6. generarea unui numr dintr-un ir de caractere care sunt ciIre (protecie n caz de
depire i de caractere care nu sunt ciIre);
7. veriIicarea Iaptului c un numr este palindrom;
8. determinarea tuturor numerelor palindroame dintr-un interval dat;
9. citirea unui numr real de Iorma x.y i aIiarea numrului y.x;
10. determinarea tuturor numerelor de tip ,vale dintr-un interval;
11. determinarea tuturor numerelor de tip ,munte dintr-un interval;
12. determinarea tuturor numerelor de tip ,vale i a tuturor numerelor de tip ,munte
dintr-un interval.

3. Numere 69


3.3. Probleme propuse

3.3.1. Prima zi
Locuitorii din ara lui Papur Vod obinuiau s-i pun pe csue numere ciudate i
lungi. Piticul Achiu, angajat de prob la OIiciul pentru Evidena Cldirilor Publice,
s-a pus pe treab nc din prima zi, experimentnd unele modiIicri n numerotarea
cldirilor. Pentru nceput el a eliminat ciIra 2 din numrul nscris pe cldirea n care
lucra.
Scriei un program care citete un numr natural i elimin din acesta toate apariii-
le ciIrei 2.

Date de intrare
Din Iiierul de intrare ZIUA1.IN se va citi un numr natural n.

Date de ieyire
n Iiierul de ieire ZIUA1.OUT se va scrie numrul din care s-au eliminat toate ciIrele
egale cu 2.

Restricii yi precizri
- 1 s n s 1000000000;
- dac toate ciIrele sunt egale cu 2, rezultatul va Ii numrul 0.

Exemplu
ZIUA1.IN

ZIUA1.OUT


3.3.2. A doua zi
A doua zi, piticul Achiu, Iiind angajat de prob la OIiciul pentru Evidena Cldiri-
lor Publice, s-a jucat din nou cu ciIra lui preIerat, numrnd de cte ori apare ciIra 2
n total n toate numerele caselor de pe strada sa.
Realizai un program care s numere de cte ori apare ciIra 2 n toate numerele
existente ntr-un Iiier dat.

Date de intrare
n Iiierul de intrare ZIUA2.IN se aIl numere naturale, aezate cte unul pe o linie.

Date de ieyire
Numrul de apariii ale ciIrei 2 se va scrie n Iiierul de ieire ZIUA2.OUT.


70 3. Numere


Exemplu
ZIUA2.IN

ZIUA2.OUT


3.3.3. A treia zi
n cea de-a treia zi de lucru, piticul Achiu s-a plictisit i s-a hotrt s roteasc ciIre-
le numerelor caselor tuturor vecinilor spre dreapta. Cunoscnd numrul de rotaii eIec-
tuate asupra ciIrelor, precum i numerele caselor vecinilor de pe strad, aIiai nume-
rele obinute n urma rotaiilor ciIrelor.

Date de intrare
Pe prima linie a Iiierului ZIUA3.IN se aIl un numr natural n, reprezentnd numrul
de rotaii care trebuie eIectuate asupra numerelor csuelor vecinilor de pe strad. Pe
urmtoarele linii se aIl n numere naturale, cte un numr pe o linie.

Date de ieyire
n Iiierul de ieire ZIUA3.OUT se vor scrie numerele rotite, cte unul pe o linie.

Restricii yi precizri
- 0 s n s 255.

Exemplu
ZIUA3.IN

ZIUA3.OUT

3.3.4. A patra zi
A patra zi piticul Achiu a luat hotrrea de a scurta numerele caselor, deoarece i se
preau prea lungi. El a nceput s experimenteze ideea de a nlocui Iiecare ciIr a nu-
mrului cu complementul ciIrei respective Ia de cea mai mare ciIr din numr, eIec-
tund aceeai prelucrare pe rezultatul obinut, el a observat c anumite numere se re-
duc la o ciIr.
Scriei un program care reduce un numr dat la o ciIr cu metoda lui Achiu, dac
acest lucru este posibil.

3. Numere 71


Date de intrare
Numrul natural n se citete din Iiierul de intrare ZIUA4.IN.

Date de ieyire
CiIra rezultat se va scrie n Iiierul ZIUA4.OUT. n cazul n care numrul nu se poate
reduce la o ciIr, n Iiierul de ieire se va scrie mesajul: LPSRVLELO.

Restricii yi precizri
- 1 s n s 100000000 (o sut de milioane).

Exemple
ZIUA4.IN




ZIUA4.IN




ZIUA4.IN

ZIUA4.OUT




ZIUA4.OUT


ZIUA4.OUT
LPSRVLELO
Valorile succesive ale numrului pn la
obinerea rezultatului sunt: 1234 3210
0123 210 012 10 01
Rezultatul Iinal este 1.

Valorile succesive ale numrului pn la
obinerea rezultatului sunt:
195 804 084 4
Rezultatul Iinal este 4.

Valorile succesive ale numrului pn la
obinerea rezultatului sunt:
29340 70659 29340 . ciclu inIinit,
acest numr nu se poate reduce la o ciIr.

3.3.5. A cincea zi
Dup cum tim deja, locuitorii din ara lui Papur Vod obinuiau s-i pun pe csu-
e numere Ioarte ciudate i lungi. Piticul Achiu, angajat la OIiciul pentru Evidena
Cldirilor Publice, n cea de-a cincea zi de lucru s-a apucat de Icut statistici. El a
cutat n cazul unui numr n ciIrele avnd cea mai mare Irecven.
Scriei un program care determin Irecvena maxim de apariie a unei ciIre i ci-
Irele care au aceast Irecven de apariie n numr.

Date de intrare
Numrul natural n se citete din Iiierul ZIUA5.IN.

Date de ieyire
n Iiierul ZIUA5.OUT se va scrie Irecvena maxim, urmat de spaiu, apoi se va scrie
ciIra sau ciIrele care au aceast Irecven de apariie n numr.
72 3. Numere


Restricii yi precizri
- 1 s n s 1000000000;
- CiIrele avnd Irecvena maxim se vor despri prin cte o virgul.

Exemplu
ZIUA5.IN

ZIUA5.OUT


3.3.6. A yasea zi
A asea zi piticul Achiu a umblat prin tot regatul pentru a Iace o statistic privind
numrul de case care sunt numerotate cu numere n aspect de urcu, cobor, deal sau
vale.
Spunem c un numr are aspect de aeal dac ciIrele sale se succed nti cresctor i
apoi descresctor i considerm un numr ca avnd aspect de vale dac ciIrele sale se
succed nti descresctor i apoi cresctor. ntr-un numr cu aspect de urcu ciIrele
apar n ordine cresctoare, iar ntr-unul cu aspect de cobora, n ordine descresctoare.
S se scrie un program care realizeaz statistica dorit de Achiu.

Date de intrare
n Iiierul de intrare ZIUA6.IN se aIl mai multe numere naturale.

Date de ieyire
n Iiierul ZIUA6.OUT statistica rezultat va Ii aIiat astIel:
- pe prima linie se va scrie cuvntul XUFXV, urmat de caracterul , apoi de
numrul de numere avnd aspect de urcu;
- pe a doua linie se va scrie cuvntul FRERUDV, urmat de caracterul , apoi de nu-
mrul de numere avnd aspect de cobor;
- pe a treia linie se va scrie cuvntul GHDO, urmat de caracterul , apoi de numrul
de numere avnd aspect de deal;
- pe a patra linie se va scrie cuvntul YDOH, urmat de caracterul , apoi de num-
rul de numere avnd aspect de vale;
- dac n Iiierul de intrare exist numere care nu se ncadreaz n nici una dintre ce-
le patru grupe, pe a cincea linie se va scrie cuvntul RDUHFDUH, urmat de caracterul
, apoi de numrul de numere corespunztor.

Restricii yi precizri
- 1 s numr citit s 1000000000.



3. Numere 73


Exemplu
ZIUA6.IN

ZIUA6.OUT
XUFXV
FRERUDV
GHDO
YDOH
RDUHFDUH

3.3.7. A yaptea zi
n cea de-a aptea zi lui Achiu i trecu prin minte c ar Ii mai interesant dac nume-
rele caselor ar Ii n urmtoarea succesiune: 11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 222,
333, .
S se genereze n numere de case conIorm regulii lui Achiu.

Date de intrare
n Iiierul de intrare ZIUA7.IN avem scris un numr natural n.

Date de ieyire
Numerele generate dup regula de mai sus vor Ii scrise n Iiierul ZIUA7.OUT, cte un
numr pe Iiecare linie.

Restricii yi precizri
- 1 s n s 1000.

Exemplu
ZIUA7.IN

ZIUA7.OUT


3.4. Soluiile problemelor

3.4.1. Prima zi
Fie, de exemplu, numrul 232271. n tabelul urmtor coloana nr conine valoarea cu-
rent a numrului care se prelucreaz, coloana cifra reine valoarea ciIrei analizate, iar
putere reprezint valoarea puterii lui 10 n procesul de construire a rezultatului. n
aceast problem nu vom aplica schema lui Horner, deoarece aplicarea ei ar conduce
la un numr n care ciIrele ar Ii aezate n ordine invers. Valoarea variabilei putere ne
va ajuta ca nmulind numrul cu puterea lui 10 corespunztoare, s aezm ciIra exact
pe poziia avnd rangul dorit.
74 3. Numere


nr cifra putere re:ultat
232271 1 0
232271 1
1 1
23227 7 10 71
2322 2
10 71
232 2
10 71
23 3 100 371
2 2

0



Vom descrie algoritmul conIorm cruia am completat tabelul de variaie.

Algoritm=LXD
citeteQU
UH]XOWDW re:ultatul va fi un numr nou, care se calculea: ca sum ae }
termeni, element neutru: 0 }
SXWHUH puterile lui 10 se obin in urma unor inmuliri, element neutru: 1 }
ct timpQU=execut:
FLIUHVW>QU@ reinem ultima cifr ain numrul aat }
QU>QU@ tiem ultima cifr ain numrul aat }
dacFLI=atunci aac cifra reinut nu este 2, o aaugm la re:ultat }
UH]UH]FLIS
SS pregtim p pentru pasul urmtor }
sfrit dac
sfrit ct timp
scrie UH]
sfrit algoritm

3.4.2. A doua zi
Pentru exempliIicare vom considera un singur numr i vom reine aciunile care tre-
buie realizate asupra numerelor pentru a numra ciIrele egale cu 2 n toate numerele
citite.
numr cifr contor
232271 1 0
23227 7

2322 2 1
232 2 2
23 3

2 2 3
0

3. Numere 75


Rezultatul obinut este 3, reprezentnd numrul ciIrelor egale cu 2 n total n num-
rul 232271.

Algoritm=LXD
FkWH
ct timp nu urmea: marca ae sfarit ae fiier execut:
citeteQ
ct timpQ=execut:
FLIUHVW>Q@ reinem ultima cifr ain numrul aat }
Q>Q@ ,tiem` ultima cifr ain numrul aat }
dacFLIatunci aac cifra este 2, o numrm }
FkWHFkWH
sfrit dac
sfrit ct timp
sfrit ct timp
scrie FkWH
sfrit algoritm

3.4.3. A treia zi
Vom considera un exemplu pe care vom analiza paii algoritmului de rezolvare. Vrem
s rotim numrul 1234567 cu 10 poziii spre dreapta. Observm c numrul va Ii rotit
o dat complet i cu nc trei poziii.
Pentru Iiecare numr citit trebuie s:
- numrm cte ciIre are numrul (n exemplu: 7 ciIre);
- determinm numrul de rotaii care ,merit eIectuate (observm c rotaiile com-
plete nu modiIic conIiguraia ciIrelor numerelor); n Iuncie de relaia dintre n (nu-
mrul rotaiilor) i numrul ciIrelor numrului, calculm numrul de rotaii astIel
nct s Iie mai mic dect numrul de ciIre ale numrului; observm c numr ro-
taiiaeefectuat este restul mpririi lui n la numrul de ciIre;
- extragem ,n bloc ultimele numrrotaiiaeefectuat ciIre (n exemplu extragem
567, deci reinem numrul 1234);
- calculm 10 la puterea numrulcifrelor numrrotaiiaeefectuat pentru a de-
plasa ciIrele de rotit, n Iaa numrului (puterea lui 10 de care avem nevoie n
exemplul nostru este 10000);
- calculm suma dintre numrul rmas i ciIrele extrase nmulite cu puterea lui 10
pregtit; pentru exemplul nostru rezultatul este: 1234 567 10000 5671234.

Prezentm algoritmul descris mai sus n pseudocod:

Algoritm=LXD
citeteN numrul rotaiilor cerute iniial }
76 3. Numere


ct timp nu urmea: marca ae sfarit ae fiier execut:
citeteQ numrul curent in care vom roti cifrele }
QUFLI numrul cifrelor in numrul curent in care vom roti cifrele }
PQ copie a lui n, aeoarece urmea: s-l moaificm }
pe ae alt parte mai avem nevoie ae valoarea lui n }
ct timpP=execut: numrm cate cifre are numrul }
QUFLIQUFLI
P>P@ catul impririi intregi a lui n la 10 }
sfrit ct timp
NNUHVW>NQUFLI@ numrul rotaiilor care trebuie efectuate }
ae k original mai avem nevoie }
S extragem in bloc ultimele k cifre }
pentruLNNexecut:
SS calculm a kk-a putere a lui 10 }
sfrit pentru
GHBPXWDWUHVW>QS@
Q>QS@
ceea ce a rmas ain numr aup ce secvena ,ae mutat` a fost extras }
S calculm puterea lui 10 }
pentruLQUFLINNexecut:
SS
sfrit pentru
QQGHBPXWDWS construim re:ultatul in n }
scrieQ
sfrit ct timp
sfrit algoritm

3.4.4. A patra zi
Pentru a determina algoritmul de rezolvare vom considera un exemplu. Vom comple-
menta ciIrele numrului 122375 Ia de ciIra maxim. Asupra rezultatului aplicm
aceeai prelucrare, lund n considerare ciIra maxim a numrului obinut la pasul pre-
cedent.
Pentru Iiecare valoare nou, vom eIectua urmtoarele operaii:
- determinm ciIra de valoare maxim dintre ciIrele numrului;
- complementm ciIrele numrului Ia de aceast ciIr.

n algoritmul propus vom lucra cu urmtoarele variabile, avnd semniIicaiile pre-
cizate:
n este numrul natural dat;
m este o variabil auxiliar n care vom copia valoarea lui n;
3. Numere 77


cif este ciIra curent;
nouln este noul numr Iormat;
cmax este ciIra maxim a numrului;
p este o putere a lui 10 care ne ajut n Iormarea numrului nou.

n m cif nouln cmax p
Explicaii
122375 122375 5

5

calcul ciIr maxim

12237 7

7


1223 3


122 2


12 2


1 1


0

122375 122375 2 2 7 1
7 5 2

12237 0 02

10
7 7 0

1223 4 402

100
7 3 4

122 5 5402

1000
7 2 5

12 5 55402

10000
7 2 7

1 6 655402

100000
7 1 6

0

655402 655402 2

2

calcul ciIr maxim

65540


6554

4


655

5


65


6

6


0

.



Se observ c la Iiecare complementare am parcurs ciIrele unui numr de dou ori.
Ne punem problema de a Iace o singur parcurgere. ncercm deci s determinm ciIra
maxim n ciclul de complementare a numrului. Inconvenientul care apare n aceast
situaie este c la primul pas nu avem nici o ciIr cu care s putem iniializa variabila
care pstreaz ciIra maxim. Deci, Iie determinm prima ciIr anterior descompunerii
numrului n ciIre, Iie iniializm variabila cu 0 (cea mai mic ciIr).
Vom Iolosi dou copii ale lui n (versiunea mai veche a lui n i versiunea anterioar
a acestuia) care ajut la depistarea situaiei n care transIormarea total a numrului
este imposibil, deoarece s-ar ajunge ntr-un ciclu inIinit. De exemplu, dac transIor-
mm 102, la primul pas, se obine 120, iar la al doilea din nou 102.

78 3. Numere


Algoritm=LXD
citeteQ
DQWHULRU
LPSRVLELOfals
FPD[ valoare iniial pentru cifra ae valoare maxim }
PQ m este copia lui n, (ae n mai avem nevoie) }
ct timpP=execut: stabilim cifra ae valoare maxim }
FLIUHVW>P@ cifra curent }
dacFLI!FPD[atunci
FPD[FLI actuali:area cifrei maxime }
sfrit dac
P>P@
sfrit ct timp
ct timp Q!i nuLPSRVLELOexecut: complementare }
PQ
S
YHFKHDQWHULRU ,veche` este versiunea mai veche a lui n }
DQWHULRUQ ,anterior` este versiunea anterioar a lui n }
Q numr nou }
QH[WFPD[
ct timpP=execut:
FLIFPD[UHVW>P@ complementm ultima cifr ain numr }
QQFLIS construim numrul }
P>P@
SS urmtoarea putere a lui 10 }
dacFLI!QH[WFPD[atunci
QH[WFPD[FLI actuali:area cifrei maxime pentru pasul urmtor }
sfrit dac
sfrit ct timp
FPD[QH[WFPD[
dacQYHFKHatunci
LPSRVLELOaaevrat am intrat in ciclu infinit }
altfel
LPSRVLELOfals
sfrit ct timp
dacLPSRVLELOatunci
scrieLPSRVLELO
altfel
scrieQ
sfrit dac
sfrit algoritm

3. Numere 79


3.4.5. A cincea zi
Vom cuta s descoperim algoritmul de rezolvare, pornind de la un exemplu: s se
determine ciIrele cu numr maxim de apariii n numrul 23322731. n reprezentarea
algoritmului vom Iolosi urmtoarele notaii:
nr este numrul dat;
copie va pstra valoarea numrului pentru a-l putea studia n cazul Iiecrei ciIre cif;
cif va Ii ciIra a crei Irecven dorim s o determinm;
cifcurent reprezint ciIra din nr cu care vom compara ciIra cif;
aparcurent reprezint numrul de apariii ale ciIrei cif n nr;
aparmax reprezint numrul maxim de apariii.

Analiznd posibilitile de a numra apariiile unei ciIre, observm c atta timp
ct numrul mai are ciIre, va trebui s desprindem din numr ultima ciIr i va trebui
s o comparm cu valoarea ciIrei cif, generat cu pentru. Dac cele dou coincid,
mrim contorul aparcurent. AstIel, parcurgnd ciIrele numrului, putem contoriza Iie-
care ciIr ntre 0 i 9. De asemenea, se poate actualiza i valoarea contorului maxim
(aparmax). Dar ne izbim de urmtoarea problem: n enun ni se cere s scriem n Ii-
ier toate ciIrele avnd Irecvena de apariie maxim. Deci, s presupunem c am gsit
deja n nr doi de 0, dar nu tim dac trebuie s scriem aceast valoare n Iiier sau nu,
deoarece nu tim dac, de exemplu, din ciIra 1 vom gsi mai multe apariii sau nu.
Soluia este simpl: vom scrie n Iiier valoarea presupus maxim (2) i ciIra 0. Dac
ciIra 1 apare o singur dat, nu modiIicm nimic. Dac numrul ei de apariie este egal
cu 2, deschidem Iiierul pentru adugare i l scriem i pe 1. Dac ns numrul de
apariie este mai mare dect 2, deschidem Iiierul pentru scriere (n Pascal cu
5H:ULWH), astIel anulnd coninutul lui vechi i scriem numrul maxim de apariii m-
preun cu ciIra corespunztoare.

Algoritm=LXD
citeteQU numrul aat }
FRSLHQU copie a lui nr }
DSDUPD[ iniiali:m frecvena ae apariie maxim }
pentruFLIexecut: generm cifrele posibile in cif }
DSDUFXUHQW iniiali:m frecvena cifrei cif }
ct timpQU=execut: cat timp in nr mai avem cifre }
FLIFXUHQWUHVW>QU@ ultima cifr ain nr }
QU>QU@ o tiem ain nr }
dacFLIFXUHQWFLIDWXQFL aac cifra curent este egal cu cif }
DSDUFXUHQWDSDUFXUHQW cretem frecvena cifrei cif }
sfrit dac
sfrit ct timp am parcurs cifrele numrului nr }
80 3. Numere


dacDSDUPD[DSDUFXUHQWatunci aac avem un maxim nou }
DSDUPD[DSDUFXUHQW actuali:m maximul }
aeschiaem fiierul, aac a avut coninut (un maxim mai mic) acesta se pierae
scrieDSDUPD[FLI scriem maximul i cifra cif }
altfel
dacDSDUPD[DSDUFXUHQWatunci avem o frecven egal cu }
aparmax care aefa este scris in fiier, impreun cu o valoare cif }
aeschiaem fiierul pentru aaugare
scrieFLI scriem cifra cif, avana aceeai frecven }
sfrit dac
sfrit dac
QUFRSLH refacem nr pentru a putea cuta in el urmtoarea cifr cif }
sfrit pentru
sfrit algoritm

3.4.6. A yasea zi
Ideea de rezolvare a acestei probleme este de a numra numrul schimbrilor n sensul
ordonrii irului ciIrelor numrului.
Vom pstra ntr-o variabil a direcia iniial (cresc ciIrele sau descresc?) a ordon-
rii ciIrelor numrului. Deoarece ne este mai uor s analizm ultima ciIr din numr,
aceast direcie va Ii calculat din aiferena aintre ultima i penultima cifr a numru-
lui aat. Deci a se iniializeaz cu UHVW>Q@UHVW>>Q@@.
n continuare ne va interesa doar semnul ( sau ) al variabilei a.
- Dac n Iinal numrul schimbrilor direciei este egal cu 0 i dac a ~ 0, atunci
avem un numr cu aspect de urcu (exemplu: n 1259, a 9 5 4 ~ 0), iar dac
a 0, atunci avem cobora (exemplu: n 6542, a 2 4 2 0).
- Dac a 0, ciIrele sunt identice, deci trebuie s calculm a pe baza primelor ciIre
distincte ale numrului.
- Dac numrul schimbrilor direciei este egal cu 1 i a ~ 0, atunci avem un numr
cu aspect de vale (exemplu: n 76345, 5 4 1 ~ 0), iar dac a 0, atunci avem
un aeal (exemplu: n 1273, 3 7 7 0).
- Numerele care nu intr n nici una dintre aceste categorii sunt considerate oarecare
(de exemplu: 131313).

Algoritm=LXD
QUXUF
QUFRE
QUGHDO
QUYDOH
QURDUHFDUH iniiali:area contoarelor }
3. Numere 81


ct timp nu urmea: marcaful ae sfarit ae fiier execut:
citeteQ
cat timp ultimele aou cifre sunt iaentice, eliminm ultima cifr }
ct timpQ!iUHVW>Q@UHVW>>Q@@execut:
Q>Q@
sfrit ct timp
N numrul schimbrilor ae airecie }
G airecia }
dacQ!atunci aac numrul rmas este format mcar ain aou cifre }
dacUHVW>Q@ UHVW>>Q@@atunci iniiali:m airecia }
G
altfel nu pot fi egale, aeoarece am eliminat cifrele egale ae la inceput }
G
sfrit dac
Q>Q@ renunm la ultima cifr }
ct timpQ!execut: cat timp mai exist cel puin 2 cifre in n }
aac airecia curent i aiferena ultimelor aou cifre nu au acelai semn }
dacGiUHVW>Q@!UHVW>>Q@@sau
G!iUHVW>Q@UHVW>>Q@@atunci
NN schimbare ae airecie }
GG
sfrit dac
Q>Q@
sfrit ct timp
sfrit dac
dacNatunci
dacGatunciQURDUHFDUHQURDUHFDUH k 0, a 0 }
altfel
dac G!atunci QUXUFQUXUF k 0, a ~ 0 }
altfel QUFREQUFRE k 0, a 0 }
sfrit dac
sfrit dac
altfel
dacNatunci
dacGatunci QUYDOHQUYDOH k 1, a 0 }
altfelQUGHDOQUGHDO k 1, a ~ 0 }
sfrit dac
altfel
dacN!atunciQURDUHFDUHQURDUHFDUH k ~ 1 }
sfrit dac
sfrit dac
sfrit dac
sfrit ct timp
82 3. Numere


scrieXUFXVQUXUF afiare }
scrieFRERUDVQUFRE
scrieGHDOQUGHDO
scrieYDOHQUYDOH
scrieRDUHFDUHQURDUHFDUH
sfrit algoritm

3.4.7. A yaptea zi
Enunul problemei ne cere s generm primii n termeni ai irului: 11, 22, 33, .., 99,
111, 222, 333, .999, 1111.

S analizm cteva modaliti de abordare a problemei. Primii doi algoritmi pot Ii
utilizai pentru n s 73 (caz n care ultimul termen n ir este numrul Iormat din 10
ciIre egale cu 1).
- O idee ar Ii s Iormm numerele din ciIre: 11 din 1 i 1, 22 din 2 i 2.

Algoritm=LXDB
citeteQ
FLI
QUBFLIUH
pentruLQexecut: se formea: n numere ain nrcifre egale cu cif }
QXPUFLI
pentruMQUBFLIUHexecut:
QXPUQXPUFLI
sfrit pentru
scrieQXPU
dacFLIatunci pregtim cifra i nrcifre pentru pasul urmtor }
FLIFLI
altfel
FLI
QUFLIQUBFLIUH
sfrit dac
sfrit pentru
sfrit algoritm

- O alt idee, mai simpl, este de a aduna la Iiecare numr Iormat din dou ciIre va-
loarea 11, la Iiecare numr Iormat din trei ciIre valoarea 111 i aa mai departe. n
acest caz irul ar putea Ii privit astIel: 11, 111122, 221133, .

Variabila aeaaunat va avea succesiv valoarea 11, apoi 111 i aa mai departe.

3. Numere 83


Algoritm=LXDB
citeteQ
GHBDGXQDW
QXPU
pentruLQexecut:
scrieQXPU
pregtim valoarea variabilei GHBDGXQDW pentru pasul urmtor }
QXPUQXPUGHBDGXQDW
dacUHVW>QXPU@atunci
aac avem ca:ul 99 11 110, sau 999 111 1110 }
QXPUQXPU 110 1 111 }
GHBDGXQDWGHBDGXQDW
sfrit dac
sfrit pentru
sfrit algoritm

- Dac se dorete rezolvarea acestei probleme pentru n ~ 73, vom scrie n Iiier, pur
i simplu, ciIre alturate. Numrul ciIrelor dintr-un numr se genereaz conIorm
regulii generrii numerelor din ir.

Algoritm=LXDB
citeteQ
OXQJLPH lungimea iniial a numerelor }
F prima cifr este 1 }
pentruLQexecut generm n termini in ir }
pentruMOXQJLPHexecut tiprirea elementului curent ain ir }
scrieF
sfrit pentru
dacFatunci
F urmea: ain nou un numr format ain cifre egale cu 1 }
OXQJLPHOXQJLPH crete numrul ae cifre in numr }
altfel
FF urmtoarea cifr }
sfrit dac
sfrit pentru
sfrit algoritm




Numere speciale

Numere perfecte
Numere prietene
Numere triangulare
Numere ptratice
Numere piramidale
Numere pitagoreice
Numere prime
Numere Fibonacci
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
4



n antichitate numerele erau apreciate, n primul rnd, pentru calitile lor i, abia dup
aceea, pentru cantitatea pe care o reprezint. AstIel, Iiecare numr a Iost privit ca o in-
dividualitate distinct. Ruaolf Steiner ne explic teoria conIorm creia un numr se
poate obine din intreg printr-un proces de mprire (diviziune) asemntor proceselor
naturale de diviziune celular. Cellalt procedeu de obinere a unui numr ar Ii prin
aaunare. Cele dou procedee se pot prezenta comparativ astIel:

Operaie de mprire Operaie de adunare
Unitatea se considera mama tuturor numerelor, Iiind superioar oricrui numr.
Numerele se caracterizau prin dependena lor Ia de alte numere cu care Iormeaz o
nlnuire. De exemplu: numrul 6 s-ar putea reprezenta astIel:

4. Numere speciale 85

Exist multe motive pentru care cercul reprezint o imagine mai adecvat unui nu-
mr care se divizeaz n pri. n acest caz, numrul 6 s-ar putea reprezenta astIel:


2

1
1
1 1
1
1
3


2

2


3 6




Unitatea din numrul 6 se regsete, de asemenea, ca unitate n numerele doi i trei
(aivi:ori ai lui 6), pe cnd unitatea din 5 se regsete doar pentru sine nsui, cci cinci
nu este multiplul nici unuia dintre numerele care l preced.



Dac l privim aa, cinci poate Ii numit ,primul numr, numr prim cum l nu-
mim noi. Aceeai denumire le este apoi atribuit i celorlalte numere care nu au ali di-
vizori dect pe 1 i pe ei nii.
Analiznd numrul 6, observm c adunnd divizorii si (numerele 1, 2 i 3) ajun-
gem din nou la numrul 6 (1 2 3 6).

4.1. Numere perfecte
Vechii greci aveau un respect deosebit pentru aceste numere i le numeau ,arithmos
teleios adic ,numrul limitat la el nsui, n traducerea actual numr perfect.
Se spune c Euclia ar Ii artat c dac 2
n
1 este numr prim, atunci 2
n 1
(2
n
1)
este numr perIect. Pn n prezent nu s-a gsit nici un numr perIect care s nu veriIi-
ce condiia lui Euclia.

n 2
n
- 1 Primalitate 2
n - 1
(2
n
- 1) Suma divizorilor
2 2
2
1 3 prim 2
1
3 2 3 6 1 2 3 6
3 2
3
1 7 prim 2
2
7 4 7 28 1 2 4 7 14 28
4 2
4
1 15 nu
5 2
5
1 31 prim 2
4
31 16 31 496 1 2 4 8 16 31
62 124 248 496
6 2
6
1 63 nu
7 2
7
1 127 prim 2
6
127 16 31
8128
1 2 4 8 16 32
64 127 254 508
1016 2032 4064 8128
86 4. Numere speciale

Alte proprieti ale numerelor perIecte :
1) Toate numerele perIecte se termin cu ciIra 6 sau cu ciIra 8, dup cum se poa-
te observa din tabelul urmtor:

n 2
n - 1
2
n
- 1 2
n - 1
(2
n
- 1)
2 2 3 6
3 4 7 28
4 8 15 120
5 16 31 496
6 32 63 2016
7 64 127 8128
8 128 255 32640
9 256 511 130816
10 512 1023 523776
11 1024 2047 2096128
12 2048 4095 8386560

Numerele de Iorma 2
n
- 1 se numesc numere Mersenne.

2) Primele patru numere perIecte n reprezentare binar sunt:

Aumere perfecte Reprezentare binar
6 110
28 11100
496 11110000
8128 111111000000

Dac Iacem o comparaie ntre un numr i suma divizorilor si, observm c avem
trei situaii:
- Dac suma divizorilor este egal cu numrul, spunem c numrul este perfect.
- Dac suma divizorilor este mai mic dect numrul, spunem c numrul este aeficient.
- Dac suma divizorilor este mai mare dect numrul, spunem c numrul este bogat.

4.2. Numere prietene
Perechile de numere care se ,acoper reciproc, se bucurau de un mare interes n ve-
chea Grecie i erau numite ,philoi arithmoi adic numere prietene (n unele surse le
gsim cu numele de numere amiabile). Aici prin ,acoperire nelegem proprietatea c
Iiecare dintre cele dou numere are suma aivi:orilor egal cu cellalt numr.
4. Numere speciale 87

Prima pereche de numere prietene este 220 cu 284. Suma divizorilor lui 220 este 1
2 4 5 10 11 20 22 44 55 110 284, iar suma divizorilor lui 284
este 1 2 4 71 142 220.
Matematicianul arab Tabit ibn Korra (secolul X) a gsit un algoritm de generare a
unor perechi de numere prietene. Acest algoritm a Iost publicat Ir demonstraie de
ctre Descartes n anul 1638.
Prezentm n continuare algoritmul (reeta) lui Tabit n Iorma n care se cunotea
n acele vremuri.
Pasul 1: Se pleac de la numrul 6;
Pasul 2: Se construiete, prin dublri succesive irul: 6, 12, 24, 48, 96, 192, ...
Pasul 3: n continuare se iau pe rnd din acest ir perechi succesive. Exemplu: 6 i 12,
12 i 24, 24 i 48, .
Pasul 4: Fiecrei perechi de numere i se adaug un al treilea numr, care conine ambii
membri ai dualitii, adic produsul lor. Se obin astIel:
(6, 12); (12, 24); (24, 48); (48, 96); .
72 288 1152 4608
Pasul 5: Se scade 1 din Iiecare din cele trei numere. Se obine:
(5, 11); (11, 23); (23, 47), (47, 95); .
71 287 1151 4607
Pasul 6: Se construiete seria dublurilor pentru numrul 4 (4, 8, 16, 32, 64, ...) care se
scrie sub numerele obinute la pasul anterior.
(5, 11); (11, 23); (23, 47), (47, 95); .
71 287 1151 4607
4 8 16 32
Pasul 7: ncepnd cu acest pas ne intereseaz numai tripletele de numere prime. n ca-
zul nostru se pstreaz:
(5, 11); (23, 47); ...
71 1151
4 16
Pasul 8: La acest pas, se nmulesc cele dou numere ale perechii i se obine:
55, 1081, ...
71, 1151
Pasul 9: n Iinal, cele dou numere scrise deasupra multiplilor lui 4 se nmulesc cu
multiplul corespunztor. Se obin astIel perechi de numere prietene:
220, 17296, ...
284, 18416, ...

Observaie
Algoritmul lui Tabit nu genereaz toate perechile de numere prietene. El a gsit
doar o regul de a genera anumite numere perIecte.

n continuare prezentm alte numere crora anticii le acordau o deosebit atenie.
88 4. Numere speciale

4.3. Numere triangulare

1
1
2
1 2 3
1 2 3 4
3


6
10


Un numr x se numete triangular dac exist un numr natural n, astIel nct su-
ma primelor n numere naturale este egal cu numrul dat x:
1 2 3 . n n (n 1)/2 x

4.3.1. Relaii ntre numerele perfecte yi cele triangulare
Dac se privete irul numerelor triangulare : 1, 3, 6, 10, 15, 21, 28, 36, ... se observ
c n ir apar numerele perIecte 6 i 28. Este uor de demonstrat c orice numr perIect
este totodat i numr triangular. Lsm pe seama cititorilor veriIicarea acestei
observaii, innd cont de ipoteza c orice numr perIect are Iorma 2
n 1
(2
n
1).

4.4. Numere ptratice
Un numr x se numete ptratic dac exist un numr natural n, astIel nct numrul
dat x s Iie egal cu suma primelor n numere naturale impare:
1 3 5 . (2n 1) n
2

4.5. Numere piramidale
Un numr se numete piramidal dac poate Ii scris ca sum de numere triangulare
consecutive:
1
1 3 4
1 3 6 10
...

4.6. Numere pitagoreice
Relaia caracteristic laturilor unui triunghi dreptunghic (cunoscut empiric i de egip-
teni) este:
x
2
y
2
:
2

Numerele care respect o astIel de relaie se numesc numere pitagoreice.
4. Numere speciale 89

4.7. Numere prime
Un numr prim are exact doi divizori. Rezult imediat c 1 nu este prim i singurul
numr prim par este 2. VeriIicarea primalitii se poate realiza simplu, pornind de la
deIiniie, dar se pot scrie i algoritmi mai perIormani care se vor opri imediat dup ce
s-a gsit un divizor propriu. De asemenea, putem evita cutarea unor divizori care sunt
numere pare n cazul n care numrul dat este impar (vezi rezolvarea problemei
4.10.7).
Generarea numerelor prime mai mici dect un numr dat i-a preocupat i pe mate-
maticienii din Grecia antic. Strategia lui Eratostene i astzi este un ,algoritm apli-
cat. El a scris pe un papirus, ncepnd de la 2, un ir de numere naturale consecutive.
Apoi, l-a marcat pe 2 ca Iiind prim i a tiat toate numerele divizibile cu 2. A procedat
la Iel cu 3. Pe 4 nu l-a mai ,gsit printre numere, acesta Iiind tiat, deci a continuat
cu 5. n Iinal, pe papirus au rmas netiate doar numerele prime.

4.8. Numere Fibonacci
irul numerelor care poart numele celebrului matematician Fibonacci are Ioarte mul-
te proprieti interesante:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Generarea termenilor mai mici sau egali cu un numr natural n ~ 1 dat ai acestui ir
este o problem simpl i se realizeaz cu urmtorul algoritm.

Algoritm)LERQDFFL
citeteQ valoarea cea mai mare a unui termen }
D primul termen }
E al aoilea termen }
FDE al treilea termen }
scrieDE aeoarece n ~1, primii aoi se pot scrie }
ct timp FsQexecut cat timp suma celor aoi termeni anteriori }
scrieF satisface cerina, o scriem }
DE noul a va fi vechiul b }
EF noul b va fi vechiul c }
FDE calculm noul termen }
sfrit ct timp
sfrit algoritm

O problem interesant care se poate Iormula este urmtoarea: dat Iiind un numr
natural, s se stabileasc dac acesta este sau nu numr Fibonacci i, n caz negativ, s
se scrie numrul sub Iorm de sum de numr minim de numere Fibonacci.


90 4. Numere speciale

Vom genera, cu algoritmul de mai sus, numere Fibonacci i ne vom opri n mo-
mentul n care ultimul termen este mai mare sau egal cu numrul dat. Dac ultima va-
loare a variabilei c este numr Fibonacci, algoritmul se termin. n caz contrar, aIim
cel mai mare numr Fibonacci mai mic sau egal cu numrul dat (disponibil n variabi-
la b) i scdem din numrul dat valoarea acestuia. Dac b a Iost egal cu numrul dat,
algoritmul se termin, n caz contrar relum algoritmul de veriIicare. Ct timp n (din
care mereu se scade numrul Fibonacci b care se aIieaz) este pozitiv, determinm
cte un numr Fibonacci b mai mic sau egal cu valoarea actual a lui n, pe care o sc-
dem din n i o aIim.

Algoritm6XPBGHB1XPHUHB)LERQDFFL
citeteQ valoarea aat }
D
E
FDE
ct timpFQexecut
DE
EF
FDE
sfrit ct timp acum b este cel mai mare numr Fibonacci s n }
dacFQatunci
scrie1XPDU)LERQDFFL
altfel
scrieQE
QQE
ct timpQ!execut cat timp mai avem rest }
ct timpE!Qexecut
FE
ED
DFE
sfrit ct timp acum b este cel mai mare numr Fibonacci s n }
scrieE
QQE
sfrit ct timp
sfrit dac
sfrit algoritm

4. Numere speciale 91

4.9. Implementri sugerate
Pentru a v Iamiliariza cu modul n care se rezolv problemele n care veriIicarea divi-
zibilitii are rol important, v sugerm s ncercai s implementai algoritmi pentru:
1. numrarea (generarea) divizorilor unui numr;
2. descompunerea unui numr n Iactori primi;
3. determinarea Iactorului prim al unui numr dat, care este la puterea cea mai mare;
4. cel mai mare divizor comun a dou numere ntregi;
5. cel mai mic multiplu comun a dou numere ntregi;
6. veriIicarea primalitii unui numr;
7. determinarea celui mai mic numr prim mai mare dect un numr dat;
8. determinarea celui mai mare numr prim mai mic dect un numr dat;
9. determinarea preIixelor prime ale unui numr;
10. determinarea suIixelor prime ale unui numr;
11. determinarea primelor n numere prime;
12. determinarea tuturor numerelor prime dintr-un interval;
13. determinarea primelor n numere perfecte;
14. determinarea primelor n numere perIecte Iolosind ideea lui Euclia;
15. determinarea primelor n perechi de numere prietene;
16. generarea perechilor de numere prietene, Iolosind algoritmul lui Tabit ibn Korra;
17. aIiarea numerelor triangulare dintr-un ir de numere naturale;
18. aIiarea numerelor triangulare care sunt ptrate perIecte i sunt mai mici sau egale
cu un numr natural n dat;
19. aIiarea numerelor ptratice dintr-un ir dat de numere naturale;
20. aIiarea numerelor ptratice care sunt ptrate perfecte i sunt mai mici sau egale
cu un numr natural n dat;
21. generarea primelor n perechi de numere pitagoreice;
22. generarea termenilor irului Fibonacci mai mici dect un numr natural dat;
23. generarea primilor n termeni ai irului Fibonacci;
24. scrierea unui numr natural n sub Iorm de sum de numere Fibonacci.

4.10. Probleme propuse

4.10.1. Divizori
S se scrie un program care determin cel mai mic numr care are exact k divizori,
unde k este un numr natural dat.

Date de intrare
Numrul natural k se citete din Iiierul de intrare NUMAR.IN.

92 4. Numere speciale

Date de ieyire
Primul numr natural avnd exact k divizori se va scrie n Iiierul NUMAR.OUT.

Restricii yi precizri
- 2 s k s 100

Exemplu
NUMAR.IN

NUMAR.OUT

Timp maxim de execuie: 2 secunde

4.10.2. Numere perfecte
S se genereze toate numerele perIecte posibile de reprezentat cu un numr de tip n-
treg pe dou cuvinte. Implementai algoritmul sugerat de Euclia pentru obinerea nu-
merelor perIecte.

Date de ieyire
Numerele perIecte mai mici dect cel mai mare numr ntreg posibil de reprezentat se
vor scrie n Iiierul PERFECT.OUT.

4.10.3. Numere prietene
S se genereze perechi de numere prietene, posibile de reprezentat cu numere de tip
ntreg pe dou cuvinte. Implementai algoritmul lui Tabit.

Date de ieyire
Perechile de numere prietene se vor scrie pe cte o linie a Iiierului PRIETENE.OUT.

4.10.4. Numere triangulare
Se consider mai multe numere naturale scrise ntr-un Iiier. S se copieze ntr-un alt
Iiier toate numerele triangulare i ntr-un al treilea acelea care nu sunt triangulare.

Date de intrare
Numerele naturale se vor citi de pe prima linie a Iiierului TRI.IN.

Date de ieyire
Numerele citite din Iiierul de intrare care sunt triangulare se vor scrie pe prima linie a
Iiierului TRI.OUT (desprite prin cte un spaiu), iar cele care nu sunt triangulare se
vor scrie pe prima linie a Iiierului REST.OUT.

4. Numere speciale 93

Restricii yi precizri
- 1 s orice numr aat s 1000000000;
- dup ultimul numr existent n Iiier urmeaz imediat marcajul de sIrit de Iiier.

Exemplu
TRI.IN

TRI.OUT

REST.OUT


4.10.5. Aplicaie la numerele triangulare
Se consider irul de numere: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, .
S se calculeze valoarea celui de-al k-lea element din ir (k numr natural dat) Ir
s se genereze irul de elemente.

Date de intrare
Numrul natural k se citete din Iiierul de intrare SIR.IN.

Date de ieyire
Valoarea corespunztoare celui de-al k-lea element din ir se va scrie n Iiierul de
ieire SIR.OUT.

Restricii yi precizri
- 1 s k s 1000000000.

Exemplu
SIR.IN

SIR.OUT


4.10.6. Alte numere speciale
Notm cu
c
k
n (k 1, 2, ..., 9, c e 2, 3, ..., 9}) numerele naturale Iormate din c ciIre
identice i egale cu k. Notm suma ciIrelor: s
k
c k. Se tie c exist mai multe nu-
mere nr, astIel nct se poate gsi o valoare c pentru care:
s
k
nr
c
k
n , k 1, 2, ..., 9.
S se scrie un program care determin toate perechile (nr, c) avnd proprietatea de-
scris.

Date de ieyire
Pe Iiecare linie a Iiierului de ieire NUMAR.OUT se vor scrie dou numere naturale, se-
parate printr-un spaiu, reprezentnd numrul nr i numrul c de ciIre identice pentru
care proprietatea cerut este adevrat.
94 4. Numere speciale

4.10.7. Prim
Stabilii dac un numr dat este prim sau nu!

Date de intrare
n Iiierul de intrare PRIM.IN este scris un singur numr natural.

Date de ieyire
Dac numrul citit din Iiierul de intrare este prim, n Iiierul de ieire PRIM.OUT se
va scrie '$, altIel se va scrie 18.

Exemplu
PRIM.IN

PRIM.OUT
'$

4.11. Soluiile problemelor propuse

4.11.1. Divizori
Pentru a analiza modul de rezolvare a acestei probleme, vom proiecta algoritmul pen-
tru un exemplu. Fie k 4. Vom determina divizorii numerelor naturale, ncepnd cu 2,
i terminnd n momentul n care am gsit primul numr care are exact k divizori.

Exemplu
4 are 3 divizori (1, 2 i 4);
5 are 2 divizori (1, 5);
6 are 4 divizori (1, 2, 3 i 6), deci ne oprim. Numrul cutat este 6.

Analiznd exemplul dat, aa pare c divizorii sunt numere prime, dar trebuie s Iim
ateni. De exemplu, numrul 840 are 32 de divizori: 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15,
20, 21, 24, 30, 35, ..., deci printre divizori avem numere prime i puteri ale lor, respec-
tiv produse de dou sau mai multe numere prime.

n descrierea urmtorului algoritm notm cu nr numrul natural curent, cu aivi:or
valoarea cu care eIectum mprirea i cu nra numrul divizorilor lui nr. Acest algo-
ritm genereaz numere naturale i, ncepnd cu numrul 2, determin toi divizorii
acestora, numrndu-le. Generarea numerelor se oprete n momentul n care s-a gsit
primul numr avnd k divizori. Dac ns nu suntem ateni i nu cutm posibiliti de
optimizare, programul nostru va rula pentru k 100 mult mai mult timp dect permite
restricia privind timpul de execuie.
4. Numere speciale 95

n concluzie, vom cuta divizori pn la rdcina ptrat a numrului, deoarece,
chiar dac exist divizori mai mari dect aceast valoare, acetia sunt egali cu ctul
mpririi ntregi ai unui divizor mai mic dect rdcina ptrat. n concluzie, pentru
Iiecare divizor gsit mrim contorul divizorilor cu 2 (odat pentru divizorul GLYL]RU
i nc odat pentru divizorul >QUGLYL]RU@). S observm c dac numrul este p-
trat perIect, divizorul GLYL]RU este egal cu divizorul >QUGLYL]RU@, deci n cazul
numerelor care sunt ptrate perIecte, n Iinal vom micora cu 1 numrul divizorilor
contorizai.

Algoritm 'LYL]RUL
citeteN
QU
repet
QUQU aac k 2, atunci cel mai mic numr cu 2 aivi:ori este 2 }
QUBG orice numr are aoi aivi:ori proprii }
pentruGLYL]RUparte intreag ain racina ptrat a lui Qexecut
dacUHVW>QUGLYL]RU@atunci
QUBGQUBG numrm aivi:orii lui nr }
sfrit dac
sfrit pentru
dacQU este ptrat perfect atunci
QUBGQUBG
pn cndQUBGN pan cana obinem k aivi:ori }
scrieQU
sfrit algoritm

4.11.2. Numere perfecte


n enunul problemei ni se cere s generm toate numerele perIecte mai mici dect un
numr dat n. Dup cum s-a sugerat n enun, vom Iolosi condiia necesar enunat de
ctre Euclia, prezentat anterior.
Condiia spune c dac numrul 2
m
1 este prim, atunci numrul 2
m 1
(2
m
1) este
perIect.
AstIel, cel mai simplu procedeu este de a da pe rnd valori lui m i, n cazul n care
numrul 2
m
1 este prim, de a aIia numrul perIect 2
m 1
(2
m
1).

Algoritm*HQHUDUHB1XPHUHB3HUIHFWH
citeteQ
DFWXDO prima putere a lui 2 }
repet
DFWXDODFWXDO 2 la puterea m }
SULPaaevrat verificm aac DFWXDO este prim }
96 4. Numere speciale

pentruGLYL]RUparte intreag ain racina ptrat a lui DFWXDO
execut
dacUHVW>DFWXDOGLYL]RU@atunci
SULPfals
ieire forat ain pentru
sfrit dac
sfrit pentru
dacSULPatunci
GHSLUHfals ne ferim ae o inmulire care ar provoca aepire }
dac calcularea valorii >DFWXDO@DFWXDO ar proauce aepire
atunci
GHSLUHaaevrat
altfel
scrie>DFWXDO@DFWXDO
sfrit dac
pn cndGHSLUH
sfrit algoritm

4.11.3. Numere prietene
Ni se cere implementarea unui algoritm descris i exempliIicat. Acest algoritm gene-
reaz unele perechi de numere prietene conIorm unui model descris de Tabit.

n algoritm am notat cele dou numere din perechea curent cu a i cu b (multipli
lui 6) i cu proa produsul lor. Variabilele logice prima, primb i primproa pstreaz
valoarea de adevr privind primalitatea numerelor a 1, b 1 i proa 1. Cu coef s-a
notat valoarea curent a multiplilor lui 4 prin nmulire cu 2. Descrierea algoritmului
n pseudocod este urmtorul:

Algoritm*HQHUDUHB3HUHFKLB'HB1XPHUHB3ULHWHQH
FRHI valoare iniial pentru aublii lui 4, ii vom obine prin inmulire cu 2 }
D primul numr ain prima pereche }
SULPDaaevrat valoare iniial necesar la primul pas }
GHSLUHfals
repet
primul numr in perechea curent este al aoilea numr ain perechea preceaent }
ED
DE al aoilea numr in perechea curent este aublul preceaentului }
primalitatea celui ae-al aoilea numr ain perechea preceaent }
SULPESULPD
dacDE ar proauce aepire atunci ne ferim ae o posibil aepire }
GHSLUHaaevrat
4. Numere speciale 97

altfel
SURGDE efectum proausul, aeoarece nu vom avea aepire }
sfrit dac
SULPDaaevrat ne pregtim s stabilim primalitatea lui a }
SULPSURGaaevrat i a lui proa }
GLYL]RU
ct timpSULPDi GLYL]RU s racina ptrat a lui SURG execut
dacUHVW>DGLYL]RU@atunci
SULPDfals
sfrit dac
dacUHVW>SURGGLYL]RU@atunci
SULPSURGfals
sfrit dac
GLYL]RUGLYL]RU
sfrit ct timp
FRHIFRHI pregtim urmtorul multiplu al lui 4 prin aublare }
dac a 1, b 1 (perechea) i proa 1 sunt numere prime }
dacSULPDiSULPEiSULPSURGatunci
scrieDEFRHISURGFRHI
pn cndGHSLUH
sfrit algoritm

4.11.4. Numere triangulare


Cerina la aceast problem este s se elimine numerele triangulare dintr-un ir de nu-
mere date. Reamintim c un numr se numete triangular dac se poate obine prin n-
sumarea unui numr de numere naturale consecutive, ncepnd cu numrul 1.
Algoritmul de rezolvare prezentat n continuare veriIic pe rnd dac numerele din
Iiier sunt triangulare, scriind n Iiierul rezultat acele numere care nu veriIic aceast
proprietate.

Algoritm7ULDQJXODUH
ct timp nu urmea: marca ae sfarit ae fiier execut:
citete[
VXPD verificm aac x este triangular }
Q primul numr natural in sum }
repet
VXPD VXPDQ
Q Q crete valoarea termenului }
pn cnd[sVXPD
dac[=VXPDatunci
scrie[ aac x nu este triangular, il copiem in REST.OUT }
98 4. Numere speciale

altfel
scrie[ aac x este triangular, il copiem in TRI.OUT }
sfrit dac
sfrit ct timp
sfrit algoritm

4.11.5. Aplicaie la numerele triangulare
Pentru a nelege mai bine aceast problem, se urmrim n tabelul de mai jos modul
de construire a irului dat.

k 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .
Elementele irului 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 .
Numr triangular 3 1 2 3
Numr triangular 6 1 2 3 6
Numr triangular 10 1 2 3 4 10
...
3 6 10 15 ...

Studiind tabelul de mai sus putem trage cteva concluzii:
- Observm c pentru un numr de ordine k valoarea elementului poate Ii determi-
nat prin calcularea numrului triangular cel mai apropiat ae k.
- Valoarea cutat va Ii egal cu ultimul numr natural pe care l-am adugat num-
rului triangular.

Aplicnd observaiile de mai sus algoritmul este urmtorul (v recomandm s rea-
lizai o rezolvare a acestei probleme Iolosind suma primelor n numere naturale).

Algoritm3UREOHPD
citeteN
L
75,
ct timp75,Nexecut
LL
75,75,L
sfrit ct timp
scrieL
sfrit algoritm
4. Numere speciale 99

4.11.6. Alte numere speciale
Un exemplu de numr care ndeplinete aceast proprietate este 37:
(1 1 1) 37 111
(2 2 2) 37 222
(3 3 3) 37 333
(4 4 4) 37 444
(5 5 5) 37 555
(6 6 6) 37 666
(7 7 7) 37 777
(8 8 8) 37 888
(9 9 9) 37 999

Algoritmul sugerat va cuta pentru Iiecare lungime c de la 2 la 9 numrul care n-
deplinete proprietatea cerut pentru orice numr avnd ciIre identice pe lungimea c.
Secretul const n a observa c numrul cutat este de Iapt un cat comun n cazul celor
9 numere mprite la rndul lor la suma ciIrelor corespunztoare.
Am notat variabilele avnd semniIicaiile din enun, vechi reprezint valoarea nr,
obinut la pasul precedent.

Algoritm6SHFLDOH
pentruFexecut numere de lungimi cuprinse ntre 2 i 9 }
RNaaevrat
N
ct timpNsiRNexecut construim numrul ain c cifre }
QXPU
pentruLFexecut construim numrul ain c cifre }
QXPUQXPUN
sfrit pentru
VFN
dacUHVW>QXPUV@atunci
numrul cutat trebuie s fie catul intreg aintre numrul format }
QU>QXPUV@ ain c cifre iaentice i suma celor c cifre }
dacN!atunci aac k 1, inc nu avem vechi }
dacQUYHFKLatunci
RNaaevrat aac am obinut acelai numr, vom continua }
altfel
RNfals
sfrit dac
sfrit dac
YHFKLQU
NN
100 4. Numere speciale

altfel
RNfals
sfrit dac
dacRNatunci
scrieQUF
sfrit dac
sfrit ct timp
sfrit pentru
sfrit algoritm

4.11.7. Prim
ntr-o prim abordare, pornim de la deIiniia numrului prim (un numr prim are exact
doi divizori: 1 i el nsui). n concluzie, vom veriIica dac numrul dat are vreun divi-
zor printre numerele 2, 3, ..., n 1.

Algoritm3ULP
citeteQU numrul ae verificat}
GLYL] primul aivi:or aiferit ae 1 }
ct timpGLYL]sQUiUHVW>QUGLYL]@=execut:
GLYL]GLYL]
sfrit ct timp
dacGLYL]!QUatunci aac nu am gsit nici un aivi:or mai mic aecat }
SULPaaevrat QU numrul este prim, in ca: contrar nu este }
altfel
SULPfals
sfrit dac
afiare
sfrit algoritm

Algoritmul poate Ii mbuntit considerabil dac tratm separat cazul acelor nume-
re care nu necesit nici o mprire pentru stabilirea proprietii. Acestea sunt numrul
1 i numerele pare. n rest, proprietatea de divizibilitate o vom veriIica doar cu numere
impare, tiind c un numr impar nu poate avea nici un divizor par. n plus, nu vom
genera divizori mai mari dect rdcina ptrat a numrului, deoarece divizorii mai
mari au Iost ,gsii, dac exist, sub Iorma unui ct al mpririi numrului cu un di-
vizor mai mic.

Algoritm3ULP
citeteQU
dacQUatunci
SULPfals 1 nu este prim }

4. Numere speciale 101



altfel
dac QUeste numr paratunci numere pare }
SULPQU singurul numr par prim este 2 }
altfel numere impare }
GLYL] primul aivi:or posibil al unui numr impar }
UDGparte intreag ain racina ptrat a lui QU
calculm raaicalul o singur aat in afara structurii repetitive }
SULPaaevrat presupunem c numrul este prim }
ct timpGLYL]sUDGiSULPexecut:
dacUHVW>QUGLYL]@atunci
SULPfals am gsit un aivi:or, aeci nr nu este prim }
altfel
GLYL]GLYL]
un numr impar se poate aiviae aoar cu numere impare }
sfrit dac
sfrit ct timp
sfrit dac
sfrit dac
afiare
sfrit algoritm





Conversii

Sisteme de numeraie
Conversii ntre dou baze de numeraie
Operaii cu numere naturale n diverse baze de
numeraie
Criterii de divizibilitate n diverse baze de numeraie
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
5



5.1. Sisteme de numeraie
Prin sistem de numeraie nelegem ansamblul regulilor de grupare a elementelor unei
mulimi Iinite cu scopul numrrii lor i a regulilor de reprezentare simbolic a num-
rului obinut.
Simbolurile (semnele graIice) cu ajutorul crora se reprezint numerele se numesc
cifre.
n Iuncie de modul de grupare i de ordonare a semnelor care se Iolosesc pentru
reprezentarea simbolic a numerelor, deosebim sistemele aditive de sistemele poziio-
nale.
Printre sistemele de numeraie aaitive se numr sistemul de numeraie egiptean i
sistemul de numeraie roman.
Sistemul de numeraie roman Iolosete apte semne distincte, numite cifre romane.

I V X L C D M
1 5 10 50 100 500 1000

Dintre cele apte, ciIrele I, X, C i M nu se pot repeta (scriind alturat) de mai mult
de trei ori n descrierea unui numr.
Iniial sistemul de Iormare a numerelor romane era bazat strict pe adunare. CiIrele
unui numr se aezau n ordine descresctoare a valorilor, iar valoarea numrului se
calcula prin nsumarea tuturor valorilor ciIrelor.

Exemplu
MDXXI 1000 500 10 10 1 1521
5. Conversii 103

AstIel, unele numere aveau o reprezentare Ioarte lung i pentru a le scurta, s-a in-
trodus varianta de reprezentare prin diIeren. Dac una din ciIrele I, X sau C se aIl
naintea unei ciIre cu valoare mai mare, atunci valoarea ciIrei respective va Ii sczut
din valoarea ciIrei mai mari.

Exemple
IV 5 1 4; IX 10 1 9; XL 50 10 40

Aceste Iorme de reprezentare sunt supuse ctorva restricii, care asigur unicitatea
reprezentrii unui numr. De exemplu:
1. CiIrele I, X, C sau M nu se pot repeta pe mai mult de trei poziii consecutive;
2. CiIrele V, L i D nu se pot repeta;
3. Numai ciIrele I, X, i C pot Ii sczute;
4. Numai valoarea unei singure ciIre poate Ii sczut (de exemplu numrul IIIV nu
exist);
5. CiIra sczut trebuie s aib o valoare de cel puin o zecime din ciIra din care se
scade (de exemplu numrul ID nu exist).

Cel mai mare numr pe care l putem reprezenta, Iolosind aceste simboluri i res-
pectnd regulile de mai sus este: MMMCMXCIX 3999. Datorit Iaptului c numerele
romane sunt Ioarte lungi, operaiile cu numere astIel reprezentate se eIectueaz greoi.
Observm c o ciIr din cadrul unui astIel de numr are aceeai valoare absolut
inaiferent ae po:iia pe care o ocup.

Cel mai rspndit sistem de numeraie n zilele noastre este sistemul zecimal care
utilizeaz zece simboluri: 0,1, 2, 3, 4, 5, 6, 7, 8, 9, numite cifre arabe.
Numrul simbolurilor reprezint ba:a sistemului ae numeraie.
Sistemul zecimal este un sistem ae numeraie po:iional, adic po:iia unei ciIre n
numr indic rangul acesteia. Valoarea rangului precizeaz cu ce putere a lui 10 se va
nmuli ciIra pentru a determina valoarea numrului.
Pentru a nu se produce conIuzii ntre dou numere scrise n sisteme de numeraie
poziionale diIerite, s-a convenit ca Iiecrui numr s i se ataeze un indice corespun-
ztor bazei de numeraie n care este scris.

Exemplu
273
10
2 10
2

7 10
1

3 10
0
(se va citi: dou sute apte zeci i trei)

Orice numr natural n poate Ii scris n sistemul zecimal n mod unic n Iorma:
n a
n
a
n 1
.a
0
, unde a
i
(i 1, 2, ..., n) sunt ciIre din mulimea 0, 1, 2, ., 9}, iar
valoarea lui n este dat de suma: a
n
10
n
a
n 1
10
n 1
. 10
0
a
0
.

104 5. Conversii

Pentru a deIini un sistem de numeraie se descrie mulimea de simboluri Iolosit n
reprezentare, regulile de grupare a simbolurilor n numr i se prezint operaiile deIi-
nite pe mulimea numerelor reprezentate n sistemul de numeraie respectiv.

n sistemul de numeraie zecimal, pentru a numra obiectele, acestea se grupeaz
cte 10. Numrul grupurilor reprezint de cte ori se cuprinde 10 n numr. Acestea,
grupate din nou cte zece ne dau numrul sutelor etc. n mod similar, ntr-un sistem
poziional avnd baza b, obiectele se vor grupa cte b. Regulile de reprezentare a unui
numr n orice sistem de numeraie poziional sunt similare regulilor care Iuncionea-
z n sistemul zecimal.

Sistemul de numeraie binar este caracterizat de:
- Baza sistemului de numeraie este 2.
- Mulimea de simboluri care st la baza sistemului este 0, 1}.

De exemplu, numrul 1110
2
reprezint valoarea 1 2
3
1 2
2
1 2
1
0 2
0
13
10
.

Sistemul de numeraie octal are urmtoarele caracteristici:
- Baza sistemului este 8.
- Mulimea de simboluri care st la baza sistemului este 0, 1, 2, 3, 4, 5, 6, 7}.

De exemplu, numrul 2673
8
reprezint valoarea 2 8
3
6 8
2
7 8
1
3 8
0

1467
10
.

Un alt sistem de numeraie Irecvent utilizat n lumea calculatoarelor este sistemul
de numeraie hexazecimal. Caracteristicile acestuia sunt:
- Baza sistemului este 16.
- Valorile cu care lucreaz acest sistem de numeraie sunt numerele de la 0 la 15. De-
oarece numerele mai mari dect 9 sunt combinaii de simboluri (spre exemplu 10
se Iormeaz din 1 i din 0) ele nu pot Ii utilizate la rndul lor ca simboluri. Exist
ns o convenie prin care se Iolosete litera A pentru valoarea 10, litera B pentru
valoarea 11 i aa mai departe. n aceste condiii simbolurile care stau la baza aces-
tui sistem de numeraie sunt 0, 1, ..., 9, A, B, C, D, E i F.

5. Conversii 105

5.2. Conversii ntre dou baze de numeraie

5.2.1. Conversia unui numr dintr-o baz dat n baza 10

A. Algoritm de conversie pentru numere ntregi
EIectund calculele cerute de descompunerea dup puterile bazei, putem obine n ca-
zul oricrui sistem de numeraie valoare numrului dat n baza 10.

Exemplu
2673
8
2 8
3
6 8
2
7 8
1
3 8
0

2 512 6 64 7 8 3 1
1024 384 56 3
1467
10

Tragem concluzia c pentru a obine reprezentarea n baza 10 a unui numr natural
reprezentat ntr-o baz b, trebuie s descompunem numrul dup puterile bazei i s
eIectum calculele n baza 10.

B. Algoritm de conversie pentru partea fracionar a unui numr
Pentru a converti un numr Iracionar dintr-o baz b n baza 10 aplicm acelai algo-
ritm ca i pentru partea ntreag: dezvoltm numrul ciIr cu ciIr dup puterile bazei
i apoi eIectum calculele n baza 10.

Exemplu
0,24
5
5 5
2 1
1
4
1
2 + = 0,56
10


5.2.2. Conversia din baza 10 ntr-o alt baz de numeraie

A. Algoritm de conversie pentru numere ntregi
Conversia unui numr natural reprezentat n baza 10 ntr-o alt baz de numeraie b se
Iace prin mpriri succesive la b, valoarea numrului Iiind nlocuit la Iiecare pas prin
ctul mpririi. Resturile scrise n ordine invers reprezint ciIrele numrului cutat.

Exemplu
1467 8 183 3
183 8 22 7
22 8 2 6
2 8 0 2
deci 1467
10
2673
8
106 5. Conversii

B. Algoritm de conversie pentru partea fracionar a unui numr
Conversia unui numr Iracionar reprezentat n baza 10 ntr-o baz b se Iace prin n-
muliri succesive cu b. La Iiecare pas, partea ntreag a rezultatului nmulirii ne d c-
te o ciIr din rezultat, nmulirea continund cu partea Iracionar a rezultatului. Algo-
ritmul va avea atia pai cte ciIre zecimale dorim s determinm.

Exemplu
Vom converti numrul 0,23
10
din baza 10 n baza 5, cu trei zecimale.

Numr n baza 10 Calcul Produs Nu mr n baza 5
0,23
10
0,23
10
5 1,15
0,15
10
0,15
10
5 0,75
0,75
10
0,75
10
5 3,75 0,103
5


5.2.3. Algoritm de conversie din baza 2 ntr-o baz de forma 2
k
yi invers
Pentru a arta corespondena dintre numerele scrise n sistemul binar i simbolurile
sistemelor de numeraie cu baza 2
k
, prezentm urmtorul tabel:

k 1 k 2 k 3 k 4 valoare
zecimal baza 2 baza 4 baza 8 baza 16
0 0 0 0 0
1 1 1 1 1
2 10 2 2 2
3 11 3 3 3
4 100 10 4 4
5 101 11 5 5
6 110 12 6 6
7 111 13 7 7
8 1000 20 10 8
9 1001 21 11 9
10 1010 22 12 A
11 1011 23 13 B
12 1100 30 14 C
13 1101 31 15 D
14 1110 32 16 E
15 1111 33 17 F


5. Conversii 107

A. Algoritm de conversie din baza 2 n baza 2
k

Pentru a converti, de exemplu, numrul 10111,01
2
n baza 8 ( 2
3
), se completeaz nu-
mrul cu 0-uri nesemniIicative n stnga i n dreapta pn cnd avem grupuri comple-
te de cte trei ciIre. Grupurile de ciIre se Iormeaz pornind de la virgula zecimal spre
stnga, respectiv spre dreapta. Numrul devine 010 111 , 010. La pasul urmtor nlo-
cuim Iiecare grup de cte trei ciIre binare cu simbolul bazei 8 corespunztoare grupu-
lui (vezi valorile din tabel) i obinem numrul convertit n baza 8 ca Iiind 27,2
8
.

Ceneralizare
Pentru a converti un numr scris n baza 2 ntr-o baz de numeraie de Iorma 2
k
se
completeaz numrul cu ciIre 0, astIel nct att numrul de ciIre al prii ntregi, ct i
numrul de ciIre al prii Iracionare s Iie multiplu de k, apoi aceste grupuri de cte k
ciIre binare se nlocuiesc cu simbolul corespunztor din tabelul de codiIicare.

B. Algoritm de conversie din baza 2
k
n baza 2
Pentru a converti un numr reprezentat n baza 2
k
n reprezentarea corespunztoare
bazei 2, se eIectueaz o simpl nlocuire a simbolurilor bazei 2
k
cu grupul de k ciIre
binare care corespunde simbolului conIorm tabelului prezentat. Atunci cnd n tabel
nu sunt trecute k ciIre binare, reprezentarea se va completa cu 0-uri n Ia pn la ob-
inerea a exact k ciIre. n Iinal 0-urile nesemniIicative vor Ii ignorate.

Exemplu
4A5,8
16
0100 1010 0101,1000
2
10010100101,1
2


4 A 5 8
Observaie
Un numr dat n baza b
1
poate Ii convertit direct n baza b
2
(ambele baze Iiind diIe-
rite de baza 10) Ir a se intermedia trecerea prin baza de numeraie 10. Algoritmul es-
te acelai ca n cazul conversiei n baza 10, cu deosebirea c toate calculele se vor
eIectua n baza b
2
.

5.3. Operaii cu numere naturale n diverse baze de
numeraie

5.3.1. Adunarea
Pentru a aduna dou numere naturale scrise ntr-o baz de numeraie b, vom aduna ci-
Irele de acelai rang, de la dreapta la stnga. Dac numrul rezultat din adunarea a
dou ciIre se reprezint cu o singur ciIr, atunci am obinut ciIra rezultat. Dac rezul-
tatul adunrii este Iormat din dou simboluri, atunci restul mpririi la b este ciIra re-
zultat i vom avea ciIr de transport (n cazul a dou numere aceasta este egal cu 1).
108 5. Conversii

Exemplu
2367
8
Adunm ciIrele de rang 0: 7
8
7
8
7
10
7
10
14
10
1 8
10
6
10
16
8
3707
8
CiIra 6 este ciIra de rang 0 n rezultat, 1 este ciIr de transport.
6276
8
Adunm ciIrele de rang 1: 6
8
0
8
1
8
7
10
7
8

CiIra 7 este ciIra de rang 1 n rezultat, nu avem ciIr de transport.


Adunm ciIrele de rang 2: 3
8
7
8
10
10
1 8 2 12
8
CiIra 2 este ciIra de rang 1 n rezultat, 1 este ciIr de transport.
Adunm ciIrele de rang 3: 2
8
3
8
1
8
6
10
6
8

CiIra 6 este ciIra de rang 3 n rezultat, nu avem ciIr de transport.


5.3.2. Scderea
Operaia de scdere se eIectueaz asemntor scderii n baza 10, cu deosebirea c
unitatea mprumutat va conine b subuniti i nu 10.

Exemplu
6276
8
Calculm ciIra de rang 0: ca s putem eIectua 6 7, mprumutm 1 din
2367
8
ciIra de rang 1, obinem 8 6 7 7
8

3707
8
Calculm ciIra de rang 1: (7 1) 6 0
Calculm ciIra de rang 2: ca s putem eIectua 2 3, mprumutm 1 din
ciIra de rang 3, obinem 8 2 3 7
8
Calculm ciIra de rang 3: (6 1) 2 3
8

5.3.3. nmulirea
nmulirea a dou numere scrise ntr-o baz de numeraie b se eIectueaz asemntor
nmulirii n baza 10, dar se va ine cont de tabla adunrii i nmulirii n baza b.

Exemplu
Tabla nmulirii n baza 4 se completeaz eIectund calculele n baza 4. De exem-
plu, 3
4
3
4
3
10
3
10
9
10
21
4
.
0 1 2 3
0 0 0 0 0
1 0 1 2 3
2 0 2 10 12
3 0 3 12 21
Vom calcula 103
4
13
4
:
103
4
13
4
Calculm ciIra de rang 0: 3
4
3
4
9
10
21
4
, scriem 1, transport 2
321 Calculm ciIra de rang 1: 3
4
0
4
2
4
2
4
, scriem 2, transport 0
103

Calculm ciIra de rang 2: 3
4
* 1
4
0 3
4
, scriem 3, transport 0
2011
4
103
4
1 103
4
; adunnd 321
4
cu 1030
4
, obinem 2011
4
.
5. Conversii 109

5.3.4. mprirea
Pentru eIectuarea mpririi a dou numere scrise n baza b, vom utiliza aceleai reguli
din sistemul zecimal, innd cont de tabla nmulirii i tabla adunrii n baza b.

Exemplu
2011
4
: 13
4
103
4
13
4
se cuprinde n 20
4
de 1 ori.
13 20
4
13
4
1
4

11 se coboar urmtoarea ciIr: 13 n 11 se cuprinde de 0 ori.
00 se mai coboar o ciIr: 13 n 111 se cuprinde de 3 ori
111 3
4
13
4
111
4
111


5.4. Criterii de divizibilitate n diverse baze de
numeraie
Considerm ca Iiind important cunoaterea i utilizarea criteriilor de divizibilitate n
pregtirea elevilor pentru concursurile colare de programare, motiv pentru care am
inclus aceast prezentare. Rezultatele au Iost preluate (Ir demonstraiile aIerente) din
lucrarea Sisteme de numeraie, autor Ilie Diaconu, Editura Studium, 1996. Cei care
doresc s aproIundeze aceast tem pot consulta bibliograIia de specialitate.
n cele ce urmeaz notm cu b o baz de numeraie oarecare.

5.4.1. Divizibilitatea cu numrul b - 1
Un numr natural scris n baza b se divide cu b 1 dac i numai dac suma ciIrelor
sale este un numr multiplu de b 1.

5.4.2. Divizibilitatea cu b + 1
Un numr natural scris n baza b se divide cu b 1 dac i numai dac diIerena dintre
suma ciIrelor de ordin impar i suma ciIrelor de ordin par este multiplu de b 1.

5.4.3. Divizibilitatea cu b n baze de forma b k + 1
Un numr natural scris n baza b k 1 se divide cu b dac i numai dac suma ciIre-
lor sale este un numr multiplu de b.

5.4.4. Divizibilitatea cu b n baze de forma b k - 1
Un numr natural scris n baza b k 1 se divide cu b dac i numai dac diIerena
dintre suma ciIrelor de ordin impar i suma ciIrelor de ordin par este multiplu de b.
110 5. Conversii

5.4.5. Divizibilitatea cu b, b
2
, b
3
,., n baza b
Un numr natural scris n baza b se divide cu b, b
2
, b
3
,. dac i numai dac numrul
se termin cu 0, doi de 0, ..

5.4.6. Divizibilitatea cu b n baze de forma b k
Un numr natural scris n baza b k se divide cu b dac i numai dac ultima ciIr a
numrului este un multiplu de b.

5.4.7. Divizibilitatea cu b k - 1 sau b k + 1 n baza b
Un numr natural scris n sistemul de numeraie avnd baza b se divide cu b k 1 /
b k 1 dac i numai dac suprimndu-i ultima ciIr i scznd, respectiv adunnd
de k ori ciIra suprimat se obine un numr divizibil cu b k 1, respectiv b k 1.

5.4.8. Criteriul de divizibilitate cu 2 n diverse baze de
numeraie
Un numr natural este divizibil cu 2 n baza de numeraie:
a) b 2k dac i numai dac ultima sa ciIr este multiplu de 2;
b) b 2k 1 dac i numai dac suma ciIrelor sale este multiplu de 2.

5.4.9. Criteriul de divizibilitate cu 3 n diverse baze de
numeraie
Un numr natural este divizibil cu 3 n baza de numeraie:
a) b 3k dac i numai dac ultima sa ciIr este multiplu de 3
b) b 3k 1 dac i numai dac suma ciIrelor sale este multiplu de 3;
c) b 3k 1 dac i numai dac diIerena dintre suma ciIrelor de ordin impar i suma
ciIrelor de ordin par este multiplu de 3

5.4.10. Criteriul de divizibilitate cu 4 n diverse baze de
numeraie
Un numr natural este divizibil cu 4 n baza de numeraie:
a) b 4k dac i numai dac ultima sa ciIr este multiplu de 4;
b) b 4k 1 dac i numai dac suma ciIrelor sale este multiplu de 4;
c) b 4k 2 dac i numai dac suma dintre dublul penultimei ciIre i ultima ciIr
este multiplu de 4;
d) b 4k 1 dac i numai dac diIerena dintre suma ciIrelor de ordin impar i suma
ciIrelor de ordin par este multiplu de 4; (ciIrele se consider numrate de la dreapta la
stnga).
5. Conversii 111

5.4.11. Criteriul de divizibilitate cu 5 n diverse baze de
numeraie
Numrul natural n a
n
a
n-1
.a
1
a
0
,

scris n baza b se divide cu 5 n sistemele de nume-
raie cu baza:
1. b 5k, k e N
*
, dac i numai dac ultima ciIr se divide cu 5;
2. b 5k 1, k e N
*
, dac i numai dac suma tuturor ciIrelor se divide cu 5;
3. b 5k 2, k e N
*
, dac i numai dac (a
0
a
2
a
4
.) 2(a
1
a
3
a
5
.) se
divide cu 5;
4. b 5k 3, k e N
*
, dac i numai dac (a
0
a
2
a
4
.) 3(a
1
a
3
a
5
.) se
divide cu 5;
5. b 5k 4, k e N
*
, dac i numai dac (a
0
a
2
a
4
.) (a
1
a
3
a
5
.) se
divide cu 5.

5.5. Implementri sugerate
Pentru a v Iamiliariza cu modul n care se rezolv problemele n care intervin imple-
mentri ale conversiilor, v sugerm s ncercai s realizai algoritmi pentru:
1. conversie din baza 10 n baza 2;
2. conversie din baza 2 n baza 10;
3. conversie din baza 2 n baza 8 (16);
4. conversie din baza 8 i 16
*)
n baza 2;
5. conversie din baza 10 n baza b 10;
6. conversie din baza b 10 n baza 10;
7. conversie din baza a 10 n baza b 10;
8. conversie din baza 16 n baza 10
*)
;
9. conversie din baza 10 n baza 16
*)
;
10. conversie din baza a 36 n baza b 36
*)
;
11. conversie din baza 10 n baza b (orict de mare)
*)
;
12. conversie din baza b (orict de mare) n baza 10
*)
;
13. conversie din baza a (orict de mare) n baza b (orict de mare)
*)
.

*)
Se pot amna dup nvarea prelucrrii irurilor de caractere.
112 5. Conversii

5.6. Probleme propuse

5.6.1. Conversie
S se converteasc un numr natural n, scris ntr-o baz de numeraie b
1
, ntr-o alt ba-
z de numeraie b
2
. nainte de a se eIectua conversia, se va veriIica dac numrul dat
este corect scris (n scrierea lui s-au Iolosit ciIre permise de baza de numeraie n care
se presupune c a Iost scris).

Date de intrare
Cele dou baze de numeraie b
1
i b
2
se citesc de pe prima linie a Iiierului de intrare
CONV.IN. Pe linia urmtoare se aIl numrul natural care trebuie convertit.

Date de ieyire
Numrul convertit se va scrie n Iiierul CONV.OUT. n cazul n care numrul nu este
corect scris, n Iiierul de ieire se va scrie mesajul QXPDULQFRUHFW.

Restricii yi precizri
- numerele vor avea cel mult 9 ciIre n ambele baze b
1
i b
2

- 2 s b
1
, b
2
s 10.

Exemple
CONV.IN


CONV.OUT


CONV.IN


CONV.OUT
QXPDULQFRUHFW

5.6.2. Operaii ntr-o baz de numeraie dat
S se eIectueze operaia de adunare sau de scdere (conIorm cerinei din Iiierul de in-
trare) a dou numere naturale date, reprezentate ntr-o baz de numeraie dat b, Ir
s se eIectueze conversii n baza 10.

Date de intrare
Pe prima linie a Iiierului de intrare OPER.IN se aIl un numr natural b, reprezentnd
baza de numeraie n care se va eIectua operaia. Pe urmtoarele linii ale aceluiai Ii-
ier se aIl primul numr, apoi operatorul sau , iar pe ultima linie se aIl cel de-al
doilea numr.

5. Conversii 113

Date de ieyire
Rezultatul operaiei se va scrie n Iiierul OPER.OUT.

Restricii yi precizri
- 1 s numr
1
, numr
2
s 100000000
b
;
- numr
1
> numr
2
;
- 2 s b s 10.

Exemplu
OPER.IN


OPER.OUT


5.6.3. Criterii de divizibilitate ntr-o baz de numeraie dat
Se consider o baz de numeraie b i un numr natural scris n aceast baz. S se ve-
riIice dac numrul dat este divizibil cu 2, 3, 4 i 5, utiliznd criterii de divizibilitate.

Date de intrare
Pe prima linie a Iiierului de intrare NR.IN se aIl un numr natural b, reprezentnd
baza de numeraie. Pe linia urmtoare se aIl numrul care urmeaz s Iie analizat.

Date de ieyire
n Iiierul NR.OUT se vor scrie ciIrele 2, 3, 4 i/sau 5 n cazul n care numrul dat este
divizibil cu acestea. n situaia n care numrul este divizibil cu dou sau mai multe
numere dintre cele enumerate, acestea vor Ii separate prin cte un spaiu. Dac
numrul nu este divizibil cu nici unul dintre numerele 2, 3, 4 i 5, n Iiierul de ieire
se va scrie 18.

Restricii yi precizri
- 1 s n s 1000000000
b
;
- 2 s b s 10.

Exemple
NR.IN


NR.OUT

NR.IN


NR.OUT
18
114 5. Conversii

5.6.4. Sistemul de numeraie Fibonacci
CiIrele sistemului de numeraie Fibonacci sunt 0 i 1. n acest sistem de numeraie se
pot reprezenta numerele asemntor sistemului zecimal. Numrul m c
n
c
n-1
.c
3
c
2
c
1
,
scris n baza Fibonacci, n sistemul zecimal are valoarea c
n
a
n
. c
2
2 c
1
1,
unde a
i
sunt numere Fibonacci.
S se scrie un program care convertete un numr dat n baza 10 n baza Fibonacci
i un numr dat n baza Fibonacci n sistemul zecimal.

Date de intrare
Pe prima linie a Iiierului de intrare FIBO.IN se aIl un numr natural m, reprezentat
n baza Fibonacci. Pe linia urmtoare se aIl un numr n baza 10.

Date de ieyire
Pe prima linie a Iiierului FIBO.OUT se va scrie reprezentarea primului numr din Iii-
erul de intrare, reprezentat n baza 10. Pe cea de a doua linie se va scrie reprezentarea
celui de-al doilea numr n baza Fibonacci.

Restricii yi precizri
- 1 s nr
1
, nr
2
s 1000000000.

Exemple
FIBO.IN


NR.OUT



5.7. Soluiile problemelor propuse
nainte de a prezenta rezolvrile problemelor, dorim s clariIicm urmtoarele: n cal-
culator orice numr este reprezentat n baza 2, iar ,imaginea pe care o vedem, aIind
un astIel de numr este un numr reprezentat n baza 1. n concluzie, atunci cnd n
aceste rezolvri vorbim despre conversii, de Iapt construim ,imaginea numerelor
Iormate din ciIre conIorm sistemului de numeraie. Din acest motiv, n continuare prin
conversii nelegem construirea numerelor n baza 10 care ,arat ca i cum ar fi in
ba:a b.

5.7.1. Conversie
Pentru a converti un numr dintr-o baz de numeraie n alta exist, n principiu, dou
posibiliti:
- se convertete numrul n baza 10 i apoi acesta se convertete n baza dorit;
- se convertete numrul n baza de numeraie dorit prin aplicarea algoritmului de
conversie clasic, cu condiia c toate calculele se vor eIectua n baza speciIicat.
5. Conversii 115

Algoritmul descris n pseudocod Iolosete prima metod. Dac baza b
1
este baza
10, nu este necesar conversia numrului din baza b
1
n baza 10 i similar, dac b
2
este
egal cu 10, nu este nevoie s convertim rezultatul parial.

Algoritm&RQYHUVLL
citeteEE se citesc cele aou ba:e ae numeraie }
citeteQXPU se citete numrul aat }
se verific aac numrul este scris corect in ba:a aat }
YDOLGaaevrat presupunem c numrul este corect scris }
QUQXPU copie a numrului aat }
ct timp YDOLGiQU=execut
dacUHVW>QU@>Eatunci
YDOLGfals numrul corect scris are aoar cifre mai mici aecat b1 }
sfrit dac
QU>QU@
sfrit ct timp
dacnuYDOLGatunci
scrieQXPDULQFRUHFW
altfel
conversie ain ba:a b1 in ba:a 10 }
dacEatunci
SDULDOQXPU
altfel
aac b1 10, nu este necesar etapa ae conversie in ba:a 10 }
SDULDO re:ultatul parial al conversiei (ain b1 in 10) }
S p pstrea: puterile ba:ei }
ct timpQXPU=execut
FLIUDUHVW>QXPU@
QXPU>QXPU@
SDULDOSDULDOFLIUDS
SSE
sfrit ct timp
sfrit dac
dacEatunci aac b2 10, nu este necesar conversia }
UH]XOWDWSDULDO
altfel conversie ain ba:a 10 in ba:a b2 }
UH]XOWDW
S p pstrea: puterile ba:ei 10 }
repet
FLIUDUHVW>SDULDOE@
SDULDOUHVW>SDULDOE@
116 5. Conversii

UH]XOWDWUH]XOWDWFLIUDS
SS
pn cndSDULDO
sfrit dac
scrieUH]XOWDW
sfrit dac
sfrit algoritm

5.7.2. Operaii ntr-o baz de numeraie dat


n Iuncie de operaia speciIicat n Iiier (adunare sau scdere), algoritmul va trebui
s eIectueze suma sau diIerena numerelor date, operaiile eIectundu-se n baza de
numeraie n care au Iost scrise numerele.
Se vor urmri aceste operaii pe un exemplu:
Fie b 3, numr
1
21022
3
i numr
2
2011
3
.

Dac operator

operaia transport vechi calcule cifr rezultat transport


21022
3
+
2011
3
100110
3

0
1
1
0
1
1
0+2
3
+1
3
=3
10
=10
3
1+2
3
+1
3
=4
10
=11
3
1+0
3
+0
3
=1
10
=1
3
0+1
3
+2
3
=3
10
=10
3
1+2
3
+0
3
=3
10
=10
3
1+0
3
+0
3
=1
10
=1
3

0
1
1
0
0
1
1
1
0
1
1
0

Dac operator

operaia mprumut calcule cifra rezultat transport
21022
3
-
2011
3
12011
3

0
10

0
10

0
10

3
10

0
10

0
10
+2
3
-1
3
=1
3
0
10
+2
3
-1
3
=1
3
0
10
+0
3
-0
3
=0
3
3
10
+1
3
-2
3
=2
3
0
10
+(2
3
-1
3
)=1
3
1
3

1
3

0
3

2
3

1
3

0
0
0
0
-1

Algoritmul care descrie aceste operaii este prezentat n continuare.

Algoritm2SHUDLL
citeteE ba:a ae numeraie in care se efectuea: operaia }
citeteQXPU
citeteRSHUDWRU sau }
citeteQXPU
UH]XOWDW iniiali:area re:ultatului }
5. Conversii 117

WUDQVSRUW iniiali:area cifrei ae transport }
S p se iniiali:ea: cu 10 la puterea 0 }
ct timpQXPU=sauQXPU=execut
cat mai exist cifre cel puin intr-un numr }
dacRSHUDWRUatunci
se aaun ultimele cifre ale celor aou numere }
SDULDOWUDQVSRUWUHVW>QXPU@UHVW>QXPU@
dacSDULDO>Eatunci
SDULDOSDULDOE
WUDQVSRUW
altfelWUDQVSRUW
sfrit dac
altfel se scaa ultimele cifre ale celor aou numere }
SDULDOUHVW>QXPU@WUDQVSRUWUHVW>QXPU@
dacSDULDOatunci este nevoie ae imprumut }
SDULDOSDULDOE
WUDQVSRUW
altfelWUDQVSRUW
sfrit dac
sfrit dac
UH]XOWDWUH]XOWDWSSDULDO
cifra obinut se aaaug la re:ultat }
SS se pregtete puterea pentru pasul urmtor }
QXPU>QXPU@ se trece la urmtoarea cifr }
QXPU>QXPU@
sfrit ct timp
dacWUDQVSRUW!atunci
UH]XOWDWUH]XOWDWS ultima cifr ae transport }
sfrit dac
scrieUH]XOWDW
sfrit algoritm

5.7.3. Criterii de divizibilitate ntr-o baz de numeraie dat


Programul poate Ii realizat veriIicnd criteriile de divizibilitate cu 2, 3, 4 i 5, criterii
care au Iost prezentate n suportul teoretic al leciei. Condiiile au Iost grupate dup
Iorma bazei de numeraie, deoarece se observ similitudini n deIinirea acestor criterii.
De exemplu, atunci cnd baza de numeraie este multiplu de cifra, toate criteriile cer
condiia ca ultima ciIr a numrului s Iie multiplu de cifra (s-a notat cu cifra valoarea
2, 3, 4 sau 5). De asemenea, n cazul n care baza de numeraie este de Iorma k cifra,
toate criteriile pun condiia ca suma ciIrelor numrului s se divid la cifra.

118 5. Conversii

Se descrie n continuare un algoritm de rezolvare diIerit de cel prezentat mai sus. n
subalgoritm vom trata doar divizibilitatea cu 5 a unui numr reprezentat n baza b,
deoarece criteriul prezentat n partea teoretic este valabil doar pentru baze mai mari
sau egale cu 5. Nu vom genera numr n baza 10, doar ultima ciIr ne intereseaz, dar
calculele trebuie s le eIectum n baza 10, deoarece ba:a este mai mic dect 5.

SubalgoritmYHULIQXPU
QQQXPU
SXWHUH
ct timpQQ!execut traversm cifrele numrului i pregtim }
QQ>QQ@ SXWHUH pentru a obine puterea cu care vom impri }
SXWHUHSXWHUH
sfrit ct timp
FLIU>QXPUSXWHUH@
ct timpSXWHUH!execut traversm cifrele ae la stanga la areapta }
SXWHUH>SXWHUH@
FLIUUHVW>FLIUED]D>QXPUSXWHUH@@
sfrit ct timp
dac FLIU sau FLIU atunci
scrie1XPDUXOVHGLYLGHFX
sfrit dac
sfrit subalgoritm

5.7.4. Sistemul de numeraie Fibonacci
Algoritmul de conversie se bazeaz pe descompunerea unui numr natural n sum de
numere Fibonacci, prezentat n capitolul 4.
Subalgoritmul urmtor transIorm un numr dat n sistemul de numeraie Fibonacci
(nn) n numr zecimal (n). Vom cuta n numrul nn ciIre egale cu 1, deoarece ele re-
prezint prezena n suma care reprezint numrul n, a unui numr Fibonacci. n nu-
mr doar anumii termeni din ir particip, dar trebuie s-i generm pe toi, pn cnd
mprirea cu 10 se Iinalizeaz cu un ct egal cu 0.

Subalgoritm'LQ)LERQQQQ
nn. numr in sistemul ae numeraie Fibonacci, n. numr in ba:a 10 }
Q
dacQQ=atunci
dacUHVW>QQ@atunci
Q
sfrit dac
QQ>QQ@

5. Conversii 119

D
E
FDE
ct timpQQ!execut cat timp mai avem cifre }
FLIUDUHVW>QQ@
dacFLIUDatunci
cifra 1 aauce un numr Fibonacci in valoarea numrului n }
QQF
sfrit dac
DE
EF
FDE
QQ>QQ@
sfrit ct timp
sfrit dac
sfrit subalgoritm

Subalgoritmul urmtor transIorm un numr zecimal n numr reprezentat n siste-
mul de numeraie Fibonacci. Dac numrul dat este numr Fibonacci, nseamn c
acesta (t
i
) s-a obinut adunnd doi termeni consecutivi (t
i-1
i t
i-2
) din ir. n acest caz t
i

nu are o reprezentare unic, deoarece poate Ii scris i sub Iorma m 100...0, unde
numrul 0-urilor este egal cu numrul numerelor Fibonacci mai mici dect numrul
dat, dar i sub Iorma 1100..0 unde numrul 0-urilor este egal cu numrul numerelor
Fibonacci mai mici dect t
i-2
. Subalgoritmul va determina primul mod de aIiare.

Subalgoritm'LQQ)LERQDFFLQQQ
QQ aac n este egal cu 1, i nn va fi 1 }
dacQ=atunci
D incepem generarea numerelor Fibonacci }
E
FDE
SXWHUH
ct timpEQexecut
DE
EF
FDE
SXWHUHSXWHUH
sfrit ct timp
aac n este numr Fibonacci, nn este ae forma 1 putere }
QQSXWHUH

120 5. Conversii

dacF=Qatunci
aac n nu este numr Fibonacci, il aescompunem in sum ae numere Fibonacci }
QQE
ct timpQ!execut cat timp mai avem rest }
ct timpE!Qexecut
FE
ED
DFE
SXWHUH>SXWHUH@
sfrit ct timp
QQQQSXWHUH
QQE
sfrit ct timp
sfrit dac
sfrit dac
sfrit algoritm



Tablouri unidimensionale

Atribuirea
Selectarea unei componente
Declararea tablourilor unidimensionale
Citirea yi afiyarea tablourilor unidimensionale
Prelucrri simple pe tablouri
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
6



Pentru a deIini structura de date tablou considerm o mulime M de valori oarecare.
Aplicaia f: 1, 2, ..., n} M ataeaz Iiecrui indice i e 1, 2, ..., n} un element
m
i
e M. Ea deIinete un tablou unidimensional T
n
, numit vector sau ir, avnd elemen-
tele m
1
f(1), m
2
f(2), ..., m
n
f(n).
n memoria intern, elementele acestui tablou vor ocupa n ordine locaii succesive
de memorie. Presupunnd c primul element al tabloului este memorat la adresa a
1
i
c un element ocup l locaii, adresa relativ a
i
(Ia de nceputul tabloului) a locaiei
ocupate de elementul i va Ii:
a
i
a
1
l (i 1), i e 1, 2, ..., n}.
Indicele este o expresie de tip ordinal care conine inIormaii cu privire la poziia
elementului n cadrul structurii.
Elementele tabloului trebuie s Iie de acelai tip, adic tabloul are o structur omo-
gen. Un tablou uniaimensional este o structur de date care cuprinde un numr de
elemente mai mic sau egal cu un numr precizat prin tipul inaicelui.
n diIeritele medii de programare, aefinirea unui tip tablou nseamn precizarea
mulimii din care acesta poate lua valori (tipul ae ba:), precum i operaiile care se
pot eIectua asupra unei variabile de tip tablou, la nivel global.

6.1. Atribuirea
Prin aceast operaie, o variabil ae tip tablou primete valoarea unei alte variabile ae
acelai tip tablou. Posibilitatea eIecturii atribuirilor la nivelul unui ntreg tablou re-
prezint o Iacilitate important oIerit de anumite limbaje de programare (de exemplu,
Pascal). Aceast atribuire se poate realiza numai dac tipul celor dou tablouri este
iaentic.
122 6. Tablouri uniaimensionale (iruri)

6.2. Selectarea unei componente
O component a tabloului se precizeaz prin specificarea variabilei ae tip tablou, ur-
mat intre parante:e arepte ae o expresie inaiceal. De exemplu: D>L@.

6.3. Declararea unui tablou n Pascal
Forma general a unei declaraii de tablou unidimensional este urmtoarea:

type numetiparray>tipinaice@oftipaeba:
var numetablou:numetip;

n Iorma general de mai sus, numetip este un identiIicator ales de utilizator,
tipaeba: i tipinaice sunt tipuri predeIinite sau tipuri utilizator. tipinaice este, n
mod obligatoriu, un tip ordinal i, n cazul n care este de tip subdomeniu, poate Ii pre-
cizat cu ajutorul unor expresii, caz n care n ea pot interveni doar constante i cons-
tante simbolice. tipaeba: poate Ii orice tip elementar sau structurat, cunoscut n
momentul declaraiei.

Exemplu
const Q
type /LWHUHD]
LQGLFHQ
WDEORXarray>LQGLFH@of,QWHJHU
VLUarray>Q@of/LWHUH
varDWDEORXEVLU

Exist posibilitatea de a declara un tablou descriind structura n seciunea var, in-
troducnd astIel un tip anonim:
varDarray>@of,QWHJHU

Menionm c dou tipuri anonime se consider diIerite, chiar dac, de Iapt, de-
scriu aceeai structur de date:
varDarray>@of,QWHJHU
Earray>@of,QWHJHU
n acest caz D i E vor avea tipuri diIerite, n concluzie, instruciunea de atribuire
DE nu este permis. n schimb, datorit Iaptului c cele dou tablouri au acelai tip
de baz, instruciunea D>@E>@ este corect.

6.4. Citirea tablourilor unidimensionale
O variabil de tip tablou nu poate Ii citit n Pascal; aceast operaie se realizeaz ci-
tind tabloul element cu element, preciznd elementele prin indicii lor:
6. Tablouri uniaimensionale (iruri) 123

Algoritm&LWLUH7DEORX
citeteQ citim aimensiunea tabloului }
pentruLQexecut
citete[>L@ citim elementele }
sfrit pentru
sfrit algoritm

Dac nu cunoatem dimensiunea exact a tabloului, dar cunoatem un numr care
exprim valoarea maxim posibil a acestuia, atunci vom proceda dup cum urmeaz:

Algoritm&LWLUH7DEORX
Q
ct timp nu urmea: marca ae sfarit ae fiier execut
QQ aac primul inaice al tabloului este 1 }
citete[>Q@ citim elementele }
sfrit ct timp in n avem aimensiunea tabloului citit }
sfrit algoritm

6.5. Afiyarea tablourilor unidimensionale
O variabil de tip tablou nu poate Ii aIiat n Pascal; aceast operaie se realizeaz
scriind pe suportul de ieire tabloul element cu element, preciznd elementele prin in-
dicii lor:

Algoritm$ILDUH7DEORX
pentruLQexecut
scrie[>L@
sfrit pentru
sfrit algoritm

Constante de tip tablou
n Pascal tablourile se pot iniializa n seciunea de declaraii. Cu toate c ele se de-
clar cu ajutorul cuvntului const, elementele unui tablou declarat astIel i pot
schimba valorile. Acestea se declar n modul urmtor:

type tiptablouarray>tipinaice@ of tipba:;
const numetablou tiptablouconstanta
1
, constanta
2
, ...
unde lista constanta
1
, constanta
2
, ... are exact attea constante de tipul tipba: cte
elemente are tipul tipinaice.

Exemplu
typeVLUarray>@of&KDU
const$VLUDEF
124 6. Tablouri uniaimensionale (iruri)

6.6. Prelucrri simple pe tablouri
Problemele rezolvate pn acum, n marea lor majoritate, pot Ii abordate i ntr-o ma-
nier care presupune citirea tuturor datelor nainte de a Ii prelucrate, ca atare se impu-
ne pstrarea lor n memorie. Acest lucru se realizeaz reinnd aceste valori ntr-un ta-
blou uniaimensional (ir). Totui, n situaia n care numrul datelor de prelucrat este
mare, trebuie mai nti s analizm soluia aleas pentru structurarea datelor, deoarece
este posibil ca acestea s nu aib suIicient spaiu disponibil n memorie. De asemenea,
atragem atenia c dimensiunea memoriei interne, disponibil pentru datele care ur-
meaz s Iie prelucrate de un anumit program, diIer de la un mediu de programare la
altul.
Se recomand memorarea datelor n tablouri, dac astIel crete lizibilitatea progra-
mului, dar mai ales atunci cnd este nevoie ,atingerea elementelor de mai multe ori
pe parcursul prelucrrii. Dac nu lucrm cu tablouri, aceste rezolvri ar putea necesita
deschiderea Iiierului de intrare de Ioarte multe ori i citirea repetat a coninutului,
ceea ce conduce la creterea timpului de execuie.

n prima Iaz a analizei unei probleme de algoritmic (programare), de regul, cu-
tm s stabilim clasa de probleme n care ar putea Ii ncadrat aceasta. n cele ce ur-
meaz vom trata subprobleme clasice care prelucreaz iruri.

6.6.1. Sume yi produse
ntr-o clas important de probleme cu care ne ntlnim Irecvent, se cere determinarea
unui singur re:ultat pe baza unui ir de date de intrare. Este vorba de probleme n care
trebuie s aplicm un operator i s determinm o sum sau un produs. Pentru aceste
operaii, mai nti vom stabili elementul neutru, astIel nct operaia eIectuat asupra
unui element y, ales arbitrar, s conduc la y.
n urmtorii algoritmi, prezentai n pseudocod, pentru a accentua prelucrarea pro-
priu-zis, nu vom explicita operaiile de citire a datelor de intrare i de scriere a rezul-
tatelor. Presupunem n continuare c, dac nu va Ii menionat altIel, se prelucreaz un
tablou unidimensional x avnd dimensiunea n i elemente numere ntregi.

Observaie
Dup ce se vor aobanai cunotinele privina subprogramele, aceti algoritmi se
vor putea implementa sub form ae funcii sau (in Pascal) proceauri i aatele primite
spre prelucrare, respectiv cele obinute i transmise celorlalte uniti ale programului
se vor meniona in lista ae parametri.

n algoritmul cu care calculm sume (sau produse) rezultatul obinut dup prelucra-
rea elementelor irului dat x (de dimensiune n) l obinem n variabila re:ultat, iar ope-
raia aplicat este notat cu op.
6. Tablouri uniaimensionale (iruri) 125

Algoritm3UHOXFUDUHBLU
citire aate
UH]XOWDWelement nul
pentruLQexecut: prelucrm toate elementele }
UH]XOWDWUH]XOWDWop[>L@
sfrit pentru
afiare re:ultat
sfrit algoritm

6.6.2. Decizia
Vom ntlni probleme n care se cere veriIicarea unei proprieti a irului. Aceasta
poate s vizeze existena unui singur element avnd proprietatea respectiv sau o pro-
prietate global a irului. Trstura comun a acestor probleme const n Ielul n care
algoritmul va Iurniza rspunsul. Soluia va Ii dat sub Iorma unui mesaj prin care se
conIirm sau se inIirm proprietatea cerut. Acest mesaj poate Ii simplu: '$ sau
18 i se aIieaz n Iuncie de valoarea unei variabile logice, stabilit n algoritm.
ntr-o prim variant putem dezvolta algoritmul 3UHOXFUDUHBLU. n acest algo-
ritm rezultatul se pstreaz n variabila gsit, a crei valoare de adevr constituie rs-
punsul la ntrebarea pus n problem.

Algoritm'HFL]LHB
citire aate
JVLWfals
pentruLQexecut
JVLWJVLWsau[>L@ are proprietatea cutat
sfrit pentru
afiare re:ultat
sfrit algoritm

S observm c dac, la un moment dat, valoarea variabilei JVLW devine aaev-
rat, valoarea ei nu se va mai schimba pn la sIritul executrii algoritmului. n con-
cluzie, vom modiIica, pe baza acestei observaii, algoritmul de mai sus.
n primul rnd vom schimba structura repetitiv de tipul pentru ntr-o structur cu
numr necunoscut de pai, pentru a putea ntrerupe execuia n momentul n care am
obinut rspunsul la ntrebare. Evident, dac nici un element al irului analizat nu are
proprietatea cutat, se va parcurge ntreg irul.
n urmtorul algoritm contorul i reprezint indici n irul x, iar variabila gsit nu va
Ii iniializat; ea primete valoare n Iuncie de motivul prsirii ciclului ct timp.
Dac exist i s n pentru care x
i
are proprietatea cerut, gsit primete valoarea aaev-
rat; dac nici un element nu are proprietatea cutat, valoarea lui i este mai mare dect
n i gsit primete valoarea fals.
126 6. Tablouri uniaimensionale (iruri)

Algoritm'HFL]LHB
citire aate
L
ct timp LsQi [>L@nu are proprietatea cutatexecut
L L
sfrit ct timp
JVLW Ls Q se evaluea: expresia relaional }
i valoarea ae aaevr obinut se atribuie variabilei JVLW }
afiare re:ultat
sfrit algoritm

S analizm acum problemele din cealalt categorie, mai exact, cele n care se veri-
Iic Iiecare element al irului dat. Acestea trebuie s aib o aceeai proprietate. Aceas-
t caracteristic a irului se poate Iormula i n Ielul urmtor: in ir nu exist nici un
element care nu are proprietatea cerut. TransIormnd algoritmul 'HFL]LHB prin
aplicarea negaiei n dou locuri, obinem algoritmul de rezolvare pentru aceast clas
de probleme. Deoarece semniIicaia deciziei se reIer la toate elementele irului, nlo-
cuim variabila JVLW cu WRDWH.

Algoritm'HFL]LHB
citire aate
L
ct timp Ls Q i [>L@ are proprietatea cutat execut
am negat subexpresia. [>L@nu are proprietatea cutat }
L L
sfrit ct timp
WRDWH L!Q am negat subexpresia Ls Q }
afiare re:ultat
sfrit algoritm

n momentul codiIicrii algoritmilor de tip 'HFL]LH pot aprea diverse probleme.
n unele limbaje de programare o expresie logic Iormat din subexpresii ntre care
apar operatorii logici i, respectiv sau, se evalueaz n ntregime, dar exist i limba-
je n care, n Iuncie de operator i valoarea primei subexpresii, evaluarea se ntrerupe
dup stabilirea valorii primei subexpresii. De exemplu, dac valoarea primei subexpre-
sii este aaevrat i urmeaz operatorul sau, cea de-a doua subexpresie nu se mai eva-
lueaz, deoarece indiIerent de valoarea acestuia, rezultatul Iinal va Ii aaevrat (aaev-
rat sau aaevrat este aaevrat i aaevrat sau fals este tot aaevrat). De asemenea,
dac valoarea de adevr a primei subexpresii este fals i urmeaz operatorul i, cea
de-a doua subexpresie nu se mai evalueaz, deoarece indiIerent de valoarea acesteia,
rezultatul Iinal va Ii fals (fals i aaevrat este fals, respectiv fals i fals este tot fals).
6. Tablouri uniaimensionale (iruri) 127

n cazul acelor limbaje de programare care, n schimb, nu ntrerup evaluarea aces-
tor expresii logice, sau dac programatorul nu alege atent ordinea subexpresiilor n ca-
zul primei categorii de limbaje de programare, codiIicarea deciziei, conIorm algoritmi-
lor prezentai, pot genera erori neplcute. Fie expresia logic
LsQi[>L@ are proprietatea cutat
din structura repetitiv ct timp din algoritmul 'HFL]LHB. Dac i ~ n, n urma
evalurii subexpresiei LsQ obinem fals, dar se evalueaz i subexpresia [>L@
are proprietatea cutat n condiiile n care tim deja c i ~ n, deci se va veriIica un
element [>L@ care nu exist n irul dat!

n concluzie, n implementarea algoritmilor de tipul celor prezentai trebuie s c-
utm soluii prin care s evitm producerea unor erori n timpul executrii programului
sau obinerea unor rezultate incorecte. n cele ce urmeaz propunem cteva soluii
pentru evitarea acestei ,capcane:
a. putem crea un al (n 1)-lea element Iictiv (numit Irecvent santinel);
b. putem opri reluarea executrii nucleului structurii repetitive cu un pas mai repe-
ae, urmnd s analizm motivele ieirii din ciclu;
c. putem despri subexpresiile, urmnd ca pe cea de-a doua s-o evalum doar
atunci cnd acest lucru este necesar;
d. putem s evitm Iolosirea, n cea de-a doua subexpresie, a valorii [>L@; acest
lucru este posibil dac introducem o variabil logic pentru a reine valoarea de
adevr a subexpresiei [>L@ are proprietatea cutat de la pasul precedent,
astIel permind ieirea din structura repetitiv n momentul n care avem con-
Iirmarea proprietii, sau dup parcurgerea ntregului ir, n cazul n care acest
lucru nu a avut loc.

6.6.3. Selecia
Soluiile problemelor rezolvate cu algoritmi de tipul 'HFL]LH veriIic o anumit
proprietate ntr-un ir de date i comunic prezena sau absena ei. Analiznd mai atent
rezolvrile, constatm c am putea IructiIica algoritmul, aIind n plus inIormaii cum
ar Ii po:iia pe care se aIl elementul cu proprietatea cerut.

S presupunem c enunul garanteaz apartenena a cel puin unui astIel de ele-
ment. Rezult c trebuie doar s gsim acel element i s stabilim numrul su de ordi-
ne (nrora). Primul numr de ordine (indice) pentru care proprietatea este adevrat
constituie rezultatul algoritmului.

Nu vom veriIica dac valoarea contorului a ajuns la dimensiunea irului dat, tocmai
datorit Iaptului c enunul garanteaz existena n ir a valorii cutate. Elementul cu
proprietatea cerut va Ii gsit cel trziu atunci cnd prelucrm ultimul element.
128 6. Tablouri uniaimensionale (iruri)

Algoritm6HOHFLD
citire aate
QUBRUG
ct timp [>QUBRUG@nu are proprietatea cutatexecut:
QUBRUG QUBRUG
sfrit ct timp
afiare re:ultat
sfrit algoritm

6.6.4. Cutarea (secvenial)
Acum vom presupune c enunul nu garanteaz prezena a cel puin unui element
avnd proprietatea cerut n irul dat. n acest tip de problem cele dou cerine din
ultimele dou clase de probleme se combin, respectiv, dup aIlarea rspunsului la
ntrebarea ,exist?, aIim, de exemplu, poziia pe care se aIl elementul cutat.
Evident, modelul de rezolvare se bazeaz pe modelele prezentate pn acum. Vari-
abilele Iolosite au semniIicaiile din algoritmii precedeni.

Algoritm&XWDUH
citire aate
L
ct timpLsQi [>L@nu are proprietatea cutatexecut:
L L
sfrit ct timp
JVLW LsQ aac am prsit ciclul inainte ca i s aevin mai mare }
aecat n, inseamn c am gsit elementul cutat }
afiare re:ultat
sfrit algoritm

Se observ c soluia pornete cu modelul algoritmului 'HFL]LH care se comple-
teaz cu determinarea numrului de ordine conIorm algoritmului 6HOHFLH.
Dac ntr-o problem de cutare trebuie s regsim toate elementele avnd o pro-
prietate dat, evident vom parcurge irul pn la capt, ceea ce nseamn c vom lucra
cu o structur repetitiv de tip pentru.

Dac, dup cutare, se cere eliminarea elementului respectiv din irul dat, n Iunc-
ie de speciIicaiile din enun, vom alege una din urmtoarele posibiliti:
- dac se cere eliminarea elementului i nu conteaz dac se schimb ordinea, co-
piem ultimul element peste cel care trebuie eliminat i scurtm irul cu 1;
- dac eliminarea este ,temporar, vom pstra un ir cu valori logice n care va-
loarea de adevr a elementului corespunztor celui eliminat va Ii modiIicat dup
caz;
6. Tablouri uniaimensionale (iruri) 129

- dac se cere eliminarea elementului i se impune pstrarea ordinii irului, vom
translata elementele n aa Iel nct cel care trebuie eliminat s se suprascrie cu
urmtorul element din ir; dup terminarea translatrii scurtm irul cu 1;
- exist i posibilitatea crerii unui ir nou n care se vor copia doar elementele
care nu trebuie eliminate, urmnd ca n Iinal variabila de tip tablou care pstrea-
z irul iniial s se suprascrie cu variabila de tip tablou nou creat.

O cutare special se reIer la depistarea aublurilor ntr-un ir. De regul, o astIel
de prelucrare se Iinalizeaz Iie cu un ir care conine elemente distincte (dup elimi-
narea dublurilor), Iie cu unul care conine dublurile. Prima este echivalent cu
transIormarea irului n mulime i va Ii tratat la sIritul acestui capitol.

6.6.5. Numrarea
n aceast clas de probleme se cere numrul elementelor din ir avnd o anumit
proprietate. Enunurile nu garanteaz c exist cu siguran un astIel de element, deci
soluia Iurnizat poate Ii i 0.
Avnd n vedere c Iiecare element trebuie veriIicat (este posibil ca oricare dintre
elemente s aib proprietatea cerut), vom lucra cu o structur repetitiv de tipul pen-
tru. Contorul cu care numrm elementele avnd proprietatea dat este notat cu buc.

Algoritm1XPUDUH
citire aate
EXF
pentruLQexecut:
dac[>L@are proprietatea cutatatunci
EXF EXF
sfrit dac
sfrit pentru
afiare re:ultat
sfrit algoritm

6.6.6. Selectarea elementului maxim
Problema determinrii minimului, respectiv maximului am mai tratat-o n capitolul 2.
Rezolvrile acestor probleme vor Ii asemntoare, deoarece n acestea se cere stabili-
rea unei valori care este Iie cea mai mare, Iie cea mai mic n irul dat. Bineneles,
pot exista mai multe astIel de valori egale cu valoarea minim sau maxim i este
posibil ca n anumite probleme s trebuiasc s le numrm.
Algoritmul care rezolv aceast problem (n termeni generali) va lucra cu o bucl
de tip pentru, deoarece Iiecare element trebuie prelucrat. Valoarea elementului ma-
xim se reine n variabila max.
130 6. Tablouri uniaimensionale (iruri)

Algoritm0D[LP
citire aate
PD[[>@
pentruLQexecut
dacPD[[>L@atunci
PD[[>L@
sfrit dac
sfrit pentru
afiare re:ultat
sfrit algoritm

Reamintim c se recomand iniializarea maximului (minimului) cu o valoare exis-
tent n ir, i, deoarece, de regul, prelucrm irurile ncepnd cu primul element, cel
mai Iiresc este ca n iniializarea respectiv s Iolosim aceast valoare.
Utiliznd acest algoritm vom obine indicele primului element avnd valoarea ma-
xim (minim). Dac ni s-ar cere ultimul astIel de element, atunci ar Ii suIicient s
schimbm operatorul relaional , n ,s.

n continuare prezentm o alternativ interesant care poate Ii util n cazul unui ir
n care un element ocup un spaiu relativ mare de memorie, respectiv, dac se cere i
poziia elementului maxim. n loc s se lucreze cu variabila max, avnd acelai tip ca
elementele din ir, se va pstra doar indicele su (inamax). Pentru aIiarea valorii
maxime, se va speciIica [>LQGBPD[@.

Algoritm0D[LPBRSWLPL]DW
citire aate
LQGBPD[ LQGBPD[ este iniiali:at cu inaicele primului element }
pentruL,Qexecut:
dac[>LQGBPD[@[>L@atunci
LQGBPD[L inaicele elementului maxim }
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm

6.6.7. Selectarea elementelor
Am vzut c algoritmul 6HOHFLH determin poziia unui singur element avnd pro-
prietatea dat. Dac dorim s reinem toate poziiile pe care se aIl elemente avnd
acea proprietate, vom aplica un algoritm de tip 6HOHFWDUH care, pe de o parte seamn
cu cutarea liniar, pe de alt parte cu numrarea. Dac irul poziiilor ne este nece-
sar n continuare n rezolvarea problemei, vom crea un tablou y n care vom reine
aceste poziii. Contorizarea elementelor din acesta o realizm cu variabila buc.
6. Tablouri uniaimensionale (iruri) 131

Algoritm6HOHFWDUHB
citire aate
EXF
pentruLQexecut
dac[>L@are proprietatea cutatatunci
EXFEXF
\>EXF@L in \ pstrm inaicii elementelor [>L@, avana proprietatea }
sfrit dac cutat }
sfrit pentru
afiare re:ultate
sfrit algoritm
Se observ c pentru pstrarea rezultatului am avut nevoie de un tablou nou n ca-
zul cruia nu cunoatem exact cte elemente va cuprinde. Dar, din moment ce nu este
exclus ca Iiecare element al irului dat s aib proprietatea dat, acesta va Ii declarat
avnd attea elemente cte are irul dat. Modelul de mai sus ,adun indicii elemen-
telor avnd proprietatea precizat n vectorul y, i totodat obine i numrul acestora
n buc. Dac nu avem nevoie de elementele respective, colecionate n vectorul y, de-
oarece trebuie doar s le Iurnizm ca rezultat, algoritmul este i mai simplu:

Algoritm6HOHFWDUHB
citire aate
pentruLQexecut
dac[>L@are proprietatea cutatatunciscrie[>L@
sfrit dac
sfrit pentru
sfrit algoritm

n a treia variant a acestui algoritm considerm c dup selectarea elementelor c-
utate nu mai avem nevoie de irul dat. Deci, n loc s Iolosim un al doilea ir pentru
elementele selectate, vom Iolosi chiar irul dat. Ideea este de a suprascrie elementele
de la nceputul irului dat cu cele selectate. Variabila buc reine lungimea acestui ir
,nou. Pseudocodul acestui algoritm este urmtorul:

Algoritm 6HOHFWDUHB
citire aate
EXF
pentruLQexecut
dac[>L@are proprietatea cutatatunci
EXFEXF
[>EXF@[>L@ sau i, in funcie ae cerine }
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm
132 6. Tablouri uniaimensionale (iruri)

Se poate observa c n caz extrem, Iiecare element are proprietatea cerut, ceea ce
va conduce la un ir ,nou x, identic cu cel dat.

Dac se cere pstrarea elementelor care nu au aceast proprietate, vom nega condi-
ia din dac. Dac vrem s pstrm aceste elemente pe poziiile originale n irul dat,
putem anula prezena acestor elemente, suprascriindu-le cu o valoare special, aleas
n acest scop. AstIel, vom avea un algoritm care realizeaz o selectare pe loc. Aceast
soluie va Ii avantajoas doar dac ,evitarea prelucrrii acestor elemente, avnd va-
loarea special, va Ii mai simplu de realizat dect veriIicarea proprietii.

Algoritm6HOHFWDUHB
citire aate
pentruLQexecut
dac[>L@are proprietatea cutatatunci
[>L@YDORDUHBVSHFLDO o valoare convenional stabilit }
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm

6.6.8. Partiionarea unui yir n dou subyiruri


n seciunea precedent am prezentat mai muli algoritmi cu care rezolvm probleme
n care se d un ir i se cere selectarea mai multor elemente, avnd o aceeai proprie-
tate dat. Se pune ntrebarea ce se ntmpl cu elementele neselectate?
Evident, vor Ii probleme n care se va cere descompunerea unui ir n dou sau mai
multe subiruri.
Prima particularitate a acestor probleme const n Iaptul c se a un ir i se cer
mai multe. Practic, va trebui s eIectum, una dup alta, mai multe selectri innd
cont de proprietile precizate. Mai nti vom selecta acele elemente care au prima
proprietate, apoi din irul elementelor puse deoparte (rmase dup selectare) selectm
elementele avnd cea de a doua proprietate i aa mai departe. Rezult c algoritmul
const din aplicarea repetat a partiionrii n dou iruri a irului dat. Dac partiiona-
rea se Iace n dou subiruri, este clar c elementele neselecionate pentru primul ir
vor Iorma pe cel de al doilea.
Acest tip de problem se poate rezolva pe baza mai multor modele. n prima vari-
ant elementele avnd proprietatea cerut i cele care nu au aceast proprietate le vom
aeza n dou iruri noi. Aceste iruri le vom declara avnd dimensiunea irului dat,
deoarece nu se poate anticipa numrul exact de elemente. Este posibil ca toate elemen-
tele s Iie selectate n primul ir sau acesta s nu aib nici un element.
n algoritmul urmtor variabilele bucy i buc: reprezint numrul elementelor ae-
zate n irul y, respectiv irul :, iruri noi, rezultate n urma partiionrii.
6. Tablouri uniaimensionale (iruri) 133

Algoritm3DUWLLRQDUHB
citire aate
EXF\
EXF]
pentruLQexecut
dac[>L@are proprietatea cutatatunci
EXF\EXF\ elementele care au proprietatea aat }
\>EXF\@[>L@ le ae:m in irul y }
altfel
EXF]EXF] elementele care nu au proprietatea aat }
]>EXF]@[>L@ le ae:m in irul : }
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm

Dac vrem s economisim spaiul risipit cu o astIel de soluie, putem utiliza un sin-
gur ir. Elementele selecionate le reinem n acesta, aezndu-le de la nceput spre
sIrit, iar cele rmase de la ultimul element spre primul. Evident, nu exist pericolul
s ,ne ciocnim, deoarece avem exact n elemente care trebuie aezate pe n locuri.
S observm c aceast rezolvare ne Iurnizeaz irul elementelor neselectate n or-
dine invers Ia de poziiile elementelor sale n irul dat.

Algoritm3DUWLLRQDUHB
citire aate
EXF\
EXF]
pentru LQexecut:
dac[>L@are proprietatea cutatatunci
EXF\EXF\ elementele care au proprietatea aat }
\>EXF\@[>L@ le ae:m in irul y, incepana cu prima po:iie }
altfel elementele care nu au proprietatea aat }
EXF]EXF]
\>QEXF\@[>L@ le ae:m tot in y, incepana cu ultima po:iie }
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm

n cazul n care dup partiionare nu avem nevoie de irul dat n Iorma sa original,
partiionarea, exact ca selectarea, poate Ii realizat Iolosind spaiul alocat irului dat,
adic pe loc.
134 6. Tablouri uniaimensionale (iruri)

Ne putem imagina o soluie care ar Iolosi un algoritm conIorm cruia am avansa n
ir pn la descoperirea primului element care nu are proprietatea cerut i l-am inter-
schimba cu primul care are proprietatea cerut.

Aceast soluie, neIiind suIicient de eIicient, propunem urmtorul algoritm: pu-
nem primul element deoparte, pstrndu-i valoarea ntr-o variabil auxiliar, i cutm
un element avnd proprietatea cerut, pornind de la captul din dreapta al irului i l
punem pe locul eliberat la nceputul irului. Acum vom cuta, pornind de la aceast
poziie spre dreapta, un element care nu are proprietatea cerut i l aezm pe locul
eliberat de la sIritul irului. Continum acest procedeu pn cnd, n urma avansrii
n cele dou direcii, ne vom ntlni.
n algoritm variabila start reine indicele curent al elementului care are proprietatea
cerut, parcurgnd irul de la stnga spre dreapta, iar stop reine indicele curent al ele-
mentului care nu are proprietatea cerut, parcurgnd irul de la dreapta spre stnga.

Algoritm3DUWLLRQDUHB
citire aate
VWDUW
VWRSQ
DX[[>VWDUW@
ct timpVWDUWVWRS
ct timp VWDUW VWRS i [>VWRS@ nu are proprietatea cutat:
VWRSVWRS
sfrit ct timp
dacVWDUWVWRSatunci
[>VWDUW@[>VWRS@
VWDUWVWDUW
ct timpVWDUWVWRSi[>VWDUW@are proprietatea cutat
VWDUWVWDUW
sfrit ct timp
dacVWDUWVWRSatunci
[>VWRS@[>VWDUW@
VWRSVWRS
sfrit dac
sfrit dac
sfrit ct timp
[>VWDUW@DX[
dac[>VWDUW@are proprietatea cutatatunciEXFVWDUW
altfelEXFVWDUW
sfrit dac
afiare re:ultate
sfrit algoritm
6. Tablouri uniaimensionale (iruri) 135

6.6.9. Mulimi reprezentate cu yiruri
Deocamdat ne vom baza pe cunotinele privind mulimile, dobndite la disciplina
matematic. Se tie c o mulime Iie este vid, Iie conine un numr oarecare de obiec-
te. n acest sens, dac o mulime este reprezentat cu ajutorul unui ir, elementele sale
trebuie s Iie distincte (un acelai ,obiect este prezent o singur dat).

A. Stabilirea proprietii de ,mulime
Ne punem ntrebarea: cum stabilim c, de exemplu, un ir de numere reale constituie
sau nu o mulime? AltIel spus, cum veriIicm dac elementele unui ir dat sunt distincte?

Algoritm0XOLPHB
citire aate
L
PXOLPHaaevrat
ct timpPXOLPHiLQexecut:
ML
ct timpMsQi[>L@=[>M@execut:
MM
sfrit ct timp
dacM~Qatunci PXOLPHaaevrat
altfelPXOLPHaaevrat
sfrit dac
LL
sfrit ct timp
afiare re:ultate
sfrit algoritm

B. Eliminarea dublurilor
TransIormarea unui ir, astIel nct s devin mulime, nseamn eliminarea dubluri-
lor. Trebuie s Iim ateni, ca dup depistarea i eliminarea unei dubluri x
f
al lui x
i
, s
nu avansm cu i, ci s eIectum nc o cutare de dubluri pentru acelai x
i
. Dup Iieca-
re eliminare de un element, lungimea irului va scdea cu 1.

Algoritm0XOLPHB
citire aate
L
ct timpLQexecut:
ML
ct timpMsQi[>L@=[>M@execut:
MM
sfrit ct timp
136 6. Tablouri uniaimensionale (iruri)

dacMsQatunci
[>M@[>Q@ suprascriem aublura cu ultimul element }
QQ scurtm irul }
altfel
LL
sfrit dac
sfrit ct timp
afiare re:ultate
sfrit algoritm

C. Intersecia
Am vzut cum se procedeaz atunci cnd se d un ir i trebuie create mai multe iruri
pe baza unei proprieti care permite partiionarea irului. Evident, se poate pune ntre-
barea cum procedm cnd se dau mai multe iruri i trebuie s crem un singur ir care
s conin intersecia lor. Aici prin intersecie nelegem irul care conine elementele
comune tuturor irurilor date. Avem, deci o problem n care se impune selectarea
anumitor elemente pe baza proprietii de a Ii prezente n Iiecare ir dat.

Evident, n diverse limbaje de programare aceast problem se rezolv n Iuncie
de instrumentele pe care acesta le pune la dispoziia programatorilor. De exemplu, n
Pascal exist tipul set (vom nva despre acest tip mai trziu), care poate simpliIica
mult eIectuarea acestei operaii, dac tipul de baz i domeniul valorilor elementelor
permit declararea datelor ca Iiind de acest tip. Acum, ne-am propus s tratm proble-
ma enunat n condiii generale, independent de limbajul de programare ales, doar din
punct de vedere algoritmic. De asemenea, presupunem c Iiecare ir conine elemente
aistincte i c aceste iruri nu sunt oraonate.

Prezentm un algoritm general care stabilete subirul acelor elemente din irul x
care se gsesc i n irul y. Dimensiunile irurilor sunt n, respectiv m, iar dimensiunea
irului intersecie : va Ii buc.

Algoritm,QWHUVHFLH
citire aate
EXF
pentruL=Qexecut:
M
ct timpMsPi[>L@=\>M@execut:
MM
sfrit ct timp
dacMsPatunci
EXFEXF
6. Tablouri uniaimensionale (iruri) 137

]>EXF@[>L@
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm

D. Reuniunea
Dac vrem s rezolvm probleme care prelucreaz mulimi implementate cu ajutorul
irurilor, trebuie s tratm i problema reuniunii.
SemniIicaia variabilelor n algoritmul urmtor este acelai ca mai nainte. n rezol-
vare, mai nti vom copia toate elementele din irul x n irul :, iniializnd lungimea
buc cu lungimea acestui ir. Apoi, vom selecta din irul y acele elemente care nu se
aIl n x.

Algoritm5HXQLXQH
citire aate
][
EXFQ
pentruMPexecut:
L
ct timp LsQi[>L@=\>M@execut:
LL
sfrit ct timp
dacL!Qatunci
EXFEXF
]>EXF@\>M@
sfrit dac
sfrit pentru
afiare re:ultate
sfrit algoritm

6.7. Implementri sugerate
Pentru a v Iamiliariza cu modul n care se abordeaz problemele n care se prelucrea-
z tablouri unidimensionale, v sugerm s implementai algoritmi pentru:
1. determinarea sumei elementelor unui ir;
2. determinarea minimului i maximului unui ir;
3. veriIicarea existenei a cel puin unui element avnd o proprietate dat dintr-un ir;
4. cutarea liniar a unui element ntr-un ir;
5. cutarea liniar a unui element ntr-un ir i determinarea tuturor apariiilor;
6. cutarea liniar a unui element avnd o proprietate dat ntr-un ir i eliminarea lui
138 6. Tablouri uniaimensionale (iruri)

7. cutarea liniar a tuturor elementelor avnd o proprietate dat ntr-un ir i elimina-
rea lor;
8. citirea a dou iruri (cu numr diIerit de elemente) i determinarea irului care are
suma elementelor maxim/minim;
9. citirea a n iruri (cu numr diIerit de elemente) i determinarea irului care are
suma elementelor maxim/minim;
10. citirea a n iruri (cu numr diIerit de elemente) i identiIicarea irului care are cele
mai multe elemente;
11. veriIicarea proprietii de mulime a unui ir;
12. determinarea dublurilor ntr-un ir i eliminarea lor;
13. determinarea reuniunii a dou mulimi, reprezentate cu iruri;
14. determinarea interseciei a dou mulimi, reprezentate cu iruri;
15. eliminarea unui element dintr-un ir cu pstrarea ordinii;
16. determinarea dintr-un ir a dou subiruri pe baza unei proprieti date (crend
dou subiruri noi, apoi crend subiruri noi, ,pe loc).

6.8. Probleme propuse

6.8.1. Sum
Se consider p numere ntregi. S se calculeze suma:
S 1
1
1
n

2
1
n
...
p
n
1
.
Dac exist i e 1, 2, ., p} astIel nct n
i
0, termenul corespunztor nu se calcu-
leaz. Totodat s se numere valorile egale cu 0 printre numerele date.

Date de intrare
Pe prima linie a Iiierului SUMA.IN se aIl scris numrul natural p. Pe urmtoarele p
linii se aIl cte un numr ntreg.

Date de ieyire
Pe prima linie a Iiierului de ieire SUMA.OUT se va scrie suma calculat, iar pe a doua
numrul numerelor egale cu 0.

Restricii yi precizri
- 1 s p s 100;
- -10000 s n
i
s 10000, i 1, 2, ..., p.



6. Tablouri uniaimensionale (iruri) 139

Exemplu
SUMA.IN


SUMA.OUT

6.8.2. Perechi
Se consider n numere ntregi. S se aIieze numerele de ordine ale perechilor de ele-
mente Iormate din dou numere ntregi egale.

Date de intrare
Pe prima linie a Iiierului PERECHI.IN se aIl numrul natural n. Pe Iiecare linie din
urmtoarele n linii se aIl un numr ntreg.

Date de ieyire
n Iiierul de ieire PERECHI.OUT se vor scrie pe cte o linie perechile de numere de
ordine, separate printr-un spaiu, ale elementelor consecutive egale ale irului.

Restricii yi precizri
- 1 s n s 100;
- -10000 s nr
i
s 10000, i 1, 2, ..., n.

Exemplu
PERECHI.IN


PERECHI.OUT


6.8.3. Raport
Se consider n numere ntregi. S se determine raportul dintre numrul numerelor pare
i numrul numerelor impare date.

Date de intrare
Pe prima linie a Iiierului de intrare RAPORT.IN se aIl un numr natural n. Urmtoa-
rele n linii conin Iiecare cte un numr ntreg.


140 6. Tablouri uniaimensionale (iruri)

Date de ieyire
Fiierul de ieire RAPORT.OUT va conine o singur linie pe care se va scrie raportul
cerut (cu dou zecimale exacte). Dac n Iiierul de intrare nu exist nici un numr im-
par, n Iiierul de ieire se va scrie mesajul: 1XH[LVWDQXPHUHLPSDUH

Restricii yi precizri
- 1 s n s 100;
- -10000 s nr
i
s 10000, i 1, 2, ..., n.

Exemplu
RAPORT.IN


RAPORT.OUT


6.8.4. Temperaturi
Pe durata lunii iunie s-a msurat temperatura apei Mrii Negre i valorile s-au scris n-
tr-un Iiier. Stabilii dac apa mrii s-a nclzit ncontinuu sau nu.

Date de intrare
n Iiierul de intrare TEMP.IN se aIl 30 de numere reale, reprezentnd temperatura
apei.

Date de ieyire
Dac temperaturile Iormeaz un ir monoton cresctor, n Iiierul de ieire TEMP.OUT
se va scrie '$, altIel se va scrie 18.

Exemplu
TEMP.IN

PRIM.OUT
18
Explicaie
Aici nu sunt menionate toate cele 30 de tem-
peraturi, din motive de spaiu, dar este clar
c temperaturile nu au crescut monoton.

6.8.5. ntrebarea yefului
Recent s-a realizat recensmntul populaiei din Romnia. Un angajat curios a creat un
Iiier n care a pstrat doar anul naterii persoanelor care locuiesc n comuna sa natal.
eIul lui, observnd c pierde timpul cu lucruri neimportante, l acuz c Iiierul res-
6. Tablouri uniaimensionale (iruri) 141

pectiv nu este bun la nimic i pentru a Ii convingtor l ntreab dac poate s spun
cte persoane nscute anterior anului 1989 triesc n comuna lui?
Scriei un program eIicient care rspunde la ntrebarea eIului i n plus, creeaz un
Iiier nou n care se vor aIla anii de natere mai mici dect 1989.

Date de intrare
Pe prima linie a Iiierului de intrare SEF.IN se aIl numrul n, reprezentnd numrul
locuitorilor din comuna natal a angajatului. Pe urmtoarele n linii se aIl numere na-
turale, reprezentnd anul naterii al locuitorilor.

Date de ieyire
Pe prima linie a Iiierului de ieire SEF.OUT se va scrie numrul persoanelor nscute
anterior anului 1989. Pe urmtoarele linii se vor aIla anii de natere respectivi.

Restricii yi precizri
- 5 s n s 30000;
- dac nu se gsete nici o persoan nscut anterior anului 1989, n Iiier se va scrie
mesajul 18;
- Iiierul de ieire nu trebuie s conin numere distincte.

Exemplu
SEF.IN


SEF.OUT



6.8.6. Diriginta
La sIritul anului, diriginta clasei trebuie s completeze un Iormular n care este ntre-
bat ci elevi din clas au media Iinal ntre 9 i 10 inclusiv, ci au media ntre 8 i 9
inclusiv etc. Dar cum nu i place s lucreze cu statisticile, v roag s scriei un pro-
gram care i va lista datele necesare. n plus, ea v solicit ca lista s conin i mediile
din Iiecare categorie.

Date de intrare
Pe prima linie din Iiierul de intrare DIRIG.IN se aIl un numr natural n, reprezen-
tnd numrul elevilor din clas. Pe urmtoarele n linii se aIl, n ordinea din catalog,
mediile generale ale lor. Mediile sunt numere reale scrise cu doua zecimale exacte.

142 6. Tablouri uniaimensionale (iruri)

Date de ieyire
n Iiierul de ieire DIRIG.OUT vei scrie statistica sub urmtoarea Iorm:
- Pe prima linie se va scrie textul: 0HGLLLQLQWHUYDOXO@, urmat de
nr
1
, unde nr
1
reprezint numrul elevilor avnd media general ntre 9 i 10 in-
clusiv. Pe urmtoarea linie vei scrie mediile elevilor, desprite prin cte un spaiu,
n ordinea din Iiierul de intrare, aparinnd categoriei respective.
- Vei proceda la Iel n cazul Iiecrei categorii: medii generale ntre 8 i 9 inclusiv,
ntre 7 i 8 inclusiv, ntre 6 i 7 inclusiv, respectiv ntre 5 i 6 inclusiv.
- Dac numrul mediilor dintr-o categorie este 0, linia corespunztoare mediei rm-
ne vid n Iiier.

Restricii yi precizri
- 5 meaii s 10;
- n aceast clas nu sunt corigeni.

Exemplu
DIRIG.IN

DIRIG.OUT
0HGLLLQLQWHUYDOXO@

0HGLLLQLQWHUYDOXO@

0HGLLLQLQWHUYDOXO@

0HGLLLQLQWHUYDOXO@

0HGLLLQLQWHUYDOXO@


6.8.7. Generare yir
Se consider urmtorul ir, construit astIel nct Iiecare element al lui, cu excepia
primului, se obine din cel precedent: 1, 11, 21, 1211, 111221, ... Regula de generare a
termenilor este urmtoarea:
- se numr de la stnga la dreapta cte ciIre exist n termenul precedent;
- n termenul nou se trece, pentru Iiecare ciIr, numrul de apariii a ciIrei i ciIra
S se determine al n-lea element din ir.

Date de intrare
Numrul natural n se citete din Iiierul de intrare GENERARE.IN.

Date de ieyire
Al n-lea termen din ir se va scrie n Iiierul GENERARE.OUT.
6. Tablouri uniaimensionale (iruri) 143

Restricii yi precizri
- n s 20.

Exemplu
GENERARE.IN

GENERARE.OUT


6.8.8. Suprapunere
Se consider un tablou unidimensional A care conine n numere naturale i un alt ta-
blou B (avnd elemente egale cu 1) de lungime k, unde k s n. Prin suprapunerea tablo-
ului B peste tabloul A elementele acoperite din A i micoreaz valoarea cu o unitate.
S se stabileasc dac este posibil ca prin aplicri succesive ale tabloului B peste ta-
bloul A s se obin n A numai valori egale cu 0.

Date de intrare
Datele de intrare se citesc din Iiierul de intrare SUPRA.IN, n care pe prima linie este
scris numrul natural n, pe a doua linie este scris numrul natural k, iar pe a treia linie
sunt cele n elemente din tabloul A.

Date de ieyire
Datele de ieire se vor scrie n Iiierul SUPRA.OUT. Dac problema nu admite soluie
n Iiierul de ieire se va scrie mesajul ,PSRVLELO, altIel se va scrie o succesiune
de indici ai irului A peste care se aplic poziia de nceput a tabloului B.

Restricii yi precizri
- 2 s n s 1000;
- 1 s k s n;
- 0 s a
i
s 100;
- o suprapunere este posibil dac ntreg tabloul B ,ncape n A.

Exemple
SUPRA.IN

SUPRA.IN


SUPRA.OUT
,PSRVLELO


SUPRA.OUT

144 6. Tablouri uniaimensionale (iruri)

6.9. Soluiile problemelor

6.9.1. Suma
Se citete dimensiunea p a irului. Suma s se iniializeaz n aceast problem cu va-
loarea 1, conIorm expresiei date, iar contorul zerourilor cu 0.
Fiecare numr din ir se veriIic pentru a putea decide dac particip la sum sau,
Iiind 0 se mrete contorul corespunztor valorilor nule. Dac numrul citit este nul,
atunci nu particip la sum, deoarece nu putem eIectua mprire cu 0. n Iinal se scrie
valoarea sumei n Iiierul de ieire, precum i numrul elementelor egale cu 0.

Algoritm 6XPD
citeteS
pentru LSexecut:
citeteQ>L@
sfrit pentru
]HURXUL numrul :erourilor }
V iniiali:m suma cu 1, conform expresiei aate }
pentru LSexecut:
citeteQ>L@
dacQ>L@=atunci
VVQ>L@
altfel
]HURXUL]HURXUL
sfrit dac
sfrit pentru
scrieV]HURXUL
sfrit algoritm

6.9.2. Perechi
Dup citirea dimensiunii irului i a elementelor sale, prelucrarea se realizeaz cu o
structur repetitiv de tip pentru. n aceast instruciune trebuie s Iim ateni la va-
loarea Iinal a contorului pentru a nu compara ultimul element cu un al n 1-lea, care
nu exist. Dac vom avea un contor care pornete cu valoarea 1, atunci valoarea Iinal
va Ii n 1, dac pornim cu 2, valoarea Iinal va Ii n. n primul caz vom compara ele-
mentele de indice i i i 1, n al doilea caz comparm elementele de indice i 1 i i.

Algoritm3HUHFKL
citeteQ aimensiunea irului }
pentruLQexecut
citete[>L@
sfrit pentru
6. Tablouri uniaimensionale (iruri) 145

pentruLQexecut echivalent cu SHQWUXLQH[HFXW }
dac[>L@[>L@atunci GDF[>L@[>L@DWXQFL }
scrieLL
sfrit dac
sfrit pentru
sfrit algoritm

6.9.3. Raport
Notm cu nrpare numrul numerelor pare i cu nrimpare numrul numerelor impare
gsite. Ambele variabile se iniializeaz cu 0.
Urmeaz o prelucrare simpl a elementelor irului, n care contorizm numerele
impare i pare.
n Iinal, anterior calculrii i aIirii raportului trebuie s veriIicm dac am ntlnit
cel puin un numr impar pentru a nu risca s mprim cu 0. n cazul n care nu a exis-
tat nici un numr impar, n Iiier scriem mesajul corespunztor.

Algoritm5DSRUW
citeteQ
pentruLQexecut
citeteD>L@
sfrit pentru
QUSDUH
QULPSDUH
pentruLQexecut
dacD>L@ este LPSDUatunci
QULPSDUHQULPSDUH
altfel
QUSDUHQUSDUH
sfrit dac
sfrit pentru
dacQULPSDUH!atunci
scrieQUSDUHQULPSDUH
altfel
scrie1XH[LVWDQXPHUHLPSDUH
sfrit dac
sfrit algoritm

6.9.4. Temperaturi
Vom rezolva problema implementnd algoritmul 'HFL]LHB. Dup citirea irului de
temperaturi vom compara elementele dou cte dou.
n algoritm nu vom citi dimensiunea, deoarece tim c luna iunie are 30 de zile.

146 6. Tablouri uniaimensionale (iruri)

Algoritm7HPSHUDWXUL
pentruLexecut
citeteW>L@
sfrit pentru
L
cat timp in a i-a :i temperatura este mai mic sau egal cu cea ain a i 1-a :i }
ct timp L i W>L@sW>L@ execut
L L trecem la urmtoarea :i }
sfrit ct timp
aac valoarea lui i a atins valoarea 30, inseamn c pan acum toate }
perechile succesive ae temperaturi au respectat proprietatea }
dacLatunci
scrie'$
altfel
scrie18
sfrit dac
sfrit algoritm

6.9.5. ntrebarea yefului
Problema se rezolv cu un algoritm de selectare. Deoarece n Iiierul de ieire mai n-
ti trebuie s scriem numrul persoanelor selectate, nu putem s-i scriem direct n Iii-
er pe baza proprietii, ci trebuie s crem irul lor.
Vom citi irul dat i l vom reine integral n memorie. Pentru irul numerelor
selectate nu putem declara un alt ir, deoarece n memorie nu am avea loc i pentru
acesta. n concluzie, vom lucra ,pe loc, adic vom pstra n acest ir original elemen-
tele care ne intereseaz. (Putem ,strica irul citit, deoarece irul tuturor anilor de na-
tere rmne nealterat n Iiierul de intrare.)
Pstrarea elementelor care ne intereseaz din irul dat se poate realiza n mai multe
Ieluri, dar deoarece ni s-a cerut un program rapid, nu vom eIectua translatri.

Algoritm 6HOHFWDUHB
citeteQ numrul locuitorilor ain comun }
pentruLQexecut
citeteDQ>L@ anii ae natere }
sfrit pentru
QU aeocamaat nu am gsit nici un an mai mic aecat 1989 }
pentruLQexecut
dacDQ>L@atunci
QUQU crete numrul anilor mai mici aecat 1989 }
DQ>QU@DQ>L@ peste elementul DQ>QU@ se copia: valoarea DQ>L@ }
sfrit dac
sfrit pentru
6. Tablouri uniaimensionale (iruri) 147

dac QU atunci scrie '18
altfel scrie QU numrul locuitorilor nscui anterior lui 1989 }
pentruLQUexecut
scrieDQ>L@ anii ae natere }
sfrit pentru
sfrit algoritm

6.9.6. Diriginta
Problema Iace parte din categoria acelora care se rezolv cu algoritmul de partiionare.
Vom alege modelul 3DUWLLRQDUHB, chiar dac aceast problem nu ridic proble-
me de spaiu de memorare, pentru a oIeri un model de rezolvare pentru problemele n
care metoda nu poate Ii ocolit.
n algoritm vom avansa cu primul de la stnga la dreapta n cutarea mediilor care
nu intr n categoria curent i cu ultim de la dreapta la stnga n cutarea mediilor ca-
re trebuie s intre n categoria curent. Cu variabila limita deIinim categoria de medii
care se caut, iar buc reprezint indicele ultimului element care Iace parte din subirul
curent. n buc se va determina lungimea subirului curent, necesar n aIiare.

Algoritm&ODVD
citeteQ numrul elevilor ain clas }
pentruLQexecut
citeteP>L@ meaiile }
sfrit pentru
SULPXO primul inaice al irului curent }
XOWLPQ ultimul inaice al irului curent }
pentruOLPLWDexecut meaii posibile }
SSULPXO variabil auxiliar, reine primul inaice al irului curent }
DX[P>SULPXO@ prima meaie o punem aeoparte }
ct timpSULPXOXOWLPexecut
cutm primul element avana proprietatea ae la areapta spre stanga }
ct timpSULPXOXOWLPinuP>XOWLP@!OLPLWDexecut:
XOWLPXOWLP
P>XOWLP@ are proprietatea cerut, il scriem peste P>SULPXO@ }
sfrit ct timp
dacSULPXOXOWLPatunci
P>SULPXO@P>XOWLP@
SULPXOSULPXO
cutm primul element care nu are proprietatea ae la stanga la areapta }
ct timpSULPXOXOWLPiP>SULPXO@!OLPLWDexecut
SULPXOSULPXO
sfrit ct timp
148 6. Tablouri uniaimensionale (iruri)

P>SULPXO@ nu are proprietatea cerut, il scriem peste P>XOWLP@ }
dacSULPXOQatunci
P>XOWLP@P>SULPXO@
XOWLPXOWLP avansm ae la sfarit spre inceput }
sfrit dac
sfrit dac
sfrit ct timp
P>SULPXO@DX[ elementul pus in DX[ se pune pe locul ,liber" }
aac elementul care a fost in DX[ are proprietatea cerut }
face parte ain subirul curent }
dacP>SULPXO@!OLPLWDatunci
inaicele ultimului element care face parte ain subirul curent }
EXFSULPXO
altfel
P>SULPXO@face parte ain subirul care se va partiiona in continuare }
EXFSULPXO
sfrit dac
scrieEXFS numrul elementelor ain subirul curent }
pentruMSEXFexecut
scrieP>M@
SULPXOEXF inaicele ae inceput al subirului care se va partiiona }
XOWLPQ refacem variabila XOWLP pentru o nou prelucrare }
sfrit ct timp
sfrit algoritm

Aceast rezolvare respect ntocmai cerinele problemei, respectiv mediile elevilor


sunt aIiate n ordinea din irul dat. Dac nu ar Ii existat aceast cerin, irul de medii
putea Ii ordonat.

6.9.7. Generare yir
Deoarece, regula de generare a elementelor s-a dat n enun, vom considera un exem-
plu i vom descrie algoritmul de rezolvare.
S presupunem c dorim aIiarea celui de-al 6-lea termen al irului. Generm pe
rnd toi termenii pn la al 6-lea:
- T
1
1 conine o singur ciIr de 1, deci T
2
11.
- T
2
conine dou ciIre de 1, avem T
3
21.
- Deoarece n T
3
avem o ciIr de 2 i una de 1, rezult T
4
1211.
- n T
4
avem un 1, o ciIr 2, apoi dou ciIre 1, deci T
5
111221.
- n T
6
vom avea T
6
312211, deoarece n T5 am avut 3 de 1, 2 de 2 i un 1.


6. Tablouri uniaimensionale (iruri) 149

Vom lucra cu ajutorul a dou tablouri ae cifre. Unul dintre tablouri se Iolosete
pentru a reine ciIrele din care se Iormeaz prin alipire ultimul termen generat (vechi)
i cellalt pentru termenul care se genereaz pe baza precedentului (nou). Am convenit
ca numrul de elemente pentru tabloul vechi s Iie reinut n variabila kvechi, iar
pentru irul nou n knou. Vom lucra doar cu aceste dou iruri, deoarece nu dorim s
pstrm toate elementele irului, avnd n vedere c se cere doar al n-lea termen. Dup
construirea termenului nou, termenul vechi ia valoarea termenului nou precum i
kvechi se substituie cu knou, urmnd s se genereze un alt termen nou.

Algoritm*HQHUDUH
YHFKL>@ primul termen se iniiali:ea: i aevine imeaiat ,vechi` }
NYHFKL lungimea irului acum este 1 }
N contor pentru termenii irului }
ct timpNQexecut:
algoritmul se termin, cana am aeterminat al n-lea termen }
NQRX aeocamaat nu avem nici o cifr in noul termen }
L
ct timpLsNYHFKLexecut: vom parcurge cifrele vechiului termen }
FRQW in FRQW se numr toate elementele egale cu YHFKL>L@ }
ct timpLNYHFKLiYHFKL>L@YHFKL>L@execut:
FRQWFRQW
LL
sfrit ct timp
NQRXNQRX irul va avea cu un termen mai mult }
QRX>NQRX@FRQW se trece in irul QRX numrul cifrelor curente }
NQRXNQRX mai avem nevoie ae o po:iie }
QRX>NQRX@YHFKL>L@ pentru cifra curent }
LL trecem la urmtoarea cifr ain termenul vechi }
sfrit ct timp
YHFKLQRX
NYHFKLNQRX
NN
sfrit ct timp
pentruLNQRXexecut
scrieQRX>L@
sfrit pentru
sfrit algoritm

6.9.8. Suprapunere
Pe parcursul algoritmului vom Ii ateni ca printr-o suprapunere, (deci decrementare a
valorilor elementelor succesive din A) s nu apar elemente negative.
150 6. Tablouri uniaimensionale (iruri)

Exemplu
n 11, k 3, iar tabloul A este:

A 1 1 1 0 1 2 2 1 0 0 0

Se realizeaz prima suprapunere, ncepnd de la poziia 1:

A 0 0 0 0 1 2 2 1 0 0 0

n tabloul re: reinem prima poziie de suprapunere:

re: 1

Acum analizm elementele tabloului A:
a
1
0, deci se ncearc suprapunere ncepnd de la poziia 2
a
2
0, deci, nici aici nu este necesar suprapunere, se veriIic poziia 3
a
3
0, nu necesit suprapunere
a
4
0, deci se ncearc suprapunere ncepnd cu poziia 5
a
5
1, se realizeaz suprapunere ncepnd de la poziia 5

A 0 0 0 0 0 1 1 1 0 0 0

n tabloul re: reinem a doua poziie de suprapunere:

re: 1 5

a
6
~ 0, deci se realizeaz o suprapunere de la poziia 6

A 0 0 0 0 0 0 0 0 0 0 0

n tabloul re: reinem i aceast poziie de suprapunere:

re: 1 5 6

n continuare, se ncearc suprapunere la poziia 7, 8 i 9. ncepnd cu poziia 10
nu are sens s ncercm suprapunere, deoarece tabloul B nu se mai poate suprapune
neIiind suIiciente elemente n tabloul A.
Pe parcursul prelucrrii se veriIic dac elementele tabloului A au rmas nenegati-
ve i n cazul n care apare un numr negativ se ntrerupe prelucrarea.
n Iinal se veriIic dac irul A mai are sau nu elemente nenule. Acestea pot Ii doar
la sIritul irului, deoarece dac irul B nu poate Ii suprapus, algoritmul se oprete.
Dac toate elementele sunt nule, atunci se scriu elementele tabloului re: n Iiierul de
ieire, altIel se scrie mesajul ,PSRVLELO.
Algoritmul care realizeaz suprapunerea este:

Algoritm 6XSUDSXQHUH
citirea aatelor
L
6. Tablouri uniaimensionale (iruri) 151

S
SR]LWLYaaevrat iniial toate numerele ain A sunt nenegative }
cat timp numerele ain A sunt nenegaitive i B ,incape` in A }
ct timpSR]LWLYiLsQNexecut
aac elementul curent este aiferit ae 0, vom reali:a o suprapunere }
dacD>L@=atunci
M
SS vom avea un element nou in re: }
ct timpSR]LWLYiMsNexecut:
scaem 1 ain k elemente ain A, incepana cu D>L@ }
D>LM@D>LM@
verificm aac noile elemente ain A sunt nenegative }
dacD>LM@atunci
SR]LWLYfals
MM
sfrit ct timp
dacSR]LWLYatunci
UH]>S@L reinem po:iia ae suprapunere }
sfrit dac
sfrit dac
dacD>L@atunci aac elementul curent are valoarea 0 avansm }
LL
sfrit dac altfel, incercm o nou suprapunere incepana cu po:iia i }
sfrit ct timp
dacSR]LWLYatunci aac prin suprapunere nu am obinut numr negativ }
LQ
verificm elementele ae la sfaritului irului A, pentru a veaea aac nu sunt nule }
ct timpD>L@iL>execut:
LL
sfrit ct timp
aac toate elementele ain A au valoarea 0, avem re:ultat }
dacLatunci RNaaevrat
altfelRNfals
sfrit dac
dac SR]LWLYi RNatunci
pentru LSexecut:
scrie UH]>L@
sfrit pentru
altfel
scrie ',PSRVLELO
sfrit dac
sfrit algoritm



Subprograme

Noiunea de modul
Declararea yi apelul unui subprogram
Funcii yi proceduri n Pascal
Dezvoltarea programelor
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
7



7.1. Modul
Noiunea de subprogram a aprut din necesitatea de a diminua complexitatea unui pro-
gram prin descompunerea acestuia n subprograme. Aplicarea acestui concept reIlect
la un anumit nivel principiul programrii moaulare. ConIorm acestui principiu al in-
gineriei programrii, algoritmii se proiecteaz astIel nct acetia s Ioloseasc modu-
le, unde prin modul nelegem o unitate structural de sine stttoare (program, sub-
program sau unitate de program). Fiecare modul trebuie s aib un rol bine determinat
i s Iie conceput astIel nct s poat Ii Iolosit la nevoie i n cadrul unui alt program,
Ir a Ii modiIicat. Orice modul poate Ii la rndul su construit din alte module.

Printre avantafele programrii moaulare de care beneIiciaz i conceptul de sub-
program amintim:
- simplitatea i claritatea programului;
- modulele sunt mai uor de descris, de testat, de corectat i eventual de modiIicat;
optimizarea unui program se poate realiza adesea doar prin nlocuirea unui modul
ineIicient cu altul mai perIormant;
- se evit rescrierea unui algoritm de cte ori este nevoie de acesta;
- un modul o dat pus la punct va Iunciona la Iel de bine i ntr-un alt program care
are nevoie de el;
- se creeaz premisele realizrii unor aplicaii mari prin munca n echip a mai mul-
tor programatori.

Subliniem c este important s se urmreasc creterea independenei subprogra-
melor pentru a mri ansele reutilizrii lor n ct mai multe programe.

7. Subprograme 153

Aplicarea n practic a principiului modularitii implic stabilirea unor detalii pri-
vind:
- alegerea variantei optime de descompunere;
- veriIicarea corectitudinii modului n care s-a realizat descompunerea;
- asigurarea comunicrii adecvate ntre subprograme.

Datele care asigur comunicarea ntre subprogram i modulul apelant sunt deIinite
ntr-o interIa a subprogramului cu exteriorul (numit lista parametrilor formali).
Restul datelor (aate locale) sunt ascunse pentru exterior.
Datele deIinite n subprogram se numesc ,locale i vor tri ct timp subprogramul
respectiv este activ, din momentul activrii (apelrii) pn la execuia ultimei instruci-
uni a subprogramului.
Datele deIinite n programul principal se numesc ,globale i vor Ii ,vzute (cu
excepia celor redeclarate n subprogramul respectiv) n toate subprogramele, deoarece
programul principal este primul bloc care se activeaz i ultimul care se dezactiveaz.
Lista parametrilor formali este declarat n antetul subprogramului i conine para-
metri ae ,intrare` i/sau parametri ae ,ieire`.
n principiu, un parametru care desemneaz date strict de intrare pentru subpro-
gram se va transmite prin valoare, iar cel care este de ieire din subprogram, se va
transmite prin referin.

7.2. Declararea yi apelul unui subprogram
Structura unui subprogram seamn cu structura unui program:

TipSubprogram Nume(lista parametrilor formali) antetul subprogramului }
aeclaraiile aatelor locale
instruciune compus aescrierea algoritmului ae re:olvare a subproblemei }

unde prin TipSubprogram nelegem precizarea tipului subprogramului (n Pascal
funcie sau proceaur). Corpul subprogramului este Iormat din declaraiile locale ale
sale i o instruciune compus.
Apelul subprogramului se Iace n partea de aciuni a modulului apelant. Dac sub-
programul returneaz o singur valoare (avem subprogram de tip funcie) apelul poate
s apar ntr-o expresie, oriunde sintaxa limbajului permite prezena unei expresii. Da-
c un subprogram calculeaz mai multe valori (n Pascal avem subprogram de tip pro-
cedur), apelul subprogramului are loc n instruciunea proceaural (va Ii n sine o
aciune i va aprea oriunde poate s apar o instruciune).
n principiu, un apel se scrie preciznd numele subprogramului, urmat, ntre paran-
teze, de lista parametrilor actuali. EIectul apelului const n activarea subprogramului
i transIerul execuiei programului la prima instruciune executabil din subprogram.
154 7. Subprograme

n prealabil valorile parametrilor actuali transmii prin valoare se copiaz n variabile-
le care sunt parametri Iormali (acetia se pstreaz n timpul executrii subprogramu-
lui n stiva ae execuie), iar corespunztor parametrilor transmii prin reIerin se co-
munic adresele parametrilor actuali. Orice moaificare ae valoare asupra parametru-
lui formal ae tip referin (ae tip aares) se va efectua ae fapt asupra parametrului
actual corespun:tor. Pentru ca acest lucru s Iie posibil, parametrul actual aIerent
unui parametru Iormal de tip reIerin trebuie s Iie o variabil.
Lista parametrilor actuali trebuie s aib tot atia parametri ca i lista parametrilor
Iormali i perechile corespondente de parametri trebuie s Iie compatibile ca tip.

S ptrundem acum mai adnc n procesul apelrii unui subprogram.
Pentru gestionarea simpl i natural a execuiei subprogramelor, se utilizeaz o
zon special a memoriei, numit stiv ae execuie (Stack).
Amintim, c n general, se numete stiv o structur de date cu dou capete ba: i
varf. Introducerea, ct i extragerea de date n/dintr-o stiv este posibil doar la unul
dintre capete, numit varful stivei. Stiva de execuie este o zon de memorie n care se
depun (i din care se extrag) date conIorm acestui principiu.

n urma apelului unui subprogram:
- se ntrerupe executarea modulului apelant
- se salveaz pe stiva de execuie urmtoarele inIormaii:
adresa instruciunii la care se va reveni dup execuia subprogramulului apelat;
valorile parametrilor transmii prin valoare;
adresele parametrilor de tip reIerin;
- se aloc spaiu pe stiv variabilelor locale;
- se activeaz subprogramul (se pred controlul primei instruciuni a acestuia);
- se execut instruciunile subprogramului.

n momentul terminrii execuiei subprogramului se elimin de pe stiv toate inIor-
maiile care s-au depus dup apelul acestuia i controlul revine primei instruciuni de
dup apel din modulul apelant.

Exemplu
Fie trei variabile a, b i c declarate n programul principal. Aceste variabile sunt
iniializate cu 0 i se apeleaz subprogramul Unu. Dup revenirea din subprogram se
aIieaz valorile a, b i c.
Subprogramul Unu are doi parametri Iormali: x este parametru transmis prin valoa-
re, iar y este parametru de tip reIerin. n subprogram se declar variabila local :.
Acest subprogram atribuie celor trei variabile x, y i : valoarea 1.
n urmtoarea Iigur programul principal este simbolizat prin segmentul vertical de
7. Subprograme 155

la 1 la 6, punctul 2 corespunznd apelului de subprogram, iar punctul 5 primei instruc-
iuni de dup apel. Subprogramul este reprezentat de segmentul vertical avnd la cape-
te punctele 3 (prima instruciune a subprogramului) i 4 (ultima instruciune). Liniile
cu sgei arat ordinea de execuie a instruciunilor din cele dou uniti de program.

Programul principal: Subprogram Unu(lista parametrilor Iormali:
variabile globale: a, b, c x transmis prin valoare, y prin reIerin)
1 3 variabil local: :
a 0
b 0 x 1
c 0 y 1
Apel Unu(a,b) 2 : 1

5
4

Pentru a prezenta modul de lucru cu stiva de execuie, vom urmri coninutul aces-
teia n cele 5 puncte (momente) marcate. Variabilele globale a, b i c nu se aloc pe
stiv, ci n seciunea de date existent la dispoziia programului principal, dar le vom
preciza valorile n cele 5 momente.

Moment Variabile globale Coninutul stivei
1 nedeterminate vid
2 a 0; b 0; c 0; vid
3 a 0; b 0; c 0; x 0 adresa lui y : nedeterminat
4 a 0; b 1; c 0; x 1 adresa lui y : 1
5 a 0; b 1; c 0; vid

Observm din tabel c instruciunea de atribuire x 1 nu are eIect asupra parame-
trului actual a, deoarece a Iost transmis prin valoare, n schimb b devine 1, deoarece
aciunea asupra parametrului Iormal y transmis prin reIerin s-a eIectuat asupra para-
metrului actual b.

n limbajul Pascal ntr-un program principal sau subprogram vom avea:

O parte ae aefiniii i aeclaraii.
type... aefiniii ae tip }
const... aefiniii ae constante }
var... aeclaraii ae variabile }
procedure... aeclaraii ae subprograme }
function...
156 7. Subprograme

O parte ae aciuni (o instruciune compus).
Begin...
instruciuni
End.

Observaie
Oricare seciune de deIiniie sau declaraie poate s lipseasc, n schimb instruciu-
nea compus trebuie s Iie prezent (dar, poate Ii vid).

7.3. Funcii yi proceduri (n Pascal)
n limbajul Pascal subprogramele pot Ii:
- funcii: calculeaz mai multe valori; una se returneaz prin numele Iunciei;
- proceduri: calculeaz mai multe valori (sau nici una).

Apelul unei Iuncii Iace parte dintr-o instruciune (unde apare ntr-o expresie), pe
cnd apelul de procedur este deIinit ca Iiind o instruciune.

Declararea unei funcii in limbaful Pascal
function Numefuncielista parametrilor formalitipre:ultat,
aeclaraiile i aefiniiile locale funciei
instruciune compus

Observaie
Printre instruciunile din cadrul instruciunii compuse a Iunciei (corpul Iunciei)
trebuie s existe cel puin o instruciune de atribuire prin care numelui Iunciei i se
atribuie o valoare.

Declararea unei proceauri in limbaful Pascal
procedure NumeProceaurlist parametrilor formali;
aeclaraii i aefiniii locale proceaurii
instruciune compus

Observaii (valabile n limbajul Pascal)
1) n Iaa oricrui parametru Iormal transmis prin reIerin se scrie cuvntul cheie
var. Parametrii Iormali care nu au cuvntul var n Ia se consider a Ii parametri
transmii prin valoare.
2) Tipul parametrilor Iormali se poate preciza aoar cu iaentificator ae tip;
3) Declaraiile n lista parametrilor Iormali sunt separate prin . Atunci cnd avem
mai muli parametri de acelai tip, acetia se separ prin virgul. n urmtorul
exemplu a, a, e i f sunt parametri de ieire (transmii prin reIerin), b este para-
metru transmis prin valoare.
procedure6XPDvarD/RQJLQWE&KDUvarGHI5HDO
3) Parametrii actuali, menionai n apel sunt separai prin virgul.
7. Subprograme 157

4) Valoarea returnat de o Iuncie (innd cont de Iaptul c aceasta returneaz prin
identiIicatorul ei o singur valoare) poate Ii doar de urmtoarele tipuri:
*)

- orice tip ntreg;
- orice tip real;
- caracter (&KDU);
- %RROHDQ;
- enumerare (avnd deIinit identiIicator de tip);
- subdomeniu (avnd deIinit identiIicator de tip);
- string.

Exemplul 1
S se calculeze urmtoarea expresie:
| | ) ( ... 2 1 ) ... 2 1 (
... 2 1
) , (
k n k
n
k n C


= .
Se observ c n numrtor trebuie s calculm Iactorialul lui n, n numitor Iactori-
alul lui k i Iactorialul lui (n k). Vom scrie un subprogram pentru calcularea Iactoria-
lului lui x i l vom apela pentru n, pentru k i pentru (n k). Deoarece acest subpro-
gram, corespunztor unui apel va calcula o singur valoare, ea va Ii atribuit identiIi-
catorului Iunciei cu care o calculm.
n programul principal declarm variabilele n i k, ele reprezint datele de intrare.
Rezultatului nu-i planiIicm nici o variabil, deoarece acesta va Ii accesat pentru aIia-
re prin identiIicatorul Iunciei, n momentul apelului.
Funcia IDFW va avea un parametru Iormal x care va Ii pentru acest subprogram un
parametru de intrare (deci, se va transmite prin valoare). Funcia va returna valoarea
Iactorialului lui x. Variabila local p este necesar, deoarece n absena ei, ar trebui s
scriem n instruciunea for instruciunea de atribuire: IDFWIDFWL care ar nsem-
na apelarea Iunciei IDFW n momentul n care aceasta nc este activ. (De Iapt, dac
am scrie instruciunea de atribuire exact n aceast Iorm, compilatorul ne-ar cere pa-
rametru actual n membrul drept dup identiIicatorul IDFW, deoarece doar n membrul
stng putem scrie identiIicator de Iuncie Ir parametri, apariia n membrul drept al
acestuia Iiind considerat apel de Iuncie
**)
).

Program([SUHVLH
varQN/RQJLQW variabile globale }

functionIDFW[,QWHJHU/RQJLQW antetul funciei }
varL,QWHJHU variabile locale }
S/RQJLQW

*)
Exist Iuncii care returneaz un pointer (vom nva n clasa a X-a).
**)
AstIel am avea un apel recursiv (vezi capitolul 17).
158 7. Subprograme

begin
S iniiali:area factorialului }
forLto[do SSL calcularea factorialului }
IDFWS atribuire iaentificatorului funciei }
end

Begin
5HDG/QQN
:ULWH/QIDFWQIDFWNIDFWQN
End

Exemplul 2
Se consider urmtorul program. Ce aIieaz acesta?

Program([HPSOX
varL,QWHJHU

function6XPDQ,QWHJHU,QWHJHU
var6,QWHJHU
begin
6
forLtodo
66Q
VXPD6
end

Begin
forLtodo begin
:ULWHL
:ULWHVXPDL
:ULWH/QL
end
End

S urmrim variaia variabilelor:
- programul principal ncepe cu ciclul for, prima valoare a variabilei i este 1;
- se aIieaz 1;
- se apeleaz subprogramul cu parametrul actual i, a crui valoare se copiaz n n,
deoarece este transmis prin valoare;
- n subprogram se calculeaz S, care va avea valoarea 0 1 1 1 1 1 5;
- se atribuie valoarea 5 identiIicatorului de Iuncie;
- se aIieaz valoarea 5;
- urmeaz o alt aIiare a variabilei i i (surpriz!) se aIieaz 5 (ultima valoare a lui
i conIorm ciclului for din subprogram), ceea ce conduce i la terminarea instruc-
iunii for din programul principal.
7. Subprograme 159

Se observ c valoarea variabilei globale i s-a modiIicat ,din greeal n subpro-
gram. Pentru a evita astIel de greeli se va urmri ca variabilele Iolosite de subpro-
gram s Iie ntotdeauna deIinite local subprogramului n care se Iolosesc.
Pentru a obine rezultatele dorite, n programul de mai sus se va aduga n partea de
declaraii locale a Iunciei 6XPD declaraia: varL,QWHJHU.

7.4. Dezvoltarea programelor
Dac, n procesul proiectrii algoritmilor, o problem se descompune n subprobleme
i acestea se descompun la rndul lor n alte subprobleme pn cnd se obin subpro-
bleme care nu necesit continuarea procesului de divizare spunem c avem un
program dezvoltat descendent (top down). Aceast tehnic corespunde modului n
care uzual se proiecteaz algoritmii, Iolosind subalgoritmi. Tehnica de proiectare n
care se pornete de la unele programe iniiale, acestea Iiind Iolosite pentru a construi
module din ce n ce mai soIisticate care, asamblate s rezolve problema, se numete
bottom up.

7.4.1. Dezvoltarea ascendent (bottom up)
Un program dezvoltat ascendent va avea toate subprogramele declarate unul dup altul
n programul principal. O astIel de abordare are ca avantaj Iaptul c subprogramele
sunt mai uor de testat i de controlat.


Program principal

Subprogram A


Subprogram B


Subprogram C


Instruciunea compus a
programului principal


Trebuie menionat Iaptul c Iiecare subprogram va putea apela numai subprograme
declarate anterior propriei declaraii. Din aceast restricie de vizibilitate decurge i
dezavantajul acestui stil de lucru care const n dependena subprogramelor de unele
subprograme deIinite anterior.
160 7. Subprograme

7.4.2. Dezvoltarea descendent (top down)
ntr-un program dezvoltat descendent Iiecare subprogram va avea n propria zon de
deIiniii i declaraii subprogramele pe care le Iolosete. n cazul subprogramelor im-
bricate unul n cellalt Iuncioneaz aceleai reguli ca ntre unitatea de program princi-
pal i subprogram, adic entitile declarate, de exemplu, conIorm Iigurii urmtoare, n
subprogramul A se ,vd n subprogramele B, C i D. AstIel, de regul, lista parame-
trilor se scurteaz.

Program principal

Subprogram A

Subprogram B

Subprogram C


Subprogram D

Instruciunea compus a
subprogramului B

Instruciunea compus a
subprogramului A

Instruciunea compus a
programului principal


7.5. Implementri sugerate
n scopul Iormrii deprinderilor de a lucra cu subprograme v recomandm s:
1. rezolvai majoritatea problemelor tratate pn acum, n care problema iniial se
descompune n subprobleme Iolosind subprograme;
2. rezolvai probleme n care un acelai subprogram se apeleaz n mod repetat pen-
tru date diIerite;
3. realizai un unit propriu care conine toate problemele rezolvate cu subprograme i
scrierea unor programe care Iolosesc acest unit.


7. Subprograme 161

7.6. Probleme propuse

7.6.1. Cifre comune
S se aIieze ciIrele comune a dou numere naturale date.

Date de intrare
Cele dou numere se citesc de pe primele dou linii ale Iiierului COMUN.IN.

Date de ieyire
CiIrele comune ale celor dou numere se vor scrie n Iiierul COMUN.OUT, desprite
prin cte un spaiu. n cazul n care nu exist nici o ciIr comun, n Iiierul de ieire
se va scrie 1XH[LVWDFLIUHFRPXQH.

Restricii yi precizri
- 1 s numr
1
, numr
2
s 1000000000.

Exemple
COMUN.IN


COMUN.OUT

COMUN.IN

COMUN.OUT
1XH[LVWDFLIUHFRPXQH

7.6.2. Prime yi ,inversele lor prime
S se genereze toate perechile de numere prime Iormate din trei ciIre care au proprie-
tatea de a Ii, unul inversul celuilalt. Aici prin ,invers nelegem numrul Iormat din
ciIrele numrului dat, n ordine invers.

Date de ieyire
n Iiierul de ieire PRIME.OUT se vor scrie perechile de numere, cte una pe Iiecare
linie, desprite prin cte un spaiu.

Exemplu
PRIME.OUT

162 7. Subprograme

7.6.3. Eliminare de numere perfecte yi prietene
Se consider un ir de numere naturale. S se elimine din acest ir toate numerele per-
Iecte, precum i perechile de numere prietene aIlate pe poziii consecutive.

Date de intrare
Pe prima linie a Iiierului SIR.IN se aIl elementele irului, separate prin spaii.

Date de ieyire
Elementele rmase n ir dup eliminare, se vor scrie n Iiierul SIR.OUT, separate
prin cte un spaiu.

Restricii yi precizri
- 1 s nr s 1000000000.

Exemple
SIR.IN

SIR.OUT


7.6.4. Generarea cuvntului de lungime maxim
S se determine cuvntul de lungime maxim care poate Ii construit din literele unui
text, astIel nct caracterele cuvntului s Iie n ordine alIabetic i s Iie culese din
text exact n ordinea n care se aIl n cuvnt (nu neaprat pe poziii succesive).

Date de intrare
Pe prima linie a Iiierului de intrare CUV.IN se aIl textul dat.

Date de ieyire
Cuvntul determinat, care are lungime maxim se va scrie n Iiierul CUV.OUT.

Restricii yi precizri
- textul are cel mult 255 de caractere;
- n text exist cuvinte Iormate din litere mici ale alIabetului englez i spaii.

Exemplu
CUV.IN
LDUEDVLLDVFD
CUV.OUT
DELV



7. Subprograme 163

7.7. Soluiile problemelor propuse

7.7.1. Cifre comune
Versiunea de algoritm prezentat n continuare se bazeaz pe operaiile cu mulimi. n
acest caz este necesar un subprogram care s construiasc o mulime din ciIrele unui
numr. Subproblemele care vor Ii implementate cu subprograme n cazul acestei pro-
bleme, vor Ii:
- citirea numerelor;
- crearea mulimii de ciIre, (mulimile le implementm cu ajutorul irurilor, dar
dup ce se va nva tipul set (n Pascal), se recomand, ca exerciiu, imple-
mentarea programului, Iolosind acest tip de structur de date);
- aIiarea ciIrelor aparinnd interseciei de mulimi.

n Pascal declaraia irului care reprezint mulimea va Ii:



typePXOWLPHBGHBFLIUHarray>@of%RROHDQ
var$%LQWHUVPXOWLPHBGHBFLIUH

Dac, de exemplu, valoarea elementului $>L@ este aaevrat, nseamn c ciIra L
Iace parte din mulimea $.

Subalgoritm&UHDUHBPXOLPHQXPU0 subprogram tip proceaur }


pentruFLIUDexecut aeocamaat mulimea M este via }
0>FLIUD@fals
sfrit pentru
ct timpQXPU=execut
FLIUDUHVW>QXPU@
0>FLIUD@aaevrat cifra FLIUD exist in numr }
QXPU>QXPU@
sfrit ct timp
sfrit subalgoritm

Intersecia mulimii $ cu % este un ir de valori logice, unde un element are valoa-


rea aaevrat dac, ciIra corespunztoare se regsete i n $ i n %.

Subalgoritm,QWHUVHFLH$%LQWHUV subprogram tip proceaur }
pentruFLIUDexecut aeocamaat intersecia este via }
LQWHUV>FLIUD@fals
sfrit pentru

164 7. Subprograme

pentruFLIUDexecut
dac$>FLIUD@i%>FLIUD@atunci aac FLIUD se afl i in A i in B }
LQWHUV>FLIUD@aaevrat
sfrit dac
sfrit pentru
sfrit subalgoritm

Pentru aIiare, veriIicm apartenena ciIrei cifra, (cifra 0, 1, ..., 9) la mulimea in-
tersecie LQWHUV. Dac mulimea este vid, aIim mesajul cerut n enun.

Subalgoritm$ILDUHLQWHUV subprogram tip proceaur }
H[LVWfals
pentruFLIUDexecut
dacLQWHUV>FLIUD@atunci
scrieFLIUD
H[LVWaaevrat am gsit o cifr comun }
sfrit dac
sfrit pentru
dac nuH[LVWatunci
scrie1XH[LVWDFLIUHFRPXQH
sfrit dac
sfrit subalgoritm

Programul principal va apela subprogramele n ordinea lor Iireasc: citire, creare
mulime A, creare mulime B, determinare intersecie i aIiarea interseciei.

7.7.2. Prime yi ,inversele lor prime
O prim idee de rezolvare ar Ii de a genera pe rnd toate numerele de trei ciIre (de la
100 la 999, eventual de la 101 la 997) i de a veriIica dac att numrul, ct i acel
numr care conine ciIrele numrului dat n ordine invers sunt sau nu numere prime.
n caz aIirmativ acestea le-am scrie n Iiierul de ieire.
Observm c pentru Iiecare numr studiat suntem nevoii s veriIicm de dou ori
dac un numr este prim (o dat pentru numrul dat, a doua oar pentru numrul gene-
rat din ciIrele numrului luate n ordine invers). Acesta este un motiv suIicient de pu-
ternic pentru a scrie un subalgoritm pentru veriIicarea primalitii unui numr. Subpro-
gramul va Ii apelat odat pentru numrul dat i apoi pentru ,inversul su.

Subalgoritm3ULPQU subprogram tip funcie }


OLPLWDparte intreag ain racina ptrat a lui nr
GLYL]RUOLPLWD
ct timpQU nu se imparte exact la GLYL]RUexecut:
GLYL]RUGLYL]RU
sfrit ct timp
7. Subprograme 165

aac s-a gsit cel puin un aivi:or ~1 numrul nr nu este prim }
dacGLYL]RUatunciSULPaaevrat
altfelSULPfals
sfrit dac
sfrit subalgoritm

Determinarea numrului Iormat din ciIrele numrului dat n ordine invers o putem
realiza cu subalgoritmul ,QYHUV, care n Pascal va Ii o Iuncie care va returna valoa-
rea numrului nou.

Subalgoritm,QYHUVQU subprogram tip funcie }
LQY
ct timpQU=execut:
FLIUDUHVW>QU@
LQYLQYFLIUD
QU>QU@
sfrit ct timp
LQYHUVLQY
sfrit subalgoritm

Algoritm3ULPH algoritmul corespun:tor programului principal }
pentruQXPUexecut:
dac3ULPQXPUi3ULPLQYHUVQXPUatunci
scrieQXPULQYHUV
sfrit dac
sfrit pentru
sfrit algoritm

n urma executrii programului care implementeaz acest algoritm observm c Ii-
ecare pereche este afiat ae aou ori. Dac dorim s evitm aIiarea dubl, este nece-
sar modiIicarea algoritmului.
Dac punem condiia ca prima ciIr a primului numr s Iie mai mic sau egal cu
ultima ciIr a primului numr, vom evita aIirile duble. Al doilea numr se constru-
iete ntotdeauna din primul i deci nu este necesar s punem condiii asupra lui. Nu-
merele din perechi astIel construite vor Ii generate cresctor. Instruciunea alternativ
din structura de tip pentru s-ar putea scrie astIel:
dac >QXPU@sUHVW>QXPU@atunci...
n acest algoritm, instruciunea pentru se va relua de 997 101 1 897 ori.

ntr-o alt abordare a acestei probleme generm primul numr din ciIrele a, b i c i
al doilea din aceleai ciIre, dar n ordine invers, innd cont totodat i de condiia ca
prima ciIr s Iie mai mare sau egal cu a treia. Aceast variant are i avantajul de a
166 7. Subprograme

evita generarea dublurilor Ir a Iolosi o condiie suplimentar. De asemenea, nu vom
lua n considerare ca posibil numr avnd proprietatea solicitat dect numerele
impare. Un numr impar are ultima ciIr impar, deci n ciclul for care genereaz a
treia ciIr se vor construi numere doar cu cele 5 ciIre impare (1, 3, 5, 7, 9).
AstIel, numrul executrilor corpului ciclului este 10 9 5 450 (care este mai
mic dect numrul executrilor n cazul primei variante: 897). n plus, aceast variant
nu necesit apelul subalgoritmului LQYHUV, deoarece inversul numrului poate Ii con-
struit printr-o simpl atribuire. Subalgoritmul de veriIicare a primalitii se va executa
doar de 332 de ori, deoarece dac despre QXPU se constat c nu este prim, numrul
LQYHUV nu se mai veriIic.

Algoritm3ULPHBLBLQYHUVDWHBSULPHB
pentruDexecut: prima cifr ain numr nu poate fi 0 }
pentruElaexecut:
ultima cifr trebuie s fie cel puin egal cu prima cifr }
pentruFDlaexecut:
dacF este numr impar atunci limitm generarea la numere impare }
QXPUDEF
LQYHUVFED
dac3ULPQXPUi3ULPLQYHUVatunci
scrieQXPULQYHUV
sfrit dac
sfrit dac
sfrit pentru
sfrit pentru
sfrit pentru
sfrit algoritm

7.7.3. Eliminare de numere perfecte yi prietene
Cerina acestei probleme este de a elimina dintr-un ir numerele perIecte sau perechile
de numere prietene aIlate pe poziii consecutive n ir. Se observ c aciunea princi-
pal este de a elimina unul sau dou elemente dintr-un ir, pe baza unei condiii date.
Subalgoritmul (OLPLQ va elimina elementul avnd indicele po:iie din irul a i va
returna irul modiIicat, precum i dimensiunea actualizat a acestuia.

Subalgoritm(OLPLQDQSR]LLH subprogram tip proceaur }
pentru LSR]LLHQexecut: se aeplasea: elementele tabloului }
D>L@D>L@ cu o po:iie la stanga, incepana cu SR]LLH }
sfrit pentru
QQ numrul ae elemente scaae }
sfrit subalgoritm

7. Subprograme 167

Proprietile numerelor care trebuie eliminate:
- numr perIect: este egal cu suma divizorilor mai mici dect el nsui;
- numere prietene: perechi de numere n care un numr este egal cu suma divizorilor
celuilalt (mai mici dect acesta) i invers (vezi capitolul 4).

Se observ c n ambele situaii este nevoie de suma divizorilor proprii (plus 1) ai
numrului. Deci, va Ii util s scriem un subprogram care calculeaz aceast sum.

Subalgoritm 6XPDBGLYL]RULQXPU subprogram tip funcie }


V in aceast sum se aaaug i 1 }
pentruG>QXPU@execut:
dacUHVW>QXPUG@atunci
VVG
sfrit dac
sfrit pentru
6XPDBGLYL]RULG
sfritsubalgoritm

Cele dou subprograme care veriIic dac un numr este perIect, respectiv dac
dou numere date sunt prietene vor returna o valoare de adevr (aaevrat sau fals).

Subalgoritm3HUIHFWQXPU subprogram tip funcie }
dac6XPDBGLYL]RULQXPUQXPUatunci
3HUIHFWaaevrat
altfel
3HUIHFWfals
sfrit dac
sfrit subalgoritm

Subalgoritm3ULHWHQHQXPUQXPU subprogram tip funcie }
dac 6XPDBGLYL]RULQXPUQXPUi
6XPDBGLYL]RULQXPUQXPUatunci
3ULHWHQHaaevrat
altfel3ULHWHQHfals
sfrit dac
sfrit subalgoritm

7.7.4. Generare cuvnt de lungime maxim
n rezolvarea acestei probleme avem nevoie de dou tablouri de lucru:
- Elementele irului L vor Ii lungimi de cuvinte. L
i
pstreaz lungimea cea mai mare
posibil a cuvntului care ncepe cu litera care n text se aIl pe poziia i. Aceste
cuvinte trebuie s respecte cerina ca literele din componena lor s Iie n ordine
alIabetic.
168 7. Subprograme

- Tabloul urm l construim pentru a asigura posibilitatea de a aIia cel mai lung cu-
vnt gsit. urm
i
va conine pentru a i-a liter din cel mai lung cuvnt, indicele (n
textul dat) a literei urmtoare n cuvnt.

Textul dat l vom parcurge de la sIrit spre nceput, ceea ce nseamn c vom inii-
aliza valoarea L
n
cu 1, avnd semniIicaia c cel mai lung cuvnt care ncepe cu a n-a
liter din text are lungimea 1. De asemenea, putem iniializa i valoarea elementului
urm
n
cu 0, deoarece tim c dup ultimul element nu poate urma nici unul.

WH[WXO D S D F X U J H O L Q
,QGLFH
/
XUP

n cele ce urmeaz vom cuta s determinm acel cel mai lung cuvnt n Iaa cruia
este permis s alipim a i-a liter din textul dat. Evident, aceasta, dac este permis, nu
poate Ii la acest pas dect ultima liter. n concluzie L
12
va Ii egal cu 2 (cel mai lung
cuvnt care ncepe cu a 12-a liter din text are lungimea 2), iar urm
12
va Ii 13 (dup a
12-a liter urmeaz a 13-a):

WH[WXO D S D F X U J H O L Q
,QGLFH
/
XUP

Studiem litera O. Aceasta nu poate Ii pus n Iaa literei L, deoarece ncalc cerina
privind ordonarea alIabetic, dar se poate pune n Iaa literei Q. Deci, cel mai lung
cuvnt care ncepe cu litera O are lungimea 2, iar urmtoarea liter din cuvnt este din
nou a 13-a.

WH[WXO D S D F X U J H O L Q
,QGLFH
/
XUP

Caracterul urmtor este spaiu. Acesta nu intr n conIiguraia nici unui cuvnt,
deci elementele corespunztoare din irul L i urm vor Ii egale cu 0. Urmeaz s studi-
em caracterul H. Acesta se poate pune n Iaa lui O, n Iaa lui L i n Iaa lui Q. Alegem
dintre cele trei posibiliti pe aceea care conduce la un cuvnt mai lung. Dintre literele
O i L o alegem pe prima, i astIel cel mai lung cuvnt care ncepe cu litera H are lungi-
mea 3, iar urmtoarea liter este a 11-a.
7. Subprograme 169

WH[WXO D S D F X U J H O L Q
,QGLFH
/
XUP

Litera J nu poate Ii pus n Iaa lui H, n schimb poate Ii pus n Iaa lui O, L i Q.
Procedm cu litera J la Iel cum am procedat cu H. Literele U i X nu pot Ii puse n Iaa
nici uneia dintre literele luate n considerare pn acum, deci valorile corespunztoare
lor sunt 1 n irul L i 0 n irul urm. Litera F poate Ii pus n Iaa tuturor caracterelor;
alegem acea posibilitate care d natere la un cuvnt mai lung. Aceasta este J. Conti-
nund acest procedeu pn la epuizarea irului, ajungem la urmtoarele valori n cele
dou iruri L i urm:

WH[WXO D S D F X U J H O L Q
LQGLFH
/
XUP

Dup ce am construit aceste dou iruri, lungimea celui mai lung cuvnt este egal
cu valoarea elementului maxim din irul L. Deoarece noi trebuie s aIim nu lungi-
mea, ci cuvntul, vom proceda n Ielul urmtor. AIim acel caracter (din text) care
are indicele egal cu indicele elementului maxim din irul L (cu aceast liter ncepe cel
mai lung cuvnt). Elementul irului urm, avnd acest indice conine indicele literei ur-
mtoare, care se aIieaz. Urmrind astIel coninutul irului urm aIim literele celui
mai lung cuvnt pn la sIritul acestuia (valoarea corespunztoare ultimei litere n
irul urm este 0).


WH[WXO a S D c X U g H l L n
,QGLFH
/
XUP



AIim D, deoarece valoarea maxim n irul L se aIl pe poziia 1. Apoi:
urm
1
5, aIim caracterul F (poziia 5);
urm
5
8, aIim litera J (poziia 8);
urm
8
11, aIim litera O (poziia l1);
urm
11
13, aIim litera Q (poziia 13);
urm
13
0, deci aIiarea se termin.

Subalgoritmul care modeleaz prelucrarea descris este urmtorul:
170 7. Subprograme

Subalgoritm&DXWQWH[WXO
/>Q@ cel mai lung cuvant care incepe cu a n-a litera are lungimea 1 }
XUP>Q@ aup ultima liter nu urmea: alt caracter }
pentruLQexecut
PD[
LQGLFH
pentruMLQexecut
incercm s punem litera WH[WXO>L@ in faa lui WH[WXO>M@ }
dacWH[WXO>L@=iWH[WXO>M@=i
WH[WXO>L@WH[WXO>M@atunci
dac/>M@!PD[atunci aintre literele in faa crora se poate }
pune a i-a liter, o alegem pe cea cu care incepe cel mai lung cuvant }
PD[/>M@
LQGLFHM
sfrit dac
sfrit dac
sfrit pentru
dac WH[WXO>L@= atunci
cel mai lung cuvant care incepe cu a i-a liter este egal cu lungimea celui mai }
/>L@PD[ lung cuvant in faa cruia punem a i-a liter (PD[) 1 }
altfel
/>L@ aac am avut caracter spaiu }
sfrit dac
XUP>L@LQGLFH in LQGLFH am inut minte in faa crei litere o punem }
sfrit pentru
0D[LP cutm lungimea maxim ain L }
6FULH
sfrit subalgoritm

n subalgoritmul de aIiare inaice reprezint indicele elementului maxim n irul L.

Subalgoritm6FULH
scrieWH[WXO>LQGLFH@ afim litera cu care incepe cel mai lung cuvant }
LXUP>LQGLFH@ inaicele literei urmtoare }
ct timpL!execut cat timp exist urmtor }
scrieWH[WXO>L@
LXUP>L@ inaicele literei care urmea: aup cea afiat }
sfrit ct timp
sfrit subalgoritm

Subprogramele 0D[LP i 6FULH Iac parte din zona de declaraii a subprogramului
&DXW. AstIel toate variabilele declarate n &DXW sunt accesibile din subprogramele
0D[LP i 6FULH, acestea neavnd astIel nevoie de parametri.



Stiva

Stiva, o structur de date special
Operaii cu stive
Evaluarea expresiilor aritmetice
Probleme propuse
Soluiile problemelor
Capitolul
8



Definiie
Prin stiv nelegem o structur liniar de date n care att operaiile de introduce-
re ct i cele de extragere se eIectueaz numai la unul dintre capete numit varf (J).
Pe cellalt capt l numim ba: (B).

Modul n care intr i ies elementele din stiv justiIic i denumirea de list LIFO
(Last In First Out).


element nou element eliminat
J
B
J
vf
B
vf


Prelucrarea unei stive necesit pstrarea i gestionarea unui inaicator ae stiv (vf).
O stiv se numete via dac nu conine nici un element (vf B).
O stiv se numete plin dac spaiul de memorie rezervat acestuia este utilizat
n ntregime (vf J).

O imagine sugestiv a unei stive ntlnit n viaa de zi cu zi este cea a unei stive
de lzi cu mere (lzile sunt aezate una peste alta). Acestea, Iiind Ioarte grele, nu
permit dect extragerea lzii de deasupra stivei sau adugarea unei lzi peste cele
deja existente.
172 8. Stiva

Implementarea stivelor se poate realiza uor prin utilizarea unui tablou unidimen-
sional, n cazul cruia vom declara:
D
imStiv o constant care reprezint dimensiunea maxim a stivei;
s
t va Ii o stiv declarat sub Iorma unui tablou unidimensional avnd elemente
indexate de la 1 la DimStiv;
v
f, indicatorul de stiv (un numr natural cuprins ntre 0 i DimStiv).

8.1. Operaii cu stive

8.1.1. Verificarea dac stiva este vid
Aceast operaie o vom realiza cu subalgoritmul 6WLY9LGVWYI care retur-
neaz valoarea aaevrat n cazul n care stiva este vid i fals n caz contrar:

Subalgoritm6WLY9LGVWYI subalgoritm ae tip funcie boolean }
dacYIatunci
6WLY9LGaaevrat
altfel
6WLY9LGfals
sfritdac
sfrit subalgoritm

8.1.2. Verificarea dac stiva este plin
Pentru a realiza aceast operaie, vom Iolosi subalgoritmul 6WLY3OLQ care, de ase-
menea, returneaz valoarea aaevrat n cazul n care stiva este plin i fals n caz
contrar:

Subalgoritm6WLY3OLQVWYI
dacYI'LP6WLYatunci
6WLY3OLQaaevrat
altfel
6WLY3OLQfals
sfritdac
sfrit subalgoritm

n cele ce urmeaz valoarea din vrIul stivei va Ii reIerit prin VW>YI@.

8.1.3. Introducerea unui element n stiv
8. Stiva 173

Dac dorim s adugm un element nou n stiva st, mai nti vom crete numrul
elementelor vf a irului care implementeaz stiva i adugm pe aceast poziie va-
loarea de introdus ce. nainte de adugarea unui element trebuie s veriIicm dac
stiva nu cumva este deja plin. Aceast veriIicare o realizm n unitatea de program
care apeleaz subalgoritmul de adugare pentru a evita ncercarea introducerii unui
element nou n caz de stiv plin.

Subalgoritm$GXJDUHQ6WLYVWYIFH
YIYI
VW>YI@FH
sfrit subalgoritm

8.1.4. Extragerea unui element din stiv
n urma extragerii unui element dintr-o stiv obinem Iie o stiv vid (dac am extras
ultimul element), Iie una care are un element mai puin Ia de situaia anterioar ex-
tragerii. De asemenea, n variabila ce vom avea coninutul acestui element ndeprtat
din vrIul stivei. Aceast operaie nu poate Ii eIectuat dect dac stiva nu este vid
(YI diIerit de 0) condiie care se va veriIica n unitatea de program apelant al
subprogramului ([WUDJHUH'LQ6WLYVWYIFH.

Subalgoritm([WUDJHUH'LQ6WLYVWYIFH
FHVW>YI@
YIYI
sfrit subalgoritm

Reprezentarea cea mai sugestiv a unei stive se Iace pe verti-


cal, baza stivei Iiind jos, iar vrIul (captul n care putem acio-
na) Iiind sus, aa cum se vede n Iigura alturat:
Stiva o vom pstra ntr-un tablou unidimensional, baza stivei
Iiind captul din stnga, iar vrIul Iiind reprezentat n captul din
dreapta.

Exemplu
Am declarat un ir avnd 8 elemente (indexate de la 0 la 7).
Iniializarea stivei const n iniializarea vrIului: vf 0


7
5
3
baza


vf vf
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7



Introducem n stiv nu-
mrul ce 5, acum vf 1:
5

Introducem n stiv ce 7,
acum vf 2:

174 8. Stiva

vf vf
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
5 7
Introducem n stiv nu-
mrul nr 9, acum vf 3:
5 7 9
Extragem elementul din vrIul stivei: obinem ce 9 i acum vf 2:

vf
0 1 2 3 4 5 6 7
5 7

Observaie
ConIorm unei astIel de implementri, valorile extrase din stiv nu se terg Iizic,
ele nu vor mai Ii accesate din cauza vrIului care a Iost deplasat.

8.2. Evaluarea expresiilor aritmetice
Vom considera expresii aritmetice care conin operatori binari i variabile care au
identiIicatori Iormai dintr-o singur liter mic a alIabetului englez. Abordarea acestei
teme conduce spre studiul urmtoarelor trei aspecte:

a) Verificarea corectitudinii unei expresii
Valoarea unei expresii nu se poate calcula dect dac expresia este corect scris. Pen-
tru a decide dac o expresie este corect scris vom veriIica:
d
ac expresia nu conine alte caractere dect cele permise n speciIicarea problemei;
d
ac Iiecare operator are doi operanzi (se consider doar operatori binari);
d
ac numele Iiecrui operand este corect (este Iormat dintr-o liter mic);
d
ac numrul de paranteze deschise este egal cu numrul celor nchise i nu se nchide
nici una Ir s Iie deschis.

b) Aducerea expresiei la forma polonez postfixat
Forma polonez a unei expresii aritmetice este o scriere Ir paranteze a unei expresii
aritmetice care, n scrierea clasic, poate s conin i paranteze. n Iorma polonez
operatorul este scris imediat aup cei doi operanzi. Dac unul din operanzi este la
rndul lui o expresie (o subexpresie), atunci i aceasta se scrie pe baza regulii de mai
sus. Dm cteva exemple:

Expresie
aritmetic
Forma polonez
postfixat
Explicaii
8. Stiva 175

a b * c abc* Fie b*c x. Expresia devine ax ( a b*c).
(a b)/c(a e) ab cae*/ Fie a b x. Expresia devine xcae*/
Fie a e y. Expresia devine xcy*/
Fie c*y :. Expresia devine x:/. nlocuind
valorile x, y, : obinem (a b)/c(a e).

Algoritmul propus pentru transIormarea unei expresii aritmetice (scris n Iorma
clasic) n Iorma polone: postfixat Iolosete dou stive:
- oper, n care se vor introduce operatorii i parantezele deschise;
- polon, n care se va obine expresia n Iorm postIixat.

Se trateaz rnd pe rnd Iiecare caracter al expresiei, astIel:
- dac este liter (operand) sau parantez deschis, se introduce n polon;
- dac este operator, se introduce n oper, dar un operator cu prioritate mic nu poa-
te Ii introdus direct peste un operator cu prioritate mai mare. ntr-un astIel de caz
introducerea n oper se va Iace numai dup ce n prealabil operatorii cu prioritate
mai mare au Iost extrai din oper i introdui n polon;
- dac avem caracter parantez nchis, atunci se mut pe rnd toi operatorii din
oper n polon pn la ntlnirea parantezei deschise corespunztoare. Paranteza
deschis se elimin din oper Ir a mai Ii introdus n polon.

Exemplu
Fie expresia: a*(a*b c) e.
Se introduc operatorii n oper, operanzii n polon pn la ntlnirea semnului care
nu poate Ii introdus peste * deoarece * are prioritate mai mare dect . Operatorul * se
mut n polon, tot acolo se introduce i litera c. Apariia caracterului parantez nchis
are ca eIect mutarea operatorului n polon i eliminarea parantezei deschise din oper.
176 8. Stiva


oper polon
oper polon oper polon
*
*
(
a
b
a
*

(
a
b
a
*
c
a
b
a
*
c

e
*

c) e e

)

n acest caz obinem expresia n Iorm polonez postIixat n polon: aab*c*e.


c) Evaluarea unei expresii date sub form polonez postfixat
S considerm c se citesc valori pentru variabilele a, b, c, a i e (de exemplu, Iie a 1,
b 2, c 7, a 3, e 5). Se construiete irul de valori (v) corespunztor expresiei.
Acest ir va conine attea elemente cte caractere (litere i operatori) exist n expre-
sie, iar valorile corespunztoare poziiilor ocupate de variabile vor Ii valorile citite ale
acestora, n rest, corespunztor caracterelor care reprezint operatori, valoarea este 0.

indice 1 2 3 4 5 6 7 8 9
expresia a a b * c * e
v 3 1 2 0 7 0 0 5 0

Pe msur ce se eIectueaz cte o operaie, din cele dou iruri se vor elimina ele-
mentele corespunznd operatorului i operandului care l precede, deoarece valoarea
rezultat din operaie i va Ii atribuit elementului de pe poziia corespunztoare pri-
mului operand.
n exemplu prima operaie care se eIectueaz este ab*, rezultatul obinut este
1*2 2, valoare care va Ii atribuit irului v pe poziia corespunztoare caracterului a
(este primul operand al expresiei evaluate: ab*). irurile devin:

indice 1 2 3 4 5 6 7
expresia a a c * e
8. Stiva 177

v 3 2 7 0 0 5 0

Urmtoarea operaie de eIectuat este ac, adic 2 7 9. Structura celor dou i-
ruri se modiIic astIel:
indice 1 2 3 4 5
expresia a a * e
v 3 9 0 5 0

Acum urmeaz aa*, respectiv 3*9 27:

indice 1 2 3
expresia a e
v 27 5 0

n Iinal ae, adic 27 5 22, deci se obine:

indice 1
expresia a
v 22
Observaie
n cazul unei expresii n care avem doi operatori consecutivi diIerii, dar ambii au
prioritate maxim, ordinea acestora n Iorma polonez posIixat trebuie inversat pen-
tru a permite eIectuarea operaiilor de la stnga la dreapta.

Exemplu
Fie datele de intrare: a*bc i a 2, b 5, c 3. Forma postIixat corect este
ab*c, iar valoarea corespunztoare expresiei este 1. Dac nu s-ar inversa operatorii,
algoritmul de mai sus ar Iurniza expresia abc* i valoarea 4.

8.3. Probleme propuse

8.3.1. Conversie din baza 10 n alt baz
S se converteasc numrul natural n, dat n baza 10 ntr-o baz de numeraie mai
mic dect 37. CiIrele noului numr se vor pstra ntr-o stiv.

Date de intrare
Din Iiierul DATE.IN se citesc dou numere naturale. Primul reprezint baza de nu-
meraie b n care se dorete conversia, al doilea este numrul n, reprezentat n baza 10.

178 8. Stiva

Date de ieyire
Fiierul de ieire DATE.OUT va conine o singur linie pe care se vor aIla ciIrele num-
rului rezultat din conversie.

Restricii yi precizri
- 1 s n s 1000000000;
- 2 s b s 36.

Exemplu
DATE.IN

DATE.OUT
)$

8.3.2. Tija cu bile
Pe o tij vertical sudat la baz sunt dispuse n bile perIorate n centru i numerotate
cu numere ntregi oarecare. Se dorete eliminarea bilei etichetate cu numrul x, Iolo-
sindu-se o alt tij vertical pe care pot Ii mutate temporar bile.
Scriei un program care citete numerele asociate celor n bile, depune bilele pe tij,
apoi, Iolosind tija de manevr, elimin bila avnd eticheta numrul x.

Date de intrare
Prima linie a Iiierului de intrare TIJA.IN conine numrul x asociat bilei care trebuie
eliminat de pe tij. Pe urmtoarea linie se aIl numerele asociate bilelor. Aceste nu-
mere vor Ii separate prin cte un spaiu.

Date de ieyire
Fiierul de ieire TIJA.OUT va avea urmtoarea structur:
Pe prima linie se va scrie mesajul: 6HLQWURGXFSHWLMD, urmat de valori-
le asociate bilelor n ordinea citirii din Iiierul de intrare.
Pe a doua linie se va scrie mesajul: 6HH[WUDJ, urmat de valorile asociate bi-
lelor care se extrag de pe tija 1 pn la bila numerotat cu valoarea x inclusiv.
Pe a treia linie se va scrie mesajul $XUDPDVSHWLMD, urmat de aIiarea
valorilor asociate bilelor rmase pe tij dup eliminarea bilei avnd ca etichet num-
rul x i dup repunerea pe tija 1 a bilelor pstrate temporar pe tija 2. AIiarea se va
Iace ncepnd cu vrIul tijei, mergnd spre baz.

Restricii yi precizri
- 1 s n s 100;
- numerele de pe bile i x sunt numere ntregi.

Exemplu
8. Stiva 179

TIJA.IN


TIJA.OUT
6HLQWURGXFSHWLMD
6HH[WUDJ
$XUDPDVSHWLMD
Explicaie

12
44
7
8
9
21
Iaza 1
12 21
9
8
7
44
Iaza 2
se extrage:
12
7
8
9
21
Iaza 3


8.3.3. Tij cu bile colorate
Pe o tij vertical se gsesc amestecate m bile colorate, avnd n culori posibile. S se
separe aceste bile, punndu-le pe n tije colorate, Iiecare bil de pe o anumit tij avnd
culoarea tijei. Bilele sunt numerotate de la 1 la m, iar culorile sunt codiIicate cu nume-
re de la 1 la n.

Date de intrare
Pe prima linie a Iiierului BILA.IN se aIl numrul de bile (m) i numrul de culori
(n). Pe urmtoarea linie se aIl irul culorilor celor m bile, separate prin cte un spaiu.

Date de ieyire
Fiierul de ieire BILA.OUT va conine n linii corespunztoare Iiecrei culori, avnd
urmtorul coninut:
7LMDGHFXORDUH, urmat de un numr care reprezint culoarea asociat tijei,
apoi pe rndul urmtor va Ii scris irul numerelor de ordine ale bilelor aIlate pe aceast
tij. Aceste numere vor Ii separate prin cte un spaiu. Dac pe o anumit tij nu exist
bile, pe linia respectiv se va scrie: 7LMDYLGD.

Restricii yi precizri
- 1 s m s 255;
- 1 s n s 100.
180 8. Stiva


Exemplu
BILA.IN

BILA.OUT
7LMDGHFXORDUH

7LMDGHFXORDUH

7LMDGHFXORDUH

7LMDGHFXORDUH
7LMDYLGD

8.3.4. Valoarea unei expresii aritmetice
Se citete o expresie aritmetic n care se Iolosesc operatorii binari: , , *, /, , unde
prin operatorul ,/ vom nelege ctul mpririi ntregi al primului operand la al doi-
lea, iar prin operatorul ,,, restul mpririi ntregi. Variabilele acestei expresii au
identiIicatori Iormai dintr-o singur liter. Nu se Iolosesc constante.
S se veriIice dac expresia este corect scris, iar n caz aIirmativ, s se determine
Iorma polonez postIixat a acesteia i s se calculeze valoarea expresiei pentru valori
ale variabilelor citite ca date de intrare.
Date de intrare
Pe prima linie a Iiierului de intrare EXPRESIE.IN se gsete expresia. Pe urmtoarea
linie se aIl valorile variabilelor separate prin cte un spaiu, n ordinea alIabetic a
denumirii acestora i nu neaprat n ordinea de apariie n expresie.

Date de ieyire
Fiierul de ieire EXPRESIE.OUT va conine pe prima linie expresia aritmetic n Ior-
ma polonez postIixat, iar pe a doua linie se va aIla valoarea expresiei pentru valorile
variabilelor citite din Iiierul de intrare.
n cazul n care expresia nu este corect scris, Iiierul de ieire va conine numai
mesajul: ([SUHVLHLQFRUHFW.

Restricii yi precizri
- expresia citit are cel mult 255 de caractere;
- toate valorile variabilelor sunt numere ntregi;
- expresia nu conine operatori unari.

Exemple
EXPRESIE.IN
DE

EXPRESIE.OUT
DE


8. Stiva 181

EXPRESIE.IN
DEFG

EXPRESIE.OUT
([SUHVLHLQFRUHFWD

EXPRESIE.IN
FEFD

EXPRESIE.OUT
FEFD


8.4. Soluiile problemelor propuse

8.4.1. Conversie din baza 10 n alt baz
Trecerea unui numr ntreg din baza de numeraie 10 ntr-o alt baz se Iace prin
mpriri succesive ale numrului la noua baz, numrul Iiind actualizat la Iiecare pas
cu ctul obinut.

Exemplu
Pentru a trece numrul 5198 din baza 10 n baza 8 avem urmtoarea succesiune de
mpriri:
Numr Ct Baza Rest
5198 649 8 6
649 81 8 1
81 10 8 1
10 1 8 2
1 0 8 1
0


Observm c rezultatul dorit este construit prin culegerea resturilor n ordine inver-
s. n concluzie 5198
10
12116
8
.

Pentru a realiza conversia unui numr dintr-o baz n alta, am putea Iolosi o varia-
bil n care am pstra puterea lui 10 care corespunde rangului acelei ciIre, apoi, la Iie-
care pas am aduna la rezultat ciIra nmulit cu aceast putere.

Exemplu
Rest P Rezultat
6 1 0 6 6
1 10 6 10 16
1 100 16 100 116
2 1000 116 2000 2116
182 8. Stiva

1 10000 2116 10000 12116

O soluie mult mai natural ar consta n pstrarea ciIrelor ntr-un vector, pe msur
ce acestea se obin, aIiarea ciIrelor Icndu-se, dup terminarea algoritmului, n ordi-
ne invers a obinerii lor. n Iuncie de cerin, din irul ciIrelor, parcurs de la sIrit
spre nceput s-ar putea construi i numrul, Iolosind schema lui Horner.

Exemplu

1
1
6
2
1
1
6
1
1
6
2
1
1 2
Introducerea ciIrelor
n timpul conversiei
n momentul
terminrii
conversiei
AIiarea ciIrelor
obinute

O astIel de structur n care adugm i extragem elemente numai la un capt, se
numete stiv. n cazul n care stiva este reprezentat Iolosind un ir, operaiile de ad-
ugare i extragere sunt uor de realizat prin adugarea unui element nou dup ultimul
existent, respectiv prin eliminarea ultimului element adugat.

Exemplul analizat anterior a Iost realizat pentru o baz de numeraie mai mic de-
ct 10. S considerm un exemplu nou unde baza de numeraie s Iie mai mare dect
10. CiIrele bazei 12 vor avea valorile: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Observm c
10 i 11 sunt numere Iormate din mai multe ciIre, n concluzie nu pot Ii utilizate ca
cifre ale numrului rezultat. n locul lor vom Iolosi simboluri (litere ale alIabetului)
conIorm unei convenii binecunoscute:
11 va Ii simbolizat prin litera A;
12 va Ii simbolizat prin litera B.

n cazul unor baze de numeraie mai mari dect 12 vor aprea i alte litere n Iunc-
ie de numrul de valori care stau la baza sistemului de numeraie respectiv. n enun
s-a speciIicat c baza de numeraie este mai mic dect 37, deci cea mai mare poate Ii
36 care necesit 36 de simboluri (de la ciIra 0 la ,ciIra 35. Pentru ciIrele acestei baze
vom Iolosi caracterele de la 0 la 9 (10 caractere) i de la A la Z (26 caractere). Litera
A corespunde ,ciIrei 10 i Z ,ciIrei 35.
Pentru rezolvarea problemei enunate Iolosim ca stiv un ir de caractere, deoarece
ciIrele numrului rezultat vor Ii caractere (ciIre sau litere).
8. Stiva 183

Dac restul mpririi r este mai mic dect 10, caracterul ciIr corespunztor va
avea codul egal cu codul caracterului plus restul obinut din mprire.


caracter
cod


De exemplu, pentru r 3 codul caracterului este egal cu codul caracterului
plus (r). n limbajul Pascal aceast expresie se scrie astIel:
&KU2UGU.
n mod similar, dac restul mpririi este mai mare sau egal cu 10, acest surplus
peste 10 este adunat la codul caracterului $, obinndu-se codul literei corespunz-
toare restului.

Exemplu
Pentru r 14 surplusul este 4. Codul lui $ este , adunm i obinem care
reprezint codul caracterului (.
n algoritmul propus pentru rezolvarea acestei probleme am notat cu nr numrul
ntreg care trebuie convertit, cu b baza de numeraie n care se Iace conversia, cu re:
irul de caractere n care obinem rezultatul conversiei.

Subalgoritm&RQYHUVLHQUEUH]
UH]
repet
FkW>QUE@ calculm catul i restul impririi la ba: }
UUHVW>QUE@ ain U construim cifra corespun:toare in ba:a b }
dacUe^`atunci
F&KU2UGU
altfel
F&KU2UG$U
sfrit dac
QUFkW schimbm valoarea lui QU pentru pasul urmtor }
UH]FUH] aaugm cifra la re:ultat (o alipim) }
pan cnd QU
sfrit subalgoritm

8.4.2. Tija cu bile
Din enunul problemei se observ c se dorete utilizarea a dou structuri de tip stiv
pentru Iiecare din cele dou tije. n aceast situaie ne sunt extrem de utili subalgorit-
mii de introducere n stiv, respectiv extragere din stiv, subalgoritmi a cror utilizare
uureaz mult ntregul algoritm. Aceti subalgoritmi au Iost descrii n partea teoretic
a capitolului i vor Ii utilizai exact n aceeai Iorm i n urmtoarele aplicaii cu stive.
Pentru reprezentarea structurii de date de tip stiv vom declara un tip tablou unidi-
184 8. Stiva

mensional avnd elemente numere ntregi. VrIul stivei va Ii considerat tot timpul in-
dicele ultimului element al irului.
Subalgoritmul de creare a stivei corespunztoare tijei 1:

Subalgoritm&UHDUH6WLYWLMDYI DimStiva 100 }


YI iniiali:are stiva 1 }
citirea numerelor i crearea stivei corespun:toare tifei 1 }
scrie6HLQWURGXFSHWLMD
GLP variabil auxiliar }
ct timp fiierul nu este gol i GLP'LP6WLYDexecut:
citeteQU
GLPGLP
scrieQU
$GXJDUHQ6WLYWLMDYIQU
sfrit ct timp
dacfiierul nu este golatunci nu am putut citi intregul fiier ae intrare }
scrie6WLYDHVWHSOLQD
Oprire forat algoritm
sfrit dac
sfrit subalgoritm
Subalgoritmul n care se realizeaz cutarea bilei avnd eticheta x i crearea stivei
corespunztoare tijei 2:

Subalgoritm&DXW%LODWLMDYIWLMDYI[
YI iniiali:are stiva 2 }
scrie6HH[WUDJ extragerea ae pe tifa 1 a bilelor pan la }
intalnirea bilei avana ca etichet numrul cutat }
ct timpYI!iWLMD>YI@=[execut:
([WUDJHUH'LQ6WLYWLMDYIQU
scrieQU
$GXJDUHQ6WLYWLMDYIQU
sfrit ct timp
dacWLMD>YI@[atunci am afuns la bila cutat care se elimin }
([WUDJHUH'LQ6WLYWLMDYIQU
altfel
scrie 1XH[LVWDELODFXHWLFKHWD[
sfrit dac
sfrit subalgoritm

Bilele rmase pe tija 2 le vom muta napoi pe tija 1:

Subalgoritm0XWWLMDYIWLMDYI[
bilele ae pe tifa 2 sunt puse la loc pe tifa 1 }
8. Stiva 185

ct timpYI!execut
([WUDJHUH'LQ6WLYWLMDYIQU
$GXJDUHQ6WLYWLMDYIQU
sfrit ct timp
sfrit subalgoritm

Pentru a putea aIia bilele de pe tija 1 conIorm cerinei (de la vrI spre baz) va
trebui s le mutm din nou pe tija 2. De Iiecare dat cnd vom lua n mn o bil, vom
scrie numrul corespunztor n Iiierul de ieire:

Subalgoritm$ILDUHWLMDYI
scrie$XUDPDVSHWLMD
YI
ct timpYI!execut:
([WUDJHUH'LQ6WLYWLMDYIQU
scrieQU scrierea in fiier a bilelor rmase }
$GXJDUHQ6WLYWLMDYIQU
sfrit ct timp
sfrit subalgoritm

8.4.3. Bile colorate


Rezolvarea acestei probleme necesit utilizarea unui ir ae n stive n care vor Ii pstra-
te numerele de ordine ale bilelor repartizate pe culori. Sunt Iolosite din nou proceduri-
le clasice de introducere n stiv i extragere din stiv.
Vom declara tipul VWLYD n Ielul urmtor:

typeVWLYDarray>'LP6WLYD@of%\WH
unde 'LP6WLYD este egal cu 255 (numr maxim de bile).

n subalgoritmii de rezolvare am notat cu stive un ir de stive, avnd cel mult 100
de elemente (numrul maxim de culori este 100). VrIurile celor n stive sunt pstrate
n irul de numere naturale varfuri. Stiva st, de vrI varf cuprinde iniial culorile tutu-
ror bilelor citite. Numrul de ordine al bilei curente este nrbila.

Subalgoritm&UHDUHVWYkUI se creea: stiva iniial cu toate bilele }
YkUI
citetePQ numrul bilelor i culorilor }
pentru LPexecut:
citeteFXORDUH culoarea bilei }
$GXJDUHQ6WLYVWYkUIFXORDUH
sfrit pentru
sfrit subalgoritm
186 8. Stiva


Subalgoritmul de rezolvare a problemei:

Subalgoritm'LVWULEXLHVWYkUIVWLYHYkUIXUL
pentruLQexecut: iniiali:area celor n stive }
YkUIXUL>L@
sfrit pentru
lum bilele ae pe tifa iniial i le aistribuim pe stive conform culorilor }
QUBELOP
ct timp YkUI!execut:
([WUDJHUH'LQ6WLYVWYkUIFXORDUH
$GXJDUHQ6WLYVWLYH>FXORDUH@YkUIXUL>FXORDUH@QUBELO
QUBELOQUBELO
sfrit ct timp
sfrit subalgoritm

AIiarea stivelor le vom realiza cu ajutorul subalgoritmului ([WUDJHUH'LQ6WLY.


Subalgoritmul de aIiare l concepem pentru aIiarea unei singure stive, i l vom apela
din programul principal pentru cele n culori. Dac vor Ii stive vide (o anumit culoare
lipsete), n subalgoritmul ([WUDJHUH'LQ6WLY vom aIia un mesaj corespunztor.
Subalgoritm$ILDUH6WLYVWYkUI
ct timpYkUI!execut:
([WUDJHUH'LQ6WLYVWYkUIQUBELO
scrieQUBELO
sfrit ct timp
sfrit subalgoritm

8.4.4. Valoarea unei expresii aritmetice
n prezentarea teoretic, susinut cu exemple, se contureaz trei etape necesare evalu-
rii unei expresii:
- veriIicarea corectitudinii expresiei;
- transIormarea expresiei ntr-o Iorm Ir paranteze;
- evaluarea propriu-zis a expresiei.

Algoritmii de rezolvare ale celor trei subprobleme i vom descrie separat n trei
subalgoritmi.

a) Verificarea corectitudinii unei expresii

Subalgoritm&RUHFWV
Qlungimea irului ae caractere V
SBGHVFKLVH
8. Stiva 187

variabil auxiliar, la sfarit valoarea ei se atribuie iaentificatorului ae funcie }
FRUaaevrat
dacV>@atunci primul caracter il tratm separat }
SBGHVFKLVHSBGHVFKLVH
sfrit dac
dacV>@atunci
FRUfals
sfrit dac
s nu inceap sau s nu se termine cu operator }
dacV>@ este operatorsauV>Q@ este operatoratunci
FRUfals
sfrit dac
L
ct timpLsQiFRUexecut:
dacV>L@nu este liter i nu este operator i nu este parante: atunci
FRUfals
sfrit dac


aac numele unei variabile este format ain mai multe litere }
dacV>L@ este literiV>L@ este literatunci
FRUfals
sfrit dac
sau aac exist aoi operatori ce se succea, expresia nu este corect }
dacV>L@ este operatoriV>L@ este operatoratunci
FRUfals
sfrit dac
dacV>L@atunci se numr parante:ele cana se aeschia }
SBGHVFKLVHSBGHVFKLVH
aac inaintea unei avem o variabil sau , expresia nu este corect }
dacV>L@este litersauV>L@atunci
FRUfals
sfrit dac
sfrit dac
dacV>L@atunci se inchiae o parante: aeschis }
dacSBGHVFKLVHsatunci aac se inchiae una neaeschis }
FRUfals
altfel
SBGHVFKLVHSBGHVFKLVH
sfrit dac
aac in faa unei parante:e inchise este un operator }
188 8. Stiva

dacV>L@ este operator atunci
FRUfals
sfrit dac
sfrit dac
LL
sfrit ct timp
FRUHFWFRU
sfrit subalgoritm

b) Aducerea expresiei la forma polonez postfixat
Vom realiza o implementare care Iolosete cele dou stive prezentate n suportul teo-
retic al leciei. n variabila s citim expresia dat cu paranteze, iar rezultatul se va
construi n re:ult, ambele variabile Iiind de tip string. Cele dou stive (oper i
polon) au vrIurile n vfoper i vfpolon.

Subalgoritm)RUPDBSRVWIL[DWVUH]XOW
YIRSHU
YISRORQ
PXOLPH^` formm mulimea numelor ae variabile ain expresie }
pentruLlungimea lui V execut: prelucrm fiecare caracter al expresiei }
caracterul liter sau parante: aeschis se introauce in polon i se aaaug la }
mulimea ae litere ae care vom avea nevoie pentru a citi valorile variabilelor }
dacV>L@ este liter atunci
DGDXJSRORQYISRORQV>L@ se aaaug in polon }
PXOLPHPXOLPHV>L@
sfrit dac
dacV>L@atunci
DGDXJRSHUYIRSHUV>L@ se aaaug in oper }
sfrit dac
caracterul operator se introauce in oper }
aoi operatori consecutivi ae aceeai prioritate se inversea: }
dacV>L@sauV>L@sauV>L@atunci
dacYIRSHU=i
SULRULWDWHRSHU>YIRSHU@SULRULWDWHV>L@atunci
([WUDJRSHUYIRSHUFH
$GDXJSRORQYISRORQFH
sfrit dac
$GDXJRSHUYIRSHUV>L@
sfrit dac
operatorii cu prioritate mic se mut ain oper in polon pan cana }
in varful stivei oper nu se va mai afla un operator , sau }
dacV>L@sauV>L@atunci
8. Stiva 189

operatorii cu prioritate mai mare se scot ain oper i se introauc in polon }
ct timp YIRSHU=i
3ULRULWDWHRSHU>YIRSHU@SULRULWDWHV>L@execut:
([WUDJRSHUYIRSHUFH
$GDXJSRORQYISRORQFH
sfrit ct timp
$GDXJRSHUYIRSHUV>L@ se aaaug operatorul sau }
sfrit dac
caracterul curent este parante: inchis. se mut toi operatorii }
ain oper in polon pan la intalnirea parante:ei aeschise corespun:toare }
parante:a aeschis se elimin ain oper }
dacV>L@atunci expresia aintre aou parante:e aeschise }
se mut in polon i se elimin ain oper parante:a aeschis }
ct timpRSHU>YIRSHU@=execut:
([WUDJRSHUYIRSHUFH
$GDXJSRORQYISRORQFH
sfrit ct timp
([WUDJRSHUYIRSHUFH eliminm }
sfrit dac
sfrit pentru
tot ceea ce a rmas in oper se mut in polon }
ct timpYIRSHU=execut:
([WUDJRSHUYIRSHUFH
$GDXJSRORQYISRORQFH
sfrit ct timp
sfrit subalgoritm

c) Evaluarea unei expresii aflate n form polonez postfixat


Pentru nceput se construiete un ir v din valorile variabilelor din expresie n ordinea
n care apar n expresie. Poziiile corespunztoare operatorilor sau parantezelor se ini-
ializeaz cu valoarea 0.
Expresia Iiind n Iorm polonez postIixat, la Iiecare pas cutm primul operator
pentru a eIectua nti acea operaie.
n algoritm notm cu n lungimea expresiei, deci i a irului v, iar n re: calculm
valoarea expresiei. Variabila logic gata, va primi valoarea aaevrat n momentul n
care s-a terminat calcularea valorii expresiei. Dup eIectuarea unei operaii se terge
unul dintre operanzi (de exemplu al doilea) precum i operatorul eIectuat, att din ex-
presie ct i din irul v. Valoarea calculat se aeaz n irul v pe poziia corespunz-
toare variabilei pstrate.
Cnd irul evalurilor s-a ncheiat avem o singur variabil a crei valoare este va-
loarea expresiei date. Observm c identiIicatorul variabilei nu are nici o semniIicaie
pentru rezultat.
190 8. Stiva


SubalgoritmYDORDUHBH[SUHVLHV returnea: un intreg }
pentruLQexecut:
dacV>L@ este liter atunci
Y>L@valoarea numeric a variabilei avana iaentificatorul inV>L@
altfel
Y>L@
sfrit dac
sfrit pentru
repet cutm primul operator pentru a efectua intai acea operaie }
L
ct timpV>L@=iV>L@=i V>L@=i
V>L@=iV>L@=si LQexecut:
LL
sfrit ct timp
efectum operaia }
dacV>L@atunciUH]Y>L@Y>L@
altfel
dacV>L@atunciUH]Y>L@Y>L@
altfel
dacV>L@atunciUH]Y>L@Y>L@
altfel
dacV>L@atunciUH]>Y>L@Y>L@@
altfel
dacV>L@atunciUH]UHVW>Y>L@Y>L@@
sfrit dac
sfrit dac
sfrit dac
sfrit dac
sfrit dac
dacLQi V>L@ este literatunciJDWDaaevrat
altfelJDWDfals
dacnuJDWDatunci
tergem unul aintre operan:i i operatorul efectuat ain expresie i ain irul v }
se terg ain V aou caractere incepana cu po:iia L
valoarea calculat aevine in irul v valoarea variabilei pstrate }
Y>L@UH]
tergem ain v aou elemente incepana cu po:iia L }
pentruNLQexecut:
Y>N@Y>N@
QQ
sfrit pentru
8. Stiva 191

sfrit dac
pn cnd JDWD
am rmas cu o singur variabil care conine valoarea expresiei }
YDORDUHBH[SUHVLHY>@
sfrit algoritm



Ordonri yi cutri

Algoritmi de ordonare
Algoritmi de cutare
Interclasarea a dou tablouri unidimensionale
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
9



9.1. Ordonri
Fie A (a
1
, a
2
,...,a
n
) un tablou unidimensional cu n elemente. A oraona (sorta) tabloul
nseamn a ordona cresctor sau descresctor elementele tabloului.
n cartea lui D. Knuth ,Arta programrii calculatoarelor, vol. III (Cutri i orao-
nri) sunt prezentate 33 de metode de ordonare. Dintre acestea vom nva doar cteva.

9.1.1. Metoda bulelor
S presupunem c dorim o ordonare cresctoare a irului. Algoritmul const n parcur-
gerea tabloului A de mai multe ori, pn cnd devine ordonat. La Iiecare pas se com-
par dou elemente alturate. Dac a
i
~ a
i 1
,

(i 1, 2, ..., n 1), atunci cele dou va-
lori se interschimb ntre ele. Controlul aciunii repetitive este dat de variabila boolea-
n ok, care la Iiecare reluare a algoritmului primete valoarea iniial aaevrat, care se
schimb n fals dac s-a eIectuat o interschimbare de dou elemente alturate. n mo-
mentul n care tabloul A s-a parcurs Ir s se mai eIectueze nici o schimbare, ok r-
mne cu valoarea iniial aaevrat i algoritmul se termin, deoarece tabloul este or-
donat.
Interschimbarea a dou elemente se realizeaz prin intermediul variabilei auxiliare
aux care are acelai tip ca i elementele tabloului.

Subalgoritm0HWRGDBEXOHORUDQ
repet
RNaaevrat
pentruLQexecut:
dacD>L@!D>L@atunci
RNfals
DX[D>L@
192 9. Oraonri i cutri

D>L@D>L@
D>L@DX[
sfrit dac
sfrit pentru
pn cndRN
sfrit subalgoritm

Fie de exemplu tabloul A avnd 5 elemente numere reale: 0.0, 1.1, 1.0, 1.2 i 0.08.

Prima parcurgere a tabloului (ok este iniializat cu aaevrat):

a
1
0.0 a
2
1.1 a
3
1.0 a
4
1.2 a
5
0.08 ok
0.0 1.0 1.1 1.2 0.08 fals
0.0 1.0 1.1 0.08 1.2 fals

0.0 1.1, rmn neschimbate, 1.1 ~ 1.0, le interschimbm. Deoarece 1.1 1.2,
avansm i constatm c 1.2 ~ 0.0.8, deci din nou avem interschimbare. n consecin,
la ieire din structura pentru ok este fals. Observm c 1.2 a ajuns pe locul lui deIi-
nitiv. Urmeaz a doua parcurgere a tabloului (ok primete din nou valoarea aaevrat).

a
1
0.0 a
2
1.0 a
3
1.1 a
4
0.08 a
5
1.2 ok
0.0 1.0 0.08 1.1 1.2 fals

Am avut interschimbare i de data aceasta, deci ieim cu ok fals. La acest pas 1.1
a ajuns pe locul su deIinitiv. A treia parcurgere a tabloului ncepe cu reiniializarea
lui ok cu valoarea aaevrat.

a
1
0.0 a
2
1.0 a
3
0.08 a
4
1.1 a
5
1.2 ok
0.0 0.08 1.0 1.1 1.2 fals

Am interschimbat 0.08 cu 1.0, cel din urm astIel a ajuns pe locul su n irul ordo-
nat. A patra parcurgere a tabloului se Iinalizeaz cu valoarea ok aaevrat, deoarece
nu am eIectuat nici o interschimbare, ceea ce nseamn c procesul de ordonare s-a n-
cheiat.

a
1
0.0 a
2
0.08 a
3
1.0 a
4
1.1 a
5
1.2 ok
0.0 0.08 1.0 1.1 1.2 aaevrat

Observaia cu privire la Iaptul c la Iiecare parcurgere a ajuns cel puin un element
pe locul su deIinitiv n irul ordonat poate Ii IructiIicat, deoarece constatm c ast-
Iel, la urmtorul pas nu mai sunt necesare veriIicrile n care intervine acest element i
cele care se aIl dup el n ir. Rezult c la Iiecare parcurgere am putea micora cu 1
numrul elementelor veriIicate. Dar este posibil ca la o parcurgere s ajung mai multe
9. Oraonri i cutri 193

elemente n locul lor deIinitiv. Rezult c vom ine minte indicele ultimului element
care a intervenit n interschimbare i veriIicrile le vom eIectua doar pn la acest
element. Similar, se poate restrnge i indicele primului element care a intervenit n
interschimbri. AstIel, ajungem la urmtorul subalgoritm mbuntit ca perIorman:

Subalgoritm%XOHBPEXQWLWQD
VWYHFKL marginea ain stanga a subirului care urmea: s fie verificat }
GUYHFKLQ marginea ain areapta }
repet
RNaaevrat presupunem c irul este oraonat }
GU inaicele ultimului element interschimbat }
verificm elementele ain subirul curent }
pentruLVWYHFKLGUYHFKLexecut
dacD>L@!D>L@atunci
,QWHUVFKLPED>L@D>L@
RNfals
dacL!GUatunci am interschimbat elementul ae inaice i }
GUL inaicele ultimului element interschimbat }
sfrit dac
sfrit dac
sfrit pentru
dacnuRNatunci a avut loc o interschimbare }
GUYHFKLGU actuali:m marginea ain areapta }
VWQ marginea ain stanga }
verificm elementele ain subirul curent avansana ain areapta spre stanga }
pentruLGUYHFKLVWYHFKLexecut
dacD>L@!D>L@atunci
,QWHUVFKLPED>L@D>L@
RNfals
dacLVWatunci am interschimbat elementul ae inaice i }
VWL inaicele primului element interschimbat }
sfrit dac
sfrit dac
sfrit pentru
VWYHFKLVW actuali:m marginea ain stanga }
sfrit dac
pn cndRN
sfrit subalgoritm

Metoda bulelor nu este cea mai perIormant modalitate de a ordona un ir cu multe
elemente, dar n cazul irurilor ,aproape ordonate, cu optimizrile de mai sus, poate
deveni mai eIicient dect alte metode.
194 9. Oraonri i cutri

9.1.2. Sortare stabilind poziia definitiv prin numrare
Aceast metod const n construirea unui nou tablou B care are aceeai dimensiune ca
i tabloul A n care depunem elementele din A, ordonate cresctor.
Vom analiza Iiecare element i l vom compara cu Iiecare alt element din ir pentru
a putea reine n variabila k numrul elementelor care sunt mai mici dect elementul
considerat. AstIel, vom aIla poziia pe care trebuie s-l punem pe acesta n irul B. Da-
c n problem avem nevoie de irul ordonat tot n tabloul A, vom copia n A ntreg
tabloul B.

Subalgoritm 1XPUDUHQD
pentru LQ execut:
N
pentru MQexecut:
dac D>L@>D>M@i L=Matunci
NN numrm cate elemente sunt mai mici sau egale cu D>L@ }
sfrit dac
sfrit pentru
E>N@D>L@ pe D>L@ il punem pe urmtoarea po:iie ain b }
sfrit pentru
DE copiem peste irul a intreg irul b }
sfrit subalgoritm

Exemplu
Fie tabloul A cu 4 elemente: 7, 2, 3, 1.

i f Relaia k b
k 1

1 1 i f 0
1 2 7 ~ 2 1
1 3 7 ~ 3 2
1 4 7 ~ 1 3 b
4
7
2 1 2 7 0
2 2 i f 0
2 3 2 3 0
2 4 2 ~ 1 1 b
2
2
3 1 3 7 0
3 2 3 ~ 2 1
3 3 i f 1
3 4 3 ~ 1 2 b
3
3
4 1 1 7 0
4 2 1 2 0
4 3 1 3 0
4 4 i f 0 b
1
1
9. Oraonri i cutri 195

9.1.3. Sortare prin selecie direct
Metoda precedent are dezavantajul c necesit de dou ori mai mult memorie dect
tabloul A. Dac dorim s evitm aceast risip, putem aplica metoda de ordonare prin
selectarea unui element i plasarea lui pe poziia sa Iinal.
De exemplu, n caz de ordonare cresctoare, pornind de la primul element se caut
valoarea minim din tablou. Aceasta se aeaz pe prima poziie printr-o interschimba-
re ntre elementul de pe prima poziie i elementul minim. Apoi, se reia algoritmul,
pornind de la a doua poziie i se caut minimul ntre elementele a
2
, ..., a
n
.

Acesta se
interschimb cu al doilea dac este cazul. Procedeul se continu pn la ultimul ele-
ment.
Pseudocodul algoritmului de sortare prin selecia minimului este:

Subalgoritm 6HOHFLHQD:
pentru LQexecut:
PLQD>L@
pentruMLQexecut:
dacPLQ!D>M@atunci
PLQD>M@
NM
sfrit dac
dacPLQ=D>L@atunci
DX[D>L@
D>L@D>N@
D>N@DX[
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

Algoritmul se poate scrie i prin determinarea valorilor maxime i mutarea lor n
tablou de la dreapta la stnga, astIel rezultnd, de asemenea, un ir ordonat cresctor.

Exemplu
Fie tabloul A (5, 0, 8, 7, 3).

Pas Tabloul A Element minim Po:iia minimului Noul tablou A
1 (5, 0, 8, 7, 3) 0 2 (0, 5, 8, 7, 3)
2 (0, 5, 8, 7, 3) 3 5 (0, 3, 8, 7, 5)
3 (0, 3, 8, 7, 5) 5 5 (0, 3, 5, 7, 8)
4 (0, 3, 5, 7, 8) 7 4

196 9. Oraonri i cutri

9.1.4. Sortarea prin inserie direct
Ideea algoritmului este de a considera pe rnd Iiecare element al tabloului i de a-l in-
sera n subtabloul ordonat pn la momentul respectiv pe locul su. Acest loc s-ar pu-
tea s nu Iie deIinitiv, deoarece este posibil ca urmtorul element s se insereze unde-
va n Iaa acestuia.
Dac s-a ajuns la elementul a
f
, (f 1, 2, ..., n) i toate elementele a
1
, a
2
, ..., a
f 1
au
Iost ordonate, nseamn c trebuie s-l inserm pe a
f
ntre aceste elemente. l compa-
rm pe rnd cu a
f 1
, a
f 2
, ... pn cnd ajungem la un prim element a
i
avnd proprieta-
tea a
i
a
f
. Prin urmare a
f
se insereaz dup a
i
. Aceast inserare provoac deplasarea
elementelor care-l succed pe a
i
cu o poziie spre dreapta.

Subalgoritm ,QVHULHQD
pentruLQexecut:
FRSLHD>L@ salvm al i-lea element (s-ar putea pierae cu translatrile) }
S in p vom avea inaicele unae il vom pune }
ML vom cuta locul printre elementele ain faa lui D>L@ }
JVLWfals
ct timpM>i nuJVLWexecut
dacD>M@sFRSLHatunci
SM aac D>M@sD>L@, aici trebuie s-l punem }
JVLWaaevrat am gsit locul }
altfel
D>M@D>M@ pan nu am gsit locul, mutm elementele la areapta }
sfrit dac
MM
sfrit ct timp
D>S@FRSLH il punem pe D>L@ pe locul ,eliberat` }
sfrit pentru
sfrit subalgoritm

Exemplu
Fie tabloul A (3, 3, 2, 0, 0, 5).

i f i 1 copie a
i
Relaie gsit p A
2 3 fals 0 (3, 3, 2, 0, 0, 5)
2 1 3 3 s 3 aaevrat 1 (3, 3, 2, 0, 0, 5)
3 2 fals 0 (3, 3, 2, 0, 0, 5)
3 2 2 2 s 3 aaevrat 2 (2, 3, 3, 0, 0, 5)
4 3 0 3 ~ 0 fals 0 (2, 3, 3, 3, 0, 5)
4 2 0 3 ~ 0 fals 0 (2, 3, 3, 3, 0, 5)
9. Oraonri i cutri 197

4 1 0 2 ~ 0 fals 0 (2, 2, 3, 3, 0, 5)
4 0 0 0 (0, 2, 3, 3, 0, 5)
5 4 0 3 ~ 0 fals 0 (0, 2, 3, 3, 3, 5)
5 3 0 3 ~ 0 fals 0 (0, 2, 3, 3, 3, 5)
5 2 0 2 ~ 0 fals 0 (0, 2, 2, 3, 3, 5)
5 1 0 0 0 aaevrat 1 (0, 0, 2, 3, 3, 5)

9.1.5. Sortare prin numrarea apariiilor
Algoritmii prezentai anterior sunt relativ mari consumatori de timp. De exemplu, pen-
tru a ordona un ir de 1000 de elemente, numrul comparaiilor pe care le va executa
oricare dintre algoritmii prezentai va Ii aproximativ de 1 milion. n clasa a 10-a vom
nva alte metode de ordonare cu un timp de execuie mai bun. Dar, considerm im-
portant s se nvee i cel puin o metod de ordonare care se implementeaz cu un al-
goritm liniar. Un algoritm liniar execut un numr de operaii proporional cu numrul
elementelor, adic pentru a ordona 1000 de elemente vor Ii necesare c 1000 de opera-
ii, unde c este o constant.
Dac avem un ir de elemente de tip ordinal care sunt dintr-un interval de cardinali-
tate nu Ioarte mare, vom putea realiza o oraonare liniar. Corespunztor Iiecrei va-
lori ntlnite n ir n timpul prelucrrii mrim cu 1 valoarea elementului avnd indice-
le (n acest ir de contoare) egal cu valoarea elementului n irul de ordonat. n Iinal,
vom suprascrie n irul dat attea elemente cu valori ai indicilor elementelor diIerite de
0 ct este valoarea elementului n acest ir a numerelor de apariii.
Important este s reinem particularitile pe care trebuie s le aib irul dat pentru
ca aceast metod s se poat aplica:
valorile elementelor trebuie s Iie de tip ordinal;
numrul elementelor mulimii din care irul primete valori trebuie s Iie relativ
mic (dac n program nu exist alte structuri de date, din cei 64KB ai memoriei,
scdem spaiul necesar irului de ordonat i putem calcula spaiul pe care l avem
la dispoziie);
valorile posibile n irul de ordonat trebuie s Iie din intervalul |x..y|, unde y x
1 va Ii dimensiunea irului de contoare.

Exemplu
varVLUarray>@of,QWHJHU cel mult 20000 ae numere }
IUHFYarray>@of,QWHJHU valori posibile intre -500 i 500 }

Subalgoritm2UGRQDUHBFXBLUBGHB)UHFYHQHQD[\
pentruL[\execut
IUHFY>L@
sfrit pentru
198 9. Oraonri i cutri

pentruLQexecut
IUHFY>D>L@@IUHFY>D>L@@
sfrit pentru
N
pentruL[\execut
pentruMIUHFY>L@execut
NN
D>N@L
sfrit pentru
sfrit pentru
sfrit subalgoritm

Fie irul (2, 0, 1, 0, 2, 3, 0, 2). Pentru acesta declaraia cea mai ,strns n
Pascal este:
varVLUarray>@of,QWHJHU
IUHFYarray>@of%\WH

irul de Irecvene va Ii (3, 1, 3, 0, 0, 1).
Corespunztor ultimei secvene din algoritm se vor scrie trei valori 2 consecutive
n a, apoi 1 element va Ii egal cu 1, urmeaz trei buci de 0, urmat de o valoare 3:
2, 2, 2, 1, 0, 0, 0, 3.

9.2. Algoritmi de cutare

9.2.1. Cutare secvenial
Se d un tablou unidimensional A (a
1
, a
2
, ..., a
n
) i o valoare p. Se pune problema s
veriIicm dac valoarea p se aIl ntre elementele tabloului sau nu.
Dac irul nu este ordonat trebuie s ncepem cutarea, comparnd primul element
din ir cu elementul cutat i s continum Iie pn cnd l gsim, Iie ajungem la sIr-
itul irului, aa cum am nvat n capitolul 6. Dac trebuie s aIlm toate poziiile din
ir pe care se aIl valoarea cutat, va trebui s l parcurgem n ntregime.

9.2.2. Cutare binar
Dac tabloul A este sortat n ordine cresctoare, atunci n schimb, se poate realiza o c-
utare mai rapid. Presupunem aadar c elementele tabloului A sunt aranjate n ordine
cresctoare.
ntre elementele tabloului A avem relaiile a
1
s a
2
s ... s a
m 1
s a
m
s a
m 1
, ... s a
n
,
unde a
m
reprezint elementul din mijloc, poziie calculat cu Iormula m |(n 1)/2|.
Valoarea cutat este p. De asemenea, convenim s notm cu s extremitatea stng i
cu a extremitatea dreapt a intervalului n care eIectum cutarea. Iniial s 1 i a n.
9. Oraonri i cutri 199

Comparm valoarea p cu valoarea elementului din ir de pe poziia din mijloc m.
Dac p a
m
, atunci cutarea se ncheie cu succes. Dac p = a
m
,

atunci vom decide n care
parte a irului (mprit de a
m
n dou subiruri) vom continua cutarea. Dac p a
m
,

atunci cutarea se va continua n prima jumtate a irului, iar dac p ~ a
m
,

atunci cuta-
rea se transIer n a doua jumtate a tabloului. AstIel eliminm un numr considerabil
de comparaii i timpul de lucru al programului se reduce.
S presupunem c p a
m
. n acest caz particularizm capetele intervalului n care
vom cuta n continuare astIel: s 1 i a m 1, innd cont de Iaptul c elementul a
m

nu mai necesit veriIicri.
Dac p ~ a
m
, atunci s m 1 va Ii indicele extremitii stngi al intervalului nou i
n va Ii extremitatea dreapt.
n Iuncie de relaia dintre p i a
m
se alege unul dintre subiruri pentru care se deter-
min indicele elementului din mijloc n mod asemntor: |(s a)/2|.

Algoritmul se continu pn cnd Iie la un moment dat a
m
p, ceea ce nseamn c
am ncheiat cutarea cu succes, Iie ajungem la un subir curent vid, adic avnd mar-
ginea din stnga mai mare dect marginea din dreapta (s ~ a), ceea ce nseamn c
avem o cutare Ir succes.
Algoritmul descris mai sus este:

Subalgoritm&XWDUHBELQDUQDS
V
GQ
HVWHfals
ct timpVsGi nuHVWHexecut
P>VG@
dacSD>P@atunci
HVWHaaevrat
altfel
dacSD>P@atunci
GP
altfel
VP
sfrit dac
sfrit dac
sfrit ct timp
dacHVWHatunci
scrie9DORDUHDSVHDIODSHSR]LWLDP
altfel
scrie9DORDUHDSQXVHDIODLQVLU
sfrit dac
sfrit subalgoritm
200 9. Oraonri i cutri

Exemplu
Fie tabloul de numere ntregi (1, 3, 5, 7, 9, 11) i p 1.

s a m p a
m
p? Relaia dintre a
m
i p este
1 6 3 1 a
m
5 = p 1 p a
m
(1 5) trecem n subirul stng fals
1 2 1 1 a
m
1 p 1 p a
m
(1 1) cutare cu succes aaevrat

Vom cuta n acelai tablou valoarea p 12.

s a m p a
m
p? Relaia dintre a
m
i p este
1 6 3 12 a
m
5 = p 12 p ~ a
m
(12 ~ 5) trecem n subirul drept fals
4 6 5 12 a
m
9 = p 12 p ~ a
m
(12 ~ 9) trecem n subirul drept fals
6 6 6 12 a
m
11 = p 12 p ~ a
m
(12 ~ 11) trecem n subirul drept fals
7 6 6 12 a
m
11 = p 12 p ~ a
m
(12 ~ 11) trecem n subirul drept fals
s ~ a i este fals algoritmul se termin cu cutare Ir succes

9.3. Interclasarea a dou tablouri unidimensionale
n capitolul 6 am vzut cum procedm n cazul n care dorim s crem un ir nou din
dou iruri date, astIel nct Iiecare valoare s apar o singur dat, deoarece cu acele
iruri am simulat mulimi. n cazul n care irurile sunt ordonate, problema ,intersec-
iei i a ,reuniunii se prezint altIel.
Fie A (a
1
, a
2
, ..., a
n
) avnd elementele a
1
s a
2
... s a
n
i B (b
1
, b
2
, ..., b
m
) avnd
elementele b
1
s b
2
s ... s b
m
. Se cere s se construiasc tabloul C (c
1
, c
2
, ..., c
n m
)
avnd elementele c
1
s c
2
s ... s c
n m
care s conin toate elementele lui A i B.

Exemplu
A (2, 4, 6, 10), n 4
B (1, 3, 5, 9, 10, 11), m 6
C (1, 2, 3, 4, 5, 6, 9, 10, 10, 11), k 10

n rezolvare vom avansa n paralel n cele dou iruri date. Primul element n irul
nou va Ii Iie a
1
, Iie b
1
. Pentru a ti care dintre cele dou numere va Ii ales, trebuie s le
comparm. Dac a
1
este mai mic dect b
1
, atunci pe acesta l ,consumm din irul a
i pregtim indicele elementului urmtor din acesta. n caz alternativ, procedm la Iel
cu indicele f, dup ce aezm elementul b
1
n irul c. (Dac ni s-ar cere ca Iiecare va-
loare s apar o singur dat, n caz de egalitate, am copia unul dintre acetia n c, i
am avansa n ambele iruri.) Vom eIectua aceti pai pn cnd careva din iruri se
sIrete, moment n care copiem elementele rmase din cellalt ir n irul nou. Din
moment ce nu putem ti care ir s-a ,consumat integral, vom scrie secvena respecti-
v pentru ambele iruri.

9. Oraonri i cutri 201

Subalgoritm,QWHUFODVDUHQDPEEXFF
EXF
L
M
ct timpLsQiMsPexecut:
EXFEXF
dacD>L@E>M@atunci
F>EXF@D>L@
LL
altfel
F>EXF@E>M@
MM
sfrit dac
sfrit ct timp
ct timpLsQexecut
EXFEXF
F>EXF@D>L@
LL
sfrit ct timp
ct timp MsPexecut:
EXFEXF
F>EXF@E>M@
MM
sfrit ct timp
sfrit subalgoritm

Analiznd acest algoritm, observm c dac am Ii avut ,norocul ca a
n
s Iie egal
cu b
m
, atunci ultimele dou structuri ct timp nu se executau niciodat. Vom explo-
ata aceast observaie, aeznd dou elemente Iictive (numite Irecvent santinele) dup
ultimele elemente din cele dou iruri. Deoarece irurile sunt ordonate cresctor, vom
Ii ateni s aib valorile mai mari dect ultimul (cel mai mare) din cellalt ir (l-am no-
tat cu LQILQLW).

Subalgoritm,QWHUFODVDUHQDPEEXFF
EXF
L
M
D>Q@LQILQLW
E>P@LQILQLW
ct timpLQsauMPexecut
EXFEXF
202 9. Oraonri i cutri

dacD>L@E>M@atunci
F>EXF@D>L@
LL
altfel
F>EXF@E>M@
MM
sfrit dac
sfrit ct timp
sfrit subalgoritm

Deoarece se tie c numrul elementelor n irul c este n m, (se admit i elemente
identice n irul rezultat) structura repetitiv utilizat va Ii de tip pentru.

Subalgoritm,QWHUFODVDUHQDPEEXFF
L
M
D>Q@LQILQLW
E>P@LQILQLW
pentruEXFQPexecut:
dacD>L@E>M@atunci
F>EXF@D>L@
LL
altfel
F>EXF@E>M@
MM
sfrit dac
sfrit pentru
sfrit subalgoritm

9.4. Implementri sugerate
Pentru a Ii pregtii s rezolvai cu uurin probleme n care, de multe ori cheia succe-
sului este o ordonare sau o cutare corect i eIicient implementat, v recomandm s
rezolvai urmtoarele exerciii:
1. veriIicarea Iaptului c un ir este ordonat;
2. veriIicarea Iaptului c elementele unui ir sunt n progresie aritmetic/geometric;
3. ordonare cu metoda bulelor;
4. sortare prin selecie;
5. sortare prin inserie;
6. sortare prin numrare;
7. cutare binar;
8. interclasare a dou iruri;
9. cutare binar cu determinarea extremitilor apariiilor;
9. Oraonri i cutri 203

10. inserarea unui element ntr-un ir ordonat cu pstrarea ordinii;
11. determinarea celei mai lungi secvene care este Iormat din elemente avnd o pro-
prietate dat;
12. determinarea celei mai lungi secvene Iormat din elemente avnd suma maxim.

9.5. Probleme propuse

9.5.1. Lucrri codificate
La sIritul examenului de capacitate, nainte s se desIac lucrrile, trebuie aIiate
dou liste care s conin codurile cu care s-au numerotat lucrrile i mediile scrise pe
acestea. Prima list va Ii ordonat cresctor dup coduri, a doua va conine aceleai in-
Iormaii, dar lista va Ii ordonat descresctor dup medii.

Date de intrare
Din Iiierul de intrare ELEVI.IN se citesc mai multe linii, Iiecare linie cuprinznd da-
te despre cte o lucrare. Pe aceste linii vom avea un numr ntreg, reprezentnd codul
lucrrii i un numr real, reprezentnd media.

Date de ieyire
Fiierul de ieire CODURI.OUT va conine lista lucrrilor aranjat cresctor dup co-
duri, iar Iiierul MEDII.OUT va conine lista de lucrri ordonat descresctor dup me-
dii. n ambele Iiiere se vor scrie perechi de cod-medie, desprite printr-un spaiu.

Restricii yi precizri
- aIiarea n Iiierele de ieire a mediilor se va Iace cu dou zecimale exacte;
- numrul lucrrilor s 5000.

Exemplu
ELEVI.IN

CODURI.OUT

MEDII.OUT


9.5.2. Unificarea listelor
La inspectoratul colar s-au strns n liste din colile judeului de la examenul de capa-
citate. Din pcate, unele liste sunt ordonate cresctor dup medii, altele descresctor.
Ajutai inspectoratul colar i scriei un program care creeaz o singur list din cele n
liste n care mediile s Iie ordonate descresctor.
204 9. Oraonri i cutri

Date de intrare
Pe prima linie a Iiierului de intrare LISTE.IN se aIl un numr natural, reprezentnd
numrul listelor. Pe a doua linie se aIl un numr natural reprezentnd dimensiunea a
1

a primei liste. Pe urmtoarele a
1
linii se aIl perechi de cod-medie separate printr-un
spaiu. Pe urmtoarele linii se aIl descrierea celorlalte liste n mod similar cu prima.

Date de ieyire
Fiierul LISTE.OUT va conine componentele listei uniIicate. Pe Iiecare linie se va
aIla cte o pereche cod-medie desprite printr-un spaiu.

Restricii yi precizri
- numrul de elemente din Iiecare tablou este cel mult 50.

Exemplu
LISTE.IN

LISTE.OUT



9.5.3. Alegeri prezideniale
Se apropie alegerile i organizatorii se pregtesc cu pachete de programe cu care s-i
uureze munca n viitorul apropiat. Se prevede c la alegerile prezideniale vor Ii Ioar-
te muli candidai. Scriei un program care va stabili pe baza voturilor dac exist sau
nu un ctigtor la aceste alegeri. Se consider c pentru a ctiga, un candidat trebuie
s totalizeze un numr de voturi cel puin cu 1 mai mult dect jumtate din numrul
total de voturi.

9. Oraonri i cutri 205

Date de intrare
Fiierul de intrare VOT.IN conine attea linii cte voturi exist. Pe Iiecare linie este
scris un numr natural reprezentnd numrul de ordine al unui candidat.

Date de ieyire
n Iiierul de ieire VOT.OUT se va scrie cuvntul '$ n cazul n care exist ctig-
tor la alegeri i 18 n caz contrar. n cazul n care exist ctigtor, pe urmtoarea li-
nie din Iiier se va scrie numrul de ordine al ctigtorului.

Restricii yi precizri
- 1 s numrul voturilor s 1000000000;
- 1 s numr ae oraine s 1000000000.

Exemple
VOT.IN


VOT.OUT
'$



VOT.IN


VOT.OUT
18

9.5.4. Pli yi ncasri
Casierul unei Iirme trebuie s parcurg zilnic un traseu liniar prin cele n magazine ale
sale. Magazinele sunt numerotate de la 1 la n i se parcurg zilnic n ordinea numerelor
lor de ordine, ncepnd cu primul magazin i terminnd cu al n-lea. (Evident casierul
va trece doar o singur dat prin Iiecare magazin.) Scopul parcurgerii acestui traseu
este eIectuarea unor pli, respectiv a unor ncasri. Se tie c exist cel puin un ma-
gazin de unde casierul va ncasa bani. De asemenea se cunosc sumele care trebuie pl-
tite, respectiv ncasate.
ntr-o zi, patronul nu are bani pentru pli i cere casierului s aleag dou magazi-
ne m
i
i m
f
de pe traseu, astIel nct parcurgnd traseul ncepnd cu m
i
i ncheindu-l
cu m
f
, ncasrile s reprezinte suma maxim posibil de adus napoi la Iirm. Casierul
trebuie s intre n toate magazinele aIlate pe traseul ales, chiar dac n unele trebuie s
eIectueze pli. n plus, pentru a nu crea suspiciuni printre angajaii magazinelor, pa-
tronul dorete s Iie vizitate ct mai multe magazine.
206 9. Oraonri i cutri

Scriei un program care determin suma maxim posibil de ncasat din magazinele
Iirmei. De asemenea, determinai secvena cea mai lung de magazine care permite
obinerea acestei sume. Dac aceeai sum maxim se poate obine pentru mai multe
alegeri diIerite, vizitnd acelai numr maxim de magazine, atunci n Iiierul de ieire
se va scrie una singur, i anume cea care ncepe de la magazinul cu numrul de ordi-
ne cel mai mic.

Date de intrare
Pe prima linie a Iiierului de intrare CASIER.IN se aIl numrul natural n, reprezen-
tnd numrul magazinelor de pe traseul iniial. Pe urmtoarea linie se aIl n numere
ntregi, desprite prin cte un spaiu, reprezentnd sumele pe care casierul ar trebui s
le plteasc sau s le ncaseze n/din cele n magazine; numerele pozitive reprezint su-
me care se vor ncasa, iar numerele negative corespund sumelor care se vor plti.

Date de ieyire
Pe prima linie a Iiierului de ieire CASIER.OUT se va scrie un numr natural nenul,
reprezentnd suma maxim cu care casierul se ntoarce la Iirm. Pe urmtoarea linie se
vor scrie dou numere naturale nenule, aparinnd intervalului |1, n| care reprezint
numerele de ordine ale magazinelor alese de casier pentru nceputul i sIritul poriu-
nii de traseu.

Restricii
- 1 s n s 1000000000;
- -1000000 s Suma
i
s 1000000, i 1, 2, ., n;
- 1 s SumaMax s 1000000000.

Exemplu
CASIER.IN


CASIER.OUT



9.6. Soluiile problemelor propuse

9.6.1. Lucrri codificate
Vom lucra cu dou tablouri: coa i mea n care vom reine pe poziii identice codurile
lucrrilor i mediile scrise pe ele.
Citirea datelor din Iiierul de intrare continu pn la apariia mrcii de sIrit de
Iiier. Concomitent, vom numra i numrul perechilor de date citite pentru a ti nu-
mrul lucrrilor (n).

9. Oraonri i cutri 207

Pentru sortarea dup coduri Iolosim metoda bulelor mbuntit. Este important s
reinem c atunci cnd interschimbm dou elemente din tabloul de coduri, trebuie s
interschimbm i elementele respective lor din tabloul de medii pentru a menine co-
respondena dintre elemente.
Algoritmul care Iormeaz cea de-a doua list trebuie s realizeze o sortare descres-
ctoare a elementelor din tabloul de medii. Vom aplica metoda sortrii prin selectarea
maximului i aezarea lui pe poziia sa deIinitiv. Ca i n cazul precedent, la o inter-
schimbare de medii trebuie realizat i interschimbarea codurilor.

9.6.2. Liste
S lum exemplul din enun. Pentru o aIiare mai potrivit, vom scrie listele pe coloa-
ne:



Avem de interclasat, lsnd la o parte pentru moment codurile, 4 tablouri avnd di-
mensiunile 3, 5, 2, 4.
Ne propunem s interclasm la Iiecare pas cte dou tablouri, pstrnd n primul
rezultatul interclasrii. Trebuie s interclasm iruri ordonate, dar din neIericire aces-
tea nu sunt ordonate n acelai sens. Din acest motiv, nainte de a interclasa dou din-
tre ele mai nti trebuie s vedem dac sunt ordonate n acelai sens. n plus, rezultatul
trebuie s Iie ordonat descresctor dup medie. n caz de ordonri necorespunztoare,
algoritmul de interclasare va parcurge irul respectiv n ordine invers.
Revenind la exemplul considerat, dac la primul pas interclasm primele dou ta-
blouri, obinem:


Ne-am atins de 3 plus 5 elemente i a rezultat un ir de 8 elemente. Acesta se va in-
terclasa cu urmtorul, prelucrnd n total 8 2 10 elemente, urmnd ca n Iinal acest
ir s se interclaseze cu ultimul, prelucrnd 10 4 14 elemente, ceea ce nseamn c
n total am eIectuat 32 de prelucrri de elemente. Se observ uor c dac am alege s
interclasm mereu cele mai scurte dou iruri, numrul elementelor prelucrate n total
scade: interclasm irul de lungime 2 cu cel de lungime 3 (5 elemente ,micate), irul
rezultat cu cel de lungime 4 (avem 7 micri) i n Iinal mai avem 7 4 11 prelu-
crri. Numrul total de prelucrri de elemente acum este 23.

208 9. Oraonri i cutri

Strategia pe care o vom aborda n rezolvare este de a aIla la Iiecare pas cele mai
scurte dou tablouri n vederea interclasrii lor.
n reprezentarea algoritmului am Iolosit urmtoarele notaii:
mea: irul n care Iiecare element este un ir de medii;
coa: irul n care Iiecare element este un ir de coduri;
aim: irul lungimilor listelor;
amea, bmea: dou iruri de medii din dou liste care urmeaz s Iie interclasate;
acoa, bcoa dou iruri de coduri din dou liste care urmeaz s Iie interclasate n
paralel cu mediile;
aaim, baim: dimensiunile irurilor amea, respectiv bmea;
cmea: lista de medii rezultat n urma interclasrii lui amea i bmea;
ccoa: lista de coduri rezultat n urma interclasrii lui acoa i bcoa;
n: este numrul listelor.

Algoritmul urmeaz strategia de interclasare sugerat prin exemplul tratat:

Algoritm/LVWH
citirea aatelor ae intrare. QPHGFRGGLP }
ct timpQsexecut pan la interclasarea ultimelor aou iruri }
LQGVLU0LQLPQGLP inaicele irului ae aimensiune minim }
DGLPGLP>LQGVLU@ in DGLP pstrm aimensiunea celui mai scurt ir }
DFRGFRG>LQGVLU@ in DFRG pstrm cel mai scurt ir ae coauri }
DPHGPHG>LQGVLU@ in DPHG pstrm cel mai scurt ir ae meaii }
(OLPLQQLQGVLUGLPFRGPHG eliminm cel mai scurt ir }
LQGVLU0LQLPQGLP proceam la fel cu al aoilea cel mai scurt ir }
EGLPGLP>LQGVLU@
EFRGFRG>LQGVLU@
EPHGPHG>LQGVLU@
(OLPLQQLQGVLUGLPFRGPHG
dacDPHG>@DPHG>@atunci verificm sensul ae oraonare }
,QYHUVDGLPDFRGDPHG aac este in sens cresctor, il inversm }
sfrit dac
dacEPHG>@EPHG>@atunci
,QYHUVEGLPEFRGEPHG
interclasm DFRG cu EFRG in FFRG i DPHG cu EPHG in FPHG }
sfrit dac
,QWHUDFRGEFRGFFRGDPHGEPHGFPHGDGLPEGLPDGLPEGLP
$GDXJQFFRGFPHGDGLPEGLPFRGPHGGLP
sfrit ct timp
re:ultatul este in ultimul re:ultat al interclasrii }
$ILDUHFFRGFPHGDGLPEGLP
sfrit algoritm
9. Oraonri i cutri 209

n algoritmul principal se apeleaz civa subalgoritmi dintre care 0LQLP i ,QWHU
i considerm cunoscui. n algoritmul de interclasare santinelele vor Ii dou valori
strine de irul de medii egale cu 0, deoarece irurile sunt ordonate descresctor:
D>Q@
E>P@

Subalgoritmul de eliminare a irului avnd indicele ina (care se va interclasa la un


moment dat) dintre irurile care urmeaz s Iie interclasate:

Subalgoritm(OLPLQQLQGGLPFRGPHG
eliminm irurile care se vor interclasa }
L
ct timpLsQiL=LQGexecut
LL
sfrit ct timp
pentruMLQexecut incepana cu al i1-lea translatm la stanga }
GLP>M@GLP>M@
FRG>M@FRG>M@
PHG>M@PHG>M@
sfrit pentru
QQ irul aevine mai scurt }
sfrit subalgoritm

irul obinut n urma interclasrii (avnd lungimea a) devine unul care urmeaz s
Iie interclasat cu restul irurilor. l adugm la sIritul irului de iruri:

Subalgoritm$GDXJQFFRGFPHGGFRGPHGGLP
aaugm irul interclasat }
QQ irul aevine mai lung }
GLP>Q@G
FRG>Q@FFRG
PHG>Q@FPHG
sfrit subalgoritm

irurile care nu sunt descresctor ordonate trebuie transIormate astIel nct s Iie
corespunztoare cerinelor. Evident, se putea scrie i o interclasare care pe acestea s
le parcurg n sens invers, dar s-ar Ii lungit ntreg codul programului. n cazul n care
timpul de execuie trebuie redus la minim, recomandm implementarea unei intercla-
sri n acest sens.

210 9. Oraonri i cutri



Subalgoritm,QYHUVGFRGPHG
aac irul ae meaii este oraonat cresctor, inversm orainea }
pentruL>G@execut
DX[PHG>L@
PHG>L@PHG>GL@
PHG>GL@DX[
DX[FRG>L@
FRG>L@FRG>GL@
FRG>GL@DX[
sfrit pentru
sfrit subalgoritm

9.6.3. Alegeri prezideniale


Aceast problem Iace parte din categoria acelora care necesit o prelucrare a datelor
pe segmente de lungime variabil. Lungimea unui astIel de subir depinde de valoarea
elementelor irului. De altIel, datorit lungimii maxime posibile este exclus s citim
toate datele i s le pstrm n memorie. n concluzie, vom aciona pe baza valorii
unui singur numr.
Numrul curent l notm cu nr, iar candidatul curent cu canaiaat. Dac un numr
citit din Iiier este egal cu canaiaat, mrim contorul cate n care inem evidena apari-
iilor candidatului. Dac numrul citit diIer de canaiaat, indiIerent de valoarea lui,
scdem 1 din contorul cate. Dup Iiecare astIel de scdere veriIicm contorul cate, de-
oarece n momentul n care acesta devine 0, nseamn c s-a sIrit un segment i nce-
pe altul cu un canaiaat nou.

Algoritm$OHJHULBSUH]LGHQLDOH
citeteQU
FDQGLGDWQU
FkWH in FkWH numrm voturi egale pe ,segmente` ae aate }
ct timp nu urmea: marca ae sfarit ae fiier execut
citeteQU
dacQUFDQGLGDWatunci aac a aprut vot pentru acelai canaiaat }
FkWHFkWH
altfel aac votul nu este pentru canaiaatul curent }
FkWHFkWH micorm numrul voturilor primite ae canaiaat }
aac prin micorare numrul voturilor aevine 0 }
dacFkWHatunci
FDQGLGDWQU schimbm canaiaatul cu ultimul votat }
FkWH pentru acesta a aprut primul vot }
sfrit dac
sfrit dac
sfrit ct timp
9. Oraonri i cutri 211

am terminat prelucrarea fiierului, am ieit cu un canaiaat }
aeoarece nu este sigur c acesta are suficiente voturi }
FkWH parcurgem fiierul ain nou }
Q
ct timp nu urmea: marca ae sfarit ae fiier execut
citeteQU
QQ numrm numrul voturilor }
dacQUFDQGLGDWatunci i numrul voturilor primite ae canaiaat }
FkWHFkWH
sfrit dac
sfrit ct timp
dacFkWH!>Q@atunci
scrie'$
scrieFDQGLGDW
altfel
scrie18
sfrit algoritm

9.6.4. Pli yi ncasri


nainte de toate observm c trebuie s determinm o subsecven (subir Iormat din
elemente consecutive din ir) avnd proprietatea c este cea mai lung printre acelea
care au sum maxim.
Vom considera exemplul din enun.
Fie n 10 i irul: 1, 2, 6, 3, 4, 5, 2, 10, 5, 6.
Rezolvnd problema manual pentru acest exemplu, obinem:
Suma maxim: 20;
Lungimea subsecvenei: 5;
Subsecvena cutat: 3, 4, 5, 2, 10.
Ideea cea mai simpl de rezolvare const n generarea tuturor perechilor posibile de
numere stanga i areapta, astIel nct: 1 s stanga s areapta s n, urmnd calcularea
sumelor subsecvenelor corespunztoare (T|stanga..areapta|). Pe parcursul generrii
vom pstra acea subsecven care are suma maxim.

Subalgoritm6XEVHFYHQBQ7
0D[7>@ T este irul aat, Max este suma maxim cutat }
pentruVWkQJDQexecut: VWkQJD este primul inaice al subsevenei }
GUHDSWD este ultimul inaice al subsevenei }
pentruGUHDSWDVWkQJDQexecut:
VXPD suma subsecvenei actuale }
pentruLVWkQJDGUHDSWDexecut:
VXPDVXPD7>L@
sfrit pentru
212 9. Oraonri i cutri

dac0D[VXPDatunci
0D[VXPD
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

Acest algoritm conine trei structuri repetitive incluse una n cealalt (imbricate).
Dac n 1000, un calculator de perIormane medii ar lucra aproximativ o or. Aceast
complexitate este de neacceptat, deci cutm un algoritm mai eIicient.
Observm, de exemplu, c n suma subsecvenei T|1..3| exist deja suma aIerent
subsecvenei T|1..2|. Adic T|1..3| T|1..2| T|3| etc. Generaliznd, suma subsec-
venei T|stanga..areapta| se poate calcula cu ajutorul sumei determinate la pasul pre-
cedent, corespunztor subsecvenei T|stanga..areapta 1|.
Vom compara sumele corespunztoare Iiecrei subsecvene T|stanga..areapta| cu
suma maxim determinat pn n momentul respectiv, imeaiat dup calcularea lor.
AstIel algoritmul va conine doar dou cicluri imbricate.

Subalgoritm6XEVHFYHQBQ7
0D[7>@ T este irul aat, Max este suma maxim cutat }
pentruVWkQJDQexecut: VWkQJD este primul inaice al subsevenei }
VXPD incepana cu fiecare stanga nou, avem sum nou }
pentruGUHDSWDVWkQJDQexecut:
VXPDVXPD7>GUHDSWD@ aaugm un element nou }
dac0D[VXPDatunci
0D[VXPD actuali:m 0D[ }
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

Dac am reui s rezolvm problema astIel nct s parcurgem irul o singur dat,
algoritmul va Ii liniar. n plus, s ne aducem aminte c problema garanteaz c n ir
exist cel puin un numr pozitiv.
Deci, dac irul conine n 1 elemente negative i un singur element pozitiv, atunci
subsecvena avana suma maxim ar fi constituit ain acest singur element po:itiv.
Rezult c atta vreme ct o sum actual este pozitiv, continum adunrile. Dac,
la un moment dat aceast sum devine negativ, atunci ncepem calcularea unei sume
noi pe segmentul care ncepe cu primul numr pozitiv.
Dac am observat c problema poate Ii rezolvat pe segmente, urmtoarea optimi-
zare const n a renuna la citirea tuturor datelor i reinerea lor n memorie. La un mo-
ment dat, vom citi un singur numr i l vom prelucra.
9. Oraonri i cutri 213

Algoritm6XELUBGHBVXPDBPD[LPDB
citeteQ
citete7
0D[6B&DXW7 iniiali:area sumei maxime }
0D[6B$LFL0D[6B&DXW iniiali:area sumei curente }
SR]BLQF
VIkULW
vQFHSXW
pentruLQexecut continum citirea numerelor }
citete7
dac0D[6B$LFLexecut aac 0D[6B$LFL este negativ }
0D[6B$LFL7 aceasta se reiniiali:ea: cu T }
SR]BLQFL noul subir posibil incepe in po:iia i }
altfel
0D[6B$LFL0D[6B$LFL7 lui 0D[6B$LFL i se aaaug T }
dac0D[6B&DXWs0D[6B$LFLatunci se actuali:ea: 0D[6B&DXW }
dac0D[6B&DXW0D[6B$LFLatunci
0D[6B&DXW0D[6B$LFL
vQFHSXWSR]BLQF
VIkULWL
altfel in ca: ae egalitate }
dacvQFHSXWSR]BLQFatunci
VIkULWL
sfrit dac
sfrit dac
sfrit dac
sfrit dac
sfrit pentru
scrie0D[6B&DXW
scrievQFHSXWVIkULW
sfrit algoritm



Siruri de caractere
`)


Operaii cu variabile de tip string
Subprograme predefinite pentru string-uri
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
10



Tipul ir ae caractere se identiIic n Pascal prin termenul string, deoarece n acest
limbaj de programare exist tipul predeIinit string pentru tablouri unidimensionale
care au elemente cte un caracter. DiIerenele importante dintre un ir de caractere i
un string se desprind din urmtoarele observaii:
- Unui tablou i se speciIic de la nceput numrul maxim de componente pe care
poate s le conin, pe cnd o variabil de tip string are implicit cel mult 255 de
elemente.
- Dac la declarare se speciIic pentru dimensiunea maxim a unei variabile de tip
string un numr mai mic dect 255, va Ii valabil declaraia Icut explicit.
- Un string se memoreaz pe atia octei cte caractere sunt speciIicate n declara-
re, la care se adaug un octet n care se memoreaz lungimea string-ului. Acest lu-
cru nu se ntmpl la tablourile de caractere care se memoreaz pe exact atia oc-
tei cte caractere apar n declarare.

Declararea variabilelor de tip string
Cu toate c tipul descrie o structur (ir de caractere), nu este obligatoriu s precizm
o anumit lungime, dar dac dorim s declarm un string mai scurt dect lungimea im-
plicit (255), atunci acest lucru este posibil.

Exemplu
varIUD]Dstring variabila IUD]D are cel mult 255 ae caractere }
FXYstring>@ variabila FXY poate avea cel mult 20 ae caractere }

*)
n cele ce urmeaz, atunci cnd vom scrie string, n acest material, ne reIerim la un ir de ca-
ractere. Atunci cnd vom scrie string, este vorba de tipul predeIinit n limbajul Pascal.
10. Siruri ae caractere 215

10.1. Operaii cu variabile de tip string

10.1.1. Citirea
O variabil de tip string se poate citi n Pascal, speciIicndu-i numele. Avantajul Ia-
de tablouri const n Iaptul c nu trebuie s tim exact numrul caracterelor. n mo-
mentul n care am apsat Enter, sau, n caz de citire dintr-un Iiier de tip 7H[W, atunci
cnd urmeaz caracterul sIrit de linie, string-ul ,s-a terminat i prima component
a variabilei (cea cu indice 0) primete o valoare egal cu numrul caracterelor citite.

Exemplu
varVstring
VVstring>@

5HDG/QV
5HDG/QVV

Dac pentru s i pentru ss introducem irul de caractere $%&, valoarea ambelor


variabile va Ii $%&. Dac pentru ss introducem $%&$%&, valoarea lui ss va Ii
$%&$%, adic se vor pstra cel mult attea elemente cte permite declaraia.

10.1.2. Afiyarea
AIiarea se realizeaz speciIicnd o expresie de tip string.

Exemplu
varVstring
VVstring>@

:ULWH/Q$%&$%&
:ULWH/QVVV aac V VWU i VV LQJ, se va afia VWULQJ }


10.1.3. Atribuirea
Unei variabile de tip string i se poate atribui valoarea unei expresii care are tipul
string. Dac variabila are un tip care precizeaz o lungime mai mic dect string-ul
din expresie, caracterele care depesc lungimea variabilei se pierd.

Exemplu
Fie declaraia:
var VVstring>@
216 10. Siruri ae caractere

Dac valoarea lui VV, atribuirea VVVV se va Iinaliza cu va-
loarea pentru VV.

10.1.4. Concatenarea
Concatenarea se poate realiza utiliznd operatorul , dar n Pascal exist i o proce-
dur predeIinit n acest scop (&RQFDW).

Exemplu
VVV aac VD i VE, atunci valoarea lui V va fi DE }
VVV valoarea lui V va fi DED }

S observm c un string poate Ii ,construit prin adugare de caractere la un
string iniial vid.

Exemplu
var Vstring>@
L%\WH
Begin
V stringul via }
L
while Ldo begin
,QFL
VVD
end;
:ULWH/Q2UGV>@ componenta care pstrea: lungimea string-ului (5) }
:ULWH/QV se va afia DDDDD}
End.

10.1.5. Operaii relaionale
n cazul expresiilor de tip string se pot Iolosi operatorii relaionali cunoscui:
, , !, !, !, .
Rezultatul a dou comparaii este o constant logic (aaevrat sau fals).

Exemplu
varVVVstring
Avnd declaraiile de mai sus, n tabelul urmtor prezentm cteva exemple de ex-
presii relaionale dup eIectuarea urmtoarelor operaii de atribuire:

V$
V$%&
VVV
10. Siruri ae caractere 217

Expresie Rezultat
V$
WUXH(s-a comparat $ cu $)
V!$%&
IDOVH(s-a comparat $%& cu $%&)
V$%&
WUXH (s-a comparat $$%& cu $%& i
$% pe cea de a doua poziie)
V$$
WUXH(s-a comparat $ cu $$)
V!V
WUXH(s-a comparat $$%& cu $)

10.1.6. Accesul la o component
Componenta [>L@ reprezint al L-lea caracter din variabila [, de tip string.

10.2. Subprograme predefinite pentru string-uri
Unit-ul System din Borland Pascal 7.0 conine mai multe subprograme predeIinite care
pot Ii utilizate n prelucrarea string-urilor. Fie s i ss variabile de tip string.
- Funcia 3RVVVV returneaz valoarea poziiei ncepnd de la care se regsete ss
n s; dac ss nu se gsete n s, atunci i ia valoarea 0.
- Funcia &RS\VLM returneaz substring-ul din s care ncepe la poziia i i are f
caractere. Dac n s nu exist f caractere ncepnd cu poziia i, se vor returna attea
cte sunt.
- Funcia /HQJWKV returneaz lungimea stringului (numrul caracterelor din s).
- Procedura 'HOHWHVLM are ca eIect tergerea din s, ncepnd de la poziia i, a f
caractere. Dac n s nu exist f caractere ncepnd cu poziia i, se vor terge attea
cte sunt.
- Procedura ,QVHUWVVVL insereaz caracterele din string-ul ss n s, ncepnd
de la poziia i.

10.3. Implementri sugerate
Pentru a v Iamiliariza cu prelucrrile irurilor de caractere, implementai programele
aIerente urmtoarelor exerciii:
1. citirea unui numr caracter cu caracter;
2. citirea unui cuvnt caracter cu caracter;
3. numrarea literelor dintr-un text dat;
4. numrarea cuvintelor dintr-un text dat;
5. numrarea propoziiilor dintr-un text dat;
6. descompunerea n cuvinte a unui text dat;
7. ordonarea unui ir de cuvinte;
8. eliminarea spaiilor duble dintre cuvintele unui text dat.
218 10. Siruri ae caractere

10.4. Probleme propuse

10.4.1. Litere
Fie un text citit dintr-un Iiier. S se aIieze acele cuvinte din text n componena cro-
ra numrul majusculelor este strict mai mare dect numrul literelor mici.

Date de intrare
Fiierul de intrare LITERE.IN conine textul scris pe mai multe linii.

Date de ieyire
Cuvintele se vor scrie n Iiierul de ieire LITERE.OUT pe linii distincte, Iiecare cu-
vnt Iiind scris pe cte o linie nou.

Restricii yi precizri
- cuvintele sunt separate prin spaii i/sau caractere de sIrit de linie;
- Iiierul nu conine linii vide;
- liniile conin cuvinte nedesprite;
- pe o linie sunt scrise cel mult 255 de caractere;
- un cuvnt poate avea cel mult 255 de caractere;
- cuvintele conin numai litere mari i mici.

Exemplu
LITERE.IN
$QD$9($08/WH0HUH
$&(67D
HV7HXQH;H03/X
LITERE.OUT
$9($
08/WH
$&(67D
H;H03/X
Explicaii
- $QD are dou litere mici i una mare, deci nu se scrie.
- $9($ are patru litere mari i nici una mic, deci se scrie.
- 08/WH are trei litere mari i dou mici, deci se scrie.
- 0HUH are o liter mare i trei mici, deci nu se scrie.
- $&(67D are patru litere mari i o liter mic, deci se scrie.
- HV7H are o liter mare i trei litere mici, deci nu se scrie.
- XQ nu are nici o liter mare, deci nu se scrie.
- H;H03/X are 4 litere mari i trei litere mici, deci se scrie.

10. Siruri ae caractere 219

10.4.2. Text
Se citesc mai multe propoziii dintr-un Iiier. Se cere:
- s se aIieze numrul de cuvinte din Iiecare propoziie;
- s se determine pentru Iiecare propoziie numrul cuvintelor distincte;
- s se aIieze cuvintele care se repet n cadrul aceleiai propoziii.

Date de intrare
Propoziiile sunt scrise n Iiierul de intrare TEXT.IN pe mai multe linii. Dou propo-
ziii sunt separate prin caracterele , , ".

Date de ieyire
Rezultatele se vor scrie n Iiierul de ieire TEXT.OUT. Pe linia i din Iiier se aIieaz
datele reIeritoare la a i-a propoziie. Aceste date se vor separa prin spaiu i vor aprea
n ordinea: numrul cuvintelor din propoziie, numrul cuvintelor aistincte, lista cu-
vintelor care nu sunt distincte n cadrul propoziiei.

Restricii yi precizri
- din cuvinte poate s Iac parte caracterul ;
- dou cuvinte se separ prin caracterele: , , ;
- pot exista separatori inutili;
- numrul maxim de cuvinte pentru Iiecare propoziie este 30;
- n text exist litere mari i mici.

Exemplu
TEXT.IN
6DUHYHQLPODFRURDQDSHFDUHDPODVDWRLQPDQDOXL$UKLPHGH
FDUHVHXLWDJDQGLWRUODHDQHVWLLQGFHVDLIDFD
2ODVDGHFHSWLRQDWGLQPDQDVLSOHDFDODDOWHWUHEXUL
'DU SUREOHPD FD LQWUHEDUH VWDUXLH LQ PLQWHD OXL VR
FDQWDUHVF VR FDQWDUHVF DXGH LQ VLQH XQ PXUPXU LQ VXUGLQD
GDDVWDVWLXVRFDQWDUHVFGDUFHDOWFHYDVDLPDLIDF"

TEXT.OUT
ODFDUH

LQVRFDQWDUHVF

10.4.3. Traducere
Un elev are de scris un text n limba englez, dar nu cunoate destul de bine aceast
limb. Se hotrte s lase cuvintele pe care nu le poate traduce n limba romn, apoi
220 10. Siruri ae caractere

s le caute n dicionar. Din aceste cuvinte va alctui o list, urmnd ca ulterior s le
nlocuiasc n text.

Date de intrare
Pe prima linie a Iiierului TRADUS.IN se aIl textul elevului, iar pe Iiecare dintre ur-
mtoarele linii se aIl un cuvnt n limba romn, urmat, dup un spaiu, de corespon-
dentul su n limba englez.

Date de ieyire
Textul tradus, mpreun cu semnele de punctuaie existente n textul dat n Iiierul de
intrare, se va aIia n Iiierul de ieire TRADUS.OUT.

Restricii yi precizri
- textul n Iiierul de intrare trebuie s conin cel mult 255 de caractere;
- separatorii Iolosii n text pot Ii , , ;
- textul din Iiierul de ieire va avea exact aceeai separatori ca i cel de intrare.

Exemplu
TRADUS.IN
$QDKDVPDQ\PHUHGDUVKHLVJRLQJWRWKHSLDWDWRYDQGDWKHP
PHUHDSSOHV
GDUEXW
SLDWDPDUNHWSODFH
YDQGDVHOO

TRADUS.OUT
$QDKDVPDQ\DSSOHVEXWVKHLVJRLQJWRWKHPDUNHWSODFHWRVHOOWKHP

10.4.4. Culori
La o grdini se va realiza un spectacol, unde copiii trebuie s Iie mbrcai n costu-
me de culori diIerite. Fiecare copil i spune culoarea preIerat, iar nvtoarea Ior-
meaz grupuri de copii mbrcai n costume de aceeai culoare. Pe scen copiii se vor
aeza n grupuri, astIel nct cel mai numeros grup va sta n Iundal, n Iaa acestora va
sta grupul din care Iac parte mai puini copii etc., iar n Ia grupul cel mai puin nu-
meros.

Date de intrare
Datele de intrare se citesc din Iiierul CULORI.INcare are urmtoarea structur:
- pe prima linie se aIl numrul natural n, reprezentnd numrul de copii;
- pe urmtoarele n linii sunt scrise numele i prenumele copiilor; numele este separat
de prenume printr-un spaiu;
10. Siruri ae caractere 221

- pe urmtoarea linie este scris numrul natural m, reprezentnd numrul de culori;
- pe urmtoarele n linii sunt trecute culorile preIerate ale celor n copii sub Iorma
unor numere naturale din intervalul |1, m| cu care s-au codiIicat culorile; Iiecare
copil alege o singur culoare.

Date de ieyire
Datele de ieire se scriu n Iiierul CULORI.OUT pe m linii. Fiecare linie conine codul
culorii, urmat de numele copiilor care preIer culoarea respectiv. Numele vor Ii des-
prite printr-un spaiu. Numrul numelor va Ii cel mai mare pe prima linie, mai mic
pe linia a doua i cel mai mic pe ultima linie.

Restricii yi precizri
- 2 s n s 20;
- 2 s m s 7;
- Iiecare culoare dintre cele m va Ii preIerat de cel puin un copil;
- n cazul n care exist dou sau mai multe culori preIerate de un numr egal de co-
pii, atunci ordinea n care grupurile corespunztoare se vor aeza pe scen nu con-
teaz.

Exemplu
CULORI.OUT
3RSHVFX0DULXV5XV$QGUHL5XVX7HRGRU
3RS0LKDL3RSDQ$QD
3RSD,RQ7ULI,RQXW

CULORI.IN

3RS0LKDL
3RSDQ$QD
3RSD,RQ
3RSHVFX0DULXV
5XV$QGUHL
5XVX7HRGRU
7ULI,RQXW




222 10. Siruri ae caractere

10.5. Soluiile problemelor propuse

10.5.1. Litere
Vom citi cte un string de pe o linie din Iiier i l vom parcurge n Ielul urmtor: vom
ignora spaiile pn la apariia primului caracter diIerit de spaiu. Apoi, vom construi
din caractere consecutive litere un cuvnt, numrnd n paralel i majusculele. n mo-
mentul n care apare primul spaiu, sau am ajuns la sIritul string-ului, prelucrm cu-
vntul, respectiv decidem dac trebuie s-l scriem n Iiier sau nu. Relum algoritmul
pentru restul caracterelor din string-ul citit, apoi pentru restul liniilor din Iiier.

Subalgoritm/LWHUH
ct timp nuurmea: marca ae sfarit ae fiierexecut:
citeteW citim o linie ain fiier }
L vom parcurge stringul citit }
ct timpLslungimea textului Wexecut:
ct timpLslungimea textului WiW>L@execut:
LL spaiile le ignorm }
FXY vom construi cuvantul curent }
PDM
ct timpLslungimea textului WiW>L@=execut:
dacW>L@>$iW>L@s=atunci mafuscul }
PDMPDM
sfrit dac
FXYFXYW>L@ concatenm caracterul curent in cuvantul curent }
LL
sfrit ct timp
dacPDM!>lungimea cuvantului FXY@atunci
scrieFXY
sfrit dac
sfrit ct timp
sfrit ct timp
sfrit subalgoritm

10.5.2. Text
Vom reine Iiecare propoziie ntr-un ir de caractere i vom construi irul cuvintelor
care Iac parte din ea pentru a Iacilita cutarea cuvintelor care nu sunt unice n cadrul
propoziiei.
Din cauza c o propoziie se poate continua n Iiierul de intrare pe mai multe linii,
vom Iorma propoziiile, citind din Iiier caractere. Notm cu pr irul de caractere care
reine propoziia curent i cu c caracterul citit din Iiier. Iniializm propoziia cu
10. Siruri ae caractere 223

stringul vid i caracterele citite le concatenm n pr, pn la apariia unui separator sau
a marcajului de sIrit de linie.
- n cazul n care propoziia se ncheie (a aprut un separator) nlocuim separatorul,
adugnd la sIritul variabilei pr un spaiu, pentru a simpliIica mprirea pe cu-
vinte. Trecem la analiza propoziiei.
- Dac pe parcursul citirii a aprut marcaj de sIrit de linie, Ir ca propoziia s se
termine, acesta se citete din Iiier, continund citirea caracterelor i concatenarea
lor n aceeai propoziie de pe linia urmtoare.

Algoritmul care realizeaz Iormarea unei propoziii este:

Algoritm7H[W
SU iniiali:area primei propo:iiei }
ct timp nu urmea: marca ae sfarit ae fiier execut:
citeteF
dac F nu este separator ae propo:iii i
nu urmea: marca ae sfarit ae linie atunci
SUSUF alipim caracterul curent propo:iiei }
altfel
dacFeste separator ae propo:iii atunci
SUSU suprascriem separatorul cu spaiu }
$QDOL]DSU anali:a propo:iiei }
scrie marca ae sfarit ae linie
SU iniiali:area urmtoarei propo:iii }
altfel
citetemarca ae sfarit ae linie
sfrit dac
sfrit dac
sfrit ct timp
sfrit algoritm

Analiza propoziiei reinute n irul de caractere pr ncepe cu nlocuirea separatori-
lor cu spaii, apoi se elimin spaiile inutile i se Iormeaz tabloul de cuvinte. Se scrie
numrul n al cuvintelor depistate n Iiierul de ieire. Algoritmul $QDOL]DSU ape-
leaz subalgoritmul GLVWLQFWHFXYLQWHGLVW care numr cuvintele care apar o
singur dat n propoziie i scrie acest numr n Iiierul de ieire.
De asemenea, se ine i evidena cuvintelor care se repet i ncepnd de la a doua
apariie se nlocuiesc cu spaiu pentru a nu le mai lua n calcul.
Dup scrierea celor dou numere n Iiierul de ieire se trece la cutarea cuvintelor
care se repet. Se numr Iiecare apariie i se nlocuiete dublura lui cu spaiu. Dac
se gsesc cuvinte care se repet, acestea se vor scrie n Iiierul de ieire.
224 10. Siruri ae caractere

Subalgoritm$QDOL]DSU anali:m o propo:iie }
suprascriem separatorii cu spaii
eliminm spaiile in plus
cutm cuvinte, le reinem in irul FXYLQWH i le tergem ain propo:iie
scrieQ numrul cuvintelor ain propo:iie }
GLVWLQFWHFXYLQWHGLVW apelm subalgoritmul GLVWLQFWH }
scrieGLVW
pentruLQexecut:
DSDUH numrul cuvintelor care nu sunt aistincte }
dacFXYLQWH>L@=atunci
pentruMLQexecut:
dacFXYLQWH>L@FXYLQWH>M@atunci
un cuvant este inlocuit cu spaiu la a aoua apariie }
FXYLQWH>M@
DSDUHDSDUH
sfrit dac
sfrit pentru
dacDSDUH!atunci cuvantul nu este aistinct }
scrieD>L@
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

n algoritmul care calculeaz numrul de cuvinte care apar o singur dat n propo-
ziia pr se numr apariiile Iiecrui cuvnt n irul cuvintelor. Dac acesta apare o sin-
gur dat se incrementeaz contorul cuvintelor distincte.

Subalgoritm 'LVWLQFWHFXYLQWHGLVW
GLVW
pentruLQexecut:
DSDULLL
pentru MQexecut
dacFXYLQWH>L@FXYLQWH>M@atunci
DSDULLLDSDULLL
sfrit dac
sfrit pentru
dacDSDULLLatunci aac FXYLQWH>L@ a aprut o singur aat }
GLVWGLVW avem un cuvant aistinct }
sfrit dac
sfrit pentru
sfrit subalgoritm

10. Siruri ae caractere 225

10.5.3. Traducere
DiIicultatea acestei probleme const n Iaptul c din textul iniial numai anumite cu-
vinte se nlocuiesc. Cele care trebuie nlocuite i traducerile lor apar n Iiierul de
intrare ncepnd de pe linia a doua.

Se parcurge textul iniial t i se rein pe rnd cuvintele n variabila cuvant. Pentru
Iiecare cuvnt cuvant se veriIic dac acesta apare printre cuvintele care sunt scrise n
dicionar. Dac acesta exist n dicionar, se reine traducerea lui, urmnd ca aceasta s
substituie cuvntul n textul iniial.
Cutm cuvntul cuvant n Iiierul care conine dicionarul cu urmtorul subalgo-
ritm:

Subalgoritm&DXWFXYkQW
citete marcaful ae sfarit ae linie ain fiierul ae intrare
ct timp nu urmea: marca ae sfarit ae fiier execut
citim in GLFWLR o linie ain fiier (o pereche ae cuvinte)
cutm cuvantul FXYkQW in GLFWLR
dac l-am gsit incepana cu po:iiaatunci
tergem ain perechea ae cuvinte originalul
returnm traaucerea
ieim forat ain ct timp
altfel
returnm stringul via
sfrit dac
sfrit ct timp
sfrit subalgoritm

n Iiierul de intrare prima linie este ocupat de textul care trebuie tradus. De Iieca-
re dat cnd se caut traducerea unui cuvnt n Iiier trebuie s se realizeze saltul peste
prima linie, deci se citete doar marcajul de sIrit de linie.

Selectarea cuvintelor care se caut n dicionar se Iace n Ielul urmtor:

Subalgoritm7UDGXFHUHW
FXYkQW
L
ct timpLslungimea textuluiWexecut:
ct timpW>L@ este liter execut
FXYkQWFXYkQWW>L@ in FXYkQW construim cuvinte ain text }
LL
sfrit ct timp
226 10. Siruri ae caractere

WUDGtraaucerea lui FXYkQW, returnat ae subalgoritmul &DXWFXYkQW
dacWUDG=atunci aac exist traaucere }
inserm traaucerea cuvantului in W, incepana cu po:iia i
tergem cuvantul ae traaus ain W
LL lungimea cuvantului WUDGlungimea cuvantului FXYkQW
recalculm po:iia ain care continum prelucrarea lui W }
FXYkQW reiniiali:m FXYkQW pentru a fi util pentru un cuvant nou }
altfel
LL avansm, cuvantul nu trebuie traaus }
FXYkQW
sfrit dac
sfrit ct timp
sfrit subalgoritm

10.5.4. Culori
n rezolvare variabila num reprezint tabloul care conine numele celor n copii, n
tabloul pref pstrm tabloul care conine numrul de ordine a culorii preIerate de
copii, iar cul este tabloul n care se reine numrul de apariii a Iiecrei culori.

Exemplu
Fie tabloul num (Pop Mihai, Popan Ana, Popa Ion, Popescu Marius, Rus Andrei,
Rusu Teodor, TriI Ionut). Presupunem c exist 3 culori (m 3), iar irul culorilor pre-
Ierate de copii, n ordinea numelor din tabloul num este pref (1, 1, 1, 1, 3, 3, 2).
Elementele tabloului cul se determin n paralel cu citirea. Acesta va conine pe po-
ziia i numrul copiilor care preIer culoarea i, deci cul (4, 1, 2) cu semniIicaia: cu-
loarea 1 apare de patru ori, culoarea 2 apare o dat, culoarea 3 apare de dou ori.

Subalgoritm&LWLUHQPQXPSUHIFXO
citeteQ
pentruLQexecut
citeteQXP>L@
sfritpentru
citeteP
pentruLPexecut
FXO>L@
sfritpentru
pentruLQexecut
citeteSUHI>L@
FXO>SUHI>L@@FXO>SUHI>L@@
culoarea SUHI>L@ a aprut inc oaat }
sfritpentru
sfritsubalgoritm
10. Siruri ae caractere 227

n algoritm vom cuta valoarea maxim n acest ir, apoi pe acei copii care au ales
culoarea i, unde i este poziia pe care s-a gsit valoarea maxim. n exemplu, valoarea
maxim n tabloul cul este egal cu 4 i se gsete pe poziia po: 1. Aceast variabil
astIel reine codul unei culori. Se caut n tabloul pref indicii elementelor egale cu 1
(selectare). Acetia sunt: Pop Mihai, Popan Ana, Popa Ion, Popescu Marius.

Acum trebuie s gsim grupul n care sunt mai puini copii, dar care, dup ce am
pus primul grup deoparte, sunt cei mai numeroi. nseamn c ne intereseaz ,al doi-
lea maxim din tabloul cul. Pentru a uura gsirea acestuia, vom nlocui n tabloul cul
valoarea 4 cu 0. La pasul urmtor maximul din tabloul cul (0, 1, 2) este 2 pe poziia
3 (adic culoarea 3). n tabloul pref se caut toi indicii (copiii) elementelor de valoare
po:. Acetia sunt: Rus Andrei, Rusu Teodor.
Se nlocuiete valoarea 2 cu 0, deci cul (0, 1, 0). Acum max se gsete pe poziia
2 i este egal cu 1. Se caut, pe baza tabloului pref toi copiii care preIer culoarea 2.
Acetia sunt: TriI Ionu.
Se nlocuiete valoarea 1 cu 0 n tabloul cul, acesta devenind cul (0, 0, 0) i pro-
cesul se ncheie.

Subalgoritm$ILDUH
pentruNPexecut copiii se grupea: in m grupuri }
0D[LPPFXOSR] maximul ain irul cul se afl pe po:iia po: }
scrieN coaul culorii }
pentruLQexecut
dacSUHI>L@SR]atunci afim copiii care prefer culoarea po: }
scrieQXP>L@
sfrit dac
sfrit pentru
FXO>SR]@ eliminm "ultimul maxim" }
sfrit pentru
sfrit subalgoritm





Aritmetica numerelor
mari

Calcularea valorii 2
n

Adunarea
Scderea
nmulirea
Probleme propuse
Soluiile problemelor
Capitolul
11


n problemele de concurs pot s apar cerine care impun prelucrarea anumitor numere
ntregi ,mari care nu pot Ii reprezentate cu toate ciIrele lor exacte, Iolosind tipurile
ntregi cunoscute de limbajele de programare. Reprezentarea lor ca reale nu este o so-
luie, deoarece nici n tipurile reale nu putem lucra cu un numr mare de ciIre exacte.
Dac trebuie s eIectum calcule cu aceste numere i cerinele sunt de aa manier n-
ct trebuie determinate toate ciIrele exacte ale numrului, trebuie s implementm
,aritmetica numerelor mari.

11.1. Calcularea valorii 2
n

Vom prezenta aceast tehnic n cazul determinrii valorii lui 2
n
, unde n (n s 1000)
este numr natural pozitiv.

Exemplu
n 100, 2
n
1267650600228229401496703205376

n cele ce urmeaz, pentru a exempliIica tehnica de implementare a operaiilor de
acest Iel vom prezenta modul n care se simuleaz calcularea lui 2
7
.
Ideea este de a lucra pe ciIre i de a ine evidena transportului obinut n urma
eIecturii operaiei. Rezultatele pariale ale eIecturii operaiilor pe ciIre le vom reine
ntr-un tablou (re:).

k 1 2 3 4 5 6 7
2
k
2 4 8 16 32 64 128
re: (2) (4) (8) (6, 1) (2, 3) (4, 6) (8, 2, 1)
11. Aritmetica numerelor mari 229

Se observ c n tabloul re: am adugat elemente pe msur ce s-au realizat nmul-
irile cu 2. Pentru a aIia valoarea 2
n
vom parcurge tabloul re: de la dreapta spre stn-
ga. Deoarece la Iiecare pas se genereaz rezultatul prin nmulirea ciIr cu ciIr a re-
zultatului obinut la pasul anterior cu 2, timpul de lucru este mic, mai ales, dac (n
Pascal) n loc de nmulire eIectiv, lucrm cu operatorul shl.
S presupunem c s-a realizat calculul lui 2
k-1
i tabloul re: are aim termeni. Ur-
meaz s eIectum o nou nmulire cu 2 pentru a-l obine pe 2
k
. Pentru Iiecare ele-
ment din irul rezultat, re:
i
, (i 1, 2, ..., aim) eIectum nmulirea cu 2. Dac rezultatul
nmulirii este mai mare dect 10, atunci n re:
i
se reine doar ciIra unitilor, iar ciIra
zecilor (transportul) se depune n alt variabil (rest), urmnd s Iie adunat la terme-
nul urmtor.
Dac dup eIectuarea celor aim nmuliri variabila rest este diIerit de 0, (ultima n-
mulire a generat ciIr de transport), atunci se mai adaug un al aim 1-lea element n
tablou.

Algoritmul care realizeaz aceast nmulire repetat este urmtorul :

SubalgoritmQPXOLUHH[SRQHQWUH]
SXWHUH
GLP avem o cifr }
UH]>GLP@ aceasta este 1 }
repet
UHVW in UHVW vom aetermina la fiecare pas cifra ae transport }
pentruLGLPexecut
QRXUH]>L@UHVW calculm cifra curent ain UH] }
in loc ae UH]>L@ in Pascal putem folosi UH]>L@ shl }
UHVWQRXdiv calculm transportul }
UH]>L@QRXmod i cifra curent ain UH] }
sfrit pentru
dacUHVW=atunci
aac exist cifr ae transport, in UH] ne trebuie inc un element }
GLPGLP
UH]>GLP@UHVW in acest element punem cifra ae transport }
sfrit dac
SXWHUHSXWHUH am efectuat o inmulire cu 2, SXWHUH crete }
pan cana se atinge valoarea aat in H[SRQHQW }
pn cndSXWHUHH[SRQHQW
sfrit subalgoritm

AIiarea rezultatului n Iiierul de ieire se Iace tiprind irul re: de dimensiune
aim n ordine invers.
230 11. Aritmetica numerelor mari

11.2. Probleme propuse

11.2.1. Adunarea numerelor mari
S se realizeze adunarea a dou numere ntregi mari care au mai mult de 10 ciIre Iie-
care.

Date de intrare
Valorile celor dou numere se citesc din Iiierul NUM.IN de pe dou linii distincte.

Date de ieyire
Rezultatul adunrii se va scrie n Iiierul NUM.OUT.

Restricii yi precizri
- numerele au cel mult 100 de ciIre.

Exemplu
NUM.IN


NUM.OUT


11.2.2. Scderea numerelor mari
S se realizeze scderea a dou numere ntregi mari care au mai mult de 10 ciIre Iie-
care.

Date de intrare
Valorile celor dou numere se citesc din Iiierul NUM.IN de pe dou linii distincte.

Date de ieyire
Rezultatul scderii se va scrie n Iiierul NUM.OUT.

Restricii yi precizri
- numerele au cel mult 100 de ciIre.

Exemplu
NUM.IN


NUM.OUT



11. Aritmetica numerelor mari 231

11.2.3. nmulirea numerelor mari
S se realizeze nmulirea a dou numere ntregi mari care au mai mult de 10 ciIre Iie-
care.

Date de intrare
Valorile celor dou numere se citesc din Iiierul NUM.IN de pe dou linii distincte.

Date de ieyire
Rezultatul nmulirii se va scrie n Iiierul NUM.OUT.

Restricii yi precizri
- numerele au cel mult 100 de ciIre.

Exemplu
NUM.IN


NUM.OUT



11.3. Soluiile problemelor propuse

11.3.1. Adunarea numerelor mari
Prezentm un exemplu de adunare a dou numere mari. Citim numerele n dou iruri
de caractere, apoi le convertim n tablouri de ciIre nr
1
i nr
2
. Rezultatul adunrii se va
memora n tabloul de ciIre nr
3
.
De la nceput considerm ambele tablouri avnd cte un element 0 n plus pe pozi-
ia 0, deoarece, dac cele dou numere au acelai numr de ciIre, s-ar putea ca prin a-
dunare s rezulte un numr avnd cu una mai multe ciIre dect cele dou numere date.

nr
1
(0, 1, 2, 9, 8, 7, 9), n 6 ciIre (0 din Ia este pe poziia 0)
nr
2
(0, 9, 2, 9, 8), m 4 ciIre

n scopul adunrii, elementele tabloului nr
2
se mut pe ultimele m poziii conside-
rate pe o lungime egal cu n 1, (presupunnd c n > m), iar poziiile rmase libere n
Iaa ciIrelor numrului se completeaz cu zerouri.
nr
2
(0, 0, 0, 9, 2, 9, 8)
nr
3
va conine ciIrele sumei; este iniializat cu 0: nr
3
(0, 0, 0, 0, 0, 0, 0).

Adunarea propriu-zis o eIectum ciIr cu ciIr, pornind de la ciIra unitilor:
0129879
0009298
232 11. Aritmetica numerelor mari

nr
1
0 1 2 9 8 7 9
nr
2
0 0 0 9 2 9 8
nr
3
0 0 0 0 0 0 0

La primul pas: 9 8 0 17, dar n nr
3
nu vom putea avea dect elemente avnd
valoare mai mic dect 10. Reinem n elementul de pe poziia curent restul mpririi
ntregi la 10 a acestei sume, iar n elementul precedent ciIra de transport 1.

nr
1
0 1 2 9 8 7 9 nr
1
0 1 2 9 8 7 9
nr
2
0 0 0 9 2 9 8 nr
2
0 0 0 9 2 9 8
nr
3
0 0 0 0 0 1 7
Urmeaz adunarea
7 9 1 17:
nr
3
0 0 0 0 1 7 7

8 2 1 11: 9 9 1 19:

nr
1
0 1 2 9 8 7 9 nr
1
0 1 2 9 8 7 9
nr
2
0 0 0 9 2 9 8 nr
2
0 0 0 9 2 9 8
nr
3
0 0 0 1 1 7 7

nr
3
0 0 1 9 1 7 7

2 0 1 3: 1 0 0 1:

nr
1
0 1 2 9 8 7 9 nr
1
0 1 2 9 8 7 9
nr
2
0 0 0 9 2 9 8 nr
2
0 0 0 9 2 9 8
nr
3
0 0 3 9 1 7 7

nr
3
0 1 3 9 1 7 7

Numrul rezultat (suma celor dou numere date) este 139177.

n exemplul de mai sus n ~ m. Deoarece este posibil s avem m ~ n, n Iuncie de
numrul de ciIre, eventual, vom interschimba nr
1
cu nr
2
.

Subalgoritmul care citete irurile de caractere i creeaz irurile de ciIre nr
1
i nr
2
:

Subalgoritm&LWLUHQUQUQP citim numerele in variabile }
citeteD ae tip string, apoi le transformm in ir ae cifre }
Qlungimea irului ae caractere D primul numr are n cifre }
QU>@ cifra ae rang n }
pentruLQexecut:
QU>L@valoarea numeric a caracterului ae inaice i
sfrit pentru
citeteE
Plungimea irului ae caractere E al aoilea numr are m cifre }
QU>@ cifra ae rang m }
pentruLPexecut:
QU>L@valoarea numeric a caracterului ae inaice i
sfrit pentru
sfritsubalgoritm
11. Aritmetica numerelor mari 233

Subalgoritmul care pregtete numerele pentru adunarea ciIr cu ciIr asigur ca
primul numr s Iie cel care are mai multe ciIre, iar pe al doilea l aranjeaz astIel n-
ct n procesul de adunare s se adune ciIre de rang egal. n acest scop, ciIrele num-
rului avnd mai puine ciIre se mut pe lungimea celui cu mai multe, aliniate la dreap-
ta, iar poziiile rmase libere se completeaz cu 0.

Subalgoritm3UHJWLUHQQUQU
aac QU are mai puine cifre aecat QU, le interschimbm }
dacQPatunci
DX[QUDX[Q
QUQUQP
QUDX[PDX[
sfrit dac
DX[QP
ae:m cifrele sale pe po:iii corespun:toare cifrelor }
pentruLQDX[execut:
QU>L@QU>LDX[@ ain QU cu care se vor aauna }
sfrit pentru
pentru LDX[execut: restul cifrelor se completea: cu 0 }
QU>L@
sfrit pentru
sfrit subalgoritm

Algoritmul care realizeaz adunarea este:

Subalgoritm$GXQQUQUQU
pentruLQexecut:
QU>L@ iniial, cifrele re:ultatului sunt egale cu 0 }
sfrit pentru
aaunm cifrele ae rang 0,1,...,n-1 ain cele trei numere }
pentruLQexecut:
VQU>L@QU>L@QU>L@
dacVatunci aac suma cifrelor este ain intervalul |0..9| }
QU>L@V cifra corespun:toare ain QU va fi aceast sum }
altfel in ca: contrar cifra preceaent primete valoarea cifrei ae transport }
QU>L@ cana i1, avem ultimul transport }
cifra curent primete restul impririi intregi a sumei la 10 }
QU>L@Vmod
sfrit dac
sfrit pentru
sfritsubalgoritm

234 11. Aritmetica numerelor mari

AIiarea rezultatului se reduce la scrierea elementelor irului nr
3
n Iiier. Singura
sarcin care mai trebuie ndeplinit este de a veriIica ciIra de pe poziia 0 n nr
3
. Dac
aceasta este egal cu 0, adic la ultima adunare nu am avut transport diIerit de 0, nu o
scriem n Iiier.

11.3.2. Scderea numerelor mari
Prezentm un exemplu de scdere a dou numere. Citim numerele n dou iruri de ca-
ractere, apoi le convertim n tablouri de ciIre nr
1
i nr
2
. Rezultatul scderii se va me-
mora n tabloul de ciIre nr
3
.

Exemplu
Tabloul nr
1
are n 6 elemente: (1, 2, 9, 8, 7, 9).
Tabloul nr
2
are m 4 elemente: (9, 2, 9, 8).
Tabloul nr
2
se completeaz cu zerouri la nceput ca s aib aceeai dimensiune ca
tabloul nr
1
: (0, 0, 9, 2, 9, 8). Tabloul nr
3
este iniializat cu 0.

Scderea se realizeaz conIorm urmtorilor pai:

nr
1
1 2 9 8 7 9 nr
1
1 2 9 8 7 9
nr
2
0 0 9 2 9 8 nr
2
0 0 9 2 9 8
nr
3
0 0 0 0 0 0
La primul pas 9 8 1:
nr
3
0 0 0 0 0 1

La al doilea pas ar trebui s scdem 9 din 7. Adugm 10 la 7, iar din 8 (de pe pozi-
ia sutelor) scdem 1. Scdem 9 din 17, obinnd 8.

nr
1
1 2 9 7 17 9 nr
1
1 2 9 7 17 9
nr
2
0 0 9 2 9 8 nr
2
0 0 9 2 9 8
nr
3
0 0 0 0 8 1
Scdem 2 din 7,
obinem 5:
nr
3
0 0 0 5 8 1

Acum scdem 9 din 9: Urmeaz 2 0:

nr
1
1 2 9 7 17 9 nr
1
1 2 9 7 17 9
nr
2
0 0 9 2 9 8 nr
2
0 0 9 2 9 8
nr
3
0 0 0 5 8 1

nr
3
0 2 0 5 8 1

Ultima scdere: 1 0 1.

nr
1
1 2 9 7 17 9
nr
2
0 0 9 2 9 8
nr
3
1 2 0 5 8 1

Rezultatul obinut este 120581.

n program, asemntor adunrii, numrul Iormat din mai puine ciIre dect cellalt
se va completa cu ciIre de 0.
11. Aritmetica numerelor mari 235

Algoritmul care realizeaz aceast completare cu zerouri este similar cu cel Iolosit
n programul care realiza adunarea:

Subalgoritm3UHJQPQU
DX[QP
pentruLQDX[execut:
QU>L@QU>LDX[@
sfrit pentru
PQ
pentru LDX[execut
QU>L@
sfrit pentru
sfrit subalgoritm

Algoritmul de mai sus se aplic dup ce se stabilete care tablou trebuie completat
cu zerouri. Aceast decizie se ia n algoritmul de mai jos.

Subalgoritm&DOFQPQUQU
dacQ>Patunci
3UHJQPQU
6FDGQUQUQUQ
altfel
aac al aoilea numr este mai mare aecat primul, el va fi aesc:utul }
3UHJPQQU
GQUQUQUQUG
NQQPPN
6FDGQUQUQUQ
sfrit dac
sfrit subalgoritm

Algoritmul care realizeaz scderea este:

Subalgoritm6FDGQUQUQUQ
pentruLQexecut:
dacQU>L@QU>L@atunci
QU>L@QU>L@
QU>L@QU>L@QU>L@
QU>L@QU>L@
altfel
QU>L@QU>L@QU>L@
sfrit dac
sfrit pentru
sfrit subalgoritm
236 11. Aritmetica numerelor mari

La Iiecare scdere veriIicm dac valoarea desczutului este mai mare dect valoa-
rea scztorului. n caz aIirmativ realizm scderea i reinem rezultatul n ciIra cores-
punztoare a lui nr
3
. n caz contrar mprumutm 10 de la elementul din stnga, l de-
crementm pe acesta i eIectum scderea.
AIiarea n Iiierul de ieire se Iace n subalgoritmul de mai jos.

Subalgoritm$ILDUHQU
L
ct timpQU>L@execut: 0-rile ae la inceput nu le vom afia }
LL
sfrit ct timp
dacL!Qatunci
aac numerele sunt egale, tabloul QU conine numai valori nule }
scrie se va scrie aoar un singur 0 }
altfel
ct timpLsQexecut:
scrieF>L@
LL
sfrit ct timp
sfrit dac
sfrit subalgoritm

11.3.3. nmulirea numerelor mari
Prezentm un exemplu de nmulire a dou numere. Vom reine cele dou numere n
tablourile de ciIre nr
1
i nr
2
. Rezultatul se va memora n tabloul de ciIre nr
3
.

Fie nr
1
182 i nr
2
87. Produsul lor este 15834.

Numr Cifra ae
rang 0
Cifra ae
rang 1
Cifra ae
rang 2
Cifra ae
rang 3
Cifra ae
rang 4
Explicaii
nr
1
1 8 2 ciIrele primului numr
nr
2
8 7 ciIrele celui de-al doilea
14 56 7 rezultatul parial dup
nmulirea cu ciIra 7
16 64 8 rezultatul parial dup
nmulirea cu ciIra 8
nr
3
14 72 71 8 rezultatul nmulirii dup
adunarea rezultatelor par-
iale


11. Aritmetica numerelor mari 237

Urmeaz prelucrarea ,ciIrelor rezultatului. Pentru Iiecare element mai mare dect
9 determinm restul mpririi acestuia la 10 (ciIra care va nlocui numrul respectiv)
i ctul care reprezint transportul care se va aduna la urmtorul numr din ir.

Numr Cifra ae
rang 0
Cifra ae
rang 1
Cifra ae
rang 2
Cifra ae
rang 3
Cifra ae
rang 4
nr
3
|14/10| 1
rest|14/10| 4
72 1 73
|73/10| 7
rest|73/10| 3
71 7 78
|78/10| 7
rest|78/10| 8
8 7 15
|15/10| 1
rest|15/10| 5
1
nr
3
1 3 8 5 1

Rezultatul nmulirii este 15834.

Se observ c se realizeaz nmulirea celor dou numere ciIr cu ciIr ca n arit-
metic. Rezultatele nmulirii (pot Ii numere Iormate din una sau dou ciIre) se
pstreaz n tabloul QU n ordine invers, adic de la stnga la dreapta i Ir s se
realizeze transIerul ciIrei zecilor la Iiecare pas. Aceste rezultate pariale se vor pstra
n tabloul QU astIel nct rezultatele nmulirilor curente se vor aduna imediat la
elementul anterior, deplasndu-ne cu o poziie la dreapta la Iiecare nmulire cu o ciIr
nou din nmulitor.
La sIritul adunrilor prelucrm tabloul QU astIel nct acesta s conin ciIre:
pornim de la stnga la dreapta; n elementul curent pstrm restul mpririi ntregi la
10 a acestuia, iar partea ntreag a mpririi la 10 adunm la elementul urmtor.

Algoritmul care realizeaz aceast nmulire este:

SubalgoritmQPXOLUHQUQUQU
N k va conine valoarea cu care se aeplasea: re:ultatele pariale }
in funcie ae numrul ae oraine al cifrei curente ain inmulitor }
pentruMPexecut:
pentruLQexecut:
calcularea proausului }
QU>QLN@QU>QLN@QU>L@QU>M@
sfrit pentru
aup ce s-a inmulit intreg irul cu o cifr, se trece la urmtoarea }
re:ultatul care s-ar scrie sub cel anterior este aeplasat spre areapta cu o po:iie }
NN
sfrit pentru
sfrit subalgoritm

Rezultatul din tabloul QU se prelucreaz, deoarece conine numere i nu ciIre:
238 11. Aritmetica numerelor mari

Subalgoritm3UHOXFUDUHQU
pentruLQPexecut:
dacQU>L@divsatunci
QU>L@QU>L@QU>L@div
QU>L@QU>L@mod
sfrit dac
sfrit pentru
sfrit subalgoritm

irul ciIrelor se aIieaz n ordine invers:



Subalgoritm $ILDUHQU
pentruLQPexecut:
scrieQU>L@
sfrit pentru
sfrit subalgoritm




Tablouri
bidimensionale

Definiie
Operaii cu tablouri bidimensionale
Careuri magice
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
12


Am vzut c ntr-un tablou unidimensional se pot pstra mai multe valori de acelai
tip. Fie, de exemplu, mediile generale ale tuturor elevilor unei clase. Toate mediile
(numere reale) se denumesc cu acelai identiIicator, de exemplu MeaGen, iar un ele-
ment n aceast grupare se gsete pe baza poziiei ocupate n grupul de valori, aranja-
te liniar. Dac privim irul numelor, acestea, la rndul lor Iormeaz un alt ir, n care
Iiecare element este un ir de caractere.

Exemplu
Poziie 1 2 ... 30
MeaGen
Valoare 9.33 8.20 ... 9.63

Poziie 1 2 ... 30
Nume
Valoare Albu Ban ... Zeciu

Corespunztor acestui exemplu ne puteam reIeri la nota unui elev prin MeaGen|nr|,
unde nr este numrul de ordine din catalog al elevului respectiv. Aceast valoare este
indicele elementului n ir.
Ne propunem s reIerim toate mediile pe discipline ale Iiecrui elev printr-o singu-
r variabil. ConIorm catalogului (cunoscut din coal) avem urmtoarele date:

1 (Limba romn) 2 (Matematic) ... 12 (Educaie Iizic
1 Albu 7.33 9.20 ... 10
2 Ban 6.67 7.33 ... 10
... ... ... ... ... ...
30 Zeciu 9.10 ... ... 10
240 12. Tablouri biaimensionale

Mediile tuturor elevilor unei clase la toate disciplinele studiate pot Ii pstrate ntr-o
singur structur de date n care valorile sunt aranjate liniar pe linii i coloane (o linie
corespunde unui elev, o coloan corespunde unei discipline studiate). n exemplul de
mai sus, linia 2 corespunde elevului Ban, n coloana 12 sunt scrise mediile la educaie
Iizic.

Tabloul bidimensional este o structur de date n care Iiecrui element i este asoci-
at o pereche de indici, primul preciznd numrul de ordine al liniei n care se aIl ele-
mentul, iar cel de-al doilea numrul de ordine al coloanei. Media aIlat pe linia i i
coloana f se va nota cu Meaie|i, f| i reprezint media elevului i la disciplina f. Oric-
rui tablou bidimensional i se aloc spaiu de memorie ntr-o zon continu de memo-
rie, elementele aIlndu-se n locaii succesive de memorie aezate linie dup linie.

Exemplu
Un tablou bidimensional avnd trei linii i patru coloane se va reprezenta n memo-
rie astIel:




Linia 1 Linia 2 Linia 3

Vom da deIiniia tabloului bidimensional
*)
, n caz general:

12.1. Definiie
Fie M 1, 2, ..., m} i N 1, 2, ., n} mulimea primelor m, respectiv n numere na-
turale nenule. Considerm o mulime de elemente E ale cror tip de baz este T.
Se numete tablou bidimensional de dimensiune m n, avnd elemente de tipul T,
o Iuncie A: M N E.
Notm elementele cu a
if
, unde i e M, f e N. Aceste elemente sunt aranjate pe m
linii i n coloane, astIel nct acele elemente care au indicele de linie i, sunt plasate pe
aceeai linie i, iar cele avnd acelai indice de coloan f, pe aceeai coloan f:

A
|
|
|
|
.
|

\
|
mn m m
n
n
a a a
a a a
a a a
...
...
...
...
2 1
2 22 21
1 21 11
... ... ...


*)
Noiunea de tablou bidimensional deriv din noiunea de matrice (cunoscut din matematic).
12. Tablouri biaimensionale 241

Cazuri particulare
1) Dac n 1, avem un tablou de dimensiuni m 1 care se numete tablou coloan i
este de Iorma:
A
|
|
|
|
.
|

\
|
1
21
11
...
m
a
a
a

2) Dac m 1, tabloul de dimensiune 1 n se numete tablou linie i este de Iorma:
A (a
11
, a
12
, ., a
1n
)

3) Dac m n, avem un tablou de dimensiune n n, numit tablou ptratic.

Exemplu
Fie un tablou ptratic de dimensiune 6 (m n 6).
i j i < j
a
11
a
12
a
13
a
14
a
15
a
16
a
21
a
22
a
23
a
24
a
25
a
26
a
31
a
32
a
33
a
34
a
35
a
36
a
41
a
42
a
43
a
44
a
45
a
46
a
51
a
52
a
53
a
54
a
55
a
56
a
61

i > j

a
62
a
63
a
64
a
65
a
66

- Elementele n cazul crora indicele de linie coincide cu indicele de coloan (a
11
,
a
22
, ..., a
nn
) Iormeaz aiagonala principal a tabloului.
- Paralelele la diagonala principal a tabloului vor atinge acele elemente n cazul c-
rora i f k, unde n 1 k n 1. Pentru Iiecare valoare a lui k, variind f, obi-
nem o paralel la aiagonala principal.
- Elementele de aeasupra aiagonalei principale satisIac proprietatea i f, iar cele
care se situeaz sub aiagonala principal au proprietatea c indicii lor satisIac rela-
ia i ~ f.
242 12. Tablouri biaimensionale

- n mod similar, irul de elemente a
1,n
, a
2,n-1
, ..., a
n,1
Iormeaz aiagonala secunaar
a tabloului. n cazul acestora, indicii elementelor respect relaia i f n 1.
- n cazul elementelor aIlate aeasupra aiagonalei secunaare indicii au proprietatea
i f n 1, iar cele care se aIl sub aiagonala principal au indici cu proprietatea
i f ~ n 1.

Observm c pentru a parcurge doar elementele de sub diagonala principal, indicii
de linie i de coloan variaz astIel nct s acopere un ,triunghi dreptunghic din
tablou. Acest triunghi are ipotenuza sub diagonala principal i cele dou catete sunt
coloana 1 i linia n. n concluzie, la acest triunghi de pe linia i vor participa elementele
de pe coloanele 1, 2, ..., i 1.

12.2. Operaii cu tablouri bidimensionale
n algoritmi vom prelucra tablouri bidimensionale n cele mai variate moduri. Vom
Iace distincie ntre operaii care acceseaz tabloul ca pe un ntreg i operaii care
acceseaz elementele tabloului. Dar nainte de toate un tablou trebuie declarat.

12.2.1. Declararea tablourilor bidimensionale
Declaraia are urmtoarea Iorm general:

type 7LS7DEarray>tipinaice
1
, tipinaice
2
@ of tipaeba:
var WDEORX7LS7DE

unde prin tipinaice
1
, tipinaice
2
se nelege tipul valorilor din care se alimenteaz in-
dicii (este obligatoriu un tip ordinal), iar tipaeba: este tipul elementelor tabloului.
Acest tip de baz poate Ii orice: putem avea elemente de orice tip numeric, de caracte-
re sau iruri de caractere, valori booleene, nregistrri (vezi tipul record), tablouri de
cele mai diverse tipuri etc.
tipinaice
1
, tipinaice
2
pot Ii identiIicatori de tip predeIinit sau deIinit de utilizator
i, de asemenea, pot Ii expresii, cu meniunea c n acestea pot interveni doar constan-
te i constante simbolice:

Exemplu
const Q
var7LS7DEORXarray>QQ@of%\WH
1XPHUHarray>%RROHDQ%\WH@of,QWHJHU

Dac structura unui tablou este descris n seciunea var, atunci el va avea un tip
anonim. Asociind tipului respectiv un identiIicator de tip ntr-o declaraie type, acesta
va putea Ii Iolosit n program, oriunde vrem s reIerim acest tip.
12. Tablouri biaimensionale 243

Reamintim c aou tablouri aeclarate in aou aeclaraii anonime aiferite vor fi ae
tipuri aiferite, chiar aac in ele s-a aescris aceeai structur.

Exemplu
type7LS7DEORXarray>@of%\WH
var[\7LS7DEORX
Darray>@of%\WH
EFarray>@of%\WH

n programul care conine aceste declaraii, tablourile x i y vor Ii considerate de
acelai tip (7LS7DEORX), b i c, de asemenea vor avea un tip comun (anonim), iar a va
Ii de tip anonim diIerit de 7LS7DEORX, respectiv de tipul anonim al lui b i c.

12.2.2. Citirea tablourilor bidimensionale
n programe, de regul, prima operaie va Ii citirea unui astIel de tablou. n limbajele
Pascal i C nu se poate citi o variabil de tip tablou. Aceast operaie se va realiza ele-
ment cu element.

Subalgoritm&LWLUHQ[
citetePQ tabloul x are m linii i n coloane }
pentruLPexecut:
pentruMQexecut:
citete[>LM@
sfrit pentru
sfrit pentru
sfrit subalgoritm

12.2.3. Afiyarea tablourilor bidimensionale
AIiarea tablourilor se realizeaz asemntor. Dac dorim s realizm o aIiare linie
dup linie a tabloului [ de tipul WDEORX, avnd P linii i Q coloane, n Pascal vom
scrie procedura n Ielul urmtor:

procedure$ILDUHPQ%\WH[WDEORX
begin
forLtoPdobegin
forMtoQdo
:ULWH[>LM@
:ULWH/Q trecem la linie nou }
end
end;


244 12. Tablouri biaimensionale

12.2.4. Atribuirea
Atribuirea la nivel de tablou este permis doar dac identiIicatorii menionai n partea
stng i cea dreapt a operaiei de atribuire au acelai tip. De exemplu, conIorm de-
claraiilor din exemplul menionat, x poate primi valoarea lui y, iar b poate lua valoa-
rea lui c. Putem scrie n program: [\ i EF dar nu putem scrie DE

innd cont de Iaptul c n multe aplicaii va Ii necesar eIectuarea unor operaii cu
elementele tablourilor bidimensionale, asemntor operaiilor din teoria matricelor n
matematic, vom prezenta cteva din aceste operaii.

12.2.5. Adunarea matricelor
Fie A i B dou matrice de dimensiune m n:
A (a
if
), 1 s i s m, 1 s f s n,
B (b
if
), 1 s i s m, 1 s f s n.
DeIinim matricea
C (c
if
), 1 s i s m, 1 s f s n,
ale crei elemente sunt date de egalitile:
c
if
a
if
b
if
(*)
oricare ar Ii i 1, 2, ., m, f 1, 2, ., n.
Matricea C se numete suma dintre matricele A i B i se noteaz
C A B.
n program vom realiza adunarea element cu element, conIorm Iormulei (*).
Menionm c adunarea a dou matrice este comutativ: A B B A i este aso-
ciativ: (A B) C A (B C). Matricea element neutru Ia de adunare se nume-
te matrice nul i are toate elementele egale cu 0. Se va nota: 0
mn
.

O matrice Iormat din elementul 0, mai puin pe diagonala principal, unde are nu-
mai valori egale cu 1, se numete matrice unitate i se noteaz cu I
n
.

12.2.6. Matricea opus
Oricare ar Ii matricea A, exist o matrice notat cu A astIel nct:
A (A) (A) A 0
mn

12.3. Careuri magice
Exist o bogat tradiie a ptratelor magice. ReIeririle la primele ptrate magice se
pierd n negura timpurilor.

Definiie
Un careu de dimensiune n care conine numere de la 1 la n
2
se numete magic, dac
suma numerelor de pe oricare linie a careului este egal cu suma numerelor de pe ori-
12. Tablouri biaimensionale 245

care coloan i sunt egale cu suma numerelor aIlate pe oricare dintre cele dou diago-
nale. Aceast valoare se numete sum magic i se calculeaz cu Iormula:
summagic(n) n (n
2
1)/2.

Prezentm trei algoritmi diIerii pentru generarea ptratelor magice, n Iuncie de
proprietatea lui n:
a) n este impar;
b) n este multiplu de 4;
c) n este par dar nu este multiplu de 4.

12.3.1. Ptratul magic de ordin impar
n cartea lui Feng Shui (Arta vieii in armonie cu natura), precum i n cartea lui Yi
Jing (Cartea schimbrilor) autorii consider c ptratul magic descoperit de Wu Hsia
a Iost imaginat pe carapacea unei broate estoase. Acest ptrat magic este atribuit ci-
vilizaiei chineze dintre anii 2858 2738 nainte de Christos:

8


2 9 4
6 1
7 5 3

Traseul obinut prin parcurgerea n ordine a numerelor din acest careu magic este
cunoscut sub numele de ,drumul mpratului Jen`. Urmrind acest traseu, putem
deduce modul de generare al oricrui careu magic de ordin impar. Se observ urm-
toarele reguli:
- Pornim din poziia avnd indicii 1 i n/2( (parte ntreag superioar).
- Dac suntem pe prima linie, drumul continu pe ultima linie i pe coloana prece-
dent, dac exist o astIel de coloan.
- Dac suntem pe prima coloan, drumul continu pe ultima coloan i pe linia pre-
cedent, dac exist o astIel de linie.
- n rest ncercm s avansm pe diagonal (paralel cu diagonala principal) spre
stnga-sus, dac avem poziie liber n careu n acea direcie. Cnd nu mai putem
avansa astIel, coborm cu o linie pe aceeai coloan.
246 12. Tablouri biaimensionale

Exemplu
n 5, paii 1, 2, 3, 4: paii pn la pasul 17:

12 2 12 12 15 8 1 17
10 16 14 7 5
1 4 13 6 4
3

3 12 10
20 9 2 11

12.3.2. Ptratul magic de ordin multiplu de 4
Pentru a genera un ptrat magic de ordin n (n multiplu de 4), se aplic urmtorii pai:
- Se genereaz ptratul de dimensiune n n care aezm numerele de la 1 la n
2
n or-
dine pe linii.
- Elementele aIlate pe linii avnd numr de ordine pentru care restul mpririi la 4
este 0 sau 1 i coloane care nu au aceast proprietate, sau pe coloane avnd numr
de ordine pentru care restul mpririi la 4 este 0 sau 1 i linii care nu au aceast
proprietate, vor Ii schimbate cu elementele aIlate n poziii simetrice Ia de mijlo-
cul careului, aa cum se poate observa din Iigura urmtoare:

1 2 3 4 5 6 7 8

1 63 62 4 5 59 58 8
9 10 11 12 13 14 15 16

56 10 11 53 52 14 15 49
17 18 19 20 21 22 23 24

48 18 19 45 44 22 23 41
25 26 27 28 29 30 31 32

25 39 38 28 29 35 34 32
33 34 35 36 37 38 39 40

33 31 30 36 37 27 26 40
41 42 43 44 45 46 47 48

24 42 43 21 20 46 47 17
49 50 51 52 53 54 55 56

16 50 51 13 12 54 55 9
57 58 59 60 61 62 63 64

57 7 6 60 61 3 2 64

12.3.3. Ptrat magic de ordin n, unde n 2 m (m numr impar)
Algoritmul de generare a unui ptrat magic de ordin n, unde n 2 m i m este numr
impar, este o metod elegant, ajuns prima dat n Europa prin Siam.
12. Tablouri biaimensionale 247

Acest algoritm se aplic conIorm urmtorilor pai:
- Se calculeaz valoarea lui m;
- Se genereaz o matrice de litere (construcie ajuttoare) astIel:
primele |m / 2| 1 linii se completeaz cu litera ,L;
linia urmtoare se completeaz cu litera ,U;
restul liniilor se completeaz cu litera ,X;
litera ,L aIlat n mijlocul careului se interschimb cu litera ,U aIlat sub ea.

Exemplu
Dac n 10, avem m 5.









- ptratul magic de dimensiune 2m se construiete urmrind algoritmul de generare
a ptratelor magice impare, considernd ptratul de dimensiune m (m este impar),
Iormat din ptrate de dimensiune 2.
- Fiecare ptrat de dimensiune 2 2 va avea ca i corespondent o liter ,L, ,U, sau
,X i va Ii completat n ordinea sugerat de aceast liter:
4 1 1 4 1 4
L: U: X:

2 3 2 3 3 2

Aplicm paii algoritmului Ven prezentat anterior:


1 4



4
3


2






L L L L L

L L L L L
L L L L L

L L L L L
L L L L L

L L U L L
U U U U U

U U L U U
X X X X X

X X X X X
248 12. Tablouri biaimensionale

Obinem:

60 57 32 29 4 1 96 93 68 65
58 59 30 31 2 3 94 95 66 67
64 61 56 53 28 25 20 17 92 89
62 63 54 55 26 27 18 19 90 91
88 85 80 77 49 52 24 21 16 13
86 87 78 79 50 51 22 23 14 15
9 12 81 84 76 73 45 48 37 40
10 11 82 83 74 75 46 47 38 39
33 36 5 8 97 100 69 72 41 44
35 34 7 6 99 98 71 70 43 42

12.4. Implementri sugerate
Pentru a v Iamiliariza cu modul n care trebuie rezolvate problemele n cadrul crora
intervin operaii cu Iiiere text, v sugerm s ncercai s implementai algoritmi pentru:
1. suma elementelor unui tablou bidimensional;
2. identiIicarea liniei i coloanei pe care se aIl minimul/maximul unui tablou bidi-
mensional;
3. suma elementelor de pe diagonala principal;
4. suma elementelor de pe diagonala secundar;
5. suma elementelor de deasupra (de dedesubtul) diagonalei principale;
6. suma elementelor de deasupra (de dedesubtul) diagonalei secundare;
12. Tablouri biaimensionale 249

7. determinarea sumei celor opt vecini ai unui element;
8. determinarea sumelor elementelor aIlate n triunghiul de N, S, E i V delimitat de
diagonalele matricei;
9. rotirea unui tablou bidimensional cu 90 de grade;
10. determinarea matricei simetrice Ia de diagonala principal (secundar);
11. nlocuirea elementelor din triunghiul de nord cu cele din triunghiul de vest (i va-
riante);
12. parcurgerea pe diagonale a unei matrice;
13. parcurgerea n spiral a unei matrice;
14. calcularea sumelor de-a lungul laturilor matricelor ptratice;
15. veriIicarea unei proprieti globale a unui tablou bidimensional;
16. produsul a dou matrice de numere;
17. produsul a n matrice;
18. inversarea a dou linii/coloane ntr-o matrice;
19. ordonarea liniilor astIel nct elementele de pe diagonala principal/secundar s
Iie n ordine cresctoare/descresctoare;
20. veriIicarea triunghiularitii unei matrice (inIerior, superior triunghiular);
21. suma elementelor unui tablou n-dimensional;
22. identiIicarea coordonatelor unui element avnd o valoare dat (toate apariiile) n-
tr-un tablou n-dimensional;
23. veriIicarea proprietii de ptrat magic.

12.5. Probleme propuse

12.5.1. Peytera
O peter are n ncperi numerotate de la 1 la n. ntre anumite ncperi s-au amenajat
coridoare de acces, altele au rmas izolate. Administratorul complexului turistic cruia
i s-a dat n grij petera ar vrea s tie rspunsul la urmtoarele ntrebri:
1. Care sunt ncperile n care intr cele mai multe coridoare?
2. Care sunt ncperile unde petera se nIund?
3. Care sunt ncperile izolate?

Date de intrare
Prima linie a Iiierului de intrare PESTERA.IN conine numrul natural nenul n al n-
cperilor peterii. Pe urmtoarele n linii sunt scrise cte n valori 0 i 1, valorile ele-
mentelor unui tablou bidimensional p. Valorile 0 i 1 au urmtoarea semniIicaie:
- p
if
1, dac ntre ncperea i i ncperea f exist cale de acces amenajat.
- p
if
0, n caz contrar.
Valorile scrise pe o aceeai linie din Iiier sunt desprite prin cte un spaiu.

250 12. Tablouri biaimensionale

Date de ieyire
Pe prima linie a Iiierului de ieire PESTERA.OUT se vor scrie numerele de ordine ale
ncperilor n care intr sau din care ies un acelai numr maxim de coridoare.
Pe a doua linie se vor aIla numerele de ordine ale ncperilor n care petera se
nIund. n cazul n care nu exist astIel de ncperi, n Iiier se va scrie mesajul 1X
H[LVWD.
A treia linie a Iiierului (i ultima) va conine numerele de ordine ale ncperilor
izolate. Dac asemenea ncperi nu exist, se va aIia mesajul: 1XH[LVWD

Restricii yi precizri
- 1 s n s 100.

Exemple
PESTERA1.IN


PESTERA1.OUT



PESTERA2.IN

PESTERA2.OUT

1XH[LVWD

12.5.2. Acvariul cu peyti
ntr-un acvariu sunt introdui n peti de diIerite specii, printre care i unele carnivore.
Pentru Iiecare pete se cunosc petii pe care acesta i-ar mnca (n cazul n care m-
nnc ali peti). Deoarece nu toi petii sunt Ioarte nIometai, nu se cunoate ordinea
n care acetia se vor ataca. Stabilii speciile de peti care, dup un interval de timp,
vor rmne n via n mod sigur!

Date de intrare
Pe prima linie a Iiierului de intrare PESTI.IN se gsete numrul natural nenul n, re-
prezentnd numrul de peti. Pe urmtoarele n linii se aIl elementele tabloului bidi-
mensional p, avnd valori 0 i 1 (desprite prin spaii) cu urmtoarea semniIicaie:
- p
if
1, dac specia i mnnc specia f.
- p
if
0, n caz contrar.
12. Tablouri biaimensionale 251

Date de ieyire
Pe prima linie a Iiierului de ieire PESTI.OUT se va scrie un ir de numere, separate
prin cte un spaiu, reprezentnd numerele de ordine a speciilor de peti care supravie-
uiesc n mod sigur n acvariu.

Restricii yi precizri
- 1 s n s 100;
- Dac un pete de specia i mnnc peti de specia f i specia f mnnc peti de
specia i, nici unul nu rmne n mod sigur n via, deoarece nu tim nimic reIeritor
la ordinea n care ei se vor mnca ntre ei.

Exemplu
PESTI.IN

PESTI.OUT

Explicaie
Petele 1 mnnc petele 3.
Petele 2 nu este carnivor.
Petele 3 mnnc petele 2.
Petele 4 mnnc petele 1 i 6.
Petele 5 i petele 6 nu sunt carnivori.
Deci, deoarece petii 1, 2, 3 i 6 pot Ii
mncai de ali peti, rmn n via cu
siguran petii 4 i 5.

12.5.3. Tir sportiv
Un matematician, iubitor de tir sportiv, i-a pus problema construirii unei inte ptrate
de latur n n care punctajele s Iie distribuite dup reguli matematice proprii. El mai
nti a generat irul punctajelor pe baza unei reguli, obinnd: 2, 3, 4, 2, 5, 6, 3, 7, 8, 4,
9, 3, 10, 5, 11, 12, 6, ...


2 3 4 2 5 6 3 7 8
22 11 23 ... 4
7 9
21 3
10 10
20 5
9 11
18 12
17 8 16 5 15 7 14 13 6

252 12. Tablouri biaimensionale

Se observ c Iiecare numr natural neprim este urmat de cel mai mare divizor
(prim sau nu) al su. Pentru o bun distribuie a acestor numere, matematicianul s-a
gndit s le aeze pe inta ptratic de-a lungul unei spirale, ncepnd din colul stn-
ga-sus, continund spre dreapta, apoi n jos, urmnd apoi marginea de jos de la dreapta
la stnga, apoi n sus i continund spirala ct timp este posibil.
Scriei un program care ,construiete inta pentru un ptrat de latur n, respectnd
regulile matematicianului.

Date de intrare
n Iiierul de intrare TIR.IN se gsete numrul natural nenul n, reprezentnd lungi-
mea laturii intei.

Date de ieyire
inta generat se va scrie sub Iorma unui tablou bidimensional n Iiierul de ieire
TIR.OUT, unde pe linia i se vor scrie elementele situate pe cea de-a i-a linie n int.
Numerele scrise pe linii vor Ii separate prin cte un spaiu.

Restricii yi precizri
- 1 s n s 150.

Exemplu
TIR.IN

TIR.OUT



12.5.4. Biliard
O bil este lovit cu tacul pe o mas de biliard dreptunghiular, de dimensiune m n
ntr-o direcie oblic (dreapta-sus, dreapta-jos, stnga-jos sau stnga-sus). Atunci cnd
bila se lovete de o margine a mesei, cu excepia colurilor, ea ricoeaz, noul traseu al
ei Iormnd un unghi de 90 cu vechiul traseu. Dac bila ajunge ntr-un col, ea iese de
pe mas. Cunoscnd dimensiunile mesei, poziia de plecare a bilei i direcia de depla-
sare iniial, s se simuleze micarea bilei pn la ieirea de pe mas, sau pn cnd se
observ c traseul acesteia intr n ciclu.

Date de intrare
Prima linie a Iiierului de intrare BILIARD.IN conine numerele m i n, reprezentnd
dimensiunea mesei. Pe linia a doua se gsesc coordonatele poziiei iniiale a bilei, iar
pe a treia linie se aIl o ciIr din mulimea 1, 2, 3, 4}, reprezentnd direcia de porni-
re a bilei: 1 corespunde direciei dreapta-sus, 2 direciei dreapta-jos, 3 direciei stnga-
jos, iar 4 direciei stnga-sus.
12. Tablouri biaimensionale 253

Date de ieyire
Fiierul de ieire BILIARD.OUT va conine traseul bilei sub Iorma unui tablou bidi-
mensional de dimensiuni corespunztoare mesei. Fiecare linie a tabloului se va scrie
pe linie nou n Iiier. Elementul corespunztor poziiei iniiale a bilei se marcheaz cu
1, urmtoarea poziie atins de bil conIorm direciei de micare cu 2 etc. n cazul n
care bila trece a doua oar printr-o poziie, se pstreaz primul marcaj. Poziiile nestr-
btute vor conine valoarea 0.
Dac bila nu poate iei de pe mas, deoarece traseul ei Iormeaz un ciclu, n Iiier
se va scrie mesajul %LODQXSRDWHLHVLGHSHPDVD, apoi se va scrie n Iii-
er tabloul bidimensional corespunztor micrilor bilei.

Restricii yi precizri
- 1 s m, n s 100.

Exemple
BILIARD1.IN

BILIARD2.IN


BILIARD1.OUT
%LODQXSRDWHLHVLGHSHPDVD

BILIARD2.OUT



12.5.5. Puncte ya
Se numete punct a ntr-un tablou bidimensional, poziia n care elementul este mi-
nim pe coloana lui i maxim pe linie, sau invers. Scriei un program care determin
toate punctele a ntr-o matrice bidimensional dreptunghiular.

Date de intrare
Prima linie a Iiierului de intrare SA.IN conine numerele m i n, reprezentnd dimen-
siunile tabloului. Pe Iiecare dintre urmtoarele m linii se aIl cte n numere ntregi,
desprite prin cte un spaiu, reprezentnd elementele matricei.

Date de ieyire
Fiierul de ieire SA.OUT va conine attea linii cte puncte a s-au gsit. Corespunz-
tor unui astIel de punct n Iiier se vor scrie dou numere naturale, desprite printr-un
spaiu, reprezentnd indicii punctului a. Dac tabloul dat nu are nici un punct a, n
Iiier se va scrie mesajul 1XH[LVWDSXQFWVD.
254 12. Tablouri biaimensionale

Restricii yi precizri
- 1 s n s 100;
- 1 s m s 100;
- Numerele tabloului sunt distincte.

Exemple
SA.IN


SA.OUT



12.5.6. Rame de tablouri care trebuie suprapuse
ntr-un spaiu dreptunghiular de dimensiune m n trebuie aezate una dup alta p ra-
me de tablouri de dimensiune dat. Ramele se pot aeza unele peste altele, astIel nct
laturile lor vor Ii paralele cu marginile spaiului de depozitare.
S se aIieze, sub Iorma precizat la date de ieire ceea ce va vedea din ramele su-
prapuse o persoan care se va uita la teancul de rame dintr-o poziie situat deasupra
spaiului n care acestea s-au aezat.

Date de intrare
De pe prima linie a Iiierului de intrare RAME.IN se vor citi numerele m i n, reprezen-
tnd dimensiunile spaiului n care se aeaz ramele. Pe urmtoarea linie se aIl num-
rul natural p, reprezentnd numrul ramelor care trebuie suprapuse. Urmtoarele p linii
conin Iiecare coordonatele colului stnga-sus (indicele de linie i de coloan) al unei
rame, lungimea (n numr de linii) i limea (n numr de coloane) a ramei.

Date de ieyire
n Iiierul de ieire RAME.OUT se va scrie un tablou bidimensional de caractere, repre-
zentnd imaginea cu ramele suprapuse. Pentru o ram se va speciIica doar chenarul ei.
Acestea se vor codiIica cu literele mari ale alIabetului englez n ordinea n care sunt
descrise n Iiierul de intrare, ncepnd cu litera $. Atunci cnd o ram se suprapune
peste una aezat deja i va acoperi caracterele din chenar n poziiile n care cele dou
rame se intersecteaz pe limea unui singur caracter (coloan).

Restricii yi precizri
- 1 s m s 100;
- 1 s n s 100;
- 1 s p s 25;
- Dac dimensiunile unei rame depesc spaiul de depozitare, rama respectiv nu
va Ii depozitat, iar litera care i corespunde nu va Ii utilizat.
12. Tablouri biaimensionale 255

Exemplu
RAME.IN RAME.OUT
& & & & & &
% & % &
$ $ % & % $ $ &
$ % & % $ &
$ % & % $ &
$ & $ &
$ & $ &
$ & $ &
$ & $ &
$ $ $ & $ $ $ &
& &
& & & & & &

12.5.7. Rame de tablouri suprapuse
ntr-un spaiu dreptunghiular de dimensiune m n au Iost aezate una dup alta p rame
de tablouri. Ramele pot Ii aezate unele peste altele, astIel nct laturile lor vor Ii pa-
ralele cu marginile spaiului de depozitare.
Cunoscnd imaginea pe care o vede din ramele suprapuse o persoan care se uit la
teancul de rame dintr-o poziie situat deasupra spaiului n care acestea s-au aezat, s
se determine ordinea n care este posibil ridicarea tuturor ramelor. Se tie c Iiecare
ram este descris n mod unic Iolosind o liter mare a alIabetului englez i c atunci
cnd au Iost suprapuse dou rame se va vedea complet numai rama de deasupra.

Date de intrare
De pe prima linie a Iiierului de intrare RAME.IN se citesc dimensiunile m i n a spai-
ului n care aezm ramele. De pe urmtoarele m linii se citete imaginea pe care o ve-
de persoana. CodiIicarea imaginii este realizat ntr-un tablou bidimensional corespun-
ztor spaiului de depozitare n care pentru o ram se va speciIica doar chenarul ei.
Acestea sunt codiIicate cu literele mari ale alIabetului englez n ordinea n care au Iost
depozitate. Atunci cnd o ram s-a suprapus peste una aezat deja ea acoper caracte-
rele din chenar n poziiile n care cele dou rame se intersecteaz pe limea unui sin-
gur caracter (coloan).

Date de ieyire
Fiierul RAME.OUT va conine un ir de litere mari ale alIabetului englez, desprite
printr-un spaiu, care corespund ramelor n ordinea n care acestea se pot ridica.

Restricii yi precizri
- 1 s m s 100;
- 1 s n s 100;
256 12. Tablouri biaimensionale

- 1 s p s 25;
- Din Iiecare latur a Iiecrei rame se vede cel puin un punct.

Exemplu
RAME.IN RAME.OUT
29.
22 2222

929 2
..929 .. 2

. 929 . 2
. 929 . 2
. 2 . 2
. 2 . 2
. 2 . 2
. 2 . 2
...2. .. 2
2 2
22 2222

12.5.8. Prelucrare de imagine
O imagine alb-negru este preluat codiIicat ntr-un tablou bidimensional de valori 0
sau 1 de dimensiune m m. Asupra acestei imagini se pot eIectua urmtoarele trans-
Iormri:
- TransIormarea , video Invers: valorile 0 se transIorm n 1 iar valorile 1 n 0.
- ,Rotire cu 90: se creeaz un tablou rotit n sensul acelor de ceasornic.
- ,Zoom: imaginea se mrete la dimensiunea 2m 2m.
Se deIinete o secven de transIormri ca Iiind o succesiune de litere I, R i Z.
S se aIieze tabloul bidimensional la care s-a ajuns n urma unui ir de transIor-
mri cerute.

Date de intrare
De pe prima linie a Iiierului de intrare IMAG.IN se citete un numr natural m, repre-
zentnd dimensiunea tabloului. Pe urmtoarele m linii se aIl elementele tabloului bi-
dimensional corespunztor unei imagini, linie dup linie. Elementele sunt separate
prin cte un spaiu.
Din Iiierul de intrare TRANS.IN se citete succesiunea de litere I, R i Z corespun-
ztoare unor transIormri dorite. Aceste caractere nu sunt desprite de spaiu.

Date de ieyire
Pe prima linie a Iiierului IMAG.OUT se vor scrie dimensiunile actuale ale tabloului.
Pe urmtoarele linii se vor aIla elementele tabloului bidimensional obinute ca urmare
a transIormrilor eIectuate.
12. Tablouri biaimensionale 257

Restricii yi precizri
- 1 s m s 100 (indiIerent de transIormrile aplicate);
- literele sunt majuscule din alIabetul englez.

Exemple
IMAG.IN


TRANS.IN
5,5
IMAG.OUT



IMAG.IN


TRANS.IN
=
IMAG.OUT



12.5.9. Careu magic
S se genereze un ptrat magic de dimensiune n, unde n este un numr ntreg pozitiv.

Date de intrare
n Iiierul de intrare MAG.IN se gsete numrul n, reprezentnd dimensiunea careului
care trebuie generat.

Date de ieyire
Pe prima linie a Iiierului de ieire MAG.OUT se va aIla numrul n. Pe urmtoarele n li-
nii se vor scrie numerele de pe cele n linii ale careului, dou numere Iiind separate
prin cte un spaiu.

Restricii yi precizri
- 1 s n s 40.

258 12. Tablouri biaimensionale

Exemple
MAG.IN

MAG.OUT

Explicaie
n este numr par Ir a Ii
multiplu de 4.
MAG.IN

MAG.OUT

Explicaie
n este multiplu de 4.

MAG.IN

MAG.OUT


Explicaie
n este numr impar.

12.6. Soluiile problemelor propuse

12.5.1. Peytera
Vom descompune problema n subprobleme i vom proiecta pentru Iiecare subproble-
m rezolvri pe care le vom implementa Iolosind subprograme.
1. Tabloul bidimensional care ,conine particularitile peterii l citim din Iiier.

Subalgoritm &LWLUHQS
citeteQ
pentruLQexecut:
pentruMQexecut:
citeteS>LM@
sfrit pentru
sfrit pentru
sfrit subalgoritm

2. Numrm coridoarele care intr n ncperi. Cunoatem semniIicaia valorilor
p
if
, deci, pentru a determina numrul coridoarelor care se ntlnesc n ncperea
i (pentru i Iixat i valori posibile i 1, 2, ., n), vom aduna valorile p
if
, unde
f 1, 2, ., n, adic vom aduna elementele pe linii.

12. Tablouri biaimensionale 259

Subalgoritm 1XPUDUHQSQUBFRULGRDUH
pentruLQexecut:
QUBFRULGRDUH>L@
pentruMQexecut:
QUBFRULGRDUH>L@QUBFRULGRDUH>L@S>LM@
sfrit pentru
sfrit pentru
sfrit subalgoritm

3. Determinm valoarea maxim a numerelor care reprezint numrul coridoare-


lor care se ntlnesc ntr-o ncpere.

Subalgoritm 0D[LPQQUBFRULGRDUHPD[
PD[QUBFRULGRDUH>@
pentruLQexecut:
dacQUBFRULGRDUH>L@!PD[atunci
PD[QUBFRULGRDUH>L@
sfrit dac
sfrit pentru
sfrit subalgoritm

4. Selectarea numerelor de ordine ale ncperilor n care intr sau ies un acelai
numr maxim de coridoare se realizeaz cu un algoritm de selectare:

Subalgoritm &DUH0D[QQUBFRULGRDUHPD[
pentruLQexecut:
dacQUBFRULGRDUH>L@PD[atunci
scrieL
sfrit dac
sfrit pentru
sfrit subalgoritm

5. Determinm ncperile n care petera se nIund, Iolosind irul construit ante-
rior. Dac valoarea elementului avnd indicele i este egal cu 1 (am putut veni
de undeva pe un coridor pn aici), atunci petera se nIund n ncperea i.

Subalgoritm 6HBvQIXQGQQUBFRULGRDUH
JVLWfals
pentruLQexecut:
dacQUBFRULGRDUH>L@atunci
scrieL
JVLWaaevrat
sfrit dac
sfrit pentru
260 12. Tablouri biaimensionale

dac nuJVLWatunci
scrie1XH[LVWD
sfrit dac
sfrit subalgoritm

6. Depistarea ncperilor izolate o realizm cu ajutorul aceluiai ir, cutnd ele-
mente egale cu 0 (nu intr, nu iese nici un coridor).

Subalgoritm,]RODWHQQUBFRULGRDUH
JVLWfals
pentruLQexecut:
dacQUBFRULGRDUH>L@atunci
scrieL
JVLWaaevrat
sfrit dac
sfrit pentru
dac nuJVLWatunci
scrie1XH[LVWD
sfrit dac
sfrit subalgoritm

12.6.2. Acvariul cu peyti
Este evident c, din cauza c nu tim nimic despre ordinea n care se mnnc petii,
pentru a depista speciile care rmn sigur n via, este suIicient s cutm n tabloul
dat coloanele care nu conin nici o valoare 1. Indicii acestor coloane reprezint nume-
rele de ordine ale speciilor cutate.
Vom parcurge tabloul dat pe linii i vom marca ntr-o variabil boolean (victim)
cu valoarea aaevrat, dac pe linia respectiv gsim cel puin o valoare 1. Cu alte cu-
vinte, petii care pot Ii mncai de un alt pete, indiIerent care, sunt marcai ca victime.
Aceast prelucrare o putem realiza n paralel cu citirea datelor. De asemenea, nainte
s trecem la alt linie, n cazul n care petele de indice i nu este victim, l scriem n
Iiier.

Algoritm &LWLUHBFXB3UHOXFUDUHQSYLFWLP
citeteQ
pentruLQexecut:
YLFWLPfals
pentruMQexecut:
citeteS>LM@
dacS>LM@atunci
YLFWLPaaevrat
sfrit dac
sfrit pentru
12. Tablouri biaimensionale 261

dac nu YLFWLP atunci
scrieL afiarea speciilor supravieuitoare }
sfrit dac
sfrit pentru
sfrit subalgoritm

12.6.3. Tir sportiv
Pentru rezolvarea acestei probleme este util s crem n prealabil irul de numere dup
regula enunat. Pentru valori mici ale lui n irul va Ii creat ntr-un tablou unidimensi-
onal, pentru valori mari ale lui n putem crea ,irul respectiv ntr-un Iiier de tip text.
De asemenea, lsm pe seama cititorilor s realizeze o implementare n care numerele
generate se scriu direct ,pe int, evitnd astIel utilizarea unui ir (sau Iiier) de lucru.
n pseudocodul descris n continuare nu veriIicm separat dac numrul este prim
sau nu, ci n primul rnd, dup ce orice numr curent k s-a scris n ir, vom cuta
primul su cel mai mic divizor, urmnd s Iolosim n ir ctul mpririi ntregi al lui k
la acesta (adic pe cel mai mare divizor). Dac nu gsim un astIel de divizor, nseamn
c numrul nu este prim, iar divizorul gsit l scriem n Iiier.

Subalgoritm *HQHUDUHLUQQ nn n*n, numrul numerelor pe int }


L i numr numere generate }
N k numerele pe care le scriem in fiier, primul numr este 2 }
ct timpLQQexecut:
LL crete contorul ptrelelor ocupate }
scrieN il scriem pe k in fiier }
UDGparte intreag ain racina ptrat a lui k
dacNeste numr paratunci
GLYL]RU
altfel
GLYL]RU cel mai MIC aivi:or al lui k }
ct timpNmodGLYL]RU=iGLYL]RUsUDGexecut:
GLYL]RUGLYL]RU aivi:ori impari }
sfrit ct timp
sfrit dac
dacGLYL]RUsUDGatunci avem un aivi:or }
LL ne pregtim s scriem un numr in fiier }
dacLsQQatunci il scriem numai aac avem nevoie ae el }
scrieNdivGLYL]RU scriem cel mai MARE aivi:or }
sfrit dac
sfrit dac
NN urmtorul numr }
sfrit ct timp
sfrit subalgoritm
262 12. Tablouri biaimensionale

Avnd numerele necesare intei generate n Iiier, le vom citi unul cte unul i le
vom aeza n tabloul bidimensional pe poziia corespunztoare parcurgerii acestuia n
spiral.
Vom reine cteva proprieti pe care le vom IructiIica n algoritm:
1. Mai nti observm c aceast spiral se termin, Iie dup o parcurgere a ultimelor
poziii ain stanga spre areapta (dimensiunea tabloului este numr impar), Iie dup o
parcurgere a ultimelor poziii ain areapta spre stanga (dimensiunea tabloului este nu-
mr par).
n Iigurile de mai jos sunt prezentate cele dou cazuri, pentru n 3, respectiv n 4.




2. O alt observaie se reIer la Iaptul c, atunci cnd suntem pe ,cercul exterior al
spiralei, avem de parcurs linia 1 de la primul su element la ultimul, a n-a coloan de
la al doilea element al su (primul a Iost parcurs atunci cnd am lucrat pe linia 1) la ul-
timul, apoi a n-a linie de la penultimul element la primul. n Iinal, vom parcurge prima
coloan de la penultimul su element pn la al doilea (ultimul a Iost parcurs atunci
cnd am prelucrat ultima linie, iar primul atunci cnd am prelucrat linia 1). Ceea ce
este i mai important de observat se reIer la Iaptul c atunci cnd vom parcurge un
,cerc interior, imediat urmtor exteriorului, toate limitele ae inceput cresc cu 1, iar
limitele ae sfarit scaa cu 1. n consecin, vom iniializa dou variabile (SULPXO cu
i XOWLPXO cu Q) care i vor schimba valorile dup nchiderea unui ,cerc a spiralei
(SULPXO SULPXO , XOWLPXO XOWLPXO).
Din observaia 1. rezult c vom ncepe aezarea numerelor din Iiier, indiIerent de
paritatea lui n parcurgnd elementele tabloului pe linia de indice primul spre dreapta.
Ar urma parcurgerea de sus n jos a coloanei de indice ultimul, dar aceast parcurgere
nu ntotdeauna este posibil (necesar) i anume, dac n este impar, dup o asemenea
parcurgere se termin prelucrarea. Subalgoritmul care creeaz inta este urmtorul:

Subalgoritm&UHDUHLQWQQQLQWD
SULPXO
XOWLPXO Q
IRORVLWH
parcurgem prima linie ae la stanga la areapta
dacQ este numr impar atunci
ct timpIRORVLWHQQexecut:
in variabila IRORVLWH numrm po:iiile prelucrate pe int }
parcurgem coloana ae inaice XOWLPXO ae sus in fos
12. Tablouri biaimensionale 263

parcurgem linia ae inaice XOWLPXO ae la areapta la stanga
parcurgem coloana ae inaice SULPXO ae fos in sus
SULPXO SULPXO
XOWLPXO XOWLPXO
parcurgem linia ae inaice SULPXO ae la stanga la areapta
sfrit ct timp
altfelQ este numr impar atunci
parcurgem ultima coloan ae sus in fos
parcurgem ultima linie ae la areapta la stanga
ct timpIRORVLWHQQexecut:
in variabila IRORVLWH numrm po:iiile prelucrate pe int }
parcurgem coloana ae inaice SULPXO ae fos in sus
SULPXO SULPXO
XOWLPXO XOWLPXO
parcurgem linia ae inaice SULPXO ae la stanga la areapta
parcurgem coloana ae inaice XOWLPXO ae sus in fos
parcurgem linia ae inaice XOWLPXO ae la areapta la stanga
sfrit ct timp
sfrit dac
sfrit subalgoritm

Parcurgerile menionate mai sus nu sunt problematice. Trebuie doar s avem grij
s nu prelucrm un acelai element de dou ori, deoarece astIel am suprascrie anumite
valori i n Iinal nu ne-ar ajunge numerele generate n Iiier. Pentru exempliIicare, s
vedem parcurgerea de jos n sus:

Subalgoritm -RV6XVSULPXOXOWLPXOIRORVLWH
pentruLXOWLPXOSULPXOexecut: pasul este 1! }
IRORVLWH IRORVLWH
citeteQU se citete numrul curent ain fiierul ae manevr }
LQW>LSULPXO@ QU
elementul ae pe linia L i coloana SULPXO in tabloul corespun:tor intei }
sfrit pentru
sfrit subalgoritm

12.6.4. Biliard
Rezolvarea problemei necesit simularea anumitor deplasri de-a lungul unor linii care
sunt paralele cu diagonalele ptratului ,decupat de micarea bilei din tabloul bidi-
mensional dreptunghiular, corespunztor mesei i o stpnire corect a schimbrilor
de direcie atunci cnd bila se lovete de marginea mesei.
264 12. Tablouri biaimensionale

Vom deIini dou iruri de cte patru elemente n care vom pstra valorile care tre-
buie adunate coordonatei x, respectiv coordonatei y, pentru a ne deplasa pe o direcie
dat a. Deplasarea n cele patru direcii le putem codiIica n Ielul urmtor:

a 1


2

3

4

poziia curent i, f i, f i, f i, f
noua poziie i 1, f 1
scade linia
crete coloana
i 1, f 1
crete linia
crete coloana
i 1, f 1
crete linia
scade coloana
i 1, f 1
scade linia
scade coloana
Dx 1 1 1 1
Dy 1 1 1 1

La Iiecare pas, coordonatele i i f se modiIic n i Dx|a|, respectiv f Dy|a|.
Acest mod de reprezentare ne va uura gestionarea schimbrilor de direcie.

Observm c la ntlnirea unei margini a mesei, corespunztoare unei margini ver-
ticale n tablou, direcia de deplasare se modiIic astIel:


direcia 3 se transIorm n direcia 2, i invers:






direcia 1 se transIorm n direcia 4 i 4 n 1:




La ntlnirea unei margini a mesei, corespunztoare unei margini orizontale n ta-
blou, direcia 1 se schimb n direcia 2 i 2 n 1, iar direcia 4 se transIorm n 3 i 3
n 4. Vom asigura schimbarea direciei cu o structur de tip repet, care se va execu-
ta pn cnd bila iese printr-un col sau intr n ciclu.
n subalgoritmul urmtor, n variabila pas generm valoarea care marcheaz mo-
mentul n care bila traverseaz un anumit punct de pe mas. Dac mingea ar urma s-
i reia traseul i astIel s intre n ciclu inIinit, variabila boolean infinit primete valoa-
rea aaevrat. Pentru a avea control asupra momentului n care bila iese de pe mas
(ajunge ntr-un col) ne Iolosim de o Iuncie boolean:
12. Tablouri biaimensionale 265

Subalgoritm$IDU
$IDULsauLPiMsauMQ
sfrit subalgoritm

Rezolvarea problemei const n simularea micrii bilei. Anterior apelului subalgo-


ritmului 0LFDUH s-au citit datele de intrare i s-a iniializat tabloul a cu elemente nule.

Subalgoritm0LFDUHPQLMDLQILQLW
[G[>GLU@
\G\>GLU@
SDV contorul pentru marcarea po:iiilor strbtute }
D>LM@SDV
VHBUHSHWfals
LQILQLWfals
ct timp mingea nu a ieit afar inuLQILQLWexecut
SDVSDV crete contorul ae po:iii }
LL[ aeplasare pe airecia GLU, pan la intalnirea unei margini }
MM\
dacLsauL!Patunci bila s-a lovit ae o margine ori:ontal }
[[
LL[
sfrit dac
dacMsauM!Qatunci bila s-a lovit ae o margine vertical }
\\
MM\
sfrit dac
dacD>LM@atunci aac aceast po:iie nu a fost strbtut inc }
VHUHSHWfals
D>LM@SDV o marcm }
altfel aac aceast po:iie a mai fost marcat i este pe o margine }
dacVHBUHSHWiD>LM@atunci
LQILQLW aaevrat bila a intrat in micare ciclic aeoarece }
ain po:iia marcat cu 1 a afuns in po:iia marcat cu 2 }
altfel
dacD>LM@atunci
VHBUHSHWaaevrat
altfelVHBUHSHWfals
sfrit dac
sfrit dac
sfrit dac
sfrit ct timp
sfrit subalgoritm
266 12. Tablouri biaimensionale

AIiarea tabloului a, corespunztor mesei de biliard, este precedat de veriIicarea
variabilei infinit pentru a stabili dac se va scrie mesajul reIeritor la micarea bilei:

Subalgoritm $ILDUH
dacLQILQLWatunci
scrie0LQJHDQXSRDWHLHVLGHSHPDVD
sfrit dac
pentruLPexecut
pentruMQexecut
scrieD>LM@
sfrit pentru
sfrit pentru
sfrit subalgoritm

12.6.5. Puncte ya
Subproblemele n care descompunem aceast problem sunt:
1. citirea tabloului;
2. determinarea minimului pe o linie a tabloului;
3. determinarea maximului pe o coloan a tabloului;
4. determinarea maximului pe o linie a tabloului;
5. determinarea minimului pe o coloan a tabloului;
6. compararea rezultatelor obinute la punctul 2. i 3;
7. compararea rezultatelor obinute la punctul 4. i 5.

Observm c trebuie s cutm un minim (sau un maxim) ntr-o linie (respectiv n-
tr-o coloan) din matrice. Aceast observaie ne sugereaz s ,transIormm tabloul
bidimensional, ntr-un ir de linii, Iolosindu-ne de declaraiile de tip i de variabile:

typeOLQLHarray>@of,QWHJHU
7LS7DEarray>@ofOLQLH
varW7LS7DE
VLUOLQLH

AstIel linia i din tabloul t se va putea transmite ca parametru de tip OLQLH subpro-
gramelor care determin minimul (respectiv maximul) din linia respectiv. Din pcate
nu putem proceda la Iel n cazul coloanelor dect dac le transIormm temporar, cu un
subprogram simplu, n ir de tip OLQLH:

Subalgoritm7UDQVIRUPPNWLU
transform coloana k ain tablou in ir ae tip linie }
pentruLPexecut coloanele au m elemente }
LU>L@W>LN@
sfrit pentru
sfrit subalgoritm
12. Tablouri biaimensionale 267

Funciile PD[QLUSR] i PLQQLUSR] determin valoarea maxim,
respectiv minim dintr-un ir, returnnd totodat i poziia unde s-a gsit maximul,
respectiv minimul.
n algoritm vom traversa tabloul linie dup linie. Pentru Iiecare linie i, vom deter-
mina minimul (minim) i poziia lui pe linie (po:min), apoi vom transIorma coloana de
indice po:min n ir i vom cuta maximul lui (maxim). Dac cele dou valori sunt
egale (minim maxim), aIim indicele liniei (i) i indicele coloanei (po:max). Proce-
dm la Iel, cutnd maximul pe linie i minimul pe coloana pe care am gsit maximul.

Algoritm3XQFWHBD
Citirea aatelor ae intrare (m, n, t)
JVLWfals
pentruLPexecut
PLQLPPLQQW>L@SR]PLQ
minimul pe linia i se afl pe coloana po:min }
WUDQVIRUPPSR]PLQWLU transformm coloana po:min in ir }
PD[LPPD[PLUSR]PD[ maximul ae pe coloana po:min }
dacPLQLPPD[LPatunci
scrieLSR]PD[
JVLWaaevrat
sfrit dac
PD[LPPD[QW>L@SR]PD[
maximul pe linia i se afl pe coloana po:max }
WUDQVIRUPPSR]PD[WLU transformm coloana po:max in ir }
PLQLPPLQPLUSR]PLQ minimul ae pe coloana po:max }
dacPD[LPPLQLPatunci
scrieLSR]PD[
JVLWaaevrat
sfrit dac
sfrit pentru
dac nu JVLWatunci
scrie1XH[LVWDSXQFWHVD
sfrit dac
sfrit algoritm

Variabila gsit primete valoarea aaevrat dac am gsit un punct a. A Iost nevoie
de reinerea Iaptului c am reuit s determinm un rezultat pentru a scrie mesajul soli-
citat n cazul n care nu exist punct a n tablou.



268 12. Tablouri biaimensionale

12.6.6. Rame de suprapus
Algoritmul urmtor traseaz ramele pe rnd cu literele mari ale alIabetului englez,
ncepnd cu litera $ i le depune ntr-un tablou bidimensional de caractere. Tabloul
va Ii n prealabil iniializat cu caracterul spaiu ( ).
n implementarea propus desenm prima ram n spaiul de depozitare, apoi n
acelai tablou desenm a doua ram. Nu este nevoie de veriIicri, caracterul c curent
Iie suprascrie un caracter spaiu, Iie un caracter aparinnd unei rame aezate deja.

Subalgoritm5DPHBGHBVXSUDSXV
F$
pentruNSexecut
citete\[ inaicele ae linie i ae coloan a colului stanga-sus }
citete/\/[ lungimile laturilor ramei curente }
\\/\ inaicele ae linie a colului areapta-fos }
[[/[ inaicele ae coloan a colului areapta-fos }
dac[sQi\sPatunci
pentruL\\execut aesenm rama }
D>L[@F verticala ain stanga }
D>L[@F verticala ain areapta }
sfrit pentru
pentruM[[execut
D>\M@F ori:ontala ae sus }
D>\M@F ori:ontala ae fos }
sfrit pentru
sfrit dac
caracterul cu care se va trasa urmtoarea ram }
Fsuccesorul caracterului F
sfrit pentru
sfrit subalgoritm

12.6.7. Rame suprapuse
Problema este descompus n subprobleme, dup cum urmeaz:
- Citirea datelor de intrare (dimensiunile spaiului de depozitare i tabloul de
caractere;
- Determinarea coordonatelor colurilor ramelor;
- Determinarea poziiilor relative a ramelor (suprapunerile);
- AIiarea caracterelor cu care s-au desenat ramele, n ordinea n care acestea se pot
ridica.

Notm cu minx
i
, miny
i
, maxx
i
, maxy
i
coordonatele colului stnga-sus i a celui din
dreapta-jos a celei de a i-a rame. Aceste valori se pot iniializa cu coordonatele spaiu-
lui de depozitare, deoarece sigur vom gsi cel puin o ram mai mic dect spaiul.
12. Tablouri biaimensionale 269

Subalgoritm'LPHQVLXQLPQPLQ[PLQ\PD[[PD[\
pentruF$=execut
PLQ[>F@Q iniiali:area cooraonatelor colurilor }
PLQ\>F@P
PD[[>F@
PD[\>F@
sfrit pentru
pentruLPexecut aeterminarea cooraonatelor colurilor }
pentruMQexecut
aeterminm cooraonatele colurilor ramei ain care face parte po:iia curent }
FD>LM@
dacPLQ[>F@!Matunci
PLQ[>F@M
sfrit dac
dacPLQ\>F@!Latunci
PLQ\>F@L
sfrit dac
dacPD[[>F@Matunci
PD[[>F@M
sfrit dac
dacPD[\>F@Latunci
PD[\>F@L
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

Pentru a determina poziiile relative ale ramelor, vom construi un tablou de cons-
tante logice peste, n care valoarea elementului peste
xy
va Ii aaevrat dac rama dese-
nat cu caracterul y este deasupra ramei desenate cu caracterul x. Acest tablou se inii-
alizeaz cu fals pentru toate ramele (toate caracterele cu care este posibil desenarea
unei rame). Vom realiza cutri pentru Iiecare caracter posibil ntre limitele dimensiu-
nilor ramei desenate cu caracterul curent. Cutrile trebuie eIectuate n ambele direcii
(orizontal i vertical).

Subalgoritm 3R]LLLB5HODWLYHSHVWHPLQ[PLQ\PD[\PD[\
pentruF$=execut
pentruFK$=execut
SHVWH>FFK@fals aeocamaat nu am aescoperit nici o suprapunere }
sfrit pentru
sfrit pentru
pentruF$=execut aeterminm suprapunerile }
pentruLPLQ\>F@PD[\>F@execut rama aesenat cu caracterul c }
FKD>LPLQ[>F@@ caracter ain aesenul ramei aesenate cu c }
270 12. Tablouri biaimensionale

dacFK=Fatunci aac intalnim ch in aesenul ramei aesenate cu c }
rama aesenat cu ch este aeasupra ramei aesenate cu c }
SHVWH>FFK@aaevrat
sfrit dac
FKD>LPD[[>F@@
dacFK=Fatunci
SHVWH>FFK@aaevrat
sfrit dac
sfrit pentru
pentruMPLQ[>F@PD[[>F@execut
FKD>PLQ\>F@M@
dacFK=Fatunci
SHVWH>FFK@aaevrat
sfrit dac
FKD>PD[\>F@M@
dacFK=Fatunci
SHVWH>FFK@aaevrat
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

AIiarea n aceast problem necesit cteva veriIicri n plus. De asemenea, va


trebui s inem evidena ramelor aIiate deja (n irul ae afiat, avnd valori booleene),
pentru a evita aIiarea lor repetat. Acest ir se iniializeaz cu fals. Dac o ram nu
are nici una deasupra ei, poate Ii ridicat i, deci, aIiat. Vom continua aIirile ct
timp mai exist ram neaIiat. Dup aIiarea ramei desenate cu caracterul y, ridicarea
ei va nsemna modiIicarea valorii lui peste
xy
, care va deveni fals.

Subalgoritm$ILDUHSHVWHPLQ[PLQ\PD[[PD[\
pentruF$=execut
aac PD[[!, inseamn c exist ram aesenat cu c }
dacPD[[>F@!atunci
GHDILDW>F@aaevrat aeci trebuie afiat }
altfel
GHDILDW>F@false
sfrit dac
sfrit pentru
DYHPGHDILDWaaevrat
ct timpDYHPGHDILDWexecut cat timp avem rame ae afiat, le afim }
DYHPGHDILDWfals

12. Tablouri biaimensionale 271



pentruF$=execut
dacGHDILDW>F@atunci
RNaaevrat
FK$
ct timpRNiFKs=execut
verificm aac rama aesenat cu c poate fi riaicat }
dacSHVWH>FFK@atunci
RNfals
sfrit dac
FK succesorul lui FK
sfrit ct timp
dacRNatunci aac aa, o afim i o riaicm }
scrieF
pentruFK$=execut
SHVWH>FKF@fals
sfrit dac
GHDILDW>F@fals nu mai trebuie afiat }
DYHPGHDILDWaaevrat
sfrit dac
sfrit dac
sfrit pentru
sfrit ct timp
sfrit subalgoritm

12.6.8. Prelucrare imagine
ntruct cerinele acestei probleme sunt Iormulate pe subpuncte separate, se descriu n
continuare algoritmi separai pentru Iiecare transIormare n parte. Am notat cu a tablo-
ul bidimensional ptratic coninnd imaginea, iar cu m dimensiunea acestuia.

A. Inversarea valorilor 0 cu valori 1 yi viceversa
n mod normal, inversarea valorilor se Iace parcurgnd tabloul, iar dac elementul are
valoarea 0 aceasta se schimb n 1 i invers:
dac D>LM@atunciD>LM@
altfelD>LM@
Aceast schimbare de valoare se poate exprima sintetic aplicnd operatorii pe bii
astIel: D>LM@D>LM@xor . Exprimrile sunt echivalente deoarece:
xor i xor .

n aceste condiii, pseudocodul algoritmului de inversare este urmtorul:



272 12. Tablouri biaimensionale

Subalgoritm,QYHUVPD
pentruLPexecut:
pentruMPexecut:
D>LM@D>LM@xor
sfrit pentru
sfrit pentru
sfrit subalgoritm

B. Rotirea tabloului cu 90
0
n sensul acelor de ceasornic
Pentru a roti toate elementele tabloului trebuie s lum pe rnd Iiecare element i s-l
aezm ntr-un alt tablou bidimensional pe poziia potrivit. Dezavantajul acestei
variante de algoritm este consumul excesiv de spaiu de memorie. Se prezint n
continuare o variant mai economicoas care se bazeaz pe rotirea succesiv a celor
patru puncte.

a
if

1
2
3
4

Dac pentru un element se aranjeaz patru
elemente la locul lor (Iolosind o variabil auxili-
ar), nseamn c trebuie repetat aceast opera-
ie doar pentru o ptrime din elementele tablou-
lui. Se parcurge, de exemplu, numai triunghiul
superior dintre diagonale, inclusiv diagonala
principal. Elementul a
if
se salveaz n variabila
auxiliar dup care se eIectueaz cele trei atri-
buiri evideniate pe Iigur.

Exemple
a
11
a
12
a
13
a
14
m 5: a
11
a
12
a
13
a
14
a
15

a
21
a
22
a
23
a
24
a
21
a
22
a
23
a
24
a
25

a
31
a
32
a
33
a
34
a
31
a
32
a
33
a
34
a
35

a
41
a
42
a
43
a
44
a
41
a
42
a
43
a
44
a
45

m 4:
a
51
a
52
a
53
a
54
a
55


- m 4: a
21
se va nlocui cu a
42
care se va nlocui cu a
34
care se va nlocui cu a
13
.
- m 5: a
21
se va nlocui cu a
52
care se va nlocui cu a
45
care se va nlocui cu a
14
.

n concluzie, indicele de linie devine indice de coloan, iar indicele de coloan ne
ajut la calcularea noului indice de linie: m fostul inaice coloan 1.

n ceea ce privete parcurgerea triunghiului dintre diagonalele tabloului (Ir ele-
mentele de pe diagonala secundar): indicele de linie variaz ntre prima linie i linia
de mijloc (sau deasupra mijlocului atunci cnd dimensiunea tabloului este par), iar
indicele de coloan pornete de la elementul de pe diagonala principal i i crete pn
la m i.
12. Tablouri biaimensionale 273

a
11
a
12
a
13
a
14
m 5: a
11
a
12
a
13
a
14
a
15

a
21
a
22
a
23
a
24
a
21
a
22
a
23
a
24
a
25

a
31
a
32
a
33
a
34
a
31
a
32
a
33
a
34
a
35

a
41
a
42
a
43
a
44
a
41
a
42
a
43
a
44
a
45

m 4:
a
51
a
52
a
53
a
54
a
55


Prezentm n continuare pseudocodul corespunztor algoritmului descris.

Subalgoritm5RWHWHPD
pentruL>P@UHVW>P@execut:
pentruML0Lexecut: pentru o ptrime ain elementele tabloului }
LL
MM
DX[D>LM@ se pstrea: elementul ae pornire }
pentruNexecut:
LPM se iniiali:ea: inaicii ae unae se ia valoarea }
ML
D>LM@D>LM@ mutare }
LL se iniiali:ea: inaicii unae se va pune valoarea }
MM la urmtoarea iteraie }
sfrit pentru
D>LM@DX[
sfrit pentru
sfrit pentru
sfrit subalgoritm

C. Dublarea imaginii (Zoom)
Pentru a extinde tabloul pe un tablou de dou ori mai mare se vor construi n noul
tablou cte patru elemente cu acea valoare, aezate n Iorma unei matrice ptratice de
dimensiune 2.
De exemplu, un element avnd valoarea 1 n matricea iniial se nlocuiete cu:


Ne propunem n continuare s determinm modalitatea n care se obin indicii ele-
mentelor matricei mrite din matricea iniial.

inaici ae linie.
inaici ae linie.
inaici ae
coloan.

inaici ae
coloan.

Elementului a
11
i corespund elementele a
11
, a
12
, a
21
, a
22
. Elementului a
12
i cores-
pund elementele a
13
, a
14
, a
23
, a
24
. Generaliznd cele observate, elementului a
if
i cores-
pund elementele a
2i 1, 2f 1
, a
2i 1, 2f
, a
2i, 2f 1
, a
2i, 2f
.
274 12. Tablouri biaimensionale

Subalgoritm=RRPPD
pentruLPexecut:
pentruM,Pexecut:
E>LM@D>LM@ b tablou auxiliar }
E>LM@D>LM@
E>LM@D>LM@
E>LM@>LM@
sfrit pentru
sfrit pentru
PP
DE atribuire la nivel ae tablou, suprascriem vechiul a cu b }
sfrit subalgoritm

n algoritmul care va apela subalgoritmii prezentai am notat cu transformare ca-
racterul care conine codul transIormrii curente.

Algoritm3UHOXFUDUH
... se citesc aimensiunea i elementele tabloului aat }
ct timpnu s-a afuns la sfaritul fiierului execut:
citete WUDQVIRUPDUH
dac WUDQVIRUPDUH,atunci
,QYHUVPD
altfel
dac WUDQVIRUPDUH5atunci
5RWHWHPD
altfel
dac WUDQVIRUPDUH=atunci
=RRPPD
sfrit dac
sfrit dac
sfrit dac
sfrit ct timp
... se afiea: tabloul biaimensional obinut }
sfrit algoritm

12.6.9. Careu Magic
Algoritmul de rezolvare a acestei probleme ncepe prin a testa dimensiunea careului de
generat. n Iuncie de proprietatea pe care acest numr o are: impar, par multiplu de 4
sau par Ir a Ii multiplu de 4, aplicm algoritmul prezentat la teorie.
S urmrim descrierea implementrilor pentru Iiecare dintre cei trei algoritmi.

a. Drumul mpratului Jen sau generarea ptratelor magice de ordin impar
Descriem n continuare o variant de generare a unui ptrat magic de ordin impar care
respect drumul mpratului Jen. Careul magic l generm n tabloul a. Algoritmul
12. Tablouri biaimensionale 275

atribuie pe rnd valorile cuprinse n intervalul |1, n
2
| variabilei nr, urmnd ca aceast
valoare s se atribuie elementelor careului pe baza regulilor precizate.

Subalgoritm9HQ
\Q
[>Q@
QU
pentruLQexecut
D>\[@QU
pentruMQexecut
dac[atunci
[Q
altfel
[[
sfrit dac
dac\atunci
\Q
altfel
\\
sfrit dac
QUQU
D>\[@QU
sfrit pentru
dac\Qatunci
\
altfel
\\
sfrit dac
QUQU
sfrit pentru
sfrit subalgoritm

b. Careul magic de dimensiune par (n 4 m)
Pentru a genera careul magic de dimensiune par, pornim de la matricea de ordin n
Iormat cu numerele 1, 2, ., n
2
aezate n ordine pe linii.
Din descrierea algoritmului se desprinde c elementele aIlate pe linii avnd numr
de ordine pentru care restul mpririi la 4 este 0 sau 1 i coloane care nu au aceast
proprietate sau pe coloane avnd numr de ordine pentru care restul mpririi la 4 este
0 sau 1 i linii care nu au aceast proprietate trebuie schimbate cu elementele aIlate n
poziii simetrice Ia de mijlocul careului. Aceast proprietate privind poziia elemen-
tului o vom exprima Iolosind operatorul logic xor. Schimbarea cu elementul simetric
se asigur Iolosind valoarea variabilei nn.
276 12. Tablouri biaimensionale

Subalgoritm0DJLF0
QU
QQQQ
pentruLQexecut
pentruMQexecut
dacUHVW>L@sxorUHVW>M@satunci
D>LM@QQQU
altfel
D>LM@QU
sfrit dac
QUQU
sfrit pentru
sfrit pentru
sfrit subalgoritm

c. Ptrat magic de ordin n, unde n 2 m yi m este numr impar


S urmrim paii algoritmului de generare a unui ptrat magic de ordin n, unde n 2 m
i m este numr impar. Trebuie s mprim careul n careuri mici de dimensiune 2 2,
asupra crora decidem n ce Iorm se vor completa. Aceast Iorm se stabilete n
subalgoritmul )RUPD[\QU, apelat de subalgoritmul urmtor:

Subalgoritm&DUHX0DJLF0
Q>Q@
\
[>Q@
QU
pentruLQexecut
)RUPD[\QU
pentruMQexecut
dac[atunci
[Q
altfel
[[
sfrit dac
dac\atunci
\Q
altfel
\\
sfrit dac
)RUPD[\QU
sfrit pentru
dac\Qatunci
\
12. Tablouri biaimensionale 277

altfel
\\
sfrit dac
sfrit pentru
QQ
sfrit subalgoritm

Subalgoritm)RUPD[\QU
dac\!>Q@atunci
)RUPD;[\QU ^;;;;;`
altfel
dac\>Q@atunci ^88/88`
dac[>Q@atunci
)RUPD/[\QU
altfel
)RUPD8[\QU
sfrit dac
altfel
dac\>Q@atunci ^//8//`
dac[>Q@atunci
)RUPD8[\QU
altfel
)RUPD/[\QU
sfrit dac
altfel
)RUPD/[\QU ^/////`
sfrit dac
sfrit dac
sfrit dac
QUQU
sfrit subalgoritm

Subalgoritm)RUPD/[\QU
D>\[@QU
D>\[@QU
D>\[@QU
D>\[@QU
sfrit subalgoritm

Subalgoritm)RUPD8[\QU
D>\[@QU
D>\[@QU
D>\[@QU
D>\[@QU
sfrit subalgoritm
278 12. Tablouri biaimensionale

Subalgoritm)RUPD;[\QU
D>\[@QU
D>\[@QU
D>\[@QU
D>\[@QU
sfrit subalgoritm




Tablouri
multidimensionale

Aplicaii cu tablouri tridimensionale
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
13

Am vzut c ntr-un tablou unidimensional se pot pstra mediile generale ale elevilor
unei clase (MeaGen), nota unui elev Iiind reIerit prin construcia MeaGen|nr|, unde
nr este numrul de ordine din catalog al elevului respectiv.
MeaGen
numere ae oraine 1 2 30
meaii 9.33 8.20 . 9.63

Mediile pe discipline ale Iiecrui elev se pot pstra ntr-un tablou bidimensional.

indici de coloan 1 (Limba rom.) 2 (Matem.) ... 12 (Educ. Iizic
1 Albu 7.33 9.20 ... 10
2 Ban 6.67 7.33 ... 10
... ... ... ... ... ...
i
n
d
i
c
i

d
e

l
i
n
i
e

30 Zeciu 9.10 ... ... 10

Mediile la Iiecare disciplin pe toi cei patru ani de liceu pentru toi absolvenii
unei clase se vor codiIica ntr-un tablou multidimensional, astIel:
indice k An de studiu: 4
An de studiu: 3
An de studiu: 2
An de studiu: 1 inaice f
Lb. rom. Matem. . Ed. Iiz. meaie
inaice i

Albu 1 7.33 9.20 . 10
Ban 2 6.66 7.33 . 10
. . . . .
Zeciu 30 9.10 8.33 . 10

i
k
f

280 13. Tablouri triaimensionale

Vom numi acest tablou registru. Un tablou tridimensional se reprezint n spaiu
printr-un paralelipiped dreptunghic, accesul la un element al su necesitnd precizarea
valorilor a trei indici (cte unul pentru Iiecare dimensiune).
n tabloul prezentat ca exemplu, valoarea unui element este o medie i este locali-
zat cu trei indici:
- primul indic elevul (numr de ordine din catalog);
- al doilea indice precizeaz materia de nvmnt la care a Iost obinut aceast
medie (numrul de ordine al disciplinei);
- al treilea indice corespunde anului de studiu n care elevul a obinut acea medie
la disciplina precizat.

De exemplu, registru|2,1,3| reprezint media obinut de elevul Ban la Limba i
literatura romn n cel de-al treilea an de liceu.
n mod similar se pot imagina situaii a cror reprezentare se preteaz la structuri
cu 4, 5 sau mai multe dimensiuni. Generaliznd, putem spune c ntr-un tablou n-di-
mensional un element se regsete preciznd numele tabloului precum i valorile celor
n indici.

13.1. Aplicaii cu tablouri tridimensionale

13.1.1. Parcurgerea unei fee a unui tablou tridimensional
Considerm problema n care trebuie s calculm suma elementelor din tabloul tridi-
mensional de dimensiuni m, n, p, aIlate pe Iaa inIerioar a paralelipipedului corespun-
ztor tabloului. Elementele care Iac parte din zona menionat au valoarea celui de-al
treilea indice k 1. Subalgoritmul care descrie calculul acestei sume este:

Subalgoritm6XPDB)DDPQ
6XPD
pentruLPexecut:
pentruMQexecut:
6XPD6XPDD>LM@
sfrit pentru
sfrit pentru
sfrit subalgoritm

13.1.2. Parcurgerea unei seciuni
Vom prezenta modalitatea n care se aIieaz elementele tabloului tridimensional a de
dimensiuni m m m, aIlate n tabloul bidimensional mrginit de elementele de Ior-
ma a|1,1,k| i elementele de Iorma a|m,m,k| (supraIaa Iormat din toate diagonalele
principale ale tablourilor bidimensionale de coordonate i, f).
13. Tablouri triaimensionale 281


k
f
i

Acest tablou bidimensional se va aIia pe linii, de sus n jos.

Subalgoritm 6HFLXQHDPQ
pentruNPexecut:
pentruLPexecut:
scrieD>LLN@
sfrit pentru
sfrit pentru
sfrit subalgoritm

13.1.3. Parcurgerea tabloului tridimensional pornind de la
feele exterioare spre interior
Vom genera un tablou tridimensional cubic de dimensiune n, astIel nct pe Ieele ex-
terioare s conin numai valori 1, cu o poziie mai n interior s conin numai valori
2 i aa mai departe. La Iiecare nivel, odat cu Iiecare element al unei Iee se vor inii-
aliza i celelalte cinci elemente corespunztoare celorlalte Iee ale cubului. Se determi-
n mai nti numrul nivelurilor de adncime pentru care trebuie generate Iee.

Exemplu
n 4: n 5:
1 2 3 4 1 2 3 4 5
1 1
2 2
3 3
4 4
5

Se observ c pentru n 4 numrul de niveluri este 2 (|n/2|). Atunci cnd numrul
n este impar, numrul de niveluri de parcurs este |n/2| 1 (pentru n 5 este 3). Pentru
a uniIica ambele situaii ntr-o singur Iormul vom parcurge |n/2| rest|n/2| niveluri.

Subalgoritm *HQHUDUHDQQLYHO
pentru LQLYHOQQLYHOexecut:
pentru MQLYHOQQLYHOexecut:
D>QLYHOLM@QLYHO
D>LMQLYHO@QLYHO
D>LQLYHOM@QLYHO
D>QQLYHOLM@QLYHO
D>LMQQLYHO@QLYHO
D>LQQLYHOM@QLYHO
sfrit pentru
sfrit pentru
sfrit subalgoritm
282 13. Tablouri triaimensionale

Algoritm *HQHUDUHBWDEORXBWULGLPHQVLRQDO
citete Q
pentru QLYHO>Q@UHVW>Q@execut:
*HQHUDUHDQN
sfrit pentru
sfrit algoritm

13.1.4. Adunarea a dou tablouri tridimensionale
Adunarea a dou tablouri tridimensionale se Iace similar adunrii a dou tablouri bidi-
mensionale. Singurul element de noutate este apariia unei dimensiuni n plus.
Dac a i b sunt dou tablouri tridimensionale de dimensiuni m, n i p, suma a b
se calculeaz astIel:

Subalgoritm $GXQDEF
pentruLPexecut:
pentruMQexecut:
pentruNSexecut:
F>LMN@ D>LMN@E>LMN@
sfrit pentru
sfrit pentru
sfrit pentru
sfrit algoritm

13.1.5. Afiyarea elementelor unui tablou tridimensional


AIiarea elementelor unui astIel de tablou poate Ii Icut pe Ielii. Un exemplu de ast-
Iel de aIiare este dat de urmtorul subalgoritm:
Subalgoritm $ILDUHDQ
pentru LQexecut:
pentru MQexecut:
pentru NQ execut:
scrie D>LMN@
sfrit pentru
sfrit pentru
sfrit pentru
sfrit subalgoritm
Structura de date de tip tablou are numeroase aplicaii n practic, dar majoritatea
metodelor larg utilizate se concentreaz pe tablouri uni i bidimensionale. n anumite
situaii metoda programrii dinamice
*)
necesit tablouri auxiliare tridimensionale pen-
tru a pstra inIormaii utile n construirea rezultatului.

*)
Metoda programrii dinamice se va nva n clasa a X-a.
13. Tablouri triaimensionale 283

13.2. Implementri sugerate
Pentru a v Iamiliariza cu modul de lucru cu tablouri de dimensiuni mai mari dect
doi, v propunem s realizai implementarea exerciiilor:
1. suma elementelor unui tablou n-dimensional;
2. identiIicarea coordonatelor unui element dat (toate apariiile) ntr-un tablou n-di-
mensional;
3. parcurgerea unui tablou tridimensional dinspre exterior nspre interior;
4. determinarea matricei dintr-un tablou tridimensional care are suma elementelor
maxim.

13.3. Probleme propuse

13.3.1. Populaie virusat
Se urmrete evoluia mbolnvirii unei populaii cu un virus, pe parcursul a p zile.
Iniial populaia este dat ntr-un tablou bidimensional. ReIeritor la vindecarea indivi-
zilor bolnavi sau mbolnvirea celor sntoi Iuncioneaz urmtoarele reguli:
- Un individ sntos avnd cel puin trei vecini inIestai n jur, se mbolnvete i el.
- Un individ bolnav nconjurat numai de bolnavi se mobilizeaz i se vindec.
- Orice individ bolnav pe durata a cel puin 30 de zile se nsntoete.
Prin vecini se neleg numai indivizii aIlai n imediata apropiere pe aceeai linie
sau pe aceeai coloan cu un anumit element considerat.
S se genereze tabloul tridimensional cuprinznd evoluia populaiei n cele p zile.
S se determine ziua sau zilele n care numrul indivizilor bolnavi a Iost maxim.
S se aIieze coordonatele indivizilor care au Iost bolnavi pe ntreaga perioad de p
zile.

Date de intrare
Pe prima linie a Iiierului VIRUS.IN se aIl dimensiunile tabloului bidimensional (m,
n) urmate de numrul de zile (p) pe care se eIectueaz studiul. Pe urmtoarele m linii
se aIl elementele tabloului iniial cuprinznd starea indivizilor n prima zi. Tabloul
conine valori 0 i 1, 0 avnd semniIicaia unui individ sntos, iar 1 nsemnnd un in-
divid atins de virus.

Date de ieyire
Pe prima linie a Iiierului VIRUS.OUT se vor scrie zilele n care numrul mbolnviri-
lor a Iost maxim. Pe urmtoarele linii se vor scrie perechi de numere naturale repre-
zentnd coordonatele acelor indivizi care au Iost bolnavi n toat perioada celor p zile.
Toate numerele scrise pe aceeai linie se vor separa prin cte un spaiu.

284 13. Tablouri triaimensionale

Restricii yi precizri
- 1 s m, n s 10;
- 1 s p s 50.

Exemplu
VIRUS.IN


VIRUS.OUT

Explicaie
Fiierul de ieire este vizualizat pe
dou coloane pe motiv de spaiu.


13.4. Soluiile problemelor propuse

13.4.1. Populaie virusat
n aceast aplicaie tabloul tridimensional este deIinit ca ir de tablouri bidimensionale
astIel nct Iiecrei zile s-i corespund cte un tablou bidimensional privind starea
sntii din ziua respectiv.
Algoritmul de rezolvare conine subalgoritmi pentru rezolvarea subproblemelor:

1. Construirea tabloului tridimensional, pornind de la tabloul bidimensional dat, pe
baza regulilor de transmitere a bolii sau de stopare a ei. Primul pas n abordarea aces-
tei subprobleme este citirea dimensiunilor tabloului tridimensional care se va construi
i a tabloului cu inIormaiile privind starea de sntate din prima zi.

Subalgoritm3ULPDB]LPQSD
citetePQS aimensiunile tabloului triaimensional }
pentruLQexecut
pentruMQexecut:
citeteD>LM@ citirea tabloului corespun:tor primei :ile }
sfrit pentru
sfrit pentru
sfrit subalgoritm

Generarea tabloului tridimensional se realizeaz construind tablourile bidimensio-


nale, corespunztoare zilei, pornind din situaia corespunztoare zilei precedente.




13. Tablouri triaimensionale 285

Subalgoritm*HQHUHD]DPQ pentru a ne putea referi i la vecinii unui }
element aflat pe margine, boram matricea iniial cu 0 }
pentruLPexecut
D>L@
D>LQ@
sfrit pentru
pentruMQexecut:
D>M@
D>PM@
sfrit pentru
generarea propriu-:is }
pentru]LSexecut pentru fiecare ]L }
pentruLPexecut
pentruMQexecut pentru fiecare element al matricei ain :iua ]L }
se numr vecinii virusai ain :iua preceaent }
QXPUD>]LLM@D>]LLM@D>]LLM@
D>]LLM@
a. aac nu era virusat, aar are cel puin trei vecini virusai se virusea: i el }
dacD>]LLM@atunci
dacQXPU>atunciD>]LLM@
altfelD>]LLM@
sfrit dac
b. aac era virusat i este inconfurat ain toate prile ae virui se insntoete }
altfel era virusat. D>]LLM@ }
dacQXPUatunci
D>]LLM@
altfel
D>]LLM@
sfrit dac
sfrit dac
c. aac era virusat ae 30 ae :ile, se insntoete }
dac]L>i D>]LLM@i
QXPUBGHB]LOHDLM]Latunci
D>]LLM@
sfrit dac
sfrit pentru
sfrit pentru
sfrit pentru
sfrit subalgoritm
Acest subalgoritm apeleaz un alt subalgoritm care, pornind de la ziua :i, calculea-
z de cte zile persoana identiIicat prin coordonatele i, f este bolnav. Prezentm n
continuare acest subalgoritm.
286 13. Tablouri triaimensionale

Subalgoritm1XPUBGHB]LOHDLM]L
returnea: numrul ae :ile ae boal continu ale persoanei ae pe po:iia i, f }
N]L
ct timp N!iD>NLM@execut
NN
sfrit ct timp
QXPUBGHB]LOH]LN
sfrit subalgoritm
2. Rezolvarea primei cerine din enun necesit construirea n prealabil a unui ir con-
innd numrul total de persoane virusate pe Iiecare zi. Aceasta se poate realiza ape-
lnd pentru Iiecare zi o Iuncie care nsumeaz cazurile de boal pe baza unui algoritm
care nsumeaz elementele unui tablou bidimensional.

Subalgoritm6XPDDPQ
6XP returnea: suma elementelor unui tablou biaimensional }
pentruLQexecut
pentruMQexecut
VXPVXPD>LM@
sfrit pentru
sfrit pentru
6XPDVXP
sfrit subalgoritm

Determinarea maximului din irul sumelor o realizm cu subalgoritmul cunoscut:

Subalgoritm0D[LPDQ
returnea: valoarea celui mai mare element aintr-un ir ae numere }
PD[D>@
pentruLQexecut
dacPD[D>L@atunci
PD[D>L@
sfrit dac
sfrit pentru
PD[LPPD[
sfrit subalgoritm

Dup ce numrul maxim de mbolnviri a Iost determinat, nu rmne dect s se
aIieze zilele n care aceast valoare maxim a Iost atins (vezi algoritmul principal).

3. Pentru a rezolva cel de-al doilea subpunct, trebuie s veriIicm pentru Iiecare indi-
vid dac a Iost continuu bolnav pe parcursul celor p zile. Aceast cerin este rezolvat
n algoritmul principal, n care am notat cu s irul sumelor de indivizi bolnavi, pe Iie-
care zi.
13. Tablouri triaimensionale 287

Algoritm9LUXV
3ULPDB]LDPQS
generarea tabloului triaimensional cuprin:ana evoluia virusrilor }
*HQHUHD]DPQ
1. se construiete irul numrului total ae inaivi:i virusai pentru fiecare :i }
pentru]LSexecut
V>]L@6XPDD>]L@PQ
sfrit pentru
se aetermin numrul maxim ae inaivi:i virusai }
QXPUBPD[LP0D[LP6S
se afiea: :ilele in care s-a atins graaul maxim ae virusare }
pentru]LSexecut
dacV>]L@QXPUBPD[LPatunci
scrie]L
sfrit dac
sfrit pentru
2. cutm persoane bolnave numai aac numrul p ae :ile este mai mic }
aecat numrul maxim ae :ile in care virusul triete }
dacSatunci
pentruLQexecut
pentruMQexecut
9LUXVDWaaevrat iniiali:are - marcm inaiviaul ca fiina virusat }
pentru]LSexecut
dacD>]LLM@atunci
9LUXVDWfals aac cel puin o :i nu a fost virusat, il aemarcm }
sfrit dac
dac9LUXVDWatunci
scrieLM
sfrit dac
sfrit pentru
sfrit pentru
sfrit pentru
sfrit dac
sfrit algoritm



Polinoame

Definirea noiunii de polinom
Forma algebric a polinoamelor
Reprezentarea polinoamelor n memoria calculatorului
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
14



14.1. Definirea noiunii de polinom
Fie mulimea irurilor (inIinite) de numere complexe f (a
0
, a
1
, a
2
, ..., a
n
, ...), care au
numai un numr Iinit de termeni nenuli, adic exist un numr natural m, astIel nct
a
i
0 pentru orice i ~ m.

Exemple
irul f (1, -2, 8, 0, ..., 0...) are trei termeni nenuli;
irul g (0, 1, -2, 0, ..., 0) are doi termeni nenuli.

Pe aceast mulime se deIinesc dou operaii algebrice:

1. Adunarea
f g (a
0
b
0
, a
1
b
1
,

a
2
b
2
, ...).

2. nmulirea
f g (c
0
, c
1
, c
2
, ...), unde
c
0
a
0
b
0
c
1
a
0
b
1
a
1
b
0

c
2
a
0
b
2
a
1
b
1
a
2
b
0
...
a
r
a
0
b
r
a
1
b
r 1
a
2
b
r 2
... a
r
b
0

Se observ c suma f g i produsul f g aparin aceleiai mulimi.

Definiie
Fiecare element al mulimii deIinite anterior pe care sunt deIinite cele dou opera-
ii, se numete polinom.
14. Polinoame 289

Dac f (a
0
, a
1
, a
2
, ..., a
n
,...) este un polinom, numerele a
0
, a
1
, a
2
, ...

se numesc coe-
ficienii lui f.

A. Proprieti ale adunrii polinoamelor
Fie f, g i h trei polinoame.
1. Aaunarea este comutativ. f g g f.
2. Aaunarea este asociativ. (f g) h f (g h).
3. Element neutru pentru adunarea polinoamelor este polinomul constant 0 (0, 0, ...).
Avem f 0 0 f f.
4. Orice polinom are un opus notat cu f, astIel nct f (f) (f) f 0.

B. Proprieti ale nmulirii polinoamelor
1. Inmulirea este comutativ. f g g f.
2. Inmulirea este asociativ. (f g) h f (g h).
3. Element neutru pentru nmulirea polinoamelor este polinomul constant 1 (1, 0, ...).
Avem f 1 1 f f.
4. Inmulirea este aistributiv fa ae aaunare. f (g h) f g f h i
Avem (f g) h f h g h.
5. Dac f i g sunt polinoame nenule, atunci produsul lor este un polinom nenul (f = 0
i g = 0 f g = 0).
6. Posibilitatea simplificrii cu un Iactor nenul: dac f, g i h sunt polinoame astIel
nct f g f h i f = 0, atunci g h.

14.2. Forma algebric a polinoamelor
Prin convenie, vom nota polinomul (0, 1, 0, 0,...) cu X i l vom citi neaeterminata X.
n urma nmulirii polinoamelor va rezulta:
X
2
X X (0,1,0,...) (0,1,0,0,...) (0,0,1,0,... )
X
3
X X
2
(0,1,0,...) (0,0,1,0,...) (0,0,0,1,0,...)
...
X
n
X X
n 1
(0,1,0,...) (0,0,...,0,1,0,...) (0,0,...,0,1,0,...)

n 1 n
...

Folosim nmulirea i adunarea pentru a scrie: f a
0
a
1
X a
2
X
2
... a
m
X
m
, unde
a
0
, a
1
, a
2
, ..., a
m
sunt coeIicienii polinomului f.

Polinoamele de Iorma aX
n
, unde a e C (mulimea numerelor complexe) i n este
un numr natural se numesc monoame.

290 14. Polinoame

n mulimea polinoamelor cu coeIicieni compleci se disting urmtoarele submul-
imi importante:
R|X| mulimea polinoamelor cu coeIicieni reali;
Q|X| mulimea polinoamelor cu coeIicieni raionali;
Z|X| mulimea polinoamelor cu coeIicieni ntregi.

14.3. Reprezentarea polinoamelor n memoria
calculatorului

14.3.1. Reprezentarea prin yirul coeficienilor
CoeIicienii unui polinom se vor pstra ntr-un tablou unidimensional n ordine cresc-
toare (sau descresctoare) dup puterea lui X. Numim graaul polinomului puterea cea
mai mare a lui X, pentru care coeIicientul este diIerit de 0. n concluzie, irul cores-
punztor coeIicienilor va avea cel puin attea elemente 1 (pentru termenul liber),
ct este gradul polinomului.
Acest mod de reprezentare are avantajul c n cazul a dou polinoame coeIicienii
acelorai puteri ale lui X sunt aezai n cei doi vectori pe poziii corespunztoare.

14.3.2. Exemplu de adunare yi scdere a dou polinoame
Fie P
1
(X) 4X
5
3X
4
X
2
8X 1
i P
2
(X) 3X
4
X
3
X
2
2X 1.
(P
1
P
2
)(X) 4X
5
3X
4
X
2
8X 1 3X
4
X
3
X
2
2X 1
4X
5
X
3
2X
2
6X.
(P
1
P
2
)(X) 4X
5
3X
4
X
2
8X 1 3X
4
X
3
X
2
2X 1
4X
5
6X
4
X
3
10X 2.

Reprezentnd polinoamele sub Iorm de tablouri unidimensionale n care am aezat
coeIicienii n ordine cresctoare dup puterile lui X, adunarea i scderea se eIectuea-
z astIel:
indice 0 1 2 3 4 5
P
1
1 8 1 0 3 4
P
2
1 2 1 1 3 0
P
1
P
2
0 6 2 1 0 4
P
1
P
2
2 10 0 1 6 4

14.3.3. Exemplu de nmulire a dou polinoame
Fie P
1
(X) 3X
2
X 1
i P
2
(X) X 2.
0 1 2 3
14. Polinoame 291


(3X
2
X 1) (X 2)
3X
3
X
2
X
6X
2
2X 2
3X
3
7X
2
3X 2
P
1
1 1 3
P
2
2 1
P
1
X 0 1 1 3
P
1
(2) 2 2 6
P
1
P
2
2 3 7 3


14.3.4. Valoarea unui polinom
Prin deIiniie numrul f() a
0
a
1
a
2

2

... a
n

n
se numete valoarea polinomu-
lui f n .

Exemplu
Valoarea polinomului P
1
(X) 3X
2
X 1 n punctul X 2 este:
P
1
(2) 3 2
2
2 1 3 4 2 1 12 2 1 11.

S-a demonstrat c cea mai rapid metod de a calcula valoarea unui polinom este
cea bazat pe schema lui Horner.
Polinomul P(X) se scrie sub Iorma:
P(X) (...(((a
n
x a
n 1
) x ... a
2
) x a
1
) x a
0

i se aplic un algoritm simplu n care x este argumentul pentru care se calculeaz
valoarea polinomului P de coeIicieni a
i
i grad n:

Subalgoritm+RUQHUQ[3
3D>Q@
pentruLQexecut
33[D>L@
sfrit subalgoritm

14.3.5. mprirea polinoamelor
Prezentm n continuare o serie de deIiniii i teoreme a cror cunoatere este necesar
n rezolvarea problemei propuse la sIritul acestui capitol
*)
.

A. Teorema mpririi cu rest
Fiind date dou polinoame oarecare cu coeIicienii compleci f i g, unde g = 0, atunci
exist dou polinoame cu coeIicieni de tip complex q i r, astIel nct f g q r, un-
de gradul polinomului r este mai mic dect gradul polinomului g.
Polinoamele q i r sunt unice dac satisIac aceast proprietate.

*)
Cei care simt nevoia unui studiu aproIundat pot consulta bibliograIie de specialitate (de
exemplu, manualul de matematic pentru clasa a X-a).
292 14. Polinoame

Exemplu
Fie P
1
(X) X
3
2X
2
6X 5
i P
2
(X) X
2
1.
( X
3
2X
2
6X 5) : (X
2
1) X 2
X
3
X
2X
2
7X 5
2X
2
2
7X 7
Observaie
Dac cele dou polinoame au coeIicieni numere ntregi i coeIicientul termenului
de grad maxim al mpritorului este 1 atunci ctul i restul sunt polinoame cu coeIi-
cieni ntregi.

Fie f i g dou polinoame. Spunem c polinomul g divide polinomul f (sau f este
divizibil prin g, sau g este un divizor al lui f, sau f este un multiplu al lui g) dac exist
un polinom h, astIel nct f g h.

Fie f un polinom nenul cu coeIicieni de tip complex. Un numr complex a este r-
dcin a polinomului f, dac f(a) 0.

Teorema lui Bzout:
Fie f = 0 un polinom nenul. Numrul a e C este rdcin a polinomului f dac i
numai dac X a l divide pe f.

Teorem
Fie f a
0
a
1
X a
2
X
2
... a
n
X
n
un polinom cu a
n
= 0, n > 1. Dac x
1
, x
2
, ..., x
n

sunt rdcinile lui f, atunci f a
n
(X x
1
) ( X x
2
) ... ( X x
n
) i, n plus, aceast
descompunere a lui f n Iactori liniari este unic.

Teorem
Restul mpririi unui polinom f = 0 prin binomul X a este egal cu valoarea f(a) a
polinomului f n a.

Schema lui Horner oIer un procedeu de aIlare a ctului i a restului mpririi po-
linomului f prin binomul X a. n cazul n care restul mpririi este 0, a este rdcin
a polinomului. Orice rdcin a polinomului este divizor al numrului a
0
/a
n
(din ultima
relaie a lui Jiete ).

n tabelul urmtor prezentm schema lui Horner pentru mprire:
Fie a
i
coeIicienii polinomului P. EIectum mprirea la monomul X v.
14. Polinoame 293


puterile nedeterminatei n n 1 n 2 1 0
coeIicieni a
n
a
n 1
a
n 2
... a
1
a
0

coeIicienii ctului a
n
a
n 1
vb
n 1
a
n 2
vb
n 2
... a
1
vb
1
a
0
vb
0

i notm b
n 1
b
n 2
b
n 3
... b
0
r

Acest tabel se completeaz astIel:
- n rndul doi al tabelului se scriu coeIicienii polinomului f ;
- urmtoarea linie a tabelului va conine coeIicienii b i se Iormeaz astIel:

b
n 1
primete valoarea a
n
;

pe celelalte coloane (de la n 1 la 0) elementele b


i
se calculeaz cu Iormula:

b
i
a
i 1
v b
i 1
- Dac a
0
vb
0
este 0, nseamn c v este rdcin a polinomului. Ctul mpririi
polinomului dat la acest monom (X v) este polinomul ai crui coeIicieni sunt co-
eIicienii b
i
nenuli (doar cu un grad mai mic), iar restul este a
0
vb
0
.

Exemplu
mprim polinomul 2X
4
5X
3
8X 1 la X 2:

puterea 4 3

2 1 0
coeIicieni
v
2 5 0 8 1
ctul b 2 2 5 2 2 1 0 2(1) 2 8 2(2) 12 1 2(12) 23
b
3
b
2
b
1
b
0
r

Ctul mpririi este 2X
3
X
2
2X 12, iar restul este 23.

Pentru a descompune un polinom cu coeIicieni ntregi sub Iorm de produs de bi-
noame se aplic schema lui Horner pentru Iiecare divizor posibil al lui a
0
/a
n
.

n cazul
n care acesta este rdcin a polinomului, se reine i se continu procedeul cu polino-
mul ct. n Iinal, pentru Iiecare rdcin determinat avem un monom. Dac restul es-
te un polinom nenul nseamn c acesta nu se poate descompune n produs de monoa-
me n mulimea numerelor ntregi.

Exemplu
S se descompun polinomul X
4
2X
3
3X
2
10X 8.

Se determin rdcinile ntregi posibile, deci divizorii lui 8: 1, 1, 2, 2, 4, 4, 8, 8.
Aplicm schema lui Horner pentru aceste valori. Pot exista rdcini multiple, adic
putem gsi o valoare pentru care polinomul s se divid la (x v)
k
, unde k ~ 1.

294 14. Polinoame

puterea v 4 3 2 1 0
coeIicieni 1 2 3 10 8
este rdcin 1 1 2 1 1 1 3 ( 1) 1 2 10 1 2 8 8 1 ( 8) 0
dar nu dubl 1 1 1 1 1 0 2 1 0 2 8 1 2 6
nu este rdcin 1 1 1 ( 1) 1 2 2 (1 ) (2) 4 8 (1) 4 12
este rdcin 2 1 1 2 1 1 2 2 1 4 8 2 4 0
nu este rdcin 2 1 1 2 1 3 4 2 3 10
2 1 1 2 1 1 4 (2) (1) 6
4 1 1 1 4 5 4 4 5 24
4 1 1 ( 4) 1 3 4 (4) (3) 16
8 1 1 8 1 9 4 8 9 76
8 1 1 8 1 7 4 ( 8) ( 7) 60

CoeIicienii polinomului ct sunt:

X
2
X
1
X
0

nu este rdcin
1 1 4

n concluzie X
4
2X
3
3X
2
10X 8 (X
2
X 4) (X 1) (X 2).

14.3.6. Reprezentarea polinoamelor prin monoamele sale
Dac un polinom are muli coeIicieni egali cu 0, reprezentarea prin irul coeIicienilor
nu mai este avantajoas. n acest caz, se preIer reprezentarea prin irul monoamelor.
De asemenea, dac aceste monoame nu sunt accesibile n ordinea cresctoare (sau des-
cresctoare) a puterii lui X, nu vor aprea probleme, deoarece n cazul Iiecrui monom
se precizeaz dou inIormaii: valoarea coeIicientului i gradul termenului. Reprezen-
tarea prin monoame, se poate realiza cu mai multe tipuri de structuri de date.
- cu dou iruri: unul pentru coeIicienii diIerii de 0 ai polinomului i unul pentru
gradele corespunztoare ale termenilor;
- cu un ir de articole
*)
;
- cu ajutorul unei liste liniare, alocat dinamic
**)
.


*)
Tipul record se va nva la sIritul clasei a 9-a
**)
Alocarea dinamic o vom nva n clasa a 10-a.
14. Polinoame 295

14.4. Implementri sugerate
Pentru a v Iamiliariza cu implementarea operaiilor cu polinoame v recomandm s
rezolvai urmtoarele exerciii prin care s realizai operaiile:
1. citirea unui polinom dat prin grad i coeIicieni;
2. citirea unui polinom dat prin monoame;
3. valoarea unui polinom pentru un argument dat;
4. adunarea a dou polinoame;
5. nmulirea a dou polinoame;
6. mprirea a dou polinoame;
7. determinarea acelui polinom dintre n polinoame care pentru un argument dat are
valoare maxim.

14.5. Probleme propuse

14.5.1. Operaii cu polinoame
n Iuncie de cerina precizat n Iiierul de intrare, se va eIectua una dintre urmtoare-
le operaii asupra unor polinoame cu coeIicieni ntregi:
- adunarea a dou polinoame;
- scderea a dou polinoame;
- nmulirea a dou polinoame;
- mprirea a dou polinoame;
- calcularea valorii unui polinom ntr-un punct (numr ntreg) dat;
- descompunerea unui polinom n produs de binoame.

Date de intrare
De pe prima linie a Iiierului de intrare POL.IN se citete un caracter care comunic
operaia care trebuie eIectuat. Caracterele posibile sunt:
- : se solicit adunarea a dou polinoame;
- : se solicit scderea celui de-al doilea polinom din primul;
- : se solicit produsul a dou polinoame;
- : se solicit ctul i restul dup ce primul polinom s-a mprit la al doilea;
- Y: se solicit calcularea valorii unui polinom ntr-un punct dat;
- G: se solicit descompunerea polinomului n binoame.

n cazul n care se dorete o operaie aritmetic, coeIicienii celor dou polinoame
se vor aIla pe liniile a doua i respectiv a treia a Iiierului.


296 14. Polinoame

Pentru calculul valorii unui polinom, valoarea numeric ntreag pentru care se ce-
re calcularea valorii polinomului se va citi de pe a doua linie a Iiierului, pe linia a tre-
ia aIlndu-se coeIicienii polinomului dat.
Dac opiunea este G, coeIicienii polinomului de descompus se aIl pe a doua
linie a Iiierului.
CoeIicienii polinoamelor se vor citi din Iiierul POL.IN n ordine cresctoare du-
p puterile nedeterminatei. (AstIel, avnd i coeIicienii nuli, gradul polinomului se
va determina pe baza numrului coeIicienilor).

Date de ieyire
n Iiierul POL.OUT se va scrie, n Iuncie de operaia solicitat:
- pentru operaiile , i se va aIia polinomul rezultat n urma eIecturii
operaiei respective;
- n urma operaiei de mprire (/) vor rezulta dou polinoame (ctul i restul); coeIi-
cienii acestor polinoame se vor scrie pe prima (ctul) i respectiv a doua linie a Ii-
ierului rezultat (restul);
- valoarea unui polinom cu coeIicieni ntregi ntr-un punct dat (numr ntreg) este
un numr ntreg care va Ii scris n Iiierul de ieire;
- n urma descompunerii unui polinom ca produs de binoame rezult o expresie de
Iorma (polinom
1
)(polinom
2
)...(polinom
k
).

Polinoamele se vor aIia n Iorm algebric, n ordinea descresctoare a gradelor
termenilor. Puterile lui X se vor aIia sub Iorma:
XAputere (dac putere ~ 1);
X
1
se va aIia X;
X
0
nu se va aIia (apare doar coeIicientul);
termenii ai cror coeIicieni sunt 0 nu se vor scrie, excepie Icnd polinomul nul.

Restricii yi precizri
- toate polinoamele au coeIicieni ntregi;
- datele de intrare sunt corecte i conIorme cu descrierea din enun;
- coeIicientul termenului de grad maxim a polinomului mpritor n cazul operaiei
este 1.

Exemple
POL.IN


POL.OUT
;A;A;

14. Polinoame 297

POL.IN


POL.OUT
;A;A;

POL.IN


POL.OUT
;A;A;A;A;

POL.IN

POL.OUT
;


POL.IN
Y

POL.OUT


POL.IN
G

POL.OUT
;A;;;

14.6. Soluiile problemelor propuse

14.6.1. Operaii cu polinoame
Complexitatea acestei aplicaii oblig la utilizarea subprogramelor, unele dintre ele Ii-
ind necesare n cazul realizrii mai multor operaii. Din subprogramele care prelucrea-
z polinoamele am construit un unit. n acest unit am deIinit tipul SROLQRP i subpro-
gramele care realizeaz operaiile de care vom avea nevoie. Unele subprograme sunt
apelate doar de subprograme i ,nu se vd din programul utilizator al unit-ului.
InterIaa acestui unit:

interface

typeSROLQRParray>@of,QWHJHU

function9DOSSSROLQRPJUDGS%\WH[,QWHJHU,QWHJHU
calculea: valoarea polinomului p intr-un punct aat x cu schema lui Horner }

procedureFLWHVWHvarSROSROLQRPvarJUDGS%\WHvarI7H[W
returnea: polinomul citit ain fiier i graaul lui }
298 14. Polinoame

procedure$ILVHD]DSSROLQRPJUDGS%\WHvarJ7H[W
afiea: un polinom in forma sa algebric }

procedure&RPSOHWHD]DvarSSROLQRPJ%\WHvarJUDG%\WH
completea: polinomul p cu 0-uri pan la noul graa }

procedure,QLWLDOL]HD]DvarSSROLQRPJ%\WH
iniiali:ea: coeficienii polinomului p ae graa g cu 0-uri }

procedure2ULB;varSSROLQRPvarJ%\WH
inmulete polinomul p cu X }

procedure,QPXOWHVWHBFXBVFDODUvarSSROLQRPJ%\WH
FRQVWDQWD,QWHJHU
returnea: polinomul re:ultat ain inmulirea lui cu o constant }

procedure$GXQDSSSROLQRPJJ%\WHvarSSROLQRP
varJ%\WH
aaunarea a aou polinoame (p1 i p2 ae graa g1 respectiv g2) }

procedure6FDGHSSSROLQRPJJ%\WHvarSSROLQRP
varJ%\WH
efectuea: scaerea a aou polinoame (p1 i p2 ae graa g1 respectiv g2) }

procedure,QPXOWHVWHSSSROLQRPJJ%\WHvarSSROLQRP
varJ%\WH
returnea: polinomul re:ultat ain inmulirea a aou polinoame }

procedure,PSDUWHSSSROLQRPJJ%\WH
varSFDWSUHVWSROLQRPvarJFDWJUHVW%\WH
returnea: polinomul cat i rest re:ultate ain imprirea a aou polinoame }

procedure'HVFRPSXQHSSROLQRPJ%\WHvarJ7H[W
aescompune polinomul in proaus ae binoame }

Subalgoritmul &LWHWH citete de pe linia curent a Iiierului de intrare coeIicien-
ii unui polinom i determin gradul acestuia (n Iuncie de numrul de coeIicieni).

Subalgoritm&LWHWHSROJUDGS
JUDGS
ct timp nu urmea: marca ae sfarit ae linie execut
citeteSRO>JUDGS@
JUDGSJUDGS
sfrit ct timp
JUDGSJUDGS
sfrit subalgoritm
14. Polinoame 299

n subalgoritmul care aIieaz un polinom sub Iorm algebric i conIorm cerine-
lor enunate s-au separat urmtoarele situaii:
- dac polinomul are grad 0, se aIieaz termenul liber;
- dac polinomul are grad mai mare dect 0:
se aIieaz primul termen (de grad maxim);
se aIieaz termenii de grad JUDGS, ..., ;
se aIieaz termenul liber.

De asemenea:
- n Iaa coeIicienilor pozitivi vom scrie (avem de aIiat o sum de monoame),
pe cnd n Iaa celor negativi semnul se aIieaz implicit (nu este cazul s se
adauge nimic);
- dac coeIicientul este 0, termenul respectiv nu se aIieaz.

Subalgoritm$ILHD]BSROLQRPSJUDGS
dacJUDGSatunci scrieS>JUDGS@ avem numai termen liber }
altfel
dacS>JUDGS@atunci scrie termen ae tipul ,[` }
altfel
dacS>JUDGS@=atunci termen ae tipul ,&RHI[` }
scrieS>JUDGS@
sfrit dac
dacJUDGS!atunci termen ae tipul ,[AN` }
scrie;AJUDGS
altfelscrie; termen ae tipul ,[` }
sfrit dac
pentruLJUDGSexecut
dacS>L@=atunci aac termenul are coeficient nenul }
dacS>L@atunciscrie
altfel
dacS>L@atunci scrie
altfel
dacS>L@!atunciscrieS>L@
altfelscrieS>L@
sfrit dac
sfrit dac
sfrit dac
dacL!atunciscrie;AL
altfelscrie;
sfrit dac
sfrit dac
sfrit pentru
300 14. Polinoame

dacS>@!atunci
scrieS>@ afiarea termenului liber }
sfrit dac
dacS>@atunci
scrieS>@
sfrit dac
sfrit subalgoritm

Urmeaz acum prezentarea subalgoritmilor care corespund opiunilor posibile din
Iiierul de intrare.

Opiunea 'v'
Subalgoritm9DOSSJUDGS[
calculea: valoarea polinomului p intr-un punct aat x cu schema lui Horner }
Y
pentruLJUDGSexecut
YY[S>L@
sfrit pentru
9DOSY
sfrit subalgoritm

Opiunea '+'
n vederea adunrii a dou polinoame (p
1
de grad g
1
i p
2
de grad g
2
), acestea mai
nti se aduc la aceeai lungime (a celui de grad maxim JUDG) cu subalgoritmul &RP
SOHWHD]SJJUDG. Acest lucru nseamn adugare de 0-uri pn la lungimea
mai mare (coeIicieni de rang mai mare), deoarece irul coeIicienilor este ordonat
cresctor dup puterile lui X. n continuare adunarea const ntr-o simpl adunare a i-
rurilor coeIicienilor.

Subalgoritm&RPSOHWHD]SJJUDG
completea: polinomul p cu 0-uri pan la noul graa }
pentruLJJUDGexecut
S>L@
sfrit subalgoritm

Subalgoritm$GXQSSJJSJ
se completea: cu 0-uri polinomul mai scurt pan la lungimea celuilalt }
i se aetermin graaul re:ultatului }
dacJ!Jatunci
JJ
&RPSOHWHD]SJJ
altfel
JJ
14. Polinoame 301

&RPSOHWHD]SJJ
sfrit dac
pentruLJexecut
S>L@S>L@S>L@ se aaun termen cu termen }
aac in urma aaunrii celor aou polinoame s-a reaus graaul }
polinomului re:ultat, se moaific graaul polinomului sum }
ct timpJ!iS>J@execut
JJ
sfrit ct timp
sfrit subalgoritm

Dac vrem s evitm aceast operaie de completare cu 0-uri, care cauzeaz crete-
rea operaiilor elementare de adunare, putem proceda n Ielul urmtor:

Subalgoritm$GXQSSJJSJ
aaunm S cu S }
dacJJatunci
pentruLQexecut
S>L@S>L@S>L@
sfrit pentru
SS
JJ
altfel
pentruLQexecut
S>L@S>L@S>L@
sfrit pentru
SS
JJ
sfrit dac
sfrit subalgoritm

Aceast rezolvare are dezavantajul c l modiIic pe p


1
, respectiv pe p
2
, dup caz.
Dac ns i-am transmite prin valoare, dup revenirea din apel, i-am regsi nemodiIi-
cate.

Opiunea '-'
Scderea a dou polinoame poate Ii privit ca o adunare a primului polinom cu po-
linomul rezultat din nmulirea celui de-al doilea polinom cu 1:
p
1
p
2
p
1
(1) p
2


Subalgoritm6FDGHSSJJSJ
QPXOHWHBFXBVFDODUSJ
$GXQSSJJSJ
302 14. Polinoame

aac in urma scaerii celor aou polinoame s-a reaus graaul }
polinomului re:ultat, se moaific graaul polinomului aiferen }
ct timpJ!iS>J@execut
JJ
sfrit ct timp
sfrit subalgoritm

Opiunea '*'
nmulirea poate Ii privit ca adunarea polinoamelor obinute din nmulirea lui p
1

cu cte un monom de-al lui p
2
. Polinomul ,produs l vom iniializa:

Subalgoritm,QLLDOL]HD]SJ
iniiali:ea: coeficienii polinomului p ae graa g cu 0-uri }
pentruLJexecut
S>L@
sfrit pentru
sfrit subalgoritm

Monoamele cu care se va nmuli p


1
le obinem din p
2
sub Iorm de coeIicieni. n
consecin ne trebuie un subalgoritm care nmulete un polinom cu un numr ntreg:

SubalgoritmQPXOHWHBFXBVFDODUSJFRQVWDQWD
returnea: polinomul re:ultat ain inmulirea lui cu FRQVWDQWD }
pentruLJexecut
S>L@FRQVWDQWDS>L@
sfrit pentru
sfrit subalgoritm

n subalgoritmul QPXOHWHSSJJSJ vom utiliza trei polinoa-
me de lucru: SDX[ de grad JDX[, WHUPHQ i WHUPHQ. Polinomul SDX[ primete va-
loarea polinomului p
1
, n WHUPHQ ,strngem polinomul rezultat (p
3
), iar n WHU
PHQ pstrm temporar polinomul SDX[ care la Iiecare pas se nmulete cu X. De ase-
menea, la Iiecare pas (n numr de ci termeni sunt n p
2
) vom nmuli p
1
cu coeIicien-
tul corespunztor din p
2
i rezultatul se adun la p
3
(pstrat n WHUPHQ).

SubalgoritmQPXOHWHSSJJSJ
returnea: polinomul re:ultat ain inmulirea a aou polinoame }
JJJ
,QLLDOL]HD]SJ se iniiali:ea: re:ultatul }
SDX[S SDX[polinom ae lucru }
JDX[J
se aaun la fiecare pas polinomul SDX[ la polinomul re:ultat S }

14. Polinoame 303



pentruLJexecut pentru fiecare coeficient al polinomului S }
WHUPHQS
WHUPHQSDX[
QPXOHWHBFXBVFDODUWHUPHQJDX[S>L@
$GXQWHUPHQWHUPHQJJDX[SJ
2ULB;SDX[JDX[ se pregtete SDX[ pentru pasul urmtor }
sfrit pentru
sfrit subalgoritm

EIectul subalgoritmului 2ULB;SJ este ,echivalent cu nmulirea polinomului
p cu X. De Iapt se deplaseaz coeIicienii n ir cu o poziie la dreapta, elibernd astIel
locul termenului liber care se iniializeaz cu 0 i n Iinal se mrete gradul polinomu-
lui cu 1:

Subalgoritm2ULB;SJ
inmulete polinomul p cu X }
pentruLJexecut se aeplasea: coeficienii cu o po:iie spre areapta }
S>L@S>L@
sfrit pentru
S>@
JJ
sfrit subalgoritm

Dac ntr-o problem am avea nevoie de un subalgoritm simplu de nmulire, am
putea Iolosi urmtorul:

SubalgoritmQPXOHWHSSJJSJ
JJJ
,QLLDOL]HD]SJ se iniiali:ea: re:ultatul }
pentruLJexecut
pentruMJexecut
S>LM@S>LM@S>L@S>M@
sfrit pentru
sfrit pentru
sfrit subalgoritm

Opiunea '/'
Deoarece aceast aplicaie determin ctul i restul a dou polinoame cu coeIicieni
ntregi, conIorm unui rezultat prezentat n suportul teoretic al leciei, coeIicientul de
grad maxim al polinomului mpritor trebuie s Iie 1 sau 1.


304 14. Polinoame

SubalgoritmPSDUWHSSJJSFkWSUHVWJFkWJUHVW
returnea: polinomul cat i rest, re:ultate ain imprirea a aou polinoame }
JFDWJJ graaul polinomului cat este aiferena graaelor polinoamelor }
se iniiali:ea: coeficienii polinomului SFkW cu 0 }
,QLLDOL]HD]SFkWJFkW
catul i restul vor fi polinoame cu coeficieni intregi }
dacS>J@sauS>J@atunci
graaul aeimpritului > graaul impritorului }
ct timpJ>Jexecut
coeficientul termenului ae graa JJ va fi re:ultatul impririi }
SFDW>JJ@>S>J@S>J@@
QPXOHWHSFDWSJJJSDX[JDX[
6FDGHSSDX[JJDX[SUHVWJUHVW
SSUHVW se repet procesul, imprina restul actual la S }
JJUHVW
sfrit ct timp
sfrit dac
sfrit subalgoritm

Opiunea 'd'
Pe rnd, pentru Iiecare posibil divizor se construiete polinomul p
2
, conIorm schemei
lui Horner.

Subalgoritm'HVFRPSXQHSJJJ:
dacUHVW>S>@S>J@@atunci numai aac are coeficieni intregi }
QG se introauc in irul GLYL aivi:orii lui S>@ }
pentruL$EVS>@execut
dacUHVW>S>@L@atunci L i L se introauc in irul aivi:orilor }
QGQG
GLYL>QG@L
QGQG
GLYL>QG@L
sfrit dac
sfrit pentru
JUDGJ variabil auxiliar in care se pstrea: graaul polinomului }
N inaice in irul aivi:orilor }
QUG numrul racinilor gsite }
repet se construiete polinomul S conform schemei lui Horner, }
S>J@S>J@ coeficientul termenului ae graa maxim }
pentruLJexecut
S>L@S>L@S>L@GLYL>N@
sfrit pentru
14. Polinoame 305

dacS>@atunci GLYL>N@ este racin a lui S }
QUGQUG
UG>QUG@GLYL>N@ pstrm racina in irul racinilor }
pentruLJexecut
S>L@S>L@
sfrit pentru
JJ scaae graaul polinomului S }
altfel
NN
sfrit dac
pn cndN!QGsauQUGJUDG
pan cana nu mai sunt aivi:ori sau am gsit toate racinile }
$ILHD]B3URGXVBGHB%LQRDPH
sfrit dac
sfrit subalgoritm

Subalgoritmul de mai sus apeleaz o procedur special de aIiare. Procedura Iace
parte din zona de declaraii a subprogramului 'HVFRPSXQHSJJJ.

Subalgoritm $ILHD]B3URGXVBGHB%LQRDPH
se afiea: proausul ae polinoame aeterminat }
dacJ!atunci
se afiea: S care nu mai are racini in mulimea numerelor intregi }
scrie
$ILHD]SJJJ
scrie
sfrit dac
pentruNQUDGexecut
S>@UG>N@
S>@
scrie
$ILHD]SJJ
scrie
sfrit pentru
sfrit algoritm

Aceste subprograme sunt toate ncorporate n unit-ul pstrat n Iiierul 3ROLSDV,
care trebuie inclus n programul care l va utiliza. Programul principal cuprinde citirea
caracterului care codiIic operaia de eIectuat. n Iuncie de valoarea acestui caracter
se execut secvena de instruciuni care citete datele de intrare, eIectueaz operaia
precizat i aIieaz rezultatele n Iorma solicitat. S, S, S i S sunt polinoame de
grade J, J, J i respectiv J.




Mulimi

Tipul mulime
Operaiile posibile cu datele de tip mulime
Probleme propuse
Soluiile problemelor
Capitolul
15



15.1. Tipul mulime
Mulimea este o structur static de date cu ajutorul creia se poate reprezenta o co-
lecie Iinit de elemente. Caracterul Iinit ne permite indexarea elementelor sale:
M m
1
, m
2
, ..., m
n
} ceea ce nseamn c la nivelul reprezentrii interne mulimea
poate Ii asimilat cu un ir (m
1
, m
2
, ..., m
n
).
Pentru a putea preciza modul n care se vor eIectua operaiile cu mulimi, vom deIi-
ni structura de submulime. Aceasta se poate realiza cu ajutorul unui vector Iormat din
valorile funciei caracteristice asociate submulimii:
v
s
(s
1
, s
2
, ..., s
n
), unde

e
e
=
S m
S m
s
i
i
i
dac , 0
dac 1,

Fie S
1
, S
2
e M i
2 1
,
s s
v v vectorii lor corespunztori. Atunci:
a) S
1
S
2
va Ii caracterizat de vectorul v
1
obinut din
2 1
i
s s
v v , eIectund operaia
logic v (sau) element cu element;
b) S
1
S
2
va Ii caracterizat de vectorul v
2
obinut din
2 1
i
s s
v v , eIectund operaia
logic . (i) element cu element.
Oricare alte operaii cu submulimile unei mulimi pot Ii imaginate ca operaii logi-
ce asupra vectorilor ataai.

1ipul mulime este un tip structurat, aiferit ae celelalte tipuri structurate, el cores-
punae noiunii ae mulime ain matematic.
O valoare a unui tip mulime este o submulime a valorilor unui tip orainal, stan-
aara sau aefinit ae utili:ator, numit tipul de baz al mulimii. (De exemplu, n limba-
jul Pascal tipul de baz al mulimii are cel mult 256 de valori; valorile ordinale ale
acestora trebuie s aparin intervalului |0, 255|.)
15. Mulimea 307

Un tip mulime are attea valori cte submulimi admite mulimea valorilor tipului
de baz i mulimea vid, respectiv 2
n
submulimi, dac tipul de baz are n valori.

15.2. Operaiile posibile cu datele de tip mulime

1. Atribuirea
Unei variabile de tip mulime i se atribuie valoarea unei expresii de acelai tip mulime.

Exemple (Pascal)
$>@ iniiali:are cu mulimea via }
%>@
&>$(,28DHLRX@

2. Declararea tipului mulime (Pascal)
type numetipset of tipaeba:;
variaentificatorvariabilnumetip;
unde tipaeba: este tipul de baz al mulimii i are cel mult 256 de valori.

Exemple
type PXOWset of %\WH numere intregi mai mici aecat 255 }
PXOWset of mulime ae cifre }
PXOWset of &KDU; mulime ae caractere }
PXOWset of D] mulimea literelor mici }

3. Operaii cu mulimi
Operaiile cunoscute din teoria mulimilor se implementeaz n Iuncie de instru-
mentele limbajului de programare.

a. Operatori binari
Reuniunea a dou mulimi:
Intersecia a dou mulimi:
DiIerena a dou mulimi:

b. Operatori relaionali
s (incluziune), > (include pe), (egalitate), ! (diIerite).

Exemple
dac $% atunci
scrie $HVWHLQFOXVin%
sfrit dac
308 15. Mulimea

dac $!% atunci
scrie $LOLQFOXGHSH%
sfrit dac
dac $ % atunci
scrie $HJDOFX%
sfrit dac
dac $!% atunci
scrie $HVWHGLIHULWDGH%
sfrit dac

c. 1est de apartenen a unui element la o mulime
Se Iolosete operatorul relaional in.

Exemple
dac HOHPHQWin $ atunci
scrie HOHPHQWVHDIODLQPXOWLPH
sfrit dac
dac not HOHPHQWin $ atunci
scrie HOHPHQWQXVHDIODLQPXOWLPH
sfrit dac
d. Citirea unei variabile de tip mulime
n limbajul Pascal nu este permis citirea unei variabile de tip mulime. n concluzie,
se va proceda similar cu citirea unei variabile de tip tablou, citind componentele mul-
imii una cte una:
Subalgoritm &LWLUHB0XOLPHP
PC in Pascal mulimea via se notea: cu afutorul constructorului. >@ }
ct timp mai exist elemente execut:
citete HOHPHQW
HOHPHQW trebuie s fie ae acelai tip cu tipul ae ba: al mulimii }
PP>HOHPHQW@
operaia ae reuniune se efectuea: intre aoi operan:i ae tip mulime }
sfrit dac
sfrit subalgoritm
e. Scrierea unei variabile de tip mulime
n limbajul Pascal nu este permis scrierea unei variabile de tip mulime. i de data
aceasta se va proceda similar cu scrierea unei variabile de tip tablou, scriind compo-
nentele mulimii una cte una.

n subalgoritmul urmtor presupunem c mulimea are tipul de baz %\WH.

15. Mulimea 309

Subalgoritm 6FULHUHB0XOLPHP
pentru HOHPHQWexecut:
generm fiecare HOHPHQW care aparine tipului ae ba: al mulimii }
dac HOHPHQWePatunci aac HOHPHQW aparine mulimii }
scrie HOHPHQW atunci il scriem }
sfrit dac
sfrit pentru
sfrit subalgoritm

Observaie
Nu orice structur de date de tip mulime poate Ii implementat cu un tip predeIinit
n limbajul de programare respectiv. De exemplu, chiar dac n Pascal exist posibi-
litatea Iolosirii tipului set, acesta nu este utilizabil n cazul unei mulimi avnd cardi-
nalitate mai mare dect 256, sau n cazul n care elementele unei mulimi nu sunt de
tip ordinal. n aceste cazuri vom implementa un tip mulime propriu, apelnd la tipul
tablou (array). n cazul implementrilor proprii va trebui s crem subalgoritmii care
asigur operaiile speciIice cum sunt reuniunea i intersecia (vezi capitolul 6).

15.3. Probleme propuse

15.3.1. Cifre comune
Dintr-un Iiier text se citesc numere ntregi. AIiai ciIrele comune tuturor numerelor
citite i ciIrele care nu apar n componena nici unui numr din Iiier.

Date de intrare
Fiierul de intrare NUMERE.IN conine un numr oarecare de linii pe care sunt scrise
un numr oarecare de numere ntregi, separate prin cte un spaiu.

Date de ieyire
n Iiierul de ieire NUMERE.OUT se vor scrie ciIrele comune pe prima linie, n ordine
cresctoare, dou ciIre Iiind separate printr-un spaiu. CiIrele care nu apar n compo-
nena nici unui numr se vor scrie pe a doua linie, n ordine cresctoare, dou ciIre
Iiind separate printr-un spaiu. Dac nu exist ciIre care s Iie comune tuturor numere-
lor din Iiierul de intrare, pe prima linie din Iiierul de ieire se va scrie mesajul 1X
H[LVWDFLIUHFRPXQH Dac toate cele 10 ciIre apar n scrierea numerelor din
Iiier, n Iiierul de ieire se va scrie mesajul $SDUWRDWHFLIUHOH

Restricii yi precizri
- numerele din Iiierul de intrare au cel mult 9 ciIre Iiecare.

310 15. Mulimea

Exemplu
NUMERE.IN


NUMERE.OUT



15.3.2. Agenda
Vasile i-a cumprat o agend nou i i-a notat n ea n numere de teleIon ale cuno-
tinelor sale ntr-o ordine dorit de el. Chiar dac are agend, Vasile ar vrea s ,nvee
toate numerele de teleIon notate. Deoarece el a observat c cel mai uor se pot pstra
n minte acele numere de teleIon care au un numr minim de ciIre distincte, i propu-
ne s le nvee mai nti pe acestea. Apoi ar urma numerele de teleIon din cele rmase
care acum au numr minim de ciIre distincte i aa mai departe.
Scriei un program care stabilete care sunt numerele de teleIon din cele existente
n agenda lui Vasile, pe care le va ,nva n prima zi, apoi care sunt cele pe care le
va reine n a doua etc.

Date de intrare
Din Iiierul de intrare AGENDA.IN se citesc numerele de teleIon de pe linii distincte.

Date de ieyire
n Iiierul de ieire AGENDA.OUT se vor scrie pe aceeai linie, separate prin spaiu, nu-
merele de teleIon avnd acelai numr de ciIre distincte, linia ncheindu-se cu numrul
de ordine al zilei n care se memoreaz acele numere.

Restricii yi precizri
- un numr de teleIon are cel mult 9 ciIre;
- 1 s n s 100

Exemplu
AGENDA.IN


AGENDA.OUT



15. Mulimea 311

15.3.3. Indivizi
ntr-un grup de n indivizi se stabilesc relaii de prietenie direct i indirect prin inter-
mediul altor indivizi. Dndu-se pentru Iiecare individ prietenii lui direci, aIiai pen-
tru un anumit individ toi prietenii lui indireci.

Date de intrare
De pe prima linie a Iiierului de intrare INDIVIZI.IN se citete numrul de indivizi
n. De pe urmtoarele n linii se citesc prietenii direci ai Iiecrui individ; indivizii din
grup sunt simbolizai prin numere de la 1 la n. n cadrul Iiecrei linii aceste numere
sunt separate prin cte un spaiu. Pe ultima linie este trecut numrul de ordine al indi-
vidului cruia trebuie s i se gseasc prietenii indireci.

Date de ieyire
Fiierul de ieire INDIVIZI.OUT va conine o singur linie n care se vor scrie nume-
rele de ordine ale prietenilor indireci ai individului dat. Aceste numere se vor separa
printr-un spaiu.
Dac un individ nu are prieteni indireci, atunci n Iiier se va scrie mesajul 1X.

Restricii yi precizri
- relaia de prietenie nu este comutativ, adic dac individul i este prieten cu indi-
vidul f, atunci nu nseamn c individul f este prieten cu individul i;
- dac linia i 1 este vid n Iiierul de intrare, acest lucru nseamn c individul
avnd numrul de ordine i nu are prieteni direci.

Exemplu
INDIVIZI.IN


INDIVIZI.OUT



15.3.4. ntlnire
ntr-un liceu se organizeaz o ntlnire cu Iotii absolveni. Din pcate persoana care
are sarcina s trimit invitaiile are la dispoziie doar inIormaii de genul: persoana x a
Iost coleg de an cu persoana y, persoana : a Iost coleg de an cu persoana x etc.
Stabilii lista invitailor pe baza inIormaiilor de tipul celor descrise, n aa Iel nct
colegii de an s Iie grupai.
312 15. Mulimea

Date de intrare
Pe prima linie a Iiierului de intrare COLEGI.IN se aIl numrul n al perechilor de nu-
mere naturale care identiIic dou persoane care au Iost colegi de an. Pe urmtoarele n
linii se aIl perechi de numere naturale, desprite printr-un spaiu, reprezentnd doi
colegi de an.

Date de ieyire
Fiierul de ieire COLEGI.OUT va conine attea linii cte grupuri s-au Iormat din
numerele de ordine ale persoanelor din Iiierul de intrare. Pe Iiecare din urmtoarele
linii se vor scrie numerele de ordine aparinnd unui astIel de grup, desprite prin cte
un spaiu.

Restricii yi precizri
- persoanele sunt identiIicate prin numere de ordine ntre 0 i 255;
- 1 s n s 1000;
- dintr-un grup nu Iac parte mai mult de 256 de parsoane.

Exemplu
COLEGI.IN


COLEGI.OUT



15.4. Soluiile problemelor propuse

15.4.1. Cifre comune
n rezolvarea acestei probleme vom Iolosi trei mulimi:
mulimea comune va reine ciIrele comune tuturor numerelor;
mulimea temp va pstra ciIrele numrului citit la pasul curent;
mulimea nusunt va pstra ciIrele care nu apar n nici unul dintre numerele date.

Exemplu
Fie coninutul Iiierului de intrare:

Mulimea comune i mulimea nusunt se iniializeaz cu mulimea ciIrelor sistemu-


lui zecimal:
comune 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
15. Mulimea 313

nusunt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}.

Numerele se citesc pe rnd din Iiierul de intrare. Prelucrarea unui numr nseamn
descompunerea lui n ciIre i depunerea acestora n mulimea temp. Deci, n cazul nu-
mrului n 1234, mulimea temp va Ii 1, 2, 3, 4}.
Mulimea comune se transIorm n intersecia dintre ea nsi i mulimea temp,
adic va conine dup aceast prim citire doar ciIrele primului numr din Iiier:
comune comune temp, deci comune 1, 2, 3, 4}.
Din mulimea nusunt care coninea iniial toate ciIrele, se scad ciIrele gsite n pri-
mul numr:
nusunt nusunt temp, deci nusunt 0, 5, 6, 7, 8, 9}.
Procedeul continu cu citirea urmtoarelor numere. Ilustrm n tabelul de mai jos
coninutul celor trei mulimi pentru Iiecare numr citit n cazul exemplului.

n 1234 n 23456 n 43267 n 12309 n 2345111 Re:ultate
comune 1,2,3,4} 2,3,4} 2,3,4} 2,3} 2,3} 2 3
nusunt 0,5,6,7,8,9} 0,7,8,9} 0,8,9} 9} 9} 9
temp 1,2,3,4} 2,3,4,5,6} 2,3,4,6,7} 0,1,2,3,9} 1,2,3,4,5}

Subalgoritm&LIUH&RPXQH
ct timp nu urmea: marca ae sfarit ae fiier execut
citeteQ
WHPSC
ct timpQ!execut
WHPSWHPSUHVW>Q@
Q>Q@
sfritct timp
FRPXQHFRPXQHWHPS
QXVXQWQXVXQW?WHPS
sfritct timp
aup ce s-au citit toate numerele ain fiier, se verific }
coninutul mulimilor FRPXQH i QXVXQW}
aac mulimea FRPXQH nu este via exist cifre comune }
dacFRPXQH=Catunci
pentruLexecut se scriu elementele mulimii in fiier }
dacLeFRPXQHatunci
scrieL
sfritdac
sfritpentru
altfel altfel se scrie mesaful cerut in fiierul ae ieire }
scrie1XH[LVWDFLIUHFRPXQH
sfritdac
314 15. Mulimea

dacQXVXQW=Catunci aac exist elemente in mulimea QXVXQW, }
exist cifre care nu au aprut in componena nici unui numr }
pentruLexecut acestea se scriu pe cea ae-a aoua linie in fiier }
dacLeQXVXQWatunci
scrieL
sfritdac
sfritpentru
altfel aac mulimea QXVXQW este via }
scrie$SDUWRDWHFLIUHOH se scrie in fiierul ae ieire mesaful cerut }
sfritBdac
sfritsubalgoritm

n programul Pascal mulimile Iolosite au ca tip de baz subdomeniul deoare-
ce vor conine ciIre. Numerele pe care le citim din Iiier sunt de tip /RQJLQW i le vom
reine Iiecare numr citit n variabila Q. De asemenea, amintim c n Pascal o mulime A
se creeaz cu ajutorul constructorului (A |a
1
, a
2
, ..., a
k
|, unde a
i
, i 1, 2, ..., k, repre-
zint elementele mulimii).

15.4.2. Agenda
Vom ncepe discuia privind rezolvarea problemei cu un exemplu:
n tabloul nr avem cele n numere de teleIon citite din Iiier.
nr (177456, 234567, 432167, 433321, 534211, 645321, 01110233, 222222).
Crem un tablou de mulimi cif n care cif
i
va conine ciIrele distincte din numrul
de teleIon nr
i
:
cif (1, 4, 5, 6, 7}, 2, 3, 4, 5, 6, 7}, 1, 2, 3, 4, 6, 7}, 1, 2, 3, 4}, 1, 2, 3, 4, 5},
1, 2, 3, 4, 5, 6}, 0, 1, 2, 3}, 2})
n tabloul cate pstrm numrul de componente (cardinalitatea) Iiecrei mulimi cif
i
.
n exemplul considerat cate (5, 6, 6, 4, 5, 6, 4, 1).
n Iuncie de coninutul tabloului cate vom alege n timpul aIirii numrul de tele-
Ion nr
i
avnd la pasul respectiv numr minim de ciIre. Aceast cerin o realizm ge-
nernd cardinalitile posibile ale mulimilor. Acestea sunt numere cuprinse n muli-
mea 1, 2, ..., 10}, presupunnd c ntr-un numr de teleIon putem avea toate ciIrele
egale (cazul 1) sau toate ciIrele aistincte (10; de Iapt 9, conIorm enunului).
nainte de a descrie paii algoritmului de rezolvare, vom observa c un numr de
teleIon poate s nceap i cu ciIra 0. Aceast observaie este important, deoarece
dac numerele de teleIon le-am citi ca pe nite numere, acea ciIr 0 de la nceput s-ar
pierde (025 25). n concluzie alegem ca modalitate de reprezentare pentru numerele
de teleIon irul de caractere (stringul).
n program vom lucra cu tipul VWU, reprezentnd iruri de caractere avnd cel
mult 9 caractere (corespunztor restriciei din enun). Numerele de teleIon le vom
pstra ntr-un tablou avnd elemente de tip VWU, deoarece vom avea nevoie de ntreg
15. Mulimea 315

tabloul n momentul n care vom dori s ordonm numerele de teleIon n Iuncie de
numrul ciIrelor distincte n componena lor.
Pentru a obine ciIrele distincte dintr-un numr de teleIon, din ciIrele Iiecrui nu-
mr n parte vom crea cte o mulime. AstIel vom genera un tablou de mulimi.

Subalgoritm*HQHUDUHBWDEORXBPXOLPLFLI
aescompunem fiecare numr ae telefon QU>L@ in mulimea ae cifre FLI>L@ }
pentruLQexecut
FLI>L@C
sfritpentru
pentruLQexecut
pentru Mlungimea lui QU>L@ execut ae la prima cifr pan la ultima }
al f-lea caracter ain al i-lea numr ae telefon }
FLI>L@FLI>L@^QU>L@>M@`
sfritpentru
sfritpentru
sfritsubalgoritm

Stabilim cardinalitatea mulimilor de ciIre din Iiecare mulime FLI>L@ n FkWH>L@.

Subalgoritm*HQHUDUHBWDEORXBGLPHQVLXQLFkWH
pentruLQexecut
S
pentruMexecut
dacMeFLI>L@atunci
SS
sfritdac
sfritpentru
FkWH>L@S
sfritpentru
sfritsubalgoritm

Ordonm numerele de teleIon i mulimile de ciIre cresctor dup cardinalitate.

Subalgoritm2UGRQDUHFkWHQUFLI
pentruLQexecut
pentruMLQexecut
dacFkWH>L@!FkWH>M@atunci
DX[QU>L@QU>L@QU>M@QU>M@DX[
DX[FLI>L@FLI>L@FLI>M@FLI>M@DX[
DX[FkWH>L@FkWH>L@FkWH>M@FkWH>M@DX[
sfritdac
sfritpentru
sfritpentru
sfritsubalgoritm
316 15. Mulimea

n scopul aIirii numerelor de teleIon n ordine cresctoare dup numrul ciIrelor
distincte din componena lor, vom cuta, pe rnd, numere de teleIon avnd 1, 2, ..., 9
ciIre distincte.

Subalgoritm$ILDUHQUFkWH
]LXD
pentruLexecut
JVLWfals
pentruMQexecut stuaiem fiecare numr ae telefon }
dacLFkWH>M@atunci
aac am gsit un numr ae telefon avana i cifre aistincte }
JVLWaaevrat
scrieQU>M@ il scriem in fiier }
sfritdac
sfritpentru
aac am gsit cel puin un numr ae telefon avana cu 1 mai multe }
cifre aecat cele propuse spre invare pentru :iua preceaent }
cretem numrul ae oraine al :ilei i il scriem in fiier }
dacJVLWatunci
]LXD]LXD
scrie]LXD
sfritdac
sfritpentru
sfritsubalgoritm

15.4.3. Indivizi
Vom ncepe analiza problemei cu un exemplu. n acest exemplu ne propunem aIiarea
prietenilor indireci pentru individul avnd numrul de ordine 3.

indivizii 1 2 3 4 5 6
prieteni direci 2, 3} 3, 4} 5} 3, 5} 6} 1, 2}
prieteni indireci 2, 3} 3, 4} 5, 6} 3, 5} 6} 1, 2}

2, 3} 3, 4} 5, 6} 3, 5} 6} 1, 2}

2, 3} 3, 4} 1, 2, 5, 6} 3, 5} 6} 1, 2}

2, 3} 3, 4} 1, 2, 3, 5, 6} 3, 5} 6} 1, 2}

2, 3} 3, 4} 1, 2, 3, 4, 5, 6} 3, 5} 6} 1, 2}
se scad prietenii direci 2, 3} 3, 4} 1, 2, 3, 4, 6} 3, 5} 6} 1, 2}
se scade persoana p 2, 3} 3, 4} 1, 2, 4, 6} 3, 5} 6} 1, 2}

Persoana 3 l are ca prieten direct pe al 5-lea. Adugm la mulimea prietenilor di-
reci (care de acum ncolo i va conine i pe cei indireci) mulimea prietenilor direci
ai celui de-al 5-lea. Mulimea devine: 5, 6}.
15. Mulimea 317

Al 5-lea l are ca prieten direct pe al 6-lea. Adugm la mulimea corespunztoare
lui 3 mulimea corespunztoare celui de-al 6-lea. Mulimea acum devine: 1, 2, 5, 6}.
n mulimea rezultat apare individul 1, deci se vor aduga i prietenii acestuia la
lista de prieteni indireci ai lui 3. Mulimea este: 1, 2, 3, 5, 6}.
n mulimea rezultat apare individul 2, deci se vor aduga i prietenii acestuia la
lista de prieteni indireci ai lui 3. Mulimea este: 1, 2, 3, 4, 5, 6} .
Din aceast mulime se scade mulimea prietenilor direci ai lui 3 i se obine
mulimea: 1, 2, 3, 4, 6}, apoi se scade i persoana 3.
Una dintre Iacilitile limbajului Pascal este Iaptul c ne pune la dispoziie tipul
set care, poate Ii utilizat (pe lng multe altele) ca tip de baz ntr-un tablou (array).

Problema dat este rezolvabil prin utilizarea unui tablou de mulimi. Tabloul are n
elemente, Iiecrui individ i, (i 1, 2, ., n) i corespunde o poziie n tablou. Valoarea
prieteni
i
este mulimea Iormat din prietenii direci ai lui i.
Iniial tabloul este Iormat din n mulimi vide. Acestea se completeaz cu numerele
de ordine ai prietenilor direci.

Subalgoritm3ULHWHQLLSULHWHQL
pentruLQexecut
SULHWHQL>L@C inc nu am aescoperit prietenii nici unei persoane }
sfritpentru
pentruLQexecut pentru fiecare persoan i }
ct timpQX urmea: marcaful ae sfarit ae linie execut
citeteS persoana i il are printre prietenii aireci pe p }
SULHWHQL>L@SULHWHQL>L@^S`
aaugm p la mulimea prietenilor aireci ai lui i }
sfritct timp
sfritpentru
citeteS numrul ae oraine al persoanei investigate }
in WHPS pstrm mulimea persoanelor prietene airect cu p }
WHPSSULHWHQL>S@
pentruLQexecut lum pe rana persoanele }
dacLeSULHWHQL>S@atunci aac persoana i este prieten airect cu p, }
SULHWHQL>S@SULHWHQL>S@SULHWHQL>L@
aaugm mulimea prietenilor aireci ai acestuia mulimii prietenilor lui p }
sfritdac
pentruMQexecut lum inc o aat persoanele pe rana }
aac f este prieten airect sau inairect cu p, aaugm }
dacMeSULHWHQL>S@atunci
la mulimea prietenilor aireci i inaireci ai lui p se aaaug }
mulimea prietenilor aireci ai acestuia }
318 15. Mulimea

SULHWHQL>S@SULHWHQL>S@SULHWHQL>M@
sfritdac
sfritpentru
sfritpentru
in final ain mulimea prietenilor aireci i }
inaireci extragem mulimea prietenilor aireci (i-am pstrat in WHPS) }
SULHWHQL>S@SULHWHQL>S@WHPS
SULHWHQL>S@SULHWHQL>S@S il extragem i pe p }
aac mulimea prietenilor inaireci nu este via }
dacSULHWHQL>S@=Catunci
pentruLQexecut afim mulimea prietenilor inaireci }
dacLeSULHWHQL>S@atunci
scrieL
sfritdac
sfritpentru
altfelscrie1X
sfritsubalgoritm

15.4.4. ntlnire
Observm c dac a a Iost coleg cu b, atunci i b a Iost coleg cu a (comutativitate). De
asemenea, dac a a Iost coleg cu b i b a Iost coleg cu c, atunci a a Iost coleg i cu c
(asociativitate). Amintim i proprietatea c n orice situaie a este coleg cu a.

Subalgoritm&LWLUHQJU
citeteQ
pentruLQexecut
citeteDE citim perechile ae numere }
JU>L@^DE` formm cate un grup ain fiecare pereche citit }
sfrit pentru
sfrit subalgoritm

Subalgoritm)RUPDUHB*UXSXULQJU:
pentruLQexecut
pentruMLQexecut
aac intersecia a aou grupuri nu este via }
dacJU>L@JU>M@=Catunci
JU>M@JU>L@JU>M@ unim grupurile in al aoilea grup }
JU>L@C i pe primul grup il facem via }
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm
15. Mulimea 319

Subalgoritm)RUPDUHB/LVWQJU
eliminm grupurile viae }
QU
pentruLQexecut
dacJU>L@=Catunci
QUQU
JU>QU@JU>L@
sfrit dac
sfrit pentru
QQU lungimea nou, fr grupuri viae }
sfrit subalgoritm

Subalgoritm$ILDUHQJU
scrieQ
DPBVFULVfals
pentruLQexecut
pentruMexecut
dacMeJU>L@atunci
scrieM
DPBVFULVaaevrat
sfrit dac
sfrit pentru
dacDPBVFULVatunci
trecem la linie nou aac am afiat un grup, trecem la linie nou in fiier }
sfrit dac
DPBVFULVfals
sfrit pentru
sfrit subalgoritm



Tipul nregistrare

Declararea unui tip nregistrare
Operaii
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
16



Articolul (nregistrarea) reprezint reuniunea unui numr Iix (sau variabil) de compo-
nente numite campuri, (de regul avnd tipuri diIerite) care constituie logic o unitate
de prelucrare. Tipurile diIerite ale cmpurilor din componena sa dau articolului carac-
terul de structur neomogen. Dac L
i
este lungimea cmpului i (i 1, 2, ..., n), atunci
valoarea adresei cmpului i este: a
i
a
1
L
1
L
2
... L
i-1
.
Caracterul neomogen al articolului, precum i lipsa unei relaii liniare ntre numrul
de ordine al cmpului i adresa acestuia Iac ca regsirea unui cmp s se realizeze cu
ajutorul unui identiIicator asociat cmpului respectiv la deIinirea articolului.

a
1
a
2
a
i
a
n
L
1
L
2
L
i
L
n
^^^^

camp
1
camp
2

. . .
camp
i

. . .
camp
n




Tipul articol (inregistrare) este o structur static de date Ilexibil, datorit Iaptului
c, spre deosebire de tipul tablou, cuprinde un numr Iix sau variabil de componente
care pot Ii de tipuri diIerite. Componentele nu se indexeaz printr-o expresie (ca n ca-
zul tablourilor), ci se selectea: prin intermeaiul iaentificatorilor ae camp care se deIi-
nesc la declararea tipului.

16.1. Declararea unui tip articol n limbajul Pascal
Forma general a deIiniiei unui tip nregistrare fix este:
type iaentificatortiprecord
numecamp
1
tip
1

numecamp
2
tip
2


numecamp
n
tip
n

end;
16. Tipul inregistrare 321

Exemplu
typeHOHYrecord
QXPHstring
PHGLH5HDO
YkUVW
end
varDHOHY

Tipul unui identiIicator de cmp poate Ii la rndul lui tot articol.

Exemplu
typeSHUVRDQDrecord
DGUHVDrecord
VWUDGDstring
QXPDU%\WH
end
ELWHOstring
end
varDSHUVRDQD

Un identiIicator de cmp trebuie s Iie unic n cadrul propriului tip inregistrare.

Dac se dorete includerea n structura articolului a unor inIormaii care depind de
o alt inIormaie deja prezent n structur se Iormeaz cea de-a doua categorie, i
anume date de tip nregistrare cu variante.

Declararea unui tip nregistrare cu variante n limbajul Pascal:
type iaentificatortiprecord
numecamp
1
tip
1

numecamp
2
tip
2


numecamp
n
tip
n

case campselector: tipselector of
const
1
:(campv
11
:tipv
11
; campv
12
:tip
12
; ...);
const
2
:(campv
21
:tipv
21
; campv
22
:tip
22
; ...);
...
end;

Exemplu
typeVWXGLLHOHPPHGLLVXS tip enumerare }
SHUVRQDOrecord
QXPHstring

322 16. Tipul inregistrare

caseSUHJVWXGLLof
HOHPFDSDF5HDO
PHGLLEDF5HDO
VXSIDFXstringPHGLD5HDO
end
varDSHUVRQDO

16.2. Operaii

16.2.1. Atribuirea
Unei variabile de tip nregistrare i se atribuie valoarea unei alte variabile de acelai tip
inregistrare. Fiind date dou variabile de tip nregistrare a i b, care au acelai tip, se
poate realiza operaia de atribuire a b ceea ce nseamn c valorile cmpurilor lui a
se substituie cu valorile din b.

16.2.2. Selectarea unui cmp
La un cmp al unei variabile de tip nregistrare ne reIerim prin numele variabilei, ur-
mat de punct, apoi numele cmpului.

Exemplu
DEL, DWHO, DDGUHVDQXPDU

O astIel de scriere este greoaie i pentru evitarea speciIicrii identiIicatorului de tip
nregistrare n Iaa Iiecrui cmp care intervine n prelucrare, n Pascal se poate Iolosi
instruciunea with, care simpliIic modul de scriere a selectrii componentelor.

Exemplu
withDdo
:ULWHDGUHVDVWUDGD'ELWHO

n cazul nregistrrilor cu variante, pentru declaraiile din exemplul prezentat se pot
Iace urmtoarele atribuiri de date pentru cmpurile variabilei a:
DQXPH'SRS'
DSUHJVXS
DIDFX'LQIRUPDWLF'
DPHGLD
sau
DSUHJHOHPDFDSDF

La un moment dat este activ o singur variant.
16. Tipul inregistrare 323

16.3. Implementri sugerate
Pentru a v Iamiliariza cu prelucrarea datelor de tip nregistrare se recomand eIectua-
rea urmtoarelor exerciii:
1. crearea unui catalog pentru o clas;
2. aIiarea n ordine descresctoare dup medie a elevilor admii i alIabetic a elevi-
lor respini la un examen;
3. aIiarea tuturor elevilor care au domiciliul ntr-un anumit ora;
4. ordonarea elevilor n Iuncie de nlime i, pentru nlimi egale, n ordinea greut-
ii;
5. crearea unui Iiier care s conin articole privind crile dintr-o bibliotec;
6. crearea unui Iiier care s conin articole privind crile dintr-o bibliotec, astIel
nct n cazul manualelor s se speciIice disciplina, clasa pentru care este valabil
manualul, autorii etc., iar pentru crile care nu sunt manuale, numrul autorilor,
autorii, titlul, editura etc. (se va lucra cu nregistrri cu variante)
7. crearea unui Iiier cu articole privind rezultatele participanilor la olimpiada inter-
naional de inIormatic.

16.4. Probleme propuse

16.4.1. Agend
Un elev a creat o agend de teleIon n care a introdus numele i numrul de teleIon ale
cunotinelor sale. De asemenea, elevul dorete s poat eIectua asupra agendei sale
cteva operaii de Iorma:
- consultarea agendei cu aIiarea ntregului coninut;
- introducerea unei noi persoane n agend;
- tergerea unei persoane;
- cutare dup nume;
- cutare pe baza cunoaterii numrului de teleIon.
Scriei un program care s realizeze operaiile cerute de elev.

Date de intrare
Fiierul de intrare AGENDA.IN conine pe Iiecare linie datele unei cunotine n Iorma:
nume numr ae telefon.
Actualizarea agendei se va Iace pe baza unor date introduse de la tastatur.

Date de ieyire
Nu vom avea un Iiier de ieire complet nou. Fiierul AGENDA.OUT va avea coninutul
Iiierului de intrare i nregistrrile noi, conIorm actualizrilor eIectuate.

324 16. Tipul inregistrare

Restricii yi precizri
- numrul de nregistrri este cel mult 100;
- numele este Iormat din cel mult 25 de litere printre care nu exist nici un spaiu;
- Iiecare numr de teleIon ncepe cu ciIra 0;
- la Iiecare actualizare se va substitui Iiierul de intrare cu cel de ieire;
- programul va conine un meniu din care utilizatorul va putea selecta operaia pe ca-
re dorete s-o eIectueze;
- persoanele sunt introduse n agend n ordine alIabetic, operaiile de introducere a
unei persoane noi i tergerea unei persoane nu trebuie s modiIice ordonarea;
- cutarea unei persoane trebuie s se poat realiza, la cerere, dup nume sau dup
numr de teleIon;
- dac numele unei persoane se gsete n agend n timpul operaiei de introducere,
se va oIeri posibilitatea modiIicrii numrului de teleIon; n caz c nu se dorete
modiIicarea, se va introduce numrul 0, altIel noul numr.

Exemplu meniu
FRQVXOWDUHDJHQGD
LQWURGXFHUHDXQHLQRLSHUVRDQH
VWHUJHUHDXQHLSHUVRDQH
FDXWDUHGXSDQXPH
FDXWDUHGXSDWHOHIRQ
LHVLUH
2SWLXQHDWDHVWH

16.4.2. Expoziie
Organizatorii unei expoziii de pictur doresc s aib o eviden a Iiecrui tablou i a
artitilor care au creat aceste tablouri. Organizatorii au adunat datele despre tablouri i
le-au scris ntr-un Iiier. Pentru Iiecare tablou se cunoate numele artistului, titlul ta-
bloului, anul n care a Iost realizat, preul de vnzare, precum i premiile obinute la
expoziii locale, naionale i internaionale.
Expoziiile se codiIic prin caracterele L (locale), N (naionale) i E (europene).
ReIeritor la Iiecare premiu exist inIormaii, dup cum urmeaz:
- anul i premiul n cazul expoziiilor locale;
- anul, premiul i localitatea n cazul expoziiilor naionale;
- anul, premiul, oraul i ara n cazul expoziiilor internaionale.
Avnd la dispoziie aceste date, organizatorii i propun s realizeze un program
care s creeze urmtoarele liste:
1. lista lucrrilor premiate pe categorii n ordinea: locale, naionale i europene;
2. lista tablourilor n ordine cresctoare a preurilor de vnzare;
3. lista artitilor care au obinut premiul 1 la cel puin un concurs, indiIerent de ti-
pul acestuia.
16. Tipul inregistrare 325

Date de intrare
Fiierul de intrare EXPO.IN conine attea linii, cte tablouri s-au expus. Pe Iiecare li-
nie este descris cte un tablou. ReIeritor la un tablou, pe o linie n Iiier, avem urm-
toarele date, desprite prin cte un spaiu:
- numeartist
- titlutablou
- an
- pre
- nrpremii
- tipexpo:iie
- an
- premiu

Dac un tablou a Iost premiat de mai multe ori, celelalte premii sunt descrise n
continuare pe aceeai linie.

Date de ieyire
Se vor crea trei Iiiere de ieire: LISTA1.OUT, LISTA2.OUT i LISTA3.OUT. n toate
cele trei Iiiere o linie conine date reIeritoare la un singur tablou. n Iiiere speciIica-
torul tipexpo:iie va Ii notat cu / (Local), 1 (Naional) sau ( (European).

Fiierul de ieire LISTA1.OUT conine lista lucrrilor premiate. Structura unei linii
este urmtoarea:
tipexpo:iienumeartisttitlutabloutipexpo:iiecaracteristici
unde caracteristici nseamn datele speciIice Iiecrui tip de expoziie descrise n
enun. Acestea vor Ii separate printr-un spaiu.

Fiierul LISTA2.OUT conine tablourile n ordine cresctoare a preurilor. Fiecare
linie are Iorma:
numeartisttitlutabloupre

Fiierul LISTA3.OUT va conine date despre artiti i are Iorma:


numeartisttitlutablou tipexpo:iie
n Iiier artitii vor Ii ordonai alIabetic.

Restricii yi precizri
- numrul de tablouri este cel mult 100;
- datele de tip string au cel mult 20 de caractere.


326 16. Tipul inregistrare

Exemplu
EXPO.IN
SRSLDUQD/
SRSDSORDLD(9HURQD,WDOLD
UXVFRSLL1%UDVRY
SRSHVFXWX/

LISTA1.OUT
/RFDODSRSLDUQD
/RFDODSRSHVFXWX
1DWLRQDODUXVFRSLL%UDVRY
(XURSHDQDSRSDSORDLD9HURQD,WDOLD

LISTA2.OUT
UXVFRSLL
SRSLDUQD
SRSHVFXWX
SRSDSORDLD

LISTA3.OUT
SRSLDUQD/
SRSHVFXWX/

16.5. Soluiile problemelor rezolvate

16.5.1. Agenda
Datele reIeritoare la persoane se pstreaz ntr-o structur de tip nregistrare de Iorma:
type FXQrecord
QXPHWHOstring
end
La o rulare a programului datele se preiau din Iiierul de intrare AGENDA.IN i se
depun n tabloul a de tipul: array>@ of FXQ. Toate prelucrrile cerute n
enun se vor realiza asupra tabloului a. La Iinalul execuiei programului se Iormeaz
un Iiier temporar AGENDA.OUT care conine tabloul D dup actualizri. Fiierul de in-
trare AGENDA.IN se terge, iar Iiierul AGENDA.OUT se redenumete n AGENDA.IN,
astIel nct la urmtoarea rulare a programului datele de intrare s se gseasc cu con-
inutul actualizat.
Numrul nregistrrilor din tabloul a este n.
Citirea datelor din Iiierul de intrare i memorarea lor n tabloul a se Iace n modul
urmtor:
- citim o linie din Iiierul de intrare ntr-un ir de caractere s;
- deoarece Iiecare numr de teleIon ncepe cu caracterul cutm poziia acestuia
n irul de caractere;
16. Tipul inregistrare 327

- copiem caracterele de la nceputul irului de caractere (Ir spaiul despritor din-
tre nume i numrul de teleIon) n cmpul QXPH al elementului curent din irul a;
- tergem aceste caractere (inclusiv spaiul) din irul de caractere;
- ceea ce a rmas n irul de caractere este numrul de teleIon.

Prima aciune posibil de solicitat de elev este aIiarea datelor din Iiier (memorate
deja n tabloul a).

Introducerea unei persoane noi n agend se realizeaz astIel:
- citim numele i numrul de teleIon pe care dorim s le nregistrm n agend;
- apelm subalgoritmul de cutare &DXWQXPHDQLQXPHRN care va returna n
variabila ok o valoare de adevr;
- dac valoarea lui ok este aaevrat, nseamn c am gsit numele persoanei, adic
aceasta exist deja n agend; dup revenirea din apelul subprogramului ,QWURG
aIim un mesaj corespunztor i oIerim posibilitatea modiIicrii numrului de te-
leIon (acest lucru este posibil, deoarece n variabila i avem indicele elementului din
irul a, care conine datele persoanei respective).

Dac s-a introdus opiunea corespunztoare introducerii unei noi nregistrri, n
subprogramul 0HQLXDQRSLXQH se va selecta secvena de program n care se
apeleaz subprogramul ,QWURGDQRNLQXPH:

...
scrie 1XPHOH '
citete QXPH
,QWURGDQRNLQXPH
dac RN atunci
scrie 3HUVRDQDQXPHH[LVWDGHMDLQDJHQGD
scrie 'DFDGRULWLVDVFKLPEDWLQXPDUXOGHWHOHIRQ
LQWURGXFHWLO
scrie 'DFDQXLQWURGXFHWL
scrie 1XPDU
citete WHO
dac WHO= atunci numerele ae telefon sunt stringuri }
D>L@WHOWHO
sfrit dac
sfrit dac
...

Subalgoritmul ,QWURGDQRNLQXPH ncepe cu apelarea altui subprogram
care va cuta numele persoanei introduse. Dac acest nume se gsete deja n agend,
se revine din subalgoritm cu valoarea variabilei ok egal cu aaevrat. n caz contrar se
328 16. Tipul inregistrare

citete i numrul de teleIon pentru a introduce persoana n agend. Deoarece agenda
conine numele persoanelor ordonate alIabetic, subalgoritmul &DXWQXPHDQL
QXPHRN este astIel realizat nct va returna i valoarea variabilei i care n caz de c-
utare cu succes reprezint indicele elementului din irul a care conine datele cutate,
iar n caz contrar reprezint indicele elementului unde ar trebui s se aIle persoana cu
numrul de teleIon cutat. n concluzie, aceast persoan nou trebuie s ajung pe po-
ziia i. Pentru a putea realiza acest scop, n prealabil mrim dimensiunea irului, apoi
translatm elementele avnd indicele egal sau mai mare cu i cu o poziie la dreapta.
Apoi, scriem datele n elementul de indice i.

Subalgoritm ,QWURGDQRNLQXPH
&DXWQXPHDQLQXPHRN
dac nuRNatunci persoana QXPH nu exist in agena }
QQ mrim aimensiunea irului }
pentruMQLexecut eliberm po:iia i, translatana restul }
D>M@D>M@ elementelor cu o po:iie la areapta }
sfrit pentru
scrie1XPDUXOGHWHOHIRQ
citeteWHO
D>L@QXPHQXPH aatele respective se copia: pe po:iia i }
D>L@WHOWHO
sfrit dac
sfrit subalgoritm

Cutarea se realizeaz cu subalgoritmul cunoscut (vezi capitolul 6):

Subalgoritm&DXWQXPHDQLQXPHRN
cutam QXPH in agena, aac RNWUXH l-am gsit pe po:iia i }
aac RNIDOVH nu l-am gsit, ar fi trebuit s fie pe po:iia i }
L
ct timp LsQiD>L@QXPHQXPHexecut
LL
dacD>L@QXPHQXPHatunci
RNaaevrat
altfel
RNfals
sfrit subalgoritm

tergerea unui element din agend se eIectueaz, dac opiunea de actualizare spe-
ciIic codul pentru care se execut urmtoarea secven din subprogramul 0HQLX.
Apelarea subprogramului WHUJDQRNQXPH se Iinalizeaz Iie cu tergerea ele-
mentului corespunztor din ir, Iie cu un mesaj pe baza valorii parametrului ok.
16. Tipul inregistrare 329

scrie1XPHOH
citeteQXPH
WHUJDQRNQXPH
dac nuRNatunci
scrie3HUVRDQDQXPHQXH[LVWDLQDJHQGD
sfrit dac
...

Subalgoritmul WHUJDQRNQXPH apeleaz la rndul su subalgoritmul
&DXWQXPDQLQXPHRN n mod similar cu subalgoritmul ,QWURGDQRNL
QXPH.

Subalgoritm WHUJDQRNQXPH
&DXWQXPHDQLQXPHRN
dacRNatunci persoana QXPH exist in agena }
pentruMLQexecut eliminm elementul ae pe po:iia i, }
D>M@D>M@ translatana restul elementelor cu o po:iie la stanga }
sfrit pentru
QQ micorm aimensiunea irului }
sfrit dac
sfrit subalgoritm

Cutarea numrului de teleIon este identic cu cea a numelui, diIer doar cmpul
analizat din elementele irului.

16.5.2. Expoziie
Se creeaz structura:
typeVWUstring>@
WDEORXrecord
QXPHWLWOXVWU
DQ,QWHJHU
SUHWVWU
caseH[SR/1(of
/DQO,QWHJHUSUO&KDU
1DQQ,QWHJHUSUQ&KDUORFVWU
(DQL,QWHJHUSUL&KDUORFLWDUDVWU
end
VLUarray>@RIWDEORX

Datele le vom prelua din Iiierul de intrare i vom completa Iiecare nregistrare n
Iuncie de variantele sale. irul datelor (a) are m elemente.

330 16. Tipul inregistrare

Crearea primei liste cerute n problem se realizeaz dup valorile cmpului selec-
tor expo. Se parcurge tabloul a i se aleg doar acele elemente care au cmpul selector
egal cu L. Se procedeaz analog pentru celelalte dou tipuri, identiIicate cu N i E.
Crearea celui de-al doilea Iiier de ieire presupune ordonarea cresctoare a nre-
gistrrilor din tablou dup cmpul pre. Se poate Iolosi oricare algoritm de ordonare
cunoscut.

Pentru pstrarea ordinii alIabetice n cazul celei de-a treia cerine a problemei se re-
alizeaz o ordonare cresctoare a nregistrrilor dup cmpul nume, apoi se completea-
z cel de-al treilea Iiier de ieire cu artitii care au obinut premiul 1, speciIicnd i ti-
pul expoziiei.



Operaii pe bii

Noiuni de baz
Reprezentarea numerelor n memorie
Operaii pe bii
nmulire cu operaii pe bii
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
17



17.1. Noiuni de baz
Pn n prezent memoriile utilizate de calculatoare sunt construite din materiale mag-
netizabile, avnd dou stri crora prin convenie li se asociaz valorile binare 0 i 1.
Unitatea de memorie care poate ,nmagazina o valoare de 0 sau 1 se numete bit
(binary aigit).
InIormaiile reprezentate cu bii sunt grupate n memorie cte 8, Iormnd octei.
Memoria este privit ca o niruire de octei, acetia Iiind identiIicai printr-o adre-
s. Octeii de memorie sunt grupai la rndul lor pe pagini de memorie.

Exemplu
Memoria RAM (Ranaom Access Memory):

Pagina 0
Pagina 1
Pagina 0
octet
0 1 2 ...


Numrul de octei ai memoriei interne exprim capacitatea de memorie a acesteia.
Alte uniti de memorare Iolosite n exprimarea capacitii de memorare sunt:
- Kilobyte (notm KB): 1KB 2
10
octei (bytes);
- Megabyte (notm MB): 1MB 2
10
KB;
- Gigabyte (notm GB): 1GB 2
10
MB.
332 17. Operaii pe bii

17.2. Reprezentarea numerelor n memorie
Avnd n vedere c memoria poate reine doar ciIre binare (0 i 1), numerele vor Ii
pstrate pe orice suport magnetic n sistemul de numeraie cu baza 2.

17.2.1. Reprezentarea numerelor naturale
Pentru a reprezenta un numr trebuie s cunoatem tipul acestuia, Iiecrui tip de dat
Iiindu-i caracteristic un anumit numr de octei pentru reprezentare.

n limbajul Pascal: n limbajul C:
tip numr octei tip numr octei
%\WH
1 octet

XQVLJQHGVKRUW
1 octet
:RUG
2 octei 1234
XQVLJQHGLQW
2 octei

XQVLJQHGORQJ
4 octei

S determinm acum care numere naturale pot Ii reprezentate pe un octet.
Un octet este Iormat din 8 bii, poziiile binare pe care le ocup sunt numerotate de
la stnga la dreapta. Bitul c
i
, are rangul i n componena reprezentrii.

Poziii binare: 0 1 2 3 4 5 6 7
c
7
c
6
c
5
c
4
c
3
c
2
c
1
c
0

De exemplu, despre primul bit din stnga spunem ca este bitul de pe poziia 0 i are
rangul 7.
Cel mai mic numr natural care poate Ii reprezentat pe 8 bii este 0
2
0
10
:

0 0 0 0 0 0 0 0

Cel mai mare numr natural care poate Ii reprezentat pe 8 bii este:

1 1 1 1 1 1 1 1

Pentru a calcula valoarea acestui numr n sistemul zecimal aplicm algoritmul de
conversie din baza 2 n baza 10:
11111111
2
1 2
7
1 2
6
1 2
5
1 2
4
1 2
3
1 2
2
1 2
1
1
sau mai simplu, Iolosind operaiile din baza 2 numrul scriindu-se ca
100000000
2
256
10

1
2
1
10

11111111
2
255
10

Putem trage concluzia c pe 8 bii se pot reprezenta numere ntre 0 i 255 (2
8
1).
17. Operaii pe bii 333

Prin analogie, pe 16 bii (2 octei) se pot reprezenta numere naturale cuprinse ntre
0 i 2
16
1.
Pentru a reprezenta un numr natural pe un numr dat de octei se vor eIectua ur-
mtoarele operaii:
1) Se convertete numrul n baza 2;
2) Se aliniaz biii din componena numrului la dreapta; apoi n stnga primei ciIre
semniIicative reprezentarea se completeaz cu 0 (dac este cazul).

Exemple
a. S se reprezinte numrul 480
10
pe 2 octei.
Pasul 1: Numrul se reprezint n baza 2;
Aplicm algoritmul cunoscut i obinem 480
10
111100000
2
.

Pasul 2: aliniem ciIrele numrului n baza 2 la dreapta pe 16 bii (2 octei), comple-
tnd la stnga cu 0-uri:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0

b. S se reprezinte numrul 480
10
pe 1 octet:
Pasul 1: Numrul n baza 2: 111110000
2
.
Pasul 2: Reprezentm acest numr pe un octet:

0 1 2 3 4 5 6 7
1 1 1 1 1 0 0 0 0

Se observ c s-a pierdut ciIra cea mai semniIicativ a numrului, ceea ce nseam-
n c 480 nu poate Ii reprezentat pe 1 octet. Tipul de dat trebuie ales n deplin con-
cordan cu mrimea valorilor (i deci lungimea n bii a acestora).

17.2.2. Reprezentarea numerelor ntregi cu semn

n limbajul Pascal avem: n limbajul C avem:
tip numr de octei tip numr de octei
6KRUWLQW
1 octet

1 octet
,QWHJHU
2 octei
VKRUW
2 octet
/RQJLQW
4 octei
ORQJIORDW
4 octei

Numerele ntregi cu semn se vor reprezenta asemntor numerelor Ir semn, cu
deosebirea c bitul cel mai semniIicativ (bitul 0) va reprezenta de aceast dat semnul
numrului ( sau ). Prin convenie, dac bitul semn are valoarea 0, numrul este con-
siderat a Ii pozitiv, iar dac bitul semn este egal cu 1, numrul este considerat a Ii ne-
gativ.
334 17. Operaii pe bii

Reprezentarea numerelor pozitive se realizeaz la Iel ca i pentru numerele natura-
le, dar lungimea de reprezentare este mai mic cu 1.

Pentru a reprezenta un numr negativ se aplic urmtorii pai:
Pasul 1: Se reprezint numrul n baza 2 (ca i cum ar Ii pozitiv);
Pasul 2: Numrul obinut se scade din 2
k
(unde k este lungimea reprezentrii n bii);
Pasul 3: Se reprezint numrul obinut la pasul 2 pe k bii ca n algoritmul precedent.

Exemplu
S se reprezinte numrul 40
10
pe un octet (k 8).
Pasul 1: 40
10
101000
2

Pasul 2: 100000000
2

000101000
2

011011000
2

Pasul 3:

1 1 0 1 1 0 0 0

Alternativ practic pentru punctul 2:
Se poate demonstra c dac se complementeaz numrul bit cu bit (operaie de ne-
gare pe bit) i apoi la ceea ce s-a obinut, se adun 1, vom ajunge la acelai rezultat:
00101000
2
negat bit cu bit devine 11010111
2
.

11010111
2

1
2

11011000
2


17.2.3. Reprezentarea numerelor reale
Reprezentarea numerelor reale se realizeaz n convenia virgul mobil.
Reamintim c un numr real se poate scrie sub Iorma: c,cc...cE/p , unde cu c am
notat ciIrele numrului, iar p este Iormat din una sau dou ciIre i reprezint puterea la
care este ridicat 10 (exponentul).

Exemplu
2,003E5 2,003 10
5

Dac spaiul de reprezentare este de 4 octei (32 bii), acesta are structura:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 30 31
Caracteristic Mantis
Bit de semn

Pentru a reprezenta n calculator un numr real se respect urmtorii pai:
17. Operaii pe bii 335

Pasul 1: Se reprezint numrul n baza 2;
Pasul 2: Numrul se aduce la Iorm ,normalizat, adic la Iorma 0,1... 10
p
(partea
ntreag este egal cu 0, iar prima ciIr de dup virgul este 1; n Iuncie de
aceast transIormare se stabilete valoarea exponentului p); mantisa conine
toate ciIrele de dup virgul;
Pasul 3: Caracteristica se calculeaz dup Iormula: 2
7

p;
Pasul 4: Caracteristica i mantisa se introduc n reprezentare, aliniate la dreapta n spa-
iile corespunztoare i se stabilete bitul semn al numrului (dac numrul
este pozitiv acesta va Ii egal cu 0, dac nu, va Ii 1).

Exemplu
S se reprezinte numrul 31,5 pe 4 octei.
Pasul 1: Trecem numrul 31 din baza 10 n baza 2: 31
10
11111
2
.
Convertim partea Iracionar: 0,5
10
0,1
2
. Deci 31,5
10
11111,1
2
.
Pasul 2: Se normalizeaz numrul:
11111,1
2
0,111111
2
10
5
2
Mantisa 111111
2
, exponentul p 5.
Pasul 3: Caracteristica este: (2
7

5)
10
10000000
2
101
2
10000101
2
.

0 1 2 3 4 5 6 7 8 9 10 ... 25 26 27 28 29 30 31
0 1 0 0 0 1 0 1 0 0 0 ... 0 1 1 1 1 1 1

17.3. Operaii pe bii
Dup cum bine tim, n memoria calculatorului toate numerele sunt reprezentate n
sistemul de numeraie binar. Noi le vedem n sistemul de numeraie zecimal doar pen-
tru c sistemul eIectueaz permanent conversii de la tastatur spre memorii i de la
memorie nspre monitor pentru ca utilizatorii s nu Iie obligai s desciIreze numere
reprezentate n sistemul binar. Ca atare, cu ajutorul operatorilor pe bii putem aciona
direct asupra reprezentrii binare Ir a Ii nevoie de conversii.
Deoarece operatorii pe bii se execut mai rapid dect operatorii aritmetici, n im-
plementarea algoritmilor se preIer Irecvent utilizarea lor n schimbul celor aritmetici.

17.3.1. Negarea
Negarea este un operator unar care acioneaz asupra unui singur operand de tip ntreg
avnd ca eIect schimbarea Iiecrui bit al reprezentrii numrului din 1 n 0 i din 0 n 1.

Notaii: not D n limbajul Pascal i aD n limbajul C

.

Exemplu
S se calculeze valoarea lui notD, pentru a 40.

336 17. Operaii pe bii

Jaloare :ecimal Repre:entare pe 1 octet
D
40 00101000
notDsauaD 215 11010111

17.3.2. Disjuncia
Disjuncia, (numit sau logic) este un operator binar care acioneaz asupra a doi ope-
ranzi ntregi, bit cu bit, avnd ca eIect setarea bitului rezultat pe 1, dac cel puin unul
dintre bii este 1 i pe 0 n caz contrar. Tabla de operare a disjunciei pe bit este:

Dor E



Notaii: D or E n limbajul Pascal i D_E n limbajul C

.

Exemplu
S se calculeze valoarea expresiei DorE, pentru a 40 i b 38.

Jaloare :ecimal Repre:entare pe 1 octet
D
40 00101000
E
38 00100110
DorE sau D_E 46 00101110

17.3.3. Conjuncia
Conjuncia, (numit i logic) este un operator binar care acioneaz asupra a doi ope-
ranzi ntregi avnd ca eIect setarea Iiecrui bit al rezultatului conIorm aplicrii urm-
toarei table de operare:

Dand E



Notaii: DandE n limbajul Pascal i DE n limbajul C

.

Exemplu
S se calculeze valoarea expresiei DandE, pentru a 40 i b 38.

Jaloare :ecimal Repre:entare pe 1 octet
D
40 00101000
E
38 00100110
DandE sau DE 32 00100000
17. Operaii pe bii 337

17.3.4. ,Sau exclusiv
Sau exclusiv este un operator binar care acioneaz asupra a doi operanzi ntregi bit cu
bit avnd ca eIect setarea bitului rezultat pe 1, dac cei doi bii nu au aceeai valoare i
pe 0 n caz contrar. Tabla de operare a operatorului sau exclusiv pe bit este:

Dxor E



Notaii: DxorE n limbajul Pascal i DAE n limbajul C



Exemplu
S se calculeze valoarea lui DxorE, pentru a 40 i b 38.

Jaloare :ecimal Repre:entare pe 1 octet
D
40 00101000
E
38 00100110
DxorE sau DAE 20 00001110

17.3.5. Rotiri pe bii
Exist doi operatori, unul pentru rotirea biilor spre dreapta, iar cellalt pentru rotirea
biilor spre stnga. Acetia sunt operatori binari, primul operand Iiind numrul ai crui
bii vor Ii rotii, iar cel de-al doilea reprezint numrul de rotaii. n locul biilor depla-
sai din margine, numrul se completeaz cu 0-uri.

Notaii: shl pentru rotire la stnga (Shift Left) i shr pentru rotire la dreapta (Shift
Right).

Exemplu
S se calculeze valoarea lui Dshr i a lui Dshl, pentru a 40.

Jaloare :ecimal Repre:entare pe 1 octet Echivalent cu


40 00101000
shr
5 00000101 5 40 div 2
3
shl
80 01010000 80 40 * 2
1

Observaii
Se observ c orice rotire (translatare) la stnga cu o poziie este echivalent cu o
nmulire a numrului cu 2 i orice rotire la dreapta cu o poziie este echivalent cu o
mprire a numrului la 2.
338 17. Operaii pe bii

17.4. nmulire cu operaii pe bii
Prezentm un algoritm care eIectueaz nmulirea a dou numere ntregi (a,b s 10000)
Ir ca n implementare s Iie nevoie de operatorul nmulire (*).

AlgoritmQPXOLUHDEUH]XOWDW
ct timp D = execut
dacbitul cel mai ain areaptaatunci
UH]XOWDWUH]XOWDWE
sfritdac
DD il vom implementa cu shl }
E>E@ il vom implementa cu shr }
sfritct timp
sfritalgoritm

n instruciunea dac se Iace reIerire la ultimul bit din primul operand. Acesta se
poate accesa simplu, eIectund operaia and ntre a i constanta 1 Ir s Iie nevoie de
utilizarea mpririi ntregi la 2. Aici 1 joac rol de masc.
O masc este un numr construit n aa Iel nct s permit testarea valorii unuia
sau a mai multor bii ai unui numr dat.
S considerm un exemplu concret i s urmrim paii algoritmului pentru a 40
i b 3.

a 40 b 3 a and 1 rezultat 120
00101000 00000011 0 0
00010100 00000110 0 0
00001010 00001100 0 0
00000101 00011000 1 00011000
2
24
00000010 00110000 0 00011000
2

00000001 01100000 1 00011000
2
01100000
2
01111000
2
120

De exemplu, s lum n considerare situaia 00101000 and 00000001 00000001,
(1
10
) sau urmtoarea: 00101000 and 00000001 00000000, (0
10
). Rezult clar c
astIel putem obine inIormaia dorit despre valoarea ultimului bit a lui a.

17.5. Implementri sugerate
Pentru a v Iamiliariza cu utilizarea operatorilor care permit prelucrarea datelor pe bii,
propunem rezolvarea urmtoarelor exerciii.
1. schimbarea semnului unui numr;
2. schimbarea valorii unui bit dintr-un numr;
17. Operaii pe bii 339

3. codiIicarea i decodiIicarea unui numr pe baza unei chei;
4. nmulirea i mprirea cu puteri ale lui 2;
5. numrarea biilor avnd valoarea 1 (sau 0) din reprezentarea unui numr n baza 2;
6. descompunerea unui numr ntreg n octetul din stnga i octetul din dreapta;
7. rotirea ciIrelor binare ale unui numr ntreg;
8. schimbarea ciIrelor binare egale cu 1 n 0 i invers;
9. generarea tuturor submulimilor mulimii 1, 2, ., N};
10. generarea tuturor irurilor care conin numai valorile 0 i 1.

17.6. Probleme propuse

17.6.1. Afiyare n baza 2
Scriei un program care citete un numr natural n i aIieaz ciIrele reprezentrii bi-
nare a numrului.

Date de intrare
Numrul natural n se citete din Iiierul NR.IN.

Date de ieyire
Numrul reprezentat n baza 2 se va scrie n Iiierul NR.OUT.

Restricii yi precizri
- 1 s n s 1000000000.

Exemplu
NR.IN

NR.OUT


17.6.2. Sum de puteri ale lui 2
S se descompun un numr natural n ca sum de puteri ale lui 2.

Date de intrare
Numrul natural n se citete din Iiierul DATE.IN.

Date de ieyire
Descompunerea numrului n ca sum de puteri ale lui 2 se va scrie n Iiierul de ieire
DATE.OUT. Operaia de ridicare la putere va Ii reprezentat prin caracterul A.

Restricii yi precizri
- 1 s n s 1000000000.
340 17. Operaii pe bii

Exemplu
DATE.IN

DATE.OUT
AA

17.6.3. Inversare
Se consider dou numere ntregi a i b. S se inverseze coninutul variabilei a cu
coninutul variabilei b Ir utilizarea unei variabile auxiliare.

Date de intrare
Cele dou numere se aIl pe prima linie a Iiierului de intrare INVERS.IN.

Date de ieyire
Cele dou numere se vor scrie, dup ce coninuturile lor s-au inversat, n Iiierul de
ieire INVERS.OUT.

Restricii yi precizri
- 0 s a, b s 1000000000.

Exemplu
INVERS.IN

INVERS.OUT


17.7. Soluiile problemelor propuse

17.7.1. Afiyare n baza 2
Pentru a aIia reprezentarea binar a numrului va trebui s testm pe rnd biii acestu-
ia. Exist mai multe modaliti de a Iace acest lucru. Prezentm n continuare dou
dintre ele:

a. Soluie care roteyte masca
Pentru a testa toi biii va trebui s repetm de 8 ori testarea (dac numrul este repre-
zentat pe 8 bii), la Iiecare pas deplasnd bitul de test cu o poziie. De data aceasta
vrem s aIim valoarea biilor, ncepnd cu bitul 0, deci masca se va iniializa cu va-
loarea:
10000000
2
2
7
128
10
.
La Iiecare pas rotim masca la dreapta cu o poziie.

Exemplu
40
10
00101000
2

17. Operaii pe bii 341

i nr masca nr and masca re:ultat afim
1 00101000 10000000 00000000 0
2 00101000 01000000 00000000 0
3 00101000 00100000 00100000 1
4 00101000 00010000 00000000 0
5 00101000 00001000 00001000 1

Pe urmtoarele trei poziii aIim 0. Deci pe parcursul executrii programului se
aIieaz: 00101000.

b. Soluie bazat pe rotirea numrului dat
n aceast abordare, n loc s se modiIice poziia bitului de test din masc se va roti
numrul dat bit cu bit, testndu-se la Iiecare pas aceeai poziie (primul bit). Rotirile i
testrile se vor repeta de attea ori ci bii are reprezentarea numrului n. CiIrele 0 din
Iaa numrului nu vor Ii aIiate.

Exemplu
Fie n 40 i masca 128 reprezentate pe 8 bii.
La Iiecare pas se rotete numrul n la stnga pentru ca urmtorul bit (bitul de pe
poziia 1) s ajung n poziia de testare.
n programul cu care implementm acest algoritm, am introdus o variabil logic
cifrsemnificativ care va primi valoarea aaevrat dup gsirea i aIiarea primei
ciIre semniIicative, astIel oIerind posibilitatea de a evita aIiarea ciIrelor egale cu 0 n
Iaa primei ciIre semniIicative.

Pas nr masca nr and masca re:ultat cifrsemnificativ afim
1 00101000 10000000 00000000 fals
2 01010000 10000000 00000000 fals
3 10100000 10000000 10000000 aaevrat 1
4 01000000 10000000 00000000 aaevrat 0
5 10000000 10000000 10000000 aaevrat 1

n urmtorii trei pai se va aIia valoarea 0.

Algoritm$ILDUH
citeteQ
PDVFD se construiete o masc pe 32 ae bii care va avea }
PDVFDPDVFDshl primul bit 1, restul biilor fiina 0}
FLIUBVHPQLILFDWLYfals


342 17. Operaii pe bii

pentru Lexecut:
dacQandPDVFD=atunci
scrie
FLIUBVHPQLILFDWLYaaevrat
altfel
dacFLIUBVHPQLILFDWLYatunci
scrie 0-urile nesemnificative nu se vor afia }
sfrit dac
QQshl rotim numrul cu o po:iie la stanga }
sfrit dac
sfrit pentru
sfrit algoritm

17.7.2. Sum de puteri ale lui 2
n mod asemntor problemei anterioare se vor testa biii numrului n, de data aceasta
ns acetia vor Ii parcuri de la dreapta spre stnga ceea ce ne va permite s pstrm
ntr-un contor (pas) rangul Iiecrui bit. Atunci cnd un bit va avea valoarea 1, contorul
va arta puterea lui 2 care corespunde acelui bit.

Exemplu
n 40
10
00101000
2

Pas n Ultimul bit Afim
0 00101000 0
1 00010100 0
2 00001010 0
3 00000101 1 2`3
4 00000010 0
5 00000001 1 2`5
6 00000000

Se observ c la Iiecare pas a Iost testat ultimul bit, ceea ce ne arat c masca va
trebui s aib ultimul bit egal cu 1, iar ceilali bii egali cu 0. Deci masca va Ii iniiali-
zat cu 1.
n algoritmul corespunztor vom Iolosi variabila boolean primul care ne va arat
dac suntem sau nu la primul termen al sumei pentru a ti dac vom aIia un sau nu.

Algoritm'HVFRPSXQHUHBGXSBSXWHULOHBOXLB
citeteQ
PDVFD
SDV
17. Operaii pe bii 343

SULPXODGHYUDW
ct timpQ=execut: cat timp mai exist bii egali cu 1 in numr }
dacQiPDVFD=atunci aac am gsit un bit egal cu 1}
dacnuSULPXOatunci
scrie
altfel
SULPXOIDOVH
sfrit dac
scrieASDV afim puterea lui 2 corespun:toare }
sfrit dac
QQrotit la areapta cu 1 po:iie trecem la urmtorul bit }
SDVSDV
sfrit ct timp
sfrit algoritm

17.7.3. Inversare
Vom Iolosi operatorul xor, care, aplicat de dou ori consecutiv i anuleaz ,aciu-
nea. Dac se aplic ntre cele dou numere ntregi date, apoi asupra rezultatului cu
primul umr i la Iel cu al doilea, coninutul celor dou variabile se inverseaz.
Fie a 10
10
i b 11
10
.

D 1 0 1 0 E 1 0 1 1 D 0 0 0 1
E 1 0 1 1 D 0 0 0 1 E 1 0 1 0
DxorE
0 0 0 1 ExorD
1 0 1 0
DxorE
1 0 1 1

Deci avem n b valoarea 10
10
, iar n a valoarea 11
10
.

Algoritm ,QYHUVDUH:
citeteDE
DDxorE
EExorD valoarea primului numr afunge in al aoilea }
DDxorE valoarea celui ae al aoilea numr afunge in primul }
scrieD
scrieE
sfrit algoritm




Recursivitate

Noiunea de recursivitate
Proiectarea unui algoritm recursiv
Execuia apelurilor recursive
Recursivitate indirect (ncruciyat)
Greyeli frecvente n scrierea programelor recursive
Cnd merit s utilizm tehnica recursivitii ?
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
18



18.1. Noiunea de recursivitate
Noiunea de recursivitate din programare deriv n mod natural din noiunea matema-
tic cunoscut sub numele de recuren. Dar i viaa de zi cu zi oIer nenumrate
exemple. Atunci cnd ne apucm de Icut temele, deschidem o carte, citim din ea, dar
la un moment dat ne trebuie o alt carte. ntrerupem studiul din prima carte i citim
din cealalt. Este posibil s avem nevoie n continuare de alte cri. Va sosi ns i
momentul cnd ne ntoarcem la ultima carte ntrerupt, continum (sau nu) s citim
din ea, apoi ne ntoarcem la precedenta i n Iinal la prima. Atunci cnd am terminat
tema, o nchidem i pe aceasta.
Prezentm n continuare cteva exemple clasice de funcii aefinite recurent. O
Iuncie este recurent dac este deIinit prin sine nsi.

Exemple
1. Definiia numerelor naturale conIorm axiomelor lui Peano:
- 1 este numr natural;
- Orice succesor al unui numr natural este un numr natural.

2. Seciunea de aur
Seciunea de aur, segmentul de aur sau proporia divin reprezint toate acelai
lucru, adic cea mai armonioas mprire, proporionare divin a Iigurilor geometrice.
nc din antichitate Seciunea ae aur era cunoscut ca Iiind soluia ecuaiei:
x
2
x 1 0.

18. Recursivitate 345

Rezolvnd ecuaia, obinem ) 1 5 (
2
1
+ = x , ceea ce nseamn aproximativ:
1.618033989.

Aceast constant este prezent n tot ceea ce este viu, cum ar Ii raportul dintre de-
get i palm, raportul dintre palm i antebra i aa mai departe, motiv pentru care a
Iost adesea Iolosit de marii artiti, de la construcia piramidelor i pn la pictura re-
nascentist. Numeroase scrieri au Iost consacrate seciunii de aur, legilor sale i parti-
ciprii sale la structurarea naturii i a artei. Sub numele de ,divine proportione o g-
sim la Luca Pacioli, prieten i colaborator al lui Leonarao aa Jinci, sub Iorm de Irac-
ie continu inIinit:
... 1
1
1
1
1
1
1
1
1
1
1
+
+
+
+
+
+ = x
Iorm numit i ,combinarea unitii cu inIinitul.

3. irul lui Fibonacci
Se consider c deIinirea irului 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... a aprut
n anul 1202, i acesta se genereaz cu Iormulele:
f
1
1, f
2
1, f
i
f
i 1
f
i 2
, pentru i ~ 2.
Acesta este datorat lui Leonarao aa Pisa, Iiul lui Bonaccio (ca urmare a Iormulrii
unei probleme privind nmulirea iepurilor).
Primul termen este 0, urmtorii doi termeni ai irului sunt 1, iar Iiecare termen de
indice mai mare dect 2 este egal cu suma ultimilor doi termeni care l preced.

Observaie
Pe msur ce irul continu, raportul dintre doi termeni consecutivi se apropie de
valoarea 1.618033989 (numrul de aur).

n continuare vom enumera cteva proprieti interesante ale termenilor irului lui
Fibonacci:
1. f
n
2
f
n

1
f
n 1
(-1)
n

2. f
n 1
f
n
f
n 2
f
n 1
(-1)
n

3. f
2
f
4
... f
2n
f
2n 1
1
4. f
1
f
3
... f
2n 1
I
2n

5. f
1
2
f
2
2
... f
n
2

f
n
f
n 1

346 18. Recursivitate

4. Fractali
Fractalii sunt Iorme geometrice, deIinite recurent prin mprirea unui segment sau a
unei supraIee n buci dup o proporie dat. Fiecare bucat a unui Iractal este o co-
pie la scar redus a ntregului.

Din punct de vedere al modelului de generare
a Iractalilor, acetia pot Ii mprii n Iractali na-
turali i Iractali artiIiciali. Fractalii naturali sunt
cei existeni n natur sau care sunt creai n urma
unor procese naturale. Norii, munii, copacii, ma-
lurile, pot Ii considerai Iractali naturali. De ase-
menea sistemul nervos i sistemul de ramiIicaie a
bronhiilor sunt exemple de Iractali naturali. n na-
tur, cel mai adesea ntlnim proporia divin ca
Iactor de proporionalitate al Iractalilor.

18.2. Proiectarea unui algoritm recursiv
n programare, vorbim despre subprogram recursiv dac acesta se autoapeleaz. AltIel
spus, n corpul subprogramului apare un apel al subprogramului nsui n timp ce aces-
ta este activ. Pentru ca apelul s nu se realizeze la inIinit este necesar existena n
subprogram a unei condiii corecte de oprire a acestor apeluri.
Un alt punct delicat n realizarea unui subprogram recursiv este descrierea modelu-
lui. Exist probleme n care putem aplica o Iormul de recuren dat, dar i probleme
n care aceast relaie trebuie determinat pe baza enunului.

Prezentm n continuare dou exemple de proiectare a unor algoritmi recursivi:
a) Dac Iormula recurent este cunoscut, algoritmul va descrie aceast Iormul.

Exemplu
Vom scrie un subprogram recursiv care calculeaz valoarea lui a
n
, unde a este un nu-
mr real, iar n este numr natural diIerit de 0.

Formula recurent de calculare a Iunciei putere este:

=
=
=

0 dac
0 dac 1
1
n a a
n
a
n
n


Aceast Iormul se poate rescrie:

=
=
=
0 dac ) 1 , (
0 dac 1
) , (
n n a Putere a
n
n a Putere

18. Recursivitate 347

O variant de subprogram recursiv care corespunde acestei descrieri este:

Subalgoritm3XWHUHDQ ae tip funcie, returnea: un numr real }
dacQatunci
3XWHUH
altfel
3XWHUHD3XWHUHDQ
sfrit dac
sfrit subalgoritm

b) Dac Iormula recurent nu este dat, aceasta trebuie s Iie dedus.



Exemplu
Vom scrie un subprogram recursiv care calculeaz cel mai mare divizor comun a
dou numere naturale a i b, conIorm algoritmului lui Euclia.

Pentru a deduce Iormula recurent de calcul a celui mai mare divizor comun prin
algoritmul lui Euclia, vom urmri eIectul algoritmului pe un exemplu.

Fie a 480 i b 220.

a : b cat rest
480 : 220 2 40
220 : 40 5 20
40 : 20 2 0

Cmmac(a, b) 20 (ultima valoare a mpritorului cnd a se divide la b).
Se observ c algoritmul se oprete atunci cnd a se divide la b. Aceast condiie o
vom Iolosi i pentru a opri auto-apelrile.
n termeni recursivi putem scrie:
cmmac(480, 220) cmmac(220, 40) cmmac(40, 20) 20.
Prin generalizare se obine:

=
=
=
0 | / | dac | / | , (
0 | / | dac
) , (
b a rest b a rest b cmmac
b a rest b
b a cmmac

Subalgoritm&PPGFDE
dacUHVW>DE@atunci
&PPGFE
altfel
&PPGF&PPGFEUHVW>DE@
sfrit dac
sfrit subalgoritm

348 18. Recursivitate



18.3. Execuia apelurilor recursive
Aa cum s-a precizat n capitolul 7 (Subprograme), orice apel de subprogram (chiar i
atunci cnd este vorba de autoapel) are ca eIect salvarea pe stiva calculatorului a adre-
sei de revenire, a valorilor parametrilor transmii prin valoare i a adresei parametrilor
transmii prin reIerin, precum i alocarea de spaiu pe stiv pentru variabilele locale
ale subprogramului.
n continuare vom simula modul n care se execut subprogramul &PPGFDE
prezentat mai sus pentru a 480 i b 220, urmrindu-se pas cu pas apelurile succesi-
ve ale subprogramului, precum i valorile existente pe stiv.


20 b La revenire
40 a n urma apelului &PPGF
&PPGF
40 b
220 a n urma apelului &PPGF
&PPGF
220 b
480 a n urma apelului &PPGF
&PPGF


18.3.1. Alte exemple
Vom scrie un algoritm care determin cel de-al n-lea termen al irului lui Fibonacci,
utiliznd n acest scop un subprogram recursiv. Implementnd acest algoritm, vom ve-
dea c nu n cazul oricrei probleme este indicat s le rezolvm recursiv. n cazul iru-
lui lui Fibonacci, subprogramul recursiv este mare consumatoare de timp, deoarece n
cazul Iiecrui termen, calculele ncep de la termenul de rang 1.

tiind c orice termen din irul lui Fibonacci se calculeaz ca suma celor doi ter-
meni care l preced, se va urmri modul de calculare al celui de-al 6-lea termen. Fie
n 6. Considerm c subprogramul recursiv poart numele Fib. n urma apelului
Fib(6), subprogramul se va autoapela pentru Fib(5) i Fib(4). S urmrim ce se
ntmpl n cazul lui Fib(5). Se va apela Fib(4) i Fib(3), apoi Fib(3) i Fib(2), n Iinal
Fib(2) i Fib(1). Valorile acestor termeni se cunosc, deci autoapelrile pe acest ,Iir se
opresc. AstIel, se poate calcula valoarea lui Fib(3). Dar pentru a-l calcula pe Fib(4),
mai nti este nevoie de Fib(2). Apoi, dup ce s-a calculat Fib(4), pentru a-l calcula pe
Fib(5) din nou este nevoie de Fib(3). nainte de a-l putea calcula pe Fib(6), din nou
este nevoie, n aIar de Fib(5) de Fib(4) care... Se observ c un acelai termen Fib(i)
se calculeaz de Ioarte multe ori.
18. Recursivitate 349


1 1
1 1 1
1
1
2
3 2
5
2
3
8 Fib(6)=
Fib(5)=
Fib(4)=
Fib(4)=
Fib(2)=
Fib(3)= Fib(2)=
Fib(2)= Fib(3)=
Fib(2)=
Fib(2)=
Fib(3)=
Fib(1)=
Fib(1) 1 Fib(1)=


Subprogramul corespunztor se poate implementa pe baza subalgoritmului:

Subalgoritm)LEQ
dacQsauQatunci
)LE
altfel
)LE)LEQ)LEQ
sfrit dac
sfrit subalgoritm

Am vzut c pentru n 6 avem 15 apeluri. Putem reduce numrul autoapelurilor,
dac valorile calculate le pstrm ntr-un vector. Fie F acest vector, deIinit ca variabil
global. Subalgoritmul s-ar rescrie astIel:

Subalgoritm)LEQ
dacQsauQatunci
)LE
)>Q@
altfel
dac)>Q@=atunci
)LE)>Q@ aeterminm )LEQ }
altfel
)LE)LEQ
dac)>Q@=atunci)LE)>Q@ aeterminm )LEQ }
altfel)LE)LEQ
sfrit dac
)LE)LE)LE
sfrit dac
sfrit dac
sfrit subalgoritm
350 18. Recursivitate

n aceast variant pentru n 6 se vor eIectua 9 apeluri. Cu ct n are o valoare mai
mare, cu att prin a doua variant se economisete un numr mai mare de calcule.
Despre subprogramul Fib(n) putem spune c are un grad mai nalt de recursivitate
dect subprogramul Cmmac(a, b). Exist i subprograme cu un grad i mai nalt de re-
cursivitate dect Fib(n), de exemplu subprogramul recursiv care ar implementa Iuncia
lui Ackermann deIinit astIel:

= =
=
= +
=
0 0 )) 1 , ( , 1 (
0 ) 1 , 1 (
0 1
) , (
n i m aac n m F m F
n aac m F
m aac n
n m F

Se observ din Iormula recurent a acestei Iuncii c n situaia n care m = 0 i n = 0
se eIectueaz autoapel n autoapel.
Cu ct un subprogram are un grad mai nalt de recursivitate, cu att crete ineIici-
ena lui. Viteza de calcul scade i se ajunge la depirea spaiului stivei pentru date de
intrare relativ mici.
O soluie de reducere a numrului de autoapeluri n aceste cazuri este construirea
unei structuri de date (tablou uni- sau bidimensional, n Iuncie de caz) n care s se
pstreze valorile deja calculate, aa cum s-a artat n exemplul prezentat mai sus.
ncheiem aceast discuie cu recomandarea de a evita alternativele recursive n re-
zolvarea problemelor n cazul crora exist variant iterativ, care s nu Iie mare con-
sumatoare de spaiu de memorie, chiar dac programele recursive sunt mai compacte.

18.4. Recursivitate indirect (ncruciyat)
n situaia n care dou sau mai multe subprograme se apeleaz reciproc se spune c
recursivitatea este inairect sau ncruciat.

Exemplu

Apel din programul principal Subprogram 1 Revenire n programul principal





Subprogram 2 Revenire n programul principal




Subprogram 3 Revenire n programul principal

18. Recursivitate 351

Observaie
Este absolut necesar s se asigure ieirea din recursivitate. Pentru aceasta va exista
o condiie de ieire cel puin ntr-unul dintre subprograme.

Exemplu
Prezentm n continuare un program demonstrativ care exempliIic utilizarea teh-
nicii recursivitii ncruciate ntr-un program care simuleaz un cronometru care poa-
te Iunciona att cresctor, ct i descresctor.
Folosim dou proceduri, una care crete valoarea cronometrului, iar cealalt care
scade valoarea de aIiat. Tasta spaiu o vom Iolosi pentru a comuta de la un stil de cro-
nometrare la altul.
Algoritmul se oprete cnd cronometrul ajunge la 120 sau 120, aceast valoare
Iiind aleas arbitrar.

Exemplul ales este unul dintre cele mai simple, rezolvarea bazndu-se pe apelurile
reciproce a dou proceduri. Una care crete valoarea contorului, cealalt scade valoa-
rea aceluiai contor.
Dup cum se poate observa din algoritmul urmtor, subalgoritmii se apeleaz unul
pe cellalt, atunci cnd se apas tasta spaiu.
Algoritmul va Ii prezentat implementat n limbajul Pascal, Iolosind cteva subpro-
grame predeIinite din unit-ul Crt.

procedure'HVFUHVWHvarQU,QWHJHUforward
prin cuvantul IRUZDUG se anun compilatorul aespre faptul c 'HVFUHVWH }
este o proceaur care se va ae:volta ulterior }

procedure&UHVWHvarQU,QWHJHU
begin
&OU6FU tergem ecranul }
*RWR[\ se po:iionea: cursorul pe ecran in veaerea scrierii }
:ULWHQU se afiea: contorul curent }
if$EVQU!then
aac nu schimbm airecia timpul crete, altfel aescrete }
if5HDG.H\!thenbegin
,QFQU
&UHVWHQU
endelsebegin
'HFQU
'HVFUHVWHQU
end
end


352 18. Recursivitate

procedure'HVFUHVWHvarQU,QWHJHU
begin
&OU6FU
*RWR[\
:ULWHQU
if$EVQU!then
if 5HDG.H\!then begin
'HFQU
'HVFUHVWHQU
endelse begin
,QFQU
&UHVWHQU
end
end

Begin
QU se pornete ae la valoarea 1 a contorului }
&UHVWHQU ... i la inceput crete contorul }
End

18.5. Greyeli frecvente n scrierea programelor recursive
- O condiie de ieire incorect din recursivitate va duce cel mai adesea la depirea
capacitii de memorare a stivei, caz n care programul se oprete aIind mesajul:
6WDFNRYHUIORZ.
- Un autoapel incorect Iormulat duce la un rezultat incorect sau la umplerea stivei.
- n cazul n care se declar parametri Iormali transmii prin valoare i/sau variabile
locale de tipuri care ocup mult spaiu de memorie, stiva calculatorului se va umple
extrem de repede, ajungndu-se la depirea spaiului rezervat acestuia chiar i
pentru un numr mic de autoapeluri.

18.6. Cnd merit s utilizm tehnica recursivitii ?
Atunci cnd algoritmul care urmeaz s Iie implementat descrie o noiune recurent
sau algoritmul n sine este recursiv, se va lua n considerare oportunitatea descrierii
acestuia utiliznd tehnica recursivitii. Se pune ns problema optimalitii variantei
recursive a algoritmului. Dac acelai algoritm se poate realiza relativ simplu, utili-
znd tehnica iterativ (Iolosind structuri repetitive n locul apelului recursiv), atunci se
preIer varianta iterativ datorit Iaptului c astIel se vor realiza programe mai rapide.
Se evit astIel operaiile mult prea dese de salvare pe stiva calculatorului, precum i
ncrcarea acesteia n cazul apelurilor repetate. De asemenea, depanarea programelor
recursive este mai anevoioas dect a celor iterative.

18. Recursivitate 353

Principalul avantaj al utilizrii tehnicii recursive este c permite o descriere concis
a algoritmului, oglindind perIect deIiniia recurent a respectivei noiuni. Textul surs
al unui astIel de algoritm este, de regul, mult mai scurt i mai clar dect alte variante
de algoritmi. Acest mod de scriere permite o divizare uoar a problemei n subproble-
me de acelai tip.

18.7. Implementri sugerate
Pentru a v Iamiliariza cu implementarea subprogramelor recursive, v recomandm
s realizai urmtoarele exerciii:
1. inversarea ciIrelor din conIiguraia unui numr dat (Ir string-uri);
2. inversarea numerelor dintr-un ir dat (Ir tablouri);
3. calculul recursiv al Iactorialului;
4. descompunerea recursiv al unui numr dat n Iactori primi;
5. calculul recursiv al termenilor unui ir pe baza unei relaii de recurene;
6. generarea submulimilor mulimii 1, 2, ., n};
7. determinarea obiectelor din care se compune o IotograIie.

18.8. Probleme propuse

18.8.1. Cifra maxim
Scriei un program care citete un numr natural i determin cel mai mic rang al ciIrei
maxime din numr, utiliznd un subprogram recursiv.

Date de intrare
Valoarea numrului natural se citete din Iiierul CIFRA.IN.

Date de ieyire
CiIra maxim i rangul ei, separate de un spaiu, vor Ii scrise n Iiierul CIFRA.OUT.

Restricii yi precizri
- 1 s numrul aat s 1000000000.

Exemplu
CIFRA.IN

CIFRA.OUT




354 18. Recursivitate

18.8.2. Numr maxim
Scriei un program care citete un numr natural n i un numr de ciIre k (mai mic
dect numrul de ciIre ale numrului n) i determin numrul maxim care se poate
obine din n prin eliminarea a k ciIre. CiIrele numrului rezultat i vor pstra ordinea
n numr.

Date de intrare
Cele dou numere naturale se vor citi din Iiierul MAXIM.IN.

Date de ieyire
Numrul obinut prin eliminarea celor k ciIre se va scrie n Iiierul MAXIM.OUT.

Restricii yi precizri
- numrul natural n poate avea cel mult 255 de ciIre;
- 1 s k s numrul ae cifre ale numrului dat n 1.

Exemplu
MAXIM.IN

MAXIM.OUT


18.8.3. Sum de numere Fibonacci
Scriei un program care descompune un numr natural n ca sum de numr minim de
numere Fibonacci, utiliznd pentru aceasta un subprogram recursiv.

Date de intrare
Numrul natural n se va citi din Iiierul SUMA.IN.

Date de ieyire
n Iiierul de ieire SUMA.OUT se va scrie numrul dat urmat de semnul i de
termenii sumei de numere Fibonacci.

Restricii yi precizri
- 1 s n s 1000000.

Exemplu
SUMA.IN

SUMA.OUT




18. Recursivitate 355

18.8.4. La cules
Un Iermier are o livad dreptunghiular i dorete s culeag Iructele ct mai uor. Un
vecin binevoitor se oIer s-l ajute cu un camion, dar are doar o singur zi la dispozi-
ie, ceea ce nseamn c poate Iace o singur parcurgere a livezii. Livada se aIl n
pant i maina poate s se deplaseze numai spre dreapta i n jos. Camionul intr n
livad n colul stnga-sus al caroiajului corespunztor livezii i va iei n colul din
dreapta-jos.
Cunoscnd cele dou dimensiuni ale livezii i numrul de mere din Iiecare pom, s
se gseasc un drum optim posibil pentru camion, astIel nct pn la ieirea din liva-
d s Iie culese ct mai multe mere.

Intrare 33 70 25 90


20 50 40 32


70 55 80 43


22 27 40 21


80 45 78 43 Ieyire

Date de intrare
Cele dou numere naturale (m i n), reprezentnd dimensiunile livezii, se citesc de pe
prima linie a Iiierului LIVADA.IN. De pe urmtoarele m linii ale aceluiai Iiier se
vor citi cte n numere naturale, desprite prin cte un spaiu, reprezentnd numrul de
mere din Iiecare pom al rndului respectiv din livad.

Date de ieyire
n Iiierul LIVADA.OUT se va scrie un ir de caractere ' i -, unde ' are sem-
niIicaia dreapta, iar - nseamn direcie de deplasare n jos, litere care corespund
deplasrilor succesive pe care le va avea camionul pe drumul optim gsit.

Restricii yi precizri
- 1 s m, n s 100.

Exemplu
LIVADA.IN


LIVADA.OUT
'--'--'

356 18. Recursivitate

18.8.5. Numere romane
Scriei un program care aIieaz un numr dat n sistemul de numeraie zecimal (cu
ciIre arabe), n sistem de numeraie roman, utiliznd un subprogram recursiv.

Date de intrare
Numrul natural dat cu ciIre arabe se va citi din Iiierul de intrare ROMAN.IN.

Date de ieyire
irul de caractere reprezentnd numrul roman se va scrie n Iiierul ROMAN.OUT.

Restricii yi precizri
- 1 s numrul aat s 3999

Exemplu
ROMAN.IN

ROMAN.OUT
&0;&9

18.9. Soluiile problemelor propuse

18.9.1. Cifr maxim
Prezentm aceast problem ca exerciiu de scriere a unui subprogram recursiv (rezol-
varea iterativ (utiliznd un ciclu ct timp) este mai simpl i mai rapid).

Am putea determina nti ciIra maxim din numr i apoi prima poziie pe care
aceasta apare. Dar aceste dou obiective pot Ii atinse printr-o singur parcurgere a
ciIrelor numrului.

Ideea de realizare recursiv ar suna astIel: dac avem mai mult de o ciIr n numr,
ciIra maxim va Ii cea mai mare ciIr dintre ultima ciIr a numrului curent i ciIra
maxim a numrului din care am eliminat ultima ciIr. Dac numrul curent are o ci-
Ir, aceasta este ciIra maxim.

Prezentm n continuare o schem de aplicare a acestui algoritm recursiv pentru
numrul 231868.
18. Recursivitate 357

Apeluri recursive Revenirea din apeluri

numrul curent

nr

i

vmax
cifra
maxim

imax
po:iia
cifrei
231868

23186 8 0 8 0

2318 6 1 8 2

231 8 2 8 2

23 1 3 3 3

2 1 4 2 5

2 5 2 5

Subalgoritmul trebuie s determine dou valori, motiv pentru care acesta va Ii de
tip procedur i aceste valori vor Ii parametri transmii prin reIerin. Pseudocudul de
mai jos reprezint algoritmul sugerat. Avem urmtoarele semniIicaii ale variabilelor:
nr este numrul dat;
i pstreaz rangul ciIrei curente;
vmax conine valoarea ciIrei maxime (pn n prezent);
imax pstreaz rangul ciIrei vmax.

Subalgoritm&LIUDBPD[LPQULLPD[YPD[
dacQU!atunci aac numrul are mai multe cifre }
se apelea: recursiv aeterminarea cifrei maxime ain restul cifrelor numrului }
&LIUDBPD[LP>QU@LLPD[YPD[
dacUHVW>QU@!YPD[atunci aac ultima cifr a numrului este }
mai mare aecat cifra maxim ae pan acum }
YPD[UHVW>QU@ se pstrea: cifra }
LPD[L i rangul }
sfrit dac
altfel cana am afuns la cifra ae rang maxim }
YPD[QU se iniiali:ea: cifra maxim }
LPD[L i rangul cifrei maxime }
sfrit dac
sfrit dac
sfrit subalgoritm
358 18. Recursivitate

Observaie
Algoritmul se poate ncheia mai repede n cazul n care se gsete o ciIr 9, deoare-
ce nu mai poate exista alta mai mare dect ea.

18.9.2. Numr maxim
S presupunem c numerele citite sunt 43881796 i 5. Numrul de ciIre ale rezultatu-
lui va Ii egal cu numrul ciIrelor numrului dat minus numrul de ciIre care trebuie
eliminat, deci 8 5 3.
n algoritmul propus vom determina la Iiecare pas cte o ciIr din rezultat.

Pasul 1:
La primul pas se determin prima ciIr (cea de rang maxim) a rezultatului. Aceast
ciIr se alege dintre ciIrele numrului dat, exceptnd ultimele dou ciIre (acestea nu au
cum s Iie pe prima poziie a unui numr de trei ciIre, deoarece trebuie pstrat ordi-
nea ciIrelor n numrul dat). n exemplul considerat, ciIra maxim a numrului 438817
este 8, ciIr pe care o punem n rezultat.
Pentru a pregti pasul urmtor vom terge din numrul iniial toate ciIrele de la n-
ceput i pn inclusiv la prima apariie a ciIrei determinate (ciIrele 4, 3 i 8), deoarece
acestea nu mai pot Iace parte din numrul rezultat. Numrul rmas este 81796.

Pasul 2:
La pasul doi se determin a doua ciIr a rezultatului urmrind acelai algoritm.
Vom cuta ciIra maxim din numrul 8179 (lsnd la o parte 1 ciIr de la sIrit,
deoarece, dac am lua-o i pe aceasta n considerare s-ar putea ntmpla s-o aleag i
dup eliminarea ei, respectiv a ciIrelor care o preced nu am mai avea ciIr pentru a
completa rezultatul conIorm cerinei). Se gsete ciIra 9 care se adaug la rezultat i se
renun din nou la ciIrele care nu pot aprea la pasul urmtor, deoarece sunt anterioare
ciIrei gsite. Se terge secvena 8179 (pn la prima apariie a ciIrei maxime inclusiv)
din numr.
Numrul rmas acum este 6.

Pasul 3:
La pasul trei ciIra cutat este 6, iar numrul rmas dup eliminarea lui 6 este 0.
Numrul maxim cutat este deci 896.

n subalgoritmul recursiv corespunztor acestui algoritm avem urmtoarele semni-


Iicaii ale variabilelor:
nr este numrul dat (sub Iorm de ir de caractere);
cate pstreaz numrul ciIrelor rmase de ales petru re:ultat;
re:ultat este numrul care se caut;
p ine evidena numrului ciIrelor care se pot alege.
18. Recursivitate 359

Subalgoritm&RQVWUXLHWHQUSUH]XOWDW
dacS!atunci
PD[ consiaerm prima cifr ca fiina maxim }
pentruLlungimea numrului QUSexecut:
se aetermin cifra maxim ae pe po:iiile ,permise` }
dacQU>L@!QU>PD[@atunci
PD[L
sfrit dac
sfrit pentru
UH]XOWDWUH]XOWDWQU>PD[@ se pstrea: cifra gsit }
se terg cifrele care nu mai pot face parte ain re:ultat
aeterminm urmtoarea cifr a soluiei }
&RQVWUXLHWHQUSUH]XOWDW
sfrit dac
sfrit subalgoritm

18.9.3. Sum de numere Fibonacci
Soluia prezentat n continuare determin cel mai apropiat numr Fibonacci de num-
rul dat, dup care algoritmul repet recursiv aceeai aciune pentru diIerena dintre nu-
mrul dat i numrul Fibonacci gsit.
n varianta recursiv a algoritmului de rezolvare vom iniializa n prealabil elemen-
tele irului lui Fibonacci pn la cel mai apropiat numr de numrul dat. AstIel vom
evita recalcularea repetat a unor termeni din irul lui Fibonacci, ceea ce ar ncetini
execuia programului.

Subalgoritm,QLLDOL]DUHQUL
generm i termeni ai irului lui Fibonacci, ultimul termen generat este }
cel mai apropiat numr Fibonacci mai mic sau egal cu numrul aat }
ILE>@
ILE>@
L
ct timpILE>L@QUexecut
LL
ILE>L@ILE>L@ILE>L@
sfrit ct timp
QL
sfrit subalgoritm

Un alt subprogram util n rezolvarea problemei este cel care determin indicele din
irul Fibonacci care corespunde unui numr Fibonacci dat.


360 18. Recursivitate

Subalgoritm&DXWQU
returnea: po:iia pe care apare numrul QU in irul Fibonacci }
ct timpILE>Q@!QUexecut:
QQ
sfrit ct timp
&DXWQ
sfrit subalgoritm

Cu aceste precizri preliminarii, subprogramul recursiv propus pentru aIiarea des-
compunerii unui numr n sum de numere Fibonacci este:

Subalgoritm5HFXUVLYQU
N&DXWQU se aetermin inaicele acelui numr Fibonacci }
scrieILE>N@ care este cel mai apropiat ae numrul QU }
dacQU=ILE>N@atunci
scrie
5HFXUVLYQUILE>N@
sfrit dac
sfrit subalgoritm

n programul principal sunt descrise urmtoarele aciuni:
se citete numrul dat;
se apeleaz iniializarea care determin i indicele celui mai apropiat numr Fibo-
nacci mai mic sau egal cu numrul dat;
se aIieaz numrul dat urmat de semnul ;
se apeleaz subprogramul recursiv, pornind de la cel mai mare numr Fibonacci
din descompunerea numrului dat.

18.9.4. La cules
Rezolvarea acestei probleme nseamn gsirea rspunsului la dou cerine:
a. determinarea numrului maxim de mere care pot Ii culese printr-o parcurgere
conIorm enunului;
b. determinarea drumului care a condus la soluia optim.

a. innd cont de Iaptul c deplasarea se poate Iace doar pe dou direcii, numrul ma-
xim de mere care pot Ii culese se poate determina pn n orice punct al livezii. Aceste
inIormaii se vor construi pas cu pas i se vor stoca ntr-un tablou bidimensional b.
Primul element al tabloului b va Ii b|1,1| care va Ii iniializat cu numrul de mere
ale primului pom (a|1,1|) aIlat pe direcia de pornire. n continuare vom putea com-
pleta prima linie (dac pstrm direcia de pornire pn la captul livezii) i prima co-
loan a tabloului bidimensional dac se urmeaz direcia n jos. S urmrim aceti pai
pe exemplul dat n enun:
18. Recursivitate 361


Construirea liniei 1:

33 33 70 103 103 25 128 128 50 218
.

Secvena n pseudocod corespunztoare acestor aciuni este:
crearea primei linii }
E>@D>@
pentruMQexecut: se aaun la numrul maxim ae mere ae pe po:iia }
anterioar numrul ae mere ain pomul curent }
E>M@E>M@D>M@
sfrit pentru
...

Construirea coloanei 1:

33 103 128 218
33 20 53
53 70 123
123 22 145
145 80 225

Algoritmul este similar celui de mai sus:
crearea primei coloane }
pentruLPexecut: se aaun la numrul maxim }
E>L@E>L@D>L@ ae mere ae pe po:iia ae aeasupra po:iiei }
sfrit pentru curente numrul ae mere ain pomul curent }


Din acest moment se poate ncepe completarea restului tabloului pe linii (ncepnd
cu linia 2) sau pe coloane (ncepnd cu coloana 2), calcularea valorii Iiecrui element
(neaprat n ordine) se va Iace prin alegerea numrului maxim de pomi ntre valoarea
de deasupra i cea din stnga (care sunt deja calculate) plus numrul de mere din po-
mul la care ne aIlm.
De exemplu:
b|2,2| maxim103, 53} a|2,2| 103 50 153
b|2,3| maxim153, 128} a|2,3| 153 40 193
362 18. Recursivitate

i aa mai departe, pn cnd s-au calculat toate elementele tabloului bidimensional b.
Valoarea din colul dreapta jos (b|m, n|) va Ii egal cu numrul maxim de mere
care pot Ii culese la o parcurgere a livezii.

33 103 128 218
53 103 50 153 15340193 21832250
123 153 55 208 208 80 288 288 43 321
145 208 27 235 288 40 328 328 21 349
225 235 45 280 328 78 406 406 34 440

Algoritmul cu care calculm aceast valoare este:

completarea tabloului pe celelalte linii i coloane }


pentruLPexecut:
pentruMQexecut:
dacE>LM@!E>LM@atunci
E>LM@E>LM@D>LM@
altfel
E>LM@E>LM@D>LM@
sfrit dac
sfrit pentru
sfrit pentru
...

b. n Iaza a doua trebuie s ne ntoarcem, pornind de la elementul b|m, n| pe drumul
pe care s-a obinut aceast valoare maxim.
Acest proces de ,regsire a drumului este cel mai adesea descris prin tehnic re-
cursiv.
Modalitatea de regsire a drumului pe care a Iost determinat valoarea maxim se
poate intui din tabelul anterior. Se pornete de la elementul b|m, n| i se veriIic dac
la acea valoare am ajuns de la elementul de deasupra sau de la elementul din stnga sa.
Calculm 440 406 34 i 440 349 91. Deoarece a|m, n| 34, se trage concluzia
c am ajuns n b|m, n| din b|m, n 1|. n vectorul rezultat, introducem caracterul '
(deoarece am avansat n aceast poziie mergnd spre dreapta).
n mod similar se reIace tot drumul. Restul caracterelor le alipim mereu n Iaa i-
rului rezultat corespunztor unui pas care pe drum este mai aproape de punctul de
start.
n cazul subprogramelor recursive este esenial s se determine corect condiia de
oprire i Iormula recurent dup care se Iace autoapelul. n cazul de Ia ne vom opri
atunci cnd am ajuns la elementul de indice (1,1). Observm c ntotdeauna se va ajunge
n aceast poziie a tabloului, deoarece acesta a Iost punctul de plecare n prima parte a
algoritmului. Acum se reIace drumul optim pe care s-a ajuns din b|1,1| n b|m, n|.
18. Recursivitate 363

Observaie
n algoritmul descris am aplicat metoda programrii dinamice
*)
. Se observ cele
dou Iaze ale algoritmului, speciIice acestei metode au Iost:
1) Construirea soluiei optime;
2) ReIacerea drumului pe care a Iost obinut aceast soluie.

Subalgoritmul recursiv care regsete drumul pe care a Iost construit soluia opti-
m este:

Subalgoritm'UXPXOBRSWLPLMUH]XOWDW
dacL=or M=atunci
dacE>LM@E>LM@D>LM@atunci
UH]XOWDW'UH]XOWDW
'UXPXOBRSWLPLMUH]XOWDW
sfrit dac
altfel
dacE>LM@E>LM@D>LM@atunci
UH]XOWDW-UH]XOWDW
'UXPXOBRSWLPLMUH]XOWDW
sfrit dac
sfrit dac
sfrit subalgoritm

18.9.5. Numere romane


Dup cum se tie, exist dou metode de scriere a unui numr n sistemul de numeraie
roman: una aditiv i una prin diIeren, ambele metode avnd totui limitri de apli-
care.
n varianta aditiv, de exemplu, nu putem scrie mai mult de trei litere consecutive
identice. Varianta prin diIeren a aprut pentru a prescurta numerele care altIel erau
mult prea lungi. Pentru ca scrierea s Iie totui unic s-au emis urmtoarele reguli:
1. Numai ciIrele I, X, i C pot Ii sczute.
2. Doar valoarea unei singure ciIre poate Ii sczut (nu se permite scderea unui grup
de litere).
3. Numrul care se scade trebuie s aib o valoare mai mare sau egal cu o zecime din
desczut.

Exemplu
n 449, CDXLIX CD 500 100 400 apoi XL 50 10 40 i IX 10 1 9.
Deci, n total: 400 40 9 449
Deosebim urmtoarele situaii:

*)
Metoda programrii dinamice se va studia n clasa a X-a.
364 18. Recursivitate

1. Dac ciIra de reprezentat este 1, 10, 100 sau 1000, se Iolosete varianta aditiv i
alipim simbolurile I, X, i C sau M.
2. Dac valoarea ciIrei de reprezentat ncepe cu 5, 6, 7, sau 8, se Iolosete tot varian-
ta aditiv, prin alipirea simbolurilor V, L sau D i dup caz, cu alipirea suplimen-
tar a simbolurilor I, X, sau C n numrul corespunztor.
3. Dac valoarea ciIrei de reprezentat ncepe cu 4 se Iolosete varianta prin diIeren
Ia de simbolul V, L sau D.
4. Dac valoarea ciIrei de reprezentat ncepe cu 9, se Iolosete varianta prin diIeren
Ia de simbolul X, C sau M.

n variantele prin diIeren Iormula de calcul diIer n Iuncie de modul n care se
ndeplinesc condiiile 1 i 3. De exemplu, numrul 9 se calculeaz ca diIeren ntre 10
i 1, deoarece 1 este egal cu o zecime din 10. Reprezentarea roman a numrului este
IX. Numrul 99 nu se poate calcula ca diIeren ntre 100 i 1 (cum am Ii ndreptii
s sperm) pentru c 1 este mai puin de o zecime din 100. n acest caz aplicm cealal-
t variant n care exprimm 90 ca diIeren ntre 100 i 10 (ceea ce este permis) ur-
mnd s relum algoritmul pentru diIerena rmas: 100 90 9. n Iinal, numrul n
reprezentarea roman este XCIX.

Am ales s descriem acest algoritm n varianta recursiv, deoarece modalitatea
practic de rezolvare a acestei probleme este deIinit recurent: se determin o liter ro-
man, dup care algoritmul se aplic identic i pentru numrul rmas.

n varianta urmtoare Iolosim dou constante de tip vector, una coninnd valorile
corespunztoare ciIrelor romane, iar cealalt coninnd chiar literele Iolosite n scrie-
rea roman. Este de neles c pentru orice indice, valoarea din primul vector va cores-
punde literei din cel de-al doilea vector astIel:

const /LW0'&/;9, vector ae caractere }
Y vector ae numere }

Elementul de indice 0 are o valoare nesemniIicativ, pentru simplitatea rezolvrii.

Determinarea ordinului de mrime a ciIrei romane corespunznd unui numr dat se
realizeaz n urmtorul subalgoritm:

Subalgoritm$GXFHUDQJXOQXPU
7 este orainul ae mrime maxim corespunae literei I avana valoarea 1 }
UDQJXO
ct timpY>UDQJXO@sQXPUexecut:
UDQJXOUDQJXO
sfrit ct timp
18. Recursivitate 365

dacSULPDBFLIUBDUDEQXPUatunci
UDQJXOUDQJXO
sfrit dac
sfrit subalgoritm

Pentru numerele care ncep cu ciIra 9 se eIectueaz o corecie, astIel rangul returnat
va corespunde simbolurilor de sczut I, X sau C dup caz (n loc de V, L sau D).

Urmtorul subalgoritm recursiv determin numrul roman; cu p am notat un ir de
caractere n care am alipit literele identice atunci cnd acestea trebuie s se repete.

Subalgoritm15QXPU
dacQXPUatunci
15
altfel
$GXFHUDQJXOQXPU
3ULPDBFLIU>QXPUY>UDQJXO@@
variant aaitiv care folosete literele I, X, C sau M }
dacSULPDBFLIUeste 0, 1, 2 sau 3 atunci
S
pentruLSULPDBFLIUexecut:
SS/LW>UDQJXO@
sfrit pentru
15S15QXPUSULPDBFLIUY>UDQJXO@
sfrit dac
variant aaitiv in care cifra curent se scrie folosina litera V, L, sau D }
dacSULPDBFLIUDeste 5, 6, 7 sau 8atunci
S
pentruLSULPDBFLIUexecut:
SS/LW>UDQJXO@
sfrit pentru
15/LW>UDQJXO@S15QXPUSULPDBFLIUY>UDQJXO@
sfritdac
varianta prin aiferen }
dacSULPDBFLIU este 4 atunci
dacY>UDQJXO@QXPUe^`i
Y>UDQJXO@QXPU>>Y>UDQJXO@@atunci
QU15Y>UDQJXO@QXPU/LW>UDQJXO@
altfel
QU/LW>UDQJXO@/LW>UDQJXO@
15QXPUSULPDBFLIUDBURPDQDY>UDQJXO@
sfrit dac
sfrit dac
366 18. Recursivitate

dacSULPDBFLIU este 9 atunci
dacY>UDQJXO@QXPUe^`i
Y>UDQJXO@QXPU>>Y>UDQJXO@@atunci
QU15Y>UDQJXO@QXPU/LW>UDQJXO@
altfel
QU/LW>UDQJXO@/LW>UDQJXO@
15QXPUSULPDBFLIUDY>UDQJXO@
sfrit dac
sfrit dac
sfrit dac
sfrit subalgoritm

n ncheiere, ,nu putem rezista tentaiei i v prezentm i o alternativ iterativ
pentru rezolvarea acestei probleme. Cu arab am notat numrul arab, cu roman, num-
rul roman. n subalgoritmul 3DUWHURPDQURPDQDUDESDUWHDUDEUUU se
caut pri din numrul arab aparinnd anumitor intervale. Acestea se scad din num-
rul arab i n numrul roman se alipesc literele corespunztoare. SDUWHDUDE poate fi
1000, 100 sau 10, iar caracterele U, U, U au valori corespunztoare ordinului de
mrime a lui SDUWHDUDE: 1000: 0, ', &, 100: &, /, ;, 10: ;, 9, ,.

Subalgoritm3DUWHURPDQURPDQDUDESDUWHDUDEUUU
ct timp DUDE>SDUWHDUDEexecut:
URPDQURPDQU
DUDEDUDESDUWHDUDE
sfrit ct timp
dacDUDE>>SDUWHDUDE@atunci
URPDQURPDQUU
DUDEDUDE>SDUWHDUDE@
altfel
dac DUDE>>SDUWHDUDE@atunci
URPDQURPDQU
DUDEDUDE>SDUWHDUDE@
altfel
dac DUDE!>SDUWHDUDE@atunci
URPDQURPDQUU
DUDEDUDE>SDUWHDUDE@
sfrit dac
sfrit dac
sfrit dac
sfrit subalgoritm

Acest subalgoritm se apeleaz de trei ori din programul principal, apoi, n cazul n
care mai exist valori diIerite de 0 n numrul arab, acestea se scriu cu ciIre I.
18. Recursivitate 367

...
URPDQ
3DUWHURPDQURPDQDUDE0'&
3DUWHURPDQURPDQDUDE&/;
3DUWHURPDQURPDQDUDE;9,
ct timpDUDE!execut: ceea ce a rmas ain arab, se scrie cu cifre I }
URPDQURPDQ,
DUDEDUDE
sfrit ct timp
..




Metoda backtracking

Backtracking iterativ
Backtracking recursiv
Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
19



Metoda backtracking este o metod de programare cu ajutorul creia se rezolv pro-
blemele n care:
- soluia se poate reprezenta sub Iorma unui tablou X (x
1
, x
2
, ., x
n
) cu x
1
e M
1
,
x
2
e M
2
etc. M
1
, M
2
, ..., M
n
Iiind mulimi Iinite avnd s
1
, s
2
, ..., s
n
elemente.
- ntre elementele tabloului X exist anumite legturi impuse n enun.

Condiii interne
n Iiecare problem sunt date anumite relaii care trebuie s existe ntre componen-
tele x
1
, x
2
, ..., x
n
ale vectorului X, numite conaiii interne.

Spaiul soluiilor posibile
Mulimea M
1
M
2
... M
n
se numete spaiul soluiilor posibile.

Condiii de continuare
Dac la pasul k, condiiile interne sunt satisIcute, algoritmul se continu n Iuncie
de cerine. Dac mai trebuie cutate componente, deoarece numrul lor se cunoate i
nc nu le-am obinut pe toate, sau componentele nc nu constituie o soluie pe baza
unor proprieti, condiiile de continuare vor permite continuarea algoritmului.

Soluii rezultat
Acele soluii dintre soluiile posibile care satisIac condiiile impuse de problem
(condiiile interne i condiiile de continuare nu cer componente n plus) se numesc
soluii re:ultat.
O metod de rezolvare a acestei categorii de probleme ar Ii determinarea tuturor
soluiilor posibile i apoi cutarea acelora care satisIac condiiile interne. Dezavantajul
este uor de observat deoarece timpul cerut de aceast cutare este Ioarte mare.
19. Metoaa backtracking 369

Modul de lucru al metodei backtracking
- Elementele din tabloul X primesc pe rana valori, adic lui x
k
i se atribuie o valoare
numai dac au Iost deja atribuite valori elementelor x
1
, x
2
, ..., x
k 1
.
- n plus, lui x
k
i se atribuie o valoare numai dac pentru valorile x
1
, x
2
, ..., x
k 1
i va-
loarea propus pentru x
k
sunt ndeplinite condiiile interne i cele de continuare im-
puse de problem. (n cazul n care aceste condiii nu sunt ndeplinite, oricum am
alege urmtorii termeni x
k 1
, ..., x
n
, nu vom ajunge la o soluie n care condiiile in-
terne s Iie satisIcute.)
- Dac la pasul k condiiile de continuare nu sunt ndeplinite trebuie s se Iac o alt
alegere pentru x
k
din mulimea M
k
.
- Dac mulimea M
k
a Iost epuizat (s-au testat toate valorile din mulime) se aecre-
mentea: k i se ncearc o alt alegere pentru x
k 1
din

mulimea M
k 1
.

Observaii
Acestei decrementri a lui k i se datoreaz numele metodei, exprimnd Iaptul c
atunci cnd nu putem avansa, se avanseaz in sens invers (napoi) n secvena cu-
rent a soluiei.
ntre condiiile interne i cele de continuare exist o strns legtur. O bun alege-
re a condiiilor de continuare are ca eIect reducerea numrului de calcule.

19.1. Backtracking iterativ
Condiiile interne vor Ii veriIicate n subalgoritmul 3RVLELON. Acesta returneaz
aaevrat dac adugarea componentei x
k
a irului soluie este posibil i fals n caz
contrar.

Subalgoritm 3RVLELON
dacconaiiile interne nu sunt inaeplinite atunci
3RVLELOfals
ieire forat
sfrit dac
3RVLELOaaevrat
sfrit subalgoritm

Generarea soluiilor se realizeaz cu subalgoritmul %DFN.

Subalgoritm %DFN
N
[>N@
ct timpN!execut:
RNfals
370 19. Metoaa backtracking

ct timp[>N@valoare maxim permisinuRNexecut:
mai sunt valori netestate in mulime, aeci lui [>N@ i se atribuie o alt valoare }
[>N@[>N@
RN3RVLELON poate am gsit valoare posibil pentru [>N@ }
sfrit ct timp
dacnuRNatunci
aac nu, se aecrementea: N pentru a alege o valoare nou pentru aceasta }
NN
altfel aac am afuns la sfaritul generrii }
dacNnumrul ae elemente cerut atunci sau alt conaiie }
scrie soluia
altfel
NN trecem la urmtorul element ain soluie }
[>N@ iniiali:m noul element ain tabloul soluie }
sfrit dac
sfrit dac
sfrit ct timp
sfrit subalgoritm

19.2. Backtracking recursiv
Algoritmul poate Ii implementat i recursiv (Iuncia 3RVLELON are Iorma prezen-
tat):

Subalgoritm %DFNN
pentruLvaloarea maxim impus ae problem execut:
[>N@L
dac3RVLELONatunci
aac am afuns la sfaritul generrii }
dacNnumrul ae elemente cerut atunci
sau alt conaiie ae continuare }
scrie soluia(N)
altfel
%DFNN
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

Dac n condiia de continuare expresia este Iormat din subexpresii logice
(relaionale) i condiia nu este ndeplinit, pe ramura altfel va trebui s decidem
motivul pentru care condiia nu este ndeplinit. Dac de exemplu, numrul de ele-
19. Metoaa backtracking 371

mente cerut s-a atins, dar din alte motive soluia obinut nu este corect i deci nu se
scrie, atunci evident, nu apelm subalgoritmul %DFN pentru valoarea k 1, ci vom iei
din subprogram, asigurnd totodat revenirea la pasul precedent i cutarea unei valori
noi pentru k 1.

Observaie
Algoritmii de rezolvare a problemelor cu metoda backtracking, n principiu, vor
respecta Iorma general de mai sus, dar de Iiecare dat vom cuta posibilitile de op-
timizare i implementri ct mai sugestive. Un caz special l reprezint acele probleme
n care soluia se compune din dou (sau mai multe) iruri care descriu, de exemplu,
coordonate n plan.

19.3. Implementri sugerate
Pentru a v Iamiliariza cu analiza problemelor care se rezolv cu metoda backtracking,
precum cu implementarea programelor de rezolvare, v recomandm s ncercai s
rezolvai urmtoarele probleme:
1. generarea tuturor permutrilor irului de numere 1, 2, ..., n;
2. aezarea a 8 regine pe tabla de ah, Ir ca acestea s se atace;
3. generarea produsului scalar a dou mulimi;
4. generarea tuturor aranjamentelor de n luate cte m;
5. generarea tuturor perechilor de paranteze care se nchid corect;
6. generarea tuturor Iunciilor injective cunoscnd mulimea de argumente i cea a
valorilor Iunciilor;
7. generarea tuturor Iunciilor surjective cunoscnd mulimea de argumente i cea a
valorilor Iunciilor;
8. generarea tuturor partiiilor unui numr dat;
9. generarea partiiilor mulimii 1, 2, ., n};
10. generarea tuturor turnurilor de cuburi n Iuncie de anumite proprieti date;
11. ieirea din labirint;
12. ieirea din labirint (pereii celulelor pstrai pe bii);
13. aranjarea unor piese de tetris, astIel nct s completeze integral un dreptunghi de
dimensiuni date;
14. determinarea turnului de cuburi de nlime minim;
15. determinarea drumului pe care broasca ajunge la lcust i se ntoarce la locul de
pnd pe supraIaa unui lac ngheat, unde gheaa se rupe n urma eIecturii sritu-
rilor eIectuate conIorm sriturii calului pe tabla de ah;
16. mutarea elementelor unei matrice de dimensiuni m n ntr-un ir a, astIel nct
dou elemente aIlate pe poziii consecutive n irul a s Iie vecine n matrice i
suma 1 a
1
2 a
2
. m n a
mn
s Iie minim.

372 19. Metoaa backtracking

19.4. Probleme propuse

19.4.1. Numere
Se d un tablou unidimensional de n numere ntregi. S se genereze toate tablourile al-
ternante (iruri n care dup Iiecare element strict pozitiv urmeaz unul strict negativ i
dup Iiecare element strict negativ urmeaz unul strict pozitiv) care s conin elemen-
te din irul dat n ordinea iniial a lor.

Date de intrare
Elementele tabloului se aIl n Iiierul de intrare NUMERE.IN, un numr pe o linie.

Date de ieyire
Soluiile se vor scrie n Iiierul de ieire NUMERE.OUT. O soluie (un ir alternant) se
va scrie pe o linie. n cadrul acestor iruri dou numere vor Ii separate printr-un spaiu.

Restricii yi precizri
- 1 s n s 100 (se determin pe baza numrului numerelor din Iiierul de intrare)
- Dac din tabloul dat nu se poate Iorma nici un subir care ndeplinete cerinele
problemei, n Iiierul de ieire se va scrie mesajul LPSRVLELO.

Exemple
NUMERE.IN

NUMERE.OUT
LPSRVLELO

NUMERE.IN

NUMERE.OUT



19.4.2. Rechizite
Pentru prima zi de coal un elev dorete s-i cumpere rechizite colare ale cror cos-
turi le cunoate. Acesta are la dispoziie o sum de bani S i dorete s aleag din mai
multe obiecte cum ar Ii:
- creioane
- radiere
- caiete
- liniare
- rezerve stilou
- creioane colorate
- acuarele
tiind c elevul a stabilit un necesar maxim pentru Iiecare obiect, aIiai cte buci
din Iiecare obiect reuete s cumpere.
19. Metoaa backtracking 373

Date de intrare
Datele de intrare se citesc din Iiierul RECHIZIT.IN care are urmtoarea structur:
Pe prima linie se gsete suma de bani S de care dispune elevul.
Pe a doua linie se gsesc costurile celor 7 obiecte, separate prin cte un spaiu.
Pe a treia linie se gsesc cantitile maxime necesare din Iiecare obiect, separate
prin cte un spaiu.

Date de ieyire
Datele de ieire se vor scrie pe linii distincte n Iiierul de ieire RECHIZIT.OUT sub
Iorma urmtoare:
buc*costnume proaus
unde buc reprezint numrul bucilor din rechizitele avnd denumirea nume proaus i
preul unitar cost.
Dac elevul nu reuete s eIectueze cumpraturile n condiiile speciIicate n
enun, n Iiierul de ieire se va scrie mesajul LPSRVLELO.

Restricii yi precizri
- 1 s S s 1000000;
- costurile maxime sunt numere pozitive mai mici dect 500000;
- cantitile maxime sunt numere pozitive mai mici dect 100;
- nu este necesar ca elevul s cumpere din toate obiectele; lsai-l pe el s aleag ce
anume i n ce cantiti cumpr, cu condiia s-i cheltuie toi banii.

Exemple
RECHIZIT.IN


RECHIZIT.OUT
LPSRVLELO

RECHIZIT.IN


RECHIZIT.OUT
VHWFUHLRDQHFRORUDWH
VHWDFXDUHOH

FUHLRDQH
UDGLHUH
FDLHWH
OLQLDUH
UH]HUYHVWLORX
VHWDFXDUHOH
374 19. Metoaa backtracking

19.4.3. Expresie
Se d un ir de n numere ntregi. S se plaseze ntre aceste numere n 1 operatori arit-
metici (, , *, /), astIel nct valoarea expresiei obinute s Iie egal cu un numr n-
treg dat m.

Date de intrare
Pe prima linie a Iiierului de intrare EXPRES.IN se aIl numrul ntreg n. Pe a doua li-
nie se aIl cele n numere, separate prin cte un spaiu, iar pe a treia linie se aIl num-
rul m.

Date de ieyire
n Iiierul de ieire EXPRES.OUT Iiecare soluie este scris pe linie nou. O soluie are
Iorma:
mexpresie, unde expresie este o succesiune de operanzi i operatori, primul i ultimul
Iiind operanzi.
Dac pentru numerele date nu se poate gsi o combinaie de operatori astIel nct
rezultatul expresiei obinute s Iie numrul m dat, n Iiier se va scrie mesajul
LPSRVLELO.

Restricii yi precizri
- 2 s n 10;
- 100 s nr
i
s 100, i 1, 2, ., n;
- valoarea expresiei trebuie s Iie un numr ntreg la Iiecare pas al evalurii;
- nu se respect prioritatea operatorilor cunoscut din aritmetic (operaiile se vor
eIectua de la stnga la dreapta n ordinea n care apar n expresie).

Exemplu
EXPRES.IN


EXPRES.OUT



19.4.4. Mayinue
Un copil dorete s aeze n mainue numerotate de la 1 la n n n cutii identiIicate prin
numere de la 1 la n. S se aIieze toate modalitile n care copilul poate s aeze ma-
inuele n cutii, tiind c ntr-o cutie ncap cel mult m mainue.


19. Metoaa backtracking 375

Date de intrare
Fiierul de intrare MASINI.IN conine o singur linie pe care sunt trecute valorile n i
m, separate printr-un spaiu.

Date de ieyire
Fiierul de ieire MASINI.OUT va conine pentru Iiecare soluie obinut cte n linii
care vor descrie coninutul cutiilor. Pe linia i (i 1, 2, ., n) se scriu m numere de or-
dine ale mainuelor care sunt puse n cutia avnd numrul de ordine i. Aceste numere
se vor despri printr-un spaiu, iar n Iaa numerelor de ordine a mainuelor se va scrie
cuvntul FXWLD, apoi un spaiu i numrul de ordine i, care la rndul lui este urmat de
: . Dac ntr-o cutie nu se pune nici o mainu, ea nu va conine dup nimic.

Restricii yi precizri
- 1 s n, m s 7.

Exemplu
MASINI.IN
2 3
MASINI.OUT
FXWLD
FXWLD

FXWLD
FXWLD

FXWLD
FXWLD

FXWLD
FXWLD

19.4.5. Depozit
ntr-un depozit compartimentat conIorm unui caroiaj a izbucnit Iocul n m locuri diIe-
rite. Magazionerul aIlat n depozit ar vrea s ias din cldire. tiind c ieirea se aIl n
colul din dreapta-jos a depozitului, s se determine toate drumurile posibile spre ieire.
n anumite compartimente, corespunztoare unor ptrele din caroiaj, se aIl
obiecte peste care magazionerul nu va putea trece sau sri. De asemenea, pe drumul
su spre ieire, magazionerul nu poate trece prin compartimentele vecine orizontal,
vertical sau pe diagonal celor cuprinse de incendiu. Magazionerul va putea s traver-
seze depozitul trecnd printr-o succesiune de compartimente vecine orizontal sau ver-
tical.

Date de intrare
n Iiierul de intrare DEPOZIT.IN se vor aIla datele reIeritoare la depozitul avnd Ior-
ma ptratic, poziia magazionerului i poziiile cuprinse de Ilcri.
376 19. Metoaa backtracking

- Pe prima linie a Iiierului se aIl dimensiunile depozitului (n);
- Pe urmtoarele n linii se aIl cte n valori, reprezentnd datele reIeritoare la depozit:
0 reprezint spaiu liber;
1 reprezint un obstacol;
2 reprezint un Ioc;
3 reprezint poziia magazionerului.

Date de ieyire
Soluia se va aIia n Iiierul de ieire DEPOZIT.OUT sub Iorma unui tablou bidimen-
sional avnd n linii i n coloane. Acest tablou va conine traseul magazionerului.
Pentru Iiecare valoare k (cuprins ntre 1 i lungimea traseului) n tablou va exista un
singur element avnd valoarea k, (corespunztor pasului k al magazionerului), n rest
tabloul va conine elemente egale cu 0.

Restricii yi precizri
- 2 s n 8;
- dou soluii n Iiierul de ieire vor Ii separate printr-o linie goal;
- dac nu se poate ajunge la ieire din cauz c este imposibil s se ias din depozit
datorit Iocurilor i obstacolelor, n Iiierul de ieire se va scrie LPSRVLELO.

Exemplu
DEPOZIT.IN


DEPOZIT.OUT



19.4.6. Cal yi nebun pe tabla de yah
Pe o tabl de ah de dimensiune n n se aIl un nebun n poziia (x, y) i un cal n po-
ziia iniial (x
0
, y
0
). Calul trebuie s ajung din aceast poziie iniial ntr-o poziie Ii-
nal (x
1
, y
1
) Ir s treac de dou ori prin aceeai poziie i Ir s se opreasc pe un
ptrat aIlat n raza de aciune a nebunului.
AIiai toate secvenele de pai de lungime minim prin care calul poate s ajung
din poziia iniial n poziia Iinal Ir a Ii capturat de nebun.
19. Metoaa backtracking 377

Date de intrare
Fiierul de intrare CALNEBUN.IN are urmtoarea structur:
- pe prima linie se aIl un numr natural diIerit de 0, reprezentnd dimensiunea ta-
blei;
- pe cea de-a doua linie sunt scrise dou numere naturale, desprite printr-un spaiu,
corespunztor poziiei nebunului;
- pe urmtoarele dou linii sunt nregistrate, n Iormatul liniei doi, poziia iniial a
calului, precum i poziia pe care trebuie s ajung.

Date de ieyire
Fiierul de ieire CALNEBUN.OUT va conine cte o linie, corespunztoare unei soluii.
Fiecare soluie va Ii scris sub Iorma unor perechi de numere naturale indicnd traseul
calului. Aceste perechi reprezint coordonatele ptratelor tablei de ah atinse de cal pe
traseul lui ncepnd cu poziia iniial i terminnd cu poziia Iinal. Perechile se vor
scrie ncadrate ntre paranteze rotunde i n interiorul parantezei desprite de o virgul.
Dac din start calul se aIl n btaia nebunului sau coordonatele citite din Iiier nu
se aIl n interiorul tablei, n Iiierul de ieire se va scrie mesajul ,PSRVLELO.

Restricii yi precizri
- 2 s n s 8;
- calul nu are voie s ias de pe tabl;
- poziia iniial nu poate s coincid cu poziia Iinal;
- n cazul n care coordonatele iniiale i Iinale ale calului se aIl n interiorul tablei
i poziia iniial nu este atacat de nebun, atunci va exista ntotdeauna cel puin o
soluie.

Exemplu
CALNEBUN.IN


CALNEBUN.OUT






378 19. Metoaa backtracking

19.5. Soluiile problemelor propuse

19.5.1. Numere
Problema dat se rezolv prin metoda backtracking, deoarece se cere generarea tutu-
ror subirurilor care au proprietile cerute n enun.
Fie a irul dat avnd n elemente numere ntregi. Vom lucra la nivelul indicilor, adi-
c vom genera mulimi de indici ai elementelor din a, Iormnd soluia n irul de indici x.

Exemplu
S presupunem c irul a are 7 elemente numere ntregi: .
O soluie a problemei este irul de numere: .
irul de indici x care se genereaz n acest caz, este: .

Se observ c n enun nu se speciIic lungimea soluiei, deci este necesar genera-
rea tuturor soluiilor de lungimi variabile (cel puin dou elemente i cel mult n). Vom
asigura generarea lor, speciIicnd lungimile posibile n programul principal ntr-o
structur de tip pentru. Pentru Iiecare lungime posibil de la 2 la n vom genera toate
subirurile de lungimea respectiv care respect cerinele din enun.
Vom construi un subalgoritm de validare care veriIic dac exist cel puin un ele-
ment pozitiv n irul dat i cel puin un element negativ, astIel nct s Iie asigurat ge-
nerarea a cel puin a unei soluii de lungime 2. Dac n irul dat nu se gsete cel puin
un element pozitiv i cel puin un element negativ, n Iiierul de ieire se va scrie me-
sajul LPSRVLELO.

Subalgoritm9DOLGDUHDQ
L verificm aac exist cel puin un element po:itiv }
ct timpLsQiD>L@sexecut:
LL cat timp numrul nu este po:itiv, avansm }
sfrit ct timp
RNSR]LWLYLsQ am gsit cel puin un numr po:itiv? }
L verificm aac exist cel puin un element negativ }
ct timpLsQiD>L@>execut:
LL cat timp numrul nu este negativ avansm }
sfrit ct timp
RNQHJDWLYLsQ am gsit cel puin un numr negativ? }
aac avem cel puin un element po:itiv i cel puin unul negativ }
vom avea cel puin o soluie }
9DOLGDUHRNSR]LWLYiRNQHJDWLY
sfrit subalgoritm

19. Metoaa backtracking 379

Condiiile de continuare se veriIic ntr-un alt subalgoritm, unde ne asigurm c:
elementul care se adaug pe poziia k nu a mai Iost introdus n irul soluie;
dac se adaug un element pozitiv pe poziia k, atunci elementul de pe poziia k 1
nu va Ii tot pozitiv;
dac se adaug un element negativ pe poziia k, atunci elementul de pe poziia k 1
nu va Ii tot negativ;
indicii trebuie s apar n ordine cresctoare, astIel nct n soluii s se pstreze or-
dinea numerelor din irul iniial, aa cum cere problema.

Dac n urma execuiei subalgoritmului de mai jos valoarea aleas pe poziia k este
acceptat, subalgoritmul 3RVLELON returneaz aaevrat, n caz contrar fals. Cazul
n care k 1 (generm prima component din soluie) se va trata cu atenie, deoarece
n aceast situaie nu exist [>N@.

Subalgoritm 3RVLELON
L
ct timpLsNi[>L@=[>N@execut:
LL aac [>N@ a fost inclus aefa in soluie nu il mai putem pune }
3RVLELOL!N
sfrit ct timp
dacN!iD>[>N@@!iD>[>N@@!atunci
aac in faa lui D>[>N@@ (numr po:itiv) avem tot un numr po:itiv, nu il punem }
3RVLELOfals
ieire forat ain subprogram
sfrit dac
dacN!iD>[>N@@iD>[>N@@atunci
aac in faa lui D>[>N@@ (numr negativ) avem tot un numr negativ, nu il punem }
3RVLELOfals
ieire forat ain subprogram
sfrit dac
dacN!i[>N@![>N@atunci
3RVLELOfals aac inaicele [>N@ este mai mic aecat cel ain faa lui }
ieire forat ain subprogram
sfrit dac
aac am afuns pan aici, alegerea lui [>N@ este posibil }
3RVLELOaaevrat
sfrit subalgoritm

AIiarea unei soluii se realizeaz scriind elementele tabloului a corespunztoare
indicilor dai n irul x. Deoarece irurile soluie au lungime variabil, trebuie transmis
ca parametru i lungimea k a lor.

380 19. Metoaa backtracking

Subalgoritm 6FULH6ROXLHN
pentruLNexecut
scrieD>[>L@@
sfrit pentru
sfrit subalgoritm

n subalgoritmul care realizeaz paii metodei backtracking:
valoarea lui x
k
este mai mic sau egal cu n, x
k
reprezentnd un indice din irul a;
aIiarea se Iace atunci cnd k q, unde variabila q este iniializat n programul
principal, ea lund valori ntre 2 i n i o Iolosim pentru a putea genera subiruri de
lungimi variabile.

Subalgoritm %DFNT
N
[>N@
ct timpN!execut:
RNfals inc nu am gsit valoarea curent a soluiei }
ct timp[>N@QinuRNexecut:
[>N@[>N@
RN3RVLELON verificm aac [>N@ poate fi pus in soluie }
sfrit ct timp
dacnuRNatunci
NN cutm alt valoare pentru elementul preceaent }
altfel
dacNTatunci aac avem q elemente in soluie, o scriem }
6FULH6ROXLHN
altfel
NN aac nu, pregtim urmtorul element }
[>N@
sfrit dac
sfrit dac
sfrit ct timp
sfrit subalgoritm

Programul principal conine secvena de mai jos care asigur veriIicarea existenei
cel puin a unei soluii i lansarea n execuie a subprogramelor descrise mai sus.

...
dac9DOLGDUHDQatunci
pentruTQexecut:
%DFNT
sfrit pentru
altfelscrieLPSRVLELO
sfrit dac
...
19. Metoaa backtracking 381

19.5.2. Rechizite
Deoarece n problem se cer toate modalitile de cheltuire a sumei S, o vom rezolva
prin metoda backtracking. Problema revine la a scrie un numr ntreg sub Iorma unei
sume de termeni numere ntregi, adic suma S dat trebuie descompus n Iuncie de
restriciile impuse n enunul problemei.
Tabloul soluie x va conine pe poziia i numrul de obiecte de papetrie de tipul i,
pe care elevul le cumpr; cu alte cuvinte i reprezint indicele din tabloul de articole
de papetrie i x
i
reprezint cantitatea din articolul avnd indicele i.
n rezolvare Iolosim un subalgoritm care calculeaz costul total al produselor cum-
prate pn la inclusiv pasul curent k.

Subalgoritm6XPDN
VXP
pentruLNexecut:
[>L@ buci ain proausul care cost EDQL>L@ }
VXPVXP[>L@EDQL>L@
sfrit_pentru
6XPDVXP
sfrit subalgoritm

n algoritm se veriIic la Iiecare pas dac cheltuielile realizate pn la pasul curent
nu depesc suma de bani pe care o are elevul la dispoziie. Acest test se realizeaz n
cadrul unui subalgoritm de validare.

Subalgoritm3RVLELO
3RVLELO6XPDNsV
sfrit subalgoritm

Subalgoritmul care implementeaz metoda backtracking are cteva particulariti:
- Fiecare element din ir (reprezentnd cantiti de produse) poate avea ca valoare
maxim valoarea corespunztoare din irul QHFHVDU.
- Din moment ce nu este obligatoriu s se cumpere din Iiecare obiect este posibil i
cantitatea 0.
- Dac la un anumit pas costul obiectelor deja cumprate este egal cu suma deinut
de elev, atunci aceasta se consider a Ii o soluie i se scrie n Iiierul de ieire, alt-
Iel se ncearc cumprarea a nc unui obiect.

Subalgoritm %DFNN
pentruMQHFHVDU>N@execut cantiti posibile intre nimic i maxim }
[>N@M
dac3RVLELONatunci
382 19. Metoaa backtracking

dacVXPDNVatunci6FULHBVRON
altfel
exist in total 7 obiecte ain care elevul ii face cumprturile }
dacaNatunci
%DFNN
sfrit dac
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

Dac nu se poate scrie nici o soluie, n Iiier se va scrie mesajul LPSRVLELO.

19.5.3. Expresii
Problema se rezolv prin metoda backtracking deoarece dorim s obinem toate solu-
iile care respect cerinele problemei. Pentru aceasta am reinut valorile operanzilor n
tabloul a. Vom genera toate tablourile x care conin operatori codiIicai astIel:
1 : adunare
2 : scdere
3 : nmulire
4 : mprire
Vom genera un ir de operatori i la Iiecare adugare a unui operator n irul x vom
calcula rezultatul curent al expresiei. Dac operatorul pe care l-am adugat pe poziia k
este 4, adic urmeaz s eIectum o mprire, veriIicm dac rezultatul obinut este un
numr ntreg sau nu.
Pentru rezolvare avem nevoie de un subalgoritm care calculeaz valoarea expresiei
inclusiv la pasul curent k:

Subalgoritm&DOFXON
VD>@
pentruLNexecut:
dac[>L@atunciVVD>L@
altfel
dac[>L@atunciVVD>L@
altfel
dac[>L@atunciVVD>L@
altfelVVD>L@
sfrit dac
sfrit dac
sfrit dac
sfrit pentru
&DOFXOV
sfrit subalgoritm
19. Metoaa backtracking 383

n programul Pascal variabila local s i Iuncia &DOFXON vor Ii de tip 5HDO din
cauza c vom Iolosi operatorul /.
Condiiile interne n aceast problem au Iost deIinite n enun: toate rezultatele
pariale trebuie s Iie numere ntregi. Subalgoritmul 3RVLELON va returna aaevrat
n caz aIirmativ i false n caz contrar.

Subalgoritm3RVLELON
3RVLELOnu[>N@i
&DOFXOND>N@=>&DOFXOND>N@@
sfrit subalgoritm

Algoritmul de backtracking are cteva particulariti:
- Elementele din soluia x vor avea valori de la 1 la 4, deoarece cei patru operatori s-
au codiIicat cu ciIre.
- Generarea se ncheie atunci cnd s-a ajuns la pasul n 1 i valoarea expresiei este
egal cu m.
- Valoarea expresiei se calculeaz apelnd subalgoritmul &DOFXON descris mai
sus.
- Dac nu s-a ajuns la pasul n 1, se continu generarea.

Subalgoritm %DFNN
pentruLexecut: avem 4 operatori posibili }
[>N@L punem un operator in irul soluie }
dac 3RVLELONatunci verificm conaiiile interne }
aac am obinut o soluie }
dacNQi&DOFXONPatunci
$ILDUH[HVWH o afim }
altfel
dacNQatunci aac mai avem operan:i }
%DFNN incercm s le plasm in expresie }
sfrit dac
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

n enunul acestei probleme se cere ca n cazul n care pentru expresia generat nu
se poate obine rezultatul m printr-o combinaie de operatori, s se aIieze mesajul
LPSRVLELO. Atunci cnd aIim o soluie, schimbm valoarea variabilei booleene
globale HVWH n aaevrat, urmnd ca n programul principal s veriIicm valoarea
acestei variabile i s scriem n Iiierul de ieire mesajul respectiv.
384 19. Metoaa backtracking

19.5.4. Mayinue
Aceast problem se rezolv prin metoda backtracking deoarece trebuie generate toate
soluiile. n aceast idee vom realiza urmtoarea codiIicare a datelor:
- x va Ii irul soluie i vom pstra n x
i
numrul de ordine al cutiei n care punem
mainua i;
- n irul nr
i
pstrm numrul (cantitatea) mainuelor puse n cutia i;
- n irul pus
i
vom avea valoarea aaevrat dac mainua i a Iost pus deja n soluia
curent, iar n caz contrar pus
i
va avea valoarea fals.

Exemplu
Fie n 2 i m 3.
x (1, 1) cu semniIicaia c att mainua 1, ct i mainua 2 se introduc n cutia 1;
x (1, 2) mainua 1 se introduce n cutia 1 i mainua 2 n cutia 2;
x (2, 1) mainua 1 se introduce n cutia 2 i mainua 2 n cutia 1;
x (2, 2) ambele mainue se introduc n cutia 2.

Pentru rezolvarea problemei avem nevoie de un algoritm care veriIic condiiile de
continuare. Am putea numra apariiile Iiecrei cutii pn la pasul curent k i am putea
veriIica apoi dac numerele obinute nu sunt cumva mai mari dect m. Renunm la
aceast idee i vom veriIica la Iiecare pas k, dac mainua k nu este pus deja n vreo
cutie i dac cutia n care vrem s-o punem nu este deja plin, Iolosindu-ne de irurile
pus i nr.

Subalgoritm3RVLELON
3RVLELOQU>L@PinuSXV>N@
sfrit subalgoritm

AIiarea cerut n enun are un Iormat special, adic trebuie s scriem cuvntul
,cutia, apoi numrul de ordine al cutiei i dup numerele mainuelor care sunt
n acea cutie separate prin cte un spaiu. Subalgoritmul prin care obinem aIiarea ce-
rut este:

Subalgoritm$ILDUH[
pentruLQexecut:
scrieFXWLDL'
pentru MQexecut:
dacL[>M@atunciscrieM
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

19. Metoaa backtracking 385

Algoritmul de backtracking n Iorm recursiv este:

Subalgoritm %DFNN
pentruLQexecut: putem alege aintre n cutii }
[>N@L incercm s punem mainua k in cutia i }
dac3RVLELONLatunci aac este posibil }
SXV>N@aaevrat o punem, aeci mainua k este pus }
QU>L@QU>L@ crete numrul mainuelor in cutia i }
dacNQatunci aac am pus i a n-a mainu }
$ILDUH[ avem o soluie, o afim }
altfel
%DFNN in ca: contrar incercm s plasm urmtoarea mainu }
sfrit dac
SXV>N@fals la revenire scoatem mainua k ain cutia i, }
QU>L@QU>L@ aeci aescrete numrul mainuelor in cutia i }
sfrit dac
sfrit pentru
sfrit subalgoritm

n aceast implementare a metodei backtracking am nlocuit traversarea irului so-
luiei cu scopul de a veriIica dac o anumit component nu este deja prezent n solu-
ie, prin utilizarea irului de valori logice SXV. n plus, pentru o mai uoar veriIicare a
spaiului ocupat n cutii, ne-am Iolosit de irul QU. Ceea ce apare ca element nou din
aceast cauz se poate Iormula n Ielul urmtor: n momentul alegerii unei componen-
te din spaiul soluiilor posibile pentru soluia curent, toate entitile care sunt ,atin-
se de aceast alegere se modiIic n mod corespunztor (SXV>N@ devine aaevrat,
QU>L@ crete), iar n momentul revenirii dintr-un apel recursiv aceste valori se restau-
reaz la starea anterioar (SXV>N@ devine fals, QU>L@ descrete), deoarece renunm
la valoarea componentei k i astIel toate modiIicrile Icute din cauza alegerii acesteia
la pasul precedent se anuleaz. Aceast abordare accelereaz algoritmul, deoarece n
loc s traversm un ir, adresm direct un element (valoare logic). AstIel evitm
generarea inutil a multor soluii care ulterior s-ar dovedi a Ii neinteresante (incorecte).

19.5.5. Depozit
n problema dat depozitul se memoreaz printr-un tablou bidimensional.

Exemplu
Fie n 10. n Iigura urmtoare depozitul codiIicat cu tabloul de numere se poate
vedea n stnga, iar vizualizat mai sugestiv n dreapta:

386 19. Metoaa backtracking



O
O O O
F O O O
O
O
O O M O F
O O O
O F O F
O O O
O O E
n Iigur sunt marcate compartimentele
incendiate, compartimentele n care se aIl
obstacole, locul unde se aIl magazionerul
i ieirea.
Enunul problemei precizeaz c nu se
poate trece prin zonele vecine incendiului.
Zone vecine cu Iocul (pe baza enunului)
sunt toate csuele nvecinate pe orizontal,
vertical i diagonal. Prin urmare, vom mar-
ca aceste zone ca Iiind ocupate de ,obstaco-
le. Depozitul arat acum n Ielul urmtor:
O
O O O O O
O F O O O O
O O O O
O O O O
O O M O F O
O O O O O O O O
O F O O F O
O O O O O O O
O O E


n secvena de algoritm care realizeaz aceast prelucrare a depozitului Iolosim irul
deplasamentelor indicilor de linie i de coloan ca n problema Biliara (capitolul 6).

[
\

Subalgoritm&LWLUHD,QLM:
citeteQ aimensiunea aepo:itului }
pentruLQexecut
pentruMQexecut
citeteD>LM@ ,coninutul` aepo:itului }
pentruLQexecut: cutm po:iiile incenaiate }
pentruMQexecut:
dacD>LM@atunci
pentru Nexecut: cele 8 po:iii vecine }
LLL[>N@
MMM\>N@
19. Metoaa backtracking 387

dacLLe^Q`i MMe^Q`atunci
aac po:iia vecin este in interiorul aepo:itului }
D>LLMM@ o consiaerm ae asemenea ocupat }
altfel
dacD>LM@atunci
LL po:iia in care se afl maga:ionerul }
MM
sfrit dac
sfrit dac
sfrit pentru
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

Coordonatele iniiale ale magazionerului (L i M) le determinm din datele depo-
zitului.
Magazionerul poate traversa depozitul, avansnd dintr-o poziie n alta care este ve-
cin pe orizontal sau vertical cu cea n care se aIl. Vom pregti irul deplasamente-
lor indicilor de linie i de coloan ca n problema Biliara, de data aceasta din patru
componente:
[ i \.
Dac magazionerul se aIl n poziia marcat cu M, irul x conine valori care tre-
buie adunate valorii indicelui de linie a poziiei magazionerului pentru a ajunge pe li-
niile vecine, iar y conine valori care trebuie adunate valorii indicelui de coloan a po-
ziiei magazionerului pentru a ajunge pe coloanele vecine (marcate cu 1, 2, 3 i 4 n Ii-
gura de mai jos).
1
4 M 2
3

Condiiile interne sunt precizate n enun sub Iorma restriciilor n deplasare. Aces-
tora se adaug i condiia de a nu iei din depozit n alt parte dect este ieirea pro-
priu-zis:
- coordonatele ncperii n care se trece trebuie s Iie ntre 1 i n;
- n ncperea n care se Iace deplasarea nu poate exista obstacol sau Ioc;
- prin ncperea n care se trece la pasul curent acest drum nu a trecut nc.

Aceste condiii sunt veriIicate n subalgoritmul 3RVLELO (D este tabloul n care se
memoreaz depozitul, iar E este tabloul care reine drumul parcurs de magazioner):


388 19. Metoaa backtracking

Subalgoritm3RVLELOLM
presupunem c se poate efectua pas in incperea ae cooraonate LM }
3RVLELOaaevrat
dacnu Le^Q`saunu Me^Q`atunci
aac incperea se afl in afara aepo:itului, pasul nu este posibil }
3RVLELOfals
sfrit dac
dacD>LM@=atunci
aac po:iia este ocupat ae obstacol sau este cuprins ae incenaiu }
3RVLELOfals
sfrit dac
dacE>LM@=atunci aac s-a mai trecut pe aici }
3RVLELOfals
sfrit dac
sfrit subalgoritm

Subalgoritmul 3RVLELOLM este apelat n algoritmul %DFNLMSDV, atunci
cnd, la pasul SDV, din poziia LM se ncearc trecerea ntr-o nou poziie LLMM.

Subalgoritm%DFNLMSDV
pentruNexecut: se incearc aeplasrile in cele 4 po:iii vecine }
LLL[>N@ se aetermin inaicele ae linie a po:iiei vecine }
MMM\>N@ se aetermin inaicele ae coloan a po:iiei vecine }
dac3RVLELOLLMMatunci aac pasul in aceast po:iie este posibil }
E>LLMM@SDV se efectuea: pasul }
dacLLQi MMQatunci aac po:iia curent este ieirea }
DILDUHE se afiea: o soluie }
altfel in ca: contrar }
%DFNLLMMSDV
se incearc un pas nou care se efectuea: ain po:iia LLMM }
sfrit dac
la revenire se terge ultimul pas efectuat ain po:iia LM in LLMM }
E>LLMM@ aeoarece ain LM vom incerca s trecem in alt po:iie }
sfrit dac
sfrit pentru
sfrit subalgoritm

Datele cu care lucreaz algoritmul %DFN sunt cunoscute. Mai rmne s interpre-
tm modul n care acesta lucreaz.
- Se determin coordonatele poziiei n care urmeaz s treac magazionerul:
LLMM.
19. Metoaa backtracking 389

- Se veriIic condiiile de continuare prin apelarea algoritmului 3RVLELOLLMM.
- Dac sunt ndeplinite condiiile de continuare, deci 3RVLELOLL,MM are valoarea
aaevrat, atunci pasul curent se trece n tabloul E care reine drumul parcurs spre
ieire.
- Dac s-a ajuns n colul din dreapta-jos, atunci se Iace aIiarea tabloului E, altIel se
continu deplasarea.


O soluie pentru exemplul considerat
este vizualizat n Iigura urmtoare. Ob-
servm c traseul trece inutil prin pozi-
iile 49, dar acest lucru nu constituie
greeal din moment ce nu s-au cerut
trasee de lungime minim.
6 7 O
O O O 5 8 O O
O F O O 4 9 O O
O O O O 3 10 11 12 13
O 2 O O O 14
O O 1 O F O 15
O O O O O O O O 16
O F O O F O 17
O O O O O O O 18
O O 19

19.5.6. Cal yi nebun pe tabla de yah
n Iigura de mai jos sunt haurate poziiile pe care bate nebunul cnd se aIl pe poziia
N avnd coordonatele (2, 4). Calul se aIl iniial n poziia de start marcat cu C (2, 2)
i trebuie s ajung n poziia Iinal F (5, 5). El are dou trasee de aceeai lungime mi-
nim pentru a ajunge n poziia Iinal, si anume:
(2, 2)(3, 4)(5, 5)
(2, 2)(4, 3)(5, 5)

C N
2
2
F


Prima observaie pe care o Iacem se reIer la Iaptul c n enun se cer toate soluiile
problemei care corespund cerinelor. n acest moment tim c metoda de rezolvare va
Ii backtracking. Analiznd cerinele, constatm c trebuie s determinm un minim. n
aceast problem minimul nu este doar un numr (care de altIel nici nu trebuie aIiat
la ieire), ci un ir de coordonate de pe tabla de ah care corespund traseului ae lungi-
me minim. n plus, se cer toate aceste iruri.
390 19. Metoaa backtracking

Prima idee ar Ii s stabilim (conIorm algoritmului clasic) un astIel de minim, apoi
s aIim toate soluiile care corespund acestuia. AstIel ar trebui s eIectum algorit-
mul realizat cu metoda backtracking o dat pentru stabilirea tuturor soluiilor, reinnd
valoarea minim a traseului, apoi s executm inc oaat acelai algoritm pentru gsi-
rea tuturor soluiilor (traseelor) avnd lungimea minim.
Este evident c o astIel de soluie nu este acceptabil, deoarece ar conduce la un
timp de execuie mult prea mare. Analiznd n continuare problema, ajungem la con-
cluzia c trebuie s gsim o modalitate care nu execut integral procedura care imple-
menteaz metoda backtracking de dou ori.
Mai nti ne propunem s gsim o rezolvare n care s-o executm o singur dat.
Dac am putea stabili minimul irului, traversndu-l o singur dat, am gsit simpliIi-
carea pe care ne-am propus-o.
n urmtorul algoritm presupunem c se caut (mai simplu) toate poziiile din irul
x pe care se aIl valoarea minim a irului x. Rezultatul se va Iurniza programului
apelant n irul re: de lungime f:

Subalgoritm0LQLPQ[MUH]
PLQ[>@
M
UH]>M@
pentruLQexecut
dacPLQ![>L@atunci
M
UH]>M@L
PLQ[>L@
altfel
dacPLQ[>L@atunci
MM
UH]>M@L
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

Dar n cazul nostru trebuie reinute soluii care sunt iruri de coordonate i nu doar
indici. Alegem alt cale de rezolvare. Vom scrie rezultatul curent n Iiier i atunci
cnd gsim unul care corespunde aceluiai minim, deschidem Iiierul cu $SSHQG i l
scriem, iar cnd gsim o soluie corespunztoare unui minim mai mic dect cel curent,
deschidem Iiierul cu 5H:ULWH, astIel ncepnd scrierea grupului nou de soluii.
Se poate observa c pe lng aceast modalitate mai exist i altele care rezolv
problema. De exemplu, putem ,presupune c traseul minim are lungimea minim 1.
Apelm procedura %DFNLMSDV i cutm trasee avnd aceast lungime. Dac g-
19. Metoaa backtracking 391

sim un astIel de traseu, l scriem n Iiier, dac nu, atunci mrim valoarea minimului la
2 i cutm trasee avnd aceast lungime. Algoritmul se oprete, evident, atunci cnd
am gsit cel puin o soluie care corespunde minimului presupus la pasul respectiv.
Suntem siguri c astIel gsim soluiile corespunztoare minimului, deoarece am luat n
considerare valorile posibile n ordine cresctoare. Acest algoritm este urmtorul:

Subalgoritm 0LQLP
PLQ
RNfals
repet
%DFN[\PLQRN
PLQPLQ
pn cndRN
sfrit algoritm

Soluia o vom codiIica ntr-un tablou W, corespunztor tablei de ah, iniializndu-i
elementele cu 0. Atunci cnd n cutarea soluiei eIectum un pas permis ntr-o anumi-
t poziie, valoarea acelui element va Ii egal cu numrul de ordine al pasului. Evi-
dent, la revenire vom avea grij s restabilim valoarea iniial a elementului respectiv
pentru ca n timpul generrii unei soluii noi s putem eIectua un pas n aceast poziie.
n procedura %DFNLMSDV vom genera poziiile LLMM corespunztoare pa-
ilor noi pe care un cal le poate eIectua dintr-o poziie curent LM cu ajutorul a
dou iruri de constante (GL i G\) care reprezint deplasamentele liniilor, respectiv
coloanelor celor 8 poziii n care poate sri un cal.

VLUarray>@of
constGLVLU
GMVLU

Pentru Iiecare astIel de poziie nou, vom veriIica dac ea se aIl sau nu pe tabla de
ah (ifLLin>Q@andMMin>Q@).

Dac ne aIlm pe tabl, vom veriIica dac aceast poziie este n aIara btii nebu-
nului (aIlat n poziia ([\) cu instruciunea if$EV[LL!$EV\MM. Tot-
odat veriIicm i elementul corespunztor din tabloul W. Dac acest element are va-
loarea 0, nseamn c nc nu a Iost inclus n traseu, deci putem eIectua un pas aici.
Acum vom veriIica dac aceast poziie nu este cumva cea Iinal, caz n care urmeaz
s ne convingem c lungimea traseului este egal cu lungimea minim propus.
Dac am atins poziia Iinal i numrul pailor este egal cu PLQ, am obinut o solu-
ie i o putem aIia. n caz contrar vom continua traseul nceput, dar numai aac nu-
mrul ae oraine al pasului curent este mai mic aecat lungimea minim propus, deoa-
392 19. Metoaa backtracking

rece nu are sens s determinm soluii care conduc la o lungime mai mare dect cea
propus din moment ce acestea nu se valoriIic.
n concluzie, algoritmul recursiv care implementeaz metoda backtracking este ur-
mtorul:

Subalgoritm%DFNLMSDV
pentruNexecut:
LLLGL>N@ inaicele ae linie a po:iiei noi }
MMMGM>N@ inaicele ae coloan a po:iiei noi }
aac po:iia aleas este pe tabl }
dacLLe^Q`iMMe^Q`atunci
dac[LL|=\MM|iW>LLMM@atunci
aac po:iia nu se afl pe traiectoriile nebunului i }
in aceast po:iie nu am trecut la un pas anterior }
W>LLMM@SDV efectum pasul (marcm po:iia) }
aac am afuns in po:iia final }
dacLL[iMM\atunci
aac numrul pailor efectuai este egal cu minimul }
dacSDVPLQatunci
$ILDUHW
RNaaevrat
sfrit dac
altfel
dacSDVPLQatunci
aac numrul pailor efectuai este mai mic aecat minimul curent }
%DFNLLMMSDV continum arumul }
sfrit dac
sfrit dac
W>LLMM@
tergem urma pasului efectuat, aeoarece am revenit la o stare anterioar }
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

AIiarea rezultatului se realizeaz pe baza valorilor diIerite de zero din tabloul W.
Deoarece tim c numrul acestor elemente este PLQ (accesibil, deoarece algoritmul
s-a terminat cnd am gsit un traseu avnd cea mai mic valoare), n tabloul W vom
cuta valori cuprinse ntre 1 i PLQ, n aceast ordine aIind indicii de linie i de co-
loan a acestora.


19. Metoaa backtracking 393

Subalgoritm$ILDUHW
N
ct timpNsPLQexecut
pentruLQexecut
pentruMQexecut
dacW>LM@Natunci
scrie LM
NN
sfrit dac
sfrit pentru
sfrit pentru
sfrit ct timp
sfrit subalgoritm




Bibliografie


|Anas2000| Doru Popescu Anastasiu, Culegere ae probleme ae informatic,
Editura All, Bucureti, 2000.
|Cerc2002a| Emanuela Cerchez, Culegere ae probleme ae informatic, Editura
Polirom, Iai, 2001.
|Cerc2002b| Emanuela Cerchez, Marinel Serban, Informatica pentru gimna:iu,
Editura Polirom, Iai, 2002.
|Cior1997| Andrei Cioroianu, Programe Turbo Pascal in aetaliu, Editura Teora,
Bucureti, 1997.
|Logo2001| Doina Hrinciuc Logoftu, C Probleme re:olvate i algoritmi, Edi-
tura Polirom, Iai, 2001.
|Thom2000| Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest, Intro-
aucere in algoritmi, Editura Computer Libris Agora, Cluj-Napoca,
2000.
Cazeta de informatic - 21-23, Editura Agora Media, Trgu Mure.