简单的四则运算

问题叙述性说明: 

输入区区四个简单的算术表达式,包括一个数字串,表达式的计算值
注意: 1、只包含表达式 +, -, *, / 四家运营商,不包括括号
2、表达式数值仅仅包括个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。

比方8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,当中仅仅包含数字字符和四则运算符字符,除此之外不含其他不论什么字符。不会出现计算溢出情况
• 要求实现函数: 
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度。
char *expStr: 表达式字符串。
【输出】 无
【返回】 计算结果

• 演示样例 
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6 

C代码例如以下:

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<string.h>  
  4. #include<ctype.h>//包括isdigit函数  
  5.   
  6. #define MAX 100  
  7.   
  8. int calculate(int len, char* expStr);  
  9.   
  10. int main()  
  11. {  
  12.     char *str = (char*)malloc(2*MAX*sizeof(char));  
  13.     int len;  
  14.     printf("please input the expr:");  
  15.     gets(str);   
  16.     len = strlen(str);  
  17.     printf("after calculation, the result is: %d\n", calculate(len,str));  
  18.     return 0;  
  19. }  
  20.   
  21. int calculate(int len, char* expStr)  
  22. {  
  23.     char operation[MAX];  
  24.     int number[MAX];  
  25.     int op_index = 0;  
  26.     int num_index = 0;  
  27.     int i;  
  28.     for(i=0; i<len; i++)  
  29.     {  
  30.         if(isdigit(*(expStr+i)))//假设是数字,则进入数字数组  
  31.         {  
  32.             number[num_index] = *(expStr+i) - '0';  
  33.             num_index++;  
  34.             continue;  
  35.   
  36.         }  
  37.         if(*(expStr+i) == '*')//假设是乘法,能够先计算出其左右两数之乘积  
  38.         {  
  39.             number[num_index-1] *= (*(expStr+i+1)-'0');  
  40.             i++;//由于已经将乘号右边的数取出来了  
  41.             continue;  
  42.         }  
  43.         if(*(expStr+i) == '/')//假设是除法,能够先计算其左右两数之商  
  44.         {  
  45.             if(*(expStr+i+1) == '0')  
  46.             {  
  47.                 printf("Error: 0 can not be the divisor!\n");  
  48.                 exit(1);  
  49.             }  
  50.             else  
  51.             {  
  52.                 number[num_index-1] /= (*(expStr+i+1)-'0');  
  53.                 i++;//由于已经将除号右边的数取出来了  
  54.                 continue;  
  55.             }  
  56.         }  
  57.         if(*(expStr+i) == '+' || *(expStr+i) == '-')//对于加减法,则须要进入符号数组  
  58.         {  
  59.             operation[op_index] = *(expStr+i);  
  60.             op_index++;  
  61.             continue;  
  62.         }  
  63.     }  
  64.     /* 
  65.     假设符号数组中有n个符号,则数字数组中一定有n+1个数字, 
  66.     而且假设一个符号在符号数组中的索引为i, 
  67.     则该符号相应的第二个操作数一定在数字数组中的第i+1个位置。 
  68.     */  
  69.     for(i=0; i<op_index; i++)  
  70.     {         
  71.         if(operation[i] == '+')  
  72.         {  
  73.             number[0] += number[i+1];  
  74.             continue;  
  75.   
  76.         }  
  77.         else  
  78.         {  
  79.             number[0] -= number[i+1];  
  80.             continue;  
  81.         }  
  82.     }  
  83.     return number[0];  
  84. }  

版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-16 19:27  mengfanrong  阅读(358)  评论(0编辑  收藏  举报