quinta-feira, 31 de julho de 2008

Estrutura de Dados Vetor


É uma estrutura de dados linear utilizada para armazenar uma lista de valores do mesmo tipo. Um dado vetor é definido como tendo algum número fixo de células idênticas. Cada célula armazena um, e somente um, dos valores
de dados do vetor. Cada uma das células de um vetor possui seu próprio endereço, ou índice, através do qual podemos referenciá-la. Por exemplo, a primeira célula de um vetor possui índice 1, a quarta possui índice 4, e assim por diante.
Ao definirmos um vetor, estamos na verdade especificando a estrutura de dados de um novo tipo de dados, o tipo de dados vetor, pois este tipo, ao contrário dos tipos primitivos, não está “pronto para uso” e, portanto, deve ser definido explicitamente dentro do algoritmo. Temos também que a definição de uma estrutura de dados é parte da especificação de um tipo de dados complexo, que, como sabemos, também consiste na especificação das operações sobre o conjunto de valores do tipo. Entretanto, no momento, veremos a definição de tipos complexos como composta apenas da especificação da estrutura de dados.
Nós podemos definir um vetor através da especificação de um identificador para um tipo vetor, suas dimensões e o tipo de dados dos valores que ele pode armazenar.
Isto é feito da seguinte forma:
definatipo vetor[li..ls] de
onde
• definatipo e vetor são palavras-chave;
• tipo dos elementos é o nome do tipo dos elementos do vetor;
• nome do tipo é um identificador para o tipo sendo definido;
• li e ls são respectivamente os limites inferior e superior do vetor.
Por exemplo, para criarmos um vetor de 5 elementos inteiros chamado vetor notas,
fazemos:
definatipo vetor[1..5] de inteiro vetor notas
O número de elementos (células) de um vetor é dado por ls − li + 1 e o índice do
primeiro elemento (célula) ´e li, do segundo ´e li + 1, e assim por diante. Isto significa
que dois vetores a e b com valores li e ls sejam 1 e 5 e 7 e 11, respectivamente, possuem o mesmo número de elementos: 5 = 5 − 1 + 1 = 11 − 7 + 1; entretanto, o primeiro elemento de a possui índice 1, enquanto o primeiro elemento de b possui índice 7.


Declarando e Manipulando Variáveis do Tipo Vetor

Para declararmos uma variável de um tipo vetor, procedemos exatamente da mesma
forma que para um tipo simples. Por exemplo, considere a criação de uma variável
denominada notas do tipo vetor notas:

Esta declaração significa que estamos criando uma variável notas que é do tipo
vetor notas, ou seja, um vetor de inteiros com 5 posições de índices 1 a 5. Uma vez declarada a variável notas, podemos atribuir qualquer conjunto de 5 valores numéricos à variável. Entretanto, isto não é feito da forma mais natural, tal como:

notas ← (−1, 0, 1, 33,−10)

mas sim individualmente; ou seja, um valor por vez a cada célula do vetor. Para tal, usamos o nome da variável, o índice da célula e uma sintaxe própria. Por exemplo,
notas[0] ← −1, atribui o valor −1 à célula de índice 1 do vetor.
De forma geral, as células, e não a variável do tipo vetor como um todo, ´e que
são utilizadas em qualquer operação envolvendo a variável, sejam elas leitura, escrita, atribuição, expressão, e assim por diante. No caso particular do vetor notas, a célula de índice i de notas, notas[i], pode ser usada em qualquer parte de um algoritmo em que uma variável inteira possa ser usada. Isto significa que podemos ter comandos tais como:
leia notas[1], escreva notas[1] e notas[2] ← notas[1] + 1.

segunda-feira, 28 de julho de 2008

Introdução às estruturas de dados

Antes de começarmos nosso “diálogo” sobre estruturas dados, faremos uma breve definição de algoritmo:
Algoritmo é um conjunto finito de regras, bem definidas, para a solução de um problema em um tempo finito e com um número finito de passos. A execução de um algoritmo por um computador é chamado processamento de dados. *
Para desenvolvermos um algoritmo necessitamos de alguns componentes, dentre estes as estruturas de dados.
Dados são representações de informações usadas por um algoritmo. Isto inclui dados de entrada e saída, bem como dados gerados pelo algoritmo para seu próprio uso.
Quando um algoritmo é executado por um computador, os valores dos dados por ele manipulados devem ser armazenados em algum “depósito”, de modo que tais valores estejam disponíveis para serem usados pelo algoritmo a qualquer momento. A definição da organização interna de tais “depósitos”, assim como a relação entre suas partes é conhecida como estrutura de dados.
Na maior parte das vezes, desejamos que um “depósito” de dados seja variável, isto é, que o seu conteúdo possa ser alterado durante a execução do algoritmo. Outras vezes, queremos que o conteúdo de um “depósito” de dados seja constante, ou seja, que ele não seja alterado durante a execução do algoritmo.
Para exemplificar, considere o problema seguinte:
Encontrar o valor da soma de dois números inteiros (designados pelo usuário do programa), e a partir desse resultado, informar ao usuário o dobro desta soma.

inicio
inteiros: A,B,C;
imprima (‘Digite dois números inteiros.’);
leia (A,B);
C ← A+B;
C ← C*2;
imprima (‘O valor da soma dos dois dígitos multiplicado por 2 é =’ C)
fim.

No exemplo acima, A e B são “depósitos” de dados constantes (determinados pelo usuário do programa), e C é um “depósito” de dados variáveis, visto que seu conteúdo mudou durante a execução do algoritmo.
As principais estruturas a serem manipuladas nos algoritmos são classificadas em homogêneas e heterogêneas, os dois tipos permitem agrupar diversas informações dentro de uma mesma variável. No entanto, a homogênea ocorrerá obedecendo sempre ao mesmo tipo de dado e na heterogênea ocorrerão diferentes tipos de dados.


A elaboração de um algoritmo que armazene as notas de cinco alunos diferentes, e as imprima caso estas sejam maiores que 7.0, poderia ser feita como é sugerido no português estruturado a seguir.

inicio
real : ALUNO1,ALUNO2,ALUNO3,ALUNO4,ALUNO5, MEDIA;
MEDIA ← 7,0
imprima ("Informe a nota do 1º aluno: ");
leia (ALUNO1);
se aluno1> media então;
imprima (aluno1);
fimse;
imprima ("Informe a nota do 2º aluno: ");
leia (ALUNO2);
se aluno2> media então;
imprima (aluno2);
fimse;
imprima ("Informe a nota do 3º aluno: ");
leia (ALUNO3);
se aluno3> media então;
imprima (aluno3);
fimse;
imprima ("Informe a nota do 4º aluno: ");
leia (ALUNO4);
se aluno4> media então;
imprima (aluno4);
fimse;
imprima ("Informe a nota do 5º aluno: ");
leia (ALUNO5);
se aluno5> media então;
imprima (aluno5);
fimse;
fim


Por meio deste algoritmo seria possível ler cinco notas de cinco alunos diferentes e armazená-las em cinco diferentes variáveis. 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. Como podemos constatar, não fomos capazes de utilizar uma estrutura de repetição para armazenar as notas eram superiores à média, mesmo embora houvesse 5 estruturas condicionais idênticas, a menos da variável com o valor da nota, para realizar o cálculo desejado. No caso do problema acima, esta redundância não chega a ser um “fardo”, mas imagine se a leitura de todas as notas dos alunos do seu curso tivessem quer ser lidas pelo seu algoritmo, o que faríamos? E no próximo semestre quantos alunos seriam?
Felizmente, para problemas como este, temos uma forma eficaz de solução, que utiliza uma estrutura de dados denominada vetor, que será abordado na nossa próxima postagem.






*Para saber mais sobre algoritmo o leitor poderá acessar http://algoritmosuefs.blogspot.com/

sábado, 19 de julho de 2008



Seja bem vindo caro leitor, apresentaremos aqui algo que estaria o mais próximo possivel de um curso. Neste primeiro post vamos mostrar uma idéia um pouco sintética do termo Estrutura de dados para a partir deste ir até as estruturas compostas.
Em diversos contextos, disciplinas associadas à programação recebem a denominação de ''processamento de dados''. Esta denominação não é gratuita de fato, embora seja possível criar procedimentos que não manipulem nenhum dado, tais procedimentos seriam de pouca utilidade.
Uma vez que procedimentos são, efetivamente, processadores de dados, a eficiência de um procedimento está muito associada à forma como seus dados são organizados. Estrutura de dados é o ramo da computação que estuda os diversos mecanismos de organização de dados para atender aos diferentes requisitos de processamento.