Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

C++;开关语句输入 我编写了一个C++程序,提示用户输入,然后跟踪输入的次数。我目前正在使用do while循环和switch语句。我遇到的问题是switch语句。我不知道如何记录输入的次数。例如: Enter Value: 4 Enter Value: 4 Enter Value: 4 Enter Value: 3 Enter Value: 3

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]

//然后我希望程序能够知道并最终输出数字“4”和“3”的输入次数。 我想可能使用某种增量计数形式,但不是100%确定。
谢谢

如果输入值的范围有限,可以使用数组。数组的每个元素表示一个输入值。在开始时将元素初始化为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不相关)。现在正是他或她获得这种经验的大好时机。亚当斯:非常感谢!表达得很好!