【问题标题】:Splitting a string based on specific characters根据特定字符拆分字符串
【发布时间】:2015-06-14 11:38:01
【问题描述】:

我会尽量描述我的问题。 我正在尝试编写一个程序来处理如下等式:

F = (X∨A) ↔ (X∨B) ( (X OR A) is equivalent to (X OR B) )!

我必须用“X”来解决它,或者更好地说,写出析取和/或合取范式。

所以,理论上,它是这样的:

写真值表的时候,要看F什么时候等于1(重言式),写出合取/析取范式。

例如(给定表格的析取范式): 对于 A=0,B=0 和 A=1,B=1,X 的值无关紧要,对于 A=0,B=1 AND A=1,B=0,X 必须为 1。

最后, X=A∨B。

由于我是用 C# 编写的,所以方程式是在 TextBox 中编写的。 困扰我的是,我应该如何分隔我的字符串以便我可以部分解决它?

【问题讨论】:

  • 用特殊字符分隔怎么样:'(', ')', '∨', '↔', [...]?
  • 问题标题与您面临的问题无关。
  • 你的问题是“如何拆分字符串”
  • 是的,更像这样。如何拆分或操作字符串以获得更简单的方程?
  • 如果标题没有相关性,我很抱歉,但我发现从一种语言翻译成另一种语言有困难,因为我的英语不流利。我似乎没有找到解决方案,如果我写一个像这样的方程: A∨B↔-(A∨X) ,我需要如何操作字符串,以便我可以将该方程分成 F1 = A∨B , F2 = -(A∨X) 和 F3 = F1↔F2

标签: c# string-parsing string-split equations truthtable


【解决方案1】:

首先尝试 C# 中 String 类的“Split()”方法(或其他方法)怎么样?首先,您最好推动您的用户在每对标记(例如 A AND B)之间插入一个空白(作为 Split() 的分隔符),这样您就可以专注于求解器的主要逻辑。

【讨论】:

  • 感谢您的建议。我目前正在检查是否可以使用 Split() 方法。
  • 我使用了带有空格分隔符的 Split() 方法,并从一个字符串中创建了一个变量和运算符数组。现在,我可以使用“for 循环”并检查运算符,但我可以检查上一个和下一个数组项吗?例如,如果我正在寻找一个运算符 &,并想检查 A 是否在运算符之前,B 是否在运算符之后,这样检查是否可以? if(splitarray[i] == "&") { if((splitarray[i-1]=="A")&&(splitarray[i+1])=="B"){some-logic} } 或者是否会因为 i+1 元素的索引超出范围而向我发送错误?
  • 据我所知,“树”而不是“数组”最适合(逻辑)表达式。例如,“A AND B”创建一棵树,其中“AND”是根节点,“A”和“B”分别是左右子节点。 (您可以查看任何编译器教科书。)在 C# 中使用预定义的与树相关的 API 将使您的工作更轻松。
  • 但是如果你有任何特殊原因使用数组而不是树,我认为索引绑定检查是必要的。在这种情况下,List API 似乎比原始类型数组更好,因为您还可以利用 C# 的 Collection API 的丰富性,尤其是在检查状态和处理错误方面。
【解决方案2】:

我明白了。它基本上是一个简化的计算器,不需要(必须)通过按钮进行顺序输入,而是在文本框中键入或粘贴现成的公式。

因此你需要做的是

  • 在中定义一组允许的运算符(AND、OR、NOT、XOR 等) 各种允许的符号(Λ、V、!、=、!= 等、+、*、-、=、↔ 等)
  • 检查输入的语法是否正确;这意味着
    您可能必须首先从输入中删除所有空格
    字符串,然后对允许的结构使用正则表达式,这
    可能会被证明是一种痛苦
  • 如果输入有效,首先检查括号以确定分组 表达式
  • 根据布尔代数化简

或者直接点击这个链接(Java 但仍然):Boolean expression solver/simplifier,使用工具 bc2cnf 或任何其他链接到那里的库,通过将允许的输入限制为使用的库允许的。

希望这会有所帮助。

【讨论】:

  • 感谢您的建议。实际上,输入是从键盘输入还是通过按钮输入并不重要,我正在寻找一种更简单的解决方案。我可以选择将我的命题变量 (A,B,C) 限制为 2 或 3。我举了一个由其他人在上面的 cmets 中制作的逻辑计算器的示例 - ee.umd.edu/~yavuz/logiccalc。我还可以假设输入在语法上是正确的,以消除允许的构造带来的不必要的痛苦。
  • 所以,主要问题是,如果我通过按钮(变量 A、B、X 和表达式 AND、OR、NOT、IMPLIES )进行输入,我如何检测和解决部分方程,所以我可以,最后,解决整个方程?
  • 我认为您需要的不是拆分字符串,而是解析它。您可以将所有运算符替换为等效的 c#(将“AND”替换为“&&”)并使用真值表生成器:stackoverflow.com/questions/14925277/… 结合 bool.TryParse() 来评估字符串/字符串部分。你会试探。必须逐个解析字符串 char 以根据运算符优先级决定何时评估。我已经 18 年没有做布尔代数了,抱歉没有说得更详细。
  • 我好像没听懂你想说什么。如果我解析输入字符串,bool.TryParse() 将返回值 true/false。而且由于我的输入只有字母(变量)A、B、X.. 和逻辑运算符 &,|,- ,它会抛出异常还是返回 false?
  • 我打算使用 bool.Parse 来创建一个真值表。也许我误解了这一点,我只是认为您需要评估方程式的各个部分,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多