1

ユーザーができるタスクがあります。1.任意の数のポイントを任意の座標に形成します。2. 基準に従ってポイントを削除します。

1. 単純な基準 (>、<、=、>= など) の場合。2. 間に OR がある 2 つの基準で構成される複合基準の場合 (x>5 OR y<3、x<=2 OR y=0)。あるクエリで選択されたものを、別のクエリで選択されたものに追加するだけです。次に、重複を削除します。もちろん、プログラムは一度に必要なものだけを選択する必要があるため、これは正しくありません。まあ、でもこれは私にとって多かれ少なかれ満足のいくものです。

私は C でプログラミングしているので、私の知る限り、私の能力の及ぶ限り、自己修正コードを使用する可能性はありません。

OR または AND を間に挟んだ 2 つの基準に限定することにしました。>、<、>=、<=、=、!= が表示されます。つまり6ケース。次に、x と y、ポイント ID、原点からの距離。4ケース。次に、組み合わせを使用すると、実装するにはすでに多すぎます。

しかし、個々のケースごとに特別な条件を提供する単純な方法しか想像できません。もちろん、各クエリに従ってすべてを選択できます。次に、離散数学で行うように、AND の交点または OR の加算を使用します。しかし、私は断固とした方法でそれを行いたいと思います。コンピューターは必要なものだけを選択する必要があります。

したがって、各ケースについて、 if (x > value & y < value) if (x < value & y = value) if (x = value & y =< value) を提供します

等。

しかし、これは完全に狂っているようです。何かお勧めできますか?

4

1 に答える 1

0

これは、カスタムスクリプトコードの解釈に関するものです。

それが実際にどのように機能するかは、オブジェクトを使用して説明するのは簡単ですが、オブジェクトがないとかなり難しくなります。オブジェクトがない場合は、述語を格納できるカスタム構造が必要になります。少しだけクリアするための簡単な例を示します。

union Expression {
  char type;
  int number;
};

int expressionValue(const Point &curPt, const Expression &exp) {
  if (type == TYPE_NUMBER) return exp.number;
  else if (type == TYPE_X) return curPt.x;
  else if (type == TYPE_Y) return curPT.y;
};

このようにして、生の数値や現在のポイントの座標など、式の任意の種類の値を格納できるユニオンができます。

struct Comparison {
  Expression exp1;
  Expression exp2;
  char type;
};

bool evaluateComparison(const Point &curPt, const Comparison &comp) {
  int v1 = expressionValue(pt, exp1);
  int v2 = expressionValue(pt, exp2);

  if (type == '=') return v1 == v2;
  else if (type == '<') return v1 < v2;
  // so on
}

これで、単一の比較を格納できるデータ型ができました。必要なのは、述語を格納する方法です。

struct Predicate {
  char type;
  Comparison comp1;
  Comparison comp2;
};

bool evaluatePredicate(const  Point &curPt, const Predicate &pred) {
  if (pred.type == TYPE_OR) return evaluateComparison(curPt, comp1) || evaluateComparison(curPt, comp2);
  // oothers
};

もちろん、必要な式や述語の種類を計画することもできます(おそらく、n-ary ANDまたはOR)。

最後に必要なのは、入力を述語に変換するための単純なレクサーとパーサーです。これをポイントで評価すると、完了です。

于 2013-01-06T16:26:44.803 に答える