Autor Tema: Terminar FORs anidados  (Leído 560 veces)

Hola

  • Full Member
  • ***
  • Mensajes: 104
  • Karma: 0
Terminar FORs anidados
« en: Noviembre 25, 2017, 10:16:56 pm »
Buenas, vengo con una simple pregunta, ya lo dice el titulo..., si quiero terminar dos FOR anidados hay que poner 2 break? Ejemplo:


FOR (i=0; i<0; i++)
  FOR (h=0; h<0; h++)


//bla bla...codigo...


BREAK;
BREAK;


END
END


Es así? osea busco terminar ambos for al mismo tiempo.

Drumpi

  • Hero Member
  • *****
  • Mensajes: 6241
  • Karma: 157
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:Terminar FORs anidados
« Respuesta #1 en: Noviembre 26, 2017, 12:55:01 am »
Nop. Uno de los break debe ir DESPUÉS de uno de los end.
La manera más sencilla de romper los for es, primero, modificar i para que se salga del rango del primer for, y después usar break para forzar la salida del segundo for.
Otra forma es que tengas una variable, yo que sé, "_salir", que valga false, y que antes de ejecutar el break del bucle interior, la pongas a true, y justo tras el end del bucle interior, pones un

Código: [Seleccionar]
if (_salir) break; end
No sé si será cierto, pero a mi me enseñaron que usar break no es una manera "estilosa" de salir de un bucle, y que debíamos buscar siempre una alternativa (generalmente usando IFs, sustituyendo FORs por WHILEs ...), Aun tengo que encontrar algún libro de estilo para saber qué es elegante y qué no :D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Hola

  • Full Member
  • ***
  • Mensajes: 104
  • Karma: 0
Re:Terminar FORs anidados
« Respuesta #2 en: Noviembre 26, 2017, 03:25:39 pm »
Pues como en la biblia de bennu se cuenta que break es de los que rompen bucles sin vueltas, creí que fue acertado en este caso, usarlo. Siempre he implementado break para romper un bucle..., uhm...,pero volviendo al tema central.., lo que tu dices es hacer algo como lo siguiente?


FOR (i=0; i<50; i++)
  FOR (j=0; j<50; j++)


//codigo...


i=51;
BREAK;


END
END
« última modificación: Noviembre 26, 2017, 03:28:43 pm por Hola »

panreyes

  • Administrator
  • *****
  • Mensajes: 2100
  • Karma: 70
    • panreyes.com
Re:Terminar FORs anidados
« Respuesta #3 en: Noviembre 26, 2017, 07:14:19 pm »
No sé si será cierto, pero a mi me enseñaron que usar break no es una manera "estilosa" de salir de un bucle, y que debíamos buscar siempre una alternativa (generalmente usando IFs, sustituyendo FORs por WHILEs ...), Aun tengo que encontrar algún libro de estilo para saber qué es elegante y qué no :D

Absolutamente en desacuerdo xD

Pero sí, en resumen deberías utilizar una variable si necesitas salir de más de un bucle al mismo tiempo.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Terminar FORs anidados
« Respuesta #4 en: Noviembre 27, 2017, 06:21:25 pm »
Código: [Seleccionar]
salir = 0;

FOR (i=0; i<50 && !salir; i++)
  FOR (h=0; h<50; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
      BREAK;
   end
 
  END
END


o si en el 2do for interno, luego de que se dispara la salida no tienes mas nada, puedes tambien hacer

Código: [Seleccionar]
salir = 0;

FOR (i=0; i<50 && !salir; i++)
  FOR (h=0; h<50 && !salir; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
   end
 
  END
END

(pero mejor es la 1era, el 2do era para ejemplificar que la condicion de terminacion de los fors es una expresion)

o

Código: [Seleccionar]
FOR (salir = 0, i =0; i<50 && !salir; i++)
  FOR (h=0; h<50 && !salir; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
   end
 
  END
END

o

Código: [Seleccionar]
FOR (salir = i = 0; i<50 && !salir; i++)
  FOR (h=0; h<50 && !salir; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
   end
 
  END
END
« última modificación: Noviembre 27, 2017, 06:25:12 pm por SplinterGU »
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Terminar FORs anidados
« Respuesta #5 en: Noviembre 27, 2017, 06:26:11 pm »
nunca pondria i = 51 para salir, porque eso puede servir para saber (fuera del for) si el for se completo o se aborto... con lo que puedo agregarte otro ejemplo...

Código: [Seleccionar]
import "mod_say";

private
    int h, i;

begin

    FOR (h = 50, i =0; i<50 && h == 50 ; i++)
        FOR (h=0; h<50; h++)
            say("i: " + i + " h: " + h) ;
            //bla bla...codigo...
            if ( h == 14 && i == 4 ) // salir
                break;
            end
        END
    END
end
« última modificación: Noviembre 27, 2017, 06:34:31 pm por SplinterGU »
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2745
  • Karma: 34
  • Superviviente marciano
    • futublock
Re:Terminar FORs anidados
« Respuesta #6 en: Noviembre 28, 2017, 04:45:17 pm »
pero un bloque for llega a su fin y no se repite ¿no? a menos que esté dentro del loop, si no llega al end y se acabo...
¿no?



SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Terminar FORs anidados
« Respuesta #7 en: Noviembre 28, 2017, 05:37:29 pm »
pero un bloque for llega a su fin y no se repite ¿no? a menos que esté dentro del loop, si no llega al end y se acabo...
¿no?

o no entendi tu pregunta, o la respuesta es "correcto"...

no entendi el punto de la pregunta... el "pero" me desconcierta un poco...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

  • Full Member
  • ***
  • Mensajes: 104
  • Karma: 0
Re:Terminar FORs anidados
« Respuesta #8 en: Noviembre 28, 2017, 07:55:37 pm »
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

panreyes

  • Administrator
  • *****
  • Mensajes: 2100
  • Karma: 70
    • panreyes.com
Re:Terminar FORs anidados
« Respuesta #9 en: Noviembre 28, 2017, 10:31:27 pm »
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

Dependiendo del lenguaje de programación puede que compruebe la salida si i==50 o si i<=50. En el primer caso, provocaría un bucle infinito.
En algunos lenguajes FOR se utiliza como nuestro FROM.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Terminar FORs anidados
« Respuesta #10 en: Noviembre 29, 2017, 07:06:47 am »
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

respuesta (y ejemplo)

nunca pondria i = 51 para salir, porque eso puede servir para saber (fuera del for) si el for se completo o se aborto... con lo que puedo agregarte otro ejemplo...

Código: [Seleccionar]
import "mod_say";

private
    int h, i;

begin

    FOR (h = 50, i =0; i<50 && h == 50 ; i++)
        FOR (h=0; h<50; h++)
            say("i: " + i + " h: " + h) ;
            //bla bla...codigo...
            if ( h == 14 && i == 4 ) // salir
                break;
            end
        END
    END
end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

  • Hero Member
  • *****
  • Mensajes: 2745
  • Karma: 34
  • Superviviente marciano
    • futublock
Re:Terminar FORs anidados
« Respuesta #11 en: Noviembre 29, 2017, 12:15:12 pm »
pero un bloque for llega a su fin y no se repite ¿no? a menos que esté dentro del loop, si no llega al end y se acabo...
¿no?

o no entendi tu pregunta, o la respuesta es "correcto"...

no entendi el punto de la pregunta... el "pero" me desconcierta un poco...

Vale, o no sé lo que "Hola" quiere hacer, o yo planteo diferente caso:
Si creo un proceso donde el pongo despues del begin + coordenadas + variables el bloque for en vez de poner un loop, cuando llegue al end debe de morir el proceso, ¿no? porque se estará ejecutando mientras esté funcionando el bloque for ¿no? a eso me refiero

y otra cosa ya que estoy en caliente, cuando un proceso llega a su fin, ¿se elimina? se que da en reserva?? está ahí aunque no se vea???
¿que el pasa?



Hola

  • Full Member
  • ***
  • Mensajes: 104
  • Karma: 0
Re:Terminar FORs anidados
« Respuesta #12 en: Noviembre 29, 2017, 01:56:14 pm »
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

respuesta (y ejemplo)

nunca pondria i = 51 para salir, porque eso puede servir para saber (fuera del for) si el for se completo o se aborto... con lo que puedo agregarte otro ejemplo...

Código: [Seleccionar]
import "mod_say";

private
    int h, i;

begin

    FOR (h = 50, i =0; i<50 && h == 50 ; i++)
        FOR (h=0; h<50; h++)
            say("i: " + i + " h: " + h) ;
            //bla bla...codigo...
            if ( h == 14 && i == 4 ) // salir
                break;
            end
        END
    END
end


Si..., ya había leído..., pero si yo pongo i = 51 no se supone que tras el break del for interior, el for exterior realice la comprobación una vez mas y al ser i = 51 se termine también?

gecko

  • Hero Member
  • *****
  • Mensajes: 801
  • Karma: 47
    • Torres Baldi Studio
Re:Terminar FORs anidados
« Respuesta #13 en: Noviembre 29, 2017, 05:24:17 pm »
Si, saldría también, pero si más adelante te interesa el dato de saber hasta que bucle se llegó a ejecutar, ese dato lo perdiste cuando le cambiaste el valor a i. En cambio si usas otra condicion para salir del bucle, la variable i va a conservar ese ultimo valor ejectutado por el for.

Es un dato extra que según tu situación puede servirte o no.
Torres Baldi Studio
http://torresbaldi.com

Hola

  • Full Member
  • ***
  • Mensajes: 104
  • Karma: 0
Re:Terminar FORs anidados
« Respuesta #14 en: Noviembre 29, 2017, 06:34:23 pm »
Ahh entiendo, como dato extra, buen punto. Claro yo como nunca en ningún programa requerí de utilizar esa info del for, bueno, ni lo tuve en cuenta...
Pero si yo realmente no voy a utilizar ese dato..., poner i = 51 no facilita todo el proceso? digo, en lugar de utilizar la var..