8

私はC++を始めたばかりですが、他の言語についての予備知識があります(残念ながらvb少し前に)が、奇妙な苦境にあります。私は非常に多くの IF ステートメントを使用するのが嫌いで、よりクリーンに見えるスイッチ/ケースを使用したいと考えていました。

次のシナリオ(理論的なコード)があるとしましょう:

while(1) {

  //Loop can be conditional or 1, I use it alot, for example in my game
  char something;
  std::cout << "Enter something\n -->";
  std::cin  >> something;

  //Switch to read "something"
  switch(something) {
    case 'a':
      cout << "You entered A, which is correct";
      break;
    case 'b':
      cout << "...";
      break;
  }
}

それが私の問題です。WHILE ループを終了したいとしましょう。2 つの break ステートメントが必要でしょうか?

これは明らかに間違っているように見えます:

case 'a':
  cout << "You entered A, which is correct";
  break;
  break;

だから、'a' で IF ステートメントを実行して break; を使用することしかできませんか? 本当に単純なものが欠けていますか?

これで、今抱えている多くの問題が解決します。

4

9 に答える 9

32

チェックを別の関数にリファクタリングします。

bool is_correct_answer(char input)
{
    switch(input)
    {
    case 'a':
        cout << "You entered A, which is correct";
        return true;
    case 'b':
        cout << "...";
        return false;
    }
    return false;
}

int main()
{
    char input;
    do
    {
        std::cout << "Enter something\n -->";
        std::cin  >> input;
    } while (!is_correct_answer(input));
}
于 2010-05-07T06:55:00.157 に答える
13

case ステートメントの 1 つに設定されている bool 値を while ループでチェックするだけです。

bool done = false;    
while(!done)
{
 char something;
  std::cout << "Enter something\n -->";
  std::cin  >> something;

  //Switch to read "something"
  switch(something) {
    case 'a':
      cout << "You entered A, which is correct";
      done = true; // exit condition here
      break;
    case 'b':
      cout << "...";
      break;
  }
}
于 2010-05-07T04:56:04.343 に答える
5

はい、C および C++ には、「複数のブレーク可能なブロックを終了する」と言う方法がありません (「ブレーク可能なブロック」とは、任意のループまたはスイッチです)。回避策には、gotoとブール変数を使用して、外側の「壊れやすいブロック」も壊れるかどうかを記録することが含まれます (どちらもエレガントではありませんが、それが人生です)。

于 2010-05-07T04:54:36.893 に答える
5

2 つのbreakステートメントでは、while ループから抜け出すことはできません。1つ目はステートメント breakから抜け出すだけで、2 つ目は到達しません。switch

switchステートメントの後のループには何もないと仮定して、while ループの条件を false にする必要があります。スイッチの後に他のコードがある場合は、 の後の状態を確認する必要switchbreakあります。


bool done = false;

while(! done)
{
  // do stuff
  switch(something)
  {
    case 'a':
    done = true;  // exit the loop 
    break;
  }

  //  do this if you have other code besides the switch
  if(done)
   break;  // gets you out of the while loop

  // do whatever needs to be done after the switch

}

于 2010-05-07T04:56:13.970 に答える
3

あなたは試すことができます:

  • フラグの使用
  • 後藤を使う
  • Inner Breakable ブロックを関数にする
  • 例外の使用
  • longjump と setjmp の使用

この質問に非常によく似たトピック

http://www.gamedev.net/community/forums/topic.asp?topic_id=385116

于 2010-05-07T05:09:35.733 に答える
2

C++の名前付きループ イディオムに興味があるかもしれません。

#define named(blockname) goto blockname; \
                         blockname##_skip: if (0) \
                         blockname:

#define break(blockname) goto blockname##_skip;

named(outer)
while(1) {

  //Loop can be conditional or 1, I use it alot, for example in my game
  char something;
  std::cout << "Enter something\n -->";
  std::cin  >> something;

  //Switch to read "something"
  switch(something) {
    case 'a':
      cout << "You entered A, which is correct";
      break(outer);
    case 'b':
      cout << "...";
      break(outer);
  }
}
于 2010-05-09T17:07:09.023 に答える
1

ループを関数にカプセル化し、ケース内で return を呼び出すこともできます。これは、while を分割するフラグでは不十分な場合です。一部の人々にとっては良いプログラミング手法ではありませんが、関数をシンプルに保つのであれば、そうしない理由がわかりません。

于 2010-05-07T04:59:13.997 に答える
0

スイッチを少し過剰に設計された OO ソリューションに置き換えることができます...

#include <iostream>
#include <map>
#include <set>

class input_responder
{
    std::set<char> correct_inputs;
    std::map<char, const char*> wrong_inputs;

public:

    input_responder()
    {
        correct_inputs.insert('a');
        wrong_inputs['b'] = "...";
    }

    bool respond(char input) const
    {
        if (correct_inputs.find(input) != correct_inputs.end())
        {
            std::cout << "You entered " << input << ", which is correct\n";
            return true;
        }
        else
        {
            std::map<char, const char*>::const_iterator it = wrong_inputs.find(input);
            if (it != wrong_inputs.end())
            {
                std::cout << it->second << '\n';
            }
            else
            {
                std::cout << "You entered " << input << ", which is wrong\n";
            }
            return false;
        }
    }
};

int main()
{
    const input_responder responder;
    char input;
    do
    {
        std::cout << "Enter something\n -->";
        std::cin  >> input;
    } while (responder.respond(input) == false);
}
于 2010-05-07T07:38:01.897 に答える
0

スイッチをifsystemに変更できます。とにかく同じものにコンパイルされます。

于 2010-05-07T05:02:00.303 に答える