Calculator V1.1

注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得]
源文件已上传至github

主要问题:

Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以及对-的处理
Ⅱ.命令行参数如何进行合法性检查和判断

编写想法:

  • ()的处理:

  1.         基本想法是使用递归,当碰到`(`时,调用自身进入更深层循环,计算`()`内的式子,当遇到`)`时则计算结束返回计算结果给上一层
  • +-*/的处理:

  1.         若字符为`+`则跳过,若字符为`-`则将一个标志负号的bool __minus=true ,当字符为`*``/`时将其推入栈 stack<char> m_sym 内等待处理
  • num的处理:

  1.         当从队列中取出字符串为数值时,将其赋予 stringstream sstr ,并输出给 int num
  2.         此后需要经过两个条件判断。
  3. ·① 检查__minus == true,为真则将 num*=-1
  4. ·② 检查`m_sym`栈是否非空且栈顶元素是否为 *、/ ,为真则将储存数值的栈 stack<int> m_val 的栈顶元素 m_val.top() *or/ num 并赋值给num
  5.         最后 m_val.push(num);
  • -的处理:

  1.        主要有这三种情况:`1-2` `-1*2` `-(1+2)`,通过分析不难发现,不论`-`号处于哪种情况是都可看做是影响其后一个数字,即前两个式子可看做 `1+(-2)` `(-1)*2` ,而第三种情况由于对`()`已做过处理,故最后得`-3`即为第一种

过程记录:

  • 在写calc函数时,首选并不是递归,当时准备将calc写为处理表达式队列中的-号的函数,并且在碰到-(...)时直接将-乘入(...)内的第一个数,结果一连遇上了好多bug(多到真的数不过来,所以就不列出了)
  • 因为代码是基于原先已经写好了的输入输出类上进行增改,所以在写calculation类的时候,省去了很多的工作。不过由于在写的时候并没有进行一些整体规划,所以最后成形的代码整体架构混乱,自己隔天看了也没看懂,于是把想法整理了之后,重写了两次,才觉得稍微好一些。
  • 由于需要增加一个命令行参数-a,所以就增加了一个处理命令行参数的类 __arg ,以方便将来的开发和处理
  • 最后附上自己的成果



最后:[有奖竞猜]

请解析这句话的结构以及它想表达什么

[C++ Calculator 项目] 基础运算实现的更多相关文章

  1. spring+springMVC+mybatis的框架项目基础环境搭建

    上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这 ...

  2. numpy的基础运算2-【老鱼学numpy】

    numpy的基础运算中还有很多运算,我们这里再记录一些. 最小/大值索引 前面一篇博文中我们讲述过如何获得数组中的最小值,这里我们获得最小/大值的索引值,也就是这个最小/大值在整个数组中位于第几位. ...

  3. 基于stm32的水质监测系统项目基础部分详细记录

    基于stm32的水质监测系统项目基础部分详细记录 软件环境:MDK5 硬件环境:STM32F103ZET6 开发板.颜色传感器.串口屏.串口打印机 搭建工程模板 在进行项目软件的撰写时,首先新建一个基 ...

  4. SpringBoot学习(一)—— web项目基础搭建

    首先我们在浏览器打开这个网站 https://start.spring.io/ 打开后可以看到以下页面 在这里我们可以快速搭建一个SpringBoot基础项目,填写和选择完相应的信息后,我们点击那个绿 ...

  5. 解压赋值及python的一些基础运算

    #解压赋值lis=[11,22,33,44,55] money1,money2,money3,money4,money5=lis print(money1,money2,money3,money4,m ...

  6. Calculator项目的过程及感受

    1.将Calculator项目传到Github上的链接地址:https://github.com/sonnypp/object-oriented/tree/master/Calculator 2.本次 ...

  7. MUI项目基础框架

    码云SVN仓库地址:https://gitee.com/lim2018/vx/tree/master MUI项目基础框架,底部导航栏切换 目录结构 index为入口页主体,sub1-4为要切换的子页面 ...

  8. XNA项目基础

    XNA项目基础 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Frame ...

  9. 关于Linux开源项目基础组件make编译流程

     关于Linux开源项目基础组件make编译流程 非常多Linux开源项目都会用到编译出可运行文件的make.这个是有一套流程的. 首先,GNU构建系统:https://en.wikipedia. ...

随机推荐

  1. python3 简单实现从csv文件中读取内容,并对内容进行分类统计

    新手python刚刚上路,在实际工作中遇到如题所示的问题,尝试使用python3简单实现如下,欢迎高手前来优化import csv #打开文件,用with打开可以不用去特意关闭file了,python ...

  2. 我的学习之路_第五章_Data,正则

    Date 类 (时间类) 所属包:java.util.Date 构造方法: public Date() 返回的是当前时间 也就是1970-1-1到电脑目前的时间值,用毫秒来表示 public Date ...

  3. javascript的setTimeout()与setTimeout()方法用法总结

    setTimeout与setInterval的区别: setTimeout 定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法: setTimeout(code ...

  4. memcached配置

    首先是安装libevent库,执行如下的命令 tar vzxf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure ...

  5. [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现

    NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLo ...

  6. 去除MyEclipse频繁弹出的Update Progress窗口

    方法1: 1.关闭updating index Window => Preferences => Myeclipse Enterprise Workbench => Maven4My ...

  7. JavaScript对象之document对象

    DOM对象之document对象 DOM对象:当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. 打开网页后,首先 ...

  8. navicat连接oracle 报 ORA-12737 set CHS16GBK

    1首先,我们打开“工具”-->"选项"菜单,见到如下界面,依据OCI library(oci.dll) 路径,导航到 navicat oci 目录下,备份里面的文件(通过在该 ...

  9. 基于FPGA的IIR滤波器

    基于FPGA的IIR滤波器                                                         by方阳 版权声明:本文为博主原创文章,转载请指明转载地址 ...

  10. 响应式、手机端、自适应 百分比实现div等宽等高的方法

    在百分比布局中, 有时候会遇见一个头疼的问题,就是如果某个布局是正方形的话,我们在这种情况下考虑到适应各种媒体尺寸,又不能给它定固定的宽高. 之前遇见过纯色布局的结果我就用纯色图片代替实现的,现在有了 ...