本次课程作业需要写出自己的设计思路使用就此机会尝试一下完成此次课题的文档说明。
分析需求
- 需要生成与输入数字相同的题目数量与答案
- 运算式子至少需要有俩个运算符
- 运算数字在100之内的正整数,答案不能为负
实现
根据需求分析我们可以吧这个小案例分为3个部分
-
自动生成运算题目
下附代码首先,自动生成题目我们需要满足 2与3 这俩个需求点。 那么,我们逐个击破,首先如何生成带有俩个运算符的式子呢? 我这里采用的是for + switch 语句来进行生成的。 我们直到一个简单的运算是由 数字 + 字符 +数字 所组成的 也就是整体长度一定是奇数,所以我们for循环的长度就可以设置为奇数次, 这个次数我是用random自动生成长度为 [5,7]。 奇数出数字,偶数出字符。 这里我们还需要解决除法结果不能为小数以及结果不为负的问题。 这个问题都可以调用计算函数加上if语句进行实现。
//random.nextInt(m)表示生成[0,m-1]之间的随机数,也就是说random.nextInt(m+1),将生成[0,m]之间的随机整数。
static Random rd = new Random();
/**
* 生成题目
* @param num
* @return
*/
public static String [] generateTest(int num){
String []tests = new String[num]; //题目
String test = new String();
int len=0;//生成的每个题目的字符长度
int divisor=0;//除数 生成除法时用
int dividend;//被除数 生成除法时用
for(int i =0;i<num;i++){
len= rd.nextInt(2)*2+5; //生成长度为 [5,7]
for(int j =0;j<len;j++){
if(j%2==0){
divisor=rd.nextInt(10)+1; //生成的随机数
test=test+divisor;
}else if(j%2==1){
switch (rd.nextInt(4)+1){
case 1 : test=test+"+"; break;
case 2 : test=test+"-"; break;
case 3 : test=test+"*"; break;
case 4 :
{//确定生成的除法结果为整
dividend = rd.nextInt(10) + 1;
while ((divisor % dividend) != 0) {
dividend = rd.nextInt(5) + 1;
}
test = test + "/" + dividend;
j++;
continue;
}
}
}
}
if(calculate(test)<0){ //答案不为负,为负就重新生成
i--;
test="";
continue;
}
tests[i]=test;
test="";
}
return tests;
}
-
题目的运算
关于这部分我就不做多阐述了,因为前些天在刷题的时候正好遇到了计算器的运算,
我也写过一篇文章,这里就直接贴一个链接了 。
点我跳转 -
界面的交互
界面的交互我们主要需要实现的是第一个需求。
此外我还加入了最后结果的统计。
废话不多说,下接代码
/**
* 界面 and 运行流程
*/
public static void using(){
Scanner sc =new Scanner(System.in);
System.out.println("请输入需要计算的题目数:");
String S =sc.nextLine();
String num = S; //题目数
String []tests = generateTest(Integer.parseInt(S)); //生成的题目
int flag=0;//记录做对的题目数
boolean []flags = new boolean[Integer.parseInt(S)];
for(int i=0;i<tests.length;i++){
System.out.println("第"+(i+1)+"题:");
System.out.println(tests[i]);
System.out.println("请输入答案:");
S =sc.nextLine();
if(calculate(tests[i])==Integer.parseInt(S)){
flags[i]=true;
flag++;
}
System.out.println("答案为:"+calculate(tests[i]));
}
System.out.println("答题已完成,您的正确率为:"+flag+"/"+num);
if(flag==Integer.parseInt(num)){
System.out.println("你真牛,全对!");
}else {
System.out.println("错题为:");
for (int i=0;i<flags.length;i++){
if(!flags[i]){
System.out.print((i+1)+"\t");
}
}
System.out.println();
}
if(flag/Double.parseDouble(num)<0.6){
System.out.println("不及格呀,还要继续加油!");
}
}
/**
* 如需要修改程序生成的数字前往generateTest()函数中进行修改
* @param args
*/
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
String S = "";
boolean flag =true;
while(flag){
using();
System.out.println("退出计算输入n,键入任意键继续练习");
S =sc.nextLine();
if(S.equals("N")||S.equals("n")){
flag=false;
}
}
System.out.println("四则运算练习程序已关闭。。");
}
可拓展项
- 对小数的运算
- 优化生成式子的算法
- 如何生成与计算带有结合律的式子
此文章创于本人学习时的记录,如有错误或更优解还请指出。