Создание программы для построения таблицы истинности

Автор работы: Пользователь скрыл имя, 14 Июня 2013 в 17:52, лабораторная работа

Краткое описание

Цель
Создать программу, которая бы помогла быстро проверить правильность созданных вручную таблиц истинности.
Задание
Написать программу, которая будет строить таблицы истинности для исходных и упрощенных форм, и проверять их тождественность. Таблицы истинности выводить на экран.

Прикрепленные файлы: 1 файл

MyLogicalCalculator.DOC

— 210.50 Кб (Скачать документ)

                        

                            case "*":

                                {

                                    bool a = ConvertToBool(stack.Pop());

                                    bool b = ConvertToBool(stack.Pop());

                                    summ = a & b;

                                    break;

                                }                          

                         

                            case "!":

                                {

                                    bool a = ConvertToBool(stack.Pop());

                                    summ = !a;

                                    break;

                                }

                            case "|":

                                {

                                    bool a = ConvertToBool(stack.Pop());

                                    bool b = ConvertToBool(stack.Pop());

                                    summ = !a | !b;

                                    break;

                                }

                            case "~":

                                {

                                    bool a = ConvertToBool(stack.Pop());

                                    bool b = ConvertToBool(stack.Pop());

                                    summ = (a & b) | (!a & !b);

                                    break;

                                }

                            case "@":

                                {

                                    bool a = ConvertToBool(stack.Pop());

                                    bool b = ConvertToBool(stack.Pop());

                                    summ = (!a & b) | (a & !b);

                                    break;

                                }

                            case "v":

                                {

                                    bool a = ConvertToBool(stack.Pop());

                                    bool b = ConvertToBool(stack.Pop());

                                    summ = !a & !b;

                                    break;

                               }

                            case "<":

                                {

                                    bool b= ConvertToBool(stack.Pop());

                                    bool a = ConvertToBool(stack.Pop());

                                    summ = a & !b;

                                    break;

                                }

                            case "<<":

                                {

                                    bool b = ConvertToBool(stack.Pop());

                                    bool a = ConvertToBool(stack.Pop());

                                    summ = !a & b;

                                    break;

                                }

                            case ">":

                                {

                                    bool b = ConvertToBool(stack.Pop());

                                    bool a = ConvertToBool(stack.Pop());

                                    summ = !a | b;

                                    break;

                                }

                            case ">>":

                                {

                                    bool b = ConvertToBool(stack.Pop());

                                    bool a = ConvertToBool(stack.Pop());

                                    summ = a | !b;

                                    break;

                                }

                        }

                    }

                    // Обрабатываем исключение

                    catch (Exception ex)

                    {

                        // Выводим сообщение о возникшей ошибке

                        Console.WriteLine(ex.Message);

                    }

                    // заносим вычисленное число в стек

                    stack.Push(summ.ToString());

                    // если в очереди содержатся элементы

                    if (queue.Count > 0)

                        // то извлекаем элемент с очереди

                        // и заносим в текущую переменную

                        str = queue.Dequeue();

                    else // иначе прекращаем выполнения цикла

                        break;

                }

            }

            return Convert.ToBoolean(stack.Pop());

        }

 

        // Возвращает перечисление строк, содержащие результат

        // выполнения каждого выражения, в соответствии с таблицой истинности

        // Или набор результатов, каждой строчки таблицы истинности

        public List<string> SetOfResults(string input, out List<string> rowsCountOrLogicalNumbers, out List<string> columnsCountOrVariables)

        {

            List<string> listResult = new List<string>();

            List<string> setOfString = new List<string>(Separate(input));       

            List<string> setOfChangesVariables = OutputForAssignValue2.ChangeVariableToLogicNumber(setOfString, out rowsCountOrLogicalNumbers, out columnsCountOrVariables);

   

            for (int i = 0; i < setOfChangesVariables.Count; i++)

                listResult.Add(ConvertBoolToString(Result(setOfChangesVariables[i])));

            return listResult;

        }

 

        // Конвертирует строковое логическое число в соответствующие логическое значение

        private bool ConvertToBool(string digitString)

        {

            try

            {

                switch (digitString.ToLower())

                {

                    case "1":

                    case "true":                       

                        return true;

                    case "0":

                    case "false":

                        return false;

 

                    default:

                        return false;

                }

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);

                return false;

            }

        }

 

        // Конвертирует логическое true или false в

        // строковое "1" или "0"

        private string ConvertBoolToString(bool result)

        {

            switch (result)

            {

                case true:

                    return "1";                   

                case false:

                    return "0";

                default:

                    return "0";

            }

        }

    }

}

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using OPN2;

 

namespace MyLogicalCalculator

{

    public partial class Form1 : Form

    {

        PostfixNotationExpression convertExpression;

        

        public Form1()

        {

            InitializeComponent();

            convertExpression = new PostfixNotationExpression();

            Console.ReadLine();

        }

 

        private void buttonCalculate_Click(object sender, EventArgs e)

        {

            UpdateForm();

        }

 

        private TextBox FocusStringForTextBox(TextBox textBoxInput, int selectionStart)

        {

            // Задаем фокус для нашей строки

            textBoxInput.Focus();

            // Так после задания фокуса остаются выделенные символы,

            // то убираем выделение

            textBoxInput.SelectionLength = 0;

            // Возращаем положение курсора

            textBoxInput.SelectionStart = selectionStart;

            return textBoxInput;

        }

 

        private TextBox InputSymbolInTextBox(TextBox textBoxInput, string symbol = "", bool isDelete = false)

        {

            //TextBox textOutput;

            // Если курсор находится в конце строки

            if (textBoxInput.SelectionStart == textBoxInput.Text.Length)

            {

                // если нажата клавиша backspace, то

                if (isDelete == true)

                    // удаляем один символ с конца строки

                    textBoxInput.Text = textBoxInput.Text.Remove(--textBoxInput.SelectionStart, 1);

                else

                    // иначе добавляем символ в конец строки

                    textBoxInput.Text += symbol;

                // Задаем фокус ввода элемента управления или показываем курсор

                return FocusStringForTextBox(textBoxInput, textBoxInput.Text.Length);

            }

            else // Иначе, значит, что курсор находится где-то в середине или в начале

                // Если есть выделенный текст

                if (textBoxInput.SelectionLength != 0)

                {

                    // Сохраняем текущие положение курсора

                    // так как после вставки символа в строку, его положение сбивается

                    int selectionStart = textBoxInput.SelectionStart;

                    // то удаляем те символы, которые выделены

                    textBoxInput.Text = textBoxInput.Text.Remove(selectionStart, textBoxInput.SelectionLength);

 

                    // Если была нажата клавиша backspace,

                    // то вставку символа мы пропускаем

                    if (isDelete == false)

                    {

                        // Вставляем символ на место удаленных символов

                        textBoxInput.Text = textBoxInput.Text.Insert(selectionStart, symbol);

                        // Выводим курсор и возращаем значение форматированной строки

                        selectionStart++;

                    }                     

          

                    return FocusStringForTextBox(textBoxInput, selectionStart);

                }

                else // иначе курсор просто находится где-то в тексте

                {

                    // Сохраняем текущие положение курсора

                    // так как при вставке символа положение курсора сбивается

                    int selectionStart = textBoxInput.SelectionStart;

 

                    // Если была нажата клавиша backspace

                    if (isDelete == true)               

                        // то удаляем один символ в заданной позиции

                        textBoxInput.Text = textBoxInput.Text.Remove(--selectionStart, 1);                    

                    else

                    {

                        // Вставляем тектс в заданную позицию

                        textBoxInput.Text = textBoxInput.Text.Insert(selectionStart, symbol);

                        selectionStart++;

                    }

                    // Выводим форматированную строку вместе с курсором

                    return FocusStringForTextBox(textBoxInput, selectionStart);

                }

        }

 

        private void UpdateForm()

        {

            try

            {

               List<string> rowsOrLogicalNumbers;

                List<string> columnsOrVariables;

                List<string> results = convertExpression.SetOfResults(textBoxOutputExpression.Text, out rowsOrLogicalNumbers, out columnsOrVariables);

 

                dataGridView1.RowCount = rowsOrLogicalNumbers.Count + 1;

                dataGridView1.ColumnCount = columnsOrVariables.Count + 1;

               

 

                // Наполняем первую строку именами переменных

                string variablesForTable = String.Empty;

                Queue<string> variables = new Queue<string>(columnsOrVariables);

                for (int i = 0; i < dataGridView1.ColumnCount; i++)

                {

                    if (variables.Count != 0)

                    {

                        // задаем ширину столбцов, коэффициент 9*(... + 4) нужен для правильного расширения столбца

                        dataGridView1.Columns[i].Width = 9*(variables.Peek().Length + 4);

                        variablesForTable += variables.Peek() + ",";

                        dataGridView1.Rows[0].Cells[i].Value = variables.Dequeue();

                    }

                    else

                    {

                        // Выводим в последнюю колонку первой строки функцию с нашими переменными

                        // Так как после каждой переменной стоит запятая, то перед закрывающейся скобкой удаляем её

                        string func = "f(" + variablesForTable.Remove(variablesForTable.Length - 1) + ")";

                        dataGridView1.Rows[0].Cells[i].Value = func;

 

                        // задаем ширину столбцов, коэффициент 9 нужен для правильного расширения столбца

                        dataGridView1.Columns[i].Width = 9*func.Length;

                       

                    }

                }

 

                // заполняем остальные ячейки таблицы

                int k = 0; // создаем переменную для поэлементного отображения результата

                for (int i = 1; i < dataGridView1.RowCount; i++)

                    for (int j = 0; j < dataGridView1.ColumnCount; j++)

                    {

                        // если номер столбца соотвествует последнему,

                        if (j == dataGridView1.ColumnCount - 1)

                        {

                            // то заносим в него результат

                            dataGridView1.Rows[i].Cells[j].Value = results[k];

                            k++;

                        }

                        else

                            // иначе, продолжаем заполнять таблицу истинности

                            dataGridView1.Rows[i].Cells[j].Value = rowsOrLogicalNumbers[i - 1][j];

                    }

            }

            catch (Exception)

            {             

            }

        }

 

        private void textBoxOutputExpression_KeyDown(object sender, KeyEventArgs e)

        {

            if (e.KeyCode == Keys.Enter)

                UpdateForm();

        }        

 

        private void buttonEquivalence_Click(object sender, EventArgs e)

        {

            textBoxOutputExpression = InputSymbolInTextBox(textBoxOutputExpression, "~");

        }       

Информация о работе Создание программы для построения таблицы истинности