C++primer练习14.44
编写一个简单的桌面计算器使其处理二元运算
// 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的更多相关文章
- C++primer 练习13.44
13.44:编写标准库string类的简化版本,命名为String.你的类应该至少有一个默认构造函数和一个接受C 风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存 ...
- [C++ Primer] : 第14章: 重载运算符与类型转换
基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...
- 【书评:Oracle查询优化改写】第14章 结尾章
[书评:Oracle查询优化改写]第14章 结尾章 一.1 相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...
- kubernetes 1.14安装部署EFK日志收集系统
简单介绍: EFK 组合插件是k8s项目的一个日志解决方案,它包括三个组件:Elasticsearch, Fluentd, Kibana.相对于ELK这样的架构,k8s官方推行了EFK,可能Fluen ...
- Linux新手必看:浅谈如何学习linux
本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix问题1:版本的选择 北美用redhat,欧洲用SuSE, ...
- RFC 2616
Network Working Group R. Fielding Request for Comments: 2616 UC Irvine Obsoletes: 2068 J. Gettys Cat ...
- RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—单词注释版)
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 14 Header Field Definitions ...
- [转载] Linux新手必看:浅谈如何学习linux
本文转自 https://www.cnblogs.com/evilqliang/p/6247496.html 本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习 ...
- MySQL+Amoeba实现数据库主从复制和读写分离
MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...
随机推荐
- redis配置文件解析
Redis是一个简单高效的内存KV数据库,基本上下载源码make install,编译完成,然后进入src目录运行redis-server即可运行.就是因为这么简单往往有朋友直接运行,将没有密码的re ...
- 【控件扩展】带圆角、边框、渐变的panel
下载地址: http://files.cnblogs.com/chengulv/custompanel_demo.zip using System; namespace LC.Fun { /// & ...
- C#时间日期格式大全
C#时间/日期格式大全,C#时间/日期函数大全 有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2016-7-1 14:33:34 如果要换成成201607,07-2016,2016-7- ...
- 剑指offer系列55---最小的k个数
[题目] 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *[思路]排序,去除k后的数. package com.exe11 ...
- mysql的主从配置以及主主配置
基础环境 系统:linuxmysql版本:5.5主服务器IP:192.168.1.101从服务器IP:192.168.1.102 1.主服务器(master)要打开二进制日志2.从服务器(slave) ...
- 拒绝了对对象 '**' (数据库 'db',架构 'dbo')的 SELECT 权限
操作次数据库的用户的权限不够,因此只需要赋予相应的权限即可 MSSQL2005:具体数据库(xxx) --- 安全性---- 架构---- dbo(属性)--- 权限--- 添加--- 浏览-- [p ...
- android下asynchttp库对于session的支持
默认asynchttp库不支持session,需要用户配置下cookie来处理,直接贴支持session的代码 package example.com.sessiontest; import andr ...
- python学习-day02
---恢复内容开始--- 一.pycharm安装 1.1破解方式http://www.cnblogs.com/evlon/p/4934705.html 1.2.头部配置: 二.运算符 2.1.比较运算 ...
- 警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:20160928' did not find a matching property
控制台看到如下警告: 症状原因: 在eclipse配置好的tomcat服务器上双击,打开tomcat服务器的配置界面.按如下操作配置服务器:在Server Options勾上的选项,会在你部署web项 ...
- ARM NEON编程系列1-导论
ARM NEON 编程系列1 - 导论 前言 本系列博文用于介绍ARM CPU下NEON指令优化. 博文github地址:github 相关代码github地址:github NEON历史 ARM处理 ...