ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2019
Просмотров: 147
Скачиваний: 5
Лабораторная работа № 2
(№ 9 по списку и инд. вариант t= 9 )
Студента группы ИТ 14-1
Красовский Абхай Владленович
Построение конечного автомата – распознавателя для заданного регулярного множества
Цель работы: – выработка навыков построения и минимизации конечных автоматов для распознания регулярного множества цепочек.
Теоретические сведения
Конечный автомат (в дальнейшем КА) – абстрактное вычислительное устройство с фиксированным и конечным объемом памяти, которое на входе читает цепочки (последовательности символов некоторого алфавита), а на выходе сообщает об их принадлежности к некоторому множеству, для распознания которого он построен.
Состояния s и t двух различных конечных автоматов эквивалентны тогда и только тогда, когда первый КА, начав работу из состояния s, будет допускать те же цепочки, что и второй КА, начав работу из состояния t. Если эти состояния начальные, то эти автоматы эквивалентны (т.е. будут распознавать одни и те же множества).
Два состояния конечного автомата эквивалентны тогда и только тогда, когда, начав работу из этих состояний, конечный автомат будет допускать одни и те же цепочки.
Недостижимыми называются такие состояния КА, которые не могут быть достигнуты из начального состояния воздействием любых входных символов.
Ход работы
Построить конечный автомат (КА–распознаватель) для распознания регулярного множества цепочек трехсимвольного алфавита в соответствии с вариантом и реализовать его в виде программы на С++ .
t |
Описание регулярного множества |
9 |
Содержит не более двух символов «с», начинается на «ас», а символы «а» встречается только по одному |
1.Диаграмма переходов
2.Таблица переходов
|
a |
b |
c |
˧ |
1 |
2 |
E |
E |
0 |
2 |
E |
E |
3 |
0 |
3 |
4 |
3 |
5 |
1 |
4 |
E |
3 |
5 |
1 |
5 |
6 |
7 |
E |
1 |
6 |
6 |
5 |
E |
1 |
7 |
6 |
5 |
E |
1 |
3.Полное описание
= {a, b, c, ˧}
S = {1, 2, … 7}
= {3,4,5,6,7}
4.Поиск недостижимых состояний
5.Поиск эквивалентных состояний
|
a |
b |
c |
˧ |
1 |
2 |
E |
E |
0 |
2 |
E |
E |
3 |
0 |
3 |
4 |
3 |
5 |
1 |
4 |
E |
3 |
5 |
1 |
5 |
6 |
6 |
E |
1 |
6 |
6 |
5 |
E |
1 |
6. Проверка работы КА
Обрабатываемая цепочка |
Обрабатываемый символ |
Текущее состояние |
Новое состояние |
acbbacb ˧ |
a |
1 |
2 |
cbbacb ˧ |
c |
2 |
3 |
bbacb ˧ |
b |
3 |
3 |
bacb ˧ |
b |
3 |
3 |
acb ˧ |
a |
3 |
4 |
cb ˧ |
c |
4 |
5 |
b ˧ |
b |
5 |
6 |
˧ |
˧ |
6 |
да |
7 .Блок-схема
8.Код
#include "iostream"
#include "conio.h"
#include "windows.h"
#define N 100
using namespace std;
void main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
char input[N];
int S = 1, dop = 1;
cout << "Ввсти строку" << endl;
cin.getline(input, N);
for (int i = 0; i < strlen(input); i++)
{
if (input[i] == 'a' && S == 1) S = 2; //По a S1 -> S2
else
if (input[i] == 'c' && S == 2) S = 3; //По c S2 -> S3
else
if (input[i] == 'a' && S == 3) S = 4; //По a S3 -> S4
else
if (input[i] == 'b' && S == 3) S = 3; //По b S3 -> S3
else
if (input[i] == 'c' && S == 3) S = 5; //По c S3 -> S5
else
if (input[i] == 'b' && S == 4) S = 3; //По b S4 -> S3
else
if (input[i] == 'c' && S == 4) S = 5; //По c S4 -> S5
else
if (input[i] == 'a' && S == 5) S = 6; //По a S5 -> S6
else
if (input[i] == 'b' && S == 5) S = 6; //По b S5 -> S6
else
if (input[i] == 'b' && S == 6) S = 5; //По b S6 -> S5
else
if (input[i] == 'b' && S == 6) S = 5; //По b S6 -> S5
else
if (input[i] == 'a' && S == 6) S = 6; //По a S6 -> S6
else
{
dop = 0;
break;
}
}
if (dop == 1) //Если dop = 1 – цепочка допущена
cout << "Цепочка удолетворяет условие" << endl;
else
cout << "Цепочка не удолетворяет условие" << endl;
cout << input;
_getch();
}
9.Результат
10.Вывод: выработал навык построения и минимизации конечных автоматов для распознания регулярного множества цепочек.