Partilhar: WhatsApp
aulify
UC UC00606 · T. Desenv. Software, T. Inform. Gestão

Ficha 02 · Funções, dicts e ficheiros

Decompor programas, manipular dicts, ler/escrever ficheiros
Versão · Aluno
Tempo · 60 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

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.")