Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 203

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 197 198 199 200 201 202 < 203 > 204 205 206 207 208 209 .. 316 >> Следующая

роанализировав граф автомата или таблицу, мо но заметить, что в данном примере наряду с циклом потоковой обработки имеется еще один цикл: передачи управления между состояниями. Это причина, из-за которой в двух
578
ГЛАВА 10. МЕТОДЫ ПРОГРАММИРОВАНИЯ ОТ СОСТОЯНИЙ
предыдуих вариантах появились присваивание переменной State значения и выбор выполняемого фрагмента по этому значению. Особенность последовательностей действий
State = <значение>; switch ( State )
которая вполняется всякий раз в конце действий, ассоциированнх с состояниями (точнее — реализаций действий в программах), в том, что в каждой точке программы, где встречается данное присваивание, мо но точно указать результат динамически следуего оператора перекл чения, причем эта информация не зависит от обрабатываемого потока и мо ет быть определена до вычислений, статически.
А нельзя ли использовать это явно для организации управления конечным автоматом? Ответ: можно, что и демонстрирует четвертый вариант решения обсу даемой задачи. В нем исчезает необходимость вычисляемого перехода (результат внедрения статической информации в текст программ ), но, как следствие, становятся избыточными описания типа States и переменной State этого типа. В программе появляются операторы безусловного перехода, которые делают структуру управления программы полностью расходящейся с канонами структурного программирования, из-за чего такой вариант программы мо ет подвергаться критике догматически мысляих программистов и теоретиков. о в данном случае отступление от канонов структурного программирования полностью оправдано, поскольку за счет специального расположения фрагментов текста вся программа оказалась очень похожей на таблицу конечного автомата, а структура передач управления копирует граф конечного автомата. Таким образом, лишь сейчас, после полного отхода от канонов структурности, программа стала адекватна своей спецификации.
Вариант 4: использование статической информации о разветвлениях вычислений.
Программа 10.2.4 Длины слов: состояния — метки в программе
#include <stdlib.h> #include <stdio.h> #include <time.h>
char symbol; int cnt;
10.2. ПОДСЧЕТ ДЛИН СЛОВ
579
void main( void ) {
symbol = getchar ();
St1: if ('a'<=symbol && symbol <= 'z') { printf ("%c", symbol); cnt = 1;
symbol = getchar (); goto St2;
}
else if (symbol != '\n') {
symbol = getchar (); goto St1;
}
else /* (symbol == '\n') */ return;
St2: if ('a'<=symbol && symbol <= 'z') { printf ("%c", symbol); cnt++;
symbol = getchar (); goto St2;
}
else if (symbol != \n ) { printf (" - %i\n", cnt); symbol = getchar (); goto St1;
}
else {
printf (" - %i\n", cnt); return;
}
}
10.2.5. Представления, ориентированные на автоматические преобразования диаграмм переходов
Принятие решения об автоматическом оперировании с табличным представлением влечет за собой требование строгого определения структур данных, программно представляющих конечный автомат. Это справедливо как для варианта автоматической трансляции, так и для интерпретации. Задание диаграммы конечного автомата зависит от стратегии дальнейшей обработки. В частности, если предполагается предварительное построение текстового
580
ГЛАВА 10. МЕТОДЫ ПРОГРАММИРОВАНИЯ ОТ СОСТОЯНИЙ
представления таблицы, которое в дальнейем преобразуется к виду, приспособленному к конкретной работе, то вполне приемлемо, к примеру, такое (универсальное) текстовое представление: Программа 10.2.5 Программа в виде размеченного текста
_1 char symbol; // Чтение потока символов неявное
int cnt;
... // Инициализация _4 St1 _5
_1 St1 _2 'a'<=symbol && symbol <= 'z' _3 printf ("%c", symbol);
cnt = 1; _4 St2 _5
_1 _2 //symbol <'a' && 'z'< symbol && symbol != '\n'
_3
//Так как ну но печатать только слова,
//действий нет _4 St1 _5
_1 _2 failure _3
// symbol == \n не нужно читать _4 exit _5
_1 St2 _2 'a'<=symbol && symbol <= 'z' _3 printf ("%c", symbol);
cnt++; _4 St2 _5
_1 _2 //(symbol <'a'||'z'< symbol)&&*/symbol!='\n'
_3 printf (" - %i\n", Cnt); _4 St1 _5 _1 _2 failure _3 printf (" - %i\n", Cnt); _4exit_5
_1 exit _2 // отсутствие условия — истина, но без неявного чтения потока
_3 return 0; _4 _5
Здесь i = 1,..., 5, обозначат позиции таблиці. Эти сочетания символов, нигде в нормальной программе не встречаиеся, легко могут распознаваться препроцессором. Размещаемые между ними последовательности символов разносятся по соответствуим полям ну ной структур , которая в зависимости от выбранной стратегии интерпретируется либо транслируется. С помощью этих сочетаний осуществляется разметка текста, которая дает возмо ность распознавать и осмсливать его фрагмент . Стоит обратить внимание, что за счет специального взаимного располо ения символов в данном тексте представляемая им таблица автомата вполне просто усматривается взглядом. Если нет более подходяего представления, то данну структуру вполне можно рекомендовать для ввода.
Однако непосредственная интерпретация универсального текстового размеченного представления довольно затруднительна. редпочтительнее, чтобы единицами интерпретации бли бы сами поля таблиц . ообе гово-
Предыдущая << 1 .. 197 198 199 200 201 202 < 203 > 204 205 206 207 208 209 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100