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

    #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");
    }

    总结:开始对自动机还没有理解透,所以写递归时有不少困难,后来通过熟悉自动机和借鉴同学的来解决,总体还是有不少收获的。

  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/lieson/p/5039820.html
Copyright © 2011-2022 走看看