Создание программы для построения таблицы истинности
Лабораторная работа, 14 Июня 2013, автор: пользователь скрыл имя
Краткое описание
Цель
Создать программу, которая бы помогла быстро проверить правильность созданных вручную таблиц истинности.
Задание
Написать программу, которая будет строить таблицы истинности для исходных и упрощенных форм, и проверять их тождественность. Таблицы истинности выводить на экран.
Прикрепленные файлы: 1 файл
MyLogicalCalculator.DOC
— 210.50 Кб (Скачать документ)Лабораторная работа №
Индивидуальное задание №1 Программа для построения таблицы истинности
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ, МОЛОДЁЖИ И СПОРТА УКРАИНЫ
ВОСТОЧНОУКРАИНСКИЙ
ИМ. В. ДАЛЯ
ФАКУЛЬТЕТ КОМПЬЮТЕРНЫХ НАУК И ТЕХНОЛОГИЙ
Кафедра "Системная инженерия"
«Дискретна математика»
Индивидуальное задание №1
Тема: «Создание программы для построения
таблицы истинности»
Выполнил: студент: Валуйский Р.В.
группа: КТ-711
Оценка:
Проверил: асс. Быбко
Индивидуальное задание №1
ШИФР: z21203
Вариант 3. Валуйский Р.В.
Луганск 2013 г.
Цель
Создать программу, которая бы помогла быстро проверить правильность созданных вручную таблиц истинности.
Задание
Написать программу, которая будет строить таблицы истинности для исходных и упрощенных форм, и проверять их тождественность. Таблицы истинности выводить на экран.
Исходный код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace calcForLogicOperation
{
public class Operator
{
// Коллекция стандартных операторов
public static List<string> StandartOperators =
new List<string>(new string[] { "(", ")", "+", "*", "!", "|", "~", "@", "v", "<", "<<", ">", ">>" });
public static List<string> OperatorsForImplication = new List<string>() { "<", ">"};
}
class OutputForAssignValue2
{
public static List<string> ChangeVariableToLogicNumber(Li
{
List<string> output = new List<string>();
List<string> outRowCountOrLogicalNumbers = new List<string>();
// Отделяем переменные от входной строки
// И возвращаем их коллекцию
List<string> variables = columnsCountOrVariables = SeparateVariables(input);
// Подсчитываем количество строчек
int numberOfLines = (int)Math.Pow((double)2, (double)variables.Count);
// Проходим по каждой строчке таблицы истинности
for (int i = 0; i < numberOfLines; i++)
{
// Конвертируем число в двоичное
string numberFromIntToBool = Convert.ToString(i, 2);
// В случаи, если при переводе числа в двоичное
// не хватает нулей, то добавляем их
string addZero = String.Empty;
// если количество переменных превышает число строк в двоичном числе,
// то добавляем не достающие нули
for (int h = 0; h < variables.Count - numberFromIntToBool.Length; h++)
addZero += "0";
// Добавляем не достающие нули к логическим числам
string logicalNumber = addZero + numberFromIntToBool;
// заносим каждую строчку логического числа в выходную переменную
outRowCountOrLogicalNumbers.
// подставляем в выражение значения из таблицы истинности
// для данного выражения
Queue<string> logicalNumbers = new Queue<string>(
string convertInput = String.Empty;
for (int j = 0; j < variables.Count; j++)
{
if (!String.IsNullOrEmpty(
// Находим переменные в выражении и подставляем вместо их логические значения
convertInput = convertInput.Replace(
else
convertInput = ConvertListToString(input).
}
output.Add(convertInput);
}
rowsCountOrLogicalNumbers = outRowCountOrLogicalNumbers;
return output;
}
// Возвращает из коллекции подстрок
// коллекции подстрок только с переменными
private static List<string> SeparateVariables(List<string> input)
{
List<string> output = new List<string>();
int a;
for (int i = 0; i < input.Count; i++)
if (!Operator.StandartOperators.
!output.Contains(input[i]) && !Int32.TryParse(input[i], out a))
output.Add(input[i]);
return output;
}
// Преобразует коллекцию в строку
private static string ConvertListToString(List<strin
{
string output = String.Empty;
foreach (string c in input)
output += c;
return output;
}
// Конвертирует строку в коллекцию
private static List<string> ConvertStringToList(string input)
{
List<string> outputString = new List<string>();
List<char> output = input.ToList<char>();
foreach (char c in output)
outputString.Add(c.ToString())
return outputString;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using calcForLogicOperation;
namespace OPN2
{
class PostfixNotationExpression
{
private List<string> operators;
public PostfixNotationExpression()
{
operators = new List<string>(Operator.
}
/// <summary>
/// Разделяет входную строку на подстроки
/// </summary>
/// <param name="input">Входная строка</param>
/// <returns></returns>
public IEnumerable<string> Separate(string input)
{
int pos = 0; // позиция символа
while (pos < input.Length)
{
// создаем переменную, в которой будут хранится перемещенные символы
// добавляем текущий символ к строке
string s = string.Empty + input[pos]; // конвертируем символ в строку
// если элемент не входит в состав стандартных операторов, то
if (!Operator.StandartOperators.
{
// если элемент число
if (Char.IsDigit(input[pos]))
{
// Выполнять цикл пока не достигним конца строки и пока
// следующий символ число или запятая или точка
for (int i = pos + 1; i < input.Length &&
(Char.IsDigit(input[i])); i++)
s += input[i]; // заносим текущий символ
}
// иначе если текущий символ знак
else if (Char.IsLetter(input[pos]))
// Выполнять цикл пока не будет достигнут конец строки и пока
// следующий символ знак или число
for (int i = pos + 1; i < input.Length &&
!Operator.StandartOperators.
(Char.IsLetter(input[i]) || Char.IsDigit(input[i])); i++)
s += input[i]; // добавляем текущий символ в строку
}
// если текущий элемент оператор
if (Operator.StandartOperators.
for (int i = pos + 1; i < input.Length && Operator.
&& Operator.
s += input[i];
if (s != " ")
yield return s; // возвращаем поочередно каждую строку s;
pos += s.Length; // длинна элемента может быть больше одного, то есть нам нужно сразу перейти к следующему
}
}
/// <summary>
/// Возвращает приоритет знака операции
/// </summary>
/// <param name="s">знак операции</param>
/// <returns></returns>
private byte GetPriority(string s)
{
switch (s)
{
case "(":
return 0;
case ")":
return 1;
case "+":
case ">":
case ">>":
case "<":
case "<<":
case "|":
case "~":
case "@":
case "v":
return 2;
case "*":
return 3;
case "!":
return 4;
default:
return 5;
}
}
/// <summary>
/// Преобразовывает входное выражение в обратную польскую нотацию
/// </summary>
/// <param name="input">входное выражение</param>
/// <returns></returns>
public List<string> ConverToPostfixNotation(string input)
{
List<string> outputSeparated = new List<string>(); // выходная разделенная строка
Stack<string> stack = new Stack<string>(); // стек, в него будут заносится знаки операций, скобки
// проходим по всем элементам входной строки
// занося их в стек, а затем некоторые в выходную строку
foreach (string c in Separate(input))
{
// Если текущий символ является оператором (+,* и т.п.)
if (operators.Contains(c))
{
// Если в стеке есть элементы и
// если текущий символ не равен открывающийся скобке
if (stack.Count > 0 && !c.Equals("("))
{
// Если текущий символ равен закрывающийся скобке
if (c.Equals(")"))
{
// то извлекаем из стека верхний элемент
string s = stack.Pop();
// пока извлеченный символ не равен открытой скобке
while (s != "(")
{
}
}
// если приоритет текущего оператора выше или равен
// содержащегося на вершине стека
else if (GetPriority(c) >= GetPriority(stack.Peek()))
stack.Push(c); // то заносим этот символ в стек
else // иначе извлекаем вверхний символ из стека и добавляем в выходную строку
// пока стек содержит операторы или пока приоритет
// текущего оператора не будет больше или равным вершине стека
{
while (stack.Count > 0 && GetPriority(c) < GetPriority(stack.Peek()))
stack.Push(c); // после чего заносим оператор в стек
}
}
else // иначе, то есть если стек не содержит ни одного элемента или
// текущий оператор это открывающаяся скобка "("
stack.Push(c); // заносим его в стек
}
else // иначе, если текущий символ число
outputSeparated.Add(c); // заносим его сразу в выходную строку
}
// если в стеке остались элементы
if (stack.Count > 0)
foreach (string c in stack)
outputSeparated.Add(c);
return outputSeparated; // возвращаем выходную строку в виде массива строк
}
/// <summary>
/// Вычисляем выражение преобразованное в ОПЗ
/// </summary>
/// <param name="input">входная строка</param>
/// <returns></returns>
public bool Result(string input)
{
Stack<string> stack = new Stack<string>();
// создаем очередь, которой передаем наше преобразованное выражение в ОПЗ
Queue<string> queue = new Queue<string>(
string str = queue.Dequeue(); // извлекаем первый элемент из очереди
// пока в очереди содержатся элементы
while (queue.Count >= 0)
{
// если текущий элемент не оператор
if (!operators.Contains(str))
{
// то заносим его в стек
stack.Push(str);
str = queue.Dequeue(); // переходим к следующему элементу
}
else // иначе, если текущий элемент оператор
{
bool summ = false; // создаем переменную для хранения текущего вычисления
try // пробуем выполнить операции
{
switch (str) // определяем тип оператора
{
case "+":
bool a = ConvertToBool(stack.Pop());