구조체, 공용체, 열거형을 공부하다보니 구조체를 가장 많이 쓸 것 같다는 생각이 들었다.

실제로 교수님도 그런 얘기를 하신 기억이 어렴풋이 나는 것 같기도..?

 

우선은 하나씩 틀 잡아놨던, 구조체를 사용하지 않은 초기수준 코드다.

#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

+ Recent posts