1.修正方法1(パーツCoulomb)
必要なフィーチャー・ソース・コードだけを生成し、コーディングする場合
(見栄えの悪いソース・コードの作成)
第8章で作成したパーツCoulombでは、アクションcalc(int n)の引数によって、
下記のように求める値を指定していた。
n=1の場合、forceが求められる。
n=2の場合、charge1が求められる。
n=3の場合、charge2が求められる。
n=4の場合、distanceが求められる。
n=5の場合、dielectricが求められる。
しかし、n値とそれぞれとの関係が直感的に分からないため、下記のように
変更する。
s="F"の場合、forceが求められる。
s="Q1"の場合、charge1が求められる。
s="Q2"の場合、charge2が求められる。
s="R"の場合、distanceが求められる。
s="Epsi"の場合、dielectricが求められる。
1.WorkFrame IDEアイコンをダブルクリック後、「既存のプロジェクトをオープンします」を
クリックする。
ElectMag.IWPをダブルクリックする。
2.WorkFrameのElectMag.vbbをダブルクリックし、ビジュアル・ビルダーを起動する。
3.非ビジュアル・パーツのCoulombをダブルクリックする。
4.「パーツ・インターフェース・エディター」のアクションを選び、calcを削除する。
5.calcと入力し、「デフォルト」をクリックする。
6.アクション・メンバー関数の引数にIString sと入力する。
[ virtual int calc(IString s)とする。]
7.優先のページで、アクションcalcを追加する。
8.「ファイル」->「保管および生成」->「フィーチャー・ソース」をクリックする。
9.「Coulomb−フィーチャー・ソース・コードを作成します」ダイアログにおいて、
今回追加するのはアクションcalcだけであるので、メンバー関数の
virtual int calc(IString s)だけを選択し、「選択されたものの生成」を
クリックする。
10.「プロジェクト」->「編集」をクリックし、Coulomb.hpvを開く。
下記のようなコードが書かれている。
// Feature source code generation begins here...
古いコードが書かれている。
// Feature source code generation ends here.
// Feature source code generation begins here...
public:
virtual int Coulomb::calc(IString s)
// Feature source code generation ends here.
最初の部分が以前に生成されたコードであり、下が今回作成されたアクション
calc(IString s)に関するコードである。
このように、VisualAge C++ではコードが追加される。
11.古いのコードのvirtual int calc(int n)を削除する。
12.セーブする。
13.Coulomb.cpvを開く。
14.下記に追加されたコードを示す。
15.最初のコードint Coulomb::calc(int n)の{ }内をコピーし、
下記のように修正する。
// Feature source code generation begins here...
int Coulomb::calc(IString s)
{
double epsilon0=8.85418e-12; // F/m
double pi=3.1415927;
if( s=="F" ) // 力を求める 修正個所
{ 修正個所
if( iDistance==0.0 || iDielectric==0.0 ) // 距離または比誘電率がゼロのとき、
{ // 下記のコメントのダイアログを表示する
IString errorTxet = IString("距離または比誘電率がゼロです。");
IException exc( errorText, 0, IException::unrecoverable );
ITHROW( exc );
}
setForce( iCharge1*iCharge2/4.0/pi/epsilon0/iDielectric/iDistance/iDistance );
} 修正個所
if( s=="Q1" ) // 電荷1を求める 修正個所
{ 修正個所
if( iChrage2==0.0 ) // 電荷2がゼロのとき、
{ // 下記のコメントのダイアログを表示する
IString errorTxet = IString("電荷2がゼロです。");
IException exc( errorText, 0, IException::unrecoverable );
ITHROW( exc );
}
setCharge1( 4.0*pi*epsilon0*iDielectric*iDistance*iDistance/iCharge2 );
} 修正個所
if( s=="Q2" ) // 電荷2を求める 修正個所
{ 修正個所
if( iChrage1==0.0 ) // 電荷1がゼロのとき、
{ // 下記のコメントのダイアログを表示する
IString errorTxet = IString("電荷1がゼロです。");
IException exc( errorText, 0, IException::unrecoverable );
ITHROW( exc );
}
setCharge2( 4.0*pi*epsilon0*iDielectric*iDistance*iDistance/iCharge1 );
} 修正個所
if( s=="R" ) // 距離を求める 修正個所
{ 修正個所
if( iForce==0.0 || iDielectric==0.0 ) // 力または比誘電率がゼロのとき、
{ // 下記のコメントのダイアログを表示する
IString errorTxet = IString("力または比誘電率がゼロです。");
IException exc( errorText, 0, IException::unrecoverable );
ITHROW( exc );
}
setDistance( sqrt( fabs(iCharge1*iCharge2/4.0/pi/epsilon0/iDielectric/iForce) ) );
} 修正個所
if( s="Epsi" ) // 比誘電率を求める 修正個所
{ 修正個所
if( iDistance==0.0 || iForce==0.0 ) // 距離または力がゼロのとき、
{ // 下記のコメントのダイアログを表示する
IString errorTxet = IString("距離または力がゼロです。");
IException exc( errorText, 0, IException::unrecoverable );
ITHROW( exc );
}
setDielectric( fabs(iCharge1*iCharge2/4.0/pi/epsilon0/iForce/iDistance/iDistance) );
} 修正個所
return 0;
}
// Feature source code generation ends here.
16.最初のコードint Coulomb::calc(int n)全体を削除する。
17.セーブする。
18.今後パーツCoulombを利用できるように、覚え書きCoulomb.htmlを下記のように
修正する。
パーツCoulombの説明
クーロンの法則
force=charge1*charge2/(4*pi*epsilon0*dielectric*distance*distance)
変数
電磁力:force [N]
電荷1:charge1 [C]
電荷2:charge2 [C]
距離:distance [m]
比誘電率:dielectric
定数
円周率:pi=3.1415927
真空誘電率:epsilon0=8.85418e-12
五つの変数のうち、四つを与え、残りの一つが求められる。
Coulombパーツ | |||
属性 |
タイプ |
コメント |
優先 |
force |
double |
電磁力 |
O |
charge1 |
double |
電荷1 |
O |
charge2 |
double |
電荷2 |
O |
distance |
double |
距離 |
O |
dielectric |
double |
比誘電率 |
O |
アクション |
タイプ |
パラメータ |
|
calc |
int |
IString s |
O |
calc(IString s)について
s="F"の場合、forceが求められる。
s="Q1"の場合、charge1が求められる。
s="Q2"の場合、charge2が求められる。
s="R"の場合、distanceが求められる。
s="Epsi"の場合、dielectricが求められる。
すべてにおいて、分母がゼロになる場合、例外処理を行う。
計算に成功すると0を戻す。
例外処理のメッセージが含まれている。
必要なファイル |
||
ElectMag.vbb |
Coulomb.cpv |
Coulomb.hpv |