軟工實(shí)踐寒假作業(yè)(2/2)
作業(yè)基本信息
| 這個作業(yè)屬于哪個課程 | <2021春軟件工程實(shí)踐S班> |
|---|---|
| 這個作業(yè)要求在哪里 | <軟工實(shí)踐寒假作業(yè)(2/2)> |
| 這個作業(yè)的目標(biāo) | <提問、詞頻統(tǒng)計> |
| 其他參考文獻(xiàn) | ... |
目錄:
Github:https://github.com/fujiangfer/PersonalProject-C
1. 閱讀《構(gòu)建之法》并提問
一、在3.1中提到了關(guān)于團(tuán)隊對個人的期望
大多數(shù)工程師都在團(tuán)隊的環(huán)境中工作,怎么樣才是一個合格,甚至優(yōu)秀的隊員呢?前面提到了PSP ( Personal Software Process ),和它對應(yīng)的有團(tuán)隊的軟件流程TSP ( Team SoftwareProcess ),TSP對團(tuán)隊成員也有要求:
1.交流:能有效地和其他隊員交流,從大的技術(shù)方向,到看似微小的問題。
2.說到做到:就像上面說的“按時交付”。
3.接受團(tuán)隊賦予的角色并按角色要求工作:團(tuán)隊要完成任務(wù),有很多事情要做,是否能接受不同的任務(wù)并高質(zhì)量完成?
4.全力投入團(tuán)隊的活動:就像一些評審會議,代碼復(fù)審,都要全力以赴地參加,而不是游離于團(tuán)隊之外。
5.按照團(tuán)隊流程的要求工作:團(tuán)隊有自己的流程(見“團(tuán)隊和流程”一章),個人的能力即使很強(qiáng),也要按照團(tuán)隊制定的流程工作,而不要認(rèn)為自己不受流程約束。
6.準(zhǔn)備:在開會討論之前,開始一個新功能之前,一個新項目之前,都要做好準(zhǔn)備工作。
7.理性地工作:軟件開發(fā)有很多個人的、感情驅(qū)動的因素,但是一個成熟的團(tuán)隊
成員必須從事實(shí)和數(shù)據(jù)出發(fā),按照流程,理性地工作。很多人認(rèn)為自己需要靈感和激情,才能為宏大的目標(biāo)奮斗,才能成為專業(yè)人士。著名的藝術(shù)家Chuck Close 說:我總覺得靈感是屬于業(yè)余愛好者的。我們職業(yè)人士只是每天持續(xù)工作。今天你繼續(xù)昨天的工作,明天你繼續(xù)今天的工作,最終你會有所成就。
那個人應(yīng)該對團(tuán)隊有期望嗎?還是說應(yīng)該如何選擇適合自己的團(tuán)隊?
總的來說有以下幾個:
選擇一個好的上級,好的要求,團(tuán)隊才能帶領(lǐng)你把項目做好,所以選擇領(lǐng)頭人很重要.
多看幾家團(tuán)隊,縱向橫向都比較下,自己選擇一個好的,團(tuán)隊真的很重要.
1.團(tuán)隊的價值觀是否認(rèn)同
2.領(lǐng)導(dǎo)的能力
3.領(lǐng)導(dǎo)的處事作風(fēng)是否認(rèn)同
4.整個團(tuán)隊的風(fēng)氣是不是積極向上,要是死氣沉沉的就不用考慮了
5.隊員之間的相處
6.加入己有沒有發(fā)展、提升起碼要有所進(jìn)步
7.公司對團(tuán)隊的態(tài)度
看了網(wǎng)上的些回答,我就感覺,好像領(lǐng)導(dǎo)者,領(lǐng)頭人或者說團(tuán)隊的管理者非常重要,甚至是起決定性作用,我認(rèn)為除了對領(lǐng)導(dǎo)者個人的要求外的幾點(diǎn),像是團(tuán)隊價值觀、
團(tuán)隊風(fēng)氣、這些似乎也和領(lǐng)導(dǎo)者有很大關(guān)系。就好像我們不是在選團(tuán)隊,而是在選領(lǐng)導(dǎo),或者說選團(tuán)隊本質(zhì)就是選領(lǐng)導(dǎo)?
二、關(guān)于書中4.3.2提到goto
函數(shù)最好有單一的出口,為了達(dá)到這一目的,可以使用goto。只要有助于程序邏輯的清晰體現(xiàn),什么方法都可以使用,包括goto
實(shí)際應(yīng)用中,goto究竟適不適用?團(tuán)隊會不會對這方面有所要求?
goto似乎一直以來爭議很大,像我們以前學(xué)C的時候老師就要我們盡量別用,有人認(rèn)為只要清晰可讀都能用,覺得非常的方便。
嚴(yán)格來說goto不是不能用,不過一般用于出錯處理部分,如果你代碼用goto能非常簡潔且不會有任何問題的確可以用
我發(fā)現(xiàn)goto在很多場合都很有用,比如跳出多重循環(huán)等.
極端反對的人,像這個:
忘記goto吧。。。那是面向過程的東西。?,F(xiàn)代編程,基本全是面向?qū)ο蟮?。goto會使一個嚴(yán)謹(jǐn)?shù)某绦?,變成一坨翔。除非你想做的是個BUG或病毒。
否則你的工作中,可能一輩子也不會用到goto
似乎更多的認(rèn)為應(yīng)該慎用
goto這個無條件的轉(zhuǎn)移目標(biāo),以前是很多爭議的,就算是現(xiàn)今也是爭議很多.很多大神說不能用是因為(不是完全不能用是盡量不要用),
你沒事跳來跳去你會搞的整個程序只有你自己看的懂,(你跳二十次之后你自己也看不懂).基本上不推廣goto這無條件轉(zhuǎn)移(但是是可以用的).
if & goto這兩個可以一起用但盡量是少用(等你調(diào)試就知道有多無言)
goto可以用,為什么不可以用呢。只是能不用的時候就不要用,能用其他辦法解決跳轉(zhuǎn)的就不用goto,goto只是在迫不得已的是否才用,并且不能多用。
goto是慎用而不是不能用
我的想法也是盡量不用,但是以前圖方便也會用,像書上給的例子,也可以用一個符號位解決,而避免用goto。就是不知道工作中對這個有沒有強(qiáng)制要求之類東西。
三、書中6.3關(guān)于敏捷的團(tuán)隊
敏捷對團(tuán)隊的要求很簡單:自主管理( Self-managing )、自我組織(Self-organizing )、多功能型(Cross-functional ),但是這很難做到。
軟件項目的團(tuán)隊各式各樣(請看“團(tuán)隊和流程”一章),假設(shè)一個團(tuán)隊做得還不錯,現(xiàn)在要變成敏捷流程,那團(tuán)隊要做下面的改變:1.自主管理:以前領(lǐng)導(dǎo)布置了任務(wù),我們實(shí)現(xiàn)就可以了,現(xiàn)在要自己挑選任務(wù);每次
Sprint結(jié)束之后,還要總結(jié)不足,提出改進(jìn),并且自己要實(shí)施這些改進(jìn)?!白灾鞴芾怼辈坏扔凇皼]有管理”。
2.自我組織:以前做好自己的事情就好了,安心下班。現(xiàn)在每個人要聯(lián)合起來對項目負(fù)責(zé),有人工作落后了還要幫助他改進(jìn),項目缺少某類資源還要自己頂上去。
3.多功能型:以前規(guī)格說明書由PM來寫,測試由測試人員來做,現(xiàn)在每個人都全面負(fù)責(zé),自己搞定規(guī)格說明書,和別人溝通,同時自己搞定測試。
這里提到了每個人要聯(lián)合起來對項目負(fù)責(zé),落后還要幫忙改進(jìn)。但是書中也提到過我們在團(tuán)隊中要各司其職,如7.2.4。這沖突嗎?
我覺得這應(yīng)該是不沖突的,因為就是是各司其職也同樣對項目共同負(fù)責(zé),在敏捷的團(tuán)隊中也有任務(wù)的分配。但如果項目出問題了,普通
情況下肯定是由負(fù)責(zé)這部分任務(wù)的人負(fù)責(zé),但在敏捷的團(tuán)隊中,也一樣嗎?不是說每個人都全面負(fù)責(zé),有人工作落后了還要幫助他改進(jìn)嗎。
我感覺我有點(diǎn)混亂。
四、在12.1.3中提到的了
長期使用之后,軟件會更好用么?
在設(shè)計軟件界面時,我們的設(shè)計師經(jīng)常會畫新功能的UI設(shè)計圖,來征求大家的意見。我注意到大部分設(shè)計都假設(shè)用戶是頭一次使用產(chǎn)品,
所以沒有任何積累的文件、照片、處理過的圖像、曾經(jīng)做過的選擇等數(shù)據(jù)。我同意第一印象很重要,但是當(dāng)用戶已經(jīng)是第N次使用你的產(chǎn)品時,你的UI能否為這些用戶提供方便呢?你的產(chǎn)品是下面的哪一種:a.軟件用得越多,一樣難用
b.軟件用得越多,越發(fā)難用
c.軟件用得越多,越來越好用
軟件是否好用和硬件也是相關(guān)的,但硬件發(fā)展很快(摩爾定律),所以軟件開發(fā)的時候也要考慮硬件。
這abc三種情況是可能同時出現(xiàn)的,那么開發(fā)者如何把握軟件功能的提升和對硬件的要求提升的平衡?
同一款軟件不斷更新,可能有人會覺得越來越好用,因為他的硬件性能強(qiáng)大,有人覺得越發(fā)難用,因為他可能用的是好幾年前的機(jī)器。
拿手機(jī)來說,app的大小增長簡直太可怕,幾年前還是十幾M或者幾十M,現(xiàn)在動輒幾G,有些應(yīng)用因太大被用戶暫時拋棄。
我覺得軟件提升前要考慮當(dāng)前設(shè)備的持有分布,把握好用戶群體分布,利益最大化;
極端假設(shè):社會上所有人都很有錢,設(shè)備一直保持最新款,那軟件的提升就只需要考慮軟件本身的功能性能了,完全不用考慮用戶的硬件是否支持,因為用戶的硬件一直是最好的。
五、書中16.3.0提到的改良式創(chuàng)新(Incremental Innovation)和顛覆式創(chuàng)新(Disruptive Innovation)
提到了個故事:
雅卡爾( Joseph Marie Jacquard ) 1752年出生于里昂,一成年便在絲綢工坊打工,并且很快成為一個有創(chuàng)意的、技藝嫻熟的工匠。
他的改革計劃在法國大革命期間多次中斷,但1805年一大批改革后改進(jìn)后的半自動織機(jī)最終在法國運(yùn)轉(zhuǎn)了起來。
新織機(jī)不但縮短了產(chǎn)品的成型時間,更重要的是減輕了勞動量,減少了工作人數(shù)。這必然引起大批工人的恐慌和隨之而來的抵制及破壞,
因為使用雅卡爾織布機(jī)后,原來需要六名工人完成的工作現(xiàn)在只需一名,這就意味著大批工人的失業(yè)。雅卡爾多次受到人身攻擊,甚至有人對他以死相逼,
更嚴(yán)重的是,工坊里的新型織機(jī)不斷被損壞和焚燒。盡管如此,革新的成果還是迅速遍及全國。1812年,整個法國已裝置了一萬一干多臺雅卡爾自動織布機(jī)。
顛覆式創(chuàng)新的影響這么大,會不會對這種創(chuàng)新起到致命影響?比如因人身攻擊之類被迫停止。有沒有辦法減小影響的同時改變社會?
查閱資料:
一旦顛覆性創(chuàng)新出現(xiàn)(它是市場上現(xiàn)有產(chǎn)品更為便宜、更為方便的替代品,它直接鎖定低端消費(fèi)者或者產(chǎn)生全然一新的消費(fèi)群體),現(xiàn)有企業(yè)便立馬癱瘓。
為此,他們采取的應(yīng)對措施往往是轉(zhuǎn)向高端市場,而不是積極防御這些新技術(shù)、固守低端市場,然而,顛覆性創(chuàng)新不斷發(fā)展進(jìn)步,
一步步蠶食傳統(tǒng)企業(yè)的市場份額,最終取代傳統(tǒng)產(chǎn)品的統(tǒng)治地位。
我也認(rèn)為蠶食是個好辦法,可以有效的減少沖突,但是需要付出時間代價;但是要是能更快的帶來變革,也一定有積極的影響吧。至于會不會對創(chuàng)新起到致命影響,
如果那么容易被擊敗,也就不能稱得上顛覆式創(chuàng)新了吧,我認(rèn)為影響最多就是蟄伏一些時間,當(dāng)然時間也可能很長。
小知識
打開搜索引擎,搜索“軟件開發(fā)教父”,你會搜到一個叫Martin Fowler的人。
2001年2月,Martin Fowler,Jim Highsmith等17位著名的軟件開發(fā)專家齊聚在美國猶他州雪鳥滑雪圣地,
舉行了一次敏捷方法發(fā)起者和實(shí)踐者的聚會。在這次會議上面,他們正式提出了Agile(敏捷開發(fā))這個概念,并共同簽署了《敏捷宣言》。
沒錯就是他。他被公認(rèn)為全球知名的面向?qū)ο蠓治鲈O(shè)計、UML、模式等方面的專家,現(xiàn)在還擔(dān)任ThoughtWorks公司的首席科學(xué)家。
但是仔細(xì)一看,你會發(fā)現(xiàn),他的職業(yè)寫的居然是演說家。百度百科介紹:馬丁·福勒是一個軟件開發(fā)方面的著作者和國際知名演說家,專注于面向?qū)ο蠓治雠c設(shè)計,
統(tǒng)一建模語言,領(lǐng)域建模,以及敏捷軟件開發(fā)方法,包括極限編程。
這有一篇他采訪“我是一個幸運(yùn)的家伙”。真的不愧是演說家。
里面提到對程序員的建議
對全世界的程序員我都是那么幾條建議。
第一,每年學(xué)習(xí)并熟悉一個新的編程語言。堅持幾年,你對于程序設(shè)計會有非常深刻的見解。
第二,學(xué)習(xí)測試驅(qū)動開發(fā),這種新的方法會改變你對于軟件開發(fā)的看法。
第三,勞逸結(jié)合,不要總是繃得緊緊的,爬爬山,跳跳舞,經(jīng)常放松神經(jīng),你會發(fā)現(xiàn)你更有活力和創(chuàng)造力。我的一些最好的想法就是在山頂上萌發(fā)的。
2. 完成詞頻統(tǒng)計個人作業(yè)
題目要求:
假設(shè)有一個軟件每隔一小段時間會記錄一次用戶的搜索記錄,記錄為英文。
輸入文件和輸出文件以命令行參數(shù)傳入。例如我們在命令行窗口(cmd)中輸入:
//C語言類
WordCount.exe input.txt output.txt
//Java語言
java WordCount input.txt output.txt
則會統(tǒng)計input.txt中的以下幾個指標(biāo)
統(tǒng)計文件的字符數(shù)(對應(yīng)輸出第一行):
只需要統(tǒng)計Ascii碼,漢字不需考慮
空格,水平制表符,換行符,均算字符
統(tǒng)計文件的單詞總數(shù)(對應(yīng)輸出第二行),單詞:至少以4個英文字母開頭,跟上字母數(shù)字符號,單詞以分隔符分割,不區(qū)分大小寫。
英文字母: A-Z,a-z
字母數(shù)字符號:A-Z, a-z,0-9
分割符:空格,非字母數(shù)字符號
例:file123是一個單詞, 123file不是一個單詞。file,F(xiàn)ile和FILE是同一個單詞
統(tǒng)計文件的有效行數(shù)(對應(yīng)輸出第三行):任何包含非空白字符的行,都需要統(tǒng)計。
統(tǒng)計文件中各單詞的出現(xiàn)次數(shù)(對應(yīng)輸出接下來10行),最終只輸出頻率最高的10個。
頻率相同的單詞,優(yōu)先輸出字典序靠前的單詞。
例如,windows95,windows98和windows2000同時出現(xiàn)時,則先輸出windows2000
輸出的單詞統(tǒng)一為小寫格式
然后將統(tǒng)計結(jié)果輸出到output.txt,輸出的格式如下;其中word1和word2 對應(yīng)具體的單詞,number為統(tǒng)計出的個數(shù);換行使用'\n',編碼統(tǒng)一使用UTF-8。
characters: number
words: number
lines: number
word1: number
word2: number
...
目錄:
- PSP表格
- 解題思路描述
- 代碼風(fēng)格
- 計算模塊接口的設(shè)計與實(shí)現(xiàn)過程
- 計算模塊接口部分的性能改進(jìn)
- 計算模塊部分單元測試展示
- 計算模塊部分異常處理說明
- 心路歷程與收獲
1. PSP表格
| PSP2.1 | Personal Software Process Stages | 預(yù)估耗時(分鐘) | 實(shí)際耗時(分鐘) |
|---|---|---|---|
| Planning | 計劃 | ||
| ? Estimate | ? 估計這個任務(wù)需要多少時間 | 10 | 20 |
| Development | 開發(fā) | ||
| ? Analysis | ? 需求分析 (包括學(xué)習(xí)新技術(shù)) | 180 | 360 |
| ? Design Spec | ? 生成設(shè)計文檔 | 30 | 20 |
| ? Design Review | ? 設(shè)計復(fù)審 | 20 | 10 |
| ? Coding Standard | ? 代碼規(guī)范 (為目前的開發(fā)制定合適的規(guī)范) | 20 | 10 |
| ? Design | ? 具體設(shè)計 | 60 | 100 |
| ? Coding | ? 具體編碼 | 360 | 800 |
| ? Code Review | ? 代碼復(fù)審 | 120 | 180 |
| ? Test | ? 測試(自我測試,修改代碼,提交修改) | 120 | 360 |
| Reporting | 報告 | ||
| ? Test Repor | ? 測試報告 | 180 | 200 |
| ? Size Measurement | ? 計算工作量 | 30 | 20 |
| ? Postmortem & Process Improvement Plan | ? 事后總結(jié), 并提出過程改進(jìn)計劃 | 30 | 30 |
| 合計 | 1160 | 2110 |
2. 解題思路描述

具體的函數(shù)
- 將文件路徑作為字符串參數(shù)傳遞
- 字符計算函數(shù)將讀入每一個字符并統(tǒng)計數(shù)量,返回值為字符數(shù)。
- 行數(shù)計算函數(shù)將讀入每一個字符以'\r''\n'為界分隔行,并且檢測空行忽略,返回值為行數(shù)。
- 單詞計算也是讀入每一個字符,檢測是否符合單詞規(guī)則,并且存下,返回值為單詞總數(shù)。
- 保存單詞函數(shù)會將單詞存下,無返回值。
- 單詞排序函數(shù)會將存下的單詞按規(guī)則排序并返回結(jié)構(gòu)數(shù)組。
3. 代碼風(fēng)格
https://github.com/fujiangfer/PersonalProject-C/blob/main/221801131/example/codestyle.md
4. 計算模塊接口的設(shè)計與實(shí)現(xiàn)過程
(1)字符計算
char code;
int num = 0;
infile >> noskipws;//強(qiáng)制讀入空格和換行符
while (!infile.eof())
{
infile >> code;
if (infile.eof())
break; //防止最后一個字符輸出兩次
num++;
}
這里其實(shí)也進(jìn)行了多次更改,一開始覺得沒什么問題,結(jié)果老出這樣那樣的問題。'\r'讀不出來也折騰了好久,原來用二進(jìn)制讀就能讀到了。算法其實(shí)沒什么好說的,
就是一個個讀罷了。
(2)行數(shù)計算
char code;
bool flag = false;
int num = 0;
infile >> noskipws;
while (!infile.eof()) {
while(infile >> code) {
if (code >= 0 && code <= 127) {
if (!isspace(code))
flag = true; //標(biāo)志是否空行
}
if (code == '\n') //讀完一行,跳出循環(huán)
break;
}
if (flag){
num++;
flag = false;
}
}
- 一個個字符讀入,強(qiáng)制讀入空白
- 同時記下是否有非空的合法字符
- 但遇到'\n'時進(jìn)行判斷,不為空行則行數(shù)加一,標(biāo)志位重置。
- 返回行數(shù)
采用一個個字符讀取的方法,讀到'\n'時算一行,同時設(shè)置一個標(biāo)志位來算空行,只有那一行有非空ASCII字符才會計數(shù)一行。
--------原來'\r'不做換行(其實(shí)原來就沒考慮)。沒有注意要求文檔,謝謝助教提醒。
(3)單詞計算&保存&排序
char word;
char* str = new char[100]; //記錄單詞
bool flag = false;
bool isWords = false;
int charCount = 0;//記錄字母數(shù)
int num = 0;
word = infile.get();
while (true) {
if (word >= 'A' && word <= 'Z')word += 32;
if (flag)
{
if (!((word >= 'a' && word <= 'z') || (word >= '0' && word <= '9'))) { //確認(rèn)一個單詞后尋找下一個間隔符
if (isWords) {
str[charCount] = NULL;
safeWord(str);
}
memset(str, NULL, sizeof(str));
flag = false;
isWords = false;
charCount = 0;
}
else if (isWords) {
str[charCount++] = word;
}
}
else {
if (word >= 'a' && word <= 'z') { //判斷是否是字母
str[charCount++] = word;
if (charCount == 4) { //4個英文字母開頭時計一個單詞數(shù)并尋找下一個間隔符
num++;
flag = true;
isWords = true;
}
}
else { //沒有4個英文字母開頭則尋找下一個間隔符
flag = true;
continue;
}
}
if ((word = infile.get()) == EOF)break;
}
if (isWords) { //若最后一個為單詞則保存
str[charCount] = NULL;
safeWord(str);
}
- 逐個讀取字符,若為大寫則換為小寫。
- 連續(xù)4個字母,記下為單詞,單詞數(shù)加1。
- 若為單詞則繼續(xù)保存字符,直到下一個分隔符。
- 遇到分隔符,檢測當(dāng)前存儲是否為單詞,若是則存下。
- 因為最后一個單詞可能碰不到分隔符,就額外判斷一次。
簡單粗暴,還是一個個讀取字符,碰到連續(xù)四個字母開頭,分隔符間隔的單詞存入map中,保存函數(shù)如下:
void WordCount::safeWord(char* str) {
string word;
word = str;
map<string, int>::iterator iter = words.find(word);//找單詞
if (iter == words.end()) {
words.insert(pair<string, int>(word, 1));//沒找到單詞,插入單詞并設(shè)定次數(shù)為1
wordnum2++; //單詞個數(shù)+1
}
else {
iter->second++;//找到單詞,單詞出現(xiàn)次數(shù)增加
}
}
然后就是排序了,借用vector把map中的單詞排序,然后存入結(jié)構(gòu)數(shù)組中。
typedef pair<string, int> PAIR;
struct CmpByValue {
bool operator()(const PAIR& lhs, const PAIR& rhs) {
if (lhs.second == rhs.second) {//詞頻相同時
if (lhs.first.compare(rhs.first) > 0)return false;
else return true;
}
else return lhs.second > rhs.second;
}
};
void WordCount::wordsort() {
Words temp;
map<string, int>::iterator iter;
iter = words.begin();
vector<PAIR> vwords(words.begin(), words.end());
sort(vwords.begin(), vwords.end(), CmpByValue());
for (int i = 0; i != vwords.size(); ++i) {
wwords[i].word = vwords[i].first;
wwords[i].count = vwords[i].second;
}
}
類和結(jié)構(gòu)體的聲明
struct Words { //用于存放單詞及次數(shù)
string word;
int count;
};
class WordCount {
private:
int characternum;
int wordnum1; //單詞總數(shù)
int wordnum2; //單詞個數(shù)
int linenum;
map<string, int> words;//用于存放單詞及次數(shù)
Words* wwords;
public:
WordCount();
WordCount(char* Path);
int getcharacternum();
int getlinenum();
int getwordnum1();
int getwordnum2();
Words* getwords();
int charactersCount(char* Path);
int wordCount(char* Path);
int lineCount(char* Path);
void safeWord(char* str);
void wordsort();
};
5. 計算模塊接口部分的性能改進(jìn)
一開始單詞頻數(shù)的排序我用了簡單的冒泡
for (int i = 0; i < count; i++) { //冒泡排序
for (int j = 0; j < count - i - 1; j++) {
if (wwords[j].count < wwords[j + 1].count) {
temp = wwords[j];
wwords[j] = wwords[j + 1];
wwords[j + 1] = temp;
}
else if (wwords[j].count == wwords[j + 1].count) {
if (!wwords[j].word.compare(wwords[j + 1].word)) { //頻率相同的單詞,優(yōu)先輸出字典序靠前的單詞。
temp = wwords[j];
wwords[j] = wwords[j + 1];
wwords[j + 1] = temp;
}
}
}
}
然后跑了個大的文件,跑了1分多鐘,完全不行啊,然后就去查找資料,學(xué)習(xí)map怎么排序,結(jié)果在前面,就不再放一遍了。
總之就是速度提高了很多。
性能分析
同一個文本的檢測,文本不大,因為性能分析跑的太慢,還占空間,本來跑了大文本,報告幾十g,c盤都給它搞完

所以跑了這個不打的文本測試
改進(jìn)前

改進(jìn)后

明顯看出來時間的減少,和排序函數(shù)時間占比的下降
此外就是找單詞的函數(shù),可以用正則表達(dá)式完成,可以節(jié)省許多代碼,但我也有點(diǎn)亂,記不住,這就不寫了。
6. 計算模塊部分單元測試展示
選了一些數(shù)據(jù)進(jìn)行單元測試包括大文本、含有'\r'文本、空文本等等。因為題目要求說不考慮中文等,就沒做中文相關(guān)單元測試,但是寫代碼的時候考慮了中文之類的,大都正常通過了。

覆蓋率如下:

7. 計算模塊部分異常處理說明
做了文件打開失敗的提醒
if (!infile) {
cout << "文件打開失?。? << endl;
}
或者
if (!input) {
cout << "未輸入文件名或文件不存在" << endl;
return 0;
}
8. 心路歷程與收獲
其實(shí)就是比預(yù)想的難熬了些。本以為不是太難,然后同學(xué)發(fā)來一個大文本,炸了。修修補(bǔ)補(bǔ),與同學(xué)一比,擦,結(jié)果不一樣,還不知道誰錯。
只得把詞頻全印出來,沒毛病,他出問題了(>-<)。深夜12點(diǎn),另一位同學(xué)發(fā)來賀電,給我?guī)砹薥r的福報,好家伙,行數(shù)統(tǒng)計和字符統(tǒng)計
都炸了...淦,好吧找資料,修修補(bǔ)補(bǔ),搞完睡覺。
然后就是單元測試性能分析這些,真的是沒啥頭緒,就只能一遍查資料一邊慢慢搞定了。還有代碼風(fēng)格這事,
感覺編譯器會對我有挺大的影響...像vs會自動往運(yùn)算符兩邊加空格,但是修改的時候不會補(bǔ)上空格,有時候我也會忘記。還有就是{我其實(shí)不習(xí)慣重開一行,但是編譯器生成,
或者規(guī)范是會單獨(dú)一行。
-------------------------------------------
個性簽名:沒有
如果覺得這篇文章對你有小小的幫助的話,記得在右下角點(diǎn)個“推薦”哦,博主在此感謝!
萬水千山總是情,打賞一分行不行(っ??ω??)っ???!

浙公網(wǎng)安備 33010602011771號