Суть автоматного программирования состоит в том, что управляющая программа строится и функционирует как конечный автомат, который может находиться в каждый момент времени только в одном из N состояний. При этом в каждом цикле для текущего состояния (иначе, ШАГА программы) вычисляются логические условия, позволяющие изменить состояние программы.
Теоретиками автоматного программирования предложена следующая концепция идеальной программной реализации:
- вся логика программы строится на основе селектора (switch в языке Си);
- вспомогательно используется оператор условия if;
- обязательно наличие цикла, охватывающего код собственно реализации автомата.
Представим универсальный автоматный алгоритм в общем виде (рис. 1).
Рис. 1
Рамка имитирует цикловую природу реализации автомата. Вверху явно указан оператор “while(cycle)”, где “cycle” – признак продолжения цикла, который перед передачей управления оператору while должен быть установлен в ненулевое значение.
Автоматная программа имеет несколько состояний Y. Обязательно наличие начального состояния Y=0.
|
|
Переходы между состояниями обозначаются стрелками и помечаются дробью: входное событие Х / выходное событие Z (действие на соответствующем переходе).
Пусть мы находимся в состоянии Y=i. Тогда при наступлении входного события Хij, за которым скрыто соответствующее логическое выражение, выполняется некоторая последовательность операторов Zij, подготавливающая функционирование автоматной программы в новом состоянии, и осуществляется переход в новое состояние (Y=j).
Разумеется, не обязательно должен быть возможен переход из любой вершины в любую. При его невозможности соответствующий Х равен нулю, и дуга отсутствует.
Входному событию взаимно однозначно соответствует переход из текущего состояния в другое. Если ни одно из вычисляемых в данном состоянии событий не наступило, то сохраняется текущее состояние, и этому соответствует логическое условие, отрицающее любое из входных событий – условий переходов в другие состояния (см. “петли” – дуги, исходящие и заходящие в одну и ту же вершину).
Отдельно, через запятую, указаны операторы вида “cycle = 0”, что означает конец циклической обработки. При этом направление перехода всегда к начальной вершине, она же является и заключительной для обеспечения корректного повторного использования данной подпрограммы.
Приведем структуру программы на языке Си, реализующей представленный на рис. 1 алгоритм.
int X01,..., ХN(N-1), Z01,..., ZN(N-1), Y=0, cycle=1;