返回顶部

一缕半夏微光

温柔半两,从容一生

导航

四则运算

自己写的这个四则运算还是有很多问题,不过暂时先将代码贴上吧

  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 }

posted on 2020-10-25 01:10  一缕半夏微光  阅读(179)  评论(0编辑  收藏  举报