QT大作业:简易计算器(连加,连乘,括号,小数)

一、前言

学校的实验室面试后,要进行第二轮考核,需要学习QT,并制造出简易的计算器,用了一个周末,终于肝了出来。通过该篇文章,记录在学习过程中的一些收获与疑问,希望大家多多指点。

QT大作业:简易计算器(连加,连乘,括号,小数)_第1张图片


二、思路与过程

\bigcirc计算器要求:可以实现连加连乘,最好可以实现括号,小数运算。

 

      一开始想了半天,不知道怎么解决括号问题,后来在CSDN上找到了解决方法-----逆波兰达式。可能有人会问,逆波兰表达式是啥?我觉着这篇文章解释的不错:逆波兰表达式——中缀表达式转后缀表达式 - 蓝海人 - 博客园 (cnblogs.com)(侵删)<--思路豁然开朗

 

成果如下:

QT大作业:简易计算器(连加,连乘,括号,小数)_第2张图片

 

总体的思路如下:

QT大作业:简易计算器(连加,连乘,括号,小数)_第3张图片

三、代码

其中关于逆波兰的部分代码如下,我这样写的太复杂了,button输入的数据我放到结构体里了,我当时忘了用字符串数组(em..懒了就不改了)

double MainWindow::line(int flag)
{
    for(j=1;jsz[j].a!="+"&&cj->sz[j].a!="-"&&cj->sz[j].a!="*"&&cj->sz[j].a!="/"&&cj->sz[j].a!=")"&&cj->sz[j].a!="(")
        {
            cj->sz1[k].a=cj->sz[j].a;//数字部分  !!j yu k  t!
            k=k+1;
        }
        else if(cj->sz[j].a=="+")
                {

             while(cj->sz2[t-1].a=="/"||cj->sz2[t-1].a=="*")
                              {
                                  cj->sz1[k].a=cj->sz2[t-1].a;
                                  k++;
                                  t=t-1;
                              }
                  if(cj->sz2[t-1].a==cj->sz2[99].a)//这里有些问题
                    {
                        cj->sz2[t].a="+";t++;
                    }
                    else if(cj->sz2[t-1].a=="+"||cj->sz2[t-1].a=="-"||cj->sz2[t-1].a=="(")// ==
                            {
                                 cj->sz2[t].a="+";t++;
                            }
                    else if(cj->sz2[t-1].a=="/"||cj->sz2[t-1].a=="*")
                            {
                                cj->sz1[k].a=cj->sz2[t-1].a;
                                cj->sz2[t-1].a="+";
                                k++;

                    }
                  }
        else if(cj->sz[j].a=="-")
                {
                 while(cj->sz2[t-1].a=="/"||cj->sz2[t-1].a=="*")
                 {
                     cj->sz1[k].a=cj->sz2[t-1].a;
                     k++;
                     t=t-1;
                 }

                    if(cj->sz2[t-1].a==cj->sz2[99].a)
                   {
                        cj->sz2[t].a="-";t++;// if if  & else if
                    }

                    else if(cj->sz2[t-1].a=="+"||cj->sz2[t-1].a=="-"||cj->sz2[t-1].a=="(")// ==
                            {
                                 cj->sz2[t].a="-";t++;
                            }
                    else if(cj->sz2[t-1].a=="/"||cj->sz2[t-1].a=="*")
                            {
                                cj->sz1[k].a=cj->sz2[t-1].a;
                                cj->sz2[t-1].a="-";
                                k++;
                            }

                  }
        else if(cj->sz[j].a=="*")
        {
            if(cj->sz2[t-1].a==cj->sz2[99].a)
                {
                cj->sz2[t].a = "*";t++;
                }
            else if(cj->sz2[t-1].a=="+"||cj->sz2[t-1].a=="-"||cj->sz2[t-1].a=="(")
            {
                cj->sz2[t].a = "*";t++;
            }
            else if (cj->sz2[t-1].a=="*"||cj->sz2[t-1].a=="/")
                    {
                        cj->sz2[t].a = "*";t++;
                    }
        }
         else if(cj->sz[j].a=="/")
         {
             if(cj->sz2[t-1].a==cj->sz2[99].a)// vitual
                 {
                 cj->sz2[t].a = "/";t++;
                 }
             else if(cj->sz2[t-1].a=="+"||cj->sz2[t-1].a=="-"||cj->sz2[t-1].a=="(")//括号
             {
                 cj->sz2[t].a = "/";t++;
             }
             else if (cj->sz2[t-1].a=="*"||cj->sz2[t-1].a=="/")
                     {
                         cj->sz2[t].a = "/";t++;
                     }
         }
        else if(cj->sz[j].a=="(")//english
                {
                     cj->sz2[t].a="(";
                     t++;
                }
        else if(cj->sz[j].a==")")
                {
                    while(cj->sz2[t-1].a!="(")
                    {
                         cj->sz1[k].a=cj->sz2[t-1].a;
                        t--;
                        k++;
                    }
                    t--;
                }

    }
          int time;

          for(time =t-1;time>=1;time-- )
          {
              cj->sz1[k].a=cj->sz2[time].a;
              k++;
          }


      //ui->label->setText("");
   return   MainWindow::cclt(&(cj->sz1[1]),k);

}

 

完整代码:

链接: https://pan.baidu.com/s/1asa7aIZHd5WC6KHh6q48Mw 提取码: 221t 复制这段内容后打开百度网盘手机App,操作更方便哦

要是链接失效了,留邮箱,或者给我私聊吧。

四、不足

1.ui页面设计的有bug,在同学电脑上显示的不符合预期,下来后自己改改代码就可以了。

QT大作业:简易计算器(连加,连乘,括号,小数)_第4张图片

2.没有删除功能,要是添加这个功能也不太难,大体上,把存入(结构体)数组的最近一个数据删除,同时删除,label中的部分内容,要是还没存入数组,如这个数还没有输完,就直接清空中间字符变量即可。

3.在工程文件中,如图

QT大作业:简易计算器(连加,连乘,括号,小数)_第5张图片

本来想实现简单函数绘制功能来,本想有时间去写完,后来一忙就没有时间去写了,但不影响工程的正常编译。

你可能感兴趣的:(QT,qt,qt5,c++)