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

C語言結構體陣列排序與統計:冒泡排序、表格輸出、欄位平均完整實作

     編輯:關於C語言

承接上篇:結構體陣列學生成績系統核心模組詳細實作

第四步:依平均分冒泡排序


void order(struct stu arr[], int n) {
    struct stu temp;
    int i, j;
    for (i = 0; i < n - 1; i++)
        for (j = 0; j < n - 1 - i; j++)
            if (arr[j].score[3] > arr[j+1].score[3]) {  // 比較平均分
                temp = arr[j];       // 結構體整體指派
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
}

演算法:標準冒泡排序,外層控制輪數,內層相鄰比較交換,大值沉底。
比較鍵:score[3](平均分)。
交換單位:整個結構體(姓名、學號、三科分、平均分一次交換)。

第五步:表格化輸出完整資料


void output(struct stu arr[], int n) {
    int i, j;
    printf("********************TABLE********************\n");
    printf("------------------------------------------------\n");
    printf("| %10s | %8s | %7s | %7s | %7s | %7s |\n",
           "Name", "Number", "English", "Math", "Physics", "Average");
    printf("------------------------------------------------\n");
    for (i = 0; i < n; i++) {
        printf("| %10s | %8ld |", arr[i].name, arr[i].number);
        for (j = 0; j < 4; j++)
            printf(" %7.2f |", arr[i].score[j]);
        printf("\n------------------------------------------------\n");
    }
}

格式控制:

  • %10s:姓名寬度 10 右對齊
  • %8ld:學號寬度 8
  • %7.2f:分數寬度 7、小數 2 位
  • 分隔符 |、橫線構建表格視覺

第六步:計算並輸出各科平均與總平均


void out_row(struct stu arr[], int n) {
    float row[4] = {0};
    int i, j;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < n; j++)
            row[i] += arr[j].score[i];
        row[i] /= n;
    }
    printf("|%19c|", ' ');
    for (i = 0; i < 4; i++)
        printf(" %7.2f |", row[i]);
    printf("\n------------------------------------------------\n");
}

統計邏輯:

  • row[0]:英文平均 = Σ英文分 / n
  • row[1]:數學平均
  • row[2]:物理平均
  • row[3]:總平均 = Σ各生平均 / n(等價於三科平均之平均)

輸出時首欄留空 %19c 對齊表格。

第七步:主程式整合與完整清單


#include 
#include 

struct stu {
    char name[20];
    long number;
    float score[4];
};

void input(struct stu[], int);
void aver(struct stu[], int);
void order(struct stu[], int);
void output(struct stu[], int);
void out_row(struct stu[], int);

main() {
    struct stu stud[4];
    input(stud, 4);
    aver(stud, 4);
    order(stud, 4);
    output(stud, 4);
    out_row(stud, 4);
}

輸入函數 input() 完整修正版


void input(struct stu arr[], int n) {
    int i, j;
    char temp[30];
    for (i = 0; i < n; i++) {
        printf("\nInput Name,Number,English,Math,Physics\n");
        gets(arr[i].name);
        gets(temp);
        arr[i].number = atol(temp);
        for (j = 0; j < 3; j++) {
            gets(temp);
            arr[i].score[j] = atof(temp);
        }
    }
}

平均計算 aver() 完整版


void aver(struct stu arr[], int n) {
    int i, j;
    for (i = 0; i < n; i++) {
        arr[i].score[3] = 0;
        for (j = 0; j < 3; j++)
            arr[i].score[3] += arr[i].score[j];
        arr[i].score[3] /= 3;
    }
}

關鍵技術重點回顧

技術點說明程式碼位置
結構體陣列宣告struct stu stud[4]main()
平均分內嵌結構體score[3] 存平均,便於排序比較struct 定義 + aver()
字串輸入轉型gets + atol/atof 處理異質成員input()
結構體整體指派temp = arr[j] 交換所有成員order()
陣列參數退化為指標形參 struct stu arr[] 不需指定大小所有函數參數
雙重迴圈冒泡排序O(n²) 簡單穩定,適合小資料量order()
欄位統計轉置思維row[i] = Σarr[j].score[i] / nout_row()
格式化表格輸出printf 寬度精度控制對齊output(), out_row()

常見錯誤與修正

  1. 迴圈邊界錯誤:for(i=0;i → I 應為 i(大小寫)
  2. 輸入迴圈變數衝突:input() 中外層 i、內層 j,避免重用 i
  3. 缺少標頭檔:atol/atof 需 #include
  4. 結構體整體 I/O 誤區:不可 scanf("%s", arr) 或 printf("%s", arr),必須逐成員
  5. 排序比較欄位錯誤:必須比較 score[3](平均),而非單科分數

擴展建議

  • 改用 qsort() 庫函數排序(需撰寫比較函數)
  • 動態分配學生數量(malloc + realloc)
  • 檔案儲存/讀取(fwrite/fread 二進位或 fprintf/fscanf 文字)
  • 新增查詢、修改、刪除、排名等功能
  • 使用連結清單取代陣列支援高效插入刪除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved