四则运算练习软件
源码可直接克隆的仓库地址 https://git.coding.net/OlinaChenry/Four.git
1. 需求分析
- 支持整数的四则运算
- 支持多运算符
- 支持真分数(附加要求)
- 将学号与生成的练习题及其答案输出到文件“result.txt”中
2. 功能设计
基本功能
- 能随机生成n道加减乘除练习题,并给出答案
扩展功能
- 每道题目中出现的运算符个数不超过3个
- 不得出现负数与非整数
- 没有重复题目
- 能支持真分数的出题与运算
3. 设计实现
定义了一个主函数,生成文件;
式子类,生成带括号的式子;
分数相关类 ,进行分数的生成
(类的关系:主类调用另外两个类,式子类调用第三个类)
在式子类中,使用panduan方法,判断优先级并生成带括号的式子;
在该类中定义了两个实例方法:
- 第一个是将数列表和符号列表组合成式子的方法
- 第二个是计算该式子结果的方法
在分数相关类中,定义了随机生成若干个分数和算符组合起来的构造方法;
最后一个类是主类,对文件的操作都放在主类中进行
4. 算法详解
- 优先级的判断
在实现带括号的运算时,我使用了内部类panduan()来判断符号的优先级,以生成合法的式子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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.代码展示
- 生成文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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( "文件生成错误" ); // 提示 } |
- 生成式子(这里只展示除法)
1 2 3 4 5 6 7 8 9 10 | if (charArr == '÷' ) { if (a1 == 0 ) a1++; while (a0 % a1 != 0 ) // 为了保证整除 { a0 = rand.nextInt( 100 ); a1 = rand.nextInt( 99 ) + 1 ; // 为了保证不出现0 } sum = a0 / a1; } |
1 2 3 4 5 6 7 8 9 10 11 | 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上传文件,惭愧到上交作业的最后一天也还没有搞明白......后续会继续钻研,不过还是希望老师下节课能够演示一遍......
8.PSP展示
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步