栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

代码

MyCalculator.h

#pragma once

#include 
#include 
#include 
#include "ui_MyCalculator.h"

class MyCalculator : public QMainWindow
{
  Q_OBJECT

public:
  MyCalculator(QWidget *parent = Q_NULLPTR);
	



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();



private:
  Ui::MyCalculatorClass ui;

};

MyCalculator.main

#include "MyCalculator.h"
#include 

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

MyCalculator.cpp

#include "MyCalculator.h"

#include
using namespace std;
#include
#include
#include
#include

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()));
	

}
void MyCalculator::on_number_Button_clicked()
{
	QPushButton *btn = qobject_cast(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(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(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 Num;
	QStack 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

}

测试

表达式 结果
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++实现计算器内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/61069.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号