1. degree 출력하는 프로그램
조 장 : 20113272김남희
작성자 조 원 : 20083519 조경상, 20083430 강승우,
20113293서상현, 20083472 변세현
2. Ⅰ. 프로젝트의 목적
방향 그래프에 대해 공부하고, 원리를 바탕으로 adjacent matrix가 주어졌을
때 indegree/outdegree 를 출력하고 source/sink를 구별하는 프로그램을 만
든다.
Ⅱ . 프로젝트 일정
2012. 5. 14 - 조원별 업무 분담 결정
2012. 5. 21 - 알고리즘에 대해 토론하고 코딩 시작
Ⅱ. 조원 업무 분담
사전 조사 팀 – 서상현, 변세현
프로그래밍 팀 – 조경상, 강승우
보고서 작성 - 김남희
Ⅲ. 연구 과정
2012. 5. 14 - 과제를 파악하고 조원별 업무 분담 결정.
- 과제에 대한 간단한 토론, 자료조사 및 알고리즘 구상
3. 2012. 5. 21 알고리즘을 바탕으로 코딩 시작
- 이번 과제에 사용되는 원리 이해, 원리를 바탕으로 한 알고리즘 구현 및
코딩 시작
-완성된 프로그램 소스
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
char ch;
char indegree;
char outdegree;
}adjacent;
adjacent matrix[101]; //각 점마다의 구조체 배열 선언, 최대 점의 개수는
100개로 제한
//마지막 101구조체는 정렬시 임시 저장소로 쓰임
void insert(char *s1, int *count);
void sort(int *count); //구조체 정렬 함수
void swap(int i, int min); //구조체 정렬시 스왑해주는 함수
int main(void){
int n, count = 0;//count변수는 문자 갯수에 대한 구조체의 카운트
char *str;
char *p;
int i;
printf("입력 받을 점의 갯수를 입력하시오.n");
scanf("%d", &n);
4. str = (char *) malloc(sizeof(char)*n); //문자열을 저장할 공간을 동적으로
할당
fflush(stdin); //버퍼에 엔터값을 지워준다.
printf("경로를 입력하시오.(단, 각 경로의 구분은 공백과 ,만 허용)n");
gets(str);
p = strtok(str, ", "); //토큰 함수로 문자를 걸러내서
if(p) insert(p, &count); //구조체에 전달
while(p!=NULL)
{
p =strtok(NULL, ", ");
if(p) insert(p, &count);
}
if(n>100 || count>n) //처음 입력이 구조체 배열선언을 초과하거나 문자 입
력을 예정 입력 갯수 초과시 프로그램 종료
{
printf("입력 범위가 초과하였으므로 프로그램을 종료합니다.n");
exit(1);
}
sort(&count);
for(i=0; i<count; i++)//결과를 출력한다.
{
printf("%c %d %d", matrix[i].ch, matrix[i].indegree, matrix[i].outdegree);
if(matrix[i].indegree == 0)
printf(" sourcen");
else if(matrix[i].outdegree == 0)
printf(" sinkn");
else
5. printf("n");
}
return 0;
}
void insert(char *s1, int *count)
{
int k=0;
if(strlen(s1)!=2 || *s1==*(s1+1)) //입력이 올바르지 않으면 종료
{
printf("입력이 올바르지 않으므로 프로그램을 종료합니다.n");
exit(1);
}
if(*count == 0) //입력이 올바를시 첫번째 구조체 정의
{
matrix[0].ch = s1[0];
matrix[0].indegree = 0;
matrix[0].outdegree = 1;
matrix[1].ch = s1[1];
matrix[1].indegree = 1;
matrix[1].outdegree = 0;
*count = *count+2;
}
else
{
for(k=0; k<(*count); k++) //첫번째 항에 대한 문자를 구조체에 입력,
outdegree증가
{
if(matrix[k].ch == s1[0])
7. }
void sort(int *count)
{
int i, j, min;
for(i=0; i<*count; i++)
{
min = i;
for(j=i+1; j<*count; j++)
{
if(matrix[j].ch < matrix[min].ch)
min = j;
swap(i, min);
}
}
}
void swap(int i, int min)
{
matrix[101] = matrix[i];
matrix[i] = matrix[min];
matrix[min] = matrix[101];
}
8. Ⅳ. 결과 분석 및 느낀 점
이번 과제는 이전의 과제들과 비교했을 때 조금은 수월하게 할 수 있
었다고 생각된다. 과제가 비교적 쉬운 관계로 코딩에 치중하여 함께
고민하고 토론하는 시간은 상대적으로 짧아져 아쉬움이 남는다.
하지만 그에 반해 원리나 사전 조사에 더 많은 시간동안 공부할 수
있었다. 이 팀원들로 3번째 과제를 수행하고 있어서 서로에 대해 알고
있는 점이 많아 부족한 면을 서로 보완해 가면서 역할분담이 잘 이루
어 졌다.