본문 바로가기

Information Technology/C

[C언어] 연결리스트 - 다항식(2)

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)


이번 포스팅은 저번 다항식 포스팅에 이어 다항식을 다루는 여러 방법에 대해 알아보겠습니다.

 

0. 전체 프로세스 커맨드

void process_command()
{
	char command_line[BUFFER_LENGTH];
	char copied[BUFFER_LENGTH]; // 배열 형태의 문자열
	char* command, * arg1, * arg2;

	while (1)
	{
		printf("$ ");
		if (read_line(stdin, command_line, BUFFER_LENGTH) <= 0)
			continue;
		strcpy(copied, command_line);
		command = strtok(command_line, " ");
		if (strcmp(command, "print") == 0)
		{
			arg1 = strtok(NULL, " ");
			if (arg1 == NULL)
			{
				printf("Invalid arguments.\n");
				continue;
			}
			handle_print(arg1[0]);	// 함수는 어차피 한 글자
		}
		else if (strcmp(command, "calc") == 0)
		{
			arg1 = strtok(NULL, " ");
			if (arg1 == NULL)
			{
				printf("Invalid arguments.\n");
				continue;
			}
			arg2 = strtok(NULL, " ");
			if (arg2 == NULL)
			{
				printf("Invalid arguments.\n");
				continue;
			}
			handle_calc(arg1[0], arg2); // 해당 이름의 함수에 arg2의 값을 대입해서 계산
		}
		else if (strcmp(command, "exit") == 0)
			break;
		else {
			handle_definition(copied);	// 입력 받은 문자열은 전달해서 다항식 생성
		}
	}
}

1. 결과 출력(eval)

int eval(Polynomial* poly, int x)
{
	int result = 0;
	Term* t = poly->first;
	while (t != NULL)
	{
		result += eval(t, x);
		t = t->next;	// 각 Term에서 eval을 실행하면서 더함
	}
	return result;
}

int eval(Term* term, int x)
{
	int result = term->coef;
	for (int i = 0; i < term->expo; i++)
		result *= x;
	return result;
}
void handle_calc(char name, char* x_str)
{
	for (int i = 0; i < sizeof(polys); i++)
		if (polys[i]->name == name)
			printf("%d\n", eval(polys[i], atoi(x_str)));
}

2. 다항식 출력

void print_term(Term* pTerm)	// 노드를 출력
{
	if (pTerm->expo = 0)
		printf("%d", pTerm->coef);
	else if (pTerm->expo = 1)
		printf("%dx", pTerm->coef);
	else
		printf("%dx^%d", pTerm->coef, pTerm->expo);
}
void print_poly(Polynomial* p)	// 다항식을 출력
{
	printf("%c= ", p->name);
	Term* t = p->first;
	while (t != NULL)
	{
		if (t->next->coef < 0)
		{
			print_term(t);
			t = t->next;
			continue;
		}
		else if (t->next->coef > 0)
		{
			print_term(t);
			printf("+");
			t = t->next;
			continue;
		}
		else if (t->next = NULL)
		{
			print_term(t);
			break;
		}

	}
}
void handle_print(char name)	// 다항식의 이름은 한 글자 문자
{
	for (int i = 0; i < sizeof(polys); i++)
		if (polys[i]->name == name)
			print_poly(polys[i]);
}

다항식은 모두 포인터로 저장하기 때문에, dereferencing을 통해 다항식의 이름과 값들을 불러와야 합니다.


3. 다항식 생성

void handle_definition(char* expression)
{
	erase_blanks(expression); // 입력에서 모든 공백 문자들을 제거

	char* f_name = strtok(expression, "="); // 함수의 이름 추출. 다항식의 좌항
	if (f_name == NULL || strlen(f_name) != 1)	// 함수 이름은 오직 한 글자
	{
		printf("Unsupported command.");
		return;
	}

	char* exp_body = strtok(NULL, "=");	// 다항식의 우항 저장
	if (exp_body == NULL || strlen(exp_body) <= 0)	// 다항식 몸통의 에러
	{
		printf("Invalid expression format.--");
		return;
	}

	// case1: 함수끼리 더해서 새로운 함수 정의
	if (exp_body[0] >= 'a' && exp_body[0] <= 'z' && exp_body[0] != 'x')
	{
		char* former = strtok(exp_body, "+");	// + 앞에 있는 함수명
		if (former == NULL || strlen(former) != 1)
		{
			printf("Invalid expression format.\n");
			return;
		}
		char* later = strtok(NULL, "+");	// + 뒤에 있는 함수명
		if (later == NULL || strlen(later) != 1)
		{
			printf("Invalid expression format.\n");
			return;
		}
		Polynomial* pol = create_by_add_two_polynomias(f_name[0], former[0], later[0]);
		if (pol == NULL)
		{
			printf("Invalid expression format.\n");
			return;
		}
		insert_polynomial(pol);
	}
	else	// case2: 아예 새로운 다항식 생성
	{
		Polynomial* pol = create_by_parse_polynomial(f_name[0], exp_body);
		if (pol == NULL)
		{
			printf("Invalid expression format.\n");
			return;
		}
		insert_polynomial(pol);
	}
}

 


* 폐구간과 개구간

body[begin_term, i) -> (폐구간) begin_term <= m < i(개구간)