題目需求具體如下:
https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126
git地址:
https://git.coding.net/liu-xin/wf.git
功能1 小檔案輸入,為表明程式能跑,需要在控制臺下輸入命令,實作統計檔案中不重復單詞總個數,重復次數由高到低輸出,
功能 2 命令列輸入英文作品的檔案名,實作作品不重復單詞計數,重復次數由高到低輸出前十位,
功能 3 命令列輸入存盤有英文作品檔案的目錄名,批量統計作品不重復單詞總數,重復次數由高到低輸出前十位,
功能 4從控制臺讀入英文單篇作品,表明你能提供更適合嵌入腳本的作品或者bing:linux重定向,
一、準備作業
從頭到尾瀏覽一遍題目要求以后,我第一反應不是編程思路是什么,而是先把準備作業做好,打開Excel表,隨時記錄時間,打開Word,隨時記錄遇到的困難和解決辦法,
二、版本控制
版本控制我之前是沒有接觸過的,剛開始是一臉懵,直接從度娘開始,查找什么是版本控制?什么是git?什么是tortoisgit?具體怎樣操作都是一步一步跟著自己查找進行操作,但是,其中還是走了好多彎路,耗費了大量的時間在熟悉工具上,心得:只知道按步驟來,不思考,往往做著無用功,
第一步:下載、安裝git和git客戶端tortoisgit,
git下載地址:https://git-scm.com/download
tortoisgit下載地址:https://tortoisegit.org/download/
安裝程序:點擊下一步,
第二步:申請coding.net賬號并新建一個專案
第三步:在coding.net上配置遠程git ,具體請參見
https://blog.csdn.net/gyy930324/article/details/54575246
(PS:若是代碼丟失,現在代碼無法運行,找不到原版代碼,需要恢復代碼參見https://blog.csdn.net/jjs2749651/article/details/80763842,希望你用不到代碼恢復,太慘了……)
三、學習程序
準備作業做好之后,接下來是最核心的環節了,由于自己對C語言比較熟悉,選擇了C語言進行編程,利用中午下課午休時間去圖書館借了譚浩強《C語言程式設計》,用于知識點的查漏補缺,
我把要求詳細的分析了以后,列出了我認為比較關鍵的地方:
1. 檔案的讀取:
2. 檔案遍歷
3. 單詞判斷:a.重復 b.大小寫 c.特殊符號
4. 詞頻排序:
5.控制臺輸出
6.代碼整合
7.重定向
四、遇到的困難與解決辦法
功能一:
- 忘記了C語言中檔案的讀,
解決辦法:參見參見譚浩強《C語言程式設計》第四版第十章和https://blog.csdn.net/qq_29109941/article/details/74276375
2.忘記了結構體和指標的用法,
解決辦法:參見譚浩強《C語言程式設計》第四版 第八章和第九章,
3.忘記了排序演算法,
解決辦法:參見譚浩強《C語言程式設計》第四版 P147,
4.控制臺使用命令列引數運行程式,
解決辦法:int main(int argc,char *argv[])
//argv[0]指向程式運行的全路徑名
//argv[1]指向DOS命令列中執行程式名后的第一個字串
//argv[2]指向執行程式名后的第二個字串
//argv為存盤命令列引數的字串陣列
功能二:
- 不知道怎么處理整本小說讀,
解決辦法:https://blog.csdn.net/yang332233/article/details/53081785 (實作txt讀取)
2.單詞統計判斷出現錯誤,
解決辦法:除了大小寫分別26個字母以外,處理特殊符號,
功能三 :
- 遍歷檔案夾中的txt困難,
解決辦法:查找檔案的類 struct _finddata_t結構體用法,chdir函式用法,
2.無法自動輸出檔案中每一個txt的詞頻統計,
解決辦法:每讀取一個目錄輸出一次單詞統計,
3.各個功能代碼整合困難,(判斷輸入是檔案夾的名字,還是檔案txt的名字比較困難)
解決辦法:1)通過輸入的引數判斷:if (S_ISDIR(st.st_mode))
2)正則表達: 正則沒看懂,最后選擇的第一種解決辦法,
功能四:
- 不理解題意,
解決辦法:找度娘,瀏覽相關博客了解重定向的相關知識點,非自己實作,參考了潘世維同學的代碼,在此表示感謝,
五、重要代碼
1
long Handle; //遍歷檔案夾中的txt struct _finddata_t fileinfo; struct stat st; stat(argv[1],&st); //判斷某檔案是檔案夾還是檔案 if (S_ISDIR(st.st_mode)) //是檔案夾 { chdir(argv[1]); //chdir()用戶將當前的作業目錄改變成以引數路徑所指的目錄 if((Handle=_findfirst("*.txt",&fileinfo))==-1L) //findfirst搜索與指定的檔案名稱匹配的第一個實體,若成功則回傳第一個實體的句柄,否則回傳-1L, { printf("沒有找到匹配的專案\n"); } else { printf("%s\n",fileinfo.name); find(fileinfo); while(_findnext(Handle,&fileinfo)==0) { printf("---\n"); printf("%s\n",fileinfo.name); find(fileinfo); printf("---\n"); } _findclose(Handle); } }遍歷檔案夾中txt
2
1 FILE *fp; 2 fp=fopen(fileinfo.name,"r");txt內容讀取
3
void count(char s[]) { int i,j; int flag=0; for(i=0;i<=sum;i++) { if(strcmp(C[i].str,s)==0) { C[i].num++; flag=1; } } if(flag==0) { for(j=0;j<30;j++) C[sum].str[j]=s[j]; C[sum].num++; sum++; } }單詞計數
4
void paixu() { int i,j; struct word a; for(i=0;i<sum;i++) { for(j=i+1;j<sum;j++) { if(C[i].num<C[j].num) { a=C[j]; C[j]=C[i]; C[i]=a; } } }詞頻排序
六、 執行效果圖
功能一

功能二

功能三

功能四

七、PSP階段表格
| PSP階段 | 預計花費時間 | 實際花費時間 | 時間差距 |
| 功能一 | 480min | 804min | 324min |
| txt檔案的讀取 | 60min | 91min | 31min |
| 結構體和指標的用法 | 60min | 87min | 27min |
| 單詞計數 | 30min | 42min | 12min |
| 排序演算法 | 45nin | 65min | 20min |
| 使用命令列引數運行程式 | --- | 287min | |
| 代碼除錯 | --- | 232min | |
| 功能二 | 60min | 94min | 34min |
| 讀取txt內容 | 60min | 48min | 12min |
| 控制前十輸出 | 10min | 17min | 7min |
| 代碼除錯 | --- | 29min | |
| 功能三 | 480min | 546min | 66min |
| 遍歷檔案夾 | 180min | 233min | 53min |
| 代碼除錯 | --- | 81min | |
| 代碼優化 | --- | 65min | |
| 功能整合 | 120min | 167min | 47min |
| 功能四 | 420min | 465min | 45min |
| 需求分析 | 120min | 134min | 14min |
| 重定向 | 180min | 112min | 68min |
| 代碼優化 | --- | 219min |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/222246.html
標籤:其他
上一篇:WordCount專案基本功能
下一篇:前端常用命令列
