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
#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
相关文章推荐
- LinuxC/C++编程基础(36) Poco::BinaryReader的实现
- LinuxC/C++编程基础(37) Cumulus::BinaryReader的实现
- LinuxC/C++编程基础(19) 不可复制类的原理及实现
- LinuxC/C++编程基础(5) 排序二叉树的实现
- LinuxC/C++编程基础(10) quicksort的简单实现
- LinuxC/C++编程基础(33) 视频包缓存的实现(续1)
- LinuxC/C++编程基础(8) 基于条件变量实现生产者与消费者的实例
- LinuxC/C++编程基础(9) 二叉查找树的实现
- LinuxC/C++编程基础(12) 红黑树的实现
- LinuxC/C++编程基础(4) 基于泛型实现vector
- LinuxC/C++编程基础(6) 堆排序的实现
- LinuxC/C++编程基础(30) 视频包缓存的实现
- Linux 网络编程基础(一) ---------------客户端/服务器的简单实现
- Linux下基于C/C++的Socket编程基础
- LinuxC/C++编程基础(27) “心跳”信息的处理
- linux下C/C++网络编程基本:socket实现tcp和udp的例子
- Linux socket编程入门及客户端服务器端通信实现 – 基础篇
- Linux 网络编程基础---------------客户端/服务器的简单实现
- linux C++ GTK编程实现
- linux下php实现C/C++扩展编程