siruri de caractere

16
Siruri de Caractere Tipul STRING. Tipul SET Abordare în limbajul Pascal Notiuni teoretice A. Tipul STRING (şir 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, caractere speciale (‘#’, ‘&’, etc.) şi delimitatori (virgulă, punct, etc.). 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-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. Când compară două caractere, calculatorul compară de fapt codurile lor ASCII. Între codurile ASCII ale celor două litere-pereche există relaţia: codul caracterului-literă mare + 32 = codul caracterului-literă mică Proceduri şi funcţii predefinite pentru şiruri 1) Funcţia COPY copy(<şir>,<poz>,<nr>) - returnează un subşir al şirului de caractere <şir>, care începe din poziţia <poz> şi are <nr> caractere. 2) Funcţia POS pos(<sir1>,<sir2>) - returnează poziţia de început a lui <sir1> în cadrul şirului <sir2>, în cazul în care <sir2> este subşir al lui <sir1>. În caz contrar funcţia returnează valoarea 0. 3) Procedura DELETE delete(<sir>,<poz>,<nr>)

Upload: cristi-conache

Post on 12-Aug-2015

75 views

Category:

Documents


0 download

DESCRIPTION

Stringuri

TRANSCRIPT

Page 1: Siruri de Caractere

Siruri de CaractereTipul STRING. Tipul SET

Abordare în limbajul PascalNotiuni teoretice

A. Tipul STRING (şir 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, caractere speciale (‘#’, ‘&’, etc.) şi delimitatori (virgulă, punct, etc.).

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-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. Când compară două caractere, calculatorul compară de fapt codurile lor ASCII.

Între codurile ASCII ale celor două litere-pereche există relaţia:

codul caracterului-literă mare + 32 = codul caracterului-literă mică

Proceduri şi funcţii predefinite pentru şiruri

1) Funcţia COPY copy(<şir>,<poz>,<nr>)

- returnează un subşir al şirului de caractere <şir>, care începe din poziţia <poz> şi are <nr> caractere.

2) Funcţia POS pos(<sir1>,<sir2>)

- returnează poziţia de început a lui <sir1> în cadrul şirului <sir2>, în cazul în care <sir2> este subşir al lui <sir1>. În caz contrar funcţia returnează valoarea 0.

3) Procedura DELETE delete(<sir>,<poz>,<nr>)

- şterge din şirul <sir>, un subşir de lungime <nr> caractere, subşir care începe de la poziţia <poz>. Şirul rezultat după ştergere este memorat tot în parametrul <sir>.

4) Procedura INSERT insert(<subsir>,<sir>,<poz>)

- inserează subşirul <subsir> în cadrul şirului de caractere <sir>, începând cu poziţia <poz>. Parametrul <sir> este o variabilă care după execuţia procedurii va conţine şirul rezultat prin inserare.

5) Procedura STR str(<nr>,<sir>)

- transformă numărul <nr> în şirul de caractere corespunzător, pe care îl memorează în parametrul <sir>. La apel, parametrul <sir> va fi un identificator de variabilă de tip string.

Page 2: Siruri de Caractere

6) Procedura VAL val(<sir>,<nr>,<eroare>)

- încearcă să convertească şirul de caractere <sir> î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 identificatori de variabile, valorile acestora completându-se în urma execuţiei procedurii, astfel: dacă transformarea reuşeşte, atunci în parametrul <nr> se memorează numărul rezultat prin transformare, iar parametrul <eroare> va primi valoarea 0; dacă transformarea eşuează, atunci parametrul <nr> va fi nedefinit, iar în parametrul <eroare> se memorează poziţia în şir a primului caracter din cauza căruia a eşuat transformarea.

B) Tipul SET (mulţime)Limbajul Pascal permite definirea mulţimilor în sensul cunoscut din matematică, cu ajutorul

tipurilor de date anonime “set of”. Elementele unei astfel de mulţimi, în număr de maxim 256, sunt valori distincte de acelaşi tip, numit tip de bază.

Pentru a memora efectiv o mulţime trebuie să declarăm o variabilă.Sintaxa declarării unei variabile de tip mulţime este:

var <id>:set of <tip_elem>;unde: - <id> = identificatorul (numele) variabilei de tipul mulţime - <tip_elem> = tipul de bază al elementelor mulţimii.Tipul de baza al elementelor trebuie să fie un tip ordinal care poate cuprinde maxim 256 de valori.

Operatori aplicabili tipului mulţimea) operatori aritmetici“+” reuniune“*” intersectie“-“ diferentab) 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 multimiVariabilele 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 /

Page 3: Siruri de Caractere

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 sa-l 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’

Page 4: Siruri de Caractere

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 * O * S * C * I * D

P R E T U T I N D E N I

* O M E N I E * O R A S

U N I T I * P A S N I C

* O S * C H E L * I V I

O S * C A R * G S * A P

* T R O T I N E T A * L

B I E T * B A * E U R I

* C L E R * P L A T A N

P U I * A S I A * U T A

* R E G I M * S T R A T

C I F R E * S A R I T I

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.

Page 5: Siruri de Caractere

1. Fie dat un sir de caractere alcatuit din mai multepropozitii 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;

Page 6: Siruri de Caractere

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 greşite şi care mai sunt greşelile 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 următoarea secvenţă de instrucţiuni? Indicaţi tipurile variabilelor ce figurează în această secvenţă de instrucţiuni. 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

Page 7: Siruri de Caractere

else b2:=false; if b1 and b2 then writeln(suma) else writeln('Nu este posibila calcularea sumei')

3 Autorul acestui program a avut intenţia să rezolve problema: De înlocuit în textul dat cuvântul "Ion" cu cuvântul "Ionel". Ce erori se comit? Faceţi un număr minim de modificări în program astfel încât problema propusă să fie rezolvata corect.Var s,i:string; k:integer;begin writeln('Introduceţi 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 afişa la ecran în rezultatul rulării următorului 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 afişa la ecran în rezultatul rulării următorului program?

var s:string[5]; i:byte; begin For i:=65 to 70 do s:=chr(i)+S; writeln(s); end.

Page 8: Siruri de Caractere

6 Ce se va afişa la ecran în rezultatul rulării următoarei secvenţe de instrucţiuni? s:='1234567890abcdefghijkl'; Delete(s,0,5); writeln(s); Delete(s,5,2); writeln(s); Delete(s,8,30); writeln(s);

7 Ce se va afişa în rezultatul rulării 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ă următoarea problema: “De scris un program care având scrierea unui număr în sistemul de numeraţie cu baza 5 sub forma de succesiune de cifre ce reprezintă valoarea unei variabile de tip string, afişează acest număr în sistemul de numeraţie cu baza 10.

a. Modificaţi programul astfel încât să se facă validarea datelor iniţiale si daca printre caracterele citite nu sunt toate corespunzătoare condiţiei problemei să se afişeze mesajul respectivb Modificaţi programul astfel încât sa se facă validarea datelor iniţiale si daca printre caracterele citite nu respecta toate condiţiile problemei să se citească din nou şirul de caractere. Var cinci: string; i, zece,cifra,cod, puterea_5:integer; beginReadln(Cinci); zece:=0; puterea_5:=1; for i:=length(cinci) downto 1 do

Page 9: Siruri de Caractere

begin val(cinci[i],cifra,cod); zece:= zece + cifra * puterea_5; puterea_5:=5 * puterea_5; end; writeln(zece); end.

9 Modificaţi programul următor astfel, încât să se afişeze toate cifrele ce figurează în şirul de caractere citit şi numărul de apariţii 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 Modificaţi programul următor astfel, încât să se afişeze cifrele diferite ce figurează în şirul de caractere citit şi numărul de apariţii 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 Formulaţi problema care se rezolvă cu ajutorul următorului 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

Page 10: Siruri de Caractere

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 Formulaţi problema care se rezolvă cu ajutorul următorului 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 citeşte o propoziţie ce conţine cel puţin un cuvânt, între cuvintele căreia pot fi mai mult de un spaţiu. Citirea se face până a fost introdus cel puţin un cuvânt ce costa cel puţin dintr-un caracter. De lichidat spaţiile de prisos şi de afişat propoziţia în forma iniţială şi după modificare. În program de efectuat validarea datelor iniţiale. Se cere de exclus din acest program unele rânduri şi declaraţii astfel încât programul să fie mai scurt şi să rezolve corect aceeaşi problema. Se acceptă şi schimbarea ordinii rândurilor de program.

Program prog;

Var a, s:string; l,b,i,m,k,n:integer;

Page 11: Siruri de Caractere

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ă următoarea problemă: “Se dă un şir de caractere. Să se determine numărul de caractere diferite, din care este format acest şir.” Este suficient de dat S='aaa' sau S='aaa aaaaaaa' şi rezultatul obţinut cu ajutorul programului ce urmează nu rezolvă corect problema. Explicaţi de ce se întâmplă aceasta. Faceţi un număr mic de schimbări în programul dat încât programul obţinut 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;

Page 12: Siruri de Caractere

End; write(i); Write('Numarul de caractere diferite este:', length(s)); End.

15 Se dă un cuvânt a. Să se determine numărul de litere diferite, din care este format acest cuvânt. De exemplu, pentru a='invitat' răspunsul este 5, pentru a='Orhei' răspunsul este 5, iar pentru a= 'INFORMATICA' răspunsul este 9.

Modificaţi programul ce urmează astfel ca literele majuscule şi respectiv minuscule să fie numărate împreuna ţinând cont de faptul că la intrare se dă nu un cuvânt ci un text în care în afară de litere se mai conţin 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.