如何使程序接受整数列表? 我刚刚开始学习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;};
如果(x cout您最初的问题在于代码:
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";
}
}
我在这里假设允许的假设,即用户输入总是有效的,适用于被输入的允许字符(例如“no47q
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.