【问题标题】:How can i do cnf operator in java?我怎样才能在java中做cnf运算符?
【发布时间】:2013-05-11 18:03:14
【问题描述】:

我正在尝试在 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;

     }
    }

问题在于平等。

程序应检查变量是truefalse

例如:

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

这个程序确实像下面这样:

给 p 一个数字:1(用户将给一个数字一(true)或零(false))
给 q 一个数字:0
给 s 一个数字:1
给 t 一个数字:0
给 k 一个数字:0
(如果变量使用多个,程序会询问一次)

如果我们查看这些变量,我们可以看到 (1 or 0 or 1 or 0 or 0) 和 (1 or 0) 它会返回 true,但我不能这样做。我不明白该怎么做。

最好的祝愿。

【问题讨论】:

  • 您的源代码应始终使用 100% 英文编写。这样做的原因一个是专业标准,另一个是让别人理解,还有更多……
  • 如果有问题,我可以更改代码。我觉得没关系。
  • 但是,我很高兴你的 cmets,我正在等待你的帮助
  • 没关系,除非你想在这里得到答案。有多少程序员说英语而不是你的语言?您是向自己的国民还是向全世界提出问题?哪个更可能产生正确答案?这取决于你。
  • 实际上世界上有很多地方的代码不是用英文编写的。人们一直使用他们的母语。它可能会减少理解它的人数,因此如果您想要获得最大的反馈但又不需要对这个人提出质疑,那么这不是最好的主意。

标签: java acm-java-libraries conjunctive-normal-form


【解决方案1】:

this solution 进行一些修改以适应您当前的需求怎么样?

或者,作为一种粗略的解决方法,您可以使用 Rhino 作为 JavaScript 引擎,只需将操作的文本表示更改为 &amp;&amp;|| 等运算符,并拥有JS 引擎评估并给你结果。

如果您只对表达式的输出值感兴趣,那么以上内容就足够了。

如果您需要设计自己的算法,则需要自己编写解析器,这是一项繁琐的工作,但可行。

让用户连同运算符一起输入所有表达式(从实现的角度来看,这不会有太大的不同)。您当然需要验证输入。您需要处理的数据是01圆括号(触发结果堆叠/取消堆叠)和运算符本身(另外,还有是空格,但您应该忽略它们)。

基本上,从左到右求值,您获取第一个数据参数(01)并将其放入当前结果中。然后您读取 运算符 并将其应用于结果和下一条数据。依此类推,直到您到达输入的末尾。遇到括号时,最简单的做法是让解析器使用括号内的表达式递归调用自身(您应该匹配它们)并将返回值视为序数数据。

【讨论】:

  • 感谢您的关注。但是,我不能使用另一个库。我想你理解了这个问题,但我必须用我自己的代码来做
  • 那么您可能需要查看ScriptingEngineAbstractScriptingEngineBingdings,以便掌握更好的方法。此外,subjectofexpressionparsing 上有几篇文章。这些解释比我能解释的更好(即 “如果你需要设计自己的算法” 我的回答的一部分)。
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 2014-03-20
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多