ESTRUTURA DE DADOS HOMOGÊNEA
Geralmente, os algoritmos são elaborados para manipulação de dados. Quando estes dados estão organizados (dispostos) de forma coerente, caracterizam uma forma, uma estrutura de dados. A organização dos dados é chamada de estrutura composta de dados que se divide em duas formas fundamentais: homogêneas (vetores e matrizes) e heterogêneas (registros).
As estruturas de dados homogêneas possibilitam o armazenamento de grupos de valores em uma única variável que será armazenada na memória do computador. Essas estruturas são ditas homogêneas porque os valores que serão armazenados são de um mesmo tipo de dado.
Estas estruturas homogêneas são divididas em unidimensionais e multidimensionais. Normalmente, as estruturas unidimensionais são chamadas de vetores e as multidimensionais são chamadas de matrizes. De fato, um vetor também é uma matriz, porém varia em somente uma dimensão.
No intuito de compreender as facilidades do processamento de valores usando adequadamente uma estrutura de dados observe o algoritmo a seguir, supondo a necessidade de armazenamento da altura de 5 atletas.
algoritmo alturasAtletas; // Síntese // Objetivo: armazenar 5 alturas de atletas de basquete // Entrada : 5 alturas // Saída : - principal // Declarações real altura1,altura2,altura3,altura4,altura5; //Instruções escreva("Informe a altura do 1° atleta: "); leia(altura1); escreva("Informe a altura do 2° atleta: "); leia(altura2); escreva("Informe a altura do 3° atleta:"); leia(altura3); escreva("Informe a altura do 4° atleta: "); leia(altura4); escreva("Informe a altura do 5° atleta: "); leia(altura5); fimPrincipal
Este algoritmo possibilitaria a leitura de 5 alturas de 5 atletas diferentes e as armazenaria em 5 variáveis distintas (altura1, altura2, altura3, altura4, altura5). Uma instrução de repetição não melhoraria muito esta lógica, pois os cinco valores precisarão estar disponíveis independente dos outros valores informados. Mas imagine se a leitura das alturas tivesse que ser realizada para um time de futebol, ou para uma equipe de futebol americano por seu algoritmo, o que seria feito então? E se num próximo campeonato seu algoritmo fosse usado para registrar todos os participantes de todas as equipes que participarão do mesmo?
Em situações como esta é que as estruturas de dados fazem a diferença, sendo essenciais ao processamento dos dados eficiente por um computador.
Uma estrutura de dados composta homogênea, ou vetor, é um arranjo de elementos (dados) armazenados na memória do computador, sendo estes dados organizados de forma eficiente um após o outro, sob um mesmo identificador, cujas regras são as mesmas para criar um identificador de uma variável simples, que possui capacidade de guardar somente um valor. Um vetor é uma estrutura de dados homogênea que pode ser acessada de forma aleatória (qualquer posição que seja necessária). Suas principais características são:
Contém vários valores (número definido);
Todos valores são do mesmo tipo de dado (homogênea);
Possui um único nome (identificador da variável);
Cada valor do conjunto é acessível independentemente, de acordo com o seu índice (ou posição na estrutura de dados);
Todos seus elementos, ou dados armazenados, são igualmente acessíveis a qualquer momento do processamento (acesso aleatório).
Modificando a forma de solução do algoritmo anterior, que possuía 5 variáveis para guardar 5 alturas de atletas, é possível empregar um vetor para armazenar estas 5 alturas.
único identificador desta estrutura de dados = alturas
|
Os valores correspondem aos conteúdos lidos do usuário, ou seja, são as alturas dos atletas.
Os índices são as posições que garantem independência a cada um destes valores armazenados na estrutura de dados homogênea. Por meio destes índices, também chamados de posições do vetor, seus valores (conteúdos) podem ser manipulados de forma independente.
Imagine a necessidade de mostrar a altura do maior atleta cadastrado neste vetor. Entre estas 5 alturas a maior é a quarta no vetor. Como o índice de uma estrutura de dados inicia sempre a partir de zero, a quarta altura está armazenada na 3° posição da estrutura, sendo o conteúdo desta posição (3) igual a 2.20 (altura do quarto atleta cadastrado).
Os vetores são chamados de estruturas compostas unidimensionais:
Composta: porque podem armazenar vários valores;
Unidimensional: porque só possui variação em uma dimensão.
A sintaxe correta para declaração de uma estrutura de dados composta homogênea unidimensional (vetor), na representação de português estruturado, deve respeitar a seguinte forma geral:
<tipo de dado> <identificador> [<tamanho>];
onde:
<tipo de dado> - tipo de dado que será armazenado no vetor
<identificador> - nome definido ao vetor, respeitando as regras de identificação
[<tamanho>] - valor inteiro que define a quantidade de elementos do vetor. O índice varia de 0 a tamanho - 1.
Exemplo:
real alturas[5];
Neste exemplo será criado um vetor chamado alturas que poderá armazenar até 5 números reais diferentes. Uma atenção especial deve ser dedicada na compreensão de que este tipo de estrutra de dados tem seu primeiro elemento armazenado na posição zero e não na um.
Poucas linguagens de programação não seguem este padrão, comumente adotado pela maioria das linguagens de desenvolvimento de programas.
O gráfico a seguir representa a organização de um vetor com tamanho 3, sendo este vetor declarado no Calango como:
inteiro valores[5];
Normalmente, é utilizada uma instrução de repetição para guardar e acessar os dados que são armazenados em um vetor (seu conteúdo).
Exemplo:
Suponha a necessidade de leitura e armazenamento das 5 alturas de atletas em um vetor que tenha capacidade de realizar este armazenamento.
algoritmo alturasAtletas; // Síntese // Objetivo: armazenar 5 alturas de atletas de basquete // Entrada : 5 alturas // Saída : - principal // Declarações inteiro auxiliar; real alturas[5]; //Instruções para (auxiliar de 0 ate 4 passo 1) faca escreval("Informe a altura do ", auxiliar + 1, "° atleta:"); leia(alturas[auxiliar]); fimPara fimPrincipal
Neste exemplo serão criados somente duas variáveis, sendo uma denominada auxiliar e a outra alturas, que consistirá em um vetor de 5 posições (índice de zero até quatro). Este vetor possui um único identificador, mas tem a capacidade de armazenar até 5 valores reais como seu conteúdo, similar a criação das cinco variáveis alturas (altura1, altura2, altura3, altura4, altura5) da proposta de solução do algoritmo anterior.
Suponha que o usuário deste algoritmo digite os seguintes valores: 1.80, 2.03, 1.75, 2.20, 2.12. Uma representação gráfica deste vetor seria:
|
Isso indica que a posição 3 do vetor possui como conteúdo o valor de 2.20, informado pelo usuário no momento de execução do algoritmo anterior. A terceira altura informada é 1.75 e está armazenada no índice 2, que corresponde ao terceiro conteúdo guardado neste vetor.
Imagine a situação onde é necessário armazenar o sexo de várias pessoas, tendo somente que guardar a primeira letra que representa cada sexo, ou seja, (m) para masculino e (f) para feminino.
Para tal situação um vetor do tipo caracter pode ser criado.
A sintaxe a seguir declara um vetor de caracteres com a capacidade de armazenar até 10 caracteres.
caracter sexos[10];
Sabendo como se declara, o exemplo abaixo mostra como seria a leitura dos sexos de 10 pessoas.
Exemplo:
algoritmo guardaSexos;
// Síntese
// Objetivo: Ler e armazenar a primeira letra que representa o sexo de várias pessoas
// Entrada : Sexo de cada pessoa
// Saída : Sexos por extenso
principal
// Declarações
caracter sexos[10];
texto genero;
inteiro cont;
// Instruções
cont = 0;
faca
escreva("Informe o sexo da pessoa sendo [m] masculino e [f] feminino: ");
leiaCaracter(sexos[cont]);
cont=cont+1;
enquanto (cont <10);
para (cont de 0 ate 9 passo 1)faca
se (sexos[cont] == 'f')entao
genero = "feminino";
senao
genero = "masculino";
fimSe
escreval("Sexo ",cont+1,"° pessoa = ",genero);
fimPara
fimPrincipal
No cotidiano se pode comparar os vetores a um estacionamento. Note que em um estacionamento apenas veículos ficam estacionados , ou seja , todos são veículos, mas cada um ocupa uma posição diferente que corresponderia aos índices em um vetor.
Um vetor não deixa de ser uma matriz, porém ela, a matriz, possui sua representação no algoritmo com mais que um índice variando a partir do valor inteiro zero em todas as suas possíveis dimensões. Convencionalmente, na área de Programação, a variação de seu primeiro índice, ou primeira dimensão da matriz, é representada como dimensão de linhas nas quais serão armazenados os respectivos conteúdos da matriz, enquanto que a segunda dimensão, ou segundo índice, corresponderia as colunas em que serão armazenados seus conteúdos. Uma terceira dimensão, também chamada de matriz tridimensional, seria representada como páginas de um livro, enquanto outras dimensões teriam maiores dificuldades de uma representação didática adequada que facilitaria sua compreensão. Apesar desta dificuldade, somente de representação, uma matriz possui o limite das dimensões coerentes com a quantidade de memória disponível no computador que a estará manipulando.
Similar aos vetores, as matrizes possuem o primeiro elemento de cada linha, ou coluna ou qualquer outra dimensão iniciada com índice 0 (zero). Por exemplo, o elemento na primeira linha, e na primeira coluna de uma matriz de alturas terá índice [0,0], enquanto o elemento na segunda linha e primeira coluna terá o índice [1,0].
Repare que as posições indicadas no exemplo anterior ([0,0] ou [1,0]) estão indicando dois valores inteiros que correspondem a exata posição em cada uma das dimensões desta matriz bidimensional (varia em duas dimensões - linha e coluna).
Declarando uma Matriz em Português Estruturado
A declaração de uma matriz é bem parecida com a declaração de um vetor, afinal o vetor não deixa de ser uma matriz, mas poderá ser bidimensional, tridimensional, entre outras possíveis variações de dimensões (multidimensional), possuindo uma definição inteira para cada uma destas dimensões que terão seus tamanhos máximos definidos no momento da declaração no algoritmo.
<tipo de dado> <identificador>[<altura>][<largura>];
onde:
<tipo de dado> - tipo de dado que será armazenado na matriz
<identificador> - nome definido para matriz, respeitando as regras de definição de identificadores
[<altura>][<largura>] - são os valores inteiros que definem a quantidade de linhas e colunas de uma matriz; Onde [<altura>] define a quantidade de linhas e [<largura>] a quantidade de colunas.
A representação gráfica para uma matriz que tenha capacidade de armazenar as alturas dos 5 atletas titulares de uma equipe de basquete e ainda as 5 alturas de seus reservas poderia ser:
Esta representação pode ser definida em português estruturado, no bloco de declarações do algoritmo, respeitando a forma genérica apresentada anteriormente para declaração de uma matriz. Observe que esta matriz tem capacidade de armazenamento de 10 alturas independentes, ao invés de somente 5, como foi abordado no primeiro exemplo deste material no estudo de vetores.
real alturas[2][5];
Assim, a manipulação e armazenamento das alturas na memória está melhor organizada, propiciando maior eficiência do computador no acesso aos seus endereços de memória que guardam estas 10 alturas (todos estes valores estão guardados de maneira consecutiva na memória por estarem definidos para o armazenamento em uma estrutura de dados - matriz ou vetor).
Acompanhe o exemplo desenvolvido abaixo que permite a manipulação desta matriz bidimensional denominada alturas.
algoritmo variasAlturas;
// Síntese
// Objetivo: trabalhar com as alturas de uma equipe de basquete
// Entrada : 10 alturas
// Saída : listagem das alturas cadastradas e sua média
principal
// Declarações
inteiro linha, coluna, contador;
real alturas[2][5];
real soma;
// Instruções
contador = 1;
soma = 0;
escreval("Cadastro das Alturas dos Atletas Titulares");
// registrando todas as alturas (titulares e reservas)
para (linha de 0 ate 1 passo 1) faca // variação da linha
para (coluna de 0 ate 4 passo 1) faca // variação da coluna
escreva("Digite a altura do ", contador, "° atleta:");
leia(alturas[linha][coluna]);
contador = (contador + 1);
soma = (soma + alturas[linha][coluna]);
fimPara
se (linha == 0) entao
escreval(""); // somente salta uma linha
escreval("Cadastro das Alturas dos Atletas Reservas");
fimSe
fimPara
limpaTela(); // somente limpa tela de execução
// percorre a matriz novamente para apresentar as alturas cadastradas
para (linha de 0 ate 1 passo 1) faca // variação da linha
para (coluna de 0 ate 4 passo 1) faca
// variação da coluna
escreval("Altura [",linha,",",coluna,"]= ",alturas[linha][coluna]);
fimPara
fimPara
escreval(""); // somente salta uma linha
escreval(""); // salta mais uma linha
escreval("Média da Altura destes Atletas = " , (soma/(contador - 1)));
fimPrincipal
Neste exemplo na primeira linha (zero) serão guardadas as alturas dos atletas titulares, enquanto que na segunda linha (um) serão as dos reservas. Apesar de existir um único identificador é possível armazenar dez valores, como também poderia ser feito por um vetor de 10 posições ([10]), porém a organização no armazenamento das alturas dos titulares e reservas não poderia ser feita de maneira lógica adequada e eficiente para manipulação dos endereços de memória do computador que estiver executando este algoritmo.
Note que tanto a quantidade de linhas quanto a de colunas estão iniciando de zero e chegando até o valor final definido na declaração da matriz, onde a multiplicação da quantidade de elementos em cada dimensão pode ser somada para identificar a capacidade máxima de armazenamento da matriz.
linhas [2] - dimensão com 2 linhas
colunas [5] - dimensão com 5 colunas
A quantidade de 2 linhas sendo multiplicada por 5 colunas resultará em 10 posições independentes de memória para esta estrutura de dados composta homogênea (matriz de alturas) com duas dimensões (bidimensional).
No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como seu entendimento sobre este conteúdo está, estão sendo sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento nesta disciplina.