需要在这个非常简单的程序中解释一些行为

时间:2019-02-15 00:20:30

标签: c++

我正在解决练习以打发时间,并在这个非常简单的程序中遇到了这些行为:

程序的作用:

  

实施一个名为的猜谜游戏(出于某种晦涩的原因)   “牛和牛”。该程序具有四个不同整数的向量   范围是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节中。

1 个答案:

答案 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 ifif本质上只是else ifif,其他任何事情都不能成立: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 {
    }