大学计算机C++语言计算器源代码.docx
《大学计算机C++语言计算器源代码.docx》由会员分享,可在线阅读,更多相关《大学计算机C++语言计算器源代码.docx(16页珍藏版)》请在冰豆网上搜索。
大学计算机C++语言计算器源代码
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',')','+','-','*',T,'%','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;
}
voidpush_char(charc)//运算符号进栈
{
*++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(r0);
}
returnr;
}
doubleoperate_one(doubleone,charcc)〃对一个数运算(含单目运算符:
如log(L),sin(S)等等){
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;i++;break;
}if(flag1)
{h=h*10+(line[i]-'0');flag=1;i++;
if(biao_dian)ge++;
}elsebreak;
}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);
}else
{
if(m==-
1)
c=
'+';
elseif(m
==-2)
c=
1
J
elseif(m
==-3)
c=
1*1.
J
elseif(m
==-4)
c=
'/';
elseif(m
==-5)
c=
'%';
elseif(m
==-6)
c=
'A';
j
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=