조건
더보기
[조건]
1. 다항식 A와 B를 각자 생성하여 작성하시오.
2. 주어진 코드에 다항식의 결과 값을 계산하는 함수 poly_calc() 함수를 추가 작성하고 3개의 실수 x에 대해 그 결과를 출력하시오(만약, 다항식 덧셈 결과식이 2x+5 이고 x=3.0이라면, 결과는 2*3+5 = 11임).
*실수 x는 배열을 사용할 수 있음
3. 메뉴화 하여 처리하시오(아래는 예시임)
1)다항식 입력 <- 다항식의 계수와 지수를 키보드로 입력 받음
2)다항식 C=A + B 결과 다항식 출력
3)3개의 랜덤 x에 대해 3개의 결과값 C를 출력
코드
poly.h
#ifndef POLY_H
#define POLY_H
typedef struct ListNode {
int coef, expon;
struct ListNode* link;
}ListNode;
typedef struct {
ListNode* tail, * head;
int size;
}ListType;
void print_menu();
ListType* create();
void input_poly(ListType* p);
void insert_last(ListType* p, int coef, int expon);
void poly_print(ListType* plist);
void poly_add(ListType* p1, ListType* p2, ListType* p3);
double poly_calc(ListType* list3, double x);
void free_list(ListNode* p);
#endif
poly.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "poly.h"
void print_menu() {
printf("--------------------------\n");
printf("1. 다항식 A와 B 입력\n");
printf("2. 덧셈 연산(A + B)\n");
printf("3. C(x) 계산 (x: 랜덤 3개)\n");
printf("4. 프로그램 종료\n");
printf("--------------------------\n");
}
ListType* create() {
ListType* p = (ListType*)malloc(sizeof(ListType));
if (!p) {
printf("메모리 할당 에러\n");
exit(1);
}
p->size = 0;
p->head = p->tail = NULL;
return p;
}
void input_poly(ListType* p) {
int n, coef;
do {
printf("몇 차식 입니까? ");
scanf("%d", &n);
} while (n < 0);
for (int i = n; i >= 0; i--) {
printf("%d차식의 계수: ", i);
scanf("%d", &coef);
if (coef != 0)
insert_last(p, coef, i);
}
}
void insert_last(ListType* p, int coef, int expon) {
ListNode* temp = (ListNode*)malloc(sizeof(ListNode));
if (!temp) {
printf("메모리 할당 에러\n");
exit(1);
}
temp->coef = coef;
temp->expon = expon;
temp->link = NULL;
if (p->head == NULL)
p->head = p->tail = temp;
else
p->tail = p->tail->link = temp;
p->size++;
}
void poly_print(ListType* plist) {
ListNode* p = plist->head;
for (; p; p = p->link) {
printf("%d^%d", p->coef, p->expon);
if (p->link != NULL) printf(" + ");
}
printf("\n");
}
void poly_add(ListType* p1, ListType* p2, ListType* p3) {
ListNode* a = p1->head;
ListNode* b = p2->head;
int sum;
while (a && b) {
if (a->expon == b->expon) {
sum = a->coef + b->coef;
if (sum != 0) insert_last(p3, sum, a->expon);
a = a->link;
b = b->link;
}
else if (a->expon > b->expon) {
insert_last(p3, a->coef, a->expon);
a = a->link;
}
else {
insert_last(p3, b->coef, b->expon);
b = b->link;
}
}
for (; a; a = a->link)
insert_last(p3, a->coef, a->expon);
for (; b; b = b->link)
insert_last(p3, b->coef, b->expon);
}
double poly_calc(ListType* list3, double x) {
ListNode* p = list3->head;
double sum = 0, n;
for (; p; p = p->link) {
n = 1;
for (int i = 0; i < p->expon; i++) {
n *= x;
}
sum += n * p->coef;
}
return sum;
}
void free_list(ListNode* p) {
ListNode* temp = p;
if (temp) {
free_list(temp->link);
free(temp);
}
}
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "poly.h"
int main() {
ListType* list1, * list2, * list3;
int sel;
double x[3];
srand((unsigned)time(NULL));
list1 = create();
list2 = create();
list3 = create();
while (1) {
print_menu();
printf("메뉴 선택: ");
scanf("%d", &sel);
if (sel < 1 || sel > 4) {
printf("잘못된 입력입니다. 다시 입력해주세요\n");
continue;
}
if (sel == 1) {
printf("<다항식 A>\n");
input_poly(list1);
printf("\n");
printf("<다항식 B>\n");
input_poly(list2);
printf("\n");
printf("A = ");
poly_print(list1);
printf("B = ");
poly_print(list2);
}
else if (sel == 2) {
if (!(list1->head && list2->head)) {
printf("먼저 다항식을 입력해주세요\n");
continue;
}
if (list3->head != NULL) {
free_list(list3->head);
list3->head = list3->tail = NULL;
list3->size = 0;
}
poly_add(list1, list2, list3);
printf("A + B = C\n");
printf("A = ");
poly_print(list1);
printf("B = ");
poly_print(list2);
printf("C = ");
poly_print(list3);
}
else if (sel == 3) {
if (list3->head == NULL) {
printf("먼저 다항식 C를 구해주세요\n");
continue;
}
for (int i = 0; i < 3; i++) {
x[i] = (double)rand() / RAND_MAX;
}
for (int i = 0; i < 3; i++) {
printf("%d) C(%lf) = ", i + 1, x[i]);
printf("%lf\n", poly_calc(list3, x[i]));
}
}
else {
printf("프로그램을 종료합니다. \n");
break;
}
}
free_list(list1->head);
free_list(list2->head);
free_list(list3->head);
free(list1);
free(list2);
free(list3);
}
실행 화면


'자료구조' 카테고리의 다른 글
| [C언어| 원형 연결 리스트로 큐 구현] 러시안 룰렛 게임 (0) | 2025.05.12 |
|---|---|
| [C언어| 스택(stack)] 미로 게임 만들기 (자동 생성 및 키보드 입력을 통한 탈출) (0) | 2025.05.02 |
| [쉽게 풀어 쓴 자료구조] 4장 연습문제 EXERCISE (programming) (0) | 2025.04.02 |