新手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目录 ...
随机推荐
- Spring编程式注解使用不当导致其他事务无法正常提交
1.事故背景 原本在使用的是注解式事务,后面因为需要在事务中增加异步推送机制,所以需要将推送机制放到事务之外,修改后发现系统经常出现事务长时间无法提交导致回滚. 2.排查流程 (1)一开始重启应用是能 ...
- 光年数据分析表(seo数据监控表和爬虫数据监控表)
http://www.wocaoseo.com/thread-307-1-1.html 光年seo培训想必很多人都知道,他们提出的数据化操作影响了很多的seo从业者,下面是他们的2个数据表,搜集于网络 ...
- Golang | 简介channel常见用法,完成goroutin通信
今天是golang专题的第14篇文章,大家可以点击上方的专辑回顾之前的内容. 今天我们来看看golang当中另一个很重要的概念--信道.我们之前介绍goroutine的时候曾经提过一个问题,当我们启动 ...
- JDK源码分析-ArrayList
ArrayList 储存结构 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Objec ...
- 学习一下 JVM (三) -- 了解一下 垃圾回收
一.简单了解几个概念 1.什么是垃圾(Garbage)?什么是垃圾回收(Garbage Collection,简称 GC)? (1)什么是垃圾(Garbage)? 这里的垃圾 指的是 在程序运行过程中 ...
- 硬盘网盘U盘全部可以丢掉了,这个设备可以让你享受随身带着几个T的感受
前言 有小伙伴问我,你怎么老写技术类文章,能不能写点别的. 其实我兴趣挺广泛的,早年还有机会做个游戏博主,可惜最近2年金盆洗手了.戒了手游,ns和ps4都在吃灰.能完整玩完的游戏屈指可数.但是对于折腾 ...
- 高可用集群corosync+pacemaker之crmsh使用(二)
上一篇博客我们聊到了crmsh的安装以及配置一个资源到corosync+pacemaker高可用集群上的相关命令的用法,回顾请参考https://www.cnblogs.com/qiuhom-1874 ...
- springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- windows下TOMCAT对内存使用的设置
1.打开TOMCAT目录 E:\备份\apache-tomcat-8.5.50-windows-x64\apache-tomcat-8.5.50\bin catalina.bat----------- ...
- 配置Cassandra开机启动(CentOS 7)
配置环境:centOS 7 1. 编写开机启动脚本[root@cassandra-01 ~]# cd /etc/rc.d/init.d/[root@cassandra-01 init.d]# vi c ...