有限自动机的构造与识别
生活随笔
收集整理的這篇文章主要介紹了
有限自动机的构造与识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實驗三 有限自動機的構造與識別
?
一、實驗目標
??
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> #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/qq157049540/p/6126300.html
總結
以上是生活随笔為你收集整理的有限自动机的构造与识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 安装webmin
- 下一篇: laravel CURD