2013-02-19 71 views
0

我目前正在使用布尔逻辑和真值表。我已经能够创建一个将生成2个变量(a,b)表的类。我的主要兴趣是在表中选择某些输入并为其输出设置“真”值。我已经能够通过override bool GetTruthValue()对上述内容进行硬编码,并在值为OutputTextBox的多行文本框中显示这些值输出结果。我想要计算真值的逻辑由用户提供。我目前的方法逻辑是由代码提供的。我如何让用户选择哪个输入的输出值为true?通过复选框或单独的texboxes(1或0)指示?还是其他建议?布尔逻辑 - 为输出选择真值

namespace table_outputs 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

    public abstract class TwoItemTruthRow 
     { 
      protected TwoItemTruthRow(bool a, bool b) 
      { 
       A = a; B = b; 
      } 

      public bool A { get; protected set; } 
      public bool B { get; protected set; } 

      public abstract bool GetTruthValue(); 
     } 

    public class MyCustomTwoItemTruthRow : TwoItemTruthRow 
     { 
      public MyCustomTwoItemTruthRow(bool a, bool b) 
       : base(a, b) 
      { 
      } 

      public override bool GetTruthValue() 
      { 
       // My custom logic- Hard coded 
       return (A && B) || (A && !B) || (!A && !B); 
      } 
     } 

    private static string GetHorizontalLineText() 
     { 
      return "-----------------------------------------------\r\n"; 
     } 
     private static string GetFormattedTwoItemText(MyCustomTwoItemTruthRow item) 
     { 
      return string.Format("{0}\t{1}\r\n", item.A, item.B); 
     } 

    private static IEnumerable<MyCustomTwoItemTruthRow> GenerateTruthTableTwo() 
     { 
      for (var a = 0; a < 2; a++) 
       for (var b = 0; b < 2; b++) 
        yield return new MyCustomTwoItemTruthRow(
         Convert.ToBoolean(a), 
         Convert.ToBoolean(b)); 
     } 

    private void GenerateTableButton_Click(object sender, EventArgs e) 
     { 
      InputTextBox.Clear(); 
      InputTextBox.Text += "A\tB\r\n"; 
      InputTextBox.Text += GetHorizontalLineText(); 

      var myTruthTable = GenerateTruthTable().ToList(); 
      foreach (var item in myTruthTable) 
      { 
       InputTextBox.Text += GetFormattedTwoItemText(item); 
       InputTextBox.Text += GetHorizontalLineText(); 
      } 
     } 
     private void ShowTrueValuesButton_Click(object sender, EventArgs e) 
     { 
      OutputTextBox.Clear(); 
      OutputTextBox.Text += "True Values\r\n"; 
      OutputTextBox.Text += "A\tB\r\n"; 
      OutputTextBox.Text += GetHorizontalLineText(); 

      var myTruthTable = GenerateTruthTableTwo().ToList(); 
      foreach (var item in myTruthTable) 
      { 

       if (item.GetTruthValue()) 
        OutputTextBox.Text += GetFormattedTwoItemText(item); 
      } 
     } 


    } 
} 

当前的WinForm enter image description here

enter image description here

回答

0

我建议用一个单独的文本框,一个动态的DataGridView指示变量的数目。

默认值可以是2个变量,启动时DataGridView将作为您的真值表生成,最后一列用于编辑每行所需的输出。

如果用户更改了变量的数量,请相应地调整您的DataGridView。 (您可能需要添加一个按钮来更改DataGridView)

无论如何,我会建议您尽量使接口的点击/击键次数尽可能少。

2

您可以将对象列表绑定到表单上的DataGridView,并为每个输入和输出字段创建列。对列使用DataGridViewCheckBoxColumn会为您提供一组用户可以与之交互的复选框。在输入列上设置ReadOnly,并可能更改背景颜色以表明它们已修复。

您可以动态定义列或创建尽可能多的列,并隐藏未使用的列。取决于你想如何定义你所附加的数据。

这里有一个样机我在VS2010做:

enter image description here

这势必以下对象类型的列表:

public class TruthTableEntry 
{ 
    public bool A { get; set; } 
    public bool B { get; set; } 
    public bool C { get; set; } 
    public bool D { get; set; } 
    public bool Out { get; set; } 
} 

下面是我的实体模型的形式代码:

public partial class Form1 : Form 
{ 
    List<TruthTableEntry> table; 

    public Form1() 
    { 
     // generate a 3-input truth table (8 input variations) 
     table = GenerateTruthTable(3); 

     // setup DataGridView 
     dataGridView1.DataSource = table; 
     dataGridView1.Columns[0].DataPropertyName = "A"; 
     dataGridView1.Columns[1].DataPropertyName = "B"; 
     dataGridView1.Columns[2].DataPropertyName = "C"; 
     dataGridView1.Columns[3].DataPropertyName = "D"; 
     dataGridView1.Columns[4].DataPropertyName = "Out"; 
     // hide column 3 ('D') as unused 
     dataGridView1.Columns[3].Visible = false; 
    } 
} 

// Create a truth table for 1-4 inputs 
static List<TruthTableEntry> GenerateTruthTable(int numInputs) 
{ 
    // range-check number of inputs 
    if (numInputs < 1 || numInputs > 4) 
     return null; 

    // calculate number of input states 
    int permutations = 1 << numInputs; 

    // create result list of input states 
    List<TruthTableEntry> res = new List<TruthTableEntry>(); 
    for (int i = 0; i < permutations; ++i) 
    { 
     // use bit manipulation to initialize a TruthTableEntry: 
     TruthTableEntry ent = new TruthTableEntry 
      { 
       A = (i & (1 >> (NumInputs - 1))) != 0, 
       B = (i & (1 >> (NumInputs - 2))) != 0, 
       C = (i & (1 >> (NumInputs - 3))) != 0, 
       D = (i & (1 >> (NumInputs - 4))) != 0, 
       Out = false, 
      }; 
     res.Add(ent); 
    } 
    return res; 
} 

dataGridView1DataGridView列5 DataGridViewCheckBoxColumn列定义,前4列设置为ReadOnly和彩色。

+0

+1这太好了。虽然我知道它是一个模拟。但是,你能详细说明这个答案,所以它可以成为一个有效的例子。我很难得到这个部分的工作:'List table;'和'table = GenerateTruthTable(3);'在我的表单中 – CodingWonders90 2013-02-21 04:01:21