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.
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
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
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
Quote from: Drumpi on November 26, 2017, 12:55:01 AM
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.
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
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
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
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
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...
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
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?
Quote from: Futu-block on November 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?
o no entendi tu pregunta, o la respuesta es "correcto"...
no entendi el punto de la pregunta... el "pero" me desconcierta un poco...
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.
Quote from: Hola on November 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.
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.
Quote from: Hola on November 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.
respuesta (y ejemplo)
Quote from: SplinterGU on November 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...
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
Quote from: SplinterGU on November 28, 2017, 05:37:29 PM
Quote from: Futu-block on November 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?
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?
Quote from: SplinterGU on November 29, 2017, 07:06:47 AM
Quote from: Hola on November 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.
respuesta (y ejemplo)
Quote from: SplinterGU on November 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...
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?
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.
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..
si, tamben sirve.
Okay..., grax por las respuestas!
A ver, Panreyes, explica tu desacuerdo :D
La verdad es que eso de "romper" no suena nada bien, y siempre hay otras formas de hacer las cosas. A lo mejor no tan eficientes, por aquello de tener que acabar el contenido del bucle, pero creo recordar que break lo hemos heredado de Basic, un lenguaje que no se caracteriza por sus "buenas maneras" según más de uno (con sus famosos GOTO y demás :D)... y al que le llevo cogiendo asco más de dos semanas ^^U
Quote from: Drumpi on December 02, 2017, 01:05:59 AM
A ver, Panreyes, explica tu desacuerdo :D
La verdad es que eso de "romper" no suena nada bien, y siempre hay otras formas de hacer las cosas. A lo mejor no tan eficientes, por aquello de tener que acabar el contenido del bucle, pero creo recordar que break lo hemos heredado de Basic, un lenguaje que no se caracteriza por sus "buenas maneras" según más de uno (con sus famosos GOTO y demás :D)... y al que le llevo cogiendo asco más de dos semanas ^^U
No hace falta que lo explique mucho. De todas formas, no es lo mismo GOTO que BREAK (aunque BREAK es un tipo de GOTO).
El resumen: un diseño perfecto no requiere BREAKs, ni en programación estructurada, ni orientada a objetos...
Pero cuando haces pequeñas cosas, te pones a escribir código sin preocuparte tanto por dicho diseño y es más cómodo tirar de breaks. That's it.
a ver... para ambos dos...
toda instruccion que exista en un lenguaje, y sea la forma optima y mas corta o performante de hacer algo, se use y funciona... es, estilosa y de diseño perfecto...
en el caso en concreto de un break, la funcion es exactamente para eso, para romper un bucle... en lo que a mi concierne es la mejor forma de salir de uno, para eso fue creada...
y el goto es perfectamente valido, si se necesita...
no existe instruccion mala palabra... si asi lo fueran no existirian...
el problema no esta en usar un goto o un break, el problema esta en usarlos cuando no son necesarios... y repito en el caso de querer salir de un bucle en medio de un codigo, el break es lo correcto...
Quote from: SplinterGU on December 04, 2017, 02:38:10 AM
a ver... para ambos dos...
toda instruccion que exista en un lenguaje, y sea la forma optima y mas corta o performante de hacer algo, se use y funciona... es, estilosa y de diseño perfecto...
en el caso en concreto de un break, la funcion es exactamente para eso, para romper un bucle... en lo que a mi concierne es la mejor forma de salir de uno, para eso fue creada...
y el goto es perfectamente valido, si se necesita...
no existe instruccion mala palabra... si asi lo fueran no existirian...
el problema no esta en usar un goto o un break, el problema esta en usarlos cuando no son necesarios... y repito en el caso de querer salir de un bucle en medio de un codigo, el break es lo correcto...
Completamente de acuerdo. Yo me refiero a los puristas conceptuales, esos son los que dicen que los break y los goto no se deben usar nunca. En su defecto, según su opinión, se debe usar una cantidad ingente de IFs extra.
En eso estamos de acuerdo, pero también estaréis de acuerdo en que, usando el propio lenguaje, hay quien hace auténticas barbaridades. Por eso existen los libros de estilo que absolutamente nadie se los lee, y que en ocasiones no es para que hayan IFs de más o cosas así, son porque probablemente el compilador sea más eficiente usando esas reglas, o por motivos de portabilidad.
Ejemplos de esto último tenemos a Android, que es por lo que hay que hacer mil pruebas en diversos dispositivos para ver que funciona, o GP2X/Wiz, que se suponían que eran compatibles si se usaban bien las librerías oficiales, y casi ningún juego lo ha sido porque la gram mayoría usaba las librerías no oficiales (aunque claro, si se gana un 40% de rendimiento, merece la pena).
Hace una semana estaba con VB6, y tuve problemas para saber si un array valía NULL, porque no se puede comparar un array, con NULL, Nothing ni nada or el estilo. Sólo me dieron dos soluciones: controlar la excepción, o negar dos veces el valor del puntero al array, porque así daba cero cuando no se había inicializado... la mayor parte de las veces.
Las dos son soluciones válidas, admitidas por el lenguaje, y por la amplia mayoría del reducido grupo que aun usa VB6, pero dudo que ninguna de las dos sea una respuesta correcta al problema planteado :D :D :D
ya entiendo porque dicen que visual basic es un canser...
No es un cáncer, es... diferente. Depende del VB que cojas puede ser tan simple como copiar código C# y cambiar 4 tonterías, o ser algo tan frustrante y peligroso como un script en PHP o cualquier lenguaje de diseño web.
En serio, VB6 es propenso a tragarse errores garrafales y hacer como que funciona (hoy, por ejemplo, se ha tragado que no declarase un select case, y escribiera a continuación varios cases). No admite ; para terminar una línea, y en lugar de intro hay que usar el tabulador para usar el autocompletar ¡El entorno ni siquiera me deja usar la rueda del ratón en el editor de código!
Este puente pienso ponerme, aunque sea un par de horitas, a programar Bennu, a ver si me desintoxico :S