软件工程第二次作业

这个作业属于哪个课程软工-2018级计算机1班
这个作业要求在哪里202103226-1 编程作业
这个作业的目标使用Gitee、完成WordCount
学号20188380

1、Gitee地址

https://gitee.com/noacgnnolife/project-java

2、设计思路

  1. 统计文件的字符数(对应输出第一行):
  • 只需要统计Ascii码,汉字不需考虑
  • 空格,水平制表符,换行符,均算字符
  1. 统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
  • 英文字母: A-Z,a-z
  • 字母数字符号:A-Z, a-z,0-9
  • 分割符:空格,非字母数字符号
  • 例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词

我具体实现了的需求只有统计字符数、单词数。所有需求封装到一个file类中,每个需求再分别用方法再封装一次。这样就能实现简单的结构化。对于纯英文文本,直接用 len() 统计字符数;统计单词数需要将文本中的所有' , '和' . '替换成空格,然后再去除文本左右的空格,最后再右 split() 对文本做分割,分割符为空格,得到 list 数据类型的返回值,通过调用len()方法获得单词总数

3、具体实现

    def __init__(self, filename):
        self.filename = filename
 	# 初始化变量filename
# 打开文件并读取文件
    def file_open(self):
        # 上下文管理器,只读,用encoding对文本做转码处理,避免编码不一致
        f = open(self.filename, 'r',encoding='utf-8')
        src = f.read()
        return src
 # 计算字符数
    def file_count_chars(self):
        chars = self.file_open()
        count_chars = len(chars)
        return count_chars
 # 计算单词总数
    def file_count_words(self):
        chars = self.file_open()
        # 将逗号改为空格
        chars = chars.replace(',', ' ')
        chars = chars.replace('.',' ')
        # 除去左右空格
        chars = chars.strip()
        # 分割
        counts_words = chars.split(' ')
        result = len(counts_words)
        return result
# 若作为主文件运行,则执行以下代码块
if __name__ == '__main__':

    time_1 = default_timer()
    try:
        # 读取的文本
        a = file('哈利波特原版.txt')
        result_1 = a.file_count_chars()
        result_2 = a.file_count_words()

        print('目标文件字符数:',result_1)
        print('目标单词数:',result_2)


    except FileNotFoundError:
        print('目标文件:'+a.filename+'不存在,请重试!')

4、性能测试

测试的文本是在网上随便找的《哈利波特》英文版 全集,总大小6.29M

软件工程第二次作业_软件工程

性能测试我做了两种,第一种是嵌入在代码中的default_timer,default_timer()是 python 中精度最高的计时器,通过嵌在代码中的计时点之间的差值得到运行时间。

软件工程第二次作业_软件工程_02

第二种是通过引用外部包 cProfile 对代码做性能测试,cProfile相较default_timer而言内容更详细,它会把程序运行过程中的每段代码的运行时间都计算出来。

软件工程第二次作业_软件工程_03

5、心路历程

因为做这次作业的时间有点靠后,离 deadline 也没有几小时了,所以就尽量用比较简单的方式完成了一些需求,其实统计有效行数和统计并显示10个出现次数最多的单词这两个需求也有思路,但是时间比较紧,精力也有点不足,所以就搁置了。总的来说这次作业其实并不难,需求都很常规。但是我使用的是Python编写的程序,与要求使用的 C 或 Java 编写程序的基本需求不相通,所以严格来讲这次作业等于我白写了。可是我认为这中间的思考和动手尝试的经验是比完成作业要更重要的东西,因此这也是我明知作业过不了也要熬夜DEBUG、写文档的理由。

最后提一嘴,我感觉这PSP表格有点大题小做,我从开始思考到大体完成代码也就不过1小时左右,中间几乎都是一个人设计和找资料,就是一个很简单事情,但是表格却要我把一个人就能轻松做完的工作时间分这么细。有点不至于......

6、PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划

• Estimate• 估计这个任务需要多少时间300291
Development开发15075
• Analysis• 需求分析 (包括学习新技术)6045
• Design Spec• 生成设计文档1010
• Design Review• 设计复审2010
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)51
• Design• 具体设计5045
• Coding• 具体编码2525
• Code Review• 代码复审105
• Test• 测试(自我测试,修改代码,提交修改)3030
Reporting报告4040
• Test Repor• 测试报告205
• Size Measurement• 计算工作量

• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划


合计720582