Sunteți pe pagina 1din 12

Siruri de Caractere

Tipul STRING. Tipul SET Abordare n limbajul Pascal Notiuni teoretice Tipul STRING (ir de caractere) Un ir de caractere este o succesiune de caractere cuprins ntre dou apostrofuri i poate s conin orice caractere: litere mari i mici, caractere speciale (#, &, etc.) i delimitatori (virgul, punct, etc.). Limbajul Pascal folosete standardul ASCII, conform cruia fiecare caracter se caracterizeaz printr-un aa-numit cod ASCII, un ntreg cuprins ntre 0 i 255. Astfel, caracterele-liter mare A, B, , Z au codurile de la 65 la 90, n aceast ordine, caracterele-liter mic a, b, , z au codurile de la 97 la 122, iar caracterele-cifr 0, 1, , 9 au codurile ntre 48 i 57. Cnd compar dou caractere, calculatorul compar de fapt codurile lor ASCII. ntre codurile ASCII ale celor dou litere-pereche exist relaia: codul caracterului-liter mare + 32 = codul caracterului-liter mic

Proceduri i funcii predefinite pentru iruri 1) Funcia COPY copy(<ir>,<poz>,<nr>)

returneaz un subir al irului de caractere <ir>, care ncepe din poziia <poz> i are <nr> caractere. 2) Funcia POS pos(<sir1>,<sir2>) returneaz poziia de nceput a lui <sir1> n cadrul irului <sir2>, n cazul n care <sir2> este subir al lui <sir1>. n caz contrar funcia returneaz valoarea 0. 3) Procedura DELETE delete(<sir>,<poz>,<nr>) terge din irul <sir>, un subir de lungime <nr> caractere, subir care ncepe de la poziia <poz>. irul rezultat dup tergere este memorat tot n parametrul <sir>. 4) Procedura INSERT insert(<subsir>,<sir>,<poz>) - insereaz subirul <subsir> n cadrul irului de caractere <sir>, ncepnd cu poziia <poz>. Parametrul <sir> este o variabil care dup execuia procedurii va conine irul rezultat prin inserare. 5) Procedura STR str(<nr>,<sir>)

- transform numrul <nr> n irul de caractere corespunztor, pe care l memoreaz n parametrul <sir>. La apel, parametrul <sir> va fi un identificator de variabil de tip string. 6) Procedura VAL val(<sir>,<nr>,<eroare>) ncearc s converteasc irul de caractere <sir> n numrul corespunztor. Tentativa va reui dac irul conine numai caractere permise pentru un numr, adic cifre, punctul zecimal i caracterul -. La apel, parametrii <nr> i <eroare> vor fi identificatori de variabile, valorile acestora completndu-se n urma execuiei procedurii, astfel: dac transformarea reuete, atunci n parametrul <nr> se memoreaz numrul rezultat prin transformare, iar parametrul <eroare> va primi valoarea 0; dac transformarea eueaz, atunci parametrul <nr> va fi nedefinit, iar n parametrul <eroare> se memoreaz poziia n ir a primului caracter din cauza cruia a euat transformarea.

B) Tipul SET (mulime) Limbajul Pascal permite definirea mulimilor n sensul cunoscut din matematic, cu ajutorul tipurilor de date anonime set of. Elementele unei astfel de mulimi, n numr de maxim 256, sunt valori distincte de acelai tip, numit tip de baz. Pentru a memora efectiv o mulime trebuie s declarm o variabil. Sintaxa declarrii unei variabile de tip mulime este: var <id>:set of <tip_elem>; unde: - <id> = identificatorul (numele) variabilei de tipul mulime - <tip_elem> = tipul de baz al elementelor mulimii. Tipul de baza al elementelor trebuie s fie un tip ordinal care poate cuprinde maxim 256 de valori. Operatori aplicabili tipului mulime a) operatori aritmetici + reuniune * intersectie - diferenta b) operatori relationali (cu ajutorul lor se pot forma expresii logice) IN apartenenta: <element> IN A testeaza daca o valoare <element> apartine multimii A <=, >= incluziune <> diferit = egalitate Citirea unei multimi Variabilele de tip multime nu pot fi citite in mod direct. Pentru a citi o multime M procedam astfel: Initializam M cu multimea vida: {M:=[];}. Apoi, intr-un ciclu, citim pe rand, in aceeasi variabila, de exemplu x, valorile care vor fi elemete ale multimii. Pentru fiecare valoare citita a lui x, adaugam prin reuniune multimea formata cu elementul x, la multimea M: {M:=M+[x];}. Prin reuniune, fecare nou x va fi adaugat la multimea M numai daca valoarea lui x nu exista deja in multime. Afisarea unei multimi Variabilele de tip multime nu pot fi afisate direct. Pentru a afisa o multime, vom parcurge intr-un ciclu toate valorile care fac parte din tipul elementelor multimii, adica toate valorile care teoretic ar putea fi elemente ele multimii. Pentru fiecare din aceste valori, testam daca valoarea respectiva apartine efectiv multimii, iar in caz afirmativ o afisam.

Iata cateva exemple de multimi pe care le putem utiliza in problemele de la tipul string si nu numai (ex.: sa verificam daca un caracter din sir este vocala / consoana / litera mare / litera mica / caracter-cifra). Vom declara aceste multimi ca niste constante, la sectiunea de declarare a constantelor din cadrul unui program Pascal, precedate de cuvantul-cheie const, astfel: const vocale=[A,E,I,O,U,a,e,i,o,u]; litere_mari=[A..Z]; litere_mici=[a..z]; consoane=litere_mari + litere_mici - vocale; cifre=[0..9]; separatatori=[ ,,,.,;,?,!]; Probleme propuse 1) Se citeste de la tastatura un cuvant de lungime cel mult 20 de caractere, format numai din litere mari. Sa se afiseze toate cuvintele distincte ce se pot forma prin eliminarea cate unui singur caracter din cuvantul dat. Exemplu: pentru cuvantul BINE se vor afisa, nu neaparat in aceasta ordine, cuvintele: INE BNE BIE BIN

2) Sa se scrie un program care inverseaza intr-un text toate cuvintele care incep cu litera a sau A prin oglindire. Cuvintele din text se considera separate prin spatii (unul sau mai multe). Exemplu: Textul Acesta este un exemplu aproape perfect asa ca am insistat sal vezi acum si tu. se va transforma in atsecA este un exemplu epaorpa perfect asa ca ma insistat sa-l vezi muca si tu..

3) Se dau n propozitii formate din caractere ale alfabetului englez (mari si mici). Ultimele caractere ale fiecarei propozitii sunt cifre care formeaza un numar intreg. Se cere sa se afiseze aceste propozitii in ordinea crescatoare a numerelor cu care se termina. La afisare, numerele respective vor fi eliminate. Exemplu: pentru n=3 si propozitiile Elicopterul zboara jos 12, Alina citeste o carte 90, Bunica este batrana si bolnava 5 se va afisa Bunica este batrana si bolnava Elicopterul zboara jos Alina citeste o carte

4) Se introduc de la tastatura doua numere naturale memorate in doua

variabele de tip string.(numarul de cifre <=250). Se cere sa se afiseze suma si diferenta dintre cel mai mare si cel mai mic numar. Exemplu: 123+9799=9922; 123-96=27

5) Se citeste de la tastatura o propozitie terminata prin punct. Propozitia este alcatuita din cuvinte formate numai din litere mari. Cuvintele sunt separate prin unul sau mai multi separatori: spatiu, virgula, doua puncte. Stiind ca propozitia are cel mult 30 de cuvinte, sa se afiseze grupurile de cuvinte din care fiecare membru reprezinta o anagrama a altui membru din grup (un cuvant are maximum 16 litere). Un grup va contine numarul maxim de membri; membrii dintr-un grup sunt distincti. Nu se considera gruparile cu un singur membru. 6) Fiind dat un careu rebusistic, sa se determine toate cuvintele care apar in careu si sa se verifice daca un cuvant apare de mai multe ori. Patratelele negre din careu sunt date utilizand caracterul *. Se considera ca un cuvant are cel putin 2 caractere. Exemplu: pentru n=12 si careul

* P *

P R

* E

O * T U

S T I *

* I E P E *

D I S C I P L I

N D E N * O R A I V A *

O M E N I T * I

U N *

A S N L * I * A

O S *

C H R I B * S M *

O S * B * T I C

C A

G S T

R O T E L I E F T *

N E A P I * * L A S

E U R A * T T

E R * G A I

A N A T I

P U * C R I

U T R A I T

R E

S A R

cuvintele sunt: PRETUTINDENI, OMENIE, ORAS, UNITI, PASNIC, OS, CHEL, IVI, CAR, GS, AP, TROTINETA, BIET, BA, EURI, CLER, PLATAN, PUI, ASIA, UTA, REGIM, STRAT, CIFRE, SARITI, PRONOSTICURI, EMIS, RELIEF, OTET, COTE, GR, UNICAT, RAIE, STI, HRIB, SM, IEPE, NAPI, CN, ALGE, LASA, DOS, STEA, TR, IERNI, AUTURI,

NAIVA, RATAT, DISCIPLINATI, iar cuvantul OS este singurul care se repeta.

1. Fie dat un sir de caractere alcatuit din mai multe propozitii ce se termina cu.(punct). De determinat numarul de propozitii din acest text.
Program P1; var s:string; i,k:integer; begin write('dati un sir de caractere:'); readln(s); k:=0; for i:=1 to length(s) do if s[i]='.' then k:=k+1; write('nr propozitiilor:',k); readln; end.

2. De determinat pozitia primului .(punct) din text si pozitia ultimului.(punct).


Program P2; var s:string; i:integer; begin write('s='); readln(s); writeln('pozitia primului punct:',pos('.',s),' '); for i:=length(s) downto 1 do if s[i]='.' then begin write('pozitia umtimului punct:',i); break; end; end.

3. Fie avem un sir de caractere, de determinat cite litere si cite cifre sint in acest sir.
Program P3; var s:string; cif,litere,i:integer; begin writeln('dati un sir de caractere:'); readln(s); cif:=0; litere:=0;

for i:=1 to length(s) do case s[i] of '0'..'9':cif:=cif+1; 'a'..'z','A'..'Z':litere:=litere+1; end; write('cif=',cif,' ','litere=',litere); readln; end.

4. Fie dat un text, de inlocuit vocalele cu 0 si consoanele cu 1.


Program P4; var s:string; i:integer; begin write('Dati un sir de caractere:'); readln(s); for i:=1 to length(s) do if s[i] in ['a'..'z','A'..'Z'] then if s[i] in ['a','A','i','I','o','O','e','E','u','U'] then s[i]:=0 else s[i]:=1; readln; end.

1.Ce atribuiri de valori sunt greite i care mai sunt greelile observate. Var b,s: string; k,n,m: integer; c,t: char; begin Readln(s); t:=length(s); m:=pos(K,s); c:=copy(s,k-7,4); c:=copy(s,k,4); c:=s[2]; c:=s+s; s:=c+c; insert(c,s); b:=delete(s,4,3) Val(m,c,cod); end. 2 Ce efect are urmtoarea secven de instruciuni? Indicai tipurile variabilelor ce figureaz n aceast secven de instruciuni. b1:=true; b2:=true; suma:=0.1; readln(s); val(s,n,cod);

if cod =0 then suma :=n else b1:=false; readln(s); val(s,n,cod); if cod =0 then suma :=suma+n else b2:=false; if b1 and b2 then writeln(suma) else writeln('Nu este posibila calcularea sumei') 3 Autorul acestui program a avut intenia s rezolve problema: De nlocuit n textul dat cuvntul "Ion" cu cuvntul "Ionel". Ce erori se comit? Facei un numr minim de modificri n program astfel nct problema propus s fie rezolvata corect. Var s,i:string; k:integer; begin writeln('Introducei textul'); readln(s); for k:=1 to length(s)-2 do if copy(s,k,3)='Ion' then insert('el',s,k+3); writeln(s); end. 4 Ce se va afia la ecran n rezultatul rulrii urmtorului program? Program SIRURI; VAR x: INTEGER;y:REAL; sir:STRING; Begin x:=2478; str(x,sir);writeln(sir); str(x,sir);writeln(sir); y:=-24.19; str(y:10:2,sir); writeln(sir); y:=123456789.101112; str(y:10:2,sir); writeln(sir); y:=12345678910.1112; str(y:10:2,sir); writeln(sir); y:=12345.67; str(y:10:2,sir); writeln(sir); y:=12.3456; str(y:10,sir); writeln(sir); y:=12.3456; str(y,sir); writeln(sir) End. 5 Ce se va afia la ecran n rezultatul rulrii urmtorului program? var s:string[5]; i:byte; begin For i:=65 to 70 do s:=chr(i)+S;

writeln(s); end. 6 Ce se va afia la ecran n rezultatul rulrii urmtoarei secvene de instruciuni? s:='1234567890abcdefghijkl'; Delete(s,0,5); writeln(s); Delete(s,5,2); writeln(s); Delete(s,8,30); writeln(s);

7 Ce se va afia n rezultatul rulrii acestui program n cazul c s cinci='1234' ? Program Prog; var cinci: string; i, zece,cifra,cod, puterea_5:integer; begin Readln(Cinci); zece:=0; puterea_5:=1; for i:=length(cinci) downto 1 do begin val(cinci[i],cifra,cod); zece:= zece + cifra * puterea_5; puterea_5:=5 * puterea_5; end; writeln(zece); end. 8 Programul de mai jos rezolv urmtoarea problema: De scris un program care avnd scrierea unui numr n sistemul de numeraie cu baza 5 sub forma de succesiune de cifre ce reprezint valoarea unei variabile de tip string, afieaz acest numr n sistemul de numeraie cu baza 10. a. Modificai programul astfel nct s se fac validarea datelor iniiale si daca printre caracterele citite nu sunt toate corespunztoare condiiei problemei s se afieze mesajul respectiv b Modificai programul astfel nct sa se fac validarea datelor iniiale si daca printre caracterele citite nu respecta toate condiiile problemei s se citeasc din nou irul de caractere. Var cinci: string; i, zece,cifra,cod, puterea_5:integer; begin Readln(Cinci);

zece:=0; puterea_5:=1; for i:=length(cinci) downto 1 do begin val(cinci[i],cifra,cod); zece:= zece + cifra * puterea_5; puterea_5:=5 * puterea_5; end; writeln(zece); end. 9 Modificai programul urmtor astfel, nct s se afieze toate cifrele ce figureaz n irul de caractere citit i numrul de apariii a tuturor cifrelor. Var c: char; begin read(c); while c <> '$' do begin if (c>= '0') and (c<= '9') then write (c); read(c) end; end. 10 Modificai programul urmtor astfel, nct s se afieze cifrele diferite ce figureaz n irul de caractere citit i numrul de apariii a cifrei respective. var c: char; begin read(c); while c <> '$' do begin if (c>= '0') and (c<= '9') then write (c); read(c) end; end. 11 Formulai problema care se rezolv cu ajutorul urmtorului program: Var s:string; num: integer; Function transform(s:string):integer; var c,i,p,sum,cod:integer; Begin

sum:=0; p:=1; For I:= Length(S) downto 1 Do Begin Val(S[i],c,Cod); sum:=sum + p*c; p:=p*5; End; transform:=sum; End; Begin Write('Introdu numarul: '); ReadLn(s); Writeln('Raspunsul este ',transform(s)); End. Ceva de simplificat 12 Formulai problema care se rezolv cu ajutorul urmtorului program Program Prog; var a:string; i:integer; begin Repeat write('Introduceti propozitia: '); readln(a); until length(a) <> 0 ; i:=1; While i < length(a) do if (a[i]=' ') and (a[i+1]=' ') then delete(a,i,1) else i:=i + 1; writeln(a); end. 13 Se consider programul ce urmeaz, care rezolv problema: De la tastatur se citete o propoziie ce conine cel puin un cuvnt, ntre cuvintele creia pot fi mai mult de un spaiu. Citirea se face pn a fost introdus cel puin un cuvnt ce costa cel puin dintr-un caracter. De lichidat spaiile de prisos i de afiat propoziia n forma iniial i dup modificare. n program de efectuat validarea datelor iniiale. Se cere de exclus din acest program unele rnduri i declaraii astfel nct programul s fie mai scurt i s rezolve corect aceeai problema. Se accept i schimbarea ordinii rndurilor de program. Program prog;

Var a, s:string; l,b,i,m,k,n:integer; begin Repeat write('Introduceti propozitia: '); readln(a); if length(a)=0 then writeln('Introduceti propozitia: '); until length(a) <> 0 ; i:=1; s:=a; n:= length(a); While i < n do begin if (a[i] = ' ') and (a[i+1]=' ') then delete(a,i,1) else i:=i + 1; writeln(a); end; writeln('Propozitia initiala este '); writeln(s); writeln('Propozitia fara spatii in plus este:'); writeln(a); end. 14 Se consider urmtoarea problem: Se d un ir de caractere. S se determine numrul de caractere diferite, din care este format acest ir. Este suficient de dat S='aaa' sau S='aaa aaaaaaa' i rezultatul obinut cu ajutorul programului ce urmeaz nu rezolv corect problema. Explicai de ce se ntmpl aceasta. Facei un numr mic de schimbri n programul dat nct programul obinut s rezolve corect problema. Program Prog; Var s:String; i,j:Integer; Begin Write('Introdu sirul de caractere: ');ReadLn(s); i:=1; While i<=length(s) Do Begin j:=i+1; While j<=length(s) Do Begin If s[i] = s[j] Then Delete(s,i,1);

j:=j+1; End; i:=i+1; End; write(i); Write('Numarul de caractere diferite este:', length(s)); End. 15 Se d un cuvnt a. S se determine numrul de litere diferite, din care este format acest cuvnt. De exemplu, pentru a='invitat' rspunsul este 5, pentru a='Orhei' rspunsul este 5, iar pentru a= 'INFORMATICA' rspunsul este 9. Modificai programul ce urmeaz astfel ca literele majuscule i respectiv minuscule s fie numrate mpreuna innd cont de faptul c la intrare se d nu un cuvnt ci un text n care n afar de litere se mai conin si alte caractere. Var a:String; i,j:Integer; Begin Write('Introdu sirul: '); ReadLn(a); i:=1; While i<=length(a) Do Begin j:=i+1; While j<=length(a) Do Begin If a[i] = a[j] Then Delete(a,i,1); j:=j+1; End; i:=i+1; End; Write(length(a)); End.

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