`
龙宝宝吱吱
  • 浏览: 3134 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

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;
  }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics