Documente Academic
Documente Profesional
Documente Cultură
!
!
!
!
!
Capitolul
10
*)
n cele ce urmeaz, atunci cnd vom scrie string, n acest material, ne referim la un ir de ca-
ractere. Atunci cnd vom scrie string, este vorba de tipul predefinit n limbajul Pascal.
215
10.1.2. Afiarea
Afiarea se realizeaz specificnd o expresie de tip string.
Exemplu
var s:string;
ss:string[5];
...
WriteLn('ABCABC');
WriteLn(s+ss);
{ dac s = 'str' i ss = 'ing', se va afia 'string' }
...
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 ss:string[5];
216
Dac valoarea lui ss='123', atribuirea ss:=ss+'457890'; se va finaliza cu valoarea '12345' pentru ss.
10.1.4. Concatenarea
Concatenarea se poate realiza utiliznd operatorul '+', dar n Pascal exist i o procedur predefinit n acest scop (Concat).
Exemplu
s3:=s1 + s2; { dac s1 = 'a' i s2 = 'b', atunci valoarea lui s3 va fi 'ab' }
{ valoarea lui s3 va fi 'ab***a' }
s3:=s3 + '***' + s1;
{ stringul vid }
Avnd declaraiile de mai sus, n tabelul urmtor prezentm cteva exemple de expresii relaionale dup efectuarea urmtoarelor operaii de atribuire:
s1:='A';
s2:='ABC';
s3:=s1 + s2;
217
Rezultat
true (s-a comparat 'A' cu 'A')
false (s-a comparat 'ABC' cu 'ABC')
true (s-a comparat 'AABC' cu 'ABC' i
'A' < 'B' pe cea de a doua poziie)
true (s-a comparat 'A' cu 'AA')
true (s-a comparat 'AABC' cu 'A')
218
Mere
LITERE.OUT
AVEA
MULte
ACESTa
eXeMPLu
Explicaii
Ana are dou litere mici i una mare, deci nu se scrie.
AVEA are patru litere mari i nici una mic, deci se scrie.
MULte are trei litere mari i dou mici, deci se scrie.
Mere are o liter mare i trei mici, deci nu se scrie.
ACESTa are patru litere mari i o liter mic, deci se scrie.
esTe are o liter mare i trei litere mici, deci nu se scrie.
un nu are nici o liter mare, deci nu se scrie.
eXeMPLu are 4 litere mari i trei litere mici, deci se scrie.
219
10.4.2. Text
Se citesc mai multe propoziii dintr-un fiier. Se cere:
s se afieze numrul de cuvinte din fiecare propoziie;
s se determine pentru fiecare propoziie numrul cuvintelor distincte;
s se afieze cuvintele care se repet n cadrul aceleiai propoziii.
Date de intrare
Propoziiile sunt scrise n fiierul de intrare TEXT.IN pe mai multe linii. Dou propoziii sunt separate prin caracterele '.', '!', '?'.
Date de ieire
Rezultatele se vor scrie n fiierul de ieire TEXT.OUT. Pe linia i din fiier se afieaz
datele referitoare la a i-a propoziie. Aceste date se vor separa prin spaiu i vor aprea
n ordinea: numrul cuvintelor din propoziie, numrul cuvintelor distincte, lista cuvintelor care nu sunt distincte n cadrul propoziiei.
Restricii i precizri
din cuvinte poate s fac parte caracterul '-';
dou cuvinte se separ prin caracterele: ' ', ':', ',';
pot exista separatori inutili;
numrul maxim de cuvinte pentru fiecare propoziie este 30;
n text exist litere mari i mici.
Exemplu
TEXT.IN
Sa revenim la coroana pe care am lasat-o in mana lui Arhimede,
care se uita ganditor la ea nestiind ce sa-i faca.
O lasa deceptionat din mana si pleaca la alte treburi.
Dar problema, ca intrebare, staruie in mintea lui; s-o
cantaresc, s-o cantaresc, aude in sine un murmur in surdina,
da, asta stiu, s-o cantaresc, dar ce altceva sa-i mai fac?
TEXT.OUT
22 18 la care
10 10
30 21 in s-o cantaresc
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
TRADUS.IN
Ana has many mere, dar she is going to the piata to vanda them.
mere apples
dar but
piata marketplace
vanda sell
TRADUS.OUT
Ana has many apples, but she is going to the marketplace to sell them.
10.4.4. Culori
La o grdini se va realiza un spectacol, unde copiii trebuie s fie mbrcai n costume de culori diferite. Fiecare copil i spune culoarea preferat, iar nvtoarea formeaz grupuri de copii mbrcai n costume de aceeai culoare. Pe scen copiii se vor
aeza n grupuri, astfel nct cel mai numeros grup va sta n fundal, n faa acestora va
sta grupul din care fac parte mai puini copii etc., iar n fa grupul cel mai puin numeros.
Date de intrare
Datele de intrare se citesc din fiierul CULORI.IN care are urmtoarea structur:
pe prima linie se afl 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;
221
CULORI.OUT
3 Popescu Marius Rus Andrei Rusu Teodor
1 Pop Mihai Popan Ana
2 Popa Ion Trif Ionut
222
10.5.2. Text
Vom reine fiecare propoziie ntr-un ir de caractere i vom construi irul cuvintelor
care fac parte din ea pentru a facilita cutarea cuvintelor care nu sunt unice n cadrul
propoziiei.
Din cauza c o propoziie se poate continua n fiierul de intrare pe mai multe linii,
vom forma propoziiile, citind din fiier caractere. Notm cu pr irul de caractere care
reine propoziia curent i cu c caracterul citit din fiier. Iniializm propoziia cu
223
stringul vid i caracterele citite le concatenm n pr, pn la apariia unui separator sau
a marcajului de sfrit de linie.
n cazul n care propoziia se ncheie (a aprut un separator) nlocuim separatorul,
adugnd la sfritul variabilei pr un spaiu, pentru a simplifica mprirea pe cuvinte. Trecem la analiza propoziiei.
Dac pe parcursul citirii a aprut marcaj de sfrit de linie, fr ca propoziia s se
termine, acesta se citete din fiier, continund citirea caracterelor i concatenarea
lor n aceeai propoziie de pe linia urmtoare.
Algoritmul care realizeaz formarea unei propoziii este:
Algoritm Text:
{ iniializarea primei propoziiei }
pr''
ct timp nu urmeaz marca de sfrit de fiier execut:
citete c
dac c nu este separator de propoziii i
nu urmeaz marca de sfrit de linie atunci
pr pr + c
{ alipim caracterul curent propoziiei }
altfel
dac c este separator de propoziii atunci
{ suprascriem separatorul cu spaiu }
pr pr + ' '
{ analiza propoziiei }
Analiza(pr)
scrie marca de sfrit de linie
pr ''
{ iniializarea urmtoarei propoziii }
altfel
citete marca de sfrit de linie
sfrit dac
sfrit dac
sfrit ct timp
sfrit algoritm
Analiza propoziiei reinute n irul de caractere pr ncepe cu nlocuirea separatorilor cu spaii, apoi se elimin spaiile inutile i se formeaz tabloul de cuvinte. Se scrie
numrul n al cuvintelor depistate n fiierul de ieire. Algoritmul Analiza(pr) apeleaz subalgoritmul distincte(cuvinte,dist) care numr cuvintele care apar o
singur dat n propoziie i scrie acest numr n fiierul 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 fiierul de ieire se trece la cutarea cuvintelor
care se repet. Se numr fiecare apariie i se nlocuiete dublura lui cu spaiu. Dac
se gsesc cuvinte care se repet, acestea se vor scrie n fiierul de ieire.
224
Subalgoritm Analiza(pr):
{ analizm o propoziie }
n algoritmul care calculeaz numrul de cuvinte care apar o singur dat n propoziia pr se numr apariiile fiecrui cuvnt n irul cuvintelor. Dac acesta apare o singur dat se incrementeaz contorul cuvintelor distincte.
Subalgoritm Distincte(cuvinte,dist)
dist 0
pentru i=1,n execut:
apariii 0
pentru j=1,n execut:
dac cuvinte[i] = cuvinte[j] atunci
apariii apariii + 1
sfrit dac
sfrit pentru
dac apariii = 1 atunci { dac cuvinte[i] a aprut o singur dat }
dist dist + 1
{ avem un cuvnt distinct }
sfrit dac
sfrit pentru
sfrit subalgoritm
225
10.5.3. Traducere
Dificultatea acestei probleme const n faptul c din textul iniial numai anumite cuvinte se nlocuiesc. Cele care trebuie nlocuite i traducerile lor apar n fiierul de
intrare ncepnd de pe linia a doua.
Se parcurge textul iniial t i se rein pe rnd cuvintele n variabila cuvnt. Pentru
fiecare cuvnt cuvnt se verific 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 cuvnt n fiierul care conine dicionarul cu urmtorul subalgoritm:
Subalgoritm Caut(cuvnt):
citete marcajul de sfrit de linie din fiierul de intrare
ct timp nu urmeaz marca de sfrit de fiier execut:
citim n dictio o linie din fiier (o pereche de cuvinte)
cutm cuvntul cuvnt n dictio
dac l-am gsit ncepnd cu poziia 1 atunci
altfel
sfrit dac
sfrit ct timp
sfrit subalgoritm
n fiierul de intrare prima linie este ocupat de textul care trebuie tradus. De fiecare dat cnd se caut traducerea unui cuvnt n fiier trebuie s se realizeze saltul peste
prima linie, deci se citete doar marcajul de sfrit de linie.
Selectarea cuvintelor care se caut n dicionar se face n felul urmtor:
Subalgoritm Traducere(t):
cuvnt ''
i 1
ct timp i lungimea textului t execut:
ct timp t[i] este liter execut:
cuvnt cuvnt + t[i]
{ n cuvnt construim cuvinte din text }
i i + 1
sfrit ct timp
226
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 preferate de
copii, iar cul este tabloul n care se reine numrul de apariii a fiecrei culori.
Exemplu
Fie tabloul num = (Pop Mihai, Popan Ana, Popa Ion, Popescu Marius, Rus Andrei,
Rusu Teodor, Trif Ionut). Presupunem c exist 3 culori (m = 3), iar irul culorilor preferate 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 poziia i numrul copiilor care prefer culoarea i, deci cul = (4, 1, 2) cu semnificaia: culoarea 1 apare de patru ori, culoarea 2 apare o dat, culoarea 3 apare de dou ori.
Subalgoritm Citire(n,m,num,pref,cul):
citete n
pentru i=1,n execut:
citete num[i]
sfrit pentru
citete m
pentru i=1,m execut:
cul[i] 0
sfrit pentru
pentru i=1,n execut:
citete pref[i]
cul[pref[i]] cul[pref[i]] + 1
sfrit pentru
sfrit subalgoritm
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 poz = 1. Aceast variabil
astfel 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 doilea 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
poz. 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 prefer culoarea 2.
Acetia sunt: Trif Ionu.
Se nlocuiete valoarea 1 cu 0 n tabloul cul, acesta devenind cul = (0, 0, 0) i procesul se ncheie.
Subalgoritm Afiare:
pentru k=1,m execut:
{ copiii se grupeaz n m grupuri }
Maxim(m,cul,poz)
{ maximul din irul cul se afl pe poziia poz }
scrie k,' '
{ codul culorii }
pentru i=1,n execut:
dac pref[i] = poz atunci { afim copiii care prefer culoarea poz }
scrie num[i],' '
sfrit dac
sfrit pentru
cul[poz] 0
{ eliminm "ultimul maxim" }
sfrit pentru
sfrit subalgoritm