Esta es el arreglo más correcta que te podemos aportar, pero primero estúdiala detenidamente y analiza si es compatible a tu proyecto.
Solución:
Por defecto, cin
lee de la entrada descartando cualquier espacio. Entonces, todo lo que tienes que hacer es usar un do while
bucle para leer la entrada más de una vez:
do
cout<<"Enter a number, or numbers separated by a space, between 1 and 1000."<> num;
// reset your variables
// your function stuff (calculations)
while (true); // or some condition
Recomendaría leer en la línea en un string, luego dividirlo en función de los espacios. Para esto, puede usar la función getline(…). El truco es tener una estructura de datos de tamaño dinámico para contener las cadenas una vez que se divide. Probablemente el más fácil de usar sería un vector.
#include
#include
...
string rawInput;
vector numbers;
while( getline( cin, rawInput, ' ' ) )
numbers.push_back(rawInput);
Así que digamos que la entrada se ve así:
Enter a number, or numbers separated by a space, between 1 and 1000.
10 5 20 1 200 7
Ahora tendrás un vector, números, que contiene los elementos: “10”,”5″,”20″,”1″,”200″,”7″.
Tenga en cuenta que siguen siendo cadenas, por lo que no son útiles en aritmética. Para convertirlos a enteros, usamos una combinación de la función STL, atoi(…), y debido a que atoi requiere un c-string en lugar de un estilo c++ stringusamos el string Función miembro c_str() de la clase.
while(!numbers.empty())
string temp = numbers.pop_back();//removes the last element from the string
num = atoi( temp.c_str() ); //re-used your 'num' variable from your code
...//do stuff
Ahora hay algunos problemas con este código. Sí, funciona, pero es un poco torpe y pone los números en orden inverso. Reescribámoslo para que sea un poco más compacto:
#include
...
string rawInput;
cout << "Enter a number, or numbers separated by a space, between 1 and 1000." << endl;
while( getline( cin, rawInput, ' ') )
num = atoi( rawInput.c_str() );
...//do your stuff
Todavía hay mucho margen de mejora con el manejo de errores (en este momento, si ingresa un número que no es el programa se bloqueará), y hay infinitas más formas de manejar la entrada para obtener una forma de número utilizable (¡las alegrías de la programación! ), pero eso debería darle un comienzo completo. 🙂
Nota: Tenía las páginas de referencia como enlaces, pero no puedo publicar más de dos ya que tengo menos de 15 publicaciones :/
Editar: estaba un poco equivocado sobre el comportamiento de atoi; Lo confundí con Java string->Conversiones de enteros que lanzan una excepción Not-A-Number cuando se les da un string eso no es un número, y luego bloquea el programa si no se maneja la excepción. atoi(), por otro lado, devuelve 0, lo que no es tan útil porque ¿qué pasa si 0 es el número que ingresaron? Hagamos uso de la función isdigit(...). Una cosa importante a tener en cuenta aquí es que se puede acceder a las cadenas de estilo c ++ como un arrayque significa entrada sin procesar[0] es el primer personaje de la string todo el camino hasta rawInput[length - 1].
#include
#include
...
string rawInput;
cout << "Enter a number, or numbers separated by a space, between 1 and 1000." << endl;
while( getline( cin, rawInput, ' ') )
bool isNum = true;
for(int i = 0; i < rawInput.length() && isNum; ++i)
isNum = isdigit( rawInput[i]);
if(isNum)
num = atoi( rawInput.c_str() );
...//do your stuff
else
cout << rawInput << " is not a number!" << endl;
El booleano (true/false o 1/0 respectivamente) se utiliza como bandera para el bucle for, que pasa por cada carácter en el string y verifica si es un dígito 0-9. Si algún personaje en el string no es un dígito, el bucle se interrumpirá durante su próxima ejecución cuando llegue a la condición "&& isNum" (suponiendo que ya haya cubierto los bucles). Luego, después del ciclo, isNum se usa para determinar si hacer sus cosas o imprimir el mensaje de error.
Querrás:
- Leer en una línea completa desde la consola
- Tokeniza la línea, dividiéndola por espacios.
- Coloque esas piezas partidas en un array o lista
- Pasa por eso array/list, realizando sus pruebas principales/perfectas/etc.
¿Qué ha cubierto su clase en este sentido hasta ahora?
Reseñas y valoraciones
Te invitamos a sustentar nuestra ocupación ejecutando un comentario y valorándolo te damos las gracias.