informática para ciências e engenharias (b)...
TRANSCRIPT
Informática para Ciências e Engenharias (B)
2016/17
Teórica 2
Na aula de hoje
l Decomposição de problemas • Abstração, generalização e algoritmos
l Ficheiros e código fonte • scripts, funções e como escrever código
l Testes unitários
l Tipos de erros.
l Representação de números em binário
l Ciclo de vida de um programa
15 Março 2017 Programação Estruturada; Funções 2
Problema
l Calcular pH do ácido benzóico • C6H5COOH ↔ H+ + C6H5COO-
• Ka = 6.5 x 10-5 % Constante de Dissociação • Ci = 0.1 (m/mmol/vol) % Concentração Molar Inicial
l Como resolver • sendo x = [H+] = [C6H5COO- ] % Concentração Iónica • Ka = x2 / (Ci – x) • x2 + Ka x – Ci Ka = 0 • pH = - log10(x)
15 Março 2017 Programação Estruturada; Funções 3
Como implementar, opção 1
l Calcular directamente, • Usando a “Janela de Comandos” do Octave
l Cálculo de expressões pode utilizar funções pre-definidas • Raiz quadrada / sqrt, e logaritmo de base 10 / log10
15 Março 2017 Programação Estruturada; Funções 4
>> Ci = 0.01 Ci = 0.010000 >> Ka = 6.5e-5 Ka = 6.5000e-005 >> x = (-Ka + sqrt(Ka^2+4*Ka*Ci))/2 x = 7.7438e-004 >> pH = -log10(x) pH = 3.1110 >>
o valor da concentração tem de ser positivo
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
• impossível de resolver problemas complexos
15 Março 2017 Programação Estruturada; Funções 5
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 • Pode ser criado com o Octave/Matlab no modo de “Edição”
• O editor ajusta as cores das instruções • Mostra os números de linha (útil para reportar erros)
15 Março 2017 Programação Estruturada; Funções 6
Ci = 0.01 Ka = 6.5e-5 x =(-Ka + sqrt(Ka^2+4*Ka*Ci))/2 pH = -log10(x)
benzoico.m
1 2 3 4
Como implementar, opção 2
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 que o interpretador conheça)
• As instruções são executadas (e ecoadas) como se estivessem a ser dadas pela janela de comandos
15 Março 2017 Programação Estruturada; Funções 7
>> benzoico Ci = 0.010000 Ka = 6.5000e-005 x = 7.7438e-004 pH = 3.1110 >>
Como implementar, opção 2
l Os ecos podem ser eliminados “escondendo” as instruções de atribuição com “;”
15 Março 2017 Programação Estruturada; Funções 8
>> benzoico x = 7.7438e-004 pH = 3.1110 >>
>> benzoico Ci = 0.010000 Ka = 6.5000e-005 x = 7.7438e-004 pH = 3.1110 >>
Ci = 0.01 Ka = 6.5e-5 x =(-Ka + sqrt(Ka^2+4*Ka*Ci))/2 pH = -log10(x)
Ci = 0.01; Ka = 6.5e-5; x =(-Ka + sqrt(Ka^2+4*Ka*Ci))/2 pH = -log10(x)
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
• Se chega à 3º opção, executa o que está no ficheiro
15 Março 2017 Programação Estruturada; Funções 9
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
• não estruturado e mau para problemas complexos
15 Março 2017 Programação Estruturada; Funções 10
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 • ~/ICE/teste.m
15 Março 2017 Programação Estruturada; Funções 11
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
programa que usamos como interface)
15 Março 2017 Programação Estruturada; Funções 12
Programação Estruturada
Programação Estruturada
15 Março 2017 Programação Estruturada; Funções 13
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
l Implementar e testar cada parte
15 Março 2017 Programação Estruturada; Funções 14
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 • Algarismo
15 Março 2017 Programação Estruturada; Funções 15
Algoritmo
l Conjunto finito de instruções.
• No sentido estrito, operações sobre símbolos • Matemática • Lógica • Programas.
• No sentido lato: • receitas • procedimentos de emergência • etc...
15 Março 2017 Programação Estruturada; Funções 16
“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
15 Março 2017 Programação Estruturada; Funções 17
“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
l Obter faca
15 Março 2017 Programação Estruturada; Funções 18
“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 faca
l Caso contrário
• Ir buscar faca à gaveta
15 Março 2017 Programação Estruturada; Funções 19
“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 Torrar
15 Março 2017 Programação Estruturada; Funções 20
“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
• Esperar
15 Março 2017 Programação Estruturada; Funções 21
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
l Juntar tudo no programa final
15 Março 2017 Programação Estruturada; Funções 22
Programação Estruturada
l Na linguagem Matlab usada em ICE os problemas, simples ou complexos, são resolvidos através de funções.
l Para cada problema/função teremos de ter bem presente
• Quais os dados de entrada do problema
• Qual o resultado pretendido
l Ao desenhar uma função esta informação deverá constar da sua assinatura que tem a forma genérica
function nomeResultado = nomeFuncao(parametros)
15 Março 2017 Programação Estruturada; Funções 23
Programação Estruturada
function nomeResultado = nomeFuncao(parametros)
l Os parâmetros da função são variáveis, separadas por vírgulas
l A variável nomeResultado, recebe o valor da função
l Exemplo:
function ph = calculaPH(Ka, Ci)
l Antes de implementarmos esta função em particular, vamos analisar em mais detalhe vários aspectos a considerar no desenho / implementação de funções.
15 Março 2017 Programação Estruturada; Funções 24
Funções
l Em Matlab, tal como no caso dos scripts, as funções devem ser definidas em ficheiros texto com a extensão “.m”.
l No entanto, o nome do ficheiro não é arbitrário e deve ser igual ao nome da função.
l Os ficheiros, podem ser criados com qualquer editor de texto, nomeadamente com o do interpretador Octave, e começam com a assinatura da função e terminam com a palavra “end”.
15 Março 2017 Programação Estruturada; Funções 25
function ph= calculaPh(Ka, Ci) ...
end
calculaPh.m
Funções
l Para facilitar a legibilidade e compreensão de uma função é devem ser atribuídos nomes “significativos” quer à função quer às variáveis utilizadas na sua implementação.
l As funções devem ser comentadas de forma a que o seu objectivo possa ser inspecionado com a instrução help. Isso é feito com a inserção de uma ou mais linhas de comentário imediatamente após a assinatura da função.
15 Março 2017 Programação Estruturada; Funções 26
function ph = calculaPH(Ka, Ci) % calculaph(Ka, Ci) % calcula o pH de um acido fraco monoprotico, dados: % Ka: constante de dissociacao % Ci: concentracao ...
end
Funções
15 Março 2017 Programação Estruturada; Funções 27
function ph = calculaPH(Ka, Ci) % calculaph(Ka, Ci) % calcula o pH de um acido fraco monoprotico, dados: % Ka: constante de dissociacao % Ci: concentracao ...
end >> help calculaPH 'calculaPh' is a function from the file ... calculaph(Ka, Ci) calcula o pH de um acido fraco monoprotico, dados: Ka: constante de dissociacao Ci: concentracao Additional help ... >>
function ph = calculaPH(Ka, Ci) % ... x = ... % concentracao iónica ph = ... end
Funções
l A utilização de funções permite o uso de variáveis locais que não se confundem com variáveis com o mesmo nome, mas definidas noutras funções ou na janela de comandos.
l Há três tipos de variáveis locais usadas numa função, que são criadas quando a função é executada e são destruídas uma vez terminada a sua execução:
l Parâmetros de entrada
l Variável resultado
l Variáveis auxiliares
15 Março 2017 Programação Estruturada; Funções 28
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
l … e resolver problemas complexos.
l Vamos analisar em mais detalhe uma função muito simples.
15 Março 2017 Programação Estruturada; Funções 29
Funções
function res = soma(a,b)
res = a+b
end Assinatura da função
15 Março 2017 Programação Estruturada; Funções 30
Funções
function res = soma(a,b)
res = a+b
end l Nome da variável resultado
• (na função) • com o valor a devolver.
l Operacionalmente:
• quando chega ao end final, o interpretador devolve uma cópia do valor guardado na variável indicada aqui.
15 Março 2017 Programação Estruturada; Funções 31
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 nome do ficheiro com o código fonte:
15 Março 2017 Programação Estruturada; Funções 32
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 • argumentos: 5, 10
15 Março 2017 Programação Estruturada; Funções 33
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 dentro da função.
15 Março 2017 Programação Estruturada; Funções 34
Funções
15 Março 2017 Programação Estruturada; Funções 35
function s = soma3(a,b,c) x = a + b s = x + c end
>> soma3(1,3,5) x = 4 s = 9 ans = 9 >> z = soma3(1,3,5) x = 4 s = 9 z = 9 >>
>> z z = 9 >> a error: ’a' undefined near line 1 column 1 >> x error: ’x' undefined near line 1 column 1 >> s error: 's' undefined near line 1 column 1 >>
Funções
15 Março 2017 Programação Estruturada; Funções 36
function x = incrementa(x) x = x + 1 end
>> x = 4 x = 4 >> incrementa(x) x = 5 ans = 5 >> x x = 4 >> clear x >> error: ’x' undefined ...
>> y = 4 y = 4 >> z = incrementa(y) x = 5 z = 5 >> y = incrementa(y) x = 5 y = 5 >> x >> error: ’x' undefined ... >>
Funções
function res = soma(a,b)
res = a+b
end l Último detalhe:
• Não queremos ver res no cálculo intermédio
15 Março 2017 Programação Estruturada; Funções 37
>> 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 ;
;
15 Março 2017 Programação Estruturada; Funções 38
>> soma(2,5) ans = 7 >>
>> soma(2,5) res = 7 ans = 7 >>
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.
• Só “sai” da função uma cópia do valor da variável indicada na assinatura da função:
15 Março 2017 Programação Estruturada; Funções 39
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.
15 Março 2017 Programação Estruturada; Funções 40
>> x = soma(2,5) warning: soma: some elements in list of return values are undefined x = [](0x0) >>
function res = soma(a,b) s = a + b end
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.
15 Março 2017 Programação Estruturada; Funções 41
>> soma = 0 soma = 0 >> s = soma(2,5) >> error: A(I,J): row index out of bounds; value 2 out of bound 1 >> clear soma >> s = soma(2,5) >> s = 7 >>
function res = soma(a,b) s = a + b end
Um Problema
l Calcular pH do ácido benzóico
• (mas pode ser de outro ácido.)
l Variáveis (parâmetros do problema)
• Ka , Ci
l Passos semelhantes
• Fórmula resolvente para obter x
• Calcular logaritmo de base 10 para pH
15 Março 2017 Programação Estruturada; Funções 42
Um Problema
l Calcular pH do ácido benzóico 0.01M
• C6H5COOH ↔ H+ + C6H5COO-
• Ka = 6.5 x 10-5 (constante de dissociação – mais depois)
l Como resolver
• sendo x = [H+] = [C6H5COO-]
• Ka = x2 / (Ci – x)
• x2 + Ka x – Ci Ka = 0
• pH = - log10(x)
15 Março 2017 Programação Estruturada; Funções 43
Como implementar
l Compreender totalmente o problema
• dados de entrada
• resultado e saída
15 Março 2017 Programação Estruturada; Funções 44
Como implementar
l Compreender totalmente o problema
l Algoritmo
• decompor o problema
• saber como resolver cada parte • Usar fórmula resolvente para obter x • Calcular -logaritmo de x
15 Março 2017 Programação Estruturada; Funções 45
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 + Ka x – Ci Ka = 0
15 Março 2017 Programação Estruturada; Funções 46
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 • function pH = calculaPh(Ka,Ci)
• calcula o pH usando raizmaior
15 Março 2017 Programação Estruturada; Funções 47
Como implementar
l Apesar de ainda não estarem implementadas as funções “auxiliares”, a função calculaPH já pode ser completamente definida.
l Naturalmente temos de implementar e testar as funções auxiliares, antes de poder testar esta função.
15 Março 2017 Programação Estruturada; Funções 48
function pH = calculaPh(Ka, Ci) % calculaph(Ka, Ci) % calcula o pH de um acido fraco monoprotico, dados: % Ka: constante de dissociacao % Ci: concentracao H = raizMaior(1, ka, -Ka*Ci)
pH = -log10(H) end
x2 + Ka x – Ci Ka = 0
Como implementar
l A função raizMaior pode ser calculada a partir duma função que devolva as raízes de uma equação do 2º grau.
l No entanto podemos simplificar esta função, retornado apenas o valor da maior raiz (com o + na fórmula resolvente) e sem nos preocuparmos com os casos de raízes imaginárias.
15 Março 2017 Programação Estruturada; Funções 49
function x = raizMaior(a, b, c) % raizMaior(a, b, c) % calcula a maior raiz da equação de grau 2 % com termos a, b, c d = sqrt(b^2 - 4*a*c)
x = (-b + d)/(2*a) end
Testes Unitários
l É importante testar cada função individualmente
• é mais fácil diagnosticar e corrigir erros se sabemos onde ocorrem
• depois da função estar implementada e testada já não precisamos pensar nessa parte do problema
15 Março 2017 Programação Estruturada; Funções 50
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
• só assim podemos identificar erros lógicos e numéricos, que não produzem mensagens de erro.
15 Março 2017 Programação Estruturada; Funções 51
Testar a Função
l Pensamos num caso com solução conhecida.
• x2 - 4x + 4 = 0 (a = 1, b = -4, c = 4) • deve dar x = 2
l Experimentamos
15 Março 2017 Programação Estruturada; Funções 52
>> raizMaior(1,-4,4) ans = 2 >>
✓
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 ...
✓
15 Março 2017 Programação Estruturada; Funções 53
>> raizmaior(1, 0, 0) ans = 0 >>
Testar a Função
l Uma vez testadas as funções auxiliares já se pode testar a função principal.
15 Março 2017 Programação Estruturada; Funções 54
function pH = calculaPh(Ka, Ci) % calculaph(Ka, Ci) % calcula o pH de um acido fraco monoprotico, dados: % Ka: constante de dissociacao % Ci: concentracao H = raizMaior(1, ka, -Ka*Ci)
pH = -log10(H) end >> calculaPh(6.5e-5,0.01) ans = 3.1110 >>
O mesmo resultado que se obteve com o script benzoico
✓
Decomposição de Funções
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 • Permite obter aprovação a ICE...
15 Março 2017 Programação Estruturada; Funções 55
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
• esta parte já está feita
15 Março 2017 Programação Estruturada; Funções 56
Um Problema Semelhante
l pH dada a massa molar, massa em solução, volume e Ka.
• function x = raizMaior(a,b,c) • calcula a maior 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
• function pH = phMassVol(mass,vol,massMol,Ka) • calcula concentração e chama calculaph
15 Março 2017 Programação Estruturada; Funções 57
Um Problema Semelhante
l pH dada a massa molar, massa em solução, volume e Ka.
15 Março 2017 Programação Estruturada; Funções 58
function pH = phMassVol(mass, vol, massMol, Ka) % phMassVol(mass, vol, massMol, Ka) % calcula o pH de um acido fraco monoprotico, dados: % mass: massa do acido % vol: volume da solucao % massMol: massa molar do acido % Ka: constante de dissociacao Ci = (mass/massMol)/vol; % concentracao molar inicial
pH = calculaPh(Ka, Ci) end
Um Problema Semelhante
l Podemos igualmente testar esta nova função.
15 Março 2017 Programação Estruturada; Funções 59
>> phmassvol(1.2212,1,122.12,6.5e-5) ans = 3.1110 >> phmassvol(0.01,0.25,122.12,6.5e-5) ans = 3.9319
resultado anterior ✓
function pH = phMassVol(mass, vol, massMol, Ka) % phMassVol(mass, vol, massMol, Ka) % calcula o pH de um acido fraco monoprotico, dados: % mass: massa do acido % vol: volume da solucao % massMol: massa molar do acido % Ka: constante de dissociacao Ci = (mass/massMol)/vol; % concentracao molar inicial
pH = calculaPh(Ka, Ci) end
resultado correcto ✓
Testes: quatro tipos de erro
l Erro de sintaxe
• na interpretação do código fonte • parênteses, plicas, operadores em falta, … • Erros de afectação
>> 6 + * 12 parse error: syntax error >>> 6 + * 12 ^ >> a + 2 = 6 parse error: invalid left hand side of assignment >>> a+2 = 6 ^
15 Março 2017 Programação Estruturada; Funções 60
Testes: quatro tipos de erro
l Erro de execução
• o programa é interrompido • variável não definida, • função não definida, …
15 Março 2017 Programação Estruturada; Funções 61
>> clear x >> y = x + 1 error: 'x' undefined near line 1 column 5 >> x = f(5) error: ‘f' undefined near line 1 column 5 >>
Testes: quatro tipos de erro
l Erro lógico
• não há mensagem de erro mas o resultado está errado
• Só podem ser detectados através dos testes (unitários)
15 Março 2017 Programação Estruturada; Funções 62
function x = raizMaior(a, b, c) % raizMaior(a, b, c) d = sqrt(b^2 - 4*a*c)
x = (-b + d)/ 2 % ERRO: falta o a no denominador end
>> raizmaior(1, -4, 4) ans = 2 >> raizmaior(2, -4, 2) ans = 2 >>
• resultado correcto ?? com a = 1 o erro não se revela • resultado incorrecto !! ans deveria ser 1
✓
✗
Testes: quatro tipos de erro
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.
• Especialmente importantes se os cálculos são iterados um número muito grande de vezes
>> x = sin(pi) x = 1.2246e-16 >> 2 - sqrt(2)^2 ans = -4.4409e-16 >>
15 Março 2017 Programação Estruturada; Funções 63
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), 28 = 256 possibilidades
• 00000000 … 11111111 em binário • 0 … 255 em decimal
15 Março 2017 Programação Estruturada; Funções 64
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 • -2147483648 … 2147483647 intmin intmax
• NOTA: Cálculos que ultrapassem estes limites “dão erro”
15 Março 2017 Programação Estruturada; Funções 65
Representação de Inteiros
l 32 bits para representar um inteiro
• Funções (constantes) intmax e intmin
>> intmax ans = 2147483647 >> intmax+10 ans = 2147483647 >> (intmax+10)-intmax ans = 0 >> intmin ans = -2147483648 >> intmin -10 ans = -2147483648
15 Março 2017 Programação Estruturada; Funções 66
???
???
???
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)
• r = (-1) Sinal × Fracção × 2 Expoente
* Em precisão dupla, por omissão em MATLAB. Em precisão simples são 32 bits.
Sinal Fracção Expoente
15 Março 2017 Programação Estruturada; Funções 67
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
• ±1.1921 x 10-7 em precisão simples
15 Março 2017 Programação Estruturada; Funções 68
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:
>> eps ans = 2.2204e-016 >> (1+eps) - 1 ans = 2.2204e-016 >> eps/2 ans = 1.1102e-16 >> (1+eps/2) - 1 ans = 0
15 Março 2017 Programação Estruturada; Funções 69
???
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
15 Março 2017 Programação Estruturada; Funções 70
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 vossos programas como scripts. Sempre funções
15 Março 2017 Programação Estruturada; Funções 71
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.
• sem saber escrever funções não se faz praticamente nada em MATLAB...
15 Março 2017 Programação Estruturada; Funções 72
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 • e voltar à edição as vezes que for preciso...
15 Março 2017 Programação Estruturada; Funções 73
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 • dá pior nota a ICE
15 Março 2017 Programação Estruturada; Funções 74
Estilo de Código
l Nomes de variáveis: • Descritivos, começando em minúscula e indicando
diferentes palavras com maiúscula. • Exemplos: mass, vol, massMol
15 Março 2017 Programação Estruturada; Funções 75
function pH = phMassVol(mass, vol, massMol, Ka) % phMassVol(mass, vol, massMol, Ka) % calcula o pH de um acido fraco monoprotico, dados: % mass: massa do acido % vol: volume da solucao % massMol: massa molar do acido % Ka: constante de dissociacao Ci = (mass/massMol)/vol; % concentracao molar inicial
pH = calculaPh(Ka, Ci) end
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.
• Exemplos: • a, b, c e x na fórmula resolvente, ou • Ka, Ci e pH
15 Março 2017 Programação Estruturada; Funções 76
function x = raizMaior(a, b, c) % raizMaior(a, b, c) d = sqrt(b^2 - 4*a*c)
x = (-b + d)/ 2 % ERRO: falta o a no denominador end
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) • ou underscore (_) para separar temos (e.g. ph_mass_vol)
15 Março 2017 Programação Estruturada; Funções 77
function pH = phMassVol(mass, vol, massMol, Ka) % phMassVol(mass, vol, massMol, Ka) % ... Ci = (mass/massMol)/vol; % concentracao molar inicial
pH = calculaPh(Ka, Ci) end
function pH = phMassVol(mass, vol, massMol, Ka) % phMassVol(mass, vol, massMol, Ka) % ... Ci = (mass/massMol)/vol; % concentracao molar inicial
pH = calculaPh(Ka, Ci) end
Estilo de Código
l Indentação: Devem descrever o que a função faz. • Cada bloco de código é alinhado à esquerda e indentado
para indicar a que parte pertence (voltaremos a isto nas próximas aulas quando o código se tornar mais complexo).
15 Março 2017 Programação Estruturada; Funções 78
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. • Também se deve evitar linhas demasiado longas, dividindo
expressões complexas em vários passos.
15 Março 2017 Programação Estruturada; Funções 79
function pH = calculaPh(Ka, Ci) % calculaph(Ka, Ci) % calcula o pH de um acido fraco monoprotico, dados: % Ka: constante de dissociacao % Ci: concentracao H = raizMaior(1, ka, -Ka*Ci)
pH = -log10(H) end
function pH = phMassVol(mass, vol, massMol, Ka) % phMassVol(mass, vol, massMol, Ka) % ... Ci = (mass/massMol)/vol; % concentracao molar inicial
pH = calculaPh(Ka, Ci) end
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. • Outros comentários também devem ser acrescentados sempre
que forem úteis para esclarecer algum ponto do funcionamento do código.
15 Março 2017 Programação Estruturada; Funções 80
Estilo de Código
l Mais (muito mais...) sobre estilo em: • MATLAB Programming Style Guidelines, por Richard
Johnson, 2003 • ver http://www.datatool.com/prod02.htm
15 Março 2017 Programação Estruturada; Funções 81
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
• Generalizar a solução
15 Março 2017 Programação Estruturada; Funções 82
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 • e testar, testar, testar...
15 Março 2017 Programação Estruturada; Funções 83
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, ...) • Indentação, documentação e comentários
15 Março 2017 Programação Estruturada; Funções 84
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 • (tem mais matéria do que é dada nesta disciplina)
15 Março 2017 Programação Estruturada; Funções 85
Dúvidas ?
15 Março 2017 Programação Estruturada; Funções 86