29
ICE-B 3 - Programação Estruturada Ludwig Krippahl

3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

Embed Size (px)

Citation preview

Page 1: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

ICE-B

3 - Programação Estruturada

Ludwig Krippahl

Page 2: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

1

Programação Estruturada

Resumo■ Exemplo: cálculo de pH■ Nomes: contexto e importação■ Programação estruturada■ Criar funções

Page 3: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

2

Programação Estruturada

Exemplo:Calcular pH

Page 4: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 5: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 6: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 7: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 8: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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)

Page 9: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 10: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

9

Programação Estruturada

Programação Estruturada

Page 11: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 12: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 13: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 14: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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)

Page 15: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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)

Page 16: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 17: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 18: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 19: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 20: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 21: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

20

Programação Estruturada

Algoritmos e Decomposição

Page 22: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 23: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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)

Page 24: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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)

Page 25: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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.

Page 26: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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

Page 27: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

26

Programação Estruturada

Resumo

Page 28: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar

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.

Page 29: 3 - Programação Estruturadaiceb.ssdi.di.fct.unl.pt/1718/files/ICE-B-03.pdf · Programação Estruturada Resumo Problemas com a programação não estruturada • Difícil adaptar