【はじめてのJava】基本構文編(ネスト) ~復習問題~
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
ネスト ~復習問題~
今回は、ネストを利用したプログラムを復習し模擬問題を確認します。JavaSilverにおいてよく狙われるポイントを確認しましょう。
目次
ネストのおさらい
これまで基本構文としては、条件分岐や繰り返し文の学習をしてきました。それらは、1つのプログラムに対して1つずつ実行されるわけでなく、複合的に組み合わせて用いることができます。
このような構文の中にさらに構文を入れるような書き方を「ネスト」と呼びます。
またネストさせてプログラムを書く際に、状況によっては、「Aの条件時は、繰り返し処理を抜け強制的に終了する」「Bの条件時は、一時的に処理を飛ばして実行を続ける」というような、繰り返し処理のより細かな制御が可能です。
その際、break文やcontinue文を利用することができます。
ネストに関する記事は下記を参照してください。
(1)ネスト 記事はこちら
(2)ネストにおける制御構文 記事はこちら
問題
それでは、さっそく問題を解いてみましょう!
次のプログラムをコンパイル・実行したときの結果として、正しいものを選びなさい。
public class Sample1 { public static void main(String[] main) { int total = 0; int a = 0; X: do { a++; Y: for (int b = 0; b < 5; b++) { if (a % 2 == 0) continue Y; if (a * b == 6) break X; total += a + b; } } while (a < 5); System.out.println(total); } }
A. 何も表示されない。
B. 5が表示される。
C. 15が表示される。
D. 22が表示される。
E. 実行時に例外がスローされる。
F. コンパイルエラーが発生する。
解答
解答 D
>java Sample1
22
今回の問題を解く上で注意すべきポイントは、2点です!
[1]ネスト文のフローの理解[2]continue文とbreak文の理解
これら2点に注目し、設問を見ていきましょう!
今回は、do-while文の中にfor文を入れ込んだネストになってします。
do-while文、for文ではそれぞれint a,bが繰り返し処理で値が加算され、for文内では更にその時のa,bの値に応じてtotalの値が加算されます。
加えてdo-while文にはX、for文にはYのラベルがついています。これらのラベルは、for文内部でcontinue文とbreak文が実行される際に用いられます。aの値が2で割り切れるときはcontinue文でラベルYへ、aとbの積が6の時はbreak文でラベルXにフローします。
最終的にdo-while文とfor文を抜けた状態でのtotalの値が出力され、本問ではその値が問われています。
a,b,totalの値の推移は、下記の表の通りです。
continue文とbreak文がいつ実行されるかに注意してフローを追ってみてください。
a | b | 結果 | total |
1 | 0 | totalに1を加算 | 1 |
1 | 1 | totalに2を加算 | 3 |
1 | 2 | totalに3を加算 | 6 |
1 | 3 | totalに4を加算 | 10 |
1 | 4 | totalに5を加算 | 15 |
2 | 0 | continueでラベルYへ | 15 |
2 | 1 | continueでラベルYへ | 15 |
2 | 2 | continueでラベルYへ | 15 |
2 | 3 | continueでラベルYへ | 15 |
2 | 4 | continueでラベルYへ | 15 |
3 | 0 | totalに3を加算 | 18 |
3 | 1 | totalに4を加算 | 22 |
3 | 2 | break文でdo-while文の終了 | 22 |
最終的なtotalの値は22になりますので、解答はD. 22が表示される。となります!
[参考] 今回のプログラムにおいて、totalの値を出力するタイミングとその時のa,bの値、continue文やbreak文を実行するタイミングを追記すると下記のようになります。
public class Sample2{ public static void main(String[] main) { int total = 0; int a = 0; X: do { a++; Y: for (int b = 0; b < 5; b++) { if (a % 2 == 0){ System.out.println("continue Y"); //★ continue Y; } if (a * b == 6){ System.out.println("break X"); //★ break X; } System.out.println("a:b = " + a + ":" + b); //★ total += a + b; System.out.println("total = " + total); //★ System.out.println(); } } while (a < 5); System.out.println(total); } }
実行結果は、このようになります!
>java Sample2
a:b = 1:0
total = 1
a:b = 1:1
total = 3
a:b = 1:2
total = 6
a:b = 1:3
total = 10
a:b = 1:4
total = 15
continue Y
continue Y
continue Y
continue Y
continue Y
a:b = 3:0
total = 18
a:b = 3:1
total = 22
break X
22
次回の内容
今回はネストの復習問題を扱いました。
ネストを用いるとプログラムのフローが複雑化し、読み取りが難しくなりますので、1つ1つの構文のフローを覚えしっかり流れを追えるようにしましょう!
次回は、新たな単元として配列の学習を行います!
はじめてのJavaシリーズの記事一覧はこちら
シリーズ全記事一覧
環境構築編
プログラムの作り方編
データ型と変数編
演算子編