Instituto Federal de Mato Grosso do SulJunho/2023
08. Subprogramas
Construção de Algoritmos
Prof. Rodrigo Duran
Nesta aula vamos:
-
Aprender como usar e definir subprogramas
Usar subprogramas tem inúmeras vantagens (e alguns dizem que seu uso é até obrigatório): ajuda a organizar o código e nos permite conter possíveis efeitos colaterais, ajuda no processo de debug do código, permite o reaproveitamento de código e torna o código mais legível.
USANDO SUBPROGRAMAS
Por que reinventar a roda?
O que são subprogramas?
Um subprograma (ou função) é uma implementação de uma funcionalidade específica. Por exemplo, um subprograma pode calcular um resultado, registrar alguns dados úteis na memória do computador ou imprimir uma mensagem. Ou pode executar uma combinação específica de tais tarefas.
Os programadores podem criar subprogramas e, em seguida, usar o que criaram. Eles também podem usar subprogramas criados por outros programadores. Em geral, um programa completo contém muitos subprogramas.
Regra #24: Uma função é um componente do programa que se encarrega de uma tarefa específica.
Regra #25: Você não precisa saber como uma função foi implementada (seu código fonte) para utiliza-la. Você pode executar funções de bibliotecas, que podem fazer parte do sistema ou serem fornecidas por outras pessoas.
Exemplos de funções
Na verdade, nós já utilizamos certas funções há um certo tempo...
Por exemplo, onde está o código fonte do len()?
O que nós sabemos sobre o len()?
- Ele retorna um valor Numeric que corresponde ao número de elementos em uma lista
- Ela aceita um argumento: uma lista
- De alguma forma o Python se encarrega de contar quantos elementos existem dentro da lista e retornar este valor.
- Nós não sabemos, nem precisamos saber, como ela é executada: só precisamos fornecer o argumento de forma correta e coletar o valor resultante. Os detalhes ficam ocultos.
Tipos de Funções
Não é sempre que uma função retorna um resultado. Existem algumas funções que só realizam uma determinada tarefa e não retornam um valor -- muitas vezes essas funções são chamadas de procedimentos. Por exemplo, nós já utilizamos o procedimento print() há algum tempo...
O que nós sabemos sobre o print()?
- Ela não retorna um resultado. Isso não quer dizer que ela não faça nada!
- Retornar um resultado significa apenas que um valor (String, Numeric, lista, etc.) pode ser usado como uma expressão de retorno da função.
- Por exemplo, a funcionalidade do
print()é mostrar uma expressão no console. - Nós não precisamos saber como a função faz isso. Apenas saber o que ela faz
- Devemos saber também que tipo de argumentos ela "precisa": nesse caso, uma expressão de qualquer tipo
Regra #26: Para executar uma função, escreva seu nome para "chamá-la"
Regra #27: A chamada de uma função possui zero ou mais argumentos
Regra #28: Argumentos são expressões
Regra #29: Se a função retornar um algo, ela também retorna uma expressão
Exemplos de funções "prontas" em Python (Modules)
No Python é possível tanto usar funções e variáveis já embutidas em "arquivos" de terceiros ou criar o seu próprio módulo (Module)
import math
print(math.ceil(2.9))
Também é possível importar apenas alguns componentes do módulo. Estes componentes podem ser renomeados.
from math import ceil as arredonda
print(arredonda(2.9))
math.pow(x, y): retorna o valor de xy
n = math.pow(3,2)
n = math.pow(2,4)
math.sqrt(Number): retorna a raiz quadrada de Number
let n = math.sqrt(9)
math.dist(ponto1, ponto): retorna a distância entre dois pontos
p1 = [3,3]
p2 = [6,12]
d = math.dist(p1,p2)
Vocês podem acessar todas as funções disponíveis do módulo math aqui.
Funções como expressões
As funções que retornam um valor podem ser usadas normalmente como expressões, inclusive como argumentos de outras funções!
import math
a = 1
b = 2
c = -15
x1 = ((-1 * b) + math.sqrt(math.pow(b,2) - (4*a*c)))/2*a
print(x1)
CRIANDO NOSSOS PRÓPRIOS SUBPROGRAMAS
Para quando precisarmos criar a roda. E para que outros usem a roda que criamos. E para ter certeza que a roda funciona...
Criando funções customizadas
Até agora, vimos como utilizar funções prontas (ou em módulos). Elas são muito úteis e fáceis de usar. Mas nem sempre atendem às nossas necessidades. Por exemplo, imagine que precisemos calcular a média de cada aluno na disciplina de Construção de Algoritmos:
media = (0.5*NP)+(0.3*NT)+(0.2*NA)
Você pode imaginar que devemos calcular essa média para centenas de alunos, logo seria prático ter um subprograma para isso. Vantagens:
- Nos permite isolar a funcionalidade. Se em algum momento algo estiver errado com o cálculo nós sabemos exatamente onde procurar.
- Algo errado com o cálculo da média não influi em nada no resto do código do programa
- Nós podemos compartilhar esse método de cálculo com outras pessoas (e em outros programas nossos também)
- Se algum dia precisarmos modificar a forma como a média é calculada, não impacta em outras partes do programa e nos permite testar facilmente essa alteração
- Como fica mais fácil isolar a funcionalidade, o nosso programa fica mais organizado e mais fácil de ser lido.
Para criar uma função customizada, basta utilizar a palavra def, especificar os parâmetros que a função aceita e escrever o código que ela deve executar (bloco). Caso a função retorne um resultado, a palavra return especifica qual a expressão será retornada.
Criando funções customizadas
Vocês devem ter calculado as raízes de equações algumas vezes utilizando a fórmula de Bhaskara. Como fazer subprogramas para calcular as raízes?
- O primeiro passo é entender quais são as etapas no cálculo: calcular o Delta, a raiz positiva e a raiz negativa
- Quais são os parâmetros? O que deve ser fornecido para o cálculo das raízes ? Os fatores que acompanham as variáveis X: a, b e c.
- Qual o processo? O processo será o corpo do nosso subprograma: é a própria formula de Bhaskara.
Uma palavra sobre escopo de variáveis...
Variáveis locais com nomes iguais podem gerar confusão. Variáveis fora de funções são denominadas Globais
