日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第一次工作报告

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一次工作报告 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

要求

1.????? 對(duì)源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等)統(tǒng)計(jì)字符數(shù)、單詞數(shù)、行數(shù)、詞頻,統(tǒng)計(jì)結(jié)果以指定格式輸出到默認(rèn)文件中,以及其他擴(kuò)展功能,并能夠快速地處理多個(gè)文件。

2.????? 使用性能測(cè)試工具進(jìn)行分析,找到性能的瓶頸并改進(jìn)

3.????? 對(duì)代碼進(jìn)行質(zhì)量分析,消除所有警告

4.????? 設(shè)計(jì)10個(gè)測(cè)試樣例用于測(cè)試,確保程序正常運(yùn)行(例如:空文件,只包含一個(gè)詞的文件,只有一行的文件,典型文件等等)

5.????? 使用Github進(jìn)行代碼管理

6.????? 撰寫博客

基本功能

1.????? 統(tǒng)計(jì)文件的字符數(shù)

2.????? 統(tǒng)計(jì)文件的單詞總數(shù)

3.????? 統(tǒng)計(jì)文件的總行數(shù)

4.????? 統(tǒng)計(jì)文件中各單詞的出現(xiàn)次數(shù)

5.????? 對(duì)給定文件夾及其遞歸子文件夾下的所有文件進(jìn)行統(tǒng)計(jì)

6.????? 統(tǒng)計(jì)兩個(gè)單詞(詞組)在一起的頻率,輸出頻率最高的前10個(gè)。

7.????? 在Linux系統(tǒng)下,進(jìn)行性能分析,過(guò)程寫到blog中(附加題)

PSP

?

前期的分析:

首先看到了題目就立刻想到了會(huì)有巨大的數(shù)據(jù)需要進(jìn)行處理,自然就會(huì)聯(lián)想應(yīng)該如何去解決數(shù)據(jù)的存放問(wèn)題與查找問(wèn)題,從功能需求中一步步想到了使用哈希表對(duì)此進(jìn)行存儲(chǔ),于是便有了初步的想法:

1、打開一個(gè)文件,讀取文件內(nèi)容;

2、將讀取的信息進(jìn)行處理;

3、構(gòu)造一個(gè)哈希函數(shù),創(chuàng)建一個(gè)哈希表。

之后有關(guān)測(cè)試文件出來(lái)了,便遇到了一個(gè)很棘手的問(wèn)題:對(duì)于文件的遍歷,這個(gè)起初是打算用C語(yǔ)言中的fopen函數(shù),但仔細(xì)一分析發(fā)現(xiàn)并不能實(shí)現(xiàn)具體的要求,于是便尋求一個(gè)可以遍歷文件的操作,在查閱資料后找到了C++語(yǔ)言中的findfirst和findnext函數(shù)可以實(shí)現(xiàn)文件操作,于是便開始對(duì)其的學(xué)習(xí),由于之前未接觸過(guò)C++,對(duì)于其中過(guò)程的了解耗費(fèi)了很長(zhǎng)的時(shí)間,于是便對(duì)測(cè)試文件進(jìn)行了初步的遍歷實(shí)驗(yàn),起初的結(jié)果很不近人意,只能遍歷文件的第一個(gè)子目錄里的文件,無(wú)法進(jìn)入子文件夾,進(jìn)過(guò)判定條件的修改,最終實(shí)現(xiàn)了所有文件的遍歷。 ??????

此刻第一步便達(dá)到了目的,于是開始了文件讀取問(wèn)題的思考,找到了兩個(gè)函數(shù),get和getline函數(shù),首先get函數(shù)可以很好的讀取文件中的字符,依靠對(duì)文件是否結(jié)束的判定可以持續(xù)讀取,這個(gè)的好處就在于可以無(wú)所謂文件中全部的字符總量,可以一邊讀一邊根據(jù)判定條件進(jìn)行對(duì)單詞與詞組的操作,并且可以按照換行符的數(shù)量判斷一個(gè)文件中的行數(shù),這個(gè)可以說(shuō)是很理想;其次是getline函數(shù),它可以一次讀取一行,這個(gè)可以省去單獨(dú)統(tǒng)計(jì)換行符的工作,每次調(diào)用的時(shí)候就可以進(jìn)行行數(shù)的累加,然后可以直接用一行一行的處理單詞與詞組,這個(gè)可以更加模塊化,但是缺點(diǎn)便是文件中會(huì)出現(xiàn)一行中有數(shù)十萬(wàn)的字符,就會(huì)使得數(shù)組溢出導(dǎo)致失敗;經(jīng)過(guò)考慮,我選擇了getline函數(shù)。

然后就是開始對(duì)這個(gè)項(xiàng)目進(jìn)行框架的搭建,從字符、單詞到詞組,每一個(gè)都單獨(dú)進(jìn)行搭建,互不相關(guān),為了達(dá)到這個(gè)目的,分別為單詞與詞組設(shè)計(jì)了各自的哈希表,由于要同時(shí)對(duì)出現(xiàn)頻率的統(tǒng)計(jì),決定構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)組,里面存儲(chǔ)字符串與整型數(shù)據(jù),而數(shù)組的地址則用設(shè)計(jì)的哈希函數(shù)進(jìn)行計(jì)算。

代碼設(shè)計(jì):

1、 文件遍歷

利用已經(jīng)試驗(yàn)過(guò)的findfirst與findnext函數(shù)進(jìn)行操作;

2、 文件讀取

利用ifstream函數(shù)打開文件,再利用getline函數(shù)對(duì)文件內(nèi)容進(jìn)行讀取,在文件函數(shù)中直接調(diào)用字符的函數(shù)、單詞的函數(shù)、詞組的函數(shù);

3、 字符統(tǒng)計(jì)

對(duì)傳入的字符數(shù)組,進(jìn)行遍歷,并隨之進(jìn)行數(shù)據(jù)的統(tǒng)計(jì);

4、 單詞統(tǒng)計(jì)

對(duì)傳入的字符數(shù)組進(jìn)行有條件的遍歷,篩選出符合條件的單詞,調(diào)用單詞的哈希表構(gòu)造函數(shù)

(1)????? 單詞哈希表構(gòu)造

消除大小寫的影響,即在計(jì)算哈希函數(shù)時(shí)使用單詞前四個(gè)字母時(shí),全部化為小寫進(jìn)行求解,利用平方取中法構(gòu)造哈希函數(shù),利用開放定址發(fā)解決沖突,其中需要調(diào)用單詞比較函數(shù)和單詞優(yōu)先級(jí)比較函數(shù);

1) ??單詞比較函數(shù)

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

?2)單詞優(yōu)先比較函數(shù)

比較兩個(gè)相同單詞在字典輸出的情況下的先后次序;

5、 詞組統(tǒng)計(jì)

對(duì)傳入的字符數(shù)組進(jìn)行有條件的遍歷,篩選出符合條件的詞組,調(diào)用詞組的哈希表構(gòu)造函數(shù) ,其中判斷詞組需要大量的判定條件;

(1)????? 詞組哈希表構(gòu)造

消除大小寫的影響,即在計(jì)算哈希函數(shù)時(shí)使用第一個(gè)單詞與第二個(gè)單詞各前四個(gè)字母時(shí),全部化為小寫進(jìn)行求解,利用平方取中法構(gòu)造哈希函數(shù),利用開放定址發(fā)解決沖突,其中需要調(diào)用詞組比較函數(shù)和詞組優(yōu)先級(jí)比較函數(shù);

1) 詞組比較函數(shù)

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

2) 單詞優(yōu)先比較函數(shù)

比較兩個(gè)相同詞組在字典輸出的情況下的先后次序;

6、 排序

?? 利用冒泡排序法對(duì)哈希結(jié)構(gòu)體進(jìn)行排序,將前十出現(xiàn)頻率的結(jié)構(gòu)體返回主函數(shù)

7、文件輸出

利用ofstream函數(shù)進(jìn)行reasult.txt文件的構(gòu)造;

具體編碼:

1、 文件遍歷函數(shù):

利用findfirst函數(shù)與findnext函數(shù),不斷利用文件地址對(duì)文件進(jìn)行遍歷,在遍歷的同時(shí)將地址字符串傳入到文件讀取子函數(shù)中;

2、 文件讀取函數(shù):

在文件遍歷中調(diào)用此函數(shù),利用傳入的地址和ifstream函數(shù)對(duì)文件進(jìn)行打開操作,設(shè)置一個(gè)字符數(shù)組,再用getline函數(shù)將文件中的數(shù)據(jù)傳入數(shù)組中,由于getline是讀取文件的一行,此時(shí)便可以記錄行數(shù)的變化,當(dāng)生成一個(gè)數(shù)組時(shí)便調(diào)用字符統(tǒng)計(jì)子函數(shù)并返回一個(gè)值代表字符數(shù),調(diào)用單詞統(tǒng)計(jì)子函數(shù)并返回一個(gè)單詞數(shù),調(diào)用詞組統(tǒng)計(jì)子函數(shù)不返回值。

3、 字符統(tǒng)計(jì)函數(shù):

判斷從文件讀取子函數(shù)傳入的字符數(shù)組中的字符,并計(jì)數(shù)

4、 單詞統(tǒng)計(jì)函數(shù):

從字符數(shù)組的首地址開始依次判斷,符合單詞的條件便調(diào)用單詞哈希構(gòu)造子函數(shù);

(1)單詞哈希構(gòu)造函數(shù):

利用單詞的前四位相同的條件,將其ASCLL碼值進(jìn)行求和,再平方取模,得到的便是存入的地址,為了同時(shí)統(tǒng)計(jì)單詞的個(gè)數(shù),構(gòu)造了結(jié)構(gòu)體數(shù)組,在結(jié)構(gòu)體中存入單詞與頻率,在存入哈希表中時(shí),如果地址處已存單詞,需要進(jìn)行相同性的比較與優(yōu)先級(jí)的比較,于是調(diào)用單詞比較子函數(shù)與單詞優(yōu)先比較子函數(shù);

(2)單詞比較函數(shù):

比較傳入的兩個(gè)單詞,依次字符進(jìn)行比較,遇見不同地方便進(jìn)行判斷,如果相同字符數(shù)小于4個(gè),則返回不同,如果大于4,則判斷之后是否全是數(shù)字;

(3)單詞優(yōu)先比較函數(shù):

此函數(shù)在單詞比較之后調(diào)用,此時(shí)傳入的兩個(gè)單詞均為相同,則先判斷相同字符的優(yōu)先,如果相同則判斷不同的優(yōu)先;

5、 詞組統(tǒng)計(jì)函數(shù):

為了不與單詞發(fā)生交互,進(jìn)行單獨(dú)構(gòu)造,遇見單詞則判斷之后是否有單詞出現(xiàn),如果沒有,從新的地址進(jìn)行第一個(gè)單詞的判斷,如果有則調(diào)用詞組哈希構(gòu)造,之后重復(fù);

(1)????? 詞組哈希構(gòu)造函數(shù):

利用詞組的第一個(gè)單詞前4個(gè)字符與第二個(gè)單詞前4個(gè)字符的ASCLL值求和,平方取模,獲得地址,存入哈希表,構(gòu)造一個(gè)結(jié)構(gòu)體存儲(chǔ)詞組與頻率,在存儲(chǔ)的時(shí)候調(diào)用詞組比較與詞組優(yōu)先比較函數(shù),類似單詞哈希構(gòu)造

(2)????? 詞組比較函數(shù):

??? 先判斷第一個(gè)單詞是否相同,再判斷第二個(gè),具體操作類似單詞比較;

(3)????? 詞組優(yōu)先判斷函數(shù):

??? 先判斷第一個(gè)單詞的優(yōu)先,再判斷第二個(gè),具體操作類似單詞優(yōu)先比較;

6、 排序函數(shù):

將單詞哈希表與詞組哈希表中的頻率進(jìn)行排序,采取的是冒泡排序方法,為了同時(shí)輸出字符串和頻率,單獨(dú)構(gòu)造了一個(gè)結(jié)構(gòu)體存儲(chǔ),此結(jié)構(gòu)體存儲(chǔ)的是前十的字符串與頻率;

7、 文件輸出函數(shù):

利用ofstream函數(shù)生成result.txt文件,并將答案寫入文件。

8、 main函數(shù)

主函數(shù)中調(diào)用了一次文件遍歷子函數(shù),便是輸出的代碼。

?

測(cè)試結(jié)果:

自己構(gòu)造的測(cè)試集:

文件小的時(shí)候只能輸出正確的行數(shù)、字符數(shù)與單詞數(shù),文件一大程序就會(huì)崩潰;

助教給的測(cè)試集:

無(wú)法全部跑完;

崩潰原因分析:

1、 在讀取字符的時(shí)候使用的是getline,但之后的調(diào)試與編譯的時(shí)候,出現(xiàn)了數(shù)組溢出的事情,所以在get與getline的選擇上出現(xiàn)了錯(cuò)誤,應(yīng)該選擇更加安全的get,

2、 對(duì)于哈希表的構(gòu)造不夠好,由于自己是用結(jié)構(gòu)體數(shù)組,也會(huì)出現(xiàn)數(shù)據(jù)溢出的問(wèn)題,還有關(guān)于哈希函數(shù)的構(gòu)造也不夠好,容易發(fā)生沖突,導(dǎo)致的大量的計(jì)算與調(diào)用函數(shù),使得程序運(yùn)行很慢;

3、 在判斷單詞與詞組的時(shí)候,需要考慮的東西很多,很容易就會(huì)忽視一個(gè),導(dǎo)致程序無(wú)法正常運(yùn)行,由于多條條件的判斷導(dǎo)致自己很容易出錯(cuò);

4、 比較難以實(shí)現(xiàn)的是對(duì)哈希表的排序,最終確定了使用冒泡排序,這也導(dǎo)致了運(yùn)行時(shí)間過(guò)長(zhǎng);

5、 各類細(xì)節(jié)問(wèn)題,例如一開始使用的是int型數(shù)據(jù),到最后才意識(shí)到了需要使用長(zhǎng)整型,導(dǎo)致了代碼很多地方需要修改,以至于發(fā)生了一些不可描述的問(wèn)題;

代碼優(yōu)化:

1、 在一些循環(huán)語(yǔ)句中,例如for循環(huán),一開始判定的條件是到達(dá)數(shù)組地址最大值的時(shí)候停止,經(jīng)過(guò)考慮,于是使用了計(jì)算字符串長(zhǎng)度的函數(shù),將條件表達(dá)式的里的值改成了字符串真正懂得長(zhǎng)度,但任然大量的調(diào)用了strlen函數(shù),在代碼交上以后又想到了可以直接使用do……while循環(huán),直接判斷數(shù)組為空,便可停止循環(huán);

2、 盡量使用有符號(hào)長(zhǎng)整型,但為了答案不會(huì)出錯(cuò),我選擇了無(wú)符號(hào),這會(huì)大量浪費(fèi)運(yùn)行時(shí)間,應(yīng)該將不需要無(wú)符號(hào)的數(shù)改為有符號(hào);

3、 函數(shù)調(diào)用過(guò)于深,這次的程序發(fā)生了5層函數(shù)的調(diào)用,最好可以將其簡(jiǎn)化;

4、 有一點(diǎn)沒用注意,便是沒用多使用const,因?yàn)槿绻粋€(gè)const聲明的對(duì)象的地址不被獲取,允許編譯器不對(duì)它分配儲(chǔ)存空間。這樣可以使代碼更有效率,而且可以生成更好的代碼。

5、 熱行分析

?

由于采用了無(wú)比慢的排序方法導(dǎo)致的兩個(gè)sorting函數(shù)運(yùn)行所占時(shí)間很多;

?

教訓(xùn)與總結(jié)

首先從架構(gòu)來(lái)說(shuō),自己在項(xiàng)目一開始的時(shí)候沒有確定一個(gè)特別明確的架構(gòu),導(dǎo)致在編碼的時(shí)候發(fā)現(xiàn)了思路不清楚的問(wèn)題,之后才逐漸完善了架構(gòu),便浪費(fèi)了不少時(shí)間,一個(gè)好的架構(gòu)不僅在開發(fā)上有助于代碼的實(shí)現(xiàn),還能解決程序耦合的問(wèn)題;其次是沒有一個(gè)明確的設(shè)計(jì)方案,只是大致一想,就開始編碼,一邊編一邊想解決方案,導(dǎo)致了很深的函數(shù)調(diào)用,最終不易于調(diào)試與修改;再是自己在編碼的時(shí)候忘記了先編好輸出以便于一邊編一邊測(cè)試,導(dǎo)致了自己苦于編好了很多函數(shù)卻在測(cè)試時(shí)跳出了無(wú)數(shù)的bug,而且不易于修改,這個(gè)問(wèn)題老師很早在課堂上提到過(guò),要編幾行就進(jìn)行測(cè)試,而自己卻沒有注意,運(yùn)行的時(shí)候十分的后悔,過(guò)于復(fù)雜的程序?qū)е铝宋也恢绾稳バ薷?#xff1b;最后就是書到用時(shí)方恨少,對(duì)于文件遍歷的問(wèn)題自己將近花費(fèi)了五分之一的時(shí)間,就是由于自己對(duì)于這個(gè)方面了解的太少,只能臨時(shí)抱佛腳,還有本來(lái)可以用C++的一些類就可以很容易解決的問(wèn)題,只能自己利用C語(yǔ)言復(fù)雜的進(jìn)行編寫,例如同學(xué)使用了一個(gè)C++中map的類就可以解決存儲(chǔ)的問(wèn)題,自己感覺用的方法都很“蠢”,不夠靈活。

在這次個(gè)人作業(yè)中,我深深地感受到了自己在編碼方面的嚴(yán)重不足,不僅是對(duì)于各個(gè)語(yǔ)言的理解,還有是對(duì)于它們的靈活運(yùn)用,由于自己知識(shí)儲(chǔ)備的嚴(yán)重不足,遇到問(wèn)題都無(wú)法及時(shí)給出一個(gè)合適的解決方案,需要一個(gè)個(gè)去百度,甚至是去從頭去看書,在這個(gè)地方花費(fèi)的時(shí)間將近有四分之一,導(dǎo)致了自己的思路不夠流暢,所以要加強(qiáng)自己對(duì)于編程書的閱讀,不能再拘泥于老師布置的任務(wù),從現(xiàn)在開始要學(xué)習(xí)C++等更加便捷的語(yǔ)言,還有以后在編程之前要進(jìn)行一次對(duì)于設(shè)計(jì)的思考,等到自己感覺設(shè)計(jì)已經(jīng)明確并且可行時(shí),再進(jìn)行編碼,還有就是要注意好每一個(gè)細(xì)節(jié),盡量在編碼的時(shí)候就最好注意到,最后也是我印象最深刻的就是隨時(shí)編碼隨時(shí)測(cè)試,多寫注釋,避免遺忘。綜上所述,簡(jiǎn)言之就是“無(wú)他,唯手熟爾”,以后自己要多思考、多編程。

?

轉(zhuǎn)載于:https://www.cnblogs.com/Whydd/p/8678068.html

總結(jié)

以上是生活随笔為你收集整理的第一次工作报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。