如何使程序接受整数列表? 我刚刚开始学习C++,正在学习与CIN,Cim.GET有关的主题。在我的一项作业中,要求如下:

如何使程序接受整数列表? 我刚刚开始学习C++,正在学习与CIN,Cim.GET有关的主题。在我的一项作业中,要求如下:,c++,C++,编写一个程序,读入整数列表并打印最大值和最小值 最小的数字 您可以假设用户的输入总是有效的 您可以假设列表中的数字由一个空格字符和一个空格分隔 列表中最后一个数字后面的字符是换行符 实现一个循环,在该循环中重复上述操作,直到用户请求退出 我想到的代码是: using namespace std; int main() { char ch = ' '; int max=0; do { int x; cin >> x;

编写一个程序,读入整数列表并打印最大值和最小值 最小的数字

您可以假设用户的输入总是有效的

您可以假设列表中的数字由一个空格字符和一个空格分隔 列表中最后一个数字后面的字符是换行符

实现一个循环,在该循环中重复上述操作,直到用户请求退出

我想到的代码是:

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不应该要求用户输入一些东西,以及cin.get吗?换句话说,用户不应该遇到两次输入吗?但为什么我在运行时只被要求输入一次

在使用本文中的注释进行了一些调整后,我能够得出如下代码:

int main()
{

cout>x;
ch=cin.get();
如果(max==0){max=x;};
如果(x>max){max=x;};
如果(min==0){min=x;};
如果(xcout您最初的问题在于代码:

if (max = 0) { max = x; };
单个
=
是赋值,而不是比较。is所做的是将
max
设置为零,然后将该零用作真值,它始终等于false

因此,
max
将被设置为零,而
if
的主体将永远不会执行

您需要使用
==
进行比较


在循环方面,直到用户指示他们要退出,您可以使用
>
提取操作符检测无效输入

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

举例来说,当您输入
q
时,以下完整程序将退出(或任何无效数字,但如果您输入
47q
,它将在退出
q
之前首先处理
47
):


因此,您可以使用它来检测非数字输入并相应地采取行动:

#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";
    }
}
我在这里假设允许的假设,即用户输入总是有效的,适用于被输入的允许字符(例如“no
47q
allowed”),并且,如果标记器抱怨您要停在第一个换行符上,您可以争辩说,该换行符之后的任何数字都构成无效数据,因此是无效的测试用例


在现实世界中,您编写的代码足够健壮,可以处理这样的边缘情况,但我怀疑这对于教育工作来说是不必要的(即使它可能会为您赢得一些额外的分数)。

if(max=0){max=x;}是一个bug。请注意,
=
是比较<代码>=
是赋值。
cin>>x
跳过所有空格,直到它从流中找到并读取一个整数(或者取消选中失败,整个程序陷入无限循环)。当它遇到不能是
int
的内容时,它将停止读取。这可能是一个空格、逗号或其他东西,但也可能是流的结尾(程序落入同一个无限循环)
ch=cin.get()
将从流中读取停止
int
的字符。如果它找到了行的末尾,就退出循环。我建议使用类似的方法。
if (max = 0) { max = x; };
#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.