1.状态分析
我们可以把无符号数分为:整数,带小数,带指数部分三种形式。以此构建一个DFA。首先需识别输入是整数还是小数点,若是整数部分输入然后还要再循环识别一次是否有小数点,最后识别是否有指数部分,指数部分可以带有符号。
2.画出状态图
下图种d代表整数,不在状态图中的情况则表示这不是无符号数
3.构造状态矩阵
状态图种不存在的情况则标为-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.程序实现
#include <iostream>
#include <string>
using namespace std;// 状态转换表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}; //可以结束的状态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;
} //跳转函数int isend(int now) {for (int i = 0; i < 3; i++) {if (now == allend[i]) return 1;}return 0;
} // 判断是否为结束状态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; // 发现不是无符号数}if (isend(now) == 1) cout << "yes\n";else cout << "no\n";}return 0;
}