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

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

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

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

if

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

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

5回答

1938閲覧

for 文なのか if else 文 なのか

JUN1207

総合スコア15

for

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

if

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

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

1クリップ

投稿2020/03/19 05:22

編集2020/03/19 07:31

タイトルの通りです。

以下、ループと条件分岐の練習プログラムです。

『for』文にて条件分岐のプログラムができないかと試行錯誤しています。
いまの自分のプログラムだと、表示された結果が指定した回数表示されます。

まずは、これを『for』文で入力を繰り返すように書き換えたいです。

はたまた、『if else』文で書いたほうがいいのか。

詳しい方がいらっしゃったらお力をお貸しください。

よろしくお願いいたします。

追記
学習教材は『スッキリわかるJava入門』をGoogle検索です。

Java

1package practice; 2 3import java.util.Scanner; 4 5public class Practice7 { 6 public static void main(String[]args) { 7 8 //性別を入力し、正しければ「確認できました」と表示し、 9    //5回間違えれば「いい加減にしてください」と表示 10 11 System.out.println("性別を入力してください。"); 12 13 Scanner scanner = new Scanner(System.in); 14 String gender = scanner.nextLine(); 15 16 for(int i = 0; i < 5; i++ ) { 17 if (!(gender.matches("男||おとこ||boy||BOY||Boy||女||おんな||girl||Girl||GIRL"))) { 18 System.out.println("いい加減にしてください。"); 19 continue; 20 }else{ 21 System.out.println("確認できました。"); 22 23 scanner.close(); 24 } 25 26 } 27} 28}

以下、修正したプログラムです。

Java

1package practice; 2 3import java.util.Scanner; 4 5public class Practice7 { 6 public static void main(String[]args) { 7 8 //性別を入力し、正しければ「確認できました」と表示し、5回間違えれば「いい加減にしてください」と表示 9 10 System.out.println("性別を入力してください。"); 11 12 Scanner scanner = new Scanner(System.in); 13 String gender = scanner.nextLine(); 14 15 int i = 1; 16 17 do { 18 if (!(gender.matches("男||おとこ||boy||BOY||Boy||女||おんな||girl||Girl||GIRL"))) { 19 System.out.println("正しく入力してください。"); 20 }else{ 21 System.out.println("確認できました。"); 22 } 23 System.out.println("性別を入力してください。"); 24 i++; 25 gender = scanner.nextLine(); 26 }while( i < 5); 27 System.out.println("いい加減にしてください。"); 28 29 scanner.close(); 30 } 31 }

以下、修正したプログラムです。

Java

1package practice; 2 3import java.util.Scanner; 4 5public class Practice72 { 6 public static void main(String[]args) { 7 8 //性別を入力し、正しければ「確認できました」と表示し、5回間違えれば「いい加減にしてください」と表示 9 10 String gender = null; //『null』=『何もしめさない。』 11 12 Scanner scanner = new Scanner(System.in); 13 14 15 16 do { 17 if (!(gender == null)) { 18 System.out.println("正しく入力してください。"); 19 } 20 System.out.println("性別を入力してください。"); 21 gender = scanner.nextLine(); 22 } while (!gender.matches("boy||男||girl||女")); 23 System.out.println("確認できました。"); 24 25 scanner.close(); 26} 27}

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

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

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

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

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

guest

回答5

0

僕ならこうする。

Java

1package practice; 2 3import java.util.Scanner; 4 5public class Practice7 { 6 7 public static void main(String[]args) { 8 9 //性別を入力し、正しければ「確認できました」と表示し、 10 //5回間違えれば「いい加減にしてください」と表示 11 12 Scanner scanner = new Scanner(System.in); 13 14 int trials = 0; // 試行回数 15 while ( trials < 5 ) { 16 System.out.println("性別を入力してください。"); 17 String gender = scanner.nextLine(); 18 if (!(gender.matches("男|おとこ|boy|BOY|Boy|女|おんな|girl|Girl|GIRL"))) { 19 if ( ++trials >= 5 ) { // 試行回数を+1し、5回に達したら... 20 System.out.println("いい加減にしてください。"); 21 break; 22 } 23 } else { 24 System.out.println("確認できました。"); 25 break; 26 } 27 } 28 scanner.close(); 29 } 30}

投稿2020/03/19 10:47

episteme

総合スコア16612

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

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

kazuma-s

2020/03/19 12:22

while ( trials < 5 ) { の trials < 5 は常に true なので、while (true) { でよいでしょう。
episteme

2020/03/19 12:39

あ、ホントだ。 あるいは break しなくていいスね。
JUN1207

2020/03/22 23:04

@epistemeさん、@kazuma-sさん ソースとその補足、ありがとうございます。 こちらのソースを実際に書いて実行し、一つ一つ、理解していこうと思います。
guest

0

メソッドを分けたり enum にしてみたりと...
これでは入門の練習にはならないですね...

java

1import java.util.*; 2import java.util.regex.*; 3 4public class Main { 5 public static void main(String[] args) { 6 Gender gender = inputGender("性別を入力してください。", 5); 7 System.out.println(gender!=null?gender+":確認できました。":"いい加減にしてください。"); 8 } 9 enum Gender { 10 Boy("男|おとこ|[Bb]oy|BOY"), 11 Girl("女|おんな|[Gg]irl|GIRL"); 12 private final Pattern pattern; 13 Gender(String regex) { 14 this.pattern = Pattern.compile(regex); 15 } 16 boolean matches(String s) { 17 return pattern.matcher(s).matches(); 18 } 19 static Gender from(String s) { 20 if(Boy.matches(s)) return Boy; 21 if(Girl.matches(s)) return Girl; 22 return null; 23 } 24 } 25 public static Gender inputGender(String prompt, int retry) { 26 Gender gender = null; 27 try(Scanner scanner = new Scanner(System.in);) { 28 for(int i=0; i<retry && gender==null; i++) { 29 System.out.println(prompt); 30 gender = Gender.from(scanner.nextLine()); 31 } 32 } 33 return gender; 34 } 35}

一応解説など.

まず, オリジナルでは変数 gender は String 型でしたが, 代わりとなる Gender 型というのを enum で作りました. ( enum Gender { ~ } の部分)
String 型の変数であれば "男" でも "Girl" でも "123" でも null でも入りますが, この Gender 型の変数には Gender.Boy, Gender.Girl そして null の3種類しか入りません.
inputGender メソッドが(中でリトライ等ごにょごにょして)最終結果をこの Gender 型で返すということにすることで, リトライ回数以内に正しく性別が入力されたら Boy か Girl, 入力されなかったら null が返る...という仕様に出来, main メソッドではそれによって null で無ければ性別と"確認できました", null だったら "いい加減に~" と表示しています.

さてその inputGender ですが, パラメータとして入力を促すプロンプト文字列("性別を~")とリトライ回数(5)を貰っています. こうすることで, 例えばリトライを 3 回にしよう等の修正の時, 下位のコードを見ること無くこのパラメータを変えるだけで済みます.

変数 gender を用意し, 標準入力から取り込む Scanner も準備します. ( try(Scanner scanner = new ~ ) { ~ } となっているのは, 一応終了時に scanner を close するためです.)

入力判定・リトライは for(int i=0; i<retry && gender==null; i++) で行い, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない" ならループする」としています.

ループの中では, プロンプトを表示し, 標準入力からの一行( nextLine() )を Gender 型の from メソッドに渡して, Gender 型に変換(もしくは失敗すれば null) しています.

Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )なら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.

Boy や Girl の matches メソッドは, それぞれが予めコンストラクタのパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.

for 文のループ条件が成立する(ループし続ける)のは, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない"」でした.
変数 gender は初期値 null で, ループしている間に入力によって Boy か Girl に設定されると gender == null が成立しなくなり, ループを抜けます. 一方, 何回やっても Boy か Girl にならず i がリトライ回数に達すると, gender = null のままでループを抜けます.
こうして最後の return は, リトライ以内で Boy/Girl となるか, ならずにリトライを終え null のままの gender を返すことで, 最初の inputGender の仕様通りの結果を返すことになります.

投稿2020/03/19 19:45

編集2020/03/23 00:55
jimbe

総合スコア13209

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

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

JUN1207

2020/03/22 12:53

@jimbeさん コードありがとうございます。 こちらのコードは今の私の力では難しくて理解できませんでした。 勉強させて頂きます!! ありがとうございます!!
guest

0

なぜ | の代わりに || を使うんでしょうか?
そんなことをすると、入力が Enter だけのとき「確認できました。」になりますよ。

Java

1package practice; 2 3import java.util.Scanner; 4 5public class Practice7 { 6 public static void main(String[]args) { 7 Scanner scanner = new Scanner(System.in); 8 String s = "男|おとこ|boy|BOY|Boy|女|おんな|girl|Girl|GIRL"; 9 int i; 10 for (i = 0; i < 5; i++) { 11 System.out.println("性別を入力してください。"); 12 String gender = scanner.nextLine(); 13 if (gender.matches(s)) break; 14 } 15 if (i < 5) System.out.println("確認できました。"); 16 else System.out.println("いい加減にしてください。"); 17 } 18}

投稿2020/03/19 09:06

kazuma-s

総合スコア8224

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

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

JUN1207

2020/03/22 23:07

@kazuma-sさん ソースと指摘、ありがとうございます。 「||」でソースを実行しましたら、入力が「Enter」以外(指定した文字を入力した時)でも「確認できました。」表示になりました。 「||」と「|」の違いがよくわかっていないので調べます。
kazuma-s

2020/03/23 02:17

|| という一つの特殊文字はありません。 "boy||BOY" は、"boy" または "" または "BOY" だということです。
guest

0

もっと短くわかりやすい書き方あるかもしれませんが、
もともとのソースをなるべく崩さない形で書きました。
(そのほうが考え方が近くより理解が深まると思ったので・・・)

処理の流れについていまいちまだ理解されていないと思うので、
デバッグで1行ずつ追ったほうがより理解が深まるかと思います。

修正、追加されている部分を確認して、不明点等あればご質問ください。

java

1 //性別を入力し、正しければ「確認できました」と表示し、 2 //5回間違えれば「いい加減にしてください」と表示 3 4// System.out.println("性別を入力してください。"); 5 6// scanner = new Scanner(System.in); 7// String gender = scanner.nextLine(); 8 9 Scanner scanner = new Scanner(System.in); 10 11 for(int i = 0; i < 5; i++ ) { 12 System.out.println("性別を入力してください。"); 13 14 String gender = scanner.nextLine(); 15 16// if (!(gender.matches("男||おとこ||boy||BOY||Boy||女||おんな||girl||Girl||GIRL"))) { 17// System.out.println("いい加減にしてください。"); 18// continue; 19// }else{ 20// System.out.println("確認できました。"); 21// } 22 if (gender.matches("男||おとこ||boy||BOY||Boy||女||おんな||girl||Girl||GIRL")) { 23 System.out.println("確認できました。"); 24 break; 25 }else{ 26 if(i >= 4){ 27 System.out.println("いい加減にしてください。"); 28 } 29 } 30 } 31 scanner.close(); 32 }

投稿2020/03/19 08:08

編集2020/03/20 05:03
dylan0807

総合スコア8

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

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

jimbe

2020/03/20 02:45

なぜ scanner = new Scanner(System.in); まで for 内に入れたのでしょう.
dylan0807

2020/03/20 04:55

連続で入力する場合、Scannerクラスのインスタンスを初期化しないと期待した値を取得できないと認識してました。 ご指摘ありがとうございます。
JUN1207

2020/03/22 23:13

@dylan0807さん ソースありがとうございます。 また、私のソースを元に書いてくださって助かります。 こちらのソースを実際に書いて、理解を深めようと思います。 「処理の流れについていまいちまだ理解されていないと思うので、  デバッグで1行ずつ追ったほうがより理解が深まるかと思います。」 まさしくその通りで、これと、これと、これを組み合わせればソースが完成する!!って思って書いているのですが、少し難しくなると、「あれ、なんか違うぞ??」となってしまっています。 なので、いろんな方のソースを参考にさせて頂き勉強させて頂きます!!
guest

0

whileで回してその中で入力を受け付けて、カウンタを回して規定回数(本ケースでは5回)に達したら抜けるのが良いかと思います。

投稿2020/03/19 05:26

m.ts10806

総合スコア80875

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

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

JUN1207

2020/03/19 05:28

m.ts10806さん アドバイスありがとうございます。 早速書き換えてみます。
m.ts10806

2020/03/19 05:31

continueはあくまで「つぎのカウンタへ」いくだけですし、入力がループの外にある時点で1回しか入力できません。
JUN1207

2020/03/19 06:49

m.ts10806さん ありがとうございます。 continueだとループから抜けることができないことがわかり良かったです。 今、プログラムをつくりなおしました。 コメント欄でのコードの挿入のやり方がわからなかったので メインの質問記事にコードを載せました。 あと一歩のところで、最初から正しい入力をした時に即時終了させるところが できていませんが。。。
m.ts10806

2020/03/19 06:51

コメント欄はマークダウン使えない仕様ですし、現在の状況を伝えるのでしたら個別のコメントより質問本文を更新するのが正しいですよ。
JUN1207

2020/03/19 06:52

m.ts10806さん マークダウン、この言葉を忘れていました。 ありがとうございます。 早速質問本文を更新させていただきました。
m.ts10806

2020/03/19 06:56

まず、scannerなりgenderなりは初期値nullとかで宣言しておいて最初の「入力してください」もループの中に入れれば「入力してください」は一回で済みます。 で、ここからはあくまで発想です。 ++はあくまで「1足す」ですよね。 条件は「5回未満なら繰り返し」 その条件はループして地道に5回まわさないと満たせませんか?考えてみましょう。 まあいずれにしても多少ロジックを調整する必要はあります。
JUN1207

2020/03/19 07:12 編集

m.ts10806さん 『まず、scannerなりgenderなりは初期値nullとかで宣言しておいて最初の「入力してください」もループの中に入れれば「入力してください」は一回で済みます。』 これについては、ごめんなさい、よく理解ができませんでした。 (私がこのアドバイスを受け、どのように書けばいいかが全く想像できませんでした。) ++については、冷静に考えたら途中で、正の解が入力されたら抜けられるようにしないといけないなと思いました。 まず、どのタイミングでも正の解が入力されたら抜けられるようにしないとだめですね。 正解が入力された時にどのように抜けて、プログラムを終了させたらいいのかがいまは全く検討が付いていません。
m.ts10806

2020/03/19 07:22

フローチャート風にざっくり書きます。 start ↓ ループ開始 条件:5回未満 ↓ 入力してください ↓ if正解→終了 else(不正解) カウントアップ if5回以上 いい加減にしてください ↓ ループ終了 ↓ end 正解→終了 はループ抜ける条件を一気に満たさせれば良いのです。 ちまちま足し込むのではなく、そこで5を代入してしまえば条件を満たします。
JUN1207

2020/03/19 07:26

m.ts10806さん ありがとうございます。 フローチャートだとなるほど! となりました。 今、書き直したプログラムがあり、こちらを修正してみます。 (プログラムは質問本文に記載しました。)
m.ts10806

2020/03/19 07:30

これに限らずロジックを整理するために文章でも簡単にフロー書いてから実装に入ったほうが良いですよ。 いわゆる「設計」です。 ワンファイル、ワンコードで終わるようなものでも、頭の中が整理されてないとゴチャゴチャなコードになって目的は達成できないまま時間だけが過ぎます。
JUN1207

2020/03/22 23:26

@m.ts10806さん アドバイスありがとうございます。 フローは大切ですね。 フローを書いて、イメージしてからコードを書いてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問