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

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

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

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

Q&A

解決済

3回答

1695閲覧

選択式のif文で例外の入力をした場合、再度入力する処理をしたい

GUCHY_MZD

総合スコア2

C#

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

0グッド

0クリップ

投稿2021/09/13 07:18

編集2021/09/13 07:45

visualStudio2017のコンソール環境です。

if文で1か0以外の数値を入力したときにもう一度、入力ができる状態にして
数値を再度入力できるようにしたいです。

Console.WriteLine("○○を行うには[1]を入力 "); Console.WriteLine("XXを行うには[0]を入力 "); int x; x = int.Parse(Console.ReadLine()); //1を入力して行う処理 if (x == 1) {処理文} //0を入力して行う処理 else if (x == 0) {処理文} //正しい数値を入力するまで、繰り返す else { Console.WriteLine("正しい数値を入力してください"); Console.ReadKey(); }

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

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

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

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

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

BeatStar

2021/09/13 07:24 編集

せめてインデント( Tabキーや半角スペースでやるアレ ) をちゃんとやろうよ…… 今のままだと非常に読みづらいです。 修正できるので修正してください。
YAmaGNZ

2021/09/13 07:30 編集

forではなくwhileでループすればよろしいかと
fana

2021/09/13 07:38

まず,提示されてるコード内に "for" が無いんだけど…???
BeatStar

2021/09/13 07:48

せめてインデント( Tabキーや半角スペースでやるアレ ) をちゃんとやろうよ…… 今のままだと非常に読みづらいです。 (二回目)
dodox86

2021/09/13 07:52 編集

恐らくint.ParseでExceptionがthrowされるような事態にも対応させたいのだと思いますが、質問の記載内容が「やりたいこと」を書いているだけなので、きびしいようですが回答は様子見です。
guest

回答3

0

ベストアンサー

単純に,所望の値になったことをループの終了条件とすればよい.

CSharp

1int x; 2{//xの入力処理 3 for( x=-1; (x!=0 && x!=1); /*NOP*/ ) 4 { 5 Console.WriteLine( "入力されたし" ); 6 if( int.TryParse( Console.ReadLine(), out x ) == false ){ x =-1; } 7 } 8}

話が「if文で」に変わったみたいなので,判定にifを使うものを追記しておく.
入力処理だけをメソッドに切り出してみた.

CSharp

1//ユーザに0か1を入力させる処理. 2//それ以外のときは入力をやり直させる.永久に. 3//0か1が入力されたなら,入力された値(すなわち0か1のいずれか)を返す. 4public static int Input_O_or_1() 5{ 6 while( true ) 7 { 8 Console.WriteLine( "入力されたし" ); 9 int input; 10 if( int.TryParse( Console.ReadLine(), out input ) && (input==0 || input==1) ) 11 { return input; } 12 } 13} 14 15//Main 16public static void Main(string[] args) 17{ 18 int x = Input_O_or_1(); //入力処理 19 if( x == 0 ) 20 { 21 //0が入力された時の処理 22 } 23 else 24 { 25 //1が入力されたときの処理 26 } 27 28 //... 29}

投稿2021/09/13 07:51

編集2021/09/13 08:04
fana

総合スコア11645

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

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

fana

2021/09/13 07:52

あれ? 「forで」って話じゃなくなってるじゃん…
fana

2021/09/13 08:07

int.Parse だと例外が面倒なので int.TryParse を使う形にした.
guest

0

多分、プログラミングがなんたるかを理解していない気がします。

プログラミングは「こう書けばいい」…ではなく、「プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である」です。

つまり、「現実世界のシミュレーション」です。

まず、C#云々を置いといて、「手作業でやるならどうするか」を考えてみてください。
裏方処理でもいいです。とにかく現実世界でやるならどうするか。です。

今回の質問でのやりたいことを言い換えると、

[やりたい事] 1. 処理A, 2. 処理B という定義がある。 ある人(Aさん)が数字を言うため、それぞれの処理をする必要があります。 たとえば、Aさんが1と言えば 処理Aをし、 2と言えば、処理Bをする。 ただし、この候補にない数字が言われたら、候補にある数字が言われるまで聞き返しなさい。

でしょうか。(別の言い方とかでもいいけど)

つまり、

あなた: 「どの処理をする?」
Aさん: 「3」
あなた: (無いっすね…)「どの処理をする?」
Aさん: 「4」
あなた: (無いっすね…)「どの処理をする?」
Aさん: 「2」
あなた: (あった…) → 処理Aをする

みたいな感じでしょうか。

で、「候補にない数字が言われたら、候補にある数字を言うまで繰り返す」系だと、複雑ですね。

では、言い換えてみましょう。

候補にない数字が言われたら、候補にある数字を言うまで繰り返すを言い換えると、
候補にある数字が言われるまで繰り返す」とできませんか?

この言い換えたもので考えると、

1. 候補にある数字が言われるまで繰り返す 1.1. 質問をする

的に見えませんか?

処理A,B,... を何度も行うっていうのなら、(1)の中( (1.2)とか )でやると思いますが、今回は「候補にあるものが指定されるまで繰り返す」なのでおそらく、

1. 候補にある数字が言われるまで繰り返す 1.1. 質問をする 2. (ここまで来たら候補にあるものが指定されているので) 指定の処理をする

とかみたいになるかと思います。

(1)についてですが、これは数直線を考えるとわかりやすいですよ。

これが「"test", "run", "compile"のうちで…」とかみたいに文字列で比較する場合はちょっと工夫が必要ですが、今回は1~3とかのような数字なので。

もし1~3 であれば、 数直線を書いてみて、1と3にそれぞれ含んだ状態で囲ってみてください。

そうすると、1≦範囲≦3 のような状態になるはずです。
で、これって、「(範囲は)1より大きく、3以下である」ですよね。

もうちょっと見てみると、「範囲は1より大きい」かつ「範囲は3未満」みたいに見えますね。
(数Aの集合と論理の「かつ」「または」とかが分かっていればわかるはず)

なので、

条件式: 数字が1以上 かつ 数字が3以下

と解釈できますね。

かつ/または に関しては論理演算子を調べるといいですよ。

この論理演算子で繋げて、「数字が1以上 かつ 数字が3以下」を条件式にしたループ系の処理をすればいいだけです。((1)の場合)

(1.1) は単純に聞けばいいだけですね。

ただ、(1)の場合はトリッキーな方法も取れますね。(厳密には(1)と(1.2)とか?)

それは、「あえて何度も聞くつもりで、特定の条件が満たされたら終了する」ですかね。
(終了するではなく、処理をするとかでもいいですが)

つまり、あえて無限ループにして、遅延状態で、「条件分岐させる」とか。

コードにすると、

C#

1while( true ){ 2 // なんらかの処理 3 4 if( /* ループを抜ける条件 */ ) break; 5}

のようにするとかですね。(「何らかの処理」はif文の後に来たりすることもあるが)

whileの条件式をtrueにしているのは、「while文 等は 条件式が満たされている間繰り返すから」ですね。

投稿2021/09/13 08:22

BeatStar

総合スコア4958

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

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

0

全体をWhileなどのループで囲って、正常に入力できたら、breakでループから抜けるようにしましょう

投稿2021/09/13 07:44

y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問