面向对象程序设计课第四次作业
面向对象程序设计课第四次作业
经过多次的查找、参考和修改,终于大致完成了一个(可能)没有 bug 的版本。
初始
根据要求,新建了一个 Calculation 类用以计算。我参考的教程中提到了中缀表示法(Infix expression)、前缀表示法(Prefix expression)和后缀表示法(Postfix expression),这里我用中缀表示法来计算。这种算法的基本思想是一边将数字和运算符分别存储到两个栈,一边根据四则运算法则,判断各个运算符的优先级关系,根据优先级取出运算符和数字进行计算,再将结果压入栈,如此往复,数字栈剩下的最后一个数字即为结果。原教程中用了自己的方法区分运算符和数字,但上次作业使我们获得了已经区分好了的运算符和数字的队列,我们只需简单判断字符串长度是否为 1 就可以进行操作了。参考教程中的函数,注意把运算过程中的 int
类型数据改为 double
类型,而将队列中 string
类型的数字转换为 double
类型,题目中已经提到了使用 <sstream>
,在网上找一下相关的使用方法即可。
使用命令行调用程序之前似乎在哪里看到过,将原来的 int main()
改为 int main(int argc, char** argv)
即可,其中 argc
和 argv
是两个固定的参数,argc
表示参数的个数,argv
是一个数组,保存每个参数。因此,若有参数 -a
,只需判断 argv[1]
是否为 -a
,再进行相应操作。
大概完成后,1+1
、(3+4)*(34/3)
这类简单的问题都可以解决,但示例 -10000+20-3*(20+2)
会报错,橘子大神告诉我,表达式第一个字符为运算符负号,进行到此处时缺少一个数字进行计算,只需在待运算的数字栈中压入一个 0 即可解决。
难点
解决了 -10000+20-3*(20+2)
问题后,似乎较为复杂的表达式都可以处理了。直到我看到昭锡博客里的测试数据:-(12-(15+6/100-(14*8)))-96/3+36*(12+3-(14-12))
、-96-(12+3/2-63*15-6+(12-5))
,尝试输入后正常得出答案,但我随意在一个左括号后加一个负号,即例如:-96-(-12+3/2-63*15-6+(12-5))
,就无法计算了。经过排查,原因是 -(-
、*(-
这样的部分无法识别,因此若左括号后的第一个数是负数,不能输出一个负号和一个正数,而应将这个负号与数字合并。简单的解决思路是,当遇到左括号和一个负号,输出左括号,跳过负号,将接下来的数字变为相反数。但由于我原来的实现方式是,通过 Scan 类中的函数每次返回一个运算符或数字字符串,在 main 函数中组成这个队列,因此,当我输出左括号时,没办法保存一个用来标记接下来”跳过负号,将接下来的数字变为相反数”操作的 bool 值。所以,为了解决这个负数问题,我只好修改 main 函数,并重写整个 Scan 类中的函数,使它返回一个队列。这其中遇到的问题数不胜数,例如,临时存储字符串的变量在压入队列后需要置空;当前位置、前一个位置、接下来位置的纠葛;若遇到当前字符为负号,前一个字符为左括号的情况,则应该将 bool 值置反,而不是赋值为真,这样可以解决多重括号负号嵌套的情况,如:-(-(-3))
;# 应该在结束时 push 入队列,否则直接结束运算了;以及大量的逻辑/智商问题。
此外,在看到昭锡文章的更新后,我也注意到若 0 为除数应当报错。
解决
如上所说,我(艰苦地)重写了 Scan 类中的函数,以解决负数的问题,同时参考了网上的文章,利用 <float.h>
中的 _finite(double x)
函数判断结果是否无穷,若是则报错,另外,我顺便支持了 (1+2)(3/4)
这样括号中间省略乘号的格式。
Github 链接
https://github.com/ladit/object-oriented/tree/master/Calculator
参考链接
- 计算逻辑的实现
http://blog.csdn.net/lilypp/article/details/6546658 - 0为除数的处理
http://www.cnblogs.com/aqxin/archive/2011/05/20/2052045.html
转载于:https://www.cnblogs.com/ladit/p/Assignment_4.html
面向对象程序设计课第四次作业相关推荐
- 分数计算器java报告_20182307 2019-2020-1 《数据结构与面向对象程序设计》实验四报告...
20182307 2019-2020-1 <数据结构与面向对象程序设计>实验四报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 陆彦杰 学号:20182307 实验 ...
- 面向对象程序设计第三次上机作业Debug心路历程
面向对象程序设计第三次上机作业Debug心路历程 前言 1.Container类 2.Matrix类 3.Student 类 4.文件流 前言 由于西安疫情不可抗力因素,期中考试被迫推迟 世界第一拉扯 ...
- C#面向对象程序设计课程实验四:实验名称:C#面向对象程序设计基础
C#面向对象程序设计课程实验四:实验名称:C#面向对象程序设计基础 实验内容:C#面向对象程序设计基础 一.实验目的 二.实验环境 三.实验内容与步骤 3.1.1.实验内容 3.1.2.实验步骤 3. ...
- 《面向对象程序设计》第六次作业(图形化界面)
作业要求: 实现计算器GUI界面 接收数字键.括号和加减乘除按键并处理计算 支持文件输入输出批量处理 除按钮监听处理外能接收按键信号 因为选择的是Qt,然后写c++项目惯用的IDE是eclipse,所 ...
- 2017711010137 赵栋 《面向对象程序设计》第四章学习总结
1.实验目的 (1)预定义类:(不是所有类都具有面向对象特征) 构造器的类名和方法名相同,是一种特殊的方法,用来构造并初始化对象. (2)用户自定义类:(各种主力类,没有main方法,却有实例域和实例 ...
- 西安电子科技大学c语言答案,西安电子科技大学2021春 面向对象程序设计(C++)大作业答案...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一.简答题(共 10 分) 1.(3 分)什么是引用?它与指针有什么区别? 2.(3 分)C++提供了哪些循环语句?它们各自的特点是什么? 3.(4 分) ...
- 《面向对象程序设计》作业(四)
<面向对象程序设计>第四次作业 作者信息 刘思泳 佘岳昕 031602524 031602131 博客链接 博客链接 设计思路 之前的思路是在函数中调用resource,但查资料及询问学长 ...
- 赵栋201771010137《面向对象程序设计(java)》第六周学习总结
2017711010137 赵栋 <面向对象程序设计>第四章学习总结 1.实验目的 在软件开发中,通过继承机制,可以利用已有的数据类型来定义新的数据类型.所定义的新的数据类型不仅拥 ...
- 2017《面向对象程序设计》作业四
2017<面向对象程序设计>作业四 林燊 031602325 https://www.cnblogs.com/linshen/ github链接:https://github.com/Tr ...
- 2017福州大学面向对象程序设计寒假作业四
作业链接 第四次作业统计完成,本次作业满分100分,统计结果如下: 学号 姓名 作业地址 分数 031602431 王源 http://www.cnblogs.com/circlek/p/652872 ...
最新文章
- 又一家明星机器人公司倒掉:曾是全球机器人技术50强,主打性价比AI机械臂
- perl 命令行小记
- Python合并字典的七种方式!
- sql server创建数据库与相关查询操作
- 潘正磊:再过三五年 AI会变成开发人员的基本概念
- 头发剪短了要快速生发_怎样生发效果最好最快?四个方法快速长出头发!
- 惠州交警携手高德地图 引导市民智慧出行
- Vivo叉九Android版本,vivo狂野飙车9正版下载
- C++编程基础一 27-二维数组
- CodeForces 598A Tricky Sum
- 【Hadoop】HDFS三组件:NameNode、SecondaryNameNode和DataNode
- Linux CentOS 7 下 安装SimHei字体
- Directx使用基础
- 华硕服务器主板型号命名规则,华硕ROG系列主板命名规则详解_华硕 Maximus V Formula_主板评测-中关村在线...
- 浅谈信号处理三大变换
- QOpenGLWight与QPainter混合渲染
- NXP JN5169 烧录器原理图(带按键)
- 基于异质图神经网络的未知恶意程序检测
- 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...
- 2022年,尽量还是别裸辞了吧···
热门文章
- Redis 6.0 源码阅读笔记(10) -- 主从复制 Master 节点流程分析
- 【渝粤教育】电大中专学前儿童社会教育作业 题库
- MATLAB数组生成、引用
- oledb操作Excel
- ACM 学习笔记(四) 数据结构之树、二叉树、完全二叉树、二叉查找树、AVL树、红黑树、B树、B+树
- 无约束最优化(五) 最小二乘法问题的解法
- LU分解的矩阵逆运算
- 利用vw做rem适配(纯css)
- python socket原理 及socket如何使(tcp udp协议)
- 8.ps输出属性-----状态