Advertisement
kot025

Markov2.2

Feb 23rd, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 21.36 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Markov2
  8. {
  9.     class Program
  10.     {
  11.         static string s; // тут хранится строка глобально
  12.         static string a; // здесь алфавит
  13.         static string[] left = new string[100]; // массив левых частей введенных правил
  14.         static string[] right = new string[100]; // массив правых частей
  15.         static bool[] end = new bool[100]; // массив тру-фолс в зависимости от конечности или не конечности мета-символа в правиле соотв.
  16.         static bool rulin;
  17.         static bool strin;
  18.         static int q = 0;
  19.  
  20.         static string Algoritm(string s, string[] left, string[] right, bool[] end, int numberofrules)
  21.         {
  22.             int i = 0;
  23.             do
  24.             {
  25.                 string newstringleft = null;
  26.                 string newstringright = null;
  27.                 q++;
  28.                 int j = -1;
  29.                 if (s.Contains(left[i]) == true)
  30.                 {
  31.                     j = s.IndexOf(left[i]);
  32.                 }
  33.                 if ((j != -1) && (q <= 10000))
  34.                 {
  35.                     if (j != 0)
  36.                     {
  37.                         newstringleft = s.Substring(0, j);
  38.                     }
  39.                     if (j != (s.Length - 1))
  40.                     {
  41.                         newstringright = s.Substring(j + left[i].Length, s.Length - left[i].Length - j);
  42.                     }
  43.                     s = newstringleft + right[i] + newstringright;
  44.                     if (end[i] == true)
  45.                     {
  46.                         break;
  47.                         i = numberofrules;
  48.                         break;
  49.                     }
  50.                     else
  51.                     {
  52.                         i = 0;
  53.                         j = -1;
  54.                     }
  55.                 }
  56.                 else
  57.                 {
  58.                     i++;
  59.                 }
  60.             } while (i < numberofrules);
  61.             return s;
  62.         }
  63.         static void RedLn(string str) // Console.WriteLine красного цвета
  64.         {
  65.             Console.ForegroundColor = ConsoleColor.Red;
  66.             Console.WriteLine(str);
  67.             Console.ResetColor();
  68.         }
  69.         static void WhiteLn(string str) // Console.WriteLine белого цвета
  70.         {
  71.             Console.ForegroundColor = ConsoleColor.White;
  72.             Console.WriteLine(str);
  73.             Console.ResetColor();
  74.         }
  75.  
  76.         static int AskForAction(int qtyOfActions) // запрос команды меню и проверка вводимых значений
  77.         {
  78.             int act;
  79.             bool ok;
  80.             do
  81.             {
  82.                 Console.Write("Команда: ");
  83.                 string buf = Console.ReadLine();
  84.                 ok = int.TryParse(buf, out act) && act > 0 && act <= qtyOfActions;
  85.                 if (!ok)
  86.                     RedLn("Доступны команды 1 - " + qtyOfActions + ".");
  87.             } while (!ok);
  88.             return act;
  89.         }
  90.         static string RemoveSpaces(string s)
  91.         {
  92.             s = s.Replace(" ", string.Empty);
  93.             s = s.Trim().Replace(" ", string.Empty);
  94.             return s;
  95.         }
  96.         static bool FindEquals(string sString)
  97.         {
  98.             bool ok = false;
  99.             char[] sChar = new char[sString.Length];
  100.             sChar = sString.ToCharArray();
  101.             for (int i = 0; i < sChar.Length; i++)
  102.             {
  103.                 if (i != 0)
  104.                 {
  105.                     for (int j = 0; j < i; j++)
  106.                     {
  107.                         if (sChar[j] == sChar[i])
  108.                         {
  109.                             ok = true;
  110.                             break;
  111.                         }
  112.                     }
  113.                 }
  114.                 if ((i != sChar.Length) && (ok != true))
  115.                 {
  116.                     for (int j = i + 1; j < sChar.Length; j++)
  117.                     {
  118.                         if (sChar[j] == sChar[i])
  119.                         {
  120.                             ok = true;
  121.                             break;
  122.                         }
  123.                     }
  124.                 }
  125.                 if (ok == true)
  126.                 {
  127.                     break;
  128.                 }
  129.             }
  130.             return ok;
  131.         }
  132.         static bool Alf(string s) // проверка на соответствие алфавиту
  133.         {
  134.             bool ok = true;
  135.             for (int i = 0; i < s.Length; i++)
  136.             {
  137.                 if (!a.Contains(s[i]))
  138.                 {
  139.                     ok = false;
  140.                     break;
  141.                 }
  142.             }
  143.             return ok;
  144.         }
  145.  
  146.         static int Check(string rule) // проверка на наличие в строке мета-символа и на его положение, возврат кода ошибки
  147.         {
  148.             int code = 0;
  149.             if (rule.Contains("->"))
  150.             {
  151.                 if (rule.IndexOf("->") == 0)
  152.                 {
  153.                     code = 2;
  154.                 }
  155.             }
  156.             else
  157.             {
  158.                 code = 1;
  159.             }
  160.             return code;
  161.         }
  162.         static int Split(string rule, int i) // проверяем левую-правую части переданной строки правила с переданным номером
  163.         {                               // и записываем куски правила в соотв. массивы под соотв. номерами
  164.             int index = -1;
  165.             index = rule.IndexOf("->.");
  166.             if (index == -1)
  167.             {
  168.                 index = rule.IndexOf("->");
  169.             }
  170.             if (!Alf(rule.Substring(0, index)))
  171.             {
  172.                 return 1;  // левая часть правила не соотв. алф.
  173.             }
  174.  
  175.             left[i] = rule.Substring(0, index);
  176.  
  177.             if ((index + 2) == rule.Length)
  178.             {
  179.                 end[i] = false;
  180.                 right[i] = null;
  181.                 return 0;
  182.             }
  183.             else
  184.             {
  185.                 if (((index + 3) == rule.Length) && (rule[index + 2] == '.'))
  186.                 {
  187.                     end[i] = true;
  188.                     right[i] = null;
  189.                     return 0;
  190.                 }
  191.                 else
  192.                 {
  193.                     if (rule[index + 2] == '.')
  194.                     {
  195.                         if (!Alf(rule.Substring(index + 3, rule.Length - index - 3))) // правая часть правила с "->." не соотв. алф.
  196.                         {
  197.                             left[i] = null;
  198.                             end[i] = false;
  199.                             return 2;
  200.                         }
  201.                         else
  202.                         {
  203.                             end[i] = true;
  204.                             right[i] = rule.Substring(index + 3, rule.Length - index - 3);
  205.                             return 0;
  206.                         }
  207.                     }
  208.                     else
  209.                     {
  210.                         if (!Alf(rule.Substring(index + 3, rule.Length - index - 3))) // правая часть правила c "->" не соотв. алф.
  211.                         {
  212.                             left[i] = "";
  213.                             end[i] = false;
  214.                             return 2;
  215.                         }
  216.                         else
  217.                         {
  218.                             end[i] = false;
  219.                             right[i] = rule.Substring(index + 2, rule.Length - index - 2);
  220.                             return 0;
  221.                         }
  222.                     }
  223.                 }
  224.             }
  225.         }
  226.  
  227.         static void WorkAlphabet(ref bool alfin)
  228.         {
  229.             string a1;
  230.             int act;
  231.             Console.Clear();
  232.             if (alfin) // если алфавит уже введен
  233.             {
  234.                 Console.Write("Aлфавит: ");
  235.                 WhiteLn(a);
  236.                 Console.WriteLine();
  237.                 Console.WriteLine("1. Ввести новый алфавит\n2. Добавить символы в имеющийся");
  238.                 act = AskForAction(2);
  239.                 Console.Clear();
  240.                 if (act == 1)
  241.                 {
  242.                     do
  243.                     {
  244.                         Console.Write("Введите алфавит в одну строку: ");
  245.                         a1 = Console.ReadLine();
  246.                         a1 = RemoveSpaces(a1);
  247.                         if (FindEquals(a1) == true)
  248.                         {
  249.                             RedLn("Ошибка. В вашем алфавите найдены повторяющиеся элементы. Повторите ввод.\n");
  250.                         }
  251.                     }
  252.                     while (FindEquals(a1) == true);
  253.                     a = a1 + " ";
  254.                     if (!Alf(s))
  255.                     {
  256.                         s = "";
  257.                         strin = false;
  258.                     }
  259.                 }
  260.                 else
  261.                 {
  262.                     Console.Write("Aлфавит: ");
  263.                     WhiteLn(a);
  264.                     do
  265.                     {
  266.                         Console.WriteLine();
  267.                         Console.Write("Введите символы для добавления к алфавиту: ");
  268.                         a1 = Console.ReadLine();
  269.                         a1 = RemoveSpaces(a1);
  270.                         if (FindEquals(a1) == true)
  271.                         {
  272.                             RedLn("Ошибка. В введенной строке найдены повторяющиеся элементы. Повторите ввод.\n");
  273.                         }
  274.                         if (FindEquals(a + a1) == true)
  275.                         {
  276.                             RedLn("Ошибка. В введенной строке найдены элементы, которые уже есть в алфавите. Повторите ввод.\n");
  277.                         }
  278.                     }
  279.                     while (FindEquals(a + a1) == true);
  280.                     a = RemoveSpaces(a) + a1 + " ";
  281.                 }
  282.             }
  283.             else // если алфавита не было
  284.             {
  285.                 do
  286.                 {
  287.                     Console.Write("Введите алфавит в одну строку: ");
  288.                     a1 = Console.ReadLine();
  289.                     a1 = RemoveSpaces(a1);
  290.                     if (FindEquals(a1) == true)
  291.                     {
  292.                         RedLn("Ошибка. В вашем алфавите найдены повторяющиеся элементы. Повторите ввод.\n");
  293.                     }
  294.                 }
  295.                 while (FindEquals(a1) == true);
  296.                 a = a1 + " ";
  297.                 alfin = true;
  298.             }
  299.         } // работа с алфавитом
  300.         static void addRule(int ruleNumber)
  301.         {
  302.             int code = 0;
  303.             do
  304.             {
  305.                 Console.Write("Правило №" + (ruleNumber + 1) + ": ");
  306.                 string rule = Console.ReadLine();
  307.                 code = Check(rule);
  308.  
  309.                 switch (code)
  310.                 {
  311.                     case 1:
  312.                         RedLn("Ошибка. В правиле отсутствует мета-символ.");
  313.  
  314.                         break;
  315.                     case 2:
  316.                         RedLn("Ошибка. Левая часть правила не может быть пустой.");
  317.                         break;
  318.                 }
  319.                 if (code == 0)
  320.                 {
  321.                     code = Split(rule, ruleNumber);
  322.                     switch (code)
  323.                     {
  324.                         case 1: RedLn("Ошибка. Левая часть правила не соответствует алфавиту.");
  325.                             break;
  326.                         case 2: RedLn("Ошибка. Правая часть правила не соответствует алфавиту.");
  327.                             break;
  328.                     }
  329.                 }
  330.                 if (code != 0)
  331.                 {
  332.                     Console.WriteLine("Повторите ввод.\n");
  333.                 }
  334.             } while (code != 0);
  335.  
  336.         }
  337.         static void WorkRules(ref int ruleNumber) // работа с правилами
  338.         {
  339.             Console.Clear();
  340.             int act;
  341.             if (left[0] == null)
  342.             {
  343.                 right = new string[100];
  344.                 end = new bool[100];
  345.                 rulin = false;
  346.                 act = 1;
  347.                 ruleNumber = 0;
  348.  
  349.                 Console.Write("Алфавит: ");
  350.                 WhiteLn(a);
  351.                 Console.Write("Строка: ");
  352.                 WhiteLn(s);
  353.                 Console.WriteLine();
  354.                 Console.WriteLine("Введите новые правила: ");
  355.                 do
  356.                 {
  357.                     addRule(ruleNumber++);
  358.                     rulin = true;
  359.                     Console.WriteLine();
  360.                     Console.WriteLine("1. Ввести еще одно правило\n2. Закончить ввод правил");
  361.                     act = AskForAction(2);
  362.                 } while (act != 2);
  363.             }
  364.             else
  365.             {
  366.                 do
  367.                 {
  368.                     Console.Clear();
  369.                     Console.Write("Алфавит: ");
  370.                     WhiteLn(a);
  371.                     Console.Write("Строка: ");
  372.                     WhiteLn(s);
  373.                     Console.WriteLine();
  374.                     if (rulin)
  375.                     {
  376.                         Console.WriteLine("Правила: ");
  377.                         PrintRules(ruleNumber);
  378.                     }
  379.                     Console.WriteLine("1. Ввести новый набор правил\n2. Добавить правила или заменить текущие\n3. Что я здесь забыл?");
  380.                     act = AskForAction(3);
  381.                     switch (act)
  382.                     {
  383.                         case 1:
  384.                             left = new string[100];
  385.                             right = new string[100];
  386.                             end = new bool[100];
  387.                             ruleNumber = 0;
  388.                             WorkRules(ref ruleNumber);
  389.                             break;
  390.                         case 2:
  391.                             Console.Clear();
  392.                             Console.Write("Алфавит: ");
  393.                             WhiteLn(a);
  394.                             Console.Write("Строка: ");
  395.                             WhiteLn(s);
  396.                             Console.WriteLine("Правила: ");
  397.                             PrintRules(ruleNumber);
  398.                             Console.WriteLine("Введите номер правила, которое хотите заменить.\nДля добавления еще одного правила введите номер, на единицу больший максимального.");
  399.                             bool ok;
  400.                             int k;
  401.                             do
  402.                             {
  403.                                 Console.Write("Номер: ");
  404.                                 string buf = Console.ReadLine();
  405.                                 ok = int.TryParse(buf, out k) && k > 0 && k <= ruleNumber + 1;
  406.                                 if (!ok)
  407.                                 {
  408.                                     RedLn("Ошибка. Ожидалось значение в пределах 1-" + (ruleNumber + 1));
  409.                                 }
  410.                             } while (!ok);
  411.                             addRule(k - 1);
  412.                             break;
  413.                     }
  414.                 } while (act != 3);
  415.             }
  416.  
  417.         }
  418.         static void PrintRules(int ruleNumber)
  419.         {
  420.             Console.ForegroundColor = ConsoleColor.White;
  421.             for (int i = 0; i < ruleNumber; i++)
  422.             {
  423.                 Console.Write((i + 1) + ". " + left[i] + "->");
  424.                 if (end[i] == true)
  425.                 {
  426.                     Console.Write(".");
  427.                 }
  428.                 Console.WriteLine(right[i]);
  429.             }
  430.             Console.WriteLine();
  431.             Console.ResetColor();
  432.         }
  433.         static void Main(string[] args)
  434.         {
  435.             bool alfin = false;
  436.             strin = false;
  437.             rulin = false;
  438.             int act = 0;
  439.             int ruleNumber = 0;
  440.             int exit;
  441.             Console.Clear();
  442.             //Console.WriteLine("Нормальные алгорифмы Маркова.\n\nДля продолжения нажмите любую клавишу");
  443.             //Console.ReadKey();
  444.  
  445.             do
  446.             {
  447.                 Console.Clear();
  448.                 if (alfin)
  449.                 {
  450.                     Console.Write("Алфавит: ");
  451.                     WhiteLn(a);
  452.                 }
  453.                 if (strin)
  454.                 {
  455.                     Console.Write("Строка: ");
  456.                     WhiteLn(s);
  457.                 }
  458.                 if (rulin)
  459.                 {
  460.                     Console.WriteLine("Правила: ");
  461.                     PrintRules(ruleNumber);
  462.                 }
  463.                 if (alfin || strin || rulin)
  464.                 {
  465.                     Console.WriteLine();
  466.                 }
  467.                 int menuCounter = 0;
  468.  
  469.                 if (!alfin)
  470.                 {
  471.                     Console.WriteLine(++menuCounter + ". Ввести новый алфавит");
  472.                 }
  473.                 else
  474.                 {
  475.                     Console.WriteLine(++menuCounter + ". Работа с алфавитом");
  476.                     if (!strin)
  477.                     {
  478.                         Console.WriteLine(++menuCounter + ". Ввести новую строку");
  479.                     }
  480.  
  481.                     else
  482.                     {
  483.                         Console.WriteLine(++menuCounter + ". Заменить строку");
  484.                         if (!rulin)
  485.                         {
  486.                             Console.WriteLine(++menuCounter + ". Ввести новые правила");
  487.                         }
  488.                         else
  489.                         {
  490.                             Console.WriteLine(++menuCounter + ". Работа с правилами");
  491.  
  492.                             Console.WriteLine("\n" + ++menuCounter + ". Обработать строку");
  493.                         }
  494.                     }
  495.                 }
  496.  
  497.                 Console.WriteLine("\n" + ++menuCounter + ". Выход"); exit = menuCounter;
  498.                 Console.WriteLine();
  499.  
  500.                 act = AskForAction(exit);
  501.                 switch (act)
  502.                 {
  503.                     case 1:
  504.                         WorkAlphabet(ref alfin);
  505.                         break;
  506.                     case 2:
  507.                         if (act != exit)
  508.                         {
  509.                             Console.Clear();
  510.                             Console.Write("Алфавит: ");
  511.                             WhiteLn(a);
  512.                             Console.WriteLine();
  513.                             bool ok;
  514.                             do
  515.                             {
  516.                                 Console.Write("Введите новую строку для работы: ");
  517.                                 s = Console.ReadLine();
  518.                                 ok = Alf(s);
  519.                                 if (!ok)
  520.                                 {
  521.                                     RedLn("Ошибка. В строке обнаружены недопустимые символы.\n");
  522.                                 }
  523.                             } while (!ok);
  524.                             strin = true;
  525.                         }
  526.                         break;
  527.                     case 3:
  528.                         if (act != exit)
  529.                         {
  530.                             WorkRules(ref ruleNumber);
  531.                         }
  532.                         break;
  533.                     case 4:
  534.                         q = 0;
  535.                         if (q < 9000)
  536.                         {
  537.                             s = Algoritm(s, left, right, end, ruleNumber);
  538.                             Console.WriteLine("Результат:" + s);
  539.                             Console.ReadKey();
  540.                         }
  541.                         else
  542.                         {
  543.                             RedLn("Зацикливание.");
  544.                             Console.ReadKey();
  545.                         }
  546.                         break;
  547.  
  548.                 }
  549.  
  550.             } while (act != exit);
  551.  
  552.         }
  553.     }
  554. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement