Autor Tema: Los GoTo de JAVA, CONTINUE :TAG, BREAK:TAG, TRY CATH THROW FINALLY  (Leído 13164 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Hola amigos foreros, ya tengo varios hilos sobre JAVA, uno es GUI creadas desde teclado, otra es GUI creadas desde la pestaña DISEÑO de un IDE (arrastrar y pegar componentes o controladores)

Ahora hablare de un tema muy controversial el GoTo

Ya son 20 años desde que salio este super mega lenguaje, adquirió fama al revolucionar la Internet, pues antes de java las paginas web eran estáticas, con la introducción de los códigos ejecutables (APPLETS) sobre una pagina WEB se dio a la misma, animación, interactividad, etc. Muchas aplicaciones para PC se portaron a JAVA, por ejemplo MatLab esta re-escrito en gran parte en JAVA.

Se ha compilado programas JAVA para usarse en diversos equipos, desde nuestro ordenador o computador portátil, hasta en juguetes, relojes, tablets, celulares, periféricos de sistemas embebidos como pantallas táctiles etc. y mas allá ...  de esos millones de códigos fuente ¿alguien no ha necesitado un Goto?

¿por que JAVA no tiene un GoTo funcional?

JAVA si tiene una palabra reservada GoTo, pero los diseñadores la reservaron sin funcionalidad, dicen que para incorporarla en un futuro, si hubiera una petición masiva por parte de los desarrolladores o programadores a nivel mundial, pero parece que nadie necesita un GoTo, también se dice que los diseñadores de JAVA reservaron la palabra GoTo, para que nadie creara una método o función que realice un GoTo y con el nombre en minúsculas "goto"


NO soy un teórico de la computación, ni soy maestro en JAVA, ni en informática, apenas un autodidacta en programación de alto nivel, así que mis exposiciones pueden estar erradas, alguien con mayor dominio del tema me puede refrendar o dar valides o no, a lo siguiente

¿Es necesaria e indispensable la instrucción GOTO? pues NO!, hay ciertos algoritmos en especial algebraicos donde existen una lógica o secuencia de ruptura de un lazo o bucle dentro de varios bucles anidados, la ruptura puede ser salir del bucle actual o salir del bucle actual y todos los anidados interiormente y caso mas extremo salir y abandonar todos los bucles e ir a una parte x del código, implica este tipo de lógica, que no se puede estructurar dicho algoritmo, entonces en este caso se requiere, QUIERA O NO la instrucción GOTO, pero que pasa si ese algoritmo tiene un algoritmo ALTERNATIVO o con pequeñas modificaciones de mover bloques de sentencias que no es considerado propiamente una modificación  ejemplo

x=5
y=6

si intercambio

y=6
x=5

el algoritmo es igual lo importante es conservar las verdaderas sentencias del algoritmo como expresiones artimeticas, tampoco se considera cambio del algoritmo al agregar mas variables como desbordes de contadores para hacer una salida forzada del bucle, es decir o en resumen que haga lo mismo agregando pasos extras el algoritmo en ciertas partes y si no se puede mejor crear un nuevo algoritmo, que en tiempo de respuesta o no podría ser mas rápido o mas lento, entonces ESTE ALGORITMO ALTERNATIVO no se necesita el GOTO como tal, ósea que la TEORÍA DE QUE UN LENGUAJE ES INFERIOR por que no posee GOTO esta echada bajo tierra, se reivindicara el GOTO cuando exista en el mundo un único algoritmo y que nadie halla sido capaz de crear un alterno para solucionar algo y ese algoritmo requiera al menos un solo GoTo


Ahora en JAVA si hay GoTos, pero limitados o como deben ser, es decir se limita a ciertos sectores del código o cuerpos de bloque pero no un GOTO como valla a la etiqueta en x en tal parte del código, ya que un código con GoTos puede ser 100% funcional y lo mejor sin errores en su respuesta, pero un código fuente con GoTos se lo denomina "Código spaghetti/espagueti" un maraña que solo la entiende el creador, no Dios, si no el creador del código, los GoTos en otros lenguajes también son importantes para la captura de errores en tiempo de ejecución SI hay un error IR A ....

Los GoTos limitados de JAVA son: CONTINUE :TAG, BREAK:TAG, y para detectar o capturar errores TRY CATH THROW FINALLY con estas instrucciones se puede solventar cualquier tipo de algoritmo, por esta razón aun no es útil un GoTo en JAVA, si es que lo es alguna ves en su existencia

¿Debemos enterrar la sentencia GOTO?

Muy pocos le dan uso a las instrucciones CONTINUE y BREAK muy útiles para simplificar código en ciertos algoritmos en donde se requiere saltar entre ciclos sin usar contadores de desborde, mostrare códigos  CONTINUE y BREAK versus la VERSION SIN LOS MISMOS y es la que mas me gusta, finaliza este hilo con TRY CATH THROW FINALLY

A: instrucción CONTINUE
En tiempo de corrida o ejecución, si dentro de un cuerpo o bloque de repetición como FOR,  se encuentra la instrucción CONTINUE el código que esta debajo de este, hasta el cierre de cuerpo del bloque de repetición (}) no se ejecuta, en otras palabras hace un salto o GoTo a la siguiente iteración del ciclo

1er Ejemplo:

Algoritmo:
Código: [Seleccionar]
Crear 1 FOR
FOR1: rango [0, 5] paso 1 
Dentro del FOR1, mostrar valor actual del contador, calcule y muestre el cuadrado del contador

Código: Java
  1. package curso_JAVA.consola.gotos;
  2. public class EJEMPLO1_CONTINUE {
  3.  
  4.     public static void main(String argumentos_de_entrada[]) {
  5.         double cuadrado = 0.;
  6.         for (int ciclo1_contador = 0; ciclo1_contador <= 5; ciclo1_contador = ciclo1_contador + 1) {
  7.             System.out.println("contador del ciclo1 en: " + ciclo1_contador);
  8.             // valor al cuadrado del contador de ciclos
  9.             cuadrado =  Math.pow(ciclo1_contador,2);
  10.             continue;
  11.              System.out.println("contador^2: " + ciclo1_contador  + "^2 = " + cuadrado);
  12.              System.out.println("");
  13.        }//next for
  14.  
  15.     }//main
  16.  
  17. }//class

la salida es

----------------------------------------
contador del ciclo1 en: 0
contador del ciclo1 en: 1
contador del ciclo1 en: 2
contador del ciclo1 en: 3
contador del ciclo1 en: 4
contador del ciclo1 en: 5
----------------------------------------

Pero no mostró o desplegó en pantalla los cuadrados de cada contador, ¿por qué?

Las sentencias
Código: Java
  1. System.out.println("contador^2: " + ciclo1_contador  + "^2 = " + cuadrado);
  2. System.out.println("");

nunca se ejecutan, pues antes de estas, la instrucción CONTINUE hace un GoTo a la próxima iteracion, el algoritmo no retorna lo deseado, se indicó como afecta una instrucción CONTINUE dentro de un bucle o ciclo

Si eliminamos la sentencia CONTINUE; todo el bloque se ejecutará y algoritmo propuesto arrojara lo pedido

La salida ahora es

----------------------------------------
contador del ciclo1 en: 0
contador^2: 0^2 = 0.0

contador del ciclo1 en: 1
contador^2: 1^2 = 1.0

contador del ciclo1 en: 2
contador^2: 2^2 = 4.0

contador del ciclo1 en: 3
contador^2: 3^2 = 9.0

contador del ciclo1 en: 4
contador^2: 4^2 = 16.0

contador del ciclo1 en: 5
contador^2: 5^2 = 25.0
----------------------------------------

« Última modificación: 02 de Marzo de 2016, 19:03:34 por CompSystems »
Desde Colombia

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Algo mas sobre JAVA
« Respuesta #1 en: 31 de Enero de 2016, 11:20:30 »
Hola compysystem, tengo una recomendación, creo que deberías cambiar el titulo del tema para dejar mas claro la parte de java que estas explicando, así será más fácil de encontrar para quien busque esta información.

Obviamente es solo un consejo ;-)

Un saludo

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Los GoTo de JAVA ...
« Respuesta #2 en: 31 de Enero de 2016, 12:22:17 »
OK juaperser1, como dice JAVA refactor from "Algo mas sobre JAVA" to "Los GoTo de JAVA ..."

Como buena practica de programación informática, la instrucción CONTINUE se debe ser colocar dentro de un bloque de una estructura condicional

2do ejemplo

Algoritmo:
Código: [Seleccionar]
Crear 1 solo bucle usando FOR
FOR1: rango [0, 5] paso 1 
Dentro del FOR1, mostrar valor actual y si el CONTADOR no es par (impar), salte a la siguiente iteración,
de lo contrario calcule y muestre el cuadrado del contador,
use un indicador, flag o bandera para determinar si es par o impar

Código: Java
  1. package curso_JAVA.consola.gotos;
  2. public class EJEMPLO2_CONTINUE {
  3.  
  4.     public static void main(String argumentos_de_entrada[]) {
  5.         System.out.println("----------------------------------------");
  6.         System.out.println("... Antes de entrar al bucle o ciclo PARA");
  7.  
  8.         boolean esPar = false;
  9.         double control;// = 0.;
  10.         for (int ciclo1_contador = 0; ciclo1_contador <= 5; ciclo1_contador = ciclo1_contador + 1) {
  11.             System.out.println("\ncontador del ciclo1 en: " + ciclo1_contador);
  12.             esPar = ((ciclo1_contador % 2) == 0);
  13.             if (!esPar) {
  14.                 // Si no es par salta a la siguiente iteración y no ejecuta el bloque de abajo
  15.                 continue;
  16.             }
  17.            
  18.             // Bloque condicional controlado por CONTINUE
  19.             // valor al cuadrado del contador de ciclos
  20.             control = Math.pow(ciclo1_contador, 2);
  21.             System.out.println("contador^2: " + ciclo1_contador + "^2 = " + control);
  22.             // Fin del bloque condicional
  23.            
  24.         }//next for
  25.         System.out.println("\nDespués de Salir del bucle o ciclo PARA ...");
  26.         System.out.println("----------------------------------------");
  27.  
  28.     }//main
  29. }//class

salida

----------------------------------------
... Antes de entrar al bucle o ciclo PARA

contador del ciclo1 en: 0
contador^2: 0^2 = 0.0

contador del ciclo1 en: 1

contador del ciclo1 en: 2
contador^2: 2^2 = 4.0

contador del ciclo1 en: 3

contador del ciclo1 en: 4
contador^2: 4^2 = 16.0

contador del ciclo1 en: 5

Después de Salir del bucle o ciclo PARA ...
----------------------------------------


el código anterior es muy trivial, solo es una demostración del uso de CONTINUE, dejando la condición intacta, el código debajo donde estaba el CONTINUE, se lo puede reemplazar encerrándolo dentro un cuerpo ELSE{}


Código: Java
  1. package curso_JAVA.consola.gotos;
  2. public class EJEMPLO2_CONTINUE {
  3.  
  4.     public static void main(String[] args) {
  5.         System.out.println("----------------------------------------");
  6.         System.out.println("... Antes de entrar al bucle o ciclo PARA");
  7.  
  8.         boolean esPar = false;
  9.         double control;// = 0.;
  10.         for (int ciclo1_contador = 0; ciclo1_contador <= 5; ciclo1_contador = ciclo1_contador + 1) {
  11.             System.out.println("\ncontador del ciclo1 en: " + ciclo1_contador);
  12.             esPar = ((ciclo1_contador % 2) == 0);
  13.             if (!esPar) {
  14.                 // no realice nada
  15.             } else {
  16.                  // valor al cuadrado del contador de ciclos
  17.                 control = Math.pow(ciclo1_contador, 2);
  18.                 System.out.println("contador^2: " + ciclo1_contador + "^2 = " + control);
  19.             }
  20.         }//next for
  21.         System.out.println("\nDespués de Salir del bucle o ciclo PARA ...");
  22.         System.out.println("----------------------------------------");
  23.  
  24.  
  25.     }//main
  26. }//class

otra opción es introducir o mover el código debajo donde estaba el CONTINUE, dentro del cuerpo THEN del IF, pero además se necesita suprimir la negación de NO ES PAR por ES PAR para conservar la lógica del algoritmo

Código: Java
  1. if (esPar) {
  2.                  // valor al cuadrado del contador de ciclos
  3.                 control = Math.pow(ciclo1_contador, 2);
  4.                 System.out.println("contador^2: " + ciclo1_contador + "^2 = " + control);
  5.             }


... Pero el poder de CONTINUE es que este permite una etiqueta,  antes de mostrar un ejemplo veamos la instrucción BREAK

A: instrucción BREAK
En tiempo de corrida o ejecución, si dentro de un cuerpo o bloque de repetición como FOR,  se encuentra la instrucción BREAK abandona y termina el ciclo, en otras palabras hace un salto o GoTo a la siguiente sentencia después del cierre de cuerpo del bloque de repetición ( } )
« Última modificación: 03 de Febrero de 2016, 11:30:23 por CompSystems »
Desde Colombia

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA
« Respuesta #3 en: 31 de Enero de 2016, 20:26:14 »
Código reemplazando CONTINUE con BREAK del ejemplo anterior

3cer Ejemplo

Algoritmo:
Código: [Seleccionar]
Crear 1 FOR
FOR1: rango [0, 5] paso 1 
Dentro del FOR1, mostrar valor actual y si el CONTADOR no es par (impar)
termine el ciclo o rutina de repetición
de lo contrario calcule y muestre el cuadrado del contador

Código: Java
  1. package curso_JAVA.consola.gotos;
  2. public class EJEMPLO3_BREAK {
  3.  
  4.     public static void main(String argumentos_de_entrada[]) {
  5.         System.out.println("----------------------------------------");
  6.         System.out.println("... Antes de entrar al bucle o ciclo PARA");
  7.  
  8.         boolean esPar;// = false;
  9.         double control;// = 0.;
  10.         for (int ciclo1_contador = 0; ciclo1_contador <= 5; ciclo1_contador = ciclo1_contador + 1) {
  11.             System.out.println("\ncontador del ciclo1 en: " + ciclo1_contador);
  12.             esPar = ((ciclo1_contador % 2) == 0);
  13.             if (!esPar) {
  14.                 // Si no es par termine el ciclo o bucle
  15.                 break;
  16.             } else {
  17.                   // valor al cuadrado del contador de ciclos
  18.                 control = Math.pow(ciclo1_contador, 2);
  19.                 System.out.println("contador^2: " + ciclo1_contador + "^2 = " + control);
  20.               }
  21.         }//next for
  22.         System.out.println("\nDespués de Salir del bucle o ciclo PARA ...");
  23.         System.out.println("----------------------------------------");
  24.  
  25.     }//main
  26. }//class

Salida

----------------------------------------
... Antes de entrar al bucle o ciclo PARA

contador del ciclo1 en: 0
contador^2: 0^2 = 0.0

contador del ciclo1 en: 1

Después de Salir del bucle o ciclo PARA ...
----------------------------------------

« Última modificación: 03 de Febrero de 2016, 11:42:01 por CompSystems »
Desde Colombia

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA
« Respuesta #4 en: 31 de Enero de 2016, 22:12:11 »
Un ejemplo donde se anidan FORes, la secuencia se ve interrumpida por condiciones como si el contador es o no par del ciclo anterior, esto con el propósito de hacer saltos condicionales entre FORes

4to Ejemplo

Algoritmo:
Código: [Seleccionar]
Crear 3 FORes
FOR1: rango [0, 5] paso 1 
FOR2: rango [4, 7] paso 1
FOR3: rango [8, 11] paso 1

anidar FOR 2 dentro FOR1
anidar FOR3 dentro FOR2
debe estar FOR3 dentro de FOR2 dentro de FOR1

Dentro del FOR1, mostrar valor actual del contador y si el contador del FOR1 supera el valor de 3 abandonar todos los ciclos internos a FOR1

Dentro del FOR2, mostrar valor actual del contador y si el contador del FOR anterior (FOR1) es par, terminar ciclo ACTUAL e INTERNOS (FOR2)

Dentro del FOR3, mostrar valor actual del contador y  si el contador del FOR anterior (FOR2) es impar, terminar ciclo ACTUAL

Código: Java
  1. public class package curso_JAVA.consola.gotos;
  2. public class EJEMPLO4_BREAK {
  3.  
  4.  
  5.     public static void main(String argumentos_de_entrada[]) {
  6.         System.out.println("----------------------------------------");
  7.         System.out.println("... Antes de entrar al bucle o ciclo PARA");
  8.  
  9.        
  10.         System.out.println("rango para cada ciclo");
  11.         System.out.println("for i desde 0 a 5 en pasos de 1, total 6 pasos");
  12.         System.out.println("for j desde 4 a 7 en pasos de 1,, total 4 pasos");
  13.         System.out.println("for k desde 8 a 11 en pasos de 1, total 4 pasos\n");
  14.  
  15.         int i;
  16.         int minI = 0;
  17.         int maxI = 5;
  18.         int incrI = 1;
  19.  
  20.         int j;
  21.         int minJ = 4;
  22.         int maxJ = 7;
  23.         int incrJ = 1;
  24.  
  25.         int k;
  26.         int minK = 8;
  27.         int maxK = 11;
  28.         int incrK = 1;
  29.  
  30.         for (i = minI; i <= maxI; i = i + incrI) {
  31.             System.out.println("Bucle I [" + minI + ", ... " + maxI + "]");
  32.             System.out.println("      I = " + i);
  33.             if (i > 3) {
  34.                 System.out.println("      como el contador I es mayor que 3, termina bloque ACTUAL I e INTERNOs J,K\n");
  35.                 break;
  36.             }
  37.  
  38.             for (j = minJ; j <= maxJ; j = j + incrJ) {
  39.                 System.out.println("Bucle __J [" + minJ + ", ... " + maxJ + "]");
  40.                 System.out.println("        J = " + j);
  41.                 if ((i % 2) == 0) {
  42.                     System.out.println("        como el contador anterior I es par, termina bloque ACTUAL J e INTERNO K\n");
  43.                     break;
  44.                 }
  45.  
  46.                 for (k = minK; k <= maxK; k = k + incrK) {
  47.                     System.out.println("Bucle   __K [" + minK + ", ... " + maxK + "]");
  48.                     System.out.println("          K = " + k);
  49.                     if ((j % 2) != 0) {
  50.                         System.out.println("          como el contador anterior J es IMPAR, termina bloque ACTUAL K\n");
  51.                         break;
  52.                     }
  53.  
  54.                 }//next for K
  55.             }//next for J
  56.         }//next for I
  57.  
  58.         System.out.println("\nDespués de Salir del bucle o ciclo PARA ...");
  59.         System.out.println("----------------------------------------");
  60.     }//main
  61. }//class

salida


... Antes de entrar al bucle o ciclo PARA
rango para cada ciclo
for i desde 0 a 5 en pasos de 1, total 6 pasos
for j desde 4 a 7 en pasos de 1,, total 4 pasos
for k desde 8 a 11 en pasos de 1, total 4 pasos

Bucle I [0, ... 5]
      I = 0
Bucle __J [4, ... 7]
        J = 4
        como el contador anterior I es par, termina bloque ACTUAL J e INTERNO K

Bucle I [0, ... 5]
      I = 1
Bucle __J [4, ... 7]
        J = 4
Bucle   __K [8, ... 11]
          K = 8
Bucle   __K [8, ... 11]
          K = 9
Bucle   __K [8, ... 11]
          K = 10
Bucle   __K [8, ... 11]
          K = 11
Bucle __J [4, ... 7]
        J = 5
Bucle   __K [8, ... 11]
          K = 8
         como el contador anterior J es IMPAR, termina bloque ACTUAL K

Bucle __J [4, ... 7]
        J = 6
Bucle   __K [8, ... 11]
          K = 8
Bucle   __K [8, ... 11]
          K = 9
Bucle   __K [8, ... 11]
          K = 10
Bucle   __K [8, ... 11]
          K = 11
Bucle __J [4, ... 7]
        J = 7
Bucle   __K [8, ... 11]
          K = 8
         como el contador anterior J es IMPAR, termina bloque ACTUAL K

Bucle I [0, ... 5]
      I = 2
Bucle __J [4, ... 7]
        J = 4
        como el contador anterior I es par, termina bloque ACTUAL J e INTERNO K

Bucle I [0, ... 5]
      I = 3
Bucle __J [4, ... 7]
        J = 4
Bucle   __K [8, ... 11]
          K = 8
Bucle   __K [8, ... 11]
          K = 9
Bucle   __K [8, ... 11]
          K = 10
Bucle   __K [8, ... 11]
          K = 11
Bucle __J [4, ... 7]
        J = 5
Bucle   __K [8, ... 11]
          K = 8
         como el contador anterior J es IMPAR, termina bloque ACTUAL K

Bucle __J [4, ... 7]
        J = 6
Bucle   __K [8, ... 11]
          K = 8
Bucle   __K [8, ... 11]
          K = 9
Bucle   __K [8, ... 11]
          K = 10
Bucle   __K [8, ... 11]
          K = 11
Bucle __J [4, ... 7]
        J = 7
Bucle   __K [8, ... 11]
          K = 8
         como el contador anterior J es IMPAR, termina bloque ACTUAL K

Bucle I [0, ... 5]
      I = 4
      como el contador I es mayor que 3, termina bloque ACTUAL I e INTERNOs J,K

Después de Salir del bucle o ciclo PARA ...

« Última modificación: 03 de Febrero de 2016, 11:42:49 por CompSystems »
Desde Colombia

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA
« Respuesta #5 en: 01 de Febrero de 2016, 00:19:02 »
Ejemplo 4.1

El RETO ahora es codificar el mismo código sin el uso de BREAK, para demostrar que aun sin BREAK y CONTINUE se puede llevar la logica de un algoritmo a codigo

reto superado  :-/

Código: Java
  1. package curso_JAVA.consola.gotos;
  2. public class EJEMPLO4_1_BREAK {
  3.  
  4.     public static void main(String argumentos_de_entrada[]) {
  5.         System.out.println("----------------------------------------");
  6.         System.out.println("... Antes de entrar al bucle o ciclo PARA");
  7.  
  8.         System.out.println("rango para cada ciclo");
  9.         System.out.println("for i desde 0 a 5 en pasos de 1, total 6 pasos");
  10.         System.out.println("for j desde 4 a 7 en pasos de 1,, total 4 pasos");
  11.         System.out.println("for k desde 8 a 11 en pasos de 1, total 4 pasos\n");
  12.  
  13.         int i;
  14.         int minI = 0;
  15.         int maxI = 5;
  16.         int incrI = 1;
  17.  
  18.         int j;
  19.         int minJ = 4;
  20.         int maxJ = 7;
  21.         int incrJ = 1;
  22.  
  23.         int k;
  24.         int minK = 8;
  25.         int maxK = 11;
  26.         int incrK = 1;
  27.  
  28.         for (i = minI; i <= maxI; i = i + incrI) {
  29.             boolean desbordeI = false;
  30.             System.out.println("Bucle I [" + minI + ", ... " + maxI + "]");
  31.             System.out.println("      I = " + i);
  32.             if (i > 3) {
  33.                 System.out.println("      como el contador I es mayor que 3, termina bloque ACTUAL I e INTERNOs J,K\n");
  34.                 desbordeI = true; // se fija a verdadero el ID de desborde de I
  35.                 // desborda el contador de i, por ende sale del ciclo I
  36.                 i = maxI + incrI;
  37.                 //break;
  38.             }// end if
  39.  
  40.             for (j = minJ; j <= maxJ; j = j + incrJ) {
  41.                 boolean desbordeJ = false;
  42.                 if (desbordeI == true) {
  43.                     // se coloca j > maxJ para que el ciclo for J nunca se efectue
  44.                     j = maxJ + incrJ;
  45.                 } else {
  46.                     System.out.println("Bucle __J [" + minJ + ", ... " + maxJ + "]");
  47.                     System.out.println("        J = " + j);
  48.                     if ((i % 2) == 0) {
  49.                         System.out.println("        como el contador anterior I es par, termina bloque ACTUAL J e INTERNO K\n");
  50.                         desbordeJ = true; // se fija a verdadero el ID de desborde de J
  51.                         // desborda el contador de J, por ende sale del ciclo J
  52.                         j = maxJ + incrJ;
  53.                         // break;
  54.                     }// end if
  55.                 }// end else
  56.                 for (k = minK; k <= maxK; k = k + incrK) {
  57.                     if (desbordeI == true || desbordeJ == true) {
  58.                         // se coloca k > maxK para que el ciclo for K nunca se efectue
  59.                         k = maxK + incrK;
  60.                         // invierte el flag
  61.                         desbordeI = false;
  62.                         desbordeJ = false;
  63.                     } else {
  64.                         System.out.println("Bucle   __K [" + minK + ", ... " + maxK + "]");
  65.                         System.out.println("          K = " + k);
  66.                         if ((j % 2) != 0) {
  67.                             System.out.println("          como el contador anterior J es IMPAR, termina bloque ACTUAL K\n");
  68.                             // desborda el contador de k, por ende sale del ciclo K
  69.                             k = maxK + incrK;
  70.                             //break;
  71.                         }// end if
  72.                     }// end else
  73.                 }//next for K
  74.             }//next for J
  75.         }//next for I
  76.  
  77.         System.out.println("\nDespués de Salir del bucle o ciclo PARA ...");
  78.         System.out.println("----------------------------------------");
  79.     }//main
  80. }//class
« Última modificación: 03 de Febrero de 2016, 11:43:54 por CompSystems »
Desde Colombia

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Los GoTo de JAVA
« Respuesta #6 en: 01 de Febrero de 2016, 00:51:04 »
Citar
el código anterior es muy trivial, solo es una demostración del uso de CONTINUE, se podria haber reemplazado por un else

Mas que un else, directamente haber cambiado la condicion del if

Código: Java
  1. for (int ciclo1_contador = 0; ciclo1_contador <= 5; ciclo1_contador = ciclo1_contador + 1) {
  2.             System.out.println("\ncontador del ciclo1 en: " + ciclo1_contador);
  3.             esPar = ((ciclo1_contador % 2) == 0);
  4.             if (esPar) {
  5.                  // valor al cuadrado del contador de ciclos
  6.                 control = Math.pow(ciclo1_contador, 2);
  7.                 System.out.println("contador^2: " + ciclo1_contador + "^2 = " + control);
  8.             }
  9.         }//next for

El continue y el break funcionan de la misma forma que en C

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA
« Respuesta #7 en: 01 de Febrero de 2016, 11:46:45 »
Citar
... directamente haber cambiado la condición del if
Gracias KILLERJC por el aporte, agregado en el ejemplo#2

Citar
El continue y el break funcionan de la misma forma que en C

pero en JAVA tiene la opción de  ir a una etiqueta, apenas esta semana me entere de esto consultando sobre el uso de CONTINUE Y BREAK, próximamente anexare ejemplos
« Última modificación: 01 de Febrero de 2016, 23:44:47 por CompSystems »
Desde Colombia

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA
« Respuesta #8 en: 01 de Febrero de 2016, 23:30:43 »
con la lógica del ejemplo 4.1 (desborde contadores para no usar CONTINUE ni BREAK), muestro un algoritmo practico,

Ejemplo #5

LISTAR LOS #S PRIMOS hasta un valor N

Usa uno de tanto algoritmos de Criba o Colador De Números Primos, recordemos que el primer Colador de primos lo creo Eratóstenes hace mucho mucho tiempo (prehistoria)
El programa debe retornar, los números primos menores a N

Es importante analizar los siguientes casos

Si n es menor que 10 debe mostrar la siguiente lista de #s primos:

{ 2, 3, 5, 7 } (4 en total)

Si n es menor que 100,  (26 en total)

{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 y 97 }

Si n es menor que 1,000 (168 en total)

{ 2   3   5   7   11   13   17   19   23   29   31   37   41   43   47   53   59   61   67
71   73   79   83   89   97   101   103   107   109   113   127   131   137   139   149   151   157   163
167   173   179   181   191   193   197   199   211   223   227   229   233   239   241   251   257   263   269
271   277   281   283   293   307   311   313   317   331   337   347   349   353   359   367   373   379   383
389   397   401   409   419   421   431   433   439   443   449   457   461   463   467   479   487   491   499
503   509   521   523   541   547   557   563   569   571   577   587   593   599   601   607   613   617   619
631   641   643   647   653   659   661   673   677   683   691   701   709   719   727   733   739   743   751
757   761   769   773   787   797   809   811   821   823   827   829   839   853   857   859   863   877   881
883   887   907   911   919   929   937   941   947   953   967   971   977   983   991   997 }

Si n es menor que 10,000 son 1229

{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, ..., 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973 }

Si n es menor que 100,000 son 9592 ...

¿Que noto a simple vista? que el único primo par es el 2, entonces podemos pensar que un colador o generador de primos debe descartar los números pares o empezar a buscar solamente dentro los números impares 2*n+1 ó 2*n-1, como el código agrega los 2 primeros números primos, basta con chequear desde x = 6 * n - 1

se observa también que al incrementar N, la lista crece rápidamente, entonces si ejecuta el código con N mayor a 1000000 podrá ver que se demora muchísimo tiempo

El código de abajo se codifico con muchas variables para facilitar la depuración, próximamente incluiré código fuente simplificado del mismo y usando BREAK, ...

SI USTED DESEA APRENDER MAS, corra el programa paso a paso, se ha demostrado que un método para facilitar el aprendizaje o adquirir lógica de programacion es "Debugiar"  o Depurar un código, ademas observa el mecanismo del algoritmo

El algoritmo indicado abajo no es eficiente, solo sirve para demostrar como usar el desborde del contador de cada FOR para salir del bucle sin usar BREAK o CONTINUE, ni mucho menos el GoTo

Código: [Seleccionar]
PASOS
1: declarar un objeto tipo LISTA, ya que este objeto en JAVA es de tipo dinámico el cual podrá almacenar miles de números solo con la limitante de su memoria RAM

cálculos aproximados, si me equivoco me corrigen por favor

Si al correr el programa se tiene 1 GiBytes libre en RAM y como un  GiBytes equivale a
2^30 bytes = 1024 mebibyte (MiG) = 1073741824 bytes
y como cada elemento de la lista es un LONG de 8 Bytes,
podemos almacenar 1073741824 bytes / 8 bytes = 134,217,728  ~ 134 mil números primos y cada uno entre [0, ..., 2^(8*8-1)-1=  9,223,372,036,854,775,807] que es el limite de LONG para números enteros positivos en java

pero si almacenamos la salida en un archivo es decir cada primo encontrado lo escribimos en un archivo texto podemos colocar millones de #s primos, solo nos limitaría la capacidad de nuestro disco duro

Si tenemos libre un 1 tebibyte osea 2^40 bytes = 1 099 511 627 776 en nuestro disco duro
 y como LONG maneja hasta 19 dígitos + un espacio = 20 caracteres y so almacenados cada dígito en ASCCI de 8 bytes cada impresión podría ocupar hasta 8*20 = 160 bytes,
con este razonamiento entonces podemos almacenar aproximadamente
1099511627776 / 160 = 6,871,947,673.6 impresiones  ~
6.8 mil millones de números primos pero es mas realmente, por que no todos los primes inician en 19 dígitos

2: adherir el 2 y 3 como los dos primeros primos,, ya que algoritmo cola el primer primo a partir de 5
3: desplegar en pantalla los dos primeros #s primos
4: declarar variables de cada expresión del algoritmo para facilitar la depuración
(N, contador primer bucle)
(K, contador segundo bucle)
(maxK, limite segundo bucle)
(J, contador primo)
...
5: iniciar un bucle en pasos de 1 y entre N=1 hasta N<=100 ó 1000 o el que desee
6: evaluar la expresión X=6*N-1
...


Código: Java
  1. import java.util.ArrayList;
  2.  
  3. public class UnColadorDePrimos{
  4.  
  5.     public static void main(String[] args) {
  6.         // Crea un objeto tipo lista
  7.         ArrayList<Double> lista = new ArrayList();
  8.         // Adhiere 2 a la lista
  9.         lista.add(2.);
  10.         // Adhiere 3 a la lista
  11.         lista.add(3.);
  12.  
  13.         System.out.println(lista.get(0));
  14.         System.out.println(lista.get(1));
  15.         // variables valor para FOR n
  16.         // Contador para FOR n
  17.         int n;
  18.         // rango FOR n [1, 6] pasos en 1
  19.         int minN = 1;
  20.         int maxN = 100;
  21.         int incrN = 1;
  22.  
  23.         // variables valor para FOR k
  24.         // Contador para FOR k
  25.         int k;
  26.         // rango FOR n [1, j] pasos en 1
  27.         int minK = 1;
  28.         int maxK;
  29.         int incrK = 1;
  30.  
  31.         // Contador, maximo valor para FOR k, inicialmente en 2
  32.         int j = 2;
  33.  
  34.         double x;
  35.  
  36.         for (n = minN; n <= maxN; n = n + incrN) {
  37.             x = 6 * n - 1;
  38.             maxK = j;
  39.             boolean desbordeK = false;
  40.             for (k = minK; k <= maxK; k = k + incrK) {
  41.                 desbordeK = false;
  42.                 double numero = lista.get(k - 1);
  43.                 double testA = numero;
  44.                 double testB = Math.sqrt(x);
  45.                 boolean test1 = (testA > testB);
  46.                 if (test1 == true) {
  47.                     j = j + 1;
  48.                     lista.add(x);
  49.                     System.out.println(lista.get(j - 1));
  50.                     x = 6 * n + 1;                    
  51.                     // Abandonar ciclo
  52.                     desbordeK = true;
  53.                     k = maxK + incrK;
  54.                 } else {
  55.                     double testC = x / numero;
  56.                     double testD = Math.floor(x / numero);
  57.                     boolean test2 = (testC == testD);
  58.                     if (test2 == true) {
  59.                         x = 6 * n + 1;
  60.                         desbordeK = true;
  61.                         // Abandonar ciclo
  62.                         k = maxK + incrK;
  63.                     }
  64.                 }// end if
  65.  
  66.             }//next for k
  67.  
  68.             if (desbordeK != true) {
  69.                 j = j + 1;
  70.                 lista.add(x);
  71.                 System.out.println(lista.get(j - 1));
  72.             }
  73.  
  74.             maxK = j;
  75.             boolean desbordeK2 = false;
  76.             for (k = minK; k <= maxK; k = k + incrK) {
  77.                 desbordeK2 = false;
  78.                 double numero = lista.get(k - 1);
  79.                 double testA = numero;
  80.                 double testB = Math.sqrt(x);
  81.                 boolean test1 = (testA > testB);
  82.                 if (test1 == true) {
  83.                     j = j + 1;
  84.                     lista.add(x);
  85.                     System.out.println(lista.get(j - 1));
  86.                     // Abandonar ciclo
  87.                     desbordeK2 = true;
  88.                     k = maxK + incrK;
  89.                 } else {
  90.                     double testC = x / numero;
  91.                     double testD = Math.floor(x / numero);
  92.                     boolean test2 = (testC == testD);
  93.                     if (test2 == true) {
  94.                         // Abandonar ciclo
  95.                         k = maxK + incrK;
  96.                     }
  97.                 }// end if
  98.  
  99.             }//next for k
  100.  
  101.             if (desbordeK2 != true) {
  102.                 j = j + 1;
  103.                 lista.add(x);
  104.                 System.out.println(lista.get(j - 1));
  105.             }
  106.  
  107.         }//next for n
  108.  
  109.     }// main
  110.  
  111. }// class


« Última modificación: 04 de Febrero de 2016, 10:26:32 por CompSystems »
Desde Colombia

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA, CONTINUE :TAG, BREAK:TAG, TRY CATH THROW FINALLY
« Respuesta #9 en: 04 de Febrero de 2016, 09:52:44 »
Como el máximo long en java es (2^63)-1 = 9,223,372,036,854,775,807 se requiere en ciertos algoritmos números aun mas grandes, como los que se muestran en algunos vídeos de PI con millones de dígitos. ¿Entonces existe en java una biblioteca que maneje números enteros mas grandes que LONG?

Una aplicación de estos números "largos" son los números primos

mas info en wikipedia
https://es.wikipedia.org/wiki/N%C3%BAmero_primo

Código: [Seleccionar]
total primos      rango de búsqueda hasta
0                       10^0=0                                       
4                       10^1=10                                                     
25                      10^2=100                                   
168                     10^3=1,000                                 
1,229                   10^4=10,000             
9,592                   10^5=10,0000             
78,498                  10^6=1millon           
664,579                 10^7=10millones         
5,761,455               10^8=100millones       
50,847,534              10^9=1000millones       
455,052,511             10^10=10,000millones   
4,118,054,813           10^11=100,000millones               
37,607,912,018          10^12=1billon                       
346,065,536,839         10^13=10billones                 
3,204,941,750,802       10^14=100billones               
29,844,570,422,669      10^15=1000billones               
279,238,341,033,925     10^16=10,000billones   
2,623,557,157,654,233   10^17=100,000billones   
24,739,954,287,740,860  10^18=1trillon         
234,057,667,276,344,607 10^19=10trillones                          234,057,667,276,344,607 10^20=100trillones
     

« Última modificación: 17 de Febrero de 2016, 09:50:07 por CompSystems »
Desde Colombia

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re:Los GoTo de JAVA, CONTINUE :TAG, BREAK:TAG, TRY CATH THROW FINALLY
« Respuesta #11 en: 13 de Febrero de 2016, 01:12:06 »
Gracias por el link, en 20 libros de java que he consultado, hoy encontré uno solo que menciona precisión arbitraria, pero no hay ejemplos  en estos libros :( , buscando en la red ...



Ejemplo #6

faltaba agregar un ejemplo usando BREAK y CONTINUE CON ETIQUETAS, las etiquetas deben estar exclusivamente antes de un ciclo, de lo contrario el compilador se quejará, para que sean útiles las etiquetas estas deben romper ciclos, de mas de un ciclo interno, de lo contrario seria equivalente a un CONTINUE y BREAK sin etiqueta, tambien la variable de inicializacion debe ESTAR por lo general POR FUERA DE LOS "PARAMETROS" del FOR,

¿Saben si otros lenguajes tienen la opción del BREAK y CONTINUE con etiquetas?
si es así me comentan, gracias


Ejemplo basado en uno que encontré en un libro de JAVA, Se demuestra que el uso del GOTO sin control NO son necesarios, los únicos GoTo QUE SE REQUIEREN son los mencionados en esta publicación, CONTINUE, BREAK, los mismos con etiqueta y detección de errores, nada mas, hasta que alguien me demuestre lo contrario, e incluso estoy casi seguro que ni los  CONTINUE, BREAK se necesitan, pues demostré con ejemplos que todo algoritmo se puede estructurar, reitero hasta que alguien me de un contraejemplo  :mrgreen: para modificar este articulo

Los GoTo se los dejamos a los programadores en lenguaje ASM, que a mi también me gusta, pero cada cosa en su lugar

Código: Java
  1. public class BreakYContinueConEtiquetas {
  2.  
  3.     public static void main(String[] args) {
  4.         int i = 1;
  5.         int k = 0;
  6.         outer: // No puede haber sentencias, después de esta instrucción
  7.  
  8.         for (int f = 1; f <= 4; f = f + 1) {
  9.             System.out.print("\nfor f = " + f);
  10.             inner: // No puede haber sentencias, después de esta instrucción
  11.             //          
  12.             for (; i <= 10; i = i + 1) {
  13.                 System.out.print("\nfor i = " + i);
  14.                 if (i == 2) {
  15.                     System.out.print(" =[continue next iteration]");
  16.                     continue; //
  17.                 }
  18.  
  19.                 if (i == 3) {
  20.                     System.out.print(" =[continue next iteration]");
  21.                     continue inner; // innecesaria etiqueta, se puede reemplazar solo por break
  22.                 }
  23.  
  24.                 if (i == 4) {
  25.                     System.out.print(" =[continue to outer, break loop i]");
  26.                     i = i + 1; // contador incrementado manualmente
  27.                     continue outer;
  28.                 }
  29.  
  30.                 if (i == 5) {
  31.                     System.out.print(" =[break loop i]");
  32.                     i = i + 1; // contador incrementado manualmente
  33.                     break;
  34.                 }
  35.  
  36.                 if (i == 8) {
  37.                     System.out.print(" =[break outer, break loop i]");
  38.                     i = i + 1; // contador incrementado manualmente
  39.                     break inner; // innecesaria etiqueta, se puede reemplazar solo por break
  40.                 }
  41.  
  42.                 if (i == 9) {
  43.                     System.out.print(" break outer, break all loops i, f");
  44.                     break outer;
  45.                 }
  46.  
  47.                 if (i == 10) {
  48.                     System.out.print(" nunca se ejecuta");
  49.                 }
  50.  
  51.                 System.out.print("\nfor k = ");
  52.                 for (; k < 4; k = k + 1) {
  53.  
  54.                     if ((k % 2) == 0) { // es par
  55.                         System.out.print("" + k + " =[continue to inner, break loop k]");
  56.                         k = k + 1; // contador incrementado manualmente
  57.                         continue inner;
  58.                     } else {
  59.                         System.out.print(k + ", ");
  60.                     }
  61.  
  62.                 }//next for k
  63.                 System.out.print("bucle i sin salto i=" + i);
  64.  
  65.             }//next for i
  66.  
  67.         }//next for f
  68.  
  69.         System.out.println("\nfin ");
  70.     }//main
  71. }

salida

Código: [Seleccionar]
for f = 1
for i = 1
for k = 0 =[continue to inner, break loop k]
for i = 2 =[continue next iteration]
for i = 3 =[continue next iteration]
for i = 4 =[continue to outer, break loop i]
for f = 2
for i = 5 =[break loop i]
for f = 3
for i = 6
for k = 1, 2 =[continue to inner, break loop k]
for i = 7
for k = 3, bucle i sin salto i=7
for i = 8 =[break outer, break loop i]
for f = 4
for i = 9 break outer, break all loops i, f
fin

El reto es codificar el código anterior sin BREAK, y CONTINUE, intentando ...
Próximamente ejemplos con  TRY CATH THROW FINALLY
« Última modificación: 17 de Febrero de 2016, 09:42:08 por CompSystems »
Desde Colombia


 

anything