Valorile
tipului de date String sînt şiruri de caractere incluse între apostrofuri cu
lungimea nu mai mare de 255 de simboluri. La declararea unei variabile de tip
String putem preciza lungimea maximă a şirurilor de caractere ce pot fi
memorate în variabila respectivă incluzînd
numărul dat în paranteze pătrate după cuvîntul String. Dacă şirul de
caractere efectiv memorat într-o variabilă de tip String are lungimea mai mare
decît dimensiunea maximă a variabilei, atunci şirul va fi trunchiat.
Operatorii
aplicaţi valorilor de tip şir de caractere.
1)
‘+’- concatenarea (alipirea)
a două şiruri;
2)
Operatorii relaţionali:
=(egal), <> (diferit), <( mai mic), >(mai mare), <=(mai mic sau
egal), >=( mai mare sau egal). Comparaţia se face din punct de
vedere lexicografic.
Procedurile
şi funcţiile predefinite pentru şiruri de caractere.
1)
Funcţia Length
Sintaxa:
Length(<şir de caractere>)
Funcţia: Returnează
numărul efectiv de caractere ale şirului.
2)
Funcţia Copy
Sintaxa:
Copy(<şir de caractere>,<poz>,<nr>)
Funcţia:Formează şi
întoarce un subşir al şirului de caractere; subşirul va începe de la poziţia <poz> în <şir
de caractere> şi va avea lungimea <nr> caractere.
3)
Funcţia Pos
Sintaxa:
Pos(<şir de caractere_1>,<şir
de caractere_2>)
Funcţia: Testează
dacă şirul <şir de caractere_1>
este un subşir al şirului <şir de caractere_2>. În caz
afirmativ, returnează poziţia primei apariţii, în caz contarar, returnează
valoarea 0.
4)
Procedura Delete
Sintaxa:
Delete(<şir de caractere>,<poz>,<nr>)
Funcţia: Şterge din
şirul <şir de caractere> un şubşir de lungime <nr> de caractere, începînd cu
poziţia <poz>.
5)
Procedura Insert
Sintaxa:
Insert(<subşir>,<şir de caractere>,<poz>)
Funcţia: Inserează
subşirul <subşir> în şirul de caractere <şir de caractere>
începînd cu poziţia <poz>.
6)
Procedura Str
Sintaxa: Str(<nr>,<şir de caractere>)
Funcţia: Transformă
numărul <nr> în
şirul de caractere corespunzător, pe care îl memorează în variabila <şir de caractere>.
7)
Procedura Val
Sintaxa: Val(<şir de
caractere>,<nr>,<eroare>)
Funcţia: Încearcă să
convertească şirul de caractere <şir de caractere> în numărul
corespunzător. Tentativa va reuşi dacă şirul conţine numai caractere permise
pentru un număr, adică cifre, punctul zecimal şi caracterul -. La apel
parametrii <nr> şi <eroare> vor fi identificatri de variabile, valorile acestora completîndu-se în
urma execuţiei procedurii astfel:
§ dacă transformarea reuşeşte, atunci în <nr> se
memorează numărul rezultat prin transformare, iar în <eroare> se memorează 0;
§ dacă transformarea eşuiază, atunci
<nr> va fi nedefinit, iar în <eroare> se memorează poziţia în şir a primului character din cauza căruia a
eşuat transformarea.
Parcurgerea
caracterelor unui şir.
Un şir de
caractere poate fi privit ca un tablou unidimensional în care fiecare caracter
ocupă o anumită poziţie. Putem să
referim un anumit caracteral şirului, indicînd poziţia pe care o ocupă
caracterul în şir. Ştiind că lungimea efectivă a unui şir X este returnată de
funcţia length(X), rezultă că poziţiile efectiv ocupate de caracterele şirului
sînt 1, 2, ...,length(X).
Pentru a
parcurge caracterele şirului, scriem un ciclu în care parcurgem poziţiile
caracterelor i=1,...,length(X) şi pentru fiecare valoare a lui i, prelucrăm
caracterul X[i].
For
i:=1 To Length(X) Do <prelucrează X[i]>;
Limbajul
Pascal foloseşte setul de caractere ASCII, în care fiecare caracter are un cod
cuprins între 0 şi 255. Există două funcţii predefinite care realizează
legătura dintre un caracter şi codul său:
·
chr(<nr>)
–returnează caracterul cu codul <nr>;
·
ord(<ch>)-returnează
codul ASCII al caracterului <ch>.
Transformarea unui character ch din literă
mică în litera mare corespunzătoare se poate realiza utilizînd funcţia
predefintă UpCase: ch:=UpCase(ch). Nu trebuie
testat dacă ch este o literă mică, deoarece în caz contrar apelul
funcţiei UpCase nu are nici un efect.
Aplicaţii.
1.
Problema Nr. 1.
Determinaţi numărul semnelor de ‘+’
dintr-un şir de caractere.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează numărul de semne de ’+’.
Algoritmul: Declarăm o variabilă contor, care
iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru
fiecare simbol testăm, dacă nu este ’+’. Dacă condiţia se respectă, la
variabila contor se adună o unitate.
Program Numarul_semne;
Uses CRT;
Var X:String;
I,N:Byte;
Begin
ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
N:=0;
For I:=1 To Length(X) Do
If X[I]=’+’ Then Inc(N);
WriteLn(’Num de semne de + este:’,N);
ReadLn End.
2.
Problema Nr. 2.
Determinaţi numărul de vocale dintr-un şir de caractere.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează numărul de vocale.
Algoritmul: Declarăm o variabilă contor, care
iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru
fiecare simbol testăm, dacă nu este vocală. Dacă condiţia se respectă, la
variabila contor se adună o unitate.
Program Numarul_vocale;
Uses CRT;
Var X:String;
I,N:Byte;
Begin
ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
N:=0;
For I:=1 To Length(X) Do
If UpCase(X[I]) in
[’A’,’E’,’I’,’O’,’U’] Then Inc(N);
WriteLn(’Num de vocale=’,N);
ReadLn End.
3. Problema Nr. 3. Se
consideră șirul S. Să se scrie un program care numără aparițiile unui caracter
arbitrar x în șirul dat.
Intrare: şirul de
caractere şi caracterul se citesc de la tastatură.
Ieşire: la
ecran se afişează numărul de apariţii ale caracterului dat în şir.
Algoritmul: Declarăm o variabilă contor, care
iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru
fiecare simbol testăm, dacă nu este caracterul dat. Dacă condiţia se respectă,
la variabila contor se adună o unitate.
Program caracter_arbitrar;
Uses crt;
Var S:String;
K,I:Byte;
X:Char;
Begin
Clrscr;
Write (‘Introdu un sir de
caractere: ’);
Readln (S);
Write (‘Introdu un character : ’);
ReadLn(X);
K=0;
For I:=1 to Length(S) do
If S[I]=X Then Inc(K);
WriteLn(’Sirul ’,S,’ contine ’,K,’
caractere ’,X);
Readln End.
4. Problema Nr.4. Se dă o propoziţie care se
termina cu punct ( . ). De alcătuit un program care numără cîte vocale, cîte
consoane și cîte alte caractere se întîlnesc în propoziție.
Intrare: propoziţia
se citeşte de la tastatură.
Ieşire: la
ecran se afişează numărul de vocale, consoane şi alte caractere ce se întîlnesc
în propoziţia dată.
Algoritmul: Declarăm 3 variabile contor, care
iniţial se zerografiază. Parcurgem şirul de caractere într-un ciclu şi pentru
fiecare simbol testăm, dacă nu este vocală sau consoană. Dacă condiţia se
respectă, la variabila contor pentru vocale sau respectiv pentru consoane se
adună o unitate. Numărul de caractere ce nu sînt vocale şi nici consoane îl
calculăm prin diferenţa dintre numărul total de simboluri cu vocale şi
consoane.
Program Numar_vocale_consoane_simboluri;
Var Sir:String[80];
Vocale,Consoane, I:Integer;
Begin
Write(‘Introdu propozitia:’);ReadLn(Sir);
I:=1;Vocale:=0;Consoane:=0;
While Sir[I]<>’.’ Do
Begin
If Upcase(Sir[I]) in
[‘A’,’E’,’I’,’O’,’U’] then Inc(Vocale)
Else If Upcase(Sir[I]) in [‘A’..’Z’] Then Inc(Consoane) ;
Inc(I)
End;
Writeln(‘Vocale:’,Vocale,’ Consoane:’,
Consoane,
’ Alte caractere:’,i-Vocale-Consoane);
ReadKey End.
5. Problema Nr. 5 Excludeţi spaţiile dintr-un
şir de caractere.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează şirul de caractere fără spaţii.
Algoritmul: Vom utiliza funcţia Pos, cu
ajutorul căreia vom testa atîta timp cît
există spaţii în şir, determină poziţia primului spaţiu şi îl exclude cu
procedura Delete.
Program Excludere_spatii;
Uses CRT;
Var X:String;
Begin
ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
While Pos(’
’,X)>0 Do Delete(X,Pos(’
’,X),1);
WriteLn(’Sirul fara spatii este ’,X);
ReadLn End.
6. Problema Nr. 6. Se dă o mărime de tip șir de caractere S. De alcătuit programul
care ar înlocui combinația de litere ’doi’
prin cifra ’2’.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează şirul de caractere modificat.
Algoritmul: Se determină poziția de început a
cuvîntului în șirul de caracter S; dacă poziția este diferită de 0 înseamnă că
acest cuvînt există în șir, se șterge acest cuvînt din șirul S și se inserează
pe aceeași poziție cifra ’2’.
Program Sirul_doi_prin_2;
Uses Crt;
Var
S:String;
P:Byte;
Begin
ClrScr; Write('Scrie textul: ');
Readln(s);
P:=Pos('doi ',S);
While P<>0 Do Begin
Delete(S,P,3);
Insert(’2’,S,p);
P:=Pos('doi ',S)
End;
Write(’Sirul obtinut este:’,S);
Readkey End.
7. Problema Nr.7. Excludeţi cifrele dintr-un şir de caractere.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează şirul de caractere fără cifre.
Algoritmul: Parcurgem şirul de caractere
într-un ciclu şi pentru fiecare simbol testăm, dacă este cifră. Dacă condiţia se respectă,
excludem simbolul dat, în caz contrar verificăm următorul simbol.
Program Excludere_cifre;
Uses CRT;
Var X:String;
I:Byte;
Begin
ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
I:=1;
While I<=Length(X) Do
If X[I] in [’0’..’9’] Then
Delete(X,I,1) Else Inc(I);
WriteLn(’Sirul fara cifre este ’,X);
ReadLn End.
8. Problema Nr. 8 Fie dat un număr natural N. Alcătuiți programul, conform căruia vom
obține un alt număr K, ce se deosebește de N prin faptul că nu conține
cifre de ’2’ și ’4’, păstrîndu-se consecutivitatea celorlalte cifre.
Intrare: numărul N
se citeşte de la tastatură.
Ieşire: la
ecran se afişează numărul fără cifrele 2 şi 4.
Algoritmul: Transformăm numărul în şir de
carcatere. Parcurgem şirul de caractere într-un ciclu şi pentru fiecare simbol
testăm, dacă este cifră 2 sau 4. Dacă
condiţia se respectă, excludem simbolul dat, în caz contrar verificăm următorul
simbol. Şirul obţinut după excludere îl transformăm în număr.
Program Numar;
Uses Crt;
Var N,K:Longint;
S:String;
I:Integer;
Begin
ClrScr; Write('N=: '); ReadLn(N);
Str(N,S); I:=1;
While I<=Length(S) Do
If (S[I]=’2’) Or (S[I]=’4’) Then Delete(S,I,1) Else I:=I+1;
Val(S,K,I);
if I=0 Then Write
(’Numarul obtinut este:’, K)
Else Write(’Numarul initial a fost format doar din 2 si 4’);
Readkey End.
- Problema Nr. 11. Se dă o mărime de tip șir de caractere S alcătuită din cuvinte
despărțite prin mai multe lacune. De alcătuit programul care ar înlocui în
această mărime lacunele dintre cuvinte prinr-o singură lacună.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează şirul de caractere modificat
Algoritmul: Parcurgem şirul de caractere
într-un ciclu şi pentru fiecare două simboluri alăturate, care sunt lacune,
eliminăm lacuna a doua.
Program Excludere_cifre;
Program Sirul;
Uses Crt;
Var
S:String[80];
I:Byte;
Begin
ClrScr;
Write('Scrie textul: '); ReadLn(S);
I:=1;
While I<Length(S) Do
If (S[I]=’ ’) and (S[I+1]=’ ’) Then Delete(S,I,1)
Else I:=I+1;
Write(’Sirul obtinut este:’,S);
Readkey
End.
9. Problema Nr. 9. Determinaţi şi afişaţi la ecran toate prefixele unui cuvînt,
valoarea căruia se citeşte de
la tastatură. (prefixele unui şir sînt subşirurile formate din primele
caractere ale şirului)
Intrare: cuvîntul
se citeşte de la tastatură.
Ieşire: la
ecran se afişează prefixele cuvîntului unul sub altul.
Algoritmul: Formăm prefixele într-un ciclu,
titipăriind la ecran cuvîntul fără ultimul caracter, apoi fără ultimile două
ş.a.m.d.
Program Prefixele_cuvintului;
Uses CRT;
Var X:String;
I:Byte;
Begin
ClrScr;
Write(’Introduceti cuvintul:’);ReadLn(X);
For I:=2 To Length(X) Do
WriteLn(Copy(X,1,Length(X)-I+1);
ReadLn End.
10. Problema Nr. 10. Să se determine codificarea “păsărească” a unui cuvînt, ce constă din adăugare după fiecare vocală din cuvînt a grupului
format din caracterul p urmat de vocala respectivă.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire: la
ecran se afişează şirul de caractere codificat.
Algoritmul: Parcurgem şirul de caractere
într-un ciclu şi pentru fiecare simbol testăm, dacă este vocală. Dacă condiţia se respectă,
adăugăm după vocală litera p împreună cu vocala dată şi mărim valorea contorului
cu 3 unităţi, în caz contrar verificăm următorul simbol, mărind valorea
contorului cu o unitate.
Program Codificare_pasareasca;
Uses CRT;
Var X:String;
I:Byte;
Begin
ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
I:=1;
While I<=Length(X) Do
If UpCase(X[I]) in
[’A’,’E’,’I’,’O’,’U’] Then
Begin Insert(’p’+X[I],X,I+1); Inc(I,3)
End Else Inc(I);
WriteLn(’Sirul codificat ’,X);
ReadLn End.
11. Problema Nr. 11. Calculaţi suma cifrelor
zecimale şi suma pătratelor cifrelor zecimale.
Intrare: şirul de
caractere se citeşte de la tastatură.
Ieşire:la
ecran se afişează într-o linie suma cifrelor zecimale şi suma pătratelor
cifrelor zecimale, separate prin spaţiu.
Algoritmul: Declarăm 2 variabile de tip întreg
pentru suma cifrelor zecimale şi suma pătratelor cifrelor zecimale, care
iniţial se zerografiază. Parcugem într-un ciclu şirul de caractere. Încercăm să convertim fiecare simbol din
şirul de caractere în numărul corespunzător. Dacă tentativa ne reuşeşte, adunăm
la variabila pentru sumă numărul obţinut, iar la variabila pentru suma
pătratelor cifrelor adunăm pătratul numărului obţinut.
Program Sume_cifre;
Uses CRT;
Var X:String;
Cod, S,Sp:Integer;
I:Byte;
C:0..9;
Begin
ClrScr;
Write(’Introduceti sirul:’);ReadLn(X);
S:=0; Sp:=0;
For I:=1 To Length(X) Do
Begin
Val(X[I],C,Cod);
If Cod=0 Then Begin
S:=S+C;
Sp:=Sp+Sqr(C)
End;
WriteLn(S,’ ’,Sp);
ReadLn End.
12. Problema Nr. 12. Fie dat un şir din cel mult 255 caractere. Scrieţi un program care
determină caracterul cu un număr maxim de apariţii în acest şir. Dacă
există mai multe caractere cu număr maxim de apariţii, se indică toate.
Intrare:
şirul de caractere se citeşte de la tastatură.
Ieşire: la ecran
se afişează într-o linie numărul maxim de apariţii, în linia a doua se afişează
caracterele cu număr maxim de apariţii, separate prin spaţiu.
Algoritmul: Declarăm un tablou unidimensional
cu indicii – valorile tipului Charşi componentele – elemente naturale. Iniţial
tabloul se zerografiează. Parcurgem şirul de caractere şi adunăm cîte o unitate
la valoarea elementului tabloului cu indicele egal cu simbolul din şir. În
rezultat vom număra pentru fiecare simbol de cîte ori se conţine în şirul de
caractere. Detrminăm valoarea maximă din acest tablou şi obţinem în rezultat
numărul maxim de apariţii a simbolurilor în şirul de caractere.
Program Caractere;
Uses CRT;
Type Lin=Array[Char] Of Byte;
Var P:String;
N:Lin;
I,Max:Byte;
Begin
ClrScr;
Write('Introduceti sirul de caractere:');ReadLn(P);
For I:=0 To 255 Do N[Chr(I)]:=0;
For I:=1 To Length(P) Do Inc(N[P[I]]);
Max:=N[Chr(0)];
For I:=2 To 255 Do
If N[Chr(I)]>Max Then Max:=N[Chr(I)];
WriteLn('Nr maxim:',Max);
For I:=0 To 255 Do
If N[Chr(I)]=Max Then Write(Chr(I),' ');
ReadLn
End.
13. Problema Nr. 13. Se dă o mărime de tip șir. De scris un program, care află cel mai
lung cuvînt din această mărime. Cuvintele sunt separate printr-un singur
spațiu.
Intrare:
propoziţia se citeşte de la tastatură.
Ieşire: la ecran se
afişează cuvîntul de lungime maximă şi lungimea lui, fiind separate prin
spaţiu.
Algoritmul: Se separă cuvîntul ordinar din șir
și se determină lungimea lui. Dacă ea este mai mare decît cea precedentă,
atunci păstrăm acest cuvînt și lungimea lui. Operațiile sunt repetate atît timp
cînt contorul caracterului analizat nu depășește lungimea șirului dat.
Program Sirul_lung;
Uses Crt;
Var T, S, C_max:String;
I, L_max:Byte;
Begin
ClrScr;
Write('Scrie textul: '); ReadLn(S);
T:=' '; I:=1; L_max:=0;
While I<=Length(S) Do
Begin
If S[I]<>’’ Then T:=T+S[I]
Else If T<>' ' Then Begin
If Length (T)>L_max Then Begin
L_max:=Length(T); C_max:=T
End;
T:=’ ’;
end;
Inc(I)
End;
If T<>’ ’ Then Length (T)>L_max
Then Begin
L_max:=Length(T); C_max:=t
End;
Write(’Cel mai lung cuvint este:’, C_max
,’ cu lungimea’, L_max);
Readkey End.
14. Problema Nr.14. Fie dată o propoziţie din cel mult 250 caractere, cuvintele fiind
separate printr-un spaţiu. Toate cuvintele au lungimi distincte. Scrieţi
un program care reordonează cuvintele în ordinea creşterii lungimii lor.
Intrare:
propoziţia se citeşte de la tastatură.
Ieşire: la ecran
se afişează propoziţia modificată, cuvintele fiind separate prin spaţiu.
Algoritmul: Declarăm un tablou unidimensional
cu elementele – şiruri de caractere. Copiem cuvintele din propoziţie în tablou.
Ordonăm tabloul crescător după lungimile cuvintelor şi formăm propoziţia
înscriind cuvintele în ordinea ce se găsesc în tabloul ordonat.
Program Propozitia_ordonata;
Uses CRT;
Type TipSir=String[250];
Lin=Array[1..100] Of TipSir;
Var P, Min:TipSir; (* propozitia *)
A:Lin; (* tabloul cu cuvinte *)
N,I,J,Loc:Byte;
(* N - numarul de cuvinte, I - contor p/u ciclu *)
Begin
ClrScr;
Write('Propozitia:');ReadLn(P);
(* exclude spatiile de la inceputul propozitiei, daca exista *)
While P[1]=' ' Do Delete(P,1,1);
(* transfera cuvintele din prop. intr-un tablou liniar *)
N:=0;
While Pos(' ',P)>0 Do
Begin
Inc(N);
A[N]:=Copy(P,1,Pos(' ',P)-1);
Delete(P,1,Pos(' ',P))
End;
Inc(N); A[N]:=P;
(* ordoneaza cuvintele crescator dupa
lungime *)
For I:=1 To N-1 Do
Begin
Min:=A[I]; Loc:=I;
For J:=I+1 To N Do
If Length(A[J])<Length(Min) Then Begin
Min:=X[J];
Loc:=J
End;
A[Loc]:=X[I]; A[I]:=Min
End;
P:='';
For I:=1 To N-1 Do
P:=P+A[I]+' '; P:=P+A[N];
WriteLn('Propozitia modificata:',P);
ReadLn End.