1 Star 1 Fork 0

杜润明/2021C++程序设计

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
mainwindow.cpp 19.49 KB
一键复制 编辑 原始数据 按行查看 历史
漫长的冬季 提交于 2021-09-28 16:32 . 修改小bug
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <cstring>
#include <cmath>
#include <QDebug>
#include <QPainter>
#include <QStack>
#include <QQueue>
#define PI 3.1415926
#define e 2.7182818
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化
str="";
resultStr="";
flag=0;
ui->LineAnswer->setText("0");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_Pclear_clicked()
{
str="";
resultStr="";
flag=0;
ui->LineAnswer->setText("0");
}
void MainWindow::on_P0_clicked()
{
if(flag==0||str==""){
ui->LineAnswer->setText("0");
haveZero=1;
//flag=1;
}
else {
str+="0";
ui->LineAnswer->setText(str);
}
//qDebug()<<str;
}
void MainWindow::on_P1_clicked()
{
if(flag==0){
str="1";
flag=1;
}
else str+="1";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P2_clicked()
{
if(flag==0){
str="2";
flag=1;
}
else str+="2";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P3_clicked()
{
if(flag==0){
str="3";
flag=1;
}
else str+="3";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P4_clicked()
{
if(flag==0){
str="4";
flag=1;
}
else str+="4";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P5_clicked()
{
if(flag==0){
str="5";
flag=1;
}
else str+="5";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P6_clicked()
{
if(flag==0){
str="6";
flag=1;
}
else str+="6";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P7_clicked()
{
if(flag==0){
str="7";
flag=1;
}
else str+="7";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P8_clicked()
{
if(flag==0){
str="8";
flag=1;
}
else str+="8";
ui->LineAnswer->setText(str);
}
void MainWindow::on_P9_clicked()
{
if(flag==0){
str="9";
flag=1;
}
else str+="9";
ui->LineAnswer->setText(str);
}
//自然对数的底数e
void MainWindow::on_Pe_clicked()
{
if(flag==0){
str="2.7182818";
flag=1;
}
else str+="2.7182818";
ui->LineAnswer->setText(str);
}
//圆周率π
void MainWindow::on_Ppi_clicked()
{
if(flag==0){
str+="3.1415926";
flag=1;
}
else str+="3.1415926";
ui->LineAnswer->setText(str);
}
void MainWindow::on_Padd_clicked()
{
if(str==""){
str=resultStr;
str+="+";
ui->LineAnswer->setText(str);
}
if(flag==0){
ui->LineAnswer->setText("0");
}
else if(str[str.size()-1]=='+'||str[str.size()-1]=='('||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='^'){
return ;
}
else {
str+="+";
ui->LineAnswer->setText(str);
}
}
void MainWindow::on_Psub_clicked()
{
if(str==""&&resultStr!=""){
str=resultStr;
str+="-";
ui->LineAnswer->setText(str);
}
else if(flag==0){
str='-';
flag=1;
ui->LineAnswer->setText(str);
}
else if(str[str.size()-1]=='+'||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='^'){
return ;
}
else {
str+="-";
ui->LineAnswer->setText(str);
}
}
void MainWindow::on_Pmul_clicked()
{ if(str==""){
str=resultStr;
str+="*";
ui->LineAnswer->setText(str);
}
if(flag==0){
ui->LineAnswer->setText("0");
}
else if(str[str.size()-1]=='+'||str[str.size()-1]=='('||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='^'){
return ;
}
else {
str+="*";
ui->LineAnswer->setText(str);
}
}
void MainWindow::on_Pdiv_clicked()
{
if(str==""){
str=resultStr;
str+="/";
ui->LineAnswer->setText(str);
}
if(flag==0){
ui->LineAnswer->setText("0");
}
else if(str[str.size()-1]=='+'||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='('||str[str.size()-1]=='^'){
return ;
}
else{
str+="/";
ui->LineAnswer->setText(str);
}
}
//乘方
void MainWindow::on_Ppower_clicked()
{
if(str==""){
str=resultStr;
str+="^";
ui->LineAnswer->setText(str);
}
if(flag==0){
ui->LineAnswer->setText("0");
}
else if(str[str.size()-1]=='+'||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='('||str[str.size()-1]=='^'){
return ;
}
else{
str+="^";
ui->LineAnswer->setText(str);
}
}
//左括号
void MainWindow::on_Pleft_clicked()
{
if(str=="")
return ;
if(flag==0){
ui->LineAnswer->setText("0");
}
//左括号前面不能为数字 小数点 右括号
else if((str[str.size()-1]<='9') && (str[str.size()-1]>='0') || (str[str.size()-1]=='.')|| (str[str.size()-1]==')') ){
return ;
}
else {
str+="(";
status++;
ui->LineAnswer->setText(str);
}
}
//右括号
void MainWindow::on_Pright_clicked()
{
if(str=="")
return ;
if(flag==0){
ui->LineAnswer->setText("0");
}
//前面不能为加减乘除 小数点 左括号
else if(status==0||str[str.size()-1]=='+'||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='('||str[str.size()-1]=='.'){
return ;
}
else {
str+=")";
status--;
ui->LineAnswer->setText(str);
}
}
//退格
void MainWindow::on_Pbackspace_clicked()
{
if(str!=""){
if(str[str.size()-1]==')'){
status++;
}
str.chop(1);
ui->LineAnswer->setText(str);
}
if(str=="")
ui->LineAnswer->setText("0");
}
//小数点
void MainWindow::on_Pdot_clicked()
{
if(flag==0){
if(haveZero==1){
str="0.";
ui->LineAnswer->setText(str);
haveZero=0;
flag=1;
return ;
}
ui->LineAnswer->setText("0");
}
else if(str[str.size()-1]=='.'||str[str.size()-1]=='+'||str[str.size()-1]=='-'||str[str.size()-1]=='*'||str[str.size()-1]=='/'||str[str.size()-1]=='('||str[str.size()-1]==')') {
return ;
}
else {
str+=".";
//一串小数只能有一个小数点的判断
int num=0;
for(int i=str.size()-2;i>=0;i--){
if(str[i]=='.') num++;
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') break;
}
if(num>=1) str.chop(1);//如果小数点超出,则删除该次输入
ui->LineAnswer->setText(str);
}
}
void MainWindow::on_Presult_clicked()
{
resultStr=calculater(str);
str="";
ui->LineAnswer->setText(calculater(resultStr));
}
/* 计算结果
* 将中缀表达式转化为后缀表达式计算
*/
QString MainWindow::calculater(const QString& str)
{
QQueue<QString> q=Split(str); //分离中缀
q=Transfer(q); //转换为后缀
return Calculate(q); //返回结果
}
/*void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter p(this);
p.drawPixmap(0,0,width(),height(),QPixmap("../black.png"));
}*/
//分离前缀
QQueue<QString> MainWindow::Split(const QString &str)
{
QQueue<QString> ret;
QString num="";
for(int i=0;i<str.length();i++)
{
if( (str[i]=='.') || ( (str[i]>='0') && (str[i]<='9') )) //判断小数点和数字
{
num += str[i];
}
else if(str[i]== '(' || str[i]== ')' || str[i]== '*' || str[i]== '/' ||(str[i]=='^') )
{
if(!num.isEmpty())
{
ret.enqueue(num); //将数字入队列
num.clear();
}
ret.enqueue(str[i]);
}
else if(str[i]== '+' || str[i]== '-') // + - 需要特殊处理
{
if(i==0) //表达式开头,说明是正负号
{
num+= str[i];
}
else if(str[i-1]=='(' || str[i-1]=='+' || str[i-1]=='-' || str[i-1]=='*' || str[i-1]=='/')
{
num+= str[i];
}
else //否则是加减运算符
{
if(!num.isEmpty())
{
ret.enqueue(num); //将数字入队列
num.clear();
}
ret.enqueue(str[i]);
}
}
}
if(!num.isEmpty()) //遍历完成,判断是否还有数字
{
ret.enqueue(num);
num.clear();
}
return ret;
}
//将中缀队列转换为后缀队列
QQueue<QString> MainWindow::Transfer(QQueue<QString> &str)
{
QStack<QString> stack;
QQueue<QString> ret;
bool num_ok;
QString symbol;
while(!str.isEmpty())
{
symbol = str.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=="^"){
while(!stack.isEmpty() && (stack.top()!="(") && (stack.top()!="+") && (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;
}
//将后缀队列计算出结果
QString MainWindow::Calculate(QQueue<QString> &str)
{
QStack<QString> stack;
QString symbol,L,R,op,ret;
bool num_ok;
while(!str.isEmpty())
{
symbol = str.dequeue(); //出队列
symbol.toDouble(&num_ok);
if(num_ok==true) //数字
{
stack.push(symbol);
}
else //运算符
{
if(stack.size()<2)
return "Error";
R= stack.pop();
L= stack.pop();
ret = Calculate(L,symbol,R );
if(ret==NULL)
return ret;
stack.push(ret);
}
}
if(stack.size()==1) //遍历完成,结果只有一个
{
return ValidNum(stack.pop());
}
else
{return "Error";
}
}
//后缀表达式中出栈两两计算
QString MainWindow::Calculate(QString &l, QString &op, QString &r)
{
double left,right,res;
QString ret="";
left = l.toDouble();
right = r.toDouble();
if(op == "+")
{
res = left + right;
}
else if(op == "-")
{
res = left - right;
}
else if(op == "*")
{
res = left * right;
}
else if(op == "/")
{
if( (right>(-0.000000000000001)) && (right<(0.000000000000001)) ) //判断除数为0
return NULL;
else
res = left/right;
}
else if(op=="^"){
res = pow(left,right);
}
ret.sprintf("%f",res);
return ret;
}
QString MainWindow::ValidNum(QString str) //如果不是小数直接返回,是小数则去掉多余的尾0和小数点
{
QString num;
if(str.indexOf(".")== -1) //判断是否小数
return str;//没找到小数点 直接返回
while(str.length()>1) //避免0被去掉
{
num=str.right(1);
if(num=="."||num=="0")
{
str.chop(1);
if(num==".")
return str;
}
else
return str;
}
return str;
}
//以下为按下即生效的按键,直接产生结果,相当于按下后再按下等号
//转换正负
void MainWindow::on_Pchange_clicked(){
if(str==""){
if(resultStr[0]=='-'){
resultStr[0]='+';
ui->LineAnswer->setText(resultStr);
return ;
}
if(resultStr[0]=='+'){
resultStr[0]='-';
ui->LineAnswer->setText(resultStr);
return ;
}
if(resultStr[0]>='0'&&str[0]<='9'){
resultStr.insert(0,'-');
ui->LineAnswer->setText(resultStr);
return ;
}
}
else{
if(str[0]=='-'){
str[0]='+';
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
return ;
}
if(str[0]=='+'){
str[0]='-';
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
return ;
}
if(str[0]>='0'&&str[0]<='9'){
str.insert(0,'-');
ui->LineAnswer->setText(str);
resultStr=str;
str="";
return ;
}
}
}
//百分数
void MainWindow::on_Ppercent_clicked(){
if(str==""){
double dou=resultStr.toDouble();
dou/=100;
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou/=100;
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//平方
void MainWindow::on_Psquare_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou*=dou;
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou*=dou;
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//立方
void MainWindow::on_Pcube_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=dou*dou*dou;
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=dou*dou*dou;
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//开根号
void MainWindow::on_Psqrt_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=sqrt(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=sqrt(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//倒数
void MainWindow::on_Preciprocal_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=1/dou;
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=1/dou;
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//阶乘
void MainWindow::on_Pfactorial_clicked()
{
long long int res=1;
if(str==""){
if(resultStr.indexOf('.')!=-1) return ;//小数不能阶乘
double dou=resultStr.toDouble();
for(int i=1;i<=dou;++i){
res*=i;
}
dou=res;
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
if(str.indexOf('.')!=-1) return ;//小数不能阶乘
double dou=str.toDouble();
for(int i=1;i<=dou;++i){
res*=i;
}
dou=res;
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//正弦
void MainWindow::on_Psin_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=sin(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=sin(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//余弦
void MainWindow::on_Pcos_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=cos(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=cos(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//正切
void MainWindow::on_Ptan_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=tan(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=tan(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//e的x次方
void MainWindow::on_PePower_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=exp(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=exp(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//10的x次方
void MainWindow::on_P10power_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=pow(10,dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=pow(10,dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//自然对数
void MainWindow::on_Pln_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=log(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=log(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
//10为底的对数
void MainWindow::on_Plog10_clicked()
{
if(str==""){
double dou=resultStr.toDouble();
dou=log10(dou);
resultStr=QString::number(dou);
ui->LineAnswer->setText(resultStr);
}
else{
double dou=str.toDouble();
dou=log10(dou);
str=QString::number(dou);
ui->LineAnswer->setText(str);
//相当于按下等号
resultStr=str;
str="";
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/du-runming/c-programming.git
git@gitee.com:du-runming/c-programming.git
du-runming
c-programming
2021C++程序设计
master

搜索帮助