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
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions projeto_guiado_v2_williane.py
Original file line number Diff line number Diff line change
@@ -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;


def main():
print("\n--- Seja bem vinda à Escola do Reprograma! ---")
print("Sistema de informações de alunas")

while True:
cod_opcao = obter_opcao()

if cod_opcao == 1:
incluir_nova_aluna()
elif cod_opcao == 2:
consultar_lista_alunas()
elif cod_opcao == 3:
consultar_faltas_aluna()
elif cod_opcao == 4:
consultar_notas_aluna()
elif cod_opcao == 5:
consultar_status_aprovacao()
elif cod_opcao == 6:
print("Encerrando o programa...")
break

def obter_opcao():
while True:
try:
codigo_opcao = int(input("\nEscolha uma opção:\n"
"1 - Incluir uma nova aluna\n"
"2 - Consultar lista de alunas\n"
"3 - Consultar faltas da aluna\n"
"4 - Consultar notas da aluna\n"
"5 - Consultar status de aprovação\n"
"6 - Sair do sistema\n"
"Opção: "))
if codigo_opcao in [1, 2, 3, 4, 5, 6]:
return codigo_opcao
else:
print("Opção inválida. Por favor, escolha uma opção válida (1 a 6).\n")
except ValueError:
print("Entrada inválida. Por favor, digite um número inteiro.\n")

def incluir_nova_aluna():
nome = input("\nDigite o nome completo da aluna: ")
sobrenome = input("Digite o sobrenome da aluna: ")
turma = input("Digite a turma da aluna: ")

# Coletando as notas
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.")
Comment on lines +49 to +61
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.


# Coletando a presença (faltas)
quantidade_dias = int(input("Quantos dias de presença serão inseridos? "))
presenca_aluna = []
for i in range(quantidade_dias):
while True:
try:
presenca = input(f"Informar presença no dia #{i+1} (True/False): ").strip().lower()
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.

break
except ValueError as e:
print(e)

# Coletando a nota de participação
while True:
try:
participacao = float(input("Insira a nota de participação da aluna: "))
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)
Comment on lines +82 to +87
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.")


# Calculando o status de aprovação
media = sum(notas_aluna) / len(notas_aluna)
percent_presenca = presenca_aluna.count(True) / len(presenca_aluna) * 100

if participacao >= 6 and percent_presenca >= 80 and media >= 6:
status = "Aprovada"
elif 3 <= media < 6:
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)
Comment on lines +96 to +107
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.

else:
nota_recuperacao = None
print("Então essa aluna será reprovada por média.")
else:
status = "Reprovada"
nota_recuperacao = None

# Adicionando a aluna ao dataset
chave = f"{nome} {sobrenome}"
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
}
Comment on lines +117 to +124
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 :)


# Exibindo o status de aprovação da aluna
print(f"\nStatus de aprovação da aluna '{chave}': {status}")
print(f"Média final: {media:.2f}")
if status == "Recuperação":
print(f"Nota de recuperação: {nota_recuperacao:.2f}")

print(f"\nAluna '{chave}' adicionada com sucesso!")

def consultar_lista_alunas():
if not dataset:
print("\nNão há alunas cadastradas.")
else:
print("\nLista de alunas cadastradas:")
for chave in dataset.keys():
print(chave)
Comment on lines +139 to +140
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}')


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)

if nome_aluna in dataset:
faltas = dataset[nome_aluna]["Presença"].count(False)
print(f"\nA aluna '{nome_aluna}' possui {faltas} falta(s).")
else:
print(f"\nAluna '{nome_aluna}' não encontrada.")

def consultar_notas_aluna():
nome_aluna = input("\nDigite o nome completo da aluna para consultar as notas: ")
if nome_aluna in dataset:
notas = dataset[nome_aluna]["Notas"]
print(f"\nNotas da aluna '{nome_aluna}': {notas}")
else:
print(f"\nAluna '{nome_aluna}' não encontrada.")

def consultar_status_aprovacao():
nome_aluna = input("\nDigite o nome completo da aluna para consultar o status de aprovação: ")
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}")
Comment on lines +160 to +182
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}")

else:
print(f"\nAluna '{nome_aluna}' não encontrada.")

if __name__ == "__main__":
main()
101 changes: 101 additions & 0 deletions projeto_guiado_williane.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
dataset = {}

print("-- Calculadora para média de notas -- \nPara realizar o cálculo, digite os dados da aluna e as notas que deseja calcular a média. \n Não são permitidos: \n⇨ Valores que não sejam números para as notas\n⇨ Inserir número negativo")

def dados_aluna ():
nome = input("\nQual é o nome da aluna? ")
turma = input("Qual é a turma da aluna? ")
participacao = float(input("Qual a nota de participação da aluna? "))
quantidade_notas = input("\nQuantas notas você deseja inserir para calcular a média? ")
notas_aluna = []

for contador in range(int(quantidade_notas)):
while True:
entrada = input(f"Insira a nota #{contador + 1}: ")
try:
nota = float(entrada)
notas_aluna.append(nota)
break
except ValueError:
print("Entrada inválida")
print(f"As notas inseridas foram: {notas_aluna}")

inserir_frequencia(nome, turma, participacao, notas_aluna)

def inserir_frequencia(nome, turma, participacao, notas_aluna):
frequencia = input("\nVocê deseja inserir a frequência da aluna? Digite 1 se sim e 2 caso não queira: ")

if frequencia == '1':
quantidade_dias_frequencia = int(input("Quantos dias de frequência serão inseridos? "))

faltas_aluna = []
for contador2 in range(quantidade_dias_frequencia):
while True:
print("Para registrar as faltas, digite True caso a aluna tenha faltado no dia e False caso ela não tenha faltado")
entrada2 = input(f"Insira a falta #{contador2 + 1}: ").lower() # Aceita 'true' ou 'false'
falta_aluna = entrada2 == 'true'
faltas_aluna.append(falta_aluna)
break

if quantidade_dias_frequencia > 0:
percent_faltas = round((faltas_aluna.count(True)/ len(faltas_aluna)) * 100, 2)
print(f"O percentual de presença da aluna é de: {percent_faltas}%")

else:
percent_faltas = 0
faltas_aluna = []
else:
faltas_aluna = None
percent_faltas = None
print("\nEntão vamos seguir com os cálculos das médias!\n")

media_notas(nome, turma, participacao, notas_aluna, faltas_aluna, percent_faltas)

def media_notas(nome, turma, participacao, notas_aluna, faltas_aluna, percent_faltas):
media = ((sum(notas_aluna)/ len(notas_aluna))*0.8) + (participacao * 0.2)

if media < 3:
nota_recuperacao = None
print("\nA aluna", nome, "foi reprovada com média igual a:", round(media, 2))
status_aluna = "Reprovada"

elif 3 < media < 6:
print("\nA aluna", nome, "foi para recuperação com média igual a:", round(media, 2))
status_aluna = "Recuperação"
fez_recuperacao = input("\nA média da aluna está baixa. Ela fez prova de recuperação? ").lower()
if fez_recuperacao == 'sim':
nota_recuperacao = float(input("Insira a nota de recuperação: "))
else:
nota_recuperacao = None
print("Então essa aluna será reprovada por média.")


else:
print("\nA aluna", nome, "foi aprovada com média igual a:", round(media, 2))
nota_recuperacao = None
status_aluna = "Aprovada"

continuar_programa = input("\nDigite 1 se deseja calcular uma nova média ou 2 caso deseje parar: ")

if continuar_programa == '1':
dados_aluna()
else:
print("Programa encerrado")

salvar_dados_aluna(nome, turma, participacao, notas_aluna, status_aluna, media, faltas_aluna, percent_faltas, nota_recuperacao)

def salvar_dados_aluna(nome, turma, participacao, notas_aluna, status_aluna, media, faltas_aluna, percent_faltas, nota_recuperacao):
chave = (nome)
dataset[chave] = {
"Turma" : turma,
"Nota participação": participacao,
"Notas aluna": notas_aluna,
"Status": status_aluna,
"Media aluna": round(media, 2),
"Faltas aluna" : faltas_aluna,
"Percentual de faltas": percent_faltas,
"Nota recuperação": nota_recuperacao
}
print(f"Dados aluna {chave}: {dataset[chave]}")

dados_aluna()