22
Database Managment System 학학 학학 20083431 학학학 20083458 학학학 20093511 학학학 20113287 학학학 20113319 학학학 D3 학 목목 1. 학학학학학학

이산치수학 Project2

Embed Size (px)

Citation preview

Page 1: 이산치수학 Project2

Database

Managment

System학번 이름

20083431 고충욱

20083458 민영지

20093511 이창준

20113287 박다솔

20113319 정진아

D3 조

목차1. 프로그램목적2. 일정

Page 2: 이산치수학 Project2

3. 1 차 코딩 초안 및 문제점,해결책4. 2 차 코딩 소스 및 문제점,해결책 5. 3 차 코딩 소스 및 문제점,해결책6. 최종 코딩7. 참고 자료1.프로그램 목적

reflexive,symmetric,irreflexive 를 알고 프로그램을 작성할 수

있다.

2.일정

2012.3.18

역할분담 및 문제 인식

고충욱

equivalence class of X relative to R, irreflexive, antisymmetric,

partial ordering, ordering 이해하고 조원에게 설명하기,

1 차 코딩 작업, 최종 코딩 작업

민영지

bijection, permutation, The Pigemonhole Principle, invertible,

surjective 이해하고 조원에게 설명하기, 보고서 작성,

코딩 문제점제시

Page 3: 이산치수학 Project2

이창준

binary relation, reflexive, symmetric, transitive, equivalence

relations 이해하고 조원에게 설명하기, 코딩 문제점제시,

보고서 작성

박다솔

lexicorgraphic order, transitive closur, composition, identity

relation,

inverse relation 이해하고 조원에게 설명하기, 1 차 코딩 작업

정진아function, image, range, equal, injective 이해하고 조원에게 설명하기,

보고서 작성, 코딩 문제점제시

2012.3.23

조원들끼리 모여 서로 나누어서 찾은 것들에 대해 설명 해주고 받고

하며 토의를 하였다.

binary relation : 2-항 관계, 공집합이 아닌 임의의 두 집합 A,B 에 대하여, A 에서 B 로 가는

이항관계는 A×B 의 부분집합을 말한다. 이때 (a,b)∈R 이면 a 는 b 에 대해서 R 관계가 없다고 하며,

aRb 로 표기한다.

reflexive : 반사적, 관계 R 이 정의된 집합의 모든 원소 a 에 대해서 aRa 가 성립하는 경우에 대해 R

을 반사적 관계라고 한다.

symmetric : 대칭적, 임의의 두 원소 a,b∈A 에 대하여 aRb 이면 반드시 bRa 일 때 R 을 대칭적

관계라 한다.

transitive : 추이적, 임의의 원소 a,b,c∈A 에 대하여 aRb 이고 bRc 이면 반드시 aRc 일 때 R 을

추이적 관계라 한다.

equivalence relations : 동치 관계, 집합 A 에서의 2 항관계 R 이 A 의 모든 원소 a,b,c 에 대하여

반사적, 대칭적, 추이적 관계를 만족할때 R 은 동치 관계라 한다.

function : 함수, 변수 x 와 y 사이에 x 의 값이 정해지면 따라서 y 값이 정해진다는 관계가 있을 때,

y 는 x 의 함수라고 한다.

image : 상, 치역에 속한 원소

Page 4: 이산치수학 Project2

range : 치역, 함수가 취하는 값 전체의 집합을 일컫는다. 치역이라고 하는 것은 함수의 모든 "

출력"값의 집합

equal : 같은, 어떤 두 개의 사상(事象)이 모두 같은 것. 이 기호로서 등호「=」를 쓴다.

수학적으로는 좌변과 우변이 같은 것을 표시한다

injective : 단사함수 f: X->Y 에 대해 집합 X 의 서로 다른 원소들이 집합 Y 의 서로 다른 원소들에

대응 될때

예) 집합 X 의 임의의 원소 x1,x2 에 대하여 x1 과 x2 가 같지 않을때 f(x1) f(x2)가 같지 않을때

단사함수 또는 일대일 함수라 한다.

permutation : 순열, n 개의 서로 다른 것 중에서 r 개(nr)를 택하여 어떤 순서에 따라 일렬로

배열하는 것 공식: nPr=n!/(n-r)!

The Pigemonhole Principle : 비둘기 집의 원리, 비둘기 집은 n 개 밖에 없는데 비둘기는 n 마리

보다 더 많이 있다면, 비둘기 집 가운데 어느 하나는 반드시 2 마리 이상의 비둘기가 사용해야 한다는

것이다. 이것은, 정의역과 공역이 각각 유한집합인 함수에 관한 간단한 성질 즉, A, B 가 모두

유한집합이고 |A |> |B |이면, A 에서 B 로의 어떤 함수도 1 대 1 대응이 될 수는 없다는 것으로

표현되어지기도

한다.

ex) n> m 일 때, n 개의 물건을 m 개의 상자에 넣으려면 어떤 방법으로 넣더라도 적어도 어느 한

상자에는 두 개 이상의 물건을 넣어야 한다.

invertible : 행렬, 행들과 열들로 구분하여 정돈된 숫자나 문자들을 단순한 직사격형 또는

정사격형의 형태로 배열한것

surjective : 전사함수, f: X ->Y 에 대해 치역과 공역이 일치하는 함수

2012.3.25

메신저를 통해 조원들과 1 차 코딩에 대한 문제점과 대안점을 찾아

해결하였다.

특정 예에서 symmetric 오류.

2012.3.30

Page 5: 이산치수학 Project2

메신저를 통해 조원들과 2 차 코딩후 숫자입력을 문제와 동일하게

하여야 한다하여 다시 입력부분을 수정하였다. 처음부터 안고있던

행과 열의 입력 부분에 대한 토의를 하였다.

2012.4.3

행과 열의 입력 부분까지 완료 하여 최종적인 소스가 나오게 되었다.

3. 1 차 코딩 초안 및 문제점 ,해결책#include <stdio.h>

int main(void)

{

int arr[4][4];

int arr_w,arr_h;

int i,j,sum=0;

int a;

int com=0;

printf("입력하려는 행렬의 행의 갯수를 입력하세요\n");

scanf("%d",&arr_w);

printf("입력하려는 행렬의 열의 갯수를 입력하세요\n");

scanf("%d",&arr_h);

for(i=0; i<arr_w;i++)

{

printf("%d 행 입력\n",i+1);

for(j=0; j<arr_h; j++)

{

scanf("%d",&arr[i][j]);

}

}

if(arr_h==arr_w)

{

for(i=0,j=0; i<arr_h;i++,j++)

{

Page 6: 이산치수학 Project2

sum +=arr[i][j];

}

if(sum==arr_w)

{

printf("reflexive : yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

if(sum== 0)

{

printf("irreflexive:yes\n");

}

else

{

printf("irreflexive :no\n");

}

}

for(i=0; i<arr_w ; i++)

{

for(j=0; j<arr_h ; j++)

{

if(arr[i][j]!=arr[j][i])

{

a=1;

}

else

{

a=0;

}

}

}

if(a==1)

{

printf("symmetric : no\n");

}

Page 7: 이산치수학 Project2

else if(a==0)

{

printf("symmetric : yes\n");

}

}

if(arr_h!=arr_w)

{

printf("symmetric:no\n");

com = arr_w>arr_h ? arr_h:arr_w;

for(i=0,j=0; i<com ; i++,j++)

{

sum+=arr[i][j];

}

if(sum==com)

{

printf("reflexive : yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

if(sum== 0)

{

printf("irreflexive:yes\n");

}

else

{

printf("irreflexive :no\n");

}

}

}

_getch();

}

1.문제점 파악

Page 8: 이산치수학 Project2

3X3 일때 (1,0,0),(1,1,0),(0,0,1)대입시

symmetric 의 오류가 발생한다.

1 차 코딩 해결책for(i=0; i<arr_w ; i++)

{

for(j=0; j<arr_h ; j++)

{

if(arr[i][j]!=arr[j][i])

a=1;

else

{

a=0;

}

}

}

if(a==1)

{

printf("symmetric : no\n");

}

else if(a==0)

{

printf("symmetric : yes\n");

}

위에 symmetric 계산 부분에 I 와 j 가 같지 않을

때 조건을 추가하고 else 부분을 지워버렸다.

그리고 처음부터 a=1 로 선언하여 arr[i][j]와

arr[j][i]를 비교 같지 않을 땐 a=0 으로

처리하였다.

4. 2 차 코딩소스 및 문제점, 해결책

Page 9: 이산치수학 Project2

#include <stdio.h>

int main(void)

{

int arr[4][4];

int arr_w,arr_h;//입력받는 행,열 선언

int i,j,sum=0;

int a=1;

int small=0;

printf("입력하려는 행렬의 행의 갯수를 입력하세요\n");

scanf("%d",&arr_w);

printf("입력하려는 행렬의 열의 갯수를 입력하세요\n");

scanf("%d",&arr_h);

for(i=0; i<arr_w;i++)

{

printf("%d 행 입력\n",i+1);

for(j=0; j<arr_h; j++)

{

scanf("%d",&arr[i][j]);

}

}

if(arr_h==arr_w)

{

for(i=0,j=0; i<arr_h;i++,j++)

{

sum +=arr[i][j];

}

if(sum==arr_w)

{

printf("reflexive : yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

if(sum== 0)

{

Page 10: 이산치수학 Project2

printf("irreflexive:yes\n");

}

else

{

printf("irreflexive :no\n");

}

}

for(i=0; i<arr_w ; i++)

{

for(j=0; j<arr_h ; j++)

{

if(i != j)

{

if(arr[i][j]!=arr[j][i])

{

a=0;

}

}

}

}

if(a==0)

{

printf("symmetric : no\n");

}

else if(a==1)

{

printf("symmetric : yes\n");

}

}

if(arr_h!=arr_w)

{

printf("symmetric:no\n");

small = arr_w>arr_h ? arr_h:arr_w;

for(i=0,j=0; i<small ; i++,j++)

{

sum+=arr[i][j];

}

Page 11: 이산치수학 Project2

if(sum==small)

{

printf("reflexive : yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

if(small== 0)

{

printf("irreflexive:yes\n");

}

else

{

printf("irreflexive :no\n");

}

}

}

getch();

return 0;

}

문제점 파악

숫자 입력 부분이 문제와 다르게 받음.

2 차 코딩 해결책

입력부분 받는 부분을 1 차 배열로 받아 숫자만 따로 1 차배열에 다시 넣어

다시 숫자만 2 차 배열에 다시 집어넣는 과정을 새로 만들었다.

printf("숫자를 입력하세요\n");

scanf("%s",str);

for(i=0,j=0;i<len;i++)

{

if(str[i]=='1'||str[i]=='0')

{

Page 12: 이산치수학 Project2

temp[j]=str[i];

j++;

}

}

for(x=0,j=0;x<arr_w;x++)

{

for(y=0;y<arr_h;y++)

{

arr[x][y]=temp[j];

j++;

}

}

5. 3 차 코딩 소스 및 문제점,해결책#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main(void)

{

char arr[5][5];

int arr_w=0,arr_h=0;

int i,j;

int sum=0;

int x,y,len;

int a=1,b=1;

int small=0;

char str[60];

char temp[25];

printf("숫자를 입력하세요\n");

scanf("%s",str);

printf("입력하려는 행렬의 행의 갯수를 입력하세요\n");

scanf("%d",&arr_w);

printf("입력하려는 행렬의 열의 갯수를 입력하세요\n");

scanf("%d",&arr_h);

len=strlen(str);

for(i=0,j=0;i<len;i++)

Page 13: 이산치수학 Project2

{

if(str[i]=='1'||str[i]=='0')

{

temp[j]=str[i];

j++;

}

}

for(x=0,j=0;x<arr_w;x++)

{

for(y=0;y<arr_h;y++)

{

arr[x][y]=temp[j];

j++;

}

}

if(arr_w==arr_h)

{

for(i=0,j=0; i<arr_h;i++,j++)

{

sum +=(arr[i][j]-48);

}

if(sum==0)

{

printf("reflexive : no\n");

printf("irreflexive: yes\n");

}

else if(sum==arr_w)

{

printf("reflexive :yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

printf("irreflexive: no\n");

}

for(i=0; i<arr_w ; i++)

Page 14: 이산치수학 Project2

{

for(j=0; j<arr_h ; j++)

{

if(i != j)

{

if(arr[i][j] != arr[j][i])

{

a=0;

}

}

}

}

if(a==0)

{

printf("symmetric : no\n");

}

else if(a==1)

{

printf("symmetric : yes\n");

}

}

if(arr_w!=arr_h)

{

printf("symmetric:no\n");

small = arr_w>arr_h ? arr_h:arr_w;

for(i=0,j=0; i<small ; i++,j++)

{

sum+=arr[i][j]-48;

}

if(sum==small)

{

printf("reflexive : yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

Page 15: 이산치수학 Project2

if(sum == 0)

{

printf("irreflexive:yes\n");

}

else

{

printf("irreflexive :no\n");

}

}

}

_getch();

return 0;

}

3 차소스 문제점

행과 열을 입력 받아야 프로그램이 실행된다는 문제점이 있다.

printf("입력하려는 행렬의 행의 갯수를 입력하세요\n");

scanf("%d",&arr_w);

printf("입력하려는 행렬의 열의 갯수를 입력하세요\n");

scanf("%d",&arr_h);

이 부분에서 직접 행과 열의 개수를 받아서 문제가 됨.

3 차 소스 해결책

for(ptr=str;;)//행과 열을구하기위한 부분

{

ptr=strchr(ptr,'[');

if(ptr == NULL)

{

break;

}

count++;

ptr++;

Page 16: 이산치수학 Project2

}

for(ptr=str;;)

{

ptr=strchr(ptr,'0');

if(ptr == NULL)

{

break;

}

count2++;

ptr++;

}

for(ptr=str;;)

{

ptr=strchr(ptr,'1');

if(ptr == NULL)

{

break;

}

count3++;

ptr++;

}

arr_w=count-1;

arr_h=(count2+count3)/arr_w;//여기까지

[ 이 괄호의 개수를 세어 1 을 빼준 수가 행이기 때문에 행의 수를

구할수 있었고, 입력받은 문자열중 숫자의 개수만 더하여 행의 수로

나누어주면 열의 수가 나오는 걸 알고 이걸 소스로 옮겼다.

6. 최종 코딩#include <stdio.h>

#include <string.h>

Page 17: 이산치수학 Project2

#include <stdlib.h>

int main(void)

{

char arr[5][5];

char str[60];

char temp[25];

char *ptr;

int arr_w=0;

int arr_h=0;

int i,j;

int sum=0;

int x,y,len;

int a=1;

int small=0;

int count=0;

int count2=0;

int count3=0;

printf("숫자를 입력하세요\n");

scanf("%s",str);//1 차배열 str 에 숫자를 입력받음

len=strlen(str);

for(i=0,j=0;i<len;i++)//1 차배열 str 에서 숫자만 따로 temp 배열에 넣음.

{

if(str[i]=='1'||str[i]=='0')

{

temp[j]=str[i];

j++;

}

}

for(ptr=str;;)//행과 열을구하기위한 부분

{

ptr=strchr(ptr,'[');

if(ptr == NULL)

{

break;

}

count++;

ptr++;

}

for(ptr=str;;)

{

Page 18: 이산치수학 Project2

ptr=strchr(ptr,'0');

if(ptr == NULL)

{

break;

}

count2++;

ptr++;

}

for(ptr=str;;)

{

ptr=strchr(ptr,'1');

if(ptr == NULL)

{

break;

}

count3++;

ptr++;

}

arr_w=count-1;

arr_h=(count2+count3)/arr_w;//여기까지

for(x=0,j=0;x<arr_w;x++)//temp 에 있던 숫자들을 2 차배열에 넣는 부분

{

for(y=0;y<arr_h;y++)

{

arr[x][y]=temp[j];

j++;

}

}

if(arr_w==arr_h)//행과 열이 같은 정방일때 reflexive 와 irreflexive symmetric 을 구하는부분

{

for(i=0,j=0; i<arr_h;i++,j++)//문자열로 입력받았기 때문에 아스키코드를 사용하여

문제해결에 돌입

{

sum +=(arr[i][j]-48);

}

if(sum==0)//sum 이 0 이면 (0,0),(1,1)..이모두 0 이기때문에

{

printf("reflexive : no\n");

printf("irreflexive: yes\n");

}

Page 19: 이산치수학 Project2

else if(sum==arr_w)//sum 이 행의 수와같으면 (0,0)(1,1)..이 모두 1 이기 때문에

{

printf("reflexive :yes\n");

printf("irreflexive: no\n");

}

else//그렇지 않으면 둘다 no

{

printf("reflexive :no\n");

printf("irreflexive: no\n");

}

for(i=0; i<arr_w ; i++)//symmetric 구하는 부분

{

for(j=0; j<arr_h ; j++)

{

if(i != j)

{

if(arr[i][j] != arr[j][i])//(0,1) (1,0)이런식으로 서로를 비교하여 symmetric 을 비교 다른게 하나라도 있으면

{a=0;//a=0 을 넣어 밑에식

}

}

}

}

if(a==0)//이곳에서 대칭성 no 를 출력{

printf("symmetric : no\n");

}

else if(a==1)//모두 같으면 초기에 a=1 로 선언하였기때문에 a 가 1 일땐 대칭성 yes 출력

{

printf("symmetric : yes\n");

}

}

if(arr_w!=arr_h)//정방이 아닐때 구하는 부분

{

printf("symmetric:no\n");//정방이 아닐땐 대칭성이 yes 가 될수없으므로 no 출력

small = arr_w>arr_h ? arr_h:arr_w;//행과 열을 비교 작은수를 나중에 쓸 수식을 위해 small 에 저장

for(i=0,j=0; i<small ; i++,j++)//reflexive 와 irreflexive 를 구하기위해 small 만큼만 돌아서 i j 가 같은 행만

비교 하여

{//정방일때와 마찬가지로 sum 을 구하여 yes,no 출력

sum+=arr[i][j]-48;

}

Page 20: 이산치수학 Project2

if(sum==small)

{

printf("reflexive : yes\n");

printf("irreflexive: no\n");

}

else

{

printf("reflexive :no\n");

if(sum == 0)

{

printf("irreflexive:yes\n");

}

else

{

printf("irreflexive :no\n");

}

}

}

_getch();

return 0;

}

Ⅵ. 참고 자료

이산치 책- 한빛 미디어 함미옥,홍영진

위키백과 사전

WIN32 Api 연구 사이트-http://winapi.co.kr/