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

C語言實現英文詞頻統計:從文件讀取到快速排序完整實戰

     編輯:關於C語言

C語言實現英文詞頻統計:從文件讀取到快速排序完整實戰

本文記錄一個純 C 語言實現的詞頻統計小專案:讀取英文文本文件,忽略標點符號,統計單詞出現次數,並按頻率降序輸出。涵蓋動態內存管理、文件 I/O、字符解析、結構體設計、快速排序等核心技術點。

專案需求

  1. 統計指定英文文本的單詞頻率;
  2. 標點符號不計入統計;
  3. 結果按出現次數從大到小排序輸出。

整體設計

  • 數據結構:結構體 FreWord 包含單詞(char word[18])與頻率(int count);
  • 動態內存:初始分配 100 個結構體,滿時以 realloc 每次擴容 100 個;
  • 文件讀取:fopen + fgetc 逐字符處理;
  • 單詞識別:利用 ASCII 碼判斷字母(A-Z, a-z),非字母作為分隔符;
  • 去重計數:新單詞與已有列表 stricmp 比對,存在則計數+1;
  • 排序輸出:快速排序(按 count 降序),最後遍歷輸出。

核心代碼片段

1. 結構體與內存管理

typedef struct {
    int count;
    char word[18];
} FreWord;

FreWord *words = malloc(100 * sizeof(FreWord));
int capacity = 100, size = 0;

// 擴容邏輯
if (size == capacity) {
    capacity += 100;
    words = realloc(words, capacity * sizeof(FreWord));
    // 初始化新空間
    for (int i = size; i < capacity; i++) words[i].count = 1;
}

2. 文件讀取與單詞解析

FILE *fp = fopen(filename, "r");
int ch, i = 0, j = 0, flag = 0;  // flag: 0=在單詞中, 1=在分隔符中

while ((ch = fgetc(fp)) != EOF) {
    if (isalpha(ch)) {                 // 字母
        words[i].word[j++] = ch;
        flag = 0;
    } else if (flag == 0) {            // 單詞結束
        words[i].word[j] = '\0';
        // 去重查找
        for (int k = 0; k < i; k++) {
            if (strcasecmp(words[k].word, words[i].word) == 0) {
                words[k].count++;
                i--; j = 0; flag = 1;
                goto NEXT_CHAR;
            }
        }
        i++; j = 0; flag = 1;          // 新單詞
    }
    NEXT_CHAR: ;
}
fclose(fp);

3. 快速排序(降序)

void quick_sort(FreWord *arr, int left, int right) {
    if (left >= right) return;
    int i = left, j = right;
    int pivot = arr[(left + right) / 2].count;
    FreWord tmp;

    while (i <= j) {
        while (arr[i].count > pivot) i++;
        while (arr[j].count < pivot) j--;
        if (i <= j) {
            tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
            i++; j--;
        }
    }
    if (left < j) quick_sort(arr, left, j);
    if (i < right) quick_sort(arr, i, right);
}

4. 結果輸出

quick_sort(words, 0, size - 1);
for (int i = 0; i < size; i++) {
    printf("%-18s %d\n", words[i].word, words[i].count);
}

測試與驗證

使用奧巴馬就職演講稿(約 2000 詞)測試:

  • 正確識別單詞,忽略標點與大小寫;
  • 動態擴容無內存洩漏;
  • 快速排序 O(n log n) 效能優異;
  • 輸出格式整齊,高頻詞(the, and, to, of, a...)排在前列。

優化方向

  1. 改用 **Trie 樹/哈希表** 替代線性查找,將去重從 O(n) 降至 O(1);
  2. 支援 UTF-8 多字節字符(當前僅處理 ASCII);
  3. 增加命令行參數解析(getopt),支援多文件、輸出前 N 詞等選項;
  4. 單詞長度動態分配,移除 18 字節硬編碼限制。

這個專案雖小,卻串聯了 C 語言「指針、內存、文件、排序、字符串」五大核心能力,是從語法入門進入工程實踐的優秀練習。

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