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
59 changes: 59 additions & 0 deletions Nayara-Oliveira/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# S05 - Projeto guiado {Reprograma}
# Tabela de conteúdos
* [O que aprendi](#o-que-aprendi)
* [Descrição - Projeto de casa - Sistema da Escola Reprograma](#projeto-de-casa---sistema-da-escola-reprograma)
* [Descrição - Projeto de sala - Automação de notas](#projeto-de-sala---automação-de-notas)
* [Como acessar os projetos](#como-acessar-os-projetos)
# O que aprendi:
Nesses projetos, apliquei conceitos relacionados a funções, condicionais, tratamento de exceções usando try e except, laços de repetições e estruturas de dados, explorando principalmente a manipulação de dicionários e listas.
# Projeto de casa - Sistema da Escola Reprograma
## Objetivo do projeto:
Criação de um sistema para uma escola. O sistema possui 5 funcionalidades:
- Inclusão de uma nova aluna na base de dados
- O sistema permite a inclusão de uma nova aluna com os seguintes dados: nome, sobrenome, turma, notas (uma lista de números), presença (uma lista de booleanos indicando a presença em cada aula) e participação (um número representando o nota de participação da aluna).
- Caso algum dado não seja válido (por exemplo, notas fora do intervalo, ou usuário dar letras como entrada para nota), o sistema não adiciona aluna
- Consultar a lista de alunas que estão cadastradas
- Exibe a lista de todas as alunas cadastradas, mostrando apenas nomes.
- Caso não haja alunas cadastradas, o sistema informa que não há registros.
- Consultar a quantidade de faltas de uma aluna
- Sistema permite ao usuário buscar as faltas de uma aluna específica.
- O usuário deve informar o nome completo da aluna para realizar a consulta.
- Após a consulta, o sistema exibe a quantidade de faltas da aluna.
- Caso o nome informado não corresponda a uma aluna cadastrada, o sistema informa que não há registro com esse nome.
- Consultar notas de uma aluna
- O sistema permite ao usuário consultar as notas de uma aluna específica.
- O usuário deve informar o nome completo da aluna para realizar a consulta.
- Após a consulta, o sistema exibe as notas obtidas pela aluna em cada avaliação.
- Caso o nome informado não corresponda a uma aluna cadastrada, o sistema informa que não há registro com esse nome.
- Consultar status de aprovação de uma aluna
- O sistema calcula o status de aprovação de uma aluna com base nas suas notas e presença.
- O usuário deve informar o nome completo da aluna para realizar a consulta.
- O sistema calcula a média simples das notas da aluna
- Para o cálculo da aprovação, será considerado: nota de corte igual a 6, pelo menos 80% de presença e nota de participação acima de 6.
- Após o cálculo, o sistema exibe o status de aprovação da aluna (aprovada ou reprovada) e sua média final.
- Caso o nome informado não corresponda a uma aluna cadastrada, o sistema informa que não há registro com esse nome.
# Projeto de sala - Automação de notas
## Objetivo do projeto
Criação de um sistema para uma escola com as seguintes funcionalidades:
- Sistema permite ao usuário inserir o nome da aluna, turma, notas das avaliações, presença e nota de participação em sala.
- Sistema armazena os dados informados pelo usuário em um dicionário, cujos valores são acessados através do nome da aluna.
- Sistema calcula a média ponderada, considerando que: nota de participação tem um peso definido de 20% da média final, enquanto notas de avaliações têm um peso de 80% da média final.
- Sistema exibe o status de aprovação, com base nos seguintes critérios:
- Se o percentual de faltas for maior que 20%, o sistema apresenta o status "Reprovada por falta", independentemente da média final
- Se a média final for igual ou superior a 6, o sistema apresenta o status "Aprovada"
- Se a média final estiver entre 4 e 6, o sistema apresenta o status "Em recuperação"
- Se a média final for inferior a 4, o sistema apresenta o status "Reprovada"
- Caso a aluna estiver em recuperação:
- Sistema pergunta ao usuário se a aluna fez a prova.
- Se a resposta for positiva, sistema solicita e inclui a nota da recuperação.
- Se a nota de recuperação for maior que a menor nota de avaliação, o sistema a substitui pela nota obtida na recuperação, e é calculada uma nova média final
# Como acessar os projetos
Caso deseje testar a atividade, siga esses passos:
1. Clone o repositório em sua máquina
2. Abra o terminal git bash no Visual Studio Code.
3. Navegue até o diretório de nome "Nayara-Oliveira"
- Navegue até diretório de nome "exercicio-sala" para acessar o projeto de sala
- Navegue até diretório de nome "exercicio-casa" para acessar o projeto de casa
4. Execute o arquivo no terminal
- utilize o comando `python Automacao_de_notas.py` para executar o projeto de sala
- Utilize o comando `python sistema_de_alunas.py` para executar o projeto de casa
Binary file not shown.
62 changes: 62 additions & 0 deletions Nayara-Oliveira/exercicio-casa/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
}
}
143 changes: 143 additions & 0 deletions Nayara-Oliveira/exercicio-casa/sistema_de_alunas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
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():
print("Insira os seguintes dados para cadastrar uma nova aluna:")
nome = input("Nome da aluna: ")
sobrenome = input("Sobrenome da aluna: ")
Comment on lines +40 to +41
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.

A parte de obter nome e sobrenome da aluna e construir uma tupla é usada nas outras funções também, neste caso, poderiamos fazer uma função que recebe esses dados e retorna uma chave.

Sugestão:

Suggested change
nome = input("Nome da aluna: ")
sobrenome = input("Sobrenome da aluna: ")
chave_aluna = obter_nome_aluna()
def obter_nome_aluna()
nome = input("Nome da aluna: ")
sobrenome = input("Sobrenome da aluna: ")
return (nome, sobrenome)

turma = input("Turma da aluna: ")
quantidade_notas = input("Quantidade de notas: ")
try:
notas = []
for i in range(int(quantidade_notas)):
try:
nota = float(input(f"Insira a nota #{i+1}: "))
if nota >= 0 and nota <= 10:
notas.append(nota)
else:
print("Entrada inválida. A nota deve ser um número entre 0 e 10.")
except ValueError:
print("Entrada inválida. Por favor, digite um número.\n")
if len(notas) != int(quantidade_notas):
notas = []
except ValueError:
print("Entrada inválida. Por favor, digite um número inteiro.\n")
quantidade_aulas = input("Quantidade de aulas: ")
Comment on lines +43 to +59
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.

Excelente implementação para pegar os dados de notas. Poderíamos mover esse bloco de código para uma nova função, assim podemos reaproveitar futuramente.

try:
presencas = []
for i in range(int(quantidade_aulas)):
presenca = input(f"A aluna esteve presente na aula #{i+1}? Digite P para presente ou A para ausente: ")
if presenca == "P":
presencas.append(True)
elif presenca == "A":
presencas.append(False)
else:
print("Opção inválida. Por favor, escolha uma opção válida (P ou A).")
if len(presencas) != int(quantidade_aulas):
presencas = []
except ValueError:
print("Entrada inválida. Por favor, digite um número inteiro\n")
Comment on lines +60 to +73
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.

Excelente implementação da parte de presenças, assim como o bloco de código anterior, poderíamos mover para uma função específica.

nota_participacao = False
try:
nota_participacao_float = float(input("Nota de participação da aluna: "))
if nota_participacao_float >= 0 and nota_participacao_float <= 10:
nota_participacao = nota_participacao_float
else:
print("Entrada inválida. A nota deve ser um número entre 0 e 10.")
except:
print("Entrada inválida. Por favor, digite um número")

if notas and presencas and nota_participacao:
dataset[(nome, sobrenome)] = {
"Turma": f"Turma {turma}",
"Notas": notas,
"Presença": presencas,
"Participação": nota_participacao
}
print(f"A aluna {nome} {sobrenome} foi adicionada com sucesso.")
else:
print("Não foi possível incluir a aluna na base de dados. Tente novamente")

def consultar_lista_alunas():
nomes_completos = dataset.keys()
if not nomes_completos:
print("Não há registros de alunas cadastradas")
else:
lista_nomes = [nome_completo[0] for nome_completo in nomes_completos]
print("A lista com os nomes das alunas cadastradas é: ")
nomes = [print("-", nome) for nome in lista_nomes]
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.

Estamos atribuindo a impressão a uma variável de forma desnecessária. Podemos simplesmente imprimir em um for. Deste modo, melhoramos a legibilidade e clareza da impressão do nome das alunas e caso queiramos colocar outros tratamentos fica mais fácil.

Sugestão:

Suggested change
nomes = [print("-", nome) for nome in lista_nomes]
for nome in lista_nomes:
print(f"- {nome}")


def consultar_faltas_aluna():
nome = input("Informe o nome da aluna: ")
sobrenome = input("Informe o sobrenome da aluna: ")
try:
faltas = dataset[(nome, sobrenome)]["Presença"].count(False)
if faltas == 1:
print(f"A aluna {nome} {sobrenome} possui {faltas} falta")
else:
print(f"A aluna {nome} {sobrenome} possui {faltas} faltas")
Comment on lines +109 to +112
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.

Adorei que você fez um tratamento para plural :)

except KeyError:
print("Não foi possível consultar as faltas da aluna. O nome completo informado não corresponde a uma aluna cadastrada.")

def consultar_notas_aluna():
nome = input("Informe o nome da aluna: ")
sobrenome = input("Informe o sobrenome da aluna: ")
try:
notas = dataset[(nome, sobrenome)]["Notas"]
for i in range(len(notas)):
print(f"Na avaliação #{i+1}, a nota da aluna {nome} {sobrenome} foi {notas[i]}")
except KeyError:
print("Não foi possível consultar as notas da aluna. O nome completo informado não corresponde a uma aluna cadastrada.")
Comment on lines +117 to +124
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.

Parabéns pela implementação. Outra possibilidade era imprimir uma lista de notas, para não ficar diversas mensagens repetidas.


def consultar_status_aprovacao():
nome = input("Informe o nome da aluna: ")
sobrenome = input("Informe o sobrenome da aluna: ")
try:
notas = dataset[(nome, sobrenome)]["Notas"]
nota_participacao = dataset[(nome, sobrenome)]["Participação"]
media = sum(notas) / len(notas)
presencas = dataset[(nome, sobrenome)]["Presença"]
percentual_presenca = (presencas.count(True) / len(presencas)) * 100
if percentual_presenca >= 80 and media >= 6 and nota_participacao > 6:
status = "aprovada"
else:
status = "reprovada"
print(f"A aluna {nome} {sobrenome} está {status}. A sua média final é {media}")
except KeyError:
print("Não foi possível consultar o status de aprovação. O nome completo informado não corresponde a uma aluna cadastrada.")

main()
112 changes: 112 additions & 0 deletions Nayara-Oliveira/exercicio-sala/Automacao_de_notas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
dataset = {} #Dicionario com escopo global

def main():
print("\n--- Seja bem vinda a Escola do Reprograma! ---\n")
print("Aqui você pode calcular a aprovação de uma aluna.\n")

while True:
nome = obter_dados_aluna() #Chamo a função de pegar dados da aluna
media_ponderada = obter_media_ponderada(nome)
resultado = obter_resultado(nome, media_ponderada)

if resultado == "Em recuperação":
calcula_recuperacao(nome)

print(f"A aluna {nome} da turma {dataset[(nome)]["Turma"]} está {resultado}. A média dela foi: {media_ponderada}.")


def obter_dados_aluna():
print("Insira os seguintes dados: ")
nome = input("Nome da aluna: ") #Recebo nome da aluna
turma = input("Turma da aluna: ") #Recebo nome a turma

notas = obter_notas() #Chamo a função de pegar as notas para alimentar minha lista "notas"
presencas = obter_presenca()
nota_participacao = float(input("Insira a nota de participação da aluna: "))

salvar_dados_aluna(nome, turma, notas, presencas, nota_participacao)

return nome

def obter_notas():
quantidade_notas = input("Quantidade de notas: ") #Recebo a quantidade de notas
notas = [] #Criei uma lista para receber as notas

for contador in range(int(quantidade_notas)):
while True:
entrada = input(f"Insira a nota #{contador + 1}: ")
try:
nota = float(entrada)
notas.append(nota)
break
except ValueError:
print("Entrada inválida. Por favor, insira um número válido.")

return notas

def salvar_dados_aluna(nome, turma, notas, presencas, nota_participacao):
chave = (nome) #Crio uma tupla com o nome
dataset[chave] = { #Adiciono no dicionário os dados que peguei na função obter_dados_aluna
"Turma": turma,
"Notas": notas,
"Presenças": presencas,
"Participação": nota_participacao
}

def obter_media_ponderada(nome):
media_total = obter_media(nome)
peso_media = 0.8
peso_participacao = 0.2
nota_participacao = dataset[(nome)]["Participação"]
media_ponderada = media_total * peso_media + nota_participacao * peso_participacao
return media_ponderada

def obter_media(nome):
notas = dataset[(nome)]["Notas"] #Recupera a lista com as notas
media = float(sum(notas)/len(notas)) #sum = função do python que soma todos os elementos / len = função que retorna tamanho da lista (quantidade)
return media

def obter_resultado(nome, media_ponderada):
qtd_faltas = dataset[(nome)]["Presenças"].count(False)
percentual_faltas = (qtd_faltas / len(dataset[(nome)]["Presença"])) * 100
if percentual_faltas > 20:
return "Reprovada por falta"
elif media_ponderada >= 6:
return "Aprovada"
elif media_ponderada >= 4:
return "Em recuperação"
else:
return "Reprovada"

def obter_presenca():
quantidade_presenca = input("Informe a quantidade de aulas para que a presença possa ser computada: ")
presencas = []
for i in range(int(quantidade_presenca)):
entrada = input(f"A aluna esteve presente na aula {i+1}? Responda Presente ou Ausente: ")
if entrada == "Presente":
presencas.append(True)
elif entrada == "Ausente":
presencas.append(False)
else:
print("Opção inválida. Você deve escrever Presente ou Ausente")
return presencas

def calcula_recuperacao(nome):
recuperacao = input("Aluna fez prova de recuperação? S/N: ")
if recuperacao == "S":
nota_recuperacao = float(input("Insira a nota da prova de recuperação: "))
dataset[(nome)]["Recuperação"] = True
dataset[(nome)]["Nota de recuperação"] = nota_recuperacao
substitui_nota(nome)
else:
dataset[(nome)]["Recuperação"] = False

def substitui_nota(nome):
if dataset[(nome)]["Nota de recuperação"] > min(dataset[(nome)]["Notas"]):
lista_notas = dataset[(nome)]["Notas"]
indice_min = lista_notas.index(min(lista_notas))
lista_notas[indice_min] = dataset[(nome)]["Nota de recuperação"]
nova_media = obter_media_ponderada(nome)
novo_resultado = obter_resultado(nome, nova_media)
return novo_resultado
main()