package ZuoYe;
import java.util.Random;
import java.util.Scanner;
public class suan {
    static int sum = 0;//记录目前式子个数
    static double cuoti = 0;
    static int rr = 0;
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("请输入式子个数:");
        int shizi = sc.nextInt();
        String [] arr = new String[shizi];//存运算式
        double [] result = new double[shizi];//存结果
        
        System.out.println("请输入运算数个数:");
        int c = sc.nextInt();//运算数个数
        
        System.out.println("是否需要加入括号,0:不需要 1:需要");
        int kuohao = sc.nextInt();
        
        System.out.println("请输入最小的值");
        int min = sc.nextInt();
        System.out.println("请输入最大的值");
        int max = sc.nextInt();
    
        double [] a = new double[c];
        char [] b = new char[c-1];
        int []temp = new int[shizi];
        
        for(int i=0;i<shizi;i++)//生成式子同时判断有无相同,无则存
        {
            String s = chuti(c,a,b,result,max,min,kuohao);
            while(!panduan(arr,s))
            {
                s=chuti(c,a,b,result,max,min,kuohao);
            }
            System.out.print(s);
            dati(result,temp);
            arr[sum] = s;
            sum++;
        }
        gailu(shizi);
        cuotiji(temp,arr);
        System.out.println("是否需要重新计算错题,0:不需要    1:需要");
        int o = sc.nextInt();
        if(o==1)
        {
            System.out.println("------------------------");
            chonglian(temp,arr,result);
        }
    }
    
    public static boolean panduan(String arr[],String b)//判断是否重复
    {
        for(int i=0;i<arr.length;i++)
        {
            if(b.equals(arr[i]))
            {
                System.out.println("重复");
                return false;
            }
        }
        return true;
    }
    
    public static String chuti(int c,double []a,char []b,double []result,int max,int min,int kuohao)//随机生成式子同时计算结果储存到result数组中
    {
        String s="";
        double re=0;
        char [] r = {'+','-','*','/'}; 
        Random ra = new Random();
        Random rb = new Random();
        
        if(kuohao==0)//不要括号
        {
            for(int i=0;i<c;i++)    //5
            {
                if(i<c-1)
                {
                    a[i]=rb.nextInt(max-min+1)+min;//将随机整数存到a中
                    s+=a[i];
                    int t = ra.nextInt(4);
                    b[i]=r[t];//将字符串存到b中
                    s+=r[t];
                }else
                {
                    a[i]=ra.nextInt(max-min+1)+min;
                    s+=a[i];
                }
            }
            //12+45/4*3    a[]={12,45,4,3} b[]={+,/,*}
            
            for(int i=0;i<b.length;i++)//i<7
            {
                if(b[i]=='*')
                {
                    a[i+1]=a[i]*a[i+1];
                    a[i]=0;
                }
                if(b[i]=='/')
                {
                    a[i+1]=a[i]/a[i+1];
                    a[i]=0;
                }
                if(b[i]=='-')//1+2-3
                {
                    a[i+1]=-a[i+1];
                }
            }
            for(int i=0;i<a.length;i++)
            {
                re+=a[i];
            }
            result[sum]=re;
        }else//需要括号
        {
            int zuokuo = ra.nextInt(c-1);
            int youkuo = ra.nextInt(c-zuokuo-1) + zuokuo + 1;
            for(int i=0;i<c;i++)    //5
            {
                if(i<c-1)
                {
                    if(zuokuo==i) s+='(';
                    a[i]=rb.nextInt(max-min+1)+min;//将随机整数存到a中
                    s+=a[i];
                    int t = ra.nextInt(4);
                    b[i]=r[t];//将字符串存到b中
                    if(youkuo==i) s+=')';
                    s+=r[t];
                }else
                {
                    a[i]=ra.nextInt(max-min+1)+min;
                    s+=a[i];
                    if(youkuo==i) s+=')';
                }
            }
            //12+45/4*3    a[]={12,45,4,3} b[]={+,/,*}
            
            for(int j=zuokuo;j<youkuo;j++)//计算括号里的值
            {
                if(b[j]=='*')
                {
                    a[j+1]=a[j]*a[j+1];
                    a[j]=0;
                }
                if(b[j]=='/')
                {
                    a[j+1]=a[j]/a[j+1];
                    a[j]=0;
                }
                if(b[j]=='-')//1+2-3
                {
                    a[j+1]=-a[j+1];
                }
            }
            for(int j=zuokuo;j<=youkuo;j++)
            {
                re+=a[j];
            }
            
             a[zuokuo] = re;//括号内计算结果

             double[] temp = new double[c - (youkuo - zuokuo)];//存去掉括号后的操作数
             char[] tempB = new char[c - (youkuo - zuokuo) - 1];//存括号外的操作符

             temp[zuokuo] = re;
             if (youkuo != c - 1) {
                 tempB[zuokuo] = b[youkuo];
             }

             for (int i = 0; i < zuokuo; i++) {
                 temp[i] = a[i];
                 tempB[i] = b[i];
             }
             for (int i = youkuo + 1, index = zuokuo + 1; i < c; i++, index++) {
                 temp[index] = a[i];
             }
             for (int i =youkuo + 1, index = zuokuo + 1; i < c - 1; i++, index++) {
                 tempB[index] = b[i];
             }

             //继续计算
             for (int j = 0; j < c - (youkuo-zuokuo) - 1; j++) {
                 if (tempB[j] == '-') {
                     temp[j + 1] = -temp[j + 1];
                 }
                 if (tempB[j] == '*') {
                     temp[j + 1] = temp[j] * temp[j + 1];
                     temp[j] = 0;
                 }
                 if (tempB[j] == '/') {
                     temp[j + 1] = temp[j] / temp[j + 1];
                     temp[j] = 0; 
                 }
             }
             re = 0;
             for (int j = 0; j < c - (youkuo-zuokuo); j++) {
                re += temp[j];
             }
            result[sum]=re;
        }
        s+="=";
        return s;
    }
    
    public static void dati(double []result,int []temp)//答题
    {
        Scanner sc = new Scanner(System.in);
            double t = sc.nextDouble();//输入你的答案
            if(t!=result[sum]) 
            {
                cuoti++;
                temp[rr] = sum;
                rr++;
                System.out.println("答案错误");
            }else
            {
                System.out.println("答案正确");
            }
    }
    
    public static void gailu(int shizi)
    {
        double p = (cuoti/shizi)*100;
        System.out.print("你的错误率为:");
        System.out.printf("%.2f",p);
        System.out.println("%");
    }
    
    public static void cuotiji(int []temp,String []arr)
    {
        System.out.println("你的错题集如下:");
        for(int i=0;i<rr;i++)
        {
            System.out.println(arr[temp[i]]);
        }
    }
    
    public static void chonglian(int []temp,String []arr,double []result)
    {
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<rr;i++)
        {
            System.out.print(arr[temp[i]]);
            double t = sc.nextDouble();
            if(t==result[temp[i]])
                System.out.println("再次计算正确");
            else
                System.out.println("再次计算错误");
        }
    }
}

括号计算部分想了很久,还是感觉很麻烦,等会写四则运算在类中的实现。