Revised: Dec./30th/2001: Since: Dec./30th/2001
ここでは、二次方程式の解の公式をメソッドとして作成してみます。
二次方程式の一般形は次のようになります:
ax^2 + bx + c = 0
コマンドライン引数から、 a, b, c を受け取って、次の解の公式を計算します:
-b ± D x = ---------- , D^2 = b^2 -4ac. 2a
D^2 は判別式と呼ばれ、正数または0 (D^2 ≥ 0) ならば実数解、負数 (D^2 < 0) ならば虚数解 (α ± i β) であることを意味します。
利用するメソッドと同じクラス内に、解の公式のメソッドを作成します。修飾子 static
が宣言された main()
メソッドから利用しますから、この解の計算メソッドも static
にしておく必要があります。
p>
KaiTest.java
:
class KaiTest { public static void main(String[] args) { System.out.print(args[0] + "x*x + "); System.out.print(args[1] + "x + "); System.out.println(args[2]); //引数を double 型に変換 double a = Double.parseDouble(args[0]); double b = Double.parseDouble(args[1]); double c = Double.parseDouble(args[2]); //メソッドの戻り値を配列で定義 double[] x; //メソッド呼び出し x = koushiki(a,b,c); System.out.println("\t解 x1 = " + x[0]); System.out.println("\t解 x2 = " + x[1]); } static double[] koushiki(double a, double b, double c) { //解の配列を定義 double[] x = {0,0}; //判別式の変数を定義 double d2=0, d=0; //判別式 d2 = b*b - 4*a*c; if (d2 < 0) { //虚数解ならば System.out.println("虚数解! 判別式 = " + d2); } else { //実数解ならば //java.lang.Math クラスの静的メソッド sqrt() //d2 の平方根(ルート)計算 d = Math.sqrt(d2); x[0] = (-b + d)/(2*a); //解1 x[1] = (-b - d)/(2*a); //解2 } return x; //解を配列で戻す } }
コマンドライン引数 args[0]
- args[2]
は文字列型として定義されていますが、 Double
クラスの静的メソッド parseDouble()
を用いて double
型に型変換しています。こうすることで、四則演算が可能になります。一般に、他のパッケージのクラスを利用する場合はインポートする必要がありますが、 java.lang
パッケージに含まれるクラスは、 javac
によってコンパイルされるときに、全て自動的にインポートされますので、明示的にインポートする必要はありません。
解の公式計算のためのメソッド koushiki()
:
static | 静的メソッド。 main() メソッドは静的メソッドであり、静的メソッドからは静的メソッドしか利用できない。 |
double[] | 戻り値は double 型の配列。 |
koushiki(...) | メソッド名と引数の定義。このメソッドは三つの double 型のリテラルを引数として受け取る。 |
{...} | メソッドの実装。呼び出されると、この内部を実行して、 return 文で呼び出し元に制御を戻す。 |
このメソッドの内部では、判別式を計算し、負値ならば制御を戻し、0以上の値ならば解の公式を計算して、制御を戻します。判別式の平方根を計算するのに、コアパッケージ java.lang
の Math
クラスで定義された静的メソッド sqrt()
を用いています。このクラスは Double
クラスや String
クラスと同様に java.lang
パッケージに含まれているので、明示的なインポートは必要ありません。
C:\Java>javac KaiTest.java C:\Java>java KaiTest 1 -2 -3 1x*x + -2x + -3 解 x1 = 3.0 解 x2 = -1.0 C:\Java>java KaiTest 1 -2 3 1x*x + -2x + 3 虚数解! 判別式 = -8.0 解 x1 = 0.0 解 x2 = 0.0
次の例は、解を計算するメソッドを別のクラスに定義しています。このクラスは、係数 a, b, c を変数値として持ったオブジェクトとして利用します。
クラス Kai
:
ここでは、このような発想でコーディングします。このクラスを利用する main()
メソッドは、 KaiTest2
クラスに作ります。
KaiTest2.java
:
//利用される二次方程式の解の公式クラス class Kai { //係数の定義 private double a = 0, b = 0, c = 0; //解の定義 private double[] kai = {0,0}; //コンストラクタ //ax^2 + bx +c = 0 Kai(double a , double b, double c) { this.a = a; this.b = b; this.c = c; } //解の公式計算 public double calKai() { //判別式の変数を定義 double d2 = 0, d = 0; //判別式 d2 = b*b - 4*a*c; if (d2 >= 0) { //判別式が正か0ならば d = Math.sqrt(d2); kai[0] = (-b + d)/(2*a); //解1 kai[1] = (-b - d)/(2*a); //解2 } return d2; } //解を得る public double[] getKai() { return kai; } } //Kai クラスの利用 class KaiTest2 { public static void main(String[] args) { System.out.print(args[0] + "x*x + "); System.out.print(args[1] + "x + "); System.out.println(args[2]); //引数を double 型に変換 double a = Double.parseDouble(args[0]); double b = Double.parseDouble(args[1]); double c = Double.parseDouble(args[2]); //解の配列 double[] x = {0,0}; //解の公式計算の戻り値 double d2; //インスタンス化 Kai obj = new Kai(a,b,c); //解の公式を計算する d2 = obj.calKai(); if (d2 >= 0) { //戻り値が 0 以上ならば //解を得る x = obj.getKai(); if (d2 > 0) { System.out.println("\t 解 x1 = " + x[0]); System.out.println("\t 解 x2 = " + x[1]); } else { System.out.println("重解"); System.out.println("\t x1 = x2 = " + x[0]); } } else { //戻り値が負ならば System.out.println("虚数解! 判別式 = " + d2); } } }
C:\Java>javac KaiTest2.java C:\Java>java KaiTest2 1 -2 -3 1x*x + -2x + -3 解 x1 = 3.0 解 x2 = -1.0 C:\Java>java KaiTest2 1 -2 1 1x*x + -2x + 1 重解 x1 = x2 = 1.0 C:\Java>java KaiTest2 1 -2 3 1x*x + -2x + 3 虚数解! 判別式 = -8.0