结对项目

结对项目

这个作业属于哪个课程 软件工程
这个作业要求在哪里 结对作业
这个作业的目标 制作一个自动生成十以内四则运算的项目,熟悉结对项目的开发
Github仓库 Github
姓名 郑炜 冯可富
学号 3122004504 3122004476

PSP表

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

实现过程

生成运算式

  • 1.使用random.randint生成运算符的个数、所需数字、分数个数,然后同样用random.randint产生所需数字的列表并计算出分数(使用fraction库),最后统计出所用到的数字列表。其次,保证分数优先运算添加括号。
  • 2.使用 random.choice选择符号插入数字列表,把列表转换成string再使用eval函数计算出结果。此时,结果是分数应该是float型的循环小数,再使用fraction中的limit_denominator把结果转换成分数。若结果小于0大于r 、分母大于r重新生成数字列表和结果。再通过自建的字典对应手写的加减乘除符号和转换真分数,把数字列表和结果准换成字符串。
  • 3.最后采用字典存储等式、问式、答案,在存储等式前进行判断是否有存过,有则重新生成。
点击查看代码
def make_questions(num, limit):  # 产生题目
    no = 1  # 题目序号
    text_list = dict()  # 整条等式
    answer_list = dict()  # 答案部分
    question_list = dict()  # 问题部分
    while no <= num:  # 循环产生num个题目
        res, num_list = text(limit)
        if res < 0 or res > limit or res.denominator > limit:  # 若结果为0、大于r分母大于r则重新生成
            continue
        else:
            tag = 0  # 标记是否重复
            question = request_format(num_list)
            num_list.append("=")
            num_list.append((str(res)))
            exp = request_format(num_list)
            for i in text_list:  # ------------但生成式子多时效率很低------换种查找
                if text_list.get(i) == question:  # 判断是否有相同的式子后加入
                    tag = 1
            if tag == 1:  # 判断是否新增题目
                continue
            else:  # 新增题目
                text_list[no] = question
                question_list[no] = exp
                if res > 1 and res.denominator != 1:  # 转换为真分数
                    integer_part = res // 1  # 得到整数部分
                    proper_fraction = res % 1  # 得到真分数部分
                    res = "{}\'{}".format(integer_part, proper_fraction)
                answer_list[no] = res
                no += 1

    return [text_list, answer_list, question_list]  # 返回整个等式 答案 问式

文件读写

调用make_quesetions函数取得字典返回值后,使用with...as打开文件,循环取得键入key,在依次写入Exercises.txt和Answer.txt中。

def file(num,limit):
    startT = time()             #起始时间
    bag = make_questions(num,limit) #bag取make_questions的返回值列表
    with open('Exercises.txt','w',encoding='utf-8') as f:   #问题
        for i in range(num):
            question = bag[0][i+1]      #bag[0]是问题字典
            f.write("{}. {}\n".format(i+1,question))
    with open('Answer.txt','w',encoding='utf-8') as k:      #答案
        for i in range(num):
            answer = bag[1][i+1]        #bag[1]是答案字典
            k.write("{}. {}\n".format(i+1,answer))
    with open('test.txt','w',encoding='utf-8') as g:        #整式
        for i in range(num):
            test = bag[2][i+1]          #bag[2]是整式字典
            g.write("{}. {}\n".format(i+1,test))

    endT = time()               #终止时间
    print("time = %.2g 秒\n" % (endT - start))

主要函数

使用命令行参数控制生成的题目数量以及数字的范围。

点击查看代码
def main():
    str_input = ''
    for i in range(1, len(sys.argv)):
        str_input += sys.argv[i]
    num_arg = '-n([\d]+)'
    limit_arg = '-r([\d]+)'
    num = int(re.search(num_arg,str_input).group(1))
    limit = int(re.search(limit_arg,str_input).group(1))
    if (num <= 0) or (limit <= 0):
        print("[-]参数错误")
        print("exiting")
        return
    else:
        file(num,limit)
        return 0

测试

生成十道题目。
问题答案
输入

生成10000道题目
问题答案

输入

代码覆盖率

代码覆盖率

总结

  • 郑炜:在生成题目部分,有部分代码好像进行了重复的操作,感觉可以进行优化精简。有的地方当数据庞大的时候效率不够搞,感觉还可以采用更好的存储方式和算法。
  • 冯可富:文件写入函数内重复内容过多,应该再用一个函数来使得代码精简一点。这次结对项目过程我俩就沟通时间不算多,就这点而言我觉得我俩应该在改进一下,尽量做到实时沟通进度,这样就会更高效的完成项目。
posted @ 2024-03-26 13:32  栗子真的很好吃  阅读(9)  评论(0编辑  收藏  举报