码迷,mamicode.com
首页 > 其他好文 > 详细

自动机来了

时间:2016-11-25 20:16:10      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:规则   ges   str   char   lin   code   while   scanf   alt   

 

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

技术分享

技术分享

技术分享

体会:觉得对自动机的程序编写很陌生,自动机的文法,手写的还可以,能够理解他的语法结构。

自动机来了

标签:规则   ges   str   char   lin   code   while   scanf   alt   

原文地址:http://www.cnblogs.com/qq8675/p/6102525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!