• 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
    
    }

  • 相关阅读:
    JSP 中文乱码显示处理解决方案
    jsp的9大对象
    获取各种路径
    输出自绘制图片
    Emmet基本使用方法
    <input type="file" />浏览时只显示指定文件类型
    使用dockerfile文件创建image
    gunicorn 访问日志配置与项目启动
    制作符合自己需求的镜像 docker image
    linux 查看系统信息
  • 原文地址:https://www.cnblogs.com/jinyechutao11/p/5106216.html
Copyright © 2020-2023  润新知