布尔逻辑 - 为输出选择真值

时间:2013-02-19 00:18:29

标签: c#

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

2 个答案:

答案 0 :(得分: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;
}

dataGridView1是一个DataGridView,其中定义了5个DataGridViewCheckBoxColumn列,前4列设置为ReadOnly并着色。

答案 1 :(得分:0)

我建议使用带有单独文本框的动态DataGridView来指示变量的数量。

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

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

无论如何,我建议瞄准界面要求尽可能少的点击/击键。