Foros del Web » Programando para Internet » Javascript »

Cálculo de promedio con opciones avanzadas

Estas en el tema de Cálculo de promedio con opciones avanzadas en el foro de Javascript en Foros del Web. Estimados, tengo el siguiente código que con algunas investigaciones por internet pude armar, el problema está en que requiero que éste sea capaz de: 1. ...
  #1 (permalink)  
Antiguo 19/06/2010, 23:26
 
Fecha de Ingreso: agosto-2009
Mensajes: 7
Antigüedad: 15 años, 4 meses
Puntos: 0
Cálculo de promedio con opciones avanzadas

Estimados, tengo el siguiente código que con algunas investigaciones por internet pude armar, el problema está en que requiero que éste sea capaz de:
1. Saber cuántas notas se han ingresado, puesto que el formulario consta de 7 campos de texto donde se ingresan las mismas, pero no siempre van a haber 7 notas, pueden haber menos.
2. Que el promedio se aproxime, porque deja la nota sin aproximar.
3. Si se pudiera resumir un poco el código sería genial, pero esto último no me interesa mucho.

El código es:

<html>

<head>
<meta name="GENERATOR" content="Microsoft FrontPage 6.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Pagina nueva 2</title>
<script type='text/javascript'>
function promedio(){
var p1 = document.editar.p1.value;
var p2 = document.editar.p2.value;
var p3 = document.editar.p3.value;
var p4 = document.editar.p4.value;
var p5 = document.editar.p5.value;
var p6 = document.editar.p6.value;
var p7 = document.editar.p7.value;
var p1 = (!isNaN(p1) && p1 != '')? Number(p1): 0;
var p2 = (!isNaN(p2) && p2 != '')? Number(p2): 0;
var p3 = (!isNaN(p3) && p3 != '')? Number(p3): 0;
var p4 = (!isNaN(p4) && p4 != '')? Number(p4): 0;
var p5 = (!isNaN(p5) && p5 != '')? Number(p5): 0;
var p6 = (!isNaN(p6) && p6 != '')? Number(p6): 0;
var p7 = (!isNaN(p7) && p7 != '')? Number(p7): 0;

if (p1 != ""){
document.editar.pg.value = p1;
}
if (p1 && p2 != ""){
var suma1 = p1 + p2;
var pg = Number(suma1 / 2);
pg = pg.toFixed(3);
pg = pg.substring(0, pg.length - 2);
document.editar.pg.value = pg
}
if (p1 && p2 && p3 != ""){
var suma2 = p1 + p2 + p3;
var pg = Number(suma2 / 3);
pg = pg.toFixed(3);
pg = pg.substring(0, pg.length - 2);
document.editar.pg.value = pg
}
if (p1 && p2 && p3 && p4 != ""){
var suma3 = p1 + p2 + p3 + p4;
var pg = Number(suma3 / 4);
pg = pg.toFixed(3);
pg = pg.substring(0, pg.length - 2);
document.editar.pg.value = pg
}
if (p1 && p2 && p3 && p4 && p5 != ""){
var suma4 = p1 + p2 + p3 + p4 + p5;
var pg = Number(suma4 / 5);
pg = pg.toFixed(3);
pg = pg.substring(0, pg.length - 2);
document.editar.pg.value = pg
}
if (p1 && p2 && p3 && p4 && p5 && p6 != ""){
var suma5 = p1 + p2 + p3 + p4 + p5 + p6;
var pg = Number(suma5 / 6);
pg = pg.toFixed(3);
pg = pg.substring(0, pg.length - 2);
document.editar.pg.value = pg
}
if (p1 && p2 && p3 && p4 && p5 && p6 && p7 != ""){
var suma6 = p1 + p2 + p3 + p4 + p5 + p6 + p7;
var pg = Number(suma6 / 7);
pg = pg.toFixed(3);
pg = pg.substring(0, pg.length - 2);
document.editar.pg.value = pg
}
}
</script>
</head>

<body>
<form name="editar">
<input type="text" name="p1" value="" size="4" onchange="promedio()" />
<input type="text" name="p2" value="" size="4" onchange="promedio()" />
<input type="text" name="p3" value="" size="4" onchange="promedio()" />
<input type="text" name="p4" value="" size="4" onchange="promedio()" />
<input type="text" name="p5" value="" size="4" onchange="promedio()" />
<input type="text" name="p6" value="" size="4" onchange="promedio()" />
<input type="text" name="p7" value="" size="4" onchange="promedio()" />
<input type="text" name="pg" value="" size="4" />
</form>
</body>

</html>

Espero puedan ayudarme.
  #2 (permalink)  
Antiguo 20/06/2010, 06:18
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: Cálculo de promedio con opciones avanzadas

Código HTML:
Ver original
  1. <meta name="GENERATOR" content="Microsoft FrontPage 6.0">
  2. <meta name="ProgId" content="FrontPage.Editor.Document">
  3. <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
  4. <title>Pagina nueva 2</title>
  5. </head>
  6. <form name="editar" action='' method='post'>
  7. <!--no puedes usar onchange en los text, usa onkeyup y onkeydown-->
  8. <input type="text" name="p1" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  9. <input type="text" name="p2" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  10. <input type="text" name="p3" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  11. <input type="text" name="p4" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  12. <input type="text" name="p5" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  13. <input type="text" name="p6" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  14. <input type="text" name="p7" value="" size="4" onkeyup="promedio();" onkeydown='promedio();' />
  15. <input type="text" name="pg" value="" size="4" />
  16. </form>
  17. </body>
  18. </html>

Código Javascript:
Ver original
  1. <script type='text/javascript'>
  2. //puedes usar arrays
  3. function promedio(){
  4. var p = new Array();
  5. p[0] = document.editar.p1.value;
  6. p[1] = document.editar.p2.value;
  7. p[2] = document.editar.p3.value;
  8. p[3] = document.editar.p4.value;
  9. p[4] = document.editar.p5.value;
  10. p[5] = document.editar.p6.value;
  11. p[6] = document.editar.p7.value;
  12. for (i=0; i<=p.length; i++){
  13. p[i] = (!isNaN(p[i]) && p[i] != '')? Number(p[i]): 0;
  14. }
  15. //a partir de aquí tienes que cambiar p1 por p[0], p2 por p[1],... pn por p[n-1]
  16. if (p1 != ""){
  17. document.editar.pg.value = p1;
  18. }
  19. if (p1 && p2 != ""){
  20. var suma1 = p1 + p2;
  21. var pg = Number(suma1 / 2);
  22. //aquí entiendo que quieres reducirlo a un decimal ¿no?
  23. //entonces pon toFixed(1)
  24. pg = pg.toFixed(3);
  25. pg = pg.substring(0, pg.length - 2);
  26. document.editar.pg.value = pg
  27. }
  28. if (p1 && p2 && p3 != ""){
  29. var suma2 = p1 + p2 + p3;
  30. var pg = Number(suma2 / 3);
  31. pg = pg.toFixed(3);
  32. pg = pg.substring(0, pg.length - 2);
  33. document.editar.pg.value = pg
  34. }
  35. if (p1 && p2 && p3 && p4 != ""){
  36. var suma3 = p1 + p2 + p3 + p4;
  37. var pg = Number(suma3 / 4);
  38. pg = pg.toFixed(3);
  39. pg = pg.substring(0, pg.length - 2);
  40. document.editar.pg.value = pg
  41. }
  42. if (p1 && p2 && p3 && p4 && p5 != ""){
  43. var suma4 = p1 + p2 + p3 + p4 + p5;
  44. var pg = Number(suma4 / 5);
  45. pg = pg.toFixed(3);
  46. pg = pg.substring(0, pg.length - 2);
  47. document.editar.pg.value = pg
  48. }
  49. if (p1 && p2 && p3 && p4 && p5 && p6 != ""){
  50. var suma5 = p1 + p2 + p3 + p4 + p5 + p6;
  51. var pg = Number(suma5 / 6);
  52. pg = pg.toFixed(3);
  53. pg = pg.substring(0, pg.length - 2);
  54. document.editar.pg.value = pg
  55. }
  56. if (p1 && p2 && p3 && p4 && p5 && p6 && p7 != ""){
  57. var suma6 = p1 + p2 + p3 + p4 + p5 + p6 + p7;
  58. var pg = Number(suma6 / 7);
  59. pg = pg.toFixed(3);
  60. pg = pg.substring(0, pg.length - 2);
  61. document.editar.pg.value = pg
  62. }
  63. }
  64. </script>

Saludos (:

Última edición por _cronos2; 20/06/2010 a las 09:17
  #3 (permalink)  
Antiguo 20/06/2010, 14:27
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 18 años
Puntos: 126
Respuesta: Cálculo de promedio con opciones avanzadas

Hola

Demasiado código
Cita:
Ponle una id el form
Dale el valor por defecto "0" a los text

Ahora en la función saca en array todos los campos usando document.getElementById('id_form').getElementsByTa gName('input');
Crea un ciclo for(i = 0; i < numero_campos.length; i++)
Verifica que el valor del text no es "0"
En tal caso suma 1 a alguna variable global que hayas creado anteriormente (con ello logras saber cuantos campos han sido llenados hasta le momento)
Para la media, suma el valor de estos campos y dividelo por el número de campos
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #4 (permalink)  
Antiguo 20/06/2010, 14:40
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: Cálculo de promedio con opciones avanzadas

Claro, no se me había ocurrido getElementsByTagName... Bravo
  #5 (permalink)  
Antiguo 21/06/2010, 23:05
 
Fecha de Ingreso: agosto-2009
Mensajes: 7
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Cálculo de promedio con opciones avanzadas

Primero que todo, gracias por las respuestas, pero me quedan algunas dudas:

1. _cronos2: En el comentario del código javascript, línea 15, te entendí la mitad del comentario, lo último no sé a qué campo te refieres con p(n-1), eso no me quedó muy claro, el resto ya apliqué las modificaciones que me indicaste, pero se queda pegado el script y me aparece una alerta indicando que el script está tardando mucho..., en fin, quizás sea por la modificación pendiente que me indicas en la línea 15 y que no he aplicado porque no la entiendo.

2. Adler: En la parte de la verificación en adelante, no me queda muy claro cómo hacer eso que me indicas, puesto que mis conocimientos en este lenguaje no son muy avanzados. No entiendo si la verificación hay que hacerla campo por campo, o de otra forma.

Nuevamente, agradezco el tiempo que se han tomado en responder a mis inquietudes.
  #6 (permalink)  
Antiguo 21/06/2010, 23:52
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: Cálculo de promedio con opciones avanzadas

n se refiere al último campo, que en este caso sería el 7. Y n-1 es porque p1 hay que cambiarlo por p[0] que es p[1-1], p2 por p[1] que es p[2-1]...
Saludos (:
  #7 (permalink)  
Antiguo 22/06/2010, 04:20
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 18 años
Puntos: 126
Respuesta: Cálculo de promedio con opciones avanzadas

Hola

Revisa este tema, puede ayudarte

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #8 (permalink)  
Antiguo 22/06/2010, 11:35
 
Fecha de Ingreso: agosto-2009
Mensajes: 7
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Cálculo de promedio con opciones avanzadas

Excelente el script que me sugeriste Adler, le hice una pequeña modificación para que solo me muestre 1 decimal, pero me queda una última duda, cómo hago para que el resultado obtenido se aproxime, porque al ingresar por ejemplo dos notas: un 6.2 y 4.5 da como resultado 3.56666... , mi duda está en cómo hacer que el resultado que se muestre sea 3.6
Al reducir la cantidad de decimales arroja 3.5 como resultado, pero al sacar eso con la calculadora da 3.56666, lo cual equivale a un 3.6.

El código va así:

<script type="text/javascript">
function calcular(cual, cantidad, decimales) {
valores = new Array();
for (i = 0, campos = document.frm[cual].length; i < campos; i++) {
valores[valores.length] = document.frm[cual][i].value;
}

var promedio = 0;
for (i = 0; i < valores.length; i++) {
promedio += (valores[i]/3);
}

promedio = promedio.toFixed(3);
promedio = promedio.substring(0, promedio.length - 2);
document.frm['prom_'+cual].value = promedio;
}
</script>
  #9 (permalink)  
Antiguo 22/06/2010, 12:25
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 18 años
Puntos: 126
Respuesta: Cálculo de promedio con opciones avanzadas

Hola

Prueba con la segunda opción de este articulo

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />

Etiquetas: promedio
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 01:09.