• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
이산치수학 Project2
 

이산치수학 Project2

on

  • 328 views

 

Statistics

Views

Total Views
328
Views on SlideShare
328
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    이산치수학 Project2 이산치수학 Project2 Document Transcript

    • 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 : yesn");printf("irreflexive: non");}else{printf("reflexive :non");if(sum== 0){printf("irreflexive:yesn");
    • }else{printf("irreflexive :non");}}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 : non");}
    • else if(a==0){printf("symmetric : yesn");}}if(arr_h!=arr_w){printf("symmetric:non");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 : yesn");printf("irreflexive: non");}else{printf("reflexive :non");if(sum== 0){printf("irreflexive:yesn");
    • }else{printf("irreflexive :non");}}}_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 : non");}else if(a==0){printf("symmetric : yesn");}위에 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 : yesn");printf("irreflexive: non");}else{printf("reflexive :non");if(sum== 0){printf("irreflexive:yesn");}else{printf("irreflexive :non");}}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 : non");}else if(a==1){printf("symmetric : yesn");}}if(arr_h!=arr_w){printf("symmetric:non");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 : yesn");printf("irreflexive: non");}else{printf("reflexive :non");if(small== 0){printf("irreflexive:yesn");}else{printf("irreflexive :non");}}}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 : non");printf("irreflexive: yesn");}else if(sum==arr_w){
    • printf("reflexive :yesn");printf("irreflexive: non");}else{printf("reflexive :non");printf("irreflexive: non");}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 : non");
    • }else if(a==1){printf("symmetric : yesn");}}if(arr_w!=arr_h){printf("symmetric:non");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 : yesn");printf("irreflexive: non");}else{printf("reflexive :non");if(sum == 0){
    • printf("irreflexive:yesn");}else{printf("irreflexive :non");}}}_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 : non");printf("irreflexive: yesn");}else if(sum==arr_w)//sum 이 행의 수와같으면 (0,0)(1,1)..이 모두 1 이기 때문에{printf("reflexive :yesn");printf("irreflexive: non");
    • }else//그렇지 않으면 둘다 no{printf("reflexive :non");printf("irreflexive: non");}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 : non");}else if(a==1)//모두 같으면 초기에 a=1 로 선언하였기때문에 a 가 1 일땐 대칭성 yes 출력{printf("symmetric : yesn");}}if(arr_w!=arr_h)//정방이 아닐때 구하는 부분
    • {printf("symmetric:non");//정방이 아닐땐 대칭성이 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 : yesn");printf("irreflexive: non");}else{printf("reflexive :non");if(sum == 0){printf("irreflexive:yesn");}else{printf("irreflexive :non");}}}_getch();
    • return 0;}Ⅵ. 참고 자료이산치 책- 한빛 미디어 함미옥,홍영진위키백과 사전WIN32 Api 연구 사이트-http://winapi.co.kr/