简单四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注: 1、表达式只含 +, -, *, / 四则运算符,不含括号

2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况

3、要考虑加减乘除按通常四则运算规定的计算优先级

4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

要求实现函数: int calculate(int len,char *expStr)

代码1:有漏洞:运算结果的中间值最大只能为79(79+48(‘0’)=127为最大的ASCII值)

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int calculate(int len,char *expStr)
 5 {
 6     int i,j;
 7     char temp;
 8 
 9     for(i=0;i<len;)
10     {
11         if((expStr[i] == '*')||(expStr[i] == '/'))
12         {
13             if(expStr[i] == '*')
14             {
15                 temp = (expStr[i-1]-'0') * (expStr[i+1]-'0') + '0';
16             }
17             else if(expStr[i] == '/')
18             {
19                 temp = (expStr[i-1]-'0') / (expStr[i+1]-'0') + '0';
20             }
21             expStr[i-1] = temp;
22             for(j=i+2;j<=len;j++)
23             {
24                 expStr[j-2] = expStr[j];
25             }
26             len -= 2;
27         }
28         else
29         {
30             i++;
31         }
32     }
33 
34     for(i=0;i<len;)
35     {
36         if((expStr[i] == '+')||(expStr[i] == '-'))
37         {
38             if(expStr[i] == '+')
39             {
40                 temp = (expStr[i-1]-'0') + (expStr[i+1]-'0') + '0';
41             }
42             else if(expStr[i] == '-')
43             {
44                 temp = (expStr[i-1]-'0') - (expStr[i+1]-'0') + '0';
45             }
46             expStr[i-1] = temp;
47             for(j=i+2;j<=len;j++)
48             {
49                 expStr[j-2] = expStr[j];
50             }
51             len -= 2;
52         }
53         else
54         {
55             i++;
56         }
57     }
58 
59     return expStr[0] - '0';
60 }
61 
62 int main()
63 {
64     char expStr[255];
65     int length;
66     int result;
67 
68     gets(expStr);
69     length = strlen(expStr);
70 
71     result = calculate(length,expStr);
72     printf("%d",result);
73     return 0;
74 }

代码2:

将字符串中的数据转入到整型数组中,其中+,-,*,/分别用-1,-2,-3,-4代替。这样,每个位置就可以放两位以上数字了。

不转入整型数组的话,在字符串中每个位置只能放一个字符,即一位数。

进行转换后,虽然运算符(-1,-2,-3,-4)与运算数混在一块儿,但并不会影响最后的结果。

  1 //问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
  2 //注: 1、表达式只含 +, -, *, / 四则运算符,不含括号
  3 //2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
  4 //3、要考虑加减乘除按通常四则运算规定的计算优先级
  5 //4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
  6 //5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
  7 //要求实现函数: int calculate(int len,char *expStr)
  8 
  9 #include<stdio.h>
 10 #include<string.h>
 11 #include<malloc.h>
 12 
 13 int calculate(int len,char *expStr)
 14 {
 15     int i,j;
 16     int temp;
 17     int *data;
 18 
 19     data = (int *)malloc(sizeof(int) * len);
 20 
 21     //将所有的字符串存储到整型数组中,其中+,-,*,/分别用-1,-2,-3,-4代替。
 22     for(i=0;i<len;i++)
 23     {
 24         if(expStr[i] == '+')
 25             data[i] = -1;
 26         else if(expStr[i] == '-')
 27             data[i] = -2;
 28         else if(expStr[i] == '*')
 29             data[i] = -3;
 30         else if(expStr[i] == '/')
 31             data[i] = -4;
 32         else
 33             data[i] = expStr[i] - '0';
 34     }
 35 
 36     //先进行所有的乘除运算。
 37     for(i=0;i<len;)
 38     {
 39         //在进行乘除运算时,i只会指向-1,-2,-3,-4和个位整数0-9.
 40         if((data[i] == -3)||(data[i] == -4))
 41         {
 42             if(data[i] == -3)
 43             {
 44                 temp = data[i-1] * data[i+1];
 45             }
 46             else if(data[i] == -4)
 47             {
 48                 temp = data[i-1] / data[i+1];
 49             }
 50             data[i-1] = temp;
 51             for(j=i+2;j<len;j++)
 52             {
 53                 data[j-2] = data[j];
 54             }
 55             len -= 2;
 56         }
 57         else
 58         {
 59             i++;
 60         }
 61     }
 62 
 63     //再进行所有的加减运算
 64     for(i=0;i<len;)
 65     {
 66         //在进行加减运算时,中间过程中,运算数可能会包含-1或-2。与运算符-1,-2混在一块儿。
 67         //如果data[0]不为-1或-2的话,在i指向data[1](肯定为-1或-2)后,i会始终只指向代表运算符的-1和-2。(算法决定的)
 68         //即使运算数中包含-1或-2,因为i不会指向它,所以不会将运算数(-1,-2)误判为运算符(-1,-2).
 69         //由于题目的输入情况,在进行乘除运算后,data[0]绝对不会为-1或-2。所以没有如果"如果data[0]不为-1或-2的话"。
 70         if((data[i] == -1)||(data[i] == -2))
 71         {
 72             if(data[i] == -1)
 73             {
 74                 temp = data[i-1] + data[i+1];
 75             }
 76             else if(data[i] == -2)
 77             {
 78                 temp = data[i-1] - data[i+1];
 79             }
 80             data[i-1] = temp;
 81             for(j=i+2;j<len;j++)
 82             {
 83                 data[j-2] = data[j];
 84             }
 85             len -= 2;
 86         }
 87         else
 88         {
 89             i++;
 90         }
 91     }
 92 
 93     return data[0];
 94 }
 95 
 96 int main()
 97 {
 98     char expStr[255];
 99     int length;
100     int result;
101 
102     gets(expStr);
103     length = strlen(expStr);
104 
105     result = calculate(length,expStr);
106     printf("%d",result);
107     return 0;
108 }

 

代码3:(最简单),先进行乘除,将之后表达式中的所有数(包括数前的±号)存入数组num中。然后对num数组求和即可。

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <string.h>
 4  
 5 int main()
 6 {
 7     char str[255];
 8     int num[255];   //用于存放经过乘除运算后剩下的所有加数(将加减运算符当作加数的正负号进行处理)。
 9     int length;
10     int i,j = 1;
11     int result = 0;
12  
13     gets(str);
14     length = strlen(str);
15  
16     num[0] = str[0] - '0';//先将第一个字符纳入num[0]中
17  
18     for (i = 1; i < length; i++)
19     {
20         switch (str[i])
21         {
22         case '+'://将'+'后的一个数字纳入num[]中。
23             num[j++] = str[i + 1] - '0';
24             break;
25  
26         case '-'://将'-'后的一个数字的相反数纳入num[]中。
27             num[j++] = -(str[i + 1] - '0');
28             break;
29  
30         case '*'://先进行乘法运算,将运算结果纳入num[]中。
31             j--;
32             num[j++] = num[j] * (str[i + 1] - '0');
33             break;
34  
35         case '/'://先进行除法运算,将运算结果纳入num[]中。
36             j--;
37             num[j++] = num[j] / (str[i + 1] - '0');
38             break;
39         }
40     }
41  
42     for (i = 0; i < j; i++)
43     {
44         result += num[i];
45     }
46     printf("%d", result);
47     return 0;
48 }

 

posted @ 2014-07-11 21:10  Andy Cheung  阅读(725)  评论(0编辑  收藏  举报