網(wǎng)站免費(fèi)建站276人vs猛龍
1.狀態(tài)分析
我們可以把無(wú)符號(hào)數(shù)分為:整數(shù),帶小數(shù),帶指數(shù)部分三種形式。以此構(gòu)建一個(gè)DFA。首先需識(shí)別輸入是整數(shù)還是小數(shù)點(diǎn),若是整數(shù)部分輸入然后還要再循環(huán)識(shí)別一次是否有小數(shù)點(diǎn),最后識(shí)別是否有指數(shù)部分,指數(shù)部分可以帶有符號(hào)。
2.畫出狀態(tài)圖
下圖種d代表整數(shù),不在狀態(tài)圖中的情況則表示這不是無(wú)符號(hào)數(shù)
3.構(gòu)造狀態(tài)矩陣
狀態(tài)圖種不存在的情況則標(biāo)為-1
. | E/e | +/- | d | other | |
0 | 3 | -1 | -1 | -1 | -1 |
1 | 2 | 4 | -1 | 1 | -1 |
2 | -1 | 4 | -1 | 2 | -1 |
3 | -1 | -1 | -1 | 2 | -1 |
4 | -1 | -1 | 5 | 6 | -1 |
5 | -1 | -1 | -1 | 6 | -1 |
6 | -1 | -1 | -1 | 6 | -1 |
4.程序?qū)崿F(xiàn)
#include <iostream>
#include <string>
using namespace std;// 狀態(tài)轉(zhuǎn)換表0: . 1: e 2: + or - 3: 0-9 4: other
int state[7][5] = {{3, -1, -1, 1, -1},{2, 4, -1, 1, -1},{-1, 4, -1, 2, -1},{-1, -1, -1, 2, -1},{-1, -1, 5, 6, -1},{-1, -1, -1, 6, -1},{-1, -1, -1, 6, -1}
};
int allend[3] = {1, 2, 6}; //可以結(jié)束的狀態(tài)int judge(char change) {if (change == '.') return 0;else if (change == 'E' || change == 'e') return 1;else if (change == '+' || change == '-') return 2;else if (change >= '0' && change <= '9') return 3;else return 4;
} //跳轉(zhuǎn)函數(shù)int isend(int now) {for (int i = 0; i < 3; i++) {if (now == allend[i]) return 1;}return 0;
} // 判斷是否為結(jié)束狀態(tài)int main() {string s;while (cin >> s) {int now = 0;for (int i = 0; i < s.length(); i++) {cout << now << "->";int index = judge(s[i]);now = state[now][index];cout << now << endl;if (now == -1) break; // 發(fā)現(xiàn)不是無(wú)符號(hào)數(shù)}if (isend(now) == 1) cout << "yes\n";else cout << "no\n";}return 0;
}