Você está na página 1de 46

Universidade

Federal de Viçosa
Departamento de Informática
Centro de Ciências Exatas e Tecnológicas
Introdução à Programação
Universidade Federal de Viçosa

INF 100 – Introdução à Programação

Funções
INF 100 –

(parte 1)

1
Motivação
• Exemplo de cálculo de usando o algoritmo proposto
x
INF 100 – Introdução à Programação

por Heron de Alexandria (Método de Newton):

1. Leia x
2. Faça r = x/2 # chute inicial para a raiz
3. Faça r = (r + x/r) / 2
4. Se |r² - x| > e, retorne ao passo 3
5. Escreva r

onde e = um erro estabelecido qualquer, por exemplo, 10-10.

Universidade Federal de Viçosa


2
Departamento de Informática
Motivação
• Possível implementação em Python:
INF 100 – Introdução à Programação

x = float( input('Entre com o valor de x: '))


r = x/2 # chute inicial para a raiz
while abs( r*r - x ) > 1e-10:
r = (r + x/r) / 2
print('Raiz de', x, '=', r )

Universidade Federal de Viçosa


3
Departamento de Informática
Motivação
• Imagine se tivéssemos que usar o Método de
INF 100 – Introdução à Programação

Newton sempre que fosse preciso calcular


uma raiz quadrada!
– Código confuso.
– Difícil reusar em outros programas.
– Fácil cometer erros.
– Por que preciso saber como calcular raiz (ou seno,
cosseno, logaritmo etc.) sempre que precisar
disso?

Universidade Federal de Viçosa


4
Departamento de Informática
Funções em Python
• Por isso usamos funções:
INF 100 – Introdução à Programação

import math

x = float( input('Entre com o valor de x: '))


r = math.sqrt( x )
print('Raiz de', x, '=', r )

Universidade Federal de Viçosa


5
Departamento de Informática
Funções em Python
• Outros exemplos de funções da biblioteca math:
INF 100 – Introdução à Programação

– log(x)
– log10(x)
– exp(x)
– sqrt(x)
– tan(x)
– sin(x)
– cos(x)
– …

Universidade Federal de Viçosa


6
Departamento de Informática
# Este programa calcula o dia e mês do Identificando oportunidades
# domingo de páscoa entre um ano inicial para reuso de código...
# e um ano final fornecidos pelo usuário
Prática 06
ano1 = int( input('Digite o ano inicial (1582 a 2499): '))
while ano1 < 1582 or ano1 > 2499:
INF 100 – Introdução à Programação

ano1 = int( input('Digite o ano inicial (1582 a 2499): '))

print()

ano2 = int( input('Digite o ano final (1582 a 2499) : '))


while ano2 < 1582 or ano2 > 2499:
ano2 = int( input('Digite o ano final (1582 a 2499) : '))

print('\nAno Data da Páscoa')


print('----------------------')
ano = ano1
while ano <= ano2:
...

Universidade Federal de Viçosa


7
Departamento de Informática
# Este programa calcula o dia e mês do Identificando oportunidades
# domingo de páscoa entre um ano inicial para reuso de código...
# e um ano final fornecidos pelo usuário
Prática 06
ano1 = int( input('Digite o ano inicial (1582 a 2499): '))
while ano1 < 1582 or ano1 > 2499:
INF 100 – Introdução à Programação

ano1 = int( input('Digite o ano inicial (1582 a 2499): '))

print()

ano2 = int( input('Digite o ano final (1582 a 2499) : '))


while ano2 < 1582 or ano2 > 2499:
ano2 = int( input('Digite o ano final (1582 a 2499) : '))

print('\nAno Data da Páscoa')


print('----------------------')
ano = ano1
while ano <= ano2:
...

Universidade Federal de Viçosa


8
Departamento de Informática
Identificando oportunidades
para reuso de código...
while True:
n = int( input('Entre com a quantidade de alunos: '))
if n < 2 or n > 50:
print('Valor deve estar entre 2 e 50')
INF 100 – Introdução à Programação

else:
break
soma = 0
for i in range(0, n):
while True:
x = int( input('Entre com a nota do próximo aluno: '))
if x < 0 or n > 100:
print('Valor deve estar entre 0 e 100')
else:
break
soma = soma + x
media = soma / n
print('Média das notas:', media )

Universidade Federal de Viçosa


9
Departamento de Informática
... Identificando oportunidades
para reuso de código...
while True:
n = int( input('Entre com a quantidade de alunos: '))
if n < 2 or n > 50:
print('Valor deve estar entre 2 e 50')
INF 100 – Introdução à Programação

else:
break
soma = 0
for i in range(0, n):
while True:
x = int( input('Entre com a nota do próximo aluno: '))
if x < 0 or n > 100:
print('Valor deve estar entre 0 e 100')
else:
break
soma = soma + x
media = soma / n

Universidade Federal de Viçosa


10
Departamento de Informática
# Este programa calcula o dia e mês do
Funções em Python
# domingo de páscoa entre um ano inicial
# e um ano final fornecidos pelo usuário

ano1 = leiaInt('Digite o ano inicial (1582 a 2499): ', 1582, 2499)


print()
INF 100 – Introdução à Programação

ano2 = leiaInt('Digite o ano final (1582 a 2499) : ', 1582, 2499)

print('\nAno Data da Páscoa')


print('----------------------')
ano = ano1
while ano <= ano2:
...

O código para a função leiaInt será apresentado mais adiante...

Universidade Federal de Viçosa


11
Departamento de Informática
Funções em Python
n = leiaInt('Entre com a quantidade de alunos: ', 2, 50)
soma = 0
for i in range(0, n):
x = leiaInt('Entre com a nota do próximo aluno: ', 0, 100)
INF 100 – Introdução à Programação

soma = soma + x
media = soma / n
print('Média das notas:', media )

O código para a função leiaInt será apresentado mais adiante...

Universidade Federal de Viçosa


12
Departamento de Informática
Funções em Python
• Vantagens do uso de funções:
INF 100 – Introdução à Programação

– Modularidade e clareza do código fonte.


– Reuso de software.
– Menores chances de erros.
– Separar o uso da função de seus detalhes de
implementação.
– Permitem pensar no algoritmo em mais alto nível
primeiro, para depois ir refinando ao nível de
comandos da linguagem de programação.

Universidade Federal de Viçosa


13
Departamento de Informática
Funções em Python
• Para criar uma função, devemos conhecer bem as
INF 100 – Introdução à Programação

suas necessidades:
– A função necessita de dados de entrada (parâmetros)?
– Se sim, quais dados?
– Espera-se que a função responda com alguma
informação?
– Se sim, qual ou quais?

• Essas perguntas devem ser respondidas enquanto se


projeta a função, e elas estarão especificadas na
declaração da mesma.
Universidade Federal de Viçosa
14
Departamento de Informática
Definição de uma função em Python
def nome( lista_de_parâmetros ):
INF 100 – Introdução à Programação

<comandos>
return <valor(es) de retorno>

• nome: nome usado para chamar (usar) a função.


• lista_de_parâmetros: dados (constantes,
variáveis) passados para a função.

Universidade Federal de Viçosa


15
Departamento de Informática
Funções em Python
• Para se trabalhar com funções deve-se
INF 100 – Introdução à Programação

– Declarar a função;
– Programar a função;
– Evocar (chamar, usar) a função.

• Exemplo: definição da função leiaInt()...

Universidade Federal de Viçosa


16
Departamento de Informática
# Este programa calcula o dia e mês do
# domingo de páscoa entre um ano inicial
# e um ano final fornecidos pelo usuário

def leiaInt( msg, vmin, vmax ):


v = int( input( msg ))
INF 100 – Introdução à Programação

while v < vmin or v > vmax:


v = int( input( msg ))
return v

ano1 = leiaInt('Digite o ano inicial (1582 a 2499): ', 1582, 2499)


print()
ano2 = leiaInt('Digite o ano final (1582 a 2499) : ', 1582, 2499)

print('\nAno Data da Páscoa')


print('----------------------')
ano = ano1
while ano <= ano2:
...

Universidade Federal de Viçosa


17
Departamento de Informática
Funções em Python
def leiaInt( msg, vmin, vmax ):
v = int( input( msg ))
while v < vmin or v > vmax:
print('Valor deve estar entre', vmin, 'e', vmax )
v = int( input( msg ))
INF 100 – Introdução à Programação

return v

n = leiaInt('Entre com a quantidade de alunos: ', 2, 50)


soma = 0
for i in range(0, n):
x = leiaInt('Entre com a nota do próximo aluno: ', 0, 100)
soma = soma + x
media = soma / n
print('Média das notas:', media )

Universidade Federal de Viçosa


18
Departamento de Informática
Exercício
• Defina uma função chamada abs() que aceita
INF 100 – Introdução à Programação

como parâmetro um valor x qualquer e


retorna o módulo ou valor absoluto de x.

Universidade Federal de Viçosa


19
Departamento de Informática
Exercício
INF 100 – Introdução à Programação

def abs( x ):
if x < 0:
return -x
else:
return x

Universidade Federal de Viçosa


20
Departamento de Informática
Exercício – programa completo
def abs( x ):
INF 100 – Introdução à Programação

3
if x < 0:
return -x
else: 2
4 return x

x1 = float( input('Entre com o x1: '))


x2 = float( input('Entre com o x2: '))
print('|x1 - x2| =', abs( x1-x2 ))
print('|x1| =', abs( x1 )) 1
print('|x2| =', abs( x2 ))

Universidade Federal de Viçosa


21
Departamento de Informática
Passagem de parâmetro – por valor
1. A expressão é avaliada (uma constante, uma
variável ou uma expressão / fórmula);
INF 100 – Introdução à Programação

2. O valor-resultado é copiado para dentro do


parâmetro da função, obedecendo a mesma
ordem de chamada e de declaração;
3. A execução do programa é desviada para o início
da função;
4. Ao encontrar um comando return, o programa
retorna a execução para o local de onde a
função foi chamada, juntamente com o valor de
retorno, se houver.

Universidade Federal de Viçosa


22
Departamento de Informática
def leiaInt( msg, vmin, vmax ): Esta função não mostra uma
v = int( input( msg )) mensagem de erro quando o
while v < vmin or v > vmax: usuário entra com um valor fora
v = int( input( msg )) do intervalo.
return v
INF 100 – Introdução à Programação

def leiaInt( msg, vmin, vmax ):


v = int( input( msg )) Esta função mostra!
while v < vmin or v > vmax:
print('Valor deve estar entre', vmin, 'e', vmax )
v = int( input( msg ))
return v

Como implementar uma função mais genérica, que pode mostrar ou não
a mensagem de erro, de acordo com a minha necessidade?

Universidade Federal de Viçosa


23
Departamento de Informática
def leiaInt( msg, vmin, vmax, mostraErro ):
v = int( input( msg ))
while v < vmin or v > vmax:
if mostraErro:
print('Valor deve estar entre', vmin, 'e', vmax )
INF 100 – Introdução à Programação

v = int( input( msg ))


return v

ano1 = leiaInt('Ano inicial (1582 a 2499): ', 1582, 2499, False)


print()
ano2 = leiaInt('Ano final (1582 a 2499) : ', 1582, 2499, False)

...

n = leiaInt('Entre com a quantidade de alunos: ', 2, 50, True)


soma = 0
for i in range(0, n):
x = leiaInt('Entre com a nota do próximo aluno: ', 0, 100, True)
soma = soma + x
media = soma / n
print('Média das notas:', media )

Universidade Federal de Viçosa


24
Departamento de Informática
Parâmetros podem assumir valores ”default”:
INF 100 – Introdução à Programação

def leiaInt( msg, vmin, vmax, mostraErro=True ):


v = int( input( msg ))
while v < vmin or v > vmax:
if mostraErro:
print('Valor deve estar entre', vmin, 'e', vmax )
v = int( input( msg ))
return v

ano1 = leiaInt('Ano inicial (1582 a 2499): ', 1582, 2499, False)

mostraErro=False
...

n = leiaInt('Entre com a quantidade de alunos: ', 2, 50 )

Universidade Federal de Viçosa mostraErro=True


25
Departamento de Informática
Funções em Python
• Nos casos anteriores, as funções abs() e
INF 100 – Introdução à Programação

leiaInt() retornam um resultado.


• Podemos ter funções que executam alguma
tarefa específica mas não retornam nenhum
valor como resultado. Ex.:
sound( frequencia, duracao_ms )
Propósito: emitir um som com determinada
frequência em hertz e duração em ms pelo
autofalante do computador.

Universidade Federal de Viçosa


26
Departamento de Informática
Funções em Python
def sound( frequencia, duracao_ms ):
INF 100 – Introdução à Programação

...
... Nesse caso não precisa ter o comando return. A
... execução da função terminará quando o último
comando da função for executado.

def sound( frequencia, duracao_ms ):


...
...
Ou pode ter o comando return, mas sem o
return valor de retorno.

Universidade Federal de Viçosa


27
Departamento de Informática
Funções em Python
• Também podemos ter funções que não
INF 100 – Introdução à Programação

recebem nenhum parâmetro:

def beep():
...

def pi():
return 3.1415926535897

Universidade Federal de Viçosa


28
Departamento de Informática
Funções em Python
• Exemplos de uso:
INF 100 – Introdução à Programação

beep()
sound( 200, 1000 )
print( pi() )

Universidade Federal de Viçosa


29
Departamento de Informática
Mais exemplos
...
INF 100 – Introdução à Programação

def media( a, b ):
m = (a + b) / 2
return m

m = media( 5.5, 7.8 )


print('Média =', m )

Universidade Federal de Viçosa


30
Departamento de Informática
Mais exemplos
...
INF 100 – Introdução à Programação

def media( a, b ):
return (a + b) / 2

m = media( 5.5, 7.8 )


print('Média =', m )

Universidade Federal de Viçosa


31
Departamento de Informática
Mais exemplos
...
INF 100 – Introdução à Programação

def maior( a, b ):
if a > b:
return a
else:
return b

x = float( input('x = '))


y = float( input('y = '))
print('Maior valor =', maior( x, y ))
Universidade Federal de Viçosa
32
Departamento de Informática
Funções em Python
• Erros comuns:
INF 100 – Introdução à Programação

def f( x, y ):
r = x*x + y (esqueceu do return)

def funcao( x, y ):
return x*x + y

def pi():
return 3.1415926535897
pi()
print( pi )
print( funcao( 12 ))

(faltou um parâmetro)
Universidade Federal de Viçosa
33
Departamento de Informática
Exercício 1
• Implemente uma função que recebe como
INF 100 – Introdução à Programação

parâmetros três valores reais a, b e c, e


retorna o maior deles. Use duas abordagens:
a) Uma função maior3( a, b, c ) totalmente
independente;
b) Uma função maior3( a, b, c ) que usa a
função maior( a, b ) já feita antes.

Universidade Federal de Viçosa


34
Departamento de Informática
Exercício 1a
def maior3( a, b, c ):
INF 100 – Introdução à Programação

if a > b and a > c:


return a
else:
if b > c:
return b
else:
return c

Universidade Federal de Viçosa


35
Departamento de Informática
Exercício 1a
def maior3( a, b, c ):
INF 100 – Introdução à Programação

m = a
if b > m: m = b
if c > m: m = c
return m

Universidade Federal de Viçosa


36
Departamento de Informática
Exercício 1b
def maior( a, b ):
INF 100 – Introdução à Programação

if a > b: return a
else: return b

def maior3( a, b, c ):
return maior( maior( a, b ), c )

Universidade Federal de Viçosa


37
Departamento de Informática
Exercício 2
• Implemente uma função que recebe como
INF 100 – Introdução à Programação

parâmetro um valor inteiro n e retorna o valor


de n!. A função pode supor que n será sempre
inteiro e não negativo, sem ter que verificar
essa condição.

Universidade Federal de Viçosa


38
Departamento de Informática
Exercício 2
# versão 1
INF 100 – Introdução à Programação

def fatorial( n ):
fat = 1
while n > 1:
fat = fat * n
n = n - 1
return fat

Universidade Federal de Viçosa


39
Departamento de Informática
Exercício 2
# versão 2
INF 100 – Introdução à Programação

def fatorial( n ):
fat = 1
for i in range(2, n+1):
fat = fat * i
return fat

Universidade Federal de Viçosa


40
Departamento de Informática
t1 = 0
Prática 11
t2 = 1.1*pi
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = t
vy[i] = sin( t ) * cos( 200*t )
INF 100 – Introdução à Programação

t = t + dt

plot.plot( vx, vy, 'Peixe', 'x', 'y' )

t1 = 0
t2 = 2*pi
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = 16 * sin( t )**3
vy[i] = 13 * cos( t ) - 5 * cos( 2*t ) - 2 * cos( 3*t ) - cos( 4*t )
t = t + dt

plot.plot( vx, vy, 'Coração', 'x', 'y' )

Universidade Federal de Viçosa


41
Departamento de Informática
t1 = 0
Prática 11
t2 = 1.1*pi
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = t
vy[i] = sin( t ) * cos( 200*t )
INF 100 – Introdução à Programação

t = t + dt

plot.plot( vx, vy, 'Peixe', 'x', 'y' )

t1 = 0
t2 = 2*pi
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = 16 * sin( t )**3
vy[i] = 13 * cos( t ) - 5 * cos( 2*t ) - 2 * cos( 3*t ) - cos( 4*t )
t = t + dt

plot.plot( vx, vy, 'Coração', 'x', 'y' )

Universidade Federal de Viçosa


42
Departamento de Informática
Prática 11
Algoritmo genérico...
INF 100 – Introdução à Programação

t1 = valor_inicial
t2 = valor_final
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = fx(t)
vy[i] = fy(t)
t = t + dt
plot.plot( vx, vy, nome, 'x', 'y' )

Repare que o algoritmo acima usa funções


que podem ser diferentes para cada gráfico

Universidade Federal de Viçosa


43
Departamento de Informática
Prática 11
Função genérica...
INF 100 – Introdução à Programação

def plotParametrico( nome, n, t1, t2, fx, fy ):


vx = np.empty( n )
vy = np.empty( n )
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = fx( t )
vy[i] = fy( t )
t = t + dt
plot.plot( vx, vy, nome, 'x', 'y' )

Veja que podemos passar funções como parâmetros!

Universidade Federal de Viçosa


44
Departamento de Informática
Prática 11
Usando a Função...
def fx_peixe( t ):
return t
INF 100 – Introdução à Programação

def fy_peixe( t ):
return sin( t ) * cos( 200*t )

def fx_cor( t ):
return 16 * sin( t )**3
def fy_cor( t ):
return 13 * cos( t ) - 5 * cos( 2*t ) - 2 * cos( 3*t ) - cos( 4*t )

...
n = 10000

plotParametrico('Peixe', n, 0, 1.1*pi, fx_peixe, fy_peixe )


plotParametrico('Coração', n, 0, 2*pi, fx_cor, fy_cor )
...

Universidade Federal de Viçosa


45
Departamento de Informática
from math import pi, sin, cos, exp
import numpy as np
import plot

def plotParametrico( nome, n, t1, t2, fx, fy ):


vx = np.empty( n )
vy = np.empty( n )
dt = (t2 - t1) / n
t = t1
for i in range( 0, n ):
vx[i] = fx( t )
vy[i] = fy( t )
INF 100 – Introdução à Programação

t = t + dt
plot.plot( vx, vy, nome, 'x', 'y' )

def fx_peixe( t ):
return t
def fy_peixe( t ):
return sin( t ) * cos( 200*t )

def fx_cor( t ):
return 16 * sin( t )**3
def fy_cor( t ):
return 13 * cos( t ) - 5 * cos( 2*t ) - 2 * cos( 3*t ) - cos( 4*t )

def fx_borboleta( t ):
return sin( t ) * (exp( cos( t )) - 2*cos( 4*t ) - sin( t/12 )**5)
def fy_borboleta( t ):
return cos( t ) * (exp( cos( t )) - 2*cos( 4*t ) - sin( t/12 )**5)

def fx_pufes( t ):
return 2*cos( t ) + sin( 2*t ) * cos( 60*t )
def fy_pufes( t ):
return sin( 2*t ) + sin( 60*t )

def fx_Spirograph( t ):
return cos( 0.95*t ) * cos( t )
def fy_Spirograph( t ):
return cos( 0.95*t ) * sin( t )

n = 10000

plotParametrico('Peixe', n, 0, 1.1*pi, fx_peixe, fy_peixe )


plotParametrico('Coração', n, 0, 2*pi, fx_cor, fy_cor )
plotParametrico('Borboleta', n, -8*pi, 8*pi, fx_borboleta, fy_borboleta )
plotParametrico('Coração', n, 0, 2*pi, fx_pufes, fy_pufes )
plotParametrico('Spirograph', n, 0, 40*pi, Universidade Federal de Viçosa
fx_Spirograph, fy_Spirograph )
46
Departamento de Informática

Você também pode gostar