课程作业五

第五次课程作业

由于上次的作业已经用栈的知识讲过了,简要的步骤请看
课程作业4

GIT代码地址

这次的作业我讲一下栈的知识和新算法拓展的功能

栈的主要函数有push函数,top函数,pop函数,empty函数,size函数,功能如下

push函数:将一个元素放入栈中

top函数:返回值为栈顶的元素

pop函数:将栈顶的元素弹出

empty函数:判断栈是否为空

size函数:返回的是栈的元素的数量

在计算算式的函数中主要用到了push pop top empty函数

formulastack函数中的getformnum函数的具体代码如下

double Calculation::getfornum(int i, int & c)
{
	double sum = 0;
	bool flag = num_or_ope(i);//判断当前调用这个函数时的formula[i]是数字还是字符从而决定数字的位数,因为若是*号或者/号也会调用这个函数
	if (flag)
		c = 1;
	else
		c = 0;
	for (int j = i + 1; j<len; j++)
	{
		if (!isdigit(formula[j]))
			break;
		c++;
	}
	int k=0;
	if (flag==true)
		k = i;
	else
		k = i + 1;
	for (int j = 0; j < c; j++, k++)
	{
		sum += (formula[k] - '0')*pow(10, c - j - 1);
	}
	return sum;
}

这函数能够返回数字(不仅是一位数,多位数也可以),而且因为后一个参数传递的是引用,能够修改原来的值,使之变成数字的位数,这对多位数运算有好处。

拓展功能:这个函数经过拓展还能够返回小数,下面为拓展后的代码

double Calculation::getfornum(int i,int & c)
{
	double sum = 0;
	int dop=0;
	bool flag = num_or_ope(i);
	if (flag)
		c = 1;
	else
		c = 0;
	for (int j = i + 1; j<formula.length(); j++)
	{
		if (!isdigit(formula[j]))
		{
			dop = j;
			break;
		}
		c++;
	}
	int k;
	if (flag)
		k = i;
	else
		k = i + 1;
	for (int j = 0; j < c; j++, k++)
	{
		sum += (formula[k] - '0')*pow(10, c - j - 1);
	}
	int l = 1;
	if (formula[dop] == '.')//如果出现小数点继续计算
	{
		c++;//小数点算一位
		for (int j = dop + 1; j < formula.length();j++,l++)
		{
			if (!isdigit(formula[j]))
				break;
			c++;
			sum = sum + (formula[j] - '0')*pow(10, 0 - l);
		}
	}
	return sum;
}

新的算法加上新的功能已经能够写出一个简易的计算器了。

ps:习题生成器的核心算法就是在写计算器的过程中一步步完善的,我已经写好了简易计算器的代码,这个简易计算器可以计算输入的算式,包括多位数以及小数的计算。

posted on 2017-05-22 20:04  caiziyang  阅读(136)  评论(0编辑  收藏  举报