結對編程

(1)Fork倉庫的Github項目地址。

GitHub地址 結隊GitHub
本人學號 201831061216
夥伴學號 201831061217
夥伴博客地址 地址

(2)psp表格

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天

(3) 計算模塊接口的設計與實現過程。

在這裏插入圖片描述

代碼分析

總體代碼使用5個函數實現的,其中四功能函數,一個工具函數經過-i -o -u -e 命令來調用已經封裝好的四個功能函數。
在這裏插入圖片描述html

-i __.txt實現對文本里的字符的數量的統計
思路使用文件裏的方法f.read()將讀取到的信息存放到字符串中而後求取字符串的長度。

def My_chars_count(file_name):
    #用來統計文本文件裏面的字符數量
    
    with open(file_name,'r') as f:
        chars=f.read()
    f.close()    
    return 'chars:'+str(len(chars))

在這裏插入圖片描述

-o__.txt實現對文本文件符合條件的單詞數量進行統計
思路:使用了正則表達式,以前就據說過可是一直沒有去學習,此次是一個很好的機會去了解正則表達式。用readlines()的方法把文本文本以行的方式讀取出來,而後在對每一行進行字符串匹配,符合以4個字母開頭的單詞就會以列表的形式輸出再將其存入定義過的word單詞列表,求出word的長度就是單詞的數量

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)

在這裏插入圖片描述

-u__.txt實現對文本文件有效行數的統計
思路:有效行數即非空白行,空白行就是'\n'那麼利用if語句就能夠控制計數器的自增實現對於非空白行的計數。

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)

在這裏插入圖片描述

-e__.txt實現對文本文件單詞出現頻率的統計
思路:這個函數的前一部分和-u基本一致,利用正則表達式選出單詞存入一個有重複的列表,接着利用python中的dict字典類型的特徵,dict{key:value}key和value是映射關係不會出現重複的key,那麼就把不重複的單詞給key,單詞的頻率用value的值來記錄。有重複單詞的列表和字典和無重複單詞的列表好像三個杯子,有重複單詞->字典->無重複單詞的列表就像一個杯子的水依次倒給下一個水杯倒三次水水變少了。
在這裏插入圖片描述
在python的list列表中有一個方法list.count()(i)用來求得第i個列表元素在列表中的個數,用這個方法來解決這個問題在合適不過了。那麼咱們遍歷無重複的單詞列表讓這個單詞在有重複的單詞列表中來求得重複的次數就能夠了。

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

在這裏插入圖片描述

-d 增長功能求指定長度的詞組的次數

在第三步中,咱們但願各位在第一步的基礎上,添加一些新的功能: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-o-u-e-d的順序!

實現使用輸入的 -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()

多個功能一塊兒實現:
在這裏插入圖片描述正則表達式

(4)代碼複審過程。

代碼複審檢查表:

一、概要部分

(1)代碼符合需求和規格說明麼?
符合。
(2)代碼設計是否考慮周全?

(3)代碼可讀性如何?
簡單易懂。
(4)有冗餘的或重複的代碼嗎?
開始有冗餘但後面在兩人協商後由一人改編後沒有冗餘了。
(5)代碼的每一行都執行並檢查過了嗎?
執行並逐行檢查過。算法

二、設計規範部分

(1)設計是否聽從已知的設計模式或項目中經常使用的模式?
遵照。
(2)有沒有無用的代碼能夠清除?
沒有。編程

三、代碼規範部分

基本符合代碼標準和風格,代碼可讀性高。設計模式

四、具體代碼部分

數據結構中有沒有用不到的元素?
沒有數據結構

五、效能

代碼的效能如何?
效能很高。ide

六、可讀性

可讀性比較高,註釋很詳細。

七、可測試性

進行了單元測試

八、代碼複審感想

通過此次的代碼複審,我認識到了代碼複審能夠找出代碼的錯誤,以及發現邏輯和算法的出錯,甚至還可能發現潛在的錯誤,這些能讓咱們互相在代碼複審中互有補益,可以更加開拓咱們對編程的理解和認識。

(5)計算模塊接口部分的性能改進。

性能分析

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

經過性能分析主要的時間用在了input上面,挺尷尬的。
咱們兩個進行討論但願能能夠改變一些,可是經過了調整函數並未實現。這或許是因爲咱們如今所學知識還有限,同時也提醒咱們後面還須要增長咱們代碼量和一些實踐經驗。

(6)計算模塊部分單元測試展現。

在這裏插入圖片描述

使用python測試模塊uinttest進行測試,代碼比較測試結果與預計同樣。

(7)計算模塊部分異常處理說明。

在測試過程當中我發現當文本文件裏面出現了漢字和一些中文符號後會報錯

在這裏插入圖片描述

在這裏插入圖片描述

解決方法:

在這裏插入圖片描述

讀取方式改爲二進制讀取方式就能夠了。

新的錯誤

在這裏插入圖片描述

改回原來的讀取方式後,又出現原來的方式,咱們通過一番努力之後並無解決這個問題,以後再網上覆制粘貼來的文本都會有這樣的問題因此這也是咱們在代碼測試複審中發現的缺陷。

(8) 描述結對的過程。

在這裏插入圖片描述

代碼模塊上,因爲第一次做業時就劃分好了模塊,以及對於多個函數的規劃和安排都比較清晰,因此在添加新功能時,沒有在大的代碼模塊上出現問題。結對時,咱們遇到的困難主要仍是在複雜字符串進行操做的算法上。在結對項目的開展初期,咱們是在宿舍進行討論的;咱們在宿舍進行需求分析,而後搜索相對應的資料,各自也在進行進度的標記,控制項目的進程。在聊完了各自已經作完的工做以後,我倆一塊兒探討了當時未解決的問題,咱們主要聊了下複雜字符串進行操做,開始這個問題對咱們確實很棘手,搞得咱們也煩躁,但在後期的討論中咱們煩躁的心情獲得緩解,而後咱們將咱們所遇的問題進行了整理,緊接着咱們經過上網查找這個問題的解決方法,功夫不負有心人咱們找到了正則表達式來解決這個問題,正則表達式的大體匹配過程是:依次拿出表達式和文本中的字符比較,若是每個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。咱們使用正則表達式中的findall(findall 的簡單用法:返回string中全部與pattern相匹配的所有字串,返回形式爲列表)。結對編程真的很棒,在相互的合做中可以給本身帶來不少全新的認識。能夠對代碼結構進一步的優化,產生新的idea等等。

(9)附加功能(用戶交互界面)

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設計充滿興趣。

(10)總結

實際操做的時候,分工跟預想的並不徹底同樣,咱們首先討論出了具體的算法,那些算法改進的話程序效率提升的最多。隨後算法的主要代碼是咱們共同完成的。總的來說,經過這個過程,仍是學到了不少,隊友就像一面鏡子,咱們互相學習互相進步,體驗到了1+1>2。
相關文章
相關標籤/搜索