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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

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

Java

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

Q&A

解決済

4回答

1940閲覧

for文とif 文の組み合わせ

sankakusan

総合スコア22

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

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

Java

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

0グッド

1クリップ

投稿2017/09/28 06:51

import

1 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner a = new Scanner(System.in); 6 int N = a.nextInt(); 7 int sc = 0; 8 int bc = 0; 9 for (int n = 0; n < N; n++){ 10 String s_n = a.nextLine(); 11 if (s_n.equals("strike")){ 12 System.out.println("strike!"); 13 sc += 1; 14 } 15 else { 16 System.out.println("ball!"); 17 bc += 1;} 18 } 19 if (sc == 3) System.out.println("out!"); 20 if (bc == 4) System.out.println("fourball!"); 21 } 22 }

N回数分入力された文字列の判定を行たいのですが1回目の判定が2回出力されてしまいます。
具体的には以下の通りです。
出力したい文字
ball!
strike!
ball!
strike!
出力される文字
ball!
ball!
strike!
ball!
strike!
なぜこうなってしまうのかわかりません。
どなたかご教授ください。

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

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

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

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

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

guest

回答4

0

原因は既にseastar3さんが指摘されている通りだと思います。
しかし題材が題材なだけに、そもそもNの入力を受け付ける必要がないのでは?

Java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner scanner = new Scanner(System.in); 6 7 int sc = 0, bc = 0; 8 while(true) { 9 String s_n = scanner.nextLine(); 10 11 if (s_n.equals("s")) { 12 System.out.println("strike!"); 13 sc += 1; 14 } 15 else if (s_n.equals("f")) { 16 System.out.println("foul!"); 17 sc = Math.min(++sc, 2); 18 } 19 else { 20 System.out.println("ball!"); 21 bc += 1; 22 } 23 System.out.println(sc + " " + bc); 24 25 if (sc == 3) { 26 System.out.println("out!"); 27 break; 28 } 29 if (bc == 4) { 30 System.out.println("fourball!"); 31 break; 32 } 33 } 34 } 35}

実行例

s strike! 1 0 f foul! 2 0 f foul! 2 0 b ball! 2 1 b ball! 2 2 f foul! 2 2 s strike! 3 2 out!

投稿2017/09/28 07:07

編集2017/09/28 07:13
LouiS0616

総合スコア35660

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

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

sankakusan

2017/09/28 08:07

Nはfor文の条件に使う予定でしたがご提示いただいたコードの ほうがスマートで正解なのですね。 私の書いたコードは誤作動を起こしましたし、、、 とても勉強になりました。ありがとうございます。
guest

0

私も連続読み込みで矛盾がおきたことがあります。

記事「JavaのScannerとか.nextLine()の挙動をよく分かってなかった話
のような挙動です。解決策も出ていますのでご参考に。

投稿2017/09/28 07:03

seastar3

総合スコア2285

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

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

sankakusan

2017/09/28 08:08

ご回答いただきありがとうございました。 とても参考になりました。 じっくりと読ませていただきます。
guest

0

ベストアンサー

不可思議な挙動をするように見えるのは、最初に回数を入力する際のキー入力が2回に分けて使われているからです。
何が起きているのか、順にみていきましょう。

質問のプログラムを起動して、キーボードで 4↓ と入力します( "↓"は、改行(Enter)キー)
そうするとScannerのバッファには、"4\n" というデータが入ります。("\n"は改行文字)

続いてnextIntメソッドで

  1. 最初の文字 "4"は数字なので、取り出して数字に変換するための文字列(nextIntのコード中にある)に入れておく。
  2. 2文字目は"\n"で数字ではないので、その手前までに得られた"4"という文字を整数 4 に変換して返します。Scannerのバッファには、"\n" というデータが残ります。

次に、nextLineメソッドでバッファに残っている"\n"が返されます。Scannerのバッファは空になります。
"\n"は"Strike"とequalではありませんから、"ball!"が画面に表示されます。(これが1つ目の余分なball!です。)

これ以降は、キーボードから入力されるのがStrikeかballかによって、"strike!"もしくは"ball!"が表示されていきます。

===
質問には「1回目の判定が2回出力されてしまいます」と書かれていますが、実際は1回目の判定の前に"ball!"が出力されているのです。

1回目の余分な"ball!"を出さないようにするには、nextIntメソッドのすぐ後にnextLineメソッドを実行してScannerのバッファを空にします。
具体的には質問のコードの

N = a.nextInt();

N = a.nextInt(); s_n=a.nextLine();

に変えればOK

投稿2017/09/28 07:51

coco_bauer

総合スコア6915

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

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

sankakusan

2017/09/28 08:00

懇切丁寧に解説いただいてありがとうございます。 とてもわかりやすく解決策まで提示していただいて 本当にありがとうございました!
guest

0

入力がこういう形式ではありませんか?

4 ball strike ball strike

この場合、nextIntで読み込んだあとのカーソルが4の直後になるため、最初のnextLineが空文字を返します。
このため、最初のループではelseに入ってしまうため、"ball!"を出力してしまうのです。
elseではなくelse ifで判定するなり、読み捨てするなりなどが必要です。

投稿2017/09/28 07:12

swordone

総合スコア20651

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

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

sankakusan

2017/09/28 08:03

おっしゃる通りです。 else if で条件をさらに限定して動作を安定させる べきなんですね。勉強になりました。 回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問