我正在解决练习以打发时间,并在这个非常简单的程序中遇到了这些行为:
程序的作用:
实施一个名为的猜谜游戏(出于某种晦涩的原因) “牛和牛”。该程序具有四个不同整数的向量 范围是0到9(例如1234,但不是1122),它是用户的 通过反复猜测发现这些数字的任务。说号码给 被猜测为1234,用户猜测为1359;回应应该是 “ 1头牛和1头牛”,因为用户正确地获得了一位(1) 正确的位置(一个公牛)和一个正确的数字(3),但错误 位置(一头母牛)。猜测一直持续到用户得到四个 公牛,即正确的四位数字和正确的顺序。
我用大写字母对行为进行了编号,并在下面解释“出了什么问题”。
此外,该程序运行正常,它没有错误处理,不会很长地回答这个问题,它也不会检查猜测的数字是否已经被猜测出来,因此您可以作弊,但我没有实现解决方案回答这个问题的时间不要太长。
bool is_in_vector(std::vector<int> v, int value) {
for (std::vector<int>::size_type i {0}; i < v.size(); ++i) {
if (v[i] == value) {
return true;
}
}
return false;
}
int main() {
try {
constexpr int bulls_success {4};
int bulls {0};
int cows {0};
int lives {5};
std::vector<int> lottery(4);
//auto time_now {std::chrono::system_clock::now().time_since_epoch().count()};
//Feed vector with random numbers
std::default_random_engine ran {9}; //ran was supposed to be initialized by time_now //BEHAVIOUR EXTRA
std::uniform_int_distribution<> factory {0,9};
for (std::vector<int>::size_type i {0}; i < lottery.size(); ++i) {
lottery[i] = factory(ran); //BEHAVIOUR #1
}
//Print the answer to test the game
for (std::vector<int>::size_type i {0}; i < lottery.size(); ++i) {
std::cout << lottery[i] << ' ';
}
std::cout << '\n'; // Print a new line for esthetic
int position {0};
int guessing {0};
while (true) {
std::cout << "Bulls: " << bulls << '\t' << "Cows: " << cows << '\n' << "Lives: " << lives << "\n\n";
std::cout << "Enter a position in the range of 0 - 3\n";
std::cin >> position;
std::cout << "Enter a guessing between 0 - 9 or enter 999 to end the game\n";
std::cin >> guessing;
std::cout << '\n'; //Print a new line for esthetic
if (guessing == 999) {
std::cout << "Game ended\n";
break;
}
else if (lottery[position] == guessing) {
++bulls;
}
else if (lottery[position] != guessing) {
if (is_in_vector(lottery, guessing)) {
++cows;
}
}
if (!is_in_vector(lottery, guessing)) { //BEHAVIOUR #2
std::cout << "Bang!\n";
--lives;
}
if (bulls == bulls_success) {
std::cout << "You won\n";
break;
}
if (lives == 0) {
std::cout << "You lost\n";
break;
}
}
system("pause");
return 0;
}
catch (std::runtime_error& e) {
std::cerr << e.what() << '\n';
system("pause");
return 1;
}
}
行为#1::我无法通过push_back来向矢量投放,就像这样 lottery.push_back(factor(ran)) 它必须是上面的方式。为什么?
行为2::如果我输入“ else if”,则该程序的那部分不起作用;但是如果我只输入“ if”,则可以。为什么?
额外的行为:我无法使用time_now初始化使用time_now运行的default_random_engine,在《使用C ++的编程原理和实践》(第二版)中说,我可以使用“一天中的时间”初始化default_random_engine;如果不是上面的方法,我该怎么做?我还尝试了std :: chrono :: system_clock :: now()
这本书的摘录:
默认情况下,引擎(可能是random_device除外)给出相同的结果 每次运行程序时都要排序。这对于 初始调试。如果我们想要引擎提供不同的序列,我们 需要使用不同的值对其进行初始化。这样的初始化器是 通常称为“种子”。要获得不可预测的顺序, 人们经常使用一天中的时间(最短到最后一纳秒)或类似的时间作为种子
它在第24章917页的第7节中。
答案 0 :(得分:1)
1。
因为您已经用 double price = 0;
double input = 0;
const double _TAX = .065;
double tax;
double total;
int count = 1;
while (true)
{
Console.Write("Item #{0} Enter Price: $", count);
input = Convert.ToDouble(Console.ReadLine());
if (input == - 1)
{
break;
}
count++
price += input;
}
Console.WriteLine("\n Items: {0}", count);
个元素的空间来初始化vector
,所以:
4
如果您尝试std::vector<int> lottery(4);
进行操作,则会获得5个元素。
2。 仔细阅读代码:
push_back
如果该职位包含正确的号码,那么我们将授予 else if (lottery[position] == guessing) {
++bulls;
}
else if (lottery[position] != guessing) {
if (is_in_vector(lottery, guessing)) {
++cows;
}
}
if (!is_in_vector(lottery, guessing)) { //BEHAVIOUR #2
。您的下一个bull
处理的位置不是正确的,因此else if
和if
本质上只是else if
和if
,其他任何事情都不能成立:else
可以通过guessing
进行修改,也可以不这样做,因此添加另一个lottery[position]
将永远不会受到打击。您可能想要的是:
else if
3。 您可以像这样随时间播种:
// correct guess
else if (lottery[position] == guessing) {
++bulls;
// incorrect guess
} else {
// correct number, incorrect position
if (is_in_vector(lottery, guessing) {
++cows;
}
// nothing correct
else {
}