自动出题系统提出了新的要求:
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数:
〇是否有乘除法;
〇是否有括号(最多可以支持十个数参与计算);
〇数值范围;
〇加减有无负数;
〇除法有无余数!
设计思路:在第一次设计的基础上,又添加了三个要求,前两个是在算法完成后实现,第三个是在算法当中实现,所以我先考虑第三个要求。第三个要求是使参数可控,第一个程序中已经定义随机运算符+,-,*,/为0,1,2,3,所以如果选择无乘除法则从0(+),1(-)中进行随机选取,不加入2(*),3(/)。在百度“小学四则运算”后,我发现五~六年级的题的乘除法只有两位数或一位数的,而加减法有一~四位数的,所以数值范围我准备在整数加减法中1~4位可控,而在整数乘除法中1~2位可控。有无括号可在多位运算中进行插入。由于小学加减法中没有负数,负数是初中的知识,所以题目中没有,答案中也不能有,在遇到减法中如果被减数小于减数则两数交换位置。控制重复我用了string的方法,把每道题作为一个string,并两两比较,如果重复重新随机题目。输出方式有控制台输出和用txt文档输出至d盘。
源代码:
import java.io.FileNotFoundException; import java.util.*;//引用util包 public class Yunsuan { public static void main(String[] args) throws FileNotFoundException { // TODO Auto-generated method stub int numtishu; int numchangdu; int judgezhengfen; int judgechengchu; int judgekuohao; int judgeyushu = 0; int judgeweishu = 0; int judgefangshi = 0; String last = new String(); Scanner sca = new Scanner(System.in); Yunsuan01 y = new Yunsuan01(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~判断类型~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while(true){ System.out.println("真分数运算(1),整数运算(0):"); judgezhengfen = sca.nextInt(); if(judgezhengfen!=1 && judgezhengfen!=0) { System.out.println("输入有误,请重新输入"); } if(judgezhengfen == 0) { while(true) { System.out.println("位数:四位数(3),三位数(2),两位数(1),一位数(0):"); judgeweishu = sca.nextInt(); if(judgeweishu!=1 && judgeweishu!=0 && judgeweishu!=2&&judgeweishu!=3) { System.out.println("输入有误,请重新输入"); } else break; } break; } else break; } while(true){ System.out.println("有乘除法(1),无乘除法(0)"); judgechengchu = sca.nextInt(); if(judgechengchu!=1 && judgechengchu!=0) { System.out.println("输入有误,请重新输入"); } if(judgechengchu == 1) { while(true) { System.out.println("除法有余数(1),无余数(0)"); judgeyushu = sca.nextInt(); if(judgeyushu!=1 && judgeyushu!=0) { System.out.println("输入有误,请重新输入"); } else break; } break; } else break; } while(true){ System.out.println("有括号(1),无括号(0)"); judgekuohao = sca.nextInt(); if(judgekuohao!=1 && judgekuohao!=0) { System.out.println("输入有误,请重新输入"); } else break; } while(true) { System.out.println("输入有几个数参与运算(2~10):"); numchangdu = sca.nextInt();//输入题的长度 if(numchangdu<2 || numchangdu>10) { System.out.println("输入有误,请重新"); } else break; } System.out.println("输入题目的数量:"); numtishu = sca.nextInt();//输入题数 String result[] = new String[numtishu]; for(int i=0; i<numtishu;i++) { result[i]=""; } while(true){ System.out.println("打印方式:txt格式(1),控制台(0):"); judgefangshi = sca.nextInt(); if(judgekuohao!=1 && judgekuohao!=0) { System.out.println("输入有误,请重新输入"); } else break; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~给出算式~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(judgezhengfen == 0 && judgekuohao == 0){ //整数,无括号 for(int i=0; i<numtishu; i++) { int k = i+1; int num[] = new int[numchangdu]; char chars[] = new char[numchangdu-1]; result[i] = result[i]+"["+k+"]"; for(int j=0;j<numchangdu;j++) { num[j] = y.weishu(judgeweishu);//按位数出随机数 } for(int j=0;j<numchangdu-1;j++) { chars[j] = y.fuhao(judgechengchu);//按是否乘除出符号 } for(int j=0;j<numchangdu-1;j++) { if(chars[j] == '-')//减法不出现负数 { if(num[j]<num[j]) { int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } for(int j=0;j<numchangdu-1;j++) { result[i] = result[i]+num[j]+chars[j]; } result[i] += num[numchangdu-1]; result[i] += "="+" " ; } for(int j = 0; j<numtishu;j++) { last = last + result[j]; } y.dayinfangshi(judgefangshi, last);//最终输出 }
import java.util.Random; import java.io.*; public class Yunsuan01 {//判断出题是否重复 int chongfu(int numtishu,String result[],int i) { for(int j=0;j<i;j++) { if(result[i] == result[i-j-1]); i = i-1; } return i; } int weishu(int judgeweishu)//随机位数 { int numsuiji = 0; Random ran = new Random();//初始化随机数 if(judgeweishu == 0) { numsuiji = ran.nextInt(10); } else if(judgeweishu == 1) { numsuiji = ran.nextInt(100); } else if(judgeweishu == 2) { numsuiji = ran.nextInt(1000); } else if(judgeweishu == 3) { numsuiji = ran.nextInt(10000); } return numsuiji; } char fuhao(int judgechengchu) { char fuhao = ' '; Random ran = new Random();//初始化随机数 int suijijiajian = ran.nextInt(2); int suijichengchu = ran.nextInt(4); if(judgechengchu == 0) { if(suijijiajian == 0) fuhao = '+'; if(suijijiajian == 1) fuhao = '-'; } if(judgechengchu == 1) { if(suijichengchu == 0) fuhao = '+'; if(suijichengchu == 1) fuhao = '-'; if(suijichengchu == 2) fuhao = '*'; if(suijichengchu == 3) fuhao = '/'; } return fuhao ; } void dayinfangshi(int judgefangshi,String last) throws FileNotFoundException { if(judgefangshi == 1) { FileOutputStream fs = new FileOutputStream(new File("D:\四则运算.txt")); PrintStream p = new PrintStream(fs); p.print(last); } if(judgefangshi == 0) System.out.println(last); } }
结果截图:
每周计划:
听课 | 编程 | 读书 | 总计 | |
周一 | 2 | 2 | 0 | 4 |
周二 | 0 | 1 | 0 | 1 |
周三 | 0 | 1 | 0.5 | 1.5 |
周四 | 0 | 1 | 0 | 1 |
周五 | 0 | 1 | 0.5 | 1.5 |
周六 | 0 | 1 | 0 | 1 |
周日 | 0 | 1 | 0 | 1 |
时间记录日志:
日期 | 开始时间 | 结束时间 | 中断时间(min) | 净时间(min) | 活动 | 备注 |
3.14 | 8:00 | 9:50 | 10 | 100 | 上课 | 课间休息十分钟 |
13:30 | 15:30 | 0 | 120 | 编程 | 学习用php播放音乐和插入网页背景等 | |
3.15 | 13:30 | 14:30 | 0 | 60 | 装系统 | 用启动盘装系统失败,改用虚拟光驱 |
3.16 | 12:00 | 12:20 | 10 | 10 | 读书 | 吃饭 |
16:00 | 16:30 | 10 | 20 | 读书 | ||
20:00 | 20:20 | 10 | 10 | 读书 | ||
3.17 | 19:30 | 20:20 | 0 | 50 | 编程 | |
3.18 | 19:30 | 20:30 | 10 | 50 | 编程 | |
22:00 | 22:30 | 0 | 30 | 读书 | ||
3.19 | 13:40 | 15:40 | 0 | 120 | 编程 | |
总计 | / | / | 50 | 520 | / |
缺陷记录日志:暂无