1

これは私の最初の質問です。何か問題があれば修正してください。ドキュメント システムの 1 つにいくつかの古いルールのセットがあり、それらを新しいドキュメント システムに変換しようとしています。私は以下のようにお互いの中にたくさん入れ子にIF-ENDIFしています。IF-ELSE-ENDIF以下の入力を対応する出力に変換するロジックが必要です。アルゴのヘルプが必要です。ありがとう

INPUT:  
IF (Cond 1)  
    IF(Cond 2)  
    ENDIF  
    IF(Cond3)  
    ELSE  
    ENDIF  
ELSE  
    IF(Cond4)  
    ELSE  
        IF(Cond5)  
        ELSE  
        ENDIF  
    ENDIF  
    IF(Cond6)  
    ENDIF  
ENDIF  

必要な出力:

    IF(Cond1) AND (Cond2)  
    IF(Cond1) AND (Cond3)  
    IF(Cond1) AND !(Cond3)  
    IF!(Cond1) AND (Cond4)  
    IF!(Cond1) AND !(Cond4)  AND (Cond5)  
    IF!(Cond1) AND !(Cond4) AND !(Cond5)  
    IF!(Cond1) AND (Cond6)  
4

2 に答える 2

0

各ノードが「if-else」ステートメントを表し、子ノードがネストされた if-else ステートメントであるツリー状のデータ構造に入力を読み取って解析したと仮定すると、一般的なアイデアを提供する大まかな擬似コードを次に示します。

process(tree,output)
  if tree == null
    write output to file
    return
  for each child in body of if
     process(child,output + "AND <condition of root node in tree>")
  for each child in body of else
     process(child,output + "AND !<condition of root node in tree>")
于 2013-02-14T13:43:00.807 に答える
0

そもそもファイルを解析できるロジックがあると仮定します。その場合、各ノードが次のような抽象構文ツリーになるはずです。

If
  |
  +--- Condition
  |
  +--- Positive statement
  |
  +--- Negative statement

また

Sequence
  |
  +--- Statement 1
  |
  +--- Statement 2
  |
  ...
  |
  +--- Statement n

また

Terminal

ここで、Terminal は具体的なステートメントを表します。これらは、元の入力ファイルでは暗黙的です。たとえば、「IF(COND2) ENDIF」は次のように表されます。

If
  |
  +--- Cond2
  |
  +--- Terminal
  |
  +--- (null)

あなたの場合、実際のツリーは次のようになります。

If
  |
  +--- Cond1
  |
  +--- Sequence
  |      |
  |      +--- If
  |      |      |
  |      |      +--- Cond2
  |      |      |
  |      |      +--- Terminal
  |      |      |
  |      |      +--- (null)
  |      |
  |      +--- If
  |             |
  |             +--- Cond3
  |             |
  |             +--- Terminal
  |             |
  |             +--- Terminal
  |
  +--- If
       ...

出力を生成するには、単純にツリーを再帰的にたどり、途中で条件のスタックを構築し、ステートメントに到達したら、それらの間に AND を使用して条件のスタック全体を出力します。ここにいくつかの擬似コードがあります:

void treeWalk(root):
    treeWalk(root, []);

void treeWalk(root, conditions):
    case root of:
        If(cond, positive, negative):
            if (positive is not null):
                treeWalk(positive, conditions + cond)
            if (negative is not null):
                treeWalk(negative, conditions + !cond)
        Sequence(statements):
            for each statement in statements:
                treeWalk(statements, conditions)
        Terminal:
            print "IF "
            for each condition in conditions:
                if (condition is not the last condition):
                    print " AND "
                print condition

ここでは + を使用して、リストに項目を追加することを示しています。!cond は、"!" 前面に。

それが役立つことを願っています!

于 2013-02-14T13:59:55.560 に答える