이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)
이번 포스팅은 저번 다항식 포스팅에 이어 다항식을 다루는 여러 방법에 대해 알아보겠습니다.
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(개구간)
'Information Technology > C' 카테고리의 다른 글
[C언어] 이중 연결 리스트 (0) | 2020.01.20 |
---|---|
[C언어] 연결리스트 - 다항식(3) (0) | 2020.01.18 |
[C언어] 연결리스트 - 다항식(1) (0) | 2020.01.13 |
[C언어] 연결리스트 - 개념과 기본 동작들(3) (0) | 2020.01.09 |
[C언어] 연결리스트 - 개념과 기본 동작들(2) (0) | 2020.01.09 |