LINGUAGEM: Linguagem C - Matrizes

Na Ciência da computação, uma estrutura de dados é um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente de acordo com a necessidade.
Diferentes tipos de estrutura de dados são adequadas a diferentes tipos de aplicação e algumas são altamente especializadas, destinando-se a algumas tarefas específicas. Por exemplo, as B-trees são particularmente indicadas para a implementação de bases de dados , enquanto que a implementação de compiladores geralmente requer o uso de tabela de dispersão para a busca de identificadores.
Estruturas de dados e algoritmos são temas fundamentais da ciência da computação, sendo utilizados nas mais diversas áreas do conhecimento e com os mais diferentes propósitos de aplicação. Sabe-se que algoritmos manipulam dados. Quando estes dados estão organizados (dispostos) de forma coerente, caracterizam uma forma, uma estrutura de dados. A organização e os métodos para manipular essa estrutura é que lhe conferem singularidade.
(Fonte: Wikipédia)

Começando as aulas sobre as estruturas de dados mais convencionais, iremos abordar primeiramente as matrizes.


-Matrizes e vetores.

Na linguagem C e especialmente em estrutura de dados, as matrizes são mais comumente utilizadas em vetores unidimensionais, que são matrizes de uma única dimensão. A declaração destes vetores em C deve obedecer a seguinte sintaxe:

 Tipo nome_vetor[tamanho];
ou
Tipo * nome_vetor;

O tipo comumente é um inteiro por ser tratar de valores numéricos a maioria das matrizes. E o tamanho representa a quantidade de elementos que esta matriz irá conter, no caso de ponteiro o tamanho inicial não é definido e deverá ser alocado o espaço que se deseja. É importante dizer que na linguagem c as matrizes começam pelo índice 0 que guarda o primeiro elemento da matriz. Para entender melhor, considere que seja necessário declarar um vetor do tipo inteiro que contenha 10 elementos. Isto é feito da seguinte forma:

int vetor_exemplo[9];
 
Isso por que a matriz “vetor_exemplo” vai de 0 a 9, ou seja, contém 10 elementos. Também é possível inicializar o vetor no momento de sua declaração. Para isso veja a sintaxe abaixo:

Tipo nome_vetor[tamanho]={lista_de_valores};
 
Sendo que todos os elementos da lista de valores devem ser separados por virgula e serem todas do mesmo tipo de dados especificado. A seguir temos a declaração do “vetor_exemplo” com os valores atribuídos.
 
int vetor_exemplo[9]={0,1,2,3,4,5,6,7,8,9};

Exemplo de um programa completo utilizando vetores e outros conceitos estudados até o momento.
  
- Matrizes em forma de vetor através de ponteiros

As matrizes que são bidimensionais (ex.: m[2][2]) podem ser guardadas em forma de um vetor unidimensional, e assim facilita a alocação, e tudo isto é feito através de ponteiros.
Veja o exemplo para ter uma melhor noção: [LINK AQUI]

Para manipular as matrizes em forma de ponteiro é usada uma fórmula para percorrer a matriz e ter a posição equivalente dentro do vetor.

ex.:
Tem estas duas formas, uma matriz e um vetor:
int m[ ][ ]
int m[ ]
E para cada elemento da matriz matemática, se tem o elemento equivalente na matriz em c :
M i,j = m[i][i]

para saber a mesma posição da matriz matemática no vetor, é usada a seguinte fórmula:

M i,j = m[k]                 para:  k = i * m + j;

Onde m é o número de colunas da matriz, desta forma pode-se colocar uma matriz inteira dentro de um vetor ou ponteiro, e da mesma forma encontrar este elemento com essa fórmula.

ex.:

for(i=0 ; i<n ; i++){
              for(j=0 ; j<m ; j++){
                  scanf("%i", &a);
                  k = i * m +j;
                  pv[k] = a;
             }    
         }

Este trecho de código usa dois for para percorrer a matriz que está sendo lida do teclado, e logo em seguida usa a fórmula para jogar este mesmo elemento dentro do vetor na posição k.