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所占的存储空间
}

複素数の加算、減算、乗算、除算

複素数と積の差の演算では、3 番目の複素数和を構築し、演算後の複素数 z1 と複素数 z2 の値を複素数和に保存します。

複素商の演算は、まず判定用の法を計算し、3番目の複素数quoを構築し、計算後の複素数quoに複素数z1と複素数z2の値を保存します。

ここでは複素数の除算公式については説明しません。Baidu で自分で計算することができます。

//求两个复数的和
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);


}

 

おすすめ

転載: blog.csdn.net/henry594xiaoli/article/details/123599603