四则运算
自己写的这个四则运算还是有很多问题,不过暂时先将代码贴上吧
1 package sizeyunsuan; 2 3 import java.util.Scanner; 4 import javax.script.ScriptEngine; 5 import javax.script.ScriptEngineManager; 6 7 //问题:在错题本这边,若是与除法沾边,可能就记录不了错题 8 //问题:在有多个操作运算符时,暂时未加入括号 9 //问题:倒计时功能未完成 10 //问题:错题暂时未能重练,正确率 11 //问题:在二年级的算法中,其中的除法暂时未能整除 12 //问题:暂时不能控制三年级学生的取值范围,即最大1000,现暂时控制在100,因为其中还包含了四年级的,但是四年级的取值范围没有限制。 13 //问题:在计算总题量的时候,会有点小问题,即,如果做了二年级的题目,再去做三年级亦或四年级的题目,在这个基础上,并不会增加总题量,题量还是不变,但是做的题目的数量不变,意思就是可能做了有二十道题,但是你是分几个部分做的,一个部分做五个题目,可能在程序运行后所显示的题量总数为五个,而非20个,在此基础上需要再改动 14 //问题:在参数的缺省值这一块有点小问题 15 //问题:在错题重练中,顶多只能重练几个错题,并不能全部重练 16 17 public class Sizeyunsuan { 18 static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); 19 20 int number=100;//出题个数,缺省值为30 21 int Max,Min;//操作数数值范围,最大值,最小值 22 int AllNumber=0;//总题数 23 int count=0; 24 String[] arith=new String[number];//首先出题的个数 25 String[] mistakes=new String[number];//错题 26 int[] Res=new int[number]; 27 char[] ch= {'+','-','*','/'}; 28 Scanner in=new Scanner(System.in); 29 30 //计算算术的结果 31 public void result(String str,int res) { 32 try { 33 int a; 34 if(str.indexOf("/")==-1) { 35 System.out.println(jse.eval(str)); 36 a=(int) jse.eval(str); 37 if(a!=res) { 38 mistakes[count]=str; 39 count++; 40 } 41 }else { 42 Double d = Double.parseDouble(jse.eval(str).toString()); 43 //转int 44 a=d==null?0:d.intValue(); 45 System.out.println(a); 46 if(a!=res) { 47 mistakes[count]=str; 48 count++; 49 } 50 } 51 } catch (Exception t) {} 52 } 53 //打印主界面 54 public void Print() { 55 System.out.println("请选择:"); 56 System.out.println("1.参数设置"); 57 System.out.println("2.小学二年级口算题"); 58 System.out.println("3.小学三年级口算题"); 59 System.out.println("4.小学四年级口算题"); 60 System.out.println("5.错题集"); 61 } 62 //参数设置 63 public void parameter() { 64 int p; 65 do { 66 p=0; 67 System.out.println("请问你想要多少道题目?"); 68 number=in.nextInt(); 69 if(number>0) { 70 int q; 71 do { 72 q=0; 73 System.out.println("请问你想设置的操作数的范围为多少?"); 74 System.out.print("最大值:"); 75 Max=in.nextInt(); 76 System.out.print("最小值:"); 77 Min=in.nextInt(); 78 if(Max<Min) { 79 System.out.println("输入的最大值小于最小值,请重新输入!"); 80 q=1; 81 } 82 if(Max==Min){ 83 System.out.println("输入的最大值等于最小值,请重新输入!"); 84 q=1; 85 } 86 }while(q==1); 87 }else { 88 System.out.println("输入错误,请重新输入:"); 89 p=1; 90 } 91 }while(p==1); 92 System.out.println("参数已设置成功!"); 93 } 94 //判断是否有无算术题重复 95 boolean check(String s,String t) { 96 //s代表原来已经输出过的算术,t表示待输出的,判断二者是否相同 97 if(t.equals(s)) { 98 return false; 99 }else { 100 return true; 101 } 102 } 103 //算术题的实现 104 public void arithmetic(int ope) {//ope代表操作数 105 int a,b,index,q,inde,c,ind,d,indx,e; 106 if(ope==2) { 107 AllNumber=AllNumber+number; 108 for(int i=0;i<number;i++) { 109 do { 110 q=0; 111 index = (int) (Math.random() * 4); 112 if(Max>100) 113 Max=100; 114 a = (int) (Math.random()*(Max-Min)+Min); 115 b = (int) (Math.random()*(Max-Min)+Min); 116 arith[i]=a+" "+ch[index]+" "+b; 117 //当系统给出第一个随机算术题的时候,不需要判断是否重复 118 if(i==0) { 119 System.out.print((i+1)+"、"+arith[i]+"="); 120 Res[i]=in.nextInt(); 121 result(arith[i],Res[i]); 122 }else { 123 //j的出现是为了方便判断当前数据是否与之前所出的算术题重复 124 for(int j=0;j<i;j++) { 125 if(check(arith[j],arith[i])==true){//arith[i]在第二个for循环中一直不变,用于比较其与前面的是否重复 126 if(j==i-1) { 127 System.out.print((i+1)+"、"+arith[i]+"="); 128 Res[i]=in.nextInt(); 129 result(arith[i],Res[i]); 130 } 131 }else { 132 q=1; 133 } 134 } 135 } 136 }while(q==1);//do...while()语句的存在是为了当有重复数字出现的时候系统可以返回然后重新生成随机数字 137 } 138 }else if(ope==3) { 139 AllNumber=AllNumber+number; 140 for(int i=0;i<number;i++) { 141 do { 142 q=0; 143 index = (int) (Math.random() * 4); 144 inde = (int) (Math.random() * 4); 145 if(Max>100) 146 Max=100; 147 a = (int) (Math.random()*(Max-Min)+Min); 148 b = (int) (Math.random()*(Max-Min)+Min); 149 c = (int) (Math.random()*(Max-Min)+Min); 150 arith[i]=a+" "+ch[index]+" "+b+ch[inde]+" "+c; 151 //当系统给出第一个随机算术题的时候,不需要判断是否重复 152 if(i==0) { 153 System.out.print((i+1)+"、"+arith[i]+"="); 154 Res[i]=in.nextInt(); 155 result(arith[i],Res[i]); 156 }else { 157 //j的出现是为了方便判断当前数据是否与之前所出的算术题重复 158 for(int j=0;j<i;j++) { 159 if(check(arith[j],arith[i])==true){//arith[i]在第二个for循环中一直不变,用于比较其与前面的是否重复 160 if(j==i-1) { 161 System.out.print((i+1)+"、"+arith[i]+"="); 162 Res[i]=in.nextInt(); 163 result(arith[i],Res[i]); 164 } 165 }else { 166 q=1; 167 } 168 } 169 } 170 }while(q==1);//do...while()语句的存在是为了当有重复数字出现的时候系统可以返回然后重新生成随机数字 171 } 172 }else if(ope==4) { 173 AllNumber=AllNumber+number; 174 for(int i=0;i<number;i++) { 175 do { 176 q=0; 177 index = (int) (Math.random() * 4); 178 inde = (int) (Math.random() * 4); 179 ind = (int) (Math.random() * 4); 180 if(Max>100) 181 Max=100; 182 a = (int) (Math.random()*(Max-Min)+Min); 183 b = (int) (Math.random()*(Max-Min)+Min); 184 c = (int) (Math.random()*(Max-Min)+Min); 185 d = (int) (Math.random()*(Max-Min)+Min); 186 arith[i]=a+" "+ch[index]+" "+b+" "+ch[inde]+" "+c+" "+ch[ind]+" "+d; 187 //当系统给出第一个随机算术题的时候,不需要判断是否重复 188 if(i==0) { 189 System.out.print((i+1)+"、"+arith[i]+"="); 190 Res[i]=in.nextInt(); 191 result(arith[i],Res[i]); 192 }else { 193 //j的出现是为了方便判断当前数据是否与之前所出的算术题重复 194 for(int j=0;j<i;j++) { 195 if(check(arith[j],arith[i])==true){//arith[i]在第二个for循环中一直不变,用于比较其与前面的是否重复 196 if(j==i-1) { 197 System.out.print((i+1)+"、"+arith[i]+"="); 198 Res[i]=in.nextInt(); 199 result(arith[i],Res[i]); 200 } 201 }else { 202 q=1; 203 } 204 } 205 } 206 }while(q==1);//do...while()语句的存在是为了当有重复数字出现的时候系统可以返回然后重新生成随机数字 207 } 208 }else if(ope==5) { 209 AllNumber=AllNumber+number; 210 for(int i=0;i<number;i++) { 211 do { 212 q=0; 213 index = (int) (Math.random() * 4); 214 inde = (int) (Math.random() * 4); 215 ind = (int) (Math.random() * 4); 216 indx = (int) (Math.random() * 4); 217 if(Max>100) 218 Max=100; 219 a = (int) (Math.random()*(Max-Min)+Min); 220 b = (int) (Math.random()*(Max-Min)+Min); 221 c = (int) (Math.random()*(Max-Min)+Min); 222 d = (int) (Math.random()*(Max-Min)+Min); 223 e = (int) (Math.random()*(Max-Min)+Min); 224 arith[i]=a+" "+ch[index]+" "+b+" "+ch[inde]+" "+c+" "+ch[ind]+" "+d+" "+ch[indx]+" "+e; 225 //当系统给出第一个随机算术题的时候,不需要判断是否重复 226 if(i==0) { 227 System.out.print((i+1)+"、"+arith[i]+"="); 228 Res[i]=in.nextInt(); 229 result(arith[i],Res[i]); 230 }else { 231 //j的出现是为了方便判断当前数据是否与之前所出的算术题重复 232 for(int j=0;j<i;j++) { 233 if(check(arith[j],arith[i])==true){//arith[i]在第二个for循环中一直不变,用于比较其与前面的是否重复 234 if(j==i-1) { 235 System.out.print((i+1)+"、"+arith[i]+"="); 236 Res[i]=in.nextInt(); 237 result(arith[i],Res[i]); 238 } 239 }else { 240 q=1; 241 } 242 } 243 } 244 }while(q==1);//do...while()语句的存在是为了当有重复数字出现的时候系统可以返回然后重新生成随机数字 245 } 246 } 247 } 248 //错题集 249 public void ErrorNum() { 250 System.out.println("共做"+AllNumber+"道题目,其中错题有"+count+"个"); 251 System.out.println("错题为:"); 252 for(int i=0;i<count;i++) { 253 if(mistakes[i]==null) 254 break; 255 System.out.println(mistakes[i]); 256 } 257 } 258 //错题重练 259 public void NextExce() { 260 for(int i=0;i<AllNumber;i++) { 261 if(mistakes[i]==null) 262 break; 263 System.out.print((i+1)+"、"+mistakes[i]+"="); 264 Res[i]=in.nextInt(); 265 result(arith[i],Res[i]); 266 } 267 } 268 269 public static void main(String[] args) { 270 Sizeyunsuan s=new Sizeyunsuan(); 271 Scanner erzhu=new Scanner(System.in); 272 int p; 273 do { 274 p=0; 275 s.Print(); 276 int n=erzhu.nextInt(); 277 if(n==1) {//参数设置 278 s.parameter(); 279 System.out.println("若返回主菜单继续,请输入1,若直接退出,则输入其他数字:"); 280 p=erzhu.nextInt(); 281 }else if(n==2) {//小学二年级口算题 282 s.arithmetic(2); 283 System.out.println("返回主菜单查看错题,请输入1,若直接退出,则输入其他数字:"); 284 p=erzhu.nextInt(); 285 }else if(n==3) {//小学三年级口算题 286 int o; 287 System.out.println("请输入操作数:"); 288 int k=erzhu.nextInt(); 289 do { 290 o=0; 291 if(k<2||k>4) { 292 System.out.println("小学三年级口算题操作数不超过4个并且不能小于2个,请重新输入:"); 293 k=erzhu.nextInt(); 294 o=1; 295 }else { 296 s.arithmetic(k); 297 System.out.println("返回主菜单查看错题,请输入1,若直接退出,则输入其他数字:"); 298 p=erzhu.nextInt(); 299 } 300 }while(o==1); 301 }else if(n==4) {//小学四年级口算题 302 int o; 303 System.out.println("请输入操作数:"); 304 int k=erzhu.nextInt(); 305 do { 306 o=0; 307 if(k<2||k>5) { 308 System.out.println("小学四年级口算题操作数不超过5个并且不能小于2个,请重新输入:"); 309 k=erzhu.nextInt(); 310 o=1; 311 }else { 312 s.arithmetic(k); 313 System.out.println("返回主菜单查看错题,请输入1,若直接退出,则输入其他数字:"); 314 p=erzhu.nextInt(); 315 } 316 }while(o==1); 317 }else if(n==5) {//错题集 318 s.ErrorNum(); 319 System.out.println("若想重练一下错题,请输入1,若直接退出,则输入其他数字:"); 320 p=erzhu.nextInt(); 321 if(p==1) { 322 s.NextExce(); 323 System.out.println("若返回主菜单继续,请输入1,若直接退出,则输入其他数字:"); 324 p=erzhu.nextInt(); 325 } 326 }else { 327 System.out.println("输入错误,请重新输入:"); 328 p=1; 329 } 330 }while(p==1); 331 } 332 }