본문 바로가기
Programming/C++

[C++] 복소수 Complex 연산 클래스 만드는 방법

by 롱일스 2020. 8. 28.
반응형

▣ 복소수(complex number) 

 ●  복소수는 실수부와 허수부로 구성된다.

  ▷ 복소수의 표현 : a + jb  ( a : 실수부 값, b : 허수부 값)

 ●  켤레복소수 (complex conjugate)

  ▷ 켤레복소수의 표현 : a - jb  (허수부의 부호가 반대)

 ●  복소수 연산

  ▷ 덧셈은 쉬우니까 넘어가고

  ▷ 곱셈은 (a + jb)(d + je) = (ad - be) + j(ae + bd)

  ▷ 나눗셈은 (a + jb) / (d + je) = (ad + be) / (d^2+e^2) + j (bd - ae) / (d^2+e^2)

 

▣ 복소수 클래스

 ●  Complexx 클래스

  ▷ 복소수를 표현하는 클래스

  ▷ 복소수의 사칙연산과 켤레복소수를 구하는 멤버함수를 갖고 있다.

  ▷ 실수부의 값이 a, 허수부의 값이 b일 때, (a + jb) 로 출력된다.

멤버함수 비고
Complexx(double r, double i) 생성자
Complexx conj( ) 켤레복소수 반환
Complexx add(const Complexx& c) 덧셈
Complexx sub(const Complexx& c) 뺄셈
Complexx mul(const Complexx& c) 곱셈
Complexx div(const Complexx& c) 나눗셈
void display( ) 복소수 값 출력

 

 ●  Complexx 클래스 - Complexx.h

#include <iostream>
using namespace std;

class Complexx{
    double rPart, iPart; //실수부, 허수부
public:
    //생성자
    Complexx(double r=0, double i=0) : rPart(r), iPart(i) {}
    
    Complexx conj() const {
        return Complexx(rPart, -iPart);
    }
    
    Complexx add(const Complexx& c) const {
        return Complexx(rPart + c.rPart, iPart + c.iPart);
    }
    
    Complexx sub(const Complexx& c) const {
        return Complexx(rPart - c.rPart, iPart - c.iPart);
    }
    
    Complexx mul(const Complexx& c) const
    {
        double r = rPart * c.rPart - iPart * c.iPart;
        double i = rPart * c.iPart + iPart * c.rPart;
        return Complexx(r, i);
    }
    
    Complexx div(const Complexx& c) const
    {
        double d = c.rPart * c.rPart + c.iPart * c.iPart;
        Complexx c1 = mul(c.conj());
        return Complexx(c1.rPart/d, c1.iPart/d);
    }
    
    void display() const
    {
        cout << "[" << rPart;
        if (iPart > 0)
            cout << "+j" << iPart;
        else if (iPart < 0)
            cout << "-j" << -iPart;
        cout << "]";
    }
};
    
  • 생성자, 더하기 add, 빼기 sub, 곱하기 mul, 나누기 div, 복소수 형태로 출력 display 기능을 구현한다.
  • conj( )함수에서 원래 객체의 데이터가 바뀌지 않도록 const로 지정한다.
  • return 명령으로 이름이 없는 임시 객체인 Complexx 객체를 반환한다.
  • display( )함수에서 허수부가 0일 수도 있기 때문에 허수부가 양수일 때, 음수일 때를 나눠서 출력한다.

 

 ●  Complexx 클래스 - Main.cpp

#include <iostream>
#include "Complexx.h"
using namespace std;

int main()
{
    Complexx c1(12,23);
    Complexx c2(23,34);
    Complexx c3 = c1.add(c2);  //default copy constructor
    c1.display();
    cout << " + ";
    c2.display();
    cout << " = ";
    c3.display();
    cout << endl;
    
    c3 = c1.mul(7.0);  //묵시적 형변환
    c1.display();
    cout << " * 7 = ";
    c3.display();
    cout << endl;
    
    return 0;
}
  • Complexx c3 = c1.add(c2)에서 컴파일러에 의해 디폴트 복사 생성자가 동작한다.
  • 처음 c3 객체에는 c1+c2의 값이 들어간다.
  • c3 = c1.mul(7.0);에서 mul 함수의 매개변수로 Complexx 객체만 받았기 때문에 7.0이 묵시적 형변환으로 Complexx(7.0)으로 바뀐다.  
  • Complexx.h에서 생성자가 Complexx(double r=0, double i=0) 형태였기 때문에 c3 = c1.mul(Complexx(7.0, 0.0));로 해석된다. 

 

 ●  실행결과

 

728x90
반응형