影风博客

使用CC++实现复数抽象数据类型Complex

2017-08-03

最近才开始学习数据结构,对很多问题的认识不够深入,本文主要举一个用数据结构求解问题的过程实例,来加强深入认识。

先介绍一下抽象数据类型:

抽象数据类型(ADT):指的是从求解问题的数学模型中抽象出来的数据结构和运算(抽象运算),而不考虑计算机的具体实现。

抽象数据类型=逻辑结构+抽象运算

例如,定义复数抽象数据类型Complex,一个复数的形式:e1+e2(e1,e2)

ADT Complex{
数据对象:
D={e1,e2|e1,e2均为实数}

数据关系:
R={<e1,e2>|e1是复数的实部,e2是复数的虚部}

基本运算:
AssignComplex(&z,v1,v2):构造复数z。
DestroyComplex(&z):复数z被销毁。
GetReal(z,&real):返回复数z的虚部值。
GetImag(z,&Imag):返回复数z的虚部值。
Add(z1,z2,&sum):返回两个复数z1、z2的和。
Sub(z1,z2,&sum):返回两个复数z1、z2的差。
Mul(z1,z2,&sum):返回两个复数z1、z2的积。
Div(z1,z2,&sum):返回两个复数z1、z2的商。

}ADT Complex

下面是给出的参考程序:

#include <stdio.h>
typedef struct { double e1; double e2; }
Complex; void AssignComplex(Complex &z,double v1,double v2) //构造复数Z
{
z.e1=v1;
z.e2=v2;
}
void DestroyComplex(Complex &z) //复数z被销毁
{
}
void GetReal(Complex z,double &real) //返回复数z的实部值
{ real=z.e1; } void GetImag(Complex z,double &Imag) //返回复数z的虚部值
{ Imag=z.e2; } void Add(Complex z1,Complex z2,Complex &sum) //返回两个复数z1、z2的和
{ sum.e1=z1.e1+z2.e1; sum.e2=z1.e2+z2.e2; } void Display(Complex z) //输出一个复数
{ printf("%g+%gi\n",z.e1,z.e2); }
void main() {
Complex c1,c2,c3;
AssignComplex(c1,1,2);
AssignComplex(c2,3,4);
Add(c1,c2,c3);
printf("c3: ");
Display(c3);
}

以下是根据参考程序,自己对这个过程的实现:

#include <stdio.h>
typedef struct { 
        double e1; //e1表示实部 
        double e2; //e2表示虚部 
} Complex; //定义复数的结构体 
void AssignComplex(Complex &z,double v1,double v2) //构造复数Z 
{ 
    z.e1=v1; 
    z.e2=v2; 
} 

void DestroyComplex(Complex &z) //复数z被销毁 
{ } 

void GetReal(Complex z,double &real) //返回复数z的实部值
{ 
  real=z.e1; 
} 

void GetImag(Complex z,double &Imag) //返回复数z的虚部值
{ 
  Imag=z.e2; 
} 

void Add(Complex z1,Complex z2,Complex &sum) //返回两个复数z1、z2的和 
{ 
    sum.e1=z1.e1+z2.e1; 
    sum.e2=z1.e2+z2.e2; 
} 

void Sub(Complex z1,Complex z2,Complex &sum)//返回两个复数z1、z2的差 
{ 
    sum.e1=z1.e1-z2.e1; 
    sum.e2=z1.e2-z2.e2; 
} 

void Mul(Complex z1,Complex z2,Complex &sum)//返回两个复数z1、z2的积 
{ 
    sum.e1=z1.e1*z2.e1-z1.e2*z2.e2;
    sum.e2=z1.e2*z2.e1+z1.e1*z2.e2; 
} 

void Div(Complex z1,Complex z2,Complex &sum)//返回两个复数z1、z2的商 
{ 
    sum.e1=(z1.e1*z2.e1+z1.e2*z2.e2)/(z2.e1*z2.e1+z2.e2*z2.e2); 
    sum.e2=(z1.e2*z2.e1-z1.e1*z2.e2); 
} 

void Display(Complex z) //输出一个复数 
{ 
    printf("%g+%gi\n",z.e1,z.e2); 
} 

void main() { 
    Complex c1,c2,c3; 
    int a,b; double d; 
    printf("请输入第一个复数的实部 虚部:"); 
    scanf("%d %d",&a,&b); 
    AssignComplex(c1,a,b); 
    printf("\n请输入第二个复数的实部 虚部:"); 
    scanf("%d %d",&a,&b); 
    AssignComplex(c2,a,b); 
    Add(c1,c2,c3); 
    printf("和=: "); 
    Display(c3); 
    Sub(c1,c2,c3); printf("差=: "); 
    Display(c3); Mul(c1,c2,c3); printf("积=: "); 
    Display(c3); Div(c1,c2,c3); printf("商=: "); 
    Display(c3); GetReal(c3,d); printf("此时,c3的实部为:%g",d);//自动选f格式或e格式中较短的一种输出,且不输出无意义的零。 
    GetImag(c3,d); printf(",c3的虚部为:%g\n",d); 
    DestroyComplex(c3); printf("复数已被销毁!\n"); 
}
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章