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

C++で複素数を扱う方法:クラスを使った実装と加算・減算のサンプルコード

この記事では、C++で複素数を作成・利用する方法を解説します。C++では、複素数の実部(real)と虚部(imaginary)をメンバ変数として持つ独自の複素数クラスを定義できます。さらに、クラスを操作するためのメンバ関数を複数用意することで、複素数の入力・表示・演算を自在に扱えるようになります。

ここでは、複素数型のクラスを1つ作成し、複素数を正しい形式で表示する関数や、2つの複素数を加算・減算するメソッドなどを実装したサンプルを紹介します。

複素数クラスの実装例

#include<iostream>
using namespace std;
class complex{
    int real, img;
    public:
        complex(){
            //複素数を0+0iに初期化するデフォルトコンストラクタ
            real = 0; img = 0;
        }
        complex(int r, int 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;//減算結果を返す
}
main(){
    complex n1(3, 2), n2(4, -3);
    complex result;
    result = add(n1,n2);
    result.display();
    result = sub(n1,n2);
    result.display();
}

実行結果

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

コードの解説

このプログラムのポイントを順番に見ていきましょう。

クラスの定義とコンストラクタ

complexクラスは、実部を表すrealと虚部を表すimgをprivateメンバとして保持します。デフォルトコンストラクタは複素数を「0+0i」に初期化し、引数付きコンストラクタは任意の実部・虚部を指定してオブジェクトを初期化できます。

表示処理(display関数)

display()は虚部の値に応じて表示形式を切り替えます。虚部が-1のときは「-i」、1のときは「+i」と係数を省略して表示するため、数学で一般的な複素数の表記に近い出力になります。

加算・減算(friend関数)

add()とsub()はフレンド関数として定義されており、クラスのprivateメンバに直接アクセスできます。実部同士・虚部同士をそれぞれ加算・減算し、その結果を新しいcomplexオブジェクトとして返します。

main関数の動作

main()では「3+2i」と「4-3i」の2つの複素数を生成し、加算と減算の結果を表示しています。

  • 加算:(3+2i) + (4-3i) = 7-1i →「7-i」と表示
  • 減算:(3+2i) - (4-3i) = -1+5i →「-1 + 5i」と表示

補足:標準ライブラリのcomplex

なお、C++の標準ライブラリには<complex>ヘッダとしてstd::complexクラステンプレートが用意されており、double型やfloat型の複素数を簡単に扱うこともできます。実務では標準ライブラリを利用するのが一般的ですが、クラス設計やフレンド関数の使い方を学ぶ題材として、独自クラスによる実装は非常に良い練習になります。

  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 はデ