2016-12-31 17 views
1

私はここで完全に失われています...ロジックは正しく設定されているようですが、whileステートメントの "応答"は現在のコンテキストに存在しないことを示します。私はここで検索し、この文脈で同じ問題を見つけるように思われる。問題は方法に変換されていますか? 1つのスコープ(括弧{ ... }の一般的セット)の中で宣言do whileステートメントからユーザー入力を受け取ります

do 
     { 
      Console.WriteLine("enter a number between 1 and 5"); 
      int x = Convert.ToInt32(Console.ReadLine()); 

      Random r = new Random(); 
      int rr = r.Next(1, 5); 
      Console.WriteLine("Do you want to continue? Please select yes or no."); 
      string response = Convert.ToString(Console.ReadLine()); 
     } while (response == "yes"); 
+5

..:どのようにについてそれぞれの繰り返しではなく、 – Plutonix

+2

ループの中で 'response'を定義すると、どうすればそれを外側からチェックするのですか?ループの前に 'string response'を定義する必要があります – UnholySheep

+1

レスポンスは実際には{}の範囲外には見えません。それ以前に宣言してください –

答えて

6

変数は、その範囲の外でアクセスできません。あなたは の内側にループを宣言しました。ループ外にresponseを宣言する必要があります。

また、文字列の空白を比較する前に、String.Trim()を使用して空白をトリミングする必要があります。そうしないと、最後に改行文字(\n)があるため、比較が失敗します。

string response; 

do { 
    //... 

    response = Console.ReadLine().Trim(); 
} while (response == "yes"); 
1

応答変数はループのコンテキスト内にありません。変数宣言をループ外に移動するだけで、次のようになります。

 string response = String.Empty; 

     do 
     { 
      Console.WriteLine("enter a number between 1 and 5"); 
      int x = Convert.ToInt32(Console.ReadLine()); 

      Random r = new Random(); 
      int rr = r.Next(1, 5); 
      Console.WriteLine("Do you want to continue? Please select yes or no."); 
      response = Convert.ToString(Console.ReadLine()); 
     } while (response == "yes"); 
+2

この回答は何を追加していますか? –

+1

繰り返しごとに新しいランダムを作成する必要はありません。その悪い習慣。 Convert.ToStringは必要ありません。 – Plutonix

+0

@Plutonix - あなたは正しいですが、中括弧の内側でのみ使用されるローカル変数は、中括弧内で宣言して範囲を制限する必要があります。コンパイラはこれをできるだけ効率的にするのに十分スマートです。 – Joe

0

これを少しカプセル化すると役立つでしょう。また、おそらくループ全体のために1つのランダムなインスタンスを作成したいことは、それが存在する場合一般的にインデントの新しいレベルは、新しいブロックスコープを作成しているので、あなたは、 `ループ内response`を宣言

static void Main(string[] args) 
    { 
     Random rand = new Random(); 
     do 
     { 
      Write("enter a number between 1 and 5"); 
      string response = Console.ReadLine(); 
      int x = 5; 
      if (Validate(response, "1-5")) int.TryParse(response, out x);     
      Write(rand.Next(0,x)); 
      Write("Do you want to continue? Please select yes or no.");     
     } while (Validate(Console.ReadLine().ToLower(), "yes")); 
    } 
    static void Write(string s) => Console.WriteLine(s); 
    static bool Validate(string s, string Pattern) => Regex.Match(s, Pattern).Success; 
+0

乱数を入力するたびに新しい乱数オブジェクトを作成するのは間違っています。 –

+0

私は彼らが提供したコードで作業しているので、他のすべての人に投票してもらいたいと思います。とにかく、これは処理時間やメモリには何の影響も与えませんが、GCがこれを収集する必要があるため、それぞれの呼び出しとシステムがユーザーの応答を待ち、必要に応じてアイドル状態になります... –

+0

私は実際にあなたが間違っていると信じていますが、私はあなたのお勧めに会ったと信じています。適切なOOPに続いて、私が行ったように、ランダム化をメソッドにカプセル化する方が良いでしょう。ループの目的はユーザーの入力を集めることであるため、できる限りきれいに保つ必要があります。入力の処理は別の場所で処理する必要があります。メソッドへの呼び出しごとに新しいRandomを作成しても問題ありませんが、ループ自体の内部では作成しないでください。これにより、参照が解放されないためGCが収集されなくなります。しかし、独自のメソッドでは、それぞれの呼び出しと戻り値とともに解放されます。 –

関連する問題