Partilhar: WhatsApp
aulify
UC UC00607 · T. Desenv. Software

Ficha 02 · Módulos, JSON, APIs e testes

Organizar código, manipular dados, testar com pytest
Versão · Aluno
Tempo · 60 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

Parte I · Módulos

Exercício 1 · Organizar projecto (10 pts)

Tens um ficheiro de 800 linhas com tudo dentro. Propõe estrutura para dividir em módulos:

loja.py  (800 linhas)

Exercício 2 · pip e virtualenv (15 pts)

Descreve passos para começar um projecto Python novo com: - Ambiente virtual isolado. - 3 dependências (requests, pytest, rich). - Ficheiro requirements.txt.

Parte II · JSON e CSV

Exercício 3 · Manipular JSON (15 pts)

Dado um ficheiro alunos.json:

[
  {"nome": "Ana", "notas": [15, 16, 14]},
  {"nome": "João", "notas": [10, 12, 13]}
]

Escreve programa que: a) Lê o ficheiro. b) Calcula a média de cada aluno. c) Adiciona campo media a cada aluno. d) Grava de volta.

Exercício 4 · CSV → JSON (10 pts)

Dado vendas.csv:

data,produto,qty,preco
2026-05-01,Caneta,10,1.50
2026-05-02,Caderno,5,3.20

Converte para vendas.json com mesma estrutura. Calcula campo extra total (qty × preco).

Parte III · APIs

Exercício 5 · Consumir API (15 pts)

Usa a API pública https://api.github.com/users/{username} para mostrar info de um utilizador GitHub:

a) Lê username do input. b) Faz GET à API. c) Mostra name, bio, public_repos, followers. d) Trata erros (utilizador não existe, sem internet).

Exercício 6 · API com paginação (15 pts)

A API GitHub limita resultados por página (30 por defeito). Para listar todos os repos de um utilizador, é preciso paginar.

Implementa função que devolve todos os repos, iterando páginas até esgotar:

Parte IV · Testes

Exercício 7 · Escrever testes (20 pts)

Para a seguinte função, escreve 4 testes pytest cobrindo casos normais e erros:

def media_ponderada(notas, pesos):
    if len(notas) != len(pesos):
        raise ValueError("Notas e pesos têm de ter mesmo tamanho")
    if sum(pesos) == 0:
        raise ValueError("Soma de pesos não pode ser 0")
    soma = sum(n * p for n, p in zip(notas, pesos))
    return soma / sum(pesos)