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() + ""; } }