【はじめてのJava】基本構文編(繰り返し) ~復習問題~
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
繰り返し ~復習問題~
現在、基本構文について学習を進めており、大別して条件分岐文と繰り返し文の2パターンを学習してきました。今回は「繰り返し文」について復習し、JavaSilverにおいてよく狙われるポイントを確認していきます。
目次
繰り返し文のおさらい
繰り返し文とは、同じ処理をそのまま何度も繰り返したり、処理の中で条件を少しずつ変えて条件を満たすまで繰り返す場合に使用する構文です。
for文・while文・do-while文の3種類の構文での記述が可能です。いずれの構文も繰り返し処理を行う点に変わりはありませんが、for文は指定の回数処理を繰り返すとき、while文・do-while文は条件を満たすまで処理を繰り返すときによく使用されます。
繰り返し文に関する各記事は、下記を参照してください。
(1)for文 記事はこちら
(2)while文 記事はこちら
(3)do-whle文 記事はこちら
問題
それでは、さっそく問題を解いてみましょう!
次の2つのプログラムをコンパイル・実行したときの結果として、正しい組み合わせのものを選びなさい。
public class Sample1 { public static void main(String[] main) { int x = 5; while (x > 0) --x; System.out.println(x); } }
public class Sample2 { public static void main(String[] main) { int y = 5; do --y; System.out.println(y); while (y > 0); } }
A. Sample1は4,3,2,1,0が順に表示される。Sample2は4,3,2,1が順に表示される。
B. Sample1は4,3,2,1が順に表示される。Sample2は4,3,2,1,0が順に表示される。
C. Sample1は0が表示される。Sample5はコンパイルエラーとなる。
D. Sample1,Sample2共に0が表示される。
E. Sample1,Sample2共に実行時に例外がスローされる。
F. Sample1,Sample2共にコンパイルエラーが発生する。
解答
解答 C
Sample1の結果
>java Sample1
0
Sample2の結果
>java Sample2
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
構文エラーがあります。”while ( Expression ) ;” を挿入して DoStatement を完了してください
解説
今回の問題を解く上で注意すべきポイントは、2点です!
[1]while文とdo-while文の違いの理解[2]while文とdo-while文の繰り返し処理を表す{}がない時のフローの理解
これら2点に注目し、設問を見ていきましょう!
特に{}がない場合のフローについては記事では触れていなかった点になるので、ぜひ覚えてみてください!
Sample1はwhile文でのプログラム、Sample2ではdo-while文でのプログラムが記述されています。
while文とdo-while文の違いとしては、条件判定をしてから繰り返し処理を行う構文がwhile文、繰り返し処理を行ってから条件判定を行う構文がdo-while文になります。
いずれのプログラムも一見するとint x,yをそれぞれ5と定義し、X,Yの減算とその出力を値が0になるまで繰り返しているように見えます。
しかし、よく見ると繰り返し処理の部分を示す{}がありません。
この時、while文がdo-while文かによって、その後のフローが異なります。
<Sample1のwhile文の場合>
{}がなくても、while(条件式)の後の1文が繰り返しの対象としてみなされるため、コンパイルエラーになることはありません。
したがって、今回のSample1だと実質的に下記のプログラムのように見なされます。
public class Sample1 { public static void main(String[] main) { int x = 5; while (x > 0) { --x; } //↑--xの処理1文のみが繰り返し処理の対象となる。 System.out.print(x); } }
このプログラムだと、while文の条件式 (x > 0)を満たすまで、–xが繰り返し実行されます。
x=0になると、繰り返し処理を抜け、System.out.print(x);に移行しますのでコンソールには0が出力されます。
<Sample2のdo-while文の場合>
{}がなくても、それだけでコンパイルエラーになることはありません。ただし、while文の時と同様に次の1文のみ繰り返し処理の対象とし、while文に移行しようとします。しかし、今回は(1)–y;(2)System.out.println(y);の2文がdoの中に記述されています。この時、コンパイルエラーが発生してしまいます。
よって解答は、C. Sample1は0が表示される。Sample2はコンパイルエラーとなる。になります。
下記の様に、System.out.println(y);をwhileの後に記述すると{}が不足してしてもコンパイルエラー発生せずに実行できます。
この場合、(y > 0)満たすまで–yが繰り返し実行され、y=0になると繰り返し処理を抜け、System.out.print(y);に移行しますのでコンソールには0が出力となり、Sample1と同じ結果となります。
public class Sample5 { public static void main(String[] main) { int y = 5; do --y; while (y > 0); System.out.println(y); } }
>java Sample5
0
次回の内容
今回は基本構文の1つである繰り返し文の復習問題を扱いました。
繰り返し文は、条件を満たすまでどんな処理が何回繰り返されるかの理解が重要になります。
次回は、1つのプログラム内で複数の構文を利用するネストを学びます!
はじめてのJavaシリーズの記事一覧はこちら
シリーズ全記事一覧
環境構築編
プログラムの作り方編
データ型と変数編
演算子編