複素数型Complex
を作成しましょう.
フィールドには,Double
型のreal
,imag
を定義してください.
また,print
メソッドでComplex
を出力するようにしましょう.
public class Complex{
Double real;
Double imag;
void print(){
System.out.printf("%5.2f + %5.2f i",
this.real, this.imag);
}
void println(){
this.print();
System.out.println();
}
public String toString(){
return String.format("%5.2f + %5.2f i", this.real, this.imag);
}
}
上記のように,独自の型にはフィールドとメソッドを同時に定義できます.
なお,toString
メソッドはその実体を文字列に変換するときに自動的に呼び出されます.
標準的な Java の実体を拡張しているため,メソッドのシグネチャは必ず public String toString()
である必要があります.
もし,public
をつけ忘れるとコンパイルエラーになります.toString
内で
利用しているString.format
メソッドは C 言語の sprintf
と同じ機能を持つものです.
書式付きフォーマッタで文字列を作成します.
Complex complex = // ... 何か値を作成する.
System.out.printf("%s%n", complex); // このようなとき,自動的に toString
System.out.println(complex); // が呼び出され,complex の文字列表現が出力される.
次に,Complex
を利用するプログラム ComplexCalculator
を作成しましょう.
public class ComplexCalculator{
void run(){
Complex c1 = this.createComplex(3.0, 4.0);
c1.println();
}
Complex createComplex(Double realValue,
Double imagValue){
Complex c = new Complex();
c.real = realValue;
c.imag = imagValue;
return c;
}
// mainメソッドは省略.
}
上記のrun
メソッド内で,Complex
型の print
メソッドを呼び出しています.
このように,メソッドを呼び出すにも,変数を経由して呼び出す必要があります.
一方,変数(フィールド)も変数を経由してアクセスします.createComplex
メソッドをみてください.
このように,Complex
型の変数 c
を経由してフィールドにアクセスしています.
このように,メソッドもフィールドも,必ず変数を経由してアクセスする必要があります.
さて,Complex
型に Double
型を返す absolute
メソッドを追加してください.引数はありません.
複素数の絶対値を返すメソッドです.
$z=a+bi$の絶対値$r$は,$r = |z| = \sqrt{a^2 + b^2}$で求められます.
上記が完成すれば,ComplexCalculator
で absolute
を呼び出し,結果を出力してください.
public class Complex{
Double real;
Double imag;
void print(){
System.out.printf("%5.2f + %5.2f i",
this.real, this.imag);
}
void println(){
this.print();
System.out.println();
}
public String toString(){
return String.format("%5.2f + %5.2f i", this.real, this.imag);
}
Double absolute(){
return Math.sqrt(this.real * this.real + this.imag * this.imag);
}
}
public class ComplexCalculator{
void run(){
Complex c1 = this.createComplex(5.0, -6.0);
Complex c2 = this.createComplex(3.0, 2.0);
System.out.printf("absoluate(%s) = %f%n", c1, c1.absolute());
}
// createComplex は省略.
// mainメソッドは省略.
}
次に,Complex
型に Complex
型の実体を返す conjugate
メソッドを追加してください.
引数はありません.conjugate
は共役複素数を意味します.虚部の符号を逆転させたものであり,
$z=a+bi$ の共役複素数は,$\bar{z}=a-bi$です.conjugate
メソッド内で
新たにComplex
型の実体を作成し,
呼び出されたメソッドがもつ複素数の共役複素数として変数に値を代入し,返してください
(this
の値を元に,共役複素数を作成し,返してください).
上記が完成すれば,ComplexCalculator
で conjugate
を呼び出し,結果を出力してください.
public class Complex{
Double real;
Double imag;
void print(){
System.out.printf("%5.2f + %5.2f i",
this.real, this.imag);
}
void println(){
this.print();
System.out.println();
}
public String toString(){
return String.format("%5.2f + %5.2f i", this.real, this.imag);
}
Double absolute(){
return Math.sqrt(this.real * this.real + this.imag * this.imag);
}
Complex conjugate(){
Complex complex = new Complex();
complex.real = this.real;
complex.imag = this.imag * -1;
return complex;
}
}
public class ComplexCalculator{
void run(){
Complex c1 = this.createComplex(5.0, -6.0);
Complex c2 = this.createComplex(3.0, 2.0);
System.out.printf("absoluate(%s) = %f%n", c1, c1.absolute());
System.out.printf("conjugate(%s) = %s%n", c1, c1.conjugate());
}
// createComplex は省略.
// mainメソッドは省略.
}