C++语言计算器源代码Word文档下载推荐.docx
《C++语言计算器源代码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++语言计算器源代码Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
stack_numS_num;
//定义
stack_charS_char;
charfu[18]={'
\n'
'
)'
+'
-'
*'
/'
%'
^'
'
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;
&
&
y!
=0)
r=x/y;
r=x*y;
{
r=1;
for(inti=1;
=y;
r*=x;
}
intr0=(int)x%(int)y;
r=double(r0);
returnr;
doubleoperate_one(doubleone,charcc)//对一个数运算(含单目运算符:
如log(L),sin(S)等等)
if(cc=='
r=sqrt(one);
elseif(cc=='
r=cos(one);
r=sin(one);
r=tan(one);
r=acos(one);
r=asin(one);
r=atan(one);
doubleoperate_L(doublea,doubleb,chardian)//求对数的值
doubler=log(b)/log(a);
doublecompute()//对整个表达式的计算
charc;
//表示运算符号
intp=0;
//用于shu[++p],先初始化
inti,j;
init();
//进行初始化
push_char('
);
line[strlen(line)]='
;
line[strlen(line)+1]='
\0'
if(biao)
push_num(dai_result);
//把运算的结果先进栈,在这个结果的基础上继续进行运算
biao=0;
for(i=0;
line[i]!
='
)//把表达式中的数字字符串转化成可计算的数字
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;
.'
i++;
ge=0;
biao_dian=1;
P'
shu[++p]=pi;
E'
shu[++p]=e;
if(flag1)
h=h*10+(line[i]-'
0'
flag=1;
if(biao_dian)
ge++;
else
}
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;
shu[++p]=-3;
shu[++p]=-4;
shu[++p]=-5;
shu[++p]=-6;
shu[++p]=-7;
shu[++p]=-8;
shu[++p]=-9;
shu[++p]=-10;
shu[++p]=-11;
shu[++p]=-12;
shu[++p]=-13;
shu[++p]=-14;
shu[++p]=-15;
shu[++p]=-16;
shu[++p]=-17;
i++;
i=1;
while(shu[i]!
=-17||get_top_char()!
doublem=shu[i];
if(m>
push_num(m);
i++;
else
if(m==-1)
c='
elseif(m==-2)
elseif(m==-3)
elseif(m==-4)
elseif(m==-5)
elseif(m==-6)
elseif(m==-7)
elseif(m==-8)
elseif(m==-9)
elseif(m==-10)
elseif(m==-11)
c=