先展示一下运行的结果
实现了加减乘除、小数点、括号、返回、清楚等功能
下面来展示代码
calculator.h 代码比较多但很多都是重复的,主要看等于号那边如何实现
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QPushButton>
#include<QLineEdit>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QGridLayout>
#include<QString>
#include<QStack>
#include <vector>
using namespace std;
class calculator : public QMainWindow
{
Q_OBJECT
public:
calculator(QWidget *parent = 0);
~calculator();
char nows;//现在对应的符号
int zuo = 0, you = 0;//左括号和右括号
int ENDS = 0, hh=0;
int mark;
vector<char>biaodashi;//用于计算的表达式存放在这里
private:
QLineEdit *inputLine;//显示框
QString input=" "; //输入框
bool flat=false;
//0-9按钮
QPushButton *zeroButton;
QPushButton *oneButton;
QPushButton *twoButton;
QPushButton *threeButton;
QPushButton *fourButton;
QPushButton *fiveButton;
QPushButton *sixButton;
QPushButton *sevenButton;
QPushButton *eightButton;
QPushButton *nineButton;
QPushButton *addButton;
QPushButton *subButton;
QPushButton *divButton;
QPushButton *mulButton;
QPushButton *equButton;
QPushButton *decButton;
QPushButton *CEButton;
QPushButton *ACButton;
QPushButton *lefButton;
QPushButton *rigButton;
private slots:
double calculate(int x, int y);//
double number1(int start, int end);//
double panduan(int start, double number, int y);
void solve(int x, int y, double num);
void buttonZeroClicked();
void buttonOneClicked();
void buttonTwoClicked();
void buttonThreeClicked();
void buttonFourClicked();
void buttonFiveClicked();
void buttonSixClicked();
void buttonSevenClicked();
void buttonEightClicked();
void buttonNineClicked();
void buttonAddClicked();//+
void buttonSubClicked();//-
void buttonMulClicked();//乘
void buttonDivClicked();//除
void buttonDecClicked();//小数点
void buttonEquClicked();//等于号
void buttonLefClicked();//左括号
void buttonRigClicked();//右括号
void buttonCEClicked();//CE
void buttonACClicked();//AC
};
#endif // MAINWINDOW_H
calculator.cpp
#include "calculator.h"
#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<sstream>
using namespace std;
calculator::calculator(QWidget *parent) : QMainWindow(parent)
{
QWidget *widget=new QWidget; //构建一个QWidget布局将设置的布局添加进这个QWidget
this->setCentralWidget(widget);
inputLine=new QLineEdit;
inputLine->setText(input);
zeroButton=new QPushButton("0");
oneButton=new QPushButton("1");
twoButton=new QPushButton("2");
threeButton=new QPushButton("3");
fourButton=new QPushButton("4");
fiveButton=new QPushButton("5");
sixButton=new QPushButton("6");
sevenButton=new QPushButton("7");
eightButton=new QPushButton("8");
nineButton=new QPushButton("9");
decButton=new QPushButton(".");
addButton=new QPushButton("+");
subButton=new QPushButton("-");
mulButton=new QPushButton("*");
divButton=new QPushButton("/");
equButton=new QPushButton("=");
lefButton=new QPushButton("(");
rigButton=new QPushButton(")");
CEButton=new QPushButton("CE");
ACButton=new QPushButton("AC");
QGridLayout *H=new QGridLayout(this); //声明了一个网格布局
inputLine->setFixedHeight(50); //
H->addWidget(inputLine,0,0,1,5);
H->setRowStretch(0,100);
H->addWidget(oneButton,1,0);
H->addWidget(twoButton,1,1);
H->addWidget(threeButton,1,2);
H->addWidget(CEButton,1,3);
H->addWidget(ACButton,1,4);
H->addWidget(fourButton,2,0);
H->addWidget(fiveButton,2,1);
H->addWidget(sixButton,2,2);
H->addWidget(addButton,2,3);
H->addWidget(subButton,2,4);
H->addWidget(sevenButton,3,0);
H->addWidget(eightButton,3,1);
H->addWidget(nineButton,3,2);
H->addWidget(mulButton,3,3);
H->addWidget(divButton,3,4);
H->addWidget(zeroButton,4,0);
H->addWidget(decButton,4,1);
H->addWidget(lefButton,4,2);
H->addWidget(rigButton,4,3);
H->addWidget(equButton,4,4);
widget->setLayout(H); //将布局显示出来
connect(zeroButton,SIGNAL(clicked()),this,SLOT(buttonZeroClicked()));//信号与槽函数
connect(oneButton,SIGNAL(clicked()),this,SLOT(buttonOneClicked()));
connect(twoButton,SIGNAL(clicked()),this,SLOT(buttonTwoClicked()));
connect(threeButton,SIGNAL(clicked()),this,SLOT(buttonThreeClicked()));
connect(fourButton,SIGNAL(clicked()),this,SLOT(buttonFourClicked()));
connect(fiveButton,SIGNAL(clicked()),this,SLOT(buttonFiveClicked()));
connect(sixButton,SIGNAL(clicked()),this,SLOT(buttonSixClicked()));
connect(sevenButton,SIGNAL(clicked()),this,SLOT(buttonSevenClicked()));
connect(eightButton,SIGNAL(clicked()),this,SLOT(buttonEightClicked()));
connect(nineButton,SIGNAL(clicked()),this,SLOT(buttonNineClicked()));
connect(addButton,SIGNAL(clicked()),this,SLOT(buttonAddClicked()));
connect(subButton,SIGNAL(clicked()),this,SLOT(buttonSubClicked()));
connect(mulButton,SIGNAL(clicked()),this,SLOT(buttonMulClicked()));
connect(divButton,SIGNAL(clicked()),this,SLOT(buttonDivClicked()));
connect(decButton,SIGNAL(clicked(bool)),this,SLOT(buttonDecClicked()));//点号
connect(lefButton,SIGNAL(clicked(bool)),this,SLOT(buttonLefClicked()));//左括号
connect(rigButton,SIGNAL(clicked(bool)),this,SLOT(buttonRigClicked()));//右括号
connect(CEButton,SIGNAL(clicked()),this,SLOT(buttonCEClicked()));
connect(ACButton,SIGNAL(clicked()),this,SLOT(buttonACClicked()));
connect(equButton,SIGNAL(clicked()),this,SLOT(buttonEquClicked())); //等于号*/
}
void calculator::buttonOneClicked()
{
nows = '1';
biaodashi.push_back(nows);//把1放入容器尾部
input += '1';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonTwoClicked()
{
nows = '2';
biaodashi.push_back(nows);//把2放入容器尾部
input += '2';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonThreeClicked()
{
nows = '3';
biaodashi.push_back(nows);//把3放入容器尾部
input += '3';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonFourClicked()
{
nows = '4';
biaodashi.push_back(nows);//把4放入容器尾部
input += '4';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonFiveClicked()
{
nows = '5';
biaodashi.push_back(nows);//把5放入容器尾部
input += '5';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonSixClicked()
{
nows = '6';
biaodashi.push_back(nows);//把6放入容器尾部
input += '6';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonSevenClicked()
{
nows = '7';
biaodashi.push_back(nows);//把7放入容器尾部
input += '7';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonEightClicked()
{
nows = '8';
biaodashi.push_back(nows);//把8放入容器尾部
input += '8';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonNineClicked()
{
nows = '9';
biaodashi.push_back(nows);//把9放入容器尾部
input += '9';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonZeroClicked()
{
nows = '0';
biaodashi.push_back(nows);//把0放入容器尾部
input += '0';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonAddClicked()
{
nows = '+';
biaodashi.push_back(nows);//把+放入容器尾部
input += '+';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonSubClicked()
{
nows = '-';
biaodashi.push_back(nows);//把-放入容器尾部
input += '-';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonMulClicked()
{
nows = '*';
biaodashi.push_back(nows);//把*放入容器尾部
input += '*';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonDivClicked()
{
nows = '/';
biaodashi.push_back(nows);//把/放入容器尾部
input += '/';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonDecClicked() //小数点
{
nows = '.';
biaodashi.push_back(nows);//把.放入容器尾部
input += '.';
ENDS++;
inputLine->setText(input);
}
void calculator::buttonLefClicked()
{
nows = '(';
biaodashi.push_back(nows);//把(放入容器尾部
input += '(';
ENDS++;
zuo++;
inputLine->setText(input);
}
void calculator::buttonRigClicked()
{
nows = ')';
biaodashi.push_back(nows);//把)放入容器尾部
input += ')';
ENDS++;
you++;
inputLine->setText(input);
}
void calculator::buttonCEClicked()
{
biaodashi.erase(biaodashi.end() - 1 );
ENDS--;
input = input.left(input.length()-1); //减去一字符
inputLine->setText(input);
}
void calculator::buttonACClicked() //直接清空
{
input='0';
inputLine->setText(input);
}
void calculator::buttonEquClicked()//等于号
{
nows = '=';
biaodashi.push_back(nows);
if (hh == 0)
{
hh = 1;
biaodashi.push_back(' ');
}
ENDS++;
input += '=';
inputLine->setText(input);
int i, j;
double rs;
if (zuo != you)
{
input=input+"=Error";
inputLine->setText(input);
}
else
while (zuo > 0)
{
for (i = 0; i < ENDS; i++)
if (biaodashi[i] == '(')
{
for (j = i; j <= ENDS; j++)
if (biaodashi[j] == ')')
{
calculate(i + 1, j-1);//计算括号里的内容
break;
}
break;
}
zuo--;
you--;
}
if (zuo == 0 && you == 0)
rs = calculate(0, ENDS);
input=input+QString::number(rs);
inputLine->setText(input);
}
double calculator::calculate(int x, int y)
{
int starts, start;//起点
start = x;
mark = x;//数字的结尾
double num1, num2, num3;
num1 = number1(start, y);//初始化num1
start = mark;
starts = start;//最初的起点
//中间符号
while (mark < y)
{
/*num1 = number1(start, y);
start = mark;*/
start ++;
num2 = number1(start, y);
start = mark;
if (biaodashi[start] == '*' || biaodashi[start] == '/')
{
start++;
num2 = panduan(start , num2, y);
start = mark;
}
if (biaodashi[starts] == '+')
num1 = num1 + num2;
else
if (biaodashi[starts] == '-')
num1 = num1 - num2;
else
if (biaodashi[starts] == '*')
num1 = num1 * num2;
else
if (biaodashi[starts] == '/')
num1 = num1 /(int) num2;
starts = mark;//变更初始符号
num3 = num1;
if (biaodashi[mark + 1] == '='||biaodashi[mark]=='=')
break;
}
if (zuo!=0)
solve(x-1, y+1, num3);
return num3;
}
double calculator::number1(int start, int end)
{
int i;
i = start;//
string num = "";
double temp;
while ((biaodashi[start] >= '0'&&biaodashi[start]<='9') || biaodashi[start] == '.')
{
num += biaodashi[start];
start++;//后一个字符
mark = start;
//记录下数字d后一个的位置
}
temp = atof(num.c_str());//转double
/*if (i-1>=0)
if (biaodashi[i - 1] == '-')
temp = 0 - temp;*/
return temp;
}
double calculator::panduan(int start, double number, int y)
{
double num3;
if (biaodashi[start-1] == '*')//前一个符号
{
num3 = number1(start, y);
start = mark;
num3 = number*num3;
}
else
{
num3 = number1(start, y);
start = mark;
num3 = number / (int)num3;
}
if (biaodashi[start] == '*' || biaodashi[start] == '/')
num3 = panduan(start+1, num3,y);
return num3;
}
void calculator::solve(int x, int y, double num)
{
QString b=QString::number(num);
QByteArray cpath = b.toLocal8Bit();
char*buffer = cpath.data();
int len;
len = strlen(buffer);
biaodashi.erase(biaodashi.begin() + x, biaodashi.begin() + y+1);
ENDS = ENDS - y + x;
for (int i = 0; i < len; i++)//有个\0
{
biaodashi.insert(biaodashi.begin() + x, buffer[i]);
ENDS++;
x++;
}
return ;
}
calculator::~calculator()
{
}
main.cpp
#include "calculator.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
calculator w;
w.show();
return a.exec();
}
等有时间把这篇代码简单分析一下,更清楚的展示出来