Стили и методы программирования


Табличное представление графа состояний - часть 3


Таблица 9.1. Табличное представление графа для действий на переходах

St1St1St2St1St3St2St2St1St3St3St2St1exitexit

char symbol; // Чтение потока символов неявное

// Чтение происходит перед выполнением проверок и действий

int Cnt; . . . // Инициализация

'a'<=symbol && symbol <= 'z'printf ("%c", symbol); Cnt = 1;
/*(symbol<'a'|| 'z'<symbol) &&*/ symbol!='\n'/* Действий нет */
symbol='\n'/* Действий нет */
'a'<=symbol && symbol <= 'z'printf ("%c", symbol);cnt++;
/*(symbol<'a'|| 'z'<symbol) &&*/ symbol != '\n'printf ("- %i\n", Cnt);
symbol='\n'printf ("- %i\n", Cnt);
'a'<=symbol && symbol <= 'z'printf ("%c", symbol); Cnt = 1;
/*(symbol<'a'|| 'z'<Symbol) &&*/ symbol!='\n'/* Действий нет */
symbol='\n'Второй '\n' дальше не нужно читать
/* Нет неявного чтения потока */return 0; // Считать данную секцию таблицы состоянием или нет - дело вкуса

Таблица 9.2. Табличное представление графа для действий в состояниях

St1St1St2St1St3St2St2St4St5St3St2St1exitSt4St2St1St3St5St2exitexitexit

char symbol; // Чтение потока символов неявное

// Чтение происходит после выполнения действия, перед проверками

int Cnt; ...Cnt=0;

// Инициализация

/* Действий нет */'a'<=symbol && symbol <= 'z'
/*(symbol<'a'|| 'z'<symbol) &&*/ symbol!='\n'
symbol='\n'
printf ("%c", symbol); Cnt++;'a'<=symbol && symbol <= 'z'
/*(symbol<'a'|| 'z'<symbol) &&*/ symbol != '\n'
symbol='\n'
/* Действий нет */'a'<=symbol && symbol <= 'z'
/*(symbol<'a'|| 'z'<Symbol) &&*/ symbol!='\n'
Второй '\n' дальше не нужно читать symbol='\n'
printf ("- %i\n", Cnt); Cnt=0;'a'<=symbol && symbol <= 'z'
/*(symbol<'a'|| 'z'<symbol) &&*/ symbol != '\n'
symbol='\n'
printf ("- %i\n", Cnt); Cnt=0;'a'<=symbol && symbol <= 'z'
/*(symbol<'a'|| 'z'<symbol) &&*/ symbol != '\n'
Второй '\n' дальше не нужно читать symbol='\n'
/* Нет неявного чтения потока */return 0; // Считать данную секцию таблицы состоянием или нет - дело вкуса

  1)

  Если Вы посмотрите точное определение, то есть еще один компонент: преобразование состояний в выходные символы. Аналогом этого компонента в программировании может служить массив процедур, вызовы которых сопоставлены состояниям, но для принципиальных рассмотрений у нас он не важен.

  2)

  Конечно же, в каждом конкретном модуле нужно использовать лишь одну из структур, концептуально несовместимых, хотя формально эквивалентных.

  3)

  Интересно, что необходимость развитых средств поддержки модуляризации программ первоначально провозглашалась для структурного программирования, но оказалась прекрасно приспособлена совсем к другому стилю. Впрочем, в современных программах самый верхний (часто полуавтоматически генерируемый системами визуального программирования и поэтому обычно мало интересный для программистов) этаж структуры программ, как правило, записан именно в стиле автоматного программирования.

  4)

  Данный абзац добавлен после обсуждения с проф. А.А. Шалыто.

  5)

  Сделаем общее замечание насчет доказательной силы аргумента: "Это исследовано в теории". При применении теории необходимо всегда помнить, что вовсю исследуются не только разумные понятия, но и извращения.




Начало  Назад  



Книжный магазин