📄 algorithm.c
字号:
#include "stdlib.h" #include "stdio.h" #include "string.h" /*计算表达式,返回计算结果*/ double bc(char *in,char *ERR) //in; /*输入值,算术表达式*/ //ERR; /*返回信息,计算正确=空;若有错误=具体错误消息*/ { char *s,t[256],cp[256],ep[256],e; int i,j,k,p,q,c,xs,err; double np[256],a,w,f; err=0;*ERR='\0'; strcpy(t,in);s=t; i=0;while((e=*(s+i++))!='\0')if(e=='(' && *(s+i)=='-')*(s+i)=':'; c=0;i=q=0;np[1]=0.0; cp[0]='@'; /*置栈底标志@*/ /*====扫描表达式,压入栈中====*/ while(err==0 && *s!='\0'){ if(*s=='-' && (q==0 || *(s-1)=='('))*s=':'; e=*(s+1); switch(*s){ case '(': if((e<'0'||e>':') && e!='-' && e!='(')err=1; else cp[++c]=*s; break; case ')': if(e!='+'&&e!='-'&&e!='*'&&e!='/'&&e!=')'&&e!='\0')err=1; else { while(cp[c]!='(')ep[i++]=cp[c--]; c--; if(c<0)err=1; }; break; case '+':case '-': if((e<'0'||e>':') && e!='(')err=1; else { while((e=cp[c])=='+'||e=='-'||e=='*'||e=='/')ep[i++]=cp[c--]; cp[++c]=*s; }; break; case '*':case '/': if((e<'0'||e>':') && e!='(')err=1; else { while((e=cp[c])=='*' || e=='/')ep[i++]=cp[c--]; cp[++c]=*s; }; break; case '^': if((e<'0'||e>':') && e!='(')err=1; else { while(cp[c]=='^')ep[i++]=cp[c--]; cp[++c]=*s; }; break; case '.': if((e<'0'||e>':')&&e!='+'&&e!='-'&&e!='*'&&e!='/'&& e!='^'&&e!=')'&&e!='%'&&e!='\0')err=1; else { ep[i++]=*s; if(e<'0'||e>':')ep[i++]='#'; }; break; case '%': /*===百分号===*/ if(e!='+'&&e!='-'&&e!='*'&&e!='/'&&e!='^'&&e!=')'&&e!='\0')err=1; else { ep[i++]=*s; ep[i++]='#'; }; break; case '0':case '1':case '2':case '3': case '4':case '5':case '6':case '7': case '8':case '9': case ':': /*===数字符号===*/ if((e<'0'||e>':') && e!='+'&&e!='-'&&e!='*'&&e!='/'&& e!='^'&&e!=')'&&e!='%'&&e!='.'&&e!='\0')err=1; else { ep[i++]=*s; if((e<'0'||e>':') && e!='%' && e!='.')ep[i++]='#'; }; break; default: /*===非数字符号===*/ err=1; }; s++;q++; }; if(err==1){sprintf(ERR,"表达式错误!");return 0;}; if(ep[i-1]!='#')ep[i++]='#'; /*==置数据项结束标志#====*/ /*====出栈,计算值====*/ while(cp[c]!='@')ep[i++]=cp[c--]; ep[i]='\0'; i=j=0;f=1.0; while((e=ep[i++])!='\0'){ switch(e){ case '0':case '1':case '2':case '3': case '4':case '5':case '6':case '7': case '8':case '9':case '.':case '%':case ':': a=0.0;xs=0;w=1.0; if(e==':'){f=(-1.0);e=ep[i++];}; while(e!='#'){ switch(e){ case '.': xs=1;break; case '%': a/=100;e='#';break; case ':': break; default: if(xs==0)a*=10;else w/=10; a+=(e-'0')*w; }; e=ep[i++]; }; np[++j]=a*f;f=1.0; break; case '+':np[--j]+=np[j+1];break; case '-':np[--j]-=np[j+1];break; case '*':np[--j]*=np[j+1];break; case '/': if(np[j]==0.0){sprintf(ERR,"除数不能为0!");return 0;}; np[--j]/=np[j+1];break; case '^': /*只能是整数次乘方*/ k=(int )np[j--]; a=np[j];np[j]=1.0; if(k>0)for(p=0;p<k;p++)np[j]*=a; else if(k<0)for(p=0;p>k;p--)np[j]/=a; break; }; }; return(np[1]); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -