C语言计算器源代码.docx
C++语言编写。。#includeiostream#includecmath#includestringusingnamespacestd;
constdoublepi=3constdoublee=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,),+,-,*,/,%,^,
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==^)
{
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],先初始化int