地表最强命令行函数表达式计算器C源代码

#pragma warning(disable:4996)
#define _INTEGRAL_MAX_BITS 64
/*---------------------------------------
函数型计算器(VC++2010,Win32 Console)
功能:
目前提供了10多个常用数学函数:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数^
⑿向上取整ceil
⒀向下取整floor
⒁四舍五入取整round
⒂取符号sign
⒃取绝对值abs
⒄度转弧度d2r
⒅弧度转度r2d
用法:
如果要求2的32次幂,可以打入2^32<回车>
如果要求30度角的正切可键入tan(d2r(30))<回车>
注意不能打入:tan(30)
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)
sin 1.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键入字母时不区分大小写,以方便使用。
16进制整数以0x或0X开头,2进制整数以0b或0B开头,8进制整数以0o或0O开头,且可以包含下划线间隔。
----------------------------------------*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//#include 
const char Tab = 0x9;
const int  DIGIT = 1;
#define MAXLEN 65536
#define STACKSIZE 50
char s[MAXLEN],t[MAXLEN], *endss;
char gap[MAXLEN];
int pcs = 15;
int fmt;//0-正常|1-半角逗号每3位间隔整数部分|2-下划线每4位间隔整数部分
FILE *fp;
double sign(double dVal) {
         if (dVal>0.0) return  1.0;
    else if (dVal<0.0) return -1.0;
    else               return  0.0;
}
double round(double dVal, short iPlaces) {//iPlaces>=0
    char tmp[30];
    double dRetval;

    sprintf(tmp, "%.*lf", iPlaces, dVal);
    sscanf(tmp, "%lf", &dRetval);
    return (dRetval);
}
double fun(double x, char op[STACKSIZE], char ops[STACKSIZE][5], int *iop) {
    char lar,lr;
    int ss,ee,nn,sh;
    char c;
    int i,j;
    __int64 result;
    char *e;
    char b[64+1];


    while (op[*iop - 1]<32) //本行使得函数嵌套调用时不必加括号,如 arcsin(sin(1.234)) 只需键入arcsin sin 1.234
        switch (op[*iop - 1]) {
        case  7: x = sin(x);    (*iop)--; break;
        case  8: x = cos(x);    (*iop)--; break;
        case  9: x = tan(x);    (*iop)--; break;
        case 10: x = sqrt(x);   (*iop)--; break;
        case 11: x = asin(x);   (*iop)--; break;
        case 12: x = acos(x);   (*iop)--; break;
        case 13: x = atan(x);   (*iop)--; break;
        case 14: x = log10(x);  (*iop)--; break;
        case 15: x = log(x);    (*iop)--; break;
        case 16: x = exp(x);    (*iop)--; break;
        case 17: x = ceil(x);   (*iop)--; break;
        case 18: x = floor(x);  (*iop)--; break;
        case 19: x = round(x,0);(*iop)--; break;
        case 20: x = sign(x);   (*iop)--; break;
        case 21: x = fabs(x);   (*iop)--; break;
        case 22: x = x*3.14159265358979323846264338328/180.0;   (*iop)--; break;
        case 23: x = x/3.14159265358979323846264338328*180.0;   (*iop)--; break;
        case 24://shift{l|a|r}{l|r}{ss}{ee|lnn}{sh}
            lar=ops[*iop - 1][0];// {l|a|r} Logic|Arithmetic|Rotate
            lr =ops[*iop - 1][1];// {l|r}   Left|Right
            ss =ops[*iop - 1][2];// {ss}    start_bit
            nn =ops[*iop - 1][3];// {nn}    n_bits
            sh =ops[*iop - 1][4];// {sh}    shift_bits
            ee =ss+nn-1;
            result=(__int64)x;
            _i64toa(result,b,2);
            sprintf(t,"%064s",b);
            switch (lar) {
            case 'l':
                switch (lr) {
                case 'l'://Logic Left Shift ss Lnn sh
                    //d63..ee   ==ss   ..d00
                    //t00..63-ee==63-ss..t63
                    for (j=0;j=STACKSIZE-1) {
        fprintf(fp,"表达式太复杂导致内部堆栈溢出\n");
        if (fp!=stdout) fclose(fp);
        exit(10);
    }
}
void prompt(__int64 result) {
    int L;

    L=sprintf(t,"%I64x", result);
    if (L>13 && strncmp(t,"fff",3)) fprintf(stderr,"注意:超过13位十六进制的计算结果可能是不准确的!\n");
}
double calc(char *expr, char **addr) {
    static int deep; //递归深度
    static char *fname[] = { "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round","sign","abs","d2r","r2d",NULL };
    double ST[STACKSIZE

你可能感兴趣的:(地表最强命令行函数表达式计算器C源代码)