Foros del Web » Programando para Internet » Javascript »

bucle while no funciona

Estas en el tema de bucle while no funciona en el foro de Javascript en Foros del Web. Hola: Soy nuevo en el foro, y poco experto en Javascript. Necesito hacer un programa de calculo del test de fisher, una prueba estadística. Funciona, ...
  #1 (permalink)  
Antiguo 10/11/2011, 13:24
 
Fecha de Ingreso: noviembre-2011
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
bucle while no funciona

Hola: Soy nuevo en el foro, y poco experto en Javascript. Necesito hacer un programa de calculo del test de fisher, una prueba estadística. Funciona, pero el bucle while... solamente funciona la primera vuelta, a pesar de que no cumple la condición de fin del bucle. Por mas vueltas que le doy no veo donde está el fallo. Envío el programa, por si alguien más experto puede echarme una mano.
Gracias
dismukes2003
P.D. Algunas casillas que salen en pantalla son solamente para seguir el curso del programa. Luego se suprimirían. Poniendo como datos a, b, c, y d, 3, 5, 4, y 2, respectivamente, el resultado si fuera bien, debería ser 0.29604...

<html>

<head>

<title>Test exacto de Fisher</title>
</head>
<body>
<script language="JavaScript">
function f(numero) {
if (numero > 1) {
return numero * f(numero - 1)
} else {
return numero
}
}
</script>
<script>
function Fisher(form)
{form.N.value = parseInt(form.a.value) + parseInt(form.b.value) + parseInt(form.c.value) + parseInt(form.d.value);
if (parseInt(form.b.value) < parseInt(form.a.value))
{form.z.value = -1}
else
{form.z.value = 1};
form.cont.value =(parseInt(form.a.value)*parseInt(form.b.value)*pa rseInt(form.c.value)*parseInt(form.d.value));
form.P.value = 0
while(form.cont.value > parseInt(0))
{form.c0.value = parseInt(form.a.value) + parseInt(form.c.value);
form.c1.value = parseInt(form.b.value) + parseInt(form.d.value);
form.r0.value = parseInt(form.a.value) + parseInt(form.b.value);
form.r1.value = parseInt(form.c.value) + parseInt(form.d.value);
form.P.value = parseFloat(form.P.value) + (f(form.r0.value) * f(form.r1.value) * f(form.c0.value) * f(form.c1.value)) / (f(parseInt(form.a.value)) * f(parseInt(form.b.value)) * f(parseInt(form.c.value)) * f(parseInt(form.d.value)) * f(parseInt(form.N.value)));
parseInt(form.a.value) = parseInt(form.a.value)- form.z.value;
parseInt(form.b.value) = parseInt(form.b.value)+ parseInt(form.z.value);
parseInt(form.c.value) = parseInt(form.c.value)+ parseInt(form.z.value);
parseInt(form.d.value) = parseInt(form.d.value)- form.z.value;
form.cont.value = (parseInt(form.a.value)*parseInt(form.b.value)*par seInt(form.c.value)*parseInt(form.d.value));
}
}
</script>

<form>

<h1 align="center"><font size="3" face="Verdana">Test exacto de Fisher</font></h1>
</i></font><font face="Arial" size="3"><span style="font-weight: 400">
Introduce el valor de la casilla a:</span><i> </i></font><font face="Arial"><i>
<font size="3"><input name="a" size="10"><br>
</font></i><span style="font-weight: 400"><font size="3">Introduce el valor de la casilla b:</font></span><font size="3"> <input name="b" size="10"><br>
</font></i><span style="font-weight: 400"><font size="3">Introduce el valor de la casilla c:</font></span><font size="3"> <input name="c" size="10"><br>
</font></i><span style="font-weight: 400"><font size="3">Introduce el valor de la casilla d:</font></span><font size="3"> <input name="d" size="10"><br>

<br>
<input onclick="Fisher(this.form)" type="button" value="Calcula Test de Fisher "><br><br>
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="N" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="c0" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="c1" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="r0" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="r1" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="z" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;" name="cont" size="10"> <br><br> <br><br>
<font size="3"><input type="text" STYLE="color:#3B170B; font-weight:bold; background-color:#F7D357;" name="P" size="10"><br>
<br>
<br>
<input type="reset" value="Borrar información">
</form>

</body>

</html>
  #2 (permalink)  
Antiguo 11/11/2011, 06:20
Avatar de Rappa  
Fecha de Ingreso: noviembre-2011
Ubicación: Montevideo, Uruguay
Mensajes: 80
Antigüedad: 12 años, 5 meses
Puntos: 13
Respuesta: bucle while no funciona

Haz un aviso del valor para ver que te da:

Código Javascript:
Ver original
  1. ...
  2. form.cont.value = (parseInt(form.a.value)*parseInt(form.b.value)*par seInt(form.c.value)*parseInt(form.d.value));
  3. alert(form.cont.value);
  4. }
  5. ...
__________________
Drugs and alcohol are not the answer
Unless you are asking what i'm doing this weekend
  #3 (permalink)  
Antiguo 11/11/2011, 13:56
 
Fecha de Ingreso: noviembre-2011
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: bucle while no funciona

Gracias, RAPPA, pero sigue sin hacer más que el primer paso, que ya hacía bien (en el programa que envié había un error en dos parseInt, que figuraban como parse Int.
ya había puesto una casilla (la última antes del resultado) que indicaba el valor de cont, y funciona, pero da el valor inicial del primer bucle, y no sigue más.
He intentado con for:

........
form.P.value = 0;
for (i=0 ; i<3; i++);
{form.c0.value = parseInt(form.a.value) + parseInt(form.c.value);
form.c1.value = parseInt(form.b.value) + parseInt(form.d.value);
form.r0.value = parseInt(form.a.value) + parseInt(form.b.value);
form.r1.value = parseInt(form.c.value) + parseInt(form.d.value);
form.P.value = parseFloat(form.P.value) + (f(form.r0.value) * f(form.r1.value) * f(form.c0.value) * f(form.c1.value)) / (f(parseInt(form.a.value)) * f(parseInt(form.b.value)) * f(parseInt(form.c.value)) * f(parseInt(form.d.value)) * f(parseInt(form.N.value)));
parseInt(form.a.value) = parseInt(form.a.value)- parseInt(form.z.value);
parseInt(form.b.value) = parseInt(form.b.value)+ parseInt(form.z.value);
parseInt(form.c.value) = parseInt(form.c.value)+ parseInt(form.z.value);
parseInt(form.d.value) = parseInt(form.d.value)- parseInt(form.z.value);
}
...........
y me pasa lo mismo: me hace bien el primer paso por el bucle, pero ya no sigue. Estoy ya perdiendo los papeles, porque no veo el problema. Cualquier ayuda es bienvenida. De nuevo gracias
Dismukes2003
  #4 (permalink)  
Antiguo 11/11/2011, 20:54
Avatar de Rappa  
Fecha de Ingreso: noviembre-2011
Ubicación: Montevideo, Uruguay
Mensajes: 80
Antigüedad: 12 años, 5 meses
Puntos: 13
Respuesta: bucle while no funciona

Pon un alert al final de todo el script para ver si termina el script o es que se tranca con el bucle.
__________________
Drugs and alcohol are not the answer
Unless you are asking what i'm doing this weekend
  #5 (permalink)  
Antiguo 12/11/2011, 06:10
 
Fecha de Ingreso: noviembre-2011
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: bucle while no funciona

Hola de nuevo, y de nuevo gracias.

Efectivamente, yo ya había puesto una de las casillas que me indicaba el valor al final del bucle. La primera iteración siempre la ha hecho bien, pero luego le queda, para finalizar, cambiar unos valores, y aumentar el contador. Efectivamente eso no lo hacía, y si se pone una alerta al final de bucle no aparece, es decir, no acaba el bucle. Y eso es lo que no comprendo porque no encuentro lo que está mal. Por si acaso, pongo de nuevo el programa, con comentarios de lo que se va haciendo. no identifico qué es lo que hace que no cambie el contador al final, antes de recomenzar el bucle. El problema es que me pasa lo mismo si empleo for

<html>

<head>

<title>Test exacto de Fisher</title>
</head>
<body>
<script language="JavaScript">
/*funcion calculo factorial*/
function f(numero) {
if (numero > 1) {
return numero * f(numero - 1)
} else {
return numero
}
}
</script>
<script>
function Fisher(form)
{form.N.value = parseInt(form.a.value) + parseInt(form.b.value) + parseInt(form.c.value) + parseInt

(form.d.value);
/*decide si se aplica 1 o -1 a cada casilla*/
if (parseInt(form.b.value) < parseInt(form.a.value))
{form.z.value = -1}
else
{form.z.value = 1};
/*pone contador bucle y valor del test a cero*/
form.cont.value = 0;
form.P.value = 0
/*comienza bucle*/
while(form.cont.value < 3)
{form.c0.value = parseInt(form.a.value) + parseInt(form.c.value);
form.c1.value = parseInt(form.b.value) + parseInt(form.d.value);
form.r0.value = parseInt(form.a.value) + parseInt(form.b.value);
form.r1.value = parseInt(form.c.value) + parseInt(form.d.value);
/*hace el primer calculo del test (P)*/
form.P.value = parseFloat(form.P.value) + (f(form.r0.value) * f(form.r1.value) * f(form.c0.value) *

f(form.c1.value)) / (f(parseInt(form.a.value)) * f(parseInt(form.b.value)) * f(parseInt(form.c.value)) * f(parseInt(form.d.value)) * f(parseInt(form.N.value)));
/*cambia los valores de las casillas*/
parseInt(form.a.value) = parseInt(form.a.value)- form.z.value;
parseInt(form.b.value) = parseInt(form.b.value)+ parseInt(form.z.value);
parseInt(form.c.value) = parseInt(form.c.value)+ parseInt(form.z.value);
parseInt(form.d.value) = parseInt(form.d.value)- form.z.value;
/*deberia finalizar el bucle aqui, y aumentar el contador, para hacer otra iteracion, cosa que no hace*/
form.cont.value = form.cont.value ++;
alert(form.cont.value);
}
}
</script>

<form>

<h1 align="center"><font size="3" face="Verdana">Test exacto de Fisher</font></h1>
</i></font><font face="Arial" size="3"><span style="font-weight: 400">
Introduce el valor de la casilla a:</span><i> </i></font><font face="Arial"><i>
<font size="3"><input name="a" size="10"><br>
</font></i><span style="font-weight: 400"><font size="3">Introduce el valor de la casilla

b:</font></span><font size="3"> <input name="b" size="10"><br>
</font></i><span style="font-weight: 400"><font size="3">Introduce el valor de la casilla

c:</font></span><font size="3"> <input name="c" size="10"><br>
</font></i><span style="font-weight: 400"><font size="3">Introduce el valor de la casilla

d:</font></span><font size="3"> <input name="d" size="10"><br>

<br>
<input onclick="Fisher(this.form)" type="button" value="Calcula Test de Fisher "><br><br>
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="N" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="c0" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="c1" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="r0" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="r1" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="z" size="10">
<input type="text" STYLE="color:#FF0000; font-size:10; font-weight:bold; background-color:#FFFFFF;"

name="cont" size="10"> <br><br> <br><br>
<font size="3"><input type="text" STYLE="color:#3B170B; font-weight:bold; background-color:#F7D357;"

name="P" size="10"><br>
<br>
<br>
<input type="reset" value="Borrar información">
</form>

</body>

</html>
  #6 (permalink)  
Antiguo 13/11/2011, 15:22
Avatar de Rappa  
Fecha de Ingreso: noviembre-2011
Ubicación: Montevideo, Uruguay
Mensajes: 80
Antigüedad: 12 años, 5 meses
Puntos: 13
Respuesta: bucle while no funciona

No se en que rango de valores estas operando, pero me paso recientemente que un valor era superior al maximo "integer" y me descomponia todo el script.

Si hay valores que puedan llegar a ser grandes, prueba usando el tipo "double".
__________________
Drugs and alcohol are not the answer
Unless you are asking what i'm doing this weekend
  #7 (permalink)  
Antiguo 14/11/2011, 12:02
 
Fecha de Ingreso: noviembre-2011
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: bucle while no funciona

Hola de nuevo, y gracias por tus sugerencias. Es cierto que la primera función es para calcular factoriales, pero precisamente en esta prueba se trabaja copn números pequeños, que en los siguientes bucles (que normalmente seran pocos, 5-6 como mucho (aunque debería poder usarse con numeros más grandes), más bien van decreciendo, por lo que no entiendo que haga el primer paso bien, y se detenga cuando llega precisamente a la parte donde a los valores se les suma o resta 1, antes de finalizar el proceso y entrar en un segundo bucle. Como decía inicialmente, soy novato, pero me parecía haber leído que los enteros en Javascript eran doble, hasta 5* e quinientos y pico. De todas formas, no he podido encontrar nada donde me diga como pasar de entero normal a double.
  #8 (permalink)  
Antiguo 15/11/2011, 13:16
 
Fecha de Ingreso: noviembre-2011
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: bucle while no funciona

Ya he dado con la tecla. Se trataba de que en las sentencias de cambio de valor, sobraba el parseInt (nunca me aclaro con cuando hace falta y cuando no, porque a menudo has "parseado" un valor más arriba, con lo que supones que te aseguras de haberlo convertido en un número entero, y más abajo tienes que volverlo a "parsear". Suprimidos estos, el bucle ya funcionaba.
Gracias por sugerir las alertas. Las coloque en todos lados, y me he enterado donde se detenía todo
Gracias

Etiquetas: bucle, funcion, html, input
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:34.