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
#include <iostream> using namespace std; int lector_de_enteros(); int lector_de_opciones( int ); int main () { int numero; int maximo = 4; numero = lector_de_opciones( maximo ); cout << endl << " Numero fue: " << numero << endl; return 0; } 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(); 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: "; valor_elegido = lector_de_enteros(); // <-- correccion } } return valor_elegido; // <-- mover a este lugar }
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