Проверка введённой строки соответствию маске-ввода - C#
Формулировка задачи:
Есть строка, состоящая из 4-х различных букв ("a","b","c","d")
Есть маска, которой должны соответствовать введённые строки: a+b*|c?d
где
- a+ - может быть 1 или 2 символа
- b* - может быть любое количество символов , начиная с 1
- с? - может быть 1 или 0 символов
- d - 1 символ
- b*|c? - логическое "или": Или в строке может быть любое количество букв "b", либо 1 или 0 символов "с".
- aabbbd
- acd
- ad
- aad
- abbbbbbbbbbbbd
Решение задачи: «Проверка введённой строки соответствию маске-ввода»
textual
Листинг программы
- using System;
- namespace ConsoleApplication221
- {
- class Program
- {
- static void Main(string[] args)
- {
- //описываем переходы
- var steps = new Step[]
- {
- new Step('a', 0, 1),
- new Step('a', 1, 2),
- new Step('b', 1, 3),
- new Step('b', 2, 3),
- new Step('b', 3, 3),
- new Step('c', 1, 4),
- new Step('c', 2, 4),
- new Step('d', 1, 5),
- new Step('d', 2, 5),
- new Step('d', 3, 5),
- new Step('d', 4, 5),
- new Step('$', 5, -1)
- };
- //задаем входную строку
- var str = Console.ReadLine();
- //проверяем строку
- if (StateMachine.Check(str, steps))
- Console.WriteLine("Строка подходит");
- else
- Console.WriteLine("Строка НЕ подходит");
- Console.ReadLine();
- }
- }
- public static class StateMachine
- {
- public static bool Check(string str, Step[] steps)
- {
- //начальное состояние
- int state = 0;
- //добавляем символ конца
- str = str + "$";
- //проверяем переходы
- foreach (var c in str)
- {
- var found = false;
- foreach (var step in steps)
- if (step.Accept(c, ref state))
- {
- //сработал переход
- found = true;
- break;
- }
- if (!found) return false;//ни один переход не сработал
- if (state == -1) return true;//достигнуто конечное состояние
- }
- //символы закончились, а конечное состояние - не достигнуто
- return false;
- }
- }
- // Переход конечного автомата
- public struct Step
- {
- char @char;
- int fromState;
- int toState;
- public Step(char c, int from, int to)
- {
- @char = c;
- fromState = from;
- toState = to;
- }
- //срабатывает ли переход для данного символа и данного состояния?
- public bool Accept(char c, ref int state)
- {
- if (c == @char && state == fromState)
- {
- state = toState;
- return true;
- }
- return false;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д