题目:输入一个无符号的一位整数的四则运算表达式,输出其结果。例如输入: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 }
程序测试结果如下: