题目:输入一个无符号的一位整数的四则运算表达式,输出其结果。例如输入:1+3*6-2,则输出:17
分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算。在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来。没有的话就将加减运算符先存起来。
主要过程:
1、输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储。数据和运算符需要分开处理。
2、引入一个整型的数组,其大小为字符串长度加一,加一是为了方便整型数组判断结束。
3、对表达式字符串循环进行字符判断,如果是数字,则将数组存入引入的整型数组,如果不是则分两种情况:(1)是乘法或者是除法运算符,那就将整型数组中当前的最新数据取出,将表达式字符串当前位置的下一个位置的数字取出,进行乘法计算,将计算所得的存放到整型数组当前位置。(即覆盖掉第一个操作数的位置)。(2)是加法或者是减法,分数组和运算符分别存入到整型数组中。
4、第3步完成以后,整型数组中存放的只是关于加减法运算的表达式。此时就可以从到右进行运算。取出操作符,通过操作符的位置取出两个操作数,保证每次计算后的结果存放到整型数组的第一个位置处。整个计算结果后,整型数组第一个位置是最终的计算结果。
完整的C语言程序如下所示:
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #define LEN 100 //假设表达式的最大长度为100
5 //计算表达式的函数声明
6 int caculate(char* exp);
7 int main()
8 {
9 //表达式字符串
10 char *expression = (char*)malloc(sizeof(char)*LEN);
11 while(1)
12 {
13 printf("Enter an expression: ");
14 scanf("%s",expression);
15 printf("The result is: %d\n",caculate(expression));
16 }
17 //释放内存空间
18 free(expression);
19 return 0;
20 }
21 int caculate(char* exp)
22 {
23 char* p = exp;
24 int result = 0;
25 //动态分配,引入一个数组
26 int* datas = (int*)malloc(sizeof(int)*(strlen(exp)+1));
27 int* pNext = datas;
28 int* pCur = NULL;
29 int* pTemp = NULL;
30 int m,n;
31 //先计算乘除法
32 while(*p!='\0')
33 {
34 if(*p == '*' || *p == '/')
35 {
36 //在datas中取第一个操作数
37 m = *pCur;
38 //在字符串中取第二个操作数
39 n = *(p+1) ^ 0x30;
40 if(*p == '*')
41 //进行乘法运算,结果覆盖当前的值
42 *pCur = m*n;
43 else
44 //进行除法运算,结果覆盖当前的值
45 *pCur = m/n;
46 p++;
47 }
48 else
49 {
50 //如果是数字,将字符转换为数字
51 *pNext = (*p>='0' && *p <='9') ? *p ^ 0x30 : *p ;
52 pCur = pNext; //指向当前
53 pNext++; //指向下一个
54 }
55 p++;
56 }
57 //此时只做加减法,每次将计算的结果保存在datas的第一个位置处
58 for( pTemp=datas;pTemp!=pNext;++pTemp)
59 {
60 if(*pTemp =='+' || *pTemp == '-')
61 {
62 //第一个操作数始终放在datas的第一个位置
63 m = *datas;
64 //取第二个操作数
65 n = *(pTemp+1);
66 if(*pTemp == '+')
67 *datas = m+n;
68 else
69 *datas = m-n;
70 pTemp++;
71 }
72 }
73 //最终的计算结果保存在datas的第一个位置
74 result = *datas;
75 //释放内存空间
76 free(datas);
77 return result;
78 }
程序测试结果如下: