2013-01-06 1 views
1

나는 사용자가 할 수있는 작업을 가지고있다 : 1. 임의의 수의 좌표를 모든 좌표로 정한다; 2. 기준에 따라 포인트를 삭제하십시오.간단한 조건부 엔진을 만드는 방법

실현 : 1. 간단한 기준 (>, <, =,> = 등)의 경우. 2. 합성 기준의 경우는 두 개의 조건 (OR> , x> 5 OR y < 3, x < = 2 OR y = 0)으로 구성됩니다. 한 쿼리에서 선택한 항목을 다른 쿼리에서 선택한 항목에 추가합니다. 그런 다음 중복을 제거합니다. 물론 프로그램은 한 번에 필요한 것만 선택해야하기 때문에 이것은 잘못된 것입니다. 음,하지만 이것은 다소 만족 스럽습니다.

나는 C로 프로그램하기 때문에 자기가 알고있는 한 최선의 능력으로 자기 수정 코드를 사용할 가능성이 없다.

필자는 자신을 OR 또는 AND로 두 가지 기준으로 제한하기로 결정했습니다. 다음과 같이 볼 수 있습니다.>, <,> =, < =, =,! =. 그것은 6 가지 경우입니다. 그러면 x와 y, 점 ID, 원점으로부터의 거리. 4 건. 그렇다면 조합을 사용하면 이미 너무 많은 경우 구현할 수 있습니다.

하지만 각 경우에 특별한 조건을 제공하는 것만으로는 상상할 수 없습니다. 물론 각 쿼리에 따라 모든 것을 선택할 수 있습니다. 그런 다음 이산 수학 에서처럼 AND 또는 OR에 대한 교차를 사용하십시오. 그러나 나는 금식을하고 싶다. 컴퓨터는 필요한 것을 선택해야한다.

는 각각의 경우에 대해 I는 제공하는 경우 (X> 값 & Y < 값) 경우 (X < 값 & Y = 값) 경우 (X = 값 & Y = < 값)

등에

그러나 이것은 절대적으로 미친 듯합니다. 나에게 뭐라도 권할 수 있니?

+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 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 
}; 

당신이 계획 할 수 있습니다 :

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 
} 

는 이제 하나의 비교를 저장할 수있는 데이터 형식이, 당신이 필요로하는 술어를 저장하는 방법입니다 당신이 필요로하는 술어 (아마도 n-ary AND or OR).

당신이 필요로 할 마지막 것은 당신이 당신의 점수를 평가하고 당신이 끝낸 술어로 입력을 바꾸는 간단한 렉서와 파서입니다.