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

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

新規登録して質問してみよう
ただいま回答率
85.37%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

3回答

1086閲覧

数字当てゲームにおける入力の指定

hokka

総合スコア1

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2021/08/28 13:35

前提・実現したいこと

#Java 数字当てコードを練習として書いています。
そこで、数値以外の入力をされた時に、
『数値を入力してください』と表示したいのですが、
いい方法が思い浮かびません。
以下のコードに追記するとしたら、
どのようにしたら良いのでしょうか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Java

1public class kazuate { 2 public static void main(String args[]) { 3 int answer = new Random().nextInt(100); 4 int count = 0; 5 6 while(true){ 7 count += 1; 8 Scanner sc = new Scanner(System.in); 9 int x = sc.nextInt(); 10 if(x == answer) { 11 System.out.println("正解です。あなたは正解までに"+count+"回かかりました"); 12 break; 13 } else if(x < answer) { 14 System.out.println("不正解せす。もっと大きい数値です。"); 15 } else if(x > answer) { 16 System.out.println("不正解せす。もっと小さい数値です。"); 17 } 18 } 19 } 20}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

YT0014

2021/08/29 02:17

ご質問の内容を見る限り、if、whileのタグは不要と思えます。 両タグの削除をお願いします。
YT0014

2021/08/29 02:22

数値以外の入力を、実際に試してみましたか? 試されたのなら、起こった現象をご提示ください。 「思いつかない」とのことですが、何が起こるのかを把握していないのも、原因の1つかと思いますので。
guest

回答3

0

ベストアンサー

hasNextInt を使ってみました。

Java

1import java.util.Scanner; 2import java.util.Random; 3 4class Main { 5 public static void main(String args[]) { 6 int answer = new Random().nextInt(100); 7 int count = 0; 8 Scanner sc = new Scanner(System.in); 9 10 while (true) { 11 if (sc.hasNextInt()) { 12 count++; 13 int x = sc.nextInt(); 14 if (x == answer) { 15 System.out.println("正解です。あなたは正解までに" 16 + count + "回かかりました"); 17 break; 18 } else if (x < answer) { 19 System.out.println("不正解です。もっと大きい数値です。"); 20 } else if (x > answer) { 21 System.out.println("不正解です。もっと小さい数値です。"); 22 } 23 } 24 else { 25 System.out.println("数値を入力してください。"); 26 sc.next(); 27 } 28 } 29 } 30}

不正な文字列は next で読み飛ばします。

1つの標準入力 System.in に対して、1つの Scanner しか生成してはいけません。
すなわち、ループの中で new Scanner(System.in) を実行してはいけません。
たまたま上手く行っているように見えるのは、標準入力がキーボードだからです。
標準入力をファイルにリダイレクトすると破綻します。

投稿2021/08/28 15:37

kazuma-s

総合スコア8224

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

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

hokka

2021/08/30 14:11

実行できました。 理解するためにhasNextIntを学習してみます。 まだ初学者ゆえ、elseがif関数の外にある理由がわかりませんでした。 頑張ってみます。この度はありがとうございました。
kazuma-s

2021/08/30 14:26

if は「関数」ではありません。if で始まるのは「文」です。 if文は「if (式) 文」または「if (式) 文 else 文」という構文です。 前者では、「式」の値が true だったら「文」を実行する。後者では、 「式」の値が true だったら最初の「文」を実行し、false だったら最後の「文」を実行する。 if文については、入門書をよく読んでください。
hokka

2021/08/30 14:35

なるほどですね。 大変恐縮ですが、ついでにお聞きしたく、 条件分岐が3つあり、それ以外であればelseで処理している構造ですが、 if (sc.hasNextInt()) {は何の役目を果たしているのでしょうか。
kazuma-s

2021/08/30 23:36

> 条件分岐が3つあり、それ以外であればelseで処理している構造ですが、 else は 3番目の条件である「if (x > answer)」の else ではありません。 else は「if (sc.hasNextInt())」に対応するものです。 > if (sc.hasNextInt()) {は何の役目を果たしているのでしょうか。 入力が数値であるかどうかの検出です。 数値以外の入力があれば else の後の文を実行します。
hokka

2021/08/31 14:05

なるほどですね。大変勉強になります。 お時間を割いて教えていただきまして、 ありがとうございます。
guest

0

スキャナで取得した値を指定したデータ型の値として取得する
上記を参考に例外処理で対応すればよろしのではないでしょうか?
ループはcontinuで途中で抜ければいいと思います。

java

1Scanner sc = new Scanner(System.in); 2 3try{ 4 int x = sc.nextInt(); 5}catch (InputMismatchException e){ 6 System.out.println("数値を入力してください"); 7 sc.next(); 8 continue; 9} 10count += 1;

投稿2021/08/28 14:50

編集2021/08/29 06:22
gasyu

総合スコア7

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

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

hokka

2021/08/30 14:45

上記でいうところの、elseの部分でしょうか?
guest

0

こんなのでいいのではないでしょうか?

Java

1 if(x == null) { 2 System.out.println("数値を入力してください") 3 }

投稿2021/08/28 14:05

Ftps

総合スコア295

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

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

YT0014

2021/08/29 02:15

xはint型の変数なので、javaでは、nullになることはありません。 コンパイルエラーの可能性もありますが、通ったとしても、デッドコードです。
Ftps

2021/08/29 12:26

あ、ほんとだ。 本当にごめんなさい。あとありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問