Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Masive multidimensionale

c


Masive multidimensionale

Limbajul C ofera facilitatea utilizarii masivelor multidimensionale, desi in practica ele sint folosite mai putin decit masivele de pointeri.



Sa consideram problema conversiei datei, de la zi din luna, la zi din an si invers, tinind cont de faptul ca anul poate sa fie bisect 242c26c sau nu. Definim doua functii care sa realizeze cele doua conversii.

Functia day_of_year converteste ziua si luna in ziua anului si functia month_day converteste ziua anului in luna si zi.

Ambele functii au nevoie de aceeasi informatie si anume un tabel cu numarul zilelor din fiecare luna. Deoarece numarul zilelor din luna difera pentru anii bisecti de cele pentru anii nebisecti este mai usor sa consideram un tabel bidimensional in care prima linie sa corespunda numarului de zile ale lunilor pentru anii nebisecti, iar a doua linie sa corespunda numarului de zile pentru anii bisecti. In felul acesta nu trebuie sa tinem o evidenta in timpul calculului a ceea ce se intimpla cu luna februarie. Atunci masivul bidimensional care contine informatiile pentru cele doua functii este urmatorul:

static int day_tab[2][13] = ,

};

Masivul day_tab trebuie sa fie declarat extern pentru a putea fi folosit de ambele functii.

In limbajul C, prin definitie, un masiv cu doua dimensiuni este in realitate un masiv cu o dimensiune ale carui elemente sint masive. De aceea indicii se scriu sub forma [i][j] in loc de [i,j], cum se procedeaza in cele mai multe limbaje. Un masiv bidimensional poate fi tratat in acelasi fel ca si in celelalte limbaje, in sensul ca elementele sint memorate pe linie, adica indicele cel mai din dreapta variaza cel mai rapid.

Un masiv se initializeaza cu ajutorul unei liste de initializatori inchisi intre acolade; fiecare linie a unui masiv bidimensional se initializeaza cu ajutorul unei subliste de initializatori. In cazul exemplului nostru, masivul day_tab incepe cu o coloana zero, pentru ca numerele lunilor sa fie intre 1 si 12 si nu intre 0 si 11, aceasta pentru a nu face modificari in calculul indicilor.

Si atunci functiile care realizeaza conversiile cerute de exemplul nostru sint:

day_of_year (int year, int month, int day)

Deoarece variabila leap poate lua ca valori numai zero sau unu dupa cum expresia:

(year%4==0) && (year%100!=0) ||

(year%400==0)

este falsa sau adevarata, ea poate fi folosita ca indice de linie in tabelul day_tab care are doar doua linii in exemplul nostru.

month_day(int year, int yearday,

int *pmonth, int *pday)

Deoarece aceasta ultima functie returneaza doua valori, argumentele luna si zi vor fi pointeri.

Exemplu: month_day(1984,61,&m,&d) va incarca pe m cu 3, iar pe d cu 1 (adica 1 martie).

Daca un masiv bidimensional trebuie transmis unei functii, declaratia argumentelor functiei trebuie sa includa dimensiunea coloanei. Dimensiunea liniei nu este necesar sa apara in mod obligatoriu, deoarece ceea ce se transmite de fapt este un pointer la masive de cite 13 intregi, in cazul exemplului nostru. Astfel, daca masivul day_tab trebuie transmis unei functii f, atunci declaratia lui f poate fi:

f(int (*day_tab)[13])

unde declaratia (*day_tab)[13]) indica faptul ca argumentul lui f este un pointer la un masiv de 13 intregi.

In general deci, un masiv d-dimensional a[i][j][p] de rangul i*j**p este un masiv d 1 - dimensional de rangul j*k**p ale carui elemente, fiecare, sint masive d 2 - dimensionale de rang k**p ale carui elemente, fiecare, sint masive d 3 - dimensionale s.a.m.d. Oricare dintre expresiile a[i] a[i][j] a[i][j] [p] pot aparea in expresii. Prima are tipul masiv, ultima are tipul int, de exemplu, daca masivul este de tipul int. Vom mai reveni asupra acestei probleme cu detalii.



Document Info


Accesari: 514
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )