简易计算器
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
#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
相关文章推荐
- 如何调用EcStore中的API接口
- 如何调用EcStore中的API接口
- 最大匹配问题 POJ 1274
- JavaScript中Date类的getMonth方法的返回值比实际月份少一的原因之我见
- Easy UI bug:iframe中请求页面而session失效时页面跳转问题
- 堆和栈的区别 (转贴)
- 对引用和指针使用以及函数返回引用和指针类型的理解
- html5
- CSS中可代替cellpadding和cellspacing的属性
- 【考研数学】:函数的间断点分析
- HTML5新特性
- 如何调用EcStore中的API接口
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory Android
- mysql与php之链接数据库
- 杭电oj 2003 求绝对值
- 进程间通信方式
- Python学习笔记(1)——Linux环境
- WinForm窗体继承自定义的模板窗体出错
- SpringMVC的几种返回方式
- CSS重新认识(一)