Advertisement
kot025

Markov 2.4

Feb 23rd, 2015
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 23.18 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. Добавить символы в имеющийся\n");
  238.                 act = AskForAction(2);
  239.                 Console.Clear();
  240.                 if (act == 1)
  241.                 {
  242.                     do
  243.                     {
  244.                         do
  245.                         {
  246.                             Console.Write("Введите алфавит в одну строку: ");
  247.                             a1 = Console.ReadLine();
  248.                             if (a1 == "")
  249.                             {
  250.                                 RedLn("Ошибка. Алфавит не может быть пустым.\n");
  251.                             }
  252.                         } while (a1 == "");
  253.                         a1 = RemoveSpaces(a1);
  254.                         if (FindEquals(a1) == true)
  255.                         {
  256.                             RedLn("Ошибка. В вашем алфавите найдены повторяющиеся элементы. Повторите ввод.\n");
  257.                         }
  258.                     }
  259.                     while (FindEquals(a1) == true);
  260.                     a = a1 + " ";
  261.                     if (strin && !Alf(s))
  262.                     {
  263.                         s = "";
  264.                         left = new string[100];
  265.                         right = new string[100];
  266.                         end = new bool[100];
  267.                         rulin = false;
  268.                         strin = false;
  269.                     }
  270.                 }
  271.                 else
  272.                 {
  273.                     Console.Write("Aлфавит: ");
  274.                     WhiteLn(a);
  275.                     Console.WriteLine();
  276.                     do
  277.                     {
  278.                         Console.Write("Введите символы для добавления к алфавиту: ");
  279.                         a1 = Console.ReadLine();
  280.                         a1 = RemoveSpaces(a1);
  281.                         if (FindEquals(a1) == true)
  282.                         {
  283.                             RedLn("Ошибка. В введенной строке найдены повторяющиеся элементы. Повторите ввод.\n");
  284.                         }
  285.                         if (FindEquals(a + a1) == true)
  286.                         {
  287.                             RedLn("Ошибка. В введенной строке найдены элементы, которые уже есть в алфавите. Повторите ввод.\n");
  288.                         }
  289.                     }
  290.                     while (FindEquals(a + a1) == true);
  291.                     a = RemoveSpaces(a) + a1 + " ";
  292.                 }
  293.             }
  294.             else // если алфавита не было
  295.             {
  296.                 do
  297.                 {
  298.                     do
  299.                     {
  300.                         Console.Write("Введите алфавит в одну строку: ");
  301.                         a1 = Console.ReadLine();
  302.                         if (a1 == "")
  303.                         {
  304.                             RedLn("Ошибка. Алфавит не может быть пустым.\n");
  305.                         }
  306.                     } while (a1 == "");
  307.                     a1 = RemoveSpaces(a1);
  308.                     if (FindEquals(a1) == true)
  309.                     {
  310.                         RedLn("Ошибка. В вашем алфавите найдены повторяющиеся элементы. Повторите ввод.\n");
  311.                     }
  312.                 }
  313.                 while (FindEquals(a1) == true);
  314.                 a = a1 + " ";
  315.                 alfin = true;
  316.             }
  317.         } // работа с алфавитом
  318.         static void addRule(int ruleNumber)
  319.         {
  320.             int code = 0;
  321.             do
  322.             {
  323.                 Console.Write("Правило №" + (ruleNumber + 1) + ": ");
  324.                 string rule = Console.ReadLine();
  325.                 code = Check(rule);
  326.  
  327.                 switch (code)
  328.                 {
  329.                     case 1:
  330.                         RedLn("Ошибка. В правиле отсутствует мета-символ.");
  331.                         break;
  332.                     case 2:
  333.                         RedLn("Ошибка. Левая часть правила не может быть пустой.");
  334.                         break;
  335.                 }
  336.                 if (code == 0)
  337.                 {
  338.                     code = Split(rule, ruleNumber);
  339.                     switch (code)
  340.                     {
  341.                         case 1: RedLn("Ошибка. Левая часть правила не соответствует алфавиту.");
  342.                             break;
  343.                         case 2: RedLn("Ошибка. Правая часть правила не соответствует алфавиту.");
  344.                             break;
  345.                     }
  346.                 }
  347.                 if (code != 0)
  348.                 {
  349.                     Console.WriteLine("Повторите ввод.\n");
  350.                 }
  351.             } while (code != 0);
  352.  
  353.         }
  354.         static void WorkRules(ref int ruleNumber) // работа с правилами
  355.         {
  356.             Console.Clear();
  357.             int act;
  358.             if (left[0] == null)
  359.             {
  360.                 right = new string[100];
  361.                 end = new bool[100];
  362.                 rulin = false;
  363.                 act = 1;
  364.                 ruleNumber = 0;
  365.  
  366.                 Console.Write("Алфавит: ");
  367.                 WhiteLn(a);
  368.                 Console.Write("Строка: ");
  369.                 WhiteLn(s);
  370.                 Console.WriteLine();
  371.                 Console.WriteLine("Введите новые правила в формате ?*->* или ?*->.*");
  372.                 Console.WriteLine("Обратите внимание на принадлежность вводимых символов алфавиту.\n");
  373.                 do
  374.                 {
  375.                     addRule(ruleNumber++);
  376.                     rulin = true;
  377.                     Console.WriteLine();
  378.                     Console.WriteLine("1. Ввести еще одно правило\n2. Закончить ввод правил");
  379.                     act = AskForAction(2);
  380.                     Console.WriteLine();
  381.                 } while (act != 2);
  382.             }
  383.             else
  384.             {
  385.                 do
  386.                 {
  387.                     Console.Clear();
  388.                     Console.Write("Алфавит: ");
  389.                     WhiteLn(a);
  390.                     Console.Write("Строка: ");
  391.                     WhiteLn(s);
  392.                     Console.WriteLine();
  393.                     if (rulin)
  394.                     {
  395.                         Console.WriteLine("Правила: ");
  396.                         PrintRules(ruleNumber);
  397.                     }
  398.                     Console.WriteLine("1. Ввести новый набор правил\n2. Добавить правила или заменить текущие\n3. Что я здесь забыл?");
  399.                     Console.WriteLine();
  400.                     act = AskForAction(3);
  401.                     switch (act)
  402.                     {
  403.                         case 1:
  404.                             left = new string[100];
  405.                             right = new string[100];
  406.                             end = new bool[100];
  407.                             ruleNumber = 0;
  408.                             WorkRules(ref ruleNumber);
  409.                             break;
  410.                         case 2:
  411.                             Console.Clear();
  412.                             Console.Write("Алфавит: ");
  413.                             WhiteLn(a);
  414.                             Console.Write("Строка: ");
  415.                             WhiteLn(s);
  416.                             Console.WriteLine("Правила: ");
  417.                             PrintRules(ruleNumber);
  418.                             Console.WriteLine("Введите номер правила, которое хотите заменить.\nДля добавления еще одного правила введите номер, на единицу больший максимального.");
  419.                             bool ok;
  420.                             int k;
  421.                             do
  422.                             {
  423.                                 Console.Write("Номер: ");
  424.                                 string buf = Console.ReadLine();
  425.                                 ok = int.TryParse(buf, out k) && k > 0 && k <= ruleNumber + 1;
  426.                                 if (!ok)
  427.                                 {
  428.                                     RedLn("Ошибка. Ожидалось значение в пределах 1-" + (ruleNumber + 1));
  429.                                 }
  430.                             } while (!ok);
  431.                             addRule(k - 1);
  432.                             break;
  433.                     }
  434.                 } while (act != 3);
  435.             }
  436.  
  437.         }
  438.         static void PrintRules(int ruleNumber)
  439.         {
  440.            
  441.             for (int i = 0; i < ruleNumber; i++)
  442.             {
  443.                 Console.Write((i + 1) + ". ");
  444.                 Console.ForegroundColor = ConsoleColor.White;
  445.                 Console.Write(left[i] + "->");
  446.                 if (end[i] == true)
  447.                 {
  448.                     Console.Write(".");
  449.                 }
  450.                 Console.WriteLine(right[i]);
  451.                 Console.ResetColor();
  452.             }
  453.             Console.WriteLine();
  454.            
  455.         }
  456.         static void Main(string[] args)
  457.         {
  458.             bool alfin = false;
  459.             strin = false;
  460.             rulin = false;
  461.             int act = 0;
  462.             int ruleNumber = 0;
  463.             int exit;
  464.             Console.Clear();
  465.             WhiteLn("Нормальные алгорифмы Маркова.");
  466.             Console.WriteLine();
  467.             WhiteLn("Нажмите любую клавишу для продолжения.");
  468.             Console.WriteLine("\n\n\nВеселов Матлашевская Неганова Юрчак");
  469.             Console.ReadKey();
  470.             do
  471.             {
  472.                 Console.Clear();
  473.                 if (alfin)
  474.                 {
  475.                     Console.Write("Алфавит: ");
  476.                     WhiteLn(a);
  477.                 }
  478.                 if (strin)
  479.                 {
  480.                     Console.Write("Строка: ");
  481.                     WhiteLn(s);
  482.                 }
  483.                 if (rulin)
  484.                 {
  485.                     Console.WriteLine("Правила: ");
  486.                     PrintRules(ruleNumber);
  487.                 }
  488.                 if (alfin && !rulin)
  489.                 {
  490.                     Console.WriteLine();
  491.                 }
  492.                 int menuCounter = 0;
  493.  
  494.                 if (!alfin)
  495.                 {
  496.                     Console.WriteLine(++menuCounter + ". Ввести новый алфавит");
  497.                 }
  498.                 else
  499.                 {
  500.                     Console.WriteLine(++menuCounter + ". Работа с алфавитом");
  501.                     if (!strin)
  502.                     {
  503.                         Console.WriteLine(++menuCounter + ". Ввести новую строку");
  504.                     }
  505.  
  506.                     else
  507.                     {
  508.                         Console.WriteLine(++menuCounter + ". Заменить строку");
  509.                         if (!rulin)
  510.                         {
  511.                             Console.WriteLine(++menuCounter + ". Ввести новые правила");
  512.                         }
  513.                         else
  514.                         {
  515.                             Console.WriteLine(++menuCounter + ". Работа с правилами");
  516.  
  517.                             Console.WriteLine("\n" + ++menuCounter + ". Обработать строку");
  518.                         }
  519.                     }
  520.                 }
  521.  
  522.                 Console.WriteLine("\n" + ++menuCounter + ". Выход"); exit = menuCounter;
  523.                 Console.WriteLine();
  524.  
  525.                 act = AskForAction(exit);
  526.                 switch (act)
  527.                 {
  528.                     case 1:
  529.                         WorkAlphabet(ref alfin);
  530.                         break;
  531.                     case 2:
  532.                         if (act != exit)
  533.                         {
  534.                             Console.Clear();
  535.                             Console.Write("Алфавит: ");
  536.                             WhiteLn(a);
  537.                             Console.WriteLine();
  538.                             bool ok;
  539.                             do
  540.                             {
  541.                                 do
  542.                                 {
  543.                                     Console.Write("Введите новую строку для работы: ");
  544.                                     s = Console.ReadLine();
  545.                                     if (s == "")
  546.                                     {
  547.                                         RedLn("Ошибка. Строка не может быть пустой.");
  548.                                         Console.WriteLine();
  549.                                     }
  550.                                 } while (s == "");
  551.                                 ok = Alf(s);
  552.                                 if (!ok)
  553.                                 {
  554.                                     RedLn("Ошибка. В строке обнаружены недопустимые символы.\n");
  555.                                 }
  556.                             } while (!ok);
  557.                             strin = true;
  558.                         }
  559.                         break;
  560.                     case 3:
  561.                         if (act != exit)
  562.                         {
  563.                             WorkRules(ref ruleNumber);
  564.                         }
  565.                         break;
  566.                     case 4:
  567.                         q = 0;
  568.                         string copys = s;
  569.                         s = Algoritm(s, left, right, end, ruleNumber);
  570.                         if (q < 9000)
  571.                         {
  572.  
  573.                             Console.Write("Результат: ");
  574.                             WhiteLn(s);
  575.                             Console.ReadKey();
  576.                         }
  577.                         else
  578.                         {
  579.                             s = copys;
  580.                             RedLn("Зацикливание.");
  581.                             Console.ReadKey();
  582.                         }
  583.                         break;
  584.  
  585.  
  586.                 }
  587.  
  588.             } while (act != exit);
  589.         }
  590.     }
  591. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement