Problema con la ejecucion de un metodo

Iniciado por yeah69, 9 Enero 2008, 16:33 PM

0 Miembros y 2 Visitantes están viendo este tema.

yeah69

tengo este metodo por un lado

Código (java) [Seleccionar]
public static boolean Repetido(int i,int random,Pregunta[] P){
int j = 0;
boolean repetido = false;
while ((repetido != true)||(j<i)){
if(P[j] == P[random])
repetido = true;
j++;
}
if (repetido = true)
return true;
else
return false;
}

}

y lo quiero usar como condicion en un while para saber si se me repiten los casos aleatorios, y de ser asi, pues que vuelva a ejecutar Math.random...
aqui pongo el otro metodo:
Código (java) [Seleccionar]
public static Pregunta[] TemaRepasar(Pregunta[] preguntas) {
int random;
Pregunta[] preguntasRepasar = new Pregunta[10];
for (int i = 0; i < preguntasRepasar.length; i++) {
do{
random = (int) (Math.random() * 20) + 1;
}while (Repetido(9,random,preguntasRepasar) == true );
preguntasRepasar[i] = preguntas[random];
}

return preguntasRepasar;
}


Eclipse no me marca ningun fallo en el codigo, pero cuando ejecuto el metodo me lo marca aqui:
   
Código (java) [Seleccionar]
preguntasRepasar[i] = preguntas[random];

antes de introducir el metodo repetido me tiraba bien 1 vez (usease en tiempo de ejecucion una vez que queria volver a repasar de nuevo se me colgaba pero la primera vez siempre me ha dejado)  y ahora con el metodo repetido no...
si me podeis ayudar...
muxas gracias

Casidiablo

Haber...

La cosa es que lo estás haciendo de la forma más dificil... lo que tienes que hacer es "barajar" los indices, más no los objetos del arreglo, ya que así es más fácil y eficiente.

Un saludo!

yeah69

como que barajar los indices???nu entiendo eso..yo lo que he hecho es que teniendo ls preguntas en un vector, pues lo igualo a otro, eso de momento me va bien, pero claro para impedir que tenga dos preguntas iguales, resultado de 2 veces el mismo valor en math.random pues me he hecho el metodo Repetido...xo no me tira...

Casidiablo

A ver... tengo entendido que:

1. Tienen que salir las preguntas en desorden
2. No se pueden repetir

Teniendo en cuenta esas dos cosas analicemos lo siguiente:

El arreglo tiene X posiciones, y cada posición referencia un objeto de la clase Pregunta, el cual tiene un método para lanzar la pregunta. Siendo así, lo mejor en este caso es crear un segundo arreglo, de enteros, que serán los indices del arreglo de objetos pregunta. Así, si tenias antes algo como esto (en donde las preguntas se hacen siempre en el mismo orden):

Código (java) [Seleccionar]
for(int i = 0 ; i < preguntas.length; i++)
{
preguntas[i].preguntar();
//lo que sea
}


... deberías crear primero un arreglo de enteros en desorden así:

Código (java) [Seleccionar]
int[] arregloDesordenado = new int[preguntas.length];
for(int i = 0 ; i < preguntas.length; i++)
{
int temp = (int) (Math.random() * 20);
while(repetido(arregloDesordenado, temp))
temp = (int) (Math.random() * 20);
arregloDesordenado[i] = temp;
}


luego, el método repetido() sería algo como esto:

Código (java) [Seleccionar]
public boolean repetido(int[] arregloDesordenado, int x)
{
for(int i = 0 ; i < arregloDesordenado.length; i++)
if(arregloDesordenado[i]==x)
return true;
return false;
}


Luego... solo deberías hacer esto para lanzar las preguntas:

Código (java) [Seleccionar]
for(int i = 0 ; i < preguntas.length; i++)
{
preguntas[arregloDesordenado[i]].preguntar();
//lo que sea
}


¿Lo pillas?

Pd. No tengo un compilador, así que no lo he probado :P pero... esa es la idea.

Un saludo!

yeah69

#4
sip, si q lo pillo ;)
pero lo que pasa es que como he hecho esto tambien:
Código (java) [Seleccionar]
public static Pregunta[] Examen(Console c) {
int i;
int random;
Pregunta[] Examen = new Pregunta[12];
Pregunta[] Tema1 = almacenarTema(1,c);
Pregunta[] Tema2 = almacenarTema(2,c);
Pregunta[] Tema3 = almacenarTema(3,c);
Pregunta[] Tema4 = almacenarTema(4,c);

for(i=0;i<3;i++){
random = (int) (Math.random() * 20);
Examen[i] = Tema1[random];
}
for(i=3;i<6;i++){
random = (int) (Math.random() * 20);
Examen[i] = Tema2[random];
}
for(i=6;i<9;i++){
random = (int) (Math.random() * 20);
Examen[i] = Tema3[random];
}
for(i=9;i<12;i++){
random = (int) (Math.random() * 20);
Examen[i] = Tema4[random];
}
for(i=0;i<12;i++){
//do{
random = (int) (Math.random()* 12);
//}while (Repetido(12,random,Examen) == true );
Examen[i] = Examen[random];
}
return Examen;
}

si te fijas en los for, van de 3 en 3, porque tengo que seleccionar 3 preguntas de entre los 4 temas, luego hago eso, y luego la idea es desordenarlas con el metodo Repetido el cual si te fijas le meto los parametros 12 por ser 12 las preguntas , random que es la cifra aleatoria, y Examen que es del tipo Pregunta.
luego lo inicio con
Código (java) [Seleccionar]
Pregunta[] Examen = Almacenador.Examen(c);
                for (int i = 0; i < Examen.length; i++) {//vamos preguntando
EstiloU();
if (Examen[i].preguntar() == true) {
puntos = puntos + 1;
acertadas++;
} else
puntos = puntos - (4 / 10);
}
  y si te fijas mi metodo Repetido y luego el uso es parecidisimo al tuyo,yo a la hora de usarlo hago un do-while y el otro metodo se rige por un bucle while con esta condicion
Código (java) [Seleccionar]
while ((repetido != true)||(j < i)){

yeah69

 :)Buenas de nuevo!!! :)
vereis yo tengo este metodo:
Código (java) [Seleccionar]
public static void Resultados() {

EstiloU();
c.gotoxy(12, 7);
c.cputs("Estos son los resultados de los examenes: ");
for (int i = 0; i < contadorE; i++) {
    c.gotoxy(12, j);c.cputs("Nota del examen " + (i + 1)     +                                       ": "+ notasExamen[i]);
j++;
     }
c.gotoxy(12, 15);
c.cputs("Pulsa una tecla para continuar...");
c.getch();
                                    }

el problema es que lo ejecuto y si, se ejecuta bien pero cuando pulso una tecla para continuar y volver al menu principal ....se me ejecuta este otro,y claro me finaliza el programa...en vez de irme al menu principal:
Código (java) [Seleccionar]
public static void Salir() {

Estilo();
c.gotoxy(3, 23);
Tiempo();
c.gotoxy(30, 12);
c.cputs("¡¡¡Adios " + nUsuario + "!!!");
c.getch();
System.exit(0);// finaliza el programa
}


asi que alguna relacion debe haber, este es el codigo del main:
Código (java) [Seleccionar]
int opcion = 0;
do {
opcion = Menu();
switch (opcion) {
case '1':
Repasar();
break;
case '2':
Examen();
break;
case '3':
NUsuario();
break;
case '4':
Resultados();
case '5':
Salir();

default:
break;
}
} while (opcion != 5);
  la verdad, no he encontrando ningun despiste...ni nada que relacione el metodo salir con el resultados...si veis algo o teneis alguna hipotesis pues comentadmela por favor, graciaaaaas!!!!!! ;) ;)

Casidiablo

¿Y así?:

Código (java) [Seleccionar]
int opcion = 0;
do {
opcion = Menu();
switch (opcion) {
case '1':
Repasar();
break;
case '2':
Examen();
break;
case '3':
NUsuario();
break;
case '4':
Resultados();
break;
case '5':
Salir();
break;
default:
break;
}
} while (opcion != 5);


Un saludo!

yeah69

joder es verdad!!! vaya despiste!!!!! muxisimas gracias...de nuevo jeje!!! ;) ;)