C语言表达式计算器
实现功能
支持浮点数的+,-,*,/,%(求余)
支持常见的初等函数运算
abs,sgn,ln,lg,log,sin,cos,tan,cot,sec,csc,asin,acos,atan,acot,asec,acsc,exp,sinh,cosh,tanh,coth,sech,csch,asinh,acosh,atanh,acoth,asech,acsch,max,min,ceil,floor,pow,fac,gcd,lcm
支持嵌套任意层数的括号
代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#define PI 3.1415926
#define MAX 2
#define FUNCNUM 38
typedef struct Data{//使用该数据结构主要为了函数的多个参数
int n;//数据个数
double num[MAX];
}Data;
char *p;
double (*FuncArray[FUNCNUM])(Data d);//函数指针数组,存放各个数学函数的指针
char FuncNameArray[FUNCNUM][20]={"abs","sgn","ln","lg","log","sin","cos","tan","cot","sec","csc",\
"asin","acos","atan","acot","asec","acsc","exp","sinh","cosh","tanh","coth","sech","csch",\
"asinh","acosh","atanh","acoth","asech","acsch","max","min","ceil","floor","pow","fac",\
"gcd","lcm"};
//----------------------------
Data Expression(char **p);
double term(char **p);
double factor(char **p);
double GetNumber(char **p,double *res);
double Function(char **p);
//----------------------------
double D_sin(Data d){
return sin(d.num[0]);
}
double D_cos(Data d){
return cos(d.num[0]);
}
double D_tan(Data d){
return tan(d.num[0]);
}
double D_cot(Data d){
return 1/tan(d.num[0]);
}
double D_sec(Data d){
return 1/cos(d.num[0]);
}
double D_csc(Data d){
return 1/sin(d.num[0]);
}
double D_asin(Data d){
return asin(d.num[0]);
}
double D_acos(Data d){
return acos(d.num[0]);
}
double D_atan(Data d){
return atan(d.num[0]);
}
double D_acot(Data d){
return PI/2-atan(d.num[0]);
}
double D_asec(Data d){
return acos(1/d.num[0]);
}
double D_acsc(Data d){
return asin(1/d.num[0]);
}
double D_exp(Data d){
return exp(d.num[0]);
}
double D_sinh(Data d){
return sinh(d.num[0]);
}
double D_cosh(Data d){
return cosh(d.num[0]);
}
double D_tanh(Data d){
return tanh(d.num[0]);
}
double D_coth(Data d){
return 1/tanh(d.num[0]);
}
double D_sech(Data d){
return 1/cosh(d.num[0]);
}
double D_csch(Data d){
return 1/sinh(d.num[0]);
}
double D_asinh(Data d){
return asinh(d.num[0]);
}
double D_acosh(Data d){
return acosh(d.num[0]);
}
double D_atanh(Data d){
return atanh(d.num[0]);
}
double D_acoth(Data d){
return log((d.num[0]+1)/(d.num[0]-1))/2;
}
double D_asech(Data d){
return log(1/d.num[0]+sqrt(1/d.num[0]+1)*sqrt(1/d.num[0]-1));
}
double D_acsch(Data d){
return log(1/d.num[0]+sqrt(1/(d.num[0]*d.num[0])+1));
}
double D_ln(Data d){//e为底
return log(d.num[0]);
}
double D_lg(Data d){//10为底
return log10(d.num[0]);
}
double D_log(Data d){//任意底,第一个为真数,第二个为底数
return log(d.num[0])/log(d.num[1]);
}
double D_max(Data d){
return d.num[0]>d.num[1]?d.num[0]:d.num[1];
}
double D_min(Data d){
return d.num[0]>d.num[1]?d.num[1]:d.num[0];
}
double D_ceil(Data d){
return (double)ceil(d.num[0]);
}
double D_floor(Data d){
return (double)floor(d.num[0]);
}
double D_pow(Data d){
return pow(d.num[0],d.num[1]);
}
double D_fac(Data d){//阶乘
int res=1,i,n=(int)d.num[0];
if(n<=0) return 1;
for(i=1;i<=n;i++) res*=i;
return res;
}
double D_gcd(Data d){//最大公约数 (Greatest Common Divisor)
int a=d.num[0],b=d.num[1],r=0;
while(b){
r=a%b;
a=b;
b=r;
}
return (double)a;
}
double D_lcm(Data d){//最小公倍数 (Least Common Multiple)
int a=d.num[0],b=d.num[1],r=0;
while(b){
r=a%b;
a=b;
b=r;
}
return (double)((int)(d.num[0])*(int)(d.num[1])/a);
}
double D_abs(Data d){
return fabs(d.num[0]);
}
double D_sgn(Data d){
if(d.num[0]) return d.num[0]>0?1:-1;
else return 0;
}
void initialize(){
int i=0;
FuncArray[i++]=D_abs;
FuncArray[i++]=D_sgn;
FuncArray[i++]=D_ln;
FuncArray[i++]=D_lg;
FuncArray[i++]=D_log;
FuncArray[i++]=D_sin;
FuncArray[i++]=D_cos;
FuncArray[i++]=D_tan;
FuncArray[i++]=D_cot;
FuncArray[i++]=D_sec;
FuncArray[i++]=D_csc;
FuncArray[i++]=D_asin;
FuncArray[i++]=D_acos;
FuncArray[i++]=D_atan;
FuncArray[i++]=D_acot;
FuncArray[i++]=D_asec;
FuncArray[i++]=D_acsc;
FuncArray[i++]=D_exp;
FuncArray[i++]=D_sinh;
FuncArray[i++]=D_cosh;
FuncArray[i++]=D_tanh;
FuncArray[i++]=D_coth;
FuncArray[i++]=D_sech;
FuncArray[i++]=D_csch;
FuncArray[i++]=D_asinh;
FuncArray[i++]=D_acosh;
FuncArray[i++]=D_atanh;
FuncArray[i++]=D_acoth;
FuncArray[i++]=D_asech;
FuncArray[i++]=D_acsch;
FuncArray[i++]=D_max;
FuncArray[i++]=D_min;
FuncArray[i++]=D_ceil;
FuncArray[i++]=D_floor;
FuncArray[i++]=D_pow;
FuncArray[i++]=D_fac;
FuncArray[i++]=D_gcd;
FuncArray[i++]=D_lcm;
}
Data Expression(char **p){//处理加减和逗号
//指针的指针,这样函数中传递时可以改变指针的值
Data result;
result.n=0;
result.num[0]=term(p);
int more=1;
while(more){
char op=**p;
if(op=='+' || op=='-'){
(*p)++;
double value=term(p);
if(op=='+') result.num[result.n]+=value;
else result.num[result.n]-=value;
}
else if(op==','){
(*p)++;
result.n++;
result.num[result.n]=term(p);
}
else more=0;
}
return result;
}
double term(char **p){//处理乘除求余
double result=factor(p);
int more=1;
while(more){
char op=**p;
if(op=='*' || op=='/' || op=='%'){
(*p)++;
double value=factor(p);
if(op=='*') result*=value;
else if(op=='/') result/=value;
else if(op=='%') result=(int)result%(int)value;
}
else more=0;
}
return result;
}
double factor(char **p){//除了数字和函数和括号
double result=0;
char c=**p;
if(c=='('){
(*p)++;
Data tmp=Expression(p);
result=tmp.num[0];
(*p)++;//跳过')'
return result;
}
else{
if(GetNumber(p,&result)) return result;
else return Function(p);
}
}
double GetNumber(char **p,double *res){
int sign=1;
if(!isdigit(**p)){
if(**p=='-') sign=-1;
else return 0;
}
*res=0;
while(isdigit(**p)){
*res=*res*10+**p-'0';
(*p)++;
}
if(**p=='.'){
(*p)++;
double k=0.1;
while(isdigit(**p)){
*res=*res+(**p-'0')*k;
(*p)++;
k/=10;
}
}
*res*=sign;
return 1;
}
double Function(char **p){
char funcname[20];
int i=0;
double result=0;
while(**p!='(')
funcname[i++]=*((*p)++);
(*p)++;//跳过'('
funcname[i]=0;//字符串结束
//printf("%s\n",funcname);
for(i=0;i<FUNCNUM;i++){
if(strcmp(funcname,FuncNameArray[i])==0){//匹配函数
Data tmp=Expression(p);
result=FuncArray[i](tmp);
(*p)++;//跳过')'
//printf("%lf,%lf,%s,%lf\n",tmp.num[0],tmp.num[1],FuncNameArray[i],result);
return result;
}
}
return 0;
}
int main(){
char s[100];
scanf("%s",s);
initialize();
p=s;
//printf("%s\n",p);
Data tmp=Expression(&p);
printf("%.12lf",tmp.num[0]);
}