2021年7月14日 面向对象习题

1、写出一个复数类,给出加、减、乘法、除方法;

image-20210714165256627

image-20210714172231318

加法

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 复数的加法
*
* @param a 复数1
* @param b 复数2
* @return 复数a加上复数b大的值。
*/
public static Complex add(Complex a, Complex b) {
Complex result = new Complex();
result.real = a.real + b.real;
result.imag = a.imag + b.imag;
return result;
}

减法

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 复数减法
*
* @param a 复数1
* @param b 复数2
* @return 复数1减去复数2的结果
*/
public static Complex minus(Complex a, Complex b) {
Complex result = new Complex();
result.real = a.real - b.real;
result.imag = a.imag - b.imag;
return result;
}

乘法

https://www.shuxuele.com/algebra/complex-number-multiply.html

image-20210714172634655

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 求两个复数的乘积
*
* @param first 第一个复数
* @param second 第二个复数
* @return 两个复数的乘积
*/
public static Complex times(Complex first, Complex second) {
Complex result = new Complex();
result.real = first.real * second.real - first.imag * second.imag;
result.imag = first.imag * second.real + first.real * second.imag;
return result;
}

测试1:

1
2
3
4
c1 = new Complex(3, 2);
c2 = new Complex(1, 7);
Complex times = Complex.times(c1, c2);
System.out.println(times);

运行结果:

1
-11.0+23.0i

image-20210714192424595

测试2:

1
2
3
c1 = new Complex(1, 1);
c2 = new Complex(1, 1);
System.out.println(Complex.times(c1, c2));

运行结果:

1
0.0+2.0i

image-20210714192835071

测试3:

1
2
3
c1 = new Complex(3, 4);
c2 = new Complex(0, 1);
System.out.println(Complex.times(c1, c2));

运行结果:

-4.0+3.0i

共轭

共轭是把中间的正负号改变,像这样:

image-20210714193653954

共轭的一般符号是上面放一条横线:

例子:

image-20210714193637751

除法

复数除法需要用到共轭。

技巧是把上面下面都乘以下面共轭

image-20210714194808150

公式

1
(A+Bi)/(C+Di)=(A*C+B*D)/(C*C+D*D) + (B*C-A*D)/(C*C+D*D)i

例子

image-20210714193851139

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* (A+Bi)/(C+Di)=(A*C+B*D)/(C*C+D*D) + (B*C-A*D)/(C*C+D*D)i
* (A+Bi)/(C+Di)=(A*C+B*D)/(C*C+D*D) + (B*C-A*D)/(C*C+D*D)i
*
* @param fenZi 分子
* @param fenMu 分母
* @return 复数fenZi除以复数fenMu的结果
*/
public static Complex divide(Complex fenZi, Complex fenMu) {
Complex result = new Complex();
// A=first.real
// B=first.imag
// C=second.real
// D=second.imag
result.real = (fenZi.real * fenMu.real + fenZi.imag * fenMu.imag)
/ (fenMu.real * fenMu.real + fenMu.imag * fenMu.imag);
result.imag = (fenZi.imag * fenMu.real - fenZi.real * fenMu.imag)
/ (fenMu.real * fenMu.real + fenMu.imag * fenMu.imag);
return result;
}

验证:

1
2
3
4
c1 = new Complex(2, 3);
c2 = new Complex(4, -5);
System.out.println(Complex.divide(c1, c2));
System.out.println((-7 / 41.0) + "+" + (22 / 41.0) + "i");

运行结果:

1
2
-0.17073170731707318+0.5365853658536586i
-0.17073170731707318+0.5365853658536586i

2、写出一个矩形类,给出 面积和周长方法;

Rectangle_02.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Rectangle_02 {
/**
* 矩形的长度
*/
private double length;
/**
* 矩形的宽度
*/
private double width;

public Rectangle_02() {
// TODO Auto-generated constructor stub
}

public Rectangle_02(double length, double width) {
this.length = length;
this.width = width;
}

/**
* 求矩形的周长
*
* @return 矩形的周长
*/
public double perimeter() {
return 2 * (this.length + this.width);
}

/**
* 求矩形的面积
*
* @return 矩形的面积
*/
public double area() {

return this.length * this.width;
}

@Override
public String toString() {
return "Rectangle [length=" + length + ", width=" + width + "]";
}

}

测试:

1
2
Rectangle_02 r = new Rectangle_02(3, 4);
System.out.println(r + "的周长=" + r.perimeter() + ",面积=" + r.area());

运行结果:

1
Rectangle [length=3.0, width=4.0]的周长=14.0,面积=12.0

3、使用class关键字定义一个表示学生类型的类,类名为Student。

在Student类中定义两个成员变量name和age,分别用来表示姓名和年龄。

其中,name的数据类型为String,变量age的数据类型为int。

在Student类中定义一个表示说话行为的speak()方法,用于输出学生的姓名和年龄。

【练习题】01.类的成员变量:

猜数字游戏:一个类A有一个成员变量v,有一个初值100。定义一个类,对A类的成员变量v进行猜。如果大了则提示大了,小了则提示小了。等于则提示猜测成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class HW_02_01_GuessingNumbers {
private static int v = 100;

/**
* 猜测数字和类中定义个数字的v的大小
*
* @param num 整数
* @return 如果num大于类中保存的整数v,则返回1,等于则返回0,小于则返回-1
*/
public static int guessing(int num) {
if (num > HW_02_01_GuessingNumbers.v) {
return 1;
} else if (num == HW_02_01_GuessingNumbers.v) {
return 0;
}
return -1;
}

public static void print(int num) {
if (HW_02_01_GuessingNumbers.guessing(num) > 0) {
System.out.println(num + "大了");
} else if (HW_02_01_GuessingNumbers.guessing(num) == 0) {
System.out.println(num + "猜测成功");
} else {
System.out.println(num + "小了");
}
}
}

【练习题】02.类的成员变量:

请定义一个交通工具(Vehicle)的类,其中有:

属性:速度(speed),体积(size)等等

方法:移动(move()),设置速度(setSpeed(int speed)),加速speedUp(),减速speedDown()等等.

最后在测试类Vehicle中的main()中实例化一个交通工具对象,并通过方法给它初始化speed,size的值,并且通过打印出来。另外,调用加速,减速的方法对速度进行改变。

匀加速直线运动的速度公式:

$$
v_{t}=v_{0}+a t
$$

【练习题】03.类的成员变量与方法、构造方法

在程序中,经常要对时间进行操作,但是并没有时间类型的数据。那么,我们可以自己实现一个时间类,来满足程序中的需要。

定义名为MyTime的类,其中应有

三个整型成员:时(hour),分(minute),秒(second),为了保证数据的安全性,这三个成员变量应声明为私有。

为MyTime类定义构造方法,以方便创建对象时初始化成员变量。 再定义diaplay方法,用于将时间信息打印出来。

为MyTime类添加以下方法:

1
2
3
4
5
6
addSecond(int sec) 
addMinute(int min)
addHour(int hou)
subSecond(int sec)
subMinute(int min)
subHour(int hou)

分别对时、分、秒进行加减运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/**
* 当前的时间加上{@code h}个小时
*
* @param h 要加上多少个小时
* @return 当前时间加上{@code h}个小时之后的结果
*/
public HW_02_03_MyTime addHour(int h) {
int temp = this.hour + h;
// if (temp > 23)
// 一天只有24个小时,如果超过了24个小时话需要进位
// 由于这个类只保存到小时,所以丢弃进位
this.hour = temp % 24;
return this;
}
/**
* 当前时间加上{@code m}个分钟
*
* @param m 要加上多少分钟,可以超过60分钟
* @return 当前时间加上{@code m}分钟后的时间
*/
public HW_02_03_MyTime addMinute(int m) {
int temp = this.minute + m;
if (temp > 59) {
int hour = temp / 60;
this.minute = temp % 60;
// 向小时进位
addHour(hour);
} else {
// 没有进位的情况下直接在分钟上加即可
this.minute = this.minute + m;
}
return this;
}
/**
* 计算当前时间加上{@code s}秒钟后的时间
*
* @param s 要加上多少秒钟
* @return 当前时间加上{@code s}}秒钟后的时间
*/
public HW_02_03_MyTime addSecond(int s) {
int temp = this.second + s;
// 需要进位的情况
if (temp > 59) {
// 需要进位多少
int minute = temp / 60;
// 求出进位后的秒值
this.second = temp % 60;
// 向分钟进位
addMinute(minute);
} else {
this.second += s;
}
return this;
}
/**
* 当前时间减去{@code h}小时
*
* @param h 需要减去的小时数
* @return 当前时间减去{@code h}小时后的时间
*/
public HW_02_03_MyTime subHour(int h) {
int temp = this.hour - h;
// System.out.println("temp=" + temp);
// 如果减去的小时比当前的小时数要大,则需要借位
if (temp < 0) {
// 小时前面没有更高的位了,直接使用24加上相减的结果即可得到小时数
this.hour = 24 + temp % 24;
} else {
this.hour = temp;
}
return this;
}/**
* 当前时间减去{@code m}分钟
*
* @param m 要减去多少分钟
* @return 当前时间减去{@code m}分钟后的结果
*/
public HW_02_03_MyTime subMinute(int m) {
int temp = this.minute - m;
System.out.println("temp=" + temp);
if (temp < 0) {
// System.out.println("temp="+temp);
// 计算出要减去的小时数
int hour = -temp / 60;
subHour(hour + 1);
// 计算要减去的分钟数
this.minute = (60 + temp % 60) % 60;
} else {
this.minute = temp;
}
return this;
}
/**
* 当前时间减去{@code s}秒钟
*
* @param s 要减去多少秒钟
* @return 当前时间减去{@code s}秒钟后结果
*/
public HW_02_03_MyTime subSecond(int s) {
int temp = this.second - s;
// 相减为负数,则需要借位
if (temp < 0) {
// 计算出要减去的小时数
int minute = -temp / 60;
System.out.println(minute);
subMinute(minute);
// 当temp为0时,括号中的结果为60,此时应该对应0秒,而不是第60秒,
// 所以最后还要mod60
this.second = (60 + temp % 60) % 60;
} else {
this.second = temp;
}
return this;
}

【练习题】04.构造方法

编写Java程序,模拟简单的计算器。

定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有。

编写构造方法,赋予n1和n2初始值,

再为该类定义加(addition)、减(subtration)、乘(multiplication)、除(division)等公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。

在main方法中创建Number类的对象,调用各个方法,并显示计算结果。

【练习题】05.构造方法:

编写Java程序,用于显示人的姓名和年龄。

定义一个人类(Person),该类中应该有两个私有属性,姓名(name)和年龄(age)。

定义构造方法,用来初始化数据成员。再定义显示(display)方法,将姓名和年龄打印出来。

在main方法中创建人类的实例,然后将信息显示。

【练习题】06.get方法和set方法

定义一个类,该类有一个私有成员变量,通过构造方法将其进行赋初值,并提供该成员的getXXX()和setXXX()方法

提示:假设有

1
private String name;

则有

1
2
3
4
5
6
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}

【练习题】07.构造方法与重载

为“无名的粉”写一个类:class WuMingFen 要求:

1.有三个属性:

  • 面码:String theMa
  • 粉的分量(两):int quantity
  • 是否带汤:boolean likeSoup

2.写一个构造方法,以便于简化初始化过程,如:

WuMingFen f1 = new WuMingFen("牛肉",3,true);

3.重载构造方法,使得初始化过程可以多样化:

WuMingFen f2 = new WuMingFen("牛肉",2);

4.如何使得下列语句构造出来的粉对象是酸辣面码2两带汤的

WuMingFen f3 = new WuMingFen();

5.写一个普通方法:check(),用于查看粉是否符合要求。即:将对象的三个属性打印在控制台上。

【练习题】08.构造方法的重载:

定义一个名为Vehicles(交通工具)的基类,

  • 该类中应包含String类型的成员属性brand(商标)和color(颜色),

  • 还应包含成员方法run(行驶,在控制台显示“我已经开动了”)和

  • showInfo(显示信息,在控制台显示商标和颜色),

  • 并编写构造方法初始化其成员属性。

编写Car(小汽车)类继承于Vehicles类,

  • 增加int型成员属性seats(座位),

  • 还应增加成员方法showCar(在控制台显示小汽车的信息),

  • 并编写构造方法

编写Truck(卡车)类继承于Vehicles类,

  • 增加float型成员属性load(载重),

  • 还应增加成员方法showTruck(在控制台显示卡车的信息),

  • 并编写构造方法。 在main方法中测试以上各类。

【练习题】09.构造方法与重载

定义一个网络用户类,要处理的信息有

  • 用户ID、
  • 用户密码、
  • email地址。

在建立类的实例时,把以上三个信息都作为构造函数的参数输入,其中

用户ID和用户密码时必须的

缺省的email地址是==用户ID==加上字符串”@gameschool.com”

【练习题】10.构造方法与重载、包

编写Addition类,该类中应包含一组实现两数相加运算的重载方法。 实现加法运算的方法,应接受两个参数(即加数和被加数),方法将两个参数进行加法运算后,返回相加结果。考虑可能针对不同的数据类型进行计算,重载一组方法,包括整型、长整型、浮点型、双精度浮点型、还有字符串。 在main方法中创建Addition类的实例,分别调用重载方法测试其效果。 应将Addition类打入到包中,以自己名字的拼音为包命名。

【练习题】11.构造方法与重载

将上次练习题三中编写的MyTime类打到以自己名字的拼音命名的包中,并为该类重载一组构造方法,以方便使用者能够以多种形式初始化该类的实例。

【练习题】12.构造方法与重载

建立一个汽车类,包括轮胎个数,汽车颜色,车身重量等属性。并通过不同的构造方法创建事例。

至少要求:汽车能够加速,减速,停车。

要求:命名规范,代码体现层次,有友好的操作提示。

【练习题】13.构造方法与重载

创建一个类,为该类定义三个构造函数,分别执行下列操作:

1、传递两个整数值并找出其中较大的一个值

2、传递三个double值并求出其乘积

3、传递两个字符串值并检查其是否相同

4、在main方法中测试构造函数的调用