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
Além da informação básica presente nas lógicas de
programação (numérico, literal e lógico), um
problema pode necessitar de outras estruturas de
informação.
Uma estrutura muito útil e constantemente presente
nos problemas é a estrutura de informação
homogênea na forma de vetores e matrizes.
Este tipo de estrutura de informação é organizado
através de uma lista indexada de conteúdos
(valores).
Estrutura de Dados
Matematicamente, uma lista de dados é uma
estrutura referenciada por um identificador e um
conteúdo em particular é localizado através de seu
índice:
x = {x
i/ i
N
} = {x
0,x
1, ... , x
n, ...}
Como a lista não pode ser infinita, será necessário
definir-se um comprimento (número de dados).
Também é necessário que se defina o tipo do dado
que será armazenado na lista.
Estrutura de Dados
Em termos de algoritmo, a declaração de uma lista
de dados homogêneo segue o estilo de definição de
uma variável qualquer.
Porém, a dimensão da lista deve ser declarada logo
após o identificador.
Por exemplo, suponhamos que a lista x do exemplo
anterior seja numérica e que tenha um total de 20
elementos:
declare x[20] numérico {lista com 20 elementos}
Estrutura de Dados
O índice do primeiro elemento da lista depende de
uma convenção a ser adotada.
Em Física Computacional, o índice será 1 se este não
for apresentado formalmente.
E se o índice inicial não é 1, então é necessário
explicitá-lo:
declare x[0:19] numérico {20 elemento começando do 0}
De quebra, o índice final também deve ser
explicitado.
declare identificador[inicio:fim] <natureza>
Estrutura de Dados
Exemplos:
declare x[20] numérico {começa no 1, 20 elementos} declare nome[30] literal {começa no 1, 30 elementos}
declare y[-10:10] numérico {começa no -10, 21 elementos} declare estado[0:9] lógico {começa no 0, 10 elementos}
No caso das variáveis literais, não padronizamos no
início do curso a necessidade de se revelar a
dimensão da variável (número de caracteres).
Faremos isso a partir de agora.
Estrutura de Dados
Uma variável literal sem dimensão é capaz de
armazenar somente um caractere.
Para se armazenar uma
string
(cadeia de caracteres)
é necessário declarar-se uma lista:
declare ch literal
declare nome[20] literal ch „a‟
nome “paralelepípedo”
Estrutura de Dados
Cada elemento de uma lista é acessado através do
identificador da lista seguido de um índice:
declare x[20] numérico declare titulo[30] literal x[1] 10
x[5] -x[1]
titulo “Física Computacional”
escrever x[5], titulo[8] {imprime: -10 C}
Tradicionalmente, uma lista de dados indexados é
chamado de vetor.
Estrutura de Dados
Podemos construir listas com mais de uma
dimensão.
Uma lista bidimensional é tipicamente uma matriz
de dados.
A declaração de uma lista bidimensional segue o
padrão de uma lista (vetor) apenas se diferenciando
na declaração do comprimento que passam a ser dois
(separados por vírgula):
declare mat[10,10] numérico {matriz 10 por 10}
Estrutura de Dados
Se os índices percorrem faixas de valores que não
começam em 1, é necessário explicitá-los:
declare a[0:9,0:9] numérico {matriz 10x10: aij}
O acesso aos elementos segue o mesmo padrão de
vetores (listas unidimensionais):
a[0,0] 10 a[8,3] -20.5 escrever a[1,3]
Estrutura de Dados
A declaração de listas multidimensionais é simples:
declare identificador[d1,d2,d3,...,dN] <natureza>
onde d1, d2, ... , dN são os comprimentos em cada
dimensão.
Neste caso, a lista tem N dimensões.
Exemplo:
{estrutura 3x100x2, total de 600 elementos} declare dados[3,100,2] numérico
Estrutura de Dados
A declaração não pode conter variáveis.
É necessário que os comprimentos sejam definidos
na declaração.
Numa situação onde os comprimentos não sejam
conhecidos
a priori
, é preciso usar uma outra
declaração e definir os comprimentos durante o
algoritmo.
Estrutura de Dados
Então, como exercício:
Desenvolva um algoritmo para cálculo das médias de 100 alunos onde a média é calculada a partir de 3 provas.
Primeiro, as notas devem ser armazenadas em uma matriz. Depois, deve-se calcular as médias de cada aluno.
Por fim, cada média deverá ser armazenada em uma lista separada.
Estrutura de Dados
Outro exemplo:
Digamos que um programador queira criptografar uma mensagem.
O método escolhido por ele foi inverter a ordem dos caracteres na string.
Exemplo: a string é “olá”; ao criptografar ficaria “álo”. Admita que exista uma função chamada tamanho( ) que
retorne o tamanho da string presente na declaração da variável.
Exemplo:
declare nome[30] literal
Estrutura de Dados
A parte da string que não é usada fica com espaços em branco, por exemplo:
declare str[10] literal {“_ _ _ _ _ _ _ _ _ _”}
declare tam numérico {tamanho declarado}
str “olá” {“o l á _ _ _ _ _ _ _”}
O método segue a seguinte lógica:
percorrer a string de trás para frente;
enquanto for espaço em branco, continua, até encontrar um
caractere que não seja espaço;
a partir daí, trocar posição dos caracteres;
se a posição do último caractere é j, então o caractere da posição j
deve ser trocado com o caractere da posição 1; o caractere da posição j-1 deve ser trocado com o caractere da posição 2;
Estrutura de Dados
o caractere da posição j-2 deve ser trocado com o caractere da
posição 3;
generalizando, o caractere da posição j-(i-1) é trocado com o
caractere da posição i;
exemplo: o caractere „a‟ está na posição 3 e deve ser trocado com o caractere „o‟ na posição 1; logo, i é 1 e deve se trocado com o
caractere da posição j-(i-1) que é 3-(1-1) = 3; o caractere „l‟ está na
posição i=2 e deve ser trocado com o caractere da posição j-(i-1); se j é 3, então j-(i-1)=3-(2-1)=2 que é o próprio caractere „l‟; daí
surge o critério de parada nas trocas de posição; se i for igual ou maior que j-(i-1), então parar.
então, primeiro passo é descobrir a posição do último caractere
diferente de espaço; depois começar a troca dos caracteres.
Estrutura de Dados
Algoritmo Criptografando_String
Data. 06/09/2011 Autor. Luís Fernando
Propósito. criptografar uma cadeia de caracteres trocando a posição dos mesmos dentro da cadeia.
Método. Determinar a posição do último caractere diferente de espaço em branco dentro da cadeia (string). Depois, trocar os caracteres de posição. Se o último caractere está na posição j e este deve ser trocado com o caractere da posição 1, então a
regra de troca de posição será trocar o caractere da posição i com o caractere da posição j-(i-1). O critério de parada fica estabelecido quando o valor de i for maior ou igual a j-(i-1).
Estrutura de Dados
Entradas e Saídas.
Entrada: string a ser criptografada.
Saída: string criptografada.
Observações, Requisitos e Restrições. O algoritmo usa uma função que retorna o total de caracteres de uma variável literal baseado na declaração da própria variável. A função se chama tamanho(variável literal).
algoritmo
declare str[128], ch literal {string e variável auxiliar}
declare i, j numérico {contadores de posição} {continua}
Estrutura de Dados
escrever “Entre com a frase:”
ler str
j tamanho(str) {tamanho da string}
enquanto (str[j] == „ ‟), fazer {enquanto for espaço...}
j j-1 {decrementa contador}
fim enquanto {até encontrar caractere diferente de espaço}
i 1 {posição de troca} enquanto (i < j), fazer
ch str[i]
str[i] str[j]
str[j] ch
{continua}
Estrutura de Dados
{continuação}
i i+1
j j-1
fim enquanto
escrever “A frase criptografada é”, str
fim algoritmo
Estrutura de Dados
Exemplo com média e desvio padrão
Um aluno tem uma sequência de dados experimentais sobre uma mesma grandeza. Ele deseja calcular a média dos dados e o desvio padrão referente à média. São 15 dados ao total:
x = {10, 2, 3, 7, 5, 3, 7, 4, 6, 4, 32, 1, 4, 5, 3}
Desenvolva um algoritmo de forma que os dados sejam
fornecidos no início. Depois, o algoritmo deve calcular a média e o desvio padrão. E, por fim, retorna ao aluno a média final e o desvio padrão.
Estrutura de Dados
Algoritmo Estatística Básica
Data. 09/09/2011 Autor. Luís Fernando
Propósito. Calcular a média e o desvio padrão de um conjunto de medidas.
Método. O cálculo da média é realizado pela expressão xm = (1/N)xi
onde xi é cada medida e N é o número de medidas.
O desvio padrão é a raiz da variância que é calculada pela expressão
xvar = (1/N)(xi-xm)2 x
Estrutura de Dados
Entradas e Saídas.
Entrada: medidas.
Saída: média e desvio padrão.
Observações, Requisitos e Restrições. Como não sabemos ainda como criar um vetor com tamanho indefinido, vamos impor ao usuário que o total de dados não pode
ultrapassar 50 medidas.
algoritmo
declarar dado[50], variância numérico {medidas e variância}
declarar i numérico {contador}
Estrutura de Dados
{verificação do total de dados}
escrever “Entre com o total de dados (N):” ler N
se (N>50), então
escrever “Total de dados não pode ultrapassar 50 medidas” senão {se N é <= 50, então tudo bem, continuar}
{armazenar os dados em um vetor}
para i de 1 até N, fazer
escrever “Entre com dado ”,i,“:”
leia dado[i]
fim para
{continua}
Estrutura de Dados
{cálculo da média das medidas}
média 0 {inicializa média com 0}
para i de 1 até N, fazer {somatório dos dados}
média média+dado[i]
fim para
média média/N {cálculo da média dos dados} {cálculo do desvio padrão}
variância 0 {inicializa variância com 0}
para i de 1 até N, fazer {diferenças quadráticas}
variância variância+(dado[i]-média)**2
fim para
{continua}
Estrutura de Dados
variância variância/N {cálculo da variância dos dados}
desvio variância**0,5
escrever “A média é ”, média, “ e o desvio é ”, desvio
fim se
fim algoritmo
Estrutura de Dados
Exercício: desenvolva um algoritmo para realizar a
regressão linear sobre um conjunto de dados.
O procedimento de regressão linear procura encontrar os
parâmetros da reta que melhor ajusta os dados experimentais. Ele traz a essência do método dos mínimos quadrados.
A equação da reta que melhor ajusta os dados é dada pela expressão
Yr = A + BX
Os parâmetros A e B devem ser tais que a reta se aproxime o melhor possível dos pares de dados (xi, yi).
O parâmetro A é o termo independente e B é o coeficiente angular da reta de ajuste.
Estrutura de Dados
Se yi é a cota do dado i para a abscissa xi e yri é a aproximação da reta de ajuste para a mesma abcissa, então a diferença
(yi-yri)2 é o erro quadrático de ajuste i2.
O método visa encontrar A e B tais que o erro quadrático total seja o menor possível.
Então, o erro quadrático total é a soma dos erros quadráticos individuais:
T2 = (y
1-yr1)2+ (y2-yr2)2+...+ (yN-yrN)2 T2 = (y
1-A-Bx1)2+ (y2-A-Bx2)2+...+ (yN-A-BxN)2
= (yi-A-Bxi)2
A e B são incógnitas (variáveis do erro quadrático).
Logo, o erro quadrático total é função de duas variáveis A e B.
Estrutura de Dados
Minimizar o erro quadrático total é encontrar os mínimos da função.
O mínimo da função pode ser identificado quando a derivada da função se torna nula:
Como o erro quadrático total é função de duas variáveis, é necessário derivar-se a expressão do erro total em relação a cada uma delas e igualá-las a zero:
Estrutura de Dados
T2/A = (y
i-A-Bxi) = 0 T2/B = (y
i-A-Bxi)xi = 0
Abrindo os somatórios, as equações podem ser rescritas como:
yi = AN - Bxi
xiyi = Axi - Bxi2
Seja SY = yi, SX = xi, SXX = xi2 e SXY = xiyi. Então,
resolvendo este sistema de equações para A e B, chegamos ao seguinte resultado:
A = [SYSXX – SXYSX]/[NSXX – SXSX] B = [NSXY – SXSY]/[NSXX – SXSX]
Estes são os parâmetros de saída do algoritmo: o termo independente A e o coeficiente angular B.
Estrutura de Dados
Os dados de entrada são os pares xi e yi.
Cada dado deve ser armazenado em um vetor próprio x e y. A saída é A e B.
As variáveis auxiliares são SX, SY, SXX e SXY, além do contador i.
Fixe o número máximo de dados em 50, como no exemplo anterior.
O total de dados do usuário, N, deve ser informado no início do algoritmo e não deve ultrapassar o máximo de 50.
Se N for maior que 50, o algoritmo deve prever uma
mensagem para o usuário alertando o problema e parar. Isso se chama lógica defensiva.
Estrutura de Dados
Algoritmo Regressão Linear
Data. 13/09/2011
Autor. Luís Fernando
Propósito. Determinar os parâmetros da reta de ajuste de
dados através do método dos mínimos quadrados.
Método. A reta de ajuste segue o modelo Y=A+BX. Os
parâmetros de ajuste A e B são calculados a partir de médias simples e covariâncias dos pares de dados inseridos pelo
usuário (x,y). As variáveis internas são SX, SY, SXX e SXY: SY =
yi, SX = xi, SXX = xi2 e S
XY = xiyi , onde xi e yi são os dados
indexados do usuário. O índice i varia entre 1 e N, sendo N o número total de dados.
Estrutura de Dados
A partir destas variáveis, os parâmetros A e B podem ser
calculados: A = [SYSXX – SXYSX]/[NSXX – SXSX] e B = [NSXY – SXSY]/[NSXX – SXSX].
Entradas e Saídas. Os dados do usuário e o total de dados são
as entradas. A saída são os parâmetros de ajuste da reta, ou seja, A e B.
Observações, Requisitos e Restrições. O algoritmo está
preparado para operar sobre um conjunto máximo de 50 pares de dados.
Estrutura de Dados
algoritmo
declarar x[50], y[50] numérico {dados para ajustar}
declarar N numérico {total de dados}
declarar i numérico {contador}
declarar sx, sy, sxx, sxy numérico {variáveis auxiliares}
declarar A, B numérico {parâmetros da reta}
escrever “Entre com o total de dados (N):” ler N
se (N>50) então
escrever “O total de dados não pode passar de 50!”
{continua}
Estrutura de Dados
senão
{entrada de dados}
para i de 1 até N fazer
escrever “Entre com x”, i, “ e y”, i
ler x[i], y[i]
fim para
{cálculo de sx}
sx 0
para i de 1 até N fazer
sx sx+x[i]
fim para
{continua}
Estrutura de Dados
{cálculo de sy}
sy 0
para i de 1 até N fazer
sy sy+y[i]
fim para
{cálculo de sxx}
sxx 0
para i de 1 até N fazer
sxx sxx+x[i]*x[i]
fim para
{continua}
Estrutura de Dados
{cálculo de sxy}
sxy 0
para i de 1 até N fazer
sxy sxy+x[i]*y[i]
fim para
{cálculo de A e B}
A (sy*sxx - sx*sxy)/(N*sxx - sx*sx) B (N*sxy - sx*sy)/(N*sxx - sx*sx)
{saída dos parâmetros A e B}
escrever “Os parâmetros são: A=”, A, “ e B=”, B
fim se
fim algoritmo