ホーム » スタッフ » 斉藤徹 » 講義録 » オブジェクト指向 » 複素数とクラス・隠蔽化の演習

2018年5月
« 4月   6月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

複素数とクラス・隠蔽化の演習

コンストラクタやメソッドの書き方

前回のプログラムを、もう少しC++のオブジェクト指向っぽい書き方を導入してみる。この際に、分かりやすく記述するため、行数が長くなってきた時のための処理を考慮して、記述してみる。

#include <stdio.h>
#include <math.h>
class Complex {
private:
   double re ;
   double im ;
public:
   // 絶対座標系でも極座標系でも、実部・虚部・絶対値・偏角を扱うため
   inline double get_re() const { return re ; }
   inline double get_im() const { return im ; }
   inline double get_r()  const { return sqrt( re*re + im*im ) ; }
   inline double get_th() const { return atan2( im , re ) ; }

   // 極座標系なら、以下のような getterメソッド を書いておけば、
   //   座標系を気にせず処理がかける。
   // inline double get_re() const { return r * cos( th ) ; }
   // inline double get_r()  const { return r ; }

   // inline は、開いたサブルーチンで実装してくれるので処理速度が遅くならない
   // foo() const { ... } は、オブジェクトに副作用が無いことを示す。

   // コンストラクタのメンバー変数の初期化の書き方
   // Complex( ... )
   // : 要素1( 値1 ) , 要素2( 値2 ) ...
   // {  その他の初期化
   // }
   Complex()                       // コンストラクタ
   : re( 0.0 ) , im( 0.0 ) {}
   Complex( double r , double i )  // コンストラクタ
   : re( r ) , im( i ) {}

   // メソッドのプロトタイプ宣言
   //  メソッドの中身が長くなる場合は、
   //  名前と引数だけを宣言しておく
   void print() ;
   void add( Complex ) ;
   void mul( Complex ) ;
} ; // ←しつこいけどセミコロン忘れないでね。

// クラス宣言の外にメソッドの定義を書く
//   メソッドの中身の記述 「::」をクラス限定子と呼ぶ
void Complex::print() {
   printf( "%lf + j%lf¥n" , get_re() , get_im() ) ;
}
void Complex::add( Complex z ) {
   re = re + z.re ;
   im = im + z.im ;
}
void Complex::mul( Complex z ) {
   double r = re * z.re - im * z.im ;
   double i = re * z.im + im * z.re ;
   re = r ;
   im = i ;
}

int main() {
   Complex a( 1.0 , 2.0 ) ;
   Complex b( 2.0 , 4.0 ) ;
   a.add( b ) ;
   a.print() ;
   return 0 ;
}

参考資料

レポート1(複素数の加減乗除)

授業中に示した上記のプログラムをベースに、 記載されていない減算・除算のプログラムを作成し、レポートを作成する。 レポートには、下記のものを記載すること。

  • プログラムリスト
  • プログラムへの説明
  • 動作確認の結果
  • プログラムより理解できること。
    実際にプログラムを書いてみて分かった問題点など…

1件のコメント

コメントは停止中です。