欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用C語言實(shí)現(xiàn)單詞文本計(jì)數(shù)

 更新時(shí)間:2024年11月25日 11:47:21   作者:0X78  
這篇文章主要為大家詳細(xì)介紹了如何編寫一個(gè)C語言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

題目描述

任務(wù)目標(biāo):

編寫一個(gè)C語言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù)(忽略大小寫和標(biāo)點(diǎn)符號),并將統(tǒng)計(jì)結(jié)果按單詞出現(xiàn)次數(shù)從高到低排序后輸出到另一個(gè)文件中。

輸入:

源文件路徑:"input.txt",該文件包含一些文本內(nèi)容,單詞之間由空格、標(biāo)點(diǎn)符號等分隔。

輸出:

輸出文件路徑:"output.txt",用于存儲排序后的單詞統(tǒng)計(jì)結(jié)果。

輸出格式:每行包含一個(gè)單詞及其出現(xiàn)次數(shù),按出現(xiàn)次數(shù)從高到低排序。例如:

the: 5
is: 3
a: 2
quick: 1
brown: 1
fox: 1
jumps: 1
over: 1
lazy: 1
dog: 1

(注意:這里的輸出是示例,實(shí)際輸出將取決于input.txt的內(nèi)容)

具體要求:

讀取input.txt文件的內(nèi)容。

提取文件中的單詞,忽略標(biāo)點(diǎn)符號和大小寫。

統(tǒng)計(jì)每個(gè)單詞出現(xiàn)的次數(shù)。

將統(tǒng)計(jì)結(jié)果按單詞出現(xiàn)次數(shù)從高到低排序。

將排序后的結(jié)果寫入output.txt文件。

注意事項(xiàng):

單詞之間的分隔符包括但不限于空格、逗號、句號、問號、感嘆號等常見標(biāo)點(diǎn)符號。

忽略標(biāo)點(diǎn)符號和大小寫進(jìn)行單詞統(tǒng)計(jì)。

輸出文件中的單詞及其出現(xiàn)次數(shù)應(yīng)嚴(yán)格按照從高到低的順序排列。

如果兩個(gè)單詞出現(xiàn)次數(shù)相同,它們在輸出文件中的順序可以是任意的。

示例:

假設(shè)input.txt文件內(nèi)容如下:

The quick brown fox jumps over the lazy dog. The dog is a quick brown fox.

則output.txt文件內(nèi)容應(yīng)為:

the : 3
quick : 2
dog : 2
brown : 1
fox : 1
jumps : 1
over : 1
lazy : 1
is : 1
a : 1
animal : 1

實(shí)現(xiàn)提示:

可以使用C語言標(biāo)準(zhǔn)庫中的文件操作函數(shù)(如fopen, fread, fclose等)來讀取和寫入文件。

使用字符串處理函數(shù)(如strtok, tolower, strcmp等)來處理文本內(nèi)容。

使用數(shù)據(jù)結(jié)構(gòu)(如哈希表或結(jié)構(gòu)體數(shù)組)來存儲單詞及其出現(xiàn)次數(shù)。

使用排序算法(如快速排序或歸并排序)對統(tǒng)計(jì)結(jié)果進(jìn)行排序。

題目來源:

由文心一言生成后修改而來。

思路及部分代碼

1. 獲取文本中所有單詞

#define C_MAX 20            // 單詞的最大長度
#define SNUM_MAX 200        // 單詞的最大數(shù)量(雖然這個(gè)宏在代碼中未使用)
 
// 從文本文件中獲取單詞,并存儲在二維字符數(shù)組中。
int Input_txt(char Str[][C_MAX]) {
    FILE* fp = fopen("input.txt", "r"); // 以只讀模式打開文件 "input.txt"
    if (fp == NULL) {
        printf("open input.txt error\n"); // 如果文件打開失敗,輸出錯(cuò)誤信息
        exit(1); // 并退出程序
    }
    
    int cnt = 0; // 單詞計(jì)數(shù)器,記錄已讀取的單詞數(shù)量
    char S[C_MAX]; // 用于臨時(shí)存儲從文件中讀取的字符,直到遇到一個(gè)非字母字符為止
    int Si = 0; // S 數(shù)組的索引,用于記錄當(dāng)前正在處理的字符位置
    
    // 循環(huán)讀取文件中的字符,直到到達(dá)文件末尾
    while (!feof(fp)) {
        S[Si] = fgetc(fp); // 從文件中讀取一個(gè)字符,并存儲到 S 數(shù)組的當(dāng)前位置
        
        // 如果字符是字母(大小寫均可),則進(jìn)行小寫轉(zhuǎn)換(如果必要)
        if ((S[Si] >= 'a' && S[Si] <= 'z') || (S[Si] >= 'A' && S[Si] <= 'Z')) {
            // 如果字符是大寫字母,則轉(zhuǎn)換為小寫字母
            if ((S[Si] >= 'A' && S[Si] <= 'Z')) S[Si] = S[Si] + 'a' - 'A';
            Si++; // 索引遞增,準(zhǔn)備存儲下一個(gè)字符
        }
        else {
            // 如果字符不是字母,則將 S 數(shù)組當(dāng)前位置之前的字符串視為一個(gè)單詞
            S[Si] = '\0'; // 在當(dāng)前位置插入字符串結(jié)束符,以標(biāo)記單詞的結(jié)束
            
            // 如果 S 數(shù)組的第一個(gè)字符不是字符串結(jié)束符(即已讀取到至少一個(gè)字母),則將單詞復(fù)制到 Str 數(shù)組中
            if (S[0] != '\0') {
                strcpy(Str[cnt], S); // 將單詞復(fù)制到 Str 數(shù)組的當(dāng)前位置
                cnt++; // 單詞計(jì)數(shù)器遞增,準(zhǔn)備存儲下一個(gè)單詞
            }
            
            Si = 0; // 重置索引,準(zhǔn)備讀取下一個(gè)單詞
        }
    }
    
    // 循環(huán)結(jié)束后,還需要檢查 S 數(shù)組中是否還有未處理的單詞(因?yàn)檠h(huán)可能會(huì)在文件末尾的非字母字符處結(jié)束)
    S[Si] = '\0'; // 確保 S 數(shù)組以字符串結(jié)束符結(jié)尾
    if (S[0] != '\0') {
        strcpy(Str[cnt], S); // 如果 S 數(shù)組中有未處理的單詞,則將其復(fù)制到 Str 數(shù)組的末尾
        cnt++; // 單詞計(jì)數(shù)器遞增
    }
    
    fclose(fp); // 關(guān)閉文件指針,釋放資源(注意:原代碼中缺少了這一步,建議添加)
    return cnt; // 返回讀取到的單詞數(shù)量
}

2. 調(diào)整單詞集,去除重復(fù)部分并計(jì)數(shù)

// 去除字符串?dāng)?shù)組中的重復(fù)單詞,并統(tǒng)計(jì)每個(gè)單詞的出現(xiàn)次數(shù)。
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int n - 單詞的總數(shù)。
// 返回值:
//   不重復(fù)單詞的總數(shù)。
int Adjust_fdata(char Str[][C_MAX], int StrCnt[], int n) {
    int i = 0, cnt = 0; // i 用于遍歷所有單詞,cnt 用于記錄不重復(fù)單詞的數(shù)量。
 
    // 初始化 StrCnt 數(shù)組,將所有元素設(shè)置為 0。
    for (i = 0; i < n; i++)
        StrCnt[i] = 0;
 
    // 遍歷所有單詞。
    for (i = 0; i < n; i++) {
        int j = 0; // j 用于遍歷當(dāng)前單詞之前的所有單詞。
 
        // 檢查當(dāng)前單詞是否已經(jīng)在之前的單詞中出現(xiàn)過。
        for (j = 0; j < i; j++) {
            if (strcmp(Str[i], Str[j]) == 0) // 如果找到相同的單詞,則跳出內(nèi)層循環(huán)。
                break;
        }
 
        // 根據(jù) j 的值判斷當(dāng)前單詞是否是重復(fù)的。
        if (j < i) {
            // 如果 j < i,說明當(dāng)前單詞在之前的單詞中已經(jīng)出現(xiàn)過,因此是重復(fù)的。
            // 更新該單詞在 StrCnt 數(shù)組中的出現(xiàn)次數(shù)(注意:這里應(yīng)該更新 j 對應(yīng)的 StrCnt[j],而不是 i)。
            StrCnt[j]++;
        } else {
            // 如果 j == i,說明當(dāng)前單詞在之前的單詞中沒有出現(xiàn)過,因此是不重復(fù)的。
            // 將當(dāng)前單詞復(fù)制到 Str 數(shù)組的前 cnt 個(gè)位置(即去除重復(fù)單詞后的位置)。
            strcpy(Str[cnt], Str[i]);
            // 并更新該單詞在 StrCnt 數(shù)組中的出現(xiàn)次數(shù)為 1(之后可能會(huì)遞增)。
            StrCnt[cnt]++;
            // 不重復(fù)單詞數(shù)量加 1。
            cnt++;
        }
    }
 
    // 返回不重復(fù)單詞的總數(shù)。
    return cnt;
}

3. 基于單詞計(jì)數(shù)進(jìn)行排序(此處是冒泡排序,也可采用更高效的排序算法)

// 交換兩個(gè)單詞及其出現(xiàn)次數(shù)
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int a, int b - 要交換的兩個(gè)單詞的索引。
void Swap(char Str[][C_MAX], int StrCnt[], int a, int b) {
    char S[C_MAX]; // 臨時(shí)存儲單詞的字符數(shù)組。
    strcpy(S, Str[a]); // 將索引 a 處的單詞復(fù)制到臨時(shí)數(shù)組 S 中。
    int t = StrCnt[a]; // 臨時(shí)存儲索引 a 處的單詞出現(xiàn)次數(shù)。
 
    // 將索引 b 處的單詞及其出現(xiàn)次數(shù)復(fù)制到索引 a 處。
    StrCnt[a] = StrCnt[b];
    strcpy(Str[a], Str[b]);
 
    // 將臨時(shí)存儲的索引 a 處的單詞及其出現(xiàn)次數(shù)復(fù)制到索引 b 處。
    StrCnt[b] = t;
    strcpy(Str[b], S);
}
 
// 以單詞出現(xiàn)次數(shù)為基礎(chǔ),使用冒泡排序算法對單詞進(jìn)行排序
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int n - 單詞的總數(shù)(注意:這里應(yīng)該是去重后的單詞總數(shù))。
void Order_fdata(char Str[][C_MAX], int StrCnt[], int n) {
    for (int i = 0; i < n - 1; i++) { // 外層循環(huán)控制排序的輪數(shù)。
        int k = 1; // 標(biāo)記本輪排序是否進(jìn)行了交換,如果未進(jìn)行交換則提前結(jié)束排序。
        for (int j = 1; j < n - i; j++) { // 內(nèi)層循環(huán)進(jìn)行相鄰元素的比較和交換。
            if (StrCnt[j - 1] < StrCnt[j]) { // 如果前一個(gè)單詞的出現(xiàn)次數(shù)小于后一個(gè)單詞的出現(xiàn)次數(shù),則交換它們。
                Swap(Str, StrCnt, j - 1, j); // 調(diào)用 Swap 函數(shù)進(jìn)行交換。
                k = 0; // 標(biāo)記本輪排序進(jìn)行了交換。
            }
        }
        if (k == 1) break; // 如果本輪排序未進(jìn)行交換,則說明數(shù)組已經(jīng)有序,提前結(jié)束排序。
    }
    // 注意:這里的冒泡排序?qū)崿F(xiàn)是基本正確的,但通常在實(shí)際應(yīng)用中,可以使用更高效的排序算法(如快速排序、歸并排序等)。
}

4. 將排序后單詞寫入文本

// 將單詞及其出現(xiàn)次數(shù)輸出到文本文件
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int n - 單詞的總數(shù)(注意:這里應(yīng)該是去重后的單詞總數(shù))。
// 返回值:
//   如果文件成功打開并寫入,則返回 true;否則,在文件打開失敗時(shí)退出程序。
bool Output_txt(char Str[][C_MAX], int StrCnt[], int n) {
    FILE* fp = fopen("output.txt", "w"); // 以寫模式打開文件
    if (fp == NULL) {
        // 如果文件打開失敗,則打印錯(cuò)誤信息并退出程序
        perror("Failed to open file"); // 打印具體的錯(cuò)誤信息
        exit(1); // 退出程序,返回狀態(tài)碼 1 表示錯(cuò)誤
    }
 
    // 遍歷單詞數(shù)組,將單詞及其出現(xiàn)次數(shù)寫入文件
    for (int i = 0; i < n; i++) {
        fprintf(fp, "%s : %d\n", Str[i], StrCnt[i]); // 寫入單詞和次數(shù),每個(gè)條目占一行
    }
 
    fclose(fp); // 關(guān)閉文件
 
    // 成功寫入文件,返回 true
    return true;
}

5. 主函數(shù)

int main() {
    int n = 0; // 初始化單詞數(shù)量為0
    char Str[SNUM_MAX][C_MAX]; // 存儲單詞的二維字符數(shù)組
    int StrCnt[SNUM_MAX]; // 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組
 
    // 從文件讀取單詞,并返回讀取到的單詞數(shù)量
    n = Input_txt(Str, n);
    if (n <= 0) {
        // 如果讀取失敗或沒有讀取到單詞,則打印錯(cuò)誤信息并退出
        fprintf(stderr, "Failed to read words from input file or no words found.\n");
        return 1; // 返回非零值表示程序異常退出
    }
    printf("Input success\n"); // 打印成功信息(建議在調(diào)試時(shí)保留,但在最終產(chǎn)品中可能需要移除或替換為日志記錄)
 
    // 調(diào)整數(shù)據(jù),包括去重和計(jì)數(shù)單詞出現(xiàn)次數(shù),返回去重后的單詞數(shù)量
    n = Adjust_fdata(Str, StrCnt, n);
    if (n <= 0) {
        // 如果調(diào)整數(shù)據(jù)失?。ɡ?,輸入數(shù)據(jù)有誤),則打印錯(cuò)誤信息并退出
        fprintf(stderr, "Failed to adjust data.\n");
        return 1; // 返回非零值表示程序異常退出
    }
    printf("Adjust_fdata success\n"); // 打印成功信息
 
    // 根據(jù)單詞出現(xiàn)次數(shù)對單詞進(jìn)行排序
    Order_fdata(Str, StrCnt, n);
    printf("Order_fdata success\n"); // 打印成功信息
 
    // 將單詞及其出現(xiàn)次數(shù)輸出到文件
    Output_txt(Str, StrCnt, n);
    printf("Output_txt success\n"); // 打印成功信息
 
    // 程序正常結(jié)束,返回0表示成功
    return 0;
}

總代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#pragma warning(disable:4996);
 
 
 
// 獲取文本中單詞。
#define C_MAX 20            // 單詞的最大長度
#define SNUM_MAX 200        // 單詞的最大數(shù)量(雖然這個(gè)宏在代碼中未使用)
 
// 從文本文件中獲取單詞,并存儲在二維字符數(shù)組中。
int Input_txt(char Str[][C_MAX]) {
    FILE* fp = fopen("input.txt", "r"); // 以只讀模式打開文件 "input.txt"
    if (fp == NULL) {
        printf("open input.txt error\n"); // 如果文件打開失敗,輸出錯(cuò)誤信息
        exit(1); // 并退出程序
    }
 
    int cnt = 0; // 單詞計(jì)數(shù)器,記錄已讀取的單詞數(shù)量
    char S[C_MAX]; // 用于臨時(shí)存儲從文件中讀取的字符,直到遇到一個(gè)非字母字符為止
    int Si = 0; // S 數(shù)組的索引,用于記錄當(dāng)前正在處理的字符位置
 
    // 循環(huán)讀取文件中的字符,直到到達(dá)文件末尾
    while (!feof(fp)) {
        S[Si] = fgetc(fp); // 從文件中讀取一個(gè)字符,并存儲到 S 數(shù)組的當(dāng)前位置
 
        // 如果字符是字母(大小寫均可),則進(jìn)行小寫轉(zhuǎn)換(如果必要)
        if ((S[Si] >= 'a' && S[Si] <= 'z') || (S[Si] >= 'A' && S[Si] <= 'Z')) {
            // 如果字符是大寫字母,則轉(zhuǎn)換為小寫字母
            if ((S[Si] >= 'A' && S[Si] <= 'Z')) S[Si] = S[Si] + 'a' - 'A';
            Si++; // 索引遞增,準(zhǔn)備存儲下一個(gè)字符
        }
        else {
            // 如果字符不是字母,則將 S 數(shù)組當(dāng)前位置之前的字符串視為一個(gè)單詞
            S[Si] = '\0'; // 在當(dāng)前位置插入字符串結(jié)束符,以標(biāo)記單詞的結(jié)束
 
            // 如果 S 數(shù)組的第一個(gè)字符不是字符串結(jié)束符(即已讀取到至少一個(gè)字母),則將單詞復(fù)制到 Str 數(shù)組中
            if (S[0] != '\0') {
                strcpy(Str[cnt], S); // 將單詞復(fù)制到 Str 數(shù)組的當(dāng)前位置
                cnt++; // 單詞計(jì)數(shù)器遞增,準(zhǔn)備存儲下一個(gè)單詞
            }
 
            Si = 0; // 重置索引,準(zhǔn)備讀取下一個(gè)單詞
        }
    }
 
    // 循環(huán)結(jié)束后,還需要檢查 S 數(shù)組中是否還有未處理的單詞(因?yàn)檠h(huán)可能會(huì)在文件末尾的非字母字符處結(jié)束)
    S[Si] = '\0'; // 確保 S 數(shù)組以字符串結(jié)束符結(jié)尾
    if (S[0] != '\0') {
        strcpy(Str[cnt], S); // 如果 S 數(shù)組中有未處理的單詞,則將其復(fù)制到 Str 數(shù)組的末尾
        cnt++; // 單詞計(jì)數(shù)器遞增
    }
 
    fclose(fp); // 關(guān)閉文件指針,釋放資源
    return cnt; // 返回讀取到的單詞數(shù)量
}
 
// 去除字符串?dāng)?shù)組中的重復(fù)單詞,并統(tǒng)計(jì)每個(gè)單詞的出現(xiàn)次數(shù)。
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int n - 單詞的總數(shù)。
// 返回值:
//   不重復(fù)單詞的總數(shù)。
int Adjust_fdata(char Str[][C_MAX], int StrCnt[], int n) {
    int i = 0, cnt = 0; // i 用于遍歷所有單詞,cnt 用于記錄不重復(fù)單詞的數(shù)量。
 
    // 初始化 StrCnt 數(shù)組,將所有元素設(shè)置為 0。
    for (i = 0; i < n; i++)
        StrCnt[i] = 0;
 
    // 遍歷所有單詞。
    for (i = 0; i < n; i++) {
        int j = 0; // j 用于遍歷當(dāng)前單詞之前的所有單詞。
 
        // 檢查當(dāng)前單詞是否已經(jīng)在之前的單詞中出現(xiàn)過。
        for (j = 0; j < i; j++) {
            if (strcmp(Str[i], Str[j]) == 0) // 如果找到相同的單詞,則跳出內(nèi)層循環(huán)。
                break;
        }
 
        // 根據(jù) j 的值判斷當(dāng)前單詞是否是重復(fù)的。
        if (j < i) {
            // 如果 j < i,說明當(dāng)前單詞在之前的單詞中已經(jīng)出現(xiàn)過,因此是重復(fù)的。
            // 更新該單詞在 StrCnt 數(shù)組中的出現(xiàn)次數(shù)(注意:這里應(yīng)該更新 j 對應(yīng)的 StrCnt[j],而不是 i)。
            StrCnt[j]++;
        }
        else {
            // 如果 j == i,說明當(dāng)前單詞在之前的單詞中沒有出現(xiàn)過,因此是不重復(fù)的。
            // 將當(dāng)前單詞復(fù)制到 Str 數(shù)組的前 cnt 個(gè)位置(即去除重復(fù)單詞后的位置)。
            strcpy(Str[cnt], Str[i]);
            // 并更新該單詞在 StrCnt 數(shù)組中的出現(xiàn)次數(shù)為 1(之后可能會(huì)遞增)。
            StrCnt[cnt]++;
            // 不重復(fù)單詞數(shù)量加 1。
            cnt++;
        }
    }
 
    // 返回不重復(fù)單詞的總數(shù)。
    return cnt;
}
 
 
// 交換兩個(gè)單詞及其出現(xiàn)次數(shù)
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int a, int b - 要交換的兩個(gè)單詞的索引。
void Swap(char Str[][C_MAX], int StrCnt[], int a, int b) {
    char S[C_MAX]; // 臨時(shí)存儲單詞的字符數(shù)組。
    strcpy(S, Str[a]); // 將索引 a 處的單詞復(fù)制到臨時(shí)數(shù)組 S 中。
    int t = StrCnt[a]; // 臨時(shí)存儲索引 a 處的單詞出現(xiàn)次數(shù)。
 
    // 將索引 b 處的單詞及其出現(xiàn)次數(shù)復(fù)制到索引 a 處。
    StrCnt[a] = StrCnt[b];
    strcpy(Str[a], Str[b]);
 
    // 將臨時(shí)存儲的索引 a 處的單詞及其出現(xiàn)次數(shù)復(fù)制到索引 b 處。
    StrCnt[b] = t;
    strcpy(Str[b], S);
}
 
// 以單詞出現(xiàn)次數(shù)為基礎(chǔ),使用冒泡排序算法對單詞進(jìn)行排序
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int n - 單詞的總數(shù)(注意:這里應(yīng)該是去重后的單詞總數(shù))。
void Order_fdata(char Str[][C_MAX], int StrCnt[], int n) {
    for (int i = 0; i < n - 1; i++) { // 外層循環(huán)控制排序的輪數(shù)。
        int k = 1; // 標(biāo)記本輪排序是否進(jìn)行了交換,如果未進(jìn)行交換則提前結(jié)束排序。
        for (int j = 1; j < n - i; j++) { // 內(nèi)層循環(huán)進(jìn)行相鄰元素的比較和交換。
            if (StrCnt[j - 1] < StrCnt[j]) { // 如果前一個(gè)單詞的出現(xiàn)次數(shù)小于后一個(gè)單詞的出現(xiàn)次數(shù),則交換它們。
                Swap(Str, StrCnt, j - 1, j); // 調(diào)用 Swap 函數(shù)進(jìn)行交換。
                k = 0; // 標(biāo)記本輪排序進(jìn)行了交換。
            }
        }
        if (k == 1) break; // 如果本輪排序未進(jìn)行交換,則說明數(shù)組已經(jīng)有序,提前結(jié)束排序。
    }
    // 注意:這里的冒泡排序?qū)崿F(xiàn)是基本正確的,但通常在實(shí)際應(yīng)用中,可以使用更高效的排序算法(如快速排序、歸并排序等)。
}
 
// 將單詞及其出現(xiàn)次數(shù)輸出到文本文件
// 參數(shù):
//   char Str[][C_MAX] - 存儲單詞的二維字符數(shù)組。
//   int StrCnt[] - 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組。
//   int n - 單詞的總數(shù)(注意:這里應(yīng)該是去重后的單詞總數(shù))。
// 返回值:
//   如果文件成功打開并寫入,則返回 true;否則,在文件打開失敗時(shí)退出程序。
bool Output_txt(char Str[][C_MAX], int StrCnt[], int n) {
    FILE* fp = fopen("output.txt", "w"); // 以寫模式打開文件
    if (fp == NULL) {
        // 如果文件打開失敗,則打印錯(cuò)誤信息并退出程序
        perror("Failed to open file"); // 打印具體的錯(cuò)誤信息
        exit(1); // 退出程序,返回狀態(tài)碼 1 表示錯(cuò)誤
    }
 
    // 遍歷單詞數(shù)組,將單詞及其出現(xiàn)次數(shù)寫入文件
    for (int i = 0; i < n; i++) {
        fprintf(fp, "%s : %d\n", Str[i], StrCnt[i]); // 寫入單詞和次數(shù),每個(gè)條目占一行
    }
 
    fclose(fp); // 關(guān)閉文件
 
    // 成功寫入文件,返回 true
    return true;
}
 
int main() {
    int n = 0; // 初始化單詞數(shù)量為0
    char Str[SNUM_MAX][C_MAX]; // 存儲單詞的二維字符數(shù)組
    int StrCnt[SNUM_MAX]; // 存儲每個(gè)單詞出現(xiàn)次數(shù)的整數(shù)數(shù)組
 
    // 從文件讀取單詞,并返回讀取到的單詞數(shù)量
    n = Input_txt(Str, n);
    if (n <= 0) {
        // 如果讀取失敗或沒有讀取到單詞,則打印錯(cuò)誤信息并退出
        fprintf(stderr, "Failed to read words from input file or no words found.\n");
        return 1; // 返回非零值表示程序異常退出
    }
    printf("Input success\n"); // 打印成功信息(建議在調(diào)試時(shí)保留,但在最終產(chǎn)品中可能需要移除或替換為日志記錄)
 
    // 調(diào)整數(shù)據(jù),包括去重和計(jì)數(shù)單詞出現(xiàn)次數(shù),返回去重后的單詞數(shù)量
    n = Adjust_fdata(Str, StrCnt, n);
    if (n <= 0) {
        // 如果調(diào)整數(shù)據(jù)失?。ɡ?,輸入數(shù)據(jù)有誤),則打印錯(cuò)誤信息并退出
        fprintf(stderr, "Failed to adjust data.\n");
        return 1; // 返回非零值表示程序異常退出
    }
    printf("Adjust_fdata success\n"); // 打印成功信息
 
    // 根據(jù)單詞出現(xiàn)次數(shù)對單詞進(jìn)行排序
    Order_fdata(Str, StrCnt, n);
    printf("Order_fdata success\n"); // 打印成功信息
 
    // 將單詞及其出現(xiàn)次數(shù)輸出到文件
    Output_txt(Str, StrCnt, n);
    printf("Output_txt success\n"); // 打印成功信息
 
    // 程序正常結(jié)束,返回0表示成功
    return 0;
}

改進(jìn)建議

1. 優(yōu)化去重與計(jì)數(shù)算法:可以考慮使用哈希表(在 C 語言中可以使用結(jié)構(gòu)體和鏈表等數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn))來存儲單詞及其出現(xiàn)次數(shù),以提高去重和計(jì)數(shù)的效率。

2. 使用更高效的排序算法:可以考慮使用快速排序、歸并排序等更高效的排序算法來替換冒泡排序。

3. 增強(qiáng)錯(cuò)誤處理能力:在處理文件操作時(shí),可以考慮使用更靈活的錯(cuò)誤處理方式(如返回錯(cuò)誤代碼、拋出異常等),以便在出現(xiàn)錯(cuò)誤時(shí)能夠更好地控制程序的流程。

4. 代碼優(yōu)化與重構(gòu):可以對代碼進(jìn)行進(jìn)一步的優(yōu)化和重構(gòu),以提高代碼的可讀性和可維護(hù)性。例如,可以將一些重復(fù)的代碼封裝成函數(shù)或宏等。

到此這篇關(guān)于利用C語言實(shí)現(xiàn)單詞文本計(jì)數(shù)的文章就介紹到這了,更多相關(guān)C語言單詞文本計(jì)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++虛函數(shù)表深入研究

    C++虛函數(shù)表深入研究

    這篇文章主要介紹了C++的虛函數(shù)表,內(nèi)容非常詳細(xì),思路清晰,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細(xì)講解

    C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細(xì)講解

    這篇文章主要介紹了C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • C語言中字符串庫函數(shù)的實(shí)現(xiàn)及模擬

    C語言中字符串庫函數(shù)的實(shí)現(xiàn)及模擬

    C語言中有很多數(shù)據(jù)類型,比如int(整數(shù)類型)、char(字符類型)、以及浮點(diǎn)型的double(雙精度)等。但是有一點(diǎn)就是我們發(fā)現(xiàn)這里并沒有提到我們常見的有關(guān)字符串的類型。本文為大家介紹了C語言中字符串庫函數(shù)的實(shí)現(xiàn)及模擬,需要的可以參考一下
    2022-11-11
  • C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長度)

    C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長度)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長度),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南

    Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南

    Qt SQL模塊為數(shù)據(jù)庫提供了編程支持,Qt支持很多種常見的數(shù)據(jù)庫,如 MySQL Oracle、MS SQL Server、SQLite等,下面這篇文章主要介紹了這篇文章主要給大家介紹了關(guān)于Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • C++超詳細(xì)講解強(qiáng)制類型轉(zhuǎn)換的用法

    C++超詳細(xì)講解強(qiáng)制類型轉(zhuǎn)換的用法

    在C++語言中新增了四個(gè)關(guān)鍵字static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個(gè)關(guān)鍵字都是用于類型轉(zhuǎn)換的,類型轉(zhuǎn)換(type?cast),是高級語言的一個(gè)基本語法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號內(nèi)加上類型名來表示,接下來讓我們一起來詳細(xì)了解
    2022-06-06
  • C++?NFS掛載及掛載命令

    C++?NFS掛載及掛載命令

    這篇文章主要介紹了C++?NFS掛載,文中給大家提到了掛載NFS時(shí)常用的命令,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例

    C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例

    本文主要介紹了C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言實(shí)現(xiàn)搶紅包算法

    C語言實(shí)現(xiàn)搶紅包算法

    這篇文章主要為大家詳細(xì)介紹了C語言搶紅包算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 插入排序算法之希爾排序+直接插入排序

    插入排序算法之希爾排序+直接插入排序

    這篇文章主要介紹了插入排序算法之希爾排序+直接插入排序的相關(guān)知識,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11

最新評論