本篇博客用于记录我自己用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++ 练习项目--计算器的更多相关文章

  1. 第一个Android项目——计算器

    第一个Android项目——计算器 效果 开始学Android一两个星期了,学习了一下基本的Activity.简单控件及几个简单布局,打算找个东西来练练手,于是就选择发计算器.关于计算器中用到的四则运 ...

  2. Python新手练手项目

    1.新手练手项目集中推荐 https://zhuanlan.zhihu.com/p/22164270 2.Python学习网站 https://www.shiyanlou.com 3.数据结构可视化学 ...

  3. GitHub 上适合新手的开源项目(Python 篇)

    作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...

  4. 适合 Java 新手的开源项目集合——在 GitHub 学编程

    作者:HelloGitHub--老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是 ...

  5. 新手创建Vue项目

    ======================安装vue=============================(参考网址:http://www.bubuko.com/infodetail-21320 ...

  6. Android 开发第一项目——计算器的开发记录

    2017.4.1 今天布局界面基本完成,现在写了一点事件绑定.计划是多用动态绑定,随时用随时改.关于布局方面,昨天弄到很晚,原因是Layout使用错误,用的自带的,没仔细看,预览的时候没有问题但是真机 ...

  7. [IT学习]转载python 项目 计算器

    这个是从网上搜到的Python小项目之计算器(原文地址:http://www.2cto.com/kf/201402/279637.html).但该段代码估计是Python 2 写的. 如果你使用的程序 ...

  8. 寒城攻略:Listo 教你用 Swift 写IOS UI 项目计算器

    之前总结过 Swift 的语言攻略,这里就不做赘述了,如今做一个实例计算器项目来介绍一下 Swift 的应用.(凝视已经全然.直接上代码) 先看一下效果图: 以下是详细的代码和解释: 分享快乐.开源中 ...

  9. docker 新手入门 (web项目的部署)

    web项目的部署 1.首先我们下载centos镜像.docker pull centos 2.下载完成之后,我们首先要安装的是java环境  tomcat 和jdk 3.将下载好的软件放入到nmt目录 ...

随机推荐

  1. Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ...

  2. unity3d android动态更新dll

    基本是参考这篇文章:http://blog.sina.com.cn/s/blog_9e5d42ee0102vvtg.html,进行了增删一波. 大略说一下基本步骤:1.下载mono源码,修改源码,编译 ...

  3. java返回树形结构的正确姿势

    业务场景 通常我们前端需要一个树形的导航菜单或者分类菜单,如后台权限管理中的权限树,亦或者下面例子中商城系统的商品分类多级菜单(一般为三级菜单) 数据库设计 数据库设计,采用parentId来指向自己 ...

  4. Redux异步解决方案之Redux-Thunk原理及源码解析

    前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...

  5. 跟着兄弟连系统学习Linux-【day03】

    day03-20200529 p10.学习注意事项         linux严格区分大小写(与python有点像)         Linux中所有内容都是通过文件形式保存,通过命令执行设置参数,写 ...

  6. [bash]用于查找指定格式目录的程序

    功能: 在指定目录下查找符合yyyy-MM-dd(-d)nnn模式的目录名,例如2020-03-22-b888 目标目录情况: [root@localhost testfolder]# ll tota ...

  7. leetcode刷题-94二叉树的中序遍历

    题目 给定一个二叉树,返回它的中序 遍历. 实现 # def __init__(self, x): # self.val = x # self.left = None # self.right = N ...

  8. pwnable.kr之fd

    题目如图: 在终端输入:ssh fd@pwnable.kr -p2222 连接到远程终端,如图: 输入ls -l,查看文件: 输入whoami,查看自身用户名称: 根据题目意思我们只要打开flag文件 ...

  9. Java Web项目实现写日志功能

    第一步:导入log4j-1.2.16的jar包 第二步:在servlet包里编写写日志的servlet,代码如下: public class InitServlet extends HttpServl ...

  10. Odoo10中calendar视图点击事件

    有个需求,需要根据该条记录的状态字段来控制点击calendar时是否需要打开form视图,解决方案如下:重写了web_calendar的get_fc_init_options()方法中的eventCl ...