|
0
|
1
|
|
ЧЕТ
|
ЧЕТ
|
НЕЧЕТ
|
0
|
НЕЧЕТ
|
НЕЧЕТ
|
ЧЕТ
|
1
|
Информация в таблице переходов размещается в
соответствии со следующими соглашениями:
Столбцы помечены входными символами;
Строки помечены символами состояний;
Элементами таблицы являются символы новых
состояний, соответствующих входным символам столбцов и состояниям строк;
Первая строка помечена символом начального
состояния;
Строки, соответствующие допускающим
(заключительным) состояниям, помечены справа единицами, а строки,
соответствующие отвергающим состояниям, помечены справа нулями.
Таким образом, приведенная таблица переходов
задает конечный автомат, у которого:
Входное множество ={0,1};
Множество состояний ={ЧЕТ, НЕЧЕТ};
Функции переходов:
Начальное состояние = {ЧЕТ};
Допускающие состояния = {НЕЧЕТ}.
Простейшая программная реализация КА
- контроллера нечетности:
#include
"stdafx.h"
#include
"iostream.h"
#include
"stdio.h"
#include
"conio.h"per (int tsost, char tsymb)
{int
slsost;(tsymb)
{ case '0':
if (tsost==0) slsost=0; else slsost=1;'1': if (tsost==1) slsost=0; else
slsost=1;}slsost;
};main()
{ int
i,kol,tsost,slsost;ch, inpstr[80] ;("ENTER STRING ");=0;
while
((ch=getch()) !=13 && i<80) //ïîêà
íå íàæàòà
êëàâèøà <Enter>
{putch(ch);[i++]=ch;}[i]='\0';=i-1;("\n
input string:");(inpstr);=0;(i=0;i<=kol;i=i+1)
{=per(tsost,inpstr[i]);=slsost;
};(slsost)
{ case
0:cout<<"\n STRING is WRONG ";1:cout<<"\n STRING is
RIGHT ";};
return 0;
По Курсовой работе должен быть
подготовлен отчет, включающий в себя описание конечного автомата, реализующего
распознаватель в виде диаграммы и в виде функции переходов, а так же таблица
имен, блок-схема и текст программы, моделирующей конечный автомат, и результаты
работы контрольных примеров с протоколом работы конечного автомата.
Задания на Курсовую работу
Построить детерминированный конечный
распознаватель для:
последовательности действительных
чисел в формате с фиксированной точкой (число не может начинаться и
заканчиваться десятичной точкой), разделенных запятыми, и заканчивающейся
символом #, например, (+65.372,-785.34,457.7#);
последовательности действительных
чисел в формате с фиксированной точкой (число не может начинаться и
заканчиваться десятичной точкой), разделенных точкой с запятой, и
заканчивающейся символом #, например, (+65.372;-785.34;457.7#);
последовательности действительных
чисел в формате с фиксированной точкой (число не может начинаться и
заканчиваться десятичной точкой), разделенных слэшами, и заканчивающейся
символом #, например, (+65.372/-785.34/457.7#);
последовательности действительных
чисел в формате с плавающей точкой, разделенных запятой, и заканчивающейся
символом #, например, (65.3Е-2,+785.3E4,457.7E+2#);
последовательности действительных
чисел в формате с плавающей точкой, разделенных точкой с запятой, и
заканчивающейся символом #, например, (65.3Е-2;+785.3E4;457.7E+2#);
последовательности действительных
чисел в формате с плавающей точкой, разделенных слэшами, и заканчивающейся
символом #, например, (65.3Е-2/+785.3E4/457.7E+2#);
последовательности целых чисел,
разделенных запятыми, и заканчивающейся символом #, например,
(65,+78534,-4577#);
последовательности целых чисел,
разделенных точкой с запятой, и заканчивающейся символом #, например,
(65;+78534;-4577#);
последовательности целых чисел,
разделенных слэшами, и заканчивающейся символом #, например,
(65/+78534/-4577#);
последовательности составных имен
объектов, разделенных слэшами, и заканчивающейся символом # , т.е. точечных
нотаций идентификаторов, разделенных точками, идентификатор может содержать
латинские буквы, цифры и знаки подчеркивания, а начинаться либо с буквы, либо
со знака подчеркивания, например, (q.ad.w/e.w1/re.r5.а#);
последовательности составных имен
объектов, разделенных точкой с запятой, и заканчивающейся символом # , т.е.
точечных нотаций идентификаторов, разделенных точками, идентификатор может
содержать латинские буквы, цифры и знаки подчеркивания, а начинаться либо с
буквы, либо со знака подчеркивания, например, (q.ad.w;e.w1;re.r5.а#);
последовательности составных имен
объектов, разделенных запятыми, и заканчивающейся символом # - т.е. точечных
нотаций идентификаторов, разделенных точками, идентификатор может содержать
латинские буквы, цифры и знаки подчеркивания, а начинаться либо с буквы, либо
со знака подчеркивания, например, (q.ad.w,e.w1,re.а,r5#);
полной и сокращенной спецификации
файла, например (a:\w1\data.pas) либо (ааа.dat);
последовательностей путей поиска
файлов, разделенных запятой, и заканчивающихся точкой с запятой, например
(a:\data,c:\work;)
последовательности элементов типа
«дата» в немецком формате (ДД.ММ.ГГГГ), разделенных запятыми, при этом значение
даты должно быть помещено в фигурные скобки, а год должен отображаться четырьмя
символами, например, ({01.12.2001},{05.07.2003});
последовательности элементов типа
«дата» в немецком формате (ДД.ММ.ГГГГ), разделенных точкой с запятой, при этом
значение даты должно быть помещено в фигурные скобки, а год должен отображаться
четырьмя символами, например, ({01.12.2001};{05.07.2003});
последовательности элементов типа
«дата» в немецком формате (ДД.ММ.ГГ), разделенных запятыми, при этом значение
даты должно быть помещено в фигурные скобки, а год должен отображаться двумя
символами, например, ({01.12.01},{05.07.03});
последовательности элементов типа
«дата» в немецком формате (ДД.ММ.ГГ),, разделенных запятыми, при этом значение
даты должно быть помещено в фигурные скобки, а год должен отображаться двумя
символами, например, ({01.12.01},{05.07.03});
последовательности элементов типа
«дата» в американском формате (ММ/ДД/ГГГГ), разделенных запятыми, при этом
значение даты должно быть помещено в фигурные скобки, а год должен отображаться
четырьмя символами, например, ({01/12/2001},{05/07/2003});
последовательности элементов типа
«дата» в американском формате (ММ/ДД/ГГГГ), разделенных точкой с запятой, при
этом значение даты должно быть помещено в фигурные скобки, а год должен
отображаться четырьмя символами, например, ({01/12/2001};{05/07/2003});
последовательности элементов типа
«дата» в американском формате (ММ/ДД/ГГ), разделенных запятыми, при этом
значение даты должно быть помещено в фигурные скобки, а год должен отображаться
двумя символами, например, ({01/12/01},{05/07/03});
последовательности элементов типа
«дата» в американском формате (ММ/ДД/ГГ), разделенных точкой с запятой, при
этом значение даты должно быть помещено в фигурные скобки, а год должен
отображаться двумя символами, например, ({01/12/01};{05/07/03}).
Пример выполнения курсовой работы
Построить детерминированный конечный
распознаватель для последовательности элементов типа «дата» в формате, удобном
для сортировки (ГГГГ/ММ/ДД), разделенных точкой с запятой, при этом значение
даты должно быть помещено в фигурные скобки, а год должен отображаться четырьмя
символами, последовательность должна завершаться знаком «#», например,
({2001/12/01};{2005/07/03}#).
Выполнение курсовой работы
распадается на следующие этапы:
Составление формальной грамматики,
описывающей язык, содержащий приведенную фразу;
Построение конечного автомата по
созданной грамматике;
Составление блок-схемы и программы,
моделирующей работу конечного автомата.
Составление формальной грамматики.
Фраза языка представляет собой
список, поэтому из начального символа грамматики должен выводится список::
<предложение>::==<фраза>#:
<фраза>::==<фраза>;<дата> | <дата>
Дата представляет собой линейную
структуру:: <дата>::=={<год>/<месяц>}
Аналогично год, месяц и день::
<год>::==<цифра><цифра><цифра><цифра>:
<месяц>::==<месяцб>/<деньб>|<месяцм>/<деньм>|<февраль>/<деньф>:
<месяцб>::=01|03|05|07|08|10|12: <месяцм>::=04|06|09|11:
<февраль>::=02: <деньб>::==<цифра2><цифра>|
3<цифра1>: <деньм>::==<цифра2><цифра>| 30:
<деньф>::==<цифра1><цифра>| 2<цифра3>:
<цифра>::==0|1|2|3|4|5|6|7|8|9|: <цифра1>::==0|1:
<цифра2>::==0|1|2: <цифра3>::==0|1|2|3|4|5|6|7|8
Таким образом, требуемую грамматику
можно описать следующей структурой:
Множество терминальных символов:
{,},/,0,1,2,3,4,5,6,7,8,9.
Множество нетерминальных символов:
<фраза>, <дата>, <год>, <месяц>, <день>,
<цифра>, <цифра1>, <цифра2>.
Множество правил вывода R0,R1, R2,
R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14. конечный
автомат число программа
Построение конечного автомата.
Между конечными автоматами и
автоматными грамматиками существует тесная связь: класс языков, допускаемых
конечными автоматами, совпадает с классом языков, порождаемых автоматными
грамматиками.
Для построения конечного автомата
составленную грамматику путем введения дополнительных состояний надо
преобразовать к автоматному виду, в результате получится следующая таблица
переходов.
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
{
|
}
|
/
|
;
|
#
|
да
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нет
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
дата
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
год
|
нет
|
нет
|
нет
|
нет
|
год
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
Цг1
|
нет
|
нет
|
нет
|
нет
|
нет
|
Цг1
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
Цг2
|
нет
|
нет
|
нет
|
нет
|
нет
|
Цг2
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
Цг3
|
нет
|
нет
|
нет
|
нет
|
нет
|
Цг3
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
Цг4
|
нет
|
нет
|
нет
|
нет
|
нет
|
Цг4
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
мес
|
нет
|
нет
|
мес
|
Мес0
|
Мес1
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
Мес0
|
нет
|
месб
|
фев
|
месб
|
месм
|
месб
|
месм
|
месб
|
месб
|
месм
|
нет
|
нет
|
нет
|
нет
|
нет
|
Мес1
|
месб
|
месм
|
месб
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
месб
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
денб
|
нет
|
нет
|
месм
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
денм
|
нет
|
фев
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
денф
|
нет
|
нет
|
денб
|
Дб1
|
Дб1
|
Дб1
|
Цф1
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
Дб1
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
нет
|
нет
|
нет
|
нет
|
нет
|
Дб2
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
разд
|
нет
|
нет
|
нет
|
Цф1
|
Дб2
|
Дб2
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
денм
|
Дб1
|
Дб1
|
Дб1
|
Цф0
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
Цф0
|
Дб2
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
разд
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
дата
|
да
|
денф
|
Дб1
|
Дб1
|
Цф3
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
Цф3
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
Дб2
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
нет
|
Программное моделирование работы конечного
автомата.
#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#include "conio.h"main()
{ int
i,j,kol,tsost,slsost,tsymb;tabl[23][15]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//da
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//net
{1,1,1,1,1,1,1,1,1,1,3,1,1,1,1},//data
{4,4,4,4,4,4,4,4,4,4,1,1,1,1,1},//god
{5,5,5,5,5,5,5,5,5,5,1,1,1,1,1},//cg1
{6,6,6,6,6,6,6,6,6,6,1,1,1,1,1},//cg2
{7,7,7,7,7,7,7,7,7,7,1,1,1,1,1},//cg3
{1,1,1,1,1,1,1,1,1,1,1,1,8,1,1},//cg4
{9,10,1,1,1,1,1,1,1,1,1,1,1,1,1},//mes
{1,11,13,11,12,11,12,11,12,11,1,1,1,1,1},//mes0
{11,12,11,1,1,1,1,1,1,1,1,1,1,1,1},//mes1
{1,1,1,1,1,1,1,1,1,1,1,1,14,1,1},//mesb
{1,1,1,1,1,1,1,1,1,1,1,1,18,1,1},//mesm
{1,1,1,1,1,1,1,1,1,1,1,1,21,1,1},//feb
{15,15,15,17,1,1,1,1,1,1,1,1,1,1,1},//denb
{16,16,16,16,16,16,16,16,16,16,1,1,1,1,1},//db1
{1,1,1,1,1,1,1,1,1,1,1,20,1,1,1},//db2
{16,16,1,1,1,1,1,1,1,1,1,1,1,1,1},//cf1
{15,15,15,19,1,1,1,1,1,1,1,1,1,1,1},//denm
{16,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//cf0
{1,1,1,1,1,1,1,1,1,1,1,1,1,2,0},//razd
{15,15,22,1,1,1,1,1,1,1,1,1,1,1,1},//denf
{16,16,16,16,16,16,16,16,1,1,1,1,1,1,1}//cf3
};("matrica\n");(i=0;i<23;i++)
{for (j=0;j<15;j++) printf("%4d",tabl[i][j]);
printf("\n");};ch, inpstr[80] ;("\n ENTER STRING
");=0;((ch=getch()) !=13 && i<80)
{putch(ch);[i++]=ch;}[i]='\0';=i-1;("\n
input string:");(inpstr);("\n");=2;(i=0;i<=kol;i=i+1)
{ tsymb=inpstr[i];(tsymb)
{ case '0': slsost=tabl[tsost][0];
break;'1': slsost=tabl[tsost][1]; break;'2': slsost=tabl[tsost][2]; break;'3':
slsost=tabl[tsost][3]; break;'4': slsost=tabl[tsost][4]; break;'5':
slsost=tabl[tsost][5]; break;'6': slsost=tabl[tsost][6]; break;'7': slsost=tabl[tsost][7];
break;'8': slsost=tabl[tsost][8]; break;'9': slsost=tabl[tsost][9]; break;'{':
slsost=tabl[tsost][10]; break;'}': slsost=tabl[tsost][11]; break;'/':
slsost=tabl[tsost][12]; break;';': slsost=tabl[tsost][13]; break;'#':
slsost=tabl[tsost][14]; break;: slsost=1;}("%5d\n",slsost); =slsost;
};(slsost)
{ case 1:cout<<"\n STRING
is WRONG \n"; break;0:cout<<"\n STRING is RIGHT
\n";break;}
return 0;
};
Реализация конечного автомата средствами ООП:
// заголовочный файл konavt.h описание класса
конечного автоматаkonavt {int kolsost;// число состояний автоматаkolsimv;//
число символов входного алфавита*alfavit; // входной алфавитnachstate;
//начальное состояниеkolkon;//число заключительных состояний*fin;
//заключительные состояния**per;//матрица переходовdlina;// текущая длина
входной цепочкиdlina0;// начальная длина входной цепочки*vxod;// входная
цепочкаavtstate; //текущее состояниеnomstep;// номер шага автомата*protokol;//
протокол работы автомата:bool error; //признак ошибки();//конструктор без параметровshow_sost();//проверка
заполнения матрицыsled();//срабатывание переходовshow();//показ текущего
состояния;init();//инициализация новой строкойkonec();// проверка финальности
состоянияzaversh(); //проверка исчерпания строкиproverka();// проверка принадлежности
символов алфавиту
};
//Файл реализации класса автомата konavt.cpp
# include "konavt.h"
# include <iostream.h>
# include <fstream.h>
# include <string.h>
# include <stdlib.h>
//конструктор::konavt()
{int i,j,vyb;
// возможен ввод исходных данных как из файла,
так и с клавиатуры
cout<<"constructor
working..."<<endl;<<"Istochnik
dannyx(0-klaviatura,1-file)"<<endl;
cin>>vyb;
// ввод с клавиатуры(vyb==0)
{cout<<"\n Enter kolvo
sostoianiy\t";>>kolsost;<<endl<<"enter kolvo
simvolov alfavita\t";>>kolsimv;=new char [kolsimv];=new
int*[kolsost];(i=0;i<kolsost;i++){[i]=new int [kolsimv];
};<<endl<<"enter
alfavit"<<endl;(j=0;j<kolsimv;j++){>>alfavit[j];
};<<endl<<"enter
matrica"<<endl;(i=0;i<kolsost;i++){(j=0;j<kolsimv;j++){>>per[i][j];
};<<endl;
};<<"enter nachalnoe
sostoianie"<<endl;>>nachstate;<<endl;<<"enter
kolvo konechnyh sostoianiy"<<endl;>>kolkon;<<endl;=new
int[kolkon];<<"enter konechnye
sostoiania"<<endl;(i=0;i<kolkon;i++){>>fin[i];
}<<endl;
// запись исходных данных в файлotv;
cout<<"save to file?(1-yes,0-no)";>>otv;<<endl;(otv==1)
{char fname[30];<<"enter
filename
";>>fname;<<endl;out_stream;_stream.open(fname);(out_stream.fail())
{cout<<"Error output
file"<<endl; return;}_stream<<kolsost<<'
';_stream<<kolsimv<<' ';(i=0;i<kolsimv;i++)
out_stream<<alfavit[i]<<'
';(i=0;i<kolsost;i++){(j=0;j<kolsimv;j++){_stream<<per[i][j]<<'
';}}_stream<<nachstate<<' ';_stream<<kolkon<<'
';(i=0;i<kolkon;i++)out_stream<<fin[i]<<'
';_stream.close();<<"End of output file..."<<endl;
};
} else
// ввод исходных данных из файла
{ char
filename[30];<<"Enter Filename
";>>filename;<<endl<<"vvedeno
"<<filename<<endl;in_stream;_stream.open(filename);(in_stream.fail())
{cout<<"net faila
"<<filename<<endl; return;
};_stream>>kolsost;<<"kolsost="<<kolsost<<endl;_stream>>kolsimv;<<"kolsimv="<<kolsimv<<endl;=new
char[kolsimv];(i=0;i<kolsimv;i++){
in_stream>>alfavit[i];};(i=0;i<kolsimv;i++)
cout<<alfavit[i]<<" ";<<endl;=new int*[kolsost];(i=0;i<kolsost;i++)per[i]=new
int [kolsimv];(i=0;i<kolsost;i++){(j=0;j<kolsimv;j++){_stream>>per[i][j];}}(i=0;i<kolsost;i++){(j=0;j<kolsimv;j++){<<per[i][j];}cout<<endl;}_stream>>nachstate;<<"begin
state
"<<nachstate<<endl;_stream>>kolkon;<<"Number
of end states "<<kolkon<<endl;=new
int[kolkon];(i=0;i<kolkon;i++)in_stream>>fin[i];(i=0;i<kolkon;i++)cout<<fin[i]<<"
";<<endl;_stream.close();<<"End of output
file..."<<endl;
};};
//показ
текущего
состоянияkonavt::show_sost()
{int i;<<"sostoyanie
"<<avtstate<<endl;<<dlina<<endl;
//cout<<"ostatok vxoda
"<<vxod<<endl;<<"ostatok vxoda ";
//for (i=0; i<dlina;i++)
cout<<vxod[i]<<"\t"; // *(vxod+i)
//cout<<endl;(i=0;
i<dlina;i++) cout<<*(vxod+i)<<"\t";
<<endl<<"protokol ";(i=0;i<dlina0+1;i++)
cout<<protokol[i]<<"\t";
cout<<endl;
};
//переход к следующему состоянию
void konavt::sled()
{int
slsost,i,num;=-1;teksimv;=vxod[0];<<"symbol
"<<teksimv<<endl;(i=0;i<kolsimv;i++) if
(teksimv==alfavit[i]) {num=i;break;};(num==-1){cout<<"illegal symbol
"<<teksimv<<endl;error=true;}{slsost=per[avtstate][num];=slsost;[nomstep]=slsost;++;(i=0;i<dlina;i++)vxod[i]=vxod[i+1];[dlina-1]='
';=dlina-1;
};;};
//проверка допустимости входной
строкиkonavt::proverka()
{int i,j;prizn;(i=0;i<dlina;i++)
{prizn=false;(j=0;j<kolsimv;j++)
if (vxod[i]==alfavit[j]) {prizn=true;break;}; (!prizn)
{cout<<"illegal symbol "<<endl;break;};
};prizn;
};
//ввод новой входной строки
void konavt::init()
{int i;<<"enter
dlina"<<endl;>>dlina;=dlina;=new char[dlina+1];=new int
[dlina+1];(i=0;i<dlina+1;i++)protokol[i]=0;<<endl<<"enter
vhodnaya stroka"<<endl;(i=0;i<dlina;i++)cin>>vxod[i];
//vxod[dlina]='\0';<<endl;
//cout<<"ostatok vxoda
"<<vxod<<endl;<<"ostatok vxoda ";(i=0;
i<dlina;i++)
cout<<vxod[i]<<"\t";<<endl;(proverka())
{avtstate=nachstate;[0]=nachstate;=1;=false;}error=true;;};
//показ
параметров
автоматаkonavt::show()
{int i,j;<<"parametry
avtomata"<<endl;<<"kolvo sostoianiy
"<<kolsost<<endl;<<"kolvo simvolov alfavita
"<<kolsimv<<endl;<<"simvoly
alfavita"<<endl;(j=0;j<kolsimv;j++){<<alfavit[j]<<"\t";
};<<endl<<"matrica
perehodov"<<endl;(i=0;i<kolsost;i++){(j=0;j<kolsimv;j++){<<per[i][j]<<"\t";
};<<endl;
};<<"nachalnoe sostoianie
"<<nachstate<<endl;<<"konechnye sostoiania
"<<endl;(i=0;i<kolkon;i++){<<fin[i]<<"\t";
};cout<<endl;
return;};
//проверка завершающего состоянияkonavt::konec()
{int
i;kon;=false;=-1;(i=0;i<kolkon;i++) if(avtstate==fin[i]){kon=true;break;};
return kon;
};
//проверка исчерпания входной строки
bool konavt::zaversh()
{bool prizn;(dlina==0) prizn=true;
else prizn=false;prizn;
};
// головная
программа
# include "konavt.h"
# include <iostream.h>main()
{tavt;.show();povt;=1;(povt==1)
{tavt.init();.show_sost();(!tavt.error)
{do
{ tavt.sled();.show_sost();
} while
(!((tavt.error)&&(tavt.zaversh())));((tavt.zaversh()) &&
(tavt.konec())) <<"\n !!!stroka
prinimaetsa"<<endl;else<<"\n !!!stroka ne
prinimaetsa"<<endl;}<<"repeat?(1,0)\n";>>povt;<<endl;
};0;
}