?? simpledfamain.cpp
字號:
#include<iostream.h>
#define maxstate 20
#define maxletter 26
struct State {
int lastf;
int newf;
int num;
int kd;
};
void main()
{
struct State sta[maxstate];
char letter[maxletter];
int nendstatenum;
int endstatenum;
int letternum;
int move[maxstate][maxletter];
cout<<"enter the number of letters:"; //輸入字母表
cin>>letternum;
cout<<"enter your letter:";
for(int i=0;i<letternum;i++)
cin>>letter[i];
cout<<"enter none_endstate number:"; //輸入非終結狀態數目
cin>>nendstatenum;
cout<<"enter endstate number:"; //輸入終結狀態數目
cin>>endstatenum;
int n;
n=nendstatenum+endstatenum;
cout<<"注意:起始狀態設為0 狀態"<<endl;
int s;
cout<<"enter the none_end_state"
<<"( 0--"<<n-1<<"):"; //輸入非終結狀態并初始化
for(i=0;i<nendstatenum;i++)
{ cin>>s;
sta[s].lastf=0;
sta[s].newf=0;
sta[s].num=s;
sta[s].kd=0;
}
cout<<"enter the end_state:"
<<"( 0--"<<n-1<<"):"; // 輸入終結狀態并初始化
for(i=0;i<endstatenum;i++)
{ cin>>s;
sta[s].lastf=1;
sta[s].newf=1;
sta[s].num=s;
sta[s].kd=0;
}
cout<<"enter the state movement:"<<endl ; //輸入轉移關系
cout<<" ";
for(i=0;i<letternum;i++)
cout<<" "<<letter[i];
cout<<endl;
for(i=0;i<n;i++)
{
cout<<sta[i].num<<" ";
for(int j=0;j<letternum;j++)
cin>>move[i][j];
}
int f=1;
int temp=f;
int endflag=1;
while( endflag )
{ int flag;
for(i=0;i<(temp+1);i++) //對每個等價類集合
for(int j=0;j<n;j++) //類集合內部的比較
{ flag=0;
if(sta[j].lastf==i)
{
for(int k=0;k<n;k++)
if(sta[k].lastf==sta[j].lastf&&sta[k].newf==sta[j].newf) //若是在同一個等價類,繼續測試
for(int t=0;t<letternum;t++)
{ int s1,s2;
s1=move[j][t];
s2=move[k][t];
if(sta[s2].lastf!=sta[s1].lastf) //出現分歧
{ sta[k].newf=f+1; // ??
flag=1;
break;
}
}
}
if(flag==1)
f++;
}
for(i=0;i<n;i++)
if(sta[i].lastf==sta[i].newf)
;
else
break;
if(i==n) //若所有的狀態等價類編號不再變化,退出while循環
endflag=0;
for(i=0;i<n;i++)
sta[i].lastf=sta[i].newf;
temp=f;
} //循環結束
cout<<"化簡后的等價類數目:"<<temp+1<<endl; //最終的等價類數目、等價類
cout<<"化簡成等價類集合 ---> 新的代替狀態"<<endl;
for(i=0;i<temp+1;i++)
{ cout<<"{ ";
for(int j=0;j<n;j++)
if(sta[j].newf==i)
cout<<j<<" ";
cout<<"} -->"<<i<<endl;
}
for (i=0;i<f+1;i++) //轉化成新的狀態機,刷新轉移關系
for(int j=0;j<n;j++)
if(sta[j].newf==i)
for(int k=0;k<letternum;k++)
move[i][k]=sta[move[j][k]].newf; //用等價類編號來代替等價類狀態集合
cout<<"新的狀態轉移圖:"<<endl;
cout<<" ";
for(i=0;i<letternum;i++)
cout<<" "<<letter[i];
cout<<endl;
for(i=0;i<f+1;i++)
{
cout<<i<<" ";
for(int j=0;j<letternum;j++)
cout<<move[i][j]<<" ";
cout<<endl;
}
for(i=0;i<letternum;i++) //檢測是否含有不可達的狀態
{ int s0=sta[0].newf;
sta[s0].kd=1;
for(int j=0;j<f+1;j++)
{ sta[move[s0][i]].kd=1;
s0=move[s0][i];
}
}
int unreach=0;
for(i=0;i<f+1;i++)
if(sta[i].kd==1)
;
else //contain unreachble state
{ unreach=1;
cout<<"new state "<<i<<" can not reach"<<endl;
for (int j=0;j<letternum;j++)
move[i][j]=-1;
}
if(unreach==1)
{ cout<<"去掉不可達的狀態后的轉移:"<<endl; //若含有不可達狀態,再次刷新轉移關系
cout<<" ";
for(i=0;i<letternum;i++)
cout<<" "<<letter[i];
cout<<endl;
for(i=0;i<f+1;i++)
{ if(sta[i].kd==1)
{ cout<<i<<" ";
for(int j=0;j<letternum;j++)
cout<<move[i][j]<<" ";
cout<<endl;
}
}
}
else
cout<<" not contain unreachble state!"<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -