欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

查看: 5760|回复: 1
收起左侧

[编程] 函数指针用法

[复制链接]
知行 发表于 2013-10-15 14:53 | 显示全部楼层 |阅读模式
Linux C编程一站式学习,http://learn.akae.cn/media/ch23s08.html
不用函数指针可能的实现:
double real_part(struct complex_struct z)
{
        if (z.t == RECTANGULAR)
                return z.a;
        else
                return z.a * cos(z.b);
}

用函数指针
#include <stdio.h>
#include <math.h>


enum coordinate_type { RECTANGULAR, POLAR };
struct complex_struct {
        enum coordinate_type t;
        double a, b;
};

double rect_real_part(struct complex_struct z)
{
        return z.a;
}

double rect_img_part(struct complex_struct z)
{
        return z.b;
}

double rect_magnitude(struct complex_struct z)
{
        return sqrt(z.a * z.a + z.b * z.b);
}

double rect_angle(struct complex_struct z)
{
        double PI = acos(-1.0);

        if (z.a > 0)
                return atan(z.b / z.a);
        else
                return atan(z.b / z.a) + PI;
}

double pol_real_part(struct complex_struct z)
{
        return z.a * cos(z.b);
}

double pol_img_part(struct complex_struct z)
{
        return z.a * sin(z.b);
}

double pol_magnitude(struct complex_struct z)
{
        return z.a;
}

double pol_angle(struct complex_struct z)
{
        return z.b;
}

double (*real_part_tbl[])(struct complex_struct) = { rect_real_part, pol_real_part };
double (*img_part_tbl[])(struct complex_struct) = { rect_img_part, pol_img_part };
double (*magnitude_tbl[])(struct complex_struct) = { rect_magnitude, pol_magnitude };
double (*angle_tbl[])(struct complex_struct) = { rect_angle, pol_angle };

#define real_part(z) real_part_tbl[z.t](z)
#define img_part(z) img_part_tbl[z.t](z)
#define magnitude(z) magnitude_tbl[z.t](z)
#define angle(z) angle_tbl[z.t](z)

void print_complex(struct complex_struct z)
{
        printf("z = %lf + %lf i ,|z| = %lf ,argz = %lf\n", real_part(z), img_part(z),magnitude(z),angle(z));
}

int main(void)
{
        struct complex_struct z;
        z.a=5;
        z.b=4;
        z.t=RECTANGULAR;
        print_complex(z);
        
        z.t=POLAR;
        print_complex(z);
        
        return 0;
}


当调用real_part(z)时,用类型字段z.t做索引,从指针数组real_part_tbl中取出相应的函数指针来调用,也可以达到if ... else ...的效果,但相比之下这种实现更好,每个函数都只做一件事情,而不必用if ... else ...兼顾好几件事情,比如rect_real_part和pol_real_part各做各的,互相独立,而不必把它们的代码都耦合到一个函数中。“低耦合,高内聚”(Low Coupling, High Cohesion)是程序设计的一条基本原则,这样可以更好地复用现有代码,使代码更容易维护。如果类型字段z.t又多了一种取值,只需要添加一组新的函数,修改函数指针数组,原有的函数仍然可以不加改动地复用。
 楼主| 知行 发表于 2013-10-15 15:01 | 显示全部楼层
运行结果

z = 5.000000 + 4.000000 i ,|z| = 6.403124 ,argz = 0.674741
z = -3.268218 + -3.784012 i ,|z| = 5.000000 ,argz = 4.000000
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服QQ936487697|联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2025-6-19 00:26 , Processed in 0.062900 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表