#include "calculator.h"
#include "ui_calculator.h"
calculator::calculator(QWidget *parent) :
QWidget(parent),
ui(new Ui::calculator)
{
ui->setupUi(this);
ui->lineEdit->setReadOnly(true);
ui->lineEdit->setAlignment(Qt::AlignRight);
top=0;
for(int i=0;i<20;i++)sta[i]='\0';
}
calculator::~calculator()
{
delete ui;
}
void calculator::on_pushButton_13_clicked()
{
sta[top++]='0';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_7_clicked()
{
sta[top++]='1';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_8_clicked()
{
sta[top++]='2';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_9_clicked()
{
sta[top++]='3';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_4_clicked()
{
sta[top++]='4';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_5_clicked()
{
sta[top++]='5';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_6_clicked()
{
sta[top++]='6';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_clicked()
{
sta[top++]='7';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_2_clicked()
{
sta[top++]='8';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_3_clicked()
{
sta[top++]='9';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_16_clicked()
{
sta[top++]='+';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_18_clicked()
{
sta[top++]='-';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_20_clicked()
{
sta[top++]='*';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_22_clicked()
{
sta[top++]='/';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_17_clicked()
{
sta[top++]='(';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_19_clicked()
{
sta[top++]=')';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_21_clicked()
{
if(top==0)return ;
sta[--top]='\0';
ui->lineEdit->setText(sta);
}
void calculator::on_pushButton_23_clicked()
{
top=0;
for(int i=0;i<20;i++)sta[i]='\0';
ui->lineEdit->setText(sta);
}
double calculator::cal(double a,double b,char c)
{
if(c=='+')return a+b;
if(c=='-')return a-b;
if(c=='*')return a*b;
if(c=='/')return a/b;
}
int calculator::change(int num[],int n)
{
if(n==0)return 0;
return change(num,n-1)*10+num[n-1];
}
void calculator::on_pushButton_15_clicked()
{
double stacknum[20];
char stackchar[20];
int num[20],cnt=1;
int topnum=0;
int topchar=0;
int st=0,kk=1;
while(sta[st]=='+'||sta[st]=='-')
{
if(sta[st]=='-')kk*=-1;
st++;
}
for(int i=0;i<top-1;i++)
{
if(sta[i]<48&&sta[i+1]<48)
{
if(sta[i]!=')'&&sta[i+1]!='('){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
}
if((sta[i]>=48&&sta[i+1]=='(')||(sta[i]==')'&&sta[i+1]>=48)){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
}
if(sta[0]=='*'||sta[0]=='/'||sta[top-1]=='+'||sta[top-1]=='-'||sta[top-1]=='*'||sta[top-1]=='/'){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
for(int i=st;i<top;i++)
{
if(sta[i]=='+'||sta[i]=='-')
{
while(topchar!=0&&stackchar[topchar-1]!='(')
{
if(topnum<2||(stacknum[topnum-1]==0&&stackchar[topchar-1]=='/')){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
topnum--;
stacknum[topnum-1]=cal(stacknum[topnum-1],stacknum[topnum],stackchar[topchar-1]);
topchar--;
}
stackchar[topchar++]=sta[i];
}
else if(sta[i]=='*'||sta[i]=='/')
{
while(topchar!=0&&stackchar[topchar-1]!='('&&stackchar[topchar-1]!='+'&&stackchar[topchar-1]!='-')
{
if(topnum<2||(stacknum[topnum-1]==0&&stackchar[topchar-1]=='/')){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
topnum--;
stacknum[topnum-1]=cal(stacknum[topnum-1],stacknum[topnum],stackchar[topchar-1]);
topchar--;
}
stackchar[topchar++]=sta[i];
}
else if(sta[i]=='(')stackchar[topchar++]=sta[i];
else if(sta[i]==')')
{
while(topchar!=0&&stackchar[topchar-1]!='(')
{
if(topnum<2||(stacknum[topnum-1]==0&&stackchar[topchar-1]=='/')){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
topnum--;
stacknum[topnum-1]=cal(stacknum[topnum-1],stacknum[topnum],stackchar[topchar-1]);
topchar--;
}
if(topchar==0||stackchar[topchar-1]!='('){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
topchar--;
}
else
{
num[0]=sta[i]-48;
while((i+1<top&&sta[i+1]>=48))
{
num[cnt++]=sta[i+1]-48;
i++;
}
stacknum[topnum++]=change(num,cnt);
if(sta[i+1]=='.')
{
i+=2;cnt=1;
num[0]=sta[i]-48;
while((i+1<top&&sta[i+1]>=48))
{
num[cnt++]=sta[i+1]-48;
i++;
}
stacknum[topnum-1]+=change(num,cnt)/pow(10,cnt);
}
cnt=1;
}
}
while(topchar!=0&&stackchar[topchar-1]!='(')
{
if(topnum<2||(stacknum[topnum-1]==0&&stackchar[topchar-1]=='/')){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
topnum--;
stacknum[topnum-1]=cal(stacknum[topnum-1],stacknum[topnum],stackchar[topchar-1]);
topchar--;
}
if(stackchar[topchar-1]=='('){ui->lineEdit->setText("Error");for(int i=0;i<20;i++)sta[i]='\0';top=0;return ;}
ui->lineEdit->setText(QString::number(stacknum[0]*kk));
top=0;
for(int i=0;i<20;i++)sta[i]='\0';
}
void calculator::on_pushButton_14_clicked()
{
sta[top++]='.';
ui->lineEdit->setText(sta);
}