原需求
1.讀取文件,文件內包可含英文字符,及常見標點,空格級換行符。
2.統計英文單詞在本文件的出現次數
3.將統計結果排序
4.顯示排序結果
新需求:
1.小文件輸入. 為表明程序能跑
2.支持命令行輸入英文作品的文件名
3. 支持命令行輸入存儲有英文作品文件的目錄名,批量統計
4. 從控制台讀入英文單篇作品,重定向輸出
代碼實現:
在原代碼的基礎上稍做了修改,使之可以批量讀取文件夾下的所有文件,所以加了一個mode來判斷是單個文件輸入還是文件夾輸入,來不及整理程序,所以現在程序有點丑。這次作業交了以后會干兩件事,第一是精簡程序結構,第二是優化程序性能,可能會重新構思程序的主體部分。
1 if (mode == 2) 2 { 3 printf("輸入讀入文件夾的名字:"); 4 scanf("%s", &fa); 5 if ((fHandle = _findfirst("*.txt", &fa)) == -1L) //文件夾目錄 6 { 7 printf("當前目錄下沒有txt文件\n"); 8 return 0; 9 } 10 else 11 do 12 { 13 fp = fopen(fa.name, "r"); 14 for (i = 0; i < 500; i++) 15 { 16 (w + i)->num = 1; 17 } 18 19 /****************單詞匹配****************************************/ 20 i = 0; 21 while (!feof(fp))//文件尚未讀取完畢 22 { 23 ch = fgetc(fp); 24 (w + i)->a[j] = '\0'; 25 if (ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122) //ch若為字母則存入 26 { 27 (w + i)->a[j] = ch; 28 j++; 29 flag = 0; //設標志位判斷是否存在連續標點或者空格 30 } 31 else if (!(ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122) && flag == 0) //ch若不是字母且上一個字符為字母 32 { 33 i++; 34 j = 0; 35 flag = 1; 36 for (m = 0; m < i - 1; m++) //匹配單詞,若已存在則num+1 37 { 38 if (stricmp((w + m)->a, (w + i - 1)->a) == 0) 39 { 40 (w + m)->num++; 41 i--; 42 } 43 } 44 } 45 /****************動態分配內存****************************************/ 46 if (i == (p * 500)) //用i判斷當前內存已滿 47 { 48 p++; 49 w = (struct fre_word*)realloc(w, 500 * p*(sizeof(struct fre_word))); 50 for (n = i; n <= 500 * p; n++) //給新分配內存的結構體賦初值 51 (w + n)->num = 1; 52 } 53 } 54 i = i - 2; 55 quick(w, 0, i); 56 57 printf("文件%s詞頻統計如下\n", fa.name); 58 printf("不重復的單詞數:"); 59 printf("%d\n", i); 60 for (n = 0; n <10; n++) 61 { 62 printf("文檔中出現的單詞:"); 63 printf("%-18s", (w + n)->a); 64 printf("其出現次數為:"); 65 printf("%d\n", (w + n)->num); 66 } 67 printf("\n"); 68 69 } while (_findnext(fHandle, &fa) == 0); 70 _findclose(fHandle); 71 fclose(fp); 72 return 0; 73 free(w); 74 75 }
其余部分和之前第一版幾乎沒有區別,就不再贅述。
運行結果:
功能1:
功能2:
功能3:
功能4:
coding:https://git.coding.net/gongcr/word-frequency.git
openssh:git@git.coding.net:gongcr/word-frequency.git
git:git://git.coding.net/gongcr/word-frequency.git
得分項:
表一:
表二:
項目:詞頻統計第二版
項目類型:個人項目
項目日期:2016.9.11-2016.9.13
11號
類別c | 內容c | 開始時間s | 結束e | 中斷I | 凈時間T |
項目實踐 | 看書 | 8:00 | 10:00 | 20m | 100m |
項目實踐 | 需求分析 | 10:00 | 10:40 | 10m | 30m |
項目實踐 | 安裝vs |
12號
類別c | 內容c | 開始時間s | 結束e | 中斷I | 凈時間T |
項目實踐 | 調試vs | 8:00 | 10:00 | 0m | 120m |
項目實踐 | 重裝系統/vs | 12:00 | 16:00 | 0m | 240m |
項目實踐 | 效能分析 | 19:00 | 19:40 | 0m | 40m |
項目實踐 | 編碼 | 20:00 | 22:00 | 20m | 100m |
13號
類別c | 內容c | 開始時間s | 結束e | 中斷I | 凈時間T |
項目實踐 | 查資料 | 8:00 | 10:30 | 0m | 150m |
項目實踐 | 編碼 | 10:30 | 11:30 | 10m | 50m |
項目實踐 | 編碼 | 13:40 | 15:00 | 50m | 30m |
項目實踐 | 計算工作量 | 15:00 | 15:20 | 0m | 20m |
項目實踐 | 寫博客 | 20:00 | 21:15 | 0m | 75m |