目录
一、问题描述及基本要求
【问题描述】 设计一个简单的算术表达式计算器。
【基本要求】 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
- (30+2*70)/3-12*3
- 5+(9*(62-37)+15)*6
- 要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数:
- status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE
- int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
二、问题分析和任务定义
- 通过分析该问题的要求就只是能够实现混合四则运算
- 并且只是需要进行整数的四则运算还要求可多层嵌入。
- 这里需要注意的是虽然是整数但是在读取多位数时他是一位一位读的注意合并。
三、逻辑设计
要用到的重要变量:
- 定义一个string 类型的字符串用来输入所要计算的表达式
- 再用int类型的a[10]记录"("的位置 用b[10]记录")"的位置
- 用char s1[100]来储存括号内的数据
大致的函数说明:
- reduce()用来循环去括号
- cele()用来计算
- main()主函数进行调用
算法分析:求多重嵌套的四则混合运算的难点实质上是确定每一步究竟是先哪一个运算符处理,对于简单的四则混合运算可以用栈去实现,但一但括号多了用栈就显得十分复杂十分麻烦。所以在这里我所用的算法是记录括号位置直接从最里层括号着手运算每次用计算结果代替括号直至没有括号,再进行最后的运算。
函数调用图
专门进行计算的函数在计算的过程中使用的思想是先把所有的数字和运算符按顺序存入int类型的数组和char类型的数组。经过思考发现只有当前一个运算符为’-’or’+’同时后面的一个运算符为’*’or’/’时才会先计算后面的。这样就可以通过这样是每次仅用两个数进行运算在把这个结果做为式子中的一个值放在相应的位置同时后面的式子向前移一位。
比如式子:6*5+12*4;用a数组存数字,b数组存运算符图示如下:
刚开始把所有的数和运算符放入:
然后看b[0]和b[1];如果前一个运算符为’-’or’+’同时后面的一个运算符为’*’or’/’就先处理a[1]和a[2]然后结果放到a[1]后面的数字运算符全向前移一位:
结果就出来了为78。
每次去除括号里的内容进行计算计算的结果放入相应的位置,然后进行标记
比如式子5+6*(9*20+5)用char数组和int标记数组的过程:
第一次:
把9*20+5计算后:
注意:只有为零的表示没有被取过,可以放到代求的char串中。
接下来就只是计算5+6*185。
四、物理设计
- string s;
- int a[10],b[10];
- char s1[100];
- find()用来查找位置
- reduce()用来去除括号
- cele()用来计算
- main()函数用来执行调用