Simple cuestionario de preguntas

Vamos a construir un pequeño y simple script que recoja preguntas y respuestas de una base de datos y haga las preguntas tipo test con respuestas A,B,C,D, …

El primer paso es crear la base de datos, para esta pequeña aplicación usaremos sqlite y crearemos una base de datos llamada mgtests.db3 con dos tablas: preguntas que incluirá el id como campo identificador de la pregunta, el campo pregunta que contendrá el enunciado de la pregunta y el campo explicacion en el que podremos incluir una explicación del porque de la respuesta, en la segunda tabla llamada respuestas, incluiremos el campo id que será el identificador de la respuesta, el campo idpregunta que coincidirá con el campo id de la tabla preguntas y será la relación de uno a muchos entre preguntas y respuestas, el campo respuesta que incluirá el enunciado correcto o incorrecto relacionado con la pregunta y el campo correcta cuyo valor será 0 si no es la respuesta y 1 si es la respuesta correcta.

Al ser un script tan simple en primera instancia no vamos a tener en cuenta si pudieran haber varias respuestas correctas ni el control de errores, ni una salida un poco mas coloreada o formateada por consola, esto lo dejaremos para mejorar el script en otra ocasión.

El siguiente código, creará una base de datos sqlite3 llamada mgtests.db3 en la ruta actual. Para obtener la ruta actual usamos el método getcwd() del paquete os y con os.path.join() uniremos la ruta al nombre con el separador correspondiente al sistema operativo en el que nos encontremos que será \ en sistemas Windows y / en sistemas Linux. Tras esto borrará las tablas si existieran y las creará de nuevo con los campos anteriormente comentados.

import sqlite3
import os
db = os.path.join(os.getcwd(),'mgtests.db3')
cnx = sqlite3.connect(db)
cur = cnx.cursor()
cur.execute('DROP TABLE IF EXISTS preguntas')
cur.execute('''
CREATE TABLE preguntas (
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  pregunta TEXT NOT NULL,
  explicacion TEXT
);''')
cur.execute('DROP TABLE IF EXISTS respuestas')
cur.execute('''
CREATE TABLE respuestas (
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  idpregunta INTEGER NOT NULL,
  respuesta text NOT NULL,
  correcta INTEGER DEFAULT 0
);''')
cnx.commit()
cur.close()
cnx.close()

La lógica de esta base de datos es crear una pregunta que obtendrá un identificador automáticamente y usar ese identificador para crear tantas respuestas como queremos, indicando en una de ellas cual será la respuesta correcta.

Por ejemplo, hagamos la siguiente pregunta e insertémosla manualmente en la base de datos recién creada usando algún programa como DB Browser for Sqlite:

¿ Cuál será el resultado de ejecutar el comando print(lista[1:3]) sabiendo que lista contiene los siguientes valores: lista = [‘ABCD’,123,3.5,’la playa’,True] ?

Las respuestas pueden ser:

A) [3]

B) [‘la playa’]

C) [123, 3.5]

D) [123, 3.5, ‘la playa’]

Creamos un registro en la tabla preguntas cuyo identificador será 1 y añadimos la pregunta al campo pregunta.

Creamos cuatro registros en la tabla de respuestas cuyo campo idpregunta sea 1, con cada una de las respuestas y escribiendo un 1 en la respuesta correcta que es la tercera.

Con esto ya tenemos nuestra primera pregunta, para hacer las siguientes solo hay que tener en cuenta el identificador de la pregunta, que será 2, 3, etc, …

Y ahora escribiremos el script que recorrerá la base de datos para ir haciéndonos las preguntas. Para ello importaremos los paquetes sqlite3 y os con los que obtener la ruta de la base de datos y conectarnos a la misma.

Crearemos algunas variables para gestionar las preguntas y respuestas como numpregunta que controla el número de pregunta, letras para gestionar las letras de respuesta, correcta para gestionar la respuesta correcta, respuestascorrectas para llevar la cuenta de cuentas preguntas acertamos y respuestasincorrectas para llevar la cuenta de las preguntas que fallamos.

Si hacemos un SELECT de todos los campos de la tabla preguntas, podremos ir recorriendo cada uno de los registros con un bucle for in, obteniendo el id de la pregunta para hacer un SELECT en respuestas de todos los registros cuyo idpregunta sea igual al identificador de la pregunta. podemos dirigirnos a cada uno de los campos con su posición en la tabla, por ejemplo preguntas[0] es el id, preguntas[1] es la pregunta y lo mismo con las respuestas, respuestas[0] es el id de la respuesta, respuestas[1] es idpregunta, respuestas[2] es la respuesta en si y respuestas[3] es el campo correcta.

Conforme recorremos las respuestas, asignamos a la variable letrarespuesta el valor de la posición de la letra en la lista letras: 0-A, 1-B, 2-C,3-D, …

Con un input() pedimos que el usuario introduzca un valor (A,B,C,D,…) y si este coincide con el valor que está en la posición de la letra correcta en la lista letras quiere decir que ha acertado, en caso contrario ha fallado.

import sqlite3
import os
numpregunta = 1
letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
correcta = ''
respuestascorrectas = 0
respuestasincorrectas = 0
db = os.path.join(os.getcwd(),'mgtests.db3')
cnx = sqlite3.connect(db)
curpreguntas = cnx.cursor()
currespuestas = cnx.cursor()
curpreguntas.execute('SELECT * FROM preguntas')
for pregunta in curpreguntas:
    print('----------')
    print('%s> %s' %(numpregunta,pregunta[1]))
    print('----------')
    numpregunta+=1
    currespuestas.execute('SELECT * FROM respuestas WHERE idpregunta=?',str(pregunta[0]))
    letrarespuesta = 0
    for respuesta in currespuestas:
        print('%s> %s' %(letras[letrarespuesta],respuesta[2]))
        if respuesta[3] == 1:
            correcta = letras[letrarespuesta]
        letrarespuesta +=1
    respuestausuario=input('¿Cual es la respuesta correcta? ')
    print()
    if respuestausuario.upper() == correcta:
        print('%s ->>> ¡Respuesta correcta!' %respuestausuario)
        respuestascorrectas+=1
    else:
        print('¡Error! la respuesta correcta era la %s' % correcta)
        respuestasincorrectas+=1
    print('----------')
    print()
print('----------')
print('Test finalizado')
print('----------')
print('Respuestas correctas: %s' %respuestascorrectas)
print('Respuestas incorrectas: %s' %respuestasincorrectas)

cnx.commit()
curpreguntas.close()
cnx.close()

En otros posts iremos mejorando este script con diferentes funcionalidades, pero de momento es suficiente como para que podamos crear manualmente una pequeña batería de preguntas y dar respuesta a las mismas.

4 comentarios en «Simple cuestionario de preguntas»

  1. copie este mismo codigo para mi trabajo final pero una pregunta en que parte del codigo puedo agregar las preguntas

    1. Hola Carlos.

      Este código no incluye la creación de las preguntas, puedes hacerlo añadiéndolas al fichero sqlite con algún programa como sqlitebrowser o crear tu propio código para añadir preguntas y respuestas.

      Saludos.
      Manuel

  2. que buena tu explicación, tengo una pregunta de condiciones y porcentaje , por ejemplo si tengo que ingresar diferentes montos los cuales son indeterminados y que para finalizar la cantidad de ingresos de los precios se coloca un cero, estos montos o precios deben ser menores a 50000 tendremos un 7%de descuento en el total y si sobrepasa o es igual a 50000 el descuento es 12%, debiendo mostrar como pantalla la suma total sin descuento, el monto de descuento conseguido, y el monto total con los descuentos aplicados. como debo ordenarlos?, soy nuevo en Python y estoy aprendiendo de apoco y me es confuso ordenarlos estoy partiendo y desee aprender esta mezcla y como sacarlo lo que he encontrado me da error gracias si deseas ayudarme mil gracias hasta pronto

    1. Hola Luisa.
      Añade los valores a una lista y luego ordénalos con el método sort() como en el siguiente ejemplo:
      num=[2,3,1]
      num.sort()
      print(num)
      [1,2,3]
      Saludos
      Manuel

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *