新手C++ 练习项目--计算器
本篇博客用于记录我自己用C++实现的一个计算器,目标是完成加减乘除带括号的四则运算,并在后期用工厂设计模式加以优化。
Part 1:calculate 1+1=2
实现这样的一个式子的计算,只需要用到字符串分割即可,一开始尝试了stringstream去先读入一整个字符串"1+2",然后创建了两个临时变量int和一个char,用>>去读入,但是发现读入的char放在中间被忽略掉了
string s ="12+34";
// stringstream ss(s);
// int n1,n2,c;
// ss>>n1>>c>>n2;//c is 34 ,the '+' is ignored
然后我就换用了substr去进行分割,substr有两个参数,一个是开始分出字串的位置,另一个是字串的长度,第二个参数默认值是npos,也就是字符串末尾。
int i =0;
while(isdigit(s[i]))
{
++i;//pos
} cout<<cal( atof(s.substr(0,i).c_str()) , atof(s.substr(i+1).c_str()) ,s[i])<<endl;
这样就跑出来了一个简单的1+1=2了!但这个程序改起来很麻烦,没有办法适应1+1+1=3,也没有优先级操作,等下一part我们再来做新功能。
part2:后缀表达式的使用
今天想了很久,发现自己想不出一个既能很好的处理各种符号优先级又能处理好括号的问题,这个时候各位群友的博客帮了我很大忙,我知道了一个叫后缀表达式的东西,行如 "6 5 2 3 + 8 * + 3 + *"的这种式子,运算符在操作数之后,且是可以直接用堆栈简单处理的一个不错的表达式,简单总结就是,遇到数字就压入堆栈,遇到一个符号就弹出两个操作数,计算之后又压回去,加号和减号有点不同,因为加号和减号可以写在一开头作为负号处理(switch的case里不要申请局部变量,过不去编译的,当然加个大括号表示生命周期也可以过的~)
这里有一篇不错的博客,我在这里给大家安利一下:https://blog.csdn.net/sgbfblog/article/details/8001651
附上我写的代码:
double calc(char post[])
{
stack<double> sd;
//stack<char> sc;
char tempNum[MAX_BUFFER];
int j = 0;
for(size_t i =0;post[i] != '\0';++i)//一直读到结尾
{
while(isdigit(post[i])){
tempNum[j] = post[i];
++i;
++j;
tempNum[j] = '\0';//可以配合后面的直接设置i = 0 来重置tempNum
if(post[i] == ' ')
{
sd.push(atof(tempNum)) ;
j=0;
}
} switch(post[i]){
case '+':
{//局部变量的申请,加个大括号,不然编译不过,也可以把n1 n2放到上面去声明
double n1 = sd.top();
sd.pop();
if(sd.empty()){
sd.push(n1);
n1 = 0;
}
double n2 = sd.top();
sd.pop();
sd.push(n1+n2);
break;
}
case '-':
{
double n1 = sd.top();
sd.pop();
if(sd.empty()){
sd.push(-n1);
n1 = 0;
}
double n2 = sd.top();
sd.pop();
sd.push(n1+n2);
break;
}
case '*':
{
double n1 = sd.top();
sd.pop();
double n2 = sd.top();
sd.pop();
sd.push(n1*n2);
break;
} case '/':
{
double n1 = sd.top();
sd.pop();
double n2 = sd.top();
sd.pop();
sd.push(n2/n1);
break;
}
break;
default:break;
}
//++i; }
double total = sd.top();
sd.pop();
return total; }
这个处理后缀的表达式的函数实现了基本功能,但是如果后面的数是负数就会bug QAQ,写好一个计算器真的不容易,明天继续更新part3,中缀表达式转后缀表达式!
新手C++ 练习项目--计算器的更多相关文章
- 第一个Android项目——计算器
第一个Android项目——计算器 效果 开始学Android一两个星期了,学习了一下基本的Activity.简单控件及几个简单布局,打算找个东西来练练手,于是就选择发计算器.关于计算器中用到的四则运 ...
- Python新手练手项目
1.新手练手项目集中推荐 https://zhuanlan.zhihu.com/p/22164270 2.Python学习网站 https://www.shiyanlou.com 3.数据结构可视化学 ...
- GitHub 上适合新手的开源项目(Python 篇)
作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...
- 适合 Java 新手的开源项目集合——在 GitHub 学编程
作者:HelloGitHub--老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是 ...
- 新手创建Vue项目
======================安装vue=============================(参考网址:http://www.bubuko.com/infodetail-21320 ...
- Android 开发第一项目——计算器的开发记录
2017.4.1 今天布局界面基本完成,现在写了一点事件绑定.计划是多用动态绑定,随时用随时改.关于布局方面,昨天弄到很晚,原因是Layout使用错误,用的自带的,没仔细看,预览的时候没有问题但是真机 ...
- [IT学习]转载python 项目 计算器
这个是从网上搜到的Python小项目之计算器(原文地址:http://www.2cto.com/kf/201402/279637.html).但该段代码估计是Python 2 写的. 如果你使用的程序 ...
- 寒城攻略:Listo 教你用 Swift 写IOS UI 项目计算器
之前总结过 Swift 的语言攻略,这里就不做赘述了,如今做一个实例计算器项目来介绍一下 Swift 的应用.(凝视已经全然.直接上代码) 先看一下效果图: 以下是详细的代码和解释: 分享快乐.开源中 ...
- docker 新手入门 (web项目的部署)
web项目的部署 1.首先我们下载centos镜像.docker pull centos 2.下载完成之后,我们首先要安装的是java环境 tomcat 和jdk 3.将下载好的软件放入到nmt目录 ...
随机推荐
- jdk 功能变化
JDK的变化 JDK1.5 JDK1.6 jdk1.7 1. 添加自动装箱,拆箱 1. =后可以省略泛型, 见ArrayList 2. try后加一个(), 定义流对象,作用域在try里 jdk1 ...
- Gradle Wrapper
Gradle Wrapper 当把本地一个项目放入到远程版本库的时候,如果这个项目是以gradle构建的,那么其他人从远程仓库拉取代码之后如果本地没有安装过gradle会无法编译运行,如果对gradl ...
- ZERO:点击影响的量化 & 分清SEO的不可抗力
http://www.wocaoseo.com/thread-331-1-1.html 这篇文章基于上篇(http://www.wocaoseo.com/thread-332-1-1.html)的理论 ...
- Labview学习之路(六)条件结构
条件结构位于 函数---结构 子选版中.相当于c语言的switch语句, 结构: 分支选择器 分支器标签 分支子框图 可接数据类型 布尔型 布尔常量 真和假 错误信息簇 真和假 整型数值 单值 可 ...
- MySQL常用指令,java,php程序员,数据库工程师必备。程序员小冰常用资料整理
MySQL常用指令,java,php程序员,数据库工程师必备.程序员小冰常用资料整理 MySQL常用指令(备查) 最常用的显示命令: 1.显示数据库列表. show databases; 2.显示库中 ...
- Android开发之http网络请求返回码问题集合。
HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 一.1xx(临时响应) 表示临时响 ...
- ASP.NET Uploadify 上传文件过大 报错(http error)借鉴,以防忘记
Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:&l ...
- 跟着兄弟连系统学习Linux-【day09】
day10-20200609 p29.软件包管理-rpm命令管理-安装升级与卸载 [rpm -ivh 包全名]安装 -i(安装) -v (显示详细信息)-h (显示安装进度) 会一步步依赖,比较麻烦, ...
- SpringCloud系列之分布式配置中心极速入门与实践
SpringCloud系列之分布式配置中心极速入门与实践 @ 目录 1.分布式配置中心简介 2.什么是SpringCloud Config? 3.例子实验环境准备 4.Config Server代码实 ...
- 使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面
世界上唯一不变的东西就是变化,我们通过总结变化的规律,以规律来应付变化,一切事情处理起来事半功倍.我们在开发后端服务代码,前端界面代码的时候,界面都是依照一定的规律进行变化的,我们通过抽取数据库信息, ...