상세 컨텐츠

본문 제목

C 언어 예제, 줄 세우기 & 순위매기기 -2. 동점자 처리

컴퓨터 관련/C 언어 예제

by 열정과 함께 2013. 9. 1. 02:14

본문

수정해서 넣겠다고 해 놓고 이렇게 글 하나 또 쓰는 이유는 절대로 블로그에 글 하나 더 올리고자 함이 아니다. 코드가 좀 많이 변해서.


각설하고. 목표는 이렇게 만드는 것이다.



코드는 이렇다. 좀 많이 지저분하다. 어쩔 수 없다. for 와 if 만으로 만들었기 때문이다.


#include <stdio.h>

/* 학생들의 성적을 입력하고, 그를 내림차순으로 배열합니다.

목표는, 랭킹과 학생 이름을 같이 표기하는 것이다. 성적은 100점 만점으로 친다.

*/

int main()

{

int i,j,k,m,n,p,q,r,mark[10],rank[10],name[10];

int l=0, o=0;

printf("학생들의 성적을 입력해 주세요. 만점은 100점입니다.\n");

for(i=0;i<10;i++)

{

printf("학생 %d : ", i+1);

scanf("%d", &mark[i]);

name[i] = i+1;

}

for(j=0;j<10;j++) 

{

for(n=0;n<10;n++)

{

if(mark[j] != mark[n])

{

k = 101-mark[j];

rank[k] = 1;

}

if(mark[j] == mark[n])

{

k = 101-mark[j];

rank[k] = 1;

p = mark[j];

if(o ==0)

{

o=o+1;

}

}

}

}

printf("학생들의 석차는 이렇습니다. 단, 동점자는 번호순으로 배열합니다. \n");

for(m=0;m<101;m++)

{

for(q=0;q<10;q++)

{

if(rank[m] != 0)

{

if(101-m == mark[q])

{

if(m!=p)

{

printf("학생 %d : %d 점\n",name[q],101-m);

}

if(m==p)

{

for(r=0;r<10;r++)

{

if(mark[r] == p)

{

printf("학생 %d : %d 점\n",name[r],p);

}

}

}

}

}

}

}

return 0;

}


대충 설명해 보자면 이렇다. 석차를 매기기 위해서는 비교대상이 필요하다. 이전의 글에서는 동점자가 있을 경우 바로 오류가 났다. 비교되는 대상이 집단 내의 다른 학생이었기 때문이다. 즉, 집단 안에 같은 수치를 가진 개체가 있을 경우, 비교를 할 수가 없다. 그래서 이번에는 비교대상을 다르게 잡았다. 즉, 만점을 넘어서는 수치 하나를 비교대상으로 잡으면, 집단 내 다른 개체와 같은 수치를 가져도 그 속성을 정의할 수가 있게 된다.

#include <stdio.h>

/* 학생들의 성적을 입력하고, 그를 내림차순으로 배열합니다.

목표는, 랭킹과 학생 이름을 같이 표기하는 것이다. 성적은 100점 만점으로 친다.

*/

int main()

{

int i,j,k,m,n,p,q,r,mark[10],rank[10],name[10];

int l=0, o=0;

printf("학생들의 성적을 입력해 주세요. 만점은 100점입니다.\n");

for(i=0;i<10;i++)

{

printf("학생 %d : ", i+1);

scanf("%d", &mark[i]);

name[i] = i+1;

}

for(j=0;j<10;j++) 

{

for(n=0;n<10;n++)

{

if(mark[j] != mark[n]) /* 동점자를 처리하기 위해 동점자가 있는 경우와 없는 경우를 나눠야 한다. 그래서 새로운 if 구문이 들어간다.*/

{

k = 101-mark[j]; 

rank[k] = 1; /*바로 이 부분이다. 비교대상이 되는 101. 그리고 rank 배열의 정의법이 바뀐 것을 볼 수 있다. 이전 글에서는 바로바로 rank 를 넣었다면, 여기서는 다르다. 비교점인 101 에 비해 떨어져 있는 거리가 곧 순위가 된다. 즉, 이러한 속성을 활용하여 rank 배열을 설정하면 좀 더 편리하게 순위를 잡는데 참고할 수 있는 수치를 둘 수 있다. 또한, 점수가 들어있지 않은 ,rank 배열의 개체는 자동으로 0 이 되므로 다른 데다 신경쓸 필요도 없다.*/

}

if(mark[j] == mark[n])

{

k = 101-mark[j];

rank[k] = 1;

p = mark[j];

if(o ==0)

{

o=o+1;

} /*변수 o 는 아래에 공동 순위자의 수를 표시하기 위해서 넣었는데..... 무슨 이유인지 중간에 잘 작동하지 않았다. 쩝.... 어쩔 수 없지. 시도할 수 있는 분은 시도해 보시길.....*/

}

}

}

printf("학생들의 석차는 이렇습니다. 단, 동점자는 번호순으로 배열합니다. \n");

for(m=0;m<101;m++)

{

for(q=0;q<10;q++)

{

if(rank[m] != 0)

{

if(101-m == mark[q])

{

if(m!=p)

{

printf("학생 %d : %d 점\n",name[q],101-m);

}

if(m==p)

{

for(r=0;r<10;r++)

{

if(mark[r] == p)

{

printf("학생 %d : %d 점\n",name[r],p);

}

}

}

}

}

}

}

/*이전 글과 마찬가지로, rank 배열을 순서대로 쭉 나열해서 쓰면 그것이 곧 순위가 된다. 다만 동점자가 있는 상황을 대비해 조금 복잡해졌을 뿐이다. 개념적으로 달라진 부분은 없다.*/

return 0;

}

관련글 더보기

댓글 영역