Избегайте пустого ввода для двойной переменной - PullRequest
0 голосов
/ 07 мая 2018

Я читал несколько постов на этом веб-сайте о том, как избежать пустых вводов, но все еще не могу заставить его работать, я создал код c ++ для своей домашней работы, и он содержит данные проверки, когда пользователь вводит буквы или цифры, меньшие или равные 0, но если пользователь просто нажал «Enter», он продолжит снижаться, не показывая никакого сообщения. Я пытался использовать! Isdigit,! Isnumber, value.empty, но я не могу заставить условие if работать, когда пользователь просто нажимает «Enter», ничего не печатая.

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 голосов
/ 08 мая 2018

Использование оператора >> во входном потоке, например std::cin, пропускает предшествующий пробел при чтении с удвоением и с плавающей запятой, как указано здесь .

Символ новой строки считается пробелом.

Следующее будет ожидать некоторого непробельного символа, прежде чем пытаться извлечь значение.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...