我有一个任务,用户可以: 1.任何坐标形成任意数量的点; 2.根据标准删除点。
我意识到: 1.简单标准的情况(&gt;,&lt;,=,&gt; =等)。 2.复合标准的情况,它由两个标准组成,它们之间有OR (x> 5或y <3,x <= 2或y = 0)。我只是将一个查询所选择的内容添加到另一个查询所选择的内容中。然后我删除重复。这当然是不正确的,因为程序应该只选择一次需要的东西。好吧,但这对我来说或多或少是令人满意的。
我在C中编程,所以就我所知并且尽我所能,不可能使用自修改代码。
我决定将自己限制在两个标准之间,使用OR或AND。 我可以看到:&gt;,&lt;,&gt; =,&lt; =,=,!=。那是6例。然后x和y,点ID,距离原点的距离。 4例。然后,如果我使用组合,那将是我实施的太多案例。
但我无法想象除了为每个独特案例提供特殊条件之外的任何事情。 当然,我可以根据每个查询选择所有内容。然后使用AND的交集或OR的加法,就像我们在离散数学中那样做。但我喜欢这种方式:计算机应该只选择必要的东西。
因此,我提供的每个案例 if(x&gt; value&amp; y&lt; value) if(x&lt; value&amp; y = value) if(x = value&amp; y =&lt; value)
等。
但这似乎绝对是疯了。你能给我推荐什么吗?
答案 0 :(得分: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)。
你需要的最后一件事是一个简单的词法分析器和解析器,可以将你的输入变成一个谓词,然后你可以根据你的积分来评估你已完成。