Doriți să reacționați la acest mesaj? Creați un cont în câteva clickuri sau conectați-vă pentru a continua.

Capitolul 5.7. Tablouri multi-dimensionale

In jos

Capitolul 5.7. Tablouri multi-dimensionale Empty Capitolul 5.7. Tablouri multi-dimensionale

Mesaj  zooky Mier Mar 18, 2009 1:48 pm

C este prevazut cu probabilitatea de a lucra cu tablouri multidimensionale, cu toate ca in practica exista tendinta ca ele sa fie mult mai putin utilizate decit tabloutile de pointeri. In aceasta sectiune vom da citeva dintre proprietatile lor.
Sa reluam problema de conversia datei, zi-in-luna in zi-in-an si viceversa. De exemplu, 1 martie este a 60-a zi dintr-un an nebisect si a 61-a dintr-un an bisect. Sa definim doua functii care sa faca conversia "day_of_year" converteste luna si ziua in ziua din an si luna, iar "month_day" converteste ziua din an in luna si ziua. Daca aceasta din urma functie returneaza doua valori, argumentele "luna si ziua" vor fi pointeri:

month day (1977, 60, &m, &d)

puna pe m pe 3 si pe d pe 1.

Aceste functii au nevoie de aceasi informatie, o tabela cu numarul zilelor din fiecare luna ("30 zile are septembrie"). Din moment ce numarul de zil/luna difera in functie de an bisect sau an nebisect, este mai usor sa separam aceste informatii pe doua linii ale unui tablou bidimensional; apoi sa incercam sa tinem cont de ce se intimpla cu februarie in timpul calcului.
Tabloul si functia pentru rezolvarea transformarilor sint dupa cum urmeaza:

static int day_tab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
day-of-year(year, month, day) /* pune nr zilei in an */
int year, month, day; /* din luna &an */
{
int i, leap;
leap = year % 4 ==0 && year % 100 !=0 || year % 400 ==0;
for (i = 1; i < month; i++)
day += day_tab[leap][i];
return(day);
}
month_day(year, yearday, pmonth, pday) /*pune luna, zi */
int year, yearday, *pmounth, *pday; /* din ziua in an */
{
int i, leap;
leap = year % 4 ==0 && year % 100 !=0 || year % 400 ==0;
for (i = 1; yearday > day_tab[leap][i]; i++)
yearday -= day_tab[leap][i];
*pmonth=i;
*pday=yearday;
}

Tabloul day-tab trebuie sa fie extern ambelor functii "day_of_year" si "month_day", in asa fel incit ambele sa-l poata utiliza. "day-tab" este primul tablou bidimensional cu care avem de a face in C, Prin definitie un tablou bidimensional este de fapt un tablou unidimensional alei carei elemente sint fiecare in parte cite un tablou. Prin uramre, indicii se scriu astfel

day_tab[i][j]

in loc de

day_tab[i, j]

ca in majoritatea limbajelor in plus un tablou bidimensional poate fi tratat in mai multe moduri decit in alte limbaje. Elementele sint memorate pe linii, ceea ce inseamna ca indicele din deapta varaiaza primul in asa fel incit elementele sint accesate in ordinea memoriei.
Un tablou se initializeaza printr-o lista de initializatori scrisi intre acolade; fiecare liniea unui tablou bidimensional este initializata printr-o sublista corspondenta. Am inceput tabloul day-tab cu o coloana de zero, in asa fel incit numerotarea liniilor poate fi facuta de la 1 la 12 in loc de 1 0-11.
Daca exista spatiu suficient, este mai usor sa se procedeze innmodul mai sus aratat in loc sa se ajusteze indicii.
In cazul in care un tablou bidimensional trebuie transmis unei functii, declararea argumentelor in funtie trebuie sa includa dimensiunea coloanei, dimensiunea liniei este irelevanta deoarece unei functii i se transmite ca si in cazurile anterioare, un pointer. In cazul de fata este vorba de un pointer care parcurge obiecte care sint tablouri de cite 13 int. Astfel daca trebuie transmis tabelul day-tab unei functii f, declararea lui f va fi

f(day_tab)
int day_tab[2][13];
{
...
}

Declararea argumentului in f va fi deasemenea

int day-tab[][13];

din moment ce nr liniilor este irelevant, sau ar putea fi

int (*day-tab)[13];

care spune ca argumentul este un pointer pe un tablou de 13 intregi. Sint necesare parantezele pentru ca crosetele au prioritate mai mare decit *, fara paranteze; declararea

int *day-tab[13];

este un tablou de 13 pointeri pe intregi, dupa cum se va vedea in sectiunea urmatoare.
zooky
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 31
Localizare : Cernatesti City

https://e-learning.forumgratuit.ro

Sus In jos

Sus

- Subiecte similare

 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum