课程作业五
第五次课程作业
由于上次的作业已经用栈的知识讲过了,简要的步骤请看
课程作业4
这次的作业我讲一下栈的知识和新算法拓展的功能
栈的主要函数有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:习题生成器的核心算法就是在写计算器的过程中一步步完善的,我已经写好了简易计算器的代码,这个简易计算器可以计算输入的算式,包括多位数以及小数的计算。