質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

313閲覧

繰り返し処理がうまくいかない

SeiMei

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/01/05 11:36

C#

1using System; 2 3namespace RPG経験値計算 4{ 5 class Program 6 { 7 string input; 8 int Lv; 9 int OneUpExp; 10 int AllExp; 11 bool End; 12 bool IntegerIsEntered; 13 14 static void Main() 15 { 16 Program p = new Program(); 17 Console.WriteLine("終了したい場合はendを、経験値の計算をしたい場合は整数を入力してください"); 18 while (!p.End) 19 { 20 p.Input(); 21 if (p.IntegerIsEntered) 22 { 23 p.Calculation(); 24 p.Output(); 25 } 26 } 27 } 28 29 void Input() 30 { 31 input = Console.ReadLine(); 32 if (input.Contains("end")) End = true; 33 else if (int.TryParse(input, out Lv)) IntegerIsEntered = true; 34 else 35 { 36 Console.WriteLine("endまたは整数を入力してください"); 37 IntegerIsEntered = false; 38 } 39 } 40 41 void Calculation() 42 { 43 AllExp = Lv * Lv * 1000; 44 OneUpExp = Lv * Lv * 1000; 45 Lv--; 46 OneUpExp -= Lv * Lv * 1000; 47 } 48 49 void Output() 50 { 51 Console.Write("レベルを1つ上げるために必要な経験値:"); 52 Console.WriteLine(OneUpExp); 53 54 Console.Write("このレベルに達するために必要な経験値"); 55 Console.WriteLine(AllExp); 56 Console.ReadKey(); 57 } 58 } 59}

これを実行してから整数を1度入力すると、次にendもしくは整数を入力した時の反応がおかしい

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Console.ReadKey();

これはなんのために入れてるんでしょうか。
ここでキー入力を読み捨ててるため、次のReadLineでおかしくなってますね

投稿2019/01/05 11:46

編集2019/01/05 11:48
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SeiMei

2019/01/05 11:51

繰り返し処理をする前はそれを入れないとWriteが表示されずに消えてしまうので入れていました 助かりました、ありがとうございます
guest

0

結論

いろいろ間違ったこと書いてすいませんでした。
他の方が指摘しているとおり、Console.ReadKey(); を削除するだけで済みますね。

そのほか

今回のご質問とは直接関係ない点になりますが、ご参考までに。

endがtrueになったら終了するのでfalseにする必要はありません

であれば、 End フィールドを廃止して、以下のようにしてしまった方が、
シンプルかもしれません。

C#

1 while (p.Input()) 2 { 3 if (p.IntegerIsEntered) 4 { 5 p.Calculation(); 6 p.Output(); 7 } 8 } 9 10// ~ 中略 ~ 11 bool Input() 12 { 13 bool End; 14 15 input = Console.ReadLine(); 16 IntegerIsEntered = int.TryParse(input, out Lv); 17 End = input.Contains("end"); 18 19 if(!( End || IntegerIsEntered )) Console.WriteLine("endまたは整数を入力してください"); 20 21 return !End; 22 }

投稿2019/01/05 13:36

編集2019/01/05 15:46
kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SeiMei

2019/01/05 14:20

>>「end でなかった場合」「数値でなかった場合」の処理がありません。 あります while (!p.End)//これと else//これです { Console.WriteLine("endまたは整数を入力してください"); IntegerIsEntered = false; } >>IntegerIsEntered を false にする処理が無いため これもあります >>入力がそれぞれの条件を満たさない場合は対応するフィールドが false になるようにしました。 endがtrueになったら終了するのでfalseにする必要はありません >>フィールドの初期化が全く行われていません。 http://www.woodensoldier.info/computer/csharptips/16.htm これを見てください >>メッセージの出力タイミングが不適切 毎回表示されると見づらいのでわざと最初に表示させています >>ReadKey()関数の読み込み状態(何らかのキーが押されるのを待っている状態) にあることを示すメッセージを追加します。 y_waiwaiさんの回答とそれに対する私の返答を見てください
kozuchi

2019/01/05 15:13

ご指摘ありがとうございます。 なるべく早く回答の内容を修正させていただきたいと思います。 いろいろ間違ったことを書いてすいませんでした。 > > >>「end でなかった場合」「数値でなかった場合」の処理がありません。 > あります > ~ > >>IntegerIsEntered を false にする処理が無いため > これもあります ご指摘のとおりです。 コーディングスタイルが自分とかなり違うので間違えて読んでいたようです。 すいません。 > > >>入力がそれぞれの条件を満たさない場合は対応するフィールドが false になるようにしました。 > endがtrueになったら終了するのでfalseにする必要はありません この点に関しては、関数の独立性を保つため Input()関数の機能は「入力を読み取って結果をフィールドに反映する」に とどめるべきで、上位の処理を考慮に入れるべきではないと考えますが、 今回の質問に限定して考えるならば、end を false にしていないことの 修正は無関係なので、その他の問題として挙げることにします。 > > >>フィールドの初期化が全く行われていません。 > http://www.woodensoldier.info/computer/csharptips/16.htm > これを見てください すいません、Java と C# を行き来してるため勘違いしていたようです。 まったくの勘違いです。 > > >>メッセージの出力タイミングが不適切 > 毎回表示されると見づらいのでわざと最初に表示させています すいません、これは今一つ意味が理解できません。 とりあえず、最初に一回だけ表示させるのはマストの仕様ということで理解しておきます。 > >>ReadKey()関数の読み込み状態(何らかのキーが押されるのを待っている状態) > にあることを示すメッセージを追加します。 > y_waiwaiさんの回答とそれに対する私の返答を見てください 了解です。
guest

0

end を入力しておかしいのは、

p.Input();

を抜けた時に、 p.End を見ていないから、前の入力値を元に処理が進むため。

次に整数を入力した時は、ちょっと分からないですね。

とりあえず。

投稿2019/01/05 11:50

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問