中小学自动卷子生成程序优缺分析
优点分析
1. 在处理题目时,用到了专门生成题目的函数,并将其转换成字符串写入文件中,使得过程更加简洁和简单。
2. 对于重点的函数有必要的解释,如下: 我们可以明显看到,代码注释十分详实,方便读者查看。
FileReader reader = new FileReader(file);//定义一个fileReader对象,用来初始化BufferedReader
BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
StringBuilder sb = new StringBuilder();//定义一个字符串缓存,将字符串存放缓存中
String s = "";
while ((s =bReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
sb.append(s + "\n");//将读取的字符串添加换行符后累加存放在缓存中
3. 主函数只有两行,很简洁,不影响代码本身的可读性。
public static void main(String[]args)throws Exception{
produce();
System.out.println("出题完成。");
}
4. 对变量的命名比较形象,能看出每个变量对应的含义,可读性较强,对结对编程形式较为友好,我们随便选取一个代码片段:
static int clas=0;//1:primary school 2:junior high school 3:high school
static int sum=0;//the number of the questions [10,30]
static int operand;//[1,5]
static int datarange;//[1,100]
static int i=0;
static int j=0;
static String username;
static String password;
我们可以很直观地理解这几个变量的意义。
缺点分析
1. 在代码规范方面,首先在函数命名时,没有遵从用首字母大写的英文单词组合表示,且其中至少有一个动词的规则;其次,函数的自我描述性较差,没有达到见其名而知其意的层次:如名为check,make等的函数,有一些改进空间。
2. 语句书写规则并不提倡,尤其表现在大括号的左半部分紧跟函数名,而不是另起一行,以后需要注意。注释写得相对较少,初读时很难理解每一个函数的作用。
3. 在生成括号,平方,开方与三角函数时,采用的方法是每道题目中只生成一个括号或其他表达式,削弱了题目难度,后续可以对算法加以改进,得到更符合实际需求的算术表达式。
4. 在三角函数与开方还有求平方的计算题中,生成的随机试题与实际需求其实会有出入,在所有三角函数运算中,只出现数字其实很难计算,必须依靠科学计算器,并且如果因此需要保留原式,又会使题目失去原本的意义。同样的,开方和求 平方问题中也有类似脱离实际的地方,我们随机举例来看一下生成的试题结果:
1. 30²/sin96=
2. 7-(√48/4)6-cos89-97=
3. (√33-30)*tan39=
4. 82²+sin89=
5. 25²/(25/82*72-cos99)=
6. 60+(95-sin77²)=
7. 29+88*(√79*cos75)=
8. (√18/31)-tan21=
9. 53*(57/38*sin√8)=
10. (11/sin50*3-)89²-85=
11. 97/(22²*cos60/1-)79=
12. (62-30²-cos65)=
13. (√21*76/cos31)=
14. 7/cos√81=
15. 26²/sin58=
我们可以看到,其实基本这里所有随机生成的式子都面临了上述提到的问题,后续有很大的改进空间,我们可以用数字组合上周期生成可以直接计算的三角函数,开方计算时,可以加入判定被开根数是否能够进一步化简,而计算平方时,生成随机数不宜过大,这些都是可以考虑改进的范畴。