私のホームページへ - 前の授業へ - 次の授業へ

情報処理IIIA(Javaプログラミング入門)第5回

目次
  1. 繰り返し(1)
  2. 演習5
  3. レポート課題

繰り返し(1)

データの出力

端末エミュレータにデータを出力するには、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 は、残りの繰り返し回数を表しています。

1. 変数 i の値は10。 条件 i > 0 が成り立つので、Good Morning!と出力し、i の値を1減らす。
2. 変数 i の値は9。 条件 i > 0 が成り立つので、Good Morning!と出力し、i の値を1減らす。
...
10. 変数 i の値は1。 条件 i > 0 が成り立つので、Good Morning!と出力し、i の値を1減らす。
11. 変数 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ピクセルの正方形を敷き詰めます。

Ichimatsu pattern
図5.1 パターンの例(市松模様)

一見、繰り返しでは描けないように見えますが、以下のパターン要素を縦横に繰り返し描けばできます。

 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: }
The pattern element
図5.2 市松模様のパターン要素

まず、このパターン要素を横に描きます。 ループ変数を 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: }
Simple iteration
図5.3 パターン要素の単純な繰り返し

そして、これをさらに縦に繰り返しますと出来上がりです。 ループ変数を 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

例を参考にして、繰り返しを使ってパターンを描画するアプレットを作成してください。

Polka Dots
図5.4 パターンの例(水玉模様)

レポート課題

今日の演習5にしたがってJavaプログラムを作成し、konishi@twcu.ac.jpあてにメールでそのプログラムを提出してください。 メールには、学生番号、氏名、科目名、授業の日付けを明記してください。


私のホームページへ - 前の授業へ - 次の授業へ

このページの複製は、東京女子大学学内に限り許可します。 このページへのリンクを許可します。
2000年10月19日更新
製作・著作:小西善二郎<konishi@twcu.ac.jp>