每日日报之”动手动脑“作业二
1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。
import java.util.*; import java.util.Scanner; public class math { public static void main(String args[]) { Scanner sc=new Scanner(System.in); Random r=new Random(System.currentTimeMillis()); int n; System.out.println( "请输入总数:" ); n=sc.nextInt(); for(int i=0;i<n;i++){System.out.println(r.nextInt());} } }
运行结果如图:
2.请看以下代码,你发现了有什么特殊之处吗?
答: 该程序中所使用两个函数虽然名字相同,但由于实参类型不同且返回值类型不同,所以并不会发生冲突,这是JAVA的方法重载特性。
四则运算JAVA半成品版
此代码将之前的C++版改为了JAVA版,并又添置了些功能。
代码如下:
package homework; import java.util.*; import java.util.Scanner; import javax.script.*; public class math { private static int n,min,max,c,cc,kh=0,xz; private static char[] d={'+','-','*','/'}; private static Scanner sc=new Scanner(System.in); public static void main(String args[]) { DZ(); TM(); } public static void DZ()//菜单 { System.out.println( "请输入题目总数:" ); n=sc.nextInt(); System.out.println("请选择:"); System.out.println(" 1.小学二年级口算题"); System.out.println(" 2.小学三年级口算题"); System.out.println(" 3.小学四年级口算题"); xz=sc.nextInt(); System.out.println("请输入数值的范围."); min=sc.nextInt(); max=sc.nextInt(); switch(xz) { case 1: while(max>100) { System.out.println("小学二年级操作数范围不超过100,请重新输入最大值:"); max=sc.nextInt(); } c=1; break; case 2: while(max>1000) { System.out.println("小学三年级操作数范围不超过1000,请重新输入最大值:"); max=sc.nextInt(); } System.out.println( "输入操作数个数:" ); c=sc.nextInt()-1; while(c>3) { System.out.println("小学三年级操作数不超过4个,请重新输入操作数个数:"); c=sc.nextInt()-1; } break; case 3: System.out.println( "输入操作数个数:" ); c=sc.nextInt()-1; while(c>4) { System.out.println("小学四年级操作数不超过5个,请重新输入操作数个数:"); c=sc.nextInt()-1; } System.out.println( "是否有括号?是请输入1,否请输入0:" ); kh=sc.nextInt(); break; } System.out.println( "是否有乘除法?是请输入1,否请输入0:" ); cc=sc.nextInt(); } public static String Tm()//每题 { Random r=new Random(); int sz; String ch=null; double a=r.nextInt(max)+min; while(a>max){a=r.nextInt(max)+min;} if(xz==1) { int b; if(cc==0) {sz=r.nextInt(2);} else{sz=r.nextInt(4);}//乘除法 b=r.nextInt(max)+min; while(b>max){b=r.nextInt(max)+min;} if(d[sz]=='/') { if(b==0){while(b==0||b>max) {b=r.nextInt(max)+min;}}//防止0为被除数 if(a%b!=0) { while(a%b!=0||a>max||b>max) { a=r.nextInt(max)+min; b=r.nextInt(max)+min; } } } ch=String.valueOf(a); ch+=String.valueOf(d[sz]); ch+=String.valueOf(b); } else { double[] b=new double[c];//操作数个数及数值范围 int k=-1,h=-1,z; if(kh==1)//括号 { z=r.nextInt(2); if(z==1)//随机增加括号 { k=r.nextInt(c-1); if(k==0)//括号由开头起 { ch=String.valueOf('('); ch+=String.valueOf(a); h=r.nextInt(c-1)+k+1; while(h>c){h=r.nextInt(c-1)+k+1;} } if(k>0)//括号在式中 { ch=String.valueOf(a); h=r.nextInt(c)+k+1; while(h>c){h=r.nextInt(c)+k+1;} } } else{ch=String.valueOf(a);} } else{ch=String.valueOf(a);} for(int i=0;i<c;i++) { if(cc==0) {sz=r.nextInt(2);} else {sz=r.nextInt(4);}//乘除法 ch+=String.valueOf(d[sz]); if(k>0&&i==k-1){ch+=String.valueOf('(');} b[i]=r.nextInt(max)+min; while(b[i]>max){b[i]=r.nextInt(max)+min;} if(d[sz]=='/'&&b[i]==0){while(b[i]==0||b[i]>max) {b[i]=r.nextInt(max)+min;}}//防止0为被除数 ch+=String.valueOf(b[i]); if(i==h-1){ch+=String.valueOf(')');}//补“)” } } return ch;//以字符串形式定义算式 } public static void TM()//总题 { int j=0; String[] s=new String[n]; while(j<n)//制作题目 { s[j]=Tm(); if(PC(j,s)==0)//重复 { System.out.println((j+1)+"、"+s[j]+"="); j++; } } ScriptEngine se=new ScriptEngineManager().getEngineByName("JavaScript"); double[] sum=new double[n]; for(int i=0;i<n;i++) { try{sum[i]=(Double)se.eval(s[i]);} catch(ScriptException e){e.printStackTrace();} }//字符串转算式计算结果 DT(s,sum);//答题 } public static int PC(int j,String[] s)//判重 { for(int i=0;i<j;i++){if(s[i].equals(s[j])) {return 1;}} return 0; } public static void DT(String[] s,double[] sum)//答题 { int min,yd=0,w=0,yn; double[] da=new double[n];//回答 double[] Da=new double[n]; double[] Sum=new double[n]; String[] Cw=new String[n];//错误题号 System.out.println( "请设置答题时间(分钟)"); min=sc.nextInt(); System.out.println( "开始答题 !"); long startTime=System.currentTimeMillis(); while((System.currentTimeMillis()-startTime)/1000<=min*60) { da[yd]=sc.nextDouble(); yd++; if(yd==n){break;} } if(yd!=n){System.out.println( "时间到!答题结束!");} for(int i=0;i<n;i++) { if(da[i]!=sum[i])//判断答题对错 { Cw[w]=s[i]; Da[w]=da[i]; Sum[w]=sum[i]; w++; } } double cw=(double)(n-w)*100/n;//正确率 System.out.println( "你的正确率为 :" +cw+"%"); System.out.println( "你的错题如下 :");//错题 for(int i=0;i<w;i++){System.out.println((i+1)+"、"+Cw[i]+"="+Da[i]+" X"+" 正确答案:"+Sum[i]);} while(true) { System.out.println( "你想重练错题吗?是请输入1,否请输入0:"); yn=sc.nextInt(); if(yn==0){break;} for(int i=0;i<w;i++) { System.out.println((i+1)+"、"+Cw[i]+"="); da[i]=sc.nextDouble(); if(da[i]!=Sum[i]){System.out.println( "X 正确答案为:"+Sum[i]);} } } } }
此代码实现了不同年级题目的定制(包括扩号)、限时大题和判题等。还差错题本尚未完成。(此段代码打算将之前的”错题“部分代码重写,思路已有,框架也已有,只差写……)
今天完成了动手动脑部分。(四则运算是昨天上课时的半成品,今天才发……)
问题无。
明天完成动手动脑作业三。