Sunteți pe pagina 1din 0

iruri de caractere

Consideraii teoretice
Funcii i proceduri predefinite
Probleme propuse
Soluiile problemelor propuse
Capitolul
11


11.1. Consideraii teoretice
n aplicaiile practice, una dintre cele mai frecvente operaii efectuate este prelucrarea
irurilor de caractere. Cu siguran vi s-a ntmplat s introducei greit un numr de la
tastatur i s primii mesajul de eroare: 'Invalid numeric format'. Acest mesaj
este cauzat de faptul c ai introdus din greeal un caracter care nu era permis s apar-
in numrului. Totui, indiferent de cauz, nchiderea brusc a aplicaiei este cu certi-
tudine frustrant pentru orice utilizator. Programatorii avansai evit nchiderea cauza-
t de introducerea greit a unor date numerice prin citirea datelor de intrare n iruri
de caractere, care permit prezena oricrui caracter i apoi verificarea corectitudinii da-
telor citite i translatarea valorii spre un tip de date necesar n algoritmul de lucru al
aplicaiei.
Pe scurt: ca s nu citim numere invalide, citim iruri de caractere i verificm
apoi dac aceste numere sunt iruri corecte.

Tipul string, specific limbajului Turbo Pascal, ofer faciliti performante de pre-
lucrare a irurilor de caractere.
Tipul string este asemntor tipului tablou de caractere; diferena esenial din-
tre aceste tipuri const n posibilitatea ca dimensiunea unei date de tip string s va-
rieze dinamic ntre zero i o valoare maxim, specificat n definirea tipului, n timp
ce numrul elementelor unui tablou de caractere este fixat.
Variabilele de tipul string ocup n memorie lungime_ir_de_caractere + 1 oc-
tei, ntruct se memoreaz i lungimea efectiv a variabilei. Dac lungimea efectiv
este zero, irul este vid.
n seciunea const, se pot defini constante simbolice i constante cu tip de tip
string, primele neavnd voie s fie modificate n timpul executrii programului.
11. iruri de caractere 119

Exemplu
const linie_tabel='*********************'; { constant simbolic }
sir:string[5]=' '; { variabil de tip string iniializat }
sir_vid:string=''; { variabil iniializat cu ir vid }
var a,b:string[5]; { variabile de tip string neiniializate }

11.1.1. Atribuirea
Spre deosebire de tablouri, unei variabile de tip string i se poate atribui valoarea
unei expresii de tip string, n componena creia pot s apar constante, iruri de ca-
ractere, variabile de tip string, apeluri de funcii care returneaz iruri de caractere i
operatorul +, care realizeaz concatenarea irurilor.

Exemplu
var x,y,z:string[5]; { iruri cu cel mult 5 caractere }
Begin
x:='A'+'B'+'C'; { x primete valoarea 'ABC' }
y:='DEF';
z:=x+y { z primete valoarea 'ABCDE' }
End.

11.1.2. Selectarea de componente
Componentele unei variabile de tip string au tipul Char i se specific prin identifi-
catorul variabilei, urmat ntre paranteze drepte de o expresie indiceal ntreag, cu va-
lori cuprinse ntre zero i lungimea efectiv. Octetul care cuprinde lungimea efectiv a
irului are indicele zero, iar tipul su este tot Char.

11.1.3. Aplicarea operatorilor relaionali
Spre deosebire de tablouri, variabilele de tip string pot s apar n expresii relaio-
nale.
Operatorii relaionali: =, <>, >, >=, <, <=, aplicai datelor de tip string, furnizea-
z o valoare boolean. Comparaia a dou date de tip string const n compararea
caracter cu caracter, de la stnga la dreapta, a codurilor ASCII ale caracterelor, pn
cnd se ajunge la dou caractere diferite sau se epuizeaz caracterele unuia dintre i-
ruri; expresia relaional primete valoarea boolean, n conformitate cu relaia dintre
cele dou caractere pe care s-a oprit comparaia. Dac irurile coincid pe lungimea
celui mai scurt, atunci acest ir este considerat mai mic dect cellalt. irurile sunt
egale numai dac att lungimile ct i coninutul lor sunt identice.
Exemple
a) 'abc'<'abcd' { are valoarea true }
b) 'axy'<'abcd' { are valoarea false }
120 11. iruri de caractere

11.1.4. Citirea
Spre deosebire de celelalte variabile de tip tablou, variabilele de tip string pot s
apar ca argumente n apelul procedurii Read, n acest fel citindu-se ntregul ir de ca-
ractere. Dac se ntlnete marcajul de sfrit de linie nainte de a fi citite attea carac-
tere ct reprezint lungimea maxim declarat a variabilei de tip string, variabila va
cuprinde numai caracterele care preced marcajul, lungimea efectiv a variabilei fiind
egal cu numrul de caractere citite.

Exemplu
var x,y:string[5];
begin
ReadLn(x,y);
...

Observaie
Dac irurile de caractere care se citesc nu au toate lungimea maxim, vor trebui
citite fiecare cu procedura ReadLn.

11.1.5. Scrierea
Valorile efective ale expresiilor de tip string se scriu conform regulilor de scriere a
irurilor de caractere.

Exemplu
var x:string[5];
...
x:='ABC';
WriteLn;
WriteLn('*',x:6,'*',x,'***');
...

Observaie
Tipul string i tipul tablou de caractere nu sunt nici echivalente i nici compatibile.

Exemplu
var a:string[5];
b:array[0..5] of Char;

Variabila b nu poate aprea ntr-o expresie relaional sau n apelul procedurilor
Read sau Write i nici n aceeai atribuire cu a. n schimb, tipurile string i Char
sunt compatibile, ele pot s fie combinate n expresii, cu excepia atribuirii prin care
unei variabile de tip Char i se atribuie o valoare de tip string, care genereaz
eroarea Type mismatch.

11. iruri de caractere 121

11.2. Funcii i proceduri predefinite pentru date de tip string
n unit-ul System, sunt definite funciile Copy, Concat, Length, Pos i procedurile
Delete, Insert, Str i Val, destinate prelucrrii datelor de tip string.

A. Funcia Length are ca argument o expresie de tip string i are ca rezultat lungi-
mea efectiv a valorii expresiei. Tipul funciei este Byte.

Exemplu
var x:string[5];
...
x:='abc';
Write(Length(x),Ord(x[0]):3);

Se va afia: 3 3, deoarece att Length(x) ct i Ord(x[0]) reprezint lungimea
irului x. Este necesar utilizarea funciei Ord, deoarece x[0] este tipul Char.

B. Funcia Concat, de tip string, concateneaz ntr-un singur ir toate irurile de ca-
ractere care apar n lista de parametri actuali. irul rezultat prin concatenare nu trebuie
s depeasc 255 caractere; caracterele care sunt n plus se pierd. Apelul are forma:
Concat(s
1
, s
2
, ..., s
n
)
Fiecare component s
i
este o expresie de tipul string. Funcia Concat(s
1
,s
2
) este
echivalent cu s
1
+ s
2
.

Exemplu
var s:string;
...
s:=Concat('ABC','-','123');

Efect: s se iniializeaz cu irul 'ABC-123'.

C. Funcia Copy, de tip string, returneaz subirul unui ir care apare ca parametru
actual al funciei, obinut prin preluarea a n caractere din ir, ncepnd cu o poziie i
precizat n apel. Apelul are forma:
Copy(ir,i,n)
unde ir este o expresie de tip string, i i n sunt expresii de tip Integer.
Dac, ncepnd din poziia i, irul are mai puin de n caractere, se vor prelua nu-
mai cele existente. Funcia returneaz ir vid dac i este mai mare dect lungimea i-
rului ir.

Exemplu
var sir,subsir1,subsir2:string;
begin
sir:='ABCDEFGH';
122 11. iruri de caractere

subsir1:=Copy(sir,6,4); { subsir1='FGH' }
subsir2:=Copy(Copy(sir,1,2)+'123',2,3); { subsir2:='B12' }
...

D. Funcia Pos returneaz poziia unui subir ntr-un ir; rezultatul este de tip Byte.
Dac subirul nu este coninut n ir, funcia returneaz valoarea zero. Apelul are for-
ma:
Pos(subir, ir)
unde subir, ir sunt expresii de tip string.

Exemplu
var i,j:Byte;
s:string;
begin
s:='ABCDEFG';
i:=Pos('CDE',s); { i=3 }
j:=Pos('BAC',s); { j=0 }
...

E. Procedura Delete terge n caractere dintr-un ir de caractere, ncepnd cu o pozi-
ie i. Dac i depete lungimea irului, procedura este inefectiv, iar dac n depe-
te numrul de caractere existente n ir, ncepnd cu poziia i, se vor terge doar aces-
tea. Apelul are forma:
Delete(ir,i,n)
unde ir este o variabil de tip string, iar i i n sunt expresii de tip Integer.

Exemplu
var s:string;
begin
s:='ABCDEF';
Delete(s,2,3); { s devine 'AEF'}
...

F. Procedura Insert insereaz un ir de caractere ntr-un alt ir de caractere, nce-
pnd cu o poziie i. Dac i depete lungimea irului, inserarea are loc la sfritul
acestuia; dac irul obinut depete 255 caractere, caracterele care sunt n plus se
pierd. Apelul are forma:
Insert(ir_surs, ir_rezultat,i)
unde ir_surs este o expresie de tip string, reprezentnd irul care trebuie inserat,
ir_rezultat este o variabil de tip string, n care are loc inserarea irului ir_surs,
iar i este o expresie de tip Integer, reprezentnd poziia din care are loc inserarea.

11. iruri de caractere 123

Exemplu
var s:string;
begin
s:='ABCDEF';
Insert('123',s,2); { s devine 'A123BCDEF' }
...

G. Procedura Str convertete o valoare numeric ntr-un ir de caractere, n mod si-
milar celui realizat de procedura Write. Procedura este foarte des utilizat n progra-
mele de grafic. Apelul are trei forme:
Str(x:w:f,ir)
unde x este o variabil de tip real, a crei valoare trebuie convertit n ir de caractere,
w este o expresie de tip ntreg, care cuprinde numrul de caractere al irului; dac lun-
gimea irului generat depete valoarea w, nu se ine cont de aceast valoare. Variabi-
la f este o expresie de tip ntreg, care precizeaz numrul de zecimale, iar ir este o
variabil de tip string, care conine irul de caractere obinut prin conversie.
A doua form a apelului:
Str(x:w,ir)
unde x este o variabil de tip real sau ntreg, a crei valoare se convertete n irul ir
de cel puin w caractere, restul parametrilor avnd aceleai semnificaii ca n cazul pre-
cedent.
Procedura Str se mai poate apela i sub forma:
Str(x,ir)
unde x este o variabil de tip real sau ntreg.

Exemplu
var s1,s2,s3:string;
n:Integer;
r:Real;
begin
n:=-27; r:=-12.1279;
Str(n,s1); { s1='-27' }
Str(r:9,s2); { s2='-1.2127900000E+01' }
Str(r:6:2,s3); { s3='-12.13' }

H. Procedura Val convertete o expresie de tip string ntr-o valoare numeric, ntr-
un mod similar procedurii Read. Apelul are forma:
Val(ir,n,cod)
unde ir este o expresie de tip string, care se convertete, n este variabila de tip real
sau ntreg, n care se depune rezultatul conversiei, iar cod este o variabil de tip ntreg,
care conine poziia caracterului din ir unde s-a depistat eroare, sau valoarea zero
dac nu s-au depistat erori.
124 11. iruri de caractere

Dac s-a detectat o eroare, valoarea lui n nu este modificat. Ca i n cazul proce-
durii Read, procedura Val sare peste caracterele TAB i spaiu de la nceputul irului.

Exemplu
var n:Real;
cod:Byte;
begin
Val(' 125.47',n,cod) { n=125.47 , cod=0 }
...

11.3. Probleme propuse

11.3.1. Concatenare
Se citesc dou iruri de caractere a i b. S se determine irul obinut prin concatena-
rea celor dou iruri date.

Exemplu
Intrare
a='elev '
b='performant'
Ieire
'elev performant'


11.3.2. Prima vocal
Se citete un ir de caractere. S se determine prima poziie din ir pe care apare o vo-
cal.

Exemplu
Intrare
s='prenume'
Ieire
3
Explicaie
Pe poziia a 3-a apare vocala 'e' care este prima vocal
din ir.

11.3.3. Numr corect
Se citete un ir de caractere. S se precizeze dac acest ir reprezint un numr ntreg
scris corect. irul trebuie s cifre, sau, opional pe prima poziie poate fi '+' sau '-'.

Exemple
Intrare
n='2140'
n='31.4'
n='3a'
n='-11'
n='+5178'
Ieire
DA
NU
NU
DA
DA

11. iruri de caractere 125

11.3.4. Abracadabra
Se citesc dou iruri de caractere a i b. S se determine de cte ori apare irul b n
cadrul irului a.

Exemplu
Intrare
a='abracadabra'
b='ab'

a='abababa'
b='aba'
Ieire
2


3
Explicaie

Enunul problemei nu precizeaz c apariiile
irului b n cadrul irului a nu au voie s se
suprapun.

Observaie
Dac irul b are lungimea mai mare dect irul a atunci nici nu are rost s cutm
apariii ale irului.

11.3.5. Aranjare
Ordonai alfabetic lista elevilor nscrii la un concurs de informatic. Citirea numelor
elevilor se ncheie cu citirea numelui fictiv 'ZZ'.

Date de intrare
Numele elevilor se vor introduce de la tastatur, fiecare pe o linie nou, pn la citirea
numelui 'ZZ'.

Date de ieire
Se vor afia numele elevilor n ordine alfabetic, fiecare pe cte o singur linie.

Exemplu
Intrare
COSMIN
ADRIAN
IONUT
RAUL
ZZ
Ieire
ADRIAN
COSMIN
IONUT
RAUL

11.3.6. Cuvinte
Se vor citi mai multe cuvinte, introduse de la tastatur, pe o singur linie. Cuvintele
vor fi separate printr-un spaiu (sau mai multe) astfel nct vom avea cel mult 250 de
caractere pe linia respectiv. Numrai cuvintele de pe linie.

Date de intrare
Cuvintele se vor citi de pe o singur linie de la tastatur.
126 11. iruri de caractere

Date de ieire
Se va afia numrul de cuvinte a irului.

Restricii i precizri
se vor introduce cel mult 250 de caractere.

Exemple
Intrare
Ana are mere
Ieire
3
Explicaie
irul are 3 cuvinte.

11.3.7. Cuvnt palindrom
Un cuvnt este palindrom dac citit de la stnga la dreapta sau de la dreapta la stnga
este acelai cuvnt. Dndu-se un cuvnt, s se stabileasc dac acesta este sau nu pa-
lindrom.

Date de intrare
Se d un ir de caractere reprezentnd un cuvnt.

Date de ieire
n funcie de proprietatea cuvntului dat, se va afia mesajul 'Este palindrom.'
respectiv 'Nu este palindrom.'.

Restricii i precizri
Lungimea cuvntului nu depete 100 caractere.

Exemple
Intrare
caiac

canoe
Ieire
Este palindrom

Nu este palindrom
Explicaie
caiac = caiac

canoe eonac

11.3.8. iruri periodice
Un ir este periodic dac conine un subir prin alipirea (concatenarea) cruia se poate
reconstrui irul. Se d un anumit ir a crui lungime nu depete 250 caractere. S se
determine dac este sau nu periodic, iar dac da, s se afieze cea mai mic perioad.

Date de intrare
Se d un text de cel mult 250 caractere.


11. iruri de caractere 127

Date de ieire
Se va afia perioada minim a irului sau mesajul 'Sirul nu este periodic.'.

Exemplu
Intrare
strastra


bambi
Ieire
4


Sirul nu este periodic.
Explicaie
Cea mai mic perioad este stra
de lungime 4.

irul nu se obine prin repetiii.

11.4. Soluiile problemelor propuse

11.4.5. Aranjare
Vom citi numele elevilor ntr-un tablou unidimensional pn cnd numele citit este
'ZZ'; dup ce am citit 'ZZ' anulm componenta respectiv i micorm cu 1 numrul
de componente din ir.
Sortm numele elevilor parcurgnd irul i la fiecare parcurgere se compar cte un
element cu cel consecutiv lui; dac nu sunt n ordinea corect le inversm. Astfel, la
fiecare pas, cel puin un element ajunge pe poziia sa final. Parcurgerile se ncheie
atunci cnd n urma unei parcurgeri nu se realizeaz deloc inversri. La sfrit afim
coninutul irului.
n viitor vom studia posibilitile de a optimiza acest algoritm. Optimizarea este
posibil, deoarece la fiecare pas n cel mai ru caz ajunge un singur element pe locul
su n irul ordonat. Rezult c n anumite cazuri este posibil s ajung mai multe
elemente pe poziiile lor, ceea ce nseamn c exist posibilitatea de a reduce numrul
parcurgerilor irului.

Algoritm Ordonare:
repet
ordonat adevrat { presupunem c irul este ordonat }
pentru i=1,n-1 execut:
{ dac ordinea perechii de elemente nu este corect }
dac v[i] > v[i+1] atunci
nume v[i] { interschimbm cele dou elemente }
v[i] v[i+1]
v[i+1] nume
ordonat fals { a avut loc o interschimbare; urmeaz o verificare nou }
sfrit dac
pn cnd ordonat = adevrat { ieim din prelucrare dac toate perechile }
sfrit algoritm { de elemente sunt n ordinea corect }
128 11. iruri de caractere

11.4.6. Cuvinte
Dup ce am citit textul, adugm la sfrit un spaiu. n acest fel dup fiecare cuvnt
apare un spaiu care trebuie s fie numrat. Dar, atenie! Numrul cuvintelor nu este
egal cu numrul spaiilor, deoarece putem avea mai multe spaii ntre oricare dou cu-
vinte. n concluzie, vom numra doar acele spaii care urmeaz dup un caracter alfa-
numeric.
Parcurgem irul i pentru fiecare caracter diferit de spaiu, dup care urmeaz un
spaiu incrementm contorul pentru numrarea cuvintelor. n final afim numrul de
cuvinte determinat.

11.4.7. Cuvnt palindrom
Pentru a verifica dac cuvntul dat este palindrom trebuie s comparm primul carac-
ter cu ultimul, al doilea cu penultimul, al treilea cu antepenultimul .a.m.d. Dac no-
tm cu lung lungimea cuvntului, nseamn c va trebui s comparm pe rnd al i-lea
caracter cu cel de-al (lung + 1 i)-lea, care este oglinda lui fa de jumtatea irului.
Dac rezultatul tuturor comparaiilor este rezultat de egalitate, atunci irul este palin-
drom.
Am putea proceda i altfel: parcurgem cuvntul ncepnd cu ultimul su caracter i
continund spre primul, alipim caracterele ntr-un cuvnt nou. Acesta, n final se va
compara cu cuvntul dat:

Algoritm Palindrom:
citete cuvnt
cuvnt_nou ''
pentru i=lung,1 execut:
cuvnt_nou cuvnt_nou + cuvnt[i]
sfrit pentru
dac cuvnt = cuvnt_nou atunci
scrie 'DA'
altfel
scrie 'NU'
sfrit algoritm

11.4.8. iruri periodice
Pentru un ir periodic orice perioad se afl printre divizorii lungimii irului (nu nea-
prat orice divizor este perioad a irului). Pentru a determina dac un anumit divizor
d este perioad a irului procedm astfel:
reinem primele d caractere ale irului ntr-o variabil auxiliar de tip string;
le comparm consecutiv cu subiruri de lungime d ale irului, ncepnd de pe po-
ziii (multiplu de d) + 1.
dac toate comparaiile conduc la egalitate, atunci d este perioad a irului.
11. iruri de caractere 129

Algoritm Perioade:
citete s
pentru per=1,[lung/2] execut:
dac rest[lung/per] = 0 atunci
periodic adevrat
aux subirul lui s, ncepnd cu primul caracter i inclusiv al per-lea
{ n Pascal: Copy(s,1,per) }
pentru i=1,[lung/per] - 1 execut:
aux2 subirul lui s, ncepnd cu al i-lea multiplu a lui per, + 1
{ n Pascal: Copy(s,per*i+1,per) }
periodic periodic i (aux = aux2)
sfrit pentru
dac periodic = adevrat atunci
ieire forat din pentru
sfrit dac
sfrit dac
sfrit pentru
dac periodic = adevrat atunci
scrie 'DA'
altfel
scrie 'NU'
sfrit dac
sfrit algoritm

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