[目次] [前回] [次回] [重要語索引]

第2週: 繰り返しと場合分け

2. 1 図形の出力
2. 2 練習問題
2. 3 for
2. 4 練習問題
2. 5 円を描く
2. 6 練習問題
2. 7 二重の繰り返し
2. 8 練習問題
2. 9 if
2.10 練習問題
2.11 宿題
2.12 おまけ

B・Cコースで、宿題を自宅のパソコンでやりたい人は、JDK (Java 2 SDK) のインストールが必要です。推奨ラップトップを購入した人はJDKのダウンロードのページを参照してください。それ以外の人はSun Microsystems のダウンロードページから自力でダウンロードするか、ι401 学生コンサルタントに相談してください。

2.1 図形の出力

数値や文字だけでなく、図形を出力することもできます。前回の練習用プログラムでは図形を表示する部分がありませんので、もう一つ別の練習用プログラムを使います。

まず、前回と同じように

    /pub/sfc/ipl/1bc/SfcTemplate2.java
    /pub/sfc/ipl/1bc/SfcTemplate2.html
を自分の作業ディレクトリにコピーします。
% cd /pub/sfc/ipl/1bc
% cp SfcTemplate2.java SfcTemplate2.html 自分の作業ディレクトリ
%
ラップトップの場合は FTPによるファイル転送になります。
  1. スタートメニューから[ファイル名を指定して実行(R)]を選択し,表示されたウィンドウの`名前(O)'欄に `ftp' と入力して[OK]を押す。
  2. ftp> open ccz00.sfc.keio.ac.jp
  3. ログイン名とパスワードの入力
  4. ftp> cd /pub/sfc/ipl/1bc
  5. ftp> get SfcTemplate2.java
  6. ftp> get SfcTemplate2.html
  7. ftp> quit
自分の作業ディレクトリにコピーしてから後は同じ手順です。なお、文字コードは iso-2022-jp です。meadow ではそのまま表示できますが、必要ならpage browser などで変換してください。

コピーできたら、前回の手順を思い出して、SfcTemplate2.java をコンパイルし、SfcTemplate2.html を表示してみましょう。どのようなウィンドウが出てきましたか?

直線を描く

手始めに直線を描いてみましょう。まず、Line.javaLine.html というファイルにコピーします。
% cd 自分の作業ディレクトリ
% cp SfcTemplate2.java Line.java
% cp SfcTemplate2.html Line.html
%

変更する個所は前回と同じです。
public class Line extends Applet implements ActionListener {
    void sfcDraw(Graphics g) {
	//ここに自分のプログラムを書く
	g.drawLine(0,0,300,300);
    }
<applet code="Line.class" width=300 height=380>

これをコンパイルして実行してみましょう。
% javac Line.java
% appletviewer Line.html
Draw ボタンをクリックすると、直線が描かれます。

2.2 練習問題

Line.java を変更し、次のような線を描くようにしなさい。

  1. 水平な線
  2. 垂直な線
  3. 左下隅と右上隅を結ぶ線

2.3 for

少しずつ違うことを何回も繰り返して行いたい場合があります。例えば、次のように線を11本描くことを考えてみましょう。

11 lines

これは、次のように drawLine を11回書くこともできます。

      g.drawLine(0, 0, 300, 0);
      g.drawLine(0, 0, 300, 30);
      g.drawLine(0, 0, 300, 60);
      g.drawLine(0, 0, 300, 90);
      g.drawLine(0, 0, 300, 120);
      g.drawLine(0, 0, 300, 150);
      g.drawLine(0, 0, 300, 180);
      g.drawLine(0, 0, 300, 210);
      g.drawLine(0, 0, 300, 240);
      g.drawLine(0, 0, 300, 270);
      g.drawLine(0, 0, 300, 300);
しかし、これが1万本になったら、とても1万個の drawLine を書くわけには行きません。そこで、1個の drawLine を何回も繰り返して実行するプログラムを書きます。

上の11本の線を描くには Line.java を次のように変更します。
45
46
47
48
49
50
    void sfcDraw(Graphics g) {
	//ここに自分のプログラムを書く
	for (int y = 0; y <= 300; y = y + 30) { // x = 0, 30, 60, …, 300
	    g.drawLine(0, 0, 300, y);
	}
    }

(青字の部分は解説です。左端の数字は行数を数えやすいように付けてあります。)

for が繰り返しをするための命令です。この場合は次のような繰り返しになります。

for loop

代入や for のようなひとまとまりの命令を(statement)と呼びます。いくつかの文を '{' と'}' でまとめたものをブロック(block)と呼びます。

for 文の書き方は正確には次のようになります。

     for ( 初期設定; 継続条件; 増分設定 ) {
         繰り返しブロック
     }

2.4 練習問題

Line.java を変更して、次のような図を描くようにしてみましょう。


  1. (ヒント: for 文を2回使います)

2.5 円を描く

今度は円を描いてみましょう。ファイル名は Circle.javaCircle.html にします。
% cd 自分の作業ディレクトリ
% cp SfcTemplate2.java Circle.java
% cp SfcTemplate2.html Circle.html
%

円(または楕円)を描くメソッドは drawOval()、中を塗り潰した円(または楕円)を描くメソッドは fillOval() です。括弧の中には4個の数字を書き、それによって次のように楕円が描かれます。

  1. 最初の2個の数字を x 座標、y 座標として点を決めます。
  2. その点から、次の2個の数字を横幅と高さとして、長方形を考えます。
  3. その長方形に内接する楕円が描かれます。
ファイルを次のように変更し、どのように表示されるか確かめましょう。
public class Circle extends Applet implements ActionListener {
    void sfcDraw(Graphics g) {
	//ここに自分のプログラムを書く
	g.drawOval(100, 100, 50, 50);
	g.fillOval(150, 200, 100, 50);
    }
<applet code="Circle.class" width=300 height=380>

2.6 練習問題

数値を入力して、それを直径とする大きさの円を描くように、Circle.java を変更しなさい。テキストフィールドから文字を読み取って、数値に変換するやり方は
前回勉強しました

2.7 二重の繰り返し

次のように100個の円を描きたいときはどうすればいいでしょうか。

まず左端の縦一列から描くとします。Y座標が順に増えていって、下までいくと、次の列はX座標を30増やして、Y座標はまた0から始めなければなりません。

これは、縦一列を描く繰り返しをまず考え、それを横にずらしながら繰り返して描いていけば出来ます。プログラムは次のようになります。
45
46
47
48
49
50
51
52
    void sfcDraw(Graphics g) {
	//ここに自分のプログラムを書く
	for (int x = 0; x < 300; x = x + 30) { //横にずらしながら
	    for (int y = 0; y < 300; y = y + 30) { //縦にずらしながら
		g.drawOval(x, y, 30, 30);
	    }
	}
    }

2.8 練習問題

二重の繰り返しを使って、次のような図を描くプログラムを作りましょう。

2.9 if

縦10個、横10個並べた円のうち、対角線上にあるものだけ中を塗り潰すことにします。

対角線上にあるということは、X座標とY座標の値が等しいということですから、その時だけ別の処理をするようにします。

Circle.java を次のように変更します。
45
46
47
48
49
50
51
52
53
54
55
56
    void sfcDraw(Graphics g) {
	//ここに自分のプログラムを書く
	for (int x = 0; x < 300; x = x + 30) {
	    for (int y = 0; y < 300; y = y + 30) {
		if ( x == y ) { // x 座標と y 座標が等しいなら
		    g.fillOval(x, y, 30, 30);
		} else {
		    g.drawOval(x, y, 30, 30);
		}
	    }
	}
    }

if が場合分けをするための命令です。この場合は次のような場合分けになります。

for loop

2.10 練習問題

次のように変更すると、どのような図形を描くか予想しましょう。
45
46
47
48
49
50
51
52
53
54
    void sfcDraw(Graphics g) {
	//ここに自分のプログラムを書く
	for (int x = 0; x < 300; x = x + 30) {
	    for (int y = 0; y < 300; y = y + 30) {
		if ( x == y ) {
		    g.fillOval(x, y, 30, 30);
		}
	    }
	}
    }

実際に実行して、確認しましょう。

2.11 宿題

次のような図を描くプログラムを作りなさい。

  1. 宿題1
  2. 宿題2
    2番はif 文を使っても使わなくてもできます。余裕のある人は両方考えてみましょう。

2.12 おまけ


[目次] [前回] [次回] [重要語索引]

慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学