实验 1.    抽象数据类型 

本次实验的主要目的在于帮助读者熟悉抽象数据类型的表示和实现 
方法。抽象数据类型需借助固有数据类型来表示和实现,即利用高级程序 
设计语言中已存在的数据类型来说明新的结构,用已经实现的操作来组合 
新的操作,具体实现细节则依赖于所用语言的功能。通过本次实验还可以 
帮助学生复习高级语言的使用方法。 
[color=008080][color=0000FF][color=FF0000][color=C0C0C0][color=FF00FF][color=00FFFF][color=00FF00][color=00FFFF][color=FF00FF][color=C0C0C0][color=FF0000][color=0000FF][color=008080][color=0000FF][color=FF0000][color=C0C0C0][color=FF00FF][color=00FFFF][color=00FF00][color=00FFFF][color=FF00FF][color=C0C0C0][color=FF0000][color=0000FF][color=008080][color=0000FF][color=FF0000][color=C0C0C0][color=FF00FF][color=00FFFF][color=FF00FF][color=C0C0C0][color=FF0000][color=0000FF][color=008080][color=0000FF][color=FF0000]问题描述】 
用 C 或 C++语言设计并实现一个可进行复数运算的演示程序。 
基本要求】 
1.由输入的实部和虚部生成一个复数 
2.两个复数求和 
3.两个复数求差 
4.从已知复数中分离出实部和虚部 
5.复数及相应运算结果以相应的表现形式显示。 [/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color][/color]实现提示】 
定义复数为由两个相互之间存在次序关系的实数构成的抽象数据类 
型,则可以利用实数的操作来实现复数的操作。 

( 1)抽象数据类型的含义 

一个抽象数据类型  ADT 就是:数据  + 操作,例如  CpxNum 其数据部分包括实 

部和虚部;而操作包括 CPlus(加法)、CMinus(减法)、cmultiply(乘法)、cdivide 

(除法)等运算。 

我们可通过在高级语言中实现新的抽象数据类型,来扩展语言的类型体系,如 

在 C++语言原有的 int、char、float、double 等内建类型的基础上,我们还可根据用户 

 

的需求提供诸如:复数、CMyString、一元多项式、发票等等结合实际应用环境特征 

的新型类型。这样作为高级语言的用户既可用 int、char、float 等基本类型,又可在其 

程序中使用复数、CMyString、一元多项式等用户自定义类型,这样大大降低了"类 

型使用者"编程的工作量和复杂性。 
( 2)复数的四则运算法则: 

设z1=a+bi,z2=c+di,(a,b,c,dR以下不再说明) 
c 加减法:(a+bi)±(c+di)=( a ± c )+(b ± d)i 
d 乘法:  (a+bi)*(c+di)=(ac - bd)+(ad + bc)i 
e 除法: 
a bi 
c di 

(a bi)(c di) 


 d 


(ac bd) (bc ad)i 


 d 

( 3)复数的存储结构及接口函数声明: 

复数的存储结构 
//定义复数类型的存储结构,此部分对于 cpxNum 类型的使用者不公开 
typedef struct { 
double    _real; //复数的实部 
double    _imag; //复数的虚部 
} cpxNum; //定义结构体类型 cpxNum 表示"复数" 


复数的接口函数声明 
/*复数类型接口函数的定义部分,此部分对cpxNum类型的使用者公开*/ 
/*用double r, double i  初始化复数c*/ 
void assign(cpxNum& c, double r, double i); 

/*以'1+2i  或1-3i'的形式将复数c输出到控制台窗口*/ 
void print(cpxNum& c); 

/*实现两个复数c1, c2的加法,  和作为函数cplus的返回值*/ 
cpxNum cplus(const cpxNum& c1, const cpxNum& c2); 

/*实现两个复数c1, c2的减法,  差作为函数cmilus的返回值*/ 
cpxNum cmilus(const cpxNum& c1, const cpxNum& c2); 

/*实现两个复数c1, c2的乘法,  积作为函数cmultiply的返回值*/ 
cpxNum cmultiply(const cpxNum& c1, const cpxNum& c2); 

/*实现两个复数c1, c2的乘法,  商作为函数cdivide的返回值*/ 
cpxNum cdivide(const cpxNum& c1, const cpxNum& c2); 

 
 
/*复数接口函数实现示例*/ 
cpxNum cplus(const cpxNum& c1, const cpxNum& c2) 

cpxNum result; 
/*复数的加法:c1的实部+c2的实部、c1的虚部+c2的虚部*/ 
result._real = c1._real + c2._real; 
result._imag = c1._imag + c2._imag; 
return result; 

( 4)复数类型"使用者"代码示例: 

#include "cpxNum.h" 
int _tmain(int argc, _TCHAR* argv[]) 

cpxNum c1, c2; //声明两个'复数'类型的变量 
double real, imag; 
cout <<"请输入第一个复数的实部和虚部: "; 
cin >> real >>imag; 
assign(c1, real, imag); //初始化'复数'c1 
cout <<"您生成的第一个复数是:    "; 
print(c1); 
cout << endl <<"请输入第二个复数的实部和虚部: "; 
cin >> real >>imag; 
assign(c2, real, imag); //初始化'复数'c2 
cout <<"您生成的第二个复数是:    "; 
print(c2); 
cout << endl; 

cout << "***********复数运算测试*************"<<endl; 

cout << "c1 + c2的结果是: ";    print(cplus(c1, c2)); cout << endl; 
cout << "c1 - c2的结果是: "; 
cout << "c1 * c2的结果是: "; 
cout << "c1 / c2的结果是: "; 
print(cmilus(c1, c2)); cout << endl; 
print(cmultiply(c1, c2)); cout << endl; 
print(cdivide(c1, c2)); cout << endl; 
cout << "***********复数运算测试结束*************"<<endl; 

return 0; 


测试数据】 
参见《数据结构题集》page76.