-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
252 lines (188 loc) · 9.17 KB
/
main.py
File metadata and controls
252 lines (188 loc) · 9.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
from utils.menu import *
from utils.database.json import cargar_datos, guardar_datos
from utils.components.statistics.stats import ordenar_notas, imprimir_notas
from colorama import Fore, Style, init
import time
#CONSTANTES
EDADMINIMA = 13
EDADMAXIMA = 25
DELAY = 1
# Inicializa colorama (necesario para Windows)
init()
estudiantes = {
"Nombre": ...,
"Edad": 0,
"Notas": [],
"Cedula": 0,
}
lista_materias = ["Biologia", "Castellano", "Fisica", "Ingles", "Matematicas", "Quimica", "GHC", "Ciencias de la Tierra", "Premilitar"]
lista_estudiantes = cargar_datos()
def main():
"""Funcion principal que se encarga de la toda la logia del programa
"""
global lista_estudiantes
while True:
print(Fore.LIGHTYELLOW_EX +"\n\t\tPrograma de ingresos de estudiantes\n" + Style.RESET_ALL)
print(Fore.CYAN + "\t\t\tMenú de Ingresos\n" + Style.RESET_ALL)
print("\t\t 1. Estudiante")
print("\t\t 2. Administador")
print("\t\t 3. Salir")
#===================================Menu de Opciones=====================================================
try:
opcion = int(input("\nSeleccione una opcion: "))
except ValueError:
print(Fore.RED + "Error: Por favor ingrese un número válido" + Style.RESET_ALL)
time.sleep(DELAY)
continue
"""Ejecuta la opcion de estudiante, crear un estudiante con los datos del datos"""
if opcion == 1:
time.sleep(DELAY)
print(Fore.CYAN + "\n\tColoque sus datos\n" + Style.RESET_ALL)
#Crea una copia del diccionario
estudiante_actual = estudiantes.copy()
estudiante_actual["Notas"].clear()
nombre = input("Hola usuario porfavor coloque su nombre: ")
apellido = input("Coloque su apellido: ")
#Unir {nombre} y {apelllido}
estudiante_actual["Nombre"] = f"{nombre} {apellido}"
#Verificacion de la edad del usuario sin que el programa termine
while True:
try:
edad = int(input("Ahora porfavor coloque su edad: "))
verificar_edad(edad)
estudiante_actual["Edad"] = edad
break
except (ValueError, TypeError, Exception) as e:
print(f"\nError: {e}")
estudiante_actual["Cedula"] = input("Por favor coloque su cédula: ")
#Verificacion de las notas del usuario sin que el programa termine
for materia in lista_materias:
while True:
try:
nota = int(input(f"\nColoque la nota de {materia}: "))
verificar_notas(nota)
estudiantes["Notas"].append(nota)
break
except (ValueError, TypeError, Exception) as e:
print(Fore.RED + f"\nError: {e}" + Style.RESET_ALL)
#Nota final del estudiante
nota_final = calcular_nota(estudiante_actual["Notas"])
time.sleep(DELAY)
carrera_estudiante = mostrar_menu_universidades()
#==========Imprimir datos del estudiante===========
print("")
print(Fore.CYAN + "\t\tDatos del Estudiante" + Style.RESET_ALL )
for clave, valor in estudiante_actual.items():
#Imprime la lista de notas como un STR(string)
if isinstance(valor, list):
valor_str = ', '.join(map(str, valor))
print(Fore.BLUE + f"{clave}: " + Fore.GREEN + f"{valor_str}")
else:
print(Fore.BLUE + f"{clave}: " + Fore.GREEN + f"{valor}" + Style.RESET_ALL)
#Imprime la nota global y la carrera seleccionada
print(Fore.BLUE + f"Nota Global: " + Fore.GREEN + f"{nota_final:.2f}" + Style.RESET_ALL)
print(Fore.BLUE + f"Carrera seleccionada: " + Fore.GREEN + f"{carrera_estudiante}" + Style.RESET_ALL)
#Guardar datos del estudiante
estudiante_actual["Nota Global"] = nota_final
estudiante_actual["Carrera"] = carrera_estudiante
lista_estudiantes.append(estudiante_actual)
guardar_datos(lista_estudiantes) #Guardar al JSON
#Volver a inicio
input(Fore.YELLOW + "\nPresione Enter para volver al menú principal..." + Style.RESET_ALL)
# ===================================Opción Administrador==================================
elif opcion ==2:
password = input(Fore.YELLOW + "\nColoque la clave de administrador: " + Style.RESET_ALL).lower().strip()
if password == "admin123":
lista_estudiantes = cargar_datos()
print("\n\tMenú de Administracion\n")
print("\t1. Ver la lista de estudiantes.")
print("\t2. Ranking de mejores estudiantes.")
estudiantes_registrados(lista_estudiantes)
try:
opcion_admin = int(input("\nSeleccione una opcion: "))
except ValueError:
print(Fore.RED + "Error: Por favor ingrese un número válido" + Style.RESET_ALL)
time.sleep(DELAY)
continue
if opcion_admin == 1:
#Muestra los datos del estudiante
mostrar_lista_estudiantes(lista_estudiantes)
elif opcion_admin == 2:
estudiantes_ordenados = ordenar_notas(lista_estudiantes)
imprimir_notas(estudiantes_ordenados)
else:
print(Fore.RED + "Opcion no valida" + Style.RESET_ALL)
else:
print("Clave incorrecta")
#Volver a inicio
input(Fore.YELLOW + "\nPresione Enter para volver al menú principal..." + Style.RESET_ALL)
# =================================== Salir ===================================
elif opcion == 3:
time.sleep(DELAY + DELAY)
print("Saliendo.....")
break
else:
print(Fore.RED + "Opción no válida" + Style.RESET_ALL)
time.sleep(DELAY)
"""
FUNCIONES
"""
#Funciones de verificacion
def verificar_edad(edad: int):
"""Verifica que la edad cumpla con los requisitos establecidos.
Valida que la edad esté dentro del rango permitido (13-19 años) y que sea
del tipo de dato correcto (entero).
Args:
edad (int): Edad del estudiante a validar
Raises:
ValueError: Si la edad está fuera del rango permitido (13-19)
TypeError: Si el tipo de dato no es entero
"""
if edad < EDADMINIMA or edad > EDADMAXIMA:
raise ValueError(Fore.RED + "La edad no puede ser menor a 13 o mayor a 19. Porfavor intente de nuevo.\n" + Style.RESET_ALL)
if isinstance(edad, str):
raise TypeError(Fore.RED + "La edad no pueden ser texto\n" + Style.RESET_ALL)
def verificar_notas(nota: int):
"""Verifica que la nota cumpla con los requisitos establecidos.
Valida que la nota esté dentro del rango permitido (0-20) y que sea
del tipo de dato correcto (entero).
Args:
nota (int): Nota del estudiante a validar
Raises:
ValueError: Si la nota está fuera del rango permitido (0-20)
TypeError: Si el tipo de dato no es entero
"""
if nota < 0 or nota > 20:
raise ValueError("Las notas deben estar entre 0 y 20.\n" + Style.RESET_ALL)
if isinstance(nota, str):
raise TypeError("Las notas no pueden ser texto\n" + Style.RESET_ALL)
def calcular_nota(notas: list) -> float:
"""Calcula el promedio de una lista de notas del estudiante.
Toma una lista de notas numéricas y devuelve el promedio en decimales.
Args:
notas (list): Lista de notas numéricas
Returns:
float: Promedio de las notas con precisión decimal
"""
return sum(notas) / len(notas)
def mostrar_lista_estudiantes(estudiantes: list):
"""Muestra en pantalla la lista de estudiantes registrados.
Presenta de forma ordenada la información de todos los estudiantes
en el formato: nombre, edad, cédula y nota global.
Args:
estudiantes (list): Lista de diccionarios con información de estudiantes.
Cada diccionario debe contener las claves:
'Nombre', 'Cedula', 'Edad', 'Nota Global'
"""
print("\nLista de estudiantes:")
for i, estudiante in enumerate(estudiantes, 1):
print(Fore.BLUE + f"\n{i}. Nombre: " + Fore.GREEN + f"{estudiante["Nombre"]}, " + Fore.BLUE + f"Cédula: " + Fore.GREEN + f"{estudiante["Cedula"]}, " + Fore.BLUE + f"Nota Global: " + Fore.GREEN + f"{estudiante['Nota Global']:.2f}")
def estudiantes_registrados(lista_estudiantes: list):
"""Muestra el total de estudiantes registrados.
Presenta el conteo total de estudiantes en color amarillo.
Args:
lista_estudiantes (list): Lista de estudiantes registrados
"""
print(Fore.MAGENTA + f"\tTotal de estudiantes registrados: {len(lista_estudiantes)}" + Style.RESET_ALL)
if __name__ == '__main__':
main()