四则运算 Java 实现 刘丰璨,王翠鸾

四则运算

GitHub仓库

功能实现

  • [x] 使用 -n 参数控制生成题目的个数,并且根据解空间限制用户设定的范围(如 range == 2 时,用户却要求生成 10000 道题目,这明显不合理)
  • [x] 使用 -r 参数控制题目中自然数、真分数、真分数分母的范围 该参数可以设置为大于 2 的自然数
  • [x] 生成的题目在计算过程不能产生负数
  • [x] 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数
  • [x] 程序一次运行生成的题目不能重复,生成的题目存入执行程序目录下的Exercises.txt文件中
  • [x] 每道题目中出现的运算符个数不超过3个(不包括括号)
  • [x] 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件
  • [x] 程序应能支持一万道题目的生成。
  • [x] 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计。

设计过程

表达式的生成

根据题目的要求,表达式中运算符不能超过 3 个,因此所生成的表达式种类可以归纳为以下四类:

  • 单算子表达式
    • 型如 A B 的表达式
    • 在生成表达式时在** + × **这种拥有交换律的符号时,默认按照查重式 A < B 的顺序排序查重即可
  • 双算子表达式
    • 型如 (A B) C 的表达式
    • 在生成表达式时只要保证括号内的符号满足交换律时,默认按照查重式 A < B 的顺序排序查重即可
  • 三算子 A 型表达式
    • 型如 ((A B) C) D) 的表达式
    • 在生成表达式时,查重规则和双算子表达式一样,只需要保持查重式中 A < B 而无需顾虑 C 和 D,因为根据题目定义 ((A B) C) D) 和 ((A B) D) C) 是两道不同的题目
  • 三算子 B 型表达式
    • 型如 (A B) (C D) 的表达式
    • 在生成表达式时,保证查重式 A < B 且 C < D 且 A < C 即可。

四种表达式的举例

上述表达中有几点需要解释:

查重式:在生成四则运算题目时,为了检查题目重复而对题目书写进行了特定排序的表达式。该表达式语义和实际题目是一样的,而只为查重服务,可能不会出现在最终的题目里。例如 1 + 2 就是 2 + 1 的查重式,(1 + 3) + (2 + 4) 是 (4 + 2) + (3 + 1) 的查重式

偷懒的写法:因为实际上,长的表达式中包含了短的表达式,我们只需要写好单算子表达式双算子表达式,后面的表达式生成函数就可以直接套用前面两个生成器的模式,而减少了很多重复劳动。即如双算子表达式里的(A B)部分可以依靠单算子表达式生成器进行生成。

负数的避免

负数只会在减法运算时产生,每当遇到减法运算时,只需要检查位于左侧的表达式或分数大于等于位于右侧的即可。否则,交换减法运算的左右操作数。

除法假分数的避免

除法假分数只会在位于右侧的操作数大于位于左侧的操作数时产生,只需要检查位于左侧的表达式小于或等于右侧的即可。否则,交换除法运算的左右操作数。

操作数的表示

无论是真假分数还是整数,都可以当成分数来进行计算。在生成操作数的时候,我们就会使用一个分数生成器,按照特定规则,生成分数。而表达式的操作也是分数和分数之间的操作。直到最后生成表达式时,才会将分数进行转化输出。

判断是否重复

因为查重式子能确保所有同义的运算式都能输出为同一个算式,所以可以直接将查重式放进 HashSet 中,一旦查询到一个查重式已经存在于 HashSet 中,则证明这个式子已经重复。否则则没有重复。

代码

分数类 Fraction

实现了分数的存储、加减乘除基本运算、化简、和字符串的相互转化以及字符串算术式的计算等功能

来源:weixin_30737433

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年8月21日
下一篇 2018年8月21日

相关推荐