Ficha 02 · Funções, dicts e ficheiros
- Definir funções
- Usar dicts
- Manipular ficheiros
- Tratar excepções
Parte I · Funções
Exercício 1 · Função pura (10 pts)
Escreve função area_rectangulo(largura, altura) que devolve a área. Testa para 3×4 e 5.5×2.
def area_rectangulo(largura, altura):
return largura * altura
print(area_rectangulo(3, 4)) # 12
print(area_rectangulo(5.5, 2)) # 11.0
Exercício 2 · Função com default (15 pts)
calcular_preco(preco_base, iva=23, desconto=0) devolve preço final.
Exemplos:
- calcular_preco(100) → 123.0
- calcular_preco(100, desconto=10) → 110.7
- calcular_preco(100, iva=6) → 106.0
def calcular_preco(preco_base, iva=23, desconto=0):
preco_com_desconto = preco_base * (1 - desconto / 100)
preco_final = preco_com_desconto * (1 + iva / 100)
return preco_final
print(calcular_preco(100)) # 123.0
print(calcular_preco(100, desconto=10)) # 110.7
print(calcular_preco(100, iva=6)) # 106.0
Exercício 3 · Recursão · factorial (15 pts)
Implementa factorial(n) de forma recursiva. Lança ValueError se n < 0.
def factorial(n):
if n < 0:
raise ValueError("n tem de ser >= 0")
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
print(factorial(0)) # 1
# print(factorial(-1)) # ValueError
Parte II · Dicts
Exercício 4 · Contar palavras (15 pts)
Dada uma string, devolve dict com a contagem de cada palavra (separadas por espaços, em minúsculas):
contar_palavras("o gato e o cao e o rato")
# {"o": 3, "gato": 1, "e": 2, "cao": 1, "rato": 1}
def contar_palavras(texto):
contagem = {}
for palavra in texto.lower().split():
contagem[palavra] = contagem.get(palavra, 0) + 1
return contagem
print(contar_palavras("o gato e o cao e o rato"))
Alternativa com defaultdict:
from collections import defaultdict
def contar_palavras(texto):
contagem = defaultdict(int)
for palavra in texto.lower().split():
contagem[palavra] += 1
return dict(contagem)
Exercício 5 · Agenda telefónica (20 pts)
Programa interactivo que mantém uma agenda (dict) com nome → telefone. Menu: 1. Adicionar contacto 2. Procurar 3. Listar todos 4. Remover 5. Sair
def menu():
print("\n1. Adicionar")
print("2. Procurar")
print("3. Listar")
print("4. Remover")
print("5. Sair")
return input("Opção: ")
def adicionar(agenda):
nome = input("Nome: ")
tel = input("Telefone: ")
agenda[nome] = tel
print(f"{nome} adicionado.")
def procurar(agenda):
nome = input("Nome: ")
if nome in agenda:
print(f"{nome}: {agenda[nome]}")
else:
print("Não encontrado.")
def listar(agenda):
if not agenda:
print("Agenda vazia.")
for nome, tel in sorted(agenda.items()):
print(f" {nome}: {tel}")
def remover(agenda):
nome = input("Nome a remover: ")
if nome in agenda:
del agenda[nome]
print(f"{nome} removido.")
else:
print("Não encontrado.")
def main():
agenda = {}
while True:
opcao = menu()
if opcao == "1":
adicionar(agenda)
elif opcao == "2":
procurar(agenda)
elif opcao == "3":
listar(agenda)
elif opcao == "4":
remover(agenda)
elif opcao == "5":
break
else:
print("Opção inválida.")
if __name__ == "__main__":
main()
Parte III · Ficheiros
Exercício 6 · Ler e contar linhas (10 pts)
Escreve programa que abre um ficheiro texto.txt e mostra:
- Número de linhas.
- Número total de palavras.
- Número total de caracteres (sem espaços).
def estatisticas(caminho):
try:
with open(caminho, encoding="utf-8") as f:
texto = f.read()
except FileNotFoundError:
print(f"Ficheiro {caminho} não existe.")
return
linhas = texto.split("\n")
palavras = texto.split()
caracteres = sum(1 for c in texto if not c.isspace())
print(f"Linhas: {len(linhas)}")
print(f"Palavras: {len(palavras)}")
print(f"Caracteres (sem espaços): {caracteres}")
estatisticas("texto.txt")
Exercício 7 · Guardar agenda em ficheiro (15 pts)
Estende a agenda do exercício 5 para guardar e carregar de agenda.txt (formato simples: nome,telefone por linha).
def guardar(agenda, ficheiro="agenda.txt"):
with open(ficheiro, "w", encoding="utf-8") as f:
for nome, tel in agenda.items():
f.write(f"{nome},{tel}\n")
def carregar(ficheiro="agenda.txt"):
agenda = {}
try:
with open(ficheiro, encoding="utf-8") as f:
for linha in f:
linha = linha.strip()
if not linha:
continue
partes = linha.split(",", 1)
if len(partes) == 2:
agenda[partes[0]] = partes[1]
except FileNotFoundError:
pass # primeiro arranque, sem ficheiro ainda
return agenda
# No main():
def main():
agenda = carregar()
try:
# ... menu como antes ...
pass
finally:
guardar(agenda)
print("Agenda guardada.")