WordCount编写和测试

作者: 网络编程  发布:2019-10-29

测验进度规划

  1. 先证实一下写完现在对代码的启幕评估:

(1)命令行参数管理的结构缺乏优化,那些部分也特不得已,作者利用的字典构造方法是将文件和对应操作参数关联,但这种是不是是最优办法,笔者仍旧存疑,关于这几个方面要求参谋DOS大概python终端的参数管理办法;

(2)这里思虑到风姿洒脱种轻松的景色,即文件都能打得开,未有增加非凡管理机制,但是本人以为特别管理是必得的,时间少于未有加以完备。

(3)文件计划和模块化设计宛如还也是有部分升高空间。

  由此可以知道,小编以为这里依然须求做一些优化的,关于python debugger等等工具照旧要学一下的。

  1. 测量检验用例的陈设格局:

  根据平常的思绪,

(1)大家针对种种分化的一声令下格式设计相对应的测量检验用例,在那有-c, -w, -l, -a, -e, -s, -x多少个关照的命令行参数,对每一个参数起码设计一个测验用例;

(2)对于每种参数的测量检验,我们必要提供多个例外的文书举行,且必须注意到有的境界条件的测量检验,如-c中对此特殊字符的测量检验,-e更改文件名是或不是能导入保留字列表等。

  显而易见正是针对差别效用设计尽只怕多的场所覆盖的测验用例,上面给出的只是八个简约的亲自去做,具体的测量检验集复杂得多。

  1. 实际测验示例:篇幅有限,给出多个文件及部分结果展现:

(1)图形分界面测验:命令:

wc.exe -x

  file_1.c

1 {1}
2 2

  file_2.c

1 a
2 a/
3 a b

  file_3.c

1 ---
2 

  突显的分界面如下:

图片 1

  输出的结果如下:

1. 
file_1.c, 字符数:5
file_1.c, 行数:2
file_1.c, 单词数:0
2. 
file_2.c, 字符数:8
file_2.c, 行数:3
file_2.c, 单词数:0
3.
file_3.c, 字符数:4
file_3.c, 行数:1
file_3.c, 单词数:0

(2)单个文件命令测量试验:

  testfile.c

1 {
2 }//
3 //
4              a
5 aasa//
6 while and or if endif

  StopList.txt

while if for

  那么测验各样命令:

4. wc.exe -c testfile.c
testfile.c, 字符数:52
5. wc.exe -w testfile.c
testfile.c, 单词数:6
6. wc.exe -l testfile.c
testfile.c, 行数:6
7. wc.exe -a testfile.c
testfile.c, 代码行/空行/注释行:3/2/1
8. wc.exe -w testfile.c -e StopList.txt
testfile.c, 单词数:4
9. wc.exe -s -c -w -l *.c -e StopList.txt
file_1.c, 字符数:5
file_1.c, 单词数:0
file_1.c, 行数:2
file_2.c, 字符数:8
file_2.c, 单词数:0
file_2.c, 行数:3
file_3.c, 字符数:4
file_3.c, 单词数:0
file_3.c, 行数:1
testfile.c, 字符数:52
testfile.c, 单词数:4
testfile.c, 行数:6
10. wc.exe -c -w -l -a testfile.c -o result.txt
testfile.c, 字符数:52
testfile.c, 单词数:6
testfile.c, 行数:6
testfile.c, 代码行/空行/注释行:3/2/1

图片 2

  这里映现的正确的结果,进度中出过多少个难题并改良过来了:

1)-e 进程文件不能读取:原因:get_prelist()获取路线错误,打包成exe后路线要求重新定向

  解决措施:把cur_file_dir()放到ExtraOpt.py中运用该办法门路就再一次调好了。

2)-w -e重复输出:原因:七个设置在分化的判断规范中,并不曾同期判别。

  消除办法:把有关保留字列表的管理放在-w的管理进度中,-e单独赢得列表。

  前段时间尚未曾现身其余主题材料,可是必需求留意命令行的准确行使,错误的命令行得不到科学的结果。

规划思路表明

1. 首先只记挂多少个基础成效:总结字符数、单词数、行数,计算结果以钦点格式输出到暗许文件中。

  那么首先想到的确定是模块化,对于以上不一致的效果与利益分别组织相应的独自的办法。小编个人是不赞同方法的嵌套的,因为大多时候会促成思路的头晕目眩,况且生机勃勃旦焦点成效出了难题,别的模块也就总体崩溃了。

  于是这里就起来应用python的文书管理效果以至重临的文本句柄的方法来扩充拍卖。

(1)首先是总计字符成效,相当的轻巧f.read()重临一个文件原原本本的字符串,包含n,t等空白字符,由此只要求总括重返的字符串的尺寸就足以了。

说明:这里的n,t均只视作三个字符。

1 # return the character number of a file
2 def char_num():
3     # open the file with the name 'filename'
4     f = open(filename, 'r')
5     totalstr = f.read()
6     f.close()
7     return filename   ', 字符数:'   str(len(totalstr))

(2)然后是计算行数效用,另多少个艺术f.readlines()重回四个文本各行组成的列表,只须求计算列表成分个数就能够。

1 # return the line number of a file
2 def line_num():
3     # open the file with the name 'filename'
4     f = open(filename, 'r')
5     lines = f.readlines()
6     f.close()
7     return filename   ', 行数:'   str(len(lines))

(3)总结单词数有几许头晕目眩,但也比异常粗略,我们在地方重回的每大器晚成行中实行寻觅,查找的正规就是正则表明式:单词是由起码八个假名组成的且不含别的标记(不挂念不定冠词a,连接词如five-year-old,缩写如don't这几类非常词汇)。于是用re.findall(r'[A-Za-z]{2, }')就能够筛选出富有的单词了。

 1 # return the word number of a file
 2 def word_num():
 3     # open the file with the name 'filename'
 4     f = open(filename, 'r')
 5     lines = f.readlines()
 6     f.close()
 7     # get the word by regex expression
 8     linewords = []
 9     for i in range(0, len(lines)):
10         linewords.append(re.findall(r'[A-Za-z]{2,}', lines[i]))
11     # count the number of words
12     count = 0
13     for lineword in linewords:
14         for word in lineword:
15             if word.isalpha() == False or len(word) == 1:
16                 lineword.remove(word)
17         if lineword != ['']:
18             count  = len(lineword)
19     return filename   ', 单词数:'   str(count)

(4)写入文件利用f.write()方法就足以写入了,注意展开时的mode必需是a(追加),不然会抹掉此前全体的笔录。

1 # write the information to the file
2 def write_file(filename, info):
3     f = open(filename, 'a')
4     f.write(info)
5     f.close()

  那多少个部分的兑现还算比较轻便。不过分明这么些方法共用多个参数,所认为了有利于起见,小编设计了三个类包罗了独具的办法,具体内容请参见上面包车型地铁链接。

  1. 接下去是有关扩大效用的证明

  扩张功效为:递归管理目录下相符条件的文件;再次回到代码行/空行/注释行;忽视停用词表的单词(保留字)。

(1)先从最简便的保留字管理起来讲,这几个与从前单词管理很相似,分歧是要除掉保留字,于是大家只需求组织二个保留字列表,决断得到的单词在不在表中,假若在则删掉,总计保留下去的单词数就能够,于是大家把早前的点子开展改写就能够。获取保留字的点子相同于获取单词的长河:

 1 # get the preserved words list
 2 def get_prelist(fname):
 3     filename = join(sys.path[0], fname).replace('\', '\\')
 4     fhandle = open(filename, 'r')
 5     wholestr = fhandle.read()
 6     prelist = wholestr.split(' ')
 7     for word in prelist:
 8         if word == "" or word == "n" or word == "t":
 9             prelist.remove(word)
10     return prelist

 (2)接下去说圣元下对行的高精度总计工作,正如大家在头里表明的,f.readlines()再次来到的是一个由各行字符串组成的列表,那么大家对每三个字符串做一些管理:

  先使用str.replace(a, b)方法将字符串中的换行符,制表符和空格全体去掉,接下去就开展判别:

  如若初始是'//'的话就作为注释行,不思索多行注释;倘诺风流罗曼蒂克行独有三个字符或从不字符就视作空行;其余任何乃是代码行。

 1 # return line details of a file
 2 def line_detail():
 3     # open the file with the name 'filename'
 4     f = open(filename, 'r', encoding='utf-8')
 5     # get all line string into a list
 6     lines = f.readlines()
 7     f.close()
 8     # distinguish different lines
 9     codelines, emptylines, commentlines = [], [], []
10     for line in lines:
11         tmpline = line.replace(' ', '')
12         tmpline = tmpline.replace('t', '')
13         tmpline = tmpline.replace('n', '')
14         if len(tmpline) == 1 or len(tmpline) == 0:
15             emptylines.append(line)
16         elif tmpline.startswith('//'):
17             commentlines.append(line)
18         else:
19             codelines.append(line)
20     return filename   ', 代码行/空行/注释行:'   str(len(codelines))   '/'
21                   str(len(emptylines))   '/'   str(len(commentlines))

(3)关于嵌套管理文件夹下全数的契合条件的文件,大家把难题开展分治:

  第意气风发,大家须求获得文件类型,那么些的笔触异常粗略,大家在命令行中获取相应参数,利用字符串尾巴部分截取就可以获取对应的文件类型。

  第二,我们依据取得的文件类型,在全路实践文书夹下举办递归查找,重返拿到的文件的相对路线列表。

 1 # determine the type needed
 2 tmplist = desfile.split('.')
 3 type = '.'   tmplist[-1]
 4 # get the required list
 5 localinfo = directory.build_infolist(type)
 6 # build up the information list from the file list
 7 def build_infolist(type=''):
 8     filenames = build_filelist(type)
 9     dirnames = build_dirlist()
10     # get information by creating a FileInfo object
11     infos = []
12     for fname in filenames:
13         info = FileInfo(path, fname)
14         infos.append(info)
15     # deal with the inner directory
16     for dirname in dirnames:
17         new_path = join(path, dirname)
18         newdir = DirInfo(new_path)
19         new_infos = newdir.build_infolist(type)
20         infos = infos   new_infos
21     return infos

3. 高等作用:展现图形界面,客商通过分界面选用单个文件,程序彰显相关总结新闻。

  雷同是分治,意气风发部分是透过显示对话框获取文件路线和文书名,另大器晚成有的正是将取得的音信做地方的操作。

  难题在于显示对话框,显示对话框须要使用wx库,利用内部的FileDialog方法创设对话框,FileDialog.getdirectory()和FileDialog.getname()获取文件路线和文书名。给一些示范代码:

只顾:这里只显示字符数,行数,单词数(无保留字)

 1 # A method to get filename by dialog
 2 def dialog_get():
 3     app = wx.App()
 4     frame = wx.Frame(None)
 5     openwildcard = "All files(*.*)|*.*|"   
 6                     "C/C   files(*.c;*.cpp;*.h)|*.c;*cpp;*.h|"   
 7                     "Java source files(*.java)|*.java|"   
 8                     "Python source files(*.py)|*.py|"   
 9                     "Text files(*.txt)|*.txt"
10     # Create open file dialog
11     openFileDialog = wx.FileDialog(frame, "Choose a file to open",
12                                    wildcard=openwildcard, 
13                                    style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
14     openFileDialog.ShowModal()
15     dir = openFileDialog.GetDirectory()
16     filename = openFileDialog.GetFilename()
17     openFileDialog.Destroy()
18     return dir, filename

  此次项目在github上的地方:

源代码模块表明

FileInfo.py   class FileInfo

Attributes: path, fname, filename

Methods: char_num(), word_num(prelist), 

line_num(), line_detail(), write_info()

DirInfo.py class DirInfo

Attributes: path

Methods: build_filelist(tyoe), build_dirlist(), build_infolist(type)

ExtraOpt.py - Methods: get_prelist(fname), dialog_get()
main.py - (No methods, but some important codes used as main() in java)

  最终实际还会有叁个setup.py文件用于将脚本文件打包成exe文件,但这不是我们兑现项目标机要,因而未曾列出来。

PSP表格

PSP2.1

PSP阶段

预估耗费时间

(分钟)

实质上耗时

(分钟)

Planning

计划

 

 

· Estimate

· 估摸那一个任务急需有些时间

 15

 15 

Development

开发

 

 

· Analysis

· 须求剖判 (富含学习新本事)

 60

 80

· Design Spec

· 生成设计文书档案

 -

· Design Review

· 设计复审 (和同事核查规划文书档案)

 -

· Coding Standard

· 代码标准 (为当前的付出拟定合适的正统)

· Design

· 具体规划

 60

 90

· Coding

· 具体编码

 500

 450

· Code Review

· 代码复审

 60

 40

· Test

· 测验(自己测量试验,改正代码,提交修正)

 120

 120

Reporting

报告

 

 

· Test Report

· 测量检验报告

 120

 140

· Size Measurement

· 总结专门的学业量

 20

 15

· Postmortem & Process Improvement Plan

· 事后总括, 并提议进度修正安插

 30

 30

 

合计

985

980

软件运行表达

  1. .exe文件运维注意要点:

  首先说澳优下将python脚本文件打包成exe文件的点子,事先你要设置py2exe库,然后构造三个setup.py文件用于打包,对于这些文件用命令行运营:

python <filename>.py py2exe

  setup.py文件组织能够是如此的:

1 from distutils.core import setup
2 import py2exe
3 setup(console=["main.py"])

  那么打包出来的事态是何许的吧?打包进程先制造一个dist文件夹,然后将PythonXX原作件夹里的局部文件复制到这里来,然后构造一些运维必得的注册表。大约的文书结构如下图所示:

图片 3

   因而只要急需周转以来,必须把持有文件放在一个文书夹里,内容均在BIN文件夹里。其余运行和.exe文件运维相仿。

2. 假诺.exe文件运营不了的话,能够下载__pycache__文件夹里的.pyc文件和main.py文件,放在八个文件夹下,用python命令运转。

  Python版本3.4以上,运转代码:

python main.py [arguments]
  1. 比如地方的都格外的话,保险Python 3.4 ,安装wxPython库,下载全体.py文件,运营main.py脚本,其余和2.中剧情风流浪漫律。

参谋文献

  1. Python Essential Reference, Fourth edition, David M.Beazley

2. Core Python Applications Programming, Third Edition, Wesley J. Chun

3. Python Crash Course: A Hands-On, Project-Based **Introduction to Programming, **Eric Matthes

小结

  此番项目内容依然相比充实的,聊到来咱们都以快完成学业的人了,上过的课也都游人如织了,有经验的人都明白,创设三个品种,不管它再小,故意还是无意地都会尽也许确定保证一个争执清晰合理的构架。比相当多决心的同窗写出来的代码都以模块划分特别明晰,结构特别规整的,其强健性和可重用性都超级高。这种做法往往就意味着越来越高的职业量。找出音信或然有一点点困难的,在索求引擎中国百货集团度属于最低顶尖,必应属于中级,google才是高等(纵然不能够用),寻找出来的经常不能够满意要求,需求多量搜寻和人造筛选。而像CSDN,博客园,开源中华夏族民共和国那个规范网址上的博客抄袭转发的超多,并且立异的异常的慢(大概现在大家都去做框架大概AI去了,没人管基础内容的更新),使用语言的性状相当多都以早已被淘汰的,新特点在合法文书档案上的求证和榜样并非那么好懂的(手册类的文书档案,又不是教材)。日常会冒出你想找意气风发种功能的实现格局,跳出来的大半是污物音讯依然无用的从头到尾的经过,能够说在开拓进程中十分的大片段年华是荒疏在提取有用音讯的历程上。

  然则做出来了任何经过依然很值得的。可是话说回来,就算自身的测验近日不曾检验到题目,但要么须求更进一竿测量试验,越发眼花缭乱的测验用例是少不了的。总之假设上面的统筹进程或达成形式有如何难点,希望大家不吝指教。

 

写在前面包车型地铁话

  首先本身不得不要重申,生龙活虎旦您认为有标题,那自然是你从未当真看下边包车型地铁证实。

  先说一点题外话,从下周职务分配下来到现行反革命,要求在相连改变,描述也非凡模糊。既然那只是一周的“小作业”,那么就不曾要求把须要模糊化,对于其他一点表达都应有切实清晰,给出的样例必得标准精确,况兼只要那门学科的关键在软件品质提高和测验上,那么就不应有在急需上支支吾吾,那样对大家的支付特别不利。这点照旧给开荒产生了十分的大的标题。

本文由金沙澳门官网发布于网络编程,转载请注明出处:WordCount编写和测试

关键词: 金沙澳门官网

上一篇:中的设计,Hook原理及EasyHook简易教程
下一篇:没有了