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

C語言實戰:結構體數組排序並寫入文件完整代碼

     編輯:C 語言問答

題目要求回顧

已有 N 名學生的學號、成績存於結構體數組 s 中,需編寫函數 fun:

  1. 按成績降序排列學生記錄(高分在前)。
  2. 將排序後的數據存入文件。

核心思路

  1. 定義學生結構體,包含學號 nNum 和成績 nScore。
  2. 使用標準庫 qsort 進行高效排序,需編寫比較函數 cmp 實現降序。
  3. 打開文件(如 d:\\myfile.txt),遍歷排序後數組,格式化寫入。
  4. 注意動態內存分配與釋放(若數組大小不固定)。

完整可運行代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct stu {
    int nNum;    // 學號
    int nScore;  // 成績
} STU;

// qsort 比較函數:按成績降序
int cmp(const void *a, const void *b) {
    return (*(STU*)b).nScore - (*(STU*)a).nScore;
}

// 核心功能函數
void fun(STU *s, int n) {
    // 1. 排序
    qsort(s, n, sizeof(STU), cmp);

    // 2. 寫入文件
    FILE *fp = fopen("d:\\myfile.txt", "w");
    if (fp == NULL) {
        perror("文件打開失敗");
        return;
    }
    for (int i = 0; i < n; i++) {
        fprintf(fp, "%d %d\n", s[i].nNum, s[i].nScore);
    }
    fclose(fp);
    printf("數據已成功寫入文件。\n");
}

// 主函數測試
int main() {
    int n;
    printf("請輸入學生人數: ");
    scanf("%d", &n);

    STU *s = (STU*)malloc(n * sizeof(STU));
    if (s == NULL) {
        printf("內存分配失敗\n");
        return 1;
    }

    printf("請輸入 %d 名學生的學號和成績 (格式: 學號 成績):\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &s[i].nNum, &s[i].nScore);
    }

    fun(s, n);

    // 驗證輸出
    printf("\n排序後結果:\n學號 成績\n");
    for (int i = 0; i < n; i++) {
        printf("%d %d\n", s[i].nNum, s[i].nScore);
    }

    free(s);
    return 0;
}

關鍵點解析

1. 比較函數 cmp

  • 參數為 const void*,需強轉為 STU* 訪問成員。
  • 返回 b - a 實現降序(大分在前),升序則為 a - b。
  • 避免溢出:若分數範圍極大,建議用條件判斷 (b>a)-(b<a) 代替減法。

2. 文件操作

  • 使用 "w" 模式覆蓋寫入,確保文件內容即為最新排序結果。
  • fprintf 格式化輸出,每行一條記錄,便於後續讀取解析。
  • 務必檢查 fopen 返回值,失敗時釋放資源並報錯。

3. 內存管理

  • 主函數中用 malloc 動態分配結構體數組,靈活適應任意 N。
  • 程序結束前 free(s) 釋放堆內存,防止洩漏。

常見錯誤與改進

錯誤現象原因修正
排序結果錯誤比較函數邏輯反、強轉類型錯誤仔細核對 cmp 返回值邏輯與強轉語法
文件為空/亂碼文件路徑轉義錯誤(雙反斜杠)、fprintf 格式串不匹配Windows路徑用 \\ 或正斜杠 /;檢查格式串
程序崩潰未檢查 malloc/fopen 返回值、數組越界添加錯誤判斷,邊界檢查

擴展建議

  • 支持按學號、姓名等多字段排序(修改 cmp 或增加參數)。
  • 使用鏈表替代數組,練習動態數據結構操作。
  • 添加文件讀取功能,實現數據持久化完整閉環。
  • 嘗試用冒泡/選擇/歸併排序替換 qsort,理解算法內部機制。

總結

本題考察結構體數組操作、標準庫排序、文件讀寫、動態內存綜合應用。掌握 qsort + 比較函數模式是C語言排序的標準做法;文件操作要養成「檢查指針、格式化輸出、及時關閉」的好習慣。代碼結構清晰、錯誤處理完善,即為優秀解答。

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