segunda-feira, 25 de agosto de 2008

Definindo uma Estrutura de Registro

Para exemplificar, imagine uma passagem de ônibus, que é formada por um conjunto de informações logicamente relacionadas, porém de tipos diferentes, tais como: número da passagem (inteiro), origem e destino (caracter), data (caracter), horário (caracter), poltrona (inteiro), distância (real), fumante (lógico), que são subdivisões (elementos de conjunto) do registro, também chamadas de campos. Logo, um registro é composto por campos que são partes que especificam cada uma das informações.

Exemplo: Conhecer um passageiro e imprimir.

Tipo
registro: RegPassagem
inteiro: número, poltrona;
caracter: origem, destino, data, horário;
lógico: fumante;
real: distância
fimregistro;
variáveis
regpassagem: passagem;
início
leia(passagem.número, passagem.poltrona);
leia(passagem.origem, passagem.destino);
leia(passagem.data, passagem.horário);
leia(passagem.distância, passagem.fumante);
escreva(passagem.número, passagem.poltrona);
escreva(passagem.origem, passagem.destino);
escreva(passagem.data, passagem.horário);
escreva(passagem.distância, passagem.fumante);
fim.

Registros

Já sabemos que um conjunto homogêneo de dados é composto por variáveis do mesmo tipo primitivo; porém, se tivéssemos um conjunto em que os elementos não são do mesmo tipo, teríamos então um conjunto heterogêneo de dados.

Um registro é uma estrutura de dados que agrupa dados de tipos distintos ou, mais
raramente, do mesmo tipo. Um registro de dados é composto por um certo número
de campos de dado, que são itens de dados individuais. Por exemplo, suponha que
desejemos criar um algoritmo para manter um cadastro dos empregados de uma dada
companhia. Neste cadastro, temos os seguintes dados para cada empregado:

• Nome do empregado.
• CPF do empregado.
• Salário do empregado.
• Se o empregado possui ou não dependentes.

Então, cada ficha deste cadastro pode ser representada por um registro que contém os
campos nome, CPF, salário e indicação de existência de dependentes. Neste caso, a
natureza dos campos é bem diversificada, pois nome pode ser representado por uma
cadeia, CPF e salário por valores numéricos e existência de dependentes por um valor
lógico.

Operações Básicas com Matrizes

Do mesmo modo que acontece com os vetores, não é possível operar diretamente com o conjunto completo, mas com cada um de seus componentes isoladamente.
O acesso individual a cada componente de uma matriz é realizado pela especificação de sua posição na mesma por meio do seu índice. No exemplo abaixo

Ex.: VAR
M : MATRIZ [1 .. 5 , 1 .. 10] DE INTEIRO

foi definida uma variável M capaz de armazenar 10 número inteiros em cada uma das 5 linhas. Para acessar um elemento desta matriz deve-se fornecer o nome da mesma e o índice da linha e da coluna do componente desejado da matriz (um número de 1 a 5 para a linha e um número de 1 a 10 para a coluna, neste caso).
Por exemplo, M[1,1] indica o primeiro elemento da primeira linha da matriz, M[1,2] indica o segundo elemento da primeira linha da matriz, M[1,10] indica o último elemento da primeira linha da matriz e M[5,10] indica o último elemento da última linha da matriz
Da mesma forma como vetores, não é possível operar diretamente sobre matrizes como um todo, mas apenas sobre seus componentes, um por vez. Por exemplo, para somar duas matrizes é necessário somar cada um de seus componentes dois a dois. Da mesma forma as operações de atribuição, leitura e escrita de matrizes devem ser feitas elemento a elemento.


Referência www.apostilando.com

Matrizes- Parte II

Os vetores têm como principal característica a necessidade de apenas um índice para endereçamento - estruturas unidimensionais. Uma estrutura que precisasse de mais de um índice, como no caso específico, dividido em apartamentos, seria então denominada estrutura composta multidimensional (agregado), neste caso, de duas dimensões (bidimensional).

Tipo
IDENTIFICADOR = matriz [LI1 .. LF1, LI2 .. LF2, .., LIN .. LFN] de ;
variáveis
variável : IDENTIFICADOR;

Onde:
*LIN, LFN - são os limites dos intervalos de variação dos índices da variável, onde cada par de limites está associado a um índice. O número de dimensões é igual ao número de intervalos;
* - qualquer um dos tipos primitivos, ou ainda um outro tipo que pode ser construído.

Primeiramente criaremos um novo tipo e lhe daremos um nome, após isso podemos usá-lo para declarar as variáveis que serão utilizados dentro do programa.

Exemplo:
Construa um algoritmo que efetue a leitura, a soma e a impressão do resultado, entre duas matrizes inteiras que comportem 25 elementos;

tipo
m = matriz [1 .. 5, 1 .. 5] de inteiros;
variáveis
m: ma, mb, mc ;
inteiro: i,j;
início
i ← 1;
enquanto i <= 5 faça
início
j ← 1;
enquanto j <= 5 faça
início
conheça (ma[i,j] , mb[i,j]); mc[i,j] <— ma[i,j] + mb[i,j]; j <— j + 1;
fim;
i <— i + 1;
fim;
j <— 1;
enquanto j <= 5 faça
início
i <— 1;
enquanto i <= 5 faça
início
informe (mc[i,j]);
i <— i + 1;
fim;
j <— j + 1;
fim;
fim.



Referência: www.apostilando.com

segunda-feira, 18 de agosto de 2008

Matrizes

Os vetores que estudamos até então são todos unidimensionais. Mas, podemos declarar
e manipular vetores com mais de uma dimensão, os quais denominamos matrizes. Por
exemplo, podemos definir uma estrutura de dados matriz 4 por 5 (uma tabela com 4
linhas e 5 colunas).

Este tipo de estrutura também tem sua principal utilização vinculada à criação de tabelas. Caracteriza-se por ser definida uma única variável vinculada dimensionada com um determinado tamanho. A dimensão de uma matriz é constituída por constantes inteiras e positivas. Os nomes dados às matrizes seguem as mesmas regras de nomes utilizados para indicar as variáveis simples.

A sintaxe do comando de definição de matrizes de duas dimensões é a seguinte:

Var : MATRIZ [ .. , .. ] DE ...

Ex.: VAR M : MATRIZ [1 .. 5 , 1 .. 10] DE INTEIRO

Também é possível definir matrizes com várias dimensões, por exemplo:

Ex.: VAR
N : MATRIZ [1 .. 4] DE INTEIRO
O : MATRIZ [1 .. 50 , 1 .. 4] DE INTEIRO
P : MATRIZ [1 .. 5, 1 .. 50 , 1 .. 4] DE INTEIRO
Q : MATRIZ [1 .. 3 , 1 .. 5, 1 .. 50 , 1 .. 4] DE INTEIRO
R : MATRIZ [1 .. 2 , 1 .. 3 , 1 .. 5, 1 .. 50 , 1 .. 4] DE INTEIRO
S : MATRIZ [1 .. 2 , 1 .. 2 , 1 .. 3 , 1 .. 5, 1 .. 50 , 1 .. 4] DE INTEIRO

A utilidade de matrizes desta forma é muito grande. No exemplo acima, cada matriz pode ser utilizada para armazenar uma quantidade maior de informações:
a matriz N pode ser utilizada para armazenar 4 notas de um aluno
a matriz O pode ser utilizada para armazenar 4 notas de 50 alunos.
a matriz P pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas.
a matriz Q pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas, de 3 turmas.
a matriz R pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas, de 3 turmas, de 2 colégios.
a matriz S pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas, de 3 turmas, de 2 colégios, de 2 cidades

Nas próximas postagens continuaremos a abordar o assunto Matrizes.

Referências: www.apostilando.com

Exercícios de vetores

Caro leitor

Nesta postagem, propomos que os leitores tentem resolver algumas questões sobre vetores para verificar assimilação do conteúdo.
Assim sendo, segue questões abaixo. Nas próximas postagens informaremos as respectivas respostas.

Exercício 01

Qual será o valor de Y a ser impresso no algoritmo abaixo?

início
real:Y;
tipo v: vetor[1..5] real;
v: V;
inteiro: I;
V[1] ← 2;
V[2] ← 4;
V[3] ← 1;
V[4] ←3;
V[5] ←5;
Y ← V[1] + V[5];
imprima (Y);
Y ← V[2] - V[5];
imprima (Y);
Y ← V[4] * V[1] - Y;
imprima (Y);
I ← 3;
Y ← V[I];
imprima (Y);
X ← V[I] / [V[1]];
imprima (Y);
fim.

Exercício 02

Uma professora tem uma classe composta de 80 alunos e deseja calcular e imprimir a nota de cada aluno seguida da média da turma. qual a sua sugestão para resolução deste algoritmo?

Exercício 03

Leia um vetor de 12 posições e em seguida ler também dois valores X e Y quaisquer correspondentes a duas posições no vetor.


*Referência Bibliográficas e sugestões de consulta
Lages, Guimarães. Algoritmos e estruturas de dados.
Farrer, H. e outros. Algoritmos estruturados.

sexta-feira, 15 de agosto de 2008

Nota:

Caro leitor, verificamos a presença de um pequeno erro em nossa postagem "Revisão- Vetores", quando afirmamos que "(...) E a contagem dos índices se inicia com o zero". Na verdade, o início da contagem do índice pode começar ou não do zero, a depender do programa.
Portanto, se o leitor encontrar em vetores, índices que não iniciem com o zero, lembre-se do explicado acima.
Agradecemos a compreensão.
Até a próxima postagem!!

segunda-feira, 11 de agosto de 2008

Aplicação de Vetores

O espectro de aplicação de vetores em algoritmos é muito extenso, mas normalmente os vetores são usados em duas tarefas muito importantes no processamento de dados: pesquisa e classificação.
A pesquisa consiste na verificação da existência de um valor dentro de um vetor. Trocando em miúdos, pesquisar um vetor consiste em procurar dentre seus componentes um determinado valor.
A classificação de um vetor consiste em arranjar seus componentes numa determinada ordem, segundo um critério específico. Por exemplo, este critério pode ser a ordem alfabética de um vetor de dados caracter, ou então a ordem crescente ou decrescente para um vetor de dados numéricos. Há vários métodos de classificação, mas o mais conhecido é o método da bolha de classificação (Bubble Sort).

O Método da Bolha de Classificação

Este método não é o mais eficiente, mas é um dos mais populares devido à sua simplicidade.
A filosofia básica deste método consiste em “varrer” o vetor, comparando os elementos vizinhos entre si. Caso estejam fora de ordem, os mesmos trocam de posição entre si. Procede-se assim até o final do vetor. Na primeira “varredura” verifica-se que o último elemento do vetor já está no seu devido lugar (no caso de ordenação crescente, ele é o maior de todos). A segunda “varredura” é análoga à primeira e vai até o penúltimo elemento. Este processo é repetido até que seja feito um número de varreduras igual ao número de elementos a serem ordenados menos um. Ao final do processo o vetor está classificado segundo o critério escolhido.
O exemplo a seguir ilustra o algoritmo bubble sort para ordenar 50 número inteiros em ordem crescente, fazendo a comparação iniciando do primeiro elemento até o penúltimo, comparando com o imediatamente seguinte, até o último elemento:

Algoritmo Variação_do_Bubble_Sort

Inicio
numeros : matriz [1..50] de inteiros
inteiro: aux, i, j;
Para i de 1 até 50 faça
Início
Ler numeros[i];
Para i de 1 até 49 faça
Início

Para j de i + 1 até 50 faça
Início

Se numeros[i] > numeros[j] então
Início
aux := numeros[i];
numeros[i] := numeros[j];
numeros[j] := aux;
Fim;
Fim;
Fim;

Escreva (“vetor ordenado”);
Para i de 1 até 50 faça
Início
Escrever numeros[i];
Fim;
Fim.


Podemos observar também que para ordenar o vetor em ordem decrescente basta inverter o sinal de comparação no teste da condição lógica Se numeros[i] > numeros[j], para: Se numeros[i] < numeros[j].

*Fonte de pesquisa: www.apostilando.com

sexta-feira, 8 de agosto de 2008

Revisão- Vetores

Levando em consideração que alguns leitores nos informaram que a postagem anterior, sobre vetores, estava "complexa" e de difícil assimilação, estaremos fazendo uma revisão sobre o conteúdo. Esperamos atender a necessidade dos leitores.

As principais estruturas a serem manipuladas nos algoritmos são classificadas em homogêneas (de um mesmo tipo de dado) e heterogêneas (tipos diferentes). Uma estrutura de dados composta homogênea consiste em uma única variável que pode armazenar vários valores (por isso composta) do mesmo tipo (por isso homogênea). Suas principais características são:

*Contém vários valores (número definido);
*Todos valores são do mesmo tipo de dado;
*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).

Os vetores são exemplos de estruturas de dados homogêneas.
Exemplo de vetores: Suponha a existência de uma estrutura que armazena a idade de 12 pessoas.
nome do identificador = IDADES


Os valores correspondem aos conteúdos informados pelo usuário, ou seja, são as idades desejadas.
Os índices são as posições que identificam os valores armazenados. E a contagem dos índices se inicia com o zero. Assim, as idades 47 e 31 têm índices 0 e 8, respectivamente.
Suponha que desejamos apresentar somente a idade do sexto indivíduo. Como o índice da estrutura de dados sempre começa com zero, o sexto indivíduo possui a sua idade armazenada na 5ª posição da estrutura, sendo o conteúdo desta posição (5) igual a 7 (idade do indivíduo).
Os vetores também são chamados de variáveis compostas unidimensionais:
*Composta: porque podem armazenar vários valores;
*Unidimensional: porque vetor só possui variação em uma dimensão;
*Homogênea: porque só armazena um único tipo de dado.
A sintaxe necessária para a criação de uma estrutura de dados composta unidimensional (vetor) em um algoritmo descritivo (português estruturado) é apresentada na forma geral a seguir:

Declaração de uma variável convencional: [tipo básico][identificador];

Declaração da estrutura de dados composta unidimensional: [tipo básico][identificador][tamanho];

Onde:
*tipo básico é o tipo de dado que será armazenado na estrutura;
*identificador é o nome atribuído a estrutura (vetor);
*tamanho é a quantidade de elementos que o vetor poderá armazenar.
Exemplo:
real NOTAS[20];

No exemplo anterior criamos um vetor chamado NOTAS que pode armazenar até 20 números reais diferentes.


O acesso a um elemento do vetor pode acontecer por meio da especificação do nome do vetor seguido do índice desejado entre colchetes.

Exemplo1:
O valor de IDADES[10] é 45, o de IDADES[2] é 29, e assim por diante.
Observe a seguir o exemplo descritivo de manipulação do vetor.
{ manipulação de vetor }
Início
inteiro AUX, IDADES[12];
AUX 4;
IDADES[1] IDADES[AUX];
IDADES[AUX] IDADES[ 2 * AUX ] / 2;
Fim

Solução:
IDADES[1] IDADES[4]; { IDADES[1] 15 }
IDADES[4] IDADES[8] / 2; { IDADES[4] 12/2 }

Realizando as operações anteriores o vetor IDADES ficaria assim:


Exemplo 2:
Deixaremos que o leitor resolva a questão seguinte.
Escrever um programa que declare um vetor de reais e leia as notas de 30 alunos.


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.