はじめに
繰り返すこと、と言えば意味はスッと入るかと思います。朝が来て夜が来る、 また次の日には、 朝が来て夜が来る、、、
そんな大きなくくりであったり、水道の蛇口をひねったままにすれば水が出続けるのであったり、 扇風機や観覧車が回っているのであったり。
普段は意識していないかもしれませんが、 私たちの身近にある機能になります!
前回の復習
ある条件だった場合、 特定の処理を行いたい時に、 if文が使えることを学びました。
記述の仕方は、以下の通りです。
今回は、 for文について学んでいきます。 if文と同様に、for文も 条件式が必要です。
for文においていの条件とは、何回繰り返しますかというのが条件になります。
100回なのか、1000回なのかそんなことが for文の条件式にあたります。
以上のことを踏まえて、本課題を進めていきましょう。
Step1: 概念を知る
ループ処理の主な機能は、指定された回数分や特定の条件下にある間、 処理を実行し続けることです。
Javaにおいては、 何度も同じ処理を繰り返したい場合に、繰り返しの処理が制御文内で書くことができる for文、 while文 という構文が用意されています。 Javaに携わる上では頻繁に使用する機能になります。
さっそく見ていきましょう!
Step2: 【繰返しの制御①】for文
for文は、ループカウンタなどを使用して、定められた回数だけ同じ処理を繰り返したいときに使用します。 ループカウンタと、添え字による配列要素へのアクセスは非常に相性がいいため配列の中身を単純に1つ1つ参照する場合などによく使用されます。
【for文を使ったプログラム例】
【実行結果】
i は0から始まり、for文 内の処理 (println() による表示)を実行しながら1ずつ増えていき、arr.length (=4) になったところでループを終了する。
※length は配列内の要素数を指定できる属性(プロパティ)です。
Step3-1:【繰返しの制御②】while文
ループ文では、for文以外にも、while文 というものが存在します。
【1から10までを出力させるwhile文】
while (i <= 10)の()内が継続条件になる。 今回の場合だとiが10以下の場合に 処理が継続される。
注意点
i++; ←ここを忘れると無限ループになってしまうので注意しましょう。
※無限ループについては下記で解説しております。
【while文を使ったプログラム例 (WhileSample.java) 】
【実行結果】
上記のwhile文サンプルプログラムでは、ユーザからの数値の入力をするためにJavaの標準クラスライブラリとして提供されている Scanner クラスというものを使用しています。
Scannerクラスを使用するためにimport宣言と new演算子によるScannerのインスタンスの生成というものを行なっています。
実際にユーザからのキーボードの入力を受け付けて数値として変数に格納する処理は、inputNum=scanner.nextInt(); という文です。
この文を実行することで、 画面の表示がユーザの入力待ちの状態になります。
その状態でユーザが数値を入力してEnterキーを押下すると、入力された数値が inputNum変数に格納され、プログラムが次の行の処理に進みます。 いきなり初めて見るキーワードがあちこちに出てきてびっくりしたかもしれませんが、細かいところはとりあえず置いておいて、今はこのプログラムが「どのように動くか」を理解するようにしてください。
特にここでは、while文による繰り返しの動きと、 inputNum や sum変数の値の変化を読み取ることができればOKです。
※クラスライブラリについては、第4章で詳しく説明します。
for文との違い
同じループ文ですが、 まったく同じかと言われるとそうではありません。 以下に使用ケースを記述します。
- for文
繰り返す回数が明確な場合に使用
→小学校の算数の授業で習った九九をマス目で作成するなど (あるいは、九九の結果値を作成) (九九なので 9 と言う数字がキモ! - while文
繰り返す回数が定まらない(前もって分からない)場合に使用
→ユーザーの入力値を受け取るまでは処理を繰り返す、といったような処理を行う場合
水道の蛇口をひねって水を出しっぱなしにし、バケツの8分目まで水が溜まったら、 蛇口をひねって戻す。
水道は、ユーザー (蛇口をひねる人) が、水を止めるまでは出続ける仕様になってますよね?
while文 でも似たようなイメージを持つと、 繰り返す回数が定まらない場合という具体例が見えやすくなります
Step3-2: 【繰返しの制御③】 do-while
do-while文は、while文 と同様、括弧内の継続条件によって同じ処理を繰り返したいときに使用します。
括弧内の継続条件を満たしている間、処理を繰り返します。
for文も while文も do-while文 も繰り返し処理を行うというのは同じですが、 for や while は前判定でありdo-while は後判定であるという違いがあります。
前判定のループでは、もし最初の継続条件判定で判定結果が偽だった場合は一度もループ内の処理を行わずループを終了することになります。
それに対して後判定のループでは、まず最初にループ内の処理を1回実行してから、継続条件の判定を行います。
つまり、 for や while は0回以上の繰り返し処理、 do-while は1回以上の繰り返し処理で使用します。
do-while文 を使用する場面はそんなに多くありません。
最低一回は処理を行ってから繰り返しの判定を行いたいという場面に遭遇したら do-while文 の使用を検討してみてください。
【do-while文を使ったプログラム例 (DoWhilesample.java)】
【実行結果】
break文とcontinue 文
繰り返し処理の for文と while文では、 break文と continue文によって、 ループの流れを変えることができます。 break文を記述すると、その時点でループ処理から抜けます。 例えば下記のプログラムの場合、
ループに入るといきなり break文が出てくるので、そこでループ処理は終了してしまいます。 しかしこれではループの記述をしている意味がありませんね。
通常は、ある条件に当てはまったときだけ break文を実行してループから抜けるというように記述します。
【break文を使ったプログラム例(BreakSample.java) 1
【実行結果】
【continue文は、その時点で後の処理をスキップします。】
上記のプログラムの場合、[ある処理A]を行って continue文に来ると、[ある処理B]をスキップして while文の条件比較に戻ります。
そして条件が合えばループ内の[ある処理A]を行って、、、(以降繰り返し)、、、となります。
しかし、これだと[ある処理B]は絶対に実行されません。 これも意味のないロジックです。
通常は、continue文も break文と同じく、ある条件に当てはまったときだけ continue文を実行するというように記述します。
【continue文を使ったプログラム例 (Continuesample.java)】
【実行結果】
Step4: 無限ループ (永久ループ)
ループ文において、継続条件が常に真である場合、そのループは無限ループ (永久ループ)となります。無限ループは、プログラマのミスによって引き起こされる場合 (=バグ) もありますが、 意図的に無限ループするようにプログラムを記述する場合もあります。 その場合は、ある条件が成立したときに break や return を実行してループやメソッド処理のブロックを抜けるようにします。
例えば、繰り返す回数が決まっておらず、繰り返し処理を実行するうちにある条件が成立したときにだけループを終了したい場合などに無限ループを使用します。
while文の場合は、 while (true) として、 継続条件に true を指定することで無限ループさせることができます。
これは、while文の条件式にrue真)が直接指定されているため、継続条件がfalse(偽)になることがないので無限ループとなります。
for文の場合は、 for (;;) と記述すると無限ループさせることができます。
継続条件が省略されているため、 判定が行われないので、 無限ループとなります。
ちなみに、do-while文においても、 継続条件の条件式に true を指定することで無限ループにすることができますが、これはあまりお勧めしません。 do-while文は、あくまで 「後判定」を行う場合にのみ記述するほうが良いです。
無限ループは条件式が常に真のため、条件式の判定を後判定にする意味がありませんので、 do-while文でなく一般的なループである while文で記述するほうが好ましいです。
【無限ループのプログラム例 (EndlessLoopsample.java)】
【実行結果】
Step5: 多重ループ
ループ文の中に更にループ文を記述することができます。
そのようなループを2重ループや3重ループ、あるいは多重ループと呼びます。
以下の九九表を表示する例では、外側でループカウンターによるループを行い、その内側でループカウンタ」によるループを行っており、 2重ループになっています。
実行結果を見ると分かる通り、外側の i が1つ増加する度に、 毎回内側の j が 1 から 9 まで値を変えて九九の計算をしています。
また、内側の j が 9 まで回った後、外側の i を1つ増やす直前に System.out.println(); で改行を出力しています。
これにより、一つの段を表示し終わったタイミングで改行が行われることになります。
【多重ループのプログラム例(九九表を表示)】
【実行結果】
課題
提出ファイル
- Task1_7.java
- Task1_7.class(Task1_7.classファイルがない方はTask1_7.javaファイルのみ提出してください。)
java_curriculum/1-7/Task1_7.java に課題があります。 以下の添付画像のようにコンソールへ出力されるよう課題を実施し提出してください。
※ windowsの方で漢字が表示されない場合は、ローマ字で記述してください。
※1~100までの出力は全て改行していても問題ありません。
提出方法については、導入研修で実施した、 研修課題提出方法の通りにお願いします。
