1.calc_widget.h
#ifndef CALC_WIDGET_H
#define CALC_WIDGET_H
#include <QWidget>
#include<QStack>
#include<algorithm>
#include<stack>
#include<string>
#include<queue>
#include<QTextEdit>
#include<QTextLayout>
#include<QVector>
#include<QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class calc_Widget; }
QT_END_NAMESPACE
class calc_Widget : public QWidget
{
Q_OBJECT
public:
calc_Widget(QWidget *parent = nullptr);
~calc_Widget();
private slots:
void on_one_button_clicked();
void on_two_button_clicked();
void on_three_button_clicked();
void on_four_button_clicked();
void on_five_button_clicked();
void on_six_button_clicked();
void on_seven_button_clicked();
void on_eight_button_clicked();
void on_nine_button_clicked();
void on_zero_button_clicked();
void on_point_button_clicked();
void on_add_button_clicked();
void on_sub_button_clicked();
void on_mul_button_clicked();
void on_div_button_clicked();
void on_per_button_clicked();
void on_left_button_clicked();
void on_right_button_clicked();
// void on_history_button_clicked();
void on_clearall_button_clicked();
void on_delete_button_clicked();
void on_clear_button_clicked();
void on_equal_button_clicked();
void on_ans_button_clicked();
void on_format_box_activated(int index);
void on_rightmove_button_clicked();
void on_leftmove_button_clicked();
void on_esc_button_clicked();
void on_pi_button_clicked();
void on_e_button_clicked();
void on_exp_button_clicked();
void on_log_button_clicked();
void on_up_button_clicked();
void on_down_button_clicked();
void on_rnd_box_activated(int index);
void on_his_button_clicked();
private:
Ui::calc_Widget *ui;
QString expression; //表示当前显示界面中的字符串
QString dis_expression;
QVector<QString> history_ans;
static int expression_format; //判断表达式格式
QString inp(QString,int,QString);
QString inp(QString,int);
QString current_ans;
// Qt::TextInteractionFlags textInteractionFlags() const;
};
#endif // CALC_WIDGET_H
2.calc_widget.cpp
#include "calc_widget.h"
#include "ui_calc_widget.h"
#include "calc_2.0.cpp"
#include"input_1.0.cpp"
using namespace std;
calc_Widget::calc_Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::calc_Widget)
{
setFixedSize(525,605);
//
ui->setupUi(this);
ui->screen_lineedit->setEnabled(true);
ui->screen_lineedit->setPlaceholderText("请选择输出格式");
connect(ui->screen_lineedit,SIGNAL(returnPressed()),this,SLOT(on_equal_button_clicked()));
// ui->mul_button->setText("×");
// ui->div_button->setText("÷");
// ui->pi_button->setText("π");
this->setWindowTitle("卡细欧计算器");
QFont fc("Times New Roman",20);
QFont fh("Consolas",12);
// ui->screen_lineedit->setFont(fc); //设置主屏幕字体格式
// ui->history_edit->setFont(fh); //设置历史界面字体格式
// setMaximumWidth(996);
ui->history_edit->setReadOnly(true); //设置历史只读
// ui->gridLayout->SetFixedSize();
}
calc_Widget::~calc_Widget()
{
delete ui;
}
int calc_Widget::expression_format=0;
int h_idx=0;
void calc_Widget::on_format_box_activated(int index)
{
expression_format=index;
}
void calc_Widget::on_one_button_clicked()
{
// expression+="1";
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"1");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_two_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"2");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_three_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"3");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_four_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"4");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_five_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"5");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_six_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"6");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_seven_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"7");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_eight_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"8");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_nine_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"9");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_zero_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"0");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_point_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,".");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_add_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"+");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_sub_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"-");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_mul_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"*");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_div_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"/");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_left_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"(");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_right_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,")");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_per_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"%");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_delete_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos);
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos-1);
}
void calc_Widget::on_clear_button_clicked()
{
expression.clear();
ui->screen_lineedit->clear();
h_idx=history_ans.size();
}
//void calc_Widget::on_history_button_clicked()
//{
// QString h_ans;
// for(auto ans:history_ans)
// {
// h_ans+=ans;
// h_ans+="\t";
// }
// ui->screen_lineedit->setText(h_ans);
//}
void calc_Widget::on_clearall_button_clicked()
{
expression.clear();
history_ans.clear();
ui->screen_lineedit->clear();
ui->history_edit->clear();
h_idx=0;
}
void calc_Widget::on_equal_button_clicked()
{
if(expression.size()>0)
{
string experssion_sub=expression.toStdString();
string dub_ans=calc(experssion_sub,expression_format);
current_ans=QString::fromStdString(dub_ans); //当前答案
qDebug()<<current_ans;
QString current_expersion=expression+"="+current_ans; //历史展示整个式子
history_ans.push_back(current_expersion); //存储历史
ui->screen_lineedit->setText("= "+current_ans);
expression=current_ans; //当前值变为答案值
ui->history_edit->append(current_expersion);
h_idx=history_ans.size();
qDebug()<<ui->screen_lineedit->cursorPosition();
}
}
void calc_Widget::on_ans_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
if(expression!=current_ans)expression=inp(expression,pos,current_ans);
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+current_ans.size());
}
void calc_Widget::on_rightmove_button_clicked()
{
ui->screen_lineedit->cursorForward(false,1);
}
void calc_Widget::on_leftmove_button_clicked()
{
ui->screen_lineedit->cursorBackward(false,1);
}
void calc_Widget::on_esc_button_clicked()
{
this->close();
}
void calc_Widget::on_pi_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"Pi");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+2);
}
void calc_Widget::on_e_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"e");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_exp_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"^");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+1);
}
void calc_Widget::on_log_button_clicked()
{
int pos=ui->screen_lineedit->cursorPosition();
expression=inp(expression,pos,"ln(");
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+3);
}
void calc_Widget::on_up_button_clicked()
{
if(history_ans.empty());
else if(h_idx>0)expression=history_ans[--h_idx],ui->screen_lineedit->setText(expression);
}
void calc_Widget::on_down_button_clicked()
{
if(history_ans.empty());
else if(h_idx<history_ans.size()-1)expression=history_ans[++h_idx],ui->screen_lineedit->setText(expression);
}
void calc_Widget::on_rnd_box_activated(int index)
{
if(index)
{
int pos_index=index;
int pos=ui->screen_lineedit->cursorPosition();
srand(time(NULL));
int t=1;
while(index-->=1)t*=10;
double rnd=rand()%(t);
std::ostringstream os;
os<<std::setprecision(3)<<rnd;
expression=inp(expression,pos,QString::fromStdString(os.str()));
ui->screen_lineedit->setText(expression);
ui->screen_lineedit->setCursorPosition(pos+pos_index);
}
}
void calc_Widget::on_his_button_clicked()
{
ui->retranslateUi(this);
if(this->width()==525)this->setFixedWidth(996);
else this->setFixedWidth(525);
ui->screen_lineedit->setText(expression);
// qDebug()<<this->width();
}
3.cale_2.0.cpp
#include<algorithm>
#include<stack>
#include<string>
#include<queue>
#include<vector>
#include<QString>
#include<sstream>
#include<iomanip>
#include<cmath>
#include<QDebug>
using namespace std;
bool priority(string a,string b) //a优先级是否大于等于b
{
int a_n,b_n;
if(a[0]-'+'==0||a[0]-'-'==0)a_n=0;
if(b[0]-'+'==0||b[0]-'-'==0)b_n=0;
if(a[0]-'*'==0||a[0]-'/'==0)a_n=1;
if(b[0]-'*'==0||b[0]-'/'==0)b_n=1;
if(a[0]-'l'==0)a_n=2;
if(b[0]-'l'==0)b_n=2;
if(a[0]-'^'==0)a_n=3;
if(b[0]-'^'==0)b_n=3;
if(a[0]-'('==0)return false;
if(a_n>=b_n)return true;
else return false; //(
}
double oper(string a,double b,double c) //双目运算符计算
{
if(a[0]-'.'==0){while(c>=1)c=c/10;return b+c;}
else if(a[0]-'^'==0)
{
if(b==0&&c<=0)return 0x3f3f3f3f3f3f3f3f;
else if(b<0&&(c<1||(int)c%2!=0))return 0x3f3f3f3f3f3f3f3f;
else return pow(b,c);
}
else if(a[0]-'+'==0)return b+c;
else if(a[0]-'-'==0)return b-c;
else if(a[0]-'*'==0)return b*c;
else if(a[0]-'/'==0&&c!=0)return b/c;
else return 0x3f3f3f3f3f3f3f3f; //a[0]-'/'==0&&c==0
}
double oper(double b,int t)// 计算符号% ln
{
if(t==1)return b*0.01;
else if(b<=0)return 0x3f3f3f3f3f3f3f3f;
else return log(b);
}
//数字
void num(string c,queue<string> &operation)
{
operation.push(c);
}
//四则运算
void four_ari(string c,queue<string> &operation,stack<string> &opertor)
{
if(opertor.empty()){opertor.push(c);return;}
if(priority(opertor.top(),c))
/*比较栈顶和当前操作符,如果top>=current,top出栈操作符栈,入栈运算,将current和操作符栈元素比较,直到top < current,将current入栈操作符栈*/
{
while(!opertor.empty()&&priority(opertor.top(),c))
{
operation.push(opertor.top());
opertor.pop();
}
opertor.push(c);
}
else opertor.push(c);//否则入栈
}
//右括号
void right(queue<string> &operation,stack<string> &opertor,int &brack)
{
brack--;
while(!opertor.empty()&&opertor.top()[0]-'('!=0) //从栈顶开始将操作符元素全部入栈运算,直到遇到(
operation.push(opertor.top()),opertor.pop();
if(opertor.empty())brack=-2e9;
else opertor.pop();//将左括号出栈
}
//左括号
void left(stack<string> &opertor,int &brack)
{
opertor.push("(");
brack++;
}
void exp(stack<string> &opertor)
{
opertor.push("^");
}
//小数点
void point(string c,stack<string> &opertor,int &brack)
{
left(opertor,brack);
opertor.push(c); //小数点优先级高于其他运算符,由于是双目,需要人为加对括号
}
void ln(stack<string>&opertor)
{
opertor.push("ln");
}
//百分号
void per(queue<string> &operation)
{
operation.push("%");
}
string calc(string expression,int expression_format)
{
/*
1 小数点后必须为数字
2 百分号后可接右括号、四则运算符、百分号、指数
3 左括号后可接数字和左右括号,负号,ln
4 右括号后可接百分号,四则运算符,右括号,指数
5 数字后可接四则运算符,百分号,小数点,右括号,数字、指数
6 四则运算符后跟数字和左括号,ln
7 指数后接数字和左括号,ln
8 ln后接左括号
*/
bool leg_input[8];
memset(leg_input,true,sizeof leg_input);
stack<int>dubln; //调整ln顺序
stack<string> opertor;
queue<string> operation;
int brack=0; //判断括号是否成对
unsigned long long idx=0;
vector<string> pre_expression;//预处理表达式,将所有连续数字合并成一个字符串,操作符单独合并成一个字符串
if(expression[0]-'0'<0||expression[0]-'0'>=10)
{
if(expression[0]-'('!=0&&expression[0]-'-'!=0&&expression[0]-'l'!=0&&expression[0]-'e'!=0&&expression[0]-'P'!=0)
return "ERROR(INVALID INPUT_F)";
}
for(unsigned long long i=0;i<expression.size();i++)
{
// qDebug()<<expression[i];
if(expression[i]-'e'==0)
{
pre_expression.push_back("2"),pre_expression.push_back("."),pre_expression.push_back("71828");
continue;
}
if(expression[i]-'P'==0)
{
pre_expression.push_back("3"),pre_expression.push_back("."),pre_expression.push_back("14159"),i++;
continue;
}
if(expression[i]-'0'<0||expression[i]-'0'>=10)//如果不是数字
{
string t;
if(i==0&&expression[i]-'-'==0)pre_expression.push_back("0");
if(expression[i]-'l'==0)
{
pre_expression.push_back("ln"),i++;
continue;
}
t.push_back(expression[i]);
pre_expression.push_back(t);
}
else
{
string n;
int j=i;
while(expression[j]-'0'>=0&&expression[j]-'0'<10)//从遇到数字开始,往后遍历直到不再为数字,将连续数字合并
n.push_back(expression[j++]);
if(i>0&&expression[i]-'0'==0&&expression[i-1]-'.'!=0&&n.size()>1)//前导0非法输入
return "ERROR(INVALID INPUT_FZ)";
if(i==0&&expression[0]-'0'==0&&n.size()>1)//首位前导0非法输入
return "ERROR(INVALID INPUT_FZ)";
pre_expression.push_back(n);
i=j-1;
}
}
if(pre_expression[0][0]-'('==0)
{
leg_input[2]=false;
left(opertor,brack);
}
else if(pre_expression[0][0]-'l'==0)
{
leg_input[7]=false;
}
else
{
leg_input[4]=false;
num(pre_expression[0],operation);
}
idx++;
if(pre_expression.size()>2)
{
for(unsigned long long i=0;i<pre_expression.size()-2;i++)
{
if(pre_expression[i][0]-'.'==0&&pre_expression[i+2][0]-'.'==0)return "ERROR(INVALID INPUT_FP)";
}
}
while(idx<pre_expression.size())
{
if(!leg_input[0]) //上个字符为小数点,下一个为数字
{
if(pre_expression[idx][0]-'0'>=0&&pre_expression[idx][0]-'0'<10)
{
leg_input[0]=true;
leg_input[4]=false;
num(pre_expression[idx++],operation);
right(operation,opertor,brack); //补上右括号
}
else return "ERROR(INVALID_INPUT_1)";
}
else if(!leg_input[1]) //上一个为百分号,下一个为右括号、四则运算符、百分号,指数
{
if(pre_expression[idx][0]-')'==0)//右括号
{
leg_input[1]=true;
leg_input[3]=false;
right(operation,opertor,brack);
idx++;
if(brack<0)return "ERROR(MISSING LEFT BRACKETS)2";
}
else if(pre_expression[idx][0]-'+'==0||pre_expression[idx][0]-'-'==0||pre_expression[idx][0]-'*'==0||pre_expression[idx][0]-'/'==0)
{
leg_input[1]=true;
leg_input[5]=false;
four_ari(pre_expression[idx++],operation,opertor);
}
else if(pre_expression[idx][0]-'^'==0)
{
leg_input[1]=true;
leg_input[6]=false;
exp(opertor);
idx++;
}
else if(pre_expression[idx][0]-'%'==0)
{
per(operation);
idx++;
}
else return "ERROR(INVALID_INPUT_2)";
}
else if(!leg_input[2]) //上个为左括号,下一个为数字和左右括号和负号
{
if(pre_expression[idx][0]-'0'>=0&&pre_expression[idx][0]-'0'<10)
{
leg_input[2]=true;
leg_input[4]=false;
num(pre_expression[idx++],operation);
}
else if(pre_expression[idx][0]-')'==0)
{
leg_input[2]=true;
leg_input[3]=false;
right(operation,opertor,brack);
idx++;
if(brack<0)return "ERROR(MISSING LEFT BRACKETS)3";
}
else if(pre_expression[idx][0]-'l'==0)
{
leg_input[2]=true;
leg_input[7]=false;
idx++;
}
//负号
else if(pre_expression[idx][0]-'-'==0)
{
leg_input[2]=true;
leg_input[5]=false;
num("0",operation); //负号前添0
four_ari("-",operation,opertor);
idx++;
}
else if(pre_expression[idx][0]-'('==0)
{
if(!dubln.empty())dubln.top()++;
left(opertor,brack);
idx++;
}
else return "ERROR(INVALID_INPUT_3)";
}
else if(!leg_input[3]) //上个为右括号,下一个为百分号,四则运算符,右括号
{
if(!dubln.empty())
{
dubln.top()--;
if(dubln.top()==0)ln(opertor),dubln.pop();
}
if(pre_expression[idx][0]-'%'==0)
{
leg_input[3]=true;
leg_input[1]=false;
per(operation);
idx++;
}
else if(pre_expression[idx][0]-'^'==0)
{
leg_input[3]=true;
leg_input[6]=false;
exp(opertor);
idx++;
}
else if(pre_expression[idx][0]-'+'==0||pre_expression[idx][0]-'-'==0||pre_expression[idx][0]-'*'==0||pre_expression[idx][0]-'/'==0)
{
leg_input[3]=true;
leg_input[5]=false;
four_ari(pre_expression[idx++],operation,opertor);
}
else if(pre_expression[idx][0]-')'==0)
{
right(operation,opertor,brack);
idx++;
if(brack<0)return "ERROR(MISSING LEFT BRACKETS)4";
}
else return "ERROR(INVALID_INPUT_4)";
}
else if(!leg_input[4]) //上一位位数字,下一位四则运算符,百分号,小数点,右括号,数字,指数
{
//百分号
if(pre_expression[idx][0]-'%'==0)
{
leg_input[4]=true;
leg_input[1]=false;
per(operation);
idx++;
}
else if(pre_expression[idx][0]-'^'==0)
{
leg_input[4]=true;
leg_input[6]=false;
exp(opertor);
idx++;
}
//四则运算符
else if(pre_expression[idx][0]-'+'==0||pre_expression[idx][0]-'-'==0||pre_expression[idx][0]-'*'==0||pre_expression[idx][0]-'/'==0)
{
leg_input[4]=true;
leg_input[5]=false;
four_ari(pre_expression[idx++],operation,opertor);
}
//右括号
else if(pre_expression[idx][0]-')'==0)
{
leg_input[4]=true;
leg_input[3]=false;
right(operation,opertor,brack);
idx++;
if(brack<0)return "ERROR(MISSING LEFT BRACKETS)5";
}
//小数点
else if(pre_expression[idx][0]-'.'==0)
{
leg_input[4]=true;
leg_input[0]=false;
point(pre_expression[idx++],opertor,brack);
}
// //数字
// else if(pre_expression[idx][0]-'0'>=0&&pre_expression[idx][0]-'0'<10)
// {
// num(pre_expression[idx++],operation);
// }
else return "ERROR(INVALID_INPUT_5)";
}
else if(!leg_input[5]) //上一个为四则运算符,下一位为数字和左括号
{
//数字
if(pre_expression[idx][0]-'0'>=0&&pre_expression[idx][0]-'0'<10)
{
leg_input[5]=true;
leg_input[4]=false;
num(pre_expression[idx++],operation);
}
else if(pre_expression[idx][0]-'l'==0)
{
leg_input[5]=true;
leg_input[7]=false;
idx++;
}
//左括号
else if(pre_expression[idx][0]-'('==0)
{
if(!dubln.empty())dubln.top()++;
leg_input[5]=true;
leg_input[2]=false;
left(opertor,brack);
idx++;
}
else return "ERROR(INVALID_INPUT_6)";
}
else if(!leg_input[6]) //上一个为指数,下一位为数字和左括号和负号
{
//数字
if(pre_expression[idx][0]-'0'>=0&&pre_expression[idx][0]-'0'<10)
{
leg_input[6]=true;
leg_input[4]=false;
num(pre_expression[idx++],operation);
}
//左括号
else if(pre_expression[idx][0]-'('==0)
{
if(!dubln.empty())dubln.top()++;
leg_input[6]=true;
leg_input[2]=false;
left(opertor,brack);
idx++;
}
else if(pre_expression[idx][0]-'l'==0)
{
leg_input[6]=true;
leg_input[7]=false;
idx++;
}
else return "ERROR(INVALID_INPUT_7)";
}
else if(!leg_input[7]) //上一个为ln,下一位为数字和左括号,ln
{
//左括号
if(pre_expression[idx][0]-'('==0)
{
dubln.push(1);
leg_input[7]=true;
leg_input[2]=false;
left(opertor,brack);
idx++;
}
else return "ERROR(INVALID_INPUT_8)";
}
else return "ERROR(OTHER_ERROR)";
}
if(brack>0)return "ERROR(MISSING RIGHT BRACKETS)";
if(!dubln.empty()&&dubln.top()==1&&pre_expression[idx-1][0]-')'==0)
{
operation.push("ln");
dubln.pop();
}
while(!opertor.empty())operation.push(opertor.top()),opertor.pop();//将剩余运算符入运算
// while(!operation.empty()){cout<<operation.front()<<"#"<<endl;operation.pop();}
//后缀表达式计算
stack<double> ans;
while(!operation.empty())
{
if(operation.front()[0]-'0'>=0&&operation.front()[0]-'0'<10) //如果是数字,求出结果后入栈
{
double current_ans=0;
for(unsigned long long i=0;i<operation.front().size();i++)
{
current_ans=current_ans*10+operation.front()[i]-'0';
}
if(operation.front()[0]-'0'==0) //小数点后含有前导0
{
while(current_ans>=1)current_ans=current_ans/10;
for(unsigned long long i=0;i<operation.front().size();i++)
{
if(operation.front()[i]-'0'==0)current_ans=current_ans/10;
else break;
}
}
ans.push(current_ans);
operation.pop();
}
else if(!ans.empty()&&operation.front()[0]-'%'==0)
{
double res=ans.top();
ans.pop();
ans.push(oper(res,1));
operation.pop();
}
else if(!ans.empty()&&operation.front()[0]-'l'==0)
{
double res=ans.top();
ans.pop();
ans.push(oper(res,0));
if(ans.top()==0x3f3f3f3f3f3f3f3f)return "ERROR(MATH_ERROR)";
operation.pop();
}
else if(ans.size()>=2)
{
double res_c=ans.top();
ans.pop();
double res_b=ans.top();
ans.pop();
ans.push(oper(operation.front(),res_b,res_c));
if(ans.top()==0x3f3f3f3f3f3f3f3f)return "ERROR(MATH_ERROR)";
operation.pop();
}
else return "ERROR(OUTPUT_ERROR_1)";
}
//结果输出
if(ans.size()==1)
{
// char subans[32];
// string ans_final=gcvt(ans.top(),16,subans);
std::ostringstream ost;
if(expression_format>=2) //1 0.1 0.01 0.001
{
ost <<setiosflags(ios::fixed) << std::setprecision(expression_format-2) <<std::fixed<< ans.top();
return ost.str();
}
else if(expression_format==1) //science
{
int n=0;
double anssc=ans.top();
while(anssc>=10)anssc=anssc/10,n++;
ost <<setiosflags(ios::fixed) << std::setprecision(4) <<std::fixed<<anssc;
string ansc=ost.str()+"*10^"+to_string(n);
return ansc;
}
else if(expression_format==0) //NaN
{
ost << std::setprecision(12) <<ans.top();
return ost.str();
}
// if(ans_final[ans_final.size()-1]-'.'==0)ans_final.erase(ans_final.size()-1,1);
// return QString::fromStdString(ost.str());
}
else
{
// while(!ans.empty())cout<<ans.top()<<endl,ans.pop();
return "ERROR(OUTPUT_ERROR_2)";
}
}
4.input.cpp
#include<QString>
#include<algorithm>
#include<string>
#include<cstring>
#include<QDebug>
#include "calc_widget.h"
#include "ui_calc_widget.h"
//#include<iostream>
//#include<sstream>
//#include<iomanip>
using namespace std;
QString calc_Widget::inp(QString expression,int pos,QString s)
{
// std::ostringstream ost;
// ost <<std::setprecision(12) << pos;
// return QString::fromStdString(ost.str()); //调试光标位置
return expression.insert(min(pos,expression.size()),s); //光标处插入
// qDebug()<<ui->screen_lineedit->cursorPosition();
// calc_Widget::on_leftmove_button_clicked();
}
QString calc_Widget::inp(QString expression,int pos)
{
string t=expression.toStdString();
if(pos>0)t.erase(min(pos-1,expression.size()-1),1); //光标处删除
return QString::fromStdString(t);
}
calc_widget.ui和main.cpp两个文件略。