Advertisement
kot025

Markov 1.0

Feb 19th, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.79 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 ConsoleApplication2
  8. {
  9.     class Program
  10.     {
  11.         static string s; // тут хранится строка глобально
  12.         static string a; // здесь алфавит
  13.         static string[] left; // массив левых частей введенных правил
  14.         static string[] right; // массив правых частей
  15.         static bool[] end; // массив тру-фолс в зависимости от конечности или не конечности  мета-символа в правиле соотв.
  16.  
  17.         static int AskForAction(int qtyOfActions) // запрос команды меню и проверка вводимых значений
  18.         {
  19.             int act;
  20.             bool ok;
  21.             do
  22.             {
  23.                 Console.Write("Команда: ");
  24.                 string buf = Console.ReadLine();
  25.                 ok = int.TryParse(buf, out act) && act > 0 && act <= qtyOfActions;
  26.                 if (!ok)
  27.                     RedLn("Доступны команды 1 - " + qtyOfActions + ".");
  28.             } while (!ok);
  29.             Console.WriteLine();
  30.             return act;
  31.         }
  32.  
  33.         static void RedLn(string str) // Console.WriteLine красного цвета
  34.         {
  35.             Console.ForegroundColor = ConsoleColor.Red;
  36.             Console.WriteLine(str);
  37.             Console.ResetColor();
  38.         }
  39.         static int Check(string rule) // проверка на наличие в строке мета-символа и на его положение, возврат кода ошибки
  40.         {
  41.             int code = 0;
  42.             if (rule.Contains("->"))
  43.             {
  44.                 if (rule.IndexOf("->") == 0)
  45.                 {
  46.                     code = 2;
  47.                 }
  48.                 else
  49.                 {
  50.                     if ((rule.IndexOf("->") == rule.Length - 2) || (rule.IndexOf("->.") == rule.Length - 3))
  51.                     {
  52.                         code = 3;
  53.                     }
  54.                 }
  55.             }
  56.             else
  57.             {
  58.                 code = 1;
  59.             }
  60.             return code;
  61.         }
  62.  
  63.         static bool Alf(string s) // проверка на соответствие алфавиту
  64.         {
  65.             bool ok = true;
  66.             for (int i = 0; i < s.Length; i++)
  67.             {
  68.                 if (!a.Contains(s[i]))
  69.                 {
  70.                     ok = false;
  71.                     break;
  72.                 }
  73.             }
  74.             return ok;
  75.         }
  76.        
  77.         static int Split(string rule, int i) // проверяем левую-правую части переданной строки правила с переданным номером
  78.         {               // и записываем куски правила в соотв. массивы под соотв. номерами
  79.             int index = -1;
  80.             index = rule.IndexOf("->.");
  81.             if (index == -1)
  82.             {
  83.                 index = rule.IndexOf("->");
  84.             }
  85.  
  86.             if (!Alf(rule.Substring(0, index)))
  87.             {
  88.                 return 1;               // левая часть правила не соотв. алф.
  89.             }
  90.  
  91.             left[i] = rule.Substring(0, index);
  92.             if (rule[index + 2] == '.')
  93.             {
  94.                 if (!Alf(rule.Substring(index + 3, rule.Length - index - 3))) // правая часть правила с "->." не соотв. алф.
  95.                 {
  96.                     return 2;                  
  97.                 }
  98.                 else
  99.                 {
  100.                     end[i] = true;
  101.                     right[i] = rule.Substring(index + 3, rule.Length - index - 3);
  102.                 }
  103.             }
  104.             else
  105.             {
  106.                 if (!Alf(rule.Substring(index + 3, rule.Length - index - 3))) // правая часть правила c "->" не соотв. алф.
  107.                 {
  108.                     return 2;                      
  109.                 }
  110.                 else
  111.                 {
  112.                     end[i] = false;
  113.                     right[i] = rule.Substring(index + 2, rule.Length - index - 2);
  114.                 }
  115.             }
  116.             return 0;
  117.         }
  118.  
  119.         static void Main()
  120.         {
  121.             left = new string[100];
  122.             right = new string[100];
  123.             end = new bool[100];
  124.  
  125.  
  126.  
  127.             bool ok;
  128.             string rule;
  129.             int splitCode = 0;
  130.             Console.Clear();
  131.             Console.Write("Введите алфавит в одну строку: ");
  132.             a = Console.ReadLine() + " ";
  133.             do
  134.             {
  135.                 Console.Write("Введите строку для работы: ");
  136.                 s = Console.ReadLine();
  137.                 ok = Alf(s);
  138.                 if (!ok)
  139.                 {
  140.                     RedLn("Ошибка. В строке обнаружены недопустимые символы. ");
  141.                 }
  142.             } while (!ok);
  143.  
  144.  
  145.             Console.Clear();
  146.             // удалить пробелы
  147.             Console.WriteLine("Ваш алфавит: " + a);
  148.             Console.WriteLine("Ваша строка: " + s);
  149.             Console.WriteLine("Введите правила: ");
  150.             int ruleNumber = 0;
  151.             int code;
  152.             int act;
  153.             do
  154.             {
  155.                 do
  156.                 {
  157.                     Console.Write("Правило №" + (ruleNumber+1) + ": ");
  158.                     rule = Console.ReadLine();
  159.                     code = Check(rule);
  160.                     switch (code)
  161.                     {
  162.                         case 1:
  163.                             RedLn("Ошибка. В правиле отсутствует мета-символ.");
  164.                             Console.WriteLine("Повторите ввод.");
  165.                             break;
  166.                         case 2:
  167.                             RedLn("Ошибка. Левая часть правила не может быть пустой.");
  168.                             Console.WriteLine("Повторите ввод.");
  169.                             break;
  170.                         case 3:
  171.                             RedLn("Ошибка. Правая часть правила не может быть пустой.");
  172.                             Console.WriteLine("Повторите ввод.");
  173.                             break;
  174.                     }
  175.                     if (code == 0)
  176.                     {
  177.                         splitCode = Split(rule, ruleNumber);
  178.                         switch (splitCode)
  179.                         {
  180.                             case 1: RedLn("Ошибка. Левая часть правила не соответствует алфавиту.");
  181.                                 Console.WriteLine("Повторите ввод.");
  182.                                 break;
  183.                             case 2: RedLn("Ошибка. Правая часть правила не соответствует алфавиту.");
  184.                                 Console.WriteLine("Повторите ввод.");
  185.                                 break;
  186.                         }
  187.  
  188.                     }
  189.  
  190.                 } while (code!=0 || splitCode !=0);
  191.  
  192.                 Console.WriteLine("\n1. Добавить правило.\n2. Закончить ввод правил.");
  193.                 act = AskForAction(2);
  194.                 ruleNumber++;
  195.                
  196.             } while (act == 1);
  197.  
  198.            
  199.  
  200.             Split(rule, 0);
  201.  
  202.             Console.Write(left[0]+" "+right[0]+" "+end[0]);
  203.         }
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement