Рассмотрим алгоритм устранения недостижимых состояний. Алгоритм состоит в следующем.
Вход: КА .Программная реализация на языке C++
Выход: КА без недостижимых состояний.
1. Поместить начальное состояние КА в список достижимых состояний.
2. Для новых элементов списка достижимых состояний пополнить список группой их состояний-преемников, отсутствующих в списке.
3. Повторять п.2, пока список достижимых состояний не перестанет меняться.
4. Исключить из множества состояний КА все состояния, отсутствующие в списке достижимых состояний.
5. Исключить недостижимые заключительные состояния и функции переходов, содержащие недостижимые состояния.
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
fstream read,write;//поток для чтения/записи из файла
read.open("avtomat.txt",ios::in);//открываем файл avtomat.txt
write.open("avtomat_.txt",ios::out);//открываем файл avtomat_.txt
if(!read||!write){cout<<"File read Error!"<<endl;system("PAUSE");return EXIT_SUCCESS;};//если возникла ошибка при чтении
char sostoanie[128],start,end[128],dost[128],nedost[128]={}; //sostoanie-состояния,start - начальное состояние, end - конечные состояния, stroka - строка для распознавания//dost - достижимые состояния
int razmer,c=1,flag; //razmer - количество правил
read.getline(sostoanie,128,'\n');cout<<sostoanie<<endl;//считали множество состояний
read>>start;read.get();cout<<"Start "<<start<<endl;
read.getline(end,128,'\n');cout<<"Finish "<<end<<endl;//считали конечные состояния
read>>razmer;read.get(); //считали количество правил
char pravila[3][razmer],temp[4];//pravila массив с правилами, temp промежуточный массив для чтения правил
dost[0]=start;//начальное состояние всегда достижимо *1 ШАГ АЛГОРИТМА*
for(int i=0;i<razmer;i++)//считываем правила
{
read.getline(temp,4,'\n');cout<<temp<<endl;
for(int j=0;j<3;j++)
pravila[j][i]=temp[j];
};
//ищем достижимые состояния
for(int i=0;i<strlen(sostoanie);i++)
{
for(int k=0;k<razmer;k++)
if(sostoanie[i]==pravila[2][k]&&pravila[0][k]!=pravila[2][k]&&sostoanie[i]!=start)
{
dost[c]=sostoanie[i];c++;break;
}
}
//находим недостижимые состояния
c=0;
for(int i=0;i<strlen(sostoanie);i++)
{
flag=0;
for(int k=0;k<strlen(dost);k++)
if(sostoanie[i]!=dost[k])
{
flag++;
}
if(flag==strlen(dost))
{
nedost[c]=sostoanie[i];c++;
}
}
cout<<endl<<"=========="<<endl<<"Nedostigimue sostoania "<<nedost<<endl<<"=========="<<endl;
write<<dost<<endl<<start<<endl;//записываем в новый файл новые состояния и начальное состояние
cout<<dost<<endl<<"Start "<<start<<endl;
for(int i=0;i<strlen(end);i++)//исключаем из конечных состояний недостижимые
for(int j=0;j<strlen(nedost);j++)
if(end[i]!=nedost[j])
{
cout<<"Finish "<<end[i]<<endl;
write<<end[i];//записываем конечные состояния в новый файл
}
for(int i=0;i<razmer;i++)//исключаем из правил правила с недостижимыми состояниями
for(int j=0;j<strlen(nedost);j++)
if(pravila[0][i]!=nedost[j]&&pravila[2][i]!=nedost[j])
{
cout<<pravila[0][i]<<pravila[1][i]<<pravila[2][i]<<endl;
write<<endl<<pravila[0][i]<<pravila[1][i]<<pravila[2][i];//записываем новые правила в файл
}
system("PAUSE");return EXIT_SUCCESS;
}

1 коммент.:
А как должен выглядеть исходный файл?
Отправить комментарий