标签:str 输入 小数 clu lag 行存储 using ext stat
要实现的功能: 通过状态转换图来识别无符号数,并计算其值进行输出
程序的要求如下:
1. 在程序内采用二维数组保存识别无符号数的状态转换矩阵;
2. 在识别无符号数的过程中,实现把输入的无符号数字符串转换成数值显示(不能使用类似atoi等函数实现);
3. 要采用矩阵查表的方式进行状态切换和执行语义动作,而不是采用switch-case语句进行;
状态转换图如下:
先构造状态转换矩阵:
. | E(e) | +(-) | d | |
---|---|---|---|---|
0 | 3 | -1 | -1 | 1 |
1 | 2 | 4 | -1 | 1 |
2 | -1 | 4 | -1 | 2 |
3 | -1 | -1 | -1 | 2 |
4 | -1 | -1 | 5 | 6 |
5 | -1 | -1 | -1 | 6 |
6 | -1 | -1 | -1 | 6 |
在代码中使用二维数组存储矩阵:
int trans[7][4] = {
{3,-1,-1,1},//0 col: .->0,E->1,(+|-)->2,d->3
{2,4,-1,1},//1
{-1,4,-1,2},//2
{-1,-1,-1,2},//3
{-1,-1,5,6},//4
{-1,-1,-1,6},//5
{-1,-1,-1,6}//6
};
主要思想: 通过一个 string 类型的变量对输入的无符号数字符串进行存储,通过 change2num 函数对字符串的每一位进行列号的转换,定义 now_state 变量用来记录当前状态,用两者确定下一个状态,从而实现状态的转换。检测最后的状态是否为 end_states 中的一个,如果是则是无符号数,否则不是。
计算无符号数的数值: 以下图为例
将数值部分看作123E-2,指数部分为3,则1.23E3=123E(-2+3)=123E1=1230
以此得到计算数值的计算方法:将数值部分全部数字看作一个整数w,记录小数的个数n,记录指数正负e和指数大小p。
计算公式为:
result = w * pow(10, e * p - n );
只要计算出w,n,p,e即可得到输入无符号数的大小。
计算w: 计算起来比较简单,但注意观察状态转换图,在接受E进行转换之前,即在状态4之前的所有接受数字的转换才能算进w内。
计算n: n为小数个数,只有在接受小数点后,再接受数字的转换才能算进n内,实质上只有3->2 || 2->2
两个转换。
计算p: p为指数大小,只要当前状态为6,p就进行计算。
源码如下:
#include <iostream>
#include<string>
using namespace std;
int trans[7][4] = {
{3,-1,-1,1},//0 col: .->0,E->1,(+|-)->2,d->3
{2,4,-1,1},//1
{-1,4,-1,2},//2
{-1,-1,-1,2},//3
{-1,-1,5,6},//4
{-1,-1,-1,6},//5
{-1,-1,-1,6}//6
};
int start_state = 0;
int end_states[3] = { 1,2,6 };
int now_state = 0;
double result;
int w;//全部数字
int d;//当前数字
int e;//指数正负
int p;//指数大小
int n;//小数个数
string s;
void init();
void getn(int now, int next);
void getp(char change);
void getw(char change);
int change2num(char change);
bool isEnd(int now_state);
int main()
{
while (1) {
cin >> s;
//printf("%d\n", s.length());
init();
int tmp;
for (int i = 0; i < s.length(); i++)
{
printf("%d->", now_state);
tmp = now_state;
now_state = trans[now_state][change2num(s[i])];
getn(tmp,now_state);
getp(s[i]);
getw(s[i]);
printf("%d\n", now_state);
}
//printf("%d\n", now_state);
result = w * pow(10, e * p - n );
if (isEnd(now_state))
{
printf("yes");
//cout << w << " " << e << " " << p << " " << n;
cout << endl;
cout << result;
cout << endl;
}
else
{
printf("no\n");
}
}
return 0;
}
void init()
{
w = 0;
d = 0;
e = 1;
p = 0;
n = 0;
now_state = start_state;
}
int change2num(char change)
{
switch (change) {
case ‘.‘: return 0;
case ‘E‘: return 1;
case ‘e‘: return 1;
case ‘+‘: {e = 1; return 2; };
case ‘-‘: {e = -1; return 2; };
default:
return 3;//d
}
}
bool isEnd(int now_state)
{
bool flag = false;
for (int i = 0; i < 3; i++)
{
if (now_state == end_states[i])
{
flag = true;
break;
}
}
return flag;
}
void getn(int now,int next)
{
if ((now == 3 && next==2) || (now==2 && next==2))
{
n++;
}
}
void getp(char change)
{
if (now_state == 6)
{
d = change - ‘0‘;
p = p * 10 + d;
}
}
void getw(char change)
{
if (now_state < 4 && (change >=‘0‘) && (change <=‘9‘))
{
d = change - ‘0‘;
w = w * 10 + d;
}
}
如有问题,欢迎指出。
标签:str 输入 小数 clu lag 行存储 using ext stat
原文地址:https://www.cnblogs.com/404-blog/p/14671001.html