1

Java で CNF 演算子を実行しようとしていますが、等式でエラーが発生します。

まず、ほとんどのソフトウェアを作成しましたが、完全には作成しませんでした。

私のコードはここにあります:

import acm.program.*;
public class split extends ConsoleProgram{
public void run()
{
    String veri     = "(p or q or s or t or k) and (p or q)";
    String yeni     = tekrarsil(parcala(veri));

    int []sayilar = new int[yeni.length()];
    for (int i = 0; i < yeni.length(); i++) {
        sayilar[i] = readInt("give a number for "+yeni.charAt(i)+" :");

    }
    for (int i = 0; i < sayilar.length; i++) {
        println(sayilar[i]);
    }
}

public String parcala(String veri)
{
    String yenistr  = "";
    String yeni[]   = veri.split("and");
    for (int j = 0; j < yeni.length; j++) {
        String yveri[] = yeni[j].split("or");
        for (int i = 0; i < yveri.length; i++) {
            yveri[i] = yveri[i].trim();
            if(i==0){
                yenistr = yenistr.concat(yveri[i].substring(1));

            }else if(i==yveri.length-1){
                yenistr = yenistr.concat(yveri[i].substring(0,yveri[i].length()-1));

            }else{
                yenistr = yenistr.concat(yveri[i]);

            }
        }
    }
    return (yenistr);
}
public String tekrarsil(String S)
{
        for (int i = 0; i < S.length(); i++)
            for (int k = i+1; k <= S.length()-1; k++){
                if (S.charAt(i) == S.charAt(k))
                {
                    S = S.substring(0,k)+ S.substring(k+1,S.length());
                    k--;
                }
            }
        return S;

     }
    }

問題は平等です。

プログラムは、変数がtrueまたはであることを確認する必要がありますfalse

例えば ​​:

(p or q or s or t or k) and (q or p)

このプログラムは次のようになります。

p : 1 の数を与える (ユーザーは数字の 1 ( true) またはゼロ ( false)
を与える) q の数を
与える : 0 s の数を与える : 1
t の数を
与える : 0 k の数を与える : 0
(変数が複数使用する場合、プログラムは 1 回尋ねます)

これらの変数を見ると、(1 または 0 または 1 または 0 または 0) と (1 または 0) が true を返すことがわかりますが、これはできません。やり方がわかりません。

幸運をお祈りしています。

4

1 に答える 1

2

現在のニーズに合わせていくつかの変更を加えたこのソリューションはどうですか?

または、大雑把な回避策として、Rhino&&を JavaScript エンジンとして使用し、単純に操作のテキスト表現を、 などの演算子に変更し||、JS エンジンで評価して結果を得ることができます。

式の出力値のみに関心がある場合は、上記で十分です。

独自のアルゴリズムを考案する必要がある場合は、退屈な作業ですが実行可能なパーサーを自分で作成する必要があります。

ユーザーが演算子とともにすべての式を入力できるようにします (実装の観点からはそれほど違いはありません)。もちろん、入力を検証する必要があります。処理する必要があるデータは0、 , 1,かっこ(結果のスタック/アンスタックをトリガーする) と演算子自体 (さらに、空白がありますが、単純に無視する必要があります) のいずれかです。

基本的に、左から右に評価して、最初のデータ パラメーター ( 、 のいずれか0)1を取得し、それを現在の結果に入れます。次に、演算子を読み取り、それを結果と次のデータに適用します。入力の最後に到達するまで同様です。括弧に遭遇したときの最も簡単な方法は、パーサーが括弧内の式で再帰的に自分自身を呼び出し (それらを一致させる必要があります)、戻り値を序数のデータとして扱うことです。

于 2013-05-11T22:05:04.010 に答える