题解 | #简单计算器# 函数指针数组解法 C语言
简单计算器
http://www.nowcoder.com/practice/b8f770674ba7468bb0a0efcc2aa3a239
我看题解里全都是一个套路的,所以我决定写个特别一点的,如果你感兴趣可以往下看,当作一次课外拓展 如有讲解错误,欢迎指出😁😁
我的方法是函数指针数组,一种可以快速调动各个函数的方式.
大家因该都听过指针、指针数组、数组指针等等,但是函数指针用的
较少,所以因该有人不知道.
函数指针数组其实跟指针数组、数组没什么区别,都是为了快速调动数据
定义方式
<函数类型> (*p[函数个数])(变量类型1,变量类型2...) = {函数名1,函数名2...};
int (*pf[2])(int,int) = {add,sub};
了解了函数指针数组后,开始码!!💪💪
首先,需要将加、减、乘、除四种运算的函数写出来,这不难
//加
double add(double a, double b) {
return a + b;
}
//减
double sub(double a, double b) {
return a - b;
}
//乘
double mul(double a, double b) {
return a * b;
}
//除
double div(double a, double b) {
return a / b;
}
注意是double类型的
接下来定义一些变量去接收数据,顺便将函数指针数组也定义了(注意类型)
double a, b; //操作数1和2
char opt; //运算方式
//函数指针数组
double (*pf[8])(double, double) = {NULL, NULL, mul, add, NULL, sub, NULL, div};
scanf("%lf%c%lf", &a, &opt, &b);
这里可以看到我写了很多的NULL,你可以理解为占位符,它占了一个位置,表示暂时不用
为什么呢?为了方便
这张图是ASCII码表,可以看到
'*'的ASCII码值为42,
'+'的ASCII码值为43
用*%40取余可以得到2
用+%40取余可以得到3
刚好对应上面函数指针数组的元素位置
有了这一步,等下可以节省很多判断.
接下来的判断是否符合运算等直接略过,来看怎么去调用函数指针数组
printf("%.4lf%c%.4lf=%.4lf", a, opt, b, (*pf[opt % 40])(a, b)); //输出
你没有看错,就这一句就代替了那重重判断,只是运用了一些小技巧
你还可以多加一些计算,比如&,|,!,^,<<,>>等等,只需把数组扩大,多增加一些占位符即可
完整代码演示
#include <stdio.h>
//加
double add(double a, double b) {
return a + b;
}
//减
double sub(double a, double b) {
return a - b;
}
//乘
double mul(double a, double b) {
return a * b;
}
//除
double div(double a, double b) {
return a / b;
}
int main() {
double a, b; //操作数1和2
char opt; //运算方式
//函数指针数组
double (*pf[8])(double, double) = {NULL, NULL, mul, add, NULL, sub, NULL, div};
scanf("%lf%c%lf", &a, &opt, &b);
if (opt == '+' || opt == '-' || opt == '*' || opt == '/') //判断运算符是否合法
{
if (opt == '/' && b == 0) //判断是否符合分母不为零
{
printf("Wrong!Division by zero!\n");
}
else
{
printf("%.4lf%c%.4lf=%.4lf", a, opt, b, (*pf[opt % 40])(a, b)); //输出
}
} else {
printf("Invalid operation!\n");
}
}