控制台下的计算器——C++实现

最近这段时间看操作系统的东西看的头晕脑胀的,所以先停个一晚上,写个控制台下的计算器,来练练栈的使用。

首先,分析一下要完成的东西。输入肯定使用string类来输入的,然后第一步,就是把string的字符串转化成数字存储起来。转化的这个数字存储是中序表达式,由于运算符有优先级的问题,中序表达式直接计算结果不好计算,所以需要把他转化成后序表达式,最后进行计算。

主要的函数:

(1)把string转化为中序表达式,用vector<double>的类型存储。

(2)把中序表达式转化为后序表达式。

(3)从后序表达式里面,进行计算,得到计算的结果。

程序部分:

一:先写个提示信息和表达式的输入函数,这个部分比较容易

void promptInfo()
{
	cout << "please write a expression which is only includes the +-*/ and ()" << endl;
	cout << "if you want to exit, please input the \"end\" or entry key " << endl;
}

void getExpression(string& expresion)
{
	getline(cin, expresion);
	//在表达式后面多加一个空格,有利于下面的转化中序表达式
	expresion = expresion + " ";
}

这两个函数里面,在得到了输入的表达式后,人为的给表达式加了一个空格:

expresion = expresion + " ";

这个主要考虑到后面把输入的string表达式转化为中序表达式的步骤。后面会再说。其他部分没有什么,都是比较简单的输入输出。


二:string转化为中序表达式

在这个部分,要把string转化double型的数据。主要有以下几个难点:

1.表达式里面的符号的存储方法.

2.表达式中的数字有小数,要考虑到这点。


2.1 表达式符号的存储

表达式里面,如果假设表达式是正确输入的话,那里面除了数字,就全部都是符号了,总共有:+-*/() .7种类型。数字是0—9,那也就是说,在表达式里面,是不可能出现负数的(-3会被解析为一个“-”和数字3).所以初步想法就是把表达式里面的符号用负数来存储。+-*/(). 这7个符号分别对应-1—-7。为了增加可读性,用宏定义的方法来表示7中特殊的符号

#define ADD 		-1
#define MINUS 		-2
#define MUL 		-3
#define DIVIDE		-4
#define L_BRACKET 	-5
#define R_BRACKET	-6
#define DOT		-7



2.2表达式里面的小数

表达式里面的小数,使用一个标示变量dotFlag。如果在表达式的遍历过程中,出现了.小数点这个符号,则dotFlag+1,并且对他后面的字符串遍历过程中,在遇到特殊符号或者空格之前,不断的增加dotFlag的大小,标示小数的位数,在最后把整个数字存入结果的时候,调用pow(10,dotFlag)来作为除数,得到相应的小数。也就是首先把在字符串里面出现的所有的数字当成是整数,如果出现小数点,用dotFlag来记录小数的位数,最后用得到的字符串的整数来/pow(10,dotFlag),来得到相应的小数。

2.3

整个转化函数如下:

vector<double>  strToDouble(const string& expression)
{
	vector<double> ret;
	int dotFlag = -1;	//dotFlag表示小数位数
	double num = -1;
	int strSize = expression.size();
	const char* str = expression.c_str();
	for (int i = 0; i<strSize; ++i)
	{
		int temp = table(str[i]);
		if (temp == 10){
			if (num != -1){
				if (dotFlag == -1)	//如果没有出现小数点,则需要加上1
					dotFlag++;
				num 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值