Advertisement
kot025

Markov2.1

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