5. 1 メソッド 5. 2 練習問題 5. 3 メソッドの返り値 5. 4 練習問題 5. 5 メソッドの呼び出し方 5. 6 練習問題 5. 7 練習問題 5. 8 宿題
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); } } |
メソッドによっては、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"; } } } |
メソッドによって、呼び出すときの書き方が少し違います。
sfcInput と sfcOutput は、同じクラスで宣言されていな
いのに、どうしてメソッド名だけを書いて呼び出せるのでしょうか。実は、こ
の二つは SfcDoNothing で宣言されています。今まで作ってきたク
ラスはすべて extends SfcDoNothing とクラス名の後に付けました
が、これは SfcDoNothing を拡張して新しいクラスを作るという意
味で、SfcDoNothing が持っているメソッドなどは、自分のクラスで
宣言したのと同じように使えます。
借金の返済をグラフ化するプログラムを書いてみましょう。元金100万円、年
利5%、返済期間20年、毎年の返済額を入力して棒グラフにするとします。
上の練習問題では、返済額をいろいろ入力してみないと、うまく年利5%、返済
期間20年で返せる額が見つかりません。自動的になるべくピッタリ返せる返済
額を計算するプログラムを作りなさい。入力は無しで、出力は返済額とします。
ヒント: 最初は適当な額(例えば7万円)を返済額として、20年後の残高を計算
します。残高が0より大きければ、返済が不足しているということですから、
返済額を100円増やしてやり直します。20年後の残高が0以下になるまで、返済
額を増やしながら繰り返します。
5.6 練習問題
SfcDoNothing.java の中から、sfcInput と
sfcOutput の宣言を探しなさい。(内容は理解できなくてかまいませ
ん)
5.7 練習問題
今年の残高 + 今年の残高 * 年利率 / 100 - 返済額
で計算できます。
300 - 残高 * 300 / 1000000
で計算できます。
5.8 宿題
慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 1999 慶應義塾大学