duminică, 4 decembrie 2011

Tipul de date STRING

Tipul de date STRING
Printre tipurile standard se numără şi tipul char. Valorile de tip char reprezintă caractere (litere mari şi mici,cifre,semne de punctuaţie …). Un şir de caractere poate fi definit ca un vector, elementele căruia sunt caractere.
Type
Sir =array[1..10] of char
Var
A:sir;
Pentru variabila A în memoria operativă se alocă consecutiv 10 elemente de tip char:

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
Pentru a facilita prelucrarea şirurilor de caractere majoritatea limbajelor de programarepermit definirea unor tipuri de date specifice – tipurile string.
Tipul string este definit ca un tip special de vector cu elemente de tip char, dar care memorează pe lângă caracterele din şir şi lungimea reală a respectivului vector de caractere. Lungimea acestui şir de caractere este limitată superior de o valoare declarată, numită dimensiunea şirului. Ea se declară odată cu declararea şirului, sub forma:
String[dimensiune]
De exemplu,
Type
Sir1=string[5]
Sir2=string[20]
Un şir de acest tip nu poate avea o dimensiune mai mare decât cea declarată. Dimensiunea unui şir poate varia între 0.. 255 caractere, deoarece această valoare se păstrează într-un octet.
Astfel, din punct de vedere al spaţiului de memorie ocupat, declaraţiile:
Type
Sir1 = string[5]
Sir2 = array [0..5] of char
Sunt echivalente. Variabila de tip sir1 va ocupa în memorie 6 octeţi (5 octeţi – pentru caracterele şirului şi un octet pentru dimensiunea lui) şi variabila de tip sir2 va ocupa în memoria operativă 6 octeţi (cîte un octet pentru fiecare element al vectorului: A[0], A[1], A[2], A[3], A[4], A[5]).
Prima poziţie (indicele 0) din string memorează un caracteravând codul egal ci dimensiunea reală a şirului ( o valoare întreagă între 0 ..255)

[0] [1] [2] [3] [4] [5]
6.2.1. Prelucrare şirurilor de caractere
Citirea de la tastatură a unui şir de caractere
Se realizează cu ajutorul unei proceduri standard
Readstring(sir), unde sir – variabilă de tip string.
La citirea valorii unei variabile de tip string este posibil ca lungimea şirului întrodus să depăşească dimensiunea declarată în definiţia tipului variabilei. În astfel de cazuri şirul întrodus este trunchiat, caracterele în exces ffind ignorate.
De exemplu:
Type
Sir = string[10]
Var
S:sir
În memoria operativă variabila S se alocă astfel:
0
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
Dacă în algoritm urmează Readstring (S) şi de la tastatură se întroduce ‘ABC’, atunci variabila S va avea următorul conţinut:
3 A B C ? ? ? ? ? ? ?
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
Iar dacă de la tastatură se întroduce ‘ABCDEF123456789’, atunci variabila S va avea următorul conţinut:
10 A B C D E F 1 2 3 4
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
Afişarea unui şir de caractere
Se realizează cu ajutorul procedurii standard Writestring(sir), unde sir – variabilă de tip string.
Atribuirea
Spre deosebire de vectori, unei variabile de tip string i se poate atribui valoarea unei expresii de tip string în componenţa căreia pot să apară constante şiruri de caractere, variabile de tip string, apeluri de funcţii care returnează şiruri de caractere şi operatorul ‘+’, care realizează concatenarea şirurilor.
Exemple:
Type
Sir =string[5]
Var
X: sir ;  0  ?  ?  ?  ?  ? 
Y: sir ;  0  ?  ?  ?  ?  ? 
Z: sir ;  0  ?  ?  ?  ?  ? 
Begin
X:= ‘ABC’ ;  3  A  B  C  ?  ? 
Y:= ‘D’+’E’+’F’  3  D  E  F  ?  ? 
Z:=X+Y  5  A B  C  D E
Dacă valoarea expresiei cuprinde mai multe caractere decât lungimea maximă a variabilei căreia i se atribuie, caracterele care sunt în plus se negligează.
Selectarea de componente.
Componentele unei variabile de tip string au tipul char şi se specifică prin identificatorul variabilei, urmat între paranteze drepte de o expresie – indice întregă cu valori cuprinse între 0 şi lungimea efectivă. Octetul care cuprinde lungimea efectivă a şirului are indeicele 0, iar tipul său este tot char.
De exemplu, X[1] din exemplul anterior are valoarea ‘A’.
Aplicarea operaţiilor relaţionale
Spre deosebire de vectori, variabilele de tip string pot să apară în expresii relaţionale. Operatorii relaţionali: =, # ,<, >, >=, <=, aplicaţi unor date de tip string, furnizează o valoare booleană.
Comparaţia a două date de tip string constă în compararea caracter cu caracter, de la stânga la dreapta, a codurilor ASCII ale caracterilor, până când se ajunge la 2 caractere diferite sau se epuizează caracterele unuia dintre şiruri. Expresia relaţională primeşte valoarea booleană, în conformitate cu relaţia dintre cele două caractere pe care s-a oprit comparaţia şi operatorul din expresia relaţională. Dacă şirurile coincid pe lungimea celui mai scurt, atunci acest şir este considerat “mai mic” decât celălalt. Şirurile sunt egale numai dacă atât lungimile cât şi conţinutul lor sunt identice. De exemplu:
a) ‘abc’ <’abcd’ =true
b) ‘axy’ < ‘abcd’ =false.
În alte limbaje de programare stringul se reprezintă în memoria operativă în felul următor:
Memorarea caracterelor în structură începe de pe prima poziţie şi informaţia efectivă va fi mărginită în dreapta de caracterul Null, caracter ASCII cu codul numeric egal cu zero.
Să revenim la reprezentarea stringului prin prima metoda. În acest caz lungimea efectivă a şirului se păstrează în octetul cu indicele 0, a variabilei, care este de tip char. Pentru a determina valoarea numerică a acestui octet se foloseşte funcţia ord:
Ord(X[0]).
În limbajele de programare se utilizează funcţii standard, care returnează lungimea efectivă a şirului. De exemplu în Pascal swe foloseşte funcţia Length(Sir)
Prelucrarea şirului de caractere caracter cu caracter
Deoarece valoarea unei variabile X de tip string este un şir de caractere, acestea pot fi referite individual, prin intermediul unui indice, la fel ca elementele unui vector, sub forma X[i]. Bineînţeles, că valoara indicelui i trebuie să se încadreze în intervalul 1.. length(x). Cu acest scop se va folosi ciclul cu contor, care se va repeta de length(x) ori.
De exemplu: Să se determine numărul de cifre din şirul citit de la tastatură.
Rezolvare:
Algoritmul va citi şirul în variabila S, pe care îl va analiza caracter cu caracter, incrementând contorul Nrcifre, dacă caracterul analizat este cifră. Caracterul analizat este cifră, dacă se respectă condiţia:
S[i]>=’0’ and S[i]<=’9’. Lungimea efectivă a şirului va fi determinatăcu ajutorul funcţiei standard Length(S). La începutul prelucrării şirului contorul Nrcifre se iniţializează cu valoarea zero.
Algoritm numarul_de_cifre;
Type
Sir=string[20]
Var
S:sir
Nrcifre:=cardinal;
I: cardinal;
Begin
Writestring(‘Întrodu şirul: ‘)
Readstring(s)
Nrcifre:=0
For i:=1 to length(s) do step 1
If s[i]>=’0’ and s[i]<=’9’ then
Nrcifre:=nrcifre+1
End
End
Writecard(nrcifre)
End.
Compararea şirurilor
Se citesc două şiruri, dacă acestea nu sunt identice, atunci se afişează în ordine lexicografică.
Algoritm comparare;
Type
Sir = string[20]
Var
Sir1: sir
Sir2: sir
Begin
Writestring(‘Introdu sirul 1:’)
Readstring(sir1)
Writeln
Writestring(‘Introdu sirul 2:’)
Readstring(sir2)
Writeln
If sir1 < sir2 then
Writestring(sir1)
Writeln
Writstring(sir2)
Else
If sir1>sir2 then
Writestring(sir2)
Writeln
Writstring(sir1)
end
End
End.

Ordonarea alfabetică a unei liste de cuvinte
Să se realizeze citirea a n cuvinte şi afişarea lor în ordine alfabetică.
Rezolvare:
Cele n cuvinte se vor memora într-un vector componentele căruia sunt de tip string. Apoi se va aplica un algoritm de sortare a vectorilor. Vom folosi ordonarea prin metoda bulelor.
Algoritm ordonare_alfabetica_cuvinte;
Type
Sir:string[20]
Vector:array[1..n] of sir
Var
X:vector
I:cardinal
Aux:sir
Ordonat:boolean
Begin
For i:=1 to n step 1
Writstring(‘introdu cuvîntul: ‘)
Readstring(x[i])
Endfor
Repeat
Ordonat:=true
For i:=1 to n-1 step 1
If x[i] >x[i+1] then
Aux:= x[i]
X[i]:=x[i+1]
X[i+1]:=aux
Ordonat:=false
Endif
Until ordonat
Writestring(‘Cuvintele în ordine alfabetică’)
For i:=1 to n step 1
Writestring(x[i])
Writeln
Endfor
End.

Niciun comentariu:

Trimiteți un comentariu