조건

더보기

 

[조건]

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);

}

 


 

 

실행 화면

 

+ Recent posts