Upload
kochungwook
View
317
Download
9
Embed Size (px)
Citation preview
과제수행일지소속 조원
B2 조장 : 최완철 자료조사 : 강승우, 김남희 프로그래밍 : 고충욱, 정준용
과제수행
기간3 일
I. 계획의 작성
연구제목Linked List
연구배경학습한 내용에 대해 이해를 하고, Linked List 의 정의를 알고,
이것을 프로그램으로 만들어 봄으로써 활용법을 안다.
참고자료
참
고
UR
L
http://ko.wikipedia.org/wiki/%EB%A7%81%ED%81%AC%EB%93%9C_%EB
%A6%AC%EC%8A%A4%ED%8A%B8
-> 링크드 리스트의 정의와 종류
http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161
-> 연결리스트와 용어에 대한 설명, 사진 (본문에 포함)
II. 계획의 실행
첫째 날 2012 년 4 월 12 일 목요일
오늘의
작업계획수립 및 역할 분담
토의
내용
조장 : 최완철
자료조사 : 강승우, 김남희
프로그래밍 : 고충욱, 정준용
위와 같이 조원의 업무 분담을 하였으며, 3 번째 과제와 관련된 링크드 리스트에 대한
자료조사를 최우선적으로 하기로 했다.
그리고 역할 분담은 각자가 하고 싶은 역할 위주로 정하였다.
과제준비
에서
느낀 점
첫날에 아무것도 모르는 상황이라서 토의 진행이 되지 않았었다.
그 때문에 사전 자료조사의 중요성을 느끼게 되었다.
둘째 날 2012 년 4 월 17 일 화요일
오늘의
작업링크드 리스트에 대한 자료를 이용하여 개념 이해 및 소스 구현방법 이해
토의
내용
링크드 리스트 과제를 수행하기 위해서는 개념 이해가 중요하다고 느꼈다.
그래서 자료조사팀에서 조사한 내용을 가지고 이해하였다.
과제준비
에서
느낀 점
링크드 리스트의 개념과 구조를 알게 되었으나, 소스로 구현하게 된다면 예상하지 못한
문제들이 발생할 것 같다고 느꼈다.
셋째 날 2012 년 4 월 19 일 목요일
오늘의
작업소스 초안 확인 및 개선방향 설정
토의
내용
소스초안에서는 다항식 연산에서 덧셈과 뺄셈만 구현하였다.
소스 초안의 연산 과정에 있어서 특별한 문제는 없었다.
아직 곱셈과 나눗셈 연산은 구현하지 못했기 때문에 이 부분에 대해서 초안에 추가적으로
구현을 하기로 하였다.
과제준비곱셈 및 나눗셈 연산에서 지수가 같은 경우를 걸러내는 방법을 구현하는데 난관을 겪었다.
에서
느낀 점곱셈과 나눗셈에 대한 더 많은 공부가 필요하다고 느끼게 되었다.
넷째 날 2012 년 4 월 24 일 화요일
오늘의
작업프로그램 소스 초안 코딩
초안 #include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int coef;
int expon;
struct ListNode *link;
} ListNode;
typedef struct ListHeader {
int length;
ListNode *head;
ListNode *tail;
} ListHeader;
void init(ListHeader *plist)
{
plist->length = 0;
plist->head = plist->tail = NULL;
}
void insert_node_last(ListHeader *plist, int coef, int expon)
{
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
if( temp == NULL ){
fprintf(stderr,"메모리 할당 에러\n");
exit(1);
}
temp->coef=coef;
temp->expon=expon;
temp->link=NULL;
if( plist->tail == NULL ){
plist->head = plist->tail = temp;
}
else {
plist->tail->link = temp;
plist->tail = temp;
}
plist->length++;
}
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
int sum;
while(a && b){
if( a->expon == b->expon ){
sum = a->coef + b-> coef;
if( sum != 0 ) insert_node_last(plist3, sum, a->expon);
a=a->link; b=b->link;
}
else if( a->expon > b->expon ){
insert_node_last(plist3, a->coef, a->expon);
a=a->link;
}
else {
insert_node_last(plist3, b->coef, b->expon);
b=b->link;
}
}
for( ; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->expon);
for( ; b != NULL; b=b->link)
insert_node_last(plist3, b->coef, b->expon);
}
void poly_print(ListHeader *plist)
{
ListNode *p=plist->head;
for(;p;p=p->link){
printf("%d %d\n", p->coef, p->expon);
}
}
main()
{
ListHeader list1, list2, list3;
init(&list1);
init(&list2);
init(&list3);
insert_node_last(&list1, 3,12);
insert_node_last(&list1, 2,8);
insert_node_last(&list1, 1,0);
insert_node_last(&list2, 8,12);
insert_node_last(&list2, -3,10);
insert_node_last(&list2, 10,6);
poly_add(&list1, &list2, &list3);
poly_print(&list3);
}
문제점 덧셈 연산만 가능함
해결
방안덧셈 연산을 응용하여 뺄셈 연산을 구현하고 곱셈 및 나눗셈 연산도 구현해야 함
다섯째
날2012 년 4 월 25 일 수요일
오늘의
작업2 안 소스 확인 및 개선 방향 설정
2 안 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct ListNode {
float coef;
int expon;
struct ListNode *link;
} ListNode;
typedef struct ListHeader {
int length;
ListNode *head;
ListNode *tail;
} ListHeader;
void init(ListHeader *plist);
void free_poly(struct ListHeader *list);
void insert_node_last(ListHeader *plist, float coef, int expon);
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_op(ListHeader *plist);
void poly_print(ListHeader *plist);
main()
{
ListHeader list1, list2, list3;
int choice, a, i;
init(&list1);
init(&list2);
init(&list3);
printf("첫번째 다항식의 입력할 항 수를 정하시오");
scanf("%d", &a);
for(i=0; i<a; i++)
{
float coef;
int expon;
printf("계수를 입력하시오.(실수) ");
scanf("%f", &coef);
printf("지수를 입력하시오.(정수) ");
scanf("%d", &expon);
insert_node_last(&list1, coef, expon);
}
printf("두번째 다항식의 입력할 항 수를 정하시오");
scanf("%d", &a);
for(i=0; i<a; i++)
{
float coef;
int expon;
printf("계수를 입력하시오.(실수) ");
scanf("%f", &coef);
printf("지수를 입력하시오.(정수) ");
scanf("%d", &expon);
insert_node_last(&list2, coef, expon);
}
printf("1. 다항식 덧셈\n");
printf("2. 다항식 뺄셈\n");
printf("3. 다항식 곱셈\n");
printf("4. 1 번다항식 연산\n");
printf("5. 2 번다항식 연산\n");
printf("6. 끝내기\n\n");
printf("원하는 항목을 선택하시오 : ");
scanf("%d", &choice);
if(choice==1)
{
poly_add(&list1, &list2, &list3);
poly_print(&list3);
}
else if(choice==2)
{
poly_sub(&list1, &list2, &list3);
poly_print(&list3);
}
else if(choice==3)
{
poly_mul(&list1, &list2, &list3);
poly_print(&list3);
}
else if(choice==4)
poly_op(&list1);
else if(choice==5)
poly_op(&list2);
else if(choice==6)
printf("감사합니다.");
else
printf("잘못입력하였습니다.");
system("PAUSE");
}
void init(ListHeader *plist)
{
plist->length = 0;
plist->head = plist->tail = NULL;
}
void free_poly(struct ListHeader *list)
{
free(list);
}
void insert_node_last(ListHeader *plist, float coef, int expon)
{
ListNode *p = plist->head;
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
if( temp == NULL )
{
fprintf(stderr,"메모리 할당 에러\n");
exit(1);
}
temp->coef=coef;
temp->expon=expon;
temp->link=NULL;
if( plist->tail == NULL )
{
plist->head = plist->tail = temp;
}
else
{
plist->tail->link = temp;
plist->tail = temp;
}
plist->length++;
}
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
float sum;
while(a && b)
{
if( a->expon == b->expon )
{
sum = a->coef + b-> coef;
if( sum != 0 ) insert_node_last(plist3, sum, a->expon);
a=a->link; b=b->link;
}
else if( a->expon > b->expon )
{
insert_node_last(plist3, a->coef, a->expon);
a=a->link;
}
else
{
insert_node_last(plist3, b->coef, b->expon);
b=b->link;
}
}
for( ; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->expon);
for( ; b != NULL; b=b->link)
insert_node_last(plist3, b->coef, b->expon);
}
void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
float sub;
while(a && b)
{
if( a->expon == b->expon )
{
sub = a->coef - b-> coef;
if( sub != 0 ) insert_node_last(plist3, sub, a->expon);
a=a->link; b=b->link;
}
else if( a->expon > b->expon )
{
insert_node_last(plist3, a->coef, a->expon);
a=a->link;
}
else
{
insert_node_last(plist3, b->coef, b->expon);
b=b->link;
}
}
for( ; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->expon);
for( ; b != NULL; b=b->link)
insert_node_last(plist3, b->coef, b->expon);
}
void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
ListNode *p = plist3->head;
float mul_coef;
int mul_expon;
while(a)
{
while(b)
{
mul_coef = a->coef * b->coef;
mul_expon = a->expon + b->expon;
insert_node_last(plist3, mul_coef, mul_expon);
b=b->link;
}
b=plist2->head;
a=a->link;
}
}
void poly_op(ListHeader *plist)
{
ListNode *a = plist->head;
float x,c,value=0;
printf("x 값을 입력하시오 : ");
scanf("%f", &x);
for(; a != NULL; )
{
c=pow(x,a->expon);
c*=a->coef;
value+=c;
a=a->link;
}
printf("%f",value);
}
void poly_print(ListHeader *plist)
{
ListNode *p=plist->head;
for(;p;p=p->link)
{
printf("%.3fx^%d ", p->coef, p->expon);
}
free_poly(plist);
}
문제점 다항식 곱셈연산에서 지수가 같은 항의 계수부분이 연산 되지 않음
III. 결과
최종
프로그램
소스
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct ListNode {
float coef;
int expon;
struct ListNode *link;
} ListNode;
typedef struct ListHeader {
int length;
ListNode *head;
ListNode *tail;
} ListHeader;
void init(ListHeader *plist);
void free_poly(struct ListHeader *list);
void insert_node_last(ListHeader *plist, float coef, int expon);
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_op(ListHeader *plist);
void poly_print(ListHeader *plist);
main()
{
ListHeader list1, list2, list3;
int choice, a, i;
init(&list1);
init(&list2);
init(&list3);
printf("첫번째 다항식의 입력할 항 수를 정하시오");
scanf("%d", &a);
for(i=0; i<a; i++)
{
float coef;
int expon;
printf("계수를 입력하시오.(실수) ");
scanf("%f", &coef);
printf("지수를 입력하시오.(정수) ");
scanf("%d", &expon);
insert_node_last(&list1, coef, expon);
}
printf("두번째 다항식의 입력할 항 수를 정하시오");
scanf("%d", &a);
for(i=0; i<a; i++)
{
float coef;
int expon;
printf("계수를 입력하시오.(실수) ");
scanf("%f", &coef);
printf("지수를 입력하시오.(정수) ");
scanf("%d", &expon);
insert_node_last(&list2, coef, expon);
}
printf("1. 다항식 덧셈\n");
printf("2. 다항식 뺄셈\n");
printf("3. 다항식 곱셈\n");
printf("4. 1 번다항식 연산\n");
printf("5. 2 번다항식 연산\n");
printf("6. 끝내기\n\n");
printf("원하는 항목을 선택하시오 : ");
scanf("%d", &choice);
if(choice==1)
{
poly_add(&list1, &list2, &list3);
poly_print(&list3);
}
else if(choice==2)
{
poly_sub(&list1, &list2, &list3);
poly_print(&list3);
}
else if(choice==3)
{
poly_mul(&list1, &list2, &list3);
poly_print(&list3);
}
else if(choice==4)
poly_op(&list1);
else if(choice==5)
poly_op(&list2);
else if(choice==6)
printf("감사합니다.");
else
printf("잘못입력하였습니다.");
system("PAUSE");
}
void init(ListHeader *plist)
{
plist->length = 0;
plist->head = plist->tail = NULL;
}
void free_poly(struct ListHeader *list)
{
free(list);
}
void insert_node_last(ListHeader *plist, float coef, int expon)
{
ListNode *p = plist->head;
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
if( temp == NULL )
{
fprintf(stderr,"메모리 할당 에러\n");
exit(1);
}
temp->coef=coef;
temp->expon=expon;
temp->link=NULL;
if( plist->tail == NULL )
{
plist->head = plist->tail = temp;
}
else
{
plist->tail->link = temp;
plist->tail = temp;
}
plist->length++;
}
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
float sum;
while(a && b)
{
if( a->expon == b->expon )
{
sum = a->coef + b-> coef;
if( sum != 0 ) insert_node_last(plist3, sum, a->expon);
a=a->link; b=b->link;
}
else if( a->expon > b->expon )
{
insert_node_last(plist3, a->coef, a->expon);
a=a->link;
}
else
{
insert_node_last(plist3, b->coef, b->expon);
b=b->link;
}
}
for( ; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->expon);
for( ; b != NULL; b=b->link)
insert_node_last(plist3, b->coef, b->expon);
}
void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
float sub;
while(a && b)
{
if( a->expon == b->expon )
{
sub = a->coef - b-> coef;
if( sub != 0 ) insert_node_last(plist3, sub, a->expon);
a=a->link; b=b->link;
}
else if( a->expon > b->expon )
{
insert_node_last(plist3, a->coef, a->expon);
a=a->link;
}
else
{
insert_node_last(plist3, b->coef, b->expon);
b=b->link;
}
}
for( ; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->expon);
for( ; b != NULL; b=b->link)
insert_node_last(plist3, b->coef, b->expon);
}
void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
ListNode *p = plist3->head;
float mul_coef;
int mul_expon;
while(a)
{
while(b)
{
mul_coef = a->coef * b->coef;
mul_expon = a->expon + b->expon;
insert_node_last(plist3, mul_coef, mul_expon);
b=b->link;
}
b=plist2->head;
a=a->link;
}
}
void poly_op(ListHeader *plist)
{
ListNode *a = plist->head;
float x,c,value=0;
printf("x 값을 입력하시오 : ");
scanf("%f", &x);
for(; a != NULL; )
{
c=pow(x,a->expon);
c*=a->coef;
value+=c;
a=a->link;
}
printf("%f",value);
}
void poly_print(ListHeader *plist)
{
ListNode *p=plist->head;
for(;p;p=p->link)
{
printf("%.3fx^%d + ", p->coef, p->expon);
if (p->link == NULL){
printf("%c%c",8,8);
}
}
free_poly(plist);
}
결과
출력
1. 덧셈 연산
입력 : P(X) = 3x^4 + 5x^6
S(X) = 3x^4 + 5x^6
결과 : 6x^4 + 10x^6
2. 곱셈 연산 ( 문제점 )
입력 : P(X) = 3x^4 + 5x^6
S(X) = 3x^4 + 5x^6
출력 : 9x^8 + 15x^10 + 15x^10 + 25x^12
1. 덧셈 연산
2. 곱셈 연산 ( 문제점 )