C++复数的具体实现

  抽象数据类型(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);


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henry594小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值