四则运算

package task;
import java.util.Random;
import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FourOperations{
	static int[] s2=new int[13];
	static String[] q1=new String[10000];
	static String[] q2=new String[10000];
	static int sfg=0;
	public static void main(String args[]) throws Exception//主函数 
	{
		zeyrm();		
	}
	public static void zeyrm() throws Exception//主页面
	{
		int a,b,c,e;
		long d = 1;
		Scanner m=new Scanner(System.in);
		System.out.println("1.设置参数;");
		System.out.println("2.小学二年级口算题;");
		System.out.println("3.小学三年级口算题;");
		System.out.println("4.小学四年级口算题;");
		System.out.println("5.错题集;");
		int wer=m.nextInt();
		switch(wer)
		{
		case 1:
			System.out.println("出题个数:");
			a=m.nextInt();
			System.out.println("操作数个数:");
			b=m.nextInt();
			System.out.println("确定操作数的取值范围:");
			System.out.println("下限:");
			c=m.nextInt();
			System.out.println("上限:");
			e=m.nextInt();
			e-=c;
			if(e<=0) 
			{
				System.out.println("取值范围有误;");
			}else
			{
				for(int u=0;u<=b;u++)
				{
					d*=e;
				}
				d*=4;
				if(d>=a|| d<-1000000000)
				{
					Randomnum(a,b,e,c);
					Output(a);
				}else {
					System.out.println("在该条件下,无法完成无重复出题。");
				}	
			}	
			break;
		case 2:
			a=30;
			b=2;
			c=0;
			e=100;
			e-=c;
			Randomnum(a,b,e,c);
			Output(a);	
			break;
		case 3:
			a=30;
			b=4;
			c=0;
			e=1000;
			e-=c;
			Randomnum(a,b,e,c);
			Output(a);	
			break;
		case 4:
			a=30;
			b=5;
			c=0;
			e=1000;
			e-=c;
			Randomnum(a,b,e,c);
			Output(a);	
			break;
		case 5:	
			Output(sfg);
			break;			
		}
	}
	public static void Randomnum(int a,int b,int e,int c)//出题
	{
		for(int y=0;y<a;y++)
		{
			int hj=0,gh=1;
			Random t0 = new Random();
			s2[hj]=t0.nextInt(e)+c;
			hj++;
			int kj=0;
			for(int g=0;g<b-1;g++)
			{
				Random t2 = new Random();
				s2[hj]=t2.nextInt(4);
				hj++;
				if(s2[hj-1]==3)
				{
					if(kj!=0)
					{
						s2[hj-1]=1;
						Random t1 = new Random();
						s2[hj]=t1.nextInt(e)+c;
						hj++;
					}else
					{
						Random t1 = new Random();
						s2[hj]=t1.nextInt(e/4)+c;
						if(s2[hj]==0) s2[hj]=1;
						Random t3 = new Random();
						s2[hj-2]=(t3.nextInt(4)+1)*s2[hj];
						kj++;
						hj++;
					}					
				}else
				{
					Random t1 = new Random();
					s2[hj]=t1.nextInt(e)+c;
					hj++;	
				}				
			}
			if(y!=0) gh=Duplicatecheck(y,b);
			if(gh==1)
			{
				StringBuilder conversion = new StringBuilder();
				for(int i=0;i<(b*2-1);i++)
				{
					if(i%2==1)
					{
						switch(s2[i])
						{
						case 0:
							conversion.append('+');
							break;
						case 1:
							conversion.append('-');
							break;
						case 2:
							conversion.append('*');
							break;
						case 3:
							conversion.append('/');
							break;
						}
					}else
					{
						conversion.append(s2[i]);
					}					
				}
				q1[y]=conversion.toString();			
			}else
			{
				y--;
			}
		}		
	}
	public static int Duplicatecheck(int y,int b)//查重
	{
		String fd=null;
		StringBuilder conversion = new StringBuilder();
		for(int i=0;i<(b*2-1);i++)
		{
			if(i%2==1)
			{
				switch(s2[i])
				{
				case 0:
					conversion.append('+');
					break;
				case 1:
					conversion.append('-');
					break;
				case 2:
					conversion.append('*');
					break;
				case 3:
					conversion.append('/');
					break;
				}
			}else
			{
				conversion.append(s2[i]);
			}
		}
		fd=conversion.toString();
		for(int kl=0;kl<y;kl++)
		{
			if(fd.equals(q1[kl]))
			{
				return 0;
			}			
		}
		return 1;
	}
	public static void Output(int a) throws Exception//打印,判断,收集错题
	{
		int v=0;
		Scanner m=new Scanner(System.in);
		int ok=0;
		double tyu,s=0.00;
		String lk;
		for(int u=0;u<a;u++)
		{
			System.out.print(u+1+" ");
			System.out.print(q1[u]);
			System.out.print("=");
			ok=m.nextInt();
			lk=getResult(q1[u]);
			double nm=Double.valueOf(lk).intValue();
			int ks=(int)nm;
			if(ok==ks)
			{
				
				System.out.println("回答正确;");
				s++;
			}else
			{
				System.out.println("回答错误;");
				q2[v]=q1[u];
				v++;
			}
		}
		sfg=v;
		for(int fgv=0;fgv<v;fgv++)
		{
			q1[fgv]=q2[fgv];
		}
		System.out.print("正确率:");
		double vb=a;
		tyu=s/vb;
		System.out.println((tyu*100)+"%");
		zeyrm();
	}
	private static double doubleCal(double a1, double a2, char operator) throws Exception //符号运算
	{
        switch (operator) {
        case '+':
            return a1 + a2;
        case '-':
            return a1 - a2;
        case '*':
            return a1 * a2;
        case '/':
            return a1 / a2;
        default:
            break;
        }
        throw new Exception("illegal operator!");
    }
	private static int getPriority(String s) throws Exception //符号优先级
	{
        if(s==null) return 0;
        switch(s) {
        case "(":return 1;
        case "+":;
        case "-":return 2;
        case "*":;
        case "/":return 3;
        default:break;
        }
        throw new Exception("illegal operator!");
    }
	private static String toSufExpr(String expr) throws Exception //四则运算
	{
        StringBuffer sufExpr = new StringBuffer();
        Stack<String> operator = new Stack<String>();
        operator.push(null);
        Pattern p = Pattern.compile("(?<!\\d)-?\\d+(\\.\\d+)?|[+\\-*/()]");
        Matcher m = p.matcher(expr);
        while (m.find()) {
            String temp = m.group();
            if (temp.matches("[+\\-*/()]")) {
                if (temp.equals("(")) {
                    operator.push(temp);
                } else if (temp.equals(")")) {
                    String topItem = null;
                    while (!(topItem = operator.pop()).equals("(")) {
                        sufExpr.append(topItem+" ");
                    }
                } else {
                    while(getPriority(temp) <= getPriority(operator.peek())) {
                        sufExpr.append(operator.pop()+" ");
                    }
                    operator.push(temp);
                }
            }else {
                sufExpr.append(temp+" ");
            }
        }
        String topItem = null;
        while(null != (topItem = operator.pop())) {
            sufExpr.append(topItem+" ");
        }
        return sufExpr.toString();
    }
	public static String getResult(String expr) throws Exception//运算返回
	{
        String sufExpr = toSufExpr(expr);
        Stack<Double> number = new Stack<Double>();
        Pattern p = Pattern.compile("-?\\d+(\\.\\d+)?|[+\\-*/]");
        Matcher m = p.matcher(sufExpr);
        while (m.find()) {
            String temp = m.group();
            if (temp.matches("[+\\-*/]")) {
                double a1 = number.pop();
                double a2 = number.pop();
                double res = doubleCal(a2, a1, temp.charAt(0));
                number.push(res);
            } else {
                number.push(Double.valueOf(temp));
            }
        }
        return number.pop() + "";
    }
}

  

posted @ 2020-10-06 12:32  Ds-451  阅读(64)  评论(0编辑  收藏  举报