有穷自动机的构造与识别

#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,∑,M,{S},{Z})\n");
   }
   else
   {
       printf("是确定的有穷状态自动机,即DFA\n\n\n");
       printf("构造的有穷状态自动机为:\n");
       printf("DFA D=(K,∑,M,{S},{Z})\n");
   }
   printf("其中,\nK = {S");
   for(i = 0;i < 30 && (VT[i]!=‘\0‘);i++)
   {
       printf(",%c",VT[i]);
   }
   printf("}\n");
   printf("∑={");
   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] == ‘|‘)
               {
                   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-25 06:17:26

有穷自动机的构造与识别的相关文章

实验三-有穷自动机的构造和识别

这个代码看的我一脸懵逼= =...改得我一脸懵逼..还是要多看几次才行. #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] =

1211 有穷自动机的构造与识别

#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

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

#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

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("规则数:");scanf(&quo

1211有限自动机构造与识别

#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(&qu

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("规则数:");