당신에게 한 class가 주어졌다 - Complex


1
2
3
4
5
class Complex
{
public:
int a, b;
};
cs


연산자(operators)는 operator function으로 overload된다. 그리고 이 연산자는 특별한 이름을 가진 규칙적인 함수이다.

이름은 operator keyword 다음에 overload된 operator sign으로 시작한다.

문법은 다음과 같다:


type operator sign(parameters) { /*...body...*/ }


 Complex class를 위해 + 와 << 연산자를 overload 해보자.

+ 연산자는 complex addition 규칙에 따라 complex 수를 더해야 한다.

(a+ib)+(a+id) = (a+c) + i(b+d)


stream insertion operator << 를 stream에 "a+ib"를 더하도록 overload 해야한다.

cout << c << endl;


위 문장은  a = c.a와 b= c.b인 "a+ib"로 출력해야 한다.


Input Format


overloaded operator +는 두 개의 complex numbers(a+ib 와 c+id)를 인수로 받아서 단일 complex number로 반환한다.

overloaded operator <<는 "a+ib"를 overloaded operator에 인수로 넘겨진 complex number의 a가 실수부이고 

b가 허수부인 stream에 더한다.


Sample Input

3+i4
5+i6

Sample Output

8+i10




solution)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//Operator Overloading
 
#include<iostream>
#include<string>
using namespace std;
 
class Complex
{
public:
    int a, b;
    void input(string s)    //문자열들을 숫자로 분리시켜야 함
    {
        int v1 = 0;
        int i = 0;    //전역 변수로 전체 문자열을 컨트롤
        while (s[i] != '+')    // + 이전의 숫자들 처리
        {
            v1 = v1 * 10 + s[i] - '0';    // 이전의 한 자리 수 값의 자리수를 높이고 1의 자리수를 더함
            i++;
        }
        while (s[i] == ' ' || s[i] == '+' || s[i] == 'i')    // 공백, +, i 기호 나오면 스킵
        {
            i++;
        }
        int v2 = 0;
        while (i<(int)s.length()) // + 이전의 숫자 처리와 같은 과정, i는 그대로 값이 유지되기 때문에 남은 길이에 대해서 처리
        {
            v2 = v2 * 10 + s[i] - '0';    
            i++;
        }
        a = v1;
        b = v2;
    }
};
 
Complex operator+ (Complex &com1, Complex &com2)
{
    return{ com1.a + com2.a, com1.b + com2.b };
}
 
ostream& operator<< (ostream& os, const Complex& c)
{
    os << c.a << "+i" << c.b << endl;
    return os;
}
 
int main()
{
    Complex x, y;
    string s1, s2;
    cin >> s1;
    cin >> s2;
    x.input(s1);
    y.input(s2);
    Complex z = x + y;
    cout << z << endl;
 
 
}
 
cs





Understanding the Arithmetic Conversions


bool flag;         char cval;

short sval;         unsigned short usval;

int ival;         unsigned int uival;

long lval;         unsigned long ulval;

float fval;         double dval;


3.14159L + 'a';     // 'a' promoted to int, then that int converted to long double

dval + ival;         // ival converted to double

dval + fval;         // fval converted to double

ival = dval;         // dval converted (by truncation) to int

flag = dval;         // if dval is 0, then flag is false, otherwise true

cval + fval;         // cval promoted to int, then that int converted to float

sval + cval;         // sval and cval promoted to int

cval + lval;         // cval converted to long

ival + ulval;         // ival converted to unsigned long

usval + ival;         // promotion depends on the size of unsigned short and int

uival + lval;         // conversion depends on the size of unsigned int and long


'객체 지향 설계' 카테고리의 다른 글

Union  (0) 2018.06.29
Vector-Sort, iterator  (0) 2018.06.28
Class  (0) 2018.06.27
string Streams  (0) 2018.06.26
Knowing Your Objects: this Pointer 2.  (0) 2018.02.25