二、软工个人项目:文本信息统计器

本软件的代码:https://github.com/amekao/SE_work1

界面:

 

 

 


 

一、需求分析阶段:

需求分析:

总需求:需要用户在cmd运行程序,根据所输入的参数提供对应的计算模式

基本功能: -c -w -l 显示字符数,词数,行数

拓展功能:-a 显示具体行数, -s 可以递归遍历指定目录下的文件

高级功能: -x 弹出界面让用户选择要统计的文本,显示所有的信息

 


 

二、设计阶段:

      考虑到python语言对文本操作提供了较好的接口,而且文件编码也比较丰富,因此决定使用python来完成这次项目,但是要另外付出学习python的时间成本
对任务进行时间划分:

子任务预期时间(h)实际时间(h)
初期学习python6h7h
程序框架搭建2h1.5h
实现-c1h0.2h
实现-w1h1.5h
实现-l1h0.2h
实现-a1.5h0.5h
实现-s2h2h
支持通配符1.5h2h
实现-x1h1h
联结各模块1h2h
后续新功能设计2h4h
总用时20h21.9h

 

 

 

 

 

 

 

 

 

 

各种功能的设计思路:

1. cmd获取参数的功能:使用OS模块定义的argv函数以列表的形式获得用户在缓冲区输入的数据,使用标志位记录用户输入了什么参数,从而实现参数复合使用的要求

2. -c和-l功能:len对应列表的条目数

3. -w功能:通配符分割各单词存入列表,len列表

4. -a功能:逐行判断是什么类型的行

5. 递归遍历目录的功能:使用os库提供的接口列出当前目录下的文件和文件夹,如果是文件夹则继续递归进行遍历,文件则判断是否为对应文件类型,若是,则存到一个表里

6. 使用通配符的功能:使用fnmatch的接口

7. -x弹出文件选择对话框:使用win32ui提供的接口,获取用户选择的文件的路径

 


 

三、软件开发阶段:

在真正输入代码时,才会发现各种各样新的问题,发现新的设计会更好,最终程序调用关系如下图

 

后续新增的更多功能:

1. 增加-b显示详细字数:在测试len(open_file.read())时发现显示的字符数一直不对,后来才发现是把换行符也算了进去,不过这不符合正常人的习惯,而且做一个字符判断的模块也不难,所以可以把换行符个数也显示出来,让用户自己决定要不要把换行符加入字符数中

2. 一开始程序是限制argv长度的,即同一时间只支持用一个参数和一个文件路径,但是交给同学帮忙测试时他吐槽参数的地方限制太多。后来重新分析程序发现-c -w -l -a -b模块其实都互不影响的,所以就更改成argv中出现这个字段就把对应的标志位设置为True的方法,这样五个普通参数就都可以同时使用,一次就可以把五种功能都测试出来,大大加快了测试效率。

3. 在设计-s模式时发现fnmatch库(用以通配符匹配)的功能强大,因此在非-s模式也加入了这个功能,即使用户想输入“自制数组.c”但不小心输入了“数组.c”也能寻找到

输入:

 

输出:

4. python的read函数除了.c文件以外,也可以打开其他一些文本文件格式,比如.py和.java等,所以本软件也支持这类文件的统计

 

设计心得:

1. 本次实验是自己第一次用python写程序,c语言很多功能要自己写,而且对文本编码支持不好,而java中类的概念本人也不是很熟悉,总对类里面定义的函数感到迷惘,所以使用python编程,花了一两天来看python相关教程就上手了,不得不感叹python真是好用啊。

2. 本次设计最难实现的模块是递归遍历目录的函数,据说可以使用os.walk函数来遍历,不过网上关于os.walk函数的说明实在晦涩难懂,什么返回三元列表的实在超出我的常识范围,而且知道是树形结构,自己写一个遍历也不是很难,不过也花了不少时间才测试成功

3. 另外一个难题就是将代码组装起来,一开始识别argv的main函数很弱智,就是[0]号元素是wc.exe,[1]号元素则是各种参数,[2]号元素是文件路径,不过这样就实现不了wc.exe -s -a file.c的功能了,而且测试模块又要一个一个改参数输命令很烦,于是花了一点时间让其支持多参数

4. 写代码永远都是越写发现越想修改得更好一点,毕竟也是自己的亲生儿子,发现辛辛苦苦写的遍历函数稍作修改后可以复用而且会让体验更好,又花了一点时间将“文件”分为“文件路径”和“文件名字”,这样就可以让通配符更灵活,支持相对路径和绝对路径,而且文件类型也可以修改,一箭三雕


 

四、测试阶段:

测试均是手工完成,大多数都是边写程序边测试,所幸本程序中使用到分支语句的地方不多,就在判断argv参数时需要用到,且大多数参数都是并列关系,所以并没有使用多层if else语句嵌套,而且支持多参数输入,所以一条指令就可以测试到大多数分支

后来也学习到了pytest的使用方法,写出了测试各个count模块的代码:

1 def test_wc():
2     test_path = "自制数组.c"
3     op = open(test_path, "r", encoding='UTF-8')
4     assert char_count(op) == 551
5     assert complex_char_count(op) == (9, 327, 49, 45, 25, 96)
6     assert line_count(op) == 46
7     assert complex_line_count(op) == (4, 10, 32)
8     assert word_count(op) == 61

 

 

 

目前已知的bug:

1. 权限问题:遇到不可访问的文件(如系统文件)时可能会出错

2. 编码格式问题:本软件应该支持UTF-8和GBK的编码,不过极少数情况下无法打开,会出现UnicodeEncodeError

3. 个人能力有限,C语言/**/方式的注释花样繁多,把所有情况都统计出来一定会让代码中充斥许多if else语句,让代码十分杂乱,所以/*类注释行无法统计

4. 截取单词是用通配符匹配一串英文字母的方式,无法判断出该字母串有否实际意义,比如说“adsadasds”这样的字母串就会判定为词语

 

转载于:https://www.cnblogs.com/amekao/p/11582212.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值