Programación General > JSP/Servlets
Re: Generar Preguntas
gamarin:
: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:
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:
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:
: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:
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.
Navegación
[#] Página Siguiente
Ir a la versión completa