四则运算题目生成程序

题目地址:http://www.cnblogs.com/HQL0301/p/7502315.html

程序码云地址:https://gitee.com/bingo2464/four_operations__console

需求分析:

                   本程序是基于控制台的用来自动生成四则运算表达式,以及自动生成答案和批改的的程序;通过输入数字大小和题目数目来控制题目的生成;生成带有生成包含‘+’,‘-’,‘*’,‘/’,‘(’,‘)’的四则运算表达   式,题目的/为除号,表达式中的运算数皆为整数,但最后的结果包含分数,且最后的结果支持真分数的运算;程序支持1W道题目的生成,生成题目后将题目和题目的运算结果保存至文件保存。程序能够对生成的题目进行查重,允许生成重复题目,但重复信息会在最后的结果分析中显示;

功能设计基本功能:程序自动生成题目及答案,学生答题后,程序进行判断对错。程序批量生成题目及答案至相应文档。学生答题后提交相应文档,程序进行分析并得出结果。

                    扩展功能:程序生成题目可能会有重复的,所以程序最后分析时应该给出查重分析。

                    高级功能:后序可以将基于控制台的条件去除,改为Web端或APP的形式。

 .设计实现:

                        本次试验我一共用了8个类,其中

                        Create类生成题目类:通过生成随机数来控制是否生成括号和运算符,生成字符串型表达式,再通过集合的形式实现批量生成。

                        TreeNode类:二叉树定义类。

                        BinaryTree类:二叉树生成类;从尾部到头部扫描表达式,最先扫描到的不在括号中的加号或减号必为表达式运算的最后一次操作,将其置于根节点,若无加减号则将最先扫描到的不在括号中的乘号或除号置于根节点,将表达式由此位置分为两个字串,重复此操作,直到表达式全部为二叉树的节点,其中必然有 数字位于叶节点。

                        IsZero类:判断分母是否为0;因为有括号的加入,所以我们必须保证除号后面的括号内的运算结果不为0;Create类在批量生成题目是必须先调用此类的getZero函数 来判断分母是否有为0的可能,若有则此表达式要重新生成。因为一开始没有考虑这个问题,所以出现了问题,解决此问题我采用了递归的思想计算除号的右字树。

                         Fraction类:分数类;因为考虑到分数的情况,后来才添加进来的一个类;因为运算数一开始都为整数只是因为有除号的出现才有分数的出现,所以我们将整数表达为整数/1的分数形式,在进行分数的各项加减乘除运算;因为运算时并没有得到最简式,所以还应当对其进行约分(anonym函数)

                        Answer类:生成答案类;在将表达式生成二叉树后,采用递归的思想,调用分数类,先计算二叉树的左子树,将返回结果与计算右子树得到的结果进行计算,得到 结果,最后因为答案的生成形式为真分数的形式,所以在调用分数类的FrcToStr函数将分数转化为真分数的形式(字符串的表达式);

                       Repeat类:查重类;将IsRepeat函数将两科树进行比较,若两棵树的根节点相同,比较其树1 的左子树与树2的左子树是否一样且树1 的右子树与树2的右子树是否一样;当其根节点为加号或乘号时,还需考虑树1的左子树与树2的右子树,树1耳朵右子树与树2的左子树相同的情况。

                        Result类:得到结果类;将学生提交的答案文档与程序生成的标准答案进行比对来判断对错;并将结果和题目重复信息显示到result.txt中。

                        test类:包含主函数。

测试运行:

 程序运行截图:

exam.txt:生成的题目为:

 

answer.txt:生成的答案为:

 

在a.txt中输入答题答案

 

 

result.txt 得到结果

 

展示PSP:

这是一个不知道该怎么填写的表。

PSP2.1

Personal Software Process Stages

Time Senior Student

Time

 

Planning

计划

30

20

 

· Estimate

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

800

700

 

Development

开发

600

500

 

· Analysis

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

10

5

 

· Design Spec

生成设计文档

30

40

 

· Design Review

设计复审

10

10

 

· Coding Standard

代码规范

10

10

 

· Design

具体设计

20

15

 

· Coding

具体编码

600

500

 

· Code Review

代码复审

10

10

 

· Test

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

20

30

 

Reporting

报告

30

60

 

·

测试报告

10

10

 

·

计算工作量

10

10

 

·

并提出过程改进计划

5

5

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

小结:  

本次实验采用了String类型的四则运算表达式,因为一开始没有考虑括号的情况,所以只考虑了/后面不能劫数字0的情况,后面加了括号就出现了类似1+/(4-4)的除号后接0的情况,索性后来测试的时候发现了,解决这个问题我采用了建树计算/右子树是否为0的情况,因为在此就建了树,可能比较浪费内存,但目前为止我还没有想到更好的办法解决它。本程序还存在一个问题是忽略了÷和/的区别,生成表达式的中只有/代表除号,就导致了生成的表达式的运算数必为整数,为整数的四则运算或者可以说表达式没有区分真分数,虽然在计算结果的时候有采用真分数的形式但还不够完善。

转载于:https://www.cnblogs.com/bingo2464/p/8678954.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于 Python 的自动生成四则运算题目程序实现方案: ```python import random # 定义运算符 operators = ['+', '-', '*', '/'] # 定义数字范围 min_num = 1 max_num = 100 # 定义生成表达式的函数 def generate_expression(): # 随机生成两个数字 num1 = random.randint(min_num, max_num) num2 = random.randint(min_num, max_num) # 随机选择一个运算符 op = random.choice(operators) # 生成表达式字符串 expression = "{} {} {}".format(num1, op, num2) # 返回表达式字符串和答案 if op == '+': answer = num1 + num2 elif op == '-': answer = num1 - num2 elif op == '*': answer = num1 * num2 else: answer = num1 / num2 return expression, answer # 定义生成表达式列表的函数 def generate_expressions(num): expressions = [] answers = [] for i in range(num): expression, answer = generate_expression() expressions.append(expression) answers.append(answer) return expressions, answers # 定义检查答案的函数 def check_answer(expression, answer, user_answer): if answer == user_answer: print("{} = {},回答正确!".format(expression, user_answer)) return 1 else: print("{} = {},回答错误!正确答案为 {}。".format(expression, user_answer, answer)) return 0 # 定义运行测试的函数 def run_test(): # 用户输入条件 num = int(input("请输入题目数量:")) operators_str = input("请输入要使用的运算符(+,-,*,/中的任意组合,例如'+-'表示使用加法和减法):") nums_range_str = input("请输入数字范围(用空格分隔,例如'1 100'表示使用1-100之间的数字):") # 解析用户输入条件 operators_to_use = [] for op in operators_str: if op in operators: operators_to_use.append(op) if not operators_to_use: operators_to_use = operators nums_range = nums_range_str.split() if len(nums_range) == 2: min_num = int(nums_range[0]) max_num = int(nums_range[1]) else: min_num = 1 max_num = 100 # 生成题目 expressions, answers = generate_expressions(num) # 等待用户输入答案并检查 score = 0 for i in range(num): print("第{}:{}".format(i + 1, expressions[i])) user_answer = int(input("请输入答案:")) score += check_answer(expressions[i], answers[i], user_answer) # 计算得分并输出测试结果 print("测试结束,得分:{}/{}。".format(score, num)) # 运行测试程序 run_test() ``` 以上代码中,我们通过定义多个函数实现了生成四则运算表达式、生成指定数量的四则运算表达式、计算表达式答案、检查用户输入答案是否正确等功能,并通过一个 `run_test` 函数将这些功能组合起来,实现了一个简单的四则运算题目自动生成程序。您可以根据自己的需求和实际情况进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值