#include <stdio.h>
#include <math.h>
#define pi 3.141592653589793238462643383279 //파이값 정의
struct complex1 { //구조체 선언
double re;
double im;
char pm;
} a, b; //구조체 변수선언
struct complex1 complex1_sum(struct complex1 * a, struct complex1 * b)
{ //복소수 더하기 연산 함수구현
struct complex1 ret; //구조체 변수선언
ret.re = a->re + b->re; //실수부 연산
ret.im = a->im + b->im; //허수부 연산
if(ret.im >=0) //허수부 값이 양수이면 (부호결정 코드)
ret.pm=' +'; //부호 원소에 + 저장
else //아니면
ret.pm=' '; //공백 저장
return ret; //결과값 리턴
}
struct complex1 complex1_sub(struct complex1 * a, struct complex1 * b)
{ //복소수 빼기 연산 함수구현
struct complex1 ret; //구조체 변수선언
ret.re = a->re - b->re; //실수부 연산
ret.im = a->im - b->im; //허수부 연산
if(ret.im >=0) //전 함수 코드와 같음
ret.pm=' +';
else
ret.pm=' ';
return ret; //결과값 리턴
}
struct complex1 complex1_mul(struct complex1 * a, struct complex1 * b)
{ //복소수 곱하기 연산 함수구현
struct complex1 ret; //구조체 변수 선언
ret.re = a->re * b->re - a->im * b->im; //실수부 연산
ret.im = a->re * b->im + a->im * b->re; //허수부 연산
if(ret.im >=0) //(부호결정 코드)
ret.pm=' +';
else
ret.pm=' ';
return ret; //결과값 리턴
}
struct complex1 complex1_div(struct complex1 * a, struct complex1 * b)
{ //복소수 나누기 연산 함수구현
struct complex1 ret, bunja; //구조체 변수 선언
int bunmo; //정수형 변수 선언
bunja.re = a->re * b->re - a->im * -(b->im);
bunja.im = a->re * -(b->im) + a->im * b->re; //분자에 분모의 공액을 곱한다
bunmo = b->re * b->re - b->im * -(b->im); //분모에 분자의 공액을 곱한다
ret.re = bunja.re / bunmo; //실수부 연산. 분자의 실수를 분모로 나눈다
ret.im = bunja.im / bunmo; //허수부 연산. 분자의 허수를 분모로 나눈다
if(ret.im >=0) //(부호결정 코드)
ret.pm=' +';
else
ret.pm=' ';
return ret; //결과값 리턴
}
struct complex1 complex1_cmul(struct complex1 * a, int b)
{ //복소수 상수배 연산 함수구현
struct complex1 ret; //구조체 변수 선언
ret.re = a->re * b; //실수부 연산
ret.im = a->im * b; //허수부 연산
if(ret.im >=0) //(부호결정 코드)
ret.pm=' +';
else
ret.pm=' ';
return ret; //결과값 리턴
}
struct complex1 complex1_pow1(struct complex1 * a, int n)
{ //복소수 제곱 함수구현
struct complex1 ret; //구조체 변수 선언
int i; //정수형 변수 선언
ret=*a; //result에 복소수 a의 원소값들 저장
for(i=1; i<n; i++) //i는 1부터 n보다 작은동안 1씩 증가하면 반복
ret = complex1_mul(&ret,a); //복소수 곱하기 함수 호출하여 결과값 저장
return ret; //결과값 리턴
}
struct complex1 complex1_polar(struct complex1 * a)
{ //복소수 극형식 변환 함수구현
struct complex1 ret;
ret.re = sqrt(pow(a->re,2) + pow(a->im,2)); //복소수 극형식 r값 구하는 식
// ret.re = cabs(a); //내부함수가 오류난다
ret.im = atan2(a->im,a->re) * 180/pi; //복소수 극형식 세타 구하는 식
return ret; //결과값 리턴
}
void main() //메인함수
{
int n; //정수형 변수 선언
struct complex1 a1, b1; //구조체 변수 선언
struct complex1 result; //구조체 변수 선언
printf("복소수 a 실수부를 입력하세요:");
scanf("%lf", &a.re); //복소수 a의 실수부 값을 a.re에 저장
printf("복소수 a 허수부를 입력세요:");
scanf("%lf:", &a.im); //복소수 a의 허수부 값을 a.im에 저장
if(a.im >=0) //(부호결정 코드)
a.pm=' +';
else
a.pm=' ';
printf("복소수 b 실수부를 입력하세요:");
scanf("%lf", &b.re); //복소수 b의 실수부 값을 b.re에 저장
printf("복소수 b 허수부를 입력세요:");
scanf("%lf:", &b.im); //복소수 b의 허수부 값을 b.im에 저장
if(b.im >=0) //(부호결정 코드)
b.pm=' +';
else
b.pm=' ';
//입력된 복소수를 출력
printf("\nComplex number a = %.2lf%c%.2lfi\n", a.re, a.pm, a.im);
printf("Complex number b = %.2lf%c%.2lfi\n\n", b.re, b.pm, b.im);
//복소수 사칙연산을 각각 출력
printf("── Complex number four arithmetical operations ──\n");
result = complex1_sum(&a,&b); //복소수 더하기 함수 호출하여 결과값 저장
printf(" a + b = %.2lf %c %.2lfi\n",result.re, result.pm, result.im);
//결과값 출력
result = complex1_sub(&a,&b); //복소수 빼기 함수 호출하여 결과값 저장
printf(" a - b = %.2lf %c %.2lfi\n",result.re, result.pm, result.im);
//결과값 출력
result = complex1_mul(&a,&b); //복소수 곱하기 함수 호출하여 결과값 저장
printf(" a x b = %.2lf %c %.2lfi\n",result.re, result.pm, result.im);
//결과값 출력
result = complex1_div(&a,&b); //복소수 나누기 함수 호출하여 결과값 저장
printf(" a / b = %.2lf %c %.2lfi\n\n",result.re, result.pm, result.im);
//결과값 출력
//복소수 다항식
printf("─────── Complex number polynomial ──────\n");
a1 = complex1_cmul(&a,4); //복소수 상수배 함수 호출하여 결과값 저장
b1 = complex1_cmul(&b,5); //복소수 상수배 함수 호출하여 결과값 저장
result = complex1_sub(&a1,&b1); //복소수 빼기 함수 호출하여 결과값 저장
printf(" 4a-5b = %.2lf %c %.2lfi\n",result.re, result.pm, result.im);
//결과값 출력
a1 = complex1_cmul(&a,9); //복소수 상수배 함수 호출하여 결과값 저장
b1 = complex1_cmul(&b,3); //복소수 상수배 함수 호출하여 결과값 저장
result = complex1_sum(&a1,&b1); //복소수 더하기 함수 호출하여 결과값 저장
printf(" 9a+3b = %.2lf %c %.2lfi\n",result.re, result.pm, result.im);
//결과값 출력
a1 = complex1_cmul(&a,-2); //복소수 상수배 함수 호출하여 결과값 저장
b1 = complex1_cmul(&b,3); //복소수 상수배 함수 호출하여 결과값 저장
result = complex1_mul(&a1,&b1); //복소수 곱하기 함수 호출하여 결과값 저장
printf(" -2a3b = %.2lf %c %.2lfi\n",result.re, result.pm, result.im);
//결과값 출력
a1 = complex1_cmul(&a,8); //복소수 상수배 함수 호출하여 결과값 저장
b1 = complex1_cmul(&b,2); //복소수 상수배 함수 호출하여 결과값 저장
result = complex1_div(&a1,&b1); //복소수 나누기 함수 호출하여 결과값 저장
printf(" 8a/2b = %.2lf %c %.2lfi\n\n",result.re, result.pm, result.im);
//결과값 출력
//복소수 제곱
printf("────── Complex number exponential ──────\n");
for(n=1; n<5; n++)
{
result = complex1_pow1(&a,n); //복소수 제곱 함수 호출하여 결과값 저장
printf(" a^%d = %.2lf %c %.2lfi\n",n, result.re, result.pm, result.im);
}//결과값 출력 (곱하기 함수를 n번 반복하는 방식으로 제곱을 구함)
printf("\n ┏━━━━━ ComplexNumber polar form ━━━━━┓\n");
result = complex1_polar(&a); //극형식 변환 함수 호출하여 결과값 저장
printf(" ┃ a : z = %.2f(cos %.2f + i sin %.2f) ┃\n", result.re, result.im, result.im);
printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n");
//결과값을 극형식으로 출력
}