13/2/15

Một số thao tác cơ bản với cấu trúc Số phức

Cấu trúc Phân số và Số phức là 2 cấu trúc đơn giản nhất thường được dùng để minh họa kiểu cấu trúc trong C/C++. Thực hành viết các hàm thao tác với các cấu trúc này sẽ giúp quen dần với kiểu cấu trúc và là bước đệm để học lập trình hướng đối tượng. Các ví dụ sẽ được minh họa bằng ngôn ngữ C++.

Trước khi viết các hàm thao tác trên các cấu trúc Số phức, ta cần khai báo cấu trúc như sau:
struct Complex
{
   float Re; //phần thực - real
   float Im; //phần ảo - imaginary
};

Các hàm thao tác với Complex:

Hiển thị số phức
void OutputComplex(Complex a)
{
   if (a.Re != 0) cout << a.Re;
   if (a.Im != 0)
   {
      if (a.Im == -1) cout << "-i";
      else if (a.Im == 1)
      {
         if (a.Re == 0) cout<<"i";
         else cout<<"+i";
      }
      else
      {
         if (a.Re != 0 && a.Im > 0)
            cout<<"+"<<a.Im<<"i"<<endl;
         else
            cout<<a.Im<<"i"<<endl;
      }
   }
   if (a.Re==0 & a.Im==0)
      cout<<"0"<<endl;
}


Lấy mô-đun của số phức
#include<cmath>
float Modulus(Complex a)
{
   return sqrt(a.Re*a.Re+a.Im*a.Im);
}

Lấy argument của số phức
#include<cmath>
float Argument(Complex a)
{
   return atan(a.Im/a.Re);
}

Lấy số phức liên hợp
Complex Conjg(Complex a)
{
   a.Im = -a.Im;
   return a;
}

Cộng 2 số phức
Complex Add(Complex a, Complex b)
{
   Complex c;
   c.Re = a.Re + b.Re;
   c.Im = a.Im + b.Im;
   return c;
}

Trừ 2 số phức
Complex Sub(Complex a, Complex b)
{
   Complex c;
   c.Re = a.Re - b.Re;
   c.Im = a.Im - b.Im;
   return c;
}

Nhân 2 số phức
Complex Mul(Complex a, Complex b)
{
   Complex c;
   c.Re = a.Re*b.Re - a.Im*b.Im;
   c.Im = a.Re*b.Im + a.Im*b.Re;
   return c;
}

Chia 2 số phức
Complex Div(Complex a, Complex b)
{
   Complex c = Mul(a, Conjg(b));
   float d = b.Re*b.Re + b.Im*b.Im;
   c.Re /= d;
   c.Im /= d;
   return c;
}

Lấy số đối của số phức qua gốc tọa độ O
Complex Inverse(Complex a)
{
   a.Re = -a.Re;
   a.Im = -a.Im;
   return a;
}

Bình phương số phức
Complex Square(Complex a)
{
   Complex c;
   c.Re = a.Re - a.Im*a.Im;
   c.Im = 2*a.Re*a.Im;
   return c;
}

//Cách khác
Complex Square(Complex a)
{
   return Mul(a,a);
}

Lấy một giá trị căn bậc 2 của số phức
Một số phức sẽ có 2 căn bậc 2, giá trị căn bậc 2 còn lại sẽ là số phức đối của giá trị đầu.
#include<cmath>
Complex SquareRoot(Complex a)
{
   Complex c;
   float delta = Modulus(a);
   if ((a.Re+delta)/2 >= 0)
      c.Re = sqrt((a.Re+delta)/2);
   else
      c.Re = sqrt((a.Re-delta)/2);
   c.Im = a.Im / c.Re / 2;
   return c;
}

2 nhận xét:

  1. trong phần hiển thị số phức dòng 20 trong điều kiện if thiếu 1 "&" ạ

    Trả lờiXóa
  2. Nặc danh15:45 19/6/22

    Vậy còn số phức mũ số phức thì sao ạ

    Trả lờiXóa