Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

C


Index » educatie » » informatica » C
» Tablouri si siruri


Tablouri si siruri


TABLOURI SI SIRURI

In esenta un tablou este o lista de variabile de acelasi tip. Un tablou de caractere poarta numele de sir. Accesul la un element al tabloului se face cu ajutorul unui indice sau mai a multi indici. Tablourile ocupa in memorie locatii contigue. Tablourile pot avea una sau mai multe dimensiuni. Sirurile, tablouri unidimensionale sunt terminate cu un caracter special, caracterul null ('0').

Intre tablouri si pointeri exista o legatura stransa.

Tablouri unidimensionale



Forma generala de declarare a unui tablou unidimensional este:

tip nume_tablou [dimensiune];

unde:

- tip - declara tipul de baza al tabloului, care este tipul fiecarui element al tabloului;

- dimensiune - specifica numarul de elemente ale tabloului;

- nume_tablou - este numele dat tabloului.

De exemplu, pentru a declara un tablou t cu 10 elemente de tip int cu elementele t[0],

t[1] . t[9] vom scrie:

int t[10];

Un element al tabloului este accesat prin indexarea numelui tabloului folosind numarul elementului. Primul element al tabloului are indexul 0. Pentru a indexa un tablou, trebuie specificat numele tabloului urmat de indexul elementului intre paranteze drepte.De exemplu al doilea element al tabloului t poate fi accesat prin t[1].

Exemplu. Program pentru a initializa elementele tabloului t cu valori cuprinse intre 0 si 9.

# include <stdio.h>

void main (void)

Necesarul de memorie pentru memorarea elementelor unui tablou unidimensional este direct proportional cu tipul si dimensiunea sa, total octeti =sizeof(tip) * dimensiune

Elemetele unui tablou sunt memorate intr-o zona de memorie contigue in ordinea indicilor.

Limbajul C nu controleaza limitele unui tablou. Astfel se poate depasi ambele "margini" ale unui tablou, se poate scrie valoarea unui element de tablou in locul altor variabile sau peste instructiunile masina ale programului. De aceasta problema este raspunzator cel care scrie programul si nu compilatorul C. De exemplu:

int x[10],i;

for (i = 0; i < =10; i ++) x [i] = i;

determina x sa depaseasca limitele.

Un element de tablou poate sa apara oriunde pot apare variabile simple sau constante, in general in cadrul expresiilor. In C nu este posibil sa copiem direct elementele unui tablou in alt tablou, printr-o instructiune de atribuire de forma:

int x[5], y[5];

.. . . . . . . . . .

y + x; /* nu este posibil */

y=x; /* nu este admis*/

Pentru a realiza acest lucru este necesar sa copiem fiecare element in mod explicit, adica:

int x [5], y[5], i;

- - - - - - - - -

for (i = 0; i < 5; ++i)

y[i] = x[i];

- - - - - - - - - -- - -

sau

for (i =1; i <6; i++)

y[i-1] = x[i-1];

Pentru a citi valorile elementelor unui tablou cu functia scanf, este necesar a se pune operatorul & (de adresa) in fata elementului de tablou. De exemplu pentru a citi elementele tabloului x putem scrie:

for (i = 0; i < 5; ++i)

Exemplu. Program ce realizeaza ordonarea unui tablou care are cel mult 50 elemente prin metoda "bulelor".

# include <stdio.h>

void main (void)

do

} while (k! = 0);

print f ("Tabloul ordonat: n");

for (i = 0; i < n: i++)

printf('%d ', x[i]);

}

Siruri

Sirul este definit ca fiint un tablou de caractere terminat cu caracterul NULL ('0'). Deoarece sirul trebuie terminat cu caracterul null, inseamna ca tabloul de caractere trebuie declarat astel incat sa poata contine un sir cu o unitate mai mare decat cel mai lung sir ce va fi depus vreodata in acest tablou.

De exemplu, pentru a declara un tablou de caractere, sir, care are 10 caractere se va scrie:

char sir[11];

Desi in C nu exista tipul de date sir de caractere, se admite constante sir ca o succesiune de caractere cuprinse intre ghilimele.

De exemplu:

"Acesta este un sir de caractere"

Nu este necesar a se introduce manual caracterul null la sfarsitul sirului, compilatorul o va face automat.

Citirea unui sir de caractere de la tastatura, se poate face apeland functia gets() aflata in biblioteca <stdio.h>. Ca argument al functiei gets() este numele sirului. Functia gets() citeste caracterul pana la apasarea tastei ENTER, cand adauga sirului introdus caracterul null.

Exemplu:

# include <stdio.h>

void main (void)

Instructiunea for utilizeaza pentru expresia conditie, care controleaza ciclul, faptul ca, caracterul null de la sfarsitul sirului inseamna false.

Afisarea sirului s-a facut cu functia print f(), caracter cu caracter folosind specificatorul de format %c. Este posibil a afisa sirul de caractere prin apelul functiei:

printf('%s',nume);

deoarece primul argument al functiei print f() este un sir de caractere, deci se poate folosi nume fara nici un index ca prim element al functiei( folosind specificatorul de format %s)

Daca se doreste ca dupa afisarea sirului sa se treaca la linie noua putem folosi apelul:

print f ("%s n", nume);

Pentru operatii cu siruri de caractere biblioteca C standard contine numeroase functii. Pentru utilizarea lor trebuie sa fie inclus fisierul header < string.h>. Cele mai uzuale functii sunt:

strcpy(s1, s2) - copiaza sirul s2 in s1

strcat(s1, s2) - concateneaza s2 la sfarsitul lui s1

strlen(s) - returneaza lungimea sirului s

strcmp (s1, s2) - compara s1 cu s2 si returneaza 0 daca s1 si s2 sunt identice;

o valoare mai mica ca 0 daca s1<s2;

o valoare mai mare ca 0 daca s1>s2;

strchr (s1, ch) - returneaza un pointer la prima aparitie a lui ch in s1

strstr (s1, s2) - returneaza un pointer la prima aparitie a lui s2 in s1

Exemplu:

# include <stdio.h>

# include <string.h>

void main (void)

In acest exemplu s-au folosit o parte din functiile din biblioteca ce opereaza asupra sirurilor de caractere.

O utilizare des intalnita a sirurilor de caractere o constituie interfetele bazate pe comenzi. Daca meniul permite utilizatorului sa faca o selectie a comenzii, interfata bazata pe comenzi afiseaza un mesaj, asteapta introducerea unei comenzi si executa comanda.

Exemplu:

# include <stdio.h>

# include <stdlib.h>

# include <string.h>

void main (void)

else if (!strcmp (comanda, "rest"))

else print f("comanda necunoscuta n");

}

}

Functia atoi () aflata in biblioteca <stdlib.h>, returneza intregul echivalent al numarului reprezentat de sirul de caractere, argument al functiei.

Tablouri bidimensionale

Tabloul bidimensional este cunoscut si sub denumirea de matrice. Matricea este un tablou cu doua dimensiuni, sau altfel spus un vector de vector. Forma generala de declarare a unui tablou bidimensional este:

tip nume [dim1] [dim 2];

unde:

- tip - este tipul de baza al tabloului, al elementelor tabloului;

- dim1, dim2 - constante intregi ce indica numarul de elemente al fiecarei dimensiuni;

- nume - numele tabloului.

Cele doua dimensiuni ale tabloului nu se separa prin virgula ca in alte limbaje de programare, fiecare dimensiune este plasata intre paranteze drepte.

Pentru a declara o matrice mat cu 5 linii si 10 coloane de tip intreg va scrie:

int mat [5] [10];

Elementele tabloului bidimensional se acceseaza specificand numele tabloului, linia in paranteze drepte si coloana in paranteze drepte. Elementele tabloului bidimensional pot fi folosite oriunde poate apare o constanta sau variabila de acel tip.

De exemplu elementul din linia 3 coloana 4 al matricei mat se accesaza prin:

mat[2][3]

Indexul fiecarei dimensiuni incepe de la zero.

Exemplu. Initializarea unei matrici, cu 3 linii si 4 coloane cu valori cuprinse intre 1 si 12.

# include <stdio.h>

void main (void)

}

int i,j, mat [3] [4];

for (i = 0; i < 3; ++i)

for (j = 0; j < 4; ++j)

mat [i] [j] = 4 * i + j + 1;

for (i = 0; i < 3; ++i)

Avem mat[0] [0] = 1 , mat[0] [1] = 2, mat [0] [2] = 3, . .mat [2] [3] = 12. Tablourile bidimensionale sunt memorate in forma linie - coloana unde primul indice indica linia iar al doilea coloana. Aceasta inseamna ca indicele din dreapta se modofica cel mai repede, astfel ca in memorie vom avea:

mat[0][0]

mat[0][1]

mat[0][2]

. . . .

mat[2][0]

mat[2][1]

mat[2][2]

mat[2][3]

Numarul de octeti de memorie necesari pentru un tablou bidimensional este dat de relatia:

nr_octeti = (dim1) * (dim 2) * (sizeof(tip))

Pentru tabloul mat sunt necesari 3 x 4 x 2 = 24 octeti. Daca un tablou bidimensional este argument al unei functii, trebuie transmis doar un pointer catre primul element al tabloului.

Pentru a informa compilatorul C de lungimea fiecarui rand (linii) pentru a indexa corect tabloul, va trebui sa se defineasca cel putin numarul de coloane. De exemplu daca functia f() primeste ca argument o matrice de tip intreg m cu 5 linii si 10 coloane se va declara astfel:

void f (int m [] [10])

Se poate specifica si prima dimensiune (numarul de linii) dar nu este necesar.

Pentru a putea calcula pozitia unui element in memorie este absolut necesar a se stii numaul de coloane altfel compilatorul nu poate calcula unde incepe un anumit rand.

Exemplu.

Program ce memoreaza notele celor 30 de studenti la cele 5 examene dintr-o sesiune.

# include <stdio.h>

# include <stdlib.h>

# include <ctype.h>

# define EXAMENE 5

# define NOTE 30

int note[EXAMEN] [NOTE];

void introdu_note (void);

int citeste_nota (int nota);

void afis_note (int m[ ] [NOTE]);

void main(void)

while (ch! = 'I' && ch! = 'A' && ch!='T');

switch (ch)

}

}

void introdu_note(void)

}

int citeste_nota (int num)

void afis_note (int m [ ] [NOTE]

}

int i, j;

for (i =0; i < EXAMENE; ++i)

Siruri bidimensionale (Tablouri de siruri)

Tablourile de siruri numite si siruri bidimensionale se pot crea ca orice tablou bidimensional de caractere. Declaratia:

char siruri [10] [20];

declara un tablou care contine 10 siruri, fiecare avand cel mult 19 caractere (ultimul este caracterul null).

Pentru a accesa unul din cele 10 siruri se va specifica doar primul indice. Pentru a citi de la tastatura al 4-lea sir al tabloul se va scrie functia:

gets(siruri [3]);

care este echivalenta cu:

gets(& siruri [3] [0]);

Exemplu:

Program pentru a citi de la tastatura cel mult 50 siruri de caractere, fiecare sir avand cel mult 79 caractere. Introducerea unei linii vide n conduce la iesirea din operatia de citire.

# include <stdio.h>

# define MAX 50

# define LUNG 80

char pagina [MAX] [LUNG];

void main (void)

/* afisare pagina - siruri citite */

for (i = 0; i < k; i++)

}

Tablouri multidimensionale

Un tablou multidimensional este in esenta un tablou de tablouri bidimensionale. Limbajul C permite tablouri cu mai multe dimensiuni. Forma generala de declarare a unui tablou multidimensional este:

tip nume [dim1] [dim2][dim3] . [dim n];

Accesul la un element al unui tablou multidimensional este mult mai lent decat accesul la un element al unui tablou unidimensional. Fie declaratia:

int t[3] [4] [5] [2];

Daca o functie f() ar trebui sa primeasca ca argument un asemenea tablou, argumentul respectiv din declaratia functiei nu este necesar sa specifice prima dimensiune a tabloului. De exemplu:

void f (int m [] [4] [5] [2])

Initializarea tablourilor

Ca si in cazul altor variabile si elementele tablourilor pot primi valori initiale dintr-o lista cu valori, intr-o instructiune de declarare. Forma generala a declararii si initializarii unui tablou este:

tip nume [dim1] [dim2] . [din n] =;

unde:

- tip - este tipul tabloului;

- dim1, dim2, . dim n - dimensiunile tabloului;

- nume - este numele tabloului;

- lista_de_valori - este o lista de constante separate prin virgula cu care urmeaza a se

initializa elementele tabloului.

Valorile din lista_de_valori trebuie sa fie de tip compatibil cu tipul tabloului.

Declaratia:

int x[5] = ;

conduce la initializarile x[0] = 1; x[1] = 2, x[2] = 3; x[3] = 4 si x[4] = 5

Sirurile de caractere pot fi initializate sub o forma prescurtata:

char nume [dim] = "sir" ;

De exemplu declaratia:

char sir [5] = "test";

conduce la sir [0] = 't', sir [1] = 'e', sir[2] = 's' si sir[3] = 't', x[4] = '0'

echivalent cu a scrie:

char sir [5] = ;

Deoarece toate sirurile in C se termina cu caracterul null, trebuie ca dimensiunea tabloului sa fie suficient de mare pentru a-l putea include.

Tablourile multidimensionale se initializeaza la fel ca tablourile unidimensionale. Declaratia:

int mat [3] [2] = ;

conduce la mat [0] [0] = 1, mat [0] [1] = 2, . . . mat [2,1] = 6.

Daca intr-o declaratie de initializare a unui tablou unidimensional nu este specificata dimensiunea, compilatorul C creza automat un tablou suficient de mare pentru a pastra toate initializarile existente.

De exemplu declaratia:

int x[ ] = ;

forteaza compilatorul sa initializeze un tablou unidimensional cu 6 elemente.

Pentru tablourile multidimensionale trebuie specificate toate dimensiunile cu exceptia dimensiunii din stanga.

int mat [ ] [3] = ;

Avantajul acestei declaratii este acela ca tabloul poate fi marit sau micsorat fara a fi necesara modificarea dimensiunilor.

In cazul sirurilor de caractere, compilatorul calculeaza corect dimensiunea tabloului, incluzand si caracterul null.

char mesaj[ ] = "Acesta este un mesaj";






Politica de confidentialitate




Copyright © 2024 - Toate drepturile rezervate