-
Notifications
You must be signed in to change notification settings - Fork 38
On34 - S05 - Projeto Guiado #1 - Nayara Oliveira Santos #15
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
base: main
Are you sure you want to change the base?
Changes from all commits
78d1855
fbfe8e4
04dc32a
b0f5f1d
3becbee
a35cfbb
d9377c6
e596b8e
5496adf
943dd81
098add0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 |
| 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 | ||
| } | ||
| } |
| 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: ") | ||||||||
| 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
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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] | ||||||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
|
||||||||
|
|
||||||||
| 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
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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() | ||||||||
| 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() |
There was a problem hiding this comment.
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: