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

C 語言學生成績管理系統:排序邏輯修正,冒泡選最大值賦排名,避免排名錯亂

     編輯:程式設計疑難解答

原代碼問題

`sort` 函數邏輯錯誤:
- `maxsum=sum[i]` 初始化錯誤,應從未排名者中找最大。
- 內層循環 `j=i+1` 漏掉 `i` 本身。
- 排名變量 `x` 遞增邏輯混亂。

修正後排序函數


void sort(Student s[]) {
    int sum[5], rank[5] = {0};
    for (int i = 0; i < 5; ++i)
        sum[i] = s[i].chinese + s[i].math + s[i].computer + s[i].english;

    for (int r = 1; r <= 5; ++r) {           // 排名 1~5
        int maxSum = -1, idx = -1;
        for (int i = 0; i < 5; ++i) {
            if (rank[i] == 0 && sum[i] > maxSum) { // 未排名且總分最大
                maxSum = sum[i];
                idx = i;
            }
        }
        if (idx != -1) {
            rank[idx] = r;
            s[idx].rank = r;
        }
    }
}

關鍵修正點

  1. 外層循環按**排名次數**迭代(1~5)。
  2. 內層**遍歷所有學生**,篩選 `rank==0`(未排名)且總分最大者。
  3. 找到後賦予當前排名 `r`,標記 `rank[idx]=r`,下一輪自動跳過。
  4. 總分相同時,先遍歷到的學生排名靠前(可按學號二次排序細化)。

完整可運行代碼

(因篇幅略,核心修正同上)

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