• 1118 实验三 有限自动机的构造与识别


    1118 实验三 有限自动机的构造与识别

    1、输入正规式; 

    2、构造该正规式的有穷状态自动机;

    3. 以五元组形式输出。

    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        char p[30][30];
        char q[30][30];
        int line=0;
        int n;
        int i,j;
        int count=0;
        int k,t=0;
        int flag=0;
        int l,m=0;
        char VN[30]={''};
        char VT[30]={''};
        printf("规则数:");
        scanf("%d",&n);
        line=n;
        for(i=0;i<30;i++)
            for(j=0;j<30;j++)
            {
                p[i][j]='';
                q[i][j]='';
            }
            printf("请输入文法:
    ");
            for(i=0;i<line;i++)
            {
                scanf("%s",p[i]);
            }
            
            l=0;
            m=0;
            for(i=0;i<line;i++)
            {
                for(j=0;j<30&&(p[i][j]!='');j++)
                {
                    
                    if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0'))
                    {
                        flag=0;
                        for(t=0;VN[t]!='';t++)
                        {
                            if(VN[t]==p[i][j])
                            {
                                flag=1;break;
                            }
                        }
                        if(flag==0)
                        {
                            VN[l]=p[i][j];
                            l++;
                        }
                    }
                    
                    if(p[i][j]<='Z'&&p[i][j]>='A')
                    {
                        flag=0;
                        for(t=0;t<30&&(VT[t]!='');t++)
                        {
                            if(VT[t]==p[i][j])
                            {
                                flag=1;
                                break;
                            }
                        }
                        if(flag==0)
                        {
                            VT[m]=p[i][j];
                            m++;
                        }
                    }
                }
            }
            
            count=0;
            k=0;
            for(i=0;i<line;i++)
            {
                for(j=4;j<30&&(p[i][j]!='');j++)
                {
                    if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
                    {
                        q[count][k]=p[i][j];
                        k++;
                    }
                    else
                    {
                        count++;
                        k=0;
                    }
                }
                count++;
                k=0;
            }
            flag=0;
            for(i=0;i<count;i++)
            {
                for(j=i+1;j<count;j++)
                {
                    if(strcmp(q[i],q[j])==0)
                    {
                        flag=1;
                        break;
                    }
                }
            }
            if(flag==1)
            {
                printf("是非确定的有穷状态自动机,即NFA
    
    ");
                printf("构造的有穷状态自动机为:
    ");
                printf("NFA N=(K,E(总和的意思),M,{S},{Z})
    ");
            }
            else
            {
                printf("是确定的有穷状态自动机,即DFA
    
    
    ");
                printf("构造的有穷状态自动机为:
    ");
                printf("DFA N=(K,E(总和的意思),M,{S},{Z})
    ");
            }
            printf("其中,
    K={S");
            for(i=0;i<30&&(VT!='');i++)
            {
                printf(",%c",VT[i]);
            }
            printf("}
    ");
            printf("E={");
            for(i=0;i<30&&(VN[i]!='');i++)
            {
                printf("%c ",VN[i]);
            }
            printf("}
    ");
            
            k=0;
            count=0;
            for(i=0;i<line;i++)
            {
                j=4;
                while(p[i][j]!='')
                {
                    if(k<4)
                    {
                        q[count][k]=p[i][k];
                        k++;
                    }
                    else
                    {
                        if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
                        {
                            q[count][k]=p[i][j];
                            k++;
                            j++;
                        }
                        if(p[i][j]=='l')
                        {
                            count++;
                            k=0;
                            j++;
                        }
                    }
                }
                count++;
                k=0;
            }
            printf("
    ");
            
            printf("M:
    ");
            l=0;
            while(VN[l]!='')
            {
                printf("M(S,%c)={",VN[l]);
                for(i=0;i<30;i++)
                {
                    for(j=4;j<30&&(q[i][j]!='');j++)
                    {
                        if(VN[l]==q[i][j]&&(q[i][j+1]=='')&&(q[i][j-1]=='='))
                            printf("%c",q[i][0]);
                    }
                }
                printf("}	");
                l++;
            }
            printf("
    ");
            l=0;k=0;
            while(VT[k]!='')
            {
                l=0;
                while(VN[l]!='')
                {
                    printf("M(%c,%c)={",VT[k],VN[l]);
                    for(i=0;i<30;i++)
                    {
                        for(j=4;j<30&&(q[i][j]!='');j++)
                        {
                            if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
                                printf("%c",q[i][0]);
                        }
                    }
                    printf("}	");
                    l++;
                }
                k++;
                printf("
    ");
            }
            system("pause");
    }

    心得体会:

    通过本次实验,使我对有穷状态自动机有了初步的了解,掌握了有穷状态自动机的存储及表示方法和有穷状态自动机与正则式之间的关系。

    虽然并不成功,但从中学会了很多方法,这都对我的编译能力有了很大的提升!!!

  • 相关阅读:
    线段树优化dp——牛客多校第一场I(好题)
    字符串dp——牛客多校第五场G
    凑出和相等的k组数,玄学结论——hdu6616
    主席树/线段树模拟归并排序+二分答案(好题)——hdu多校第4场08
    思维题+贪心——牛客多校第一场C
    线性基算贡献——19牛客多校第一场H
    俞敏洪语录
    睡眠长短决定寿命!人每天应该睡多少小时
    Java程序员从笨鸟到菜鸟之(三十一)大话设计模式(一)设计模式遵循的七大原则
    spring源码剖析(五)利用AOP实现自定义Spring注解
  • 原文地址:https://www.cnblogs.com/hgf520/p/5039595.html
Copyright © 2020-2023  润新知