CATEGORII DOCUMENTE |
Tablouri si siruri de caractere
Un tablou este o colectie de variabilede acelasi tip, apelate cu acelasi nume. Tablourile sunt plasate intr-o zona de memorie contigua. Accesul la un element al tabloului se face cu ajutorul unor indici.
Tablouri unidimensionale
Forma generala de declarare a tablourilor unidimensionale (sirurilor) este urmatoarea:
tip_element nume_tablou[numar_elemente];
unde tip_element este un tip oarecare si reprezinta tipul elementelor tabloului, nume_tablou este un identificator, iar numar_elemente este o expresie constanta si pozitiva ce precizeaza numarul de elemente ale tabloului.
De exemplu, in secventa
int k[50];
char c[8];
float a[100];
se declara tablourile c , k si a cu, respectiv, 50 de elemente intregi, 8 elemente de tip caracter si 100 elemente de tip float.
Pentru referirea la un element se foloseste o expresie cu operatorul de indexare [ ], precizand numele tabloului si indexul (pozitia elementului in tablou):
nume_tablou[index]
Indexul variaza intre 0, pentru primul element a tabloului si numar_elemente-1, pentru ultimul element.
Dimensiunea zonei de memorie care trebuie alocata tabloului poate fi calculata cu relatia:
dimensiune_tablou = sizeof(tip_element)*numar_elemente
Tablourile unidimensionale sunt liste de informatii de acelasi tip care sunt plasate in zone de memorie contigua, in ordinea indicilor. De exemplu, daca tabloul c cu 8 elemente de tip caracter, declarat mai sus, incepe cu locatia de memorie 1100, in memorie acesta apare astfel:
Element |
c |
c |
c |
c |
c |
c |
c |
c |
Adresa |
Observatie: Limbajul C nu controleaza limitele unui tablou. Se pot depasi ambele margini, distrugand u-se alte date sau cod de program, fara ca sa se semnaleze eroare.
Aplicatie
Programul urmator determina minimul dintre termenii pozitivi ai unui sir si maximul dintre termenii negativi ai aceluiasi sir.
/* MAX numere negative MIN numere pozitive */
#include <stdio.h>
#include <conio.h>
void main()
poz neg=0;
for (i=1;i<=n;++i)
else if (min>a[i]) min=a[i];
if (a[i]<0) if (neg==0)
else if (max<a[i]) max=a[i];
}
if (poz) printf('MIN poz=%dn',min);
if (neg) printf('MAX neg=%dn',max);
if ((poz==0)&&(neg==0)) printf('Toate numerele sunt nulen');
getch(
}
Siruri de caractere
In C, un sir de caractere este un tablou unidimensional cu elemente de tip caracter. Forma generala de declarare a unui sir de caractere este este urmatoarea:
char nume_sir[numar_elemente];
Pentru a se marca sfarsitul sirului, dupa ultimul caracter din sir, se adauga un octet cu valoarea zero, adica caracterul '0'. In caz particular, sirul vid are primul element chiar terminatorul '0'
Dimensiunea indicata la declarare, in cazul unui tablou de tip sir, trebuie sa fie cu o unitate mai mare decat cel mai lung sir, pentru a incapea si terminatorul . Astfel intr-un tablou cu numar_elemente caractere poate incapea un sir cu cel mult numar_elemente-1 caractere.
Terminatorul '0' permite testarea facila a sfarsitului sirului. De exemplu, progrmul Lungime sir de caractere citeste un sir si ii calculeaza lungimea.
/* Lungime sir de caractere */
#include <stdio.h>
#include <conio.h>
void main()
Observatie: Pentru a se putea citi un sir ce contine si spatii trebuie sa se utilizeze functia gets, deoarece functia scanf citeste siruri ce se termina cu spatiu.
De exemplu, instructiunea:
scanf '%10s',s);
citeste un sir restrictionat la 10 caractere si terminat cu tasta Spatiu sau Enter.
O constanta sir de caractere este o lista de caractere incadrata de ghilimele. La intalnirea constantei, compilatorul rezerva zona de memorie necesara, o initializeaza cu codurile ASCII ale caracterelor sirului si adauga terminatorul '0'. O asemenea constanta poate fi utilizata pentru initializarea unui sir de caractere.
De exemplu, programul Constanta sir de caractere contine un sir de caractere, s, initializat, afiseaza codurile caracterelor acestuia, citeste un nou sir si il afiseaza.
/* Constanta sir de caractere */
#include <stdio.h>
#include <conio.h>
void main()
O serie de functii care opereaza cu siruri de caractere se afla in fisierul antet string.h. Cele mai uzuale dintre acestea sunt date in tabelul de mai jos:
Nr. Crt. |
Functia |
Efect |
gets(s); |
Citeste caractere de la tastatura si le inscrie in sirul s, pana intalneste caracterul 'n'. Acest caracterul nu este inscris in s, dar se adauga terminatorul |
|
puts(s); |
Afiseaza sirul s pe ecran si trece la linie noua. |
|
strcpy(s1, s2); |
Copiaza sirul s2 in sirul s1. |
|
strncpy(s1, s2, n); |
Copiaza primele n caractere din sirul s2 in sirul s1 (pe pozitia n, trebuie adaugat dupa copiere terminatorul |
|
strcat(s1, s2); |
Adauga sirul s2 la sfarsitul sirului s1. |
|
strncat(s1, s2, n); |
Adauga cel mult n caractere din sirul s2 la sfarsitul sirului s1. |
|
strupr(s); |
In sirul s, caracterele litere mici sunt inlocuite cu caractere litere mari. |
|
strlwr(s); |
In sirul s, caracterele litere mari sunt inlocuite cu caractere litere mici. |
|
strrev(s); |
Inverseaza toate caracterele sirului s, exceptand terminatorul |
|
strset(s,c); |
In sirul s, toate caracterele sunt inlocuite cu caracterul c. |
|
strnset(s,c,n); |
In sirul s, primele n caracterele sunt inlocuite cu caracterul c. Operatia se incheie, daca este intalnit terminatorul |
|
strlen(s); |
Returneaza lungimea sirului s. |
|
strcmp(s1, s2); |
Compara succesiv codurile ASCII ale celor doua siruri. Returneaza valoarea 0 daca sunt identice, o valoare pozitiva daca s1[k]>s2[k]; o valoare negativa daca s1[k]<s2[k], unde k este indicele unde apare prima diferenta intre caracterele sirurilor. |
|
strcimp(s1, s2); sau strcmpi(s1, s2); |
Idem strcmp, fara a face deosebire intre literele mari si mici. |
|
strncmp(s1, s2,n); |
Idem strcmp, dar compara numai primelor n caractere ale celor doua siruri |
|
strncmpi(s1, s2,n); sau strnicmp(s1, s2,n); |
Idem strcmp, dar compara numai primelor n caractere ale celor doua siruri, fara a face deosebire intre literele mari si mici. |
|
strchr(s, c); |
Returneaza un pointer la prima aparitie a caracterului c in sirul s. Cand caracterul nu este gasit, se returneaza NULL |
|
strrchr(s, c); |
Returneaza un pointer la ultima aparitie a caracterului c in sirul s. Cand caracterul nu este gasit, se returneaza NULL |
|
strstr(s1, s2); |
Returneaza un pointer la prima aparitie a sirului s2 in sirul s1. Cand sirul s2 nu este gasit, se returneaza NULL |
Programul Extrage majuscule utilizeaza o parte din functiile de mai sus. Astfel, citeste un sir de caractere s, realizeaza o copie a acestuia, converteste toate caracterele sirului copie in litere mici si, comparand sirul initial cu copia, caracter cu caracter, extrage literele mari din sirul s si le depune in sirul majuscule.
/* Extrage majuscule */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
majuscule[j]='0';
printf 'Majuscule:%sn',majuscule);
getch );
}
Tablouri multidimensionale
Forma generala de declarare a tablourilor multidimensionale este urmatoarea:
tip_element nume_tablou[dimensiune_1] [dimensiune_2] [dimensiune_n];
Un tablou cu n dimensiuni este de fapt un tablou unidimensional ale carui elemente sunt n tablouri cu n-1 dimensiuni.
Dimensiunea zonei de memorie care trebuie unui tablou multidimensional poate fi calculata cu relatia:
dimensiune_tablou = sizeof(tip_element)*dimensiune_1*dimensiune_2**dimensiune_n.
De exemplu, in secventa
int p[5][10];
char ch[3][8][20];
se declara tabloul p cu doua dimensiuni, tabloul ch cu trei dimensiuni, cu cate 50 si, respectiv, 480 de elemente.
Referirea la un element se face scriind numele tabloului urmat de fiecare indice incadrat de paranteze patrate:
nume_tablou[indice_1][indice _2][ indice _n];
De exemplu, pentru tablourile declarate mai sus, primele elemente sunt: p[0][0] si ch[0][0][0], iar ultimele elemente sunt: p[4][9] si ch[2][7][19].
Aplicatie
Programul Produsul a doua matrice determina produsul unei matrice A, de dimensiune nxp, cu o matrice B, de dimensiune pxq. Reziltatul este matricea C, de dimensiune nxq,
/* Produsul a doua matrice */
#include <stdio.h>
#include <conio.h>
void main()
;
for(i=0;i<p;++i)
for(j=0;j<q;++j)
;
for(i=0;i<n;++i)
for(j=0;j<q;++j)
;
for(i=0;i<n;++i)
getch );
}
Initializarea tablourilor
Initializarea unei matrice se poate face in acelasi timp cu declararea sa.
Forma generala de initializare a tablourilor unidimensionale este urmatoarea:
tip_element nume_tablou[dimensiune_1] [dimensiune_2] [dimensiune_n]=
umde lista_valori trebuie sa contina valori pentru toate elementele tabloului, valori compatibile cu tipul elementelor tabloului. In lista, valorile se separa prin virgula. Exemple:
int vector[3]=;
int matrice[2][3]=,};
Observatie: Acoladele care delimiteaza liniile matricei nu sunt obligatorii. Ele pot fi utilizate pentru a mari claritatea.
Tablourile (sirurile) de caractere permit o initializare prescurtata de forma:
char nume_sir[dimensiune] =."sir de caractere
Astfel, urmatoarea declaratie:
char s[8]=;
este echivalenta cu declaratia:
char s[8]="Exemplu";
Observatie: Deoarece toate sirurile de caractere se termina cu caracterul null, dimensiunea tabloului trebuie sa fie suficient de mare pentru al include. In cel de al doilea caz, compilatorul adauga automat caracterul null.
In cazul tablourilor unidimensionale, se poate omite dimensiunea, iar in cazul tablourilor multidimensionale, se poate omite numai dimensiunea din extrema stanga, celelalte fiind necesare compilatorului pentru a cunoaste organizarea elementelor.
Exemple de declaratii valide:
int vector[]=;
int matrice[][3]=;
Aceasta facilitate este foarte utila la initializarea sirurilor de caractere, deoarece nu mai este nevoie sa se cunoasca numarul caracterelor. Exemplu:
char s[]="Sir de caractere initializat";
Sirul s permite memorarea oricarui sir, fara a se depasi marimea declarata.
Programul urmator afiseaza tablouri initializate:
/* Initializare tablouri */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
;
char s[4]=;
char s1[4]='abc';/* Copia lui s */
for(i=0;i<n;++i)
;
}
printf 'nt s=');
for(i=0;i<strlen(s);++i) printf('%c',s[i]);
printf('ncopia lui s=');
for(i=0;i<strlen(s1);++i) printf('%c',s1[i]);
getch );
}
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2537
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved