一、实验目的:

1、      复习c/c++语言,并实现简单的算法设计。

2、      掌握结构体类型/类的定义方法以及自定义数据类型使用。

3、      掌握函数的设计和调用。

4、      学会理解ADT(Abstract Data Type)描述,从而利用程序语言加以实现。

5、      学会基本的程序组织方法和对抽象数据类型实现的应用。

 

二、实验内容和要求

实验内容:

设计一个复数的抽象类型定义。

实现复数基本运算基本操作。

编写函数对所实现的抽象数据类型进行测试并验证。

实验要求:

1、由输入生成复数的实部虚部。

2、对所定义的数据类型的应用中,间接访问结构体类型/类内部数据。

3、完成基本四则运算,设置复数实部、虚部等操作。

 

三、实现提示

1、抽象数据类型定义

抽象数据类型用一个三元组(D,S,P)表实,其中D表示数据对象,S是D上的关系集,P是对数据对象D的基本操作集合。

A、抽象数据类型的定义格式:

ADT抽象类型名{

数据对象:<数据对象定义>

数据关系:<数据关系定义>

基本操作:<基本操作定义>

}ADT抽象数据类型名

B、抽象数据类型中基本操作的定义格式:

基本操作名(参数表)

初始条件:<初始条件描述>

操作结果:<操作结果描述>

赋值参数:为操作提供输入值;

引用参数:既可为操作提供输入值,还返回操作结果;

初始条件:指操纵前数据结构和参数应满足的条件。若不满足,操作失败,返回相应错误信息。初始条件为空,省略之。

操作结果:操作正常完成,数据结构的变化和返回结果。

 

2、抽象数据类型的复数例

ADTComplex{

D: {real, imag | e1,e2为实数}

R:{<real, imag>}

P: void InitialComplex(Complex &x,float r, float i);

赋值参数:初始化复数x,实数r,虚部i;

操作结果:设置复数x的实部为r,虚部为i;

 

float GetReal(Complex x);

赋值参数:复数x

操作结果:返回复数x的实部

 

float GetImag(Complex x);

赋值参数:复数x

操作结果:返回复数x的虚部

 

void SetReal(Complex &x, float real);

赋值参数:操作复数x,将为复数x赋值于实部的real;

操作结果:复数x的实部被设置为real;

 

void SetImag (Complex &x, float imag);

赋值参数:操作复数x,将为复数x赋值于虚部的imag;

操作结果:复数x的虚部被设置为imag;

 

Complex add(Complex x, Complex y);

赋值参数:所要相加的两个复数x,y

操作结果:返回两个复数x和y的和

 

Complex sub(Complex x, Complex y);

赋值参数:所要相减的两个复数x,y

操作结果:返回两个复数x和y差

 

Complex multi(Complex x, Complex y);

赋值参数:所要相称的两个复数x,y

操作结果:返回两个复数x和y积

 

Complex expect(Complex x, Complex y);

赋值参数:所要相除的两个复数x,y

操作结果:返回两个复数x和y商

3、复数基本知识

复数基本四则运算:

①  、复数z1与z2的和的定义:z1+z2=(a+bi)+(c+di)=(a+c)+(b+d)i;

 

②  、复数z1与z2的差的定义:z1-z2=(a+bi)-(c+di)=(a-c)+(b-d)i;

 

③  、复数的乘法运算规则:设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i,其实就是把两个复数相乘,类似两个多项式相乘,在所得的结果中把i2换成-1,并且把实部与虚部分别合并,两个复数的积仍然是一个复数。

 

④、复数的除法运算规则:\

4、结构体基本知识

Typedef为关键字,作用是给一种数据类型定义一个新的名字。

其可以给多种数据类型定义新的名字,既可以是int、float等内部基础数据类型,也可以是已经定义的结构体类型。

 

四、实验步骤简述

1、熟悉复数、结构体基本概念。

2、创建"ComPlex.h"、"ComPlex.cpp"、"main.cpp"文件,

"ComPlex.h"文件:储存复数的结构定义和操作对应的函数头。

"ComPlex.cpp"文件:实现"ComPlex.h"文件所定义的操作。

"main.cpp"文件:储存主函数,实现复数的应用。

3、设计封装复数的结构体。

4、根据复数抽象类型定义中所指的基本操作,定义并实现复数的初始化,实部和虚部的获取和设置函数。

5、根据复数抽象类型定义中所指的基本运算,定义并实现复数的加减乘除四则运算。

6、编写一个主函数,接受用户的输入,并根据输入构造连个复数变量。

7、在数函数中对步骤6中构造的复数进行各项运算,验证各种运算结果的正确性。

8、验证得到以下结果:

 

五、实验总结:

1、程序的实现首先要明确程序设计的目的和算法,明确所应用到的基本知识。

2、程序设计应当保持明确的思路,尽可能在完善简化程序的过程中优化程序,多文件可增加程序可读性。

3、数据类型的抽象化,成就了定义的普适性。

六、代码

//Complex.h
#include<stdio.h>
 
typedef struct
{
       float real;
       float imag;
      
}Complex;
 
void InitialComplex(Complex &x,float r, float i);
 
float GetReal(Complex x);
 
float GetImag(Complex x);
 
void SetReal(Complex &x, float real);
 
void SetImag (Complex &x, float imag);
 
Complex add(Complex x, Complex y);
 
Complex sub(Complex x, Complex y);
 
Complex multi(Complex x, Complex y);
 
Complex expect(Complex x, Complex y);
 
//Complex.cpp
#include<stdio.h>
#include"Complex.h"
void InitialComplex(Complex &x, float r, float i)
{
       x.imag = i;
       x.real = r;
}
 
float GetReal(Complex x)
{
       return x.real;
}
 
float GetImag(Complex x)
{
       return x.imag;
}
 
void SetReal(Complex &x, float real)
{
        x.real = real;
      
}
 
void SetImag (Complex &x, float imag)
{
       x.imag = imag;
}
 
Complex add(Complex x, Complex y)
{
       Complex z;
       z.imag = x.imag + y.imag;
       z.real = x.real + y.real;
       return z;
}
 
Complex sub(Complex x, Complex y)
{
       Complex z;
       z.imag = x.imag - y.imag;
       z.real = x.real - y.real;
       return z;
      
}
 
Complex multi(Complex x, Complex y)
{
       Complex z;
       z.imag  =  x.real * y.imag + x.imag * y.real ;
       z.real = x.real * y.real - x.imag * y.imag ;
       return z;
}
 
Complex expect(Complex x, Complex y)
{
       Complex z;
       z.real = (x.real *y.real +x.imag  *y.imag )/(y.real *y.real +y.imag *y.imag );
       z.imag = (x.real *(-y.imag) + y.real *x.imag)/ ( y.real*y.real +y.imag *y.imag );
      
       return z;
}
 
//main.cpp
#include"Complex.h"
int main()
{
       Complex a,b,c;
       float r = 0, i =0;
       printf("请输入第一个复数的实部、虚部,用空格隔开:\n");
       scanf("%f %f", &r, &i);
       InitialComplex(a,r,i);
      
       printf("请输入第二个复数的实部、虚部,用空格隔开:\n");
       scanf("%f %f",&r, &i);
       SetReal(b,r);
       SetImag(b,i);
      
       printf("第一个复数的实部为:%f, 虚部为:%f。\n", GetReal(a), GetImag(a)) ;
       printf("第二个复数的实部为:%f, 虚部为:%f。\n", GetReal(b), GetImag(b)) ;
      
       printf("两个复数之和:");
       c = add(a,b);
       printf("%f %f \n", GetReal(c), GetImag(c));
      
       printf("两个复数之差:") ;
       c = sub(a,b);
       printf("%f %f \n", GetReal(c), GetImag(c));
      
       printf("两个复数乘积:");
       c = multi(a,b);
       printf("%f %f \n", GetReal(c), GetImag(c));
      
       printf("两个复数的商:");
       c = expect(a,b);
       printf("%f %f \n", GetReal(c), GetImag(c));
      
}