我正在编写一个 C++ 程序,它提示用户输入,然后跟踪输入的次数。我目前正在使用 do-while 循环和 switch 语句。我遇到问题的部分是 switch 语句。我不知道如何跟踪输入输入的次数。例如:
Enter Value: 4
Enter Value: 4
Enter Value: 4
Enter Value: 3
Enter Value: 3
// 然后我希望程序能够知道并最终输出数字“4”和“3”输入了多少次。我想可能会使用某种增量计数形式,但不能 100% 确定。谢谢!
我正在编写一个 C++ 程序,它提示用户输入,然后跟踪输入的次数。我目前正在使用 do-while 循环和 switch 语句。我遇到问题的部分是 switch 语句。我不知道如何跟踪输入输入的次数。例如:
Enter Value: 4
Enter Value: 4
Enter Value: 4
Enter Value: 3
Enter Value: 3
// 然后我希望程序能够知道并最终输出数字“4”和“3”输入了多少次。我想可能会使用某种增量计数形式,但不能 100% 确定。谢谢!
您可能想要使用std::map<int,int>. 这就是为什么。
让我们看看替代方案,从显而易见的开始:
int count0;
int count1;
int count2;
int count3;
int count4;
...
switch(input) {
case 0: ++count0; break;
case 1: ++count1; break;
case 2: ++count2; break;
case 3: ++count3; break
case 4: ++count4; break;
}
这可以满足您的要求:您评估输入,并跟踪特定输入被看到的次数。这种形式确实存在许多问题:
我们可以通过指定一个数组来减少变量计数:
int count[5];
...
switch(input) {
case 0: ++count[0]; break;
case 1: ++count[1]; break;
case 2: ++count[2]; break;
case 3: ++count[3]; break;
case 4: ++count[4]; break;
}
这仍然受到太多几乎但不完全相同的代码行的影响。让我们尝试摆脱 switch 语句:
int count[5];
...
++count[input];
啊,现在我们到了某个地方!通过消除该switch语句,我们得到了一行易于维护的代码。但是如果用户(意外或恶意)输入 6 怎么办?然后我们将递增count[6],它不存在。这是一件坏事。我们可以增加数组的大小:
int count[50000];
...
++count[input];
现在我们对用户来说是安全的。如果他进入 6,坏事就不再发生。呃哦,如果用户输入51000呢?我们将增加count[51000]不存在的。很明显,我们无法赢得这场比赛——对于我们选择的任何数字,用户可能会选择该数字加 1。
即使我们能赢,我们还是会输。如果我们只要求用户输入几个数字,那么我们将浪费数组中的其他 49,997 个条目。
幸运的是,C++ 有一个我们可以使用的数据结构:
该数据结构称为映射:
std::map<int,int> count;
...
++count[input];
地图有点像数组,但以一种特殊的方式增长。只有我们使用的条目会被分配,而我们使用的每个条目都是自动分配的。
std::map<int, int> frequency;
int value_entered_by_user = f();
frequency[value_entered_by_user]++;
如果您的输入值范围有限,您可以使用数组。数组的每个元素代表一个输入值。在开始时将元素初始化为 0,并在输入相应的输入值时递增相应的元素。