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>
    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]={'\0'};
    char VT[30]={'\0'};
    printf("规则数:");
    scanf("%d",&n);
    line=n;
    for(i=0;i<30;i++)
    for(j=0;j<30;j++)
            {
    p[i][j]='\0';
                q[i][j]='\0';
            }
    printf("请输入文法:\n");
    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]!='\0');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]!='\0';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]!='\0');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]!='\0');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\n\n");
    printf("构造的有穷状态自动机为:\n");
    printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n");
            }
    else
            {
    printf("是确定的有穷状态自动机,即DFA\n\n\n");
    printf("构造的有穷状态自动机为:\n");
    printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n");
            }
    printf("其中,\nK={S");
    for(i=0;i<30&&(VT!='\0');i++)
            {
    printf(",%c",VT[i]);
            }
    printf("}\n");
    printf("E={");
    for(i=0;i<30&&(VN[i]!='\0');i++)
            {
    printf("%c ",VN[i]);
            }
    printf("}\n");
    
            k=0;
    count=0;
    for(i=0;i<line;i++)
            {
                j=4;
    while(p[i][j]!='\0')
                {
    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("\n");
    
    printf("M:\n");
            l=0;
    while(VN[l]!='\0')
            {
    printf("M(S,%c)={",VN[l]);
    for(i=0;i<30;i++)
                {
    for(j=4;j<30&&(q[i][j]!='\0');j++)
                    {
                        if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='='))
    printf("%c",q[i][0]);
                    }
                }
    printf("}\t");
    l++;
            }
    printf("\n");
            l=0;k=0;
    while(VT[k]!='\0')
            {
                l=0;
    while(VN[l]!='\0')
                {
    printf("M(%c,%c)={",VT[k],VN[l]);
    for(i=0;i<30;i++)
                    {
    for(j=4;j<30&&(q[i][j]!='\0');j++)
                        {
    if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
    printf("%c",q[i][0]);
                        }
                    }
    printf("}\t");
    l++;
                }
    k++;
    printf("\n");
            }
    system("pause");
    }

    心得体会:

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

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

  • 相关阅读:
    10.23继承
    10.22语法 class 类 面向对象概念 类与对象 对象的使用 绑定方法
    10.18
    10.16
    读书笔记-软技能:代码之外的生存指南
    git reset
    阿里云安装samba
    关于svn由于目标计算机积极拒绝,无法连接的解决办法
    yii2简单安装
    指定路径创建中文文件名并存入内容
  • 原文地址:https://www.cnblogs.com/w092/p/6107482.html
Copyright © 2011-2022 走看看