1

我是 C++ 的初学者程序员(目前),我有一个概念性问题。

我正在尝试过滤cin输入以确保它是 01-04 之间的一位或两位整数,如果不是,则产生错误并要求新的输入。

我还map用来给用户一个选项列表,在有效选择后,通过几种方法中的任何一种路由输入(整数)以产生相关结果,但我会在别处询问这个问题的更具体版本。

我在http://www.cplusplus.com/forum/beginner/26821/找到了一段代码,用于验证输入。我有点明白了,除了在while循环中设置布尔条件的地方。因为我不理解它,所以很难编辑或确保我正确地操作它。

这是示例代码:

int main()
{
    int num;
    bool valid = false;

    while (!valid)
    {
        valid = true; //Assume the cin will be an integer.

        cout << "Enter an integer value: " << endl;
        cin >> num;

        if(cin.fail()) //cin.fail() checks to see if the value in the cin
                    //stream is the correct type, if not it returns true,
                    //false otherwise.
        {
            cin.clear(); //This corrects the stream.
            cin.ignore(); //This skips the left over stream data.
            cout << "Please enter an Integer only." << endl;
            valid = false; //The cin was not an integer so try again.
        }
    }

    cout << "You entered: " << num << endl;

    system("PAUSE");
    return 0;

这是我的代码(整个事情,给出上下文)。我不认为它是完整的,我只是想确保我使用的是布尔值。

float _tmain(float argc, _TCHAR* argv[])
{
    bool validInput = !true;

    map<string,int> Operations;
    Operations.insert(pair<string, int>("Addition", 01));
    Operations.insert(pair<string, int>("Subtraction", 02));
    Operations.insert(pair<string, int>("Multiplication", 03));
    Operations.insert(pair<string, int>("Division", 04));

    cout << "Welcome to OneOpCalc, what operation would you like to perform?" << endl;

    for(map<string, int>::iterator ii=Operations.begin(); ii!=Operations.end(); ++ii)
    {
        cout << (*ii).second << ": " << (*ii).first << endl;
    }

    while (!validInput)
    {
        cin >> operatorSelection;

        if (cin.fail() || operatorSelection < 4 || operatorSelection > 1)
        {
            cout << "Error: Invalid selection. Please choose a valid number." << endl << endl;
            cin.clear();
            cin.ignore();
        }
    }
}

while (!valid)意思是“虽然valid的” ?在我的脑海中,它在说“While validis !valid”,这显然总是错误的。

编辑:谢谢大家的回答,我正在浏览它们。我不断得到的一个答案过于笼统;我明白那个 !不是,我理解使用它翻转布尔的概念。然而,隐含的逻辑含义让我感到困惑。在任何给定的陈述中,我习惯于将其!valid视为一种翻转valid价值的方式;不测试条件。这是使用它来测试欺骗我的条件的语法。换句话说,写作while(!valid)对我来说字面意思是while(NOTvalid),而不是while(valid==false)。我无法让自己理解为什么在这种情况下,!valid将其视为一种条件,而不仅仅是一点点翻转。

4

6 回答 6

2

在您的代码中,在循环内,只需添加:

else
  validInput = true;

if右括号之后。一旦用户输入了正确的值,您就想摆脱它。

于 2013-08-08T15:00:23.070 回答
2

while 循环有一个条件和一个主体,只要条件评估为真,就会执行主体。

从 C++ 标准:

6.5.1 while 语句

在 while 语句中,子语句被重复执行,直到条件 (6.4) 的值变为 false。测试在每次执行子语句之前进行。

while 循环可以有以下形式之一

while ( condition ) statement

while ( condition )
{
  statement(s)
}
于 2013-08-08T15:00:44.710 回答
2

您想在“没有有效输入时”运行循环。删除非粗体字,并翻译成 C++。

当然,第二种情况不起作用,因为validInput循环内部没有任何变化,所以它保持“无效”,循环永远继续(如果你想设置一些东西,false那么 bool validInput = !true;bool validInput = false;- 编译器会做同样的事情事情,但是阅读代码的人必须思考才能看到它的作用 - 阅读代码时思考是一件好事,但编写比必要更复杂的代码并不是一件好事......)。

于 2013-08-08T14:54:46.997 回答
2

!运算符是合乎逻辑的,not这就是你应该如何阅读它:while not valid. 你也可以这样写:

while(valid == false)

或者

while(valid != true)

请注意,这里再次!=等价于not equal

于 2013-08-08T14:56:27.883 回答
2

循环(和 if)由 type 的表达式控制bool。在while ( !valid ),表达式是!valid,运算符不应用于变量的值validwhile ( !valid )表示(字面意思),而表达式 !valid(表示“无效”)为真。

对于其余部分,您要复制的代码非常糟糕。如果我是你,我不会用它作为例子。

至于你自己的代码:

  • _tmain对微软来说非常特别。你不想使用它。如果您编写控制台应用程序,只需使用main. (同样的事情适用于_TCHAR,而不是char。)

  • 既不_tmainmain不能返回 a float。的返回类型main应始终为int。我不太熟悉 _tmain,但它要么int要么void。(可能int,如果您在控制台模式程序中。)

  • !truefalse。总是。(编程与现实世界不同。没有可能。)为什么比必要的复杂?

  • 根本不需要标志变量。你可以写:

    cin >> 运算符选择;while ( !cin || operatorSelection > 4 || operatorSelection < 1 ) { // ... }

  • 如果出现错误,您目前只忽略一个字符。您可能希望忽略行尾并包括行尾。( std::cin.ignore( std::numeric_limits<std::streamsize>::max() );.

  • 并且您的 if 条件将始终为真。(见我上面的版本。)你期望在哪里找到一个既不小于也不大于一的数字?

于 2013-08-08T15:05:35.990 回答
1

nijansen 忘记加最优雅的了

while(!valid)

这与其他 2 个相同

于 2013-08-08T15:04:07.390 回答