문제 개요
C 프로그래밍 언어에서 구조체(structure)를 사용하여 크리켓 선수의 데이터를 평균 득점을 기준으로 정렬한 뒤 표 형태로 저장하고 출력하는 방법을 알아보겠습니다.
해결 방법
먼저 이름, 나이, 경기 수, 평균 득점과 같은 크리켓 선수 정보를 입력받습니다. 구조체 개념을 활용하면 프로그램 실행 중 콘솔을 통해 이러한 정보를 손쉽게 입력할 수 있습니다.
입력이 완료되면 각 선수의 평균 득점을 기준으로 오름차순 정렬하여 표 형태로 출력합니다. 이렇게 하면 여러 선수의 세부 정보를 한눈에 명확하게 파악할 수 있습니다.
정렬 로직
평균 득점을 기준으로 선수들을 오름차순으로 정렬하는 데 사용한 핵심 로직은 다음과 같습니다.
for(i=0;i<2;i++){
for(j=i+1;j<2;j++){
if(c[i].avrn > c[j].avrn){
temp1=c[i];
c[i]=c[j];
c[j]=temp1;
}
}
}이중 반복문을 이용해 서로 다른 두 선수의 평균 득점을 비교하고, 앞쪽 선수의 평균이 더 크면 구조체 전체를 임시 변수(temp1)에 담아 서로 교환합니다. 이 과정을 반복하면 배열이 평균 득점이 낮은 순서부터 자연스럽게 정렬됩니다.
전체 프로그램 코드
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct cricketer{
char name[50];
int age;
int match;
float avrn;
char temp;
};
struct cricketer c[20],temp1;
void main() {
int i,j;
for(i=0;i<2;i++){
printf("Enter data of cricketer %d\n",i+1);
//fflush(stdin);
printf("Name: ");
gets(c[i].name);
printf("\nAge: ");
scanf("%d",&c[i].age);
printf("\nMatches: ");
scanf("%d",&c[i].match);
printf("\n\nAverage runs: ");
scanf("%f",&c[i].avrn);
scanf("%c",&c[i].temp);
}
/******************/
/* sorting records */
/*******************/
for(i=0;i<2;i++) {
for(j=i+1;j<2;j++) {
if(c[i].avrn > c[j].avrn){
temp1=c[i];
c[i]=c[j];
c[j]=temp1;
}
}
}
printf("Sorted records:\n");
for(i=0;i<2;i++){
printf("%d\t%s\t%d\t%d\t%f\n\n\n",i+1,c[i].name,c[i].age,c[i].match,c[i].avrn);
}
getch();
}
코드 설명
- struct cricketer : 선수의 이름(name), 나이(age), 경기 수(match), 평균 득점(avrn)을 하나로 묶은 구조체입니다.
- c[20] : 최대 20명의 선수 정보를 저장할 수 있는 구조체 배열입니다.
- scanf(%c, &c[i].temp) : 숫자 입력 후 입력 버퍼에 남아 있는 개행 문자(\n)를 제거하여 다음 입력이 정상적으로 처리되도록 돕는 역할을 합니다.
- 정렬 부분 : 이중 반복문으로 인접 선수들의 평균 득점을 비교하며 오름차순으로 정렬합니다.
실행 결과
Enter data of cricketer 1
Name: Dhoni
Age: 39
Matches: 150
Average runs: 200
Enter data of cricketer 2
Name: virat
Age: 36
Matches: 135
Average runs: 190
Sorted records:
1 virat 36 135 190.000000
2 Dhoni 39 150 200.000000
실행 결과를 보면 평균 득점이 190점인 virat이 먼저, 200점인 Dhoni가 나중에 출력되어 평균 득점 기준 오름차순으로 정렬된 것을 확인할 수 있습니다.
참고: 최신 C 표준에서의 개선 사항
위 코드는 학습용 예제이며, 실제 개발 환경에서는 다음 사항을 고려하는 것이 좋습니다.
- gets() 함수는 버퍼 오버플로우 위험이 있어 C11 표준에서 제거되었습니다. 대신 fgets()를 사용하는 것이 안전합니다.
- void main()보다는 반환값을 명확히 지정하는 int main()을 사용하는 것이 표준에 부합합니다.
- conio.h 헤더와 getch() 함수는 표준이 아니므로, 이식성이 필요하다면 getchar() 등으로 대체하는 것이 좋습니다.