sábado, 2 de outubro de 2010

Problema 2.7

Resolver um problema quando se tem uma fórmula que liga directamente os dados ao resultado é simples. Mesmo assim podemos ter várias versões. Vejamos com o exemplo do cálculo do declive de uma recta conhecidas as coordenadas de dois dos seus pontos.


def declive(x1,y1,x2,y2):
"""
Calcula o declive de uma recta conhecidos dois dos seus pontos.
"""
return (y2 - y1) / (x2 - x1)

Mais simples não há! Com uma pequena mudança, introduzimos um nome, que associamos ao resultado.

def declive(x1,y1,x2,y2):
"""
Calcula o declive de uma recta conhecidos dois dos seus pontos.
"""
inclina = (y2 - y1) / (x2 - x1)
return inclina

Quando começamos a efectuar alguns testes, verificamos que há resultados incorrectos. Por exemplo, se tentarmos com os pontos (3,4) e (6,6) obtemos 0 e não o valor correcto 0.66. O problema está na divisão. Se os argumentos são inteiros o resultado será o quociente inteiro! Duas soluções para o problema. Uma é introduzir os dados como floats. Mas esta não é a melhor opção, pois coloca do lado do utilizador a responsabilidade de saber como foi definida a solução. Assim a melhor escolha, neste caso, é forçar uma das coordenadas a ser um float, no interior da definição.

def declive(x1,y1,x2,y2):
"""
Calcula o declive de uma recta conhecidos dois dos seus pontos.
"""
inclina = (float(y2) - y1) / (x2 - x1)
return inclina

Mas e se as abcissas forem iguais?


Evaluating ficha_2_2010_sol.py
Traceback (most recent call last):
File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 150, in
File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 83, in declive_2
ZeroDivisionError: float division


Oops! Como corrigir? Uma vez mais podemos acautelar isso aquando do uso do programa ou na própria definição. Neste último caso existem várias alternativas de que falaremos ao longo do curso. Passam todas por filtrar o caso que leva ao erro. Deixamos aqui a solução mais simples.

def declive_3(x1,y1,x2,y2):
"""
Calcula o declive de uma recta conhecidos dois dos seus pontos.
"""
if x1 == x2:
print 'Erro: as abcissas não podem ser iguais'
return False
else:
inclina = (float(y2) - y1) / (x2 - x1)
return inclina


A solução consiste em fazer um teste à condição de erro que, a verificar-se, leva à impressão de uma mensagem de erro e ao terminar do programa que devolve o objecto False.

Sem comentários:

Enviar um comentário