类与对象(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表示普通账户对象,包含以下成员
①属性:
- id:私有,int型,表示账户编号;
- balance:私有,int型,表示账户余额;
②方法:
- Account(), 构造方法,id和balance都初始化为0;
- Account(int id,int balance),构造方法,用参数设置账户编号和余额;
- void setBalance(int balance):修改账户金额
- int getBalance():返回账户金额
- boolean withdraw(int money):从账户提取特定数额,如果余额不足,返回false;否则,修改余额,返回true;
- void deposit(int money):向账户存储特定数额。
- public String toString():将把当前账户对象的信息转换成字符串形式,例如id为123,余额为1000,返回字符串"The balance of account 123 is 1000"。
(2)编写一个Account类的子类CheckingAccount,表示支票账户对象,包含以下成员
①属性:
- overdraft:私有,int型,表示透支限定额;
②方法:
- CheckingAccount(), 构造方法,id、balance和overdraft都初始化为0;
- CheckingAccount(int id,int balance,int overdraft),构造方法,用参数设置账户编号、余额和透支限定额;
- boolean withdraw(int money):从账户提取特定数额,如果超出透支限定额,返回false;否则,修改余额,返回true;
(3)编写公共类Main,实现如下功能
- 根据用户输入的两个整数id和balance创建普通账户a;
- 输入一个整数n,表示对账户a有n笔操作;
- 每笔操作输入一个字符串和一个整数money(表示操作金额)
- 如果字符串为“withdraw”表示取现操作,如果操作成功,输出“withdraw ” + money + “success”,否则输出“withdraw ” + money + “failed”
- 如果字符串为“deposit”表示存入操作,完成操作后输出“deposit” + money + “success”
- 使用toString方法输出账户a信息。
- 根据用户输入的三个整数id、balance和overdraft创建支票账户b;
- 输入一个整数m,表示对账户b有m笔操作;
- 每笔操作输入一个字符串和一个整数money(表示操作金额)
- 如果字符串为“withdraw”表示取现操作,如果操作成功,输出“withdraw ” + money + “success”,否则输出“withdraw ” + money + “failed”
- 如果字符串为“deposit”表示存入操作,完成操作后输出“deposit” + money + “success”
- 使用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对象相等的条件是:
-
其继承自父类Person的属性值都相等,其company属性对象equals返回true,且其salary也相等。
-
salary是double型,比较时,使用
DecimalFormat df = new DecimalFormat("#.##");使salary保留两位小数,然后再进行比较。 -
要考虑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型,表示票号;
②方法:
- Ticket(int number), 构造方法,初始化票号;
- int getPrice(), 返回票价,抽象方法;
- String toString(),返回一个字符串,格式为“Number:票号,Price:票价”。
(2)编写Ticket类的子类WalkupTicket,表示当天票,包含以下成员
①方法:
1)WalkupTicket(int number), 构造方法,初始化票号;
2)int getPrice(), 返回票价50。
(3)编写Ticket类的子类AdvanceTicket,表示预订票,包含以下成员
①属性:
- leadTime:私有,int型,表示提前预订的天数;
②方法: - AdvanceTicket(int number,int leadTime), 构造方法,初始化票号和提前天数;
- int getPrice(), 如果提前天数>10天,票价30,否则,票价40。
(4)编写AdvanceTicket类的子类StudentAdvanceTicket,表示学生预订票,包含以下成员
①属性:
-
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类并覆盖其toString与equals方法。
###1. 新建PersonOverride类
a. 属性:String name、int age、boolean 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类
- 编写
NameComparator类,实现对name进行升序排序 - 编写
AgeComparator类,对age进行升序排序
#3.main方法中
- 输入n
- 输入n行name age,并创建n个对象放入数组
- 对数组按照name进行升序排序后输出。
- 在3的基础上对数组按照age进行升序排序后输出。
- 最后最后两行使用如下代码输出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 }

浙公网安备 33010602011771号