首页 > 其他 > 详细

1203有穷自动机

时间:2016-01-06 18:01:30      阅读:85      评论:0      收藏:0      [点我收藏+]

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

#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

}

 

技术分享

1203有穷自动机

原文:http://www.cnblogs.com/jinyechutao11/p/5106216.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!