zoukankan      html  css  js  c++  java
  • 1225 有穷自动机

    #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");
    }
  • 相关阅读:
    C#替换双引号
    Oracle 12c创建用户时出现“ORA-65096: invalid common user or role name”的错误
    Oracle 12c中文乱码,修改字符集的方法
    ORACLE 12C PDB 维护基础介绍
    spilt用法简介
    Log4net简介
    Log4net创建日志及简单扩展
    [转]ASP.NET MVC 入门11、使用AJAX
    对象池简单实现
    Android webview “location.replace” 不起作用
  • 原文地址:https://www.cnblogs.com/xjy-gg/p/5092232.html
Copyright © 2011-2022 走看看