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

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

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

}

时间: 2024-10-25 06:17:25

实验三-有穷自动机的构造和识别的相关文章

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

#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=

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

一.实验目标 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 实验三 有限自动机的构造与识别

#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

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

有穷自动机的构造与识别

#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[3

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

实验三、&#160;递归下降分析程序实验

实验三. 递归下降分析程序实验 专业 软件工程   姓名 麦振澎 学号 201506110162 一.        实验目的           通过设计,编制,调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构的分析. 二.        实验内容和要求 输入:源程序字符串 输出:正确或者错误 三.        实验方法.步骤及结果测试             1.      源程序名: 递归下降语法分析程序.c       2.      原理分析及流程图

实验三( 实时系统的移植)问题总结

实验三问题总结 问题链接:20145327 <信息安全系统设计基础>实验三 实时系统的移植 开发板是怎样进入linux和vv模式在成功连接开发板后,如果键入回车Enter键,就进入linux模式,键入其他任何键,进入vv模式 Exp11编译失败这是因为代码文件夹中有Exp11_Data文件夹,删除后即可编译成功 安装ADS(安装文件在00-ads1.2目录下,破解方法00-ads1.2\Crack目录下)安装时注意先将原安装的ADS卸载,然后再重新安装方可以成功 在两台机器上做最后一步都未能成

20155201李卓雯 20155212江振思 20155313杨瀚《信息安全技术》 实验三 数字证书应用

20155201李卓雯 20155212江振思 20155313杨瀚<信息安全技术> 实验三 数字证书应用 实验环境 操作系统:3台基于Win7系统的Windows Server 2003虚拟机 主机编号 角色 IP地址 7D CA 172.168.1.107 7E 服务器 172.168.1.115 7F 客户端 172.168.1.105 工具 IIS组件 证书组件 协议分析器 IE浏览器 实验原理 一.PKI技术 PKI是PublicKeyInfrastructure的缩写,通常译为公钥