一、设计目标

设计一个支持连续计算的科学计算器。通过单击按钮,或者从文本框输入运算表达式,并完成计算,并且将结果显示出来。例如4*5+3,3+2/3,n的阶乘,x的y次幂,开平方,三角函数,log,ln,清除后退,显示历史记录等等。

二、算法分析

进行输入时直接输入到显示框上,当按下“=”按钮时读取显示框里的表达式,进行计算,并将结果输出到显示屏上。所以,计算器的核心算法就在于如何计算从显示屏上读取的中缀表达式。
计算中缀表达式需要用到两个栈Stack,一个作为数字栈number_stack,专门存储中缀表达式里面的数字,另一个是操作符栈operator_stack,用来存储操作符。核心算法是中缀表达式转成后缀表达式,然后计算后缀表达式,但是这俩个可以合起来一块计算。具体算法流程如下:
首先对涉及到的操作符设置优先级。从左至右依次读取中缀表达式,如果是数字(直接读出负数、小数、多于十位的数)则直接压入数字栈number_stack。如果是操作符(不包括左右括号),观察operator_stack是否为空,为空则直接压入栈,不为空则比较当前栈顶与此操作符的优先级。若此操作符优先级高则直接压入栈,否则弹出栈顶,并从数字栈number_stack弹出两个数字,第一个弹出的数字作为右操作数,第二个弹出的作为左操作数,与操作符运算并将结果压入栈。(若弹出的操作符为单目运算符,则只弹出一个数字)
如果碰到“(”直接入栈,碰到“)”从操作符栈operator_stack一直弹出,直到弹出“(”。到中缀表达式读取完后,看操作符栈operator_stack是否为空,不为空就依次弹出栈,直到为空。此时数字栈
number_satck剩余的一个数就是结果,将结果输出到显示屏上。
下面为流程图:

三、源代码

calculate.h

#ifndef CALCULATE_H
#define CALCULATE_H
#include<iostream>
#include<string>
#include<stack>
#include<math.h>
using namespace std;class calculate
{public:calculate();
};
extern bool is_new;
extern bool is_minus;
extern double ans;
extern double e;
int getPriority(char ch);//得到运算符的优先级
void calculate(stack<double> &mystack, char operation);//根据操作符进行计算
double calculator(string str);//遍历表达式
#endif // CALCULATE_H

calculate.cpp

#include "calculate.h"
#include<iostream>
#include<string>
#include<stack>
#include<math.h>
using namespace std;
calculate::calculate()
{}
bool is_new = false;
bool is_minus = false;
double ans = 0;
double e = 2.718281828459045;
double P = 3.14159265358979323846;
int getPriority(char ch)//得到运算符优先级
{if (ch == '+' || ch == '-') return 1;else if (ch == '*' || ch == '/') return 2;else if (ch == 's' || ch == 'c'|| ch == 't' || ch == 'i' || ch == 'o' || ch == 'a' || ch == '^' || ch == 'g' || ch == 'n' || ch == 'r' || ch == 'm') return 3;else if (ch == '!') return 4;else return 5;
}
void calculate(stack<double> &number, char tmp_operation)//运算符计算函数
{double num1, num2, num3;num2 = number.top();number.pop();if(tmp_operation == '!'){num3 = 1;while(num2>1){num3 *= num2;num2 --;}}else if(tmp_operation == 's' || tmp_operation == 'c' || tmp_operation == 't' || tmp_operation == 'i' || tmp_operation == 'o' || tmp_operation == 'a' || tmp_operation == 'g' || tmp_operation == 'n' || tmp_operation == 'r'){if(tmp_operation == 's')num3 = sin(num2);else if(tmp_operation == 'c')num3 = cos(num2);else if(tmp_operation == 't')num3 = tan(num2);else if(tmp_operation == 'i')num3 = asin(num2);else if(tmp_operation == 'o')num3 = acos(num2);else if(tmp_operation == 'a')num3 = atan(num2);else if(tmp_operation == 'g')num3 = log10(num2);else if(tmp_operation == 'n')num3 = log(num2);else if(tmp_operation == 'r')num3 = sqrt(num2);}else{num1 = number.top();number.pop();if (tmp_operation == '+') {num3 = num1 + num2;}else if (tmp_operation == '-') {num3 = num1 - num2;}else if (tmp_operation == '*') {num3 = num1 * num2;}else if (tmp_operation == '/') {num3 = num1 / num2;}else if (tmp_operation == '^') {num3 = pow(num1, num2);}else if (tmp_operation == 'm'){num3 = fmodf(num1, num2);}}number.push(num3);
}
double calculator(string str)//遍历表达式
{stack<double> number;stack<char> operation;int i = 0, j;int size = str.size();char tmp_operation;string num;string num0;while (i < size) {if (str[i] >= '0' && str[i] <= '9') {j = i;while ((j < size && str[j] >= '0' && str[j] <= '9') || str[j]=='.') { j++; }num = str.substr(i, j - i);if(!is_minus) number.push(atof(num.c_str()));else number.push(0-atof(num.c_str()));i = j;}else if (str[i] == 'A'){number.push(ans);i+=3;}else if(str[i] == 'e'){number.push(e);i++;}else if(str[i] == 'P'){number.push(P);i+=2;}else if(str[i] == '(' || str[i] == ')'){if (str[i] == '(') operation.push(str[i]);else {while (operation.top() != '(') {tmp_operation = operation.top();operation.pop();calculate(number, tmp_operation);}operation.pop();}i++;}else if(str[i] == 's' || str[i] == 'c' || str[i] == 't'){if(str[i] == 's' && str[i+1] == 'q'){operation.push('r');i += 4;}else{operation.push(str[i]);i += 3;}}else if(str[i] == 'a'){if(str[i+3]=='s')operation.push('i');else if(str[i+3]=='c')operation.push('o');else if(str[i+3]=='t')operation.push('a');i += 6;}else if(str[i] == 'l'){if(str[i+1] == 'o'){operation.push('g');i+=3;}else if(str[i+1]=='n'){operation.push('n');i+=2;}}else{if(str[i]=='-' && (operation.empty() || operation.top()=='(')){is_minus = true;}else if (operation.empty()) {operation.push(str[i]);}else {while (!operation.empty()) {tmp_operation = operation.top();if (getPriority(tmp_operation) >= getPriority(str[i])) {operation.pop();calculate(number, tmp_operation);}else break;}operation.push(str[i]);}if(str[i] == 'm')i += 3;else i++;}}while (!operation.empty()) {tmp_operation = operation.top();operation.pop();calculate(number, tmp_operation);}return number.top();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<calculate.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_mul_clicked();void on_pushButton_div_clicked();void on_pushButton_sub_clicked();void on_pushButton_add_clicked();void on_pushButton_pow_clicked();void on_pushButton_point_clicked();void on_pushButton_0_clicked();void on_pushButton_1_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_pushButton_5_clicked();void on_pushButton_6_clicked();void on_pushButton_7_clicked();void on_pushButton_8_clicked();void on_pushButton_9_clicked();void on_pushButton_del_clicked();void on_pushButton_AC_clicked();void on_pushButton_equ_clicked();void on_pushButton_Ans_clicked();void on_pushButton_left_clicked();void on_pushButton_right_clicked();void on_pushButton_pi_clicked();void on_pushButton_sin_clicked();void on_pushButton_cos_clicked();void on_pushButton_tan_clicked();void on_pushButton_1x_clicked();void on_pushButton_n1_clicked();void on_pushButton_squ_clicked();void on_pushButton_e_clicked();void on_pushButton_arcsin_clicked();void on_pushButton_arccos_clicked();void on_pushButton_arctan_clicked();void on_pushButton_log_clicked();void on_pushButton_ln_clicked();void on_pushButton_x2_clicked();void on_pushButton_x3_clicked();void on_pushButton_ex_clicked();void on_pushButton_2x_clicked();void on_pushButton_mod_clicked();void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QLineEdit>
#include<QString>
#include<QByteArray>
#include<stdlib.h>
#include"calculate.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->line, SIGNAL(editingFinished()), this, SLOT(on_pushButton_equ_clicked()));QFont font;font.setPointSize(16);ui->line->setFont(font);
}
Widget::~Widget()
{delete ui;
}
void Widget::on_pushButton_equ_clicked()
{string str = ui->line->text().toStdString();ans = calculator(str);ui->line->setText(QString::number(ans));is_new = true;ui->textEdit->append(QString::fromStdString(str) + "=" + QString::number(ans));
}
void Widget::on_pushButton_del_clicked()
{if(is_new){ui->line->setText("");}QString a = ui->line->text();if(a.right(6)=="arcsin" || a.right(6)=="arccos" || a.right(6)=="arctan") a.chop(6);else if(a.right(3)=="sin" || a.right(3)=="cos" || a.right(3)=="tan" || a.right(3)=="Ans" || a.right(3)=="mod" || a.right(3)=="log") a.chop(3);else if(a.right(4)=="sqrt") a.chop(4);else if(a.right(2)=="ln" || a.right(2)=="PI") a.chop(2);else a.chop(1);ui->line->setText(a);is_new = false;
}
void Widget::on_pushButton_mul_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'*');is_new = false;
}
void Widget::on_pushButton_div_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'/');is_new = false;
}
void Widget::on_pushButton_sub_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'-');is_new = false;
}
void Widget::on_pushButton_add_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'+');is_new = false;
}
void Widget::on_pushButton_pow_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'^');is_new = false;
}
void Widget::on_pushButton_point_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'.');is_new = false;
}
void Widget::on_pushButton_0_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'0');is_new = false;
}
void Widget::on_pushButton_1_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'1');is_new = false;
}
void Widget::on_pushButton_2_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'2');is_new = false;
}
void Widget::on_pushButton_3_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'3');is_new = false;
}
void Widget::on_pushButton_4_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'4');is_new = false;
}
void Widget::on_pushButton_5_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'5');is_new = false;
}
void Widget::on_pushButton_6_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'6');is_new = false;
}
void Widget::on_pushButton_7_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'7');is_new = false;
}
void Widget::on_pushButton_8_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'8');is_new = false;
}
void Widget::on_pushButton_9_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'9');is_new = false;
}void Widget::on_pushButton_AC_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText("");is_new = false;
}
void Widget::on_pushButton_Ans_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +"Ans");is_new = false;
}
void Widget::on_pushButton_left_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +'(');is_new = false;
}
void Widget::on_pushButton_right_clicked()
{if(is_new){ui->line->setText("");}ui->line->setText(ui->line->text() +')');is_new = false;
}
void Widget::on_pushButton_pi_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"PI");
}
void Widget::on_pushButton_sin_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"sin");
}
void Widget::on_pushButton_cos_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"cos");
}
void Widget::on_pushButton_tan_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"tan");
}
void Widget::on_pushButton_1x_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"1/");
}
void Widget::on_pushButton_n1_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"!");
}void Widget::on_pushButton_squ_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"sqrt");
}void Widget::on_pushButton_e_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +'e');
}void Widget::on_pushButton_arcsin_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"arcsin");
}void Widget::on_pushButton_arccos_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"arccos");
}void Widget::on_pushButton_arctan_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"arctan");
}void Widget::on_pushButton_log_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"log");
}void Widget::on_pushButton_ln_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"ln");
}void Widget::on_pushButton_x2_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"^2");
}void Widget::on_pushButton_x3_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"^3");
}void Widget::on_pushButton_ex_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"e^");
}void Widget::on_pushButton_2x_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"2^");
}void Widget::on_pushButton_mod_clicked()
{if(is_new){ui->line->setText("");}is_new = false;ui->line->setText(ui->line->text() +"mod");
}void Widget::on_pushButton_clicked()
{ui->textEdit->setText("");
}

四、源代码下载

下载链接

QT 简单计算器相关推荐

  1. Qt 简单计算器实现 附源码

    Windows+Qt 简单表达式计算器实现 实现思路 实现原理 核心功能 表达式运算 小数点的处理 实时判断算式合法性 UI设计 无边框窗口和Win10下的背景模糊 透明按钮 原创标签页切换组件 重写 ...

  2. 【原创】QT简单计算器

    代码 //main.cpp #include "calculator_111.h" #include <QtWidgets/QApplication>int main( ...

  3. 使用Qt做一个简单计算器

    title: Calculator date: 2022-09-04 11:10:12 tags: [Qt, 应用, C++] typora-root-url: Calculator 使用Qt做一个简 ...

  4. 实验一 简单计算器的实现(QT实现)

    实现效果 简单计算器的实现 实验内容: 学习GUI图形界面的设计,Python Tinker或 Java Swing/Awt 或C++ QT框架,创建交互友好的应用程序: 能通过界面按钮控件输入并实现 ...

  5. QT实现一个简单计算器

    QT实现一个简单计算器 学生一枚,水平有限,如有问题,还望指正 第一步 通过QT设计师绘制出界面图形,界面大致如下: 第二步 将保存的.ui文件转换为头文件,以便于自己创建的对象对其继承和使用 uic ...

  6. 使用Qt实现计算器功能

    之前培训要求我们使用Qt实现计算器的功能,我利用单链表实现了计算器的功能,下面将源码分享给大家. 我们先将其实现方法以及基本功能给大家列出 源码链接:https://download.csdn.net ...

  7. PyQt6案例3:简单计算器案例

    一.用QT设计师绘制界面保存成ui文件 1.打开QTdesigner 2.选择Dialog without Buttons,并单击"创建"按钮. 3.添加控件. (1)拖拽&quo ...

  8. 模拟一个简单计算器_阅读模拟器的简单介绍

    模拟一个简单计算器 Read simulators are widely being used within the research community to create synthetic an ...

  9. PTA 基础编程题目集 7-12 两个数的简单计算器 C语言

    PTA 基础编程题目集 7-12 两个数的简单计算器 C语言 本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式 ...

最新文章

  1. rman删除7天前备份_RMAN备份
  2. xshell调出oracle安装界面,XShell+Xmanager实现在XShell中显示远程服务器的图形界面
  3. 白话解说TCP/IP协议三次握手和四次挥手
  4. mysql单源多表同步单库单表_MySQL主从复制单表或者多表
  5. mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
  6. acer软件保护卡清除工具clear_如何清除 APT 缓存来回收宝贵的磁盘空间 | Linux 中国...
  7. 买基金的一个很重要的知识
  8. sql limit 子句_SQL Server TOP子句概述和示例
  9. 基于jQuery上下切换的焦点图—带缩略图悬浮
  10. onready怎么加img_用插件VMarker在vue中给图片加标记
  11. Python安装cv2库出错及解决:Could not find a version that satisfies the requirement cv2
  12. MacOS串口调试工具minicom配置
  13. 【记录30】条形码的生成
  14. 大数据分析R语言RStudio使用教程
  15. java gnuplot,用 Gnuplot 绘制实验数据
  16. 怎样用Excel搜索表格内的内容?
  17. WebStorm+Vue-cli 配置alias 点击跳转无效问题
  18. 动态域名解析服务器离线会引起什么_动态域名解析过程中可能出现的问题及解决方案...
  19. 基于区块链技术,电子商务平台将提高安全性和透明度
  20. linux的create命令,createuser命令

热门文章

  1. 入侵必学:SQL语句大全
  2. 找出TCGA中的配对样本并正确展示数据
  3. 简单分享人力资源服务行业的网站都有哪些部分组成
  4. WinSCP-5.15.9-Setup的下载+安装+使用(以SCP协议通过SSH模式连接)
  5. 「AWS」入门安装aws cli
  6. 使用前端后台管理模板库admin-lte
  7. hamachi联机_hamachi怎么进行联机_hamachi联机流程详解
  8. 机器视觉-相机镜头光源介绍及选型-10相机分类
  9. Windows 命令行cmd.exe简单介绍
  10. Resin的几个常用配置