int main () {
int num1, num2;
int cnt = 1;
if (cin >> num1){
while (cin >> num2){
if (num1==num2){
++cnt;
} else {
cout << num1 << " is " << cnt << " times" << endl;
cnt = 1;
num1 = num2;
}
}
}
cout << num1 << " is " << cnt << "-times" << endl;
}
此代码接受一行数字,并输出每个数字被输入多少次。我不明白的是为什么会有num1=num2
。将其删除后,程序会输出输入的第一个数字,这使我相信我不知道cin
是如何循环工作的。
我现在想的是,第一个数字进入if (cin >> num1),
,它一直坐在这里,下一个相同的数字不会覆盖num1
整数。每次进入while (cin >> num2)
的第二位和其余数字都会覆盖它,直到有一个不同的数字为止,这使else
执行并输出一直存储在num1
中的数字。
使用 num1=num2
更改num1
中的 if(cin>> num1)
,然后重新开始。
我说的对吗?
奇怪的是,最后一个提示可能会确定在第一个 if
主体内部,但不一定,它仍然可以工作...
Edit1:num1 = num2;我输入1 1 2 2 3 3 3,作为一行,它输出
1 is 2 times
2 is 2 times
3 is 3 times.
没有num1 = num1;
1 is 2 times
1 is 1 times
1 is 1 times
1 is 1 times
1 is 1 times
答案 0 :(得分:4)
#include <iostream>
int main () {
int num1, num2;
int cnt = 1;
if (std::cin >> num1) { // if a valid integer can be extracted from cin
while (std::cin >> num2) { // do as long as valid integers are extracted from cin
if (num1 == num2) { // if the first extracted int matches the next one
++cnt; // increase the count
}
else { // if it is a different int then do some output and
std::cout << num1 << " is " << cnt << " times\n";
cnt = 1; // reset the counter and
num1 = num2; // remember the new extracted number for
// the next iteration of the while-loop
// since only num2 will be read again from cin
}
}
}
std::cout << num1 << " is " << cnt << "-times\n";
}
由于main()
中的最后一行在没有有效输入的情况下毫无意义,因此我主张提早退出:
#include <cstdlib>
#include <iostream>
int main () {
// ...
if (!( std::cin >> num1 ))
return EXIT_FAILURE;
while (std::cin >> num2) {
if (num1 == num2) {
// ...
它还降低了缩进级别,从而提高了可读性。
答案 1 :(得分:1)
cin >> num1
尝试从标准输入中读取一个数字到num1
变量中。如果成功,则将执行if
的主体。否则(例如,如果用户输入的不是数字,或者立即按了Ctrl-d / Ctrl-z),我们将直接跳到if
之后的代码。这恰好发生一次。
cin >> num2
与num2
变量具有相同的作用,只是这次它位于while
而不是if
中。因此,如果输入操作成功,则执行while循环的主体,然后再次执行cin >> num2
,直到最终失败。
我不明白为什么会有
num1=num2
。
正如我所说,cin >> num1
仅执行一次(它不在任何循环内)。因此,如果您从不重新分配num1
,它将始终保留输入的第一个值。但是您不希望那样,您希望它包含您当前正在计算的值。这就是为什么要分配作业的原因。
当num1 = num2时,它将在if(cin >> num1)中更改num1,然后重新开始整个操作。我说的对吗?
否,cin >> num1
再也不会执行。它不在循环内。多次执行只有cin >> num2
,因为该循环属于while
的一部分。
还有一个奇怪的地方是,最后一个球杆肯定会在第一个球体内部(如果不是),那么它肯定不会起作用……
如果第一次输入操作失败,它将立即跳到体外。如果存在cout
语句,则意味着即使第一个输入失败,它也将被执行。在这种情况下,num1
将未初始化,因此使用它会调用未定义的行为。因此,该语句不应在if
之外。
答案 2 :(得分:0)
我理解代码的作用是计算并显示数字的连续出现次数,因此它不适用于无序列表。
也就是说,它的工作原理基本上如下:
num1
中。num2
。num1
和num2
相同,则增加计数器。num1
)数字(num2
。答案 3 :(得分:0)
第一个if if (cin >> num1)
检查是否有输入(当然是等待输入)到num1,然后才继续循环。
然后,它等待第二个输入到num2中,如果输入为空,则进入循环。
然后将两个输入进行比较。如果它们相同...则增加计数器。 否则,它将输出连续检测到相同输入多少次,然后将比较输入更改为最后输入的值,并重复循环,等待输入。
因此它比较了您一次又一次提供相同输入的次数...
基本上,如果输入是:
5
5
5
1
输出将为“ 5是3倍”
如果输入是
1
5
5
5
输出将为“ 1是1倍”