抽象数据类型(Abstract Data Type,ADT)指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。
抽象数据类型中的数据对象和数据运算的声明与数据对象的表示和数据运算的实现相互分离。
根据抽象数据类型的定义,实现复数的基本运算。
注意:
*z1、*z2为引用型指针,不对实参进行改变
*&sum、*&quo为输出型指针,对实参进行改变
需要理解清楚
复数的基本函数
创建复数的数据类型,real为复数的实部,imag为复数的虚部
#include <iostream>
using namespace std;
#include <math.h>
typedef struct
{
double real;//复数的实部
double imag;//复数的虚部
} Complex;
对复数进行初始化,开辟存储空间
z=new Complex 等效于 z=(Complex *)malloc(sizeof(Complex)),两者皆可。
//复数初始化
void InitComplex(Complex *&z)//引用型指针
{
z=new Complex; //给z分配了一块存储空间
}
为复数进行赋值
//复数的赋值
void AssignComplex(Complex *&z,double v1,double v2)
{
z->real=v1; //将e1的值赋给复数的实部
z->imag=v2; //将e2的值赋给复数的虚部
}
要思考复数的特殊形式,然后分成各个不同的情况
/输出复数 能输出复数的特殊形式,例如:0,3,3i,4+i,4-i..
void DispComplex(Complex *z)
{
if(z->real)//实部不为0
{
if(z->imag==0)
cout<<z->real;
else if(z->imag==1)
cout<<z->real<<"+i";
else if(z->imag==-1)
cout<<z->real<<"-i";
else if(z->imag>0)
cout<<z->real<<"+"<<z->imag<<"i";
else
cout<<z->real<<z->imag<<"i";
}
else //实部为0的情况
{
if(z->imag==0)
cout<<0;
else if(z->imag==1)
cout<<"i";
else if(z->imag==-1)
cout<<"-i";
else
cout<<z->imag<<"i";
}
}
销毁复数,避免无用数据占用内存。
//销毁复数
void DestroyComplex(Complex *&z)
{
delete z; //释放z所占的存储空间
}
复数的加减乘除运算
对于复数和积差的运算,构造第三个复数sum,将复数z1和复数z2的值进行运算后保存到复数sum。
对于复数商的运算,先求模进行判断,构造第三个复数quo,将复数z1和复数z2的值进行运算后保存到复数quo。
复数的除法运算公式我就不在这里进行说明了,可以自己百度。
//求两个复数的和
void Add(Complex *z1,Complex *z2,Complex *&sum)
{
sum->real=z1->real+z2->real;
sum->imag=z1->imag+z2->imag;
}
//求两个复数的积
void Product(Complex *z1,Complex *z2,Complex *&pro)
{
pro->real=z1->real*z2->real-z1->imag*z2->imag;
pro->imag=z1->imag*z2->real+z1->real*z2->imag;
}
//求两个复数的差
void Difference(Complex *z1,Complex *z2,Complex *&dif)
{
dif->real=z1->real-z2->real;
dif->imag=z1->imag-z2->imag;
}
//取模
double Module(Complex *z1)
{
return sqrt(z1->real*z1->real+z1->imag*z1->imag);
}
//(a+bi)/(c+di)=(a+bi)*(c-di)/(c*c+d*d);
//求两个复数的商
bool Quotient(Complex *z1,Complex *z2,Complex *&quo)
{
if(Module(z2)==0) //当z2模为0,则不能进行除法运算
{
return false;
}
else
{
quo->real=(z1->real*z2->real+z1->imag*z2->imag)/(z2->real*z2->real+z2->imag*z2->imag);
quo->imag=(z1->imag*z2->real-z1->real*z2->imag)/(z2->real*z2->real+z2->imag*z2->imag);
return true;
}
}
主函数
void main()
{
double a,b;
cout<<"请输入第一个复数的实部:";cin>>a;
cout<<"请输入第一个复数的虚部:";cin>>b;
Complex *z1; InitComplex(z1);
AssignComplex(z1,a,b);
cout<<"第一个复数为:";DispComplex(z1);cout<<endl;
cout<<"复数的模为:"<<Module(z1)<<endl;
cout<<"请输入第二个复数的实部:";cin>>a;
cout<<"请输入第二个复数的虚部:";cin>>b;
Complex *z2; InitComplex(z2);
AssignComplex(z2,a,b);
cout<<"第二个复数为:";DispComplex(z2);cout<<endl;
Complex *sum;
InitComplex(sum);
Add(z1,z2,sum);
cout<<"这两个复数的和为:";DispComplex(sum);cout<<endl;
Complex *diff;
InitComplex(diff);
Difference(z1,z2,diff);
cout<<"这两个复数的差为:";DispComplex(diff);cout<<endl;
Complex *prod;
InitComplex(prod);
Product(z1,z2,prod);
cout<<"这两个复数的积为:";DispComplex(prod);cout<<endl;
Complex *shang;
InitComplex(shang);
if(Quotient(z1,z2,shang))
{
cout<<"这两个复数的商为:";DispComplex(shang);cout<<endl;
}
else
cout<<"除零错误!"<<endl;
//容错性
cout<<"销毁复数";DestroyComplex(z1);DestroyComplex(z2);
DestroyComplex(sum);DestroyComplex(diff);DestroyComplex(prod);DestroyComplex(shang);
}
版权声明:本文为henry594xiaoli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。