编写一个简单的桌面计算器使其处理二元运算

// 14_44.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include<functional>
#include<string>
#include<map>
#include<utility>
#include<algorithm> using namespace std; //定义'+'的函数调用对象
struct Add
{
int operator()(int i, int j) { return i + j; }
}; //定义'-'的lambda表达式
auto Minuse = [](int i, int j) {return i - j;}; //定义'*'的函数
int Multiplies(int i, int j)
{
return i*j;
} //简单二元四则表达式
int arithmatic(string &s)
{
//定义一个映射,用来保存运算符和调用对象的关系
map<char, function<int(int, int)>> ma =
{
{'+',Add()},
{'-',Minuse},
{'*',Multiplies},
//定义在functional中的模板函数对象
{'/',divides<int>()},
{'%',modulus<int>()}
};
//找出string中的运算符
auto Opration = find_if(s.begin(), s.end(), [](char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%';});
//如果运算符在开头或者结尾或者没有找到,则是一个错误的表达式
if (Opration == s.begin() || Opration == s.end()||Opration==++s.end())
{
//抛出一个运行时异常
throw runtime_error("the expression you have inputed is wrong!");
}
//得到表达式前面的整数的长度
size_t len1 = Opration - s.begin();
//得到表达式后面的整数的长度
size_t len2 = s.end() - Opration - ;
//得到表达式前面的整数
string str1 = s.substr(, len1);
//得到表达式后面的整数
string str2 = s.substr(len1 + , len2);
//辅助字符串用来判断整数的表达式是否正确
string str = "";
//如果在两个整数字符串中发现了除0123456789之外的其他字符,则表明错误
if (str1.find_first_not_of(str) != string::npos || str2.find_first_not_of(str) != string::npos)
{
//抛出一个运行时错误
throw runtime_error("the expression you have inputed is wrong!");
}
//将两个整数字符串转换为整数
int i = stoi(str1), j = stoi(str2);
//调用对应的可调用对象,得到结果
int ret = ma[*Opration](i, j);
return ret;
} int main()
{
string str;
while ()
{
cout << "please input your expression:";
cin >> str;
cout << endl;
try
{
cout << arithmatic(str) << endl;
}
catch (runtime_error e)
{
cerr << e.what() << endl;
cout << "please input Y to continue or N to quit:";
cin >> str;
if ("Y" == str)
continue;
else break;
}
break;
}
return ;
}

C++primer练习14.44的更多相关文章

  1. C++primer 练习13.44

    13.44:编写标准库string类的简化版本,命名为String.你的类应该至少有一个默认构造函数和一个接受C 风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存 ...

  2. [C++ Primer] : 第14章: 重载运算符与类型转换

    基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...

  3. 【书评:Oracle查询优化改写】第14章 结尾章

    [书评:Oracle查询优化改写]第14章 结尾章 一.1  相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...

  4. kubernetes 1.14安装部署EFK日志收集系统

    简单介绍: EFK 组合插件是k8s项目的一个日志解决方案,它包括三个组件:Elasticsearch, Fluentd, Kibana.相对于ELK这样的架构,k8s官方推行了EFK,可能Fluen ...

  5. Linux新手必看:浅谈如何学习linux

    本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix问题1:版本的选择 北美用redhat,欧洲用SuSE, ...

  6. RFC 2616

    Network Working Group R. Fielding Request for Comments: 2616 UC Irvine Obsoletes: 2068 J. Gettys Cat ...

  7. RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—单词注释版)

    part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 14 Header Field Definitions ...

  8. [转载] Linux新手必看:浅谈如何学习linux

    本文转自 https://www.cnblogs.com/evilqliang/p/6247496.html 本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习 ...

  9. MySQL+Amoeba实现数据库主从复制和读写分离

    MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...

随机推荐

  1. 安卓中Activity的onStart()和onResume()的区别是什么

    知道Activity的四种状态:Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态. Paused 当 Activ ...

  2. Java OCR 图像智能字符识别技术,可识别中文

    http://www.open-open.com/lib/view/open1363156299203.html

  3. FileDataSource java的文件操作

    FileDataSource:(javax.activation.FileDataSource.FileDataSource(File file)) FileDataSource 类实现一个封装文件的 ...

  4. Zabbix 教程

    Zabbix 教程http://blog.csdn.net/linuxlsq/article/details/52606086 MySQL在以下几种情况会创建临时表:1.UNION查询:2.用到TEM ...

  5. android学习笔记20——ProgressDialog进度条对话框

    ProgressDialog==>进度条对话框 ProgressDialog本身就代表一个进度条对话框,程序只需要创建ProgressDialog实例,并将其显示出来就是一个进度条对话框:开发者 ...

  6. routeros的配置资料

    http://blog.csdn.net/boliang319/article/details/41800261 http://blog.csdn.net/boliang319/article/det ...

  7. (一)java的由来

    java的诞生:每一次设计语言的革新都是为了解决先前语言所遇到的不能解决的问题,B语言导致C语言的诞生,C语言演变成C++,java则继承了这两种语言的大部分特性.java最初的推动力是为了找到一种能 ...

  8. 华人曾与IBM抗衡! 盘点已远去的IT巨头(转)

    [PConline资讯 ]从算盘到计算器,从大型机到个人PC,再到当今火热的移动终端和云计算,人类计算史已经走过了千年之久,现代IT计算领域也经过了百年浮沉.在世界工业领域,IT技术应该是诞生时间最短 ...

  9. Navicat(连接) -1之Navicat Cloud

    Navicat Cloud Navicat Cloud 提供一个云服务,同步不同机器和平台的 Navicat 连接.查询.模型和虚拟组.当添加一个连接到 Navicat Cloud,它的连接设置和查询 ...

  10. cf 547B. Mike and Feet dp

    题意: n个矩阵排成一排,n<=2e5,高度分别为hei[i],宽度为1 对于一些连续的矩阵,矩阵的size为矩阵的个数,矩阵的strength为这些矩阵中高度最低的那一个高度 求:for ea ...