数据结构线性表实验报告

一、实验目的:

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));

      

}

posted @ 2020-10-06 22:05  乾月十二  阅读(2560)  评论(0编辑  收藏  举报