GitHub地址 | 結隊GitHub |
---|---|
本人學號 | 201831061216 |
夥伴學號 | 201831061217 |
夥伴博客地址 | 地址 |
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 60 | 40 |
Estimate | 估計這個任務須要多少時間 | 半周 | 3天 |
Development | 開發 | 500 | 700 |
Analysis | 需求分析 (包括學習新技術) | 200 | 400 |
Design Spec | 生成設計文檔 | 30 | 20 |
Design Review | 設計複審 (和同事審覈設計文檔) | 120 | 150 |
Coding Standard | 代碼規範 (爲目前的開發制定合適的規範) | 30 | 40 |
Design | 具體設計 | 60 | 40 |
Coding | 具體編碼 | 600 | 900 |
Code Review | 代碼複審 | 120 | 120 |
Test | 測試(自我測試,修改代碼,提交修改) | 120 | 120 |
Reporting | 報告 | 180 | 250 |
Test Report | 測試報告 | 60 | 40 |
Size Measurement | 計算工做量 | 20 | 5 |
Postmortem & Process Improvement Plan | 過後總結, 並提出過程改進計劃 | 60 | 40 |
合計 | 2160 | 3天 |
總體代碼使用5個函數實現的,其中四功能函數,一個工具函數經過-i -o -u -e 命令來調用已經封裝好的四個功能函數。
html
def My_chars_count(file_name): #用來統計文本文件裏面的字符數量 with open(file_name,'r') as f: chars=f.read() f.close() return 'chars:'+str(len(chars))
def My_words_count(file_name): #用來統計文本文件裏面的單詞數量規定4個字母以上的單詞 words=[] word=0 with open(file_name,'r') as f: lines=f.readlines() for N in range(0,len(lines)): #正則表達式把符合條件的單詞篩選出來 words.extend(re.findall(r'[(a-z|A-Z)(a-z|A-Z)(a-z|A-Z)(a-z|A-Z)]{4,}',lines[N])) word+=len(words) f.close() return "words:"+str(word)
def My_lines_count(file_name): #用來統計文本文件裏面的行數 line_num=0 with open(file_name,'r') as f: lines=f.readlines() for each_line in lines: if each_line!='\n': line_num+=1 f.close() return "lines:"+str(line_num)
def word_count(file_name): #記錄文本中單詞出現的頻率,而且按照出現頻率打印出來 #words列表存放有重複的單詞 words=[] with open(file_name,'r') as f: lines=f.readlines() for N in range(0,len(lines)): words.extend(re.findall(r'[(a-z|A-Z)(a-z|A-Z)(a-z|A-Z)(a-z|A-Z)]{4,}',lines[N])) #利用了python字典的特性dict{key:value},字典裏面映射關係不會出現鍵key的重複 #建立一個字典存放單詞和其頻率 wokey={} #用有重複單詞的列表來給字典賦值,而在字典中就不會用重複了可是key對應的value的值沒有變的 wokey=wokey.fromkeys(words) #新定義一個單詞列表來存放無重複的單詞 wordlist=list(wokey.keys()) for i in wordlist: #獲得無重複的詞頻 wokey[i]=words.count(i) wokey_1={} wokey_1=sorted(wokey.items(),key=lambda p:p[1],reverse=1) i=0 for x,y in wokey_1: if i<10: print('%s’s frequence: %d'%(x,y)) i+=1 continue else: break f.close()
在第三步中,咱們但願各位在第一步的基礎上,添加一些新的功能:python
a) 詞組統計:能統計文件夾中指定長度的詞組的詞頻
思路:由於可使用正則表達式這個問題變的十分簡單了,
r'[(a-z|A-Z)(a-z|A-Z)(a-z|A-Z)(a-z|A-Z)]{3},意思是在篩選前3個字符都是符合a-Z的單詞,而後咱們對於符合條件的單詞進行計數。git
def My_dgtwords_count(file_name): #用來統計文本文件裏面的指定單詞長度詞組詞的數量,這裏是3個長度的詞組 words=[] word=0 with open(file_name,'r') as f: lines=f.readlines() for N in range(0,len(lines)): words.extend(re.findall(r'[(a-z|A-Z)]{3}',lines[N])) word+=len(words) f.close() return "designatewords:"+str(word)
實現使用輸入的 -i-u-d-o-e 和文件名 獲得指望值的功能,這裏寫函數的時候很是蠢。。。咱們沒有特別好的方法就是手打各類輸入方式而後調用對應函數。缺陷就是不能實現調換輸入順序和同時讀取兩個文檔。github
def My_cmd(): command,file_name=input("Please input command").split() if command=='-i': #記錄字符的數量 print(My_chars_count(file_name)) if command=='-d': #記錄字符的數量 print(My_dgtwords_count(file_name)) if command=='-o': #記錄符合條件單詞的數量 print(My_words_count(file_name)) if command=='-u': #記錄有效行數 print(My_lines_count(file_name)) if command=='-e': #記錄詞頻 print(word_count(file_name)) if command=='-i-o': #記錄字符的數量,記錄符合條件單詞的數量 print(My_chars_count(file_name)) print(My_words_count(file_name)) if command=='-i-u': #記錄字符的數量,記錄有效行數 print(My_chars_count(file_name)) print(My_lines_count(file_name)) if command=='-i-e': #記錄字符的數量,#記錄詞頻 print(My_chars_count(file_name)) print(word_count(file_name)) if command=='-i-o-u': #記錄字符的數量,記錄符合條件單詞的數量,記錄有效行數 print(My_chars_count(file_name)) print(My_words_count(file_name)) print(My_lines_count(file_name)) if command=='-i-o-u-e': #記錄字符的數量記錄符合條件單詞的數量,記錄有效行數,記錄詞頻 print(My_chars_count(file_name)) print(My_words_count(file_name)) print(My_lines_count(file_name)) print(word_count(file_name)) if command=='-i-o-e': #記錄字符的數量記錄符合條件單詞的數量,記錄詞頻 print(My_chars_count(file_name)) print(My_words_count(file_name)) print(word_count(file_name)) if command=='-o-u': #記錄符合條件單詞的數量,有效行數 print(My_words_count(file_name)) print(My_lines_count(file_name)) if command=='-o-e': #記錄符合條件單詞的數量和詞頻 print(My_chars_count(file_name)) if command=='-u-e': #記錄有效行數和詞頻 print(My_lines_count(file_name)) print(word_count(file_name)) My_cmd()
多個功能一塊兒實現:
正則表達式
(1)代碼符合需求和規格說明麼?
符合。
(2)代碼設計是否考慮周全?
是
(3)代碼可讀性如何?
簡單易懂。
(4)有冗餘的或重複的代碼嗎?
開始有冗餘但後面在兩人協商後由一人改編後沒有冗餘了。
(5)代碼的每一行都執行並檢查過了嗎?
執行並逐行檢查過。算法
(1)設計是否聽從已知的設計模式或項目中經常使用的模式?
遵照。
(2)有沒有無用的代碼能夠清除?
沒有。編程
基本符合代碼標準和風格,代碼可讀性高。設計模式
數據結構中有沒有用不到的元素?
沒有數據結構
代碼的效能如何?
效能很高。ide
可讀性比較高,註釋很詳細。
進行了單元測試
通過此次的代碼複審,我認識到了代碼複審能夠找出代碼的錯誤,以及發現邏輯和算法的出錯,甚至還可能發現潛在的錯誤,這些能讓咱們互相在代碼複審中互有補益,可以更加開拓咱們對編程的理解和認識。 |
經過性能分析主要的時間用在了input上面,挺尷尬的。 咱們兩個進行討論但願能能夠改變一些,可是經過了調整函數並未實現。這或許是因爲咱們如今所學知識還有限,同時也提醒咱們後面還須要增長咱們代碼量和一些實踐經驗。 |
使用python測試模塊uinttest進行測試,代碼比較測試結果與預計同樣。 |
在測試過程當中我發現當文本文件裏面出現了漢字和一些中文符號後會報錯 |
讀取方式改爲二進制讀取方式就能夠了。 |
改回原來的讀取方式後,又出現原來的方式,咱們通過一番努力之後並無解決這個問題,以後再網上覆制粘貼來的文本都會有這樣的問題因此這也是咱們在代碼測試複審中發現的缺陷。 |
代碼模塊上,因爲第一次做業時就劃分好了模塊,以及對於多個函數的規劃和安排都比較清晰,因此在添加新功能時,沒有在大的代碼模塊上出現問題。結對時,咱們遇到的困難主要仍是在複雜字符串進行操做的算法上。在結對項目的開展初期,咱們是在宿舍進行討論的;咱們在宿舍進行需求分析,而後搜索相對應的資料,各自也在進行進度的標記,控制項目的進程。在聊完了各自已經作完的工做以後,我倆一塊兒探討了當時未解決的問題,咱們主要聊了下複雜字符串進行操做,開始這個問題對咱們確實很棘手,搞得咱們也煩躁,但在後期的討論中咱們煩躁的心情獲得緩解,而後咱們將咱們所遇的問題進行了整理,緊接着咱們經過上網查找這個問題的解決方法,功夫不負有心人咱們找到了正則表達式來解決這個問題,正則表達式的大體匹配過程是:依次拿出表達式和文本中的字符比較,若是每個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。咱們使用正則表達式中的findall(findall 的簡單用法:返回string中全部與pattern相匹配的所有字串,返回形式爲列表)。結對編程真的很棒,在相互的合做中可以給本身帶來不少全新的認識。能夠對代碼結構進一步的優化,產生新的idea等等。 |
from tkinter import * # 導入ttk from tkinter import ttk # 導入simpledialog from tkinter import simpledialog class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): # 建立3個按鈕,併爲之綁定事件處理函數 ttk.Button(self.master, text='導入單詞文本文件', command=self.open_string # 綁定open_integer方法 ).pack(side=LEFT, ipadx=5, ipady=5, padx= 10) ttk.Button(self.master, text='輸入字符串對話框', command=self.open_string1 # 綁定open_integer方法 ).pack(side=LEFT, ipadx=5, ipady=5, padx= 10) def open_string(self): # 調用askstring函數生成一個讓用戶輸入字符串的對話框 print(simpledialog.askstring("導入單詞文本文件", "輸入–i–e–u–d", initialvalue='-i')) def open_string1(self): # 調用askstring函數生成一個讓用戶輸入字符串的對話框 print(simpledialog.askstring("輸入字符串對話框", "輸入–i–e–u–d", initialvalue='-m')) root = Tk() root.title("wordcount") App(root) root.mainloop()
開始看到這題目的時候確實很傷腦筋,題目中的用戶交互界面對如今的咱們來講仍是比較生疏,由於以前沒怎麼以前沒有用Python作過用戶交互界面,對於用戶交互界面繪製咱們兩個商量了好久,咱們當時查閱了不少資料網上看了很多視頻最後終於作出如今的界面,由於時間緣由咱們只能完成這麼多,雖然如今作的還不是很完美可是在後期的學習中咱們會越作越好更上一層樓的。 而且咱們在此次做業對於GUI設計充滿興趣。 |
實際操做的時候,分工跟預想的並不徹底同樣,咱們首先討論出了具體的算法,那些算法改進的話程序效率提升的最多。隨後算法的主要代碼是咱們共同完成的。總的來說,經過這個過程,仍是學到了不少,隊友就像一面鏡子,咱們互相學習互相進步,體驗到了1+1>2。 |