第二讲方法_课后作业 (1)
Java第二讲「方法」课后作业
一、动手动脑:纯随机数发生器
题目:用公式 x(n+1) = (a*x(n) + c) mod m 写一个方法,生成指定个数的随机整数。其中 m=2^31-1,a=16807,c=0。
代码:
public class MyRandom {
private long seed;
private static final long M = 2147483647L;
private static final long A = 16807L;
private static final long C = 0;
public MyRandom(long seed) {
this.seed = seed;
}
public long next() {
seed = (A * seed + C) % M;
return seed;
}
public static void main(String[] args) {
MyRandom r = new MyRandom(System.currentTimeMillis());
for (int i = 0; i < 10; i++) {
System.out.println(r.next());
}
}
}
二、动手动脑:方法重载 MethodOverLoad
题目:看下面代码有什么特殊之处?
public class MethodOverload {
public static void main(String[] args) {
System.out.println(square(7));
System.out.println(square(7.5));
}
public static int square(int x) {
return x * x;
}
public static double square(double y) {
return y * y;
}
}
回答:两个方法都叫 square,但一个参数是 int,一个是 double。方法名相同、参数列表不同
四、动手动脑:递归求 n!
public class CalculateN {
public static long f(int n) {
if (n == 1) {
return 1;
}
return n * f(n - 1);
}
public static void main(String[] args) {
System.out.println(f(5)); // 输出120
}
}
五、课后实验:四则运算自动出题(阶段1)
题目:写一个程序自动生成30道小学四则运算题。
import java.util.Random;
public class MathTest1 {
public static void main(String[] args) {
Random ran = new Random();
String[] op = {"+", "-", "*", "/"};
for (int i = 1; i <= 30; i++) {
int a = ran.nextInt(100) + 1;
int b = ran.nextInt(100) + 1;
String o = op[ran.nextInt(4)];
System.out.println(i + ". " + a + " " + o + " " + b + " =");
}
}
}
六、课后实验:四则运算答题系统(阶段2)
import java.util.*;
public class MathTest2 {
static Random ran = new Random();
static List<String> used = new ArrayList<>();
static int right = 0, wrong = 0;
static final int TOTAL = 30;
static final int TIME = 120;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long start = System.currentTimeMillis();
System.out.println("共" + TOTAL + "题,限时" + TIME + "秒");
for (int i = 1; i <= TOTAL; i++) {
long t = (System.currentTimeMillis() - start) / 1000;
if (t >= TIME) {
System.out.println("时间到!");
break;
}
int[] q = genQuestion();
System.out.print("第" + i + "题(剩" + (TIME - t) + "秒): "
+ q[0] + " " + opName(q[3]) + " " + q[1] + " = ");
int ans = sc.nextInt();
if (ans == q[2]) {
right++;
} else {
wrong++;
System.out.println("错了,正确答案是" + q[2]);
}
}
grade();
sc.close();
}
static int[] genQuestion() {
int a, b, ans, op;
while (true) {
op = ran.nextInt(4);
if (op == 0) { // 加法
a = ran.nextInt(100) + 1;
b = ran.nextInt(100) + 1;
ans = a + b;
} else if (op == 1) { // 减法,保证a>=b
a = ran.nextInt(100) + 1;
b = ran.nextInt(100) + 1;
if (a < b) { int tmp = a; a = b; b = tmp; }
ans = a - b;
} else if (op == 2) { // 乘法,结果不到四位数
a = ran.nextInt(20) + 1;
b = ran.nextInt(20) + 1;
ans = a * b;
} else { // 除法,保证整除
b = ran.nextInt(9) + 1;
int q = ran.nextInt(10) + 1;
a = b * q;
ans = q;
}
String s = a + "" + op + b;
if (!used.contains(s)) {
used.add(s);
return new int[]{a, b, ans, op};
}
}
}
static String opName(int op) {
String[] s = {"+", "-", "*", "/"};
return s[op];
}
static void grade() {
int done = right + wrong;
System.out.println("答对:" + right + " 答错:" + wrong);
if (done > 0) {
double rate = right * 100.0 / done;
System.out.printf("正确率:%.1f%%\n", rate);
}
if (done < TOTAL) {
System.out.println("有" + (TOTAL - done) + "题没做完");
}
}
}

浙公网安备 33010602011771号