50字范文,内容丰富有趣,生活中的好帮手!
50字范文 > 三角函数算式的c语言表达式 能计算加减乘除表达式 求添加计算平方 三角函数的功能 ...

三角函数算式的c语言表达式 能计算加减乘除表达式 求添加计算平方 三角函数的功能 ...

时间:2019-08-20 19:13:09

相关推荐

三角函数算式的c语言表达式 能计算加减乘除表达式 求添加计算平方 三角函数的功能 ...

能计算加减乘除表达式,求添加计算平方、三角函数的功能,在线等,急

各位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;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。