欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数指针的应用(一)计算器

程序员文章站 2022-06-09 13:03:30
...

计算器基本功能:+ , - , * , /

下面分别用常规写法 和 函数指针写法完成计算器的模拟实现:

1.常规写法

int Add(int x, int y)
{
    return x + y;
}

int Sub(int x, int y)
{
    return x - y;
}

int Mul(int x, int y)
{
    return x * y;
}

int Div(int x, int y)
{
    return x / y;
}


void menu()
{
    printf(">>>>>>>>>>>.........................<<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>        计算器          <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>   1.add       2.sub     <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>   3.mul       4.div     <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>         0.exit          <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>.........................<<<<<<<<<<<<\n");

}

int main()
{
    int input = 0;
    int a = 0;
    int b = 0;
    int ret = 0;
    do
    {
        menu();
        printf("请选择:\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("请输入两个操作数:");
            scanf("%d%d", &a, &b);
            ret = Add(a, b);    
            printf("ret = %d\n", ret);
            break;
        case 2:
            printf("请输入两个操作数:");
            scanf("%d%d", &a, &b);
            ret = Sub(a, b);
            printf("ret = %d\n", ret);
            break;
        case 3:
            printf("请输入两个操作数:");
            scanf("%d%d", &a, &b);
            ret = Mul(a, b);
            printf("ret = %d\n", ret);
            break;
        case 4:
            printf("请输入两个操作数:");
            scanf("%d%d", &a, &b);
            ret = Div(a, b);
            printf("ret = %d\n", ret);
            break;
        case 0:
           printf("退出程序\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }

    } while(input);

    system("pause");
    return 0;

}

结果:
函数指针的应用(一)计算器
弊端:代码冗余,所占篇幅大,维护起来繁琐; 后期添加功能(比如求 一个数的次方)操作不方便。

2.使用函数指针


int Add(int x, int y)
{
    return x + y;
}

int Sub(int x, int y)
{
    return x - y;
}

int Mul(int x, int y)
{
    return x * y;
}

int Div(int x, int y)
{
    return x / y;
}


void menu()
{
    printf(">>>>>>>>>>>.........................<<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>        计算器          <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>   1.add       2.sub     <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>   3.mul       4.div     <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>         0.exit          <<<<<<<<<<<<\n");
    printf(">>>>>>>>>>>.........................<<<<<<<<<<<<\n");

}

int main()
{
    int input = 0;
    int a = 0;
    int b = 0;
    int ret = 0;
    //转移表
    int(*pfun[5])(int, int) = { 0, Add, Sub, Mul, Div};  //  函数指针数组  函数名作为地址存放在数组中

    do
    {
        menu();
        printf("请选择:\n");
        scanf("%d", &input);
        if (input == 0)    
        {
            printf("退出程序\n");
        }
            break;
        else if (input > 4)   
            printf("选择错误\n");
        else
        {
            printf("请输入两个操作数:");
            scanf("%d%d", &a, &b);
            ret = pfun[input](a, b);  // pfun[input] 是对函数指针数组的元素(元素全是函数的地址)解引用,取出对应函数,
                                    //等价于 *(pfun(input)) ,比如输入3,会拿到 Mul的地址,再传入参数 则可以该调用函数。
            printf("%d\n", ret);
        }
    } while (input);  // 当选择0时停止,否则一直循环

    system("pause");
    return 0;

}

结果:
函数指针的应用(一)计算器

相比之下,使用函数指针写同样能达到相同的目的,但是函数指针大大减少了代码量,后期如果想添加新的计算功能时,只要在函数指针数组 中加入相应的函数即可。