자료구조_복소수 계산

지원·2025년 3월 27일
0

자료구조

목록 보기
4/11
post-thumbnail

복소수를 계산하는 프로그램 만들기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//복소수를 구조체로 정의하고 두 복소수에 대해 사칙연산을 수행하는 함수를 만드는 과제

//복소수 구조체 정의
typedef struct {
	double real;
	double imag;
} ComplexNumber;

//1. 복소수 데이터 입력
void inputComplex(ComplexNumber* x, ComplexNumber* y) {
	printf("첫번째 복소수 중 실수부 입력: ");
	scanf_s("%lf", &x->real);

	printf("첫번째 복소수 중 허수부 입력(예: -i -> -1로 입력): ");
	scanf_s("%lf", &x->imag);

	printf("두번째 복소수 중 실수부 입력: ");
	scanf_s("%lf", &y->real);

	printf("두번째 복소수 중 허수부 입력(예: -i -> -1로 입력): ");
	scanf_s("%lf", &y->imag);
}

//2. 복소수 덧셈
ComplexNumber add(ComplexNumber a, ComplexNumber b) {
	ComplexNumber result;
	result.real = a.real + b.real;
	result.imag = a.imag + b.imag;
	return result;
}

//3. 복소수 뺄셈
ComplexNumber subtract(ComplexNumber a, ComplexNumber b) {
	ComplexNumber result;
	result.real = a.real - b.real;
	result.imag = a.imag - b.imag;
	return result;
}

//4. 복소수 곱셈
ComplexNumber multiply(ComplexNumber a, ComplexNumber b) {
	ComplexNumber result;
	//복소수 곱셈 과정
	//(a + bi) * (c + di)
	//= (a * c) + (a * di) + (bi * c) + (bi * di)
	//= ac + adi + bci + bd * (i * i)
	result.real = (a.real * b.real) - (a.imag * b.imag); //i는 제곱하면 -1이 됨
	result.imag = (a.real * b.imag) + (a.imag * b.real);
	return result;
}

//5. 복소수 나눗셈
ComplexNumber divide(ComplexNumber a, ComplexNumber b) {
	ComplexNumber result;
	//복소수 나눗셈 과정
	//분모에서 i를 없애기 위해 분자와 분모에 분모의 켤레 복소수 (c - di)를 곱함
	double denominator = (b.real * b.real) + (b.imag * b.imag); //분모(denominator)는 (c*c)+(d*d)이런 결과로 나옴
	if (denominator == 0) { //분모가 0일 경우
		printf("0으로 나눌 수 없습니다. \n");
		result.real = result.imag = 0;
	}
	else { //분모로 나누어 결과의 실수부와 허수부를 계산
		result.real = ((a.real * b.real) + (a.imag * b.imag)) / denominator;
		result.imag = ((a.imag * b.real) - (a.real * b.imag)) / denominator;
	}
	return result;
}

int main() {
	//ComplexNumber 멤버를 0으로 초기화
	ComplexNumber x = { 0,0 }, y = { 0,0 };
	ComplexNumber result;
	int choice;

	printf("***복소수 연산***\n");
	printf("1. 데이터입력\n");
	printf("2. 복소수 덧셈\n");
	printf("3. 복소수 뺄셈\n");
	printf("4. 복소수 곱셈\n");
	printf("5. 복소수 나눗셈\n");
	printf("6. 프로그램 종료\n");

	while (1) { //6을 입력하기 전까지 사용자가 계속해서 연산을 수행할 수 있어야 하기 때문에 while(1)문으로 무한루프
		printf("◆작업할 번호를 입력>> ");
		scanf_s("%d", &choice); //사용자로부터 메뉴에서 숫자를 입력을 받음

		switch (choice) {
		case 1:
			inputComplex(&x, &y);
			break;
		case 2:
			result = add(x, y);
			printf("%.2lf + %.2lfi\n", result.real, result.imag);
			printf("\n");
			break;
		case 3:
			result = subtract(x, y);
			printf("%.2lf + %.2lfi\n", result.real, result.imag);
			printf("\n");
			break;
		case 4:
			result = multiply(x, y);
			printf("%.2lf", result.real);
			//만약 허수부가 0일 때는 실수부만 출력되고 허수부가 0이 아닐 때는 부호와 함께 허수부를 표시
			if (result.imag > 0) {
				printf(" + %.2lfi\n", result.imag);
			}
			else if (result.imag < 0) {
				printf(" - %.2lfi\n", -result.imag);
			}
			else {
				printf("\n");
			}
			break;
		case 5:
			result = divide(x, y);
			printf("%.2lf", result.real);
			//만약 허수부가 0일 때는 실수부만 출력되고 허수부가 0이 아닐 때는 부호와 함께 허수부를 표시
			if (result.imag > 0) {
				printf(" + %.2lfi\n", result.imag);
			}
			else if (result.imag < 0) {
				printf(" - %.2lfi\n", -result.imag);
			}
			else {
				printf("\n");
			}
			break;
		case 6:
			//프로그램 종료
			printf("프로그램을 종료합니다.");
			return 0; //사용자가 6을 입력하면 return값을 0으로 하여 무한루프 종료
		}
	}
}

실행결과

0개의 댓글