我刚刚开始学习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;
我的最后一个问题是:我如何满足此分配的要求“实施一个循环,在该循环中重复执行上述操作,直到用户请求退出为止。”
答案 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
”),并且,如果标记抱怨您在如果要在第一个换行符上停下来,则可以辩称,换行符之后的 处的任何数字均构成无效数据,因此是无效的测试用例。
在现实世界中,您将足够强大地编写代码来处理类似的极端情况,但我怀疑这对于教育工作不是必需的(即使它可能为您赢得了一些额外的分数)。