Aaaaa988

Untitled

Oct 20th, 2020
850
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Forms;
  5.  
  6. namespace Lab2 {
  7.     public partial class Form1 : Form {
  8.         enum AllStates { Recognized = 0, Good = 1, BadSymbol = 2, EmptyCellRecognized = 3, EmptyCellGood = 4 };
  9.         string[] statusString;
  10.         Dictionary<string, Dictionary<string, string>> lang;
  11.         List<string> states;
  12.         List<string> terminal;
  13.         List<string> endStates;
  14.         public Form1() {
  15.             lang = new Dictionary<string, Dictionary<string, string>>();
  16.             states = new List<string>();
  17.             terminal = new List<string>();
  18.             endStates = new List<string>();
  19.             statusString = new string[5] { "Цепочка принадлежит", "Цепочка не пренадлежит", "Неверный Символ", "Нет перехода, цепочка принадлежит", "Нет перехода, цепочка не принадлежит" };
  20.             InitializeComponent();
  21.             textBox_input.ReadOnly = false;
  22.             //dataGridView.RowHeadersWidth = 50;
  23.         }
  24.  
  25.         private void ShowError(string error) => MessageBox.Show(error, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
  26.  
  27.         private void button_add_row_Click(object sender, EventArgs e) {
  28.             if (dataGridView.ColumnCount == 0) {
  29.                 ShowError("Сначала добавьте как минимум один столбец!");
  30.                 return;
  31.             }
  32.             string input;
  33.             InputForm inputForm = new InputForm();
  34.             inputForm.label.Text += " состояния";
  35.             if (inputForm.ShowDialog(this) == DialogResult.OK) {
  36.                 input = inputForm.textBox_input.Text;
  37.             } else return;
  38.             inputForm.Dispose();
  39.  
  40.             if (input.Length == 0) {
  41.                 ShowError("Пожалуйста, заполните поле!");
  42.                 return;
  43.             }
  44.             if (states.Contains(input)) {
  45.                 ShowError("Такое состояние уже определено!");
  46.                 return;
  47.             } else {
  48.                 states.Add(input);
  49.                 //if (!((dataGridView.RowCount == 1) && (dataGridView.Rows[0].HeaderCell.Value == string.Empty)))
  50.                 dataGridView.Rows.Add();
  51.                 dataGridView.Rows[dataGridView.RowCount - 1].HeaderCell.Value = input;
  52.             }
  53.         }
  54.  
  55.         bool FormDictionary() {
  56.             return true;
  57.         }
  58.  
  59.         private void button_add_column_Click(object sender, EventArgs e) {
  60.             string input;
  61.             InputForm inputForm = new InputForm();
  62.             inputForm.label.Text += " символа";
  63.             inputForm.textBox_input.MaxLength = 1;
  64.             if (inputForm.ShowDialog(this) == DialogResult.OK) {
  65.                 input = inputForm.textBox_input.Text;
  66.             } else return;
  67.             inputForm.Dispose();
  68.  
  69.             if (input.Length == 0) {
  70.                 ShowError("Пожалуйста, заполните поле!");
  71.                 return;
  72.             }
  73.             if (terminal.Contains(input)) {
  74.                 ShowError("Такой символ уже определено!");
  75.                 return;
  76.             } else {
  77.                 terminal.Add(input);
  78.                 dataGridView.Columns.Add(input, input);
  79.                 if (dataGridView.RowCount == 1)
  80.                     dataGridView.Rows[dataGridView.RowCount - 1].HeaderCell.Value = string.Empty;
  81.             }
  82.         }
  83.  
  84.         private void button_make_table_Click(object sender, EventArgs e) {
  85.             if (textBox_states.Text == String.Empty || textBox_terminal.Text == String.Empty)
  86.                 return;
  87.             if (dataGridView.Columns.Count > 0) {
  88.                 dataGridView.Rows.Clear();
  89.                 dataGridView.Columns.Clear();
  90.                 dataGridView.Refresh();
  91.             }
  92.             if (terminal.Count > 0)
  93.                 terminal.Clear();
  94.             if (states.Count > 0)
  95.                 states.Clear();
  96.  
  97.             terminal = textBox_terminal.Text.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
  98.             if (terminal.Count > 0)
  99.                 terminal = terminal.Select(str => str.Trim()).Distinct().ToList();
  100.             if (terminal.Any(x => x.Length != 1)) {
  101.                 ShowError("Один из символов алфавита является строкой!");
  102.                 return;
  103.             }
  104.  
  105.             states = textBox_states.Text.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
  106.             states = states.Select(s => s.Trim()).Distinct().ToList();
  107.  
  108.             if (states.Count == 0 || terminal.Count == 0) {
  109.                 ShowError("Поля заполнены неверно!");
  110.                 return;
  111.             }
  112.  
  113.             foreach (string str1 in terminal)
  114.                 if (states.Contains(str1)) {
  115.                     ShowError("Один из символов алфавита также задан состоянием: " + str1);
  116.                     return;
  117.                 }
  118.  
  119.             for (int i = 0; i < terminal.Count(); ++i)
  120.                 dataGridView.Columns.Add(terminal[i].ToString(), terminal[i].ToString());
  121.             for (int i = 0; i < states.Count(); ++i)
  122.                 dataGridView.Rows.Add();
  123.             for (int i = 0; i < states.Count(); ++i)
  124.                 dataGridView.Rows[i].HeaderCell.Value = states[i];
  125.  
  126.             if (comboBox_start.Items.Count > 0)
  127.                 comboBox_start.Items.Clear();
  128.             foreach (string str in states)
  129.                 comboBox_start.Items.Add(str);
  130.             comboBox_start.SelectedIndex = 0;
  131.         }
  132.  
  133.         private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  134.             if (lang.Count > 0)
  135.                 lang.Clear();
  136.         }
  137.  
  138.         bool CheckTable() {
  139.             for (int i = 0; i < dataGridView.RowCount; ++i)
  140.                 for (int j = 0; j < dataGridView.ColumnCount; ++j)
  141.                     if (dataGridView.Rows[i].Cells[j].Value.ToString() != string.Empty && !states.Contains(dataGridView.Rows[i].Cells[j].Value.ToString()))
  142.                         return false;
  143.             return true;
  144.         }
  145.  
  146.         bool BuildLanguage() {
  147.             for (int i = 0; i < dataGridView.RowCount; ++i)
  148.                 for (int j = 0; j < dataGridView.ColumnCount; ++j)
  149.                     if (dataGridView.Rows[i].Cells[j].Value == null)
  150.                         dataGridView.Rows[i].Cells[j].Value = string.Empty;
  151.             if (!CheckTable())
  152.                 return false;
  153.             if (lang.Count > 0)
  154.                 lang.Clear();
  155.             for (int i = 0; i < dataGridView.RowCount; ++i) {
  156.                 lang.Add(dataGridView.Rows[i].HeaderCell.Value.ToString(), new Dictionary<string, string>());
  157.                 for (int j = 0; j < dataGridView.ColumnCount; ++j) {
  158.                     lang[dataGridView.Rows[i].HeaderCell.Value.ToString()].Add(dataGridView.Columns[j].HeaderCell.Value.ToString(), dataGridView.Rows[i].Cells[j].Value.ToString());
  159.                 }
  160.             }
  161.             return true;
  162.         }
  163.  
  164.         void ChangeStatus(AllStates status) {
  165.             label_status.Text = statusString[(int)status];
  166.         }
  167.  
  168.         private void textBox_input_TextChanged(object sender, EventArgs e) {
  169.             if (lang.Count() == 0)
  170.                 if (!BuildLanguage())
  171.                     return;
  172.             string lastState = comboBox_start.SelectedItem.ToString();
  173.             if (textBox_input.Text == String.Empty) {
  174.                 if (endStates.Contains(lastState))
  175.                     ChangeStatus(AllStates.Recognized);
  176.                 else
  177.                     ChangeStatus(AllStates.Good);
  178.                 textBox_states_order.Text = "(" + lastState + ", " + ")";
  179.                 return;
  180.             }
  181.             if (textBox_states_order.Text.Length > 0)
  182.                 textBox_states_order.Text = string.Empty;
  183.             for (int i = 0; i < textBox_input.Text.Length; ++i) {
  184.                 string lastInput = textBox_input.Text[i].ToString();
  185.                 if (!terminal.Contains(lastInput)) {
  186.                     ChangeStatus(AllStates.BadSymbol);
  187.                     textBox_states_order.Text += "(" + lastState + ", " + textBox_input.Text.Substring(i) + ")";
  188.                     return;
  189.                 }
  190.                 textBox_states_order.Text += "(" + lastState + ", " + textBox_input.Text.Substring(i) + ")" + " --> ";
  191.                 lastState = lang[lastState][lastInput];
  192.                 if (lastState == string.Empty) {
  193.                     if (label_status.Text == statusString[(int)AllStates.Good])
  194.                         ChangeStatus(AllStates.EmptyCellGood);
  195.                     else
  196.                         ChangeStatus(AllStates.EmptyCellRecognized);
  197.                     return;
  198.                 }
  199.                 if (endStates.Contains(lastState))
  200.                     ChangeStatus(AllStates.Recognized);
  201.                 else
  202.                     ChangeStatus(AllStates.Good);
  203.             }
  204.             textBox_states_order.Text += "(" + lastState + ", " + ")" ;
  205.         }
  206.  
  207.         private void textBox_end_TextChanged(object sender, EventArgs e) {
  208.             if (endStates.Count > 0)
  209.                 endStates.Clear();
  210.             endStates = textBox_end.Text.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
  211.             endStates = endStates.Select(s => s.Trim()).Distinct().ToList();
  212.             if (endStates.Count == 0) {
  213.                 textBox_input.ReadOnly = true;
  214.                 return;
  215.             }
  216.             foreach (string str in endStates)
  217.                 if (!states.Contains(str)) {
  218.                     textBox_input.ReadOnly = true;
  219.                     return;
  220.                 }
  221.             textBox_input.ReadOnly = false;
  222.         }
  223.  
  224.         private void comboBox_start_SelectedIndexChanged(object sender, EventArgs e) {
  225.             if (lang.Count > 0)
  226.                 lang.Clear();
  227.         }
  228.     }
  229. }
  230.  
RAW Paste Data