2012 Dm 02

507 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
507
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2012 Dm 02

  1. 1. Project #2데이터베이스 시스템 이산치 수학 B1 조장: 09 백종근 조원: 08 김무경, 11 장동규 , 11 박정현 , 11 정예린
  2. 2. 관계찾기•행렬 표현 입력을 입력받아서 reflexive,symmetric, irreflexive 경우에 yes/no인지출력하는 프로그램 작성하기•입력:3x3 행렬일 경우: [[1,0,0][1,1,0][0,1,0]]•2x2, 2x3 ~ 4x5, 5x4, 5x5 까지 가능•출력yes/no
  3. 3. 프로젝트에 필요한 내용 및 함수1. binary relation①두 집합 A, B에 대한 2항 관계 R는 두 집합의 데카르트 곱 A×B의 부분 집합이다. 즉, R⊆A×B, (a, b)∈R일 때 aRc로 표시한다.②차수가 2인 관계. 여기서 차수는 관계 내의 속성 수를 말한다.2. reflexive관계 R이 정의된 집합의 모든 원소 a에 대해서 aRa가 성립하는 경우에 대해 R을 반사적관계라고 한다.3. symmetric집합의 두 원소 a, b에 대해서 a R b 관계가 성립할 때 b R a의 관계도 성립하면 R을 대칭성 관계라 한다.4. irreflexive관계 R이 정의된 집합 A의 모든 원소 a에 대하여 a R a의 관계가 성립하지 않을 경우 R을비반사적 관계라 한다.반사,비반사,대칭,반대칭 관계 부연 설명 및 예제 풀이각 관계에 관해서 행렬을 만들어줍니다. 그리고 무슨 관계인지 파악!! 예제1) R1= {(1, 1), (1, 2), (1, 3), (3, 3)}=> (2,2)가 추가되야 반사적 관계 {(1,1),(1,2),(1,3),(3,3),(2,2)}2) R2 = {(1,2),(2,1),(1,3),(2,3),(3,1),(3,2)}
  4. 4. => 비반사적 관계에 있다 (1,1), (2,2), (3,3) 이 없음 (아래 부가 설명 참조)=> R2는 대칭적 관계에 있다 (아래 부가 설명 참조)a.{(a,b),(a,c),(a,d),(a,e)}b.{(a,b),(b,a),(b,d),(d,b),(a,e),(e,a)}c.{(a,a),(b,b),(c,c),(d,d)}a.{(a,b),(a,c),(a,d),(a,e)}a. {(a,b),(a,c),(a,d),(a,e)} reflexive가 아닌 것은 확실합니다( a가 쓰였는데 (a, a)가 없습니다 ).(a,b)가 있는데 (b,a)가 없으므로 symmetric이 아닙니다.x R y 이고 y R z 이면 x R z 를 항상 만족하면 transitive 입니다.그런데 x R y 이고 y R z 인 경우가 없으므로 위의 명제의 조건이 항상 F 입니다. 따라서참입니다.그래서 transitive 합니다. ( 이런 것을 vacuus truth 라고 합니다 ).b.{(a,b),(b,a),(b,d),(d,b),(a,e),(e,a)}reflexive가 아닙니다. ( a가 쓰였는데 (a, a) 가 없습니다 ).(a,b), (b,a) 가 있는데 (a,a)가 없습니다. transitive가 아닙니다.x R y => y R x 를 모두 성립합니다. 따라서 symmetric 합니다.c.{(a,a),(b,b),(c,c),(d,d)} a, b, c, d 모두 (a, a), (b, b), (c, c), (d, d) 가 있으므로 reflexive입니다.모두 쌍이 같은 두 개로 되어있으므로 분명히 symmetric입니다.x R y and y R z 인 것을 만족하는 것이 없으므로 위에서 살펴본 바 대로 transitive 입니다.(1,1) 의 의미는 1행에서 1열로 간다는 것입니다.그리고 R의 관계가 있으면 행렬상에 1이라고 적으시고, 없으면 0이라고 쓰세요.1 1 10 0 0
  5. 5. 0 0 1 *반사적 관계 (reflexive)대각선 성분이 모두 1이면, 반사적 관계이다. 예제1 0 01 1 00 0 1 *비반사적 관계 (irreflexive)대각선 성분이 모두 0이면, 비반사적 관계이다. 예제0 1 01 0 10 1 0 *대칭적 관계 (symmetric)대각선 성분을 중심으로 대칭적이어야 한다. 예제  (색이 같은 것끼리 대칭임을 의미함)0 1 01 1 10 1 0 *반대칭적 관계 (Anti-symmetric)대각선 성분을 중심으로 서로 반대칭적이어야 한다. 예제  (색이 같은 것끼리 반대칭임을 의미함)0 1 00 1 01 1 0 
  6. 6. 부연설명 예제1) R= {(1, 1), (1, 2), (1, 3), (3, 3)}에서 ...(1,1) 의 의미는 1행에서 1열로 간다는 것이랍니다.그리고 R의 관계가 있으면 행렬상에 1이라고 적으시고, 없으면 0이라고 쓰세요.참고 그림대각선 성분은 ↘ 방향만 됩니다.1 0 01 1 00 0 1 추이적 관계출처 : http://kin.naver.com/
  7. 7. 필요한 함수getchar원형 : int getchar(void)헤더파일 : stdio.h기능키보드에서 문자 하나를 읽어온다.기정 스트림인 표준 입력 스트림으로부터 한 문자를 읽어오는 함수임을 알 수 있다. stdin은 버퍼를 사용하기 때문에 getchar도 버퍼를 사용한다.특징버퍼에 있는 문자를 꺼내 리턴하고 꺼낸 문자를 버퍼에서 지운다.버퍼가 비어 있으면 입력을 받되 Enter키가 들어올 때까지 입력을 받는다.출처: www.winapi.co.kr문제해결책알고리즘①문자열을 받아 이차원배열에 넣는 알고리즘.getchar함수를 이용해 문자열을 각 글자씩 받아서 배열에 저장한다.배열에 저장된 [의 개수와 ‘0’과 ‘1’의 개수로 행과 열을 크기를 판단한다.선언된 이차원 배열의 행과 열을 탐색하기 위해 이중포문을 만든다.이중포문 안에 처음 문자열을 받았던 배열을 탐색하여 숫자를 만날 경우 이차원 배열에 저장하도록 한다.‘[’와 ‘]’을 중심으로 행과 열을 구분하여 ‘0’과 ‘1’을 이차원 배열에 저장하도록 한다.[[1,1,1][0,0,0][1,0,1]]일 경우 [ [ 1 , 1 , 1 ] [ 0 , 0 , 0 ] [ 1 , 0 , 1 ] ]1행 1열의 배열에 담아서 첫 번째 칸부터 탐색해가며 1과 0을 골라서, ‘]’을 만나면 다음
  8. 8. 행으로 자리를 바꾸어 저장할 수 있도록 한다.②reflexive이차원 배열에 닮긴 원소들을 for문 속에 if문을 넣어서 판별한다.처음 구해진 행과 열의 크기 안에서 발생할 수 있는 n=m의 경우를 모두 생각하여, 그 (n=m) 인 경우의 원소들이 모두 1일 경우 yes를 출력한다.③symmetric이차원 배열에서  과   인 원소들의 순서쌍끼리 모두 같은 원소를 가질 경우 yes를 출력한다.④irreflexive처음 구해진 행과 열의 크기 안에서 발생할 수 있는 n=m의 경우를 모두 생각하여, 그 (n=m) 인 경우의 원소들이 모두 0일 경우 yes를 출력한다.역할분담 김무경 알고리즘에서 문자열로 받은 행렬정보를 이차원 배열에 저장 백종근 소집단 활동 회의록 , 보고서 작성 , 프로젝트 일정 조율 박정현 irreflexive에 대한 알고리즘 생각 소스짜기 정예린 reflexive에 대한 알고리즘 생각 소스짜기 장동규 symmetric에 대한 알고리즘 생각 소스짜기
  9. 9. 일정 2012.03.13~ 프로젝트 확인 및 개인 자료수집 2012.03.17~ 자료 정리와 업무분담, 계획수립 2012.03.19~ 중간보고서 작성, 알고리즘에 따른 코딩과 문제점 파악 2012.03.20~23 초안 작성, 중간 보고서 제출 2012.03.24~ 문제점 발견 및 해결 2012.03.25 프로젝트 완성, 최종보고서 작성 2012.03.26 프로젝트 결과 발표, 보고서 제출 초안 알고리즘을 기반으로 한 소스 초안int ok;for(i=1;i<=n;i++) //이중포문 시작 행 n까지{ for(j=1;j<=m;j++) //이중포문 시작 열 m까지 { if(i==j) //만약 행과 열이 같은 원소(대각선의)들 이면 그냥 진행 { continue; } else //그렇지 않은 경우 안에 있는 원소와 대칭관계의 원소들을 판별
  10. 10. { if(re[n][m]!=re[m][n]) //대칭관계의 원소들이 서로 다르다면 ok를 1로 바꿔줌 { ok=1; break; } else { continue; } } } if(ok==1)//대칭관계의 원소들이 하나라도 다를 경우 ok가 1로 변환되며 바로 no를출력하고 이중포문을 벗어남 { printf("NO"); break; } else if(ok==0)//한번도 1로 변환되지 않고 모든 원소가 대칭관계를 성립함을 판별한 경우 yes를 출력하고 이중포문은 끝남. { printf("yes");}최종소스#include <stdio.h>#include <stdlib.h>int main()
  11. 11. { char arr[100], ch=0; char re[6][6]; int i=0,j,a,ok=0; int x=0,y=0,n,m,num; char *in; while(ch!=n) //줄바꿈이 입력 될 때까지 반복문이 돔. { ch=getchar(); //함수를 이용해 한번에 한글자씩 문자를 입력받음. arr[i]=ch; //입력받은 문자를 배열에 저장함. i++; } /*printf("n%dn", i); for(j=0;j<i;j++) { printf("%c", arr[j]); }*/ for(j=0;j<i;j++) { if(arr[j]==]) { x++; } else if(arr[j]==0 || arr[j]==1) { y++; } } m=x-1; n=(int)y/m; printf("%d %dn",m,n); x=1, y=1; for(a=0;a<i;a++) { if(arr[a]==0 || arr[a]==1) //배열에서 0이나 1이 발견되면 이차원배열에 저장함. { if(y==n) //열이 위에서 입력받은 문자열의 행과 일치할때, 다음행으로 이동하도록 X를 늘려줌.
  12. 12. { re[x][y]=arr[a]; x++; y=1; } else //이차원배열에 값을 저장. { re[x][y]=arr[a]; y++; } } } /*for(x=1;x<6;x++) { for(y=1;y<6;y++) { printf("%c", re[x][y]); } printf("n"); }*/ //대칭 for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(i!=j) { if(re[i][j]!=re[j][i]) //이차원 배열에서 대칭관계에 놓여있는 원소들이 다를때. { //printf("틀림"); ok=1; //선언된 OK를 1로 변환하여줌. break; } else //모두 같을 경우 넘어감. { continue; } }
  13. 13. } if(ok==1) //대칭관계의 원소가 서로 하나라도 다른 수를 가지면 OK는 1이 선언되므로, 대칭적관계가 아님을 출력하고 반복문 탈출. { printf("대칭적관계 : NO"); break; } } if(ok==0) //OK가 1로 변환되지 않은 경우는 모든 대칭적 관계에 있는 원소들이일치한 경우이므로 대칭적관계임을 출력. { printf("대칭적관계 : YES"); } //반사적 ok=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(i==j) { if(re[i][j]==1) //행과 열이 같은 즉 대각선의 위치에놓여있는 원소들이 1이면 넘어감. { continue; } else if(re[i][j]==0) //하나라도 0이 있다면 OK를 1로변환. { ok=1; break; } } } if(ok==1) //하나라도 0이 있으면 반사적 관계가 아니므로 아님을 출력하고 반복문 탈출. { printf("반사적 : NO");
  14. 14. break; } } if(ok==0) //OK가 1로 변환되지 않은 경우는 반사적 관계라는 뜻이므로 맞다는 것을 출력. { printf("반사적 : YES"); } //비반사적관계-반사적 관계의 알고리즘에서 1과 0만 바꾼 상태. ok=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(i==j) { if(re[i][j]==0) { continue; } else if(re[i][j]==1) { ok=1; break; } } } if(ok==1) { printf("비반사적 : NO"); break; } } if(ok==0) { printf("비반사적 : YES"); }
  15. 15. }<출력결과>

×