[C con Clase] hacer loop con switch

Steven Davidson srd4121 en njit.edu
Sab Oct 18 09:30:48 CEST 2008


Hola Marco,

Marco Ibarra wrote:
> Soy nuevo en C++ y tambien en la lista de correo, estuve buscando la

Antes de continuar, te doy la bienvenida a la lista y a este mundo de C++.

> manera de regresar al principio de un switch sin la necesidad de goto
> (en caso de que exista tal manera), como ejemplo el siguiente codigo:

Veamos el código.

> 
> cout<<"El siguiente programa le permite realizar conversiones de grados Celsius"<<endl;
> cout<<"y grados Fahrenheit. Para comenzar:"<<endl<<endl;
> 
> 
>       start1:             
>       cout<<"Seleccione la escala que desea convertir: " <<endl;
>       cout<<"Celsius(1), Fahrenheit(2)." << endl<<endl;
> 
> //seleccion de escala y conversion
> 
>       int escala;
>       float celsius, fahrenheit;      
>       cin>> escala;      
>      
>      start:
>       
>      switch (escala){ 
>      case 1:
>            
>                      cout<<"Ingrese grados Celsius:"<<endl;
>                      cin>> celsius;
>                      fahrenheit=celsius*9/5+32;
>                      cout<<endl<<endl<<celsius<<" grados Celsius, equivalen a "
>                      <<fahrenheit<<" Grados Fahrenheit"<<endl<<endl;
>                      break;                 
>                      
>      case 2:  
>                      cout<<"Ingrese grados Fahrenheit:"<<endl;
>                      cin>> fahrenheit;                            
>                      celsius=fahrenheit-32*5/9;
>                      cout<<endl<<endl<<fahrenheit<<" grados Fahrenheit equivalen a "
>                      <<celsius<<" Grados Celsius"<<endl<<endl;
>                      break;
>                             
>      default:
>            
>             cout<<endl<<"Seleccion incorrecta, ingrese una opcion valida."
>             <<endl<<"Celsius(1), Fahrenheit(2)";
>             cout<<endl<<endl;
>             cin>>escala;
>             goto start;

Podrías usar 'continue' en lugar de 'goto', ya que volverás a ejecutar 
esta sentencia de 'switch/case'. De todas maneras, no sugiero hacer 
esto. En su lugar, usa bucles, como puede ser 'do/while'. Por ejemplo,

bool bRepetir = false;
do
{
   ...
   switch( escala )
   {
     case 1:
     ...
     break;

     case 1:
     ...
     break;

     default:
     ...
     bRepetir = true;
   }
} while( bRepetir );

Usando una variable booleana podemos controlar si debemos repetir estas 
sentencias o no.

>             }
>             
> //repetir o salir del programa
> 
>             char rep;
>             cout<<endl<<"Desea realizar otra operacion?"<<endl;
>             cout<<"Presione (r)para repetir, o cualquier tecla para salir."<<endl<<endl;
>             cin>>rep;
>             
>             if (rep == 'r')
>                          goto start1;                         
>                          

Aquí ocurre lo mismo. Si queremos repeticiones, entonces requerimos 
bucles. Nuevamente, podemos usar un bucle 'do/while' en este caso. El 
esquema sería el siguiente:

do
{
   cout<<"Seleccione la escala que desea convertir: " <<endl;
   cout<<"Celsius(1), Fahrenheit(2)." << endl<<endl;
   ...
   bool bRepetir = false;
   do
   {
     ...
     switch( escala )
     {
     ...
     }
   } while( bRepetir );
   ...
} while( 'r' == rep );

>             else {
>                  cout<<endl<<endl<<endl
>                  <<"****Gracias por utilizar este programa, Hasta luego!!****"<<endl;
>                  }
>             
>       
>       cin.get();
>       cin.get();
>       return 0;
> }
> 
> Al parecer el codigo ya compilado funciona tal como deveria, pero no 
> dejo de pensar en goto.
> 

Deberías dejar de pensar en 'goto'. Existen demasiados peligros y 
quebraderos de cabeza que no merece la pena usar este vocablo. Como ya 
he mencionado antes, si tu diseño necesita repetir, entonces automática 
e inmediatamente deberías pensar en usar bucles. C++ te ofrece tres 
diferentes tipos de bucles, por lo que tienes donde elegir.


Espero que esto te aclare el tema.

Steven





Más información sobre la lista de distribución Cconclase