博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验三-有穷自动机的构造和识别
阅读量:5320 次
发布时间:2019-06-14

本文共 3135 字,大约阅读时间需要 10 分钟。

这个代码看的我一脸懵逼= =。。。改得我一脸懵逼。。还是要多看几次才行。

#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("\t请输入规则个数:");

  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("\t请输入文法:\n");

for(i = 0; i < line; i++)  {printf("\t");scanf("\t%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==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("\t是非确定的有穷状态自动机,即 NFA\n\n");

  printf("\t构造的有穷状态自动机为: \n");

  printf("\tNFA  N= ( K ,∑, M , {S} , {Z} ) \n");}

  else{printf("\t是确定的有穷状态自动机,即 DFA\n\n\n");

  printf("\t构造的有穷状态自动机为: \n");

  printf("\tDFA  D= ( K ,∑, M , {S} , {Z} ) \n");}

  printf("\t其中:\n\tK={S");

  for(i=0;i<30&&(VT[i]!='\0');i++){printf(" , %c",VT[i]);}

  printf("}\n");printf("\t∑ ={");

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");printf("\tM:\n");l=0;

while(VN[l]!='\0')

{

printf("\tM(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("\tM(%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");

 

 

 

}

转载于:https://www.cnblogs.com/lg916843/p/6102511.html

你可能感兴趣的文章
HDU6037 Expectation Division 期望、高维前缀和
查看>>
Ruby学习之类
查看>>
ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)
查看>>
[No0000E5]C# 运算符
查看>>
centos安装后的个人工具
查看>>
3D打印公司网站dedecms大气模板
查看>>
Businessworks的设计思想
查看>>
CentOS7.3部署镜像仓库Harbor
查看>>
MySql 用workbench6.3 导出数据库
查看>>
类的特殊数据成员和成员函数——static const friend
查看>>
文献笔记(四)
查看>>
C++amp加速设置
查看>>
Spring AOP 详解
查看>>
Git常用命令汇总
查看>>
知识的本质
查看>>
四则运算2
查看>>
Serv-U服务器中文乱码问题的解决
查看>>
网站模糊测试爆破工具Wfuzz
查看>>
IBatis添加信息返当前添加对象ID
查看>>
WebGL学习笔记(一)
查看>>