0

C++ を使用する シーケンスを 1 回だけ実行するための最善の方法は何でしょうか? たとえば、文字列を推測する必要があるプログラムがあることを明確にするために、ユーザーがヒントを入力した場合、単語のヒントを表示しますが、一度しか許可しません...現在これを行っています:

   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;
    }

これを行うためのより良いステートメントはありますか?それともすでに最高ですか?

4

5 に答える 5

3

あなたは物事を分析しすぎているか、実際の問題を十分に説明していないのではないかと思います。あなたが投稿したコードから、実行したいコードを関数にラップしてから、その関数を 1 回だけ呼び出すべきではない理由はわかりません。

void blahBlah()
{
  // blah blah
}

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

おそらく、あなたのプログラムには、プログラムの終了まで実行されるメインループがあり、そのループでユーザーからの入力を受け入れるということです。ユーザーはヒントを求めることができますが、プログラムの実行中に 1 回だけです。最初にヒントを要求すると、ヒントが与えられますが、それ以降は与えられません。

私は今でも、空想よりも単純なものの方が優れていると信じています(複雑なものを読んでください)。そのために、メインループの外側にスコープを設定することから始め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;
      } 
    } 
  }
}
于 2013-11-08T14:38:01.463 に答える
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()と、必要に応じて表示されます (または表示されません)。

トリックは、変数がグローバル (またはほとんど同じように見えるクラス内の静的) であることを確認して、ループ中またはプログラムの実行中にリセットされないようにすることです。

実行間で保持する必要がある場合は、ファイルへの書き込み、サーバーのチェック、レジストリ キーの設定、またはその他の任意の数のオプションを実行できます。

于 2013-11-08T14:42:55.153 に答える
0

最も適切な繰り返しステートメントは do-while だと思います。少なくとも 1 回の繰り返しが可能です

例えば

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 );
于 2013-11-08T14:49:27.753 に答える
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
}
于 2013-11-08T14:38:37.623 に答える
0

OPはシングルトン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; });
}

私の意見では、実際には読みやすくも短くもありません。

于 2013-11-08T14:42:57.067 に答える