第一次我的做業工做記錄

做業要求:php

1.    對源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等)統計字符數、單詞數、行數、詞頻,統計結果以指定格式輸出到默認文件中,以及其餘擴展功能,並可以快速地處理多個文件。html

2.    使用性能測試工具進行分析,找到性能的瓶頸並改進java

3.    對代碼進行質量分析,消除全部警告數組

http://msdn.microsoft.com/en-us/library/dd264897.aspx框架

4.    設計10個測試樣例用於測試,確保程序正常運行(例如:空文件,只包含一個詞的文件,只有一行的文件,典型文件等等)模塊化

5.    使用Github進行代碼管理函數

6.    撰寫博客工具

功能需求性能

1.    統計文件的字符數學習

2.    統計文件的單詞總數

3.    統計文件的總行數

4.    統計文件中各單詞的出現次數

5.    對給定文件夾及其遞歸子文件夾下的全部文件進行統計

6.    統計兩個單詞(詞組)在一塊兒的頻率,輸出頻率最高的前10個。

7.    在Linux系統下,進行性能分析,過程寫到blog中(附加題)

前期的分析:

首先看到了題目就馬上想到了會有巨大的數據須要進行處理,天然就會聯想應該如何去解決數據的存放問題與查找問題,從功能需求中一步步想到了使用哈希表對此進行存儲,因而便有了初步的想法:一、打開一個文件,讀取文件內容;二、將讀取的信息進行處理;三、構造一個哈希函數,建立一個哈希表。

以後有關測試文件出來了,便遇到了一個很棘手的問題:對於文件的遍歷,這個起初是打算用C語言中的fopen函數,但仔細一分析發現並不能實現具體的要求,因而便尋求一個能夠遍歷文件的操做,在查閱資料後找到了C++語言中的findfirst和findnext函數能夠實現文件操做,因而便開始對其的學習,因爲以前未接觸過C++,對於其中過程的瞭解耗費了很長的時間,因而便對測試文件進行了初步的遍歷實驗,起初的結果很不近人意,只能遍歷文件的第一個子目錄裏的文件,沒法進入子文件夾,進過斷定條件的修改,最終實現了全部文件的遍歷。       

此刻第一步便達到了目的,因而開始了文件讀取問題的思考,找到了兩個函數,get和getline函數,首先get函數能夠很好的讀取文件中的字符,依靠對文件是否結束的斷定能夠持續讀取,這個的好處就在於能夠無所謂文件中所有的字符總量,能夠一邊讀一邊根據斷定條件進行對單詞與詞組的操做,而且能夠按照換行符的數量判斷一個文件中的行數,這個能夠說是很理想;其次是getline函數,它能夠一次讀取一行,這個能夠省去單獨統計換行符的工做,每次調用的時候就能夠進行行數的累加,而後能夠直接用一行一行的處理單詞與詞組,這個能夠更加模塊化,可是缺點即是文件中會出現一行中有數十萬的字符,就會使得數組溢出致使失敗;通過考慮,我選擇了getline函數。

而後就是開始對這個項目進行框架的搭建,從字符、單詞到詞組,每個都單獨進行搭建,互不相關,爲了達到這個目的,分別爲單詞與詞組設計了各自的哈希表,因爲要同時對出現頻率的統計,決定構造一個結構體數組,裏面存儲字符串與整型數據,而數組的地址則用設計的哈希函數進行計算。

代碼實現

一、  文件遍歷

利用已經試驗過的findfirst與findnext函數進行操做;

二、  文件讀取

先利用ifstream函數打開文件,再利用getline函數對文件內容進行讀取,在文件函數中直接調用字符的函數、單詞的函數、詞組的函數;

三、  字符統計

對傳入的字符數組,進行遍歷,並隨之進行數據的統計;

四、  單詞統計

     對傳入的字符數組進行有條件的遍歷,篩選出符合條件的單詞,調用單詞的哈希表構造函數

(1)      單詞哈希表構造

消除大小寫的影響,即在計算哈希函數時使用單詞前四個字母時,所有化爲小寫進行求解,利用平方取中法構造哈希函數,利用開放定址發解決衝突,其中須要調用單詞比較函數和單詞優先級比較函數;

1)    單詞比較函數

比較新單詞與哈希表中同一位置單詞是否爲相同單詞;

    2)單詞優先比較函數

比較兩個相同單詞在字典輸出的狀況下的前後次序;

五、  詞組統計

對傳入的字符數組進行有條件的遍歷,篩選出符合條件的詞組,調用詞組的哈希表構造函數 ,其中判斷詞組須要大量的斷定條件;

(1)      詞組哈希表構造

消除大小寫的影響,即在計算哈希函數時使用第一個單詞與第二個單詞各前四個字母時,所有化爲小寫進行求解,利用平方取中法構造哈希函數,利用開放定址發解決衝突,其中須要調用詞組比較函數和詞組優先級比較函數;

1)  詞組比較函數

比較新詞組與哈希表中同一位置詞組是否爲相同單詞;

2)  單詞優先比較函數

比較兩個相同詞組在字典輸出的狀況下的前後次序;

六、  頻率統計

   利用冒泡排序法對哈希結構體進行排序,將前十出現頻率的結構體返回主函數

七、文件輸出

利用fp指針;

運行結果:

    多是在哪個函數的斷定條件裏出現的錯誤,產生了死循環,致使沒法正常運行。

目前在調試當中,以後還會更新blog。

相關文章
相關標籤/搜索