老师对程序又提出了系统性的要求:
1.定义参数生成的个数(完成)。
2.定义参数控制数值的范围(完成)。
3.运算结果不能产生负数。
4.e1/e2结果是真分数。
5.运算符不得超过3个。
6.检验重复。
7.生成的题目储存到数据库中。
8.真分数采用3/8形式,假分数采用2‘3/8形式。
9.生成题目时计算答案。
10.支持一万到题目的生成。
11.支持判定答案的正误并统计数量。
思路整理:
按着以前的实验思路来,需要将结果储存到数据库中。
代码如下:
package sum3; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; //1.除法生成真分数 public class sum3 { static int sum2=10;//算数式的个数 static int sum1=4; static int R=100;//定义的参数控制题目中数值范围 static int m;//记录运算符个数 //建立动态数组:操作数 static int[][]n1; //设置成运算式:数据源 static int[][]n2; //结果设置成int型的 static int[]m1; //记录用算过程的数组 static int[]m2; //运算符的选择 static String[]r1={"+","-","*","÷"}; //运算符的操作:操作符 static String[]s1; //运算符的存储:数据源 static String[]s2; //括号的存储 static char[]r3; //链接数据库: static String driverStr = "com.mysql.jdbc.Driver"; static String connStr = "jdbc:mysql://127.0.0.1/number"; static String dbusername = "root"; static String dbpassword = "baohui"; static Connection conn = null; static Statement stmt =null; public static void main(String[] args) throws SQLException { try { Class.forName(driverStr); conn = DriverManager.getConnection(connStr, dbusername, dbpassword); stmt = conn.createStatement(); System.out.println("数据连接success!"); } catch (Exception ex) { System.out.println("数据连接失败!"); } System.out.println("运算式是否需要括号:0 是 1否"); Scanner scan3=new Scanner(System.in); int sum3=scan3.nextInt(); //二维储存操作数 n1=new int[sum2][sum1];//操作 n2=new int[sum2][sum1];//存储 m1=new int[sum2]; m2=new int[sum1]; //储存运算符 s1=new String[sum1];//操作 s2=new String[sum1];//存储 //储存括号 r3=new char[sum1*2]; //初始化 for(int i=0;i<sum1*2;i++) { r3[i]=' '; } //生成操作数 for(int i=0;i<sum2;i++) { for(int j=0;j<sum1;j++) { n1[i][j]=(int)(1+Math.random()*100); n2[i][j]=n1[i][j]; } } //运算开始 for(int i=0;i<sum2;i++) { int number=0;//结果运算 int num2=0;//初始化左括号位置 int num3=0;//初始化右括号位置 //设置括号位置 if(sum3==0) { num2=2 + 2*(int)(Math.random()*(sum1*2-6)/2);//2 4 6 num3=num2 +3 + 2*(int)(Math.random()*(sum1*2-2-num2)/2);//5 7 9 r3[num2]='('; r3[num3]=')'; } int jishu=0; //设置运算符 for(int j1=0;j1<sum1;j1++) { int num=(int)(0 + Math.random()*4); //运算符的设置 s1[j1]=new String(r1[num]); s2[j1]=new String(r1[num]); } //括号内的算法 num2=num2/2;//左括号的数位置 num3=num3/2;//右括号的数位置 //初始化运算符个数 m=sum1-1; //num2=num3时 括号消掉 while(num2<num3) { //括号的乘除法 for(int k=num2;k<num3;k++) { if(s1[k].equals("*")) { number=n1[i][k]*n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { s1[j1]=s1[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } s1[m-1]="+"; m--; k--; num3--; }//乘法截至 else if(s1[k].equals("÷")) { /* //处理括号内除数为0的情况 while(n1[i][k+1]==0) { n1[i][k+1]=(int)(1+Math.random()*100); n2[i][k+1]=n1[i][k+1]; } //除数 被除数大小(待修改) if(n1[i][k]<n1[i][k+1]) { n1[i][k+1]=n1[i][k]; n2[i][k+1]=n1[i][k+1]; } else { n1[i][k]=n1[i][k+1]*(int)(1+Math.random()*(100/n1[i][k+1]-1)); } n2[i][k+1]=n1[i][k+1]; n2[i][k]=n1[i][k]; */ while(s1[k-1].equals("÷")&&n1[i][k]==n1[i][k+1]) { n1[i][k+1]=(int)(0+Math.random()*100); n2[i][k+1]=n1[i][k+1]; } number=n1[i][k]/n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { s1[j1]=s1[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } s1[m-1]="+"; m--; k--; num3--; }//除法截至 }//乘除循环截至 //括号的加减法 for(int k=num2;k<num3;k++) { if(s1[k].equals("+")) { number=n1[i][k]+n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { s1[j1]=s1[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } s1[m-1]="+"; m--; k--; num3--; } //加法截至 else if(s1[k].equals("-")) { /* //当括号内算式作为被除数结果为0时 while(s1[k-1].equals("÷")&&n1[i][k]==n1[i][k+1]) { n1[i][k+1]=(int)(0+Math.random()*100); n2[i][k+1]=n1[i][k+1]; } //处理括号内减法为负数的情况 if(n1[i][k]<n1[i][k+1]) { n1[i][k+1]=n1[i][k]-(int)(0+Math.random()*n1[i][k]); n2[i][k+1]=n1[i][k+1]; }*/ number=n1[i][k]-n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { s1[j1]=s1[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } s1[m-1]="+"; m--; k--; num3--; }//减法截止 //System.out.print(number+" "); }//加减循环止 }//括号内算法循环止 //乘除法的运算 for(int k=0;k<sum1-1;k++) { //如果加入乘法 //进行插入 if(s1[k].equals("*")) { number=n1[i][k]*n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { s1[j1]=s1[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } s1[m-1]="+"; m--; k--; } else if(s1[k].equals("÷")) { number=n1[i][k]/n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { s1[j1]=s1[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } s1[m-1]="+"; m--; k--; } }//乘除法运算至 //加减法的运算 for(int k=0;k<m;k++) { if(s1[k].equals("+")) { number=n1[i][k]+n1[i][k+1]; n1[i][k+1]=number; } else if(s1[k].equals("-")) { /* //处理括号内减法为负数的情况 if(n1[i][k]<n1[i][k+1]) { n1[i][k+1]=n1[i][k]-(int)(0+Math.random()*n1[i][k]); n2[i][k+1]=n1[i][k+1]; } */ number=n1[i][k]-n1[i][k+1]; n1[i][k+1]=number; } //System.out.print(number+" "); }//加减法运算至 //运算式的输出 for(int j=0;j<sum1;j++) { System.out.print(r3[jishu]); jishu++; System.out.print(n2[i][j]); System.out.print(r3[jishu]); jishu++; if(j<sum1-1) { System.out.print(s2[j]); } else System.out.print("="); } //m2[i]=number;//储存结果 System.out.print(number);//输出结果 System.out.println(); //清空数据库的前N个元素 String sql1="delete from number1 where index1="+(i+1); Statement stmt=conn.createStatement(); stmt.execute(sql1); try{ String sql = "insert into number1 " + "(operator1,operator2,operator3,operator4,end,number1,number2,number3,number4,index1) " + " values (?,?,?,?,?,?,?,?,?,?)"; PreparedStatement psmt=null; psmt=conn.prepareStatement(sql); psmt.setString(1,r3[1]+s2[0]+r3[2]); psmt.setString(2,r3[3]+s2[1]+r3[4]); psmt.setString(3,r3[5]+s2[2]+r3[6]); psmt.setString(4,r3[7]+"="); psmt.setInt(5,number); psmt.setInt(6,n2[i][0]); psmt.setInt(7,n2[i][1]); psmt.setInt(8,n2[i][2]); psmt.setInt(9,n2[i][3]); psmt.setInt(10, i+1); psmt.executeUpdate(); System.out.println("插入成功!"); } catch (Exception ex) { System.out.println(ex); } //清空括号 for(int i1=0;i1<sum1*2;i1++) { r3[i1]=' '; } }//all运算 }//class }//main
实验结果:
实验总结:学会了数据库的插入和删除操作,规范了代码。