C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で複素数を扱う方法:クラスの自作と加減算の実装

C++における複素数の扱い方

この記事では、C++で複素数を作成し、活用する方法を解説します。C++では独自の複素数クラスを定義でき、複素数の実部(real)と虚部(imaginary)をメンバ変数として保持することが可能です。さらに、そのクラスを操作するためのメンバ関数やフレンド関数を用意すれば、複素数の加算・減算といった演算も自然な形で実装できます。

以下の例では、複素数を表すクラスを1つ作成し、複素数を正しい形式で画面に表示する関数、そして2つの複素数を加算・減算するためのメソッドを追加しています。

複素数クラスの設計方針

今回作成するcomplexクラスは、次のような構成になっています。

  • デフォルトコンストラクタ:複素数を「0+0i」で初期化します。
  • 引数付きコンストラクタ:実部と虚部を指定して初期化します。
  • set() / get() / display():値の入力、取得、整形しての表示を行います。
  • add() / sub()(フレンド関数):2つの複素数の加算・減算を行います。

サンプルコード

#include<iostream>
using namespace std;

class complex {
    int real, img;
    public:
        complex() {
            // デフォルトコンストラクタ:複素数を0+0iに初期化
            real = 0; img = 0;
        }
        complex(int r, int i) {
            // 引数付きコンストラクタ:実部r・虚部iで複素数を初期化
            real = r; img = i;
        }
        void set();
        void get();
        void display();
        friend complex add(complex, complex);
        friend complex sub(complex, complex);
};

void complex::set() {
    cout << "Enter Real part: ";
    cin >> real;
    cout << "Enter Imaginary Part: ";
    cin >> img;
}

void complex::get() {
    cout << "The complex number is: " << real << "+" << img << "i" << endl;
}

void complex::display() {
    if(img < 0)
        if(img == -1)
            cout << "The complex number is: " << real << "-i" << endl;
        else
            cout << "The complex number is: " << real << img << "i" << endl;
    else
        if(img == 1)
            cout << "The complex number is: " << real << " + i" << endl;
        else
            cout << "The complex number is: " << real << " + " << img << "i" << endl;
}

complex add(complex c1, complex c2) {
    complex res;
    res.real = c1.real + c2.real; // 実部の加算
    res.img = c1.img + c2.img;    // 虚部の加算
    return res;                   // 加算結果を返す
}

complex sub(complex c1, complex c2) {
    complex res;
    res.real = c1.real - c2.real; // 実部の減算
    res.img = c1.img - c2.img;    // 虚部の減算
    return res;                   // 減算結果を返す
}

int main() {
    complex n1(3, 2), n2(4, -3);
    complex result;

    result = add(n1, n2);
    result.display();

    result = sub(n1, n2);
    result.display();
}

このプログラムでは、n1 を「3+2i」、n2 を「4-3i」として生成し、それぞれ加算と減算を行った結果を表示しています。虚部が負の場合や ±1 の場合に表示形式を切り替えることで、「7-i」「-1 + 5i」のように数学的に自然な表記になります。

実行結果

The complex number is: 7-i
The complex number is: -1 + 5i

コードのポイント

  • フレンド関数の利用:add() と sub() はフレンド関数として宣言されているため、privateメンバである real と img に直接アクセスできます。
  • display() の条件分岐:虚部が -1 や 1 の場合に係数を省略し、読みやすい出力になるよう工夫されています。
  • main() の戻り値:標準規格に準拠するため、戻り値の型は int として宣言するのが推奨されます。

補足:標準ライブラリ std::complex の活用

実際の開発では、<complex> ヘッダーで提供される標準ライブラリの std::complex を使うと、四則演算や絶対値、共役複素数などの演算がすぐに利用でき、非常に便利です。

#include<iostream>
#include<complex>
using namespace std;

int main() {
    complex<double> n1(3.0, 2.0), n2(4.0, -3.0);
    cout << n1 + n2 << endl; // (7,-1)
    cout << n1 - n2 << endl; // (-1,5)
}

学習目的でクラス設計を理解したい場合は自作クラスが有効ですが、実務では std::complex を使うのが一般的です。

  1. 【C++入門】エマープ数(Emirp)とは?n以下のエマープ数をすべて出力するプログラム

    エマープ数(Emirp number)とは、素数の一種で、その桁を逆順に並べ替えると別の素数になる数のことです。ここでいう「別の素数」とは、元の数と同じ値にならないものを指します。 Emirpは「prime(素数)」を逆から読んだ言葉 すべての素数がエマープ数になるわけではありません。たとえば、回文素数(121のように逆から読んでも同じ数になる素数)や、1桁の素数(2、3、5、7)は、桁を逆にしても同じ数または意味を持たないため、エマープ数には含まれません。 エマープ数の例:13、17、37、733 などがあります。 13 を逆にすると 31(素数)→ エマープ数 17 を逆にすると 71

  2. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ