我已经在网上阅读了多篇关于避免空白输入的帖子,但仍然无法使其工作,我已经为我的作业创建了一个c ++代码,当用户输入字母或数字时它有验证数据小于或等于0但如果用户刚刚点击“输入”#39;它将继续下降而不显示任何消息。我尝试过使用!isdigit,!isnumber,value.empty但是当用户只按“输入”时,我无法使if条件生效。没有输入任何东西。
// Pre Exmen Parte 1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include "stdlib.h"
#include "string"
//esto es para poder usar las ñy acentos
#include "locale.h"
//esto es para mostrar totales con 2 decimales
#include "iomanip"
using namespace std;
int main()
{
//esto es para poder usar las ñy acentos
setlocale(LC_ALL, "spanish");
/*Una persona debe realizar un muestreo con 10 personas para determinar el promedio de peso de los niños, jóvenes, adultos y ancianos
que existen en su zona habitacional. Para ello, conforme encuentra a las personas introduce los datos a su computadora, la cual mediante
un programa las clasifica y despliega los 4 promedios que la persona requiere. Se determinan categorías con base en la siguiente tabla:
CATEGORIA EDAD
Niños 0–12
Jóvenes 13-29
Adultos 30–59
Ancianos 60 en adelante
*/
//Paso 1 , crear variables necesarias para la ejecucion del programa. Las separaremos en bloques para mejor comprension
double
//Variables para niños
sum_peso_nin = 0, total_nin=0, porc_nin=0,
//Variables para jovenes
sum_peso_jov=0, total_jov=0, porc_jov=0,
//Variables para adultos
sum_peso_adul=0, total_adul=0, porc_Adul =0,
//Variables para ancianos
sum_peso_anc=0, total_anc=0, porc_anc=0,
//Variable de Peso general
Peso = 0;
int
//Variable para la edad , debe ser entera
Edad = 0,
//Variable i para el ciclo for
i = 1,
//Variable para que el usuario escoj el tamaño total de la muestra , ejemplo 10
total_muestreo = 0;
string
//variable para ciclo While, debe incializarse con el valor encesario al menos una ve para que entre en el ciclo "While"
Resp = "Si";
//Ciclo While
while (Resp == "Si" || Resp == "si")
{
//El usuario debe especificar que tan grande sera la muestra
cout << "Ingrese el tamaño de la muestra , ejemplo 10: ";
cin >> total_muestreo;
system("cls");
//tenemos que validar que el usuario no ingrese caracteres o especiales , letras o numeros menores o iguales a 0
std::string input;
while (!cin || total_muestreo <= 0)
{
cout << "El valor ingresado no es entero! Intente de nuevo e ingrese el tamaño de la muestra nuevamente: ";
cin.clear();
cin.ignore();
cin >> total_muestreo;
}
//Ya que el programa indica que por ley seran 10 muestreos , utilizaremos el "FOR"
for (i; i <= total_muestreo; i++)
{
//Debemos solicitar al usuario que ingrese la edad y el peso , una vez ingresados deben almacenarse en las variables respectivas
cout << "\nIngrese la edad de la persona " << i << " :";
cin >> Edad;
//tenemos que validar que el usuario no ingrese caracteres o especiales , letras o numeros menores o iguales a 0
while (!cin || Edad <= 0)
{
cout << "El valor ingresado no es entero! Intente de nuevo e ingrese la edad nuevamente: ";
cin.clear();
cin.ignore();
cin >> Edad;
}
cout << "Ingrese el peso en libras de la persona " << i << " :";
cin >> Peso;
//tenemos que validar que el usuario no ingrese caracteres o especiales , letras o numeros menores o iguales a 0
while (!cin || Peso <= 0)
{
cout << "El valor ingresado no es entero! Intente de nuevo e ingrese el peso nuevamente: ";
cin.clear();
cin.ignore();
cin >> Peso;
}
//Debido a que conocemos la edad para las diferentes categorias , podemos utilizar "if" comenzando por el rango de 0 a 12 años
if (Edad > 0 && Edad <= 12) { sum_peso_nin = sum_peso_nin + Peso; total_nin = total_nin + 1; }
else if (Edad > 12 && Edad <= 29) { sum_peso_jov = sum_peso_jov + +Peso; total_jov = total_jov + 1; }
else if (Edad > 29 && Edad <= 59) { sum_peso_adul = sum_peso_adul + +Peso; total_adul = total_adul + 1; }
else if (Edad > 59) { sum_peso_anc = sum_peso_anc + Peso; total_anc = total_anc + 1; }
//
system("cls");
}
cout << "*************************************************************************" << endl;
cout << "* Categoria " << "* Edad " << "* Promedio *" << endl;
cout << "*************************************************************************" << endl;
if (total_nin > 0) { porc_nin = sum_peso_nin / total_nin; cout << "* Niños " << "* 0-12 * " << std::fixed << std::setprecision(2)<<porc_nin <<endl; }
else { cout << "* Niños " << "* 0-12 " << "* No hubieron niños en el muestreo" << " *" << endl; }
if (total_jov > 0) { porc_jov = sum_peso_jov / total_jov; cout << "* Jovenes " << "* 13-29 * " << std::fixed << std::setprecision(2) << porc_jov <<endl; }
else { cout << "* Jóvenes " << "* 13-29 " << "* No hubieron jóvenes en el muestreo" << " *" << endl; }
if (total_adul > 0) { porc_Adul = sum_peso_adul / total_adul; cout << "* Adultos " << "* 30-59 * " << std::fixed << std::setprecision(2) << porc_Adul <<endl; }
else { cout << "* Adultos " << "* 30-59 " << "* No hubieron adultos en el muestreo" << " *" << endl; }
if (total_anc > 0) { porc_anc = sum_peso_anc / total_anc; cout << "* Ancianos " << "* 60 en adelante * " << std::fixed << std::setprecision(2) << porc_anc <<endl; }
else { cout << "* Ancianos " << "* 60 en adelante " << "* No hubieron ancianos en el muestreo" << " *" << endl; }
cout << "*************************************************************************" << endl;
cout <<"Desea tomar otro muestreo? Si o No." << endl;
cin >> Resp;
system("cls");
}
cout << "\n\n";
system("pause");
return 0;
}
答案 0 :(得分:0)
在>>
之类的输入流上使用std::cin
运算符会在读取双精度数时跳过前面的空白,并浮动为documented here。
换行符被视为空格。
在尝试提取值之前,以下内容将等待一些非空白字符。
double some_number
std::cin >> some_number;
检查一行的替代方法是使用std::getline(...)
方法,然后使用std::stod(...)
进行转换。
示例:
std::string input_line;
std::getline(std::cin, input_line);
// Do whatever checks on the string.
double number = std::stod(input_line);