|
1 | 1 | 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 |
3 | 6 |
|
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.") |
279 | 7 |
|
280 | 8 | #este é o menu principal com o cadastro e que inclui o menu_materias()
|
281 | 9 | def main():
|
@@ -318,5 +46,6 @@ def main():
|
318 | 46 | else:
|
319 | 47 | print("\nOpção inválida. Digite um valor de 1 a 5.")
|
320 | 48 |
|
| 49 | + |
321 | 50 | if __name__ == "__main__":
|
322 | 51 | main() #esta função é chamada quando a condição acima é verdadeira e o script é executado diretamente.
|
0 commit comments