能计算加减乘除表达式,求添加计算平方、三角函数的功能,在线等,急
各位C语言大神,求帮忙,现在代码能计算加减乘除表达式,但是不能计算平方和三角函数,求大神添加功能。
在线等~~~
//EX6_08.CPP
//Aprogramtoimplementacalculator
#include//Forinput/output
#include//Fortheexit()function
#include//Fortheisdigit()function
#include//Forthestrcpy()function
voideatspaces(char*str);//Functiontoeliminateblanks
doubleexpr(char*str);//Functionevaluatinganexpression
doubleterm(char*str,int*pindex);//Functionanalyzingaterm
doublenumber(char*str,int*pindex);//Functiontorecognizeanumber
char*extract(char*str,int*index);//Functiontoextractasubstring
constintMAX=80;//Maximumexpressionlengthincluding'\0'
intmain(void)
{
charbuffer[MAX];//Inputareaforexpressiontobeevaluated
charc;
inti;
printf("Welcometoyourfriendlycalculator.\n");
printf("Enteranexpression,oranemptylinetoquit.\n");
for(;;)
{
i=0;
scanf("%c",&c);//Readaninputline
while(c!='\n')
{
buffer[i++]=c;
scanf("%c",&c);
}
buffer[i]='\0';
eatspaces(buffer);//Removeblanksfrominput
if(!buffer[0])//Emptylineendscalculator
return0;
printf("\t=%f\n\n",expr(buffer));//Outputvalueofexpression
}
}
//Functiontoeliminateblanksfromastring
voideatspaces(char*str)
{
inti=0;//'Copyto'indextostring
intj=0;//'Copyfrom'indextostring
while((*(str+i)=*(str+j++))!='\0')//Loopwhilecharactercopiedisnot\0
if(*(str+i)!='')//Incrementiaslongas
i++;//characterisnotablank
return;
}
//Functiontoevaluateanarithmeticexpression
doubleexpr(char*str)
{
doublevalue=0;//Storeresulthere
intindex=0;//Keepstrackofcurrentcharacterposition
value=term(str,&index);//Getfirstterm
for(;;)//Infiniteloop,allexitsinside
{
switch(*(str+index++))//Chooseactionbasedoncurrentcharacter
{
case'\0'://We'reattheendofthestring
returnvalue;//soreturnwhatwehavegot
case'+'://+foundsoaddinthe
value+=term(str,&index);//nextterm
break;
case'-'://-foundsosubtract
value-=term(str,&index);//thenextterm
break;
default://Ifwereachherethestring
printf("Arrrgh!*#!!There'sanerror.\n");
exit(1);
}
}
}
//Functiontogetthevalueofaterm
doubleterm(char*str,int*pindex)
{
doublevalue=0;//Somewheretoaccumulatetheresult
value=number(str,pindex);//Getthefirstnumberintheterm
//Loopaslongaswehaveagoodoperator
while((*(str+(*pindex))=='*')||(*(str+(*pindex))=='/'))
{
if(*(str+(*pindex))=='*')//Ifit'smultiply,
{
++(*pindex);
value*=number(str,pindex);//multiplybynextnumber
}
if(*(str+(*pindex))=='/')//Ifit'sdivide,
{
++(*pindex);
value/=number(str,pindex);//dividebynextnumber
}
}
returnvalue;//We'vefinished,soreturnwhatwe'vegot
}
//Functiontorecognizeanumberinastring
doublenumber(char*str,int*pindex)
{
doublevalue=0.0;//Storetheresultingvalue
char*psubstr;//Pointerforsubstring
if(*(str+(*pindex))=='(')//Startofparentheses
{
++(*pindex);
psubstr=extract(str,pindex);//Extractsubstringinbrackets
value=expr(psubstr);//Getthevalueofthesubstring
returnvalue;//Returnsubstringvalue
}
while(isdigit(*(str+(*pindex))))//Loopaccumulatingleadingdigits
value=10*value+(*(str+(*pindex)++)-48);
//Notadigitwhenwegettohere
if(*(str+(*pindex))!='.')//socheckfordecimalpoint
returnvalue;//andifnot,returnvalue
doublefactor=1.0;//Factorfordecimalplaces
while(isdigit(*(str+(++(*pindex)))))//Loopaslongaswehavedigits
{
factor*=0.1;//Decreasefactorbyfactorof10
value=value+(*(str+(*pindex))-48)*factor;//Adddecimalplace
}
returnvalue;//Onloopexitwearedone
}
//Functiontoextractasubstringbetweenparentheses
//(requiresstring.h)
char*extract(char*str,int*pindex)
{
charbuffer[MAX];//Temporaryspaceforsubstring
char*pstr=NULL;//Pointertonewstringforreturn
intnumL=0;//Countofleftparenthesesfound
intbufindex=*pindex;//Savestartingvalueforindex
do
{
buffer[(*pindex)-bufindex]=*(str+(*pindex));
switch(buffer[(*pindex)-bufindex])
{
case')':
if(numL==0)
{
buffer[(*pindex)-bufindex]='\0';//Replace')'with'\0'
++(*pindex);
pstr=(char*)malloc((*pindex)-bufindex+1);
if(!pstr)
{
printf("Memoryallocationfailed,programterminated.");
exit(1);
}
strcpy(pstr,buffer);//Copysubstringtonewmemory
returnpstr;//Returnsubstringinnewmemory
}
else
numL--;//Reducecountof'('tobematched
break;
case'(':
numL++;//Increasecountof'('tobe//matched
break;
}
}while(*(str+(*pindex)++)!='\0');//Loop-don'toverrunendofstring
printf("Ranofftheendoftheexpression,mustbebadinput.\n");
exit(1);
}
------解决思路----------------------
仅供参考:/*---------------------------------------
函数型计算器(VC++6.0,Win32Console)程序由yu_hua于-07-27设计完成
功能:
目前提供了10多个常用数学函数:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数∧
用法:
如果要求2的32次幂,可以打入2^32
如果要求30度角的正切可键入tan(Pi/6)
注意不能打入:tan(30)
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)
sin1.23
sin1.23
如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2或sin1.23^2+cos1.23^2
此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。
本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2实际上相当于:2+(3*(4*4))
另外函数名前面如果是数字,那么自动认为二者相乘.
同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。
如:3sin1.2^2+5cos2.1^2相当于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5相当于4*(3-2*(√5-1)+loge(2))+log10(5)
此外,本计算器提供了圆周率Pi键入字母时不区分大小写,以方便使用。
----------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
constcharTab=0x9;
constintDIGIT=1;
constintMAXLEN=16384;
chars[MAXLEN],*endss;
intpcs=15;
doublefun(doublex,charop[],int*iop){
while(op[*iop-1]<32)//本行使得函数嵌套调用时不必加括号,如arcsin(sin(1.234))只需键入arcsinsin1.234
switch(op[*iop-1]){
case7:x=sin(x);(*iop)--;break;
case8:x=cos(x);(*iop)--;break;
case9:x=tan(x);(*iop)--;break;
case10:x=sqrt(x);(*iop)--;break;
case11:x=asin(x);(*iop)--;break;
case12:x=acos(x);(*iop)--;break;
case13:x=atan(x);(*iop)--;break;
case14:x=log10(x);(*iop)--;break;
case15:x=log(x);(*iop)--;break;
case16:x=exp(x);(*iop)--;break;
}
returnx;
}
doublecalc(char*expr,char**addr){
staticintdeep;//递归深度
staticchar*fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};
doubleST[10]={0.0};//数字栈
charop[10]={'+'};//运算符栈
charc,*rexp,*pp,*pf;
intist=1,iop=1,last,i;
if(!deep){
pp=pf=expr;
do{
c=*pp++;
if(c!=''&&c!=Tab)
*pf++=c;
}while(c!='\0');
}
pp=expr;
if((c=*pp)=='-'
------解决思路----------------------
c=='+'){
op[0]=c;
pp++;
}
last=!DIGIT;
while((c=*pp)!='\0'){
if(c=='('){//左圆括弧
deep++;
ST[ist++]=calc(++pp,addr);
deep--;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp=*addr;
last=DIGIT;
if(*pp=='('
------解决思路----------------------
isalpha(*pp)&&strnicmp(pp,"Pi",2)){//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法
op[iop++]='*';
last=!DIGIT;
c=op[--iop];
gotooperate;
}
}
elseif(c==')'){//右圆括弧
pp++;
break;
}elseif(isalpha(c)){
if(!strnicmp(pp,"Pi",2)){
if(last==DIGIT){
cout<
}
ST[ist++]=3.14159265358979323846264338328;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp+=2;
last=DIGIT;
if(!strnicmp(pp,"Pi",2)){
cout<
}
if(*pp=='('){
cout<
}
}else{
for(i=0;(pf=fname[i])!=NULL;i++)
if(!strnicmp(pp,pf,strlen(pf)))break;
if(pf!=NULL){
op[iop++]=07+i;
pp+=strlen(pf);
}else{
cout<
}
}
}elseif(c=='+'
------解决思路----------------------
c=='-'
------解决思路----------------------
c=='*'
------解决思路----------------------
c=='/'
------解决思路----------------------
c=='%'
------解决思路----------------------
c=='^'){
charcc;
if(last!=DIGIT){
cout<
}
pp++;
if(c=='+'
------解决思路----------------------
c=='-'){
do{
cc=op[--iop];
--ist;
switch(cc){
case'+':ST[ist-1]+=ST[ist];break;
case'-':ST[ist-1]-=ST[ist];break;
case'*':ST[ist-1]*=ST[ist];break;
case'/':ST[ist-1]/=ST[ist];break;
case'%':ST[ist-1]=fmod(ST[ist-1],ST[ist]);break;
case'^':ST[ist-1]=pow(ST[ist-1],ST[ist]);break;
}
}while(iop);
op[iop++]=c;
}elseif(c=='*'
------解决思路----------------------
c=='/'
------解决思路----------------------
c=='%'){
operate:cc=op[iop-1];
if(cc=='+'
------解决思路----------------------
cc=='-'){
op[iop++]=c;
}else{
--ist;
op[iop-1]=c;
switch(cc){
case'*':ST[ist-1]*=ST[ist];break;
case'/':ST[ist-1]/=ST[ist];break;
case'%':ST[ist-1]=fmod(ST[ist-1],ST[ist]);break;
case'^':ST[ist-1]=pow(ST[ist-1],ST[ist]);break;
}
}
}else{
cc=op[iop-1];
if(cc=='^'){
cout<
}
op[iop++]=c;
}
last=!DIGIT;
}else{
if(last==DIGIT){
cout<
}
ST[ist++]=strtod(pp,&rexp);
ST[ist-1]=fun(ST[ist-1],op,&iop);
if(pp==rexp){
cout<
}
pp=rexp;
last=DIGIT;
if(*pp=='('
------解决思路----------------------
isalpha(*pp)){
op[iop++]='*';
last=!DIGIT;
c=op[--iop];
gotooperate;
}
}
}
*addr=pp;
if(iop>=ist){
cout<
}
while(iop){
--ist;
switch(op[--iop]){
case'+':ST[ist-1]+=ST[ist];break;
case'-':ST[ist-1]-=ST[ist];break;
case'*':ST[ist-1]*=ST[ist];break;
case'/':ST[ist-1]/=ST[ist];break;
case'%':ST[ist-1]=fmod(ST[ist-1],ST[ist]);break;
case'^':ST[ist-1]=pow(ST[ist-1],ST[ist]);break;
}
}
returnST[0];
}
intmain(intargc,char**argv){
inta;
if(argc<2){
if(GetConsoleOutputCP()!=936)system("chcp936>NUL");//中文代码页
cout<
while(1){
cout<
gets(s);
if(s[0]==0)break;//
cout<
cout<
}
}elseif(argc==2&&0==strcmp(argv[1],"/?")){
if(GetConsoleOutputCP()!=936)system("chcp936>NUL");//中文代码页
cout<
}else{
strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;
if(argc>2){
for(a=2;a
if(1==sscanf(argv[a],".%d",&pcs)&&0<=pcs&&pcs<=15){//最后一个参数是.0~.15表示将计算结果保留小数0~15位
printf("%.*lf\n",pcs,calc(s,&endss));
}else{
strncat(s,argv[a],MAXLEN-1);
printf("%.15lg\n",calc(s,&endss));
}
}else{
printf("%.15lg\n",calc(s,&endss));
}
}
return0;
}