C++结合QT实现带有优先级的计算器功能

代码

MyCalculator.h

#pragma once

#include <QtWidgets/QMainWindow>
#include <QStack>
#include <QString>
#include "ui_MyCalculator.h"

class MyCalculator : public QMainWindow
{
  Q_OBJECT

public:
  MyCalculator(QWidget *parent = Q_NULLPTR);

/*	void setnum1(int num);
	void setnum2(int num);
	void setflag(int f);
	int calculartor();
*/

private slots:
	void on_number_Button_clicked();
	void on_action_Button_clicked();
	void on_comma_Button_clicked();
	void on_action_Button_c_clicked();
	void on_action_Button_d_clicked();
	void on_action_Button_e_clicked();

/*
	void on_action_Button_equal_clicked();
	void on_number_Button_clicked();
	void on_action_Button_clicked();
	void on_action_Button_c_clicked();
*/

private:
  Ui::MyCalculatorClass ui;

};

MyCalculator.main

#include "MyCalculator.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MyCalculator w;
  w.show();
  return a.exec();
}

MyCalculator.cpp

#include "MyCalculator.h"

#include<iostream>
using namespace std;
#include<stack>
#include<vector>
#include<cstdlib>
#include<limits.h>

MyCalculator::MyCalculator(QWidget *parent)
  : QMainWindow(parent)
{
  ui.setupUi(this);
	setWindowTitle(QStringLiteral("计算器"));
	ui.textBrowser->setFontPointSize(28);

	connect(ui.pushButton0, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton1, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton2, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton3, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton4, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton5, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton6, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton7, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton8, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton9, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));

	connect(ui.pushButton_add, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_div, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_mul, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_sub, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_right, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_left, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_dian, SIGNAL(clicked()), this, SLOT(on_comma_Button_clicked()));

	connect(ui.pushButton_del, SIGNAL(clicked()), this, SLOT(on_action_Button_d_clicked()));
	connect(ui.pushButton_re, SIGNAL(clicked()), this, SLOT(on_action_Button_c_clicked()));
	connect(ui.pushButton_equ, SIGNAL(clicked()), this, SLOT(on_action_Button_e_clicked()));
	/*
	//没有优先级的计算器
	connect(ui.pushButton0, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton1, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton2, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton3, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton4, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton5, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton6, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton7, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton8, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
	connect(ui.pushButton9, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));

	connect(ui.pushButton_add, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_div, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_mul, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
	connect(ui.pushButton_sub, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));

	connect(ui.pushButton_re, SIGNAL(clicked()), this, SLOT(on_action_Button_c_clicked()));

	connect(ui.pushButton_equ, SIGNAL(clicked()), this, SLOT(on_action_Button_equal_clicked()));
	*/

}
void MyCalculator::on_number_Button_clicked()
{
	QPushButton *btn = qobject_cast<QPushButton*>(sender());
	QString number = btn->text();
	QString ss = ui.textBrowser->toPlainText();
	ui.textBrowser->clear();
	ui.textBrowser->append(ss + number);
}
void MyCalculator::on_action_Button_clicked()//操作符
{
	QPushButton *btn = qobject_cast<QPushButton*>(sender());
	QString action = btn->text();
	QString ss = ui.textBrowser->toPlainText();
	ui.textBrowser->clear();
	ui.textBrowser->append(ss + action);
}
void MyCalculator::on_comma_Button_clicked()//小数点
{
	QPushButton *btn = qobject_cast<QPushButton*>(sender());
	QString action = btn->text();
	QString ss = ui.textBrowser->toPlainText();
	ui.textBrowser->clear();
	ui.textBrowser->append(ss + action);
}
void MyCalculator::on_action_Button_c_clicked()//重置输入框里的内容
{
	ui.textBrowser->clear();
}
void MyCalculator::on_action_Button_d_clicked()//删除表达式中最后一个符号
{
	QString ss = ui.textBrowser->toPlainText();//在一行
	ss = ss.left(ss.length() - 1);
	ui.textBrowser->clear();
	ui.textBrowser->setText(ss);
}
bool isNum(QString ch)
{
	if (ch >= '0' && ch <= '9' || ch == '.')
		return true;
	else
		return false;
}
bool isOperate(QString ch)
{
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' )
		return true;
	else
		return false;
}
int level(QString ch) {//优先级设置
	if(ch == '(')
		return 5;
	else if (ch == '*' || ch== '/')
		return 4;
	else if (ch == '+' || ch == '-')
		return 3;
	else if (ch == ')')
		return 2;
}
double calcu(double a ,double b, QString c)
{
	double result = 0;
	if (c == '+')
		result = b + a;
	else if (c == '-')
		result = b - a;
	else if (c == '*')
		result = b * a;
	else if (c == '/')
		result = b / a;
	else
		result = INT_MAX;
	return result;
}
double getjieguo(QString input)
{
	QStack<double> Num;
	QStack<QString> Act;
	int a = input.length();
	for(int i=0;i< a;i++)
	{
		int flag = 0;//用来判断是否是数字
		int xiaoshu = 1;//用来判断是否是小数部分
		double number = 0;//暂存数字
		QString frist = input.left(1);
		while (isNum(frist))				//连续的数字转化为一个整数
		{
			if (frist == '.' || xiaoshu == 2)
			{
				number = frist.toDouble() / 10 + number;
				xiaoshu = 2;
			}
			else
			{
				number = number * 10 + frist.toInt();
			}
			input = input.right(input.length() - 1);
			frist = input.left(1);
			flag = 1;
		}
		if (flag == 1)
			Num.push(number);

		if (isOperate(frist))
		{
			if (!Act.empty() && (level(Act.top()) > level(frist)))
			{
					double a = Num.pop();
					double b = Num.pop();
					QString c = Act.pop();
					double result = calcu(a, b, c);
					Num.push(result);
					if (frist != ')')
						Act.push(frist);
					input = input.right(input.length() - 1);
					frist = input.left(1);
			}
			else if (!Act.empty() && (level(Act.top()) <= level(frist)))
			{
				if (frist != '(')
					Act.push(frist);
				input = input.right(input.length() - 1);
				frist = input.left(1);
			}
			else if(Act.empty())				//操作符第一次入符号栈
			{
				Act.push(frist);
				input = input.right(input.length() - 1);
				frist = input.left(1);
			}
		}
		if (frist == '=')//支持得到结果后仍可以继续运算
		{
			Num.clear();
			Act.clear();
			input = input.right(input.length() - 1);
			frist = input.left(1);
		}

		if (i + 1 >= a)				//当表达式都进栈后,只要符号栈不为空就继续执行
		{
			while (!Act.empty())
			{
				double a1 = Num.pop();
				double b1 = Num.pop();
				QString c1 = Act.pop();
				double result = calcu(a1, b1, c1);
				Num.push(result);
			}
		}
	}

	return Num.top();

}
void MyCalculator::on_action_Button_e_clicked()
{
	QString input = ui.textBrowser->toPlainText();//将输入框里的内容给input
	double value = getjieguo(input);//将表达式传给getjieguo来将数字和操作符分别入对应的栈
	ui.textBrowser->clear();
	ui.textBrowser->append(input + "=" + QString::number(value));//将结果的类型由数字转化为QString

}
/*
void MyCalculator::setnum1(int num)
{
	num1 = num;
}
void MyCalculator::setnum2(int num)
{
	num2 = num;
}
void MyCalculator::setflag(int f)
{
	flag = f;
}
int MyCalculator::calculartor()
{
	int result = 0;
	if (flag == 1)
		result = num1 + num2;
	else if (flag == 2)
		result = num1 - num2;
	else if (flag == 3)
		result = num1 * num2;
	else if (flag == 4)
	{
		if (num2 == 0)
			setflag(5);
		else
			result = num1 / num2;
	}
	else
		result = 0;

	return result;
}

void MyCalculator::on_action_Button_c_clicked()
{
	ui.textBrowser->clear();
	setnum1(0);
	setnum2(0);
	setflag(0);
}

void MyCalculator::on_number_Button_clicked()
{
	QPushButton *btn = qobject_cast<QPushButton*>(sender());
	QString number = btn->text();
	QString ss = ui.textBrowser->toPlainText();
	ui.textBrowser->clear();
	ui.textBrowser->append(ss + number);
}

void MyCalculator::on_action_Button_clicked()
{
	int number = ui.textBrowser->toPlainText().toInt();
	setnum1(number);
	QPushButton *btn = qobject_cast<QPushButton*>(sender());
	QString action = btn->text();
	ui.textBrowser->clear();
	if (action == "+")
		setflag(1);
	else if (action == "-")
		setflag(2);
	else if (action == "*")
		setflag(3);
	else
		setflag(4);

}

void MyCalculator::on_action_Button_equal_clicked() {
	int number = ui.textBrowser->toPlainText().toInt();
	setnum2(number);
	int res = calculartor();
	ui.textBrowser->clear();
	if (flag == 5)
		ui.textBrowser->append(QStringLiteral("不能除于0,请重新输入"));
	else
		ui.textBrowser->append(QString::number(res));
}
*/

测试

表达式 结果
2*3+6-(1+3) 8
2+3*6-(1+3) 16
2+3*6-(1.3+5/2) 16.2

说明

  1. 自己的学习笔记 ,还有一些bug没有解决;
  2. 部分代码需要优化,重构;
  3. 没有实现输入错误表达式报错功能,需要输入正确的表达式。
  4. 不支持负数计算。
  5. 支持小数,加,减,乘,除,括号运算。

到此这篇关于C++结合QT实现带有优先级的计算器的文章就介绍到这了,更多相关C++实现计算器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android 和 windows C/C++/QT通讯时字节存储

    ava:采用大端字节序存储数据[低地址存放数据的高位,高地址存放数据的低位,数据高位存放在数组的前面] windows(intel平台):采用小端字节序存储数据[低地址存放数据的低位,高地址存放数据的高位,数据的高位存放在数组的后面](windows接收java发送过来的short,int需要调用ntohs和ntohl来转换到小数端) [数据高位]:0x1234的高位为 0x12 [数据低位]:0x1234的低位为 0x34 如: int ihex = 0x12345678; short she

  • c++ Qt信号槽原理

    1.说明 使用Qt已经好几年了,一直以为自己懂Qt,熟悉Qt,使用起来很是熟练,无论什么项目,都喜欢用Qt编写.但真正去看Qt的源码,去理解Qt的思想也就近两年的事. 本次就着重介绍一下Qt的核心功能--信号槽机制,相信接触过Qt的人都能很熟悉地使用,甚至,大部分人还能轻松地说出信息槽的几种用法.但是信号槽的核心可不是简单说说就能说清楚的. 那么,本次,就从Qt的源码中讲解一下信号槽的机制. 其实,直到写这篇文章,我也没有完全看明白相关的源码,只是明白了其中的大部分以及使用机制,其中还有很多细节

  • C++ Qt属性系统详细介绍

    C++ Qt属性系统详细介绍 Qt提供了一个绝妙的属性系统.跟那些由编译器提供的属性差不多.然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property].Qt可以在任何平台上的标准编译器下编译.Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙. 声明属性需要什么 要声明一个属性,需在继承自QObject的类中使用Q_PROPERTY()宏. Q_PROPERTY(type name READ getFuncti

  • C++实现幸运大抽奖(QT版)

    本文实例为大家分享了C++实现幸运大抽奖的具体代码,供大家参考,具体内容如下 程序效果: #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QLabel> #include <QPushButton> #include <QTimer> #include <QStringList> class Dialog : public QDialog { Q_OBJECT publ

  • Qt(C++)调用工业相机Basler的SDK使用示例

    简介 由于公司采购的AVT相机不足,需要用Basler相机来弥补,所以我也了解了一下Basler这款相机的SDK.由于Basler这边的相机提供的没有提供Qt的示例,所以我做一个分享出来. 本篇的Demo采用的是工业黑白相机.工业应用中,如果我们要处理的是与图像颜色有关,那么我们最好采用彩色工业相机:如果不是,那么我们最好选用黑白工业相机,因为在同样分辨率下的工业相机,黑白工业教学精度比彩色工业相机高,尤其是在看图像边缘的时候,黑白工业相机的效果更好. 开发环境 Qt:  5.6.2vc2013

  • C++结合QT实现带有优先级的计算器功能

    代码 MyCalculator.h #pragma once #include <QtWidgets/QMainWindow> #include <QStack> #include <QString> #include "ui_MyCalculator.h" class MyCalculator : public QMainWindow { Q_OBJECT public: MyCalculator(QWidget *parent = Q_NULLP

  • QT实现简单计算器功能

    本文实例为大家分享了QT实现简单计算器功能的具体代码,供大家参考,具体内容如下 效果图: 新建工程,创建类MainWindow,基类是QMainWindow,声明变量和函数.槽 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H   #include <QMainWindow> #include <QPushButton> #include <QLineEdit>   class MainWindow : pub

  • Qt实现计算器功能

    本文实例为大家分享了Qt实现计算器功能的具体代码,供大家参考,具体内容如下 该计算器主要通过lineEdit获取和显示数字,通过tableview显示计算过程. 通过tableview显示计算的过程,QLineEdit获取输入的数字,QComboBox实现不同的计算类型. 效果: 代码: main.cpp #pragma execution_character_set("utf-8") #include "mainwindow.h" #include <QAp

  • PHP实现的简单四则运算计算器功能示例

    本文实例讲述了PHP实现的简单四则运算计算器功能.分享给大家供大家参考,具体如下: php实现一个简单的四则运算计算器(还不支持括号的优先级).利用栈这种数据结构来计算表达式很赞. 这里可以使用栈的结构,由于php的数组"天然"就有栈的特性,这里直接就利用了数组.当然可以使用栈结构写,道理一样的. 前辈(波兰一位科学家)在计算带有括号的四则表达式,利用逆波兰算法(后缀表达法).简直神了!!其实代码code并不难,难的是算法的指导,要先理解算法,才能编码. <?php $num_a

  • python实现简易计算器功能

    本文实例为大家分享了python实现简易计算器功能的具体代码,供大家参考,具体内容如下 一.功能目标 用户输入一个类似  1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))  这样的表达式,假设表达式里面除了包含空格.'+'.'-'.'*'.'/'和括号再无其他特殊符号,然后自己动手写代码解析其中的表达式,实现加减乘除,最后得出的结果与真实的计算机所算的结果必须一致. 二.解题思路 1.为了分开运算符和数

  • PHP基于堆栈实现的高级计算器功能示例

    本文实例讲述了PHP基于堆栈实现的高级计算器功能.分享给大家供大家参考,具体如下: 当我们得到一个字符串运算式该如何去得出它的运算结果呢? 这时候我们就能使用堆栈的算法很巧妙的解决这个问题. 思路是这样的:(我们利用php函数substr循环去截取这个字符串运算式,依次取出这个字符串的值[我们得从第一个字符开始截取],我们将开始截取位置设为一个循环增长的变量,初始化为[$index=0]),同时还需要创建两个栈,一个专门存放数字[$numStack],一个存放运算符[$operStack],我们

  • Python PyQt5实现的简易计算器功能示例

    本文实例讲述了Python PyQt5实现的简易计算器功能.分享给大家供大家参考,具体如下: 这里剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSize(QtCore.QSize(60,30)) 3.取事件的的发送者(此例为各个按钮)的文本: self.sender().text() [效果图] [源代码] import sys from PyQt

  • JS实现可针对算术表达式求值的计算器功能示例

    本文实例讲述了JS实现可针对算术表达式求值的计算器功能.分享给大家供大家参考,具体如下: HTML部分: <div> <div id="in"> <input name="in" type="text" class="clsin" id="input" value="" readonly="readonly" /> <inpu

  • python利用后缀表达式实现计算器功能

    本文实例为大家分享了python实现计算器功能的具体代码,供大家参考,具体内容如下 前缀表达式 运算符在数字的前面 1 + (2 + 3) * 4 - 5 (中缀) - + 1 * + 2 3 4 5  (前缀) 前缀表达式的计算方法和后缀表达式类似,只是变成了从右往左扫描 中缀表达式 运算符在中间,运算时需要考虑运算符优先级 1+2*3-5 要先算2*3.... 后缀表达式 运算符在数字的后面,运算时不考虑优先级,只需要遇到符号,就把他前面的两个数字进行运算就好了 例如: a b c + +

  • Android实现简易计算器功能

    本项目为大家分享了Android实现计算器功能的具体代码,供大家参考,具体内容如下 项目介绍 练手项目.能实现加减乘除及括号运算. 开发思路 界面布局 1.界面布局分三大块:公式文本区.结果文本区.按钮区.  2.通过点击按钮录入数学公式,实时展示在公式文本区.  3.点击等号,计算结果展示在结果文本区.  4.另外还有清空数据和删除一个字符功能. 计算逻辑 1.将中缀表达式转换为后缀表达式  2.计算后缀表达式得出结果 其他说明 栈数据结构简单说明: 1.栈数据结构像弹夹一样,先压进去的子弹后

随机推荐