[C++ Calculator 项目] 基础运算实现
Calculator V1.1
注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得]
源文件已上传至github
主要问题:
Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以及对-的处理
Ⅱ.命令行参数如何进行合法性检查和判断
编写想法:
()的处理:
基本想法是使用递归,当碰到`(`时,调用自身进入更深层循环,计算`()`内的式子,当遇到`)`时则计算结束返回计算结果给上一层
+-*/的处理:
若字符为`+`则跳过,若字符为`-`则将一个标志负号的bool数 __minus=true ,当字符为`*`或`/`时将其推入栈 stack<char> m_sym 内等待处理
num的处理:
当从队列中取出字符串为数值时,将其赋予 stringstream sstr ,并输出给 int num
此后需要经过两个条件判断。
·① 检查__minus == true,为真则将 num*=-1
·② 检查`m_sym`栈是否非空且栈顶元素是否为 *、/ ,为真则将储存数值的栈 stack<int> m_val 的栈顶元素 m_val.top() *or/ num 并赋值给num
最后 m_val.push(num);
-的处理:
主要有这三种情况:`1-2` `-1*2` `-(1+2)`,通过分析不难发现,不论`-`号处于哪种情况是都可看做是影响其后一个数字,即前两个式子可看做 `1+(-2)` `(-1)*2` ,而第三种情况由于对`()`已做过处理,故最后得`-3`即为第一种
过程记录:
- 在写calc函数时,首选并不是递归,当时准备将calc写为处理表达式队列中的
-号的函数,并且在碰到-(...)时直接将-乘入(...)内的第一个数,结果一连遇上了好多bug(多到真的数不过来,所以就不列出了) - 因为代码是基于原先已经写好了的输入输出类上进行增改,所以在写calculation类的时候,省去了很多的工作。不过由于在写的时候并没有进行一些整体规划,所以最后成形的代码整体架构混乱,自己隔天看了也没看懂,于是把想法整理了之后,重写了两次,才觉得稍微好一些。
- 由于需要增加一个命令行参数-a,所以就增加了一个处理命令行参数的类
__arg,以方便将来的开发和处理 - 最后附上自己的成果


最后:[有奖竞猜]
请解析这句话的结构以及它想表达什么

[C++ Calculator 项目] 基础运算实现的更多相关文章
- spring+springMVC+mybatis的框架项目基础环境搭建
上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这 ...
- numpy的基础运算2-【老鱼学numpy】
numpy的基础运算中还有很多运算,我们这里再记录一些. 最小/大值索引 前面一篇博文中我们讲述过如何获得数组中的最小值,这里我们获得最小/大值的索引值,也就是这个最小/大值在整个数组中位于第几位. ...
- 基于stm32的水质监测系统项目基础部分详细记录
基于stm32的水质监测系统项目基础部分详细记录 软件环境:MDK5 硬件环境:STM32F103ZET6 开发板.颜色传感器.串口屏.串口打印机 搭建工程模板 在进行项目软件的撰写时,首先新建一个基 ...
- SpringBoot学习(一)—— web项目基础搭建
首先我们在浏览器打开这个网站 https://start.spring.io/ 打开后可以看到以下页面 在这里我们可以快速搭建一个SpringBoot基础项目,填写和选择完相应的信息后,我们点击那个绿 ...
- 解压赋值及python的一些基础运算
#解压赋值lis=[11,22,33,44,55] money1,money2,money3,money4,money5=lis print(money1,money2,money3,money4,m ...
- Calculator项目的过程及感受
1.将Calculator项目传到Github上的链接地址:https://github.com/sonnypp/object-oriented/tree/master/Calculator 2.本次 ...
- MUI项目基础框架
码云SVN仓库地址:https://gitee.com/lim2018/vx/tree/master MUI项目基础框架,底部导航栏切换 目录结构 index为入口页主体,sub1-4为要切换的子页面 ...
- XNA项目基础
XNA项目基础 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Frame ...
- 关于Linux开源项目基础组件make编译流程
关于Linux开源项目基础组件make编译流程 非常多Linux开源项目都会用到编译出可运行文件的make.这个是有一套流程的. 首先,GNU构建系统:https://en.wikipedia. ...
随机推荐
- Vulkan Tutorial 11 Shader modules
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不 ...
- DOUAudioStreamer 中kqueue的应用
DOUAudioStreamer是一个基于Core Audio的流式音频播放器,其中的DOUAudioEventLoop通过kqueue来控制音频的各种状态. kqueue简介(详情请看官方manua ...
- python基础操作_集合_三元运算
#使用操作文件的时候,可以使用with函数#with open('E:\info.txt','a+') as fr#fr这个值可以是任意值# :#for line in fr:'''with open ...
- node.js入门系列(一)--Node.js简介
什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...
- 关于dedecms的操作
系统基本参数的配置 如图 上面是设置系统的基本参数 操作是进入系统后台>点击系统>点击系统基本参数 然后右边就是系统参数等等基本参数了 记住修改后要点击确定哟 ☺ 数据库备份 如图: ...
- if 一元二次方程求根
if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...
- .NET和JAVA 反射对比
反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflectio ...
- github--hello,world(参考官网)
官网:https://guides.github.com/activities/hello-world/ 一共分为5步. 1.为你的项目新建仓库(repository): 2.新建分支(branch) ...
- tomcat之 JDK8.0安装、tomcat-8.5.15安装
前言:JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品.自从Java推出以来,JDK已经成为使用最广泛的Java SDK. JDK是整个Ja ...
- 性能测试常用sql技巧_Oracle
做了一段时间的性能测试,把自己在性能测试过程中,使用到的Oracle中用到的sql语句整理一番,做个备忘: (1)多个字段以某种格式拼接 "||"字符串拼接符; 示例:将" ...