8

真理値表を実装するための適切な一般的なパターンはありますか?

私はいくつかのレガシー コード (C++) を作り直していますが、使用している関数が 3 つのバイナリ入力と 8 つの可能な出力を持つ真理値表になることに気付きました。8 つのテストのうちの 2 つと対応する出力の例を次に示します。

// - + +
if ( (prevdst5 < 0.0) && (dst5 > 0.0) && (nextdst5 > 0.0) ){
    thawpct = (dst5 / (dst5 - prevdst5));
}

// - - +
if ( (prevdst5 < 0.0) && (dst5 < 0.0) && (nextdst5 > 0.0) ){
    thawpct = (nextdst5 / (nextdst5 - dst5));
}

// other cases...

return thawpct;

基本的に、これを設定するための、よりクリーンで保守/拡張可能な*方法があるかどうか疑問に思っています。

  • 別の入力が追加された場合はどうなりますか? その場合、必要な if ステートメントの数は 16 になり、私の見解では、現在のパターンで管理するには面倒すぎます。
  • 複数の入力コンボを同じ出力にマップする必要がある場合はどうなりますか?

*コードベースはアカデミアで使用されるエコシステム モデルであるため、コード作成者の視点に応じて、メンテナンスと拡張は似たようなものになります。

4

3 に答える 3

9
int condition = ( prev >= 0 ? ( 1<<0 ) : 0 ) + 
                ( cur >= 0  ? ( 1<<1 ) : 0 ) + 
                ( next >= 0 ? ( 1<<2 ) : 0 );

switch (condition) {
  case 0: // - - -
  case 1: // + - -
  case 2: // - + -
  case 3: // + + -
  case 4: // - - +
  case 5: // + - +
  case 6: // - + +
  case 7: // + + +
}
于 2012-06-18T17:27:40.483 に答える
4

配列はテーブルです。

一連のブール値の真理値は 2 進数です。

配列は番号でインデックス付けされます。

すっごい.....

計算ごとに関数を定義できます。

// - + + == 0 1 1 == 3
inline double f3(double prev, double curr, double next)
{
  return curr / (curr - prev);
}

// - - + == 0 0 1 == 1
inline double f1(double prev, double curr, double next)
{
   return next / (next - curr);
}

// ...

次に、関数ポインターの配列を宣言します。

typedef double (*func_type)(double, double, double);
func_type funcs[8] = {
  f1, f2, // ...
};

次に、ブール条件を 2 進数として使用して配列にインデックスを付けます。

func_type f = funcs[ (int(prevdst5 < 0.0)<<2) | (int(dst5 < 0.0)<<1) | int(nextdst5 > 0.0) ];
thawpct = f(prevdst5, dst5, nextdst5);
  • 別の入力が追加された場合はどうなりますか? (その場合、テストの数は 16 になります。私の見解では、現在のパターンで管理するのは面倒です)

別の計算が必要な場合は、配列のサイズを 2 倍にして などを追加f8しますが、新しいテストを配列インデックスに 1 回だけ追加します。f9

func_type f = funcs[ (cond<<3) | (int(prevdst5 < 0.0)<<2) | (int(dst5 < 0.0)<<1) | int(nextdst5 > 0.0) ];
  • 複数の入力コンボを同じ出力にマップする必要がある場合はどうなりますか?

配列のいくつかの要素に同じ関数ポインターを格納します。

func_type funcs[8] = {
  f1, f2, f3, f1, f1, // ...
};
于 2012-06-18T17:21:40.733 に答える
0

n実行する必要がある適切な機能への 3 つ (または ) の値のマッピングを保持できます。true次に、条件の/状態に基づいて、このマップ内の関数をループし、それfalseを実行します。

このようにして、3 次元のマップが作成されます (すべての次元でサイズ 2)。

于 2012-06-18T17:22:29.207 に答える