zoukankan      html  css  js  c++  java
  • 计算与软件工程 作业四

    这个作业要求在哪里 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10534
    我在这个课程的目标是 评判其他学生的程序,同时进行代码复审;两人合作结对编程
    此作业在哪个具体方面帮我实现目标 首先是通过评价他人的代码来巩固自己的知识,其次作业二是运用Python编写一个统计红楼梦各个回合的人物出场次数,学习了Python。
    其他参考文献 https://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html https://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html
    码云链接 https://gitee.com/xinxiyujisuan/learngit/tree/master/

    作业一

    1. 对"xixi666"的评论

    2.对"w1010"的评论

    3.对"LL-L"的评论

    4.对"而今夜雨十年灯"的评论

    5.对"闲来垂钓碧溪上"的评论

    6.对"易young"的评论

    7.对"想喝冰阔落啊"的评论

    8.对"Semana"的评论

    小结

    一篇代码写完后,需要进行代码规范和代码审复,代码规范其实在写代码的过程中就应该注意到。
    代码风格规范中需要基本的4个空格的缩进格式;100字符以内的行宽;必要的断行和{}的真确使用;注意分行的使用情况;关于命名方面不可随便,会产生歧义,课参考匈牙利命名法命名函数或变量等,而命名的大小写的规则如下:

    类/类型/变量:名词或组合名词,如Member、ProductInfo等。
    函数则用动词或动宾组合词来表示,如get/set; RenderPage()。

    下划线用来分隔变量名字中的作用域标注和变量的语义;注释也是一段代码所必要的,在复查代码是快速了解情况,方便使用与理解,当然注释也要是有意义注释。
    代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面。
    代码审复

    名 称 形 式 目 的
    自我复审 自己 vs. 自己 用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处
    同伴复审 复审者 vs. 开发者 简便易行
    团队复审 团队 vs. 开发者 有比较严格的规定和流程,用于关键的代码,以及复审后不再更新的代码。覆盖率高——有很多双眼睛盯着程序。但是有可能效率不高(全体人员都要到会)

    代码审复可以降低风险,提高代码质量,大大提高效率。
    在上面的八个同学当中,在代码的风格规范上基本做得不错,只是在函数和变量的命名上还有点改善;除了一个同学没有进行代码审复其他同学都进行的不错,xixi666同学的测试阶段出了问题,要注意。
    在今后的学习和练习中要注意到这些问题,注意规范,注意审复。

    作业二

    作业要求:

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

    求次数代码

    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))
    

    图表代码

    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 = 'D:红楼梦.txt'
        hnc = HlmNameCount()
        hnc.getNameTimesSort(name_list,txt_path)
    

    测试代码

    import unittest
    
    class MyTest(unittest.TestCase):  # 继承unittest.TestCase
        def tearDown(self):
            # 每个测试用例执行之后做操作
            print('111')
    
        def setUp(self):
            # 每个测试用例执行之前做操作
            print('22222')
    
        @classmethod
        def tearDownClass(self):
        # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次
             print('4444444')
        @classmethod
        def setUpClass(self):
        # 必须使用@classmethod 装饰器,所有test运行前运行一次
            print('33333')
    
        def test_a_run(self):
            self.assertEqual(1, 1)  # 测试用例
            
        def test_b_run(self):
            self.assertEqual(2, 2)  # 测试用例
            
    if __name__ == '__main__':
        unittest.main()#运行所有的测试用例
    

    码云链接

    https://gitee.com/xinxiyujisuan/learngit/tree/master/

    小结

    作业二是需要二人合作的结对编程,结队中有两个角色:驾驶员(Driver)是控制键盘输入的人;领航员(Navigator)起到领航、提醒的作用。
    每个人在自己编写程序的时候,或多或少会出现一些“不可抗力”因素的问题。而单靠自己重头检查是非常浪费时间和消耗精力的。结对在一定程度上可以使成功运行的程序的生成更加快速。此次的二人结队编程,周宇涵同学付出了主要得部分,而我个人在此次的编码中参与性不是特别高,这就违背了道德和结对编程的原则,今后一定积极参与其中。

  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/xinxiyujisuan/p/12612173.html
Copyright © 2011-2022 走看看