• Jueves 28 de Marzo de 2024, 20:57

Autor Tema:  Re: Generar Preguntas  (Leído 6124 veces)

gamarin

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Generar Preguntas
« en: Miércoles 8 de Septiembre de 2004, 20:25 »
0
:o  :rolleyes:  por fis.. me urge encontar unas solucion :)

Hola A todos... estoy realizando un aplicacion con servlets y wml, que consoiste en porder emitir el voto a través del telefono celular, la primera pantalla consiste en pedir el No. de control y el nombre del votante, despues de comparar los datos enviados por el elector, ejecuto un servlet cuya tarea es hacer una consulta a la base de datos, si los datos del votante que estan en la BD coninciden con los que envio atraves del celular, entonces el sistema tiene que hacerle 5 preguntas de las cuales la respuestas ya estan almecenas en la BD; en la BD existen en realidad 10 preguntas, por lo que el servlet que quiero realizar consistirá en presentar solo 5 preguntas y tienen que ser al azar, esto con la finalidad de que si el votante no acierta en la primera fase de preguntas se le de otra oportunidad solo que la segunda oportunidad no deben ser las mismas pregunta, algun randon debe de generar otro orden y preguntar otras preguntas de las 10 dispoibles en la base de datos.

1. Ya tengo el el codigo del random, y lo tengo dentro del cuerpo de mi servlet, lo quiero sacar como una clase independiente, no se como hacerlo, y que al momento de que necesite de el lo mande atraer en mi servlet.

2. el resultado que me de el arreglo del los 5 numeros aleatorios y que se encontarran en la clase random, los tengo que comparar con los indices del vector donde quiero meter el contenido del ResulSet de la consulta de preguntas, para ver a que numeros de preguntas corresponde y asi mandar a imprimir la pregunta,
les pongo el codigo.

Espero y me ayuden , porfavor....
o algun otra idea que tengan para realizar esto?
____________________________________________________

public static Vector datos = new Vector();
________________________________________

todo lo de conexion ya lo hice
_______________
{
/**+++ aqui va lo de generar preguntas */

String qry1="select * from preguntas where no_ctrl=\'"+control2+"\' ";
Statement stmt2 = conn1.createStatement ();
if (stmt2.execute (qry1))
{
ResultSet results1 = stmt2.getResultSet();

// COMIENZA EL RANDOM

int limiteSup=10, limiteInf =3;
int n[]=new int[5], i, k;

for (i=0; i<n.length; i++)
{
//Obtener un número aleatoreio
n = (int)((limiteSup - limiteInf + 1) * Math.random() + limiteInf);

//Verificar si ya existe el ultimo número obtenido

for (k =0; k < i; k++)
if (n[k] == n) // ya existe
{
i--; //i será incrementado por el for externo
break; //salir de este for
}
}

// Clasificar la matriz

Arrays.sort(n);
//Mostrar la matriz

for (i=0; i <n.length; i++)

System.out.print(n+ " ");
//System.out.println();
//TERMINA RANDOM

while ( results1.next())
{
datos.add(results1.getString("edad")));

Malber

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Generar Preguntas
« Respuesta #1 en: Domingo 12 de Septiembre de 2004, 19:45 »
0
Voy a intentar responderte a los dos puntos.

Pienso que podemos crear una clase para conseguir los cinco números aleatorios, definimos los atributos estáticos y así controlaremos que no se repitan

public class Aleatorios{
 
  private static int numeros[];
  private static boolean numerosYaSelec[];
  private static int seleccionados;
  private static int totalNumeros;

  public Aleatorios(int numNumeros,int totalNumeros){ //en tu caso 5,10
   this.numeros=new int[numNumeros];
   this.numerosYaSelec=new boolean[totalNumeros];
   for (int i=0;i<totalNumeros;i++) numerosYaSelec=false;
   this.seleccionados=0;
   this.totalNumeros=totalNumeros;
  }

  public static int[] obtenerNumeros(){
   int i=0;
   //la siguiente linea evita un bucle infinito caso de llamar varias veces a este método y ya no es posible encontrar tantos aleatorios distintos
   if (totalNumeros - seleccionados >= numeros.length ){
    while (i<numeros.length){
      int aleat = (int) (Math.random()*totalNumeros);
      while ( numerosYaSelec[aleat]=true ){
         aleat = (int) (Math.random()*totalNumeros);
      }
      numeros= aleat+1; // le sumamos 1 para que empiece en 1 (hasta totalNumeros)
      numerosYaSelec[aleat]=true;
      seleccionados++;
      i++;
    }
  }
  return numeros; // devuelve n números entre el 1 y el totalNumeros
 }

}


Para usar esto en el JSP hacemos lo siguiente

 si es la primera vez que solicita las preguntas:

 if (primeraVez()){ // Algo tendrás para diferenciar la primera de la segunda vez
  Aleatorios al = new Aleatorios (5,10);
  int n[]=Aleatorios.obtenerNumeros();
 }

 y ya le pones las preguntas

 y si es la segunda vez que solicita las preguntas (Se equivocó la primera vez) ya no tienes que crear el objeto, el método es estático y los atributos estáticos estarán inicializados de la primera vez. Además devolverá otros números distintos.
 
 else{
   int n[]=Aleatorios.getNumeros();
 }



EL código no está probado ni nada, posiblemente contenga algunos errores de sintaxis. Si tienes algún problema, ya sabes donde encontrarme :) Espero que te sirva.

Malber

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Generar Preguntas
« Respuesta #2 en: Domingo 12 de Septiembre de 2004, 19:48 »
0
el int[] n lo ponemos fuera de los if_else porque si no.. xungo :)

int []n;

if (primeraVez()){
  new Aleatorios(5,10);
  n=Aleatorios.obtenerNumeros();
}
else{
  n=Aleatorios.obtenerNumeros();
}


Algunos fallillos más habrán así :P

gamarin

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Generar Preguntas
« Respuesta #3 en: Lunes 20 de Septiembre de 2004, 23:36 »
0
:o  Hola,  que tal. ya le hice como me comentas,, solo que el siguinte codigo que te mando, pues no me hace lo de las preguntas aleatorias, lo que trato de hacer es que los metadatos de la tablas se conviertasn en preguntas, para que sea mas facil identificar las respuestas, asi que con el codigo presento los metadatos,  no se si es correcto el llenado del vector como lo hago,  ya que le estoy pasando el contenido de  la tupla que se obtiene de la consulta (segun yo),

los metadatos los utilice como preguntas,  me podrias ayudar para que los numeros aleatorios resultantes sean los numeros de los metadatos y luego pues los presente en pantalla de uno por uno,
ejemplo : ( si el primer  nuemero aleatorio es 4 esntonces la pregunta corresponderia al numero 4 de los metadatos, por lo tanto presento en pantalla en metadato 4( edad), lo malo es que no presenta todas juntas, solo presenta 1 pregunta, y pues necesito otra vez reeleer el servlet para que me genere otra (esto es incorrecto)..

Ademas, como le hago para comparar las posibles respuestas, con las que ya tengo en el vector y ya  no haga coneccion a la BD?.

import java.io.*;
import java.net.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class preguntas extends HttpServlet
{
  static final String connect_string ="jdbc:odbc:conectar";
  public void init(ServletConfig config) throws ServletException
  {
     super.init(config);      
  }
    public void destroy()
    {        
    }
   
     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {  
        String control2= request.getParameter("valor1");
        response.setContentType("text/vnd.wap.wml");
        PrintWriter out = response.getWriter();
         
        Connection conn=null;
        try
         {
            // Carga del driver JDBC
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      // Class.forName("org.postgresql.Driver");
           // Conexión con la base de datos
             if (conn != null)
              {
           conn.close();
              }
             conn = DriverManager.getConnection (connect_string,"","");
             // conn = DriverManager.getConnection (connect_string,"postgres","");
             conn.setAutoCommit(true);
         }catch (Exception e)
         {
           out.println("<wml>");
           out.println("<card id=\"card15\">");
           out.println("<p>");
           out.println("<br>error"+e);
           out.println("</br>");        
           out.println("</p>");
           out.println("</card>");
           out.println("<wml>");
         }
         try
          {
             Statement stmt = conn.createStatement ();
             System.out.println("oaqui!");
             ResultSet conjuntoResultados=stmt.executeQuery("SELECT * FROM preguntas where no_ctrl=\'"+control2+"\'");           
             ResultSetMetaData metaDatos = conjuntoResultados.getMetaData();
             int numeroDeColumnas = metaDatos.getColumnCount();          
             int alea[] = new Numero().getAleatorios(5,10);
             
            for  (int i=0; i < alea.length; i++)
             {
                switch(alea)
                {
               
                  case 1:
                       out.println("<wml>");
                       out.println("<card id=\"card18\">");
                       out.println("<p>");
                       out.println(metaDatos.getColumnName(1));
                       out.println("</p>");
                       out.println("</card>");
                       out.println("</wml>");
                         break;
                  case 2:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(2));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 3:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(3));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 4:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(4));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 5:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(5));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 6:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(6));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 7:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(7));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 8:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(8));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
                  case 9:
                         out.println("<wml>");
                         out.println("<card id=\"card18\">");
                         out.println("<p>");
                         out.println(metaDatos.getColumnName(9));
                         out.println("</p>");
                         out.println("</card>");
                         out.println("</wml>");
                         break;
         
                 default:
                        out.println("<wml>");
                        out.println("<card id=\"card18\">");
                        out.println("<p>");
                        out.println(metaDatos.getColumnName(10));
                        out.println("</p>");
                        out.println("</card>");
                        out.println("</wml>");
            }    
;    
         }    
                       
        }catch (Exception e)
          {
               out.println("<wml>");
             out.println("<card id=\"card27\">");
               out.println("<p>");
        out.println("<br>error ==> "+e);
        out.println("</br>");
             out.println("</p>");
             out.println("</card>");
             out.println("</wml>");    
          }
       // conn.close();
        out.close();
    }
     
    public String getServletInfo() {
        return "Descripción";
    }
   
}


espero tu respuesta.. saludos....
porfavor :blink:

Malber

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Generar Preguntas
« Respuesta #4 en: Sábado 25 de Septiembre de 2004, 16:55 »
0
Madre que lio :) ahora voy xungo de tiempo, a ver si tengo algún rato y le echo un vistazo a ver si te puedo ayudar en algo.

Lo que te puedo decir es que si necesitas unos números concretos aleatorios no consecutivos, por ejemplo 4, 7, 23, 24, 8... te creas por ejemplo un array con esos números y haces un random()*[numero de elementos del array] y pillas el contenido en el array de ese número aleatorio en vez del número aleatorio directamente. Es una idea. No se si eso era una de las cosas que necesitabas.

En lo de volver a ejecutar el servlet no me ha quedado muy claro. Si quieres varios aleatorios a la vez, ya te di una idea de como hacer una clase que te los va generando sin repeticiones y te devuelve en un array los siguientes X números aleatorios. Si tienes la relación X -> Pregunta -> Respuesta, con hacer un for(i=0;i<AleatoriosRecuperados.. )
{
Pregunta x= preguntas.Obtener( aleatorios ) ; //aleatorios es el array con los metadatos
                                                          //y preguntas un conjunto con clave el metadato
 procesarPregunta(x);
 ...
tendrás todas las preguntas a la primera no?

No se, me he liao bastante, no se siquiera si eso es lo que preguntas.
Suerte.

gamarin

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Generar Preguntas
« Respuesta #5 en: Martes 28 de Septiembre de 2004, 19:58 »
0
Ups,,,  bueno, lo que pasa es que los metadatos y datos son los que metere al vector.  Los metadatos  que son 12, la primera vez que el usuario entre  se le presentaran 5 metadatos (preguntas)  las posiciones que se le presenten depende del las posiciones que genere el randon,  despues las respuestas se compararan con sus respectivas respuestas que estan en el vector. y si el usuario fallara en una de las 5 preguntas entonces se le vuelven a presentar 5 metadatos( preguntas) otravez al azar. despues de que fallara la segunda vez entonces se le manda un mensaje de denegacion de servicio y se saca del sistema..
ejemplo:

tabla: preguntas

METADATOS            DATOS

id_pregunta             1
no_control               96091300
edad                       16
peso                       70
direccion                 niño perdido
telefono                  77723456
estatura                  1.60
CURP                      123nbgt54
 .....
  .....


suponiendo que entro al sistema, doy mis datos ( nombre y no_control) y son correctos, entonces al oprimir el boton de siguiente, se tiene que ejecutar un servlet el cual tiene que hacer una consulta a la BD y extraer  la DUPLA  de los datos correspodientes a los datos ( nombre y no_control) despues estos datos de la DUPLA se tiene que almacenar en un VECTOR( esto con el fin de no estar accesando muchas veces a la BD) para que con losdatos ahi almacenados trabajemos, despues de este proceso se presentaran 5 preguntas que fueron escogidas al azar de la tabla preguntas, por ejemplo si el arreglo donde guardo mis numeros generados por el random fuera asi: random[1,3,4,6,7,8], en tonces en pantalla me apareceria lo siguinete:

id_pregunta
edad
peso
telefono
estatura
CURP

donde el usuario atravez de cuadros de texto lcontestara a esas preguntas.. y si contestara mal a una de las preguntas entonces el servlet generara otras 5 preguntas,  por ejemplo, supongamos que falle y conteste mal una de las 5 anteriores preguntas entonces el arreglo del random se vuelve a ejecutar y generaria otra secuancia de nuemros, por ejemplo random[2,3,4,5,8]. y lo que se presentaria en pantalla seria

no_control              
edad                      
peso                      
direccion                
CURP    

Si vuelvo a fallar en alguna de esta preguntas entonces el servlet me tiene que sacar del sistema..

saludos,

espero y ahora si me haya dado a entender..

 :kicking: