java-四则运算,自动出题(4)

 

老师对程序又提出了系统性的要求:

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

 

 

 

实验结果:

实验总结:学会了数据库的插入和删除操作,规范了代码。

posted @ 2017-03-19 19:36  随风的叶子  阅读(518)  评论(0编辑  收藏  举报