简单四则运算

来源:互联网 发布:修改字体软件 编辑:程序博客网 时间:2024/06/09 23:54
问题描述: 
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
要求实现函数: 
int calculate(int len,char *expStr)
输入:int len:字符串长度;char* expStr:表达式字符串;
输出:无

返回:计算结果


C代码如下:

[cpp] view plaincopy
  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.     scanf("%s",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. }  

几组测试用例如下:



0 0
原创粉丝点击