Skip to content
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
41 changes: 41 additions & 0 deletions Veronica/REDAME.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@


### "Sistema da Escola Reprograma"

Esta é uma aplicação desenvolvida para auxiliar a escola no gerenciamento eficiente de informações sobre suas alunas. Atualmente, a escola enfrenta desafios com cálculos manuais que consomem muito tempo dos professores, portanto, o sistema foi projetado para automatizar diversas tarefas do dia-a-dia.

*A média simples das notas é calculada e comparada com a nota de corte da escola (6).*
*Além das notas, a aluna deve ter pelo menos 80% de presença e uma nota de participação acima de 6 para ser considerada aprovada.*

## Funcionalidades Implementadas:

* Inclusão de uma nova aluna na base de dados:

- Permite a adição de uma nova aluna com dados como nome, sobrenome, turma, notas em avaliações, presença em aulas e nota de participação. (Usa operadores booleanos).
- Após a inclusão bem-sucedida, o sistema confirma a adição.
- Validações são aplicadas para garantir que os dados inseridos sejam válidos. (Usando Try e Except).

* Consulta da lista de alunas cadastradas:

- Exibe a lista de todas as alunas cadastradas, mostrando apenas os nomes.
- Consulta da quantidade de faltas de alunas.
- Permite buscar o número de faltas de uma aluna específica.
- Permite a consulta das notas de uma aluna específica.
- Permite a consulta do status de aprovação de uma aluna específica.
- Após o cálculo, o sistema exibe o status de aprovação da aluna (aprovada ou reprovada) e sua média final.


## Metodologia:

O sistema foi desenvolvido seguindo uma abordagem modular, onde cada funcionalidade foi implementada separadamente, usando commits individuais para cada etapa, facilitando o controle de versões e a possibilidade de reverter mudanças se necessário. Há também comentários ao longo do código para facilitar o entendimento do sistema.

# Técnicas usadas

- Para evitar erros: Try e except
- Para conversões - listas: split, append
- Para conversões - tuplas: split
- Operadores Booleanos: True e False
- Para condições: If, elif e else.
- Para percorrer listas: For.


Binary file not shown.
62 changes: 62 additions & 0 deletions Veronica/dataset_alunas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
dataset = {
("Ana", "Silva"): {
"Turma": "Turma A",
"Notas": [7.5, 8.0, 9.0],
"Presença": [True, True, False, True, True],
"Participação": 8.5
},
("Mariana", "Santos"): {
"Turma": "Turma B",
"Notas": [6.0, 7.5, 8.5],
"Presença": [True, True, True, False, True],
"Participação": 7.2
},
("Carla", "Oliveira"): {
"Turma": "Turma A",
"Notas": [8.0, 7.5, 8.5],
"Presença": [True, True, True, True, True],
"Participação": 8.2
},
("Juliana", "Ferreira"): {
"Turma": "Turma C",
"Notas": [9.0, 8.5, 7.0],
"Presença": [True, True, True, True, True],
"Participação": 8.7
},
("Patrícia", "Souza"): {
"Turma": "Turma B",
"Notas": [7.0, 7.0, 7.5],
"Presença": [True, False, True, True, True],
"Participação": 7.2
},
("Aline", "Martins"): {
"Turma": "Turma A",
"Notas": [8.5, 8.0, 9.0],
"Presença": [True, True, True, True, True],
"Participação": 8.5
},
("Fernanda", "Costa"): {
"Turma": "Turma C",
"Notas": [6.5, 7.0, 8.0],
"Presença": [True, True, True, False, True],
"Participação": 7.2
},
("Camila", "Pereira"): {
"Turma": "Turma B",
"Notas": [7.5, 8.0, 8.5],
"Presença": [True, True, True, True, True],
"Participação": 8.0
},
("Luana", "Rodrigues"): {
"Turma": "Turma A",
"Notas": [9.0, 9.0, 8.5],
"Presença": [True, True, True, True, True],
"Participação": 8.8
},
("Beatriz", "Lima"): {
"Turma": "Turma C",
"Notas": [8.0, 7.5, 7.0],
"Presença": [True, True, True, False, True],
"Participação": 7.5
}
}
165 changes: 165 additions & 0 deletions Veronica/sistema_de_alunas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
from dataset_alunas import dataset

def main():
print("\n--- Seja bem vinda a 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():
codigo_opcao = 0

while codigo_opcao not in [1, 2, 3, 4, 5]:
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 not in [1, 2, 3, 4, 5]:
print("Opção inválida. Por favor, escolha uma opção válida (1 a 5).\n")
except ValueError:
print("Entrada inválida. Por favor, digite um número inteiro.\n")

return codigo_opcao

def incluir_nova_aluna(dataset): #Pegando os dados: nome, sobrenome, turma, notas presença e participação
try:
nome = input("Digite o nome da aluna... ")
except ValueError:
print("Entrada invalida, digite apenas o nome... ")
Comment on lines +39 to +42
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No código atual, você está usando try-except para capturar exceções de ValueError, mas o uso disso não é apropriado para capturar erros de entrada inválida como você espera. No caso de input, você não espera um ValueError diretamente, então o try-except não é necessário aqui.


try:
sobrenome = input("Digite o sobrenome da aluna... ")
except ValueError:
print("Entrada invalida, digite apenas o sobrenome... ")

try:
turma = input("Digite a turma que a aluna pertence...")
except ValueError:
print("Entrada invalida, digite apenas a turma... ")

try:
notas = input("Digite as notas da aluna separadas por espaço... ")
except ValueError:
print("Entrada invalida, digite as notas separadas por espaço... ")

try:
presenca = input("Indique a presença da aluna utilizando: A para ausente e P para presente separando por espaço... ")
except ValueError:
print("Entrada invalida, digite A para ausente, e P para presente... ")

try:
participacao = input("Digite a nota de participação da aluna... ")
except ValueError:
print("Entrada invalida digite apenas uma nota de participação para aluna... ")

#TRATAMENTO DE DADOS


#Pegando notas digitadas como strings e convertendo para lista de strings
notas = notas.split(" ")


#Covertendo lista str para Lista int
notas_int = []
for nota in notas:
notas_int.append(int(nota)) #pegando todas as string notas do professor e convertendo para numero inteiro
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Um lembrete amigável é que nota é sempre float, pois é um valor decimal.

notas = notas_int


#Convertendo presenças A e P para booleanos
presenca = presenca.split(" ")
presenca_convertida = []
for A_P in presenca:
if A_P == "A":
presenca_convertida.append(False)
elif A_P == "P":
presenca_convertida.append(True)
else:
presenca_convertida.append("Presença invalida.")

presenca = presenca_convertida
Comment on lines +86 to +94
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Aqui podemos simplificar a parte do split e colocar no for, e dar um nome de variável mais intuitivo para a presença atual

Sugestão:

Suggested change
for A_P in presenca:
if A_P == "A":
presenca_convertida.append(False)
elif A_P == "P":
presenca_convertida.append(True)
else:
presenca_convertida.append("Presença invalida.")
presenca = presenca_convertida
presenca_convertida = []
for estado in presenca.split():
if estado == "A":
presenca_convertida.append(False)
elif estado == "P":
presenca_convertida.append(True)
else:
print(f"Presença '{estado}' inválida. Use 'A' para ausente e 'P' para presente.")
return



#Inclusão da aluna no dataset

dataset[nome, sobrenome] = {"Turma": turma, "Notas": notas, "Presença": presenca, "Participação": participacao}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No salvamento dos dados, a gente deve usar uma tupla ao invés de uma lista, se não, teremos erro no modo como tratamos os dados posteriormente, pois nosso dado no dicionário é de um tipo e estamos salvando com outro

Sugestão:

Suggested change
dataset[nome, sobrenome] = {"Turma": turma, "Notas": notas, "Presença": presenca, "Participação": participacao}
dataset(nome, sobrenome) = {"Turma": turma, "Notas": notas, "Presença": presenca, "Participação": participacao}


def consultar_lista_alunas(dataset):
chaves = list(dataset.keys()) #Pegando as chaves do dicionario

for aluna in chaves:
print("Aluna: ", aluna[0], aluna[1]) #Print aluna: (nome e sobrenome da aluna)
Comment on lines +102 to +105
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Em vez de criar uma lista de chaves (chaves = list(dataset.keys())) e iterar sobre ela, você pode iterar diretamente sobre o dicionário dataset.keys(). Isso simplifica o código e torna o processo mais eficiente.

  • Utilizamos diretamente dataset.keys() para iterar sobre as chaves do dicionário.
  • Cada chave (nome, sobrenome) é desestruturada no próprio loop for.
  • O print é formatado para exibir o nome completo da aluna de forma clara e legível.

Sugestão:

Suggested change
chaves = list(dataset.keys()) #Pegando as chaves do dicionario
for aluna in chaves:
print("Aluna: ", aluna[0], aluna[1]) #Print aluna: (nome e sobrenome da aluna)
for nome, sobrenome in dataset.keys():
print(f"Aluna: {nome} {sobrenome}")


def consultar_faltas_aluna(dataset):
nome_aluna_escolhida = input("Digite o nome e o sobrenome da alunas que querira consultar as faltas: ")
nome_aluna = tuple(nome_aluna_escolhida.split(" ")) #Pegando a string com nome e sobrenome e convertendo em uma tupla

presenca = dataset[nome_aluna]["Presença"]
n_faltas = 0
n_presencas = 0
Comment on lines +112 to +113
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Você poderia usar a função count do python para contar as faltas e presenças. Inicialmente é bom para treinar a lógica de programação, mas usar a função count torna seu código mais limpo e fácil de ver, em relação a um for.

Sugestão:

Suggested change
n_faltas = 0
n_presencas = 0
n_faltas = presenca.count(False)
n_presencas = presenca.count(True)


for pren in presenca:
if pren == False: n_faltas += 1
else: n_presencas += 1
print("A aluna", nome_aluna_escolhida, "tem", n_faltas, "faltas.")

porcentagem_presenca = (n_presencas / (n_faltas + n_presencas)) * 100

return porcentagem_presenca

def consultar_notas_aluna(dataset):
nome_aluna_escolhida = input("Digite o nome e o sobrenome da alunas que querira consultar as faltas: ")
nome_aluna = tuple(nome_aluna_escolhida.split(" ")) #Pegando a string com nome e sobrenome e converte em uma tupla

notas = dataset[nome_aluna]["Notas"]
avaliacao = 1
print("A aluna", nome_aluna_escolhida, "teve às seguintes notas:")
for nota in notas:
print("Avaliação:", avaliacao, "Nota:", nota)
avaliacao += 1
Comment on lines +129 to +133
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Podemos usar enumerate(notas, start=1) para iterar sobre a lista de notas (notas) começando a contagem de avaliação de 1. Isso elimina a necessidade de uma variável separada (avaliacao) para contar as avaliações manualmente.

Sugestão:

Suggested change
avaliacao = 1
print("A aluna", nome_aluna_escolhida, "teve às seguintes notas:")
for nota in notas:
print("Avaliação:", avaliacao, "Nota:", nota)
avaliacao += 1
for avaliacao, nota in enumerate(notas, start=1):
print(f"Avaliação {avaliacao}: Nota {nota}")
return notas


return notas

def consultar_status_aprovacao():
nome_aluna_escolhida = input("Digite o nome e sobrenome da aluna que queira consultar o status de aprovação: ")
nome_aluna = tuple(nome_aluna_escolhida.split(" ")) #Pegando a string com nome e sobrenome e converte em uma tupla

nota_corte = 6

print("Para sabermos o status de aprovação da aluna vamos ter que consultar sua nota, participação e presença em aulas")
print("Vamos começar pela nota.")

notas = consultar_notas_aluna(dataset) #Chamando a função para consultar as notas da aluna
media_notas = sum(notas) / len(notas) #Calculando a média: com a somas das notas, dividido pelo numero de notas

print("Agora sua participação.")
participacao = dataset[nome_aluna]["Participação"]
print("A aluna", nome_aluna_escolhida, "teve nota", participacao, "de participação.")

print("Por ultimo a presença.")
porcentagem_presenca = consultar_faltas_aluna(dataset)
print("A aluna", nome_aluna_escolhida, "teve", int(porcentagem_presenca), "% de presença.")

print("")

if media_notas >= 6 and porcentagem_presenca >= 80 and participacao >= 6:
print("A aluna", nome_aluna_escolhida, "esta aprovada.")
else: print("A aluna", nome_aluna_escolhida, "esta reprovada.")
Comment on lines +137 to +161
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Boa implementação da função de calcular aprovação :)
Uma sugestão é validar se a aluna existe no dataset, para evitar que o código quebre ao tentar acessar uma chave que não existe




main()