Documente Academic
Documente Profesional
Documente Cultură
II. Tablouri
1. Elemente de memorare a informatiei
2. Definire tablouri
3. Tablouri unidimensionale
1. Implementare statica
2. Implementare dinamica
4. Tablouri multidimensionale
1. Implementare statica
2. Implementare dinamica
5. Matrici particulare
1. Triunghiulara
2. Simetrica
3. Banda
6. Implementarea dinamica semicompacta a matricelor
∑ dim t ik
k= 1
3. Tablouri unidimensionale
3.2.2. Vectori dinamici cu implementare variabila
T – tipul asociat unui vector maximal pentru datele considerate
dim(T) – spatiul maximal definit generic
t – se defineste pe parcursul executiei si este o restrictie a lui T
a - adresa asociata vectorului, singura componenta definita in program
Ex.: V : {i1,…,in} → A din care sunt definite efectiv doar primele p ≤ n componente
t = T |p ; t – tipul vectorului v : {i1,…,ip} → A , vi = Vi, i din {i1,…,ip}
s = dim(t) – spatiul alocat la implementare = buffer
- de regula nu este un spatiu accesibil direct elementelor vectorului;
- spatiu cu aceeasi dimensiune cu a vectorului si peste care acesta se
suprapune.
Accesul la un element al vectorului – procese de acces:
- In scriere: trecerea valorii in spatiul unei componente se face cu
descompunerea reprezentarii in bytes componenti;
- In citire: valoarea din spatiul unei componente se obtine prin recompunerea
reprezentarii plecand de la bytes componenti.
4. Tablouri multidimensionale
4.1. Implementare statica
Implementare prin linearizare linie (Pascal, Delphi, C++, Java) sau coloana
(FORTRAN) => se bazeaza pe implementarea statica a vectorilor.
f : B1 x … x Bp → A - tablou p – dimensional: | Bi | = ni
∣B ∣=ni nr. de elemente ale tabloului = nr. de elemente ale vectorului v
peste care se face suprapunerea tabloului; v : {1, …, n} → A
∣B ∣ i spatiul alocat tabloului multidimensional f
Rangul unui element al unui tablou multidimensional f = nr care indica pozitia
elementului in vectorul de liniarizare.
Formula de rang:
- Linearizare prin linii:
p = 2: rang b 1 ,b 2 = ∣B ∣rang b1 +rang b2
2 2 1 1
rang 2 a[ i,j ] =n 2⋅ i− 1 j− 1
4. Tablouri multidimensionale
4.1. Implementare statica
p – oarecare: gi : B2 x … x Bp → A, gi (i2, …, ip) = f (i, i2, …, ip )
m : B1 x C → A, unde C = B2 x … x Bp.
rang 2 b 1 ,c =∣C∣rang 1 b1 +rang1 c
rang p b1 , . .. ,b p =n 2 .. . n p rang 1 b 1 +rang p− 1 b2 ,. .. ,b p
rang p b1 ,...,b p =n 2 ...n p rang 1 b 1 +n 3 ...n p rang 1 b 2 ...+rang1 b p
p p
rang lp b1 , . .. ,b p = ∑ ∏ n j rang 1 b i
i=1 j=i+1
j j− 1 j− 1 2n 2− j
rang sup
c i,j = +i− 1 rang inf
2 c i,j = +i− 1
2
i i− 1
rang inf
l i,j = +j− 1
2
6. Implementarea matricilor simetrice
Ex.: A, B - matrici patrate n x n
A s.n. matrice simetrica pt orice i ≠ j, aij = aji.
B s.n. componenta superior triunghiulara a matricei A bij = aij, pt i ≤ j,
respectiv bij = 0, pt i > j.
Implementarea matricelor simetrice se realizeaza ca implementarea matricelor
inferior triunghiulare, printr-un vector cu m = n(n+1)/2 elemente.
Formula de rang pentru
i i− 1
- Linearizare linie rang sim
l i,j = +j− 1, i≥ j
2
j j− 1
rang sim
l i,j = +i− 1,i<j
2
i− 1 2n 2− i
- Linearizare coloana rang sim
c i,j =
2
+j− 1,i>j
j− 1 2n 2− j
rang sim
c i,j = +i− 1, i≤ j
2
7. Implementarea matricilor banda
7.1. Matrice p – diagonala
f : {1, …,n} x {1,…,n} → A, 1 ≤ k << n. f – matrice (2k – 1) – diagonala toate
elementele pentru care |i – j| > k – 1 sunt nule.
Nr. elemente pe cele p “diagonale”:
m = n + 2(n - 1) + … + 2(n – k + 1) = n(2k – 1) – k(k – 1)
Implementarea matricelor diagonale prin memorarea doar a elementelor de pe
“diagonale” este eficienta daca reducere spatiului este semnificativa. (>50%)
3− diag
Formule de rang: k = 2; m = 3n – 2; linearizare linie rang l i,j = 2i +j− 3
{ }
k− 1 i− 1 +j− 1 1≤ i<n− k+ 1
rang sup−
l
k− diag
i,j = i+k − n− 1 n+k − i
+k n− k +j− i n− k+1≤ i≤ n
2
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n", nwhite, nother);
}
8. Implementarea tablourilor in C. Siruri de caractere
while (there's another line)
if (it's longer than the previous longest)
(save it)
(save its length)
print longest line
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int x = 1, y = 2, z[10];
int *ip; /* ip is a pointer to int */
Obs. Parantezele sunt necesare in ultimul exemplu. Fara paranteze s-ar incrementa ip.
Operatorii unari precum * si ++ se asociaza de la dreapta la stanga.
Obs. Deoarece pointerii sunt variabile, pot fi folositi fara dereferentiere. Ex. Fie iq un alt
pointer spre int:
iq = ip
copiaza continutul lui ip in iq, facand iq sa pointeze catre ceea ce pointa si ip.
8. Implementarea tablourilor in C. Pointeri si tablouri
8.2. Pointeri si tablouri
Declaratia
int a[10];
defineste un tablou de dimensiune 10, adica un bloc de 10 obiecte consecutive a[0], a[1],
...,a[9].
Daca pa este un pointer catre un intreg:
int *pa;
atunci atribuirea:
pa = &a[0];
seteaza pa sa pointeze catre elementul 0 al lui a => pa contine adresa lui a[0].
Atribuirea
x = *pa;
copiaza continutul lui a[0] in x.
Daca pa pointeaza catre un element particular al unui tablou, atunci pa+1 pointeaza catre
urmatorul element, pa+i pointeaza al i-lea element dupa pa, iar pa-i pointeaza al i-lea
element de dinaintea lui pa.
Astfel, daca pa pointeaza spre a[0], *(pa+1) face referire la continutul lui a[1], pa+i este
adresa lui a[i] si *(pa+i) este continutul lui a[i].
Aceste observatii sunt adevarate indiferent de tipul sau de dimensiunea variabilelor din
tablou.
8. Implementarea tablourilor in C. Pointeri si tablouri
8.2. Pointeri si tablouri
Prin definitie, valoarea unei variabile sau expresii de tip array este adresa elementului 0 al
array-ului. Astfel, dupa atribuirea
pa = &a[0];
pa si a au valori identice.
Deoarece numele array-ului este sinonim cu cu locatia elementului initial, atribuirea
pa=&a[0];
se mai poate scrie
pa = a;
De asemenea, referire catre a[i] se mai poate scrie *(a+i). Pentru evaluarea lui a[i], C face
imediat conversia sa in *(a+i). Putem spune ca cele doua forme sunt echivalente.
Aplicand operatorul & ambelor parti ale echivalentei => &a[i] si a+i sunt identice: a+i este
adresa celui de-al i-lea element de dupa a.
Cum pa este un pointer, poate sa apara in expresii cu indexare; pa[i] este identic cu *(pa+i).
Cand numele unui array este transmis unei functii, ceea ce se transmite este locatia
elementului initial. In cadrul functiei apelate, acest argument este o variabila locala
8. Implementarea tablourilor in C. Pointeri si tablouri
8.2. Pointeri si tablouri
/* strlen: return length of string s */
int strlen(char *s)
{
int n;
for (n = 0; *s != '\0', s++)
n++;
return n;
}
Deoarece s este un pointer, incrementarea sa este legala; s++ nu are efect asupra sirului de
caractere din functia care apeleaza strlen, ci incrementeaza copia pointerului.
Sunt legale:
strlen("hello, world"); /* sir de constante */
strlen(array); /* char array[100]; */
strlen(ptr); /* char *ptr; */
8. Implementarea tablourilor in C. Pointeri si tablouri
8.2. Pointeri si tablouri
Este posibil sa se transmita o parte a unui tablou unei functii, transmitand un pointer catre
inceputul subsirului corespunzator. De exemplu, daca a este un sir,
f(&a[2])
si
f(a+2)
transmit, ambele, functiei f, adresa subsirului care incepe la a[2]. In cadrul lui f, declararea
parametrului este
f(int arr[]) { ... }
or
f(int *arr) { ... }
Daca este sigur ca elementele exista, se pot face indexari in sens invers in sir. P[-1], p[-2],...
sunt legale dpv sintactic si se refera la elementele imediat precedente lui p[0]. Este ilegal sa
se faca referire la obiecte care nu se afla intre extremitatile sirului.