基于Python实现的四则运算生成程序

Github项目地址:传送门

小组成员:黄晓彬(代码实现) 黄钰城(代码审查)

需求:

1. 使用 -n 参数控制生成题目的个数。

2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围。

3. 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 ? e2的子表达式,那么e1 ≥ e2

4. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。

5. 每道题目中出现的运算符个数不超过3个。

6. 程序一次运行生成的题目不能重复,

生成的题目存入执行程序的当前目录下的Exercises.txt文件。

7. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件。

8. 程序应能支持一万道题目的生成。

9. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,输入参数如下:

Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt

统计结果输出到文件Grade.txt,格式如下:

Correct: 5 (1, 3, 5, 7, 9)

Wrong: 5 (2, 4, 6, 8, 10)

其中“:”后面的数字5表示对/错的题目的数量,括号内的是对/错题目的编号。为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。(未实现)

PSP表格:


PSP2.1


Personal Software Process Stages


预估耗时(分钟)


实际耗时(分钟)


Planning


计划


30


30


· Estimate


· 估计这个任务需要多少时间


30


60


Development


开发


480


520


· Analysis


· 需求分析 (包括学习新技术)


120


200


· Design Spec


· 生成设计文档


60


70


· Design Review


· 设计复审 (和同事审核设计文档)


30


60


· Coding Standard


· 代码规范 (为目前的开发制定合适的规范)


30


30


· Design


· 具体设计


60


60


· Coding


· 具体编码


600


700


· Code Review


· 代码复审


500


700


· Test


· 测试(自我测试,修改代码,提交修改)


200


300


Reporting


报告


60


30


· Test Report


· 测试报告


30


30


· Size Measurement


· 计算工作量


60


30


· Postmortem & Process Improvement Plan


· 事后总结, 并提出过程改进计划


30


40


合计


2230


2860

效能分析:算法运行过程较慢,没有使用数据结构进行优化,并且还大量使用库函数,导致结果运行缓慢

设计实现过程:接收命令行参数-->获取数值和符号列表-->计算结果并生成题目和答案列表-->存入两个txt文件

函数 功能
get_num_sym(i,r) 获取数值列表和符号列表
calculate(a,b,s) 计算单元,a,b是数,s是符号
f(f) 分数的转换
 writeF(slist,num,hb) 生成算术表达式
getF(n,r) 用于生成题目和答案列表
save(fname, d) 用于写入文件
main() 主函数

代码说明:

用get_num_sym(i,r)函数循环遍历以获得随机分数列表和符号列表

def get_num_sym(i,r):#获取数值列表和符号列表
    nlist=[]#数值列表
    slist=[]#符号列表
    hb=0#判断怎么加括号
    l=0#判断是否是减数运算
    for m in range(i+1):#根据i的值遍历输出数值列表
        nlist.append(Fraction(random.randint(1, r), random.randint(1, r)))
    for x in range(i):
        sy=random.choice([‘+‘,‘-‘,‘ב,‘÷‘])
        if sy==‘+‘or sy==‘-‘:
            hb +=10**(i-x-1)
        else :
            hb += 2 * (10 ** (i - x - 1))
        slist.append(sy)
        if sy==‘-‘:
            l=1
    return nlist,slist,hb,i,l

把分数转换为整数、真分数和带分数

def f(f):#分数的转换
    a=f.numerator
    b=f.denominator
    if a%b==0:#为整数
        return ‘%d‘%(a/b)
    elif a<b:#为真分数
        return ‘%d%s%d‘ % (a,‘/‘,b)
    else:#为带分数
        c=int(a/b)
        a = a - c * b
        return ‘%d%s%d%s%d‘ % (c,‘’‘,a,‘/‘,b)

用于四则运算

def calculate(a,b,s):#计算单元,a,b是数,s是符号
    ans=0
    if s==‘+‘:#加法运算
        ans=a+b
    elif s==‘-‘:#减法运算
        a,b=max(a,b),min(a,b)#防止结果为负数
        ans=a-b
    elif s==‘ב:#乘法运算
        ans=a*b
    else:ans=a/b#除法运算
    return ans

生成算术表达式

def writeF(slist,num,hb):#生成算术表达式
    global j,k
    s=‘‘
    if hb>100:#符号数为3
        if j==1 and k==0:
            s = ‘%s %s (%s %s %s) %s %s = ‘ % (f(num[0]), slist[0],
            f(num[1]),slist[1], f(num[2]), slist[2], f(num[3]))
        elif j==1 and k==1:
            s = ‘%s %s (%s %s (%s %s %s)) = ‘ % (f(num[0]), slist[0],
            f(num[1]),slist[1], f(num[2]), slist[2], f(num[3]))
        elif j==0 and k==1:
            s = ‘%s %s (%s %s %s %s %s) = ‘ % (f(num[0]), slist[0],
            f(num[1]),slist[1], f(num[2]), slist[2], f(num[3]))
        if hb == 112 or hb ==212:
            s = ‘(%s %s %s %s %s) %s %s = ‘ % (f(num[0]), slist[0],
            f(num[1]),slist[1], f(num[2]), slist[2], f(num[3]))
        elif hb == 121 or hb ==122:
            s = ‘(%s %s %s) %s %s %s %s = ‘ % (f(num[0]), slist[0],
            f(num[1]),slist[1], f(num[2]), slist[2], f(num[3]))
        else:
            s = ‘%s %s %s %s %s %s %s = ‘ % (f(num[0]), slist[0],
            f(num[1]),slist[1], f(num[2]), slist[2], f(num[3]))
    elif hb>10:#符号数为2
        if j==1 :
            s = ‘%s %s (%s %s %s) = ‘ % (f(num[0]), slist[0],
            f(num[1]), slist[1], f(num[2]))
        if hb == 12:
            s = ‘(%s %s %s)%s %s = ‘ % (f(num[0]), slist[0],
            f(num[1]), slist[1], f(num[2]))
        else:
            s = ‘%s %s %s %s %s = ‘ % (f(num[0]), slist[0],
            f(num[1]), slist[1], f(num[2]))
    else :#符号数为1
        s =‘%s %s %s = ‘ % (f(num[0]),slist[0],f(num[1]))
    return s

生成题目和答案列表

def getF(n,r):#用于生成题目和答案列表
    E,A,E1,E2=[],[],[],[]
    global j,k
    x=1
    while x<n+1:#循环生成题目和答案列表
        i=random.randint(1, 3)#随机获取符号数目
        num,slist,hb,i,l=get_num_sym(i,r)
        num1=num
        legal = True
        if l==1: #用于防止除法运算出现负数
            if  num[0]<num[1]:
                num1[0],num1[1]=num[1],num[0]
            if i>=2 and calculate(num[0],num[1],slist[0])<num[2]:
                num1[0],num1[1],num1[2]=num[2],num[0],num[1]
                j=1
            if i>=3 and calculate(calculate(num[0],num[1],slist[0]),num[2],slist[1])<num[3]:
                num1[0],num1[1],num1[2],num1[3]=num[3],num[0],num[1],num[2]
                k=1
        ans=num1[0]
        for y in range(i):
            cal=calculate(ans,num[y+1],slist[y])
            if cal>=0:#判断算式是否合法
                ans=cal
            else:
                legal=False
                break
        if legal:#判断是否重复题目
            try:
                num=A.index(ans)#第一个重复答案的索引
                if operator.eq(E1[num],slist) and operator.eq(E2[num],num):
                    pass
            except ValueError as e:#可以写入
                A.append(ans)
                E1.append(slist)
                E2.append(num1)
                E.append(‘%d. %s‘%(x,writeF(slist,num1,hb)))
                x+=1
        else:pass
    return E,A

写入txt文件

def save(fname, d):#fname为写入文件的路径,d为要写入的数据列表.
    file = open(fname,‘a‘)
    file.seek(0)
    file.truncate() #清空
    for i in range(len(d)):#循环写入文件fname
        s = str(d[i]).replace(‘[‘,‘‘).replace(‘]‘,‘‘)
        s = s.replace("‘",‘‘).replace(‘,‘,‘‘) +‘\n‘
        file.write(s)

    file.close()
    print(‘%s文件保存成功‘%fname)

主函数(包括命令行参数的实现)

def main():#主函数
    parser = argparse.ArgumentParser(description="this is auto calculator")#命令行参数控制
    parser.add_argument(‘-n‘,help=‘控制生成题目的个数‘,type=int)
    parser.add_argument(‘-r‘,help=‘控制题目中数值(自然数、真分数和真分数分母)的范围‘,type=int)
    args = parser.parse_args()
    if args.n:
        n=args.n
        print(‘n值为%d‘%n)
    if args.r:
        r=args.r
        print(‘r值为%d‘%r)
        E, A=getF(n,r)
        for x in range(n):#循环生成答案列表
            A[x]=‘%d. %s‘%(x+1,f(A[x]))
        save(‘Exercises.txt‘,E)
        save(‘Answers.txt‘,A)

    end = time.clock()
    print(‘运行时间: %s ‘%(end-start))

if __name__ == ‘__main__‘:
    main()

测试运行:

一万道题目生成:

 

项目小结:由于我们两个Python水平有限,花了几天都想不出到底要怎么写这个程序,最后还是问了同学加上网看别人写的思路,通过先全部随机生成分数(分数包括了自然数),在用函数区分自然数、真分数和带分数,再用函数根据条件的不同生成不同的表达式,并通过单步循环计算出结果,最后再根据情况加括号(其实是前面忘了,后面为了这个花了很长时间),才完成了这个自动生成程序。通过这次编程,我深刻感受到自己写Python的技术有待提高,代码让钰诚看得一头包,bug更是跟修不完似的。两个人的编程和一个人的还是有很大的不同,意见的不统一,想法的不同都会让我们产生分歧甚至是争执,这种时候良好的沟通才是最重要的。

原文地址:https://www.cnblogs.com/busizzzz/p/9733211.html

时间: 2024-10-24 22:02:30

基于Python实现的四则运算生成程序的相关文章

基于Python Requests的数据驱动的HTTP接口测试

发表于:2017-8-30 11:56  作者:顾翔   来源:51Testing软件测试网原创 http://www.51testing.com/html/69/n-3720769-2.html 1.测试金字塔 图 1软件测试金字塔 图 1是Main Cohn提出的软件测试金字塔,他认为作为一个测试工程师应该把大量的工作花在单元测试和接口测试,而其余的发在UI测试以及探索式测试.纵然,单元测试的优点很突出,它接近于代码本身,运行速度快,开发可以一边写产品代码一边写单元测试代码,一旦在单元测试中

【Machine Learn】决策树案例:基于python的商品购买能力预测系统

决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结合视频学习和书籍基础的笔记所得.本系列文章将采用理论结合实践方式编写.首先介绍机器学习和深度学习的范畴,然后介绍关于训练集.测试集等介绍.接着分别介绍机器学习常用算法,分别是监督学习之分类(决策树.临近取样.支持向量机.神经网络算法)监督学习之回归(线性回归.非线性回归)非监督学习(

关于《selenium2自动测试实战--基于Python语言》

关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至会说,都在扯犊子,看了半天也不知道如何下手. 对于操作手册的书,一般会提供大量的实例,告诉你详细的步骤.对于高手来说,这不就是翻译了一下官方文档嘛,好意思拿来骗钱.但对于新手来说,反而认为是好处,跟着上面的步骤操作就掌握了某种技术能力. 显然,本书属于后者,书中提供了大量代码实例,并没有太多思想层面

基于Python Spark的大数据分析_pyspark实战项目课程

基于Python Spark的大数据分析(第一期) 课程介绍地址:http://www.xuetuwuyou.com/course/173 课程出自学途无忧网:http://www.xuetuwuyou.com 讲师:轩宇老师 1.开课时间:小班化教学授课,第一期开课时间为5月20号(满30人开班,先报先学!): 2.学习方式:在线直播,共8次课,每次2小时,每周2次(周三.六,晚上20:30 - 22:30),提供在线视频,课后反复学习: 3.报名课程后,请联系客服申请加入班级答疑交流QQ群:

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区

Appium基于python unittest自动化测试并生成html测试报告

本文基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: 1 #利用unittest并生成测试报告 2 class Appium_test(unittest.TestCase): 3 """appium测试类""" 4 def setUp(self): 5 desired_caps = { 6 'platformName': 'Android', 7 'deviceName': 'An

简易四则运算生成程序——第一次改进后的单元测试

测试项目:减一四则运算生成程序 项目成员:张金生  张政 工程地址:https://coding.net/u/jx8zjs/p/paperOne/git ssh://[email protected]:jx8zjs/paperOne.git 测试单元概览: 1. Fraction: 分数类,支持分数加减乘除法,约分,取相反数等 2.QuestionGen:题目生成类,支持生成各种难度的题目,和答案. 待测单元: Fraction类: 1 public class Fraction { 2 pub

符号执行-基于python的二进制分析框架angr

转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由King在1976年提出 ,经过三十多年的发展,现在仍然被广泛研究,它在软件测试和程序验证中发挥着重 要作用.符号执行是一种重要的形式化方法和静态分析技术,它使用数学和逻辑 首先定义一些基本概念.程序的路径(path)是程序的一个语句序列,这个 语句序列包括程序的一些顺序的代码片段,代码片段之间的连接是由

基于Python+Django的Kubernetes集群管理平台

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/1345 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调度管理等方面都有其难以言喻的优势,但是随着业务的不断增长,以及服务的多元化,容器的体量与管理的难度也随之增长. 浅述Kubernetes集群日常管理维护中的一些痛点: 1.较为庞大的集群规模及容器数量维护管理