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

结对项目

时间:2023-09-27 16:00:12浏览次数:34  
标签:结对 20 项目 python res 模块 题目 expression

作业概述

这个作业属于哪个课程 软件工程
这个作业要求在哪里 结对项目
这个作业的目标 和同伴共同合作完成项目

成员

  • 曹富城 学号:3121005076
  • 何继安 学号:3121005087

一、github链接

https://github.com/flash2-man/calculator
https://github.com/muxingtong/MyCalculator

二、PSP表

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

三、分析

  • 题目:实现一个自动生成小学四则运算题目的命令行程序

需求

  • 通过命令行参数控制程序功能
  • 生成不重复的题目
  • 计算题目答案
  • 批改,对比正确答案
  • 文件输入输出

初步模块设计图

1
2

最终采取的算法有所不同

思路

读取参数->调用对应模块
1、生成模块->检测模块->生成->写入模块
2、读取模块->计算模块->批改模块->写入模块
3、报错

四、实现

  1. 文件读写模块:包括读取文件和写入文件的函数,用于读取题目和答案文件,并将批改结果写入文件。
  2. 命令行参数解析模块:使用argparse库解析命令行参数,根据参数的不同执行不同的功能。
  3. 题目生成模块:根据指定的题目数量和运算数的最大值,生成指定数量的四则运算题目,并将题目和答案分别写入文件。
  4. 题目批改模块:读取题目和答案文件,逐行比较题目和答案,判断答案是否正确,并统计正确和错误的题目数量,最后将批改结果写入文件。

核心代码:

产生运算式子函数:

去重方法:使用集合expressions来保存已经生成的题目的逆波兰表达式。在生成每个题目之前,会将当前题目的逆波兰表达式与集合中的表达式进行比较,如果存在相同的逆波兰表达式或者结果小于0,则重新生成下一个题目。只有当题目的逆波兰表达式不重复且结果大于等于0时,才会将题目添加到集合中,并继续生成下一个题目。

def generate_expression(num_operators, scope):
    if num_operators == 0:
        num = random.randint(1, scope - 1)
        return str(num)
    else:
        operator = random.choice(symbol)
        num1 = generate_expression(num_operators - 1, scope)
        num2 = generate_expression(num_operators - 1, scope)

        expression = f"{num1} {operator} {num2}"
        if random.choice([True, False]):
            expression = f"({expression})"
        return expression
去重函数:
def is_duplicate(expression):
    rpn_expression = convert_to_rpn(expression)
    return rpn_expression in expressions

# 将中缀表达式转换为逆波兰表达式
def convert_to_rpn(expression):
    stack = []
    rpn = []
    for token in expression:
        if token in symbol:
            while stack and stack[-1] in symbol and symbol.index(stack[-1]) >= symbol.index(token):
                rpn.append(stack.pop())
            stack.append(token)
        else:
            rpn.append(token)
    while stack:
        rpn.append(stack.pop())
return tuple(rpn)  # 返回元组以便比较

批改代码部分:

使用正则表达式识别题目

incorrect_questions = []
    correct_questions = []
    for i, (line1, line2) in enumerate(zip(exercises, answers), 1):
        # 正则表达式!!!!!!!
        expression_match = re.match(r'四则运算题目.\d+\t(.*?)=', line1)
        result_match = re.search(r'\t(.*)$', line2)
        if expression_match and result_match:
            expression = expression_match.group(1).strip()
            result = result_match.group(1).strip()
            res = Fraction(eval(expression)).limit_denominator()
            result_end = f"{res.numerator // res.denominator}'{res.numerator % res.denominator}/{res.denominator}" \
                if res.numerator > res.denominator != 1 else str(res)
            if result_end == str(result):
                correct_count += 1
                correct_questions.append(str(i))
            else:
                wrong_count += 1
                incorrect_questions.append(str(i))
    # 清空文件
    open('Grade.txt', 'w').close()
    writefile('Grade.txt', f"Correct: {correct_count} ({', '.join(correct_questions)})\n")
    writefile('Grade.txt', f"Wrong: {wrong_count} ({', '.join(incorrect_questions)})\n")
    print(f"Correct answers: {correct_count},({', '.join(correct_questions)})\n")
    print(f"Wrong answers: {wrong_count},({', '.join(incorrect_questions)})\n")

五、性能测试

生成题目时

3
6

批改题目时

4
5

python main.py 
python main.py -n 10
python main.py -n 10000
python main.py -r 10
python main.py -n 10 -r 10
python main.py -n 10000 -r 1000
python main.py -n -r #报错
python main.py -e path1 -a path2
python main.py -e -a #报错

运行结果

7
9
10

六、结对感受

  • 曹富城同学:

这个项目总体上还是有难度的,之前想用别的语言写,但是实现难度有点大,后面就改用python了,总体来说这个项目做的还是挺可以的,满足了相关要求,在实践中也产生了很多很有价值的灵感,最终在不断实践纠错中提高自己,不过不足的地方在没有实现可视化界面的实现。结对编程让我对一个产品的开发有了更深的认识,可以看到一些之前没出现过的错误,两者相辅相成,将原本的版本修改的更符合用户体验了,同时也更明白了模块化的便捷性和合理性,更有助于开发项目。

  • 何继安同学:

这是我第一次和同伴合作完成项目,总体来说我对这次项目完成感觉还可以,在这个项目里,我认识到了一个程序模块化的重要性,用户体验感的必要性,在优化的过程中,我更深刻地体会到这个程序的运行过程。在实现过程中,我负责代码最终测试和优化,以我的角度去复审同伴的代码,找出其中不足,这让我有不一样的体会,对结对编程和软件工程有了更深刻的认识,让我开始期待团队项目的开始。对于同伴的建议:希望同伴能重视程序的模块化和用户的体验感。

标签:结对,20,项目,python,res,模块,题目,expression
From: https://www.cnblogs.com/moyuchenhui/p/17732902.html

相关文章

  • 一键生成,轻松搭建你的Spring Boot+MyBatis-Plus项目!
    ......
  • vue3项目结合ant design vue的upLoad组件实现上传和下载Excel文件
    1.上传文件  1.组件引入    import{ Button, Upload}from'ant-design-vue'  2.代码    <Upload      v-model:file-list="fileList"      name="file"      //限制文件格式      acce......
  • Maven项目,本地jar包导入手动导入到Maven库中
    一、手动添加jar包到Maven仓库(1)在pom.xml加入依赖,例如:(2)把包拷贝到到mavenhome下,然后进入bin目录下,执行mvninstall:install-file-Dfile=C:\Users\admin\Desktop\1.0-SNAPSHOT\1.0-SNAPSHOT\common-file-1.0-SNAPSHOT.jar-DgroupId=com.chinatower.awh.file-DartifactId=c......
  • jenkins自动部署web项目到tomcat 和 本地启动不一致 tomact log中文乱码
    最近项目使用jenkins来自动化部署,部署后发现catalina.out日志中文是乱码的。如果使用手动部署不经过Jenkins的话项目就一切正常。所以我想有可能是因为jenkins部署的时候,导致目标服务器那边获取不到相应的环境变量。在tomcat日志中发现,手动启动使用的是自己安装的JDK,而用jenkins......
  • vue项目以excel表格的形式下载table数据
    1,安装插件   [email protected]   [email protected],创建js文件编写代码    importFileSaverfrom'file-saver';   import*asXLSXfrom'xlsx';   //导出Excel表格   exportfunctionexportE......
  • 北上广深科技项目验收测试报告标准是什么?
    ​科技项目验收测试一、科技项目验收是什么?科技项目验收是指以科学研究和技术开发为内容而单独立项的项目,其目的在于解决经济和社会发展中出现的科学技术问题。不同的科技项目,根据其性质、实施范围、运作特点有不同的分类,项目的主管单位在项目组申请结题以后组织验收的步骤。......
  • Vue 3.0开发的开源前端项目
    文章来源:https://zhuanlan.zhihu.com/p/587627578 1,PPTistPPTist是一个基于Vue3.x+TypeScript+Pinia+AntDesignVue+Canvas开发的在线演示文稿(幻灯片)应用,还原了大部分OfficePowerPoint的功能,支持文字、图片、形状、线条、图表、表格、视频、音频、公式几种最常......
  • 热门敏捷项目管理工具(收藏)
    ​敏捷管理研发工具可以协助团队更好地进行敏捷开发和管理。以下是几种流行的敏捷管理研发工具:Leangoo:Leangoo领歌一款永久免费的专业敏捷研发管理工具,它覆盖了敏捷项目研发全流程,包括小型团队敏捷开发,规模化敏捷SAFe,ScrumofScrums大规模敏捷。Tuleap:Tuleap是一款免费开源项......
  • django 项目跨域
    安装django-cors-headers模块pipinstalldjango-cors-headers在settings.py中配置INSTALLED_APPS=[...'corsheaders',...]MIDDLEWARE=[...'corsheaders.middleware.CorsMiddleware',...]#允许跨域源CORS_ORIGIN_ALLOW_......
  • django 项目接受 post 请求
    修改settings.py文件MIDDLEWARE=[...#注释掉这个#'django.middleware.csrf.CsrfViewMiddleware',...] ......