题目描述:##
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
运算符为 +, −, ×, ÷
并且要求能处理用户的输入,并判断对错,打分统计正确率。
要求能处理用户输入的真分数, 如 1/2, 5/12 等
使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
分析:##
从题目出发,程序实现的要求
- 自动生成题目
- 支持整数,真分数(实现中,也有假分数)
- 支持加减乘除
- 判断对错并统计正确率
题目中要求用控制台实现,虽然简单,但是我认为这种方式有以下几点比较不好的地方(当然下面的我的这个实现完全可以是控制台的).
- 只能从截图中看到实现结果;
- 不能让看博客之人直接感受效果,需要导入代码;
- 不方便操作。
所以我用比较直观的形式体现,使用简单的web页面操作,可以有一个直观的效果,最后会附上页面链接。
实现步骤:##
- 根据用户输入的参数(整数n),生成n道简单的分数运算题
- 获取用户输入的答案
- 进行答案校验,生成结果集
- 把结果返回给用户
主要程序的实现还是比较简单的,并不需要什么算法。
- 首先建立一个分数类Fraction,属性包含分子分母,方法包含加减乘除,每个方法传入的参数为分数对象,方法的返回值是另一个实体类CalculationResult计算结果类(我简单称为结果类)。
- 建立结果类,属性包含生成的运算题目(也就是式子不包含正确结果),运算的正确结果,以及返回给用户的消息(对还是错,正确答案是多少)。为了实现方便我把结果的正确确率也封装成了这个结果类的一个属性,虽然这样是不太合理的。至此就把涉及到的实体类建立完成。
Fraction类
CalculationResult类
- 接着就是随机生成式子和加减乘除,既然是两个分数,那就是随机生成4个数,前面两个组成一个分数,后面两个组成另一个分数,这边要控制一下分母的随机数不能为0(还有一种情况会疏忽的就是:如果是除法运算,第二个分数的分子也不能为零)。封装成两个分数对象,在随机生成操作符。这里使用char字符数组char[] op={'+','-','','/'};然后根据式子char randowOp=op[(int)(Math.random()4)];得到随机字符,再用分支结构switch case进行两个选择的运算分数的计算,当然要先定义一个用来装结果的 List〈CalculationResult〉 list,根据传入的n来决定循环操作几次,把每次操作的结果add到list中这样就ok。
/*分支结构 f,f1为分数对象*/
switch(randowOp){
case '+':{ list.add(f.getAddResult(f1)); break;}
case '-':{ list.add(f.getSubResult(f1)); break;}
case '*':{ list.add(f.getMulResult(f1)); break;}
case '/':{ list.add(f.getDivResult(f1)); break;}
}
- 核心的是表达式和结果的控制,结果为分数时必须要化为最简分数。比如4/2,必须结果为2,18/4必须化简为9/2。这里我用的是,分子分母分别除以他们的最大公约数
/*
求两个数最大公约数
*/
public static int gcd(int m,int n){
int k=m>n?n:m;
int s = 1;
for(int i = 2;i <=k;i ++){
for(int j = 2;j <= i;j++){
if(m % j == 0 && n % j == 0){
m = m / j;
n = n / j;
s = s * j;
}
}
}
return s;
}
- 然后把分子分母重新组合成字符串,这里如果结果分母为1,则只显示分子,如果分子为0,则直接为0,如果两个数相等,则直接显示1。
以上为核心的java操作,接下来是页面的逻辑操作过程。
- 首先生成简单的表单,接收用户输入的参数(当然只能是数字)
- 根据参数n,生成结果List
list。把这个list显示到页面 - 用户输入答案后,再用一个表单接收用户的答案,然后用答案个正确答案匹配,当然要trim()一下用户答案。然后填写前面提到的结果对象的用户返回信息,把flag给set。如果答案正确,则flag="正确",如果答案错误则flag="错误 正确答案为***"。再通过正确的题数乘1.0/总题数求出正确率(当然要用%形式,所以结果要乘100+"%"转化为字符串)也set到结果集中,然后在把这个这个结果集add到list中返回到页面显示。这样就ok
下面是一些截图:
(开始页面)
(生成的题目)
(判断正误,与正确率)
附上具体的网页链接:我也自己试试
实验总结:##
我觉的这种实现方式并不好,存在的问题是什么呢?最重要的问题是当需要生成的题目多了,速度就会很慢,加上答案校验等等,我这个差的服务器就可能崩了,如果访问人数多了,根本没有效果,所以请试效果的朋友,输入的数字小一些,哈哈(偷笑)。然后由于涉及括号等的操作比较复杂,这个简单的实验就没有使用,而且如果这些也要自己生成计算,那么问题就大了,速度就非常慢了。比较理想的方法,应该是建立题库,把题库塞入数据库中,两个字段可能就ok,字段一:题目;字段二:答案。
这样的好处有什么呢?
- 不需要自己随机生成式子和计算,这部分是程序主要的耗费时间
- 可以计算非常复杂的公式,再多括号也不用担心。
- 速度快,出题时只需要随机读取数据库条数,封装对象。
没有找到题库,所以朋友可以试试.......!