进击的C语言---------简单的计算器(二)

  本实例与上例的区别在于表达式中有括号。其实每个括号中的内容都可以看作是一个单独的表达式(也可能又带括号),考虑到这一点,我们可以把程序写为递归调用的方式,遇到括号则调用自己计算括号中表达式的值。相应的程序代码如下:
  #include "stdio.h"
  #include "stdlib.h"
  float get_num(char **);
  float calculate(char **);
  int main()
  {char a[80];
   float result;
   char *p;
   clrscr();
   gets(a);
   p = a;
   result = calculate(&p);
   printf("%f\n", result);
   getch();
   return 0;
  }
  
  float calculate(char **p)
  {float result = 0;
   int sign = 1;
   if(**p == '-') {
   sign = -1;
   (*p)++;
   }
   while(**p != 0 && **p != ')' ) {
   float m;
   if(**p == '(' ) {
   (*p)++;
   m = sign*calculate(p); //遇到括号调用自己计算括号中的值
   }
   else
   m = sign*get_num(p);
   while(**p == '*' || **p == '/') {
   if(**p == '*') {
   (*p)++;
   if(**p == '(') {
   (*p)++;
   m *= calculate(p); //遇到括号调用自己计算括号中的值
   }
   else
   m *= get_num(p);
   }
   else {
   int div;
   (*p)++;
   if(**p == '(') {
   (*p)++;
   div = calculate(p); //遇到括号调用自己计算括号中的值
   }
   else
   div = get_num(p);
   if(div == 0) {
   printf("diveide by 0!\n");
   exit(1);
   }
   else
   m /= div;
   }
   }
   if(**p != '+' && **p != '-' && **p != 0 && **p != ')'){
   printf("illege character: %c\n",**p);
   exit(0);
   }
   result += m;
   if(**p == '+') {
   sign = 1;
   (*p)++;
   }
   else
   if(**p == '-' ) {
   sign = -1;
   (*p)++;
   }
   else
   if(**p == ')' ) { //遇到右括号,跳过并退出循环返回结果
   (*p)++;
   break;
   }
   else
   break;
   }
   return result;
  }
  
  float get_num(char **p)
  {float n = 0, m = 10;
   if(**p != '.' && (**p <'0' || **p >'9')) {
   printf("get num error!\n");
   exit(1);
   }
   while(**p >= '0' && **p <= '9') {
   n = n*10 + **p - 48;
   (*p)++;
   }
   if(**p == '.') {
   (*p)++;
   while(**p >= '0' && **p <= '9') {
   n += (**p - 48)/m;
   (*p)++;
   m *= 10;
   }
   }
   return n;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值