LISTAS E MATRIZES

  As variáveis cumprem bem com o seu papel quando se trata de dados unitários. Entretanto, se desejarmos armazenar múltiplos dados do mesmo tipo e função, como, por exemplo, o nome de 10 pessoas, o uso das variáveis se torna algo deselegante, como:
#include <stdio.h>

char *nome1, *nome2, *nome3, *nome4, *nome5, *nome6, *nome7, *nome8, *nome9, *nome10;

void main(void)
{
  printf("Entre o nome da 1a. pessoa: ");
  scanf("%s",nome1);
  printf("\nEntre o nome da 2a. pessoa: ");
  scanf("%s",nome2);
  printf("\nEntre o nome da 3a. pessoa: ");
  scanf("%s",nome3);
  printf("\nEntre o nome da 4a. pessoa: ");
  scanf("%s",nome4);
  printf("\nEntre o nome da 5a. pessoa: ");
  scanf("%s",nome5);
  printf("\nEntre o nome da 6a. pessoa: ");
  scanf("%s",nome6);
  printf("\nEntre o nome da 7a. pessoa: ");
  scanf("%s",nome7);
  printf("\nEntre o nome da 8a. pessoa: ");
  scanf("%s",nome8);
  printf("\nEntre o nome da 9a. pessoa: ");
  scanf("%s",nome9);
  printf("\nEntre o nome da 10a. pessoa: ");
  scanf("%s",nome10);
}
  Para facilitar a vida do programador, iremos criar uma lista de dados do mesmo tipo, para armazenar o nome de 10 pessoas.

  Uma lista ou um vetor (em inglês "array") é a reserva em memória de um espaço para armazenar N variáveis do mesmo tipo e em posição contígua.
  A sintaxe de declaração de vetores em C é a seguinte:
 <tipo_de_dado> <identificador>[<tamanho_do_vetor>];
  Onde:   Ex:
 int nota[10];
  Cria um vetor de 10 posições, variando de 0 a 9.

  O vetor é acessado informando-se o número da posição em que desejamos ler ou inserir dados. Isto é semelhante ao DIM do Basic.
  Dessa forma, o acesso é feito informando-se o nome do vetor, mais a posição dentro dos colchetes. Ex:
 printf("%d", nota[2]);
  Importante: como o índice do vetor varia de 0 a N-1, o comando acima retorna a 3a. nota da lista.

  Podemos reescrever o programa acima de forma mais simples:
#include <stdio.h>

char *nome[10];

void main(void)
{
  int i;
  for (i=0; i<10; i++)
  {
    printf("\nEntre o nome da %da. pessoa: ",i);
    scanf("%s",nome[i]);
  }
}

  Podemos criar uma matriz, isto é, uma lista com D dimensões, objetivando novas formas de organizar os dados.
  Para indicar uma matriz de D dimensões, colocamos D colchetes lado a lado da variável. Por exemplo, uma matrix de três dimensões:
 int matriz_3d[10][20][2];

  Um exemplo de uma matriz de duas dimensões (tabela) que guarda o dia, o mês e o ano do nascimento de 20 pessoas é:
include <stdio.h>

int data[20][3];
int i;

void main(void)
{
  for (i =0; i<20; i++)
  {
    printf("Pessoa numero %d: ", i);
    printf("Dia: ");
    scanf("%d",&data[i][0]);
    printf("Mes: ");
    scanf("%d",&data[i][1]);
    printf("Ano: ");
    scanf("%d",&data[i][2]);
  }
}

  Ao criarmos a tabela acima, usamos o primeiro colchete para determinar o número total de linhas e o segundo para o número total de colunas.
  A aparência da tabela criada é a seguinte:

  DIA MES ANO
PESSOA 0      
PESSOA 1      
PESSOA 2      
PESSOA 3      
PESSOA 4      
PESSOA 5      
PESSOA 6      
PESSOA 7      
PESSOA 8      
PESSOA 9      
PESSOA 10      
PESSOA 11      
PESSOA 12      
PESSOA 13      
PESSOA 14      
PESSOA 15      
PESSOA 16      
PESSOA 17      
PESSOA 18      
PESSOA 19      

  A área de dados armazenada na memória é a area mais clara da tabela.


  PROBLEMAS:

  1. Só podemos criar listas ou tabelas com o mesmo tipo de variável (int, float, char, etc).
  2. O tamanho da tabela é fixo. Deve ser definido antes de rodar o programa, em sua fase de construção = desperdício ou falta de memória.

  PERGUNTAS:

  1- Quantas dimensões podemos criar a matriz?
  D dimensões. Basta colocar a quantidade de colchetes correspondente ao número de dimensões. Exemplo para 3 dimensões:
int a [5][3][2];
  Matriz de 3 dimensões criada:
    +--+--+--+--+--+
  +--+--+--+--+--+ |
  |  |  |  |  |  | +
  +--+--+--+--+--+ |
  |  |  |  |  |  | +
  +--+--+--+--+--+ |
  |  |  |  |  |  | +
  +--+--+--+--+--+

  2- Eu preciso usar o vetor / matriz todo?
  Não. Você pode projetar um vetor com 1000 posições, mas necessitar usar apenas 20. Daí o desperdício de espaço.


  INICIALIZAÇÃO DE VETORES OU MATRIZES

  O vetor ou matriz pode ser inicializado, através de chaves e os elementos separados por vírgulas. Exemplo:
 char *nome[5] = { "Penguin", "Galious", "Noriko", "Matchday", "Konami" };
 int buffer[10] = { 15, 8, 20, -8, 14, 100, 25, -10, 67, 25 };


  VETORES DO TIPO STRING

  Qual a diferença entre as seguintes declarações:
 char nome[10][20];
 char *nome[10];
 char *nome[];
  Exemplo:
 char *nome[] = { "Penguin", "Galious", "Noriko", "Matchday", "Konami" }; // OK, funciona!
 char *nome[]; // Erro. Não foi iniciada!


/MARMSX/CURSOS/C--