O dia e horário de matrícula dos calouros da PUC depende do curso desejado. Faça uma função que receba dois dicionários:
  • dicionário de cursos: para cada nome do curso há associado uma lista com a data de matrícula e o número de aprovados no curso.
  • dicionário de aprovados: para cada nome de aluno, há uma lista com o nome do curso e o sua colocação no vestibular
    Esta função deve exibir para cada aluno, seu nome, seu curso, dia e horário de matrícula. Os alunos são divididos em 4 grupos de acordo com sua colocação no curso. O 1^{\circ} grupo é composto pelos melhores colocados (1/4 do total de vagas), o 2^{\circ} grupo pelos seguintes melhores colocados (1/4 seguinte do total de vagas) e assim sucessivamente.
    Por exemplo: um curso com 100 vagas, do 1^{\mathrm{o}} ao 25^{\circ} colocados pertencem ao grupo 1, do 26^{\circ} ao 50^{\circ} colocados, pertencem ao grupo 2, o 51^{\circ} ao 75^{\circ} colocados pertencem ao grupo 3 e do 76^{\circ} ao 100^{\circ} colocados pertencem ao grupo 4.
    Há 4 horários possíveis:
    \checkmark 1^{\circ} horário - 8 h às 11:30h:
    \checkmark 2^{\circ} horário: 12 h às 13:30h
    \checkmark 3^{\circ} horário: 14 h às 15:30h
    4^{\circ} horário: 16 h às 17:30h

Passo 1

O que o problema pede e o que foi dado (resumido, com os dados que a função receberá):
  • A função recebe dois dicionários:
    • dicionário de cursos: para cada nome do curso há associado uma lista com a data de matrícula e o número de vagas. Por exemplo, para um curso chamado “Engenharia” o valor pode ser ["2026-02-10", 100].
    • dicionário de aprovados: para cada nome de aluno há uma lista com o nome do curso e a sua colocação no vestibular. Por exemplo, para “Ana” o valor pode ser ["Engenharia", 25].
  • O que a função deve exibir (para cada aluno): nome do aluno, nome do curso, dia (data) de matrícula do curso e o horário correspondente ao grupo do aluno.
  • Regras de divisão em grupos:
    • Os aprovados de cada curso são divididos em 4 grupos, cada grupo correspondendo a um quarto ( 1/4) das vagas do curso.
    • Exemplo dado: para um curso com 100 vagas os grupos são:
      • grupo 1: colocações 1 a 25,
      • grupo 2: colocações 26 a 50,
      • grupo 3: colocações 51 a 75,
      • grupo 4: colocações 76 a 100.
  • Horários (mapa grupo → horário):
    • grupo 1: 8 h às 11:30h
    • grupo 2: 12 h às 13:30h
    • grupo 3: 14 h às 15:30h
    • grupo 4: 16 h às 17:30h

Passo 2

Como determinar a qual grupo um aluno pertence — a ideia e a fórmula:
  • Seja v o número de vagas do curso e p a colocação do aluno (um inteiro entre 1 e v, idealmente).
  • Queremos dividir as colocações em 4 faixas aproximadamente iguais. Uma forma direta e robusta é calcular
g = \left\lceil \frac{4p}{v} \right\rceil,
onde \lceil \cdot \rceil é a função teto (ceil), que arredonda para cima ao inteiro mais próximo.
  • Por que essa fórmula funciona? Porque \frac{p}{v} é a fração da vaga ocupada pela colocação do aluno; multiplicando por 4 obtemos em qual quarto (entre 0 e 4) essa fração está; ao aplicar o teto obtemos um grupo entre 1 e 4.
  • Exemplos rápidos:
    • Para v=100 e p=25: g=\left\lceil \frac{4\cdot 25}{100}\right\rceil=\lceil 1\rceil=1.
    • Para v=100 e p=26: g=\left\lceil \frac{4\cdot 26}{100}\right\rceil=\lceil 1{,}04\rceil=2.
    • Para v=3 e p=1: g=\left\lceil \frac{4\cdot 1}{3}\right\rceil=\lceil 1{,}333\ldots\rceil=2.Observação: para cursos muito pequenos a divisão em quartis fica pouco intuitiva, mas a fórmula distribui as colocações de forma proporcional e evita divisão por zero.
  • Cuidados práticos:
    • Garantir v>0 antes de aplicar a fórmula; se v estiver zerado ou inválido, é preciso tratar o caso (no código vamos sinalizar e pular/atribuir um horário padrão).
    • Sempre limitar o resultado para o intervalo 1 a 4: g = \min(4, \max(1, g)).

Passo 3

Mapeamento do grupo para o horário de matrícula (vamos usar um dicionário direto)
  • grupo 1 → “8 h às 11:30h”
  • grupo 2 → “12 h às 13:30h”
  • grupo 3 → “14 h às 15:30h”
  • grupo 4 → “16 h às 17:30h”

Passo 4

Estratégia geral do algoritmo (passos que a função seguirá)
  1. Para cada aluno no dicionário de aprovados:
    • Ler o nome do curso e a colocação p do aluno (pegar esses valores do dicionário de aprovados).
    • Procurar o curso no dicionário de cursos e obter a data de matrícula e o número de vagas v.
    • Calcular o grupo g usando g = \left\lceil \dfrac{4p}{v} \right\rceil e limitar para 1\le g\le 4.
    • Traduzir g para o horário correspondente.
    • Exibir (imprimir) uma linha com: nome do aluno, curso, data do curso e horário.
  2. Tratar situações especiais:
    • Se o curso do aluno não existir no dicionário de cursos: exibir uma mensagem de aviso para esse aluno.
    • Se v \le 0: exibir aviso e atribuir um horário padrão ou pular — no código abaixo será exibida uma mensagem de erro para esse aluno.

Passo 5

Dica prática para implementação e para a prova (como escrever rápido e sem erros)
  • Use a fórmula \;g=\left\lceil \dfrac{4p}{v}\right\rceil\; e a função pronta de teto (em Python é math.ceil).
  • Proteja contra divisão por zero testando v.
  • Capte valores do dicionário com acesso direto e trate a chave ausente com um if/else.
  • Na prova, se precisar apenas indicar a lógica, escreva a fórmula e descreva o mapeamento grupo→horário; se pedirem pseudocódigo, escreva um laço que percorre os aprovados e imprime a saída.

Passo 6

Implementação em Python (função final pronta para usar). O código faz exatamente o que explicamos: para cada aluno imprime nome, curso, data de matrícula e horário correspondente ao grupo. Usei tratamento para curso inexistente e para número de vagas inválido.

Resposta

def exibir_matriculas(cursos, aprovados):
“”"
Para cada aluno em ‘aprovados’ imprime:
Nome do aluno - Curso - Data de matrícula - Horário
Argumentos:
cursos: dict onde cursos[nome_curso] = [data_matricula, vagas]
aprovados: dict onde aprovados[nome_aluno] = [nome_curso, colocacao]
Observações:
- A divisão em 4 grupos é feita por g = ceil(4 * colocacao / vagas), limitada a 1…4.
- Se o curso não existir em ‘cursos’ ou se vagas <= 0, a função emite aviso para esse aluno.
“”"
import math
horarios = {
    1: "8 h às 11:30h",
    2: "12 h às 13:30h",
    3: "14 h às 15:30h",
    4: "16 h às 17:30h"
}

for nome_aluno, info in aprovados.items():
    if not isinstance(info, (list, tuple)) or len(info) < 2:
        print(f"{nome_aluno} - dados de aprovação inválidos: {info}")
        continue

    nome_curso, colocacao = info[0], info[1]

    if nome_curso not in cursos:
        print(f"{nome_aluno} - curso '{nome_curso}' não encontrado nos dados de cursos.")
        continue

    data_matricula, vagas = cursos[nome_curso][0], cursos[nome_curso][1]

    # Validações básicas
    try:
        colocacao = int(colocacao)
    except Exception:
        print(f"{nome_aluno} - colocação inválida: {colocacao}")
        continue

    try:
        vagas = int(vagas)
    except Exception:
        print(f"{nome_aluno} - número de vagas inválido para o curso '{nome_curso}': {vagas}")
        continue

    if vagas <= 0:
        print(f"{nome_aluno} - curso '{nome_curso}' tem vagas <= 0; impossível determinar grupo.")
        continue

    # Cálculo do grupo: g = ceil(4 * p / v), limitado a 1..4
    g = math.ceil(4 * colocacao / vagas)
    g = max(1, min(4, g))

    horario = horarios.get(g, "Horario desconhecido")

    print(f"{nome_aluno} - {nome_curso} - {data_matricula} - {horario}")

Exercícios relacionados