zoukankan      html  css  js  c++  java
  • 实验三 有限自动机的构造与识别

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

     

    一、实验目标
      
    1、掌握有穷状态自动机的概念;  
    2、掌握有穷状态自动机的存储及表示方法;
    3、掌握有穷状态自动机与正则式之间的关系。
     
    二、实验要求
      
    1、输入正规式; 

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

    3. 以五元组形式输出。

    三、算法

    参见教材的转换规则。

     

    练习:

    ²  (a|b)*abb

    ²  l(l|d)*

    ²  1(1010*|1(010)*1)*0

     

    四、完成算法设计、编码和调试工作,完成实验报告。

    源代码:

    #include<string.h>

    #include<stdio.h>

    #include<stdlib.h>

    void 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");

    }

    调试分析:

  • 相关阅读:
    maven父子模块deploy 问题
    lua post参数获取,参数截断
    PhpStorm, XDebug, and DBGp Proxy
    Dia Diagram Mac OSX Yosemite Fix 闪退 xterm
    sql优化-隐形转换危害
    分页栏页码输入框校验
    ftp文件服务器搭建
    按照配置node环境
    openssl 生成ssh证书
    n-Queens(n皇后)问题的简单回溯
  • 原文地址:https://www.cnblogs.com/god1924668503/p/6126388.html
Copyright © 2011-2022 走看看