使用条件语句在哨兵结束循环后显示最大值

Show largest value after sentinel ends loop using a conditional statement

我需要创建一个程序,允许用户输入一系列 以 0 作为标记的整数。最后会显示最大的整数。

我最初在 if 语句下有语句 largest = value,但将其更改为条件语句,这对我来说更有意义,因为我以前的方式只是在输入标记之前给了我最后一个值.它似乎给了我“正确”的输出,但我用条件语句设置它的方式是否正确?如果没有,我该如何解决?

原始输出

This program finds the largest integer in a list.
Enter 0 to signal the end of the input.

Please enter an integer: 21

Please enter an integer: 15

Please enter an integer: 9

Please enter an integer: 6

Please enter an integer: 3

Please enter an integer: 0

The largest value is 3.

Press any key to continue . . .

当前输出

This program finds the largest integer in a list.
Enter 0 to signal the end of the input.

Please enter an integer: 15

Please enter an integer: 200

Please enter an integer: 3

Please enter an integer: 5

Please enter an integer: 21

Please enter an integer: 0

The largest value is 200.

Press any key to continue . . .

源代码:

#include "stdafx.h"
#include <iostream> 
using namespace std;

const int SENTINEL = 0;

/* Main Program */
int main()
{
    
    cout << "This program finds the largest integer in a list.";
    cout << "\nEnter " << SENTINEL << " to signal the end of the input." << endl;

    int largest = SENTINEL;

    while (true)
    {
        int value; 
        cout << "\nPlease enter an integer: ";  
        cin >> value;

        if (value == SENTINEL) 
            break;
        largest = (value > largest) ? value : largest; 
    }

    cout << "\nThe largest value is " << largest << "." << endl;

    cout << endl;

    system("PAUSE");

    return 0;
}

我认为你的做法是正确的。

但是,您可以简单地替换:

largest = (value > largest) ? value : largest; 

通过等效的 if 条件语句:

if (value > largest){
    largest = value;
}

此外,请注意,只需替换您的声明:

int largest = SENTINEL;

来自

int largest =  INT_MIN;

其中 INT_MIN 是可能的最小整数。

在线评论中的一些小建议,无论您可以从中提取什么教育价值...

#include <iostream> 

const int SENTINEL = 0;

int main()
{
    // can continue input across lines, and rarely need to use endl...
    // (any input attempt from cin will flush cout first)
    std::cout << "This program finds the largest integer in a list.\n"
        "Enter " << SENTINEL << " to signal the end of the input.\n";

    int num_inputs = 0;
    int largest;
        // before, shouldn't have used sentinel here - if input all negative
        //   largest would be 0 in error...
        // now won't use unless we see actual inputs so no need to init

    int value;
    while (std::cout << "\nPlease enter an integer: " &&
           std::cin >> value)  // use cin so unparsable input breaks
    {
        if (value == SENTINEL) 
            break;
        if (++num_inputs == 1)
            largest = value;
        else if (value > largest)
            largest = value;
    }

    if (num_inputs > 0)
        std::cout << "\nThe largest value is " << largest << ".\n\n";
    system("PAUSE");  // for Windoze
}

使用 num_inputs 可以避免在没有非哨兵输入时输出一条声称知道最大值的消息。

另一种维护 largest 的方法是:

else
    largest = std::max(value, largest);

关于...

while (std::cout << "\nPlease enter an integer: " &&
       std::cin >> value) 

...这确保无法解析为整数的输入会导致循环终止(因为 std::cineoffail [=37= 中设置] bad 状态,其中任何一个都会导致 std::istream::operator bool() const 运算符在布尔计算上下文中 return false。将提示 ("Please enter...") 写入的技巧while 条件只是在第一次输入尝试之前完成,然后每次通过循环重做,而不必在 while 循环结束时重复相同的 std::cout << ... 源代码。它稍微更正确同样,由于 std::cout 的输出可能会失败,因此终止循环并不是对此的不合理反应,尽管人们很少费心去测试 coutcerr 输出操作的成功。