您的位置:首页 > 运维架构 > Linux

LinuxC/C++编程基础(1) 函数指针实现复数的加减乘除

2012-11-20 17:51 661 查看
一.复数结构体的定义,如下,代码简单明了,无需赘述:

#ifndef COMPLEXDATA_H_

#define COMPLEXDATA_H_

#include <math.h>

namespace StructData {

enum complexType {

RECTANGULAR, POLAR

};

struct complexData {

enum complexType t;

double x, y;

};

double rect_real_part(struct complexData z) {

return z.x;

}

double rect_img_part(struct complexData z) {

return z.y;

}

double rect_magnitude(struct complexData z) {

return sqrt(z.x * z.x + z.y * z.y);

}

double rect_angle(struct complexData z) {

double PI = acos(-1.0);

if (z.x > 0) {

return atan(z.y / z.x);

}

return atan(z.y / z.x) + PI;

}

double pol_real_part(struct complexData z) {

return z.x * cos(z.y);

}

double pol_img_part(struct complexData z) {

return z.x * sin(z.y);

}

double pol_magnitude(struct complexData z) {

return z.x;

}

double pol_angle(struct complexData z) {

return z.y;

}

struct complexData make_from_real_img(double x, double y) {

struct complexData z;

z.t = RECTANGULAR;

z.x = x;

z.y = y;

return z;

}

struct complexData make_from_mag_ang(double r, double A) {

struct complexData z;

z.t = POLAR;

z.x = r * cos(A);

z.y = r * sin(A);

return z;

}

double (*real_part_tbl[])(struct complexData) = {rect_real_part, pol_real_part};

double (*img_part_tbl[])(struct complexData) = {rect_img_part, pol_img_part};

double (*magnitude_tbl[])(struct complexData) = {rect_magnitude, pol_magnitude};

double (*angle_tbl[])(struct complexData) = {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)

struct complexData add_complex(struct complexData z1, struct complexData z2) {

return make_from_real_img(real_part(z1) + real_part(z2),

img_part(z1) + img_part(z2));

}

struct complexData sub_complex(struct complexData z1, struct complexData z2) {

return make_from_real_img(real_part(z1) - real_part(z2),

img_part(z1) - img_part(z2));

}

struct complexData mul_complex(struct complexData z1, struct complexData z2) {

return make_from_mag_ang(magnitude(z1) * magnitude(z2),

angle(z1) + angle(z2));

}

struct complexData div_complex(struct complexData z1, struct complexData z2) {

return make_from_mag_ang(magnitude(z1) / magnitude(z2),

angle(z1) - angle(z2));

}

}

#endif /* COMPLEXDATA_H_ */

二.main.cpp函数的实现,如下:

#include "complexData.h"

#include <stdio.h>

using namespace StructData;

int main(int argc,char** argv){

struct complexData data1 = {StructData::RECTANGULAR,5.0,9.0};

struct complexData data2 = {StructData::RECTANGULAR,9.0,5.0};

struct complexData result = {StructData::RECTANGULAR,0.0,0.0};

result = add_complex(data1, data2);

printf("x=%lf,y=%lf\n", result.x, result.y);

result = sub_complex(data1, data2);

printf("x=%lf,y=%lf\n", result.x, result.y);

result = mul_complex(data1, data2);

printf("x=%lf,y=%lf\n", result.x, result.y);

result = div_complex(data1, data2);

printf("x=%lf,y=%lf\n", result.x, result.y);

}

说明:函数简单明了,代码的实现基于“低耦合,高内聚”的设计思想,是一种很好的编程原则,更好地实现了代码的复用。

参考文献:宋劲彬,linux C编程一站式学习

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8204792
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: