您如何专门获得一个浮点数为 2 位小数的输入作为 C++ 中 while 循环的条件?

Posted

技术标签:

【中文标题】您如何专门获得一个浮点数为 2 位小数的输入作为 C++ 中 while 循环的条件?【英文标题】:How do you exclusively get an input that is 2 decimal places for a float as a condition for a while loop in C++? 【发布时间】:2021-08-19 03:14:14 【问题描述】:

我正在制作一个要求输入时间的程序。如果我希望float 输入采用这种格式,9.24 将被视为09:24。如何编写只允许这种输入的 while 循环?我是 C++ 编程的新手,所以如果你能帮我把它简化一下,那就太好了。这是我到目前为止的while循环:

浮动时间; cout

while (cin >> time) 

    if ((time < 12.00) && (time > 0.00)) 
    
        break; 
    
    else
    
        cout << "Invalid input, please enter a valid time: ";
    
 

在这个循环之后,它会询问时间是上午还是下午,但这与此无关。

【问题讨论】:

我认为您根本不想为此使用浮点数。例如,由于底层的二进制表示,C++ 不能将9.24 完全表示为浮点数——它实际上存储了类似于9.2399997711181641 的东西,它只是非常接近它。我建议尝试将时间读取为 作为字符串 并问自己“可以算作有效输入的字符串的特征是什么?” 您要求输入非通用格式是在自找麻烦。在小时和分钟之间使用小数点对人们来说是完全陌生的,他们会想要使用冒号。 @MarkRansom 小时和分钟之间的小数点是这个porgram的要求,所以我不能使用冒号,很遗憾。 我不清楚您是否希望用户输入“9:24”、“09:24”、“9.24”或“09:24 = 9.24”。 仅仅因为输入看起来像一个浮点数,就没有理由把它读成浮点数。例如将其读取为字符串,然后使用正则表达式对其进行解析并从中获取两个整数。 (Ab)使用浮动迟早会结束。 【参考方案1】:

我写了一个简单的代码,里面有对你有用的解释。

#include<iostream>
#include <string>
int main() 
    int hour, minute;
    std::string time; // we will read the time as string
    std::string delimiter = ":"; // we will split from this character
    size_t pos = 0;
    std::cout << "Please enter the time: (example=>09:24) ";

    while (std::cin >> time)
    
        while ((pos = time.find(delimiter)) != std::string::npos) 
            hour = std::stoi(time); // we converted the hour information to integer
            time.erase(0, pos + delimiter.length());
            minute = std::stoi(time); // we converted the minute information to integer
        
        if ((hour >= 0 && hour <= 12) && (minute >= 0 && minute < 60)) //necessary checks are made
        
            break;
        
        else
        
            std::cout << "Invalid input, please enter a valid time: ";
        
    
    std::string AmPm;
    std::cout << "AM or PM ?";
    while (std::cin >> AmPm) //We get the AM/PM information from the user as a string
    
        if (AmPm =="AM" || AmPm=="PM") //necessary checks are made
        
            break;
        
        else
        
            std::cout << "Invalid input,please enter AM or PM ";
                
        
    
    std::cout << "Time is  " << hour << ":" << minute <<" " <<AmPm;

如果你输入9:24和AM作为测试数据,你会得到如下输出作为输出;

输出 => 时间是上午 9:24

如果您愿意,您可以测试代码中分隔符条目的正确性。

注意:using namespace std; =>> 这不是好的编码习惯。

祝你好运。

【讨论】:

以上是关于您如何专门获得一个浮点数为 2 位小数的输入作为 C++ 中 while 循环的条件?的主要内容,如果未能解决你的问题,请参考以下文章

1.1编程基础之输入输出——05:输出保留12位小数的浮点数

如何舍入一个浮点数?

1.1编程基础之输入输出——04:输出保留3位小数的浮点数

05:输出保留12位小数的浮点数

输出保留12位小数的浮点数

支持小数点和小数点逗号的字符串到浮点数转换