Java接口四个类四则运算_java 实现四则运算小程序

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

1.需求分析:

(1) 按照用户输入来控制题目生成个数以及随机数的值域;

(2)生成题目与答案的TXT文件;

(3)提供作答核对功能;

(4)表达式生成与处理:

2.功能设计:

(1) 根据用户输入生成相应表达式:

根据题目要求,表达式中操作符个数不少于3个。故生成一个随机数,根据随机数先确定本次生成的表达式的操作符个数。按照不同操作符个数分别处理,按照输入的数值范围生成随机数,使用了一个随机变量控制了分数生成的概率。对操作符÷进行特殊处理,保证了÷后的数值不为0,将生成的数字与操作符进行拼接得到中缀表达式, 对于括号的添加同样用随机数控制。(对二元运算不进行添加括号的判定)。对得到的表达式用String.split()以" "为标识符进行分割,得到一个字符串数组方便进行后续的中缀表达式转换为后缀表达式。

(2)表达式查重:

由生成的中缀表达式转换成后缀表达式(见代码中Tohouzhui类),并根据后缀表达式建立二叉树。

一开始自己想的查重方法是将表达式的答案存入数组,在新生成表达式时,将答案进行对比,只要答案不相同就一定不重复。后来发现这种查重局限性很大。当生成题目较少而数值范围大时,可以使用且查重效率高。但是当生成题目较多而数值范围较小时,这种方法导致生成题目的效率变得缓慢(已生成较多表达式时,同答案的不同表达式仍会被放弃),且后期查重的效率较低。

也想过通过层次遍历表达式二叉树的方法来查重,因为实现起来比较复杂,效率也不够高的原因还是放弃。按照模版里的那种方法,通过一定的规则生成二叉树,将*和+可能出现的通过有限次交换导致重复的情况避免。具体规则如下:若生成节点的对象是*或者+

1.左右子树的值不同,则值大的作为左子树

2.左右子树的值相同时,判断子树的运算符优先级大小,优先级大的作为左子树

3.运算符优先级相同,判断子树下的左子树值得大小,值大的作为左子树

4.若为子树为一个为数字,一个为运算符,则运算符作为左子树

5.若左右子树都为数字,则值大的作为左子树

根据这个规则,基本上包含了交换律可能出现的情况,将可以有交换律变换得到的表达式都转为一个统一的表达式。从而可以直接比对二叉树后序遍历得到的后缀表达式来实现查重。

(3)将表达式及答案输出至文件:

通过后缀表达式能较轻松的计算出表达式的值,只是对分数需要进行特殊处理。

(4)对用户作答进行批改

限制了作答规范,比对时只要逐行验证字符串是否相同即可;

重要代码展示:

太多了,感觉都很重要,还是看coding里的吧

程序运行截图:

88db03bec23d32948f3cc61a589a46b9.png

9e45a28daf7cda4daa7ba31d5f663bb3.png

上图为生成10000道题值域为100的测试,表达式下方是后缀表达式。

ffcaa47852c9ecec9ca4bb35bd64afb0.png

726742263ab9182ba6acbbba17b9692e.png

生成的题目和答案txt文件

答案核对测试:

从新生成5道题

32cf885a842100d1420aa381378c8145.png

答案如下

02fc989a921117b2f4ecb025425b0380.png

在do.txt中进行回答

492b2915e45fadac6fd1099cea064c59.png

比对结果:

d9d9fc80a013b685711f51af3cfdacaf.png

项目估算:

49f246a215224abddde2923f39a28dc4.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 编写一个实现复数的运算。 复数ComplexNumber的属性: m_dRealPart:实部,代表复数的实数部分。 m_dImaginPart:虚部,代表复数的虚数部分。 复数ComplexNumber的方法: ComplexNumber():构造函数,将实部、虚部都置为0。 ComplexNumber(double r,double i):构造函数,创建复数对象的同时完成复数的实部、虚部的初始化,r为实部的初值,i为虚部的初值。 getRealPart():获得复数对象的实部。 getImaginPart():获得复数对象的虚部。 setRealPart(double d):把当前复数对象的实部设置为给定的形式参数的数字。 setImaginaryPart(double d):把当前复数对象的虚部设置为给定的形式参数的数字。 complexAdd(ComplexNumber c):当前复数对象与形式参数复数对象相加,所得的结果也是复数值,返回给此方法的调用者。 complexAdd(double c):当前复数对象与形式参数实数对象相加,所得的结果仍是复数值,返回给此方法的调用者。 complexMinus(ComplexNumber c) :当前复数对象与形式参数复数对象相减,所得的结果也是复数值,返回给此方法的调用者。 complexMinus(double c) :当前复数对象与形式参数实数对象相减,所得的结果仍是复数值,返回给此方法的调用者。 complexMulti(ComplexNumber c):当前复数对象与形式参数复数对象相乘,所得的结果也是复数值,返回给此方法的调用者。 complexMulti(double c):当前复数对象与形式参数实数对象相乘,所得的结果仍是复数值,返回给此方法的调用者。 toString():把当前复数对象的实部、虚部组合成a+bi的字符串形式,其中和分别为实部和虚部的数据。 2. 编写Java Application程序使用上题定义的,检查定义是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值