{"id":230,"date":"2020-08-16T11:59:00","date_gmt":"2020-08-16T09:59:00","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=230"},"modified":"2020-08-16T12:06:11","modified_gmt":"2020-08-16T10:06:11","slug":"simple-cuestionario-de-preguntas","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=230","title":{"rendered":"Simple cuestionario de preguntas"},"content":{"rendered":"\n<p>Vamos a construir un peque\u00f1o 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, &#8230;<\/p>\n\n\n\n<p>El primer paso es crear la base de datos, para esta peque\u00f1a aplicaci\u00f3n usaremos <strong>sqlite<\/strong> y crearemos una base de datos llamada <strong>mgtests.db3<\/strong> con dos tablas: <strong>preguntas<\/strong> que incluir\u00e1 el <strong>id<\/strong> como campo identificador de la <strong>pregunta<\/strong>, el campo pregunta que contendr\u00e1 el enunciado de la pregunta y el campo <strong>explicacion<\/strong> en el que podremos incluir una explicaci\u00f3n del porque de la respuesta, en la segunda tabla llamada <strong>respuestas<\/strong>, incluiremos el campo <strong>id<\/strong> que ser\u00e1 el identificador de la respuesta, el campo <strong>idpregunta<\/strong> que coincidir\u00e1 con el campo id de la tabla preguntas y ser\u00e1 la relaci\u00f3n de uno a muchos entre preguntas y respuestas, el campo <strong>respuesta<\/strong> que incluir\u00e1 el enunciado correcto o incorrecto relacionado con la pregunta y el campo <strong>correcta<\/strong> cuyo valor ser\u00e1 0 si no es la respuesta y 1 si es la respuesta correcta.<\/p>\n\n\n\n<p>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\u00f3n.<\/p>\n\n\n\n<p>El siguiente c\u00f3digo, crear\u00e1 una base de datos sqlite3 llamada mgtests.db3 en la ruta actual. Para obtener la ruta actual usamos el m\u00e9todo <strong>getcwd()<\/strong> del paquete <strong>os<\/strong> y con <strong>os.path.join()<\/strong> uniremos la ruta al nombre con el separador correspondiente al sistema operativo en el que nos encontremos que ser\u00e1 <strong>\\<\/strong> en sistemas Windows y <strong>\/<\/strong> en sistemas Linux. Tras esto borrar\u00e1 las tablas si existieran y las crear\u00e1 de nuevo con los campos anteriormente comentados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sqlite3\nimport os\ndb = os.path.join(os.getcwd(),'mgtests.db3')\ncnx = sqlite3.connect(db)\ncur = cnx.cursor()\ncur.execute('DROP TABLE IF EXISTS preguntas')\ncur.execute('''\nCREATE TABLE preguntas (\n  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n  pregunta TEXT NOT NULL,\n  explicacion TEXT\n);''')\ncur.execute('DROP TABLE IF EXISTS respuestas')\ncur.execute('''\nCREATE TABLE respuestas (\n  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n  idpregunta INTEGER NOT NULL,\n  respuesta text NOT NULL,\n  correcta INTEGER DEFAULT 0\n);''')\ncnx.commit()\ncur.close()\ncnx.close()<\/code><\/pre>\n\n\n\n<p>La l\u00f3gica de esta base de datos es crear una pregunta que obtendr\u00e1 un identificador autom\u00e1ticamente y usar ese identificador para crear tantas respuestas como queremos, indicando en una de ellas cual ser\u00e1 la respuesta correcta.<\/p>\n\n\n\n<p>Por ejemplo, hagamos la siguiente pregunta e insert\u00e9mosla manualmente en la base de datos reci\u00e9n creada usando alg\u00fan programa como DB Browser for Sqlite:<\/p>\n\n\n\n<p><strong>\u00bf Cu\u00e1l ser\u00e1 el resultado de ejecutar el comando print(lista[1:3]) sabiendo que lista contiene los siguientes valores: lista = [&#8216;ABCD&#8217;,123,3.5,&#8217;la playa&#8217;,True] ?<\/strong><\/p>\n\n\n\n<p>Las respuestas pueden ser:<\/p>\n\n\n\n<p><strong>A) [3]<\/strong><\/p>\n\n\n\n<p><strong>B) [&#8216;la playa&#8217;]<\/strong><\/p>\n\n\n\n<p><strong>C) [123, 3.5]<\/strong><\/p>\n\n\n\n<p><strong>D) [123, 3.5, &#8216;la playa&#8217;]<\/strong><\/p>\n\n\n\n<p>Creamos un registro en la tabla preguntas cuyo identificador ser\u00e1 1 y a\u00f1adimos la pregunta al campo pregunta.<\/p>\n\n\n\n<p>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.<\/p>\n\n\n\n<p>Con esto ya tenemos nuestra primera pregunta, para hacer las siguientes solo hay que tener en cuenta el identificador de la pregunta, que ser\u00e1 2, 3, etc, &#8230;<\/p>\n\n\n\n<p>Y ahora escribiremos el script que recorrer\u00e1 la base de datos para ir haci\u00e9ndonos 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.<\/p>\n\n\n\n<p>Crearemos algunas variables para gestionar las preguntas y respuestas como <strong>numpregunta<\/strong> que controla el n\u00famero de pregunta, <strong>letras<\/strong> para gestionar las letras de respuesta, <strong>correcta<\/strong> para gestionar la respuesta correcta, <strong>respuestascorrectas<\/strong> para llevar la cuenta de cuentas preguntas acertamos y <strong>respuestasincorrectas<\/strong> para llevar la cuenta de las preguntas que fallamos.<\/p>\n\n\n\n<p>Si hacemos un SELECT de todos los campos de la tabla <strong>preguntas<\/strong>, podremos ir recorriendo cada uno de los registros con un bucle <strong>for in<\/strong>, 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\u00f3n 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.<\/p>\n\n\n\n<p>Conforme recorremos las respuestas, asignamos a la variable letrarespuesta el valor de la posici\u00f3n de la letra en la lista letras: 0-A, 1-B, 2-C,3-D, &#8230;<\/p>\n\n\n\n<p>Con un input() pedimos que el usuario introduzca un valor (A,B,C,D,&#8230;) y si este coincide con el valor que est\u00e1 en la posici\u00f3n de la letra correcta en la lista letras quiere decir que ha acertado, en caso contrario ha fallado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sqlite3\nimport os\nnumpregunta = 1\nletras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\ncorrecta = ''\nrespuestascorrectas = 0\nrespuestasincorrectas = 0\ndb = os.path.join(os.getcwd(),'mgtests.db3')\ncnx = sqlite3.connect(db)\ncurpreguntas = cnx.cursor()\ncurrespuestas = cnx.cursor()\ncurpreguntas.execute('SELECT * FROM preguntas')\nfor pregunta in curpreguntas:\n    print('----------')\n    print('%s> %s' %(numpregunta,pregunta[1]))\n    print('----------')\n    numpregunta+=1\n    currespuestas.execute('SELECT * FROM respuestas WHERE idpregunta=?',str(pregunta[0]))\n    letrarespuesta = 0\n    for respuesta in currespuestas:\n        print('%s> %s' %(letras[letrarespuesta],respuesta[2]))\n        if respuesta[3] == 1:\n            correcta = letras[letrarespuesta]\n        letrarespuesta +=1\n    respuestausuario=input('\u00bfCual es la respuesta correcta? ')\n    print()\n    if respuestausuario.upper() == correcta:\n        print('%s ->>> \u00a1Respuesta correcta!' %respuestausuario)\n        respuestascorrectas+=1\n    else:\n        print('\u00a1Error! la respuesta correcta era la %s' % correcta)\n        respuestasincorrectas+=1\n    print('----------')\n    print()\nprint('----------')\nprint('Test finalizado')\nprint('----------')\nprint('Respuestas correctas: %s' %respuestascorrectas)\nprint('Respuestas incorrectas: %s' %respuestasincorrectas)\n\ncnx.commit()\ncurpreguntas.close()\ncnx.close()<\/code><\/pre>\n\n\n\n<p>En otros posts iremos mejorando este script con diferentes funcionalidades, pero de momento es suficiente como para que podamos crear manualmente una peque\u00f1a bater\u00eda de preguntas y dar respuesta a las mismas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a construir un peque\u00f1o y simple script que recoja preguntas y respuestas de una base de datos y haga &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74,48,100,4,73],"tags":[50,104,6,76,107],"class_list":["post-230","post","type-post","status-publish","format-standard","hentry","category-bases-de-datos","category-colecciones-de-datos","category-os","category-python","category-sqlite","tag-listas","tag-os","tag-python3","tag-sqlite3","tag-test"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=230"}],"version-history":[{"count":3,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/230\/revisions"}],"predecessor-version":[{"id":233,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/230\/revisions\/233"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}