📄 petri_net.cpp
字号:
#include "iostream.h"
#include "string.h"
#include "stdlib.h"
#include "time.h"
#define maxnum 100
#define maxlength 15
struct TransRules
{
char left[maxlength];
char right[maxlength];
}Rules[maxnum];//用于存放转换规则
char state_issue[maxnum];
char state_accept[maxnum];
int TransRules_input() //转换规则的输入,返回规则的数目,输入以#结束
{
cout<<"Please input the transition rules(put in '#' to end and '/' representing 'loss'): "<<endl;
int i=0;
do
{
i++;
cin>>Rules[i].left;
if(Rules[i].left[0]=='#') //输入#表示输入结束
break;
cout<<" ==>";
cin>>Rules[i].right;// 把转换规则输入存放到Rules[1]开始的数组中
cout<<endl;
}while(strcmp(Rules[i].left,"#")!=0);
int j=i-1; //暂存转换规则数目
cout<<" the transition rules are : "<<endl;
for(i=1;i<=j;i++)
{
cout<<Rules[i].left<<"-->"<<Rules[i].right<<endl;
}
return j;
}
void main()
{
int enable[maxnum]; //存放可以fire的转换序号
int trans_num; //存放transition的次数
int randtrans;
char init_state[maxlength]; //存放初始状态
int rule_num=TransRules_input(); //把转换规则的数目存如rule_num
cout<<"Please input the initial state: "<<endl;
cin>>init_state;
cout<<"Please input the number of transitions: "<<endl;
cin>>trans_num;
cout<<endl;
int transflag=0; //转换是否能继续的标志
srand((unsigned) time(NULL));
for(int x=0;(x<trans_num)&&(!transflag);x++)
{
int flag=0;
int m=0;
int i,j;
for(i=1;i<=rule_num;i++) //搜索可以fire的transition
{
for(j=0;(j<(int)strlen(Rules[i].left))&&(flag==0);)//flag==1表示规则左部已经有状态不属于初始态了,故可断定不能FIRE
{
int k=0;
while((Rules[i].left[j]!=init_state[k])&&(k<(int)strlen(init_state)))
k++;
if(k<(int)strlen(init_state))//在init_state中找到相同的状态
j++;
else //没找到
{
flag=1;
j++;
}
}
if((j==(int)strlen(Rules[i].left))&&(!flag))// 规则的左部全部属于初始状态,故可以fire
{
enable[m]=i; //把可以fire的序号存入enable数组
m++;
}
flag=0;
}
int enable_num=m; //可以fire的转换数
if(enable_num==0)
{
transflag=1; //表明转换不能继续进行
cout<<"Transition can not be achieved!"<<endl;
}
else
{
int n=rand();
randtrans=n%enable_num;// 生成随机数
int flag1=0;
int w=0;
char temp[maxlength];//临时存放空间
for(int y=0;y<(int)strlen(init_state);y++)//把原状态替换为转换后的状态
{
for(int z=0;(z<(int)strlen(Rules[enable[randtrans]].left))&&(!flag1);z++)
{
if(init_state[y]==Rules[enable[randtrans]].left[z]) //保留未转换的状态
{
flag1=1;
}
}
if(flag1==0)
{
temp[w]=init_state[y];
w++;
}
flag1=0;
}
int flag2=0;
for(i=0;i<(int)strlen(Rules[enable[randtrans]].right);i++)
{
for(j=0;(j<w)&&(!flag2);j++)
{
if(Rules[enable[randtrans]].right[i]==temp[j])
flag2=1;
}
if((!flag2)&&(Rules[enable[randtrans]].right[i]!='/')) //转换后的状态未在剩余状态中出现过且不为空
{
temp[w]=Rules[enable[randtrans]].right[i];
w++;
}
}
temp[w]='\0';
strcpy(init_state,"");//清原来的init_state
strcpy(init_state,temp);
cout<<"The states after "<<x+1<<" transitions is :"<<init_state<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -