Autor Tema: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes  (Leído 10715 veces)

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

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« en: 24 de Noviembre de 2013, 20:10:13 »
Hola, poco me gusta usar dentro de Sentencias de Iteracion (for/while) la instrucción BREAK, debido a que no es tan "natural", se puede usar una alternativa la cual es desbordar (superior/inferiormente) el limite de comparación para que en la siguiente iteracion se salga del bloque, en el siguiente código muestro un mismo ejemplo con el uso de BREAK tanto para for como para while y su alternativa como desborde

Otra sentencia que poco me gusta usarla es RETURN en partes intermedias del código, por que a simple vista se pensaría que retorna una salida pero el código de ahi para abajo se ejecutaría también, lo cual no es así, por eso uso mejor un identificador como salida y solo un RETURN antes de terminar el bloque ( } ) , también muestro un ejemplo con el uso de return intermedios y sin el.

También muestro el famoso GOTO como reemplazo de return dentro de un mismo bloque de estructura, aunque la verdadera utilidad de GOTO es saltar por fuera del mismo bloque, APROVECHO este post para realizar una encuesta, que tanto usan BREAK, RETURN que son una especie de GOTO, y en si la instrucción GOTO

Por ultimo no pude hacer un equivalente de CONTINUE con instrucciones normales, ahí les dejo el código para que por favor me colaboren en la parte del codigo que usa CONTINUE, pues no logro hacer un código equivalente

Gracias

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3. #define Done 1
  4. // version 0.0.2 By CompSystems
  5.  
  6. int funcion1( int );
  7. int funcion2( int );
  8. int funcion3( int );
  9.  
  10. int main( int argc, char** argv ){
  11.   int maxIter = 9;
  12.   int incr = 2;
  13.  
  14.   cout << "\n\n\n" << "-------- uso de RETURN como: ir al (goto) fin del bloque de funcion"<< "\n";
  15.   cout << funcion1(0) << ", ";
  16.   cout << funcion1(1) << ", ";
  17.   cout << funcion1(2) << ", ";
  18.   cout << funcion1(3) << ", ";
  19.   cout << funcion1(4) << ", ";
  20.  
  21.   cout << "\n\n" << "-------- ejemplo igual al anterior pero usando goto" << "\n";
  22.   cout << funcion2(0) << ", ";
  23.   cout << funcion2(1) << ", ";
  24.   cout << funcion2(2) << ", ";
  25.   cout << funcion2(3) << ", ";
  26.   cout << funcion2(4) << ", ";
  27.  
  28.   cout << "\n\n" << "-------- ejemplo igual al anterior pero sin usar return intermedios ni GOTO" << "\n";
  29.   cout << funcion3(0) << ", ";
  30.   cout << funcion3(1) << ", ";
  31.   cout << funcion3(2) << ", ";
  32.   cout << funcion3(3) << ", ";
  33.   cout << funcion3(4) << ", ";
  34.   cout << "\n\n";
  35.  
  36.  
  37.  
  38.   cout << "\n==== " << "Uso de BREAK en Sentencias de iteracion" << " ===";
  39.  
  40.   cout << "\n\n" << "-------- ciclo for normal de 0 a 9 en pasos de 2"<< "\n";
  41.   for( int i = 0; i <= maxIter; i = i + incr ) {
  42.     cout << i << ", ";
  43.   }//endFor0
  44.   // imprime 0, 2, 4, 6, 8,
  45.  
  46.   cout << "\n\n" << "-------- uso de break como: ir al (goto) fin del ciclo for siguiente";
  47.   cout << "\n" << "se finaliza las iteraciones para valores igual a 6 o superior" << "\n";
  48.  
  49.   for( int i = 0; i <= maxIter; i = i + incr ) {
  50.     if( i == 6 ) {
  51.       break; // == goTo endFor1 // se finaliza las iteraciones para valores igual a 6 o superior
  52.     }
  53.     else{
  54.       cout << i;
  55.     }
  56.     cout << ", ";
  57.   }//endFor1
  58.   // imprime 0, 2, 4,
  59.  
  60.   cout << "\n\n" << "-------- ejemplo igual al anterior pero sin usar BREAK, Ni Goto, Ni Return, Ni Continue";
  61.   cout << "\n\n" << "-------- uso de desborde de contador como: un (goto) fin del ciclo for";
  62.   cout << "\n" << "se finaliza las iteraciones para valores igual a 6 o superior" << "\n";
  63.   for( int i = 0; i <= maxIter; i = i + incr ) {
  64.     if( i == 6 ) {
  65.       i = maxIter+1; // === goTo endFor2 // se finaliza las iteraciones para valores igual a 6 o superior
  66.     }
  67.     else{
  68.       cout << i << ", "; // se debe recodificar para que no quede nada por fuera del bloque else
  69.     }
  70.   }//endFor2
  71.   // imprime 0, 2, 4,
  72.  
  73.   /////////////////////////////////////////////////
  74.  
  75.  
  76.   cout << "\n\n" << "-------- ejemplo igual al anterior pero ahora con while";
  77.   cout << "\n\n" << "-------- uso de break como: ir al (goto) fin del ciclo while";
  78.   cout << "\n" << "se finaliza las iteraciones para valores igual a 6 o superior" << "\n";
  79.   int i = 0;
  80.   while( i <= maxIter ) {
  81.     if( i == 6 ) {
  82.       break; // == goTo endWhile1 // se finaliza la iteracion para valores igual a 6 o superior
  83.     }
  84.     else{
  85.       cout << i;
  86.     }
  87.     cout << ", ";
  88.     i = i + incr;
  89.   } //endWhile1
  90.   // imprime 0, 2, 4,
  91.  
  92.   cout << "\n\n" << "-------- ejemplo igual al anterior pero sin usar BREAK, Ni Goto, Ni Return, Ni Continue";
  93.   cout << "\n\n" << "-------- uso de desborde de contador como: un (goto) fin del ciclo while";
  94.   cout << "\n" << "se finaliza las iteraciones para valores igual a 6 o superior" << "\n";
  95.   i = 0;
  96.   while( i <= maxIter ) {
  97.     if( i == 6 ) {
  98.       i = maxIter + 1; // == goTo endWhile2 // se finaliza la iteracion para valores igual a 6 o superior
  99.     }
  100.     else{
  101.       cout << i << ", "; // se debe recodificar esta parte
  102.     }
  103.     i = i + incr;
  104.   } //endWhile2
  105.   // imprime 0, 2, 4,
  106.  
  107.   /////////////////////////////////////////////////
  108.  
  109.   cout << "\n\n\n=== " << "Uso de CONTINUE en Sentencias de iteracion" << " ===";
  110.  
  111.   cout << "\n\n" << "-------- ciclo for normal de 0 a 9 en pasos de 1" << "\n";
  112.   incr=1;
  113.   for( int i = 0; i <= maxIter; i = i + incr ) {
  114.     cout << i << ", ";
  115.   }//endFor0
  116.   // imprime 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  117.  
  118.  cout << "\n\n" << "-------- uso de continue como: saltar (skip) iteracion actual del ciclo for";
  119.  cout << "\n" << "se salta la iteracion solo cuando el contador es igual a 2" << "\n";
  120.  for( int i = 0; i <= maxIter; i = i + incr ) {
  121.    if( i == 2 ) {
  122.      continue; // == skip iteracion actual, goto especial a endFor1
  123.    }
  124.    else{
  125.      cout << i;
  126.    }
  127.    cout << ", ";
  128.  }//endFor1
  129.  // imprime 0, 1, 3, 4, 5, 6, 7, 8, 9, // note que 2 no aparece, OK
  130.  
  131.   cout << "\n\n" << "ejemplo igual al anterior pero sin usar BREAK, Ni Goto, Ni Return, Ni Continue"<< "\n";
  132.   for( int i = 0; i <= maxIter; i = i + incr ) {
  133.     if( i == 2 ) {
  134.       i = i+incr; // => RETO: Tratando de hacer lo mismo que en código anterior pero sin CONTINUE, es posible??
  135.     }
  136.     else{
  137.      cout << i << ", ";
  138.    }
  139.   }//endFor2
  140.   // imprime 0, 1, 4, 5, 6, 7, 8, 9, // note que 2 y 3 no aparecen, solo debe faltar el 2
  141.  
  142.  
  143.   return Done; // Goto endFunction1
  144. }//endMain
  145.  
  146.   /////////////////////////////////////////////////
  147.  
  148. int funcion1( int test ){
  149.   if( test == 0 ){
  150.     return 10; // Goto endFunction1
  151.   }
  152.   else{
  153.     if( test == 1 ){
  154.       return 20; // Goto endFunction1
  155.     }
  156.     else{
  157.       if( test == 2 ){
  158.         return 30; // Goto endFunction1
  159.       }
  160.     }
  161.   }
  162.   return 40; // Goto endFunction1
  163. }//endFunction1
  164.  
  165.   /////////////////////////////////////////////////
  166.  
  167. int funcion2( int test ){
  168.   if( test == 0 ){
  169.     goto option1;
  170.   }
  171.   else{
  172.     if( test == 1 ){
  173.       goto option2;
  174.     }
  175.     else{
  176.       if( test == 2 ){
  177.         goto option3;
  178.       }
  179.       else goto option4;
  180.     }
  181.   }
  182.   option1: return 10; // then goto endFunction2
  183.   option2: return 20; // then goto endFunction2
  184.   option3: return 30; // then goto endFunction2
  185.   option4: return 40; // then goto endFunction2
  186.  
  187. }//endFunction2
  188.  
  189.   /////////////////////////////////////////////////
  190.  
  191. int funcion3( int test ){
  192.   int outSelect;
  193.   if( test == 0 ){
  194.     outSelect = 10;
  195.   }
  196.   else{
  197.     if( test == 1 ){
  198.       outSelect = 20;
  199.     }
  200.     else{
  201.       if( test == 2 ){
  202.         outSelect = 30;
  203.       }
  204.       else outSelect = 40;
  205.     }
  206.   }
  207.     return outSelect; // goto endFunction3
  208. }//endFunction3
« Última modificación: 24 de Noviembre de 2013, 23:28:06 por CompSystems »
Desde Colombia

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: GOTO, CONTINUE. BREAK, RETURN: Sentecias equivalentes
« Respuesta #1 en: 24 de Noviembre de 2013, 20:40:56 »
Hola.

El que más mal visto y penalizado suele estar es el GOTO. Del resto nunca vi grandes penalizaciones. Al menos a nivel educativo. En la universidad la única prohibición que teníamos era no usar el GOTO. Claro que también depende del lenguaje de programación en cuestión. Por ejemplo, en Lenguajes Orientados a Objetos, se suele decir, por ejemplo, que apariciones de SWITCH equivalen a no estar programando correctamente con objetos. En cambio, si programases en assembler, el uso del GOTO, RETURN, etc en cualquier lugar y masivamentes es completamente natural y necesario.

No he visto en detalle el código, pero el CONTINUE no es más que un "GOTO final del bucle de iteración actual". Por ende deberia poder ser reemplazado, al menos por un GOTO.

Creo que queda a criterio de cada uno el uso y abuso de dichos operadores. A veces es peor la solución propuesta y la complejidad resultante por intentar evitar estos operadores. La programación siempre me ha parecido una especie de arte. Te pueden enseñar el lenguaje y te pueden enseñar las buenas constumbres y convenciones a la hora de programar, pero hay infinitos algoritmos distintos para resolver un mísmo problema, por lo que al final de cuentas, termina jugando un rol muy importante la experiencia y gustos personales del programador. Incluso aún siendo algo estructurado y bastante restringido, muchas veces uno puede ver plasmadas en el código huellas muy particulares de la persona que lo ha escrito.

Saludos.  
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #2 en: 24 de Noviembre de 2013, 22:13:17 »
>> No he visto en detalle el código, pero el CONTINUE no es más que un "GOTO final del bucle de iteración actual".
Si y continua con la siguiente iteracion y trate de hacerlo sin CONTINUE incrementando el contador con el valor del paso pero no arroja la salida deseada

Codigo con CONTINUE
Código: C++
  1. int maxIter = 9;
  2.   int incr = 2;
  3. cout << "\n\n" << "-------- uso de continue como: saltar (skip) iteracion actual del ciclo for";
  4.  cout << "\n" << "se salta la iteracion solo cuando el contador es igual a 2" << "\n";
  5.  for( int i = 0; i <= maxIter; i = i + incr ) {
  6.    if( i == 2 ) {
  7.      continue; // == skip iteracion actual, goto especial a endFor1
  8.    }
  9.    else{
  10.      cout << i;
  11.    }
  12.    cout << ", ";
  13.  }//endFor1
  14.  // imprime 0, 1, 3, 4, 5, 6, 7, 8, 9, // note que 2 no aparece, OK

Tratando de hacer lo mismo que en código anterior pero sin CONTINUE, es posible??
Código: C++
  1. cout << "\n\n" << "ejemplo igual al anterior pero sin usar BREAK, Ni Goto, Ni Return, Ni Continue"<< "\n";
  2.   for( int i = 0; i <= maxIter; i = i + incr ) {
  3.     if( i == 2 ) {
  4.       i = i+incr; // => RETO: Tratando de hacer lo mismo que en código anterior pero sin CONTINUE, es posible??
  5.     }
  6.     else{
  7.      cout << i; << ", ";
  8.    }
  9.   }//endFor2
  10.   // imprime 0, 1, 4, 5, 6, 7, 8, 9, // note que 2 y 3 no aparecen, solo debe faltar el 2

« Última modificación: 24 de Noviembre de 2013, 23:28:33 por CompSystems »
Desde Colombia

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentecias Equivalentes
« Respuesta #3 en: 24 de Noviembre de 2013, 22:27:12 »
Hola,

el equivalente usando GOTO sería:

Código: C
  1. cout << "\n\n" << "-------- uso de ... iteracion del ciclo for" << "\n";
  2.  for( int i = 0; i <= maxIter; i = i + incr ) {
  3.    if( i == 2 ) {
  4.      goto SKIP_ITERATION;
  5.    }
  6.    else{
  7.      cout << i << ", ";
  8.    }
  9. SKIP_ITERATION:
  10.  }//endFor2

Sólo por ser un bucle sencillo, y sólo por ello, podrías reemplazarlo por:

Código: C
  1. cout << "\n\n" << "-------- uso de ... iteracion del ciclo for" << "\n";
  2.  for( int i = 0; i <= maxIter; i = i + incr ) {
  3.    if( i == 2 ) {
  4.    }
  5.    else{
  6.      cout << i << ", ";
  7.    }
  8.  }//endFor2

Sólo funciona para este caso específico. Siempre se puede intentar sortear un operador, pero a veces resulta muy dificil o se requiere mucho código adicional para lograrlo.
« Última modificación: 24 de Noviembre de 2013, 22:30:23 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #4 en: 24 de Noviembre de 2013, 22:36:02 »
Gracias BrunoF, pero yo lo deseo sin GOTO, NI BREAK, NI RETURN, entonces aun es posible?

BrunoF dice:  Siempre se puede intentar sortear un operador, pero a veces resulta muy difícil o se requiere mucho código adicional para lograrlo.

Rta: Quieres decir que aveces para simplificar código y hacerlo mas eficiente es muy necesario el uso de GOTO, o BREAK, o RETURN en lugar de códigos complicados que realicen lo mismo, esto te lo pregunto por que me dijeron que el GOTO no servia para nada en lenguajes estructurados y que no se explican por que esta disponible en el lenguaje C/C++
« Última modificación: 24 de Noviembre de 2013, 23:28:20 por CompSystems »
Desde Colombia

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #5 en: 25 de Noviembre de 2013, 00:30:33 »
Gracias BrunoF, pero yo lo deseo sin GOTO, NI BREAK, NI RETURN, entonces aun es posible?

Pues el 2do ejemplo que te di, no utiliza ni GOTO, ni BREAK ni RETURN.

BrunoF dice:  Siempre se puede intentar sortear un operador, pero a veces resulta muy difícil o se requiere mucho código adicional para lograrlo.

Rta: Quieres decir que aveces para simplificar código y hacerlo mas eficiente es muy necesario el uso de GOTO, o BREAK, o RETURN en lugar de códigos complicados que realicen lo mismo, esto te lo pregunto por que me dijeron que el GOTO no servia para nada en lenguajes estructurados y que no se explican por que esta disponible en el lenguaje C/C++

A veces sí. Pero intervienen tantos factores que es dificil establecer una regla. Hay compiladores que optimizan muy bien las líneas de código y la transportan a op-codes muy específicos del procesador en cuestión. Otros compiladores puede que no tengan tanta "inteligencia" y generen código en exceso por carecer de tales optimizaciones.

No suelo utilizar en absoluto GOTO en C/C++, excepto alguna rara vez donde realmente signifique una optimización enorme en ahorro de líneas de ejecución o de tamaño de código generado. Por lo general, cuando el código fuente escrito es de buena calidad, no aparece la necesidad de utilizar el GOTO. El BREAK y RETURN son muy útiles y no me parece que sea tan mala práctica utilizarlos. El problema principal del GOTO es que hace el código muy dificil de seguir, tanto a la hora de leer el código fuente como al momento de debugguearlo e intentar corregir bugs en el mísmo.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #6 en: 25 de Noviembre de 2013, 13:02:19 »
Gracias BrunoF, pero yo lo deseo sin GOTO, NI BREAK, NI RETURN, entonces aun es posible?

Pues el 2do ejemplo que te di, no utiliza ni GOTO, ni BREAK ni RETURN.

Como tu dijiste para ese caso especifico si, donde se pudo agrupar las sentencias (SINO) dentro del bloque de else{}, pienso que si no se pudiera agruparlas en un else, seria imposible realizar un equivalente a CONTINUE e incluso a BREAK, demostrando que si se usa BREAK o CONTINUE en un código se esta utilizando IMPLÍCITAMENTE un GOTO, que contradice el teorema de la programación estructurada que dice que es posible NO usar un goto con bloques estructurados, están de acuerdo o no, claro esta desde el punto de vista del código de usuario, por que los códigos que generan los compiladores están llenos de GOTO y si se llevo a código ensamblador mucho mas, pero ese no es el punto que discuto, sino como dije antes solo dentro del código de usuario


PD: el reto continua ... reemplazar CONTINUE y BREAK en los dos siguientes códigos

Código: C++
  1. int maxIter = 9;
  2. int incr = 2;
  3. cout << "\n\n" << "-------- uso de continue como: saltar (skip) iteracion actual del ciclo for";
  4.  cout << "\n" << "se salta la iteracion solo cuando el contador es igual a 2" << "\n";
  5.  for( int i = 0; i <= maxIter; i = i + incr ) {
  6.    if( i == 2 ) {
  7.      continue; // == skip iteracion actual, goto especial a endFor1
  8.    }
  9.    else{
  10.      cout << i;
  11.    }
  12.    cout << ", ";
  13.    // mas sentencias de aquí para abajo no se pueden agrupar dentro del bloque (if else)
  14.  }//endFor1
  15.  // imprime 0, 1, 3, 4, 5, 6, 7, 8, 9, // note que 2 no aparece, OK


Código: C++
  1. int maxIter = 9;
  2.   int incr = 2;
  3.   cout << "\n\n" << "-------- uso de break como: ir al (goto) fin del ciclo for siguiente";
  4.   cout << "\n" << "se finaliza las iteraciones para valores igual a 6 o superior" << "\n";
  5.  
  6.   for( int i = 0; i <= maxIter; i = i + incr ) {
  7.     if( i == 6 ) {
  8.       break; // == goTo endFor1 // se finaliza las iteraciones para valores igual a 6 o superior
  9.     }
  10.     else{
  11.       cout << i;
  12.     }
  13.     cout << ", ";
  14.    // mas sentencias de aquí para abajo no se pueden agrupar dentro del bloque (if else)
  15.   }//endFor1
  16.   // imprime 0, 2, 4,

PD2: hay codigos en C/C++ que he visto que usan GOTO para saltar entre diferentes FORes, que según los autores es imposible con programación estructurada, lo malo es que no conservo dichos códigos, alguien de vosotros le ha sucedido lo mismo y si es así por favor los podría colocar acá

Gracias
« Última modificación: 25 de Noviembre de 2013, 14:58:12 por CompSystems »
Desde Colombia

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #7 en: 25 de Noviembre de 2013, 14:45:40 »
Código: C++
  1. int maxIter = 9;
  2. int incr = 2;
  3. cout << "\n\n" << "-------- uso de continue como: saltar (skip) iteracion actual del ciclo for";
  4.  cout << "\n" << "se salta la iteracion solo cuando el contador es igual a 2" << "\n";
  5.  for( int i = 0; i <= maxIter; i = i + incr ) {
  6.    //if( i == 2 ) {
  7.    //  continue; // == skip iteracion actual, goto especial a endFor1
  8.    //}
  9.    //else{
  10.    if( i != 2 ) {
  11.      cout << i;
  12.    //}
  13.    cout << ", ";
  14.    // mas sentencias de aquí para abajo
  15.    // ...
  16.    }
  17.  }//endFor1
  18.  // imprime 0, 1, 3, 4, 5, 6, 7, 8, 9, // note que 2 no aparece, OK
  19.  // En realidad imprime 0, 4, 6, 8


Código: C++
  1. int maxIter = 9;
  2.   int incr = 2;
  3.   cout << "\n\n" << "-------- uso de break como: ir al (goto) fin del ciclo for siguiente";
  4.   cout << "\n" << "se finaliza las iteraciones para valores igual a 6 o superior" << "\n";
  5.  
  6.   for( int i = 0; i <= maxIter; i = i + incr ) {
  7.     if( i == 6 ) {
  8.       //break; // == goTo endFor1 // se finaliza las iteraciones para valores igual a 6 o superior
  9.       i = maxIter + 1;
  10.     }
  11.     else{
  12.       cout << i;
  13.     //}
  14.     cout << ", ";
  15.    // mas sentencias de aquí para abajo
  16.    // ...
  17.    }
  18.   }//endFor1
  19.   // imprime 0, 2, 4,
« Última modificación: 25 de Noviembre de 2013, 14:47:52 por diguito_69 »
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #8 en: 25 de Noviembre de 2013, 14:54:56 »
la solucion es similar a la de BrunoF, pero la condición es que la sentencia que esta comentada // mas sentencias de aquí para abajo ...
son independientes, no se pueden agrupar dentro del bloque (if else)
Desde Colombia

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #9 en: 25 de Noviembre de 2013, 14:59:22 »
Bueno,

dos cosas a ser vistas. Aprovecho a la publicación de diguito_69 para poder usarlo de ejemplo.

Primero, diguito_69:

Claro que modificando código fuera del bucle del CONTINUE o BREAK es posible lograrlo. El desafío de CompSystems creo que era precisamente no alterar código fuera del bucle donde estuviesen el CONTINUE o BREAK. Y precisamente ahí es donde me parece que está equivocado CompSystems. Cuando se habla de que es posible reemplazar a un CONTINUE, BREAK, etc y prescindir completamente de ellos, no necesariamente tiene que ser reemplazar exáctamente y sólo el operador por otra cosa y listo. Creo que se refiere a que siempre se pueden diseñar y plantear los algoritmos de manera tal que no haga falta recurrir a un CONTINUE, BREAK, etc. Es decir que el problema está en que estás pidiendo reemplazar un CONTINUE y un BREAK, cuando el diseño propuesto ya está mal diseñado y no permitiría eliminarlos sin tener que recurrir a modificar otra parte del código, como diguito_69 ha puesto en sus ejemplos.

Espero esto ayude a aclarar dudas.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #10 en: 25 de Noviembre de 2013, 15:19:25 »
Si se puede modificar el código en un algoritmo verdadero para evitar BREAK, CONTINUE, voy a plantear algoritmo mas complejo ... o si alguien conoce de alguno donde se requiere inevitablemente el uso de BREAK, CONTINUE, GOTO bienvenido sea para discutirlo aca
Desde Colombia

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #11 en: 25 de Noviembre de 2013, 19:33:00 »
La sentencia goto no es el demonio.
Si existe en c es por algo.

Cuándo utilizar goto en C y C++:
   http://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-c

Programación estructurada usando goto (del experto en programación Donald Knuth):
   http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf


Más en este hilo:
http://www.todopic.com.ar/foros/index.php?topic=38049.msg316785#msg316785

Saludos.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: RETO: GOTO, CONTINUE. BREAK, RETURN con Sentencias Equivalentes
« Respuesta #12 en: 26 de Noviembre de 2013, 13:56:32 »
Buenos links  :wink:

Aunque el pdf escaneado se encuentra en http://sbel.wisc.edu/Courses/ME964/Literature/knuthProgramming1974.pdf
« Última modificación: 27 de Noviembre de 2013, 22:22:06 por CompSystems »
Desde Colombia


 

anything