Skip to content

Commit 7ad9591

Browse files
committed
feat: modularizando o código e separando em pastas
1 parent edbb328 commit 7ad9591

23 files changed

+320
-279
lines changed

estudante.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"nome": "Davi",
3+
"matricula": "231030421",
4+
"materias_cursadas_ou_cursando": [
5+
"c1",
6+
"c2",
7+
"ial"
8+
]
9+
}
File renamed without changes.
-15.5 KB
Binary file not shown.

src/atividade_livre.py

Lines changed: 5 additions & 276 deletions
Original file line numberDiff line numberDiff line change
@@ -1,281 +1,9 @@
11
from abc import ABC, abstractmethod
2-
import json
2+
from materia.classe_materia import Materia, MateriaBase, MateriaSemPreRequisito
3+
from estudante.classe_estudante import Estudante
4+
from menu.menus import menu_materias, mostrar_menu
5+
from database.materias import materias
36

4-
#Classes
5-
6-
#classe abstrata
7-
class MateriaBase(ABC):
8-
@abstractmethod
9-
def descricao(self):
10-
pass
11-
12-
class Materia(MateriaBase):
13-
def __init__(self, nome, codigo, creditos, pre_requisito, status):
14-
self.nome = nome
15-
self.codigo = codigo #código da matéria
16-
self.creditos = creditos
17-
self.pre_requisito = pre_requisito #numero de creditos de materias que ela desbloqueia
18-
self.status = status #0 para não cursada, 1 para cursada ou cursando
19-
20-
@property #aqui ocorre o encapsulamento dos atributos
21-
def nome(self):
22-
return self._nome
23-
24-
@nome.setter #o setter também ajuda no encapsulamento
25-
def nome(self, value):
26-
self._nome = value
27-
28-
@property
29-
def codigo(self):
30-
return self._codigo
31-
32-
@codigo.setter
33-
def codigo(self, value):
34-
self._codigo = value
35-
36-
@property
37-
def creditos(self):
38-
return self._creditos
39-
40-
@creditos.setter
41-
def creditos(self, value):
42-
self._creditos = value
43-
44-
@property
45-
def pre_requisito(self):
46-
return self._pre_requisito
47-
48-
@pre_requisito.setter
49-
def pre_requisito(self, value):
50-
self._pre_requisito = value
51-
52-
@property
53-
def status(self):
54-
return self._status
55-
56-
@status.setter
57-
def status(self, value):
58-
self._status = value
59-
60-
def descricao(self):
61-
return f"{self.nome} ({self.codigo}) - Créditos: {self.creditos}, Pré-requisitos: {self.pre_requisito}"
62-
63-
#Para matérias que não trancam outras
64-
class MateriaSemPreRequisito(MateriaBase):
65-
def __init__(self, nome, codigo, creditos, status):
66-
self.nome = nome
67-
self.codigo = codigo
68-
self.creditos = creditos
69-
self.status = status
70-
71-
@property #encapsulamento novamente :)
72-
def nome(self):
73-
return self._nome
74-
75-
@nome.setter
76-
def nome(self, value):
77-
self._nome = value
78-
79-
@property
80-
def codigo(self):
81-
return self._codigo
82-
83-
@codigo.setter
84-
def codigo(self, value):
85-
self._codigo = value
86-
87-
@property
88-
def creditos(self):
89-
return self._creditos
90-
91-
@creditos.setter
92-
def creditos(self, value):
93-
self._creditos = value
94-
95-
@property
96-
def status(self):
97-
return self._status
98-
99-
@status.setter
100-
def status(self, value):
101-
self._status = value
102-
103-
#isso serve para o menu de matérias - quando um usuário quiser verificar alguma matéria individual
104-
def descricao(self):
105-
return f"{self.nome} ({self.codigo}) - Créditos: {self.creditos}, Sem pré-requisitos"
106-
107-
class Estudante:
108-
def __init__(self, nome, matricula, materias_em_andamento):
109-
self.nome = nome
110-
self.matricula = matricula #usar isso como parametro pra calcular qual grade trará uma formatura mais breve?
111-
self.materias_em_andamento = materias_em_andamento
112-
113-
@classmethod
114-
#isso serve para realização do cadastro, opção 1 do menu principal
115-
def cadastro_estudante(cls, materias):
116-
nome_estudante = input("\nOlá. Qual o seu nome? ")
117-
matricula_estudante = input("\nE qual a sua matrícula? ")
118-
materias_em_andamento = []
119-
#Esse Loop serve para o usuário conseguir digitar mais de 1 matéria ao invés de ter de retornar toda vez ao menu
120-
while True:
121-
materia = input("\nDigite uma abreviação da matéria que você está cursando ou já cursou (ou digite 'sair' para finalizar): ").strip().lower()
122-
print("\nPara realizar a abreviação, basta digitar as iniciais e desprezar a preposição")
123-
print("Exemplo: Cálculo 1 vira c1; Gestão da Produção e Qualidade vira gpq;\n")
124-
if materia.lower() == 'sair':
125-
print("Saindo do cadastro...\n")
126-
break
127-
if materia in materias:
128-
materias[materia].status = 1 #o status é mudado para indicar que está cursando ou foi cursada
129-
materias_em_andamento.append(materia)
130-
print(f"Matéria {materia} cadastrada com sucesso!")
131-
print("Caso queira sair do cadastro, basta digitar sair\n")
132-
else:
133-
print(f"Matéria {materia} não encontrada.\n")
134-
135-
return cls(nome_estudante, matricula_estudante, materias_em_andamento)
136-
137-
def listar_materias_cadastradas(self, materias):
138-
print("\nMatérias cadastradas:\n")
139-
for materia in self.materias_em_andamento:
140-
if materia in materias:
141-
print(f"{materia}\n")
142-
else:
143-
print(f"{materia} não foi encontrada. Tente novamente.\n")
144-
145-
def listar_materias_importantes(self, materias): #essa listagem não inclui matérias cadastradas pelo usuário (status == 1)
146-
materias_pendentes = [
147-
materia for materia in materias.values()
148-
if materia.status == 0 and isinstance(materia, Materia)
149-
]
150-
151-
# Ordena as matérias pendentes por número de créditos de pré-requisitos em ordem decrescente, para dar uma ênfase correta às matérias mais importantes
152-
top_materias = sorted(
153-
materias_pendentes, key=lambda materia: materia.pre_requisito, reverse=True
154-
)[:5]
155-
156-
print("\nTop 5 matérias com maior quantidade de créditos de pré-requisitos:\n")
157-
for materia in top_materias: #Para cada matéria dentro das 5 encontradas acima
158-
print(
159-
f"{materia.nome} ({materia.codigo}) - Créditos de pré-requisitos: {materia.pre_requisito}\n"
160-
)
161-
print("As matérias acima deverão ser priorizadas na sua jornada. Boa sorte!\n")
162-
163-
def salvar_para_json(self, filepath):
164-
dados_estudante = {
165-
'nome': self.nome,
166-
'matricula': self.matricula,
167-
'materias_cursadas_ou_cursando': self.materias_em_andamento
168-
}
169-
with open(filepath, 'w') as json_file:
170-
json.dump(dados_estudante, json_file, indent=4)
171-
print(f"Dados de {self.nome} salvos com sucesso em {filepath}\n")
172-
173-
def carregar_de_json(self, filepath):
174-
with open(filepath, 'r') as json_file:
175-
dados_estudante = json.load(json_file)
176-
self.nome = dados_estudante['nome']
177-
self.matricula = dados_estudante['matricula']
178-
self.materias_em_andamento = dados_estudante['materias_cursadas_ou_cursando']
179-
print(f"\nDados de {self.nome} carregados com sucesso de {filepath}\n")
180-
181-
materias = {
182-
#No momento, o usuário terá de digitar "c1", "apc" e afins sem as aspas.
183-
# 1 semestre
184-
"c1": Materia("Cálculo 1", "MAT0025", 6, 22, 0),
185-
"apc": Materia("Algoritmos e Programação de Computadores", "CIC0004", 6, 74, 0),
186-
"diac": MateriaSemPreRequisito("Desenho Industrial Assistido por Computador", "FGA0168", 6, 0),
187-
"ea": MateriaSemPreRequisito("Engenharia e Ambiente", "FGA0161", 4, 0),
188-
"ie": MateriaSemPreRequisito("Introdução à Engenharia", "FGA0163", 2, 0),
189-
# 2 semestre
190-
"c2": Materia("Cálculo 2", "MAT0026", 6, 4, 0),
191-
"f1": MateriaSemPreRequisito("Física 1", "IFD0171", 4, 0),
192-
"f1e": MateriaSemPreRequisito("Física 1 Experimental", "IFD0173", 2, 0),
193-
"ial": Materia("Introdução à Álgebra Linear", "MAT0031", 4, 26, 0),
194-
"peae": MateriaSemPreRequisito("Probabilidade e Estatística Aplicada à Engenharia", "FGA0157", 4, 0),
195-
# 3 semestre
196-
"mne": MateriaSemPreRequisito("Métodos Numéricos para Engenharia", "FGA0160", 4, 0),
197-
"ee": Materia("Engenharia Econômica", "FGA0133", 4, 8, 0),
198-
"hc": MateriaSemPreRequisito("Humanidades e Cidadania", "FGA0164", 2, 0),
199-
"ted1": Materia("Teoria de Eletrônica Digital 1", "FGA0073", 4, 20, 0),
200-
"ped1": MateriaSemPreRequisito("Prática de Eletrônica Digital 1", "FGA0071", 2, 0),
201-
"oo": Materia("Orientação a Objetos", "FGA0158", 4, 50, 0),
202-
"md1": Materia("Matemática Discreta 1", "FGA0085", 4, 12, 0),
203-
# 4 semestre
204-
"gpq": Materia("Gestão da Produção e Qualidade", "FGA0184", 4, 4, 0),
205-
"mds": Materia("Métodos de Desenvolvimento de Software", "FGA0138", 4, 38, 0),
206-
"ed1": Materia("Estrutura de Dados 1", "FGA0147", 4, 20, 0),
207-
"fac": Materia("Fundamentos de Arquitetura de Computadores", "FGA0142", 4, 16, 0),
208-
"md2": Materia("Matemática Discreta 2", "FGA0108", 4, 8, 0),
209-
"pi1": Materia("Projeto Integrador de Engenharia 1", "FGA0150", 4, 6, 0),
210-
# 5 semestre
211-
"ihc": Materia("Interação Humano Computador", "FGA0173", 4, 4, 0),
212-
"rs": Materia("Requisitos de Software", "FGA0172", 4, 18, 0),
213-
"sb1": Materia("Sistemas de Banco de Dados 1", "FGA0137", 4, 4, 0),
214-
"fso": Materia("Fundamentos de Sistemas Operacionais", "FGA0170", 4, 12, 0),
215-
"cp1": Materia("Compiladores 1", "FGA0003", 4, 4, 0),
216-
"eda2": Materia("Estrutura de Dados 2", "FGA0030", 4, 4, 0),
217-
# 6 semestre
218-
"qs1": MateriaSemPreRequisito("Qualidade de Software 1", "FGA0278", 4, 0),
219-
"ts": Materia("Testes de Software", "FGA0238", 4, 18, 0),
220-
"ads": Materia("Arquitetura e Desenho de Software", "FGA0208", 4, 14, 0),
221-
"frc": Materia("Fundamentos de Redes de Computadores", "FGA0211", 4, 4, 0),
222-
"sb2": MateriaSemPreRequisito("Sistemas de Banco de Dados 2", "FGA0060", 4, 0),
223-
"paa": MateriaSemPreRequisito("Projeto de Algoritmos", "FGA0124", 4, 0),
224-
# 7 semestre
225-
"tpe": Materia("Técnicas de Programação em Plataformas Emergentes", "FGA0242", 4, 10, 0),
226-
"pp": MateriaSemPreRequisito("Paradigmas de Programação", "FGA0210", 4, 0),
227-
"fse": MateriaSemPreRequisito("Fundamentos de Sistemas Embarcados", "FGA0109", 4, 0),
228-
"pspd": MateriaSemPreRequisito("Programação para Sistemas Paralelos e Distribuídos", "FGA0244", 4, 0),
229-
# 8 semestre
230-
"eps": Materia("Engenharia de Produto de Software", "FGA0206", 4, 6, 0),
231-
"gce": MateriaSemPreRequisito("Gerência de Configuração e Evolução de Software", "FGA0240", 4, 0),
232-
"es1": MateriaSemPreRequisito("Estágio Supervisionado 1", "FGA0021", 14, 0),
233-
# 9 semestre
234-
"pi2": MateriaSemPreRequisito("Projeto Integrador de Engenharia 2", "FGA0250", 6, 0),
235-
"tcc1": Materia("Trabalho de Conclusão de Curso 1", "FGA0009", 4, 6, 0),
236-
# 10 semestre
237-
"tcc2": MateriaSemPreRequisito("Trabalho de Conclusão de Curso 2", "FGA0011", 6, 0)
238-
}
239-
240-
def mostrar_menu():
241-
print("*** Olá. Este é o menu de cadastro das disciplinas obrigatórias de Software da FCTE ***")
242-
print("1 - Cadastrar estudante e matérias obrigatórias cursadas ou cursando")
243-
print("2 - Listar matérias já cadastradas")
244-
print("3 - Carregar dados de JSON")
245-
print("4 - Listar matérias mais urgentes")
246-
print("5 - Acessar menu de matérias")
247-
print("6 - Sair")
248-
249-
def listar_materias(materias):
250-
print("\nLista de todas as matérias:")
251-
for codigo, materia in materias.items():
252-
print(f"{codigo}: {materia.nome}")
253-
254-
def mostrar_descricao(materias):
255-
codigo = input("Digite o código da matéria: ")
256-
if codigo in materias:
257-
print(materias[codigo].descricao())
258-
else:
259-
print("Matéria não encontrada.")
260-
261-
#este menu será uma das opções dentro do menu principal e ajudará o usuário sem familiaridade com as
262-
#disciplinas de Software
263-
def menu_materias():
264-
while True:
265-
print("\nMenu de Matérias:")
266-
print("1. Listar todas as matérias")
267-
print("2. Mostrar descrição de uma matéria")
268-
print("3. Voltar ao menu principal")
269-
opcao = input("Escolha uma opção de 1 a 3 do Menu de Matérias: ")
270-
if opcao == "1":
271-
listar_materias(materias)
272-
elif opcao == "2":
273-
mostrar_descricao(materias)
274-
elif opcao == "3":
275-
print("Voltando ao Menu Principal...\n")
276-
break
277-
else:
278-
print("\nOpção inválida. Digite um valor de 1 a 3.")
2797

2808
#este é o menu principal com o cadastro e que inclui o menu_materias()
2819
def main():
@@ -318,5 +46,6 @@ def main():
31846
else:
31947
print("\nOpção inválida. Digite um valor de 1 a 5.")
32048

49+
32150
if __name__ == "__main__":
32251
main() #esta função é chamada quando a condição acima é verdadeira e o script é executado diretamente.
File renamed without changes.
172 Bytes
Binary file not shown.
Binary file not shown.

src/database/materias.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from materia.classe_materia import Materia, MateriaBase, MateriaSemPreRequisito
2+
import json
3+
4+
materias = {
5+
#No momento, o usuário terá de digitar "c1", "apc" e afins sem as aspas.
6+
# 1 semestre
7+
"c1": Materia("Cálculo 1", "MAT0025", 6, 22, 0),
8+
"apc": Materia("Algoritmos e Programação de Computadores", "CIC0004", 6, 74, 0),
9+
"diac": MateriaSemPreRequisito("Desenho Industrial Assistido por Computador", "FGA0168", 6, 0),
10+
"ea": MateriaSemPreRequisito("Engenharia e Ambiente", "FGA0161", 4, 0),
11+
"ie": MateriaSemPreRequisito("Introdução à Engenharia", "FGA0163", 2, 0),
12+
# 2 semestre
13+
"c2": Materia("Cálculo 2", "MAT0026", 6, 4, 0),
14+
"f1": MateriaSemPreRequisito("Física 1", "IFD0171", 4, 0),
15+
"f1e": MateriaSemPreRequisito("Física 1 Experimental", "IFD0173", 2, 0),
16+
"ial": Materia("Introdução à Álgebra Linear", "MAT0031", 4, 26, 0),
17+
"peae": MateriaSemPreRequisito("Probabilidade e Estatística Aplicada à Engenharia", "FGA0157", 4, 0),
18+
# 3 semestre
19+
"mne": MateriaSemPreRequisito("Métodos Numéricos para Engenharia", "FGA0160", 4, 0),
20+
"ee": Materia("Engenharia Econômica", "FGA0133", 4, 8, 0),
21+
"hc": MateriaSemPreRequisito("Humanidades e Cidadania", "FGA0164", 2, 0),
22+
"ted1": Materia("Teoria de Eletrônica Digital 1", "FGA0073", 4, 20, 0),
23+
"ped1": MateriaSemPreRequisito("Prática de Eletrônica Digital 1", "FGA0071", 2, 0),
24+
"oo": Materia("Orientação a Objetos", "FGA0158", 4, 50, 0),
25+
"md1": Materia("Matemática Discreta 1", "FGA0085", 4, 12, 0),
26+
# 4 semestre
27+
"gpq": Materia("Gestão da Produção e Qualidade", "FGA0184", 4, 4, 0),
28+
"mds": Materia("Métodos de Desenvolvimento de Software", "FGA0138", 4, 38, 0),
29+
"ed1": Materia("Estrutura de Dados 1", "FGA0147", 4, 20, 0),
30+
"fac": Materia("Fundamentos de Arquitetura de Computadores", "FGA0142", 4, 16, 0),
31+
"md2": Materia("Matemática Discreta 2", "FGA0108", 4, 8, 0),
32+
"pi1": Materia("Projeto Integrador de Engenharia 1", "FGA0150", 4, 6, 0),
33+
# 5 semestre
34+
"ihc": Materia("Interação Humano Computador", "FGA0173", 4, 4, 0),
35+
"rs": Materia("Requisitos de Software", "FGA0172", 4, 18, 0),
36+
"sb1": Materia("Sistemas de Banco de Dados 1", "FGA0137", 4, 4, 0),
37+
"fso": Materia("Fundamentos de Sistemas Operacionais", "FGA0170", 4, 12, 0),
38+
"cp1": Materia("Compiladores 1", "FGA0003", 4, 4, 0),
39+
"eda2": Materia("Estrutura de Dados 2", "FGA0030", 4, 4, 0),
40+
# 6 semestre
41+
"qs1": MateriaSemPreRequisito("Qualidade de Software 1", "FGA0278", 4, 0),
42+
"ts": Materia("Testes de Software", "FGA0238", 4, 18, 0),
43+
"ads": Materia("Arquitetura e Desenho de Software", "FGA0208", 4, 14, 0),
44+
"frc": Materia("Fundamentos de Redes de Computadores", "FGA0211", 4, 4, 0),
45+
"sb2": MateriaSemPreRequisito("Sistemas de Banco de Dados 2", "FGA0060", 4, 0),
46+
"paa": MateriaSemPreRequisito("Projeto de Algoritmos", "FGA0124", 4, 0),
47+
# 7 semestre
48+
"tpe": Materia("Técnicas de Programação em Plataformas Emergentes", "FGA0242", 4, 10, 0),
49+
"pp": MateriaSemPreRequisito("Paradigmas de Programação", "FGA0210", 4, 0),
50+
"fse": MateriaSemPreRequisito("Fundamentos de Sistemas Embarcados", "FGA0109", 4, 0),
51+
"pspd": MateriaSemPreRequisito("Programação para Sistemas Paralelos e Distribuídos", "FGA0244", 4, 0),
52+
# 8 semestre
53+
"eps": Materia("Engenharia de Produto de Software", "FGA0206", 4, 6, 0),
54+
"gce": MateriaSemPreRequisito("Gerência de Configuração e Evolução de Software", "FGA0240", 4, 0),
55+
"es1": MateriaSemPreRequisito("Estágio Supervisionado 1", "FGA0021", 14, 0),
56+
# 9 semestre
57+
"pi2": MateriaSemPreRequisito("Projeto Integrador de Engenharia 2", "FGA0250", 6, 0),
58+
"tcc1": Materia("Trabalho de Conclusão de Curso 1", "FGA0009", 4, 6, 0),
59+
# 10 semestre
60+
"tcc2": MateriaSemPreRequisito("Trabalho de Conclusão de Curso 2", "FGA0011", 6, 0)
61+
}
173 Bytes
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)