简单四则运算
问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 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 }