1

我有一个任务,用户可以: 1. 形成任意数量的点任意坐标;2. 根据标准删除点。

我意识到: 1. 简单标准的情况(>、<、=、>= 等)。2.复合标准的情况,它由两个标准组成,它们之间有或(x>5 OR y<3,x<=2 OR y=0)。我只是将一个查询选择的内容添加到另一个查询选择的内容中。然后我删除重复项。这当然是不正确的,因为程序应该一次只选择必要的。嗯,但这或多或少让我满意。

我用 C 编程,所以据我所知并尽我所能,不可能使用自我修改代码。

我决定将自己限制在两个标准之间,它们之间有 OR 或 AND。我可以看到:>、<、>=、<=、=、!=。也就是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 元 AND 或 OR)。

您需要的最后一件事是一个简单的词法分析器和解析器,将您的输入转换为谓词,然后您评估您的观点,您就完成了。

于 2013-01-06T16:26:44.803 回答