C++複数クラス対除算演算子/のリロード
8763 ワード
C 8-1複素加減乗除
(100.0/100.0 points)
タイトルの説明
2つの複素数の加減乗除を求めます.
説明の入力
最初の行の2つのdoubleタイプ数は、最初の複素数の実部虚部を表します.
2行目の2つのdoubleタイプ数は、2番目の複素数の実部虚部を表す
出力の説明
出力2つの複素数の加算減算を順次計算し、1行1結果
出力複素数は実部、スペース、そして虚部を出力し、
サンプル入力
サンプル出力
C++対オペレータのリロードです.
2つの点に注意してください.
1、<<の重荷についてはoutに戻ることに注意し、<<のカスケード出力(複数並列時)を実現することができる.
2、対/の重荷中、return(*this)*Complex(c 2.real,-c 2.imag)/Complex(c 2.real*c 2.real+c 2.imag*c 2.imag,0);このリロード関数自体を呼び出し続けます!それ自体が/に対する重荷で、あなたはここでまた/を使ったので、再帰します!return Complex(real/c 2.real,imag/c 2.real)を追加する必要があります.再帰を平凡な状況に帰す(実際には1層しか再帰しない).
(100.0/100.0 points)
タイトルの説明
2つの複素数の加減乗除を求めます.
説明の入力
最初の行の2つのdoubleタイプ数は、最初の複素数の実部虚部を表します.
2行目の2つのdoubleタイプ数は、2番目の複素数の実部虚部を表す
出力の説明
出力2つの複素数の加算減算を順次計算し、1行1結果
出力複素数は実部、スペース、そして虚部を出力し、
サンプル入力
1 1
3 -1
サンプル出力
4 0
-2 2
4 2
0.2 0.4
1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5
6 using namespace std;
7
8 class Complex{
9 public:
10 Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {};
11 Complex operator+ (const Complex &c2) const;
12 Complex operator- (const Complex &c2) const;
13
14 /* */
15 Complex operator* (const Complex &c2) const;
16 Complex operator/ (const Complex &c2) const;
17 friend ostream & operator<< (ostream &out, const Complex &c);
18
19 private:
20 double real;
21 double imag;
22 };
23
24 Complex Complex::operator+ (const Complex &c2) const {
25 return Complex(real + c2.real, imag + c2.imag);
26 }
27
28 Complex Complex::operator- (const Complex &c2) const {
29 return Complex(real - c2.real, imag - c2.imag);
30 }
31
32 Complex Complex::operator* (const Complex &c2) const
33 {
34 return Complex(real*c2.real - imag*c2.imag, real*c2.imag + imag*c2.real);
35 }
36
37 Complex Complex::operator/ (const Complex &c2) const
38 {
39 if (c2.imag == 0)
40 return Complex(real / c2.real, imag / c2.real);
41 else
42 return (*this)*Complex(c2.real, -c2.imag) / Complex(c2.real*c2.real + c2.imag*c2.imag, 0);
43 }
44
45 ostream & operator<< (ostream &out, const Complex &c)
46 {
47 out << c.real << " " << c.imag << endl;
48 return out;
49 }
50
51 int main() {
52 double real, imag;
53 cin >> real >> imag;
54 Complex c1(real, imag);
55 cin >> real >> imag;
56 Complex c2(real, imag);
57 cout << c1 + c2;
58 cout << c1 - c2;
59 cout << c1 * c2;
60 cout << c1 / c2;
61 }
C++対オペレータのリロードです.
2つの点に注意してください.
1、<<の重荷についてはoutに戻ることに注意し、<<のカスケード出力(複数並列時)を実現することができる.
2、対/の重荷中、return(*this)*Complex(c 2.real,-c 2.imag)/Complex(c 2.real*c 2.real+c 2.imag*c 2.imag,0);このリロード関数自体を呼び出し続けます!それ自体が/に対する重荷で、あなたはここでまた/を使ったので、再帰します!return Complex(real/c 2.real,imag/c 2.real)を追加する必要があります.再帰を平凡な状況に帰す(実際には1層しか再帰しない).