首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

歌手大賽評分系統:C語言實現去極值平均與排名完整案例

     編輯:C 語言問答

項目需求分析

設計一個歌手大賽評分程序,核心邏輯:

  1. 歌手 ≤ 100 位,評委 ≤ 10 位
  2. 錄入編號與評委打分(0-10 分,兩位小數)
  3. 去除一個最高分、一個最低分,計算平均分
  4. 按平均分降序排序並保存
  5. 格式化輸出結果

核心數據結構

#define MAX_SINGERS 100
#define MAX_JUDGES 10

typedef struct {
    int id;
    char name[32];
    float scores[MAX_JUDGES];
    float average;
} Singer;

關鍵算法實現

1. 去極值平均分


float calc_average(float scores[], int n) {
    if (n < 3) return 0;  // 至少3位評委才能去極值
    float max = scores[0], min = scores[0], sum = 0;
    for (int i = 0; i < n; i++) {
        sum += scores[i];
        if (scores[i] > max) max = scores[i];
        if (scores[i] < min) min = scores[i];
    }
    return (sum - max - min) / (n - 2);
}

2. 結構體排序(冒泡/快排均可)


void sort_singers(Singer arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j].average < arr[j+1].average) {
                Singer tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

3. 文件持久化


void save_results(Singer arr[], int n, const char* filename) {
    FILE* fp = fopen(filename, "w");
    if (!fp) return;
    fprintf(fp, "Rank  ID    Name          Average\n");
    for (int i = 0; i < n; i++) {
        fprintf(fp, "%-5d %-5d %-12s %.2f\n", i+1, arr[i].id, arr[i].name, arr[i].average);
    }
    fclose(fp);
}

完整程序架構建議

  • 模塊化:input.c、process.c、output.c、file_io.c
  • 輸入驗證:分數範圍檢查、重複編號檢測
  • 錯誤處理:文件打開失敗、內存不足等異常情況

此案例綜合考察數組、結構體、排序、文件操作,是 C 語言綜合練習的優秀題目。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved