Calculator


昨天无聊,于是找到QT的文档看了看,大概了解了QString QVector QFileInfo QDir QDate QTime QList QMap等几个core classes于是跟着这里动手写了几个,知道了signalslot这个东西后,就打算写个计算器玩玩。当时根本不知道用qtcreator这个东西啊,全都是在vim里面写。。结果到下班也没写完。。只是做了个布局和按键输入功能,关键的计算部分没有动。。因为输入的东西是用QString储存的但是有不知道QT有没有eavl函数,就留在那儿了。
今天有空,接着来。Google了eval这个东西,于是又涨知识了:

于是花了不少时间看这两个东西,最后写了个实现
看起来是这样的
rpn

下午又花了点时间想把这个实现放到计算器的实现里面,但是看着好复杂的样子,放弃了。

回来后,尝试用qtcreator的designer画了界面
界面
然后顺利的把上午写的计算部分放了进去。但是,新的问题出来了
problem1
下面的是=按钮的slot

void Widget::on_btn_equal_clicked()
{
    std::vector<std::string> vs = split(value);
    std::vector<std::string> shunt;
    std::stack<std::string> rpn_;
    try
    {
        shunt = rpn::shunting_yard(vs);
    }
    catch(std::runtime_error &e)
    {
        ui->label_output->setText(e.what());
        return;
    }

    for(auto x: shunt)
        rpn_.push(x);
    double res = .0;
    try
    {
        res = rpn::eval_rpn(rpn_);
    }
    catch(std::runtime_error &e)
    {
        ui->label_output->setText(e.what());
        return;
    }

    ui->label_output->setText(QString::number(res));
}

这个slot里面的split()函数竟然是在点了quit或关闭窗口后才执行的,这样的话stack当然是空的了。但是,下图又不一样了
problem2
problem3
看这两张图,明显split()是被调用了的,所以shunt才有值,所以rpn_才不为空(stod()只有eval()函数中才用过一次)。

再看下图
problem4
problem5

留个坑,待解决!


2016-02-05 11:26 更新
坑已填,反复检查,终于发现问题是split()函数有逻辑问题...
上图
ok1
ok2
ok3
0k4
ok5

以后也许会增加键盘按键控制以及更多的计算功能,更新到这儿



转载请注明:Serenity » Calculator

上一篇

下一篇

21