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