구조체는 뭐냐...

변수 여러개를 묶어둔 것을 의미한다. 원래, C에서 쓸 수 있는 변수 형태는 정수, 실수, 긴 실수 정도인데, 우린 벡터도 써야 하고 복소수도 써야 한다. 이런 경우, 새로운 형태를 지정해 줘야 한다. 사용법은 간단하고 복잡하다.

struct 구조체
{
    int x;
    int y;
}
이렇게 해 두면 구조체가 선언된다. 그리고 구조체에 있는 값을 다른데서 가져다가 써야 한다면 항상 그 앞에 struct를 붙여줘야 한다. 안그러면 구조체가 구조체라는걸 모르기 때문이다.

실제로 구조체 형태의 변수를 쓸 때는 위와 같이 구조체를 선언해주고, 다음과 같이 사용해야 한다.
struct 구조체 변수이름;
만약 이 변수 안에 있는 x라는 녀석의 값이 필요하면 다음과 같이 불러오면 된다.
변수이름.x
물론 y가 필요하면 점 찍고 y를 쓰면 된다.

아래의 소스는 내가 C언어에서 복소수를 처리하기 위해서 직접 만든 코드이다. 사칙연산, 켤레복소수, 실수부분, 허수부분, 절대값 등을 처리할 수 있게 되어 있다. 한번 분석해 보면 구조체가 어떻게 작동하는지 알 수 있을 것이다.
struct cnumber
{
double x;
double y;
};

//addition
struct cnumber add_cnum(struct cnumber z, struct cnumber w)
{
struct cnumber a={z.x+w.x,z.y+w.y};
return a;
}

//subtraction
struct cnumber sub_cnum(struct cnumber z, struct cnumber w)
{
struct cnumber a;
a.x=z.x-w.x;
a.y=z.y-w.y;
return a;
}

//multiplication
struct cnumber mul_cnum(struct cnumber z, struct cnumber w)
{
struct cnumber a;
a.x=z.x*w.x-z.y*w.y;
a.y=z.x*w.y+z.y*w.x;
return a;
}

//complex conjugate
struct cnumber conj_cnum(struct cnumber z)
{
struct cnumber a;
a.x=z.x;
a.y=-z.y;
return a;
}

//norm
double norm_cnum(struct cnumber z)
{
double a;
z=mul_cnum(z,conj_cnum(z));
a=z.x;
return a;
}

//division : z is divided by w
struct cnumber div_cnum(struct cnumber z, struct cnumber w)
{
struct cnumber a;
a=mul_cnum(z,conj_cnum(w));
a.x=a.x/norm_cnum(w);
a.y=a.y/norm_cnum(w);
return a;
}

//real part
double re_cnum(struct cnumber z)
{
double a;
a=z.x;
return a;
}

//imaginary part
double im_cnum(struct cnumber z)
{
double a;
a=z.y;
return a;
}

//complex phase
struct cnumber phase_cnum(struct cnumber z, double k)
{
struct cnumber x={cos(k),sin(k)};
struct cnumber m=mul_cnum(z,x);
return m;
}


by snowall 2006.12.30 01:50
  • 그네고치기 2006.12.30 12:10 ADDR EDIT/DEL REPLY

    듣기로는
    cnumber a, b, c;
    c = a+b;
    c = a/b;

    이런 식의 사용도 가능하다던데.. 오, 구조체 초기화는 저런 식으로 하는군요. 참 신기한 언어입니다.

    type
    cnumber=record
    x:integer;
    y:integer;
    end;

    파스칼 버전 ^^;

    • snowall 2006.12.30 12:43 신고 EDIT/DEL

      파스칼은 변수형 선언을 뒤에 하네요;
      복소수 덧셈 연산을 a+b형태로 하는건 연산자를 재정의 해야 한다고 해서 관뒀습니다. 연산자 재정의를 하려면 정수들끼리 더할 때도 실계수 복소수 형태로 더할텐데, 그걸 고려해서 정의하려면 너무 복잡해지죠;