private void button3_Click(object sender, EventArgs e) { OpenFileDialog opf = new OpenFileDialog(); textBox3.Clear(); textBox4.Clear(); richTextBox1.Clear(); newDfa = new DfaReader(); opf.InitialDirectory = Assembly.GetExecutingAssembly().Location; opf.RestoreDirectory = true; opf.Filter = "txt files (*.txt)|*.txt"; if (opf.ShowDialog() == DialogResult.OK) { fileName = opf.FileName; } try { myDfa.FillDfa(fileName); newDfa = myDfa.MiniDfa(); richTextBox1.Clear(); textBox4.Text = "Input word with " + newDfa.Alphabet[0] + "," + newDfa.Alphabet[1]; richTextBox1.Text = newDfa.printDfa(); } catch { MessageBox.Show("Something went wrong", "Attention"); } }
public DfaReader MiniDfa() // минимизирует дфа { char[,] table; int[] intNumbers; string[] NewNumbers; int[,] NewTransition; bool[] newEnd; DfaReader newDfa = new DfaReader(); newDfa.Alphabet = Alphabet; table = new char[Numbers.Length, Numbers.Length]; for (int i = 0; i < Numbers.Length; i++)// заполняет всю табл + { for (int j = 0; j < Numbers.Length; j++) { table[i, j] = '+'; } } for (int i = 0; i < Numbers.Length; i++)//решотки ниже главной и доллары на глав диагонал { table[i, i] = '$'; for (int j = 0; j < i; j++) { table[i, j] = '#'; } } for (int i = 0; i < Numbers.Length; i++) // декартовое произведение, раставляет звездочки на пересеч. кон. и некон. сост. { if (End[i] == true) { for (int j = 0; j < Numbers.Length; j++) { if (!End[j] && i < j) { table[i, j] = '*'; } if (!End[j] && j < i) { table[j, i] = '*'; } } } } ////////////////////// int count = 0; do // в пустых(+) клетках ставит * или доллар в соответ с правилами:если оба бакс ставим бакс, если хоть 1 * ставим * { int k = 0, l = 0, m = 0, n = 0; count = 0; for (int i = 0; i < Numbers.Length; i++) { for (int j = 0; j < Numbers.Length; j++) { if (table[i, j] == '+') { for (int s = 0; s < Numbers.Length; s++) { if (Transition[i, 0] == Numbers[s]) { k = s; } if (Transition[i, 1] == Numbers[s]) { l = s; } if (Transition[j, 0] == Numbers[s]) { m = s; } if (Transition[j, 1] == Numbers[s]) { n = s; } } if ((table[k, m] == '$' && table[l, n] == '$') || (table[m, k] == '$' && table[l, n] == '$') || (table[k, m] == '$' && table[n, l] == '$') || (table[m, k] == '$' && table[n, l] == '$')) { table[i, j] = '$'; count++; } if (table[k, m] == '*' || table[l, n] == '*' || table[m, k] == '*' || table[n, l] == '*') { table[i, j] = '*'; count++; } } } } }while (count != 0); /////////////////// /// NewNumbers = new string[Numbers.Length]; for (int i = 0, n = 0; i < Numbers.Length; i++, n++)// составляем новые имена состояний для конкатанаци строк { string temp = ""; int counter = 0; for (int j = 0; j < Numbers.Length; j++) { if (table[i, j] == '$') { temp += Numbers[j].ToString(); counter++; } } NewNumbers[n] = temp; } string[] tempNumbers = NewNumbers; for (int i = 0; i < Numbers.Length; i++)//вытерает все одинаковые состояния { for (int j = 0; j < Numbers.Length; j++) { for (int k = 0; k < NewNumbers[j].Length; k++) { if (NewNumbers[i].Contains(tempNumbers[j][k]) && i != j) { NewNumbers[i] += tempNumbers[j]; NewNumbers[j] = ""; } } } } NewNumbers = NewNumbers.Where(i => i != "").ToArray(); intNumbers = new int[NewNumbers.Length]; newEnd = new bool[NewNumbers.Length]; for (int i = 0; i < NewNumbers.Length; i++)//определяет кон сост в новом дфа { intNumbers[i] = Convert.ToInt32(NewNumbers[i][0].ToString()); for (int k = 0; k < Numbers.Length; k++) { if (NewNumbers[i].Contains(Numbers[k].ToString())) { if (End[k] == true) { newEnd[i] = true; } } } } NewTransition = new int[NewNumbers.Length, Alphabet.Length]; for (int i = 0; i < NewNumbers.Length; i++)//определ новые переходы { for (int j = 0; j < Numbers.Length; j++) { if (NewNumbers[i].Contains(Numbers[j].ToString())) { NewTransition[i, 0] = Transition[j, 0]; NewTransition[i, 1] = Transition[j, 1]; } } } int[,] tempTr = NewTransition; for (int i = 0; i < NewNumbers.Length; i++)//дает новым переходам соотв имена { for (int j = 0; j < NewNumbers.Length; j++) { if (NewNumbers[i].Contains(Convert.ToString(tempTr[j, 0]))) { NewTransition[j, 0] = intNumbers[i]; } if (NewNumbers[i].Contains(Convert.ToString(tempTr[j, 1]))) { NewTransition[j, 1] = intNumbers[i]; } } } newDfa.Numbers = intNumbers; newDfa.Transition = NewTransition; newDfa.End = newEnd; return(newDfa); }