好的,所以我一直在尝试对该程序进行编码,它应该创建一个由10,000个数字组成的数组,该数组是在1到500之间随机生成的。然后,它需要询问用户一个数字(在1-500之间)并告诉您在数组中找到了多少次。
在此之前获得一些帮助之后,我的阵列工作正常,但似乎无法理解其他内容。当我尝试将用户输入与数组进行比较时,某些操作不起作用,并且我不确定它是什么。
代码如下:
// AmountOfNum is supposed to represent how many times does the GuessedNum appears in the array
// GuessedNum is simply the user input
// randonum is supposed to act as the numbers in the array in the main function
// The NumGen function is supposed to turn all the numbers in the array into randomized number between 1-500
#include <iostream>
#include <random>
#include <vector>
using namespace std;
std::random_device seed;
std::mt19937 mersenneTwister(seed());
const int AmountOfNum = 10000;
int RandomInt(int min, int max);
int NumGen(int numss);
int Numguessed(int guess);
int main()
{
int AmountOfNum = 0;
int GuessedNum = 0;
int randonum = 0;
cin >> GuessedNum;
for (int i = 0; i < 10000; i++)
{
int randonum = NumGen(AmountOfNum);
//Just to see what numbers are generated, probably want to remove this once its done
cout << randonum << "\n";
}
if (GuessedNum = randonum)
{
AmountOfNum++;
}
cout << AmountOfNum;
}
int RandomInt(int min, int max)
{
std::uniform_int_distribution<int> distribution(min, max);
return distribution(mersenneTwister);
}
int NumGen(int numss)
{
std::vector <int> numsinarray(AmountOfNum);
for (int i = 0; i < AmountOfNum; i++)
{
numsinarray[i] = RandomInt(1, 500);
return numsinarray[i];
}
}
现在,如果我在for循环中(在主循环中)包含if语句,则AmountOfNum总是以10,000结尾。如果我将它放在for循环之外,则始终为0。
答案可能很明显,但是对于我的一生,我无法弄清楚。
答案 0 :(得分:3)
所示的代码中存在多个基本错误,每个错误都是致命的,因此,该程序的结果将不是您想要的。
错误#1:
在您的main()中:
int randonum = 0;
这将声明一个名为randomnum
的局部变量并将其设置为0。
for (int i = 0; i < 10000; i++)
{
int randonum = NumGen(AmountOfNum);
// ...
}
for
循环声明了一个名为randonum
的新内部变量,并将其设置为NumGen()
返回的值。除显示此randomnum
的值外,对其执行任何其他操作,此后循环结束,此randonum
被销毁。像以前一样,在外部范围中声明的原始randonum
仍为0。在内部作用域中声明另一个具有相同名称的变量将创建一个与原始变量无关的独立变量。
错误#2:
if (GuessedNum = randonum)
此randonum
仍为0。请参见错误1。 =
是一个赋值运算符。最后,将0分配给GuessedNum
。由于结果始终为逻辑假,因此randonum
仍为0,因此该if
语句将始终为false。
错误#3:
在您的NumGen
函数中:
std::vector <int> numsinarray(AmountOfNum);
这将声明一个新的向量。很好
for (int i = 0; i < AmountOfNum; i++)
{
numsinarray[i] = RandomInt(1, 500);
return numsinarray[i];
在for
循环中,numsinarray[i]
被设置为RandomInt
的返回值。然后此函数返回该值。
总计:在循环的第一次迭代中,i
的初始值为0,最终将numsinarray[0]
设置为RandomInt
的返回值,然后立即返回相同的值,而无需为向量的其余部分做任何事情。
为什么首先要声明整个向量? for
循环的用途是什么,尝试遍历整个向量,但仅结束一次迭代,调用RandomInt
一次,设置向量的第一个值,然后返回该值? / p>
无论应该完成什么,这显然是错误的,并且是另一个错误。
这些是从对代码的粗略检查中显而易见的三个基本错误。记住计算机编程的黄金法则:
计算机始终完全按照您的指示执行操作,而不是执行操作 你想要它做
您告诉计算机:
NumGen
()一万次。NumGen
()返回的每个值,但不要将其保存在任何地方,只需丢弃每个值即可。Numgen()
内创建具有一万个值的向量,开始迭代所有值,但是一旦生成第一个随机值,便立即将其返回并破坏向量。if
语句将始终为0的变量分配给另一个值,该值永远不会为true,因此if
语句永远不会为true。您的计算机完全按照您的指示执行操作。如果您希望计算机执行其他操作,则需要更改代码以告诉计算机确切应该执行的操作。