domingo, 30 de dezembro de 2012

Vetores


Os dados que usaremos possuem o tipo compostos e estruturados, ou seja, são formados das estruturas mais simples que estão disponíveis. O estudo dessas estruturas envolve uma analise de como se combinam de modo a se formar a composição e de como extrair um componente especifico, começaremos pelo vetor e sua forma mais simplória, o vetor unidimensional, cuja definição será de um conjunto finito e ordenado de elementos homogêneos, entendemos que finito é o numero determinado de elementos no vetor, ordenado é a forma em que os elementos do vetor estão organizados, como elemento 1, 2, 3,... até seu tamanho e homogêneo onde os elementos são do mesmo tipo.

As duas operações básicas que acessam um vetor são o armazenamento e a extração, como podemos ver a operação de armazenamento recebe um vetor a e um índice i, junto de um elemento x, para extração basta apenas vetor a e índice i para recuperar o elemento.

No exemplo abaixo, foi incluído as funções store e extract para indicar a ação:


#define ARRAY_SIZE                 100

void store(char [], int, char);
char extract(char [], int);

void main(void)
{
      char Array[ARRAY_SIZE];
      int i;

      for (i = 0; i < ARRAY_SIZE; i++)
      {
            store(Array, i, i);
      }

      for (i = 0; i < ARRAY_SIZE; i++)
      {
            printf(" %i", extract(Array, i));
      }
}

void store(char a[], int i, char x)
{
      a[i] = x;
}

char extract(char a[], int i)
{
      return a[i];
}



No entanto, a linguagem C permite seu uso de forma muito mais simples, bastando declarar como mostrado a seguir com resultados iguais:


void main(void)
{
      char a[100];
      int i;

      for (i = 0; i < 100; i++)
            a[i] = i;

      for (i = 0; i < 100; i++)
            printf(" %i", a[i]);
}


Isso serve para comprovar o quão simples um vetor pode ser incluindo a forma de usa-lo. Basta declarar “char a[100];” para se ter implementado um vetor unidimensional de 100 posições sucessivas. Na linguagem C, a variável vetor é implementada como variável ponteiro, a diferença entre declarações como char *a, e char a[100] é que a ultima reserva 100 posições começando em a, ou seja, o elemento mostrado em a[i] é igual a *(a+i). Apesar de em C todos os elementos de um vetor ter tamanho fixo e predeterminado, podemos criar um método para um vetor de tamanho variável reservando um conjunto contiguo de posições na memória, cada uma das quais armazenando um endereço. Cada posição da memória é o endereço do vetor, de tamanho variável, em alguma outra parte da memória, semelhante à forma com que as strings em C é tratadas, uma string é implementada como um vetor, de modo que um vetor de strings, é na verdade um vetor de vetores, vetor bidimensional. Vejamos duas técnicas que resultam num vetor de strings de tamanho variável.

Podemos incluir no primeiro byte o tamanho da string:


->
4
H
E
L
L
O
...
...
...

->
4
W
O
R
L
D
...
...
...

->
2
M
Y
...
...
...
...
...
...

->
4
F
I
R
S
T
...
...
...

->
6
P
R
O
G
R
A
M
...






  
Usar um terminador nulo:


->
H
E
L
L
O
\0
...
...
...

->
W
O
R
L
D
\0
...
...
...

->
M
Y
\0
...
...
...
...
...
...

->
F
I
R
S
T
\0
...
...
...

->
P
R
O
G
R
A
M
\0
...






  
Claro que tudo isto envolve um nível adicional de acesso, que reduz a eficiência, mas plenamente justificável pela conveniência de manter tal característica.

Nenhum comentário:

Postar um comentário