个人作业1——四则运算题目生成程序

一、题目描述
1.随机生成指定数量的不重复的四则运算表达式
2.表达式的数字范围也可指定
3.将生成的题目输出到文件上
4.用户可回答问题,程序可查错
5.支持分数运算,答案也为分数
二、需求分析
自动生成小学四则运算,需要用到随机数,用随机数随机生成数字,能够随机生成符号加减乘除(除数不为0)。
支持分数和整数的四则运算,同样是利用随机数分别生成分子与分母(分母不为0).
能够判断输入答案的对错并统计正确率,要将用户输入答案与式子答案进行比较(数字用==,字符串用equals语句完成)。
要求输入的分数可以被识别,此处同样利用equals来完成。
三、功能设计
1.用户选择功能 生成题目 提交题目 推出
2.选择生成题目后要求用户输入数字范围和题目数量
3.生成相应数量和数字范围的表达式并写入文件
4.用户在文件中答题后选择提交答案
5.程序返回答题的正确数目和错误数目。
四、代码说明
1.Num类
题目中所有的数都有Num类来表示。
Num类由分子和分母两个属性组成。
重写该类的toString方法,使其在输出时能根据情况输出为整数和分数。
其中,若表示的数为真分数时,需要对其进行约分,所以添加一个reduction方法进行约分
约分需要用到最大公约数,所以写一个递归函数getGCD来求分子分母的最大公约数,其中用到了辗转相除法。
在Num类中添加了一个静态方法count,用来进行Num对象之间的计算。
还添加了一个判断Num大小的静态方法max
最后添加了一个方法createNum,能随机生成Num
public String toString() {
if (this.denomenator == 1) {
return String.valueOf(this.numerator);
} else if (this.numerator > this.denomenator) {
if (this.numerator % this.denomenator == 0) {
return String.valueOf(this.numerator / this.denomenator);
} else {
return this.numerator / this.denomenator + "'" + this.numerator % this.denomenator + "/"
+ this.denomenator;
}
} else if (this.numerator < this.denomenator) {
return this.numerator + "/" + this.denomenator;
} else if (this.numerator == 0) {
return "0";
}
return "1";
}
2.Expression类
该类用来生成四则运算表达式,并对表达式进行后缀转换。
表达式用Arraylist来存储
添加createExpression方法用于表达式生成,原理为根据输入的运算发数目进行循环,每次循环生成一个Num和一个运算符存入数组,并随机添加括号,最后删除多余的运算符
添加toPRN方法用于将表达式转换为后缀表达式,原理为每次读到数字时放入数组中,读到符号时进栈,直到读到下个符号时判断优先级,若前一个优先级高,则出栈进数组,否则继续将新的符号进栈。若读到括号,则将括号后的所有符号进栈,直到读到“)”时,将“(”后的所有符号出栈。
其中isOperator用于判断是否为运算符,priority判断符号优先级,randomOperator用于生成随机运算符,toString用于将Arraylist转换为String。
public ArrayList

相关推荐