-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
156 lines (109 loc) · 5.23 KB
/
main.py
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
from random import *
from preguntas import algebra, geometria, estadistca
import matplotlib.pyplot as plt
# Importo librerías y el banco de preguntas
global areas
global puntos
global pregIncorrecta
# Declaro variables que usaré más adelante para guardar los puntos
areas = {'Álgebra':0, 'Geometría':0, 'Estadística':0}
pregIncorrecta = []
# Declaro un diccionario donde guardaré el puntaje más nuevo de cada área
def menu(): # Función menú, donde el usuario podrá escoger el área de estudio o la consulta de calificaciones
print("Práctica Examen Pisa\n")
print("1. Practicar Álgebra")
print("2. Practicar Geometría")
print("3. Practicar Estadística")
print("4. Ver resultados")
print("5. Salir\n")
opcion = input('Ingrese una opción: ')
if opcion == '1':
examenPrincipal(algebra)
elif opcion == '2':
examenPrincipal(geometria)
elif opcion == '3':
examenPrincipal(estadistca)
elif opcion == '4':
graficar()
elif opcion == '5':
# A parte de cerrar el programa, lo que se hace es guardar en un archivo de texto,
# las calificaciones actuales.
areasLlaves = areas.keys()
areasValores = [str(areas[i]) for i in areasLlaves]
f = open('register.txt', 'w')
f.write(' '.join(areasValores))
f.close()
#Crear el archivo de texto con las preguntas incorrectas
f = open('Preguntas Incorrectas.txt', mode = 'w', encoding = 'utf-8')
f.write('\n\n'.join(pregIncorrecta))
else:
print('Opción inválida')
menu()
def examenPrincipal(area):
# En esta función, lo que se hace es que se le da un parámetro, que es el banco de preguntas correspondiente,
# y el programa mezcla de manera aleatoria preguntas y respuestas y actualiza la calificación en el diccionario
# Reseteo la calificación de la cual se está haciendo el examen
if area == estadistca:
areas['Estadística'] = 0
elif area == algebra:
areas['Álgebra'] = 0
else:
areas['Geometría'] = 0
puntos = []
selecPregun = sample(area, 4) # Obtengo cuatro preguntas random del banco
for i in range(4): # Itero para
respsRan = sample(selecPregun[i][1:],4) # Hago random el orden de las respuestas
print(f'{i+1}) {selecPregun[i][0]}\n') # Muestro la pregunta y la numero
for j in range(4): # En este ciclo, muestro las preguntas con las letras correspondientes
alph = 'abcd'
print(f'{alph[j]}) {respsRan[j]}')
while True: # Simulación de un Do-While para pedir una respuesta válida
resp = input('Su respuesta es: ').lower() # Obtención de la respuesta del usuario
try: # Añadí un try porque si intentaba buscar una respuesta que no estuviera en abcd regresaba error
if resp == '': # Correción de un error en el que si el usuario pulsaba enter, tomaba la respuesta 1
pass
elif respsRan[alph.index(resp)] == selecPregun[i][1]: # Hago revisión de la respuesta
puntos.append(f'Pregunta {i+1}: Correcta')
# Si está correcta, añado un punto dependiendo del área
if area == estadistca:
areas['Estadística'] = areas['Estadística'] + 1
elif area == algebra:
areas['Álgebra'] = areas['Álgebra'] + 1
else:
areas['Geometría'] = areas['Geometría'] + 1
# Si no, no añado nada a los puntos y añado una sentencia para informar al usuario que está mal
else:
puntos.append(f'Pregunta {i+1}: Incorrecta')
pregIncorrecta.append(selecPregun[i][0])
except:
pass
if resp in 'abcd' and resp != '': # Aquí simulo la condición del Do-While
print()
break
else:
print('Respuesta no válida')
print('\n'.join(puntos)) # Le muestro al usuario cuáles respuestas tuvo bien y cuáles mal
print()
menu()
def graficar():
# Esta función se encarga tanto de graficar los datos almacenados en el archivo de texto, como los actuales.
try:
f = open('register.txt', 'r')
valoresAnteriores = f.read().split(' ') # Obtención de los datos apartir del archivo de texto
valoresAnteriores = [int(i) for i in valoresAnteriores]
f.close()
except:
valoresAnteriores = [0, 0, 0]
print(areas)
areasLlaves = areas.keys()
areasValores = [areas[i] for i in areasLlaves] # Obtención de datos actuales
fig, (ax1, ax2) = plt.subplots(1, 2) # Formato y representación de la gráficas
fig.suptitle('Calificación por fecha')
fig.set_size_inches(13, 5)
ax1.bar(areasLlaves,valoresAnteriores)
ax2.bar(areasLlaves,areasValores)
ax1.set(xlabel = 'Área', ylabel = 'Puntaje (de 4)', ylim = [0, 4], title = 'Intento Anterior')
ax2.set(xlabel = 'Área', ylabel = 'Puntaje (de 4)', ylim = [0, 4], title = 'Intento Actual')
fig.show()
menu()
menu() # Correr el programa