端末エミュレータにデータを出力するには、System.out.println(
data);
を使ってきました。
文字列をそのまま出力するには、data の部分にその文字列をダブルクオート("
)で囲んで書き、変数の値を出力するには、そこにその変数名を書きました。
演算子 +
で結びますと、それらを混在させることができます。
1: class IntToString { 2: public static void main (String[] args) { 3: int x = 100; 4: System.out.println("x"); 5: System.out.println(x); 6: System.out.println("x = " + x); 7: } 8: }
b00a001@Ampere:~/java% java IntToString x 100 x = 100 b00a001@Ampere:~/java%
実は、この演算子 +
は文字列の連結です。
一方のみが文字列のときは、他方を文字列に変換して連結するという約束になっています。
なお、出力の最後に改行してほしくないときは、System.out.print(
data);
と書きます。
while
文前回の授業では、選択というプログラムの構成要素を紹介しました。 今日は、繰り返し(iteration)について説明します。
繰り返しにはいくつか種類がありますが、「何々の間、何々を繰り返す」というものが基本になります。
この種の繰り返しには while
文を使います。
while
文は以下の形をとります。
while (condition) { statement; ... }
条件 condition が成り立っている間、文 statement;
...が繰り返し実行されます。
次のプログラムは、Good Morning!と10回出力するものです。
1: class TenMornings { 2: public static void main (String[] args) { 3: int i; 4: i = 10; 5: while (i > 0) { 6: System.out.println("Good Morning!"); 7: i--; 8: } 9: } 10: }
b00a001@Ampere:~/java% java TenMornings Good Morning! Good Morning! Good Morning! Good Morning! Good Morning! Good Morning! Good Morning! Good Morning! Good Morning! Good Morning! b00a001@Ampere:~/java%
5行目から8行目までの while
文は次のように実行されます。
変数 i
は、残りの繰り返し回数を表しています。
i
の値は10。
条件 i > 0
が成り立つので、Good Morning!と出力し、i
の値を1減らす。
i
の値は9。
条件 i > 0
が成り立つので、Good Morning!と出力し、i
の値を1減らす。
i
の値は1。
条件 i > 0
が成り立つので、Good Morning!と出力し、i
の値を1減らす。
i
の値は0。
条件 i > 0
は成り立たないので、この while
文の実行を終える。
注意: 上記のプログラムで、7行目を書き忘れたとしましょう。
1: class InfiniteMornings { 2: public static void main (String[] args) { 3: int i; 4: i = 10; 5: while (i > 0) { 6: System.out.println("Good Morning!"); 7: } 8: } 9: }
このプログラムを実行しますと、変数 i
の値は10のままですので、条件 i > 0
がずっと成り立ち、永遠にGood Morning!と出力され続けることになります。
このような、いつまでも続く繰り返しを、無限ループ(infinite loop)とよびます。
繰り返しを使うときは、無限ループにならないように気をつける必要があります。
次のプログラムは、1+2+...+100を計算するものです。
変数 i
の値を1ずつ増加させながら、変数 sum
にそれまでの合計を格納していきます。
1: class Summation { 2: public static void main (String[] args) { 3: int i, sum = 0; 4: i = 1; 5: while (i <= 100) { 6: sum = sum + i; 7: i++; 8: } 9: System.out.println(sum); 10: } 11: }
b00a001@Ampere:~/java% java Summation 5050 b00a001@Ampere:~/java%
for
文
繰り返しの種類の中には、何らかの変数(ループ変数とよびます)を増加(あるいは減少)させながら繰り返すというものがあります。
for
文を用いますと、このような繰り返しをコンパクトに書き表すことができます。
for
文は次のような形をとります。
for (statement1; condition; statement2) { statement3; ... }
まず文 statement1 が一度だけ実行されます。
そして条件 condition が成り立っている間、文 statement3; ... と statement2 が繰り返し実行されます。
while
文を使ってこの for
文を書きますと、次のようになります。
statement1; while (condition) { statement3; ... statement2; }
for
文を用いますと、Good Morning!と10回出力するプログラムは次のように書けます。
1: class TenMornings2 { 2: public static void main (String[] args) { 3: int i; 4: for (i = 10; i > 0; i--) { 5: System.out.println("Good Morning!"); 6: } 7: } 8: }
また、1+2+...+100を計算するプログラムは次のようになります。
1: class Summation2 { 2: public static void main (String[] args) { 3: int i, sum = 0; 4: for (i = 1; i <= 100; i++) { 5: sum = sum + i; 6: } 7: System.out.println(sum); 8: } 9: }
for
文の中にさらに for
文を書くこともできます。
「繰り返しの繰り返し」になっていることが分かります。
1: class NestedLoop { 2: public static void main (String[] args) { 3: int i, j; 4: for (i = 0; i < 3; i++) { 5: for (j = 0; j < 4; j++) { 6: System.out.println("i = " + i + ", j = " + j); 7: } 8: } 9: } 10: }
b00a001@Ampere:~/java% java NestedLoop i = 0, j = 0 i = 0, j = 1 i = 0, j = 2 i = 0, j = 3 i = 1, j = 0 i = 1, j = 1 i = 1, j = 2 i = 1, j = 3 i = 2, j = 0 i = 2, j = 1 i = 2, j = 2 i = 2, j = 3 b00a001@Ampere:~/java%
ここでは、繰り返しの応用として、パターンを描くアプレットを作ります。 パターンの例として、市松模様を取り上げます。 幅300ピクセル、高さ200ピクセルのアプレットに、一辺20ピクセルの正方形を敷き詰めます。
一見、繰り返しでは描けないように見えますが、以下のパターン要素を縦横に繰り返し描けばできます。
1: import java.applet.*; 2: import java.awt.*; 3: 4: public class Ichimatsu1 extends Applet { 5: public void paint (Graphics g) { 6: g.setColor(Color.white); 7: g.fillRect(0, 0, 20, 20); 8: g.fillRect(20, 20, 20, 20); 9: g.setColor(Color.black); 10: g.fillRect(20, 0, 20, 20); 11: g.fillRect(0, 20, 20, 20); 12: } 13: }
まず、このパターン要素を横に描きます。
ループ変数を j
とし、j
を1増加させるごとに横に40ピクセルずらします。
最後が少しはみ出ますが、アプレットではみ出た描画は単に表示されないだけですので問題ありません。
1: import java.applet.*; 2: import java.awt.*; 3: 4: public class Ichimatsu2 extends Applet { 5: public void paint (Graphics g) { 6: int j; 7: for (j = 0; j < 8; j++) { 8: g.setColor(Color.white); 9: g.fillRect(40 * j, 0, 20, 20); 10: g.fillRect(40 * j + 20, 20, 20, 20); 11: g.setColor(Color.black); 12: g.fillRect(40 * j + 20, 0, 20, 20); 13: g.fillRect(40 * j, 20, 20, 20); 14: } 15: } 16: }
そして、これをさらに縦に繰り返しますと出来上がりです。
ループ変数を i
とし、i
を1増加させるごとに縦に40ピクセルずらします。
1: import java.applet.*; 2: import java.awt.*; 3: 4: public class Ichimatsu3 extends Applet { 5: public void paint (Graphics g) { 6: int i, j; 7: for (i = 0; i < 5; i++) { 8: for (j = 0; j < 8; j++) { 9: g.setColor(Color.white); 10: g.fillRect(40 * j, 40 * i, 20, 20); 11: g.fillRect(40 * j + 20, 40 * i + 20, 20, 20); 12: g.setColor(Color.black); 13: g.fillRect(40 * j + 20, 40 * i, 20, 20); 14: g.fillRect(40 * j, 40 * i + 20, 20, 20); 15: } 16: } 17: } 18: }
なお、パターン要素を繰り返し描くのではなく、白黒を切り替えながら正方形を描く方法もあります。
0番目を数えることにして、上から i
番目、左から j
番目の正方形の色は、i + j
が偶数なら白、奇数なら黒とします。
1: import java.applet.*; 2: import java.awt.*; 3: 4: public class Ichimatsu extends Applet { 5: public void paint (Graphics g) { 6: int i, j; 7: for (i = 0; i < 10; i++) { 8: for (j = 0; j < 15; j++) { 9: if ((i + j) % 2 == 0) { 10: g.setColor(Color.white); 11: } else { 12: g.setColor(Color.black); 13: } 14: g.fillRect(20 * j, 20 * i, 20, 20); 15: } 16: } 17: } 18: }
例を参考にして、繰り返しを使ってパターンを描画するアプレットを作成してください。
今日の演習5にしたがってJavaプログラムを作成し、konishi@twcu.ac.jpあてにメールでそのプログラムを提出してください。 メールには、学生番号、氏名、科目名、授業の日付けを明記してください。