Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: program_10 en 11 Enero 2015, 00:12 am



Título: Duda bucle do while
Publicado por: program_10 en 11 Enero 2015, 00:12 am
Hola chicos, os voy a comentar una dudilla que tengo acerca de una práctica que nos han propuesto en clase. El enunciado es el siguiente:

Una función llamada “lector_de_enteros” que pida al usuario un número entero
y devuelva el número leído.
Una función llamada “lector_de_opciones” que reciba un valor máximo, pida
al usuario un valor entre 1 y el valor máximo (usando la función
“lector_de_enteros”) y devuelva el valor elegido. Si el usuario introduce un
valor fuera de rango avisar del error y repetir la lectura del valor, y así hasta que
sea correcto.


Las funciones que he hecho son las siguientes:
Código
  1. int lector_de_enteros()
  2. {
  3. int numero = 0;
  4. cin >> numero;
  5. return numero;
  6. }
  7. int lector_de_opciones(int valor_maximo)
  8. {
  9. int valor_elegido=0;
  10. cout << " Introduce un numero entre 1 y " << valor_maximo;
  11. valor_elegido = lector_de_enteros();
  12.  
  13. do
  14. {
  15. cout << "Vuelve a introducir un numero que este dentro del rango, por favor:\n";
  16. cin >> valor_elegido;
  17. }while (valor_elegido <=1 && valor_elegido >= valor_maximo);
  18.  
  19.  
  20. return valor_elegido;
  21.  
  22. }

El enunciado sigue con lo siguiente para el int main ()  [LA FUNCIÓN PRINCIAPAL]
Mostrar el menú principal y dejar al usuario elegir una opción.

Pues bien, mi propuesta es ésta pero no sé porque no funciona, porque ponga el número que ponga el programa sigue.

Código
  1. int maximo = 4;
  2. muestra_menu_principal();
  3. cout << endl;
  4.  
  5. lector_de_opciones (maximo);
  6.  

Mod: Modificado. Cuando publiques codigo, procura usar etiquetas GeSHi


Título: Re: Duda bucle do while
Publicado por: engel lex en 11 Enero 2015, 00:28 am
no termino de entender el problema

pero hago un par de correciones

1.
el do-while se diferencia del while porque evalua al final... es decir

Código
  1. int numero = 21;
  2. while(numero<10){
  3.   cout<<"numero menor que 10" << endl;
  4. }
  5. do{
  6.   cout <<"cualquier numero"<<endl;
  7. }while(numero<10)

en el primer caso el while se evalua y se salta... en el segundo caso, el do se ejecuta, pero al llegar al final no se repite porque no pasa la evaluación

así que tu codigo siempre va a pasar el error de
Citar
Vuelve a introducir un numero que este dentro del rango, por favor
aunque sea valido

2.
te dicen que uses la funcion "lector de enteros", pero dentro del do-while en la linea 16 no lo usas... debería ser igual que en la linea 11...


Título: Re: Duda bucle do while
Publicado por: Yoel Alejandro en 11 Enero 2015, 01:46 am
Con las correcciones propuestas por engelx, creo que quedaría así

Código
  1. int lector_de_opciones(int valor_maximo)
  2. {
  3.    int valor_elegido=0;
  4.    cout << " Introduce un numero entre 1 y " << valor_maximo;
  5.    valor_elegido = lector_de_enteros();
  6.  
  7.    while ( valor_elegido <=1 && valor_elegido >= valor_maximo ) {
  8.    {
  9.        cout << "Vuelve a introducir un numero que este dentro del rango, por favor:\n";
  10.        valor_elegido = lector_de_enteros();     // <-- correccion
  11.    }
  12.  
  13.    return valor_elegido;
  14. }


Título: Re: Duda bucle do while
Publicado por: program_10 en 11 Enero 2015, 14:12 pm
Gracias por vuestra ayuda
He probado el código con las correciones y me sale por pantalla lo siguiente:
 
1- Saludar
2- Despedir
3- Conversar
4- Terminar

 Introduce un numero entre 1 y 4Vuelve a introducir un numero que este dentro del rango, por favor:
  :huh:


Título: Re: Duda bucle do while
Publicado por: engel lex en 11 Enero 2015, 14:23 pm
usa el debugger de tu compilador a ver donde estás haciendo algo erroneo


Título: Re: Duda bucle do while
Publicado por: Yoel Alejandro en 11 Enero 2015, 16:26 pm
Jejeje, claro ahora lo veo y creo que la razón era muy tonta. En la condición del while, debe ser "menor que 1" en lugar de "menor o igual que 1", a fin que el ciclo se active sólo cuando el número está fuera de rango.

Quedaría de este modo (pruébalo y me dices)

Código
  1.    int lector_de_opciones(int valor_maximo)
  2.    {
  3.       int valor_elegido=0;
  4.       cout << " Introduce un numero entre 1 y " << valor_maximo;
  5.       valor_elegido = lector_de_enteros();
  6.  
  7.       while ( valor_elegido < 1 && valor_elegido > valor_maximo ) {   // <-- correci'on aqu'i
  8.       {
  9.           cout << endl << "Vuelve a introducir un numero que este dentro del rango, por favor:" << endl;
  10.           valor_elegido = lector_de_enteros();     // <-- correccion
  11.       }
  12.  
  13.       return valor_elegido;
  14.    }

.... Y por cierto, introduje un endl antes de la frase "Vuelve a introducir un numero que este dentro del rango, por favor:", para producir el salto de línea respectivo antes de la misma y se vea más estético


Título: Re: Duda bucle do while
Publicado por: rir3760 en 11 Enero 2015, 16:34 pm
También se debe cambiar el operador && por ||.

Un saludo


Título: Re: Duda bucle do while
Publicado por: program_10 en 11 Enero 2015, 16:40 pm
Pero.........de esa forma no dejaría introucir ni el 1 ni el 4, no?
Asi que estaría mal


Título: Re: Duda bucle do while
Publicado por: Yoel Alejandro en 11 Enero 2015, 16:46 pm
Ups, .... gracias rir3760, faltaba eso.

Claro que sí permitiría el 1 y el 4, pues la condición sólo fallaría para un número menor a 1 o mayor a 4, es decir un número como 0, o como 5.

Pruébalo y verás que funciona, reemplazando antes el "&&" por "||"


Título: Re: Duda bucle do while
Publicado por: program_10 en 11 Enero 2015, 16:56 pm
He probado con vuestras correcciones y ahora, pongo 2 y me lo da como error.......... :rolleyes:

Os prestáis alguno como salvadores dándome vuestro correo para pasaros la práctica y el código que llevo?

GRACIAS.


Título: Re: Duda bucle do while
Publicado por: Yoel Alejandro en 11 Enero 2015, 17:11 pm
Acabo de revisar, el error está en la ubicación del return, que lo haces dentro del while. Si el while no se ejecuta, entonces la instrucción return tampoco, por lo que función devuelve un valor por defecto 0.

La solución está en colocar el return fuera del while

Con la correción, aquí el programa que compuse para la prueba:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int lector_de_enteros();
  6. int lector_de_opciones( int );
  7.  
  8. int main () {
  9.  
  10. int numero;
  11. int maximo = 4;
  12.  
  13. numero = lector_de_opciones( maximo );
  14. cout << endl << " Numero fue: " << numero << endl;
  15.  
  16. return 0;
  17. }
  18.  
  19. int lector_de_enteros()
  20. {
  21. int numero = 0;
  22. cin >> numero;
  23. return numero;
  24. }
  25.  
  26. int lector_de_opciones(int valor_maximo)
  27. {
  28. int valor_elegido = 0;
  29.  
  30. cout << " Introduce un numero entre 1 y " << valor_maximo << ": ";
  31. valor_elegido = lector_de_enteros();
  32.  
  33. while ( valor_elegido < 1 || valor_elegido > valor_maximo ) {   // <-- correci'on aqu'i
  34. {
  35. cout << endl << "Vuelve a introducir un numero que este dentro del rango, por favor: ";
  36. valor_elegido = lector_de_enteros();     // <-- correccion
  37. }
  38. }
  39.  
  40. return valor_elegido;       // <-- mover a este lugar
  41. }

y parece funcionar bien (pruébalo tú y me dices:)

Código:
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 2

 Numero fue: 2
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 1

 Numero fue: 1
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 4

 Numero fue: 4
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 0

Vuelve a introducir un numero que este dentro del rango, por favor: 2

 Numero fue: 2