中小学数学卷子自动生成程序-结对编程队友代码分析
中小学数学卷子自动生成程序-结对编程队友代码分析
1.简介
本博客是对结对编程队友个人编程项目的代码分析,杨一鸣同学使用Java语言编写,实现数学试卷的自动生成。
整个项目由一个源文件 ip.java
组成 ,总计近四百行代码。
2.项目要求
个人项目:中小学数学卷子自动生成程序
用户:小学、初中和高中数学老师。
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
6、个人项目9月11日晚上10点以前提交至创新课程管理系统。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。迟交2天及以内者扣分,每天扣20%。迟交2天及以上者0分。
附表-1:账户、密码
账户类型 | 账户 | 密码 | 备注 |
---|---|---|---|
小学 | 张三1 | 123 | |
张三2 | 123 | ||
张三3 | 123 | ||
初中 | 李四1 | 123 | |
李四2 | 123 | ||
李四3 | 123 | ||
高中 | 王五1 | 123 | |
王五2 | 123 | ||
王五3 | 123 |
附表-2:小学、初中、高中题目难度要求
小学 | 初中 | 高中 | ||
---|---|---|---|---|
难度要求 | +,-,*./ | 平方,开根号 | sin,cos,tan | |
备注 | 只能有+,-,*./和() | 题目中至少有一个平方或开根号的运算符 | 题目中至少有一个sin,cos或tan的运算符 |
3.测试
登录
切换年级 出题
文件生成路径与命名
小学题目
第1题: 33/(58-67*51)-67*26=
第2题: (13-65*88+24)/92=
第3题: 80*43-77=
第4题: 78*32/78/37=
第5题: 41*39+57=
第6题: 95-35-86=
第7题: 46-79/99*63-65+80=
第8题: 98+18-31-55/38=
第9题: 12/63+1+20*18=
第10题: 6*96+63/50-58+4=
第11题: 60-93/94=
第12题: 91-77-29=
第13题: (84*90+96/80)+8=
第14题: 32*85*16/20)*74-16/30=
第15题: (94-9+9+54/59)-12/63=
第16题: 3/28/71=
第17题: (46*40+91/47)-88=
第18题: 91/87*80*71/69-43=
第19题: 8+67*89*67-85*96=
第20题: (54/32+70*44)+70=
初中题目
第1题: 71^2-96^2-√55/83/23=
第2题: √28-(√42+√9/29)*√9/89=
第3题: 32^2*(√98-91/71)/91/63=
第4题: √28+√64+36=
第5题: √47/(√19+√17+40)*√17+32=
第6题: √73/87^2/2-85=
第7题: 59-√28-83^2/√55-98=
第8题: (23^2-17-√95+70)+67=
第9题: √32/18^2-58/64=
第10题: √99/73+5^2/5=
第11题: √73/93^2+50*56=
第12题: 63/√57*22=
第13题: 98^2*√35/√82+78=
第14题: √50*41^2/81^2+37=
第15题: 34/√36/57=
第16题: √19+34^2*73*90^2*26=
第17题: √70-28/68^2*98=
第18题: (√9+45*37+24)-50=
第19题: √31+74^2/√63-√1*11=
第20题: (17^2*97-√41-61)-22=
高中题目
第1题: tan44-Sin80/98^2/85=
第2题: (12^2/Sin98+78^2+80)*32=
第3题: 67^2-(8^2+√49+16)*√49+17=
第4题: (tan77-√65+Sin70*97)*Sin68-91=
第5题: 54^2/tan1+75=
第6题: tan93+tan74/Sin17*Sin58/10=
第7题: (90^2/48/Sin57+59)-29=
第8题: Cos13*(Sin33/36^2/3)*36^2/45=
第9题: √31+Cos3-√74-97=
第10题: 53^2*Cos23+98=
第11题: √38+Sin61/26+Cos55*5=
第12题: 94/√2+Sin79-47=
第13题: 92^2+Cos11*15=
第14题: 88*Cos81+2=
第15题: Cos72*√58*56-41=
第16题: √20*(51+Cos34/57)-Cos34/31=
第17题: 97-tan49/72=
第18题: Sin28/83*22=
第19题: tan65-57+15-tan69/25=
第20题: Sin94/(√16-√16+58)*√16+71=
4.优缺点
优点
-
单独设计了一个IP类
-
题目生成函数优异,括号,特殊运算符的随机性很好
public static String createPrimaryExam(){ //创造高中试题函数 Random rand = new Random(); String[] signs = {"+", "-", "*", "/"}; String[] higherSigns={"","^2","√","Cos","Sin","tan"}; String[] question = null; int num1 = rand.nextInt(3) + 2; question = new String[num1]; int isHaveHigherSign=0; for (int i = 0; i < num1; i++) { int num2=rand.nextInt(6); if(num2>2){ isHaveHigherSign=1; } if(num2==1){ question[i] = String.valueOf(rand.nextInt(1, 100)) +higherSigns[num2]+ signs[rand.nextInt(4)]; } else{ question[i] =higherSigns[num2]+String.valueOf(rand.nextInt(1, 100)) + signs[rand.nextInt(4)]; } } int isHaveBrackets= rand.nextInt(0,2); if(num1>=3&&isHaveBrackets==1){ int leftbracket=rand.nextInt(num1-2); int rightbracket=rand.nextInt(2,num1-leftbracket); question[leftbracket]="("+question[leftbracket]; question[rightbracket]=question[leftbracket+rightbracket]+rand.nextInt(1,100)+")"+signs[rand.nextInt(4)]; int left=0; int right=0; for(int i=0;i<num1;i++){ if(question[i].equals("(")){ left=1; } if(question[i].equals(")")){ right=1; } } if(left==0&&right==1){ question[0]="("+question[0]; } } String returnQuestion = ""; for (int i = 0; i < num1; i++) { returnQuestion = returnQuestion + question[i]; } if(isHaveHigherSign==0){ returnQuestion=higherSigns[rand.nextInt(3,5)]+rand.nextInt(1,100)+signs[rand.nextInt(4)]+returnQuestion+rand.nextInt(1,100)+"="; } else { returnQuestion=returnQuestion+rand.nextInt(1,100)+"="; } return returnQuestion; }
缺点
-
连续切换年级时报错
-
程序些许不符合谷歌编码规范。
5.总结
需求基本实现,试题生成照顾了很多细节,值得学习