题解 | #简单计算器# 函数指针数组解法 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,你可以理解为占位符,它占了一个位置,表示暂时不用
为什么呢?为了方便
alt
这张图是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");
    }

}
全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务