源码可直接克隆的仓库地址 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上传文件,惭愧到上交作业的最后一天也还没有搞明白......后续会继续钻研,不过还是希望老师下节课能够演示一遍......
8.PSP展示