设计背景
小孩9月份入学小学一年级,经常想出一些10以内、20以内加减法锻炼小孩的口算能力。时间久了,出题越来越耗时间,所以开发这个小工具,使用者选择运算方式、选择填空位置、选择数字范围,系统自动出题,解决出题的问题。
运行效果
设计思路
第一步,输入运算规则,1为加法,2为减法
第二步,如果选择的是加法,输入填空地方,1为加数,2为和;
如果选择的是减法,输入填空地方,1为被减数,2为减数,3为差
第三步,输入数字范围,例如输入10,即为10以内的加减法
第四步,系统根据选择的条件自动出题
第五步,使用者输入答案,并校验答案是否正确;答案输入-1,即为退出系统
开发代码
主函数
public static void main(String[] args) {
System.out.println("数学加减法玩一玩!");
int operRule = inputNum("第一步:请输入运算规则,1为加法,2为减法", 1, new Integer[]{1, 2});
int answerIndex = 0;
if(operRule == 1) {
answerIndex = inputNum("第二步:你选择的是加法,请输入填空地方,1为加数,2为和", 1, new Integer[]{1, 2});
}else {
answerIndex = inputNum("第二步:你选择的是减法,请输入填空地方,1为被减数,2为减数,3为差", 1, new Integer[]{1, 2, 3});
}
int numRanger = inputNum("第三步:请输入数字范围,例如10为10以内的加减法", 10, null);
try {
createTopic(operRule, answerIndex, numRanger);
} catch (Exception e) {
System.out.println(e.getMessage());
System.exit(-1);
}
}
输入规则
使用者输入相对应的规则,如果输入值设置了可选项,则做相应判断
/**
* 输入数字
* @param printChar:显示名称
* @param value:默认值
* @param reserveValue :备用值,为输入范围,为空,则表示没有限制
* @return int
*/
private static int inputNum(String printChar, int value, Integer[] reserveValue) {
System.out.println(printChar);
System.out.print("输入值:");
Scanner numInputScanner = new Scanner(System.in);
try {
value = numInputScanner.nextInt();
if(null != reserveValue && reserveValue.length > 0 && !Arrays.asList(reserveValue).contains(value)) {
System.out.println("输入有误,请重新输入!");
value = inputNum(printChar, value, reserveValue);
}
}catch (Exception e) {
System.out.println("输入有误,请重新输入!");
value = inputNum(printChar, value, reserveValue);
}
return value;
}
系统出题
系统根据输入的规则,自动判断题型,题型分为以下五种
1:2+?=3
2:2+3=?
3:?-2=5
4:8-?=5
5:8-2=?
判断题型
/**
* 判断题型:
* 1:2+?=3
* 2:2+3=?
* 3:?-2=5
* 4:8-?=5
* 5:8-2=?
* @param operRule,加减法规则
* @param answerIndex,答案位置
* @return int
*/
private static int judgeType(int operRule, int answerIndex) {
if(operRule == 1) {
if(answerIndex == 1) {
return 1;
}else if(answerIndex == 2) {
return 2;
}
}else if(operRule == 2) {
if(answerIndex == 1) {
return 3;
}else if(answerIndex == 2) {
return 4;
}else if(answerIndex == 3) {
return 5;
}
}
return 0;
}
出题
/**
* 创建题目
* 1:2+?=3
* 2:2+3=?
* 3:?-2=5
* 4:8-?=5
* 5:8-2=?
* @param operRule,加减法规则
* @param answerIndex:答案所在位置
* @param numRanger:出题数字范围
*/
private static void createTopic(int operRule, int answerIndex, int numRanger) throws Exception {
//设置题型
int topicType = judgeType(operRule, answerIndex);
if(topicType == 0) {
throw new Exception("系统出小差了,请联系管理员");
}
System.out.print("\t\t");
while (true) {
int count1 = (int)(Math.random() * numRanger);
int count2 = (int)(Math.random() * numRanger);
switch (topicType) {
case 1:
if(count1 <= count2) {
System.out.print(count1 + " + ? = " + count2);
checkResult(count2 - count1, true);
}
break;
case 2:
System.out.print(count1 + " + " + count2 + " = ");
checkResult(count1 + count2, false);
break;
case 3:
if(count1 + count2 <= numRanger) {
System.out.print("? - " + count1 + " = " + count2);
checkResult(count1 + count2, true);
}
break;
case 4:
if(count1 >= count2) {
System.out.print(count1 + " - ? = " + count2);
checkResult(count1 - count2, true);
}
break;
case 5:
if(count1 >= count2) {
System.out.print(count1 + " - " + count2 + " = ");
checkResult(count1 - count2, false);
}
break;
default:
throw new Exception("系统出小差了,请联系管理员");
}
}
}
输入答案并自动校验
/**
* 检查结果是否正确
* @param value,正确答案
* @param showBlank 显示是否显示空格
*/
private static void checkResult(int value, boolean showBlank) {
if(showBlank) {
System.out.print("\t\t");
}
Scanner resultScanner = new Scanner(System.in);
int result = resultScanner.nextInt();
if(result == -1) {
System.exit(-1);
}
if(result == value) {
System.out.print("回答正确\t");
}else {
System.out.print("回答错误\t");
}
}
退出系统
答案输入-1即退出系统