【问题标题】:Show largest value after sentinel ends loop using a conditional statement在哨兵使用条件语句结束循环后显示最大值
【发布时间】:2015-08-18 13:44:38
【问题描述】:

我需要创建一个程序,允许用户输入一系列 以 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;
}

【问题讨论】:

  • cin &gt;&gt; value 之后添加if ( !cin ) break;,否则如果他们输入奇怪的内容,您将进入无限循环。您可能还想从 int largest = INT_MIN; 开始,以便您的程序处理负数,并尝试处理他们输入的第一个值是哨兵的情况。
  • 我按照您的第一个建议运行了程序并测试了如果我输入像 ! 这样的符号会发生什么。刚才说的最后一句话最大值是0。
  • 尝试输入一个非零数字,按回车,然后在下次出现“请输入一个整数”时执行!
  • 如果我输入8,那么!,最后会说 The maximum value is 0.
  • 如果输入的第一个值是 0,程序将停止提示并显示最大值为 0,这是有道理的,因为 0 是标记值,旨在停止提示输入更多值的循环.

标签: c++ sentinel


【解决方案1】:

内联 cmets 中的一些小建议,无论您可以从中提取什么教育价值...

#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::cin 被设置为eoffail 和/或bad 状态,其中任何一个都会导致std::istream::operator bool() const 运算符在布尔评估上下文中返回 false。在 while 条件中编写提示(“请输入...”)的技巧只是在第一次输入尝试之前完成,然后每次重做通过循环而不必在while 循环的末尾重复相同的std::cout &lt;&lt; ... 源代码。它也稍微更正确,因为输出到std::cout 可能会失败并且终止循环并不是对此的不合理反应人们很少会费心去测试coutcerr 输出操作是否成功。

【讨论】:

  • 感谢您的帮助,托尼​​ D!它非常有见地,帮助我解决了最后一条语句一直说“最大值为 0”的问题。
  • Tony D,我忘了问,如果将 while 循环下的 if、else if 语句分成 3 个单独的 if 语句可以吗?
【解决方案2】:

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

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

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

通过等效的if 条件语句:

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

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

int largest = SENTINEL;

通过

int largest =  INT_MIN;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多