구조체, 공용체, 열거형을 공부하다보니 구조체를 가장 많이 쓸 것 같다는 생각이 들었다.
실제로 교수님도 그런 얘기를 하신 기억이 어렴풋이 나는 것 같기도..?
우선은 하나씩 틀 잡아놨던, 구조체를 사용하지 않은 초기수준 코드다.
#include <stdio.h>
#include <math.h>
int main(void)
{
int a, b, c, d, n, A, B;
double C, D;
printf("첫번째 복소수의 실수부와 허수부를 입력하시오: ");
scanf("%d %d", &a, &b);
printf("첫번째 복소수의 실수부와 허수부를 입력하시오: ");
scanf("%d %d", &c, &d);
printf("\n원하는 연산번호를 입력하시오(1.덧셈, 2.뺄셈, 3.곱셈, 4.절대값):");
scanf("%d", &n);
if (n == 1)
{
A = a + c;
B = b + d;
printf("입력한 연산번호: 1.덧셈\n\n");
printf("\n연산결과: %d+%di", A, B);
}
else if (n == 2)
{
A = a - c;
B = b - d;
printf("입력한 연산번호: 2.뺄셈\n\n");
if (B > 0)
printf("\n연산결과: %d+%di", A, B);
else
printf("\n연산결과: %d%di", A, B);
}
else if (n == 3)
{
A = ((a * c) - (b * d));
B = ((a * d) + (b * c));
printf("입력한 연산번호: 3.곱셈\n\n");
printf("\n연산결과: %d+%di", A, B);
}
else
{
C = sqrt(a * a + b * b);
D = sqrt(c * c + d * d);
printf("입력한 연산번호: 4.절대값\n\n");
printf("\n연산결과: %.2f, %.2f", C, D);
}
return 0;
}
그래서 구조체를 최대한 활용해서 코드를 다시 작성해보았다.
#include <stdio.h>
#include <math.h>
struct complex {
double real;
double imagin;
};
struct complex add(struct complex x, struct complex y);
struct complex sub(struct complex x, struct complex y);
struct complex mul(struct complex x, struct complex y);
struct complex sqrts(struct complex x);
int main(void)
{
struct complex a, b, result, A, B;
int n;
printf("첫번째 복소수의 실수부와 허수부를 입력하시오: ");
scanf("%lf %lf", &a.real, &a.imagin);
printf("첫번째 복소수의 실수부와 허수부를 입력하시오: ");
scanf("%lf %lf", &b.real, &b.imagin);
printf("\n원하는 연산번호를 입력하시오(1.덧셈, 2.뺄셈, 3.곱셈, 4.절대값):");
scanf("%d", &n);
if (n == 1)
{
result = add(a,b);
printf("입력한 연산번호: 1.덧셈\n\n");
printf("\n연산결과: %lf+%lfi", result.real, result.imagin);
}
else if (n == 2)
{
result = sub(a,b);
printf("입력한 연산번호: 2.뺄셈\n\n");
if (result.imagin > 0)
printf("\n연산결과: %lf+%lfi", result.real, result.imagin);
else
printf("\n연산결과: %lf%lfi", result.real, result.imagin);
}
else if (n == 3)
{
result = mul(a, b);
printf("입력한 연산번호: 3.곱셈\n\n");
if (result.imagin > 0)
printf("\n연산결과: %lf+%lfi", result.real, result.imagin);
else
printf("\n연산결과: %lf%lfi", result.real, result.imagin);
}
else
{
A = sqrts(a);
B = sqrts(b);
printf("입력한 연산번호: 4.절대값\n\n");
printf("\n연산결과: %.2lf, %.2lf", A.real, B.real);
}
return 0;
}
struct complex add(struct complex x, struct complex y)
{
struct complex result;
result.real = x.real + y.real;
result.imagin = x.imagin + y.imagin;
return result;
}
struct complex sub(struct complex x, struct complex y)
{
struct complex result;
result.real = x.real - y.real;
result.imagin = x.imagin - y.imagin;
return result;
}
struct complex mul(struct complex x, struct complex y)
{
struct complex result;
result.real = x.real * y.real - x.imagin * y.imagin;
result.imagin = x.real * y.imagin + x.imagin * y.real;
return result;
}
struct complex sqrts(struct complex x)
{
struct complex result;
result.real = sqrt(x.real * x.real + x.imagin * x.imagin);
return result;
}
복소수의 절댓값을 계산할 때 두개의 복소수를 따로 계산하다보니 구조체 안에서 어떻게 나타내야할지 잘 몰랐는데 그냥 결과가 정수부분만 출력이 되는 것을 생각하고 result.real이라고 하니 결과가 나왔다.
구조체를 활용한 방법이 코드의 길이는 더 길었다. 그래도 더 복잡한 내용이 있을 때 유용할 것 같다. 구조체를 공부하며 가장 크게 느낀점은 구조체를 또 다른 구조체 안에 넣거나 할 때 머릿속으로 논리계산을 잘 해야겠다는 것이다. 그냥 코드를 짰을 때는 단순했는데 구조체를 써보니 복잡하다는 생각이 들었고 익숙해지도록 노력을 정말 많이 해야겠다는 생각이 들었다.
'프로그래밍 언어 > c' 카테고리의 다른 글
C언어 동적메모리 (0) | 2021.01.20 |
---|---|
C언어 구조체, 공용체, 열거형 (1) (0) | 2021.01.12 |
구조체와 공용체 (0) | 2021.01.10 |
포인터와 함수 그리고 void형 포인터 (2) | 2021.01.07 |
c언어 (1) - 포인터 (0) | 2021.01.05 |