软件工程第二次作业—个人项目
1. 代码仓库地址:https://gitee.com/liumangxiaozi/software_engineering.git
2. PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 5 | 10 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 5 |
Development | 开发 | 10 | 15 |
· Analysis | · 需求分析 (包括学习新技术) | 200 | 300 |
· Design Spec | · 生成设计文档 | 60 | 100 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 5 |
· Design | · 具体设计 | 20 | 20 |
· Coding | · 具体编码 | 500 | 500 |
· Code Review | · 代码复审 | 200 | 250 |
· Test | · 测试(自我测试,修改代码,提交修改) | 200 | 200 |
Reporting | 报告 | 40 | 40 |
· Test Repor | · 测试报告 | 40 | 40 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
| 合计 | 1345 | 1535 |
3. 学习日志
学习时段:2018.1229.0800-0930
学习内容:python对文本文件的读取
收获体会:在学习过程中效率很低,主要原因在于自己对于python的整体的编程能力的不足,我在自己的D盘内设置有a.txt文件,但是我在编码的过程中采用的调用格式一直也只是a.txt,到最后一直无法对文件进行操作,最后发现,应该在a.txt后面再加一个.txt,这么一个小的错误花费了一个小时才解决
自我效率评价:差
学习时段:20198.0102.1900-2030
学习内容:文本处理-字符串
收获体会:找了一本python基础的书,对其中字符串处理模块进行了学习,由于是对着书本学习,边学习边编写,所以感觉整体效率还算不错。
自我效率评价:较高
学习时段:20198.0104.1400-1730
学习内容:编写词频统计程序
收获体会:参考了https://www.cnblogs.com/Eudemines/p/9764409.html博文的内容和方法,对自己的编程有了一个整体的规划,在缓冲区的处理部分,暂时采用了该博主提供的方法,但是整个程序还是有bug没消掉。
自我效率评价:较低
学习时段:20198.0105.1400-1700
学习内容:编写词频统计程序
收获体会:参考了社区大神的许多建议和方法,针对bug进行处理,解决了bug,并优化了部分的程序结构。
自我效率评价:较低
4. 解题思路描述
①将文本保存为一个字符串形式,统计字符串的长度,文本的行数;
②将字符串内所有的大写字母转为小写字母;
③将字符串中缓冲区进行处理;
④将字符串分离为单个的单词
⑤统计单词的词频
⑥输出词频在前十的单词
⑦对特定的功能点检查自己实现的功能点的缺陷,一个一个优化
5. 设计思路过程
测试用例
功能 | 测试文本 | 输出 |
纯英文字符 | The to the | 长度:10,行数:1 ,‘the’:2,‘to’:1 |
数字英文混合 行数检测 | the123 1the | 长度:14,行数:2,‘the123’:1,‘to’:1 |
大小写检测 | The the | 长度:7,行数:1,‘the’:2 |
空行处理 | the
the | 长度:13,行数:2,‘the’:2 |
首尾空格 | The the | 长度:10,行数:1 ,‘the’:2 |
汉字处理 | 这 the | 长度:4,行数:1 ,‘the’:1 |
特殊字符处理 | @#$ the | 长度:7,行数:1 ,‘the’:1 |
字母数字混合 | The123the | 长度:9,行数:1 ,‘the123the’:1 |
6. 性能分析
通过程序对四段英文字符串进行处理,程序运行一共花费了接近0.121秒
7. 关键代码
def main():
dst = "a.txt.txt"
bvffer = process_file(dst)
word_freq = process_buffer(bvffer)
output_result(word_freq)
if __name__ == "__main__":
import cProfile
import pstats
cProfile.run("main()", "result")
# 直接把分析结果打印到控制台
p = pstats.Stats("result") # 创建Stats对象
p.strip_dirs().sort_stats("call").print_stats() # 按照调用的次数排序
p.strip_dirs().sort_stats("cumulative").print_stats() # 按执行时间次数排序
p.print_callers(0.5, "process_file") # 如果想知道有哪些函数调用了process_file,小数,表示前百分之几的函数信息
p.print_callers(0.5, "process_buffer") # 如果想知道有哪些函数调用了process_buffer
p.print_callers(0.5, "output_result") # 如果想知道有哪些函数调用了output_res
8心路历程和收获
本次开发过程比较坎坷,中间还穿插着一门矩阵理论的考试课,所以总体的时间还是很紧张,自己编写的软件中存在许多的不足,譬如没能实现老师要求的对以英文和数字混合字符的识别和统计,只是对纯英文文本进行处理,同时对其他字符的处理只是简单的采用了识别和替换的方法,若是输入超出我的编写程序的范围可能会导致软件的奔溃,不管其他,最终还是做出来了一个小小的软件,基本实现了其功能,感悟有三点:一、自己的编程技术太low,需要加强、加强、再加强;二、软件工程中各个部分的工作加起来远比编程多得多;三、学到了许多实用的技能。