상세 컨텐츠

본문 제목

C 언어 예제, 줄 세우기 & 순위 매기기 - 1

컴퓨터 관련/C 언어 예제

by 열정과 함께 2013. 8. 30. 05:34

본문

목표는 이렇게 만드는 것이다.



단, 동점자가 있을 경우 처리할 수 없다 -_-......

나중에 수정해서 다시 넣어야지.

코드는 이렇다.


#include <stdio.h>

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

목표는, 랭킹과 학생 이름을 같이 표기하는 것이다.

*/

int main()

{

int i,j,k,m,n,mark[10],rank[10],name[10];//마크1 = 네임1

int l=0;

printf("학생들의 성적을 입력해 주세요 \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(k=0;k<10;k++)

{

if(mark[j]-mark[k]<0)

{

l = l+1;

}

}

rank[l]=mark[j];

l=0;

}

printf("학생들의 석차는 다음과 같습니다. \n");

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

{

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

{

if(mark[n] == rank[m])

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

}

}


return 0;

}


설명하면 대략 이렇다.


일단 대략적인 개념을 두고 들어간다. 세 가지의 배열을 사용하겠다. 첫 배열은 학생들의 점수가 입력한 순서대로 들어가 있는 배열(mark 배열), 둘째 배열은 학생들의 점수가 석차 순위대로 입력된 배열(rank 배열), 셋째 배열은 학생들의 출석번호 배열이다(name 배열).

#include <stdio.h>

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

목표는, 랭킹과 학생 이름을 같이 표기하는 것이다.

*/

int main()

{

int i,j,k,m,n,mark[10],rank[10],name[10];//마크1 = 네임1

int l=0;

printf("학생들의 성적을 입력해 주세요 \n");

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

{

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

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

여기까지 넣으면, 학생 1 은 mark[1] 에 해당되게 된다. 그러나 여기서는 아직 학생들의 출석번호 배열은 정해지지 않은 상태이다. 이를테면 학생 1 은 위의 scanf 자리에 학생 1 을 입력했기 때문에 단순히 학생 1 이 된 것 뿐이다. mark 배열과는 아무런 연관성이 없게 된다.

name[i] = i+1;

}

여기서 name 배열을 넣어줌으로써, name 배열과 mark 배열의 연관성을 부여할 수 있다. 연관성을 부여해 주는 이유는 이후에 학생들의 순위 매기기에 필요하기 때문이다.

for(j=0;j<10;j++) //음수 한개면 1번 부여하면 됨.

{

for(k=0;k<10;k++)//k 는 비교하기 위해 모조리 빼보는 것이다.

{

if(mark[j]-mark[k]<0)

{

l = l+1;

}

}

rank[l]=mark[j];

l=0;

}

1등의 점수를 생각해보자. 남은 9명은 1등보다 점수가 낮다. 그렇다면, 1등에서 1등 자신을 포함한 10명의 점수를 다 빼보자. 그럼 그 중 가장 작은 수는 0 이고, 나머지는 전부 양수가 아니겠는가? 그렇다면 위에서 1등의 mark 배열이 들어갔을 때, l 값은 처음에 정의된 0 값이 유지될 것이다. 그러면 이제 rank[l] 에 해당 mark 배열의 원소를 넣어주면 된다. 마찬가지로, 이후로 쭉, rank 배열의 원소 배열 순서는 곧 성적순이 되는 것이다. 

printf("학생들의 석차는 다음과 같습니다. \n");

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

{

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

{

if(mark[n] == rank[m])

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

}

}

m 변수는 rank 배열을 1번부터 10번 까지 배열하기 위해 만들었다. 따라서 큰 for 문의 목적은, rank 값을 순서대로 기입하는 것이다. 아니 그렇다면, 석차에 따른 학생의 번호는 어떻게 입력할 것인가? 여기서에 아까 name 배열을 넣어준 이유가 있다. 


m 이 0 이고, n 이 0 인 때를 생각해보자. 지금 출력될 점수는 석차 1등의 점수이다. 그리고 그 석차에 해당하는 학생의 번호 또한 출력되어야 한다. 여기서 우선하는 기준은 rank 이다. 그렇다면, rank 배열에 해당하는 점수와, 학생의 출석번호 사이에 연관성이 있어야 rank 배열의 원소 값을 보고 해당 학생의 출석번호를 찾을 수 있게 된다. mark[5] 에 해당하는 학생이 석차 1등이라고 해보자. 그렇다면, n = 0 일 때, mark[1] 은 1등이 아니므로, rank[1] 과 같지 않다. 즉, 계속해서 올려서 mark[5] 에 도달할 때 rank[1] 과 같아지는 것이다. 그리고 그 때 학생의 출석번호는 ? 바로 5 값이다. 여기서 이 5 값을 넣기 위해 name 배열이 필요해지는 것이다.


return 0;

}

관련글 더보기

댓글 영역