Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Atividade Semanal #26

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

willianefernandes
Copy link

No description provided.

Copy link
Collaborator

@mayumisngk mayumisngk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Olá Williane!

Fiz uma revisão de código para você e espero que você possa revisar seu projeto e complementar posteriormente com mais coisas. Futuramente, se quiser complementar mais o sistema, você pode pensar em encapsular as funcionalidades, dando mais especifidade a função e dando responsabilidades únicas para ela.

Note que no seu código a função incluir_nova_aluna e consultar_status_aprovação estão calculando status de aprovação da aluna. O ideal é que cada função tenha uma única responsabilidade, por isso, posteriormente pense em como pode refatorar para que não tenha duplicidade no código.

Boa sorte e sucesso na sua jornada! ♥

Comment on lines +49 to +61
quantidade_notas = int(input("Quantas notas serão inseridas? "))
notas_aluna = []
for i in range(quantidade_notas):
while True:
try:
nota = float(input(f"Insira a nota #{i+1}: "))
if nota < 0 or nota > 10:
print("Nota fora do intervalo permitido (0-10). Tente novamente.")
else:
notas_aluna.append(nota)
break
except ValueError:
print("Valor inválido. Insira um número válido para a nota.")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui poderiamos criar uma função para que a função incluir_nova_aluna não tivesse tantas responsabilidades. Em uma refatoração, podemos mover esta e a parte de presenças para novas funções :)
Adorei que você conseguiu aplicar os conceitos aprendidos em sala de aula.

@@ -0,0 +1,187 @@
# Definindo o dataset diretamente no programa
dataset = {}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O dataset já estava definido e importado, essa parte não precisava ter alterado. Do modo como está, ele não está recuperando os dados do dicionário que estava existente. Quando usamos o import, conseguimos usar os dados e funções de outros arquivos python no nosso arquivo atual.

Sugestão:

Suggested change
dataset = {}
from dataset_alunas import dataset

Neste caso, é só usar o dataset igual usamos em sala de aula;

if presenca not in ['true', 'false']:
raise ValueError("Valor inválido. Insira 'True' ou 'False'.")
else:
presenca_aluna.append(presenca == 'true')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Este é um ótimo uso do retorno de dado booleano implícito para adicionar o dado a uma lista. Cuidado com o uso de referências externas no código, sei que neste ponto tem um pouco de lógica mais avançada, assegure-se de conseguir implementar sozinha.

Comment on lines +82 to +87
if participacao < 0 or participacao > 10:
raise ValueError("Nota de participação fora do intervalo permitido (0-10).")
else:
break
except ValueError as e:
print(e)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui não necessáriamente precisaria usar um raise ValueError, poderia ser um print. Assim, teriamos a mesma lógica com implementação mais simples. Neste ponto, caso insiramos uma letra, recebemos uma mensagem de exception não tratado, que é a mensagem retornada pela linha 87.

Sugestão:

Suggested change
if participacao < 0 or participacao > 10:
raise ValueError("Nota de participação fora do intervalo permitido (0-10).")
else:
break
except ValueError as e:
print(e)
if participacao < 0 or participacao > 10:
print("Nota de participação fora do intervalo permitido (0-10).")
else:
break
except ValueError:
print("Entrada inválida. Por favor, insira um número.")

Comment on lines +139 to +140
for chave in dataset.keys():
print(chave)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O consultar_lista_alunas é um exercício para manipular tuplas, aqui fica uma sugestão de como podemos trabalhar com tuplas. Neste exemplo, criei duas variáveis (nome e sobrenome) para nomear o primeiro e segundo elemento da tupla:

Sugestão:

Suggested change
for chave in dataset.keys():
print(chave)
for nome, sobrenome in dataset.keys():
print(f'Nome: {nome} {sobrenome}')

Comment on lines +117 to +124
dataset[chave] = {
"Turma": turma,
"Notas": notas_aluna,
"Presença": presenca_aluna,
"Nota de Participação": participacao,
"Status": status,
"Média Final": round(media, 2) # Arredonda a média final para duas casas decimais
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adorei que foram incluídos mais elementos no dicionário. Parabéns pelo bom uso :)

Comment on lines +96 to +107
status = "Recuperação"
fez_recuperacao = input("\nA média da aluna está baixa. Ela fez prova de recuperação? ").lower()
if fez_recuperacao == 'sim':
while True:
try:
nota_recuperacao = float(input("Insira a nota de recuperação: "))
if nota_recuperacao < 0 or nota_recuperacao > 10:
raise ValueError("Nota de recuperação fora do intervalo permitido (0-10).")
else:
break
except ValueError as e:
print(e)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No projeto de casa, não precisava incluir a parte de recuperação, mas ótimo trabalho em criar fluxos adicionais.

print(chave)

def consultar_faltas_aluna():
nome_aluna = input("\nDigite o nome completo da aluna para consultar as faltas: ")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O dicionário possui uma tupla como chave. Aqui está uma sugestão de implementação simples:

Sugestão:

Suggested change
nome_aluna = input("\nDigite o nome completo da aluna para consultar as faltas: ")
nome = input('Informe o nome da aluna: ')
sobrenome = input('Informe o sobrenome da aluna: ')
nome_aluna = (nome, sobrenome)

Comment on lines +160 to +182
if nome_aluna in dataset:
notas = dataset[nome_aluna]["Notas"]
presenca = dataset[nome_aluna]["Presença"]
participacao = dataset[nome_aluna]["Nota de Participação"]

if len(notas) == 0:
print("\nNão há notas registradas para esta aluna.")
return

media = sum(notas) / len(notas)
percent_presenca = presenca.count(True) / len(presenca) * 100

if participacao >= 6 and percent_presenca >= 80 and media >= 6:
status = "Aprovada"
elif 3 <= media < 6:
status = "Recuperação"
else:
status = "Reprovada"

print(f"\nStatus de aprovação da aluna '{nome_aluna}': {status}")
print(f"Média final: {media:.2f}")
if status == "Recuperação":
print(f"Nota de recuperação necessária para aprovação: {media:.2f}")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Como na função incluir_nova_aluna foi adicionado um elemento chamado "Status", podemos só retornar o valor que está nele.

Sugestão:

Suggested change
if nome_aluna in dataset:
notas = dataset[nome_aluna]["Notas"]
presenca = dataset[nome_aluna]["Presença"]
participacao = dataset[nome_aluna]["Nota de Participação"]
if len(notas) == 0:
print("\nNão há notas registradas para esta aluna.")
return
media = sum(notas) / len(notas)
percent_presenca = presenca.count(True) / len(presenca) * 100
if participacao >= 6 and percent_presenca >= 80 and media >= 6:
status = "Aprovada"
elif 3 <= media < 6:
status = "Recuperação"
else:
status = "Reprovada"
print(f"\nStatus de aprovação da aluna '{nome_aluna}': {status}")
print(f"Média final: {media:.2f}")
if status == "Recuperação":
print(f"Nota de recuperação necessária para aprovação: {media:.2f}")
if nome_aluna in dataset:
status = dataset[nome_aluna]["Status"]
print(f"\nStatus de aprovação da aluna '{nome_aluna}': {status}")
print(f"Média final: {media:.2f}")
if status == "Recuperação":
print(f"Nota de recuperação necessária para aprovação: {media:.2f}")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants