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

// 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. 读取Config文件工具类 PropertiesConfig.java

    package com.util; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io ...

  2. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...

  3. 【dubbo】dubbo-admin在jdk 1.8上部署出错问题

    今天在linux上部署dubbo-admin-2.5.4,一直报错: ERROR context.ContextLoader - Context initialization failedorg.sp ...

  4. nova分析(2)—— nova-all

    nova-all是一个用来启动所有nova服务的辅助脚本,注意只是启动所有服务,不包括停止和重启等功能. nova-all的入口在 nova.cmd.all:main ,脚本也比较简单,这儿就贴下代码 ...

  5. Photoshop CS3 如何汉化

    1. 下载汉化包 http://download.csdn.net/detail/yangtian1158/8740959 2. 将下载的.bat文件放到CS3的安装目录里即可 C:\Program ...

  6. SSH_框架整合1

    1 WEB环境下配置Spring   因为是在WEB环境中应用Spring,所以要先配置web.xml: (1)WebContent-WEB-INF-lib包中,加入Spring包下的required ...

  7. Redis服务停止报错解决方案[NOAUTH Authentication required]

    Redis服务器设置密码后,使用service redis stop 会出现以下信息: service redis stop Stopping ... OK (error) NOAUTH Authen ...

  8. Java-Lambda

    1. 函数式接口 函数式接口可以包含多个默认方法.类方法,但是只能有一个抽象方法. Lambda表达式的目标类型是函数式接口. java.util.function包下,定义了大量的函数式接口 2. ...

  9. erlang接入远程shell

    两种方式 erl -name aaa@127.0.0.1 -setcookie erl -name bbb@127.0.0.1 -setcookie ctrl + g进入jcl模式 h查看帮助 r ' ...

  10. sqlite3移植到arm linux

    1,环境: 软件:linux:2.6.38 硬件:6410 交叉编译工具:arm-linux-gcc 也适用于其他linux平台. 2,步骤: 1>下载sqlite3源码包: http://ww ...