1203有穷自动机

因个人能力有限,所以整体的设计思路非常混乱,而且功能未完善(代码是未完全写完的),一度想推倒重写,可惜时间有限,暂时先这样吧。

#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
",m,c[i],n+1);
        else printf("f(%d,%c)=%d
",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
",m,c[i],num);
        else
        {
            printf("f(%d,%c)=%d
",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,num);
            if(q==0)
                n=num;
            c[0]=b[i-1];
            c[1]='#';
            Bibao(c,n);
            printf("f(%d,空串)=%d
",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("请输入正规式:(以#结束)
");//输入正规式
    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

}

原文地址:https://www.cnblogs.com/jinyechutao11/p/5106216.html