Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 구조체를 활용해 크리켓 선수 정보를 평균 득점순으로 정렬된 표 형태로 저장하는 프로그램

문제 개요

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() 등으로 대체하는 것이 좋습니다.