Física Computacional
2011-2
I N T R O D U Ç Ã O À L Ó G I C A D E P R O G R A M A Ç Ã O
P R O F . L U Í S F E R N A N D O D E O L I V E I R A
UNIVERSIDADE DO ESTADO DO RIO DE JANEIRO INSTITUTO DE FÍSICA ARMANDO DIAS TAVARES
Estrutura de Dados
Outra estrutura de dados importante é a estrutura
heterogênea ou registro de dados.
Um registro de dados funciona como um cadastro. Ele reúne (agrupa) diferentes tipos de variáveis
numa única estrutura.
Por isso é chamada de heterogênea.
Imagine o cadastro de um funcionário:
Nome, nascimento, identidade, endereço, admissão e função.
Cada informação no cadastro possui uma natureza
distinta.
Estrutura de Dados
Nome, endereço e função são literais.
Nascimento e identidade envolvem números.
Diferente de outras unidades de informação básicas,
o registro precisa ser definido.
Precisa de um identificador.
Neste caso, poderia ser funcionário:
defina funcionário registro (nome[30] literal, identidade
numérico, endereço[40] literal)
Estrutura de Dados
Depois, podemos declarar variáveis como registro:
declare cadastro registro funcionário
O registro é composto por campos.
No exemplo, nome[30] é um campo, endereço[40] é
outro campo.
Os campos são “as variáveis” dentro do registro.
Logo, para atribuir um dado à variável de registro, é
necessário indicar qual o campo está sendo acessado:
cadastro.nome “Antônio da Silva”
Estrutura de Dados
A definição de um registro funciona como a definição
de tipo de dado.
Logo, é possível criar-se vetores e matrizes de
registros:
defina funcionário registro (
nome[30] literal endereço[40] literal função[30] literal sexo literal
)
declare cadastro[100] registro funcionário
Estrutura de Dados
O acesso a um elemento do vetor (matriz) é o que já
se conhece:
cadastro[1].nome “José da Silva” cadastro[10].função “motorista” cadastro[6].sexo „M‟
cadastro[80].endereço “Rua 2, Casa 4, Juquinha, AL” ler cadastro[4].nome
escrever cadastro[10].função
Estrutura de Dados
Exemplo:
algoritmo
defina funcionário registro ( nome[100] literal,
endereço[100] literal, função[30] literal
)
declare cadastro[100] registro funcionário declare i, N numéricos
escreva “Entre com o número de funcionários:”
leia N
{continua}
Estrutura de Dados
para i de 1 até N, fazer
escreva “Entre com o nome do funcionário[”, i, “]:”
leia cadastro[i].nome
escreva “Entre com o endereço:”
leia cadastro[i].endereço escreva “Entre com função:”
leia cadastro[i].função fim para
para i de N até 1 passo -1, fazer
escreva cadastro[i].nome, cadastro[i].endereço, cadastro[i].função fim para
fim algoritmo
Estrutura de Dados
Exemplo, calcular a força resultante de um sistema
de forças.
O vetor força é representado por suas componentes x e y.
A soma vetorial das componentes gera a magnitude da força.
A soma de vários vetores força corresponde à soma das componentes de cada força em cada eixo X e Y.
O elemento força pode ser descrito como uma estrutura de dado heterogênea chamada força (registro) que contém dois campos: fx e fy.
Como um sistema de forças possui pelo menos dois vetores
força, parece natural usarmos uma lista indexada de registros
força.
Estrutura de Dados
A soma vetorial então é a soma de cada campo fx e fy de cada registro força[i] presente na lista indexada:
resultante.fx = força[i].fx, para i de 1 até N
resultante.fy = força[i].fy, para i de 1 até N
onde N é o número de vetores força do sistema e resultante é um registro idêntico ao registro força.
Então, primeiro, devemos definir um registro chamado vetor:
defina vetor registro (fx numérico, fy numérico)
Depois, declaramos a lista de registros do tipo vetor com um número máximo de elementos e a resultante:
declare força[100], resultante registro vetor
Estrutura de Dados
Podemos solicitar ao usuário o número de vetores que compõem o sistema:
ler N
E realizar o somatório de vetores.
para i de 1 até N, fazer
resultante.fx = resultante.fx + força[i].fx resultante.fy = resultante.fy + força[i].fy
fim para
A saída apresenta cada uma das componentes da força resultante:
escrever resultante.fx, resultante.fy Vamos ao algoritmo mais pomposo:
Estrutura de Dados
algoritmo
definir vetor registro ( fx numérico
fy numérico )
declarar força[100] registro vetor {lista de forças} declarar resultante registro vetor {força resultante} declarar i numérico {contador}
declarar N numérico {total de forças do usuário} {usuário define total de vetores de força}
escrever “Entre total de vetores”
ler N
{continua}
Estrutura de Dados
para i de 1 até N, fazer {entrada de dados}
escrever “Entre com componentes x e y do vetor ”,i
ler força[i].fx, força[i].fy fim para
resultante.fx 0 {zerando a componente fx} resultante.fy 0 {zerando a componente fy} para i de 1 até N, fazer {somatório das forças}
resultante.fx = resultante.fx + força[i].fx resultante.fy = resultante.fy + força[i].fy fim para
escrever “As componentes da força resultante são: x = ”,
resultante.fx, “e y = ”, resultante.fy fim algoritmo
Arquivos
Além da entrada padrão (teclado) e saída padrão
(tela), um outro elemento de entrada e saída disponível nos algoritmos é o ARQUIVO.
Um arquivo pode ser visto como uma coleção de
registros disponível de forma sequencial, isto é, os registros estão armazenados um após o outro.
Por uma questão de organização, um arquivo pode
ser FORMATADO, isto é, os registros estão armazenados de forma padronizada.
Arquivos
Então, um arquivo formatado significa dados
organizados de forma padronizada:
campo 1 do registro 1
campo 2 do registro 1
...
campo n do registro 1
campo 1 do registro 2
campo 2 do registro 2
...
campo n do registro 2
...
Arquivos
O final do arquivo é marcado com um código
chamado “fim de arquivo” ou „fda‟, que pode ser um caractere especial da tabela ASCII.
Um arquivo precisa ser referenciado dentro do
algoritmo através de um identificador e a
organização dos dados precisa ser informado também.
declare [nome do arquivo] arquivo de [registro]
Exemplo:
declare entrada.dados arquivo de vetor
Arquivos
Esta declaração apenas apresenta o arquivo de dados
e referencia a sua organização.
Ela não é suficiente para qualquer tipo de operação
como, por exemplo, leitura e escrita.
Para ler ou escrever em um arquivo, precisamos
abri-lo primeiro, como um livro.
E se o arquivo foi aberto, ele precisa ser fechado
também.
Arquivos
Então, para abrir um arquivo, depois de tê-lo
referenciado (declarado), usamos o comando abrir:
abrir [nome do arquivo]
Ao abrirmos um arquivo, desejamos, normalmente,
ler ou escrever nele.
Então, é necessário também informar a ação:
abrir [nome do arquivo] para [ação]
Exemplos:
abrir entrada.dados para leitura
abrir saída.dados para escrita
Arquivos
Desta forma, sabemos que o arquivo entrada.dados
será usado para leitura e saída.dados para escrita.
Para fechar um arquivo, basta usarmos o comando
fechar seguido do nome do arquivo que será fechado:
fechar [nome do arquivo]
Exemplos:
fechar entrada.dados
fechar saída.dados
Como mencionado antes, os dados em um arquivo
estão organizados de forma sequencial.
Arquivos
Então, ao ler um arquivo recém aberto, estamos
lendo o primeiro registro dele.
O comando de leitura de um arquivo aberto é
idêntico ao comando de leitura ler, mas deve ser seguido do nome do arquivo:
ler [nome do arquivo]
E como o arquivo é uma sequência de registros,
precisamos informa o nome do registro também:
ler [nome do arquivo].[registro]
Observe que entre o nome do arquivo e o registro
existe um ponto.
Arquivos
Para escrita, o comando segue o mesmo modelo da
escrita:
escrever [nome do arquivo]
Novamente, os dados que serão escritos devem estar
na forma de registro:
escrever [nome do arquivo].[registro]
Observe o ponto entre o nome do arquivo e o
registro.
Vejamos um exemplo:
Arquivos
algoritmo
defina vetor registro (fx, fy numérico)
declare entrada.dados arquivo de vetor
declare saída.dados arquivo de vetor
declare força registro vetor
abrir entrada.dados para leitura
abrir saída.dados para escrita
ler entrada.dados.força
escrever saída.dados.força
fechar entrada.dados
fechar saída.dados
fim algoritmo
Arquivos
Outro exemplo:
Um professor deseja calcular a média dos testes, provas e
atividades de laboratório para produzir o resultado final, isto é, se o aluno será aprovado ou reprovado.
O algoritmo para isso já foi desenvolvido nas aulas anteriores.
Deseja-se, agora, inserir a facilidade de entrar com os dados na forma de arquivo.
A primeira coisa é padronizar um formato para os dados no arquivo. Uma sugestão inicial é:
nome do aluno, notas das 3 provas, notas dos 3 testes, notas das 7
atividades e nota da prova final.
Arquivos
Exemplo:
João da Silva 7,0 3,0 6,5 8,0 7,0 2,0 10,0 10,0 10,0 9,0 8,0 8,0 0,0 5,0 Pedro 5,0 5,5 8,0 10,0 9,0 3,0 9,0 9,0 9,0 9,0 9,0 9,0 9,0 8,0
José 8,0 9,5 5,0 5,0 8,0 7,0 10,0 9,5 7,0 8,0 8,0 9,0 10,0 7,5 Rosa 5,5 7,5 2,0 10,0 9,5 7,5 10,0 10,0 9,0 9,0 9,0 9,0 9,0 8,0
Silvana 5,0 9,5 9,0 5,0 10,0 10,0 10,0 9,5 10,0 10,0 10,0 10,0 7,0 8,5
A partir desta organização do arquivo de dados, podemos elaborar a forma do registro que conterá estes dados:
defina dados registro (nome[30] literal, prova[3] numérico,
teste[3] numérico, atividade[7] numérico, final numérico )
Arquivos
declare aluno[100] registro dados
O nome do arquivo de entrada poderia ser “notas_turma1.txt”. Logo, é possível declarar-se no algoritmo o arquivo, sua
abertura e seu fechamento:
declare notas_turma1.txt arquivo de dados
abrir notas_turma1.txt para leitura fechar notas_turma1.txt
Vejamos o algoritmo completo:
Arquivos
algoritmo
{declaração da variáveis e constantes}
declare mpro numérico {média das provas}
declare mtes numérico {média dos testes}
declare matv numérico {média das atividades}
declare mpar numérico {média parcial}
declare mf numérico {média final}
declare i, j numérico {contadores}
defina dados registro (nome[30] literal, prova[3] numérico, teste[3]
numérico, atividade[7] numérico, final numérico )
declare aluno[100] registro dados
declare notas_turma1.txt arquivo de dados
Arquivos
abrir notas_turma1.txt para leitura
escreva “Entre com o total de alunos:”
leia N
{leitura dos dados no arquivo}
para i de 1 até N, fazer
leia notas_turma1.txt.aluno[i]
{calcular média das provas}
mpro 0
para j de 1 até 3, fazer {média das provas} mpro mpro+aluno[i].prova[j]
fim para
mpro mpro/3
{continua}
Arquivos
{calcular média dos testes}
mtes 0
para j de 1 até 3, fazer {média dos testes} mtes mtes+aluno[i].teste[j]
fim para
mtes mtes/3
{calcular média das atividades}
matv 0
para j de 1 até 7, fazer {média das atividades} matv matv+aluno[i].atividade[j]
fim para
matv matv/7 {continua}
Arquivos
{calcular média parcial}
mpar (3*mpro+2*(mtes+matv))/7 {média parcial} {avaliar a situação do aluno...}
se (mpar>=7), então {aprovação direta}
escreva “Média: ”, mpar, “ Situação: Aprovado”
senão se (mpar<4), então {reprovação direta}
escreva “Média: ”, mpar, “ Situação: Reprovado”
senão {caso a ser estudado...}
mf 0,5*(mpar+aluno[i].final)
se (mf>=5), então {aprovado em média final} escreva “Média: ”, mf, “ Situação: Aprovado”
senão {reprovado em média final} {continua}
Arquivos
escreva “Média: ”, mf, “ Situação: Reprovado”
fim se
fim se fim para
fechar notas_turma1.txt
fim algoritmo