b. 非ビジュアル・パーツの作成

3.非ビジュアル・パーツQuadを作成する。

非ビジュアル・パーツ

Quadパーツの機能設定

クラス名

Quad

説明

二次方程式の解(Quadratic formula)

ファイル名

moreTwo

パーツタイプ

非ビジュアル・パーツ

基底クラス

IStandardNotifier

.hpvファイル

"Quad.hpv"

.cpvファイル

"Quad.cpv"

インクルード・ファイル

<istring.hpp>

<math.h>

クラス・エディターを示す。

平方根を計算する関数sqrt()を用いるため、<math.h>をインクルードする。

4.属性・アクションを設定する。

Quadパーツ

属性

タイプ

説明

優先

num1

double

 

O

num2

double

 

O

num3

double

 

 

 

result1

double

 

 

 

result2

double

 

 

 

アクション

タイプ

パラメータ

説明

O

calc

IString

なし

二次方程式の解

O

 

5.フィーチャー・ソース・コードを作成する。

6.Quad.cpvファイルを修正する。

IString Quad::calc()
{
  double delta=iNumB*iNumB-4.0*iNumA*iNumC;// 解の公式の平方根の中
  
IString R;
 
  
if( iNumA==0.0 )
  {
    
if( iNumB==0.0 )  // c = 0 の場合
    {
      
setResult1( 0.0 );
      notifyObservers(INotificationEvent(Quad::result1Id, *this)); 注}
      
setResult2( 0.0 );
      R = "";
    }
    
else        // bx + c = 0 の場合
    {
      
setResult1( -iNumC/iNumB );
      setResult2( 0.0 );
      R = "";
    }
  }
  
else
  {
    
if( delta>=0.0 ) // 実数根の場合
    {
      
setResult1( ( iNumB - sqrt(delta) )/2.0/iNumA );
      setResult2( ( iNumB + sqrt(delta) )/2.0/iNumA );
      R = ",";
    }
    
else      // 虚数根の場合
    {
      
setResult1( iNumB/2.0/iNumA );
      setResult2( sqrt(-delta)/2.0/iNumA );
      R = "±i";
    }
  }
  
return R;
}

  プログラム中のsetResult1(A)は、Aの値をresult1に代入し、

  result1の値が変更されたこと(イベント)を、Quad.cpv中の

  

  のnotifyObservers(INotificationEvent(Quad::result1Id, *this));の行で

  接続されている他のクラスに知らせる。

  注)numA=0かつnumB=0のとき、result1(0.0)にしている(aResult1=0.0)。

    ところが、result1は最初に0.0と設定されるため(iReult1=0.0)

    または前回の計算結果が0.0の場合(iReult1=0.0)、

    上記のQuad& Quad::setResult1(0.0)ではiResult1==aResult1のため、

    notifyObservers(INotificationEvent(Quad::result1Id, *this));

    が実行されない。

    そのため、この行にnotifyObserversを挿入して、

    強制的にイベントresult1IDを発生させている。

7.Mainのコンポジション・エディターに戻り、

  「オプション」->「パーツの追加」をクリックする。

8.パーツの追加のダイアログに、Quad*を入力し、「追加」をクリックする。