计算机软件实习实验一 简单计算器的实现

一、引言 在计算机应用程序开发中,计算器是一个非常基础且常见的应用工具。通过开发一个简易计算器程序,可以帮助我们学习和掌握应用开发的技能,并深入理解Qt框架的使用方法。本报告将详细介绍基于Qt框架的简易计算器的开发过程和主要功能。

二、项目目标 本次项目的目标是通过使用Qt框架开发一个简易的计算器程序,实现基本的加减乘除和括号运算,并能处理常见的错误情况,如除数为0、格式错误等。同时,该项目还要具备可视化界面,提供用户友好的交互体验。通过完成这个项目,我们可以掌握Qt框架的基本知识和使用方法,提高自己的应用开发能力。

三、项目环境与工具

  1. 操作系统: Windows 10
  2. 开发工具: Qt Creator 5.15.2
  3. 编程语言: C++
  4. Qt版本: Qt 5.15.2

四、项目流程与实现

  1. 创建Qt项目 在Qt Creator中创建一个新的Qt Widgets Application项目,命名为"SimpleCalculator"。选择合适的存储位置并设置项目的基本配置选项。

  2. 设计界面布局 在Qt Designer中设计计算器的界面布局。主要包括一个文本编辑框用于显示计算结果和用户输入,以及若干个按钮用于输入数字和运算符。

    bool  QCalculatorUI::construct()
    {
        const char* butnText[20]=
        {
            "backspace","clear",
            "7","8","9","+","(",
            "4","5","6","-",")",
            "1","2","3","*","=",
            "0",    ".","/",
        };
    
        const int butnPos[20][4]=       //存放 x y w h
        {
          {10,50,90,40},{110,50,140,40},                                                    //<- CE
          {10,100,40,40},{60,100,40,40},{110,100,40,40},{160,100,40,40},{210,100,40,40},    //7 8 9 + (
          {10,150,40,40},{60,150,40,40},{110,150,40,40},{160,150,40,40},{210,150,40,40},    //4 5 6 - )
          {10,200,40,40},{60,200,40,40},{110,200,40,40},{160,200,40,40},{210,200,40,90},    //1 2 3 * =
          {10,250,90,40},               {110,250,40,40},{160,250,40,40},                    //0   . /
        };
        plaintext=new QPlainTextEdit(this);
        plaintext->move(10,295);
        plaintext->setFixedSize(240,150);
        mline  =new QLineEdit(this);
        if(mline==NULL)
            return false;
        mline->resize(240,30);
        mline->move(10,10);
        mline->setAlignment(Qt::AlignRight);
        mline->setReadOnly(1);
        QFont font;
        //font.setFamily("microsoft yahei");
        font.setWeight(51);
        font.setPixelSize(14);
        //mline->setFont(font);        //设置字体
        this->setWindowTitle("计算器");
        for(int i=0;i<20;i++)
       {
             mbuton[i]= new  QPushButton(butnText[i],this);
             if(mbuton[i]==NULL)
                 return false;
    
             mbuton[i]->resize(butnPos[i][2],butnPos[i][3]);
             mbuton[i]->move(butnPos[i][0],butnPos[i][1]);
    
             QObject::connect(mbuton[i],SIGNAL(clicked()),this,SLOT(handler_clicked()));
    
       }
       return true;
    }

  3. 实现计算逻辑 在Qt Creator中打开项目的主窗口类文件"mainwindow.cpp",编写代码实现计算器的核心逻辑。具体流程如下:

    • 创建槽函数处理按钮的单击事件,为每个按钮添加相应的槽函数。
    • 在槽函数中,根据按钮的文本内容进行不同的操作。如果是数字按钮,则将对应数字追加到文本编辑框的末尾;如果是运算符按钮,则将对应的运算符追加到文本编辑框的末尾;如果是等号按钮,则执行计算逻辑并将结果显示在文本编辑框
    • 实现计算逻辑函数,根据当前文本编辑框中输入的表达式进行数学计算,并将结果返回。
    • 中缀转后缀表达式
      QQueue<QString> QCalculatorDec::Transfer(QQueue<QString>& exp)     //将中缀队列转换为后缀队列
      {
          QStack<QString> stack;
          QQueue<QString> ret;
          bool num_ok;
          QString symbol;
      
          while(!exp.isEmpty())
          {
            symbol = exp.dequeue();   //出队列
            symbol.toDouble(&num_ok);
      
            if(num_ok==true)          //数字
            {
                 stack.push(symbol);
            }
      
            else if(symbol=="+"||symbol=="-")
            {
                while(!stack.isEmpty() &&(stack.top()!="("))
                {
                    ret.enqueue(stack.pop());     //取出栈顶运算符并入队列
                }
                stack.push(symbol);
            }
      
            else if(symbol=="*"||symbol=="/")
            {
                while(!stack.isEmpty() && (stack.top()!="(") && (stack.top()!="+") && (stack.top()!="-"))
                {
                    ret.enqueue(stack.pop());     //取出栈顶运算符并入队列
                }
                stack.push(symbol);
            }
      
            else if(symbol == "(")
            {
               stack.push(symbol);
            }
      
            else if(symbol ==")")
            {
                while(!stack.isEmpty() && (stack.top()!="("))
                {
                    ret.enqueue(stack.pop());     //取出栈顶运算符并入队列
                }
                if(stack.top()=="(")
                  stack.pop();
            }
          }
      
          while(!stack.isEmpty()&& (stack.top()!="("))         //遍历完成,判断栈里是否为空
          {
             ret.enqueue(stack.pop());     //取出栈顶运算符并入队列
          }return ret;
      }

  4. 错误处理 为了提高计算器的容错性,需要对一些常见错误情况进行处理,如除数为0、格式错误等。具体流程如下:

    • 在计算逻辑函数中判断是否存在错误情况,如除数为0、表达式格式错误等,并及时给出错误提示信息。
       else if(op == "/")
          {
              if( (right>(-0.000000000000001)) && (right<(0.000000000000001)) )   //判断除数为0
                  return NULL;
              else
                  res = left/right;
          }
      
          ret.sprintf("%f",res);
          return ret;

    • 通过使用Qt的错误框架,弹出对话框给出相应的错误信息,提醒用户输入有误。
  5. 历史记录功能 为了提供更好的用户体验,可以将用户的计算历史记录保存起来,并展示在一个文本框中。具体流程如下:

    • 创建一个QPlainTextEdit控件用于显示计算历史记录。
    • 在槽函数中,每次完成一次计算后,将表达式和结果追加到计算历史记录中。
  6. 调试与测试 在开发过程中,使用Qt Creator提供的调试工具进行代码调试,确保计算器程序的功能正常运行。同时,可以通过输入各种不同的表达式进行测试,包括加减乘除和括号运算,以及一些常见的错误情况。

  7. 优化与改进 完成基本功能后,可以根据需要进行一些优化和改进,如增加更多的错误处理、改进界面交互等。可以参考其他流行的计算器软件,提取其有用的特性并进行集成。

五、项目运行与测试 完成代码编写后,在Qt Creator中点击运行按钮,编译并运行计算器程序。根据界面的提示,输入不同的数学表达式进行计算,观察计算结果是否正确,并检查是否能正确处理错误情况。同时,也要尝试保存和查看计算历史记录,以确保该功能正常运行。

主界面
计算式举例

六、心得体会 通过这个项目的开发,我深入学习和实践了Qt框架的使用方法,了解了Qt框架的基本知识和开发流程。在开发过程中,我学会了如何创建Qt项目、设计界面布局、编写槽函数处理用户输入、实现计算逻辑、进行错误处理以及保存历史记录等。通过不断调试和测试,我逐步完善了计算器程序,并提高了自己的应用开发能力。

虽然这是一个简易的计算器程序,但它通过实际的应用场景,让我更好地理解和掌握了Qt框架的重要概念和特性,例如信号与槽机制、界面布局管理、错误处理等。这对我的软件开发能力提升和日后的项目开发经验积累都有很大帮助。

在今后的工作中,我将继续深入学习Qt框架,并将其应用到更多的项目中,提高自己的开发能力和竞争力。同时,我也会不断拓展自己的知识面,学习其他相关技术和框架,以适应不断变化的软件开发环境。

七、总结 通过本次项目,我成功地实现了一个基于Qt框架的简易计算器程序,并在实践中掌握了Qt框架的基本使用方法。通过这个项目,我不仅提高了自己的应用开发能力,还加深了对Qt框架的理解和认识。

在以后的学习和工作中,我将继续深入学习和应用Qt框架,并通过更多的实践项目来提升自己的应用开发能力。同时,我也意识到软件开发是一个不断学习和进步的过程,需要不断地学习新知识和技术,保持持续学习的态度,才能在竞争激烈的软件行业中立于不败之地。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值