20200917-2 詞頻統計
此作業的要求參見:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206
詞頻統計 SPEC
老五在寢室吹牛他熟讀過《魯濱遜漂流記》,在女生面前吹牛熱愛《呼嘯山莊》《簡愛》和《飄》,在你面前說通讀了《戰爭與和平》。但是,他的四級至今沒過。你們幾個私下商量,這幾本大作的單詞量怎麼可能低於四級,大家聽說你學習《構建之法》,一致推舉你寫個程式名字叫wf,統計英文作品的單詞量並給出每個單詞出現的次數,準備用於打臉老五。
希望實現以下效果。以下效果中數字純屬編造。
功能1小檔案輸入。 為表明程式能跑,結果真實而不是迫害老五,請他親自鍵
盤在控制檯下輸入命令。
>type test.txt My English is very very pool.>wf -s test.txt total 5 very 2 my 1 english 1 is 1 pool 1
為了評估老五的詞彙量而不是閱讀量,total一項中相同的單詞不重複計數數,出現2
次的very計數1次。
因為用過控制檯和命令列,你早就知道,上面的">"叫做命令提示符,是作業系統的一部分,而不是你的程式的一部分。
此功能完成後你的經驗值+10.
答:
功能2支援命令列輸入英文作品的檔名,請老五親自錄入。
>wf gone_with_the_wand total 1234567 words the 5023 a4783 love 4572 fire 4322 run 3822 cheat 3023 girls 2783 girl 2572 slave 1322 buy 822
此功能完成後你的經驗值+30. 輸入檔案最大不超過40MB. 如果你的程式中途崩
了,會被老五打臉,不增加經驗值。
答:
功能3支援命令列輸入儲存有英文作品檔案的目錄名,批量統計。
>dir folder
gone_with_the_wand
runbinson
janelove
>wf folder
gone_with_the_wand
total 1234567 words
the 5023
a 4783
love 4572
fire 4322
run 3822
cheat 3023
girls 2783
girl 2572
slave 1322
buy 822
----
runbinson
total 1234567 words
friday 5023 sea 4783 food 4572 dog 4322 run 3822 hot 3023 cood 2783 cool 2572 bible 1322 eat 822 ---- janelove total 1234567 words love 5023 chat 4783 lie 4572 run 4322 money 3822 inheritance 3023 class 2783 attribute 2572 data 1322 method 822
因為單詞量巨大,只列出出現次數最多的10個單詞。
此功能完成後你的經驗值+8.
答:
功能4從控制檯讀入英文單篇作品,這不是為了打臉老五,而是為了向你女朋
友炫酷,表明你能提供更適合嵌入指令碼中的作品(或者如她所說,不過是更靈活
的介面)。如果讀不懂需求,請教師兄師姐,或者 bing: linux 重定向,儘管
這個功能在windows下也有,搜尋關鍵詞中加入linux有利於迅速找到。
>wf -s < the_show_of_the_ring total 176 the 6 a 3 festival 2 dead 2 for 2 ...
此功能完成後你的經驗值+10.
答:
功能5此功能為選做題,如果完成正確得30經驗值,如果不做得0經驗值,不會倒扣分數。
你完成了所有功能,後面的部落格、PSP等也都精心準備了,去食堂的路上心情大悅。坐下撓了撓手機訪問cnblogs上的班級,卻發現大家的作業也都非常優秀,自己並不突出,心下黯然。怎麼才能更加傑出呢?一抬頭,看到老楊老師和和鄒欣老師正坐桌對面吃飯,你說出了自己的困惑。
老楊說,“精益求精,一步步榨出自己的潛力來,正是走向傑出的開始啊。”
你說,“老師你具體點唄。”
鄒欣老師說,“這樣,我想知道5個字母的單詞中最頻繁出現的是哪10個單詞,top10,你怎麼辦呢?”
你一下就想到了,說了思路,應該blablabla。鄒欣老師又問,“6個字母的單詞中最頻繁出現的是哪10個單詞呢,top10?”
老楊追問,“6個字母的字母的單詞中最頻繁出現的是哪100個單詞呢,top100?”
你問,“演算法我想好了,效能估計也沒問題,命令列引數老師怎麼規定呢?”
老楊說,"你來規定,寫個簡單的文件,包括如何執行,給出執行例項的截圖。"
"可變的引數就是(1)幾個字母和(2)排行前多少是吧?沒有問題。"
此時,你想起自己一直做作業還沒有吃飯。肚子咕咕叫得聲音如此之大,把你吵醒了。是趕緊去吃飯呢,還是做完這題再說?
答:前面的數字代表單詞字母的個數,後面的數字代表顯示top多少,分別對應四個功能
功能一 功能二
功能三 功能四
功能實現
(以上每1經驗值對應 1分。)
要求在同一個可執行程式中實現全部功能,而不是每個功能單獨用一個可執行程式實現。
部落格
(10分)
發表部落格,介紹上述“專案”中每個功能的重點/難點,展示重要程式碼片斷,給出執行效果截圖,展示你感覺得意、突破、困難的地方。
答:(1)我是把每個功能看成一個整體,每個功能都必須將檔案裡的單詞處理好,
處理單詞的重點,要考慮不是所有單詞都由空格分開,有可能是逗號,句號等等。
所以需要除了字母以外都要分開。
1 Map<String,Integer> map = new HashMap<String,Integer>();
2 String data = null;
3 //讀取文字一行
4 while((data=br.readLine())!=null) {
5 String[] word = data.split("[^a-zA-Z]");
6 for (int i = 0; i < word.length; i++) {
7 if(!word[i].equals("")) {
8 if(map.containsKey(word[i])) {
9 Integer word_num = map.get(word[i]);
10 map.put(word[i],++word_num);
11 }else {
12 map.put(word[i],1);
13 }
14 }
15 }
16 }
(2)下一個難點是資料夾,檔案處理這塊,比較複雜,功能三資料夾處理利用遞迴的方式
public static void fileName(String str) throws IOException {
File file = new File(System.getProperty("user.dir")+"/"+str);
//功能三,處理目錄
if(file.isDirectory()){
File[] tempList = file.listFiles();
for (int i = 0; i < tempList.length; i++) {
System.out.println(tempList[i].getName());
fileName(str+"/"+tempList[i].getName());
System.out.println("------------");
}
}else {
if(str.contains(".txt")) {
minFile(str);
}else {
englishFile(str);
}
}
}
(3)下一個難點是引數處理,要考慮在控制檯輸入的引數的位置,要考慮這五種功能的情況
if(args.length != 0) {
if(args[0].equals("-s")) {
if(args.length == 2) {
fileName(args[1]);
}else {
if(args.length == 4) {
wordNum = Integer.parseInt(args[2]);
wordTop = Integer.parseInt(args[3]);
fileName(args[1]);
}else if(args.length == 3){
wordNum = Integer.parseInt(args[1]);
wordTop = Integer.parseInt(args[2]);
redir();
}else {
redir();
}
}
}else {
if(args.length == 3) {
wordNum = Integer.parseInt(args[1]);
wordTop = Integer.parseInt(args[2]);
}
fileName(args[0]);
}
}
程式碼片斷要求1 凡不縮排的,此題目拒絕接收。不知道什麼是“縮排”的同學,請自行補課,不接受以“不知道”作為理由。
程式碼片斷要求2 要求使用cnblogs程式碼控制元件,參見往屆同學黃興、宮成榮的作業。凡貼上IDE中的程式碼截圖,或者貼文字而沒有關鍵字高亮或彩色的,0分。
[http://www.cnblogs.com/huangxman/p/5871201.html]
[http://www.cnblogs.com/gongcr/p/5873493.html]
圖表過小、字跡不清、錯別字、句子不通順的,教師會因為讀不懂而對此題扣分。
PSP
(8分)
在同一篇部落格中,參照教材第35頁表2-2和表2-3,為上述“專案”製作PSP階段表格。
PSP階段表格第1列分類,如功能1、功能2、測試功能1等。
要求1估算你對每個功能 (或/和子功能)的預計花費時間,填入PSP階段表格,時間顆粒度為分鐘。
要求2記錄詞頻統計專案實際花費時間,填入PSP階段表格,時間顆粒度要求分鐘。
要求3對比要求1和要求2中每項時間花費的差距,分析原因。
程式碼及版本控制
(5分。雖然只有5分,但此題如果做錯,因為教師得不到你的程式碼,所以會導致“功能實現”為負分。)
程式碼要求在 coding.net 做版本控制。要求push&pull時使用git客戶端,不允許使用web頁面。
要求頻繁checkin。要求在PSP中記錄的每次離開鍵盤5分鐘以上,需要checkin。如果你持續長達4小時不離開鍵盤,教師要求展示此項能力。
推薦git客戶端tortoisegit。
推薦先pull [https://github.com/weijunying2019102969/novelsfortest.git],裡面有測試用例。
答:Github:https://github.com/zhaoyw456/wf.git
coding.net:https://e.coding.net/zhaoyingwei/zyw/wf.git