面向对象程序设计课第四次作业

经过多次的查找、参考和修改,终于大致完成了一个(可能)没有 bug 的版本。

初始

根据要求,新建了一个 Calculation 类用以计算。我参考的教程中提到了中缀表示法(Infix expression)、前缀表示法(Prefix expression)和后缀表示法(Postfix expression),这里我用中缀表示法来计算。这种算法的基本思想是一边将数字和运算符分别存储到两个栈,一边根据四则运算法则,判断各个运算符的优先级关系,根据优先级取出运算符和数字进行计算,再将结果压入栈,如此往复,数字栈剩下的最后一个数字即为结果。原教程中用了自己的方法区分运算符和数字,但上次作业使我们获得了已经区分好了的运算符和数字的队列,我们只需简单判断字符串长度是否为 1 就可以进行操作了。参考教程中的函数,注意把运算过程中的 int 类型数据改为 double 类型,而将队列中 string 类型的数字转换为 double 类型,题目中已经提到了使用 <sstream>,在网上找一下相关的使用方法即可。

使用命令行调用程序之前似乎在哪里看到过,将原来的 int main() 改为 int main(int argc, char** argv) 即可,其中 argcargv 是两个固定的参数,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

面向对象程序设计课第四次作业相关推荐

  1. 分数计算器java报告_20182307 2019-2020-1 《数据结构与面向对象程序设计》实验四报告...

    20182307 2019-2020-1 <数据结构与面向对象程序设计>实验四报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 陆彦杰 学号:20182307 实验 ...

  2. 面向对象程序设计第三次上机作业Debug心路历程

    面向对象程序设计第三次上机作业Debug心路历程 前言 1.Container类 2.Matrix类 3.Student 类 4.文件流 前言 由于西安疫情不可抗力因素,期中考试被迫推迟 世界第一拉扯 ...

  3. C#面向对象程序设计课程实验四:实验名称:C#面向对象程序设计基础

    C#面向对象程序设计课程实验四:实验名称:C#面向对象程序设计基础 实验内容:C#面向对象程序设计基础 一.实验目的 二.实验环境 三.实验内容与步骤 3.1.1.实验内容 3.1.2.实验步骤 3. ...

  4. 《面向对象程序设计》第六次作业(图形化界面)

    作业要求: 实现计算器GUI界面 接收数字键.括号和加减乘除按键并处理计算 支持文件输入输出批量处理 除按钮监听处理外能接收按键信号 因为选择的是Qt,然后写c++项目惯用的IDE是eclipse,所 ...

  5. 2017711010137 赵栋 《面向对象程序设计》第四章学习总结

    1.实验目的 (1)预定义类:(不是所有类都具有面向对象特征) 构造器的类名和方法名相同,是一种特殊的方法,用来构造并初始化对象. (2)用户自定义类:(各种主力类,没有main方法,却有实例域和实例 ...

  6. 西安电子科技大学c语言答案,西安电子科技大学2021春 面向对象程序设计(C++)大作业答案...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一.简答题(共 10 分) 1.(3 分)什么是引用?它与指针有什么区别? 2.(3 分)C++提供了哪些循环语句?它们各自的特点是什么? 3.(4 分) ...

  7. 《面向对象程序设计》作业(四)

    <面向对象程序设计>第四次作业 作者信息 刘思泳 佘岳昕 031602524 031602131 博客链接 博客链接 设计思路 之前的思路是在函数中调用resource,但查资料及询问学长 ...

  8. 赵栋201771010137《面向对象程序设计(java)》第六周学习总结

    2017711010137 赵栋 <面向对象程序设计>第四章学习总结 1.实验目的     在软件开发中,通过继承机制,可以利用已有的数据类型来定义新的数据类型.所定义的新的数据类型不仅拥 ...

  9. 2017《面向对象程序设计》作业四

    2017<面向对象程序设计>作业四 林燊 031602325 https://www.cnblogs.com/linshen/ github链接:https://github.com/Tr ...

  10. 2017福州大学面向对象程序设计寒假作业四

    作业链接 第四次作业统计完成,本次作业满分100分,统计结果如下: 学号 姓名 作业地址 分数 031602431 王源 http://www.cnblogs.com/circlek/p/652872 ...

最新文章

  1. 又一家明星机器人公司倒掉:曾是全球机器人技术50强,主打性价比AI机械臂
  2. perl 命令行小记
  3. Python合并字典的七种方式!
  4. sql server创建数据库与相关查询操作
  5. 潘正磊:再过三五年 AI会变成开发人员的基本概念
  6. 头发剪短了要快速生发_怎样生发效果最好最快?四个方法快速长出头发!
  7. 惠州交警携手高德地图 引导市民智慧出行
  8. Vivo叉九Android版本,vivo狂野飙车9正版下载
  9. C++编程基础一 27-二维数组
  10. CodeForces 598A Tricky Sum
  11. 【Hadoop】HDFS三组件:NameNode、SecondaryNameNode和DataNode
  12. Linux CentOS 7 下 安装SimHei字体
  13. Directx使用基础
  14. 华硕服务器主板型号命名规则,华硕ROG系列主板命名规则详解_华硕 Maximus V Formula_主板评测-中关村在线...
  15. 浅谈信号处理三大变换
  16. QOpenGLWight与QPainter混合渲染
  17. NXP JN5169 烧录器原理图(带按键)
  18. 基于异质图神经网络的未知恶意程序检测
  19. 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...
  20. 2022年,尽量还是别裸辞了吧···

热门文章

  1. Redis 6.0 源码阅读笔记(10) -- 主从复制 Master 节点流程分析
  2. 【渝粤教育】电大中专学前儿童社会教育作业 题库
  3. MATLAB数组生成、引用
  4. oledb操作Excel
  5. ACM 学习笔记(四) 数据结构之树、二叉树、完全二叉树、二叉查找树、AVL树、红黑树、B树、B+树
  6. 无约束最优化(五) 最小二乘法问题的解法
  7. LU分解的矩阵逆运算
  8. 利用vw做rem适配(纯css)
  9. python socket原理 及socket如何使(tcp udp协议)
  10. 8.ps输出属性-----状态