本篇博客用于记录我自己用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. 使用Wasserstein GAN生成小狗图像

    一.前期学习经过 GAN(Generative Adversarial Nets)是生成对抗网络的简称,由生成器和判别器组成,在训练过程中通过生成器和判别器的相互对抗,来相互的促进.提高.最近一段时间 ...

  2. Windows server 2008 搭建DNS服务

    现在用Windows搭建DNS的已经很少了,感觉也只有一些公司的某块部分能用上,最近在捣鼓这个,索性直接写下来,以后可以看了直接用. 开始: ★★★配置静态IP地址 老样子,有关服务器功能的建立,都是 ...

  3. Git使用感悟

    前言 分支介绍 我们现在开发的分支一般是这样的(基于上面那张图片的): master:上线用的 dev:开发用的 featature_xxx:开发用的 test:测试用的 hotfix:修复bug的 ...

  4. WPF管理系统开发框架搭建指南,2020从入门到放弃

    WPF技术是一个很不错的技术,但一直没有上手过正式的项目,趁在做这个医疗项目时,遂搭建一个WPF开发框架,目的是为了统一WPF开发并提高开发效率:我对WPF技术算是零基础,现学现卖,用这些不成体系的文 ...

  5. 利用Decorator和SourceMap优化JavaScript错误堆栈

    配合源码阅读体验更佳. 最近收到用户吐槽 @cloudbase/js-sdk(云开发Cloudbase的JavaScript SDK)的报错信息不够清晰,比如下面这条报错: 这属于业务型报错,对于熟悉 ...

  6. jq cdn地址

    百度CDN支持版本2.0.3, 2.0.2, 2.0.1, 2.0.0,1.11.1, 1.10.2, 1.10.1, 1.10.0, 1.9.1, 1.9.0, 1.8.3, 1.8.2, 1.8. ...

  7. package_ios

    PlistBuddy简单使用 https://www.jianshu.com/p/2167f755c47e xcodebuild 命令 https://www.jianshu.com/p/c32263 ...

  8. 跨平台C# UI库

    https://github.com/AvaloniaUI/Avalonia https://www.cnblogs.com/leolion/p/7144896.html https://github ...

  9. lombok配置

    lombok在springboot中无需配置即可在控制台输出. 一般使用backlog.xml作为配置文件. 在application中指定backlog位置 不做任何配置时候,logback.xml ...

  10. 小程序开发-Canvas画布组件

    Canvas画布 基本使用方法: 在wxml中添加canvas组件 <canvas canvas-id='canvasDemo' class='demo'></canvas> ...