1. 20093475 박덕제
C1 20093526 정준용
20113283 김종진
3일 7시간
행렬표현을 입력받아서 관계찾기
행렬을 입력받아 관계행렬이 reflexive, symmetric,
irreflexive관계일 경우 Yes/No를 출력하는 알고리즘의
프로그램 소스를 작성한다.
http://sungkyul.edu/~choiym/class/Fundamental_Mathematics
_for_Multimedia/pdf/media_lecture4.pdf -관계에 대한 총 정리
http://blog.naver.com/PostView.nhn?blogId=jaykang10&logNo
=120155415325 -반사, 비반사, 대칭관계의 정의와 예
http://ko.wikipedia.org/wiki/%EB%B0%98%EC%82%AC%EA%B
4%80%EA%B3%84 -위키 백과사전
http://serafis.tistory.com/157 -동적할당으로 2차배열 선언
프로젝트를 받고 자료조사와 프로그램 코드 작성으로 역할분담을
하려고 하였으나 조 인원이 3명밖에 되지 않아서 이번 프로젝트
는 자료조사와 프로그램 코드 작성을 다 같이 진행하기로 했습니
다.
첫 회의 때에는 우선 프로젝트를 수행하기에 꼭 알아야 될
reflexive, symmetric, irreflexive에 대해 먼저 알아보기로 하였습
니다. 회의를 잠시 멈추고 정보를 찾아 reflexive는
symmetric은
- 1 -
2. irreflexive는
이라는 것을 알 수 있었습니다.
(출처 :
http://sungkyul.edu/~choiym/class/Fundamental_Mathematics_f
or_Multimedia/pdf/media_lecture4.pdf)
자료들을 조사하는 데 시간이 꽤 걸려서 관계에 대한 프로그램
작성은 다음 회의 때까지 생각해 오기로 했습니다.
프로젝트를 해결하기 위해 필요한 자료들의 정보가 부족하다는
것을 알고 reflexive와 symmetric, irreflexive에 대한 정보를 찾으
려 하였습니다. 그러나 이 정보들을 알려면 사전정보(relation 등)
들이 더 필요해 정보를 모으는데 오랜 시간이 걸리게 되었습니다.
첫 회의 때 조사했던 reflexive, symmetric, irreflexive를 yes/no
방식으로 출력하는 프로그램을 관계행렬로 표현된 순서쌍의 값을
비교하는 방식으로 작성해보았습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, i, j, k=0;
int mat[5][5];
printf("행렬A의 행을 입력하시오 : ");
scanf("%d", &a);
printf("행렬A의 열을 입력하시오 : ");
scanf("%d", &b);
for(i=1; i<=a; i++)
{
for(j=1; j<=b; j++)
{
printf("%d행의 %d열의 값을 입력하시오 : ", i, j);
scanf("%d", &mat[i-1][j-1]);
- 2 -
5. }
else
{
printf("irreflexive : non");
}
if((mat[0][0]==mat[1][1])&&(mat[1][1]==mat[2][2])&&
(mat[2][2]==mat[3][3])&&(mat[3] [3]==mat[4][4])&&
(mat[0][0]==1))
{
printf("reflexive : yesn");
}
else
{
printf("reflexive : non");
}
}
return 0;
}
symmetric은 mat[i][j]와 mat[j][i]를 비교해 값이 같으면 yes,
다르면 no를 출력하는 방식으로 작성하였고, reflexive와
irreflexive는 행렬의 대각선 순서쌍을 입력해 그 값이 0이면
irreflexive에 yes를 1이면 reflexive에 yes를 출력하는 방식으로
작성하였습니다. 하지만 회의를 통해 이 방법은 출력은 가능하나
if문을 이용하여 조건을 일일이 지정해주는 방식이라 혹 행렬의
크기를 크게 줄 경우 다시 추가적으로 구성하여야 하기에 불편함
이 있다는 의견에 코드를 다른 방향으로 수정하기로 결정하였습니
다. 그 방법에 대해 찾던 중 행과 열의 값을 입력받아 배열의 크
기로 사용하는 방법을 택하기로 하였습니다.
참고 url : http://serafis.tistory.com/157
- 5 -
6. 여러 사람이 회의를 하여 한 사람이 하는 것보다 많은 아이디어
가 나온다는 것을 다시 한 번 더 알게 되었습니다. 처음에 작성한
초안을 가지고 여러번의 수정을 거쳐 보다 나은 프로그램을 만들
어 낼 수 있는 것을 보며 조별활동의 이점을 알게되었습니다.
#include <stdio.h>
#include <stdlib.h>
#define YES 1
#define NO 0
int main(void)
{
int a, b, c, result;
int X=0, Y=0;
int **mat=NULL;
int reflexive(int **mat, int X);
int symmetric(int **mat, int X, int Y);
int irreflexive(int **mat, int X);
reset:
printf("행의 값을 입력하세요 (2~5) ", X);
scanf("%d", &X);
printf("열의 값을 입력하세요 (2~5) ", Y);
scanf("%d", &Y);
if(X>5 || X<2 || Y<2 || Y>5)
{
printf("잘못입력하였습니다n");
goto reset;
}
mat=(int**)malloc(sizeof(int*)*X);
for(a=0; a<X; a++)
{
mat[a]=(int*)malloc(sizeof(int)*Y);
}
for(b=0; b<X; b++)
{
for(c=0; c<Y; c++)
- 6 -
8. int irreflexive(int **mat,int X)
{
int i;
for(i=0; i<X; i++)
{
if(mat[i][i]==1)
return 0;
}
return 1;
}
결과로써 이러한 프로그램 소스를 작성하였습니다. 행과 열의 값을 입력받아 그 크기
의 배열을 생성한 뒤 입력받아 관계를 구하는 방식입니다. reflexive, symmetric,
irreflexive를 구하는 방법은 크게 바꾸지는 않고 1차 프로그램 소스를 사용하였습니다.
프로그램 코드를 작성하는 데 있어 수행할 수 있는 방법이 다양하다는 점을 느끼게 되
었습니다. 초안, 1차 수정, 2차 수정을 거치며 최종결과물이 나오는 것을 보며 회의를
통한 코드 분석이 유용하다는 것을 알게 되었습니다. 더 좋은 프로그램이 있겠지만 많
이 개선했다는 점에서 만족합니다.
- 8 -