Page 1 of 1

Modulo de preguntas tipo test (alguien tiene algo)

Posted: Fri Jan 04, 2019 11:22 am
by Andrés González
Alguien tiene hecho algún modulo aunque sea sencillo de control de preguntas tipo test, basado en ficheros externos. Me encuentro preparando una oposición y ya tengo un programa preparado para ello pero me falta algo para que gestione las preguntas, los ficheros los tengo ya que están casi todos en internet. También me iría bien algo comercial que fuera fácil de implementar a mi aplicativo. Me refiero a ficheros de texto donde esta la relación de todas las preguntas tipo test de un determinado tema con la respuesta marcada con un asterisco y una aclaración a la respuesta correcta, el programa lee ese fichero y te realiza la gestión de todo, parece sencillo la gestión pero ahora no tengo mucho tiempo y es por si alguien lo tiene hecho, los que he mirado en internet son muy raros y no tengo mucha experiencia en ello.

Fichero_externo.txt
1. El artículo 149.1.21 de la CE, otorga al Estado en materia de tráfico y de circulación de vehículos a motor:

*a. Competencia exclusiva
b. Competencia compartida
c. Competencia por delegación
d. Competencia básica

[Disposición final primera. Título competencial.

Esta ley se dicta al amparo de la competencia exclusiva atribuida al Estado sobre tráfico y circulación de vehículos a motor por el artículo 149.1.21ª de la Constitución Española. ]

2. ¿Qué norma autorizó al Gobierno para que llevara a cabo la elaboración de un texto refundido de la Ley sobre Tráfico, Circulación de Vehículos a Motor y Seguridad Vial?:

a. El Real Decreto Legislativo 339/1990, de 2 de marzo.
*b. La Ley 06/2014, de 7 de abril
c. El Real Decreto 1428/2003, de 21 de noviembre.
d. El Código de la Circulación

[Preámbulo Texto Refundido

La disposición final segunda de la Ley 6/2014, de 7 de abril, por la que se modifica el texto articulado de la Ley sobre Tráfico, Circulación de Vehículos a Motor y Seguridad Vial, aprobado por el Real Decreto Legislativo 339/1990, de 2 de marzo, autoriza al Gobierno para aprobar, en el plazo de dieciocho meses a partir de su entrada en vigor que tuvo lugar, con carácter general, el 9 de mayo de 2014, un texto refundido … ]

3. El Texto Refundido de la Ley de Tráfico y Seguridad Vial regula las competencias en materia de tráfico que corresponden a …

a. La Administración General del Estado
b. A las Comunidades Autónomas con competencias transferidas en materia de tráfico
c. A las Entidades Locales
*d. Las respuestas a), b) y c) son correctas

Re: Modulo de preguntas tipo test (alguien tiene algo)

Posted: Fri Jan 04, 2019 2:08 pm
by cmsoft
Yo tengo algo parecido, es tipo un multiple choice, donde vos pones las 3 preguntas que van en el multiple choice, y un campo que tiene la correcta (1,2 o 3). Las preguntas las arma por grupo, y las elige en forma ramdom del grupo. Tiene un timer que determina el tiempo que tiene para responder cada pregunta, y cuando se acaba el tiempo pasa a la proxima pregunta indicando que esa no fue respondida. Las preguntas estan en una base de datos mysql. Es un proyecto que estoy iniciando para tomar examenes de licencias de conducir. Es muy parecido a lo que estas exponiendo. Tambien si la pregunta tiene una imagen a la que hace referencia, te la muestra en la pantalla.
Si te interesa te lo puedo pasar y lo adaptas a tus necesidades.

Re: Modulo de preguntas tipo test (alguien tiene algo)

Posted: Fri Jan 04, 2019 7:14 pm
by Andrés González
Gracias Cesar, la verdad cualquier cosa que me pueda ayudar a iniciarme en las preguntas tipo test me ira bien, dime cosas por correo si quieres zalezalon@gmail.com

Re: Modulo de preguntas tipo test (alguien tiene algo)

Posted: Fri Jan 04, 2019 11:06 pm
by cmsoft
Esto es lo que tengo hasta ahora. Hay algunas partes, que como estoy haciendo pruebas, estan fijas (como la cantidad de preguntas, o la cantidad de respuestas correctas para aprobar). Claramente pueden ser configurables.

Code: Select all

#include "FiveWin.ch"
#include "tdolphin.ch"
#include "layout.ch"
STATIC oQry, oBot, oSay, oImg, aPreg, nPre, oWnd, nTiempo
MEMVAR oApp
function Main(cGrupo)    
  local oMainLay, oBmp, oBmp1
  local hLays := {=>}
  local oFont3, i, j, aR := {}
  IF IsExeRunning("EXAMEN.EXE")
     MsgStop("La Aplicación ya esta en uso en esta PC","Error")
     QUIT
  ENDIF
  oApp := TApplication():New()
  oApp:oServer := Conectar()
  
  nPre := 1
  oSay := ARRAY(5)
  oBot := ARRAY(3)
  aPreg := {}

  oQry := oApp:oServer:Query("SELECT * FROM exa_preguntas WHERE grupo = '"+cgrupo+"'")
  FOR i := 1 TO 20 // Aca tenes que tener mas de 20 preguntas cargadas en la base para el grupo, sino no sale del loop. 
      j := nRandom( oQry:nRecCount )
      DO WHILE ASCAN(aR,j) > 0
         j := nRandom( oQry:nRecCount )
      ENDDO
      AADD(aR,j)
      oQry:GoTo(j)
      AADD(aPreg,{oQry:imagen,oQry:numero,oQry:pregunta,oQry:resp1,oQry:resp2,oQry:resp3,oQry:correcta,0}) 
  NEXT i

  DEFINE FONT oFont3 NAME "Calibri" size 17, 34 
  DEFINE BRUSH oBmp   FILE "ICONOS\FONDO.BMP" RESIZE
  DEFINE BRUSH oBmp1  FILE "ICONOS\FONDO1.BMP"
  define window oApp:oWnd NOMINIMIZE ICON oApp:oIco
  DEFINE TIMER oApp:oTimer INTERVAL 1000 ACTION Pinguear() OF oApp:oWnd 
  ACTIVATE TIMER oApp:oTimer
  oApp:oWnd:oFont := oFont3
  
  define layout hLays["MAIN"] of oApp:oWnd

    define vertical layout hLays["H2"] of hLays["MAIN"] SIZE 250 
    ( hLays["H2"] ):SetBrush(oBmp)
    define vertical layout hLays["H3"] of hLays["MAIN"]
    ( hLays["H3"] ):SetBrush(oBmp1)

    define horizontal layout of hLays["H2"]    
  
    define horizontal layout hLays["H1_1"] of hLays["H2"]:aHLayout[1] SIZE 950
    define horizontal layout hLays["H1_2"] of hLays["H2"]:aHLayout[1]

    define horizontal layout of hLays["H3"]

    define horizontal layout hLays["H3_1"] of hLays["H3"]:aHLayout[1] SIZE 1300
    define horizontal layout hLays["H3_2"] of hLays["H3"]:aHLayout[1]
    
    
  ntiempo := 0
  Imagen   (hLays["H1_2"] )
  Pregunta (hLays["H1_1"] )
  Opciones (hLays["H3_1"] )
  Avance   (hLays["H3_2"] )

  
  activate window oApp:oWnd MAXIMIZED ON init (( hLays["H1_1"] ):SetFocus())

return nil



******************************
** Mostrar Imagen
STATIC function Imagen (oWnd)
LOCAL cImagen := "NADA"
cImagen := IF(empty(aPreg[nPre,1]),cImagen,IF(FILE("ICONOS\"+alltrim(aPreg[nPre,1])+".jpg"),ALLTRIM(aPreg[nPre,1]),"SIN"))
@ 00, 00 BTNBMP oImg OF oWnd FILE "ICONOS\"+ALLTRIM(cImagen)+".JPG" SIZE 350,350 ADJUST
set layout control oImg of oWnd
return nil

******************************
** Mostrar Pregunta
STATIC function Pregunta (oWnd)
@ 05, 40 SAY oSay[1] PROMPT "Pregunta: "+chr(10)+ALLTRIM(aPreg[nPre,3]) OF oWnd SIZE 350,350 TRANSPARENT PIXEL
set layout control oSay[1] of oWnd
return nil

******************************
** Mostrar Opciones
STATIC function Opciones (oWnd)
@ 05,130 SAY oSay[2]  PROMPT "1) "+ALLTRIM(aPreg[nPre,4]) SIZE 1100,300 OF oWnd  PIXEL TRANSPARENT
@155,130 SAY oSay[3]  PROMPT "2) "+ALLTRIM(aPreg[nPre,5]) SIZE 1100,300 OF oWnd  PIXEL TRANSPARENT
@310,130 SAY oSay[4]  PROMPT "3) "+ALLTRIM(aPreg[nPre,6]) SIZE 1100,300 OF oWnd  PIXEL TRANSPARENT
@ 05, 15 BTNBMP oBot[1] OF oWnd FILE "ICONOS\uno.PNG" SIZE 100,100  ACTION Avanzar(1) NOBORDER ADJUST PIXEL TRANSPARENT
@155, 15 BTNBMP oBot[2] OF oWnd FILE "ICONOS\dos.PNG" SIZE 100,100 ACTION Avanzar(2) NOBORDER ADJUST PIXEL TRANSPARENT
@310, 15 BTNBMP oBot[2] OF oWnd FILE "ICONOS\tres.PNG" SIZE 100,100  ACTION Avanzar(2) NOBORDER ADJUST PIXEL TRANSPARENT
return nil

******************************
** Avance
STATIC function Avance (oWnd)
@ 10, 05 METEREX oSay[5] VAR nTiempo TOTAL 60 SIZE 60,400 OF oWnd  PIXEL VERTICAL
return nil

******************************
** Mostrar Avanzar
STATIC function Avanzar (n)
LOCA cImagen := "NADA"
aPreg[nPre,8] := n
nPre ++
IF nPre > 20   
   oApp:oTimer:End()
   Resultado()
   oApp:oWnd:End()   
   RETURN nil 
ENDIF
oSay[1]:SetText("Pregunta: "+chr(10)+aPreg[nPre,3]) 
oSay[2]:SetText("1) "+aPreg[nPre,4]) 
oSay[3]:SetText("2) "+aPreg[nPre,5])
oSay[4]:SetText("3) "+aPreg[nPre,6]) 
cImagen := IF(empty(aPreg[nPre,1]),cImagen,IF(FILE("ICONOS\"+alltrim(aPreg[nPre,1])+".jpg"),ALLTRIM(aPreg[nPre,1]),"SIN"))
oImg:LoadBitMaps("ICONOS\"+ALLTRIM(cImagen)+".JPG")
oImg:Refresh()
ntiempo := 0
oSay[5]:Set(ntiempo)
oSay[5]:Refresh()
RETURN nil


STATIC FUNCTION Resultado()
LOCAL nCorr := 0, nNoResp := 0,i
FOR i := 1 TO 20
    IF aPreg[i,7] = aPreg[i,8]
       nCorr ++
    ENDIF
    IF aPreg[i,8] = 0
       nNoResp ++
    ENDIF
NEXT i
MsgInfo("Total Preguntas: 20"+chr(10)+;
        "Total Respuestas correctas: "+STR(nCorr,2)+chr(10)+; 
        "Total Respuestas incorrectas: "+STR(20-nCorr-nNoResp,2)+chr(10)+; 
        "Total Respuestas no respondidas: "+STR(nNoResp,2)+chr(10)+; 
        "Porcentaje respondido correctamente"+STR((nCorr/20)*100,6,2)+chr(10)+; 
        "Resultado del Examen:"+IF(nCorr>=14,"APROBADO","DESAPROBADO"),"Resultado del Examen")
         
RETURN nil


STATIC FUNCTION Pinguear()
LOCAL oQry,oError, lCerrar := .f.
IF oApp:lPingueando 
   RETURN nil 
ENDIF 
oApp:lPingueando := .t.
IF oApp:oServer <> nil
   TRY 
       oQry := oApp:oServer:Query("SELECT 1")
       IF oQry:RecCount() = 0
          MsgWait("Reconectando con el servidor......")
          oApp:oServer:Ping()
          ELSE
          oApp:oWnd:SetMsg("Pingueando...")      
       ENDIF
    CATCH oError
      MsgStop("Se perdio la conexion con el servidor, SE CERRARA EL PROGRAMA"+CHR(10)+;
              "Verifique su acceso a la red antes de volver a entrar","Atencion!")
      oApp:oServer:End()
      lCerrar := .t.
    END TRY

ENDIF
IF lCerrar
   QUIT
ENDIF
IF nTiempo = 60 //Aca le doy aprox. 60 segundos para responder
   Avanzar()
ENDIF
ntiempo ++
oSay[5]:Set(ntiempo)
oApp:lPingueando := .f.
RETURN nil    



//----------------------------------------------------------------------------//
 CLASS TApplication
   DATA   oWnd       // Pantalla Principal
   DATA   oServer    // Conexion con el servidor de base de datos
   DATA   oTimer     // Timer para pinguear
   DATA   lPingueando//Determina si el programa esta haciendo ping
   DATA   oIco       // Dialogo para el procesando
   
   METHOD New() CONSTRUCTOR


ENDCLASS

//----------------------------------------------------------------//

METHOD New() CLASS TApplication

   SET DATE FORMAT "DD/MM/YYYY"
   SET DELETE ON
   SET CONFIRM ON
   SET SOFTSEEK ON
   SET 3DLOOK ON
   SetHandleCount(100)
   SetBalloon(.t.)
   D_SetCaseSensitive(.t.)
   HB_LANGSELECT( 'ESWIN' )
   DEFINE ICON ::oIco RESOURCE "ICONO"
   // Inicializacion de valores
   ::lPingueando        := .f.

return Self

DLL32 FUNCTION BWCCRegister( hInst AS LONG) AS WORD PASCAL LIB "BWCC32.DLL"  

REQUEST HB_LANG_ESWIN
REQUEST HB_CODEPAGE_ESMWIN
Esta es la estructura de la tabla

Code: Select all

CREATE TABLE `exa_preguntas` (
  `GRUPO` varchar(1) NOT NULL,
  `NUMERO` int(4) NOT NULL,
  `IMAGEN` varchar(10) NOT NULL,
  `PREGUNTA` varchar(400) NOT NULL,
  `RESP1` varchar(255) NOT NULL,
  `RESP2` varchar(255) NOT NULL,
  `RESP3` varchar(255) NOT NULL,
  `CORRECTA` int(1) DEFAULT NULL,
  PRIMARY KEY (`NUMERO`,`GRUPO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Espero que te sirva. Cualquier avance compartilo por aqui, asi nos queda de referencia para todos
Saludos

Re: Modulo de preguntas tipo test (alguien tiene algo)

Posted: Sun Jan 06, 2019 6:42 pm
by Andrés González
Perdona Cesar, estoy estudiando y preparando las preguntas tipo test y no me conecto mucho al grupo. Gracias por compartir lo que tienes hecho hasta ahora, voy a ver lo que puedo hacer.
He estado mirando las cosas que me podrian servir de base y he encontrado una que va de perlas, pero no hay forma de ponerme en contacto con los autores parece que ya no están activos, pero esto es lo que mi iria de perlas. Tiene un editor de preguntas y un gestor de respuestas tipo test.
Tengo hecho un programa que me sirve de documentación basado en la teoria de padre hijo, que me va de miedo y de cada tema tiene asociado su padre e hijos, ademas de todo un sistema de gestión de documentos y multimedia asociado, y realizado el modulo de las preguntas tipo test, que en principio lo hago con el libreoffice, y me falta lo que te he comentado. Echale un vistazo a la url:

https://www.portalprogramas.com/examenes/

creo que el editor está libre, solo hay que registrar el programa pero en principio a mi no me han contestado. Con tiempo no creo que tenga mucha dificultad hacer algo parecido.

Un saludo