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


             

Пример 10.3.3


#include

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

int cnt; // переменная для счета длин слов

int c0(), c1(), c2(); // функции-условия

void a0(), a1(), a2(), a3(); // функции-действия

int handler ( int i ); // обработчик строк таблицы

struct T_StructTableLine

{ // поле для имени состояния избыточно

int (*condition)(); // поле условия

void (*action)(); // поле действия

int ref; // поле перехода: индекс строки таблицы,

// которая будет обрабатываться следующей,

// или признак завершения процесса

}

T_StructTableLine

Table[]={ {c0,a0,1}, // таблица инициализируется статически,

{c1,a1,2}, // альтернативное решение - специальная

{c2,a0,1}, // функция задания начальных значений.

{c0,a0,3}, // Оно более гибкое, но менее

{c1,a2,2}, // эффективно.

{c2,a3,1}, // О наглядности см. комментарий

{c0,a3,3}; // в тексте.

{c1,a2,2},

{c2,a3,1},

{c0,a3,0}};

void main()

{

int iSt=0;

do {

iSt = handler ( iSt );

}

while ( iSt);

}

int handler ( int i )

{

if (Table[i].condition()) {

Table[i].action();

if (Table[i].ref) { symbol = getchar ();

return Table[i].ref; }

} else return ++i;

}

// Описания используемых функций:

int c0(){return symbol == '\n';}

int c1(){return 'a'<=symbol && symbol <= 'z';}

int c2(){return 'a'>symbol ||symbol > 'z';}

void a0(){}

void a1(){printf ("%c", symbol);cnt = 1;}

void a2(){printf ("%c", symbol);cnt++;}

void a3(){printf ("- %i\n", cnt);}




Содержание  Назад  Вперед