在C ++中执行一次序列的最佳方法

时间:2013-11-08 14:33:52

标签: c++

使用C ++什么可能是序列只运行一次的最佳方法?为了更清楚,例如我有一个程序,你需要猜一个字符串,如果用户输入提示我会显示单词的提示,但我只允许一次...我目前正在这样做:

   bool hintLock = false;
   ...
if (guess == "hint"){
    if (!hintLock){
        cout << hint << endl;
        hintLock = true;
        }
    else
        cout << "I've given you the hint" << endl;
    }

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

void main(){
    string  guess;
    bool    hintLock = false;
    cout << "Guess one of StackExchange's best site:  Type \"hint\" for hint" << endl << endl;
    do{
        cout << "Guess > ";
        cin >> guess;

        if (guess == "hint"){ // Here it is
            if (!hintLock){
            cout << hint << endl;
                hintLock = true;
                }
            else
                cout << "I've given you the hint" << endl;
            }
        }
    while (guess != "stackoverflow");
    cout << "You've got it right!" << endl;
    }

有没有更好的声明呢?或者它已经是最好的了?

5 个答案:

答案 0 :(得分:3)

我怀疑你要么已经过分析了事情,要么你还没有充分描述真正的问题。从您发布的代码中,我认为没有理由不将您想要执行的代码包装到函数中,然后只调用该函数一次。

void blahBlah()
{
  // blah blah
}

int main()
{
  if (userInput == "hint")
    blahBlah();
}

也许你的意思是在你的程序中你有一个主循环,它在程序终止之前执行,并且在那个循环中你接受来自用户的输入。允许用户请求提示,但在程序运行期间只允许一次。第一次要求提示他们给他们一个,但后来他们没有。

我仍然相信简单比花哨更好(阅读:复杂)。为此,我首先在主循环之外设置bool范围,每次他们寻求帮助时都要检查:

int main()
{
  bool displayedHint = false;

  // program's main loop
  for (bool endProgram = false; !endProgram; )
  {
    std::string command = getUserInput();
    if (command == "hint")
    {
      if (displayedHint)
      {
        cout << "I already gave you a hint!\n";
      }
      else
      {
        displayHint();
        displayedHint = true;
      } 
    } 
  }
}

答案 1 :(得分:1)

如果你想确保它只为程序的任何特定运行显示一次(任何更全局的东西都非常复杂并且特定于平台),你需要的只是一个全局布尔值来保护函数。例如:

bool shownHint = false;
void showHint() {
    if (!shownHint) {
        cout << "The hint is: ........" << endl;
        shownHint = true;
    } else {
        cout << "Hint has already been shown, no cheating!" << endl;
}

每当您认为您可能想要显示提示时,请致电showHint()并在适当时显示(或不显示)。

诀窍是确保变量是全局的(或类中的静态,看起来几乎相同),这样它就不会在循环期间或程序运行时重置。

如果需要在运行之间保持不变,可以写入文件,检查服务器,设置注册表项或任意数量的其他选项。

答案 2 :(得分:0)

您可以使用布尔值的flags来表示系统中的状态。一旦状态被“定义”,您就可以查询状态并查找它是“已设置”还是“已清除”..

更准确

bool hasHinted = false; // unset or cleared( also definition of a state variable)
if(hasHinted == false){
   //do something
   hasHinted = true; // set
}else{
   // do nothing
}

答案 3 :(得分:0)

我认为OP正在寻找一段类似于singleton init的代码。即:只创建一次单例,然后返回指针。

void Init() {
  static bool isInitialized = false;
  if (!isInitialized) {
    isInitialized = true;
    doRealInit();
  }
}

std::call_once完成同样的评论建议:

std::once_flag flag;
void do_once() {
  std::call_once(flag, [](){ std::cout << "Called once" << std::endl; });
}

在我看来,它不是更具可读性或更短。

答案 4 :(得分:0)

我认为最合适的迭代语句是do-while。它允许至少一次迭代

例如

do
{
   std::cout << "Enter your word: ";

   std::string answer;
   std::cin >> answer;

   // some other stuff
} while ( false );

或者

bool allow = true;
do
{
   std::cout << "Enter your word: ";

   std::string answer;
   std::cin >> answer;

   // some other stuff
} while ( allow = !allow );