int sumValue(int x, int y) {
return x + y;
}
int subValue(int x, int y) {
return x - y;
}
int temp = 0;
int gcdValue(int x, int y) {//greatest common divisor 最大公约数
if (x > y) {//使得x存储小值, y存储大值
temp = x;
x = y;
y = temp;
}
int gcd = 0;
for (int i = x; i > 1; i--) {
if ((x % i == 0) && (y % i == 0)) {
gcd = i;
break;
}
}
return gcd;
}
int lcmValue(int x, int y) {//lowest common multiple 求最小公倍数
if (x > y) {//使得x存储小值, y存储大值
temp = x;
x = y;
y = temp;
}
int lcm = 0;
for (int i = y; i <= x * y; i++) {
if ((i % x == 0) && (i % y == 0)) {
lcm = i;
break;
}
}
return lcm;
}
typedef int (*PFUN) (int, int);
typedef struct operatorFctPair {
char operator;//存储运算符
PFUN function;//存储函数地址
}OperatorFctPair;
//operator是用户输入的运算符, p用来接收匹配表, count是匹配表中成员的个数
PFUN getFctByopetator(char operator, OperatorFctPair *p, int count) {
for (int i = 0; i < count; i++) {
if ((p + i)->operator == operator) {
//如果找到对应的函数, 将函数地址返回
return (p + i)->function;
}
}
return NULL;
}
int computer(int x, int y, PFUN pFct, char operator, OperatorFctPair *pair, int count) {//动态调用
PFUN function = getFctByopetator(operator, pair, count);
return function(x, y);
}
int main(int argc, const char * argv[])
{
// 动态函数调用实现下列操作,输入2个数以及操作符计算结果。@求最大公约数 $求最小公倍数 -求差 +求和 等等
OperatorFctPair pair[4] = {
{'@', gcdValue},
{'$', lcmValue},
{'+', sumValue},
{'-', subValue}
};
char operatorName = 0;
int a = 0, b = 0;
printf("请输入要运算的两个整数和运算符:(@求最大公约数, $求最小公倍数, -求差, +求和)\n");
scanf("%d%c%d", &a, &operatorName, &b);
if (getFctByopetator(operatorName, pair, 4) != NULL) {
int result = computer(a, b, gcdValue, operatorName, pair, 4);
printf("%d %c %d = %d\n", a, operatorName, b, result);
} else {
printf("%c运算没有实现, 请按照提示进行输入\n", operatorName);
}
return 0;
}