C语言表达式计算器

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]);
}
文章目录
  1. C语言表达式计算器
    1. 实现功能
    2. 代码
|