C++;开关语句输入 我编写了一个C++程序,提示用户输入,然后跟踪输入的次数。我目前正在使用do while循环和switch语句。我遇到的问题是switch语句。我不知道如何记录输入的次数。例如: Enter Value: 4 Enter Value: 4 Enter Value: 4 Enter Value: 3 Enter Value: 3
//然后我希望程序能够知道并最终输出数字“4”和“3”的输入次数。 我想可能使用某种增量计数形式,但不是100%确定。C++;开关语句输入 我编写了一个C++程序,提示用户输入,然后跟踪输入的次数。我目前正在使用do while循环和switch语句。我遇到的问题是switch语句。我不知道如何记录输入的次数。例如: Enter Value: 4 Enter Value: 4 Enter Value: 4 Enter Value: 3 Enter Value: 3,c++,switch-statement,do-while,C++,Switch Statement,Do While,//然后我希望程序能够知道并最终输出数字“4”和“3”的输入次数。 我想可能使用某种增量计数形式,但不是100%确定。 谢谢 如果输入值的范围有限,可以使用数组。数组的每个元素表示一个输入值。在开始时将元素初始化为0,并在输入相应的输入值时增加相应的元素。std::map frequency; std::map<int, int> frequency; int value_entered_by_user = f(); frequency[value_entered_by_user]
谢谢 如果输入值的范围有限,可以使用数组。数组的每个元素表示一个输入值。在开始时将元素初始化为0,并在输入相应的输入值时增加相应的元素。
std::map frequency;
std::map<int, int> frequency;
int value_entered_by_user = f();
frequency[value_entered_by_user]++;
_user=f()输入的int值_;
频率[用户输入的值]++;
您可能需要使用std::map
。原因如下
让我们看看替代方案,从显而易见的开始:
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到10000)时,这将成为一个问题李>
- 它有重复的、几乎相同的行
- 它有许多变量,每个变量都必须独立输入,但使用方式相同
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怎么办?然后,我们将递增不存在的计数[6]。这是一件坏事。我们可以增加阵列的大小:
int count[50000];
...
++count[input];
现在我们可以安全地避开用户了。如果他进入6级,坏事就不会再发生了。如果用户输入51000呢?我们将增加不存在的计数[51000]
。显然,我们无法赢得这场比赛——对于我们选择的任何数字,用户可能会选择该数字加1
即使我们能赢,我们也会输。如果我们只要求用户输入几个数字,那么我们将浪费arary中的其他49997个条目
幸运的是C++有一个数据结构,我们可以使用它:
- 可以将任意数字作为其范围,并且
- 节省空间(与浪费的大型阵列相比)
std::map<int,int> count;
...
++count[input];
std::映射计数;
...
++计数[输入];
贴图有点像数组,但会以一种特殊的方式自行增长。只有我们使用的条目才会被分配,而我们使用的每个条目都会被自动分配。或者使用映射来避免浪费多达8589934588字节。有没有办法使用switch语句来实现这一点?我该如何使用数组进行增量?多么聪明的反应,托玛拉克。在我的回答中,你是从哪里得到我建议分配8gig阵列的想法的?被问到的问题表明一个没有经验的程序员,我敢打赌,他还没有学会STL或地图。虽然您的答案是有效的,但在本例中可能不合适。如果您使用密集数组,其中“数组的每个元素表示一个输入值”,因为OP没有指定范围限制,那么您可能需要一个包含2147483647个元素的数组(int可以存储的值的数量)。然后,假设数组的基本类型是
int
,通常是4个字节,总共8GB。在64位系统上为16GB。祝你好运。稀疏容器在这里显然是优越的,无论OP是否使用C++标准库(STL不相关)。现在正是他或她获得这种经验的大好时机。亚当斯:非常感谢!表达得很好!