计算机与软件工程 作业四

这个作业要求在哪里|https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10534
--|:--😐--:
我在这个课程的目标是|学习软件工程,提高编程能力
此作业在哪个具体方面帮我实现目标|锻炼编程能力,增强合作精神
作业正文|https://www.cnblogs.com/zhou1231/p/12636576.html

作业一

每个人针对之前两次作业所写的代码,针对要求,并按照代码规范(风格规范、设计规范)要求评判其他学生的程序,同时进行代码复审(按照代码复审核表 https://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html),要求评价数目不少于8人次,
评价内容直接放在你被评价的作业后面评论中
同时另建立一个博客,将你作的评论的截图或者链接,放在博客中,并在你的博客中谈谈自己的总体看法








总结

大家的代码还是比较规范的,但还是有些细节需要改进,需要注意缩进为四个空格,大括号要独占一行,代码中也应该在必要的位置添加注释,方便其他人理解。我们在代码复审阶段既可以发现别人的优点和不足,也可以意识到自己的代码在哪里还有些不足。

作业二

两人自由组队进行结对编程
参考结对编程的方法、过程(https://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html)开展两人合作完成本项目
实现一个简单而完整的软件工具(中文文本文件人物统计程序):针对小说《红楼梦》要求能分析得出各个人物在每一个章回中各自出现的次数,将这些统计结果能写入到一个csv格式的文件。
进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
使用源代码管理系统 (GitHub, Gitee, Coding.net, 等);
针对上述形成的软件程序,对于新的文本小说《水浒传》分析各个章节人物出现次数,来考察代码。
将上述程序开发结对编程过程记录到新的博客中,尤其是需要通过各种形式展现结对编程过程,并将程序获得的《红楼梦》与《水浒传》各个章节人物出现次数与全本人物出现总次数,通过柱状图、饼图、表格等形式展现。

同伴地址:https://www.cnblogs.com/cdinzz/p/12637127.html

PSP Personal Software Process Stages 预估耗时 实际耗时
Planning 计划 1天 5小时
Estimate 估计这个任务需要多少时间 2周 2周
Development 开发 1周 2周
Analysis 需求分析(包括学习新技术) 5天 5天
Coding Standard 代码规范 1小时 1小时
Design 具体设计 3天 4天
Coding 具体编码 5天 1周
Code Review 代码复审 3小时 5小时
Test 测试 1小时 2小时
Reporting 报告 2小时 3小时
Size Measurement 计算工作量 1小时 1小时
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 1小时 半小时

代码


import jieba
excludes = {"什么","一个","我们","那里","你们","如今","说道","知道","起来","姑娘","这里","出来","他们","众人","自己",
            "一面","只见","怎么","奶奶","两个","没有","不是","不知","这个","听见","这样","进来","咱们","告诉","就是",
            "东西","袭人","回来","只是","大家","只得","老爷","丫头","这些","不敢","出去","所以","不过","的话","不好",
            "姐姐","探春","鸳鸯","一时","不能","过来","心里","如此","今日","银子","几个","答应","二人","还有","只管",
            "这么","说话","一回","那边","这话","外头","打发","自然","今儿","罢了","屋里","那些","听说","小丫头","不用","如何"}
'''
这些是一些干扰词汇,先列出,之后把这些词删除
'''
txt = open("红楼梦.txt","r",encoding='utf-8').read()
'''
不写明路径的话,默认和保存的python文件在同一目录下 注意打开格式是utf-8,这个可以打开txt文件,选择另存为,注意界面右下角的格式
'''
words = jieba.lcut(txt)
'''
利用jieba库将红楼梦的所有语句分成词汇
'''
counts = {}
'''
创建的一个空的字典
'''
for word in words:
    if len(word) == 1:      #如果长度是一,可能是语气词之类的,应该删除掉
        continue
    else:         counts[word] = counts.get(word,0) + 1
    '''
    如果字典中没有这个健(名字)则创建,如果有这个健那么就给他的计数加一
    [姓名:数量],这里是数量加一
    '''
for word in excludes:			
    del(counts[word])
    '''
    #这一步:如果列出的干扰词汇在分完词后的所有词汇中那么删除
    '''
items = list(counts.items())
'''
把保存[姓名:个数]的字典转换成列表
'''
items.sort(key=lambda x:x[1],reverse = True)
'''
对上述列表进行排序,'True'是降序排列
'''
for i in range(10):
    word,count = items[i]
    print("{0:<10}{1:>5}".format(word,count)) 
'''
这里是打印前十个
因为列表也是[姓名:个数]
word就是保存姓名的变量
count就是保存个数的变量
'''

import jieba
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np


class HlmNameCount():
    # 此函数用于绘制条形图
    def showNameBar(self,name_list_sort,name_list_count):
        # x代表条形数量
        x = np.arange(len(name_list_sort))
        # 处理中文乱码
        plt.rcParams['font.sans-serif'] = ['SimHei']
        # 绘制条形图,bars相当于句柄
        bars = plt.bar(x,name_list_count)
        # 给各条形打上标签
        plt.xticks(x,name_list_sort)
        # 显示各条形具体数量
        i = 0
        for bar in bars:
            plt.text((bar.get_x() + bar.get_width() / 2), bar.get_height(), '%d' % name_list_count[i], ha='center', va='bottom')
            i += 1
        # 显示图形
        plt.show()

    # 此函数用于绘制饼状图
    def showNamePie(self, name_list_sort, name_list_fracs):
        # 处理中文乱码
        plt.rcParams['font.sans-serif'] = ['SimHei']
        # 绘制饼状图
        plt.pie(name_list_fracs, labels=name_list_sort, autopct='%1.2f%%', shadow=True)
        # 显示图形
        plt.show()

    def getNameTimesSort(self,name_list,txt_path):
        # 将所有人名临时添加到jieba所用字典,以使jieba能识别所有人名
        for k in name_list:
            jieba.add_word(k)
        # 打开并读取txt文件
        file_obj = open(txt_path, 'rb').read()
        # jieba分词
        jieba_cut = jieba.cut(file_obj)
        # Counter重新组装以方便读取
        book_counter = Counter(jieba_cut)
        # 人名列表,因为要处理凤姐所以不直接用name_list
        name_dict ={}
        # 人名出现的总次数,用于后边计算百分比
        name_total_count = 0
        for k in name_list:
            if k == '熙凤':
                # 将熙凤出现的次数合并到凤姐
                name_dict['凤姐'] += book_counter[k]
            else:
                name_dict[k] = book_counter[k]
            name_total_count += book_counter[k]
        # Counter重新组装以使用most_common排序
        name_counter = Counter(name_dict)
        # 按出现次数排序后的人名列表
        name_list_sort = []
        # 按出现次数排序后的人名百分比列表
        name_list_fracs = []
        # 按出现次数排序后的人名次数列表
        name_list_count = []
        for k,v in name_counter.most_common():
            name_list_sort.append(k)
            name_list_fracs.append(round(v/name_total_count,2)*100)
            name_list_count.append(v)
            # print(k+':'+str(v))
        # 绘制条形图
        self.showNameBar(name_list_sort, name_list_count)
        # 绘制饼状图
        self.showNamePie(name_list_sort,name_list_fracs)
        

if __name__ == '__main__':
    # 参与统计的人名列表,可修改成自己想要的列表
    name_list = ['宝玉', '黛玉', '宝钗',  '凤姐',  '贾母','贾琏',  '平儿','王夫人','太太','老太太' ]
    # 红楼梦txt文件所在路径,修改成自己文件所在路径
    txt_path = 'C:/Users/zyd/Desktop/红楼梦.txt'
    hnc = HlmNameCount()
    hnc.getNameTimesSort(name_list,txt_path)


总结

这次的代码是用python写的,对于python我们还不是很熟悉,第一次使用遇到的问题还是挺多的。运行时显示ModuleNotFoundError: No module named 'matplotlib',同时按wins+r 进入命令行,输入python -m pip install matplotlib 安装matplotlib模块即可。代码中路径的杠是/。运行时显示SyntaxError: multiple statements found while compiling a single statement,Ctrl+N,新建一个,这时直接将代码复制进来,就不会产生这个问题了。

posted @ 2020-04-05 12:02  想喝冰阔落啊  阅读(256)  评论(0编辑  收藏  举报