我正在尝试在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
)或0 (false
))
给出q: 0
的一个数给s一个数字:1
给t一个数字:0
给k一个数字:0
(如果变量使用了多个,程序将询问一次)
如果我们看一下这些变量,我们可以看到(1或0或1或0或0)和(1或0)它会返回true,但我不能这么做。我不明白该怎么做。
祝福。
这个解决方案进行一些修改以适应您当前的需求怎么样?
或者,作为一个粗略的解决方案,您可以使用Rhino作为JavaScript引擎,简单地将操作的文本表示更改为&&
, ||
等操作符,并让JS引擎评估并给出结果。
如果您只对表达式的输出值感兴趣,上面的内容应该足够了。
如果你需要设计自己的算法,那么你需要自己编写一个解析器,这是一项繁琐的工作,但却是可行的。
让用户输入所有的表达式和操作符(从实现的角度来看,这不会有太大的不同)。当然,您需要验证输入。您需要处理的数据是0
、1
、括号(触发结果叠加/解叠加)和操作符本身(另外,还有空格,但您应该忽略它们)。
基本上,从左到右求值,取第一个数据参数(0
或1
)并将其放入当前结果中。然后读取运算符,并将其应用于结果和下一段数据。以此类推,直到你到达输入的末端。遇到括号时,最简单的方法是让解析器递归地使用括号内的表达式调用自己(您应该匹配它们),并将返回值视为有序数据。