c++ 两个int型变量的加减乘除。存放函数指针的vector。将字符串变成数字。

 c++prime 6.7习题

四个int型的加减乘除运算函数,四个函数指针放在一个vector向量中,通过vector向量调用函数。

输入字符串,将字符串拆解为两个整数和运算符,通过运算符种类调用不同的vector元素。

#include "mylib.h"
#include "fact.h"

int _2int(const string& s);


int main() {
	int funcc(int a, int b);
	int add(int a, int b);
	int subtract(int a, int b);
	int multiply(int a, int b);
	int divide(int a, int b);
	vector<decltype(funcc)*> fc; //通过decltype返回funcc的函数类型,定义一个存放指向这种函数类型的指针的vector。

	fc.push_back(add);
	fc.push_back(subtract);
	fc.push_back(multiply);
	fc.push_back(divide);
	string s;
	
	char si = 0;
	char op = 0;
	char opt = 0;
	while ((cin >> s) && (s != "quit"))
	{	
		si = 0;
		string sa[2] = { "","" };
		int ia[2] = { 0 };
		for (auto i : s) {
			
			if (i == '+' || i == '-' || i == '*' || i == '/') {
				si =1;
				op = i;
				continue;
			}
			sa[si] += i;
		}
		try { if (si == 0) { throw  runtime_error("expression is wrong!"); } }//std::runtime_error};
		
		catch (runtime_error err) {    //catch (exception& e) 也可以,下方的err变为e.what()
			cout << err.what() << "\nTry Again? Enter y or n" << endl;
			char c;
			cin >> c;
			if (!cin || c == 'n')
				break; //跳出while循环
			else continue;
		}



		switch (op) {
			case('+'):
				opt = 0; break;
			case('-'):
				opt = 1; break;
			case('*'):
				opt = 2; break;
			case('/'):
				opt = 3; break;
			default:;
		}

		ia[0] = _2int(sa[0]);
		ia[1] = _2int(sa[1]);
		cout << s << "=" << fc[opt](ia[0], ia[1])<<endl;
		
	}
	//while (1) {
	//	cout << "which operation do you want? --input + - * / --" << endl;
	//	char op;
	//	cin>>op;
	//	int opt;
	//	switch (op) {
	//	case('+'):
	//		opt = 0; break;
	//	case('-'):
	//		opt = 1; break;
	//	case('*'):
	//		opt = 2; break;
	//	case('/'):
	//		opt = 3; break;
	//	default:
	//		cout << "only supported \"+ - * /\"!";
	//	}
	//	int a, b;
	//	cin >> a >> b;
	//	cout << a << op << b << "=" << fc[opt](a, b) << endl;
	//}
}
int add(int a, int b) {
	return (a + b);
}
int subtract(int a, int b){
	return (a - b);
}
int multiply(int a, int b) {
	return (a * b);
}
int divide(int a, int b) {
	return (a / b);
}

int _2int(const string& s){

	int a;
	stringstream ss;
	ss << s;
	ss >> a;
	return a;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖豆人鄭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值