Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace MT
- {
- class Program
- {
- static string input(char[] alphabet)
- {
- int i = 0;
- bool k = false;
- string st = "";
- do
- {
- do
- {
- st = Console.ReadLine();
- if ((st.Length != 1) | (st == " "))
- Console.WriteLine("Ошибка.Повторите ввод.");
- } while ((st.Length!=1)|(st==" "));
- for (i = 0; i < alphabet.Length; i++)
- if (st.IndexOf(alphabet[i]) > -1)
- {
- k = true;
- break;
- }
- else
- k = false;
- if (!k)
- {
- Console.WriteLine("Введённый Вами символ не принадлежит алфавиту!");
- Console.WriteLine("Пожалуйста, замените этот символ!");
- }
- } while (!k);
- return st;
- }
- static string input(char[] alphabet, int sw)
- {
- bool l = false, k = false;
- int i = 0;
- bool result;
- string new1 = input(alphabet) + " ";
- do
- {
- do
- {
- Console.WriteLine("Ввести ещё один символ? 1(да)/2(нет)");
- result = Int32.TryParse(Console.ReadLine(), out sw);
- if (result == false)
- Console.WriteLine("Ошибка. Повторите ввод");
- } while (result != true);
- switch (sw)
- {
- case 1:
- {
- Console.WriteLine("Введите символ");
- char st = Convert.ToChar(input(alphabet));
- char[] dop = new char[new1.Length];
- dop = new1.ToCharArray(0, new1.Length);
- for (i = 0; i < dop.Length; i++)
- if (st == dop[i])
- {
- do
- {
- Console.WriteLine("Введены одинаковые символы! Замените символ!");
- st = Convert.ToChar(input(alphabet));
- } while (st == dop[i]);
- }
- new1 += st + " ";
- break;
- }
- case 2:
- {
- l = true;
- break;
- }
- default:
- {
- Console.WriteLine("Такого пункта нет в условии.Повторите ввод");
- l = false;
- break;
- }
- }
- } while (!l);
- char[] dop1 = new1.ToCharArray(0, new1.Length);
- k = false;
- for (i = 0; i < new1.Length; i++)
- if (dop1[i] == 'E')
- k = true;
- if (!k)
- {
- Console.WriteLine("Вы забыли ввести символ, отвечающий за пустоту - Е.");
- Console.WriteLine("Добавьте этот символ!");
- Console.WriteLine("Введите символ");
- char st = Convert.ToChar(input(alphabet));
- char[] dop = new char[new1.Length];
- dop = new1.ToCharArray(0, new1.Length);
- for (i = 0; i < dop.Length; i++)
- if (st == dop[i])
- {
- do
- {
- Console.WriteLine("Введены одинаковые символы! Замените символ!");
- st = Convert.ToChar(input(alphabet));
- } while (st == dop[i]);
- }
- new1 += st + " ";
- }
- return new1;
- }
- static void print2(string new1, int sost,out string[,] table1)
- {
- new1 = new1.Trim(' ');
- string[] simv = new1.Split(' ');
- int i = 0, j = 0, t = 0, p = 0;
- string[,] table = new string[simv.Length + 1, sost + 1];
- for (i = 1; i <= simv.Length; i++)
- table[i, 0] = simv[i - 1];
- for (j = 1; j <= sost; j++)
- table[0, j] = " q" + j;
- bool K = false;
- string head = "", c = "";
- for (t = 0; t < (sost-1); t++)
- {
- Console.WriteLine("Работаем с " + (t + 1) + " состоянием:");
- for (p = 0; p < simv.Length; p++)
- {
- Console.WriteLine("Работаем с ячейкой, расположенной на пересечении состояния q" + (t + 1) + " и символа " + simv[p]);
- Console.WriteLine("На какой символ заменить?");
- do
- {
- K = false;
- Console.WriteLine("Пожалуйста, введите символ");
- c = Console.ReadLine();
- for (i = 0; i < simv.Length; i++)
- if (simv[i] == c)
- {
- K = true;
- break;
- }
- if (!K)
- {
- Console.WriteLine("Можно заменять только на символы, используемые для решения данной задачи!");
- Console.WriteLine("Введите другой символ!");
- }
- } while (!K);
- int newsost = 0;
- do
- {
- K = true;
- bool result;
- do
- {
- Console.WriteLine("В какое состояние перейти? (укажите номер)");
- result = Int32.TryParse(Console.ReadLine(), out newsost);
- if (result == false)
- Console.WriteLine("Ошибка. Повторите ввод");
- } while (result != true);
- if ((newsost <= 0) || (newsost > sost))
- {
- Console.WriteLine("Невозможно перейти в сотояние, номер которого больше, чем общее количество состояний!");
- K = false;
- }
- } while (!K);
- do
- {
- Console.WriteLine("Куда сдвигается головка? (Введите R - вправо, L - влево, S - на месте)");
- head = Console.ReadLine();
- K = true;
- if ((head != "R") && (head != "L") && (head != "S"))
- {
- Console.WriteLine("Пожалуйста, укажите корректно, куда сдвигается головка!(Введите R - вправо, L - влево, S - на месте)");
- K = false;
- }
- } while (!K);
- table[p + 1, t + 1] = c + Convert.ToString(newsost) + head;
- }
- }
- table1 = table;
- for (i = 0; i < simv.Length + 1; i++)
- {
- for (j = 0; j < sost + 1; j++)
- Console.Write("{0,4} ",table[i, j]);
- Console.WriteLine();
- }
- }
- static void Main(string[] args)
- {
- string[,] table1 = new string[1000, 1000];
- bool result = false;
- string s = "abcdefghijklmnopqrstuvwxyz1234567890E";//E - пустота
- char[] alphabet = new char[s.Length];
- alphabet = s.ToCharArray(0, s.Length);
- int sw = 0;
- int sost;
- Console.WriteLine("Пожалуйста,введите первый символ алфавита, используемый в Вашей задаче");
- string new1 = input(alphabet, sw);
- Console.WriteLine("В задаче используются символы: " + new1);
- do
- {
- Console.WriteLine("Пожалуйста, введите количество состояний, необходимое для Вашей задачи");
- result = Int32.TryParse(Console.ReadLine(), out sost);
- if (result == false)
- Console.WriteLine("Ошибка. Повторите ввод");
- if (sost<=0)
- {
- result = false;
- Console.WriteLine("Ошибка. Повторите ввод");
- }
- } while ((result != true));
- do
- {
- Console.WriteLine("Конечное состояние входит во введённое вами количество состояний? 1(нет)/2(да)");
- result = Int32.TryParse(Console.ReadLine(), out sw);
- if (result == false)
- Console.WriteLine("Ошибка. Повторите ввод");
- if ((sw > 2) || (sw <= 0)) result = false;
- } while ((result != true));
- switch (sw)
- {
- case 1:
- {
- Console.WriteLine("Конечное состояние не входит во введённое количество");
- //нет
- print2(new1, ++sost, out table1);
- break;
- }
- case 2:
- {
- Console.WriteLine("Конечное состояние входит во введённое количество");
- //да
- print2(new1, sost, out table1);
- break;
- }
- }
- //тут закончился ручной ввод.
- //ввод ленты
- string lenta = "";
- int i;
- int F;
- int j;
- bool ok = false;
- bool oks = false;
- char[] c;
- do
- {
- Console.WriteLine("Введите ленту для работы с программой");
- lenta = Console.ReadLine();
- c = lenta.ToCharArray();
- ok = true;
- oks = false;
- if (lenta.Length <= 17)
- {
- for (i = 0; i < lenta.Length; i++)
- {
- for (j = 0; j < new1.Length; j++)
- {
- if (lenta[i] == new1[j]) //чекаем на совпадение в алфавите
- oks = true;
- else
- if (lenta[i] == ' ')
- {
- oks = true;
- c[i] = 'E';
- }
- }
- if (oks == false)
- {
- ok = false;
- Console.WriteLine("Обнаружен недопустимый символ - {0}.Повторите ввод", lenta[i]);
- }
- oks = false;
- }
- }
- else
- {
- Console.WriteLine("Строка слишком большая.Программа рассчитана на работу с лентами длинны от -8 до 8");
- ok = false;
- }
- } while (ok != true);
- Console.WriteLine("Лента синтаксически верна");
- for (i = 0; i < lenta.Length; i++)
- {
- Console.Write(c[i]);
- Console.Write(" ");
- }
- Console.WriteLine();
- do
- {
- Console.WriteLine("Пожалуйста,введите номер с которого необходимо поместить вашу ленту");
- result = Int32.TryParse(Console.ReadLine(), out F);
- if (result == false)
- Console.WriteLine("Ошибка. Повторите ввод");
- else
- if (Math.Abs(F) > 8)
- {
- Console.WriteLine("Введите другой номер. Программа защищена от зацикливания на 8 символе.");
- result = false;
- }
- else
- if ((F + lenta.Length) >9)
- {
- Console.WriteLine("Невозможно поместить ленту. Повторите ввод.");
- result = false;
- }
- } while ((result != true));
- char[] roll = new char[17];
- j = 0;
- for (i = 0; i < 17; i++)
- roll[i] = 'E';
- for (i = F + 8; i < (F + 8 + lenta.Length); i++)
- roll[i] = lenta[j++];
- for (i = 0; i < 17; i++)
- {
- if (roll[i] == ' ')
- roll[i] = 'E';// roll- массив с ячейками в ленте 0 символ - это -8;
- }
- Console.WriteLine("Лента имеет следующий вид:");
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", i - 8);
- Console.WriteLine();
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", roll[i]);
- Console.WriteLine();
- int car = 0;
- do
- {
- Console.WriteLine("Введите положение каретки. Программа будет автоматически запущена после ввода.");
- result = Int32.TryParse(Console.ReadLine(), out car);
- if (result == false)
- Console.WriteLine("Ошибка. Повторите ввод");
- else
- if (Math.Abs(car) > 8)
- {
- Console.WriteLine("Невозможно поставить каретку в этой позиции");
- result = false;
- } //car- положение каретки
- } while ((result != true));
- char[] rollcar = new char[17];
- for (i = 0; i < 17; i++)
- rollcar[i] = ' ';
- car += 8;
- rollcar[car] = '#';
- Console.WriteLine("Программа запущена:");
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", i - 8);
- Console.WriteLine();
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", roll[i]);
- Console.WriteLine();
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", rollcar[i]);
- Console.WriteLine();
- char currsost;
- int currstr;
- int currcol;
- char currsymbol;
- string ActionTur = "";
- string checksost = " ";
- currsost = '1';
- currstr = 1;
- currcol = 1;
- j = 0;
- string cancel_str = "q" + sost;
- while ((checksost!=cancel_str) & (Math.Abs(car) < 16))
- {
- int prob = 0;
- currsymbol = roll[car];
- ActionTur = null;
- Console.WriteLine("Начальный символ {0}", currsymbol);
- j = 0;
- for (i = 0; i < new1.Length; i++)
- {
- j++;
- if (new1[i] == ' ')
- {
- j--;
- }
- if (currsymbol == new1[i])
- {
- currstr = j;
- }
- }
- Console.WriteLine("В таблице правил в {0} строке", currstr);
- checksost = "q" + currsost;
- Console.WriteLine("Текущее состояние - {0}", checksost);
- //}
- currcol = Convert.ToInt32(currsost) - 48;
- Console.WriteLine("В таблице правил в {0} столбце ", currcol);
- //
- try
- {
- Console.WriteLine("Необходимо применить правило {0}", table1[currstr, currcol]);
- ActionTur = table1[currstr, currcol];
- roll[car] = ActionTur[0];
- currsost = ActionTur[1];
- if (ActionTur[2] == 'R')
- car++;
- if (ActionTur[2] == 'L')
- car--;
- for (i = 0; i < 17; i++)
- rollcar[i] = ' ';
- rollcar[car] = '#';
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", i - 8);
- Console.WriteLine();
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", roll[i]);
- Console.WriteLine();
- for (i = 0; i < 17; i++)
- Console.Write("{0,3}", rollcar[i]);
- Console.WriteLine();
- if ((Math.Abs(car) >= 16))
- {
- Console.WriteLine("Невозможно перетащить каретку");
- Console.WriteLine("Программа завершена");
- }
- } catch(NullReferenceException)
- {
- checksost = cancel_str;
- Console.WriteLine("которое завершает программу");
- Console.WriteLine("Программа звершена");
- }
- }
- Console.ReadKey();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement