sdut-Java面向对象-06 继承和多态、抽象类和接口(编程:11-20题)
定义//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。//出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null//获得栈顶元素,如果为空,则返回null.//如果为空返回true//返回栈中元素个数定义IntegerStack的实现类,内部使用数组实现。创建时,可指定内部数组大小。main方法说明输入n,建立可包含n
7-11 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company
定义Person抽象类,Student类、Company类,Employee类。
Person类的属性:String name, int age, boolean gender
Person类的方法:
public Person(String name, int age, boolean gender);
public String toString(); // 返回"name-age-gender"格式的字符串
public boolean equals(Object obj);// 比较name、age、gender,都相同返回true,否则返回false
Student类继承自Person,属性:String stuNo, String clazz
Student类的方法:
// 建议使用super复用Person类的相关有参构造函数
public Student(String name, int age, boolean gender, String stuNo, String clazz);
public String toString(); // 返回 “Student:person的toString-stuNo-clazz”格式的字符串
public boolean equals(Object obj); // 首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。
Company类属性:String name
Company类方法:
public Company(String name);
public String toString(); // 直接返回name
public boolean equals(Object obj); // name相同返回true
Employee类继承自Person,属性:Company company, double salary
Employee类方法:
// 建议使用super复用Person类的相关有参构造函数
public Employee(String name, int age, boolean gender, double salary, Company company);
public String toString(); //返回"Employee:person的toString-company-salary"格式的字符串
public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true。再比较company与salary。
// 比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数
编写equals方法重要说明:
- 对Employee的company属性的比较。要考虑传入为
null的情况。如果company不为null且传入为null,返回false - 对所有String字符类型比较时,也要考虑
null情况。
提示
- 排序可使用Collections.sort
- equals方法要考虑周全
main方法说明
-
创建若干Student对象、Employee对象。
输入
s,然后依次输入name age gender stuNo clazz创建Student对象。
输入e,然后依次输入name age gender salary company创建Employee对象。
然后将创建好的对象放入List<Person> personList。输入其他字符,则结束创建。
说明: 对于String类型,如果为null则不创建对象,而赋值为null。对于company属性,如果为null则赋值为null,否则创建相应的Company对象。 -
对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。提示:可使用
Comparable<Person>或Comparator<Person> -
接受输入,如果输入为
exit则return退出程序,否则继续下面步骤。 -
将personList中的元素按照类型分别放到stuList与empList。注意:不要将两个内容相同的对象放入列表(是否相同是根据equals返回结果进行判定)。
-
输出字符串
stuList,然后输出stuList中的每个对象。 -
输出字符串
empList,然后输出empList中的每个对象。
1-3为一个测试点4-6为一个测试点
输入样例:
s zhang 23 false 001 net15
e wang 18 true 3000.51 IBM
s zhang 23 false 001 net15
e bo 25 true 5000.51 IBM
e bo 25 true 5000.52 IBM
e bo 18 true 5000.54 IBM
e tan 25 true 5000.56 IBM
e tan 25 true 5000.51 IBM
s wang 17 false 002 null
s wang 17 false 002 null
e hua 16 false 1000 null
s wang 17 false 002 net16
e hua 16 false 1000 null
e hua 18 false 1234 MicroSoft
!
continue
输出样例:
Employee:bo-18-true-IBM-5000.54
Employee:bo-25-true-IBM-5000.51
Employee:bo-25-true-IBM-5000.52
Employee:hua-16-false-null-1000.0
Employee:hua-16-false-null-1000.0
Employee:hua-18-false-MicroSoft-1234.0
Employee:tan-25-true-IBM-5000.56
Employee:tan-25-true-IBM-5000.51
Student:wang-17-false-002-null
Student:wang-17-false-002-null
Student:wang-17-false-002-net16
Employee:wang-18-true-IBM-3000.51
Student:zhang-23-false-001-net15
Student:zhang-23-false-001-net15
stuList
Student:wang-17-false-002-null
Student:wang-17-false-002-net16
Student:zhang-23-false-001-net15
empList
Employee:bo-18-true-IBM-5000.54
Employee:bo-25-true-IBM-5000.51
Employee:hua-16-false-null-1000.0
Employee:hua-18-false-MicroSoft-1234.0
Employee:tan-25-true-IBM-5000.56
Employee:tan-25-true-IBM-5000.51
Employee:wang-18-true-IBM-3000.51
实现代码:
import java.text.DecimalFormat;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Person> list = new ArrayList<>();
while (true){
String str = sc.next();
if(str.equals("s")){
list.add(new Student(sc.next(),sc.nextInt(),sc.nextBoolean(),sc.next(),sc.next()));
}else if(str.equals("e")){
list.add(new Employee(sc.next(),sc.nextInt(),sc.nextBoolean(),sc.nextDouble(),new Company(sc.next())));
}else {
break;
}
}
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
String s = sc.next();
if(s.equals("exit")) System.exit(0);
List<Student> studentList = new ArrayList<>();
List<Employee> employeeList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(list.get(i) instanceof Student){
if(studentList.isEmpty()){
studentList.add((Student) list.get(i));
}else if(!studentList.get(studentList.size()-1).equals(list.get(i))){
studentList.add((Student) list.get(i));
}
}else if(list.get(i) instanceof Employee){
if(employeeList.isEmpty()){
employeeList.add((Employee) list.get(i));
}else if(!employeeList.get(employeeList.size() - 1).equals(list.get(i))){
employeeList.add((Employee) list.get(i));
}
}
}
System.out.println("stuList");
for (int i = 0; i < studentList.size(); i++) {
System.out.println(studentList.get(i));
}
System.out.println("empList");
for (int i = 0; i < employeeList.size(); i++) {
System.out.println(employeeList.get(i));
}
}
}
abstract class Person implements Comparable<Person>{
private String name;
private int age;
private boolean gender;
public Person() {
}
public Person(String name, int age, boolean gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
@Override
public String toString() {
return name + "-" + age + "-" + gender;
}
@Override
public boolean equals(Object obj){
Person person = (Person) obj;
if(person.name.equals(this.name) && person.age == this.age && person.gender == this.gender) return true;
else return false;
}
@Override
public int compareTo(Person o) {
int temp = this.name.compareTo(o.name);
return temp == 0 ? this.age - o.age : temp;
}
}
class Student extends Person{
private String stuNo;
private String clazz;
public Student() {
}
public Student(String stuNo, String clazz) {
this.stuNo = stuNo;
this.clazz = clazz;
}
public Student(String name, int age, boolean gender, String stuNo, String clazz) {
super(name, age, gender);
this.stuNo = stuNo;
this.clazz = clazz;
}
@Override
public String toString() {
return "Student:" + getName() + "-" + getAge() + "-" + isGender() + "-" + stuNo + "-" + clazz;
}
@Override
public boolean equals(Object obj){
if(!super.equals(obj)){
return false;
}else {
Student student = (Student) obj;
if(student.stuNo.equals(this.stuNo) && student.clazz.equals(this.clazz)){
return true;
}else {
return false;
}
}
}
}
class Company{
private String name;
public Company() {
}
public Company(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object obj){
Company company = (Company) obj;
if(company.name.equals(this.name)) return true;
else return false;
}
}
class Employee extends Person{
private Company company;
private double salary;
public Employee() {
}
public Employee(Company company, double salary) {
this.company = company;
this.salary = salary;
}
public Employee(String name, int age, boolean gender, double salary,Company company) {
super(name, age, gender);
this.company = company;
this.salary = salary;
}
@Override
public String toString() {
return "Employee:" + getName() + "-" + getAge() + "-" + isGender() + "-" + company.toString() + "-" + salary;
}
@Override
public boolean equals(Object obj){
if(!super.equals(obj)){
return false;
}else {
Employee employee = (Employee) obj;
DecimalFormat df = new DecimalFormat("#.#");
if(employee.company.equals(this.company) && df.format(employee.salary).equals(df.format(this.salary))){
return true;
}else {
return false;
}
}
}
}
7-12 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack
定义IntegerStack接口,用于声明一个存放Integer元素的栈的常见方法:
public Integer push(Integer item);
//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。
public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek(); //获得栈顶元素,如果为空,则返回null.
public boolean empty(); //如果为空返回true
public int size(); //返回栈中元素个数
定义IntegerStack的实现类ArrayIntegerStack,内部使用数组实现。创建时,可指定内部数组大小。
main方法说明
- 输入n,建立可包含n个元素的ArrayIntegerStack对象
- 输入m个值,均入栈。每次入栈均打印入栈返回结果。
- 输出栈顶元素,输出是否为空,输出size
- 使用Arrays.toString()输出内部数组中的值。
- 输入x,然后出栈x次,每次出栈均打印。
- 输出栈顶元素,输出是否为空,输出size
- 使用Arrays.toString()输出内部数组中的值。
思考
如果IntegerStack接口的实现类内部使用ArrayList来存储元素,怎么实现?测试代码需要进行什么修改?
输入样例
5
3
1 2 3
2
输出样例
1
2
3
3,false,3
[1, 2, 3, null, null]
3
2
1,false,1
[1, 2, 3, null, null]
实现代码:
import java.util.Arrays;
import java.util.Scanner;
interface IntegerStack {
public Integer push(Integer item); //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item
public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek(); //获得栈顶元素,如果为空,则返回null
public boolean empty(); //如果为空返回true
public int size(); //返回栈中元素个数
}
class ArrayIntegerStack implements IntegerStack{
private Integer[] arr;
private int top = 0;
public ArrayIntegerStack(int n){
arr = new Integer[n];
Arrays.fill(arr, null);
}
public ArrayIntegerStack(){}
@Override
public String toString() {
return Arrays.toString(arr);
}
@Override
public Integer push(Integer item) {
if (item == null || arr.length == top){
return null;
}
arr[top++] = item;
return item;
}
@Override
public Integer pop() {
if (top == 0){
return null;
}
return arr[--top];
}
@Override
public Integer peek() {
if (top == 0){
return null;
}
return arr[top - 1];
}
@Override
public boolean empty() {
return top == 0;
}
@Override
public int size() {
return top;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayIntegerStack ais = new ArrayIntegerStack(n);
int m = scanner.nextInt();
while(m-- > 0){
int item = scanner.nextInt();
System.out.println(ais.push(item));
}
System.out.println(ais.peek() + "," + ais.empty() + "," + ais.size());
System.out.println(ais);
int x = scanner.nextInt();
while(x-- > 0){
System.out.println(ais.pop());
}
System.out.println(ais.peek() + "," + ais.empty() + "," + ais.size());
System.out.println(ais);
}
}
7-13 集体评分
程序填空题。请补充以下代码,完成题目要求。(注意:需要提交完整代码) 有一个团队由5个人组成。他们每个人给指导老师一个分数,去掉最高分,去掉最低分,剩下的3个分数的平均分就是该团队对指导老师的评分。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] grade = new int[5];
for(int i=0; i<grade.length; i++){
grade[i] = in.nextInt();
}
RR rr = new RT(grade);
double dd = rr.mark();
System.out.printf("%.2f",dd);
}
}
abstract class RR{
int[] grade;
public RR(int[] grade){
this.grade = grade;
}
public abstract double mark();
}
class RT extends RR{
}
输入格式:
在一行中给出5个不超过10的正整数(从小到大排列)。
输出格式:
输出集体评分,保留小数点后两位。
输入样例:
1 2 4 6 9
输出样例:
4.00
实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] grade = new int[5];
for(int i=0; i<grade.length; i++){
grade[i] = in.nextInt();
}
RR rr = new RT(grade);
double dd = rr.mark();
System.out.printf("%.2f",dd);
}
}
abstract class RR{
int[] grade;
public RR(int[] grade){
this.grade = grade;
}
public abstract double mark();
}
class RT extends RR{
public RT(int[] grade) {
super(grade);
}
@Override
public double mark() {
double sum=0;
for (int i=1;i<grade.length-1;i++){
sum+=grade[i];
}
return sum/3;
}
}
7-14 集体评分2
程序填空题。请补充以下代码,完成题目要求。(注意:需要提交完整代码) 有一个团队由5个人组成。他们每个人给指导老师一个分数,去掉最高分,去掉最低分,剩下的3个分数的平均分就是该团队对指导老师的评分。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] grade = new int[5];
for(int i=0; i<grade.length; i++){
grade[i] = in.nextInt();
}
RR rr = new RT(grade);
double dd = rr.mark();
System.out.printf("%.2f",dd);
}
}
interface RR{
double mark();
}
class RT implements RR{
int[] grade;
public RT(int[] grade){
this.grade = grade;
}
}
输入格式:
在一行中给出5个不超过10的正整数(从小到大排列)。
输出格式:
输出集体评分,保留小数点后两位。
输入样例:
1 2 4 6 9
输出样例:
4.00
实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] grade = new int[5];
for(int i=0; i<grade.length; i++){
grade[i] = in.nextInt();
}
RR rr = new RT(grade);
double dd = rr.mark();
System.out.printf("%.2f",dd);
}
}
interface RR{ //接口在 Java 中是一种特殊的抽象类型,它只包含抽象方法和常量
double mark(); //这个接口的作用是为实现它的类定义了一个必须提供的方法规范,任何实现了RR接口的类都必须实现mark()方法
}
class RT implements RR{
int[] grade;
public RT(int[] grade){
this.grade = grade;
}
@Override //复写修改方法
public double mark(){
int min = grade[0]; //关于从数组中找出最大值最小值的方法
int max = grade[0];
int sum = grade[0];
for(int i=1;i<grade.length;i++){
sum += grade[i];
if(min > grade[i])
min = grade[i];
if(max < grade[i])
max = grade[i];
}
return (sum-max-min)/(grade.length-2);
}
}
7-15 程序改错题2
程序改错题。以下代码存在错误,请修改后提交。
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.shout();
animal.run();
}
}
class Animal {
void shout() {
System.out.println("animal shout!");
}
}
class Dog extends Animal {
void shout() {
super.shout();
System.out.println("wangwang……");
}
void run() {
System.out.println("Dog is running");
}
}
输入格式:
输出格式:
输入样例:
无
输出样例:
animal shout!
wangwang……
Dog is running
实现代码:
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.shout();
animal.run();
}
}
class Animal {
void shout() {
System.out.println("animal shout!");
}
void run (){
}
}
class Dog extends Animal {
void shout() {
super.shout();
System.out.println("wangwang……");
}
void run() {
System.out.println("Dog is running");
}
}
7-16 jmu-Java-05集合-01-ListIntegerStack
定义IntegerStack接口,该接口描述了一个存放Integer的栈的常见方法:
public Integer push(Integer item); // 如item为null,则不入栈直接返回null。否则直接入栈,然后返回item。
public Integer pop(); // 出栈,如栈为空,则返回null。
public Integer peek(); // 获得栈顶元素,如栈顶为空,则返回null。注意:不要出栈
public boolean empty(); // 如果栈为空返回true
public int size(); // 返回栈中元素数量
定义IntegerStack的实现类ArrayListIntegerStack,内部使用ArrayList存储。该类中包含:
构造方法:
在无参构造方法中新建ArrayList或者LinkedList,作为栈的内部存储。
思考:查询JDK文档,尝试说明本题到底使用哪个List实现类最好。
方法:public String toString() //用于输出List中的内容,可直接调用List的toString()方法。可用System.out.println(list)进行输出。
提示:
- 不建议使用top指针。最好直接复用List实现类中已有的方法。
- pop时应将相应的元素从列表中移除。
main方法说明
- 建立
ArrayListIntegerStack对象 - 输入m个值,均入栈。每次入栈均打印入栈返回结果。
- 输出:
栈顶元素,输出是否为空,然后输出size. - 输出栈中所有元素(调用其toString()方法)
- 输入
x,然后出栈x次,每次均打印出栈的对象。 - 输出:
栈顶元素,输出是否为空,输出size。注意:这里的输出栈顶元素,仅输出、不出栈。 - 输出栈中所有元素(调用其toString()方法)。注意:返回
null,也要输出。
思考:
如果使用LinkedList来实现IntegerStack,怎么实现?测试代码需要进行什么修改?
输入样例
5
1 3 5 7 -1
2
输出样例
1
3
5
7
-1
-1,false,5
[1, 3, 5, 7, -1]
-1
7
5,false,3
[1, 3, 5]
实现代码:
import java.util.LinkedList;
import java.util.Scanner;
interface IntegerStack {
public Integer push(Integer item); //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item
public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek(); //获得栈顶元素,如果为空,则返回null
public boolean empty(); //如果为空返回true
public int size(); //返回栈中元素个数
}
class ArrayListIntegerStack implements IntegerStack{
private LinkedList<Integer> list;
public ArrayListIntegerStack(){
list = new LinkedList<>();
}
public LinkedList<Integer> getList() {
return list;
}
@Override
public Integer push(Integer item) {
if (item == null){
return null;
}
list.add(item);
return item;
}
@Override
public Integer pop() {
if (list.size() == 0){
return null;
}
int topNum = list.getLast();
list.removeLast();
return topNum;
}
@Override
public Integer peek() {
if (list.size() == 0){
return null;
}
return list.getLast();
}
@Override
public boolean empty() {
return list.size() == 0;
}
@Override
public int size() {
return list.size();
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayListIntegerStack alis = new ArrayListIntegerStack();
int m = scanner.nextInt();
while(m-- > 0){
int item = scanner.nextInt();
System.out.println(alis.push(item));
}
System.out.println(alis.peek() + "," + alis.empty() + "," + alis.size());
System.out.println(alis.getList());
int x = scanner.nextInt();
while(x-- > 0){
System.out.println(alis.pop());
}
System.out.println(alis.peek() + "," + alis.empty() + "," + alis.size());
System.out.println(alis.getList());
}
}
7-17 接口--四则计算器
- 利用接口做参数,写个计算器,能完成加减乘除运算。
- 定义一个接口ICompute含有一个方法int computer(int n, int m)。
- 定义Add类实现接口ICompute,实现computer方法,求m,n之和
- 定义Sub类实现接口ICompute,实现computer方法,求n-m之差
- 定义Main类,在里面输入两个整数a, b,利用Add类和Sub类的computer方法,求第一个数a和第二个数b之和,输出和,第一个数a和第二个数b之差,输出差。
输入格式:
输入在一行中给出2个整数
输出格式:
输出两个数的和、差
输入样例:
在这里给出一组输入。例如:
6 7
输出样例:
在这里给出相应的输出。例如:
13
-1
实现代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
Add l=new Add();
Sub j=new Sub();
System.out.println(l.computer(n, m));
System.out.println(j.computer(n, m));
in.close();
}
}
interface IComputer{
abstract public int computer(int n ,int m);
}
class Add implements IComputer
{
int m,n;
public int computer(int n ,int m) {
return n+m;
}
}
class Sub implements IComputer
{
int m,n;
public int computer(int n ,int m) {
return n-m;
}
}
7-18 NCHU_雨刷程序功能扩展设计
在给定的汽车手动风挡玻璃雨刷程序的基础上,对程序进行重构(Refactoring),使得程序可以对功能进行扩展。
- 附件1:
附件1.pdf - 作业指导书:
OO第九周作业题目说明(雨刷问题).pdf
输入格式:
输入共2行,第一行为一个整型数字,取值范围为[1,2],其中1代表表1所描述的雨刷系统,2代表表2所描述的雨刷系统;第二行为若干个用一个或多个空格分开且以数字0结束的整型数字,取值范围为[1,4],其中1代表控制杆升档操作、2代表控制杆降档操作、3代表刻度盘升刻度操作、4代表刻度盘降刻度操作、0代表操作结束(输入时只要遇到0即认为输入结束)。
输出格式:
程序的输出行数根据每一次对控制杆/刻度盘操作次数而定,每一次对控制杆/刻度盘进行了操作,则输出一行数据。格式为:操作类型/控制杆当前档位/刻度盘当前刻度/雨刷当前速度
其中,操作类型共四种,分别为Lever up、Lever down、Dial up、Dial down;控制杆当前档位显示中文内容,例如停止、间歇、低速、高速、超高速(表2);刻度盘当前刻度显示为数值,例如1、2、3、4、5(4、5见表2);雨刷当前速度显示为整型数值。
输入样例:
在这里给出一组输入。例如:
1
1 1 1 2 3 2 4 3 3 1 2 0
输出样例:
在这里给出相应的输出。例如:
Lever up/间歇/1/4
Lever up/低速/1/30
Lever up/高速/1/60
Lever down/低速/1/30
Dial up/低速/2/30
Lever down/间歇/2/6
Dial down/间歇/1/4
Dial up/间歇/2/6
Dial up/间歇/3/12
Lever up/低速/3/30
Lever down/间歇/3/12
实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
int choice = 0;
int a = 0;
int flag = 0;
Scanner input = new Scanner(System.in);
a = input.nextInt();
if(a != 1 && a != 2){
System.out.println("Wrong Format");
System.exit(0);
}
choice = input.nextInt();
Lever lever = new Lever(1);
Dial dial = new Dial(1);
Brush brush = new Brush(0);
Agent agent = new Agent(lever,dial,brush);
if(a == 1){
dial.setN(3);//刻度1-3
lever.setN(4);//停止,间歇,低速,高速四种
}else{
dial.setN(5);//刻度1-3
lever.setN(5);//停止,间歇,低速,高速四种
}
while(choice != 0){
switch(choice){
case 1://Lever up
System.out.print("Lever up/");
agent.getLever().leverUp();
break;
case 2://Lever down
System.out.print("Lever down/");
agent.getLever().leverDown();
break;
case 3://Dial up
System.out.print("Dial up/");
agent.getDial().dialUp();
break;
case 4://Dial down
System.out.print("Dial down/");
agent.getDial().dialDown();
break;
case 0://Terminate
System.exit(0);
default :
flag=1;
choice = input.nextInt();
break;
}
if(flag == 0) {
agent.dealSpeed();//Get brush’s speed
System.out.println(agent.getBrush().getSpeed());
choice = input.nextInt();
}
}
}
}
class Lever {
private int pos;//档位
private int n;
public Lever(){
}
public Lever(int pos){
this.pos = pos;
}
public int getPos() {
return pos;
}
//升档
public void leverUp() {
if(this.pos < n){
this.pos++;
}
}
//降档
public void leverDown(){
if(this.pos > 1){
this.pos--;
}
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
class Dial {
private int pos;//刻度
private int n;
public Dial(){
}
public Dial(int pos){
this.pos = pos;
}
public int getPos() {
return pos;
}
//升刻度
public void dialUp() {
if(this.pos < n){
this.pos ++;
}
}
//降刻度
public void dialDown(){
if(this.pos > 1){
this.pos --;
}
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
class Brush {
private int speed;
public Brush(){
}
public Brush(int speed){
this.speed = speed;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
//为了减小实体类耦合性,采用中介模式,设计Agent代理类
class Agent {
//聚合型类设计
private Lever lever;
private Dial dial;
private Brush brush;
public Agent(){
}
public Agent(Lever lever,Dial dial,Brush brush){
this.lever = lever;
this.dial = dial;
this.brush = brush;
}
public Lever getLever() {
return lever;
}
public void setLever(Lever lever) {
this.lever = lever;
}
public Dial getDial() {
return dial;
}
public void setDial(Dial dial) {
this.dial = dial;
}
public Brush getBrush() {
return brush;
}
public void setBrush(Brush brush) {
this.brush = brush;
}
//主要业务逻辑:根据控制杆档位、刻度盘刻度计算雨刷摆动速度
public void dealSpeed() {
int speed = 0;
switch(this.lever.getPos()){
case 1://停止
System.out.print("停止"+"/"+this.dial.getPos()+"/");
speed = 0;break;
case 2://间歇
System.out.print("间歇"+"/"+this.dial.getPos()+"/");
switch(this.dial.getPos()){
case 1://刻度1
speed = 4;break;
case 2://刻度2
speed = 6;break;
case 3://刻度3
speed = 12;break;
case 4://
speed=15;break;
case 5:
speed=20;break;
}
break;
case 3://低速
System.out.print("低速"+"/"+this.dial.getPos()+"/");
speed = 30;break;
case 4://高速
System.out.print("高速"+"/"+this.dial.getPos()+"/");
speed = 60;break;
case 5://高速
System.out.print("超高速"+"/"+this.dial.getPos()+"/");
speed = 90;break;
}
this.brush.setSpeed(speed);
}
}
7-19 校园角色类设计-1
学校需要构建综合系统,使用者包含多种角色。角色Role分两类:学生Student和雇员Employee;雇员又分为教员Faculty和职员Staff。
每个角色都有姓名、性别。学生有学号、班级。一个雇员有工号、入职日期。教员有职称。职员有职位称号。
请以如下Main类为基础,构建各个角色类,将代码补充完整。
public class Main {
public static void main(String[] args) {
Faculty fac = new Faculty("张三",32,"33006","2019","10","25","讲师");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教务员");
fac.show();
sta.show();
stu.show();
}
}
输入格式:
无
输出格式:
我是张三,年龄32岁。工号是33006,2019年10月25日入职。是一名教师,讲师职称。
我是王五,年龄27岁。工号是32011,2015年6月17日入职。是一名教务员。
我是李四,年龄19岁。学号是20201103,来自202011班。
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
我是张三,年龄32岁。工号是33006,2019年10月25日入职。是一名教师,讲师职称。
我是王五,年龄27岁。工号是32011,2015年6月17日入职。是一名教务员。
我是李四,年龄19岁。学号是20201103,来自202011班。
实现代码:
import java.util.Arrays;
import java.util.Scanner;
class Role{
String name;
int age;
Role(String name, int age){
this.name = name;
this.age = age;
}
}
class Faculty extends Role{
private String id;
private String f_name;
private String year;
private String month;
private String day;
Faculty(String name, int age, String id, String year, String month, String day, String f_name){
super(name, age);
this.id = id;
this.year = year;
this.month = month;
this.day = day;
this.f_name = f_name;
}
public void show(){
System.out.println("我是" + super.name + ",年龄" + super.age + "岁。工号是" + this.id + "," + this.year + "年" + Integer.parseInt(this.month) + "月" + Integer.parseInt(this.day) + "日入职。是一名教师," + this.f_name + "职称。");
}
}
class Student extends Role{
private String id;
private String cl;
Student(String name, int age, String id, String cl){
super(name, age);
this.cl = cl;
this.id = id;
}
public void show(){
System.out.println("我是" + super.name + ",年龄" + age + "岁。学号是" + id + ",来自" + cl + "班。");
}
}
class Staff extends Role{
private String id;
private String f_name;
private String year;
private String month;
private String day;
Staff(String name, int age, String id, String year, String month, String day, String f_name){
super(name, age);
this.id = id;
this.year = year;
this.month = month;
this.day = day;
this.f_name = f_name;
}
public void show(){
System.out.println("我是" + super.name + ",年龄" + super.age + "岁。工号是" + this.id + "," + this.year + "年" + Integer.parseInt(this.month) + "月" + Integer.parseInt(this.day) + "日入职。是一名" + this.f_name + "。");
}
}
public class Main {
public static void main(String[] args) {
Faculty fac = new Faculty("张三",32,"33006","2019","10","25","讲师");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教务员");
fac.show();
sta.show();
stu.show();
}
}
7-20 校园角色类设计-2
在校园角色类设计-1题的基础上,增加了部分要求,加粗部分为增加的内容:
学校需要构建综合系统,使用者包含多种角色。角色Role分两类:学生Student和雇员Employee;雇员又分为教员Faculty和职员Staff。
每个角色都有姓名、年龄、性别、电话号码。学生有学号、班级、班级职务(班长、副班长、学习委员等)。一个雇员有工号、入职日期、所在部门。教员有职称和专业。职员有职位称号。
请以如下Main类为基础,构建各个角色类,将代码补充完整。
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Faculty fac = new Faculty("张三",32,"33006","2019","10","25","讲师");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教务员");
fac.setSex('男');
fac.setTel("13600770077");
fac.setDepartment("数信学院");
fac.setMajor("数学");
stu.setSex('女');
stu.setTel("18000009999");
stu.setPosition("班长");
sta.setSex('男');
sta.setTel("18966666666");
sta.setDepartment("航制学院");
Scanner input = new Scanner(System.in);
int i = input.nextInt();
/*
本部分使用多态根据用户的输入,输出不同的角色人物的信息,
输入1:教员
输入2:学生
输入3:职员
其他输入:输出"Wrong Format"
*/
}
}
输入格式:
数值
输出格式:
人物的基本信息。根据角色的不同而有差别。
输入样例1:
在这里给出一组输入。例如:
1
输出样例1:
在这里给出相应的输出。例如:
我是张三,男,年龄32岁。电话是13600770077。工号是33006,2019年10月25日入职。就职于数信学院。是一名教师,数学专业,讲师职称。
输入样例2:
在这里给出一组输入。例如:
2
输出样例2:
在这里给出相应的输出。例如:
我是李四,女,年龄19岁。电话是18000009999。学号是20201103,来自202011班。担任班长职务。
输入样例3:
在这里给出一组输入。例如:
3
输出样例3:
在这里给出相应的输出。例如:
我是王五,男,年龄27岁。电话是18966666666。工号是32011,2015年6月17日入职。就职于航制学院。是一名教务员。
输入样例3:
在这里给出一组输入。例如:
5
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
实现代码:
import java.util.Arrays;
import java.util.Scanner;
class Role{
String name;
int age;
char sex;
String tel;
Role(String name, int age){
this.name = name;
this.age = age;
}
}
class Faculty extends Role{
private String id;
private String f_name;
private String year;
private String month;
private String day;
private String department;
private String major;
Faculty(String name, int age, String id, String year, String month, String day, String f_name){
super(name, age);
this.id = id;
this.year = year;
this.month = month;
this.day = day;
this.f_name = f_name;
}
public void show(){
System.out.println("我是" + super.name + "," + this.sex + ",年龄" + super.age + "岁。电话是" + super.tel + "。工号是" + this.id + "," + this.year + "年" + Integer.parseInt(this.month) + "月" + Integer.parseInt(this.day) + "日入职。" + "就职于"+ this.department + "。是一名教师," + this.major + "专业," + this.f_name + "职称。");
}
public void setTel(String tel) {
super.tel = tel;
}
public void setDepartment(String department) {
this.department = department;
}
public void setMajor(String major) {
this.major = major;
}
public void setSex(char sex) {
super.sex = sex;
}
}
class Student extends Role{
private String id;
private String cl;
private String position;
Student(String name, int age, String id, String cl){
super(name, age);
this.cl = cl;
this.id = id;
}
public void show(){
System.out.println("我是" + super.name + "," + this.sex + ",年龄" + super.age + "岁。电话是" + super.tel + "。学号是" + id + ",来自" + cl + "班。" + "担任" + this.position + "职务。");
}
public void setPosition(String position) {
this.position = position;
}
public void setSex(char sex){
super.sex = sex;
}
public void setTel(String tel){
super.tel = tel;
}
}
class Staff extends Role{
private String id;
private String f_name;
private String year;
private String month;
private String day;
private String department;
Staff(String name, int age, String id, String year, String month, String day, String f_name){
super(name, age);
this.id = id;
this.year = year;
this.month = month;
this.day = day;
this.f_name = f_name;
}
public void show(){
System.out.println("我是" + super.name + "," + this.sex + ",年龄" + super.age + "岁。电话是" + super.tel + "。工号是" + this.id + "," + this.year + "年" + Integer.parseInt(this.month) + "月" + Integer.parseInt(this.day) + "日入职。就职于" + this.department + "。是一名" + this.f_name + "。");
}
public void setDepartment(String department) {
this.department = department;
}
public void setSex(char sex){
super.sex = sex;
}
public void setTel(String tel){
super.tel = tel;
}
}
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub
Faculty fac = new Faculty("张三",32,"33006","2019","10","25","讲师");
Student stu=new Student("李四",19,"20201103","202011");
Staff sta = new Staff("王五",27,"32011","2015","06","17","教务员");
fac.setSex('男');
fac.setTel("13600770077");
fac.setDepartment("数信学院");
fac.setMajor("数学");
stu.setSex('女');
stu.setTel("18000009999");
stu.setPosition("班长");
sta.setSex('男');
sta.setTel("18966666666");
sta.setDepartment("航制学院");
Scanner input = new Scanner(System.in);
int i = input.nextInt(); /* 使用多态根据用户的输入,输出不同的角色人物的信息, 输入1:教员 输入2:学生 输入3:职员 其他输入:输出"Wrong Format" */
if(i == 1){
fac.show();
}
else if(i == 2){
stu.show();
}
else if(i == 3){
sta.show();
}
else{
System.out.println("Wrong Format");
}
} }
更多推荐

所有评论(0)