首页 > 其他分享 >结对项目

结对项目

时间:2024-09-28 13:22:37浏览次数:6  
标签:结对 项目 grade self file answer txt exercise

结对项目


这个作业属于哪个课程 计科22级12班软件工程
这个作业要求在哪里 作业要求
这个作业的目标 尝试结对编程,深入熟悉开发过程,并设计一个能自动生成小学四则运算题,还能批改题目计算分数的程序
队伍成员 林楦(3222004851) 徐嘉炜(3122004838)

Github链接:https://github.com/AAA-Lin/AAA-Lin.git


PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 35 25
Estimate 估计这个任务需要多少时间 800 600
Development 开发 400 460
Analysis 需求分析(包括学习新技术) 200 160
Design Spec 生成设计文档 40 40
Design Review 设计审核 40 35
Coding Standard 代码规范(为目前的开发制定合适的规范) 20 40
Design 具体设计 30 30
Coding 具体编码 120 130
Code Review 代码审核 50 40
Test 测试(自我测试,修改代码,提交修改) 200 190
Reporting 报告 60 50
Test Report 测试报告 25 30
Size Measurement 计算工作量 30 30
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 30 30
合计 2080 1890

效能分析

优化思路

  • 消耗时间最多函数:bracket_answer负责计算不同级别括号的表达式,它可能会消耗许多时间,尤其是在处理嵌套表达式时,所有首先考虑优化这个函数
  • 分数:使用 Fraction 类处理分数会导致计算量较大。考虑简化分数和减少非必要的计算。

性能分析图

1727366360295.png

设计实现过程

代码组织

1. Operation类:
生成数学四则运算习题,将习题写入到"Exercise.txt"文件中,并将相应的答案写入"Answer.txt"文件中,其中

  • __ init __:初始化习题数量和操作数范围的默认值。
  • operation:生成习题和答案,并处理异常。
  • combine:生成带有随机运算符和操作数的数学表达式。
  • is_proper和get_proper_fraction:负责随机生成真分数。
  • to_fraction:把不恰当的分数转换为带分数。
  • bracket_insert:根据指定的括号参数在表达式中插入括号。
  • get_answer和bracket_answer:计算答案,其中bracket_answer为计算带有括号的。
    2. 重要函数:
  • check:检查新生成的表达式是否不在先前已经生成的表达式列表中。
  • out_grade:读取习题和答案的对应文件,检查正确性,并返回正确和错误答案的摘要。
  • main:它使用argparse来解析命令行参数。
    3. 对应流程图:
    1727367448041.png

代码说明

  • 关键代码
class Operation:

    def __init__(self):
        self.number = 10
        self.value = 10

    def operation(self):
        """
        生成四则运算函数,调用相关函数实现生成
        :return: None
        """
        f_exercise = open('Exercise.txt', 'a+', encoding='utf-8')
        f_answer = open('Answer.txt', 'a+', encoding='utf-8')
        f_exercise.seek(0)
        f_answer.seek(0)
        f_exercise.truncate()
        f_answer.truncate()
        count = 0
        topic = []
        ans = []
        while True:
            try:
                exercise_list, answer = self.combine()  # 控制运算符数量
            except ZeroDivisionError:  # 当0位除数 和 负数情况
                continue
            # True表示检查后无重复
            if check(exercise_list, answer, topic, ans):
                topic.append(str("".join(exercise_list)))
                f_exercise.write("四则运算题目" + str(count + 1) + ": " + ' '.join(exercise_list) + ' =\n')
                if re.search('/', answer):
                    d, n = answer.split('/')
                    ans.append(answer)
                    if int(d) > int(n):
                        answer = to_fraction(answer)
                f_answer.write("答案" + str(count + 1) + ": " + answer + '\n')
                count += 1
                if count == self.number:
                    break
        f_exercise.close()
        f_answer.close()
  • 思路:先实现输出写死的运算式到文件,然后通过不断实现对应功能函数来对写死的运算式修改实现随机出题,并计算答案。
  • 注释说明:代码中已有注释说明

测试运行

测试说明

1. test_main_n_r:测试-n 100 -r 100

    @mock.patch("Myapp.add_parm")
    def test_main_n_r(self, mock_args):
        mock_args.return_value = Namespace(answer_file=None, exercise_file=None, range=100, sum=100)
        main()
        exercise_file = open("Exercise.txt", "r", encoding='utf-8')
        exercise_lines = exercise_file.readlines()
        answer_file = open("Answer.txt", "r", encoding='utf-8')
        answer_lines = answer_file.readlines()
        exercise_file.close()
        answer_file.close()
        self.assertEqual(len(exercise_lines), 100)
        self.assertEqual(len(answer_lines), 100)

**2. test_main_e_a:测试-e Exercise.txt -a Answer.txt **

    @mock.patch("Myapp.add_parm")
    def test_main_e_a(self, mock_args):
        mock_args.return_value = Namespace(answer_file="Answer.txt", exercise_file="Exercise.txt", range=None, sum=None)
        main()
        grade_file = open("Grade.txt", "r", encoding='utf-8')
        grade_lines = grade_file.readlines()
        grade_file.close()
        self.assertEqual(grade_lines[1], "Wrong:0 ()")

3. test_main_none:无参数时

    @mock.patch("Myapp.add_parm")
    def test_main_none(self, mock_args):
        mock_args.return_value = Namespace(answer_file=None, exercise_file=None, range=None, sum=None)
        self.assertEqual(main(), ValueError)

4. test_out_grade:测试答案中的对错情况

    def test_out_grade(self):
        grade = out_grade("Exercise.txt", "Answer.txt")
        grade_split = grade.split('\n')
        self.assertEqual(grade_split[1], "Wrong:0 ()")
        grade = out_grade("Exercise.txt", "Wrong.txt")
        grade_split = grade.split('\n')
        self.assertEqual(grade_split[0], "Correct:0 ()")

5. test_to_fraction:测试假分数转换为真分数是否正确

    def test_to_fraction(self):
        fraction = to_fraction("89/55")
        self.assertEqual(fraction, "1'34/55")
        fraction = to_fraction("10/5")
        self.assertEqual(fraction, "2")
        fraction = to_fraction("5'10")
        self.assertEqual(fraction, ValueError)

6. test_10000_n:测试产生10000道题目

    @mock.patch("Myapp.add_parm")
    def test_10000_n(self, mock_args):
        mock_args.return_value = Namespace(answer_file=None, exercise_file=None, range=5, sum=10000)
        main()
        exercise_file = open("Exercise.txt", "r", encoding='utf-8')
        exercise_lines = exercise_file.readlines()
        answer_file = open("Answer.txt", "r", encoding='utf-8')
        answer_lines = answer_file.readlines()
        exercise_file.close()
        answer_file.close()
        self.assertEqual(len(exercise_lines), 10000)
        self.assertEqual(len(answer_lines), 10000)

测试结果

1727372171812.png
测试全部执行成功。

覆盖率

1727372142665.png

小结

  • 林楦:在去除重复表达式和添加多个小括号中一开始一直没有特别好的思路,拖了很长时间,通过不断查找资料,才陆陆续续有灵感。关于结对编程,我的搭档一直在帮助我,我基础较为薄弱,他会帮我找到很多有用的资料,帮我想到更简单的实现,我觉得结对编程需要队友间进行多交流沟通,好的合作可以大大提高开发效率。
  • 徐嘉炜:在结对编程的过程中,我认为一个非常重要的点就是集合讨论整个项目的需求以及如何实现。结对编程的优点便是两个人加快了编程的效率,但对于代码的提交,要记得提交之前先拉取合并,避免覆盖掉队友的,导致拉慢了进度,队友之间也要经常对接实现进度。

标签:结对,项目,grade,self,file,answer,txt,exercise
From: https://www.cnblogs.com/AAALin/p/18434688

相关文章

  • Java/Spring项目中包名以“com”开头的原因分析
    一、包名的基本概念1.1什么是包名?包名是Java中用来组织类和接口的一种机制,它为类提供了一个命名空间,防止命名冲突。通过包名,开发者可以更好地管理和结构化代码。1.2包名的结构Java的包名通常遵循以下结构:反向域名:包名通常使用公司的域名的反向形式作为前缀。例如,如果......
  • 系统集成项目管理工程师笔记1 - 第一章 信息化发展
    基础知识第一章信息化发展1.1信息与信息化1.1.1信息基础信息物质、能量以及其属性的标示的集合,是确定性的增加。以物质介质为载体,传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质,也不是能力。以一种普遍形式,表达物质运动规律,在客观世界中大量存在、产......
  • Wincc7.5sp2使用VBA6-全局模板、项目模板和页面模板
    这一篇博客在新浪发表过,那边还在审核,为了避免关闭服务,在这里再次发一遍。那边的博客发表后审核期间,如果想修改是不允许的,审核时间比较长,有点不合理。前面的VBA练习,都是针对具体的项目的具体画面进行编程,在wincc项目还可以全局VBA编程和具体项目VBA编程。我边看技术文档边做练习,......
  • 实操了 AI 大模型项目落地, 程序员成功转变为 AI 大模型工程师
    根据《2024年全球人工智能行业报告》最新的数据显示,全球AI市场预计将以每年超过40%的速度增长,到2030年市值将达到数万亿美元,这也是预示着在接下来的十年到十五年里,人工智能将获得巨大的发展红利。在过去的一年多时间里,我持续关注着大模型的发展趋势,并且尽可能地进行......
  • 结对项目
    基本信息这个作业属于哪个课程软件工程这个作业要求在哪里作业要求成员李炫杰(3122004953)郭梓佳(3122004945)Github地址https://github.com/gzjgit-hub/pairing_project.git这个作业的目标实现一个自动生成小学四则运算题目的命令行程序PSP表格......
  • python处理英语发音音频的项目
    项目需求是这样的:想要获取单词的发音音频,词性,解释,音标,拆分单音标,根据发音拆分音节。实现思路:1、如果是批量处理的话,提前准备好需要处理的单词词库(全是要处理的单词)。2、通过API(你们懂得)可以获取到单词的  词性,解释,发音音频,保存到数据库中,测试单词:conversation3、处......
  • Expo 搭建 RN 项目
    首先,我先问个问题,为什么要写RN项目?答:react-native 相信大部分前端开发都不会陌生——使用JavaScript和React编写原生移动应用。用js就能分ios和android的一杯羹。(哈哈,开个玩笑:)。玩笑归玩笑,但它能说明在开发移动应用领域,RN有它的一席之地。Expo介绍:Expo 搭建......
  • 【Qt】创建一个新项目 &&解析项目代码
    这里写目录标题1.QtCreator创建项目2.项目代码解析2.1main.cpp2.2widget.h2.3widget.cpp2.4.pro工程文件3.中间文件1.QtCreator创建项目首先我们要创建一个项目点击左上角的文件创建新文件选择Application中的QtWidgetsApplication方式进行创建新建项......
  • 旅游项目管理软件10软件,助力行业数字化转型
    市面上主流的10款旅游项目管理系统推荐:PingCode、Worktile、Trello、Asana、Basecamp、Monday.com、Smartsheet、Wrike、旅管家、Travelog。在旅游行业中,项目管理的复杂性常常让人感到不知所措,特别是面对多方协调、行程安排和预算控制时。这些挑战不仅影响团队效率,还可能导致......
  • AB plc设备数据 转profinet IO项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 网关采集ABPLC数据 25 用PROFINETIO协议转发数据 46 案例总结 71 案例说明设置网关采集ABPLC数据把采集的数据转成profinetIO协议转发给其他系统。2 VFBOX网关工作原理VFBOX网关是协议转换网关,是把一种协议......