CSE 111: Programação com Funções

S03 – Atividade de Aprendizagem (2 de 2): Depurando Funções

O que você deveria fazer quando seu programa não está funcionando? Se o seu programa for pequeno, você pode examinar cada linha do programa. Entretanto, se o seu programa for grande ou contiver várias funções, há maneiras melhores de descobrir e corrigir os problemas, inclusive escrever e executar funções de teste, exibir valores e usar um depurador.

Conceitos

Aqui estão os conceitos e assuntos de programação em Python que você deve aprender durante esta aula.

Tipos de Erros

Em geral, há dois tipos de erros que um programador pode cometer: erros de sintaxe e erros de lógica. Ao cometer um erro de sintaxe, o programador escreve um código que viola as regras da linguagem, como esquecer um parêntese, os dois pontos no final de uma instrução if ou escrever incorretamente uma palavra-chave. Esse tipo de erro impede o programa de rodar e gera mensagens de erro. Já os erros de lógica não interrompem a execução, mas fazem o programa produzir resultados errados, sem exibir mensagens de erro.

Mensagens de Erro

Independentemente do tipo de erro (sintaxe ou lógica), se o computador exibir uma mensagem de erro durante a execução de um programa, a primeira coisa que um programador deve fazer é ler e entender a mensagem de erro. O Exemplo  1 mostra um programa Python simples que contém um erro de sintaxe. A mensagem que o computador exibiu devido ao erro de sintaxe é mostrada abaixo, no exemplo  1.

# Exemplo 1
def main():
    print("Você está surpreso, Renato?)
# Inicia este programa
# chamando a função main.
if __name__ == "__main__":
    main()
> python surpresa.py
  File "C:\Users\cse111\surpresa.py", line 3 
    print("Você está surpreso, Renato?)
          ^                        
SyntaxError: unterminated string literal (detected at line 3)

A mensagem de erro informa que o exemplo 1 contém um erro de sintaxe e que ele está na linha 3 do programa, onde há algo errado com a string. Ao examinar essa linha, percebemos que o programador esqueceu de digitar as aspas duplas de fechamento no final da string.

Se o computador exibir uma mensagem de erro que você não entende, você pode pesquisar o significado na internet. Basta copiar e colar a mensagem de erro na barra de pesquisa do seu navegador. Você pode encontrar informações sobre outros erros nesse endereço.

Instruções Print

Se o programa não mostrar mensagens de erro, mas produzir resultados incorretos, adicione instruções print em pontos estratégicos para verificar os valores das variáveis e localizar o problema. O Exemplo 2 mostra um cálculo de saldo de empréstimo com instruções print usadas para depuração no início das funções e durante os cálculos.

# Exemplo 2
def main():
  print("Este programa calcula e exibe o saldo restante")
  print("de um empréstimo com uma porcentagem anual fixa")
  print("e um número fixo de parcelas por ano.")
  print()
  print("Por favor, insira os cinco valores a seguir.")

  principal = float(input("Valor principal do empréstimo: "))
  taxa_anual = float(input("Taxa de juros anual (%): "))
  anos = int(input("Número de anos de duração do empréstimo: "))
  pagamentos_por_ano = int(input("Número de pagamentos por ano: "))
  parcelas_pagas = int(input("Número de parcelas pagas: "))

  saldo = calcular_saldo(principal, taxa_anual, anos,
          pagamentos_por_ano, parcelas_pagas)

  print()
  print(f"Saldo restante: {saldo}")


def calcular_saldo(princ, ta, anos, ppa, pp):
  """Calcula e retorna o saldo restante de um empréstimo."""
  pagamento = calcular_pagamento(princ, ta, anos, ppa)
  # Exibe os valores de variáveis para depuração

  print()
  print(f"calcular_saldo({princ}, {ta}, {anos}, {ppa}, {pp})")
  
  taxa = ta / ppa
  potencia = (1 + taxa) ** pp
  # Exibe os valores de variáveis para depuração
  print(f" pagamento: {pagamento}  taxa: {taxa} potência: {potencia}")
  
  saldo = princ * potencia - pagamento * (potencia - 1) / taxa
  # Exibe os valores de variáveis para depuração
  print(f"   saldo: {saldo:.2f}")
  
  return round(saldo, 2)


def calcular_pagamento(princ, ta, anos, ppa):
  """Calcula e retorna o pagamento por período de um empréstimo."""
  # Exibe os valores de variáveis para depuração
  print()
  print(f"calcular_pagamento({princ}, {ta}, {anos}, {ppa})")
  
  taxa = ta / ppa
  n = anos * ppa
  # Exibe os valores de variáveis para depuração
  print(f" taxa: {taxa} n: {n}")
  
  pagamento = princ * taxa / (1 - (1 + taxa) ** -n)
  # Exibe os valores de variáveis para depuração
  print(f" pagamento: {pagamento:.2f}")
  
  return round(pagamento, 2)

  # Inicia este programa
# chamando a função main.
if __name__ == "__main__":
    main()
> python balance.py
Este programa calcula e exibe o saldo restante 
de um empréstimo com uma porcentagem anual fixa
e um número fixo de parcelas por ano.

Por favor, insira os cinco valores a seguir.
Valor principal do empréstimo: 80000
Taxa de juros anual (%): 0.06
Número de anos de duração do empréstimo: 15
Número de pagamentos por ano: 12
Número de parcelas pagas: 45

calcular_pagamento(80000.0, 0.06, 15, 12)
    taxa: 0.005 n: 180
    pagamento: 675.09

calcular_saldo(80000.0, 0.06, 15, 12, 45)
    pagamento: 675.09  taxa: 0.005: potência: 1.2516208207696773
    saldo: 66156.33

Saldo restante: 66156.33

As instruções print são fáceis de usar e costumam ajudar, mas nem sempre são o método mais eficaz para localizar erros de lógica.

Funções de Teste

Muitos programadores não percebem o quanto funções de teste podem ajudar a encontrar erros de lógica. Com frequência, escrevem o programa completo e só depois tentam testá-lo seguindo etapas como as mostradas abaixo.

  1. Executam o programa e digitam a entrada como um usuário faria.
  2. Examinam a saída do programa e descobrem que ela está incorreta.
  3. Analisam todo o código do programa, fazem algumas pequenas alterações e adicionam instruções print.
  4. Repetem os passos 1 a 3 várias vezes, despendendo bastante tempo tentando encontrar e corrigir os erros.

Esse método de correção é demorado, pois o programador tenta testar o programa inteiro de uma só vez. O ideal é testar cada função separadamente, escrevendo e executando funções de teste, como explicado na aula anterior.

Usando um Depurador

Um depurador é uma ferramenta de desenvolvimento que permite ao programador acompanhar a execução do programa passo a passo e observar os valores das variáveis. É um recurso muito eficaz para encontrar erros, e quase todas as linguagens e ambientes de programação incluem um. Desenvolvedores profissionais usam depuradores com frequência, e a maioria das empresas exige que a linguagem de programação possua essa ferramenta.

O Python inclui um depurador que pode ser usado diretamente no VS Code. É muito mais fácil aprender vendo alguém utilizá-lo do que apenas lendo sobre o assunto. Assista ao vídeo a seguir, que mostra um professor da BYU-Idaho usando o depurador no VS Code para encontrar erros em um programa.

Assista ao vídeo da Atividade de Aprendizagem: Depurando Funções para aprender a usar o depurador Python no VS Code.

O depurador também é uma ótima ferramenta de aprendizado. Ao percorrer o programa passo a passo e observar os valores das variáveis após cada instrução, você vê exatamente como o Python funciona. Experimente: se ainda não domina if-elif-else, laços while e for, a passagem de parâmetros ou o retorno de um valor de uma função, coloque um ou mais pontos de interrupção em um programa que contenha esses elementos, execute-o no depurador e avance linha a linha, prevendo como a próxima instrução mudará as variáveis.

Resumo

Nesta aula, você aprendeu a diferença entre erros de sintaxe e de lógica. Os erros de sintaxe violam as regras da linguagem e impedem o programa de rodar; já os erros de lógica permitem a execução, mas geram resultados incorretos. Para encontrá-los e corrigi-los, você pode usar funções de teste, instruções print e o depurador.

Atividade

Finalidade

Pratique o uso do depurador Python no VS Code.

Tarefa

Faça o seguinte:

  1. Baixe e salve o arquivo exemplo-2.py.
  2. Abra o exemplo-2.py no VS Code.
  3. Assista ao vídeo da Atividade de Aprendizagem: Depurando Funções para aprender a usar o depurador Python no VS Code.

Ponderar

Ao usar o depurador para percorrer o programa exemplo-2.py, você aprendeu algo novo sobre o Python e como as funções funcionam? Você acha que o depurador pode ajudar a encontrar erros no seu código?

Envio

Quando terminar, retorne ao Canvas e reporte seu progresso no Questionário S03: Testando e Corrigindo Funções.

Links Úteis: