源码可直接克隆的仓库地址 https://git.coding.net/OlinaChenry/Four.git
1. 需求分析
- 支持整数的四则运算
- 支持多运算符
- 支持真分数(附加要求)
- 将学号与生成的练习题及其答案输出到文件“result.txt”中
2. 功能设计
基本功能
- 能随机生成n道加减乘除练习题,并给出答案
扩展功能
- 每道题目中出现的运算符个数不超过3个
- 不得出现负数与非整数
- 没有重复题目
- 能支持真分数的出题与运算
3. 设计实现
定义了一个主函数,生成文件;
式子类,生成带括号的式子;
分数相关类 ,进行分数的生成
(类的关系:主类调用另外两个类,式子类调用第三个类)
在式子类中,使用panduan方法,判断优先级并生成带括号的式子;
在该类中定义了两个实例方法:
- 第一个是将数列表和符号列表组合成式子的方法
- 第二个是计算该式子结果的方法
在分数相关类中,定义了随机生成若干个分数和算符组合起来的构造方法;
最后一个类是主类,对文件的操作都放在主类中进行
4. 算法详解
- 优先级的判断
在实现带括号的运算时,我使用了内部类panduan()来判断符号的优先级,以生成合法的式子。
if (panduan(charArr) < panduan(charArr2))// 优先级判断 { if (charArr2 == '÷') { if (b0 == 0) b0++; while (sum % b0 != 0)// 如果不能整除 重新生成随机数 { b0 = rand.nextInt(99) + 1; } sum = sum / b0;// 计算 } if (charArr2 == '*') sum = sum * b0; brr = "(" + brr + ")" + "" + charArr2 + "" + b0;// 满足条件 生成括号 }
5. 测试运行
6.代码展示
- 生成文件
public static void main(String[] args) { // TODO Auto-generated method stub // Scanner input = new Scanner(System.in); int n = 0; int flag = 1; // n=Integer.parseInt(args[0]); try { n = Integer.parseInt(args[0]);// 命令行输入 if (file.exists()) { //如果文件已存在,则删除文件 file.delete(); } if(n>1000||n<1){ System.out.println("对不起,只允许输入1-1000的数字!"); return; //结束运行 } }catch (NumberFormatException e){ //输入非数字字符等 System.out.println("对不起,只允许输入1-1000的数字!"); return; //结束运行 } try { PrintStream ps = new PrintStream("../result.txt");// 生成文件 System.setOut(ps); } catch (Exception e) { System.out.println("文件生成错误");// 提示 }
- 生成式子(这里只展示除法)
if (charArr == '÷') { if (a1 == 0) a1++; while (a0 % a1 != 0)// 为了保证整除 { a0 = rand.nextInt(100); a1 = rand.nextInt(99) + 1;// 为了保证不出现0 } sum = a0 / a1; }
if (panduan(charArr) < panduan(charArr2))// 优先级判断 { if (charArr2 == '÷') { if (b0 == 0) b0++; while (sum % b0 != 0)// 如果不能整除 重新生成随机数 { b0 = rand.nextInt(99) + 1; } sum = sum / b0;// 计算 }
7.总结
这次作业共用了四天时间来完成,这个过程是痛苦的,因为基础比较差很多东西都是慢慢的学下来才能做,过程中有些细节导致程序出bug,后面调bug的时间也用了非常长的时间。
然后说说此次作业遇到的一些坑,
一个是文件的写入操作,如果没有使用flush,写入操作是不会进行的,感觉当初学习java时没有太深入得去理解,总是觉得flush和close绑定起来用,没有去注意它主要的作用是什么,
然后是对列表的操作,由于在计算结果的算法中,需要对列表中的值进行添加和删除,会造成列表的下标和长度发生变动,一不注意就容易出现数组越界的异常。
还有git上传文件,惭愧到上交作业的最后一天也还没有搞明白......后续会继续钻研,不过还是希望老师下节课能够演示一遍......