zoukankan      html  css  js  c++  java
  • 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
     

    实验结果:

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

  • 相关阅读:
    Memcache 内存分配策略和性能(使用)状态检查
    C# 中字符串转换成日期
    Task及Mvc的异步控制器 使用探索
    MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
    从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单
    从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十一║Vue实战:开发环境搭建【详细版】
    vue-router 快速入门
    Vue.js——60分钟快速入门
    五小步让VS Code支持AngularJS智能提示
    AngularJS----服务,表单,模块
  • 原文地址:https://www.cnblogs.com/suifengye/p/6581674.html
Copyright © 2011-2022 走看看