一、实验目的:
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));
}