第5週:部品を作る


5. 1 メソッド
5. 2 練習問題
5. 3 メソッドの返り値
5. 4 練習問題
5. 5 メソッドの呼び出し方
5. 6 練習問題
5. 7 練習問題
5. 8 宿題

5.1 メソッド

Java のプログラムはクラスとメソッドを単位としています。今まで出てきた プログラムは、一つのクラスの中に一つのメソッドがあるだけでしたが、今度 は複数のメソッドを持つクラスを作ってみましょう。

まず、次のプログラムはロボットの顔を左上に書きます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import java.awt.*;
class OneFace extends SfcDoNothing {
    void sfcDraw (Graphics g) {
	g.drawRoundRect(10, 10, 80, 80, 20, 20);
	g.drawOval(20, 30, 20, 15);
	g.drawOval(60, 30, 20, 15);
	g.drawLine(50, 45, 50, 60);
	g.drawLine(40, 70, 60, 70);
    }
}

同じ顔を右下にももう1個描くには、同じ図形を座標を (200, 200) ずらして 描きます。

    g.drawRoundRect(10, 10, 80, 80, 20, 20);
    g.drawOval(20, 30, 20, 15);
    g.drawOval(60, 30, 20, 15);
    g.drawLine(50, 45, 50, 60);
    g.drawLine(40, 70, 60, 70);
    g.drawRoundRect(210, 210, 80, 80, 20, 20);
    g.drawOval(220, 230, 20, 15);
    g.drawOval(260, 230, 20, 15);
    g.drawLine(250, 245, 250, 260);
    g.drawLine(240, 270, 260, 270);

これは基準点が変わっているだけなので、次のように変数 x, y を基準にすれば、その値を変えることで、自由に位置を変えて描 くことができます。

    g.drawRoundRect(x + 10, y + 10, 80, 80, 20, 20);
    g.drawOval(x + 20, y + 30, 20, 15);
    g.drawOval(x + 60, y + 30, 20, 15);
    g.drawLine(x + 50, y + 45, x + 50, y + 60);
    g.drawLine(x + 40, y + 70, x + 60, y + 70);
この5行を独立したメソッドにしておけば、x, y の値を変 えながら、何回も実行することができます。

プログラムは次のようになります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import java.awt.*;
class TwoFaces extends SfcDoNothing {
    void sfcDraw (Graphics g) {
	face(g, 0, 0);
	face(g, 200, 200);
    }
    void face (Graphics g, int x, int y) {
	g.drawRoundRect(x + 10, y + 10, 80, 80, 20, 20);
	g.drawOval(x + 20, y + 30, 20, 15);
	g.drawOval(x + 60, y + 30, 20, 15);
	g.drawLine(x + 50, y + 45, x + 50, y + 60);
	g.drawLine(x + 40, y + 70, x + 60, y + 70);
    }
}

5.2 練習問題

5.3 メソッドの返り値

メソッドによっては、sfcInput のように、呼び出すと実行結果の値 を返してくれます。このようなメソッドの呼び出しは、定数や変数と同じよう に式の中に書くことができます。

先週やった閏年の計算をメソッドにしてみましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class LeapYear extends SfcDoNothing {
    void sfcProcess () {
	String year = sfcInput();
	sfcOutput(year + " is " + leapOrNot(Integer.parseInt(year)) + " year");
    }
    String leapOrNot(int year) {
	if ( year % 4 != 0 ) {
	    return "ordinary";
	} else if ( year % 100 != 0 ) {
	    return "leap";
	} else {
	    return "ordinary";
	}
    }
}

5.4 練習問題

上のプログラムに 400 で割りきれる場合を加えて、完全なプログラムにしな さい。

5.5 メソッドの呼び出し方

メソッドによって、呼び出すときの書き方が少し違います。

sfcInputsfcOutput は、同じクラスで宣言されていな いのに、どうしてメソッド名だけを書いて呼び出せるのでしょうか。実は、こ の二つは SfcDoNothing で宣言されています。今まで作ってきたク ラスはすべて extends SfcDoNothing とクラス名の後に付けました が、これは SfcDoNothing を拡張して新しいクラスを作るという意 味で、SfcDoNothing が持っているメソッドなどは、自分のクラスで 宣言したのと同じように使えます。

5.6 練習問題

SfcDoNothing.java の中から、sfcInputsfcOutput の宣言を探しなさい。(内容は理解できなくてかまいませ ん)

5.7 練習問題

借金の返済をグラフ化するプログラムを書いてみましょう。元金100万円、年 利5%、返済期間20年、毎年の返済額を入力して棒グラフにするとします。

  1. 今年の残高と、毎年の返済額と、年利率(%)を引数とし、次の年の残高を返り 値とするメソッドはどうなりますか?次の年の残高は
        今年の残高 + 今年の残高 * 年利率 / 100 - 返済額
    
    で計算できます。
  2. Graphics のデータと、何年目かと、その年の残高を引数とし、一本 の棒を描くメソッドはどうなりますか?棒を下から描くとすると、上端のY座 標は
        300 - 残高 * 300 / 1000000 
    
    で計算できます。
  3. sfcDraw では、返済額を入力し、上のメソッドを20回繰り返して実 行します。

  4. さらに、年利が 5%, 2%, 0% の場合を、色を変えて重ねて描いてみましょう。 残高を100万円に設定し、20回繰り返す部分を独立したメソッドにし、色と年 利を変えて呼び出すとよいでしょう。

5.8 宿題

上の練習問題では、返済額をいろいろ入力してみないと、うまく年利5%、返済 期間20年で返せる額が見つかりません。自動的になるべくピッタリ返せる返済 額を計算するプログラムを作りなさい。入力は無しで、出力は返済額とします。

ヒント: 最初は適当な額(例えば7万円)を返済額として、20年後の残高を計算 します。残高が0より大きければ、返済が不足しているということですから、 返済額を100円増やしてやり直します。20年後の残高が0以下になるまで、返済 額を増やしながら繰り返します。


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