'학과수업들/자료구조'에 해당되는 글 12건
- 2007/05/24 자료구조 - (Report) 다항식 덧셈 / C로 구현 (연결 리스트)
- 2007/05/13 자료구조 - 중위표기식 -> 후위표기식
- 2007/05/13 자료구조 - (Report) 스택사용 괄호 검사
- 2007/05/07 자료구조 - 연결 리스트 스택 C로 구현(2)
- 2007/05/07 자료구조 - 배열 스택 C로 구현
- 2007/04/25 자료구조 - (Report) 다항식 덧셈 / C로 구현 (1차원 배열 2개 사용)
- 2007/04/25 자료구조 - (Report) 다항식 덧셈 / C로 구현 (1차원 배열 1개 사용)
- 2007/04/22 자료구조 - 다항식 알고리즘
- 2007/04/13 자료구조 - 강의 자료 PPT
- 2007/03/26 자료구조 - Report 070322 / 배열
- 2007/03/25 자료구조 - 3차원 배열
- 2007/03/18 자료구조 - Report 070318 / 순환함수
//다항식의 덧셈 연결리스트로 구현
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode { //리스트 노드 구조
int coef; //계수
int exp; //지수
struct ListNode *link;
} ListNode;
typedef struct ListHeader { //리스트 헤더 노드 구조
int length;
ListNode *head;
ListNode *tail;
} ListHeader;
void init(ListHeader *plist) // 초기화, 공백 헤더 노드
{
plist->length = 0; //length를 0으로
plist->head = plist->tail = NULL; // head와 tail을 NULL으로
}
// 연결 리스트에 삽입
// plist는 헤더를 가리키는 포인터, coef는 계수, exp는 지수
void insert_node_last(ListHeader *plist, int coef, int exp)
{
//공백 연결리스트 생성
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
if(temp == NULL){
exit(1);
}
temp->coef=coef;
temp->exp=exp;
temp->link=NULL;
if(plist->tail == NULL){
plist->head = plist->tail = temp;
}
else {
plist->tail->link = temp;
plist->tail = temp;
}
plist->length++; //length 증가
}
// 다항식 덧셈
// 다항식3 = 다항식1 + 다항식2
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3)
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
int sum; //계수를 담을 변수
while(a && b){
if(a->exp == b->exp){ //지수가 같을경우
sum = a->coef + b-> coef;
if( sum != 0 ) insert_node_last(plist3, sum, a->exp);
a=a->link; b=b->link;
}
else if(a->exp > b->exp){ //다항식1의 지수가 클경우
insert_node_last(plist3, a->coef, a->exp);
a=a->link;
}
else {
insert_node_last(plist3, b->coef, b->exp);
b=b->link;
}
}
//남아있는 항들을 모두 다항식3으로 복사
for(; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->exp);
for(; b != NULL; b=b->link)
insert_node_last(plist3, b->coef, b->exp);
}
//다항식 출력
void poly_print(ListHeader *plist)
{
ListNode *p=plist->head;
for(;p;p=p->link){
if (p->coef == 0 || p->exp == 0){
printf(""); //계수 or 지수가 0이면 표시하지 않음
}else if (p->exp == 1){
printf("%d",p->coef); //지수가 1이면 계수만 표시
}else{
printf("%dx^%d", p->coef, p->exp);
//계수 or 지수가 0이 아니면 계수x^지수 형태로 표시
if (p->link == NULL)
{
printf("");
}else{
printf(" + ");
}
}
}
printf("\n");
}
void main()
{
ListHeader list1, list2, list3; //다항식 입력받을 변수 선언
init(&list1);//init 함수 호출로 공백 리스트
init(&list2);
init(&list3);
int a,b; //항의 계수와 지수를 입력받기 위한 변수
//다항식1을 입력받는 부분
printf("다항식1의 항(계수,지수)을 입력하세요. (0 0 이면 입력종료)\n");
while (1)
{
scanf("%d %d",&a,&b);
if (a==0 && b==0)
{
break;
}
insert_node_last(&list1, a, b);
}
printf("다항식1 : ");
poly_print(&list1); //다항식1 출력
printf("\n");
//다항식2을 입력받는 부분
printf("다항식2의 항(계수,지수)을 입력하세요. (0 0 이면 입력종료)\n");
while (1)
{
scanf("%d %d",&a,&b);
if (a==0 && b==0)
{
break;
}
insert_node_last(&list2, a, b);
}
printf("다항식2 : ");
poly_print(&list2); //다항식2 출력
printf("\n");
// 다항식3 = 다항식1 + 다항식2
poly_add(&list1, &list2, &list3);
printf("결과 : ");
poly_print(&list3); //다항식3 출력
}
#include <stdio.h>
#include <string.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100
typedef enum {lparen, rparen, plus, minus, times, divide, mod, eos, operand} precedence;
int eval(void);
void push(int *, int);
int pop(int *);
void print_token(int);
void infix_to_postfix(void);
precedence get_token(char *, int *);
int stack[MAX_STACK_SIZE];
char expr[MAX_EXPR_SIZE];
char str[MAX_STACK_SIZE];
int Num[50];
int num = 0;
void main()
{
printf("Input string : \n");
scanf("%s", expr);
printf("postfix : \n");
infix_to_postfix();
printf("result:\n");
printf("%d\n", eval());
}
int eval()
{
precedence token;
char symbol;
int op1, op2;
int n = 0, m = 0, k = 0;
int top = -1, j=0;
token = get_token(&symbol, &n);
while(token != eos)
{
if(token == operand)
{
m = m*10 + symbol-'0';
k++;
if(Num[j] == k)
{
push(&top, m);
j++;
m = 0;
k = 0;
}
}
else
{
op2 = pop(&top);
op1 = pop(&top);
switch(token)
{
case plus:
push(&top, op1+op2);
break;
case minus:
push(&top, op1-op2);
break;
case times:
push(&top, op1*op2);
break;
case divide:
push(&top, op1/op2);
break;
case mod:
push(&top, op1%op2);
break;
}
}
token = get_token(&symbol, &n);
}
return pop(&top);
}
precedence get_token(char *psymbol, int *pn)
{
*psymbol = expr[(*pn)++];
switch(*psymbol)
{
case '(': return lparen;
case ')': return rparen;
case '+': return plus;
case '-': return minus;
case '*': return times;
case '/': return divide;
case '%': return mod;
case '\0': return eos;
default : return operand;
}
}
void push(int *top, int op)
{
(*top)++;
stack[*top] = op;
}
int pop(int *top)
{
int n;
n = stack[*top];
(*top)--;
return n;
}
void infix_to_postfix()
{
char symbol;
int token;
int n = 0, m = 0, i = 0;
int top = 0;
static int isp[] = { 0, 19, 12, 12, 13, 13, 13, 0};
static int icp[] = {20, 19, 12, 12, 13, 13, 13, 0};
stack[0] = eos;
for(token = get_token(&symbol, &n); token != eos; token = get_token(&symbol, &n))
{
if(token == operand)
{
str[num] = symbol;
num++;
m++;
Num[i] = m;
}
else if(token == rparen)
{
while(stack[top] != lparen)
print_token(pop(&top));
pop(&top);
}
else
{
if(token != lparen)
{
i++;
m=0;
}
while(isp[stack[top]] >= icp[token])
print_token(pop(&top));
push(&top, token);
}
}
while((token = pop(&top)) != eos)
print_token(token);
printf("%s\n", str);
strcpy(expr, str);
}
void print_token(int token)
{
switch(token)
{
case minus:
str[num] = '-';
break;
case plus:
str[num] = '+';
break;
case times:
str[num] = '*';
break;
case divide:
str[num] = '/';
break;
case mod:
str[num] = '%';
break;
}
num++;
}
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100 // 스택의 최대 크기
char stack[STACK_SIZE];
char expr[STACK_SIZE];
int stackSize=0;
int isEmpty()
{
if (!stackSize)
{
return 1;
}
return 0;
}
void push(char item)
{
stack[stackSize] = item; // top은 top+1로
stackSize++;
}
char pop()
{
if (isEmpty())
{
return -1;
}
stackSize--;
return stack[stackSize];
}
int chSymbol(char *psymbol)
{
char temp;
int cnt = 0;
while (1)
{
temp = *(psymbol+cnt);
if (temp == '\0') break;
switch(temp) {
case '(': case '[': case '{':
push(temp);
break;
case ')':
if (isEmpty() || pop() != '(')
{
return 0;
}
break;
case ']':
if (isEmpty() || pop() != '[')
{
return 0;
}
break;
case '}':
if (isEmpty() || pop() != '{')
{
return 0;
}
break;
}
cnt++;
}
if (!isEmpty())
return 0;
return 1;
}
void main()
{
printf("수식을 입력하세요.\n");
scanf("%s",expr);
printf("괄호검사 결과 : ");
if (chSymbol(expr) == 1)
{
printf("true\n");
}else{
printf("false\n");
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct //스택 원소 구조
{
int id;
char name[10];
char grade;
}element;
typedef struct stackNode // 리스트 노드 구조
{
element data;
struct stackNode *link;
}stackNode;
void push(stackNode **top, element data)
{
// 스택의 탑에 원소를 삽입
stackNode* temp;
temp = (stackNode*)malloc(sizeof(stackNode));
temp->data = data;
temp->link = *top;
*top = temp;
}
element pop(stackNode **top)
{
// 스택의 탑 원소를 반환하고 노드는 삭제
stackNode* temp;
element data;
temp = *top;
if (temp == NULL) // 스택이 공백이면
{
printf("Stack is empty\n");
exit(1);
}else{
data = temp->data;
*top = temp->link;
free(temp); // 연결 리스트에서 노드를 삭제
return data;
}
}
element peek(stackNode *top)
{
// 스택의 탑 원소를 검색
element data;
if (top == NULL)
{
printf("Stack is empty\n");
exit(1);
}else{
data = top->data;
return data;
}
}
void Delete(stackNode **top)
{
// 스택의 탑 원소를 삭제
stackNode* temp;
if (*top == NULL) // 스택이 공백이면
{
printf("Stack is empty\n");
exit(1);
}else{
temp = *top;
*top = (*top)->link;
free(temp);
}
}
void main()
{
stackNode *top = NULL; // 공백 연결 스택으로 탑을 선언
element data1, data2, data3, data4;
data1.id = 1;
strcpy(data1.name, "Lee");
data1.grade = 'A';
data2.id = 2;
strcpy(data2.name, "Park");
data2.grade = 'B';
printf("push data1 : (%d %s %d)\n", data1.id, data1.name, data1.grade);
push(&top, data1);
printf("push data2 : (%d %s %d)\n", data2.id, data2.name, data2.grade);
push(&top, data2);
data3 = peek(top);
printf("peek data2 : (%d %s %d)\n", data3.id, data3.name, data3.grade);
Delete(&top);
printf("Delete data2\n");
data4 = pop(&top);
printf("pop data1 : (%d %s %d)\n", data4.id, data4.name, data4.grade);
}
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100 // 스택의 최대 크기
typedef int element; // element를 int 타입으로 정의
element stack[STACK_SIZE];
void push(int *top, element item)
{
if (*top >= STACK_SIZE - 1) // 스택이 만원인 경우
{
printf("Stack is full\n");
return;
}
stack[++(*top)] = item; // top은 top+1로
}
element pop(int *top)
{
if (*top == -1) // 스택이 공백인 경우
{
printf("Stack is empty\n");
exit(1);
}else{
return stack[(*top)--];
}
}
int isEmpty(int *top)
{
if (*top == -1)
{
return 1; // 공백이면 1
}else{
return 0; // 공백이 아니면 0
}
}
void Delete(int *top)
{
if (*top == -1) // 스택이 공백인 경우
{
printf("Stack is empty\n");
exit(1);
}else{
(*top)--;
}
}
element peek(int top)
{
if (top == -1) // 스택이 공백인 경우
{
printf("Stack is empty\n");
exit(1);
}else{
return stack[top];
}
}
int main(void)
{
int top = -1;
element data1, data2;
printf("push data1 : %d\n", 1);
push(&top,1);
printf("push data2 : %d\n", 2);
push(&top,2);
data2 = peek(top);
printf("peek data2 : %d\n", data2);
Delete(&top);
printf("Delete data2\n");
data1 = pop(&top);
printf("pop data1 : %d\n", data1);
return 0;
}
/*
[두 다항식의 덧셈 프로그램]
지수와 계수를 모두 저장하기 위해 1차원 배열을
두개 만들어 구조체로 만들고 계수와 지수를 저장하는 방법으로 구현
*/
#include <stdio.h>
#define SIZE 32 // p의 배열 갯수 설정
typedef struct
{
int exp; //지수
int coef; //계수
}poly; // 지수 1개, 계수 1개 넣을 수 있는 타입으로 생성
typedef struct
{
int count; //항 갯수 카운트
poly p[SIZE]; // poly형 타입의 배열
} polys;
int isZeroP(polys* ps) //남은 항이 있는지 확인
{
int result=0; //항이 있을경우 0 (flase)
if (ps->count==0) {
result=1; //항이 없을경우 1 (true)
}
return result;
}
int coef(polys* ps, int e) //e와 같은 계수
{
int result = 0; //e와 같은 계수가 없으면 "0"
for (int i=0; i<ps->count; i++) // e와 같은 계수가 있으면 "해당 계수" 리턴
{
if (ps->p[i].exp == e)
{
result = ps->p[i].coef;
break;
}
}
return result;
}
int maxExp(polys* ps) //지수가 가장 큰 항의 지수
{
int result = ps->p[0].exp; //첫번째 번지에 있는 지수를 기본값으로 주고
for (int i=0; i<ps->count; i++) //각 항의 지수비교해서 "최고 지수"를 리턴
{
if (ps->p[i].exp > result)
{
result = ps->p[i].exp;
}
}
return result;
}
void addTerm(polys* ps, int coef, int exp) //항을 추가
{
ps->p[ps->count].exp = exp; //받아온 항과 지수를 각각 polys 타입에 저장
ps->p[ps->count].coef = coef;
ps->count++;
}
void delTerm(polys* ps, int e) //항을 제거
{
int i;
int flag = 0;
if (isZeroP(ps)) return;
for (i=0;i<ps->count;i++) {
if (ps->p[i].exp == e)
flag = 1;
if (flag)
ps->p[i] = ps->p[i+1];
}
if (flag)
ps->count--;
}
char compare(int a, int b) // 지수 비교
{
// a와 b를 비교하여 =, <, > 리턴
if (a == b) return '=';
else if (a < b) return '<';
else return '>';
}
polys polyAdd(polys* p1, polys* p2) // p3다항식 = p1다항식 + p2다항식
{
polys p3;
p3.count = 0;
int sum;
while(!isZeroP(p1) && !isZeroP(p2)) { //p1,p2에 다항식이 있을경우
switch (compare(maxExp(p1), maxExp(p2))) //최고지수 비교
{
case '<' : //p1의 지수가 p2의 지수보다 작으면
addTerm(&p3,coef(p2,maxExp(p2)),maxExp(p2));
delTerm(p2,maxExp(p2));
break;
case '=' : //p1,p2의 지수가 같으면
sum = coef(p1,maxExp(p1)) + coef(p2,maxExp(p2));
if (sum != 0)
addTerm(&p3,sum,maxExp(p1));
delTerm(p1,maxExp(p1));
delTerm(p2,maxExp(p2));
break;
case '>' : //p1의 지수가 p2 지수보다 크면
addTerm(&p3,coef(p1,maxExp(p1)),maxExp(p1));
delTerm(p1,maxExp(p1));
break;
}
}
while(!isZeroP(p1)) { // p1의 나머지 항들을 p3로 복사
addTerm(&p3,coef(p1,maxExp(p1)),maxExp(p1));
delTerm(p1,maxExp(p1));
}
while(!isZeroP(p2)) { // p2의 나머지 항들을 p3로 복사
addTerm(&p3,coef(p2,maxExp(p2)),maxExp(p2));
delTerm(p2,maxExp(p2));
}
return p3;
}
void printPolys(polys* ps) { //다항식 출력
int i;
for (i=0;i<ps->count;i++) {
if (ps->p[i].coef == 0){
printf(""); //계수 0이면 표시 안함
}else if (ps->p[i].exp == 1){
printf("%d",ps->p[i].coef); //지수가 1이면 계수만 표시
}else{
printf("%dx^%d",ps->p[i].coef,ps->p[i].exp);
printf(" + ");
//지수가 0이 아니면 계수x^지수 형태로 출력
}
//if (i != ps->count-1)
// printf(" + ");
}
printf("\n");
}
void main()
{
polys p1; //p1 다항식을 입력받을 polys타입의 변수
polys p2; //p1 다항식을 입력받을 polys타입의 변수
polys p3; //p1+p2다항식의 결과 p3를 저장할 polys타입의 변수
p1.count = 0; //항 개수 카운트 초기값 0
p2.count = 0;
int a,b; //항의 계수와 지수를 입력받기 위한 변수
//P1항 입력받아서 보여주는 부분
printf("P1의 항(계수,지수)을 입력하세요. (0 0 이면 입력종료)\n");
while (1)
{
scanf("%d %d",&a,&b);
if (a==0 && b==0)
{
break;
}
addTerm(&p1,a,b);
}
printf("P1 다항식 : ");
printPolys(&p1);
printf("\n");
//P2항 입력받아서 보여주는 부분
printf("P2의 항(계수,지수)을 입력\n");
while (1)
{
scanf("%d %d",&a,&b);
if (a==0 && b==0)
{
break;
}
addTerm(&p2,a,b);
}
printf("P2 다항식 : ");
printPolys(&p2);
printf("\n");
//P1+P2 다항식을 더한 결과 P3를 보여주는 부분
printf("P3 다항식(P1+P2) : ");
p3 = polyAdd(&p1,&p2);
printPolys(&p3);
}
/*
[두 다항식의 덧셈 프로그램]
1차원 배열에 계수만을 저장하고
원소의 개수를 지수로 하여 구하는 방식을 사용하여 구현
*/
#include <stdio.h>
#define SIZE 6 //다항식의 계수를 입력받을 배열 원소 개수 지정 (SIZE는 지수로 사용)
int p3[12]; //결과가 저장될 p3다항식 넉넉하게 배열 12개 지정
int isZeroP(int *p) //항이 있는지 여부
{
int result=1;
for (int i=0; i<SIZE; i++)
{
if (p[i] > 0)
{
result=0;
}
}
return result;
}
void polyAdd(int *p1, int *p2) // p3다항식 = p1다항식 + p2다항식
{
if (!isZeroP(p1) || !isZeroP(p2)) //p1,p2 한쪽에라도 항이 있으면
{
for (int i=0; i<SIZE; i++)
{
p3[i] = p1[i] + p2[i]; //p1,p2 다항식을 더한값을 p3에 넣어줌
}
}else{
printf("항이 없습니다.\n\n");
}
}
void polyPrint(int *p) //다항식 출력
{
if (!isZeroP(p))
{
for (int i=0; i<SIZE; i++)
{
if (p[i] == 0){ //계수가 0이면 출력하지 않음
printf("");
}else if (i == SIZE-1){ //^1은 지수를 표시하지 않음
printf("%d",p[i]);
}else{
printf("%dx^%d",p[i],SIZE-i); //계수x^지수 형태로 표시
printf(" + ");
}
}
}else{
printf("항이 없습니다.\n");
}
}
void main()
{
int p1[SIZE]; //p1 다항식의 계수를 입력받을 배열
int p2[SIZE]; //p2 다항식의 계수를 입력받을 배열
int i; //반복문을 위한 변수
printf("P1다항식의 계수를 입력하시오.\n");
for (i=0; i<SIZE; i++)
{
printf("^%d 의 계수 : ",SIZE-i);
scanf("%d",&p1[i]);
}
printf("P1 다항식 : ");
polyPrint(p1); //p1 다항식 출력
printf("\n");
printf("P2다항식의 계수를 입력하시오.\n");
for (i=0; i<SIZE; i++)
{
printf("^%d 의 계수 : ",SIZE-i);
scanf("%d",&p2[i]);
}
printf("P2 다항식 : ");
polyPrint(p2); //p2 다항식 출력
printf("\n");
polyAdd(p1,p2); // polyAdd 함수 호출 = p1,p2 다항식의 값을 넘겨줌
printf("P3 다항식(결과) : ");
polyPrint(p3); //p3 다항식 출력
printf("\n");
}
다항식 추상 데이터 타입
ADT Polynomial
// Poly는 Polynomial
데이타 : 지수-계수의 순서쌍 <ei∈Exponent, ai∈Coefficient>의 집합으로
표현된 다항식 p(x) = a0xe0 + a1xe1 + ... + anxen
여기서 ei는 음이 아닌 정수
연산 : p, p1, p2 ∈Poly; a∈Coefficient; e∈Exponent;
zeroP() ::= return p=0;
isPzero(p) ::= if (p=0) then return true
else return false;
coef(p, e) ::= if (<e, a>∈p) then return a
else return 0 ;
maxExp(p) ::= return max(p.Exponent) ;
addTerm(p, a, e) ::= if (e∈p.Exponent) then return error
else return p∪<e, a> ;
delTerm(p, e) ::= if (e∈p.Exponent) then return p-<e, a> for any a
else return error ;
sMult(p, a, e) ::= return p*axe ;
polyAdd(p1, p2) ::= return p1 + p2 ;
polyMult(p1, p2) ::= return p1 * p2 ;
End Polynomial
ADT Polynomial
// Poly는 Polynomial
데이타 : 지수-계수의 순서쌍 <ei∈Exponent, ai∈Coefficient>의 집합으로
표현된 다항식 p(x) = a0xe0 + a1xe1 + ... + anxen
여기서 ei는 음이 아닌 정수
연산 : p, p1, p2 ∈Poly; a∈Coefficient; e∈Exponent;
zeroP() ::= return p=0;
isPzero(p) ::= if (p=0) then return true
else return false;
coef(p, e) ::= if (<e, a>∈p) then return a
else return 0 ;
maxExp(p) ::= return max(p.Exponent) ;
addTerm(p, a, e) ::= if (e∈p.Exponent) then return error
else return p∪<e, a> ;
delTerm(p, e) ::= if (e∈p.Exponent) then return p-<e, a> for any a
else return error ;
sMult(p, a, e) ::= return p*axe ;
polyAdd(p1, p2) ::= return p1 + p2 ;
polyMult(p1, p2) ::= return p1 * p2 ;
End Polynomial
다항식의 덧셈
polyAdd(p1, p2)
// p3 = p1 + p2 : 다항식 p1과 p2를 더한 결과 p3을 반환
p3←zeroP()
while (not isZeroP(p1) and not isZeroP(p2)) do {
case {
maxExp(p1) < maxExp(p2) :
p3 ← addTerm(p3, coef(p2, maxExp(p2)), maxExp(p2));
p2 ← delTerm(p2, maxExp(p2));
maxExp(p1) = maxExp(p2) :
sum ← coef(p1, maxExp(p1)) + coef(p2, maxExp(p2));
if (sum≠0) then p3 ← addTerm(p3, sum, maxExp(p1));
p1 ← delTerm(p1, maxExp(p1));
p2 ← delTerm(p2, maxExp(p2));
maxExp(p2) > maxExp(p2) :
p3 ← addTerm(p3, coef(p1, maxExp(p1)), maxExp(p1));
p1 ← delTerm(p1, maxExp(p1));
}
}
if (not isZeroP(p1)) then p1의 나머지 항들을 p3에 복사
else if (not isZeroP(p2)) then p2의 나머지 항들을 p3에 복사;
return p3;
End polyAdd
polyAdd(p1, p2)
// p3 = p1 + p2 : 다항식 p1과 p2를 더한 결과 p3을 반환
p3←zeroP()
while (not isZeroP(p1) and not isZeroP(p2)) do {
case {
maxExp(p1) < maxExp(p2) :
p3 ← addTerm(p3, coef(p2, maxExp(p2)), maxExp(p2));
p2 ← delTerm(p2, maxExp(p2));
maxExp(p1) = maxExp(p2) :
sum ← coef(p1, maxExp(p1)) + coef(p2, maxExp(p2));
if (sum≠0) then p3 ← addTerm(p3, sum, maxExp(p1));
p1 ← delTerm(p1, maxExp(p1));
p2 ← delTerm(p2, maxExp(p2));
maxExp(p2) > maxExp(p2) :
p3 ← addTerm(p3, coef(p1, maxExp(p1)), maxExp(p1));
p1 ← delTerm(p1, maxExp(p1));
}
}
if (not isZeroP(p1)) then p1의 나머지 항들을 p3에 복사
else if (not isZeroP(p2)) then p2의 나머지 항들을 p3에 복사;
return p3;
End polyAdd
#include <stdio.h>
void main()
{
int a[3][4]={{1,0,0,0},{1,1,0,0},{1,1,1,0}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]!=0)
sum = sum + 1;
}
}
printf("0이 아닌 원소의 수 : %d \n",sum);
}
{
int a[3][4]={{1,0,0,0},{1,1,0,0},{1,1,1,0}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]!=0)
sum = sum + 1;
}
}
printf("0이 아닌 원소의 수 : %d \n",sum);
}
#include <stdio.h>
void main()
{
int a[3][4]={{1,5,5,5},{1,1,5,5},{1,1,1,5}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(j>i)
sum = sum + a[i][j];
}
}
printf("주 대각선 위쪽 원소의 합 : %d \n",sum);
}
{
int a[3][4]={{1,5,5,5},{1,1,5,5},{1,1,1,5}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(j>i)
sum = sum + a[i][j];
}
}
printf("주 대각선 위쪽 원소의 합 : %d \n",sum);
}
#include <stdio.h>
void main()
{
int a[3][4]={{5,2,2,2},{2,5,2,2},{2,2,5,2}};
int i,j;
int sum=1;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(i==j)
sum = sum * a[i][j];
}
}
printf("주 대각선 위쪽 원소의 곱 : %d \n",sum);
}
{
int a[3][4]={{5,2,2,2},{2,5,2,2},{2,2,5,2}};
int i,j;
int sum=1;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(i==j)
sum = sum * a[i][j];
}
}
printf("주 대각선 위쪽 원소의 곱 : %d \n",sum);
}
#include <stdio.h>
void main()
{
int a[4][4]={{0,1,2,3},{0,0,4,5},{0,0,0,6},{0,0,0,0}};
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i<j)
a[j][i] = a[i][j];
{
int a[4][4]={{0,1,2,3},{0,0,4,5},{0,0,0,6},{0,0,0,0}};
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i<j)
a[j][i] = a[i][j];
printf("%3d",a[i][j]);
}
printf("\n");
}
}
}
printf("\n");
}
}
3차원 배열
1) 행우선 순서
저장 순서 : 1행의 요소 → 2행의 요소 → 3행의 요소 → 4행의 요소, …
각 요소의 주소 계산 (단, 각 요소의 길이는 고려하지 않는다.)
--→ 다음과 같이 3차원 배열이 선언되었다면
int Array [u1][u2][u3]
Array [i][j][k]의 주소 = 기준 주소 + (i-1) * u2 * u3 + (j-1) * u3 +(k-1)
예) 기준 주소가 1000이고 3차원 배열이 다음과 같이 선언되었다면
int Array [3][4][5]
Array [2][3][4]의 주소 = 1000 + (2-1) * 4 * 5 + (3-1) * 5 + (4-1) => 1033
2) 열우선 순서
저장 순서 : 1열의 요소 → 2열의 요소 → 3열의 요소 → 4열의 요소, …
각 요소의 주소 계산 (단, 각 요소의 길이는 고려하지 않는다.)
--→ 다음과 같이 3차원 배열이 선언되었다면
int Array [u1][u2][u3]
Array [i][j][k]의 주소 = 기준 주소 + (i-1) * u2 * u3 + (k-1) * u2 +(j-1)
예) 기준 주소가 1000이고 3차원 배열이 다음과 같이 선언되었다면
int Array [3][4][5]
Array [2][3][4]의 주소 = 1000 + (2-1) * 4 * 5 + (4-1) * 4 + (3-1) => 1034
순환함수 및 알고리즘 분석 문제
1. Let n denote a positive integer. Suppose a function L is defined recursively as follows:
L(n) = 0, if n = 1
L(n) = L(n/2)+1, if n>1
(a) Find L(25)L(n) = L(n/2)+1, if n>1
(b) Waht does this function do?
#include <stdio.h>
static int count=0;
long L(long n)
{
count++;
{
count++;
if (n==1)
return 0; // n=1일 경우
else if (n>1)
return L(n/2)+1; // n>1일 경우
else
return 0;
}
return 0; // n=1일 경우
else if (n>1)
return L(n/2)+1; // n>1일 경우
else
return 0;
}
void main()
{
printf("%d, %d \n", count, L(25));
}
// L(25) = count:5, value:4
2. Let a and b denote positive integer. Suppose a function Q is defined recursively as follows:
Q(a,b) = 0, if a<b
Q(a-b,b)+1, if a>=b
(a) Find the value of Q(2,3) and Q(14,3)Q(a-b,b)+1, if a>=b
(b) Waht does this function do? Find Q(5861,7)
#include <stdio.h>
static int count=0;
long Q(long a, long b)
{
count++;
{
count++;
if (a<b)
return 0; // a<b일 경우
else if (a>=b)
return Q(a-b,b)+1; // a>=b일 경우
else
return 0;
}
return 0; // a<b일 경우
else if (a>=b)
return Q(a-b,b)+1; // a>=b일 경우
else
return 0;
}
void main()
{
printf("%d, %d \n", count, Q(5861,7));
}
// Q(2,3) ==> count:1, value:0
// Q(14,3) ==> count:5, value:4
// Q(5861,7) ==> count:838, value:837
// Q(14,3) ==> count:5, value:4
// Q(5861,7) ==> count:838, value:837
3. The Ackermann function is a function with two arguments assigned any nonnegative integer.
A(m,n) = n + 1, if m=0
A(m,n) = A(m-1,1), if n=0
A(m,n) = A(m-1,A(m,n-1)), if 그외의경우
(a) Find the value of Q(2,3) and Q(14,3)A(m,n) = A(m-1,1), if n=0
A(m,n) = A(m-1,A(m,n-1)), if 그외의경우
(b) Waht does this function do? Find Q(5861,7)
#include <stdio.h>
static int count=0;
long A(long m, long n)
{
count++;
{
count++;
if (m==0)
return n+1; // m=0일 경우
else if (n==0)
return A(m-1,1); // n=0일 경우
else
return A(m-1, A(m, n-1)); // 그외경우
}
return n+1; // m=0일 경우
else if (n==0)
return A(m-1,1); // n=0일 경우
else
return A(m-1, A(m, n-1)); // 그외경우
}
void main()
{
printf("%d, %d \n", count, A(1, 3));
}
// A(1,3) = count:8, value:5
// A(2,2) = count:27, value:7
// A(2,2) = count:27, value:7


PolyAdd_list.cpp




01_소프트웨어 공학과 프로그래밍 기법.ppt
report_data_structure_070318.zip


Recent Comment