每日日报

今日问题

1、问题:导入的新工程,名字上出现感叹号。

      原因:工程的jar包libraries需要重新加载。

      解决:工程右键--》properties--》Java Build Path--》Libraries,remove以前的jar包,点选“Add JRES”,从工程中的web_root--》lib文件夹中选择jar包,并导入即可。

 

2、问题:java中的三元运算符"?"用法。

      例子: 

       String message=message==null?   "异常:"+rootCause.getClass().getName():message;

       释疑:

        如果message==null为真,则赋值 "异常:"+rootCause.getClass().getName()给message,否则把“错误信息message”赋值给message。

 

package homework;
import java.util.*;
import java.util.Scanner;
import javax.script.*;
import java.io.File; 
import java.io.InputStreamReader; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException;
import java.io.*;
public class math
{
    private static int n,min,max,c,cc,kh=0,xz,zts=0,zcts=0;//题目数,数值范围(最小及最大),操作数个数,乘除,括号,选择菜单,总题数,总错题数
    private static char[] d={'+','-','*','/'};//运算符
    private static Scanner sc=new Scanner(System.in);
    public static void main(String args[]){DZ();}//菜单
    public static void DZ()//菜单
    {
        System.out.println("请选择:");
        System.out.println(" 1.小学二年级口算题");
        System.out.println(" 2.小学三年级口算题");
        System.out.println(" 3.小学四年级口算题");
        System.out.println(" 4.错题本");
        xz=sc.nextInt();
        if(xz==4) {CTB();}//错题本
        else
        {
            System.out.println( "请输入题目总数:" );
           n=sc.nextInt();
           System.out.println("请输入数值的范围.");
           min=sc.nextInt();
           max=sc.nextInt();
           switch(xz)
           {
           case 1:
               while(max>100)
               {
                   System.out.println("小学二年级操作数范围不超过100,请重新输入最大值:");
                   max=sc.nextInt();
               }
               c=1;
               break;
           case 2:
               while(max>1000)
               {
                   System.out.println("小学三年级操作数范围不超过1000,请重新输入最大值:");
                   max=sc.nextInt();
               }
               System.out.println( "输入操作数个数:" );
               c=sc.nextInt()-1;
               while(c>3)
               {
                   System.out.println("小学三年级操作数不超过4个,请重新输入操作数个数:");
                   c=sc.nextInt()-1;
               }
               break;
           case 3:
               System.out.println( "输入操作数个数:" );
               c=sc.nextInt()-1;
               while(c>4)
               {
                   System.out.println("小学四年级操作数不超过5个,请重新输入操作数个数:");
                   c=sc.nextInt()-1;
               }
               System.out.println( "是否有括号?是请输入1,否请输入0:" );
               kh=sc.nextInt();
               break;
           }
           System.out.println( "是否有乘除法?是请输入1,否请输入0:" );
           cc=sc.nextInt();
           TM();//题目
        }
    }
    public static String Tm()//每题
    {
        Random r=new Random();
        int sz;
        String ch=null;
        double a=r.nextInt(max)+min;
        while(a>max){a=r.nextInt(max)+min;}
        if(xz==1)
        {
            int b;
            if(cc==0) {sz=r.nextInt(2);}
            else{sz=r.nextInt(4);}//乘除法
            b=r.nextInt(max)+min;
            while(b>max){b=r.nextInt(max)+min;}
            if(d[sz]=='/')
            {
                if(b==0){while(b==0||b>max) {b=r.nextInt(max)+min;}}//防止0为被除数
                if(a%b!=0)
                {
                    while(a%b!=0||a>max||b>max)
                    {
                        a=r.nextInt(max)+min;
                        b=r.nextInt(max)+min;
                    }
                }
            }
            if(d[sz]=='-'&&b>a){while(b>a||b>max) {b=r.nextInt(max)+min;}}
            ch=String.valueOf(a);
            ch+=String.valueOf(d[sz]);
            ch+=String.valueOf(b);
        }
        else
        {
            double[] b=new double[c];//操作数个数及数值范围
            int k=-1,h=-1,z;//左括号,右括号
            if(kh==1)//括号
            {
                z=r.nextInt(2);
                if(z==1)//随机增加括号
                {
                    k=r.nextInt(c-1);
                    if(k==0)//括号由开头起
                    {
                        ch=String.valueOf('(');
                        ch+=String.valueOf(a);
                        h=r.nextInt(c-1)+k+1;
                        while(h>c){h=r.nextInt(c-1)+k+1;}
                    }
                    if(k>0)//括号在式中
                    {
                        ch=String.valueOf(a);
                        h=r.nextInt(c)+k+1;
                        while(h>c){h=r.nextInt(c)+k+1;}
                    }
                }
                else{ch=String.valueOf(a);}
            }
            else{ch=String.valueOf(a);}
            for(int i=0;i<c;i++)
            {
                if(cc==0) {sz=r.nextInt(2);}
                else {sz=r.nextInt(4);}//乘除法
                ch+=String.valueOf(d[sz]);
                if(k>0&&i==k-1){ch+=String.valueOf('(');}
                b[i]=r.nextInt(max)+min;
                while(b[i]>max){b[i]=r.nextInt(max)+min;}
                if(d[sz]=='/'&&b[i]==0){while(b[i]==0||b[i]>max) {b[i]=r.nextInt(max)+min;}}//防止0为被除数
                ch+=String.valueOf(b[i]);
                if(i==h-1){ch+=String.valueOf(')');}//补“)”
            }
        }
        return ch;//以字符串形式定义算式
    }
    public static void TM()//总题
    {
        zts+=n;
        int j=0;
        String[] s=new String[n];
        while(j<n)//制作题目
        {
            s[j]=Tm();
            if(PC(j,s)==0)//是否重复
            {
                System.out.println((j+1)+"、"+s[j]+"=");
                j++;   
            }
        }
        ScriptEngine se=new ScriptEngineManager().getEngineByName("JavaScript");
        double[] sum=new double[n];
        for(int i=0;i<n;i++)
        {
            try{sum[i]=(Double)se.eval(s[i]);}
            catch(ScriptException e){e.printStackTrace();}
        }//字符串转算式计算结果
        DT(s,sum);//答题
    }
    public static int PC(int j,String[] s)//判重
    {
        for(int i=0;i<j;i++){if(s[i].equals(s[j])) {return 1;}}
        return 0;
    }
    public static void DT(String[] s,double[] sum)//答题
    {
        int mint,yd=0,w=0,yn=0;//时间,已答题目,错题数,yes or no
        double[] da=new double[n];//回答
        int[] cwcs=new int[n];
        double[] Da=new double[n];
        double[] Sum=new double[n];
        String[] Cw=new String[n];//错误题号
        System.out.println( "请设置答题时间(分钟)");
        mint=sc.nextInt();
        System.out.println( "开始答题 !");
        long startTime=System.currentTimeMillis();
        while((System.currentTimeMillis()-startTime)/1000<=mint*60)
        {
            da[yd]=sc.nextDouble();
            yd++;
            if(yd==n){break;}
        }
        if(yd!=n){System.out.println( "时间到!答题结束!");}
        for(int i=0;i<n;i++)
        {
            if(da[i]!=sum[i])//判断答题对错
            {
                Cw[w]=s[i];
                Da[w]=da[i];
                Sum[w]=sum[i];
                cwcs[w]=1;
                w++;
                zcts++;
            }
        }
        try
        {
            File f=new File("CTB.txt");
            try(FileWriter writer = new FileWriter(f,true);BufferedWriter out new BufferedWriter(writer);)
            {
                for(int i=0;i<w;i++){out.write(Cw[i]+"="+Sum[i]+",共做错了"+cwcs[i]+"次。\r\n");}
                out.flush();
                out.close();
            }
        }catch (IOException e) {e.printStackTrace();}
        double cw=(double)(n-w)*100/n;//正确率
        System.out.println( "你的正确率为 :" +cw+"%");
        System.out.println( "你的错题如下 :");//错题
        for(int i=0;i<w;i++){System.out.println((i+1)+"、"+Cw[i]+"="+Da[i]+" X"+" 正确答案:"+Sum[i]);}
        do
        {
            System.out.println("请选择:");
            System.out.println(" 1.再做一套题");
            System.out.println(" 2.错题重练");
            System.out.println(" 3.退出");
            yn=sc.nextInt();
            switch(yn)
            {
            case 1:
                TM();
                break;
            case 2:
                for(int i=0;i<w;i++)
                {
                    System.out.println((i+1)+"、"+Cw[i]+"=");
                    da[i]=sc.nextDouble();
                    if(da[i]!=Sum[i])
                    {
                        cwcs[i]++;
                        System.out.println((i+1)+"、X 正确答案为:"+Sum[i]);
                        try
                        {
                            File f=new File("CTB.txt");
                            BufferedReader in=new BufferedReader(new FileReader(f));
                            PrintWriter out new PrintWriter(new BufferedWriter(new FileWriter(f,true)));
                            String line;
                            while ((line = in.readLine()) != null)
                            {
                                String[] tokens = line.split(",");
                                if(tokens[0].equals(Cw[i]+"="+Sum[i]))
                                {
                                    out.println(line.replace(tokens[1], "共做错了"+cwcs[i]+"次。"));
                                }
                            }
                            in.close();
                            out.close();
                         }catch (IOException e) {e.printStackTrace();}
                    }
                }
                break;
            case 3:
                System.out.println( "你今天的正确率为 :" +(zts-zcts)*100/zts+"%"+"\r\n");
                CTB();
                break;
            }          
        }while(yn!=3);
    }
    public static void CTB()//错题本
    {
        System.out.println("         错题本          ");
        try
        {
            File f=new File("CTB.txt");
            InputStreamReader reader = new InputStreamReader(new FileInputStream(f));
            BufferedReader br = new BufferedReader(reader);
            String line; 
            while ((line = br.readLine()) != null){System.out.println(line);}
            br.close();
        }catch (IOException e) {e.printStackTrace();}
    }
}
posted @ 2020-12-06 19:38  禁小呆  阅读(108)  评论(0)    收藏  举报