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型の複素数を簡単に扱うこともできます。実務では標準ライブラリを利用するのが一般的ですが、クラス設計やフレンド関数の使い方を学ぶ題材として、独自クラスによる実装は非常に良い練習になります。
-
【C++入門】エマープ数(Emirp)とは?n以下のエマープ数をすべて出力するプログラム
エマープ数(Emirp number)とは、素数の一種で、その桁を逆順に並べ替えると別の素数になる数のことです。ここでいう「別の素数」とは、元の数と同じ値にならないものを指します。 Emirpは「prime(素数)」を逆から読んだ言葉 すべての素数がエマープ数になるわけではありません。たとえば、回文素数(121のように逆から読んでも同じ数になる素数)や、1桁の素数(2、3、5、7)は、桁を逆にしても同じ数または意味を持たないため、エマープ数には含まれません。 エマープ数の例:13、17、37、733 などがあります。 13 を逆にすると 31(素数)→ エマープ数 17 を逆にすると 71
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ