如何使程序采用整数列表?

时间:2019-04-21 02:04:07

标签: c++

我刚刚开始学习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;

我的最后一个问题是:我如何满足此分配的要求“实施一个循环,在该循环中重复执行上述操作,直到用户请求退出为止。”

1 个答案:

答案 0 :(得分:0)

您的最初问题在于代码:

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

=是分配的,而不是比较的。将max设置为零,然后使用该零作为真值,该值始终等于false。

因此,结果是max将设置为零,并且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”),并且,如果标记抱怨您在如果要在第一个换行符上停下来,则可以辩称,换行符之后的 处的任何数字均构成无效数据,因此是无效的测试用例。

在现实世界中,您将足够强大地编写代码来处理类似的极端情况,但我怀疑这对于教育工作不是必需的(即使它可能为您赢得了一些额外的分数)。