有限自动机的构造和识别

#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++)//给字符串数组p,q全部赋值为‘\0‘
        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++) { //非终结符放入数组VN中
                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++;
                    }
                }
                //终结符放在数组VT中
                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++;
                    }
                }
            }
        }
        //把规则右部分分离,放入数组q中
        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;
        }
        //判断是确定的还是非确定的有穷状态自动机,并进行前半部分打印
        //判断依据:q数组中每一行字符串是否相同
        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");
        //打印M后部分
        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");
}

时间: 2024-10-06 19:52:49

有限自动机的构造和识别的相关文章

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

#include<stdio.h> #include <ctype.h> #define ok 1 #define error 0 #define MAXREGLUARLONG 40 #define MAXSTATELONG 40 #define MAXCAHRSLONG 40 typedef int state; int iCurrentState=0; //初态以1开始 int iPreState=0; int iLastForkState=0; int iForkState=

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

实验目的:通过正规式构造NFA(有穷自动机)方法. 所运用到的语法规则: 语句                          规则 1.R=? /R=ε            X-----ε----->Y 2.R=a                     X-----a----->Y 3.R=r1r2                A-----r1----->B-----r2----->C 4.R=r1|r2                5.R=r1*          

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

一.实验目标 1.掌握有穷状态自动机的概念: 2.掌握有穷状态自动机的存储及表示方法: 3.掌握有穷状态自动机与正则式之间的关系. 二.实验要求 1.输入正规式: 2.构造该正规式的有穷状态自动机: 3. 以五元组形式输出. 三.算法 参见教材的转换规则. 练习: 2  (a|b)*abb 2  l(l|d)* 2  1(1010*|1(010)*1)*0 四.完成算法设计.编码和调试工作,完成实验报告. #include<string.h> #include<stdio.h> #

1118有限自动机的构造与识别

1 #include<string.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main() 5 { 6 char p[30][30]; 7 char q[30][30]; 8 int line=0; 9 int n; 10 int i,j; 11 int count=0; 12 int k,t=0; 13 int flag=0; 14 int l,m=0; 15 char VN[30]={'\0'}; 16 ch

1210有限自动机的构造与识别

#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("

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]={'\0'}; char VT[30]={'\0'}; printf("请输入规则个数:&quo

有限自动机的构造与识别3

#include<stdio.h> #define N 30 char str[N]={NULL}; int st[N]; int t=0,k=0,a,t1=0; struct node//定义一个队列 { char data; struct node * next; }; typedef struct node QueueNode; struct node2//定义一个链队列 { QueueNode *front; QueueNode *rear; }; typedef struct nod

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

#include<stdio.h>char gra[80];char ch;int m=0,p=0;struct{ int A; char R[10]; int B;}NFA;main(){ char gra[10]; printf("---------------正规文法转换成有穷自动机------------------\n"); printf("请输入正规文法R:"); do{ ch=getchar(); gra[p++]=ch; }while(c

有限自动机的构造与识别

#include "iostream.h"#include "string.h" #include "fstream.h"#define NULL 0 class TransTile{public: char current; char next; char input; TransTile(char C,char I,char Ne){ current = C; next = Ne; input = I; }}; class DFA{publi