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;
}