C++ Switch 语句输入

标签 c++ switch-statement do-while

我正在编写一个 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;
}

这会按照您的要求进行:您评估输入,并跟踪特定输入被看到的次数。这种形式确实存在很多问题:

  • 每个选项都需要一行源代码。当用户可以输入任何值(例如 0 到 10,000)时,这就会成为一个问题!
  • 它有重复的、几乎相同的行。
  • 它有很多变量,每个变量都必须独立输入,但使用相同。

我们可以通过指定一个数组来减少变量的数量:

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,则 Bad Thing 不再发生。呃,如果用户输入 51000 呢?我们将增加 count[51000]这是不存在的。很明显,我们无法赢得这场比赛——对于我们选择的任何数字,用户可能会选择该数字加 1。

即使我们能赢,我们还是会输。如果我们只要求用户输入几个数字,那么我们将浪费数组中的其他 49,997 个条目。

幸运的是,C++ 有一个我们可以使用的数据结构:

  • 可以取任意数字作为范围,
  • 节省空间(与大量浪费的数组相比)。

该数据结构称为映射:

std::map<int,int> count;
...
++count[input];

map 有点像数组,但会以一种特殊的方式自行增长。只有我们使用的条目才会被分配,我们使用的每个条目都会自动分配。

关于C++ Switch 语句输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615199/

相关文章:

java - 暂停 Android 应用程序,直到按下按钮

java - y=2^(-0.5)x 从 0 到 1 boolean 值的积分的蒙特卡洛近似无法正常工作

c++ - C语言编译堆栈程序时出现错误信息

通过 Switch Case 处理 Angular Reactive Form 错误

c++ - 从给定的一组规则位置中选择图形标记/规则上的 "nice"数字

java - 在 Java 7 中切换忽略大小写

c++ LNK2019错误,未解析的外部字符

java - 带循环的天文学助手 Java 菜单驱动程序

c++ - 当我用 C 编写 C++ 代码时是否可能显示错误?

C++ 为什么原始指针不会增加 shared_ptr 的引用计数?