이산치수학 Project2

Preview:

Citation preview

Database

Managment

System학번 이름

20083431 고충욱

20083458 민영지

20093511 이창준

20113287 박다솔

20113319 정진아

D3 조

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

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 이해하고 조원에게 설명하기, 보고서 작성,

코딩 문제점제시

이창준

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 : 상, 치역에 속한 원소

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

메신저를 통해 조원들과 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++)

{

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

}

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.문제점 파악

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 차 코딩소스 및 문제점, 해결책

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

{

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

}

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

{

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

{

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

{

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

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

}

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>

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

{

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

}

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;

}

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/

Recommended