您的位置:首页 > 其它

简易计算器

2016-03-10 23:17 211 查看
/*#include <stdio.h>
#include <stdlib.h>
#include <math.h>
char *xpr;//expression
int level(char ch){
    if(ch == ')') return 0;
    if(ch == '+' || ch == '-') return 1;
    if(ch == '*' || ch == '/') return 2;
    if(ch == '(') return 4;
    return 0;
}
double calc(int lim){// priority_level_limit
    double ret = 0;
    while(xpr){
        if(*xpr >= '0' && *xpr <='9')ret = ret*10.0 + (double)(*xpr++ - '0');
        else if(level(*xpr) <= lim) return ret;//小于等于前一个运算的优先级,return使得前一个运算先进行
        else if(*xpr == '(') xpr++, ret = calc(0), xpr++;//0代表无限制,除非遇到)否则一直计算结果
        else if(*xpr == '+') xpr++, ret += calc(1);//除非遇到小于等于1的运算,否则后面的先算
        else if(*xpr == '-') xpr++, ret -= calc(1);
        else if(*xpr == '*') xpr++, ret *= calc(2);
        else if(*xpr == '/') xpr++, ret /= calc(2);
    }
    return ret;
}

int main(){
    xpr = (char*)malloc(sizeof(char)*1000);
    scanf("%s",xpr);
    printf("%.2f\n",calc(0));
    return 0;
}
 */

//
cal的递归使用,利用了当运算符运算完毕以后,仍然会留在这个位置

比如式子((3+5)*2)的分析
cal1    (
cal2  (
cal3    3+   * //算出8以后向下扫描,到了*这时候递归到cal5
cal4        5)  //扫描到了),return到cal3,cal3完成运算,得到5,这时候指针指向),故每次遇到(,要注意这样递归的结果需要xpr++来弥补指针的位置的损失
cal5             2) //扫描到了),return2,在cal3中完成。cal3继续扫描,发现到了'0',于是return 到cal2 最后return 到cal1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: