避免双变量

时间:2018-05-07 20:15:50

标签: c++ visual-c++

我已经在网上阅读了多篇关于避免空白输入的帖子,但仍然无法使其工作,我已经为我的作业创建了一个c ++代码,当用户输入字母或数字时它有验证数据小于或等于0但如果用户刚刚点击“输入”#39;它将继续下降而不显示任何消息。我尝试过使用!isdigit,!isnumber,value.empty但是当用户只按“输入”时,我无法使if条件生效。没有输入任何东西。

This is what happen when I keep pressing 'Enter' without typing anything

    // 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;
}

1 个答案:

答案 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);