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
grupo é composto pelos melhores colocados (1/4 do total de vagas), o
grupo pelos seguintes melhores colocados (1/4 seguinte do total de vagas) e assim sucessivamente.
Por exemplo: um curso com 100 vagas, do
ao
colocados pertencem ao grupo 1, do
ao
colocados, pertencem ao grupo 2, o
ao
colocados pertencem ao grupo 3 e do
ao
colocados pertencem ao grupo 4.
Há 4 horários possíveis:
horário - 8 h às 11:30h:
horário: 12 h às 13:30h
horário: 14 h às 15:30h
✓
horário: 16 h às 17:30h
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
Por exemplo: um curso com 100 vagas, do
Há 4 horários possíveis:
✓
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
. - 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
.
- 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
- 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
grupos, cada grupo correspondendo a um quarto ( ) das vagas do curso. - Exemplo dado: para um curso com
vagas os grupos são: - grupo
: colocações a , - grupo
: colocações a , - grupo
: colocações a , - grupo
: colocações a .
- grupo
- Os aprovados de cada curso são divididos em
- Horários (mapa grupo → horário):
- grupo
: 8 h às 11:30h - grupo
: 12 h às 13:30h - grupo
: 14 h às 15:30h - grupo
: 16 h às 17:30h
- grupo
Passo 2
Como determinar a qual grupo um aluno pertence — a ideia e a fórmula:
- Seja
o número de vagas do curso e a colocação do aluno (um inteiro entre e , idealmente). - Queremos dividir as colocações em
faixas aproximadamente iguais. Uma forma direta e robusta é calcular
onde
é a função teto (ceil), que arredonda para cima ao inteiro mais próximo.
- Por que essa fórmula funciona? Porque
é a fração da vaga ocupada pela colocação do aluno; multiplicando por obtemos em qual quarto (entre e ) essa fração está; ao aplicar o teto obtemos um grupo entre e . - Exemplos rápidos:
- Para
e : - Para
e : - Para
e : 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.
- Para
- Cuidados práticos:
- Garantir
antes de aplicar a fórmula; se 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
a : .
- Garantir
Passo 3
Mapeamento do grupo para o horário de matrícula (vamos usar um dicionário direto)
- grupo
→ “8 h às 11:30h” - grupo
→ “12 h às 13:30h” - grupo
→ “14 h às 15:30h” - grupo
→ “16 h às 17:30h”
Passo 4
Estratégia geral do algoritmo (passos que a função seguirá)
- Para cada aluno no dicionário de aprovados:
- Ler o nome do curso e a colocação
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
. - Calcular o grupo
usando e limitar para . - Traduzir
para o horário correspondente. - Exibir (imprimir) uma linha com: nome do aluno, curso, data do curso e horário.
- Ler o nome do curso e a colocação
- 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
: 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
e a função pronta de teto (em Python é math.ceil). - Proteja contra divisão por zero testando
. - 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
“”"
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}")