如何使程序接受一个整数列表?

3
我刚开始学习c++,正在学习与cin、cin.get相关的主题。其中一个作业要求是:
编写一个程序,读取一系列整数,并打印出最大和最小的数字。
您可以假设用户的输入始终有效。
您可以假设列表中的数字由一个空格字符分隔,并且在列表中的最后一个数字后面跟随换行符。
实现循环,重复执行上述操作,直到用户请求退出。
我想到的代码是:
using namespace std;
int main()
{ 

    char ch = ' ';
    int max=0;

    do
    {
        int x;
        cin >> x;
        ch = cin.get();
        if (max = 0) { max = x; };
        if (x > max) { max = x; };
    } while (ch != '\n');
    cout << "maximum=" << max << endl;
    return 0;
}

我本以为这会返回列表中的最大数值。但事实证明它只会返回列表中的最后一个整数。

而且我还不太理解这行代码的作用:

cin >> x;
ch = cin.get();

使程序能够接受一组数字列表。cin不应该会要求用户输入一些内容吗?还有cin.get呢?换句话说,用户不应该遇到两次输入吗?但是为什么当我运行时只被要求输入一次?

根据本帖子中的评论进行了一些调整后,我得出了以下代码:

int main()

{

cout << "Enter the list of integer numbers: ";

char ch = ' ';

int max=0;
int min = 0;

do
{
    int x;

    cin >> x;

    ch = cin.get();

    if (max == 0) { max = x; };
    if (x > max) { max = x; };

    if (min == 0) { min = x; };
    if (x < min) { min = x; };
} while (ch != '\n');



cout << "maximum=" << max << endl;
cout << "minimum=" << min << endl;
return 0;

我的最后一个问题是:我如何满足这个任务的要求“实现循环,直到用户请求退出,上述操作将被重复执行。”

3
如果(max = 0) { max = x; }; 是一个错误。请注意,"=="是比较运算符,而"="是赋值运算符。 - drescherjm
“cin >> x;” 会跳过所有的空格,直到从流中找到并读取一个整数(或者未经检查就失败,整个程序陷入无限循环)。当它遇到不能是“int”的东西时,它将停止读取。这可能是一个空格、逗号或其他东西,但它也可能是流的末尾(程序陷入同样的无限循环)。 “ch = cin.get();” 将从流中读取停止“int”的字符。如果它发现行的末尾,它将退出循环。 - user4581301
我建议使用类似于此答案中的选项2 - user4581301
1个回答

1

Your initial problem lies with the code:

if (max = 0) { max = x; };

单个的“=”代表赋值,而非比较。它将max设置为0,并将0作为真值,总是等同于false。
因此,效果是max被设置为0,并且if语句的主体永远不会执行。
你需要使用“==”进行比较。
关于循环直到用户表明退出,您可以使用无效输入可以通过 >> 提取运算符来检测的事实。

另外,由于提取整数会先跳过空格,因此您根本不必担心处理空格和换行符,它们自然会作为“获取下一个整数”操作的一部分被跳过。

例如,以下完整程序将在您输入 q(或者无效数字,但如果您输入 47q,它会先处理 47,然后在 q 上退出)时退出:
#include <iostream>

int main () {
    int inVal;
    while (true) {
        std::cout << "Enter number (q to quit): ";
        if (! (std::cin >> inVal)) break;
        std::cout << inVal << '\n';
    }
    std::cout << "Done\n";
}

一个样例运行如下:

Enter number (q to quit): 1
1
Enter number (q to quit): 2
2
Enter number (q to quit): 3
3
Enter number (q to quit): 55
55
Enter number (q to quit): 42
42
Enter number (q to quit): q
Done

所以您可以使用它来检测非数字输入并采取相应措施:
#include <iostream>

int main () {
    int inVal, maxVal, minVal, firstTime = true;
    while (true) {
        std::cout << "Enter number (q to quit): ";
        if (! (std::cin >> inVal)) break;
        if (firstTime) {
            firstTime = false;
            minVal = maxVal = inVal;
        } else {
            if (inVal > maxVal) {
                maxVal = inVal;
            }
            if (inVal < minVal) {
                minVal = inVal;
            }
        }
    }
    if (firstTime) {
        std::cout << "*** You didn't enter any numbers.\n";
    } else {
        std::cout << "*** Minimum was " << minVal
                  << ", maximum was " << maxVal << ".\n";
    }
}

一些示例运行:

pax:~> ./testprog
Enter number (q to quit): q
*** You didn't enter any numbers.

pax:~> ./testprog
Enter number (q to quit): 1
Enter number (q to quit): q
*** Minimum was 1, maximum was 1.

pax:~> ./testprog
Enter number (q to quit): 9
Enter number (q to quit): 8
Enter number (q to quit): -3
Enter number (q to quit): 7
Enter number (q to quit): 5
Enter number (q to quit): 42
Enter number (q to quit): q
*** Minimum was -3, maximum was 42.

我在这里假设用户输入的字符始终有效,并且允许输入的字符(例如“不允许使用47q”),如果标记器抱怨你应该停在第一个换行符上,那么您可以认为换行符之后的任何数字都构成无效数据,因此是无效的测试用例。
在现实世界中,您需要编写足够强大的代码来处理类似的边缘情况,但我怀疑对于教育工作来说并不是必需的(即使它可能会为您赚取额外的分数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接