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

// 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. 【转】Php+ajax+jsonp解决ajax跨域问题

    首先:jsonp是json用来跨域的一个东西. 原理是通过script标签的跨域特性来绕过同源策略. 发送端: $.ajax({ type : "post", url : &quo ...

  2. Linux下升级python

    本文的Linux系统为CentOS 7 64 在Linux系统的下载文件夹中邮件打开终端,输入命令: wget http://www.python.org/ftp/python/3.4.4/Pytho ...

  3. 墨刀 手机app原型工具

    https://modao.io 并且墨刀对开放项目永久免费!

  4. javascript 返回数组中不重复的元素

    这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ...

  5. maven设置---Dmaven.multiModuleProjectDirectory system propery is not set.

    设置maven 环境变量: MAVEN_HOME:D:\Java\apache-maven-3.3.3 M2_HOME:D:\Java\apache-maven-3.3.3 path:%MAVEN_H ...

  6. C语言中的数组和指针以及字符串

    数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...

  7. SharePoint 2010 最佳实践学习总结------第2章 SharePoint Windows PowerShell指南

    第2章 SharePoint Windows PowerShell指南 SharePoint 2010是SharePoint系列产品中第一个开始支持Windows PowerShell的产品,在以前的 ...

  8. 程序员书单_UML篇

    UML基础与Rose建模教程 http://download.csdn.net/detail/shenzhq1980/9076199 UML和模式应用1 Applying UML and Patter ...

  9. bzoj2289: 【POJ Challenge】圆,圆,圆

    Description 1tthinking随便地画了一些圆. ftiasch认为这些圆有交集(面积非零)的可能性不大.因为他实在画了太多圆,所以你被请来判断是否存在交集. Input 第1行,一个整 ...

  10. [系统开发] Bind DNS 管理系统

    一.问题的产生 很多公司的 DNS 是用 BIND 建立的:DNS 服务非常重要,BIND 功能虽然强大,但是是基于配置文件进行管理的,管理员对 DNS 进行的任何操作都要通过修改配置文件来实现,稍不 ...