lucrarea5

20
Lucrarea 5 Tablouri şi şiruri de caractere Tabloul este cea mai simplă şi mai familiară structură de date. Un tablou este o listă de elemente de acelaşi tip plasate succesiv într-o zonă contiguă de memorie. Tablouri unidimensionale Sintaxa tablourilor unidimensionale este: tip_element nume[nr_elem], unde: - tip_elelent este un tip de date oarecare, reprezentând tipul elementelor constituente ale tabloului; - nume este un indentificator care reprezintă numele tabloului; - nr_element este o expresie constantă întreagă pozitivă care precizează numărul de elemente din tablou. Pentru referirea unui element se foloseşte o expresie cu operatorul de indexare [], precizând numele tabloului şi indexul (poziţia elementului în tablou), astfel: nume[index] Indexul este în general o expresie întreagă şi pozitivă. Elementele tabloului corespund valorilor indexului de la 0(primul element) până la (nr_elem-1). Pe baza numărului de elemente şi a tipului compilatorul determină dimensiunea zonei de memorie care trebuie alocată tabloului, conform relaţiei: dimensiune_tablou=dimensiune_elelement*număr_elemente unde: dimensiune element=sizeof(tip_element)

Upload: burican-bogdan-alexandru

Post on 17-Dec-2015

220 views

Category:

Documents


0 download

DESCRIPTION

info

TRANSCRIPT

Lucrarea 5

Lucrarea 5

Tablouri i iruri de caractere

Tabloul este cea mai simpl i mai familiar structur de date. Un tablou este o list de elemente de acelai tip plasate succesiv ntr-o zon contigu de memorie.

Tablouri unidimensionale

Sintaxa tablourilor unidimensionale este:

tip_element nume[nr_elem],

unde:

tip_elelent este un tip de date oarecare, reprezentnd tipul elementelor constituente ale tabloului;

nume este un indentificator care reprezint numele tabloului;

nr_element este o expresie constant ntreag pozitiv care precizeaz numrul de elemente din tablou.

Pentru referirea unui element se folosete o expresie cu operatorul de indexare [], preciznd numele tabloului i indexul (poziia elementului n tablou), astfel:

nume[index]

Indexul este n general o expresie ntreag i pozitiv. Elementele tabloului corespund valorilor indexului de la 0(primul element) pn la (nr_elem-1).

Pe baza numrului de elemente i a tipului compilatorul determin dimensiunea zonei de memorie care trebuie alocat tabloului, conform relaiei:

dimensiune_tablou=dimensiune_elelement*numr_elemente

unde:

dimensiune element=sizeof(tip_element)

Observaie: dup alocarea memorie necesare, la compilarea restului programului sau n timpul execuiei, nu se mai fac verificri de dimensiune. De exemplu nu se semnalizeaz eroare dac valoarea indicelui depete valoarea (nr_elem-1).

iruri de caractere

n limbajul C nu exist un tip de date special pentru iruri de caractere, dar se ofer posibilitatea folosirii tablourilor unidimensionale de caractere pentru a memora iruri. Declaraia este, n general de forma:

char nume[nr_elemente];

Pentru a marca sfritul irului, dup ultimul caracter se adaug un octet cu valoare 0 (caracter \0). n particular, n cazul unui ir vid, primul element din tablou este chiar terminatorul:

nume[0]=0.

Dimensiune indicat la declarare pentru un tablou trebuie s fie mai mare cu o unitate dect numrul de caractere al celui mai lung ir care va fi memorat n el, pentru a ncpea i terminatorul \0. Astfel, un tablou de nr_elemente caractere poate fi folosit pentru memorarea unor iruri cu lungimi cuprinse ntre 0 i nr-elemente 1 caractere. Terminatorul \0 permite testarea facil a sfritului irului.

O list de caractere ncadrat ntre ghilimele reprezint o constat ir de caractere. La ntlnirea unei asemenea constante compilatorul rezerv zona de memorie necesar, o iniializeaz cu codurile ASCII ale irului i adaug automat terminatorul \0. O asemenea constant poate fi utilizat pentru a iniializa o variabil care conine un ir de caractere.

Pentru operaii de intrare ieire cu iruri de caractere pot fi utilizate funciile scanf() i printf() cu specificatorul de format %f. Dup cu vom vedea numele irului (fr indexare) are valoarea adresei irului i poate fi utilizat poate folosit n lista de parametri ai ambelor funcii de intrare ieire pentru a indica ntregul ir.

Deoarece n C nu exist variabile ir de caractere nu exist nici operatori destinai acestora. Biblioteca standard ofer pentru aceasta o serie de funcii dedicate cu ajutorul crora se pot face operaii cu iruri de caractere. Pentru operaii de intrare ieire, n fiierul stdio.h sunt declarate:

- Funcia gets(ir_dest);

Citete caractere introduse de la tastatur pn ntlnete caracterul \n (linie nou) i le nscrie n ir_dest. \n nu este nscris n ir_dest, dar se adaug terminatorul \0.

- Funcia puts(ir);

Afieaz irul ir pe ecran i trece la o linie nou.

Funcia strcpy(ir_dest,ir_surs);

Copiaz irul ir_surs i irul ir_dest.

Funcia strcat(ir_dest,ir_surs);

Adaug irul ir_surs la sfritul irului ir_dest (concatenare)

Funcia strlen(ir);

ntoarce numrul de elemente ale irului) ir.

Funcia strcmp(ir1,ir2);

Compar succesiv valorile codurilor ASCII ale caracterelor celor dou iruri (ncepnd cu indicele 0). Dac irurile sunt identice ntoarce 0, iar dac difer ntoarce o valoare ntreag pozitiv, dac:

ir1[k]>ir2[k]

sau negativ dac:

ir1[k] s2 [ i ]

i

s1 [ j ] = s2 [ j ] pentru j = 0,1,2,.,i-1

Compararea irurilor de caractere se poate realiza folosind funcii standard de felul celor de mai jos:

int strcmp (const char *s1, const char *s2);

Funcia strcmp returneaz:

o valoare negativ dac ir 1 < ir 2

zero dac ir 1 = ir 2 o valoare pozitiv dac ir1 > ir 2 O alt funcie pentru compararea a dou iruri este funcia prototip:

int strncmp ( const char *s1, const char *s2, unsigned n);

comparaia se va face utiliznd primele n caractere.

Pentru compararea a dou iruri fr a ine seama de diferena ntre literele mici i mari se utilizeaz funcia:

int stricmp ( const char *s1 , const char *s2);

Funcia:

int strincmp ( const char *s1 , const char *s2 , unsigned n);

permite compararea primelor n caractere fr a ine seama de diferena dintre literele mari i literele mici.

EXPRESIA lvaluep = & x

* (double * ) p = 3,14159

x = 3,14159

Expresiile utilizate n partea stng a unei expresii de atribuire se numesc expresii l value(l-left)

O expresie lvalue poate fi :

un nume de variabil simpl ;

o variabil cu indici;

o construcie ce permite accesul sau modificarea valorii unui element de structur;

o construcie de forma :

*ep

unde: ep este o expresie care definete un pointer spre o dat care nu este o constant.

Const int *a = 100 pointer spre o ******** constant

*a = 100 nu este corect

*a = este o expresie lvalue

b = *a este corect

ALOCAREA DINAMIC A MEMORIEI Utilizeaz o zon de memorie numit memorie heap (memorie/********)

Funciile de gestionare a memoriei au prototipul : alloc.h

void * malloc(unsigned n);

aloc n heap o zon de n octei

ea returna adresa de inceput a zonei alocate

funcia:

void free (void *p);

- se elibereaz zona de memorie spre care pointeaz din

head;

void *calloc (unsigned *************,unsigned dim elem);

-returneaz adresa de nceput a zonei de memorie alocat.

10

10