标签:
#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++ ) { 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++ ) { 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++; } } 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++; } } } } 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; } 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" ); 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" ); }
标签:
原文地址:http://www.cnblogs.com/qq1942589447/p/5039561.html