目录
第八个实验是选做,看了一眼,好像都是自主性内容,就偷懒一下吧 !
1、
实验题目:定义一个电视机类,实现电视机的基本功能(换台,调整音量,开关),并测试其功能。
测试类:
package s3_1;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
TV tv = new TV();
System.out.println("1.开机");
System.out.println("0.关机");
System.out.println("请选择:");
Scanner sc = new Scanner(System.in);
int tvSwitch = sc.nextInt();
tv.setTvSwitch(tvSwitch);
while (tv.tvSwitch == 1) {
System.out.println("1.调节频道");
System.out.println("2.调节音量");
System.out.println("0.关机");
Scanner sc1 = new Scanner(System.in);
int select = sc.nextInt();
switch (select) {
case 1 :
int channel;
System.out.println("请输入频道:");
Scanner sc2 = new Scanner(System.in);
channel = sc.nextInt();
tv.setChannel(channel);
break;
case 2 :
int voiceChange;
System.out.println("请输入音量调节方式:");
Scanner sc3 = new Scanner(System.in);
voiceChange = sc.nextInt();
tv.setVoice(voiceChange);
System.out.println("现在的音量是:" + tv.voice);
break;
case 0 :
tv.tvSwitch = 0;
System.out.println("关机成功");
break;
}
}
}
}
电视机类:
public class TV {
public int channel = 0;
public int voice = 0;
public int tvSwitch = 0;
//直接输入频道
public void setChannel(int channel) {
if (channel >= 1) {
this.channel = channel;
System.out.println("现在是" + channel + "台");
}
else System.out.println("error");
}
//输入voiceChange,若为1,则声音调大一度;若为0,则声音减小一度;否则输出error
public void setVoice(int voiceChange) {
if (voiceChange == 1)
if (voice <= 3) voice ++ ;
else {
System.out.println("音量已经达到最大");
return;//错误写法:return 0; 或 break;
}
else if (voiceChange == 0) {
if (voice <= 0) {
System.out.println("音量已经达到最小");
return;
}
else voice -- ;
}
else System.out.println("error");
}
//输入tvSwitch,若为1,则开机,若为0,则关机,否则error
public void setTvSwitch(int tvSwitch) {
if (tvSwitch == 1) System.out.println("开机成功");
else if (tvSwitch == 0) System.out.println("关机成功");
else System.out.println("error");
this.tvSwitch = tvSwitch;//这个需要加上
}
}
2、
实验题目:
(1)设计一个分数类,分数的分子和分母用两个整型数表示,类中定义方法对分数进行加、减、乘、除运算;
(2)在测试类中定义分数类对象,运算并输出运算结果。
分数类:
public class Fraction {
public int fSon;
public int fMom;
//求最大公约数
public int gcd(int a, int b) {
//保证a>b
if (a < b) {
int c = b;
b = a;
a = c;
}
int r = a % b;
while (r != 0) {
a = b;
b = r;
r = a % b;
}
if (b < 1) b = -b;//这一步骤可以除去最大公因数为负数的情况
return b;
}
public void fAdd(int fSon1, int fMom1, int fSon2, int fMom2) {
int fm = fMom1 * fMom2;
fSon1 = fSon1 * fMom2;
fSon2 = fSon2 * fMom1;
int fs = fSon1 + fSon2;
int g = gcd(fs, fm);//最大公约数
fs /= g;
fm /= g;
System.out.println("两数相加的结果为;" + fs + "/" + fm);
}
public void fSub(int fSon1, int fMom1, int fSon2, int fMom2) {
int fm = fMom1 * fMom2;
fSon1 = fSon1 * fMom2;
fSon2 = fSon2 * fMom1;
int fs = fSon1 - fSon2;
int g = gcd(fs, fm);//最大公约数
System.out.println("最大公约数是" + g);
fs /= g;
fm /= g;
System.out.println("两数相减的结果为;" + fs + "/" + fm);
}
public void fMul(int fSon1, int fMom1, int fSon2, int fMom2) {
int fm = fMom1 * fMom2;
fSon1 = fSon1 * fMom2;
fSon2 = fSon2 * fMom1;
int fs = fSon1 * fSon2;
fm *= fm;
int g = gcd(fs, fm);//最大公约数
fs /= g;
fm /= g;
System.out.println("两数相乘的结果为;" + fs + "/" + fm);
}
public void fDiv(int fSon1, int fMom1, int fSon2, int fMom2) {
int fm = fMom1 * fMom2;
fSon1 = fSon1 * fMom2;
fSon2 = fSon2 * fMom1;
int g = gcd(fSon1, fSon2);//最大公约数
fSon1 /= g;
fSon2 /= g;
System.out.println("两数相除的结果为;" + fSon1 + "/" + fSon2);
}
}
测试类:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Fraction fraction = new Fraction();
System.out.println("请输入第一个分数的分子:");
Scanner sc1 = new Scanner(System.in);
int fSon1 = sc1.nextInt();
System.out.println("请输入第一个分数的分母:");
Scanner sc2 = new Scanner(System.in);
int fMom1 = sc2.nextInt();
System.out.println("请输入第二个分数的分子:");
Scanner sc3 = new Scanner(System.in);
int fSon2 = sc3.nextInt();
System.out.println("请输入第二个分数的分母:");
Scanner sc4 = new Scanner(System.in);
int fMom2 = sc4.nextInt();
fraction.fAdd(fSon1, fMom1, fSon2, fMom2);
fraction.fSub(fSon1, fMom1, fSon2, fMom2);
fraction.fMul(fSon1, fMom1, fSon2, fMom2);
fraction.fDiv(fSon1, fMom1, fSon2, fMom2);
}
}
3、
实验题目:
(1)定义一个手机类,定义若干属性,方法和构造方法;
(2)定义测试类,其中定义多个手机类对象,并设置不同的初始值;
(3)调用手机类的相关方法,测试该类的功能。
手机类:
public class Phone {
private String brand;//品牌
private int price;//价格
public Phone() {
}
public Phone(String brand, int price) {
this.brand = brand;
this.price = price;
}
public void printPhone() {
System.out.println(this.brand + "品牌的手机价格为:" + this.price);
}
public String getBrand() {
return brand;
}
public int getPrice() {
return price;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setPrice(int price) {
this.price = price;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Phone p1 = new Phone("iPhone 12", 6799);
Phone p2 = new Phone("iPhone 13", 7000);
p1.printPhone();
p2.printPhone();
}
}
4、
实验题目:
定义一个类,其中定义三个方法,分别求两个整数最大值、三个整数最大值和三个小数最大值,并测试其效果。
Number类:
public class Number {
public int first(int a, int b) {
return a >= b ? a : b;
}
public int second(int a, int b, int c) {
return (a >= b ? a : b) >= c ? (a >= b ? a : b) : c;
}
public double third(double a, double b, double c) {
return (a >= b ? a : b) >= c ? (a >= b ? a : b) : c;
}
}
测试类:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Number n = new Number();
System.out.println("请输入三个整数:");
//只需要定义一个Scanner就行
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
System.out.println("请输入三个小数:");
double a1 = sc.nextDouble();
double b1 = sc.nextDouble();
double c1 = sc.nextDouble();
System.out.println("两个整数的最大值:" + n.first(a, b));
System.out.println("三个整数的最大值:" + n.second(a, b, c));
System.out.println("三个小数的最大值:" + n.third(a1, b1, c1));
}
}
5、
实验题目:
(1)定义一个类,包含x、y两个属性,一个add方法实现对两个属性的加法运算,即x、y分别加上10和20,并定义该类的构造方法;
(2)通过定义add方法的重载,联系两种形参的传递方式(基本类型和引用类型);
(3)定义测试类,测试该类的重载方法的效果,总结两种参数传递的区别。
public class Test {
public static void main(String[] args) {
Number n = new Number();
Number n2 = new Number(3, 34);
Number n3 = new Number(3,34);
Number n4 = new Number(3, 34);
int x = 3, y = 34;
n.add(x, y);
System.out.println("add之后的x和y:" + x + "," + y);//值传递,不改变实参
n2.add(n2);
System.out.println("第二次add之后的x和y:" + n2.x + "," + n2.y);//引用传递的是地址,改变实参
n3.add(n4);
System.out.println("n3的值:" + n3.x + "," + n3.y);
System.out.println("第三次add之后的x和y:" + n4.x + "," + n4.y);
}
}
public class Number {
int x;
int y;
public Number() {
}
public Number(int x, int y) {
this.x = x;
this.y = y;
}
//基本类型(值类型)传递参数
public void add(int x, int y) {
x += 10;
y += 20;
}
//引用类型传参
public void add(Number n) {
n.x += 10;
n.y += 20;
}
}
不难看出,在引用传递参数中,只有被传进的对象的x和y才会发生改变(如n4),而调用add方法的n3的x和y并不发生改变。
6、
实验题目:
(1)设计一个学生类Student,包含至少两个成员变量,其中包含一个类变量,定义构造方法和一个类方法,输出该类的成员变量的值(注意类变量和实例变量的访问方式区别);
(2)定义测试类,实例化一个Student对象,然后调用该对象的相关方法,观察并分析类方法与实例方法的区别,总结静态变量和方法使用的注意事项。
可以看出,在静态(类)方法中不能访问非静态成员变量,只能访问静态变量。因为非静态成员变量必须通过实例化对象才能赋值,而静态成员变量则可以在不创建对象的情况下,通过类名来进行访问。而非静态(实例)方法,则可以访问两个变量(即:静态成员变量和非静态成员变量都可以访问)
而且, 静态成员变量可理解为一块公共的内存区域,无论是通过类名改变其值,还是通过对象名改变其值,其值都会发生永久改变。而非静态成员变量,只能通过对象名对其值进行改变,其值永远只属于其对象,而对于其他对象不会受到影响。
类变量可以直接用类名访问,也可以用对象访问
实例变量和方法只能用对象访问和调用
静态变量为同一类所有对象共享,使用其中一个对象调用后的值将会被其他对象继续使用
public class Student {
public String number;
public static int age;
public Student() {
}
public Student(String number, int age) {
this.number = number;
this.age = age;
}
public void show1() {
System.out.println("该学生的学号为:" + number + ",该学生的年龄为:" + age);
}
public static void show2() {
System.out.println("该学生的年龄为" + age);
}
}
public class Test {
public static void main(String[] args) {
//未创建对象,就可以访问静态变量(类变量)age
Student.age = 18;
Student.show2();
//创建对象后访问非静态变量number
Student stu = new Student("234256", 19);
stu.show1();
stu.show2();
System.out.println("第一次用类名调用静态方法:");
Student.show2();
System.out.println("第二次用类名调用静态方法,但是通过对象对age值进行过修改:");
stu.age = 33;
Student.show2();
}
}
7、
实验题目:
(1)设计一个雇员类,属性包括:编号、姓名、年龄、职务、部门、出勤人数;方法包括:构造方法、输出信息的方法、签到方法;
(2)创建雇员类对象,统计雇员的出勤人数。
注意考虑属性和方法的访问权限,方法的功能,及main方法中如何实现要求统计的信息。
雇员类:
import java.util.Scanner;
public class Employee {
public String[] number = new String[1024];
public String[] name = new String[1024];
public String[] age = new String[1024];
public String[] pos = new String[1024];
public String[] dep = new String[1024];
public int attendance = 0;//出勤人数
int n = 0;//应到人数
public Employee() {
//无参构造,不初始化
}
public void information() {
System.out.println("应到:" + n);
System.out.println("出勤人数为:" + attendance);
System.out.println("出勤人员信息:");
for (int i = 0; i < attendance; i ++ ) {
System.out.println("编号:" + number[i]);
System.out.println("姓名:" + name[i]);
System.out.println("年龄:" + age[i]);
System.out.println("职务:" + pos[i]);
System.out.println("部门:" + dep[i]);
}
}
//签到函数
public void sign() {
System.out.println("请输入员工总人数:");
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 0; i < n; i ++ ){
System.out.println("请输入编号:");
number[i] = sc.next();
System.out.println("请输入姓名:");
name[i] = sc.next();
System.out.println("请输入年龄:");
age[i] = sc.next();
System.out.println("请输入职务:");
pos[i] = sc.next();
System.out.println("请输入部门:");
dep[i] = sc.next();
attendance ++ ;
System.out.println("你是否是最后一个签到的人,若是,则输入0,否则输入1:");
int j = 0;
j = sc.nextInt();
if (j == 0) break;
}
}
}
测试类:
public class Test {
public static void main(String[] args) {
Employee e = new Employee();
System.out.println("开始签到:");
e.sign();
System.out.println("签到完成!");
e.information();
}
}
控制台输入:
开始签到:
请输入员工总人数:
3
请输入编号:
2001
请输入姓名:
张三
请输入年龄:
34
请输入职务:
java后端
请输入部门:
技术部
你是否是最后一个签到的人,若是,则输入0,否则输入1:
1
请输入编号:
2002
请输入姓名:
李四
请输入年龄:
33
请输入职务:
web前端
请输入部门:
技术部
你是否是最后一个签到的人,若是,则输入0,否则输入1:
0控制台输出:
签到完成!
应到:3
出勤人数为:2
出勤人员信息:
编号:2001
姓名:张三
年龄:34
职务:java后端
部门:技术部
编号:2002
姓名:李四
年龄:33
职务:web前端
部门:技术部进程已结束,退出代码为 0