个人项目实战-四则混合运算-项目总结
个人项目实战-四则混合运算
代码仓库地址:https://git.dev.tencent.com/Woohxe/fourArithmetic.git
测试效果见result.txt文件
一、 需求分析与功能设计
-
接收一个输入参数n,随机产生n道加减乘除练习题,分别使用符号±*÷来表示
-
每个数字在 0 和 100 之间
-
运算符在3个到5个之间并且每道练习题至少要包含2种运算符
-
运算过程中及结果不得出现负数与非整数
-
将学号和生成的练习题及对应答案输出到文件“result.txt”中,不输出额外信息,生成文件目录与程序目录一致
附加需求
-
支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号数必须大于2对(包括两对),且不得超过运算符的个数。
-
支持真分数的加减法运算,运算过程中能够实现自动化简。
基本功能
能够根据用户输入的参数n随机产生n道符合要求的四则混合运算练习题,自动算出答案,并将式子与答案以文档的形式呈现。
扩展功能
支持有括号的运算、支持最简真分数的加减运算
二、 设计实现
:---------:
Main类:主类,负责接收命令行的参数n并创建文件,调用createFile类。
createFile类:负责创建文件,负责产生result.text文件,将学号与练习题写入文件。每次随机生成出题类型。
ranDesign类:根据createFile类随机生成式子,负责根据调用产生同种类型的式子,含有calcu(正常的四则运算)、fraction(真分数运算)、brackets(带括号的四则运算)。
calculate类:计算结果,含有判断减法符号、判断是否除尽、根据分子求分母、求取最大公因数、求取最小公倍数、判断真分数加法、判断真分数减法等方法。
关系图如下:
三、 算法过程
刚开始写代码时,由于java的知识遗忘的有点多,能够算是边学边敲,期间一度因为递归条件没有写明导致栈内存不足而运行错误。
具体算法:https://git.dev.tencent.com/Woohxe/fourArithmetic.git
正常四则运算
实现了减法不出现负数,除数不出现小数,由于之前一直解决不了计算过程中重复判断结果,设定了减法后面只能出现加法,除法之后只能出现加法或乘法,但是在后面写完真分数之后实现了中间结果保留的方法,后期代码会进行修改。式子使用for循环,每次生成一个随机数与一个随机符号加入字符串s中,判断符号间数字运行的结果是否符合要求。执行完循环后,s最后再加上最后一个算数。计算后,连同式子一并输出,结果使用java调用js中的eval(String)函数进行求解。最后遍历全部的运算符与第一个符号相比,判断是否所有符号相同,全部相同则不输出并重新生成式子。
真分数运算
实现了基础的四则运算之后,只需要进行分数的生成与化简即可,化简使用的是辗转相除法。刚开始分母分子的取值范围都设定在和之前一样的0~100之间,这个时候命令行会报除0错误,生成过程中发现分母在二次运算以上会过大,所以后期修改分母的设定值在1到20,分子的在1到10之间,只是有时候最后一个分母还是会生成过大的数,这个在后期看看如何完善。
带括号运算
理解了之前学长学姐们用的调度场和逆波兰表达式,但是没有想出来如何在算法之前实现结果的判断,无法判断其是负数还是小数,所以采用了固定格式生成带有括号的运算,在这些括号里面的简单运算通过调用前面的方法能够确保结果的非负性以及是整数。
四、 测试运行
进入src文件下,输入javac Main.java 编译出相应的class文件,再输入java Main 20/1000进行测试。
测试结果如下图:这是运行过程中经常出现的问题,后来发现是多层递归没有写好终止条件导致的。
六、 总结
刚开始对此毫无思路,在老师给我们上课看了几个学姐学长的例子之后,选择将此分为四个方法,方便后期的修改而不影响。但是刚开始明显思路是局限于学长学姐们的代码里了,也没有很好的设计好算法的结构,导致很多次写到一半才发现不可行,后面理解之后自己敲出来运行成功的代码还是很开心的。
七、PSP
还有很多不足需要改正,以后继续补充。