Duda bucle do while

Iniciado por program_10, 11 Enero 2015, 00:12 AM

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

program_10

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 (cpp) [Seleccionar]
int lector_de_enteros()
{
int numero = 0;
cin >> numero;
return numero;
}
int lector_de_opciones(int valor_maximo)
{
int valor_elegido=0;
cout << " Introduce un numero entre 1 y " << valor_maximo;
valor_elegido = lector_de_enteros();

do
{
cout << "Vuelve a introducir un numero que este dentro del rango, por favor:\n";
cin >> valor_elegido;
}while (valor_elegido <=1 && valor_elegido >= valor_maximo);


return valor_elegido;

}


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 (cpp) [Seleccionar]
int maximo = 4;
muestra_menu_principal();
cout << endl;

lector_de_opciones (maximo);


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

engel lex

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 (cpp) [Seleccionar]
int numero = 21;
while(numero<10){
   cout<<"numero menor que 10" << endl;
}
do{
   cout <<"cualquier numero"<<endl;
}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
CitarVuelve 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...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Yoel Alejandro

Con las correcciones propuestas por engelx, creo que quedaría así

Código (cpp) [Seleccionar]

int lector_de_opciones(int valor_maximo)
{
    int valor_elegido=0;
    cout << " Introduce un numero entre 1 y " << valor_maximo;
    valor_elegido = lector_de_enteros();
     
    while ( valor_elegido <=1 && valor_elegido >= valor_maximo ) {
    {
        cout << "Vuelve a introducir un numero que este dentro del rango, por favor:\n";
        valor_elegido = lector_de_enteros();     // <-- correccion
    }
     
    return valor_elegido;
}
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

program_10

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:

engel lex

usa el debugger de tu compilador a ver donde estás haciendo algo erroneo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Yoel Alejandro

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 (cpp) [Seleccionar]

    int lector_de_opciones(int valor_maximo)
    {
       int valor_elegido=0;
       cout << " Introduce un numero entre 1 y " << valor_maximo;
       valor_elegido = lector_de_enteros();
     
       while ( valor_elegido < 1 && valor_elegido > valor_maximo ) {   // <-- correci'on aqu'i
       {
           cout << endl << "Vuelve a introducir un numero que este dentro del rango, por favor:" << endl;
           valor_elegido = lector_de_enteros();     // <-- correccion
       }
     
       return valor_elegido;
    }


.... 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
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

rir3760

También se debe cambiar el operador && por ||.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

program_10

Pero.........de esa forma no dejaría introucir ni el 1 ni el 4, no?
Asi que estaría mal

Yoel Alejandro

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 "||"
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

program_10

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.