码迷,mamicode.com
首页 > 其他好文 > 详细

识别无符号数并计算其值

时间:2021-04-24 13:57:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!