Informática para Ciências e
Engenharias (B)
2015/16
Na aula de hoje
l Decomposição de problemas
•
Abstracção, generalização e algoritmos
l Ficheiros e código fonte
•
scripts, funções e como escrever código
l Testes unitários
l Ciclo de vida de um programa l Tipos de erros.
Problema
l Calcular pH do ácido benzóico 0.01M
•
C6H5COOH ↔ H+ + C
6H5COO-
•
Ka = 6.5 x 10-5 % Constante de Dissociação
•
Ci = (m/mmol/vol) % Concentração Molar Inicial
l Como resolver
•
sendo x = [H+] = [C
6H5COO- ] % Concentração Iónica
•
Ka = x2 / (C
i – x)
•
x2 + K
a x – Ci Ka = 0
Como implementar, opção 1
l Escrever directamente
•
Raiz quadrada: sqrt( )
•
Logaritmo de base 10: log10( )
Como implementar, opção 1
l Escrever directamente
•
Raiz quadrada: sqrt( )
•
Logaritmo de base 10: log10( )
Como implementar, opção 1
l Escrever directamente
•
Má solução
• mais difícil de corrigir erros
• temos de escrever tudo cada vez que precisamos
calcular o pH
• só viável com problemas simples
• quanto maior a lista de instruções mais provável é haver erros e mais difícil é de os identificar
Como implementar, opção 2
l Criar um script
•
um script Matlab é um ficheiro contendo código fonte e gravado com a extensão .m
l Chamar o script
•
Escrever o nome do script (sem o .m)
• se não existe variável ou função definida, o
interpretador procura o ficheiro nome.m
• tem de estar na pasta de trabalho (ou numa pasta
Ficheiros
l Ficheiro
•
sequência de bits, agrupados em bytes
• 1 byte = 8 bits
•
armazenado num suporte persistente
• disco rígido, cartão de memória, CD...
•
associado pelo SO a um identificador único
• caminho e nome
• C:\My Documents\ICE\teste.m
Ficheiros
l Tipos de ficheiro
•
todos os ficheiros são sequências de bits
• em ficheiros de “tipo diferente” a sequência é
interpretada de forma diferente
•
Muitas vezes o tipo de ficheiro é identificado pela extensão
• .pdf, .txt, .jpg, .wav, .doc, .mp3
• associada ao programa que interpreta o ficheiro
• (há excepções, depende do SO e, especialmente, do
Ficheiro de Código Fonte
l Na linguagem MATLAB, um ficheiro .m
•
É interpretado como texto, código fonte
•
Quando o interpretador encontra um identificador verifica
• 1º se é uma variável definida
• 2º se é uma função já carregada
• 3º se há um ficheiro com esse nome e extensão .m
Editar o Código Fonte
l Ficheiro: benzoico.m
Utilizador
Executar o Código Fonte
l Ficheiro: benzoico.m
Utilizador
• dá ao interpretador o comando para executar o código no ficheiro.
Interpretador
• carrega o ficheiro, e interpreta-o;
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
l Executar
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
l Executar
octave:26> cd 'C:\My Documents\ICE'
octave:27> benzoico Ci = 0.010000 Ka = 6.5000e-005 x = 7.7438e-004 pH = 3.1110 octave:28>
Esta é a pasta onde guardámos o ficheiro. cd para “change directory”. Também pode ser:
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
l Executar
octave:26> cd 'C:\My Documents\ICE' octave:27> benzoico Ci = 0.010000 Ka = 6.5000e-005 x = 7.7438e-004 pH = 3.1110 octave:28>
Como Implementar, Opção 2
l Criar um script
•
Notepad ++ (ou equivalente)
•
ficheiro benzoico.m
l Executar
octave:26> cd 'C:\My Documents\ICE' octave:27> benzoico Ci = 0.010000 Ka = 6.5000e-005 x = 7.7438e-004 pH = 3.1110 octave:28>
Isto é o eco dos cálculos no script.
Como Implementar, Opção 2
l Testar
•
Nota: Ecos eliminados por ;
octave:28> benzoico pH = 3.1110
Como Implementar, Opção 2
l Criar um script
•
Vantagens
• mais fácil de executar e de editar
• comentários (mais inteligível)
• fica guardado
•
Problemas
• fica tudo junto
• variáveis comuns a todo o programa
• diferentes tarefas não são separadas
Programação Estruturada
Programação Estruturada
l Decompor o problema em partes autónomas (dividir para
conquistar)
•
perceber o problema e todas as tarefas
•
abstrair e generalizar cada tarefa
l Conceber o algoritmo
•
perceber como resolver cada tarefa
•
perceber como as várias partes encaixam
Algoritmo
l Muhammad ibn Mūsā al-Khwārizmī
•
“Compêndio do Cálculo por Completude e Balanço.”
•
“Cálculo com Numerais Hindu”
•
Algoritmi de numero Indorum (sec. XII)
• Algoritmo
Algoritmo
l Conjunto finito de instruções.
•
No sentido estrito, operações sobre símbolos
“Algoritmo da torrada”
l Pegar no pão
l Se faca na bancada,
•
Pegar na faca
l Caso contrário
•
Ir buscar faca à gaveta
l Cortar fatia
l Pôr na torradeira, ligar l Enquanto não está pronta
“Algoritmo da torrada”
l Pegar no pão
l Se faca na bancada,
•
Pegar na faca
l Caso contrário
•
Ir buscar faca à gaveta
l Cortar fatia
l Pôr na torradeira, ligar l Enquanto não está pronta
•
Esperar
“Algoritmo da torrada”
l Pegar no pão l Obter faca l Cortar fatia
l Pôr na torradeira, ligar l Enquanto não está pronta
•
Esperar
l Se faca na bancada,
•
Pegar na facal Caso contrário
“Algoritmo da torrada”
l Pegar no pão l Obter faca l Cortar fatia
l Pôr na torradeira, ligar l Enquanto não está pronta
•
Esperar
“Algoritmo da torrada”
l Pegar no pão l Obter faca l Cortar fatia
l Pôr na torradeira, ligar
l Torrar l Enquanto não está pronta
Programação Estruturada
l Resolver problemas complexos através de problemas simples
•
um de cada vez
l Hierarquizar os problemas
•
Abstrair dos detalhes concretos
•
Generalizar soluções
•
Decompor as tarefas e implementar partes
• Testar cada uma
Funções
l Entre function e end
•
As variáveis são locais e estão isoladas
• mesmo que tenham o mesmo nome
•
Nota: A variável a dentro da função é independente da variável a fora da função.
Função no ficheiro igualdois.m:
Funções
l Entre function e end
•
As variáveis são locais e estão isoladas
•
Nota: A variável a dentro da função só está acessível na função (dentro do seu contexto).
Função no ficheiro igualdois.m:
function igualdois a = 2 end octave:3> clear a octave:4> igualdois a = 2 octave:5> a
error: `a' undefined near line 5 column 1
Funções
l Dentro do bloco function ... end
•
As variáveis são locais e estão isoladas
•
Não há acesso a variáveis exteriores
l Permite estruturar o programa …
•
separar tarefas sem interferência
•
controlar entrada e saída
•
garantir que cada parte funciona
Funções
l Normalmente queremos
•
fornecer valores (argumentos) à função
•
obter valores da função. (no ficheiro soma.m)
Funções
function res = soma(a,b)res = a+b end
Funções
function res = soma(a,b)res = a+b end
l Nome da variável
•
(na função)
•
com o valor a devolver.
l Operacionalmente:
•
quando chega ao end final, o
Funções
function res = soma(a,b)res = a+b end
l Nome da função
•
Para o interpretador encontrar a função o nome da função tem de ser igual ao
Funções
function res = soma(a,b)res = a+b end
l Parâmetros da função
•
variáveis da função que recebem os
argumentos, cujo valor se desconhece na
implementação usados na execução.
l e.g: soma(5,10)
•
parâmetros: a, b
Funções
function res = soma(a,b)res = a+b end
l Os parâmetros a e b contêm cópias dos
argumentos fornecidos à função.
l Estas variáveis a, b e res só existem
Funções
function x = incrementa(x)x = x + 1
end x é cópia do valor
Funções
function res = soma(a,b)res = a+b end
l Último detalhe:
•
Não queremos ver res no cálculo intermédio
octave:16> soma(2,5) res = 7
ans = 7
Funções
function res = soma(a,b)res = a+b end
l Último detalhe:
•
Não queremos ver res no cálculo intermédio
•
Usar ;
octave:16> soma(2,5) ans = 7
octave:17>
Funções
l Recapitulando:
function res = soma(x,y)
•
Os parâmetros da função recebem cópias dos valores dados como argumentos.
•
As variáveis na função estão isoladas
•
Não vêem nem são vistas fora da função.Funções
l Nota 1:
•
A variável (ou variáveis) designada para guardar o valor devolvido tem de ter um valor atribuído no final da função.
function res = soma(a,b) c = a+b;
end
octave:24> a = soma(2,5)
error: value on right hand side of assignment is undefined
Funções
l Nota 2:
•
O interpretador verifica primeiro se há uma variável com esse nome:
•
Se fosse ao contrário, um novo ficheiro .m podia estragar um programa já existente.
octave:21> soma = 0 soma = 0
octave:22> soma(2,5)
Um Problema
l Calcular pH do ácido benzóico
•
(mas pode ser de outro ácido.)
l Variáveis
•
Ka , Ci
l Passos semelhantes
•
Fórmula resolvente para obter x
Um Problema
l Calcular pH do ácido benzóico 0.01M
•
C6H5COOH ↔ H+ + C
6H5COO-
•
Ka = 6.5 x 10-5 (constante de dissociação – mais depois)
Como implementar
l Compreender totalmente o problema
•
dados de entrada
Como implementar
l Compreender totalmente o problema l Algoritmo
•
decompor o problema
•
saber como resolver cada parte
• Usar fórmula resolvente para obter x
Como implementar
l Compreender totalmente o problema l Algoritmo
l Abstrair e generalizar
•
pH para quaisquer valores de Ka e Ci
• não é só para o ácido benzóico
• a maior raiz de uma equação quadrática com a positivo
•
pode ser útil noutros casos x2 + K
Como implementar
l Compreender totalmente o problema l Algoritmo
l Abstrair e generalizar l Implementação
•
Precisamos das assinaturas
• function x = raizmaior(a,b,c)
• calcula a maior raiz pela fórmula resolvente
Como implementar
l Criamos raizmaior.m
Como implementar
l Criamos raizmaior.m
Documentar a Função
l Comentário explicando o funcionamento
•
Pode haver comentários noutras partes do código, mas o primeiro bloco contíguo de linhas de comentário, antes ou depois da assinatura da função, é mostrado pelo comando
Documentar a Função
l Comentário explicando o funcionamento
octave:10> help raizmaior
`raizmaior' is a function from the file C:\ICE\raizmaior.m
calcula a raiz maior do polinomio ax^2+bx+c assumindo o coeficiente a positivo
Testar a Função
l Pensamos num caso com solução conhecida.
Testar a Função
l Pensamos noutro caso com solução conhecida.
•
x2 = 0 (a = 1, b = 0, c= 0)
• deve dar x = 0
l Experimentamos este outro caso
l Experimentamos ...
octave:7> raizmaior(1,0,0) ans = 0
Testes Unitários
l É importante testar cada função individualmente
•
é mais fácil diagnosticar e corrigir erros se sabemos onde ocorrem
Testes Unitários
l Testar casos diferentes
•
pode haver erros de execução em certas condições
•
pode não dar o resultado certo em certos casos
l Testar casos com resultado conhecido
Testes: quatro tipos de erro
l Erro de sintaxe
•
na interpretação do código fonte
• parênteses, plicas, operadores em falta, …
Testes: quatro tipos de erro
l Erro de sintaxe l Erro de execução
•
o programa é interrompido
• variável não definida, função não definida, …
• y = x+1 (sem ter definido x primeiro)
octave:1> y = x+1
Testes: quatro tipos de erro
l Erro de sintaxe l Erro de execução l Erro lógico
Testes: quatro tipos de erro
l Erro de sintaxe l Erro de execução l Erro lógico
l Erro numérico
•
se resultados das operações aritméticas não são exactos a falta de precisão pode afectar a saída do programa.
Representação de Inteiros
l Um número inteiro pode ser representado com uma
combinação de bits.
•
em base 2
• 2 bits, 22 possibilidades 00 01 10 11
• 4 bits, 24 possibilidades 0000 0001 … 1111
• 8 bits (1 byte), 256 possibilidades
• 00000000 … 11111111 em binário
Representação de Inteiros
l Um número inteiro pode ser representado com uma
combinação de bits.
•
por omissão, MATLAB usa 32 bits para representar cada número inteiro
• 232 = 4294967296 combinações
• um bit para o sinal
Representação de Inteiros
l 32 bits para representar um inteiro
•
funções intmax e intmin
Representação de Reais
l Um número “real” é representado com 64 bits* (vírgula flutuante)
•
Sinal (+, -) : 1 bit
•
Expoente: 11 bits (8)
•
Fracção: 52 bits (23)
•
(-1) Sinal × Fracção × 2 Expoente
* Em precisão dupla, por omissão em MATLAB. Em precisão simples são 32 bits.
Representação de Reais
l Maior valor:
•
realmax: ±1.7977 × 10+308
• ±3.4028 × 1038 em precisão simples
l Menor valor não nulo
•
realmin: ±2.2251 × 10-308
• ±1.1755 × 10-38 em precisão simples
l Precisão relativa (épsilon)
•
eps: ±2.2204x 10-16
Representação de Reais
l Precisão relativa (épsilon)
•
eps: ±2.2204x 10-16
• ±1.1921 x 10-7 em precisão simples
l O menor número que somado a 1 dá um resultado diferente de 1:
octave:15> (1+eps) - 1 ans = 2.2204e-016
Representação de Reais
l Resumindo:
•
Todos os dados no computador são sequências de bits.
•
A memória é limitada (64 bits para os números), por isso a precisão é limitada.
•
Normalmente não há problema, mas atenção aos arredondamentos:
• erros numérico
Como implementar
l Decompor em
•
function x=raizmaior(a,b,c)
• calcula a maior raiz pela fórmula resolvente
•
function pH=calculaph(Ka,Ci)
• recebe os valores de Ka e Ci
• usa a função raizmaior
Como implementar
l Decompor
•
função raizmaior
Como implementar
octave:9> help calculaphcalculaph(Ka, Ci)
calcula o pH de um acido fraco monoprotico Ka: constante de dissociacao
Ci: concentracao inicial do acido octave:10> calculaph(6.5e-5,0.01)
Como implementar
l Decompor em funções
•
Vantagens
• Divide o problema em partes menores
• podemos pensar em cada tarefa individualmente
• Permite testes unitários
• Permite construir programas complexos
• dentro de function … end o código fica isolado
• Permite reutilizar código
• e.g. raizmaior pode servir noutros casos
Um Problema Semelhante
l Fazer a mesma coisa, mas dando
• massa molar,
• massa em solução,
• volume e
• Ka.
• e.g. qual o pH de 0.01g de ácido benzóico em 0.250 dm3?
l Decompor o problema
•
Calcular concentração
•
Calcular pH
Um Problema Semelhante
l pH dada a massa molar, massa em solução, volume e Ka.
•
function x = raizmaior(a,b,c)
• calcula a raiz da equação quadrática que dá a
concentração de [H+]
•
function pH = calculaph(Ka,Ci)
• calcula o pH a partir da constante de dissociação e a
concentração inicial usando raizmaior
Um Problema Semelhante
Um Problema Semelhante
l teste (massa molar do ácido benzóico: 122.12)
octave:27> help phmassvol
`phmassvol' is a function from the file C:\ICE\phmassvol.m phmassvol(mass, vol, massMol, Ka)
calcula o pH de um acido fraco monoprotico mass: massa do acido
vol: volume da solucao massMol: massa molar
Ka: constante de dissociacao
octave:28> phmassvol(1.2212,1,122.12,6.5e-5) ans = 3.1110
Scripts vs Functions
l Em ICE os ficheiros de script são opcionais
•
ficheiros de código fonte que não definem uma função
•
podem ser úteis para testes e desenvolvimento
•
são úteis quando utilizam programas
• reprodutibilidade,
• registo dos argumentos,
• conveniência
l mas em ICE não vamos pedir (nem querer) que entreguem os
Scripts vs Functions
l Funções function … end são fundamentais
•
vão precisar delas para tudo em ICE
• exercícios, trabalhos, testes, exame
•
os programas que entregam devem ser executados chamando uma função.
• isto garante que o programa é independente do que se
faça antes ou depois.
Ciclo de Vida do Código
l Edição do código fonte
•
escrito, guardado em ficheiros .m
l Interpretação do código fonte
•
o interpretador traduz as instruções em instruções para o CPU
l Execução
•
o CPU executa o programa
l Testar e avaliar o resultado
Estilo de Código
l O código fonte serve
•
para o interpretador executar o programa
•
para nós (quem ?) percebermos o programa
l Código difícil de perceber
•
terá mais erros
•
é mais difícil de corrigir, melhorar, alterar ou reaproveitar
Estilo de Código
l Nomes de variáveis:
•
Descritivos, começando em minúscula e indicando diferentes palavras com maiúscula.
Estilo de Código
l Nomes de variáveis:
•
Excepção quando os nomes correspondem a uma
convenção prévia. Nesse caso os nomes das variáveis devem respeitar a convenção esperada.
Estilo de Código
l Nomes de funções: Devem descrever o que a função faz.
•
Há três convenções comuns:
• só minúsculas, (menos problemas com nomes de ficheiros)
• minúsculas e maiúsculas (e.g. phMassVol)
Estilo de Código
l Indentação: Devem descrever o que a função faz.
Estilo de Código
l Inteligibilidade:
•
Cada linha de código deve corresponder a um passo do
programa fácil de perceber e faça sentido naquele contexto.
Estilo de Código
l Documentação e comentários:
•
As funções devem conter documentação que explique o seu funcionamento usando a função help.
Estilo de Código
l Mais (muito mais...) sobre estilo em:
•
MATLAB Programming Style Guidelines, por Richard
Johnson, 2003
Resumo
l Programação estruturada
•
Decompor um problema complexo em problemas mais simples
• E assim por diante, até ter problemas elementares
• Implementar soluções em módulos autónomos
• pensar primeiro na assinatura da função
• testar bem depois de implementar
l Abstracção e generalização
•
Abstrair dos detalhes do problema
Resumo
l Perceber o enunciado
•
o que é fornecido e pedido
l Perceber o problema
•
o que se tem de fazer
l Conceber o algoritmo
•
tarefas, funções, assinatura de cada uma
l Implementar cada parte do programa
Resumo
l Estilo de código
•
Nome de função deve ser descritivo
• usar umas das 3 convenções
•
Nome de variável começando em minúscula e com maiúsculas a indicar composição de palavras
• excepto variáveis que se espera obedecer a outras
convenções (Ka, pH, ...)
Para estudar a aula de hoje
l Recomendado
•
Physical Modeling in MATLAB
• Capítulo 2 todo
• Capítulo 5, só secções 5.1 a 5.5
l Opcional
•
Manual do Octave
• Secções 11.1 e 11.9