Sunteți pe pagina 1din 29

Centrul Tehnologii Informaționale și

Comunicaționale în Educație

⚫Tema: Prelucrarea datelor organizate


sub formă de şiruri de caractere

Profesor: Ecaterina Guțu

Profesor: Ecaterina Guțu


NOȚIUNEA DE ȘIR DE CARACTERE

• Limbajul Pascal ne oferă facilități pentru prelucrarea


unor cuvinte sau chiar a unor propoziții. Acestea vor fi
memorate ca ȘIRURI DE CARACTERE.
Un șir de caractere este o succesiune de caractere
cuprinsă între două apostrofuri și poate să conțină
orice caractere: litere mari și mici, caracterea
speciale(”#”, ”&”, ”*”, etc.) și delimitatori
(virgula, punctul, etc.)

Exemplu: ”Borland Pascal 7.0”, ”Informatica”.

Profesor: Ecaterina Guțu


DECLARAREA, CITIREA ȘI AFIȘAREA UNUI ȘIR
DE CARACACTERE
• Un astfel de șir de caractere cuprins între apostrofuri poate
fi memorat într-o variabilă de tipul predefinit string. La
declararea unei variabile de tipul string, putem preciza,
între parantezele patrate, lungimea maximă, adică numărul
maxim de caractere al șirurilor ce pot fi memorate în
variabila respectivă. Dacă nu indicam lungimea maxima a
șirului, atunci compilatorul va stabili lungimea maximă
implicită de 255 de caractere.
• Exemplu:
Var s: string[25]; {variabila s poate memora
siruri de lungima maxima de 25 de caractere}
s1:string; {variabila s1 poate memora
siruri de lungima maxima de 255 de
caractere}

Profesor: Ecaterina Guțu


CITIREA ȘI AFIȘAREA UNUI ȘIR DE
CARACTERE

⚫Variabilele de tipul string pot primi ca valori șiruri


de caractere în două moduri:
⚫prin atribuire
⚫ prin citire cu procedura read/readln
Numărul de caractere ale șirului memorat într-o
variabilă de tip string se numește lungimea
efectivă a șirului, sau pe scurt – lungimea șirului.
Șirurile de caractere pot fi afișate Exemplu:
Program p1;
cu write/writeln. Var s1, s2, s3: string;
Begin
s1:=’chisinau’;
Readln(s2,s3);
Profesor: Ecaterina Guțu Write(s1,s2,s3,’ok’);
End.
⚫În urma declarării unei variabile de tipul string,
compilatorul Pascal alocă memorie pentru
variabila respectivă sub forma unui vector de
caractere.
-Ce se va întîmpla însă atunci cînd în variabila se va
memora efectiv un șir prin atribuire sau prin
citire?
Caracterele șirului vor ocupa pozițiile consecutive
în vector, începînd cu poziția 1.

Profesor: Ecaterina Guțu


POT APĂREA URMĂTOARELE SITUAȚII:

⮚ Dacă lungimea efectivă a șirului (numărul efectiv de


caractere) este mai mică decît lungimea maximă a
variabilei (numărul maxim de caractere), atunci
ultimele poziții ale vectorului de caractere aferent vor
rămîne neocupate.
⮚ În schimb, dacă lungimea șirului este mai mare decît
lungimea maximă, atunci șirul va fi trunchiat, retinîndu-
se atîtea caractere cît este lungimea maximă.
⮚ Putem să referim un anumit caracter al șirului îndicînd,
ca la orice vector, poziția pe care o ocupă caracterul în
șir.

Profesor: Ecaterina Guțu


Exemplu: Se declară o variabilă s de tipul string cu
lungimea maximă de 10 caractere. În consecință,
Program P1;
șirurile ce vor fi efectiv memorate în s ( prin
Var s, atribuire sau citire), pot avea cel mult 10
s1:string[10]; caractere. Pentru aceste caractere sunt rezervare
elementele s[1], s[2],…s[10] ale vectorului de
begin
caractere s.
s:=‘PROGRAM’; În prima atribuire, variabila s primește ca
Writeln(s); valoare șirul – ‘PROGRAM’. Caracterele acestui
șir vor fi memorate consecutiv în vectorul de
s1:=‘GENERATOARELE’;
cactere s începînd cu poziția 1. Astfel, s[1]
Writeln(s1); (caracterul de pe poziția 1) este ‘P’, s[2] este ‘R’ ,
End. s[3]= ‘O’ ... s[7] = ‘M’. Întrucît sirul ‘PROGRAM’
are numai șapte caractere, pozițiile 8,9,10 ale
vectorului s vor rămîne neocupate.
1 2 3 4 5 6 7 8 9 10

s P R O G R A M
ÎN SCHIMB, PRIN ATRIBUIREA S:= ‘GENERATOARELE’, VARIABILA S VA MEMORA DE
FAPT ȘIRUL ‘GENERATOAR’. ÎNTRUCÎT LUNGIMEA EFECTIVĂ A ȘIRULUI
‘GENERATOARELE’ DEPĂȘEȘTE ZECE CARACTERE (ATÎT CÎT ESTE DIMENSIUNEA
MAXIMĂ), ACESTA VA FI TRUNCHIAT, REȚINÎNDU-SE PRIMELE ZECE CARACTERE DIN
EL.
Profesor: Ecaterina Guțu
Operații cu șirurile de
caractere:

⮚ CONCATENAREA ȘIRURILOR
⮚ COMPARAREA A DOUĂ CARACTERE
⮚ COMPARAREA ȘIRURILOR DE
CARACTERE
⮚ PARCURGEREA PE CARACTERE A
UNUI ȘIR

Profesor: Ecaterina Guțu


CONCATENAREA ȘIRURILOR:

• Concatenarea o două șiruri de


caractere s și t înseamnă Exemplu:
”lipirea” celui de-al doilea șir Program P;
la sfîrșitul primului. Aceasta Var S1, S2, S3: string;
se realizează cu operatorul Begin
”+”. S1:=‘ SUPER’;
• Atenție însă, S2:=‘MARKET’;
concatenarea nu este S3:= S1+S2;
comutativă! {rezultă S3=‘SUPERMARKET’}
• Astfel, s+t nu este egal cu t+s, S3:=S2+S1;
așa cum se poate vedea din {rezultă S3=
exemplul următor. De ‘MARKETSUPER’}
asemenea, putem concatena S3:=S2+’ING’;
un singur caracter sau un {rezultă S3= ‘MARKETING’}
număr de caractere la sfîrșitul End.
unui șir.

Profesor: Ecaterina Guțu


COMPARAREA O DOUĂ CARACTERE:

⚫Limbajul Pascal folosește standardul ASCII, conform


căruia fiecare caracter se caracterizează printr-un așa-
numit cod ASCII, un întreg cuprins între 0 și 255.
Astfel, caracterele – literele mari ”A”, ”B”, ... ”Z”au codurile
de la 65 la 90, în acestă ordine, caracterele – ”a”, ”b”, ... ”z”
au codurile de la 97 la 122, iar caracterele - ”0”, ”1”, ... ”9”
au codurle între 48 și 57.
⚫Cînd se compară două caractere, calculatorul compară de
fapt codurile lor ASCII. Dacă C1 și C2 sunt două variabile
de tipul Char, atunci:
⚫ C1<C2 - codul caracterului C1 este mai mic decît codul
caracterului C2
Profesor: Ecaterina Guțu
COMPARAREA ȘIRURILOR DE
CARACTERE:

⚫Șirurile de caractere pot


fi comparate cu ajutorul
operatorilor relaționali
”<”, ”< =”, ”>”, ”>=”, Exemplu:
”=”, ”<>”.
⚫Compararea a două ‘Andrei’ < ‘Vlad’ deoarece
ord(‘A’)< ord(‘V’)
șiruri s și t vizează
ordinea lor alfabetică și ‘ Stop’ < ‘Stup’ - deoarece
se face caracter cu ord(‘o’) < ord(‘u’)
caracter.
‘Egal’ < ‘Egal ‘ – deoarece al
⚫ Dacă două șiruri au lungimi
doilea șir are lungime mai mare.
diferite și unul este subșir al
celuilalt, atunci șirul mai lung
va fi considerat mai mare.
Profesor: Ecaterina Guțu
PARCURGEREA PE CARACTERE A
UNUI ȘIR
⚫Așa cum am spus, un șir de caractere poate fi privit ca un vector
de caractere, în care fiecare caracter este identificat prin poziția
sa în cadrul șirului. Astfel, s[i] reprezintă caracterul de pe
poziția i a șirului s.
⚫Pentru a afla lungimea efectivă a unui șir de caractere avem la
dispoziție funcția predefinită length, căreia îi dăm ca
parametru șirului respectiv. Astfel, valoarea returnată de către
funcția length(s) reprezintă lungimea șirului memorat în
variabila s. Funcția length este utilă la proiectarea unui ciclu
pentru parcurgerea și prelucrarea caracterelor unui șir.
⚫Dacă lungimea efectivă a șirului memorat în s este length(s),
atunci pozițiile caracterelor în șir sunt 1,2, ..., length(s). De
exemplu, pentru șirul s=”Programare” : funcția length(s)
returnează 10, deci pozițiile celor șase caractere ale șirului sunt
1,2, ... , 10.

Profesor: Ecaterina Guțu


TRANSFORMAREA LITERELOR
MARI ÎN LITERE MICI ȘI INVERS
S este un șir de caractere care conțin litere mari, mici și alte
caractere
⚫ Algoritmul: ⚫ Algoritmul :
Program P; Program P;
Var s:string; Var s:string;
i:integer; i:integer;
Begin Begin
write(‘s’); readln(s); write(‘s’); readln(s);
For i:=1 to length(s) do For i:=1 to length(s) do
If (s[i]>=‘A’) and (s[i]<=‘z’) then If (s[i]>=‘a’) and (s[i]<=‘Z’) then
s[i]=chr(ord(s[i])+32); s[i]=chr(ord(s[i])-32);
Writeln(s); Writeln(s);
End. End.

Dar transformarea din literă mică în literă mare se mai poate realiza și în alt mod:
folosind funcția upcase(c) care primește drept parametru un caracter c. Dacă este o
literă mică, atunci upcase(c) returnează litera mare pereche. Avantajul acestei metode
constă
Profesor: în faptul
Ecaterina că nu mai trebuie testat dacă c este literă mică: dacă c nu este literă
Guțu
PROCEDURI ȘI FUNCȚII
PREDEFINITE PENTRU
ȘIRURI DE CARACTERE

Profesor: Ecaterina Guțu


Funcția COPY
Copy (<sir>, <poz>, <nr>); Copiază din șirul de caractere <sir> de
pe poziția <poz> numarul <nr> de caractere:

⚫Exemplu: ⚫Funcția copy(s,5,4)


Var S, S1:string; ”extrage” din șirul s un
subșir de 4 caractere,
Begin
începînd cu caracterul de
S:= ‘PROGRAMARE’; pe poziția 5, adică ”RAMA”,
S1:=copy(s,5,4); pe care îl returnează.
Writeln(S1); ⚫Valoarea returnată se
end atribuie variabilei s1,
s1=”RAMA”.

Profesor: Ecaterina Guțu


Funcția POS
Pos(<sir1>, <sir2>)-verifică dacă șirul sir1 se situiază în șirul
sir2 și returnează poziția de început în șirul sir2, dacă există,
sau 0 dacă sir1 nu se află în sir2.
⚫Exemplu: ⚫ Apelul Pos(s1,s), adică
pos(‘GRAM’, ‘PROGRAMARE’)
Program P; returnează 4, pentru că șirul
Var S, S1:string; ‘GRAM’ apare ca subșir al șirului
P1,P2:integer; ‘PROGRAMARE’, începînd cu
Begin poziția a patra, deci p1=4.
S:=‘PROGRAMARE’; În schimb apelul pos ( ‘Greu’, s)
S1:=‘GRAM’ returnează 0, pentru ca șirul
P1:=pos(S1,S);
‘GREU’ nu este subșir al șirului
P2:=pos (‘GREU’, S);
Writeln(P1, P2);
S=‘PROGRAMARE’, deci p2=0.
End.

Profesor: Ecaterina Guțu


Funcțiile ORD și CHR

Funcția Ord(caracter) Funcția Chr(număr) returnează


returnează codul ASCII al caracterul corespunzător
caracterului codului ASCII.

⚫Exemplu: ⚫Exemplu:
Ord(‘A’)=65 Chr(65)=A
Ord(‘a’)=97 Chr(97)=a

Profesor: Ecaterina Guțu


Funcția CONCAT

Funcția Concat(c1, c2, ...cn)


concatenează șirurile c1, c2, ... cn.
⚫Exemplu:
⚫Concat(”w”, ”Ts”)= wTs

Profesor: Ecaterina Guțu


Procedura DELETE

Delete ( <sir>, <poz>, <nr>); - șterge din șiriul <sir> de pe


poziția <poz> numărul <nr> de caractere.

⚫Exemplu: ⚫Apelul delete(s,8,2)


șterge din șirul
Program P; s=‘PROGRAMARE’
Var S,:string; un subșir de două caractere
Begin
S:=‘PROGRAMARE’; începînd cu caracterul de
Delete (S, 8, 2); pe poziția 8, adică subșirul
Writeln(S);
End. ‘AR’. După ștergere, șirul s
care îl afișează va fi
s=‘ PROGRAME’.
Profesor: Ecaterina Guțu
Procedura STR

STR(<nr>, <sir>); -
Transformă valoarea numerică <nr> într-un șir de caractere

⚫Exemplu: ⚫În urma apelului

Program P;
str(-23.25, s)
Var S,:string; Rezultă:
Begin
Str (-23.25, S); S=‘-23.25’
Writeln(S);
End.

Profesor: Ecaterina Guțu


Procedura INSERT

Inserează șirul sir1 incepînd


INSERT(<sir1>, <sir>, <poz>);
cu poziția poz

⚫Exemplu:
⚫Apelul insert( ‘AR’, S, 8),
Program P; inserează subșirul ‘AR’
Var S,:string; înșirul s=
Begin
S:= ‘PROGRAMARE’;
‘PROGRAMARE’ începînd
Insert (‘AR’, S, 8); cu poziția a opta.
Writeln(S);
End. ⚫După inserarea rezultatului
sirul s= ‘PROGRAMARE’
pe care îl afișează.
Profesor: Ecaterina Guțu
Procedura VAL
Incercă să transforme șirul de caractere <sir> într-o valoare
numerică <nr>. Dacă transformarea reușește nr memorează
numărul obținut prin transformarea iar e =0. dacă nu
reușește nr nu primește nici-o valoare iar e returnează poziția
caracterului din cauza căruia a eșuat transformarea.
val (<sir>, <nr>, <eroare>);
⚫ După apelul val (‘-23.25’,x1,e1)
Program P; Transformarea reușește, deci
Var e1,e2,: integer; x1= -23.25 și e1=0.
x1, x2:real; După apelul val(‘-23.A25’, x2, e2)
Begin transformarea șirului ‘-23.A25’
Val (‘-23.25’, x1, e1); în număr eșuează, din cauza caracterului
Val(‘-23.A25’, x2, e2); ‘A’ (nepermis pentru număr), aflat pe
……………………. poziția 5. Deci x2 este nedefinit și e2 = 5.
End.
Profesor: Ecaterina Guțu
CITIREA VARIABILELOR DE TIP ȘIR DE
CARACTERE DINTR-UN ȘIR DE CARACTERE

Într-o variabilă de tip string se poate citi o succesiune de


caractere dintr-un fișier text. Citirea începe cu caracterul la
care se află îndicatorul(pointerul) de fișier și funcționează
astfel:

⮚ Dacă la declararea variabilei de tip string, s-a precizat


lungimea maximă, atunci în variabila respectivă se vor citi
atîtea caractere cît este lungimea maximă a variabilei.

⮚ Dacă nu s-a precizat lungimea maximă, atunci în variabila


respectivă se vor putea citi pînă la 255 de caractere. Astfel,
dacă pînă la sfîrșitul rîndului în fiâier sunt mai putin de 255
de caractere, atunci acestea se vor citi toate.

Profesor: Ecaterina Guțu


Exemplu: Presupunem că avem două fișiere text SIR.txt, care
conțin 2 rînduri identice
(prin ”_” am simbolizat caracterul ”spațiu”)

Program p; Fișierului SIR.txt i-am asignat descriptorul f, pe care l-am


Var S1:string;
declarat ca pe o variabilă ce aparține tipului predefinit text.
S2:string[5];
f:text; Apoi am deschis feșierul f pentru citire(cu reset). După
Begin deschidere, indicatorul este poziționat ca întotdeauna la
Assign(f,’Sir.txt’);
începutul fișierului. În urma execuției instrucțiuniii readln(f,S1) ,
Reset(f);
Readln(f, S1); se va citi în variabila S1 primul rînd integral( cu mutarea
Readln(f, S2); cursorului după citire la începutul rîndului al doilea), deoarece la
Writeln(S1);
declarea lui S1 nu s-a specificat dimensiunea maximă.
Writeln(S2);
Close(f); Rezultă așadar S1= ‘Marea_Neagră ’. În schimb, instrucțiunea
End. readln(f, S2) va avea ca efect citirea în variabila S2 a primelor 5
caractere de pe rîndul al doilea, deoarece, conform declarației,
șirul S2 are lungimea maximă de 7. În consecință, S2= ‘Marea’.

Profesor: Ecaterina Guțu


CITIREA VARIABILELOR DE TIPURI
DIFERITE DINTR-UN FIȘIER:

• Printr-un singur apel al procedurii read sau readln, se


pot citi mai multe variabile de tipuri diferite.
• Fie fișierul
Var x,y:real; a,b:integer;
cu descriptorul Ch:char; s:string[3]; f:text;
Begin
F avînd următorul Assign(f,’exemplu.txt’);
conținut: reset(f);
Readln(f,x,s,a); {de pe primul rînd al fișierului se
citesc x=‘4.25’, s=‘@#$’, a=9}
Readln(f, ch, b) ; {de pe al doilea r]nd se citesc
4.25 @#$ ch=‘^’, b=‘4’}
9 Readln(f,y); {citirea variabilei y eșuează, întrucît
^ -4 suucesiunea de caracterea ’ 1.8S7‘ nu poate fi
1 . 8S7 transformată într-un număr real}
End.
Profesor: Ecaterina Guțu
SCRIEREA UNUI ȘIR DE CARACTERE
ÎNTR-UN FIȘIER TEXt
•Un șir de caractere memorat într-o variabilă ”Șir”poate
fi scris într-un fișier text, printr-o instrucțiune de
genul:
Write*(<descriptorul>, <sir>);
sau
Writeln(<descriptor>, <sir>);
Deosebirea dintre cele două rînduri este similară cu cea
cunoscută de la afișarea pe ecran: dacă folosim
instrucțiunea writeln atunci după scrierea șirului
pointerul de fișier va ”sări” la începutul rîndului
următor, ira în cazul utilizării instrucțiunii write
pointerul va rămîne acolo unde a ajuns.
Profesor: Ecaterina Guțu
APLICAȚII

Profesor: Ecaterina Guțu


Se consideră un șir de caractere Se consideră un fișier text în
format din literele mici și mari ale care este însrisă o poezie. Să se
scrie un program care crează
alfabetului latin. Să se scrie un
un alt fișier cu același
program care transformă literele conținut, în care toate literele
mari în literele mici. să fie majuscule

program P2;
var f1, f2:text;
program p1; k,s:string; i:byte;
var s:string; begin
i:byte; write(' Dati numele fisierului');
begin readln(s);
assign(f1,s); reset(f1);
write('introdu un sir de caractere');
assign(f2,'LitereMARI.txt');
readln(s);
rewrite(f2);
write(' Sirul dupa transforare'); while not Eof(f1)do
for i:=1 to length(s) do begin
if (s[i]>='A') and (s[i]<='Z') then for i:=1 to length(k) do
s[i]:=Chr(Ord(s[i])+32); k[i]:= Upcase(k[i]); writeln(f2,k);
{transforma litera mare in litera end;
mica} close(f1); close(f2);
while Not Eof(f2) do
writeln(s);
begin
readln
readln(f2,k); writeln(k);
end. end;
Profesor: Ecaterina Guțu close(f2);
Bibliografie:
✔INFORMATICA PENTRU GIMNAZIUA. EMANUELA
CERCHEZ, MARINEL CERBAN, IAINFORMATICA PENTRU
GIMNAZIUA. EMANUELA CERCHEZ, MARINEL CERBAN,
IAȘI,INFORMATICA PENTRU GIMNAZIUA. EMANUELA
CERCHEZ, MARINEL CERBAN, IAȘI, EDITURA POLIROM
2002INFORMATICA PENTRU GIMNAZIUA. EMANUELA
CERCHEZ, MARINEL CERBAN, IAȘI, EDITURA POLIROM
2002;
✔TURBO PASCAL. CULEGERE DE PROBLEME. ANDREI
BRAICOV, CHIȘINĂU, EDITURA PRUT INTERNAȚIONAL
2005;
✔HTTP://REFERAT.CLOPOTEL.RO/TIPUL_STRING-
10459.HTML
✔ HTTP://WWW.ASCIITABLE.COM/
Profesor: Ecaterina Guțu

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