类与对象(2)

一、函数题

一、根据派生类写出基类

裁判测试程序样例中展示的是一段定义基类People、派生类Student以及测试两个类的相关Java代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。

函数接口定义:

提示:
观察派生类代码和main方法中的测试代码,补全缺失的代码。

裁判测试程序样例:

注意:真正的测试程序中使用的数据可能与样例测试程序中不同,但仅按照样例中的格式调用相关方法(函数)。

class People{
    protected String id;
    protected String name;

    /** 你提交的代码将被嵌在这里(替换此行) **/

}

class Student extends People{
    protected String sid;
    protected int score;
    public Student() {
        name = "Pintia Student";
    }
    public Student(String id, String name, String sid, int score) {
        super(id, name);
        this.sid = sid;
        this.score = score;
    }
    public void say() {
        System.out.println("I'm a student. My name is " + this.name + ".");
    }

}
public class Main {
    public static void main(String[] args) {
        Student zs = new Student();
        zs.setId("370211X");
        zs.setName("Zhang San");
        zs.say();
        System.out.println(zs.getId() + " , " + zs.getName());

        Student ls = new Student("330106","Li Si","20183001007",98);
        ls.say();
        System.out.println(ls.getId() + " : " + ls.getName());

        People ww = new Student();
        ww.setName("Wang Wu");
        ww.say();

        People zl = new People("370202", "Zhao Liu");
        zl.say();
    }
}

输入样例:

在这里给出一组输入。例如:

(无)

输出样例:

在这里给出相应的输出。例如:

I'm a student. My name is Zhang San.
370211X , Zhang San
I'm a student. My name is Li Si.
330106 : Li Si
I'm a student. My name is Wang Wu.
I'm a person! My name is Zhao Liu.
 1 public String getId() {
 2         return id;
 3     }
 4     public void setId(String id) {
 5         this.id = id;
 6     }
 7     public String getName() {
 8         return name;
 9     }
10     public void setName(String name) {
11         this.name = name;
12     }
13    public  People(){
14         
15     }  
16 
17 
18    public People(String id,String name){
19         this.id=id;
20         this.name=name;
21     }
22 
23 
24   public void say(){
25       System.out.println("I'm a person! My name is " + this.name +".");
26   }
27  

二、使用继承,实现“剪刀石头布的游戏”

使用继承,实现“剪刀石头布的游戏”。

小时候很喜欢玩一个游戏,“剪刀石头布”,可以是出拳的形式,或跳格子的形式。现在我们用计算机来玩这个游戏。
电脑用随机数产生剪刀石头布,游戏玩家用输入1,2,3的方式出拳。
游戏玩家输入1或2或3,分别 代表剪刀(1)石头(2)布(3)。
电脑胜出时,显示"Winner is computerPlayer."
游戏玩家胜出时,显示“Winner is personPlayer.”
平局时显示"A Draw."

函数接口定义:

根据主方法内容,实现三个类的定义,分别是是ComputerPlayer、PersonPlayer、Game类。
其中ComputerPlayer、PersonPlayer要继承Player类。
根据主方法中的用法,实现Game类。

裁判测试程序样例:

import java.util.Scanner;

class Player{
    String name;
    Player(String name){
        this.name = name;
    }
    int show() {  //出拳方法
        int show = ( int ) (Math.random() * 10 ) %3  +1;
        return show ;
    }
}
/* 请在这里填写答案 */

public class Main {

    public static void main(String[] args) {
        ComputerPlayer c = new ComputerPlayer ("computer");
        PersonPlayer  p = new PersonPlayer("player ") ;
        Game g = new Game( c ,p );
        g.start();        
    }

}

输入样例:

2

输出样例:

A Draw.
 1 class ComputerPlayer extends Player{
 2     ComputerPlayer(String name){
 3         super(name);
 4     }
 5      int show() {  //出拳方法
 6             return super.show();
 7         }
 8     
 9 }
10 class PersonPlayer extends Player {
11     PersonPlayer(String name){
12         super(name);
13         
14     }
15 }
16 class Game{
17     Scanner sc=new Scanner(System.in);
18     ComputerPlayer c;
19     PersonPlayer d;
20     Game(ComputerPlayer c,PersonPlayer d){
21         this.c=c;
22         this.d=d;
23     }
24     void start(){
25         int s=sc.nextInt();
26         if(s==c.show())
27         {
28             System.out.println("A Draw.");
29         }
30         else if(s==1&&c.show()==3||s==2&&c.show()==1||s==3&&c.show()==2)
31         {
32             System.out.print("Winner is personPlayer.");
33         }
34         else 
35             System.out.print("Winner is computerPlayer.");
36     }
37 }

三、设计Worker类及其子类

设计一个Worker类,有以下方法:
(1)构造方法:带两个输入参数:工人的姓名和小时工资。
(2)小时工资的get/set方法
(3)pay()方法:带一个工作时长输入参数,输出:"Not Implemented"。
接下来设计Worker的子类:HourlyWorker和SalariedWorker。两个子类都重写继承的方法pay()来计算工人的周薪。计时工按实际工时支付每小时工资,超过40小时的超出部分为双倍工资。计薪工人的工资是40小时的工资,不管工作时间是多少。因为与工作时长无关,故SalariedWorker的方法pay()可以不带参数调用。

###类框架定义:

设计的类如下框架所示,完成后将该三类提交。
class Worker {
    ……
}

class HourlyWorker extends Worker {
        ……
}
class SalariedWorker extends Worker {
        ……
}

裁判测试程序样例:

import  java.util.Scanner;

//Main测试类
public class Main{
  public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
       Worker w1 = new Worker("Joe",15);
      w1.pay(35);
      SalariedWorker w2 = new SalariedWorker("Sue",14.5);
      w2.pay();
      w2.pay(60);
      HourlyWorker w3 = new HourlyWorker("Dana", 20);
      w3.pay(25);
      w3.setRate(35);   
            int h = input.nextInt();     # 输入小时工的工作时长
      w3.pay(h);      
  }
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

25

输出样例:

在这里给出相应的输出。例如:

Not Implemented
580.0
580.0
500.0
875.0
 1 class Worker{ 
 2     String name;
 3     double gz;
 4     int a;
 5     public Worker(String name,double gz) {
 6         this.gz=gz;
 7         this.name=name;
 8     }
 9     public double getGz() {
10         return gz;
11     }
12     public void setGz(double gz) {
13         this.gz=gz;
14     }
15     public void pay(int a){
16         System.out.println("Not Implemented");
17     }
18 }
19 class HourlyWorker extends Worker {
20     public HourlyWorker(String name,double gz) {
21         super(name,gz);
22         this.gz=gz;
23     }
24     public void setRate(int i) {
25     this.gz=i;
26     }
27     public void pay(int a){
28         double sum;
29         if(a<=40){
30         sum=a*this.gz;
31         System.out.println(sum);
32         }
33         else{
34             sum=a*this.gz*2;
35         System.out.println(sum);
36         }
37 }
38 }
39 class SalariedWorker extends Worker {
40     public SalariedWorker(String name,double gz) {
41         super(name,gz);
42         this.gz=gz;
43     }
44     public void pay() {
45         double qi=0;
46         qi=40*this.gz;
47         System.out.println(qi);
48     }
49     public void pay(int a) {
50         double qi=0;
51         qi=40*this.gz;
52         System.out.println(qi);
53     }
54 }

四、设计一个Triangle类继承自GeometricObject类

设计一个名为Triangle的类来扩展GeometricObject类。该类包括:

  • 三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0。
  • 一个无参构造方法创建默认的三角形。
  • 一个能创建带制定side1、side2和side3的三角形的构造方法。
  • 所有三个数据域的访问器方法。
  • 一个名为getArea()的方法返回这个三角形的面积。
  • 一个名为getPerimeter()的方法返回这个三角形的周长。
  • 一个名为toString()的方法返回这个三角形的字符串描述,返回的信息包括三角形的颜色、是否填充和三条边的边长。

编写一个测试程序,提示用户输入三角形的三条边、颜色以及一个boolean值表明该三角形是否填充。

程序应该使用输入创建一个具有这些边并设置color和filled属性的三角形。程序应该显示面积、边长、颜色以及表明是否填充的真或者假的值。

裁判测试程序样例:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        double side1 = input.nextDouble();
        double side2 = input.nextDouble();
        double side3 = input.nextDouble();

        Triangle triangle = new Triangle(side1, side2, side3);

        String color = input.next();
        triangle.setColor(color);

        boolean filled = input.nextBoolean();
        triangle.setFilled(filled);

        System.out.println("The area is " + triangle.getArea());
        System.out.println("The perimeter is " + triangle.getPerimeter());
        System.out.println(triangle);
    }
}

//GeometricObject类
class GeometricObject {
    private String color = "white";
    private boolean filled;
    private java.util.Date dateCreated;

    public GeometricObject() {
        dateCreated = new java.util.Date();
    }

    public GeometricObject(String color, boolean filled) {
        dateCreated = new java.util.Date();
        this.color = color;
        this.filled = filled;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public boolean isFilled() {
        return filled;
    }

    public void setFilled(boolean filled) {
        this.filled = filled;
    }

    public java.util.Date getDateCreated() {
        return dateCreated;
    }

    public String toString() {
        return "color: " + color + " and filled: " + filled;
    }
}

/* 请在这里填写答案 */

输入样例:

输入三角形的三条边、颜色以及一个boolean值表明该三角形是否填充。

3 4 5
red
true

输出样例:

面积、周长、颜色以及表明是否填充的真或者假的值。

The area is 6.0
The perimeter is 12.0
color: red and filled: true
Triangle: side1=3.0 side2=4.0 side3=5.0
 1 class Triangle extends GeometricObject{
 2     private String color = "white";
 3     private boolean filled;
 4     private double side1=1.0,side2=1.0,side3=1.0;
 5     Triangle(){
 6         
 7     }
 8     Triangle (double side1,double side2,double side3){
 9         this.side1=side1;
10         this.side2=side2;
11         this.side3=side3;
12     }
13     
14     public String getColor() {
15         return color;
16     }
17     public void setColor(String color) {
18         this.color = color;
19     }
20     public boolean isFilled() {
21         return filled;
22     }
23     public void setFilled(boolean filled) {
24         this.filled = filled;
25     }
26     public double getSide1() {
27         return side1;
28     }
29     public void setSide1(double side1) {
30         this.side1 = side1;
31     }
32     public double getSide2() {
33         return side2;
34     }
35     public void setSide2(double side2) {
36         this.side2 = side2;
37     }
38     public double getSide3() {
39         return side3;
40     }
41     public void setSide3(double side3) {
42         this.side3 = side3;
43     }
44     double getArea() {
45         double p=(this.side1+this.side2+this.side3)/2;
46         return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
47     }
48     double getPerimeter() {
49         return side1+side2+side3;
50     }
51     public String toString() {
52         return "color: " + color + " and filled: " + filled+"\n"+"Triangle: side1=" + side1 + " side2=" + side2 + " side3=" + side3 ;
53     }
54     
55     
56 }

五、普通账户和支票账户

编写一个Java程序,包含类Acount、CheckingAccount、Main,其中Main已经实现,请你编写Acount和CheckingAccount类。

(1)编写一个类Account表示普通账户对象,包含以下成员

①属性:

  1. id:私有,int型,表示账户编号;
  2. balance:私有,int型,表示账户余额;

②方法:

  1. Account(), 构造方法,id和balance都初始化为0;
  2. Account(int id,int balance),构造方法,用参数设置账户编号和余额;
  3. void setBalance(int balance):修改账户金额
  4. int getBalance():返回账户金额
  5. boolean withdraw(int money):从账户提取特定数额,如果余额不足,返回false;否则,修改余额,返回true;
  6. void deposit(int money):向账户存储特定数额。
  7. public String toString():将把当前账户对象的信息转换成字符串形式,例如id为123,余额为1000,返回字符串"The balance of account 123 is 1000"。

(2)编写一个Account类的子类CheckingAccount,表示支票账户对象,包含以下成员

①属性:

  1. overdraft:私有,int型,表示透支限定额;

②方法:

  1. CheckingAccount(), 构造方法,id、balance和overdraft都初始化为0;
  2. CheckingAccount(int id,int balance,int overdraft),构造方法,用参数设置账户编号、余额和透支限定额;
  3. boolean withdraw(int money):从账户提取特定数额,如果超出透支限定额,返回false;否则,修改余额,返回true;

(3)编写公共类Main,实现如下功能

  1. 根据用户输入的两个整数id和balance创建普通账户a;
  2. 输入一个整数n,表示对账户a有n笔操作;
  3. 每笔操作输入一个字符串和一个整数money(表示操作金额)
  • 如果字符串为“withdraw”表示取现操作,如果操作成功,输出“withdraw ” + money + “success”,否则输出“withdraw ” + money + “failed”
  • 如果字符串为“deposit”表示存入操作,完成操作后输出“deposit” + money + “success”
  1. 使用toString方法输出账户a信息。
  2. 根据用户输入的三个整数id、balance和overdraft创建支票账户b;
  3. 输入一个整数m,表示对账户b有m笔操作;
  4. 每笔操作输入一个字符串和一个整数money(表示操作金额)
  • 如果字符串为“withdraw”表示取现操作,如果操作成功,输出“withdraw ” + money + “success”,否则输出“withdraw ” + money + “failed”
  • 如果字符串为“deposit”表示存入操作,完成操作后输出“deposit” + money + “success”
  1. 使用toString方法输出账户b信息。

裁判测试程序样例:

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        int n,m;

        Account a = new Account(input.nextInt(),input.nextInt());
        n = input.nextInt();
        for(int i=0; i < n; i++) {
            String op;
            int money;
            op = input.next();
            money = input.nextInt();
            if(op.equals("withdraw")) {
                if(a.withdraw(money)) {              
                    System.out.println("withdraw " + money + " success");
                } else {
                    System.out.println("withdraw " + money + " failed");
                }
            } else if(op.equals("deposit")) {
                a.deposit(money);
                System.out.println("deposit " + money + " success");
            }
        }      
        System.out.println(a.toString());

        CheckingAccount b = new CheckingAccount(input.nextInt(),input.nextInt(),input.nextInt());
        m = input.nextInt();
        for(int i=0; i < m; i++) {
            String op;
            int money;
            op = input.next();
            money = input.nextInt();
            if(op.equals("withdraw")) {
                if(b.withdraw(money)) {              
                    System.out.println("withdraw " + money + " success");
                } else {
                    System.out.println("withdraw " + money + " failed");
                }
            } else if(op.equals("deposit")) {
                b.deposit(money);
                System.out.println("deposit " + money + " success");
            }
        }      
        System.out.println(b.toString());
    }
}


/* 请在这里填写答案 */

输入样例:

1 100
5
withdraw 200
withdraw 100
deposit 50
deposit 100
withdraw 200
2 100 200
5
withdraw 200
withdraw 100
deposit 50
deposit 100
withdraw 200

输出样例:

withdraw 200 failed
withdraw 100 success
deposit 50 success
deposit 100 success
withdraw 200 failed
The balance of account 1 is 150
withdraw 200 success
withdraw 100 success
deposit 50 success
deposit 100 success
withdraw 200 failed
The balance of account 2 is -50
 1 class Account{
 2     int d;int f;
 3     private int id=0;
 4     private int balance=0;
 5     public int getId() {
 6         return id;
 7     }
 8 
 9     public void deposit(int money) {
10         f=f+money;
11         
12     }
13 
14     public boolean withdraw(int money) {
15         if(money>f)
16         return false;
17         if(money<=f)
18         f=f-money;
19         return true;
20     }
21 
22     public void setId(int id) {
23         this.id = id;
24     }
25 
26     public int getBalance() {
27         return balance;
28     }
29 
30     public void setBalance(int balance) {
31         this.balance = balance;
32     }
33     public Account() {
34         
35     }
36     public Account(int nextInt, int nextInt2) {
37         
38         d=nextInt;f=nextInt2;
39     }
40     
41     public String toString() {
42         return "The balance of account "+d+" is "+f;
43     }
44 }
45 class CheckingAccount extends Account{
46     private int overdraft;
47     int zhanghao;int y;int t;
48     public CheckingAccount() {
49         
50     }
51     public CheckingAccount(int nextInt, int nextInt2, int nextInt3) {
52         zhanghao=nextInt;y=nextInt2;t=nextInt3;
53     }
54 
55     public int getOverdraft() {
56         return overdraft;
57     }
58 
59     public void setOverdraft(int overdraft) {
60         this.overdraft = overdraft;
61     }
62     public boolean withdraw(int money) {
63         if(money>t+y)
64             return false;
65         if(money<=t+y)
66             y=y-money;
67             return true;
68     }
69     public void deposit(int money) {
70         y=y+money;
71         
72     }
73     public String toString() {
74         return "The balance of account "+zhanghao+" is "+y;
75 }}

六、重写父类方法equals

在类Student中重写Object类的equals方法。使Student对象学号(id)相同时判定为同一对象。

函数接口定义:

在类Student中重写Object类的equals方法。使Student对象学号(id)相同时判定为同一对象。

裁判测试程序样例:

import java.util.Scanner;
class Student {
     int id;
     String name;
     int age;
     public Student(int id,     String name,     int age) {
         this.id = id;
         this.name = name;
         this.age = age;
     }

     /* 请在这里填写答案 */

}
public class Main {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
        Student s1 = new Student(sc.nextInt(),sc.next(),sc.nextInt());
        Student s2 = new Student(sc.nextInt(),sc.next(),sc.nextInt());
        System.out.println(s1.equals(s2));
        sc.close();
    }
}

输入样例:

1001 Peter 20
1001 Jack 18

输出样例:

true
1 Boolean equals(Student s){
2          if(this.id==s.id)
3          {
4              return true;
5          }
6          else
7              return false;
8      }

七、 jmu-Java-03面向对象基础-覆盖与equals 

Person类,Company类,Employee类。

其中Employee类继承自Person类,属性为:

private Company company;
private double salary;

现在要求覆盖Employee类的equals方法,两个Employee对象相等的条件是:

  1. 其继承自父类Person的属性值都相等,其company属性对象equals返回true,且其salary也相等。

  2. salary是double型,比较时,使用DecimalFormat df = new DecimalFormat("#.##");使salary保留两位小数,然后再进行比较。

  3. 要考虑company为null的情况。如果均为null返回true

函数接口定义:

public boolean equals(Object obj)

输入样例:

Company c1 = new Company("MicroSoft");
Company c2 = new Company("IBM");
Person e1 = new Employee("Li", 35, true, 60000.124, c1);
Person e2 = new Employee("Li", 35, true, 60000.124, c1);
Person e3 = new Employee("Li", 35, true, 60000.124, c2);
Person e4 = new Employee("Li", 35, true, 60000.123, c2);
Person e5 = new Employee("Li", 35, true, 60000.126, c2);
Person e6 = new Employee("Li", 35, true, 60000.126, null);
System.out.println(e1.equals(e2));
System.out.println(e1.equals(e3));
System.out.println(e3.equals(e4));
System.out.println(e3.equals(e5));
System.out.println(e5.equals(e6));

输出样例:

true
false
true
false
false
 1 public boolean equals(Object obj) {
 2    if (!super.equals(obj))
 3     return false;
 4   Employee other = (Employee) obj;
 5   if (company == null) {
 6    if (other.company != null)
 7     return false;
 8   } else if (!company.equals(other.company))
 9    return false;
10   DecimalFormat df = new DecimalFormat("#.##");
11   if (!df.format(salary).equals(df.format(other.salary)))
12    return false;
13   return true;
14  }

八、从抽象类shape类扩展出一个圆形类Circle 

请从下列的抽象类shape类扩展出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造方法。

public abstract class shape {// 抽象类

public abstract double getArea();// 求面积

public abstract double getPerimeter(); // 求周长

主类从键盘输入圆形的半径值,创建一个圆形对象,然后输出圆形的面积和周长。保留4位小数。

圆形类名Circle

裁判测试程序样例:

import java.util.Scanner;
import java.text.DecimalFormat;

abstract class shape {// 抽象类
     /* 抽象方法 求面积 */
    public abstract double getArea( );

    /* 抽象方法 求周长 */
    public abstract double getPerimeter( );
}

/* 你提交的代码将被嵌入到这里 */

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        DecimalFormat d = new DecimalFormat("#.####");// 保留4位小数
         double r = input.nextDouble( ); 
        shape c = new  Circle(r);

        System.out.println(d.format(c.getArea()));
        System.out.println(d.format(c.getPerimeter()));
        input.close();
    } 
}

输入样例:

3.1415926

输出样例: 

31.0063
19.7392
 1 class Circle extends shape {
 2     double r;
 3     public double getArea() {
 4         return Math.PI*r*r;
 5     }
 6     public double getPerimeter() {
 7         return Math.PI*2*r;
 8     }
 9     Circle(double r)
10     {
11         this.r=r;
12     }
13 }

九、设计门票(抽象类) 

某学校举办一次活动,需要凭票参加,每张票都有票号和售价。
门票分为3类:当天票,预订票和学生预订票。
当天票价格50。
预订票,提前时间>10天的,售价30;提前10天以内的,售价40;
学生预订票,提前时间>10天的,售价15;提前10天以内的,售价20。

(1)编写抽象类Ticket类,包含以下成员
①属性: number:私有,int型,表示票号;
②方法:

  1. Ticket(int number), 构造方法,初始化票号;
  2. int getPrice(), 返回票价,抽象方法;
  3. String toString(),返回一个字符串,格式为“Number:票号,Price:票价”。

(2)编写Ticket类的子类WalkupTicket,表示当天票,包含以下成员
①方法:
1)WalkupTicket(int number), 构造方法,初始化票号;
2)int getPrice(), 返回票价50。

(3)编写Ticket类的子类AdvanceTicket,表示预订票,包含以下成员
①属性:

  1. leadTime:私有,int型,表示提前预订的天数;
    ②方法:
  2. AdvanceTicket(int number,int leadTime), 构造方法,初始化票号和提前天数;
  3. int getPrice(), 如果提前天数>10天,票价30,否则,票价40。

(4)编写AdvanceTicket类的子类StudentAdvanceTicket,表示学生预订票,包含以下成员
①属性:

  1. height:私有,int型,表示购票学生的身高(单位厘米);
    ②方法:
    1)StudentAdvanceTicket(int number,int leadTime,int height), 构造方法,初始化票号、提前天数和身高;
    2)int getPrice(),

    如果学生身高>120:提前天数>10天,票价20,否则,票价30。 如果学生身高<=120,票价是身高120以上学生的对折。

裁判测试程序样例:

public class Main{ public static void main(String args[]) { Scanner in = new Scanner(System.in); Ticket a = new WalkupTicket(in.nextInt()); System.out.println(a.toString()); Ticket b = new AdvanceTicket(in.nextInt(), in.nextInt()); System.out.println(b.toString()); Ticket c = new StudentAdvanceTicket(in.nextInt(), in.nextInt(), in.nextInt()); System.out.println(c.toString()); } } /* 请在这里填写答案 */

按如下框架设计类后提交即可:

abstract class Ticket {
……
}
class WalkupTicket extends Ticket {
……
}
class AdvanceTicket extends Ticket {
……
}
class StudentAdvanceTicket extends AdvanceTicket {
……
}

输入样例:

输入票号,创建一个WalkupTicket对象。 输入票号和提前天数,创建一个AdvanceTicket对象。 输入票号、提前天数和身高,创建一个StudentAdvanceTicket对象。

1
2 10
3 11 130

输出样例:

输出创建的3个对象的票号和票价(调用toString()方法)。

Number:1,Price:50
Number:2,Price:40
Number:3,Price:20
 1 abstract class Ticket {
 2     private  int number;
 3     
 4     public int getNumber() {
 5         return number;
 6     }
 7     public void setNumber(int number) {
 8         this.number = number;
 9     }
10     Ticket(int number)
11     {
12         this.number=number;
13     }
14     public abstract  int  getPrice();
15 
16     public String toString() {
17         return "Number:" + number + ",Price:" + getPrice() ;
18     }
19     
20 }
21 class WalkupTicket extends Ticket {
22 
23     public WalkupTicket(int number) {
24         super(number);
25         // TODO Auto-generated constructor stub
26     }
27      public int getPrice() {
28         return 50;
29     }
30     
31 
32     
33 }
34 class AdvanceTicket extends Ticket {
35     private int leadTime;
36     
37     public int getLeadTime() {
38         return leadTime;
39     }
40 
41     public void setLeadTime(int leadTime) {
42         this.leadTime = leadTime;
43     }
44 
45 
46 
47     public AdvanceTicket(int number, int leadTime) {
48         super(number);
49         this.leadTime = leadTime;
50     }
51 
52     public  int getPrice() {
53         if(this.leadTime>10)
54             return 30;
55         else
56             return 40;
57     }
58     
59 }
60 class StudentAdvanceTicket extends AdvanceTicket {
61     private int height;
62 
63     public StudentAdvanceTicket(int number, int leadTime, int height) {
64         super(number, leadTime);
65         this.height = height;
66     }
67     public int getPrice(){
68         int s=0;
69         if(this.height>120&&getLeadTime()>10)
70             s= 20;
71         else
72             if(this.height>120&&getLeadTime()<=10) 
73             s=  30;
74     else
75         if(height<=120&&getLeadTime()>10) 
76                 s= 10;
77             else if(this.height<=120&&getLeadTime()<=10) 
78                 s=  15;
79         return s;
80         
81         
82     }
83     
84     
85 }

十、创建一个直角三角形类实现IShape接口

创建一个直角三角形类(regular triangle)RTriangle类,实现下列接口IShape。两条直角边长作为RTriangle类的私有成员,类中包含参数为直角边的构造方法。

interface IShape {// 接口

public abstract double getArea(); // 抽象方法 求面积

public abstract double getPerimeter(); // 抽象方法 求周长

}

###直角三角形类的定义:

直角三角形类的构造函数原型如下:
RTriangle(double a, double b);

其中 a 和 b 都是直角三角形的两条直角边。

裁判测试程序样例:

import java.util.Scanner;
import java.text.DecimalFormat;

interface IShape {
    public abstract double getArea();

    public abstract double getPerimeter();
}

/*你写的代码将嵌入到这里*/


public class Main {
    public static void main(String[] args) {
        DecimalFormat d = new DecimalFormat("#.####");
        Scanner input = new Scanner(System.in);
        double a = input.nextDouble();
        double b = input.nextDouble();
        IShape r = new RTriangle(a, b);
        System.out.println(d.format(r.getArea()));
        System.out.println(d.format(r.getPerimeter()));
        input.close();
    }
}

输入样例:

3.1 4.2

输出样例:

6.51
12.5202
 1 class RTriangle implements IShape{
 2     double a;
 3     double b;
 4     public double getArea() {
 5     return a*b/2;
 6     }
 7     public double getPerimeter() {
 8         return a+b+Math.sqrt(Math.pow(a,2)+Math.pow(b,2));
 9     }
10     
11     
12     RTriangle(double a, double b){
13         this.a=a;
14         this.b=b;
15     }
16 
17 
18 }

十一、面积求和 

由于各种图形 求面积的方式不一样,为了使编写的程序能够适应求不同形状的面积和,当新增加一个图形的时候,不需要修改其他类,采用面向接口的编程,其类图如下图所示:

根据以上类图,你需要设计和编写如下类: ######1.IGeometry接口类 ,里面有double getArea()接口方法 2.Rect类实现接口,有属性 a,b,有参构造方法及对接口方法的实现 ######3.Circle类实现接口,有属性r,有参构造方法及对接口方法的实现,其中PI=3.14 4.TotalArea类完成对不同形状图形面积求和,有属性IGeometry[] tuxing 数组用来存储 不同形状图形对象,SetTuxing(IGeometry[] t) 给属性tuxing赋值,double computeTotalArea()方法用来计算tuxing数组中存放的图形的面积和,并返回面积和。

主类已经给出,请结合主类完成上面类的编写

裁判测试程序主类:

public class Main {

    public static void main(String[] args) {
         IGeometry [] tuxing=new IGeometry[29]; //有29个Geometry对象
          for(int i=0;i<tuxing.length;i++) {   //29个Geometry对象分成两类
              if(i%2==0)
                  tuxing[i]=new Rect(16+i,68);
              else if(i%2==1)
                  tuxing[i]=new Circle(10+i);
          } 
          TotalArea computer=new TotalArea();
          computer.setTuxing(tuxing);  
          System.out.printf("各种图形的面积之和:\n%.2f",computer.computerTotalArea());

    }
}

/* 请在这里填写答案  请结合主类代码,在代码框完成IGeometry接口类,Rect类,Circle类和TotalArea类*/

输入样例:

在这里给出一组输入。例如:

输出样例:

在这里给出相应的输出。例如:

各种图形的面积之和:
58778.36
 1 interface IGeometry{
 2     
 3     double getArea();
 4 }
 5 class Rect implements IGeometry{
 6     double a,b;
 7     public double getArea() {
 8         return a*b;
 9     };
10     Rect(double a,double b)
11     {
12         this.a=a;
13         this.b=b;
14     }
15 }
16 class Circle implements IGeometry{
17     double r;
18     public double getArea() {
19         return 3.14*r*r;
20     };
21     Circle(double r){
22         this.r=r;
23     }
24 }
25 class  TotalArea {
26     IGeometry[] tuxing;
27     void setTuxing(IGeometry[] t) {
28         this.tuxing=t;
29     }
30     public double computerTotalArea() {
31         double s=0;
32     for(int i=0;i<tuxing.length;i++)
33     {
34         s=s+tuxing[i].getArea();
35     }
36     return  s ;
37     }
38     
39 }

十二、图书和音像租赁 

图书和音像店提供出租服务,包括图书和DVD的出租。图书包括书名(String,一个词表示)和价格(double),DVD包括片名(String,一个词表示)。它们都是按天出租,但租金计算方式却不同,图书的日租金为图书价格的1%,DVD的日租金为固定的1元。构造图书和DVD类的继承体系,它们均继承自Media类,且提供方法getDailyRent()返回日租金,构造音像店类MediaShop,提供静态函数double calculateRent(Media[] medias, int days)。 在main函数中构造了Media数组,包含图书和DVD的对象,调用calculateRent方法得到并输出租金,保留小数点两位

输入描述:

待租图书和DVD的数量

图书和DVD的详细信息

租借天数

输出描述:

总的租金

裁判测试程序样例:

import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Media[] ms  = new Media[n];
        for (int i=0; i<n; i++) {
            String type = sc.next();
            if (type.equals("book")) {
                ms[i] = new Book(sc.next(), sc.nextDouble());
            }else {
                ms[i] = new DVD(sc.next());
            }
        }
        double rent = MediaShop.calculateRent(ms, sc.nextInt());
        System.out.printf("%.2f", rent);
    }
}

/* 请在这里填写答案 */

输入样例:

5
book Earth 25.3
book Insights 34
dvd AI
dvd Transformer
book Sun 45.6
20

输出样例:

60.98
 1 abstract class Media{
 2     abstract double getDailyRent();
 3 }
 4 
 5 class Book extends Media{
 6     String name;
 7     double price;
 8     
 9     public Book(String name,double price) {
10         this.name=name;
11         this.price=price;
12     }
13     
14     public double getDailyRent() {
15         return this.price*0.01;
16     }
17 }
18 
19 class DVD extends Media{
20     String name;
21     
22     public DVD(String name) {
23         this.name=name;
24     }
25     
26     public double getDailyRent() {
27         return 1;
28     }
29 }
30 
31 class MediaShop{
32 
33     public static double calculateRent(Media[] medias, int days) {
34         double sum=0;
35         for(Media m:medias) {
36             if(m instanceof DVD) {
37                 DVD d=(DVD)m;
38                 sum+=d.getDailyRent()*days;
39             }else if(m instanceof Book) {
40                 Book b=(Book)m;
41                 sum+=b.getDailyRent()*days;
42             }
43         }
44         return sum;
45     }
46 }

二、编程题

一、覆盖

Java每个对象都继承自Object,都有equals、toString等方法。
现在需要定义PersonOverride类并覆盖其toStringequals方法。

###1. 新建PersonOverride类

a. 属性:String nameint ageboolean gender,所有的变量必须为私有(private)。

b. 有参构造函数,参数为name, age, gender

c. 无参构造函数,使用this(name, age,gender)调用有参构造函数。参数值分别为"default",1,true

d.toString()方法返回格式为:name-age-gender

e. equals方法需比较name、age、gender,这三者内容都相同,才返回true.

###2. main方法 2.1 输入n1,使用无参构造函数创建n1个对象,放入数组persons1。
2.2 输入n2,然后指定name age gender。每创建一个对象都使用equals方法比较该对象是否已经在数组中存在,如果不存在,才将该对象放入数组persons2。
2.3 输出persons1数组中的所有对象
2.4 输出persons2数组中的所有对象
2.5 输出persons2中实际包含的对象的数量
2.5 使用System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));输出PersonOverride的所有构造函数。

提示:使用ArrayList代替数组大幅复简化代码,请尝试重构你的代码。

输入样例:

1

3 zhang 10 true zhang 10 true zhang 10 false

输出样例:

default-1-true
zhang-10-true
zhang-10-false
2
[public PersonOverride(), public PersonOverride(java.lang.String,int,boolean)]
 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.HashSet;
 4 import java.util.Scanner;
 5 
 6 import java.util.Scanner;
 7 public class Main {
 8     public static void main(String[] args) {
 9         Scanner se=new Scanner (System.in);
10         int n1=se.nextInt();
11         PersonOverride persons1[] =new PersonOverride[n1];
12         for(int i=0;i<n1;i++) {
13             persons1[i]=new PersonOverride();
14             System.out.println(persons1[i].toString());
15         }
16         int n2=se.nextInt();
17         ArrayList<PersonOverride> persons2=new ArrayList<PersonOverride>();
18         for(int i=0;i<n2;i++) {
19             PersonOverride a=new PersonOverride(se.next(),se.nextInt(),se.nextBoolean());
20             if(!persons2.contains(a)) {
21                 persons2.add(a);
22                 System.out.println(a.toString());
23             }
24         }
25         System.out.println(persons2.size());
26         System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));
27     }
28 }
29 
30 class PersonOverride {
31     private String name;
32     private int age;
33     private boolean gender;
34   public PersonOverride() {
35         this.name = "default";
36         this.age = 1;
37         this.gender = true;
38     }
39     public PersonOverride(String name, int age, boolean gender) {
40         super();
41         this.name = name;
42         this.age = age;
43         this.gender = gender;
44     }
45     
46     @Override
47     public String toString() {
48         return  name + "-" + age + "-" + gender;
49     }
50     
51     @Override
52     public int hashCode() {
53         final int prime = 31;
54         int result = 1;
55         result = prime * result + age;
56         result = prime * result + (gender ? 1231 : 1237);
57         result = prime * result + ((name == null) ? 0 : name.hashCode());
58         return result;
59     }
60     @Override
61     public boolean equals(Object obj) {
62         if (this == obj)
63             return true;
64         if (obj == null)
65             return false;
66         if (getClass() != obj.getClass())
67             return false;
68         PersonOverride other = (PersonOverride) obj;
69         if (age != other.age)
70             return false;
71         if (gender != other.gender)
72             return false;
73         if (name == null) {
74             if (other.name != null)
75                 return false;
76         } else if (!name.equals(other.name))
77             return false;
78         return true;
79     }
80     public String getName() {
81         return name;
82     }
83     public void setName(String name) {
84         this.name = name;
85     }
86     public int getAge() {
87         return age;
88     }
89     public void setAge(int age) {
90         this.age = age;
91     }
92     public boolean isGender() {
93         return gender;
94     }
95     public void setGender(boolean gender) {
96         this.gender = gender;
97     }
98 }

二、接口-Comparator

Arrays.sort可以对所有实现Comparable的对象进行排序。但如果有多种排序需求,如有时候需对name进行降序排序,有时候只需要对年龄进行排序。使用Comparable无法满足这样的需求。可以编写不同的Comparator来满足多样的排序需求。

#1.编写PersonSortable2类 属性:private name(String)private age(int)
有参构造函数:参数为name,age
toString方法:返回格式name-age

#2 编写Comparator类

  1. 编写NameComparator类,实现对name进行升序排序
  2. 编写AgeComparator类,对age进行升序排序

#3.main方法中

    1. 输入n
    2. 输入n行name age,并创建n个对象放入数组
    3. 对数组按照name进行升序排序后输出。
    4. 在3的基础上对数组按照age进行升序排序后输出。
    5. 最后最后两行使用如下代码输出NameComparator与AgeComparator所实现的所有接口。
System.out.println(Arrays.toString(NameComparator.class.getInterfaces()));
System.out.println(Arrays.toString(AgeComparator.class.getInterfaces()));

输入样例:

5
zhang 15
zhang 12
wang 14
Wang 17
li 17

输出样例:

NameComparator:sort
Wang-17
li-17
wang-14
zhang-15
zhang-12
AgeComparator:sort
zhang-12
wang-14
zhang-15
Wang-17
li-17
//最后两行是标识信息
 1 import java.util.Arrays;
 2 import java.util.Comparator;
 3 import java.util.Scanner;
 4 
 5 class PersonSortable2{
 6     private String name;
 7     private int age;
 8     
 9     public PersonSortable2(String name, int age) {
10         super();
11         this.name = name;
12         this.age = age;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public int getAge() {
24         return age;
25     }
26 
27     public void setAge(int age) {
28         this.age = age;
29     }
30     
31     public String toString(){
32         return this.name + "-" + this.age;
33     }
34 }
35 
36 class NameComparator implements Comparator<PersonSortable2>{
37 
38     @Override
39     public int compare(PersonSortable2 o1, PersonSortable2 o2) {
40 
41         return o1.getName().compareTo(o2.getName());
42     }
43 }
44 
45 class AgeComparator implements Comparator<Object>{
46 
47     @Override
48     public int compare(Object o1, Object o2) {
49         // TODO Auto-generated method stub
50         return ((PersonSortable2)o1).getAge() - ((PersonSortable2)o2).getAge();
51     }
52     
53 }
54 
55 public class Main {
56     public static void main(String[] args) {
57         
58         Scanner cin = new Scanner(System.in);
59         
60         int n = cin.nextInt();
61         
62         PersonSortable2 [] P = new PersonSortable2[n];
63         
64         for( int i = 0; i< n; i ++){
65             P[i] = new PersonSortable2(cin.next(), cin.nextInt());
66         }
67         
68         Arrays.sort(P, (new NameComparator()));
69         System.out.println("NameComparator:sort");
70         for(int i = 0; i < n; i ++){
71             System.out.println(P[i]);
72         }
73         Arrays.sort(P, (new AgeComparator()));
74         System.out.println("AgeComparator:sort");
75         for(int i = 0; i < n; i ++){
76             System.out.println(P[i]);
77         }
78         System.out.println(Arrays.toString(NameComparator.class.getInterfaces()));
79         System.out.println(Arrays.toString(AgeComparator.class.getInterfaces()));
80     
81         cin.close();
82     }
83 }

三、集体评分 

程序填空题。请补充以下代码,完成题目要求。(注意:需要提交完整代码) 有一个团队由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
 1 import java.util.Scanner;
 2 public class Main {
 3     public static void main(String[] args) {
 4                 Scanner in = new Scanner(System.in);
 5                 int[] grade = new int[5];
 6                 for(int i=0; i<grade.length; i++){
 7                       grade[i] = in.nextInt();
 8                  }
 9 
10                 RR rr = new RT(grade);
11                 double dd = rr.mark();
12                 System.out.printf("%.2f",dd);
13     }
14 }
15 interface RR{
16    double mark();
17 }
18 class RT implements RR{
19    int[] grade;
20    public RT(int[] grade){
21       this.grade = grade;
22    }
23  public double mark()
24    {
25        return (grade[1]+grade[2]+grade[3])/3;
26    }
27 }

四、集体评分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
 1 import java.util.Scanner;
 2 public class Main {
 3     public static void main(String[] args) {
 4                 Scanner in = new Scanner(System.in);
 5                 int[] grade = new int[5];
 6                 for(int i=0; i<grade.length; i++){
 7                       grade[i] = in.nextInt();
 8                  }
 9 
10                 RR rr = new RT(grade);
11                 double dd = rr.mark();
12                 System.out.printf("%.2f",dd);
13     }
14 }
15 interface RR{
16    double mark();
17 }
18 class RT implements RR{
19    int[] grade;
20    public RT(int[] grade){
21       this.grade = grade;
22    }
23  public double mark()
24    {
25        return (grade[1]+grade[2]+grade[3])/3;
26    }
27 }

五、职工排序题

1. 为某保险公司设计一个职工管理系统,其中职工类的属性有:职工编号,姓名,性别,团体险业绩,个体险业绩;方法有: 每个属性对应的set,get方法; 不带参数的构造方法; 带参数的构造方法,完成对职工属性的初始化; 该类实现接口Comparable,完成对职工总业绩的比较。

2. 设计一个类,实现Comparator接口,完成对团体险业绩的比较;

3. 在Main类中,创建一个职工的线性表,分别完成对职工线性表按照总业绩升序排序,按照团体险业绩升序排序。 注意:不要设计键盘输入职工信息,可根据样例中提供的数据直接创建职工对象;

输入格式:

输出格式:

各项之间用逗号“,”分隔

输入样例:

在这里给出一组输入。例如:

输出样例:

在这里给出相应的输出。例如:

编号,团险,个险,姓名,性别
1,500,400,职工1,female
3,600,300,职工3,male
2,400,600,职工2,female
4,800,200,职工4,female
5,500,700,职工5,male
编号,团险,个险,姓名,性别
2,400,600,职工2,female
1,500,400,职工1,female
5,500,700,职工5,male
3,600,300,职工3,male
4,800,200,职工4,female
  1 import java.util.*;
  2 
  3 public class Main {
  4     public static void main(String[] args) throws InterruptedException {
  5         Scanner sc = new Scanner(System.in);
  6         List<Staff> ss=new ArrayList<Staff>();
  7         ss.add(new Staff(1,500,400,"职工1","female"));
  8         ss.add(new Staff(2,400,600,"职工2","female"));
  9         ss.add(new Staff(3,600,300,"职工3","male"));
 10         ss.add(new Staff(4,800,200,"职工4","female"));
 11         ss.add(new Staff(5,500,700,"职工5","male"));
 12 
 13         Collections.sort(ss);
 14         System.out.println("编号,团险,个险,姓名,性别");
 15         for (Staff s:ss){
 16             System.out.println(s.toString());
 17         }
 18         ss.sort(new newComparetor());
 19         System.out.println("编号,团险,个险,姓名,性别");
 20         for (Staff s:ss){
 21             System.out.println(s.toString());
 22         }
 23 
 24 
 25     }
 26 }
 27 
 28 class Staff implements Comparable<Staff>{
 29     private int number;
 30     private int tscore;
 31     private int pscore;
 32     private String name ;
 33     private String sex;
 34 
 35     public Staff() {
 36     }
 37 
 38     public Staff(int number, int tscore, int pscore, String name, String sex) {
 39         this.number = number;
 40         this.tscore = tscore;
 41         this.pscore = pscore;
 42         this.name = name;
 43         this.sex = sex;
 44     }
 45 
 46     public int getNumber() {
 47         return number;
 48     }
 49 
 50     public void setNumber(int number) {
 51         this.number = number;
 52     }
 53 
 54     public String getName() {
 55         return name;
 56     }
 57 
 58     public void setName(String name) {
 59         this.name = name;
 60     }
 61 
 62     public String getSex() {
 63         return sex;
 64     }
 65 
 66     public void setSex(String sex) {
 67         this.sex = sex;
 68     }
 69 
 70     public int getTscore() {
 71         return tscore;
 72     }
 73 
 74     public void setTscore(int tscore) {
 75         this.tscore = tscore;
 76     }
 77 
 78     public int getPscore() {
 79         return pscore;
 80     }
 81 
 82     public void setPscore(int pscore) {
 83         this.pscore = pscore;
 84     }
 85 
 86     @Override
 87     public int compareTo(Staff s) {
 88         int ret=this.pscore+this.tscore-s.getPscore()-s.getTscore();
 89         if (ret>0)ret=1;
 90         else if (ret<0)ret=-1;
 91         return ret;
 92     }
 93 
 94     @Override
 95     public String toString() {
 96         return number +
 97                 "," + tscore +
 98                 "," + pscore +
 99                 "," + name +
100                 "," + sex;
101     }
102 }
103 
104 class newComparetor implements Comparator<Staff> {
105     public newComparetor() {
106     }
107 
108     @Override
109     public int compare(Staff o1, Staff o2) {
110         int ret=o1.getTscore()-o2.getTscore();
111         if (ret>0)ret=1;
112         else if (ret<0)ret=-1;
113         return ret;
114     }
115 }

六、程序改错题

程序改错题。以下代码存在错误,请修改后提交。

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
 1 public class Main {
 2     public static void main(String[] args) {
 3         Animal animal = new Dog();
 4         Dog a=(Dog)animal;
 5         a.shout();
 6         a.run();
 7     }
 8 }
 9 
10 class Animal {
11     void shout() {
12         System.out.println("animal shout!");
13     }
14 }
15 
16 class Dog extends Animal {
17     void shout() {
18         super.shout();
19         System.out.println("wangwang……");
20     }
21 
22     void run() {
23         System.out.println("Dog is running");
24     }
25 }

 

posted @ 2021-07-06 22:08  咖啡布丁  阅读(755)  评论(0)    收藏  举报
levels of contents