lucrarea5
DESCRIPTION
infoTRANSCRIPT
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