Foros del Web » Programando para Internet » Javascript »

Problema con bucles

Estas en el tema de Problema con bucles en el foro de Javascript en Foros del Web. Hola, estoy trabajando en un script por puro entretenimiento. Este script sirve, en teoría, para que el usuario introduzca un texto, de más o menos ...
  #1 (permalink)  
Antiguo 04/08/2010, 17:40
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Problema con bucles

Hola, estoy trabajando en un script por puro entretenimiento. Este script sirve, en teoría, para que el usuario introduzca un texto, de más o menos carácteres, en un input, y de este texto se seleccionen x letras para ponerlas en mayúsculas. El problema está en que uso varios bucles para recorrer arrays y carácteres, aquí el código:
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. function alternar(t1, t2){
  3.  var txt = t1.value;
  4.  var aceptados = /[A-z]/;
  5.  var letras = new Array();
  6.  for (a = 0; a<txt.length; a++){
  7.   if(aceptados.test(txt.charAt(a))){
  8.    letras[letras.length] = a;
  9.   }
  10.  }
  11.  var cant = Math.round(Math.random()*letras.length);
  12.  var aleat = new Array();
  13.  for (b = 0; b<cant; b++){
  14.   aleat[b] = Math.round(Math.random()*letras.length);
  15.  }
  16.  for(i = 0; i<cant; i++){
  17.   for(j = 0; j<cant; j++){
  18.    if(aleat[i]==aleat[j] && i!=j){
  19.     if(aleat[j]<letras.length){
  20.      aleat[j] += 1;
  21.     }else{
  22.      aleat[j] -= 1;
  23.     }
  24.    }
  25.   }
  26.  }
  27.  var result = '';
  28.  for(t = 0; t<txt.length; t++){
  29.   if(!(aceptados.test(txt.charAt(t)))){
  30.    result += txt.charAt(t);
  31.   }else{
  32.    for(l = 0; l<letras.length; l++){
  33.     for(r = 0; r<aleat.length; r++){
  34.      if(letras[l] == aleat[r]){
  35.       result += txt.charAt(letras[l]).toUpperCase();
  36.      }else{
  37.       result += txt.charAt(letras[l]);
  38.      }
  39.     }
  40.    }
  41.   }
  42.  }
  43.  t2.value = result;
  44. }
  45. </script>

La cuestión es que si yo por ejempplo pongo 'abc123' (con 3 mayúsculas y posiciones 2, 2 y 3) sale 'aaabbbccCaaabbbccCaaabbbccC123'. Sé que tiene que ser por los bucles porque se repite parte del string pero lo he revisado 40 veces y todavía no logro ver dónde está el error. A ver si me podéis ayudar.
Saludos y gracias :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 05/08/2010, 06:17
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Problema con bucles

Hola

No entiendo que es lo que pretendes hacer. ¿Poner en mayúscula la primera letra de cada palabra? ¿poner en mayúscula la primera letra de cada palabra si tiene mas de 2 caracteres? ¿.....?

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;" />
  #3 (permalink)  
Antiguo 05/08/2010, 10:13
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con bucles

No, lo que quiero hacer es imitar esas páginas donde entras y te salen varios inputs para que introduzcas un texto tipo nick del messenger o lo que sea, y te lo convierte; y por ejemplo en un input te sale con letras con acentos circunflejos y cosas por el estilo, y hay otro input en el que sale el texto que pusiste pero ciertas letras al azar están en mayúsculas. Es una horterada pero el otro día estaba pensando en ello y pensé que el código sería más fácil de lo que en realidad es o me parece.
Ejemplo: al principio de la página sale 'niCks paRa mSn y LeTraS gRanDeS y raRas paRa meSSegeR síMboLos raRos', eso es a lo que me refiero con letras, al azar, mayúsculas.

Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #4 (permalink)  
Antiguo 05/08/2010, 15:21
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Problema con bucles

Hola

Algunas modificaciones
Código Javascript:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html xmlns="http://www.w3.org/1999/xhtml"lang="es" xml:lang="es">
  3. <head>
  4. <script type="text/javascript">
  5. function alternar(t1, t2){
  6.  var txt = t1.value;
  7.  var aceptados = /[a-z\s]/;
  8.  var letras = new Array();
  9.  for (a = 0; a<txt.length; a++){
  10.   if(aceptados.test(txt.charAt(a))){
  11.    letras[letras.length] = a;
  12.   }
  13.  }
  14.  
  15. var cant = Math.round(Math.random()*letras.length);
  16.  
  17.  
  18.  
  19. var aleat = new Array();
  20. for (b = 0; b<cant-1; b++){
  21.  aleat[b] = Math.round(Math.random()*letras.length);
  22.  }
  23.  
  24.  
  25. nuevoArray = aleat.sort();
  26.  
  27. var mayuscula = '';
  28. var result = '';
  29. for(t = 0; t<txt.length; t++){
  30.  
  31.     for(z = 0; z < nuevoArray.length; z++) {
  32.      
  33.         if(t == nuevoArray[z]){
  34.             mayuscula = txt.charAt(letras[t])
  35.                 result += txt.charAt(letras[t]).toUpperCase();
  36.             break;
  37.             }
  38.  
  39.     }
  40.  
  41.     if(txt.charAt(letras[t]) != mayuscula) {
  42.          result += txt.charAt(letras[t]);
  43.         mayuscula = '';
  44.     }
  45.  
  46. }
  47.  
  48.  
  49.  t2.innerHTML = result;
  50. }
  51. </script>
  52.  
  53. </head>
  54. <body>
  55. <form>
  56. <input type="text" value="un texto cualquiera no importa el largo" id="texto" />
  57. <textarea id="resultado" /></textarea>
  58. <input type="button" value="Traer Formulario" onclick="alternar(document.getElementById('texto'), document.getElementById('resultado'))" />
  59. </form>
  60. </body>
  61. </html>
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;" />
  #5 (permalink)  
Antiguo 05/08/2010, 17:17
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con bucles

Gracias, el código funciona perfecto con letras, pero tengo problemas con números. Cuando pongo alguno, siempre sale al final, y si pongo más de uno sólo sale el primero. Por lo demás, no entiendo:
  • En el segundo bucle, por qué pones cant-1
  • Por qué ordenas el array de números aleatorios

Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 06/08/2010, 07:10
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Problema con bucles

Hola

Respecto a tus preguntas
Cita:
1ª Por que sino el último elemento del array sería undefined
2ª Lo puedes ordenar o no ordenarlo, no influye en nada, puesto que se ha de recorrer toda la matriz aleat. Con respecto a esto también he hecho alguna modificación para no evaluar indices que ya están evaluados
Fíjate en los cambios con respecto al script anterior
Código Javascript:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html xmlns="http://www.w3.org/1999/xhtml"lang="es" xml:lang="es">
  3. <head>
  4. <script type="text/javascript">
  5. function alternar(t1, t2){
  6. var letras = t1.value.toLowerCase().split('');
  7.  
  8. var cant = Math.round(Math.random()*letras.length);
  9.  
  10. var aleat = new Array();
  11. for (b = 0; b<cant; b++){
  12.  aleat[b] = Math.round(Math.random()*letras.length);
  13.  }
  14.  
  15. ordenaArray = aleat.sort();
  16.  
  17. var aceptados = /[a-z\s]/;
  18. var mayuscula = '';
  19. var result = '';
  20. for(t = 0; t<letras.length; t++){
  21.  
  22.     for(z = 0; z < ordenaArray.length; z++) {
  23.      
  24.         if(t == ordenaArray[z]){
  25. ordenaArray.splice(z,1) // eliminamos este elemento
  26. if (aceptados.test(letras[t])) {
  27.  
  28.  
  29.             mayuscula = letras[t];
  30.                   result += letras[t].toUpperCase();
  31.             break;
  32. } else {
  33.  result += letras[t];
  34. mayuscula = letras[t];
  35. break;
  36. }
  37.  
  38.              }
  39.  
  40.     }
  41.  
  42.  
  43.     if(letras[t] != mayuscula) {
  44. ordenaArray.splice(t,1) // eliminamos este elemento
  45.          result += letras[t];
  46.         mayuscula = '';
  47.     }
  48.  
  49. }
  50.  
  51.  
  52.  t2.innerHTML = result;
  53. }
  54. </script>
  55.  
  56. </head>
  57. <body>
  58. <form>
  59. <input type="text" value="un texto cualquiera con números 12 3 e incluso con caracteres especiales ?¿ no @importa" id="texto" />
  60. <textarea id="resultado" /></textarea>
  61. <input type="button" value="Traer Formulario" onclick="alternar(document.getElementById('texto'), document.getElementById('resultado'))" />
  62. </form>
  63. </body>
  64. </html>
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;" />

Última edición por Adler; 06/08/2010 a las 12:45
  #7 (permalink)  
Antiguo 06/08/2010, 11:51
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con bucles

Ok, muchas gracias, ahora sí funciona perfecto. Lo único que me queda es entenderlo xD Por cierto, lo del for todavía no me quedó claro. Si por ejemplo cant==5, habría aleat[0], aleat[1], aleat[2], aleat[3] y aleat[4]... ¿por qúe iba a ser undefined aleat[4]? Espero que me puedas responder.
Gracias otra vez :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #8 (permalink)  
Antiguo 06/08/2010, 12:48
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: Problema con bucles

Ha tenido que ser que en alguno de los ciclos use "menor o igual", pero en lo que lo he imprimido no lo encuentro, así que nada, lo edito
__________________
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: bucles
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 21:40.