声明:此文章仅是本人在学习狄泰QT实验分析课程所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4
1. 后缀表达式计算
后缀表达式计算思想:
遍历后缀表达式中的数字和运算符
- 当前元素为数字:进栈
- 当前元素为运算符:
1) 从栈中弹出右操作数
2) 从栈中弹出左操作数
3) 根据符号进行运算
4)将运算结果压入栈中 - 遍历结束:栈中的唯一数字为运算结果
后缀表达式计算伪代码:
后缀表达式计算注意事项:
- 与数学计算相关的算法都需要考虑除0的情况
- 若是浮点运算,避免代码中直接与0做相等比较
const double P = 0.000000000000001;
if( ( -P < r )&&( r < p ) )
{
ret = "Error";
}
else
{
ret.sprintf("%f", l / r);
}
编程说明:后缀表达式计算算法
QString QCalculatorDec::calculate(QString l, QString op, QString r)
{
QString ret = "Error";
if(isNumber(l) && isNumber(r))
{
double lp = l.toDouble();
double rp = r.toDouble();
if( op == "+")
{
ret.sprintf("%f", lp + rp);
}
else if(op == "-")
{
ret.sprintf("%f", lp - rp);
}
else if(op == "*")
{
ret.sprintf("%f", lp * rp);
}
else if(op == "/")
{
const double P = 0.000000000000001;
if( ( -P < rp )&&( rp < P ) )
{
ret = "Error";
}
else
{
ret.sprintf("%f", lp / rp);
}
}
}
return ret;
}
QString QCalculatorDec::calculate(QQueue<QString> exp)
{
QString ret = "Error";
QStack<QString> stack;
while( !exp.isEmpty() )
{
QString e = exp.dequeue();
if( isNumber(e) )
{
stack.push(e);
}
else if(isOperator(e))
{
if( !stack.isEmpty() )
{
QString rp = stack.pop();
QString lp = stack.pop();
QString result = calculate(lp, e, rp);
if( result != "Error" )
{
stack.push(result);
}
else
{
break;
}
}
else
{
break;
}
}
}
if( exp.isEmpty() && (stack.size() == 1) && (isNumber(stack.top())))
{
ret = stack.pop();
}
return ret;
}
2. 小结
- 计算方法由3个不同的子算法构成
- Qt项目在整体上采用面向对象分析与设计
- 局部的算法设计依旧采用面向过程的方法完成
- Qt开发是各种开发技术的综合运用