SlideShare ist ein Scribd-Unternehmen logo
1 von 15
Downloaden Sie, um offline zu lesen
Project #2
데이터베이스 시스템




        이산치 수학 B1
                                  조장: 09 백종근
         조원: 08 김무경, 11 장동규 , 11 박정현 , 11 정예린
관계찾기

•행렬 표현 입력을 입력받아서 reflexive,
symmetric, irreflexive 경우에 yes/no인지
출력하는 프로그램 작성하기


•입력:
3x3 행렬일 경우: [[1,0,0][1,1,0][0,1,0]]
•2x2, 2x3 ~ 4x5, 5x4, 5x5 까지 가능


•출력
yes/no
프로젝트에 필요한 내용 및 함수
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)}
=> 비반사적 관계에 있다 (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 1

0 0 0
0 0 1

 

*반사적 관계 (reflexive)

대각선 성분이 모두 1이면, 반사적 관계이다.

 
예제

1 0 0

1 1 0

0 0 1

 

*비반사적 관계 (irreflexive)
대각선 성분이 모두 0이면, 비반사적 관계이다.

 

예제

0 1 0

1 0 1

0 1 0

 

*대칭적 관계 (symmetric)

대각선 성분을 중심으로 대칭적이어야 한다.

 예제  (색이 같은 것끼리 대칭임을 의미함)

0 1 0

1 1 1
0 1 0

 

*반대칭적 관계 (Anti-symmetric)
대각선 성분을 중심으로 서로 반대칭적이어야 한다.

 

예제  (색이 같은 것끼리 반대칭임을 의미함)

0 1 0

0 1 0

1 1 0

 
부연설명 

예제1) R= {(1, 1), (1, 2), (1, 3), (3, 3)}에서 ...(1,1) 의 의미는 1행에서 1열로 간다는 것
이랍니다.
그리고 R의 관계가 있으면 행렬상에 1이라고 적으시고, 없으면 0이라고 쓰세요.

참고 그림




대각선 성분은 ↘ 방향만 됩니다.

1 0 0
1 1 0

0 0 1

 추이적 관계




출처 : http://kin.naver.com/
필요한 함수
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을 골라서, ‘]’을 만나면 다음
행으로 자리를 바꾸어 저장할 수 있도록 한다.


②reflexive
이차원 배열에 닮긴 원소들을 for문 속에 if문을 넣어서 판별한다.
처음 구해진 행과 열의 크기 안에서 발생할 수 있는 n=m의 경우를 모두 생각하여, 그
 (n=m) 인 경우의 원소들이 모두 1일 경우 yes를 출력한다.


③symmetric
이차원 배열에서  과   인 원소들의 순서쌍끼리 모두 같은 원소를 가질 경우 yes
를 출력한다.


④irreflexive
처음 구해진 행과 열의 크기 안에서 발생할 수 있는 n=m의 경우를 모두 생각하여, 그
 (n=m) 인 경우의 원소들이 모두 0일 경우 yes를 출력한다.




역할분담
   김무경         알고리즘에서 문자열로 받은 행렬정보를 이차원 배열에 저장


   백종근          소집단 활동 회의록 , 보고서 작성 , 프로젝트 일정 조율


   박정현             irreflexive에 대한 알고리즘 생각 소스짜기


   정예린              reflexive에 대한 알고리즘 생각 소스짜기


   장동규             symmetric에 대한 알고리즘 생각 소스짜기
일정
      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 //그렇지 않은 경우 안에 있는 원소와 대칭관계의 원소들을 판별
{
                         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()
{
    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를 늘려줌.
{
                               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;
                               }
                    }
}
              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");
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");
        }
}




<출력결과>

Weitere ähnliche Inhalte

Andere mochten auch

Virtual communities
Virtual communitiesVirtual communities
Virtual communitiesJfrogner
 
Oracle - AP 1099 invc processing options
Oracle - AP 1099 invc processing optionsOracle - AP 1099 invc processing options
Oracle - AP 1099 invc processing optionspachbob
 
Mobi sender presentation7
Mobi sender presentation7Mobi sender presentation7
Mobi sender presentation7Diana Patterson
 
Slideshare Present Yourself
Slideshare Present YourselfSlideshare Present Yourself
Slideshare Present YourselfDiana Patterson
 

Andere mochten auch (9)

2012 Ds 06
2012 Ds 062012 Ds 06
2012 Ds 06
 
Virtual communities
Virtual communitiesVirtual communities
Virtual communities
 
Matrik sda 02
Matrik sda 02Matrik sda 02
Matrik sda 02
 
Oracle - AP 1099 invc processing options
Oracle - AP 1099 invc processing optionsOracle - AP 1099 invc processing options
Oracle - AP 1099 invc processing options
 
2012 Ds 04
2012 Ds 042012 Ds 04
2012 Ds 04
 
2012 Dm 01
2012 Dm 012012 Dm 01
2012 Dm 01
 
Mobi sender presentation7
Mobi sender presentation7Mobi sender presentation7
Mobi sender presentation7
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
Slideshare Present Yourself
Slideshare Present YourselfSlideshare Present Yourself
Slideshare Present Yourself
 

Ähnlich wie 2012 Dm 02

2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfjinwookhong
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
이산치수학 Project2
이산치수학 Project2이산치수학 Project2
이산치수학 Project2KoChungWook
 
부울 대수와 컴퓨터 논리
부울 대수와 컴퓨터 논리부울 대수와 컴퓨터 논리
부울 대수와 컴퓨터 논리suitzero
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
An introduction to recursion
An introduction to recursionAn introduction to recursion
An introduction to recursionskku_npc
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)arong1234
 
2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)pchmago
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)arong1234
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)arong1234
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Park Jonggun
 
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법홍준 김
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)
R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)
R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)Changki Yun
 

Ähnlich wie 2012 Dm 02 (16)

2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치2번
이산치2번이산치2번
이산치2번
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치수학 Project2
이산치수학 Project2이산치수학 Project2
이산치수학 Project2
 
부울 대수와 컴퓨터 논리
부울 대수와 컴퓨터 논리부울 대수와 컴퓨터 논리
부울 대수와 컴퓨터 논리
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
이산치1번
이산치1번이산치1번
이산치1번
 
An introduction to recursion
An introduction to recursionAn introduction to recursion
An introduction to recursion
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자
 
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)
R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)
R.R.E.F.U (Uniqueness of Reduced Row Echelon Form)
 

2012 Dm 02

  • 1. Project #2 데이터베이스 시스템 이산치 수학 B1 조장: 09 백종근 조원: 08 김무경, 11 장동규 , 11 박정현 , 11 정예린
  • 2. 관계찾기 •행렬 표현 입력을 입력받아서 reflexive, symmetric, irreflexive 경우에 yes/no인지 출력하는 프로그램 작성하기 •입력: 3x3 행렬일 경우: [[1,0,0][1,1,0][0,1,0]] •2x2, 2x3 ~ 4x5, 5x4, 5x5 까지 가능 •출력 yes/no
  • 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. => 비반사적 관계에 있다 (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 1 0 0 0
  • 5. 0 0 1   *반사적 관계 (reflexive) 대각선 성분이 모두 1이면, 반사적 관계이다.   예제 1 0 0 1 1 0 0 0 1   *비반사적 관계 (irreflexive) 대각선 성분이 모두 0이면, 비반사적 관계이다.   예제 0 1 0 1 0 1 0 1 0   *대칭적 관계 (symmetric) 대각선 성분을 중심으로 대칭적이어야 한다.  예제  (색이 같은 것끼리 대칭임을 의미함) 0 1 0 1 1 1 0 1 0   *반대칭적 관계 (Anti-symmetric) 대각선 성분을 중심으로 서로 반대칭적이어야 한다.   예제  (색이 같은 것끼리 반대칭임을 의미함) 0 1 0 0 1 0 1 1 0  
  • 6. 부연설명  예제1) R= {(1, 1), (1, 2), (1, 3), (3, 3)}에서 ...(1,1) 의 의미는 1행에서 1열로 간다는 것 이랍니다. 그리고 R의 관계가 있으면 행렬상에 1이라고 적으시고, 없으면 0이라고 쓰세요. 참고 그림 대각선 성분은 ↘ 방향만 됩니다. 1 0 0 1 1 0 0 0 1  추이적 관계 출처 : http://kin.naver.com/
  • 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. 행으로 자리를 바꾸어 저장할 수 있도록 한다. ②reflexive 이차원 배열에 닮긴 원소들을 for문 속에 if문을 넣어서 판별한다. 처음 구해진 행과 열의 크기 안에서 발생할 수 있는 n=m의 경우를 모두 생각하여, 그  (n=m) 인 경우의 원소들이 모두 1일 경우 yes를 출력한다. ③symmetric 이차원 배열에서  과   인 원소들의 순서쌍끼리 모두 같은 원소를 가질 경우 yes 를 출력한다. ④irreflexive 처음 구해진 행과 열의 크기 안에서 발생할 수 있는 n=m의 경우를 모두 생각하여, 그  (n=m) 인 경우의 원소들이 모두 0일 경우 yes를 출력한다. 역할분담 김무경 알고리즘에서 문자열로 받은 행렬정보를 이차원 배열에 저장 백종근 소집단 활동 회의록 , 보고서 작성 , 프로젝트 일정 조율 박정현 irreflexive에 대한 알고리즘 생각 소스짜기 정예린 reflexive에 대한 알고리즘 생각 소스짜기 장동규 symmetric에 대한 알고리즘 생각 소스짜기
  • 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. { 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. { 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. { 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. } 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. 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"); }