ICE-B
3 - Programação Estruturada
Ludwig Krippahl
1
Programação Estruturada
Resumo■ Exemplo: cálculo de pH■ Nomes: contexto e importação■ Programação estruturada■ Criar funções
2
Programação Estruturada
Exemplo:Calcular pH
3
Calcular pH
Solução de ácido benzóicoC H COOH H + C H COO6 5 ⇔
+6 5
−
■ Constante de dissociação, ■ Ignorando auto-dissociação da água:
■ Resolvemos equação quadrática,
■ Aproximação do logaritmo:
= 6.5 ×Ka 10−5
= = ⇔ + x − = 0Ka
[ ][ CO ]H+ C6H5 O−
[ COOH]C6H5
x2
− xCi
x2 Ka CiKa
x =−b± −4acb2√
2a
ln(x) = n( − 1)limn→∞
x1/n
pH = −lo ([ ]) = −lo (x) ≈ −g10 H+ g101000( − 1)x1/1000
2.305
4
Calcular pH
Solução de ácido benzóico■ Criamos ficheiro (e.g. pH.py)• Nota: codificação do ficheiro e documentação do módulo
# -*- coding: utf-8 -*- """ Compute pH """ Ci = 0.01 Ka = 6.5e-5 x=(-Ka + (Ka**2 + 4*Ka*Ci)**0.5)/2 pH = - (1000 * (( x**(1/1000)) -1) ) / 2.305 print(pH)
■ Criamos variáveis■ Solução positiva da equação quadrática■ Calculamos o pH pela aproximação do logaritmo
5
Calcular pH
Solução de ácido benzóico■ Criamos ficheiro (e.g. pH.py)
# -*- coding: utf-8 -*- """ Compute pH """ Ci = 0.01 Ka = 6.5e-5 x=(-Ka + (Ka**2 + 4*Ka*Ci)**0.5)/2 pH = - (1000 * (( x**(1/1000)) -1) ) / 2.305 print(pH)
■ Executamos o script (F5 no Spyder)
In : runfile('/pasta/ph.py', wdir='/pasta') 3.0966814683742805
6
Calcular pH
Problemas com esta implementação:■ Primeiro: calcular o logaritmo é um problema comum• Não é prático estar sempre a inventar a roda
■ Existe uma função log10 no módulo numpy• Um módulo em Python é um ficheiro de código fonte (.py)
• Em cada módulo temos acesso aos nomes no namespace do módulo e nomes nonamespace especial das instruções padrão do Python (built-in)
• Podemos importar um nome para o nosso o namespace do nosso módulo com ainstrução import
7
Calcular pH
Problemas com esta implementação:■ Primeiro: calcular o logaritmo é um problema comum• Não é prático estar sempre a inventar a roda
■ Vamos usar a função log10 do módulo numpy• Podemos importar o módulo e aceder à sua função (o módulo é um objecto)
• Ou importar a função do módulo para o nosso módulo
# -*- coding: utf-8 -*- """ Compute pH """ import numpy Ci = 0.01 Ka = 6.5e-5 x=(-Ka + (Ka**2 + 4*Ka*Ci)**0.5)/2 pH = - numpy.log10(x) print(pH)
# -*- coding: utf-8 -*- """ Compute pH """ from numpy import log10 Ci = 0.01 Ka = 6.5e-5 x=(-Ka + (Ka**2 + 4*Ka*Ci)**0.5)/2 pH = - log10(x) print(pH)
8
Calcular pH
Problemas com esta implementação:■ Primeiro: calcular o logaritmo é um problema comum• Não é prático estar sempre a inventar a roda• Vamos usar a função log10 do módulo numpy
■ Segundo: não está estruturado• O script é uma receita que faz só este cálculo, tudo seguido
• Não facilita reutilização
• Não generaliza
• Não se adapta bem a outros problemas• A dificuldade aumenta rapidamente com a complexidade do problema
■ Importar a função log10 foi uma boa ideia• Reutilizámos uma solução já existente
Solução: Programação Estruturada
9
Programação Estruturada
Programação Estruturada
10
Programação Estruturada
Programação estruturada■ Um problema complexo pode ser decomposto em sub-problemas
simples■ As soluções para os sub-problemas podem ser reutilizadas noutros
problemas complexos
11
Programação Estruturada
Programação estruturada em Python■ Módulos (ficheiros .py) permitem organizar o código fonte• A separação em grupos relacionados de elementos facilita a criação e
compreensão do código
• A possibilidade de importar módulos ou elementos permite a reutilização
■ Funções• Uma função é um pequeno programa autónomo que resolve um sub-problema
• É mais fácil implementar uma peça de cada vez
• Sendo programas autónomos podem ser encadeados sem interferência
12
Funções
Funções em Python■ Uma função em Python é um objecto criado pela instrução def
seguida de:• Nome da função: um nome válido, como os das variáveis
• Parênteses, dentro dos quais estarão os parâmetros da função, se houver
• Dois pontos: indicando o início do corpo da função
■ Esta linha é a assinatura da função■ A seguir, indentado, vem o corpo da função
def add(a,b): result = a + b return result
13
Funções
Funções em Python■ Uma função em Python é um objecto criado pela instrução def■ Depois de criada, a função pode ser executada invocando-a pelo
seu nome seguido de parênteses, dentro dos quais estarão osargumentos, se houver
• Parâmetros: variáveis na assinatura da função que irão receber os argumentos
• Argumentos: valores fornecidos à função (podem estar também em variáveis)
def add(a,b): result = a + b return result total = add(3,5)
14
Funções
Funções em Python■ Uma função em Python é um objecto criado pela instrução def■ Depois de criada, a função pode ser executada invocando-a pelo
seu nome seguido de parênteses, dentro dos quais estarão osargumentos, se houver
■ A execução termina em return, devolvendo o valor que se seguir• Se não houver valor ou return, devolve None
■ O código indentado ao nível do def está fora da função.
def add(a,b): result = a + b return result total = add(3,5)
15
Funções
Funções em Python■ Uma função em Python é um objecto, mas é executável quando
seguido de parênteses
def add(a,b): result = a + b return result
In : total = add(3,5) In : total Out: 8 In : add Out: <function __main__.add> In : add(total,4) Out: 12 In : add(10,-24) Out: -14
16
Erros comuns
■ A função precisa de receber todos os argumentos
def add(a,b): result = a + b return result
In : add(3) TypeError: add() missing 1 required positional argument: 'b'
■ Os parâmetros têm de ser variáveis
def add_four(a,4): result = a + 4 return result
In : runfile('/pasta/add.py', wdir='/pasta') File "/pasta/add.py", line 9 def add_four(a,4): ^ SyntaxError: invalid syntax
17
Namespaces
A função tem o seu espaço próprio de nomes■ As variáveis internas da função não são acessíveis fora da função
def add(a,b): result = a + b return result
In : add(3,5) Out: 8 In : a NameError: name 'a' is not defined In : result NameError: name 'result' is not defined
18
Namespaces
A função tem o seu espaço próprio de nomes■ As variáveis internas da função não são acessíveis fora da função■ As variáveis criadas na função escondem variáveis com o mesmo
nome fora da função
def add(a,b): result = a + b return result
In : result = 1 In : a = 10 In : add(3,5) Out: 8 In : a Out: 10 In : result Out : 1
19
Namespaces
A função tem o seu espaço próprio de nomes■ As variáveis internas da função não são acessíveis fora da função■ As variáveis criadas na função escondem variáveis com o mesmo
nome fora da funçãoIsolar as variáveis é importante■ Se variáveis com o mesmo nome em funções diferentes referissem
os memos objectos, uma função podia impedir outra de funcionar■ Por isso é importante que as variáveis locais (criadas em cada
função) sejam independentes■ É uma parte importante da programação estruturada
20
Programação Estruturada
Algoritmos e Decomposição
21
Algoritmo
Algoritmo:■ Sequência de operações para resolver um problemaMuhammad ibn Mūsā al-Khwārizmī■ Matemático árabe do século XII■ Introduziu os "numerais indianos": algarismos■ Descreveu métodos para resolver algumas equações: algoritmos
22
Algoritmo
"Algoritmo" da torrada:1 Pegar no pão 2 Se a faca está na mesa Condição Pegar na faca Ramo 1 Caso contrário: Tirar faca da gaveta Ramo 2 3 Cortar uma fatia de pão 4 Pôr a fatia na torradeira 5 Enquanto não está torrado: Ciclo condicional Espera Instruções repetidas
Teorema de Böhm-Jacopini:■ Qualquer problema computacional pode ser resolvido combinando
sub-programas de três formas:• Sequencialmente• Condicionalmente, ramificando a execução (mais tarde)• Repetindo até certa condição se verificar (mais tarde)
23
Decomposição
"Algoritmo" da torrada:1 Pegar no pão 2 Encontrar a faca Sub-problema 1 3 Cortar uma fatia de pão 4 Torrar o pão Sub-problema 2
■ Resolver um problema complexo como problemas mais simples■ Encontrar onde "desmanchar" o problemaEm Python:■ Decompomos o problema usando funções• (e módulos, para programas grandes)
24
Decomposição
Decompor o problema■ Requisitos: o que queremos obter?■ Algoritmo: como é que podemos obter o resultado?■ Decomposição: em que partes é mais conveniente partir?• Fazer o mesmo para cada parte: compreender os requisitos e algoritmo, decompor
conforme necessário
■ Generalização: a solução de cada sub-problema pode sergeneralizada abstraíndo dos detalhes algo mais genérico.
■ Implementação: só depois de perceber tudo é que começamos aescrever as funções.
25
Calcular pH
Solução de ácido benzóicofrom numpy import log10 Ci = 0.01 Ka = 6.5e-5 x=(-Ka + (Ka**2 + 4*Ka*Ci)**0.5)/2 pH = - log10(x) print(pH)
■ Queremos o pH.■ Sabemos o algoritmo■ Decompor: calcular x; calcular pH■ Generalizar: resolver equação quadrática■ Implementar: escrever as funções
26
Programação Estruturada
Resumo
27
Programação Estruturada
Resumo■ Problemas com a programação não estruturada• Difícil adaptar e reutilizar• Dificuldade aumenta rapidamente com a complexidade (tudo interage)
• Obriga a resolver várias vezes o mesmo problema
■ Programação estruturada:• Funções, que isolam as variáveis permitindo separar as partes do problema
■ Decomposição: perceber o que se quer, pensar no algoritmo, partirem partes pequenas.
Leitura adicional:■ Recomendada: Capítulo 3 dos apontamentos■ Opcional: Livro, Cap. 16 até pag. 479 e Cap. 17 até pag. 491.