C++语言计算器源代码.docx
《C++语言计算器源代码.docx》由会员分享,可在线阅读,更多相关《C++语言计算器源代码.docx(21页珍藏版)》请在冰豆网上搜索。
![C++语言计算器源代码.docx](https://file1.bdocx.com/fileroot1/2023-2/24/673469e3-d225-418f-b4a8-cc7bbacc0bf8/673469e3-d225-418f-b4a8-cc7bbacc0bf81.gif)
C++语言计算器源代码
#include
#include
#includeusingnamespacestd;
constdoublepi=3.14159265;
constdoublee=2.718281828459;
constintSIZE=1000;
typedefstructnode//为了处理符号而建立的链表(如:
1+(-2))
{
chardata;
node*next;
}node;
typedefstructstack_num//存储数的栈
{
double*top;
double*base;
}stack_num;
typedefstructstack_char〃存储运算符号的栈
{
char*top;
char*base;
}stack_char;
stack_numS_num;〃定义
stack_charS_char;〃定义
charfu[18]={'\n',')','+','-','*','/','%','A',
Q,'L',C,'S',T,'c','s','t','('};
intcompare[1000];〃表现出各运算符号的优先级
doubleshu[1000];〃存储”数”的数组
doubledai_result;〃运算的结果,是为了处理M运算(简介函数里有M的定义)
intbiao=0;//和dia_result一样,为了处理M运算
charline[SIZE];〃输入的所要计算的表达式
voidinit()//初始化
{
compare[fu[0]]=-2;//用数字的大小表现出符号的优先级
compare[fu[1]]=-1;
compare[fu[2]]=2;
compare[fu[3]]=2;
compare[fu[4]]=4;
compare[fu[5]]=4;
compare[fu[6]]=4;
compare[fu[7]]=5;
for(inti=8;i<=15;i++)compare[fu[i]]=6;
compare[fu[16]]=7;
为栈开辟空间
S_num.base=(double*)malloc(sizeof(double)*SIZE);〃
S_char.base=(char*)malloc(sizeof(char)*SIZE);〃同上
S_num.top=S_num.base;
S_char.top=S_char.base;
voidpush_num(doublen)〃数字进栈
{
*++S_num.top=n;
}
{
*++S_char.top=c;
}
doublepop_num()//数字出栈
doublem=*S_num.top;
S_num.top--;
returnm;
charpop_char()//运算符号出栈
{
charcc=*S_char.top;
S_char.top--;
returncc;
}
charget_top_char()〃得到运算符号的栈中最顶端的运算符号
{
return*S_char.top;
对两个数计算(含是双目运算符:
如*,/等
doubleoperate(doubley,charc,doublex)〃等)
{
doubler;
if(c=='-')
r=x-y;
elseif(c=='+')
r=x+y;
elseif(c=='/'&&y!
=0)
r=x/y;
elseif(c=='*')
r=x*y;
elseif(c=='A')
{
r=1;
for(inti=1;i<=y;i++)
r*=x;
}
elseif(c=='%')
{
intr0=(int)x%(int)y;
r=double(rO);
}
returnr;
}
{
doubler;
if(cc==Q)
r=sqrt(one);
elseif(cc==C)
r=cos(one);
elseif(cc=='S')
r=sin(one);
elseif(cc==T)
r=tan(one);
elseif(cc=='c')
r=acos(one);
elseif(cc=='s')
r=asin(one);
elseif(cc=='t')
r=atan(one);
returnr;
}
求对数的值
doubleoperate_L(doublea,doubleb,chardian)〃{
doubler=log(b)/log(a);
returnr;
}
doublecompute()//对整个表达式的计算
{
charc;//表示运算符号
intp=0;//用于shu[++p],先初始化
inti,j;
init();//进行初始化
push_char('\n');
line[strlen(line)]='\n:
line[strlen(line)+1]='\0:
if(biao)
push_num(dai_result);〃把运算的结果先进栈,在这个结果的基础上继续进行运
算
biao=0;
for(i=0;line[i]!
='\0';)〃把表达式中的数字字符串转化成可计算的数字
{
intflag=0;
intflag1=1;//标记是否是运算符号
//intflag2=1;//标记是否出现'_';
doubleh=0;
intge;//位数
intbiao_dian=0;//是否是小数的类型
while
(1)
{
flag1=1;
for(j=0;j<=16;j++)
{
if(line[i]==fu[j])
{
flag1=0;
break;
if(line[i]=='_')
{
break;
}
if(line[i]=='.')
{
i++;
ge=0;
biao_dian=1;
}
if(line[i]==P)
{
shu[++p]=pi;
i++;
break;
}
if(line[i]=='E')
{
shu[++p]=e;
break;
if(flag1)
{
h=h*10+(line[i]-'0');
flag=1;
i++;
if(biao_dian)
ge++;
}
else
break;
}
if(flag)
{
if(biao_dian)
{
intr=1;
for(intk=1;k<=ge;k++)r*=10;
h/=r;
shu[++p]=h;〃把转化而来的数字存于数组
if(line[i]=='+')
shu[++p]=-1;
elseif(line[i]=='-')
shu[++p]=-2;
elseif(line[i]=='*')
shu[++p]=-3;
elseif(line[i]=='/')
shu[++p]=-4;
elseif(line[i]=='%')
shu[++p]=-5;
elseif(line[i]=='A')
shu[++p]=-6;
elseif(line[i]==Q)
shu[++p]=-7;
elseif(line[i]=='L')
shu[++p]=-8;
elseif(line[i]==C)
shu[++p]=-9;
elseif(line[i]=='S')
shu[++p]=-10;
elseif(line[i]==T)
shu[++p]=-11;
elseif(line[i]=='c')
shu[++p]=-12;
elseif(line[i]=='s')
shu[++p]=-13;
elseif(line[i]=='t')
shu[++p]=-14;
elseif(line[i]=='(')
shu[++p]=-15;
elseif(line[i]==')')
shu[++p]=-16;
elseif(line[i]=='\n')
shu[++p]=-17;
i++;
}
i=1;
while(shu[i]!
=-17||get_top_char()!
='\n')
{
doublem=shu[i];
if(m>=0){
push_num(m);
i++;
}
else
{
if(m==-1)
c='+';
elseif(m==-2)c='-';
elseif(m==-3)
c
elseif(m==-4)c='/';
elseif(m==-5)c='%';
elseif(m==-6)c='A';
elseif(m==-7)c=Q;
elseif(m==-8)
c='L:
elseif(m==-9)
c=C;
elseif(m==-10)
c='S';
elseif(m==-11)
c=T;
elseif(m==-12)
c='c';
elseif(m==-13)
c='s';
elseif(m==-14)
c='t';
elseif(m==-15)
c='(';
elseif(m==-16)
c=')';
elseif(m==-17)
c='\n';
charch=get_top_char();〃得到最顶端运算符号
if(compare[ch]push_char(c);
i++;
}
elseif(ch=='('&&c==')')
{
pop_char();
i++;
}
elseif(compare[ch]>=compare[c]&&ch!
='('&&ch!
='\n')
{
if(ch==Q||ch==C||ch=='S'||ch==T
||ch=='c'||ch=='s'||ch=='t')
{
doubleone=pop_num();
chardian=pop_char();
push_num(operate.one(one,dian));
}
elseif(ch=='L')
{
doubleone_L=pop_num();
doubletwo_L=pop_num();
chardian=pop_char();
push_num(operate_L(two_L,one_L,dian));
}else
{
doublex=pop_num();
doubley=pop_num();
chardian=pop_char();
if(dian=='/'&&x==0)//判断是否除了
{
"<cout<<"由于您除了零,结果将是错误的
}
次计算的结果入栈
push_num(operate(x,dian,y));〃把进行一
}
}
else
{
push_char(c);
i++;
}
}
}
doubleresult=pop_num();//得至U结果
returnresult;
intcheck_kuohao()〃检查表达式括号是否匹配
inti,f=0;
intkuo[SIZE],key=1;
memset(kuo,0,sizeof(kuo));for(i=0;line[i]!
='\0:
i++){
if(line[i]=='(')
kuo[++f]=1;
elseif(line[i]==')')
{
if(kuo[f]==1)
{
kuo[f]=0;
f--;
}
elsekey=0;break;
}
}
}
if(key&&f==0)
return1;
else
return0;
}
intcheck_char()〃检查运算符号是否合法(如:
1+*4)
{
inti,ge;
for(i=0;line[i]!
='\0';)
{
ge=0;
while(line[i]==
='+'||line[i]==
'-'||line[i]==
1*1
IIline[i]=
='/'||line[i]==
'%'||line[i]=
='A'
IIline[i]=
=Q||line[i]=:
='L'||line[i]=
='S
||line[i]=
=C||line[i]=
=T||line[i]=
='s'
||line[i]=='c'||line[i]=='t')
{
ge++;
i++;
}
i++;
}
if(ge>=3)
return0;
else
return1;
}
voidoutput(doubleresult)//打出结果
{
printf(”所得结果是:
”);cout<}
voidcheck()〃检查表达式是否合法
{
voidintroduce();
charcc;〃决定计算器按哪种功能进行计算
doubleresult;//结果
voidinput();〃定义
if(check_kuohao()&&check_char())//看是否合法,合法则计算
{
result=compute();
output(result);
cout<<"输入一个字符'M'或D或'F',决定是否继续:
"<while(cin>>cc)
{
if(cc=='M')
{
system("cls");
introduce();
printf("您上次所得结果为:
”);
cout<cout<<"在上次计算结果的基础上,请继续输入想计算的表达式
"<dai_result=result;
biao=1;
input();〃输入表达式
break;
}
elseif(cc=='D')
{
system("cls");
introduce();
cout<<"计算器已清零,请输入您所要计算的表达式"<input();〃输入表达式
break;
}
elseif(cc=='F')
{
system("cls");
cout<<"计算器关闭,谢谢使用!
"<break;
}
else
{
cout<<"所输入字符无效,请输入一个字符'M'或D或'F'!
"<}
}
else//不合法,分两种不合法
{
if(check_kuohao()==0&&check_char()==1)
{
cout<<"您所输入的表达式括号不匹配,请重新输入:
"<input();〃输入表达式
}
else
{
cout<<"您所输入的表达式不合法,请重新输入:
"<input();〃输入表达式
}
}
}
voidtackle_fuhao()〃处理负号
node*root,*head,*p,*q,*p1;
root=head=newnode;
head->next=NULL;
inti;
for(i=0;line[i]!
='\0:
i++)〃建立链表
{
p=newnode;
p->data=line[i];
p->next=head->next;
head->next=p;
head=p;
}
//deletep;
q=(node*)malloc(sizeof(node));
head=root;
处理第一个字符
if(root->next->data=='+'||root->next->data=='-')//
{
p=newnode;
p->data='O';
p->next=head->next;
head->next=p;
}
if(root->next!
=NULL)
{
for(q=root->next;q;q=q->next)
if(q->data=='('&&(q_>next->data=='-'||q_>next->data=='+')){
p=newnode;
p->data='O';
p_>next=q_>next;
q_>next=p;
}
}
}
//deleteq;
pl=newnode;
intqi=-1;
for(p1=root->next;p1;pl=p1->next)
{
line[++qi]=p1->data;
}
line[++qi]='\0';
}
voidinput()〃输入
{
cin>>line;
if(biao==0)
tackle_fuhao();〃处理负号
check();〃检查表达式是否合法
voidintroduce()〃对计算器的符号功能的简要介绍
{
cout<<"计算器简要介绍"<cout<<"C(cos)
S(sin)
T(tan)
a(arccos)
c(arcsin)"<cout<<"7
8
9
/on
t(arctan)"<cout<<"4
5
6
*%
L(log)"<cout<<"1
2
3
-M(M+)
Q(sqrt)"<cout<<"0
+
A(乘方)F(off)
Enter(=)"<cout<<"对于对数输入L2_5表示以2为底5的对数"<cout<<"M(在前面结果的基础上继续计算,如:
上次结果为10,现输入
+10.5*2)"<cout«"D(清零并继续输入)"<cout<<"F(计算机关闭)"<cout<<"输入P就代表输入圆周率,输入E代表输入自然对数"<voidprint(){
system("color2");
cout<<"欢迎使用本计算器"<cout<<"输入一个字符串on,计算器开始启动"<}
voidif_start()〃是否启动计算器
{
stringstart;
print();
while(cin>>start)
{
if(start!
="on")
{
:
"<cout<<"您所输入的字符无效,请按照介绍的继续输入
continue;
}
else
break;
if(start=="on")
{
system("color5");//颜色的处理
system("cls");〃刷屏
}
"<introduce();//对计算器的简要介绍
cout<<"现在,请输入您所要计算的表达式input();〃输入所要计算的表达式
}
intmain()
{
if_start();//调用是否启动计算器函数
return0;
}