<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      歡迎來到fujiangfer的博客

      黃師塔前江水東,春光懶困倚微風(fēng)。 桃花一簇開無主,可愛深紅愛淺紅。
      擴(kuò)大
      縮小

      軟工實(shí)踐寒假作業(yè)(2/2)

      作業(yè)基本信息

      這個作業(yè)屬于哪個課程 <2021春軟件工程實(shí)踐S班>
      這個作業(yè)要求在哪里 <軟工實(shí)踐寒假作業(yè)(2/2)>
      這個作業(yè)的目標(biāo) <提問、詞頻統(tǒng)計>
      其他參考文獻(xiàn) ...

      目錄:

      1. 閱讀《構(gòu)建之法》并提問
      2. 完成詞頻統(tǒng)計個人作業(yè)

      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
      ...
      

      目錄:

      1. PSP表格
      2. 解題思路描述
      3. 代碼風(fēng)格
      4. 計算模塊接口的設(shè)計與實(shí)現(xiàn)過程
      5. 計算模塊接口部分的性能改進(jìn)
      6. 計算模塊部分單元測試展示
      7. 計算模塊部分異常處理說明
      8. 心路歷程與收獲

      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ù)

      1. 將文件路徑作為字符串參數(shù)傳遞
      2. 字符計算函數(shù)將讀入每一個字符并統(tǒng)計數(shù)量,返回值為字符數(shù)。
      3. 行數(shù)計算函數(shù)將讀入每一個字符以'\r''\n'為界分隔行,并且檢測空行忽略,返回值為行數(shù)。
      4. 單詞計算也是讀入每一個字符,檢測是否符合單詞規(guī)則,并且存下,返回值為單詞總數(shù)。
      5. 保存單詞函數(shù)會將單詞存下,無返回值。
      6. 單詞排序函數(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;
              }
          }
      
      1. 一個個字符讀入,強(qiáng)制讀入空白
      2. 同時記下是否有非空的合法字符
      3. 但遇到'\n'時進(jìn)行判斷,不為空行則行數(shù)加一,標(biāo)志位重置。
      4. 返回行數(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);
          }
      
      1. 逐個讀取字符,若為大寫則換為小寫。
      2. 連續(xù)4個字母,記下為單詞,單詞數(shù)加1。
      3. 若為單詞則繼續(xù)保存字符,直到下一個分隔符。
      4. 遇到分隔符,檢測當(dāng)前存儲是否為單詞,若是則存下。
      5. 因為最后一個單詞可能碰不到分隔符,就額外判斷一次。

      簡單粗暴,還是一個個讀取字符,碰到連續(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ú)一行。

      posted @ 2021-03-02 20:31  fujiangfer  閱讀(228)  評論(7)    收藏  舉報
      主站蜘蛛池模板: 国产AV福利第一精品| 亚洲最大av一区二区| 狠狠干| 国产一区二区不卡91| 年轻女教师hd中字3| 免费看国产精品3a黄的视频| 欧美日韩国产码高清| 亚洲精品一区二区三区色| 中文人妻av高清一区二区| 中文字幕久久国产精品| 国产精品嫩草99av在线| 在线免费不卡视频| 欧美精品国产综合久久| 免费A级毛片无码A∨蜜芽试看 | 国产黄色三级三级看三级| 婷婷久久香蕉五月综合加勒比 | 337p粉嫩大胆色噜噜噜| 国产超碰人人爽人人做人人添| 国产乱码一区二区三区| 精品国产熟女一区二区三区| 精品日韩人妻中文字幕| 免费无码一区无码东京热| 成人永久性免费在线视频| 在线日韩日本国产亚洲| 亚洲爆乳WWW无码专区| 国产免费丝袜调教视频| 久久久久人妻精品一区三寸| 国内视频偷拍久久伊人网| 国产女人18毛片水真多1| 精品熟女日韩中文十区| 国内精品自国内精品自久久| 国内少妇偷人精品视频| 欧美日产国产精品| 无码福利写真片视频在线播放| 桂东县| 午夜精品福利亚洲国产| 午夜福利片1000无码免费| 积石山| 永久免费无码av在线网站| 亚洲精品成人久久久| 新巴尔虎右旗|