Files
2024-07-10 19:07:44 +03:00

145 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Automata_theory
{
public partial class Laba7
{
public static List<TriggerFunction> TriggerFunctions = new List<TriggerFunction>();
public static string MakeBinary(int num, int maxnum, bool forStates = false)
{
if (forStates)
{
string result = "";
for (int i = 0; i < maxnum; i++)
{
result += $"{num & 1} ";
num >>= 1;
}
return string.Join("", result.Substring(0, result.Length - 1).Reverse());
}
string mn = Convert.ToString(maxnum-1, 2);
int power = (int)Math.Pow(2, mn.Length);
string n = Convert.ToString(power - num - 1, 2);
int zeros = mn.Length - n.Length;
for (int i = 0; i < zeros; i++)
n = "0" + n;
return n;
}
}
public class TriggerFunction
{
public TriggerFunction()
{
_items = new List<List<TriggerFunctionItem>>();
}
public void AddNewRule(string row, string col)
{
_items.Add(new List<TriggerFunctionItem>());
int inc = 1;
for (int i = 0; i < row.Length; i++)
{
if (row[i] == ' ') continue;
if (row[i] == '1') AddItem(new TriggerFunctionItem('a', inc, false)); //res += $"a{Common.SubScripts[inc]} \u22c5 ";
else AddItem(new TriggerFunctionItem('a', inc, true)); //$"a\u0305{Common.SubScripts[inc]} \u22c5 "; // \u22c5 - ⋅
inc++;
}
inc = 1;
for (int i = 0; i < col.Length; i++)
{
if (col[i] == ' ') continue;
if (col[i] == '2') { inc++; continue; }
if (col[i] == '1') AddItem(new TriggerFunctionItem('t', inc, false)); //res += $"t{Common.SubScripts[inc]} \u22c5 ";
else AddItem(new TriggerFunctionItem('t', inc, true));//res += $"t\u0305{Common.SubScripts[inc]} \u22c5 "; // \u22c5 - ⋅
inc++;
}
}
private void AddItem(TriggerFunctionItem item)
{
_items[_items.Count - 1].Add(item);
}
public string ToString(int layer = 0, int num = 0)
{
if (layer == 0)
{
string res = "F = ";
for (int i = 0; i < _items.Count; i++)
{
for (int j = 0; j < _items[i].Count; j++)
{
res += $"{_items[i][j].Symbol}{(_items[i][j].Inverse ? "\u0305" : "")}{Common.SubScripts[_items[i][j].Number]} \u22c5 ";
}
res = res.Remove(res.Length - 3, 3);
res += " \u22c1 ";
}
res = res.Remove(res.Length - 3, 3);
return res;
}
else if (layer == 1)
{
string res = "";
for (int j = 0; j < _items[num].Count; j++)
{
res += $"{_items[num][j].Symbol}{(_items[num][j].Inverse ? "\u0305" : "")}{Common.SubScripts[_items[num][j].Number]}";
}
return res;
}
else
throw new ArgumentOutOfRangeException();
}
private List<List<TriggerFunctionItem>> _items;
private List<int> _names;
public List<List<TriggerFunctionItem>> Items { get { return _items; } }
public List<int> Names { get { return _names; } }
}
public class TriggerFunctionItem
{
public TriggerFunctionItem(char sym, int num, bool inv)
{
_symbol = sym;
_number = num;
_inverse = inv;
}
public TriggerFunctionItem(TriggerFunctionItem item)
{
_symbol = item._symbol;
_number = item._number;
_inverse = item._inverse;
}
public static bool operator == (TriggerFunctionItem item1, TriggerFunctionItem item2)
{
if (item1.Inverse == item2.Inverse && item1.Number == item2.Number && item1.Symbol == item2.Symbol)
return true;
return false;
}
public static bool operator != (TriggerFunctionItem item1, TriggerFunctionItem item2)
{
if (item1.Inverse == item2.Inverse && item1.Number == item2.Number && item1.Symbol == item2.Symbol)
return false;
return true;
}
private char _symbol;
private int _number;
private bool _inverse;
public char Symbol { get { return _symbol; } }
public int Number { get { return _number; } }
public bool Inverse { get { return _inverse; } }
}
}