因个人能力有限,所以整体的设计思路非常混乱,而且功能未完善(代码是未完全写完的),一度想推倒重写,可惜时间有限,暂时先这样吧。
#include<stdio.h> #include<string.h> #define N 20 int num=0;//记录用过的状态数 void Zifu_qie(char c[],int n,int q) { int i,m; m=n;//n为前一个状态 for(i=0;c[i]!='#';i++) { num++; if(c[i+1]=='#'&&q==1) printf("f(%d,%c)=%d\n",m,c[i],n+1); else printf("f(%d,%c)=%d\n",m,c[i],num); m=num;//用数组来储存输出的值???? } } void Bibao(char c[],int n) { int i,m; m=n; for(i=0;c[i]!='#';i++) { if(c[i+1]!='#') printf("f(%d,%c)=%d\n",m,c[i],num); else { printf("f(%d,%c)=%d\n",m,c[i],n); } num++; m=num; } } void Kuohaonei(char b[]) { int q=0,n=num,i=0,r=0;//n记录前一个状态 char c[N]; do { while(b[i]!='|'&&b[i]!='*'&&b[i]!='#')//是否改成只能字母和数字??? { if(b[i+1]=='*') break; c[r]=b[i]; r++; i++; } c[r]='#';//储存字符串 r=0; if(b[i]=='|'||q==1)//或 { if(q==0) n=num; q=1; Zifu_qie(c,n,q); if(b[i]!='|') q=0; } else if(b[i]=='*'&&i!=0)//括号内闭包 { num++; printf("f(%d,空串)=%d\n",n,num); if(q==0) n=num; c[0]=b[i-1]; c[1]='#'; Bibao(c,n); printf("f(%d,空串)=%d\n",n,num); } else //且 { Zifu_qie(c,n,q); } if(b[i]!='#') i++; }while(b[i]!='#'); } void scanner(char a[]) { int i=0,r=0; char b[N]; do { while(a[i]!='('&&a[i]!=')'&&a[i]!='#') { b[r]=a[i]; r++; i++; } b[r]='#';//储存括号内 Kuohaonei(b); // if()//括号外闭包 r=0; if(a[i]!='#') i++; }while(a[i]!='#'); } main() { char a[N]; int i,j=0,k=0,t=0;//j,k用来记录括号是否成双 printf("请输入正规式:(以#结束)\n");//输入正规式 for(i=0;i<N;i++) { scanf("%c",&a[i]); if(a[i]=='#') break; } for(i=0;a[i]!='#';i++)//判断输入是否正确 { if(a[i]=='('&&a[i+1]!='|'&&a[i+1]!='*') j++;//避免(|a)、(*a)的情况 else if(a[i]==')'&&a[i-1]!='|') k++;//避免(a|)的情况 } for(i=0;a[i]!='#';i++) { if(a[i]=='*'&&(a[i-1]=='('||a[i-1]=='|'||i==0)) t=1; } if(j!=k||t==1) { printf("输入错误!",a[i]); } else scanner(a); //当扫描到|时,输出f(q1,a)=q2,f(q1,b)=q2 (a)* f(q0,a)=q0 }