一、函数题

6-1 创建一个直角三角形类实现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
class RTriangle implements IShape//implements 是实现接口,可以实现多个接口,用逗号分开就行了
//比如:class A extends B implements C,D,E
//extends与implements两种实现的具体使用,是要看项目的实际情况
//需要实现,不可以修改implements
//只定义接口需要具体实现,或者可以被修改扩展性好,用extends。
{public RTriangle (double a, double b){this.a = a;this.b = b;}double a,b;public double getArea() {return 0.5*a*b;}public double getPerimeter() {return a + b + Math.sqrt(a*a+b*b);}
}

6-2 从抽象类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
class Circle extends shape
{//extends 拓展private double radius;//私有成员,本类中可用的,表面上是说只有本类中可以使用(更改)该变量或者方法。public Circle(double radius) {this.radius = radius;}public double getArea() {return Math.PI*radius*radius;}public double getPerimeter() {return 2*Math.PI*radius;}
}

6-3 模拟题: 重写父类方法equals

在类Point中重写Object类的equals方法。使Point对象x和y坐标相同时判定为同一对象。

裁判测试程序样例:


import java.util.Scanner; class Point { private int xPos, yPos; public Point(int x, int y) { xPos = x; yPos = y; } @Override /* 请在这里填写答案 */ } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Object p1 = new Point(sc.nextInt(),sc.nextInt()); Object p2 = new Point(sc.nextInt(),sc.nextInt()); System.out.println(p1.equals(p2)); sc.close(); } }

输入样例:

10 20
10 20

输出样例:

true
    public boolean equals(Object o)//Object类是所有类的父类,任何一个类如果没有明确的继承一个父类的话,那么它就是Object的子类;{//boolean 数据类型 boolean 变量存储为 8 位(1 个字节)的数值形式,但只能是 True 或是 False//equals 方法是String类从它的超类Object中继承的, 被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写Point p = (Point)o;if(this.xPos==p.xPos&&this.yPos==p.yPos){return true;}return false;}

6-4 重写父类方法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
public boolean equals(Object o)
{Student s = (Student)o;if(this.id==s.id){return true;}return false;
}

6-5 根据派生类写出基类(Java)

裁判测试程序样例中展示的是一段定义基类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.
public People(String id, String name) {//首先根据Main中的zs.setID\Name say可以得出Student类中包含这几个方法this.id = id;this.name = name;
}
public void setId(String id) {this.id = id;
}
public void setName(String name) {this.name = name;
}
public void say()
{System.out.println("I'm a person! My name is " + this.name + ".");//从最后一行输出可知
}
//又由zs.getId()与zs.getName()可知
public String getId(){return id;
}
public String getName()
{return name;
}
public People(){name = "Pintia Student";
}

6-6 写出派生类构造方法(Java)

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

函数接口定义:


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

裁判测试程序样例:

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


class People{ private String id; private String name; public People(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public String getName() { return name; } } class Student extends People{ private String sid; private int score; public Student(String id, String name, String sid, int score) { /** 你提交的代码将被嵌在这里(替换此行) **/ } public String toString(){ return ("(Name:" + this.getName() + "; id:" + this.getId() + "; sid:" + this.sid + "; score:" + this.score + ")"); } } public class Main { public static void main(String[] args) { Student zs = new Student("370202X", "Zhang San", "1052102", 96); System.out.println(zs); } }

输入样例:

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

(无)

输出样例:

(Name:Zhang San; id:370202X; sid:1052102; score:96)
super(id, name);//super调用父类构造方法
this.sid = sid;
this.score = score;

6-7 设计一个Duck类及其子类

设计一个Duck类和它的两个子类RedheadDuck和MallardDuck。裁判测试程序中的Main类会自动提交。

类的定义:

//Duck类的定义
class Duck {    }//RedheadDuck类的定义
class RedheadDuck extends Duck {  }//MallardDuck类的定义
class MallardDuck extends Duck {   }

裁判测试程序样例:

import java.util.Scanner;
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner=new Scanner(System.in);Duck rduck = new RedheadDuck();rduck.display();rduck.quack();rduck.swim();rduck.fly();    Duck gduck = new MallardDuck();gduck.display();gduck.quack();gduck.swim();gduck.fly();         }
}
/* 请在这里填写答案 */

输入样例:

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

输出样例:

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

我是一只红头鸭
我会呱呱呱
我会游泳
我会飞
我是一只绿头鸭
我会呱呱呱
我会游泳
我会飞
abstract class Duck//定义一个duck抽像类
{public void quack(){System.out.println("我会呱呱呱");}public void swim() {System.out.println("我会游泳");}public void fly() {System.out.println("我会飞");}abstract public void display();
}
class RedheadDuck extends Duck
{public void display(){System.out.println("我是一只红头鸭");}
}
class MallardDuck extends Duck
{public void display() {System.out.println("我是一只绿头鸭");}
}

6-8 八边形Octagan类(接口)

编写一个名为Octagon的类,表示八边形。假设八边形八条边的边长都相等。它的面积可以使用下面的公式计算:

     面积 = (2 + 4 / sqrt(2)) * 边长 * 边长

请实现Octagon类,其实现了Comparable<Octagon>和Cloneable接口。

1 有一个私有变量double side ,表示八边形的边长。

2 构造函数Octagon(double side),初始化side。

3 为side添加getter和setter方法。

4 double getPerimeter()方法,计算周长。

5 double getArea()方法,计算面积。

6 实现Comparable接口的方法 public int compareTo(Octagon o);

如果当前对象的边长比参数o的边长大,返回1,小则返回-1,相等返回0。

7 实现Cloneable接口的方法 protected Object clone()

编写一个测试程序,根据用户输入的浮点数作为边长,创建一个Octagon对象,然后显示它的面积和周长。使用clone方法创建一个新对象,并使用CompareTo方法比较这两个对象。

此题提交时将会附加裁判测试程序到被提交的Java程序末尾。

程序框架:

程序按以下框架进行设计后提交:
class Octagon implements Comparable<Octagon>,Cloneable{……@Overridepublic int compareTo(Octagon o){……}@Overrideprotected Object clone() {return this;}
}

裁判测试程序样例:

public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);Octagon a1 = new Octagon(input.nextDouble());System.out.printf("Area is %.2f\n", a1.getArea());System.out.println("Perimeter is " + a1.getPerimeter());Octagon a2 = (Octagon) a1.clone();System.out.println("Compare the methods " + a1.compareTo(a2));}
}
/* 请在这里填写答案 */

输入样例:

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

5

输出样例:

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

Area is 120.71
Perimeter is 40.0
Compare the methods 0
interface Comparable<Octagon>//interface定义一个接口
{int compareTo(Octagon o);
}
interface Cloneable
{Object clone();
}
class Octagon implements Comparable<Octagon>, Cloneable
//implements实现接口
{private double side;public Octagon(double side) {this.side = side;}//以下为side添加getter和setter方法public double getter() {return side;}public void setter(double side) {this.side = side;}//以下为double getPerometer与double getArea方法public double getPerimeter() {return this.getter()*8;}public double getArea() {return (2+4/Math.sqrt(2))*this.getter()*this.getter();}//实现Comparable接口的方法 public int compareTo(Octagon o);//如果当前对象的边长比参数o的边长大,返回1,小则返回-1,相等返回0。public int compareTo(Octagon o){if(this.getter() > o.getter())return 1;else if(this.getter() < o.getter())return -1;else return 0;}// 实现Cloneable接口的方法 protected Object clone()//编写一个测试程序,根据用户输入的浮点数作为边长,创建一个Octagon对象,然后显示它的面积和周长。使用clone方法创建一个新对象,并使用CompareTo方法比较这两个对象。public Object clone(){return new Octagon(side);}
}

6-9 使用继承设计:教师类。

使用继承设计:教师类。
使程序运行结果为:

Li 40 信工院
教师的工作是教学。

函数接口定义:


定义类Teacher, 继承Person

裁判测试程序样例:


class Person{ String name; int age; Person(String name,int age){ this.name = name; this.age = age; } void work(){ } void show() { System.out.print(name+" "+age+" "); } } /* 请在这里填写答案 */ public class Main { public static void main(String[] args) { Teacher t = new Teacher("Li",40,"信工院"); t.show(); t.work(); } }

输入样例:

没有输入

输出样例:

Li 40 信工院
教师的工作是教学。
class Teacher extends Person
{String p;public Teacher(String name, int age, String p) {super(name, age);this.p = p;//信工院}void work(){System.out.println("教师的工作是教学。");}void show(){super.show();System.out.println(p);}
}

6-10 设计一个Triangle类继承自GeometricObject类

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

■ 三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0。

■ 一个无参构造方法创建默认的三角形。

■ 一个能创建带制定side1、side2和side3的三角形的构造方法。

■ 所有三个数据域的访问器方法。

■ 一个名为getArea()的方法返回这个三角形的面积。

■ 一个名为getPerimeter()的方法返回这个三角形的周长。

■ 一个名为toString()的方法返回这个三角形的字符串描述。

toString()方法的实现如下所示:

return "Triangle: side1 = " + side1 + " side2 = " + side2 +" side3 = " + side3;

编写一个测试程序,提示用户输入三角形的三条边、颜色以及一个Boolean值表明该三角形是否填充。程序应该使用输入创建一个具有这些边并设置color和filled属性的三角形。程序应该显示面积、周长以及边长。

系统会自动提交Main类和GeometricObject类。

类的定义:

设计一个Triangle类继承GeometricObject。例如:
class Triangle extends GeometricObject{  }

裁判测试程序样例:

//Main测试类
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;}@Overridepublic String toString() {return "created on " + dateCreated + "\ncolor: " + color + "and filled: " + filled;}}
/* 请在这里填写答案 */

输入样例:

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

3 4 5
red
true

输出样例:

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

The area is 6.0
The perimeter is 12.0
Triangle: side1=3.0 side2=4.0 side3=5.0
class Triangle extends GeometricObject
{//三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0。double side1=1.0,side2=1.0,side3=1.0;public Triangle (double side1,double side2,double side3){this.side1=side1;this.side2=side2;this.side3=side3;}public Triangle(){}//一个无参构造方法创建默认的三角形。public Triangle(double side1,double side2,double sided3,String color,boolean filled){//一个能创建带制定side1、side2和side3的三角形的构造方法。super(color,filled);this.side1=side1;this.side2=side2;this.side3=side3;}public double getArea(){double p=(side1+side2+side3)/2.0;return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));}public double getPerimeter(){return side1 + side2 + side3;}public String toString() {return "Triangle: side1="+side1+" side2="+side2+" side3="+side3;}
}

6-11 普通账户和支票账户

编写一个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
class Account
{private int id;private int balance;public Account() {//Account(), 构造方法,id和balance都初始化为0;id=0;balance=0;}public Account(int id, int balance){this.id = id;this.balance = balance;}public int getBalance()//int getBalance():返回账户金额{return balance;}public void setBalance(int balance)//void setBalance(int balance):修改账户金额{this.balance = balance;}public boolean withdraw(int money)//boolean withdraw(int money):从账户提取特定数额,如果余额不足,返回false;否则,修改余额,返回true{if(balance < money){return false;}else{balance = balance - money;return true;}}void deposit(int money)//向账户存储特定数额。{this.balance += money;}public String toString() {return "The balance of account "+id+" is "+this.balance;}
}
class CheckingAccount extends Account
{private int overdraft;public CheckingAccount(int id, int balance, int overdraft){super(id, balance);this.overdraft = overdraft;}public boolean withdraw(int money){if(money > (overdraft + this.getBalance())){return false;}else{this.setBalance(this.getBalance() - money);//可以看一下this.setBalance那个方法return true;}}
}

6-12 设计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
class Worker
{String name;double rate;public Worker(String name, double rate){this.name = name;this.rate = rate;}public String getName(){return name;}public void setName(){}public double getRate(){return rate;}public void setRate(double rate){//w3.setRate(35);   this.rate = rate;}public void pay(int hour){System.out.println("Not Implemented");}//w1.pay(35);由这句输出可得,父类中pay输出Not Implemented
}
class SalariedWorker extends Worker
{public SalariedWorker(String name, double rate) {super(name, rate);}public void pay(int hour)//w2.pay(60);{pay();}public void pay()//w2.pay();{System.out.println(40.0*rate);}
}
class HourlyWorker extends Worker
{public HourlyWorker(String name, double rate){super(name, rate);}public void pay(int hour){if(hour > 40){System.out.println(rate * 40 + (hour - 40) * 2 * rate);}elseSystem.out.println(hour * rate);}
}

6-13 图书和音像租赁

图书和音像店提供出租服务,包括图书和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
class Media
{String name;public double getDailyRent()//提供方法getDailyRent()返回日租金{return 0.0;}
}
class MediaShop
{public static double calculateRent(Media[] medias, int days)//构造音像店类MediaShop,提供静态函数double calculateRent(Media[] medias, int days)。{double sum = 0;for(int i = 0; i < medias.length; i ++){sum += medias[i].getDailyRent()*days;}return sum;}
}
class Book extends Media//构造图书类的继承体系
{double price;public Book(String name, double price){this.price = price;this.name=name;}public double getDailyRent(){return 0.01 * price;//图书的日租金为图书价格的1%}
}
class DVD extends Media//构造DVD类的继承体系
{public DVD(String name){this.name=name;}public double getDailyRent(){return 1;//DVD的日租金为固定的1元}
}

二、编程题

7-1 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承)

计算如下立体图形的表面积和体积。

从图中观察,可抽取长方体和四棱锥两种立体图形的共同属性到父类Rect中:长度:l 宽度:h 高度:z。

编程要求:

(1)在父类Rect中,定义求底面周长的方法length( )和底面积的方法area( )。

(2)定义父类Rect的子类立方体类Cubic,计算立方体的表面积和体积。其中表面积area( )重写父类的方法。

(3)定义父类Rect的子类四棱锥类Pyramid,计算四棱锥的表面积和体积。其中表面积area( )重写父类的方法。

(4)在主程序中,输入立体图形的长(l)、宽(h)、高(z)数据,分别输出长方体的表面积、体积、四棱锥的表面积和体积。

提示:

(1)四棱锥体积公式:V=31​Sh,S——底面积 h——高

(2)在Java中,利用Math.sqrt(a)方法可以求得a的平方根(方法的参数及返回结果均为double数据类型)

(3)在Python中,利用math模块的sqrt(a)方法,求得a的平方根。

输入格式:

输入多行数值型数据(double);

每行三个数值,分别表示l、h、z,数值之间用空格分隔。

若输入数据中有0或负数,则不表示任何图形,表面积和体积均为0。

输出格式:

行数与输入相对应,数值为长方体表面积 长方体体积 四棱锥表面积 四棱锥体积(中间有一个空格作为间隔,数值保留两位小数)。

输入样例:

1 2 3
0 2 3
-1 2 3
3 4 5

输出样例:

22.00 6.00 11.25 2.00
0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00
94.00 60.00 49.04 20.00
import java.util.Scanner;
import java.text.DecimalFormat;
abstract class Rect{//构造一个抽象类double l;//长度double h;//宽度double z;//高度Rect(double l, double h, double z){//构造函数,并初始化this.l = l;this.h = h;this.z = z;if(l <= 0 || h <= 0 || z <= 0){//若其中一个为0,其余都为0this.h = this.l = this.z = 0;}}public double length(){return 0.0;}//周长public double area(){return 0.0;}//底面面积
}
class Cubic extends Rect{//定义父类Rect的子类立方体类CubicCubic(double l, double h, double z){super(l, h, z);//使用super调用父类的构造方法}public double area() {//求立方体的表面积return 2 * (l * h + h * z + l * z);}public double V(){//求立方体的体积return l * h * z;}
}
class Pyramid extends Rect{//定义父类Rect的子类四棱锥类PyramidPyramid(double l, double h, double z){super(l, h, z);//使用super调用父类的构造方法}public double area() {//求四棱锥的表面积return l * h + (h * Math.sqrt((l / 2) * (l / 2) + z * z)) +  (l * Math.sqrt((h / 2) * (h / 2) + z * z));}public double V(){//求四棱锥的体积return l * h * z / 3;}
}
public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);DecimalFormat e=new DecimalFormat("#0.00");//保留两位小数操作while(in.hasNext()) {double l = in.nextDouble();double h = in.nextDouble();double z = in.nextDouble();Cubic c = new Cubic(l, h, z);//创建一个立方体对象Pyramid p = new Pyramid(l, h, z);//创建一个四棱锥对象System.out.println(e.format(c.area())+" "+e.format(c.V())+" "+e.format(p.area())+" "+e.format(p.V()));}}
}

7-2 sdut-oop-6 计算各种图形的周长(多态)

定义接口或类 Shape,定义求周长的方法length()。

定义如下类,实现接口Shape或父类Shape的方法。

(1)三角形类Triangle (2)长方形类Rectangle (3)圆形类Circle等。

定义测试类ShapeTest,用Shape接口(或类)定义变量shape,用其指向不同类形的对象,输出各种图形的周长。并为其他的Shape接口实现类提供良好的扩展性。

提示: 计算圆周长时PI取3.14。

输入格式:

输入多组数值型数据(double);

一行中若有1个数,表示圆的半径;

一行中若有2个数(中间用空格间隔),表示长方形的长度、宽度。

一行中若有3个数(中间用空格间隔),表示三角形的三边的长度。(需要判断三个边长是否能构成三角形)

若输入数据中有0或负数,则不表示任何图形,周长为0。

输出格式:

行数与输入相对应,数值为根据每行输入数据求得的图形的周长。

输入样例:

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

1
2 3
4 5 6
2
-2
-2 -3

输出样例:

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

6.28
10.00
15.00
12.56
0.00
0.00
import java.util.*;
import java.lang.*;
interface Shape{//定义接口public abstract double length();
}
class Circle implements Shape{//Circle实现接口Shapedouble r;public Circle(double r){this.r = r;if(r <= 0) this.r = 0;}public double length(){return 2 * 3.14 * r;}
}
class Rectangle implements Shape{double a, b;public Rectangle(double a, double b){this.a = a;this.b = b;if(a <= 0 || b <= 0){this.a = this.b = 0;}}public double length() {return 2 * (a + b);}
}
class Triangle implements Shape{double a;double b;double c;public Triangle(double a, double b, double c){this.a = a;this.b = b;this.c = c;if(a <= 0 || b <= 0 || c <= 0 || !(a + b > c && a + c > b && b + c >a)){this.a = this.b = this.c = 0;}}public double length() {return a + b + c;}
}
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while(in.hasNextInt()) {double[] l = new double[5];String s;s = in.nextLine();String[] str = s.split(" ");//split就是你传递的参数是啥,我就以它为分隔符(此处是以空格为分隔符),分割你的字符串int cnt = 0;int i;for (i=0;i<str.length;i++) {l[cnt++] = Double.parseDouble(str[i]);}if(cnt == 1){Circle C = new Circle(l[0]);System.out.printf("%.2f\n", C.length());}else if (cnt == 2){Rectangle r = new Rectangle(l[0], l[1]);System.out.printf("%.2f\n", r.length());}else{Triangle t = new Triangle(l[0], l[1], l[2]);System.out.printf("%.2f\n", t.length());}}}
}

7-3 jmu-Java-04面向对象进阶--02-接口-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
//最后两行是标识信息
import java.util.*;
class PersonSortable2{public String name;public int age;public PersonSortable2(String name,int age){this.name = name;this.age = age;}public String toString(){return name+"-"+age;}
}
class NameComparator implements Comparator<PersonSortable2>{//实现类,接口Comparatorpublic int compare(PersonSortable2 o1,PersonSortable2 o2){if(o1.name.compareTo(o2.name)>0) return 1;//compareTo是判断两字符串,例如a,c会=2;else if(o1.name.compareTo(o2.name)<0) return -1;//上述操作,若=1,则证明是升序,若=-1则证明是降序,需要调整;else return o1.name.compareTo(o2.name);}
}
class AgeComparator implements Comparator<PersonSortable2>{//实现类public int compare(PersonSortable2 o1,PersonSortable2 o2){if(o1.age<o2.age) return -1;//age好理解,就不说了else return 1;}
}
public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();PersonSortable2 s[] = new PersonSortable2[n];for(int i=0;i<n;i++){String name = in.next();int age = in.nextInt();s[i] = new PersonSortable2(name,age);}Arrays.sort(s,new NameComparator());//对一个数组的所有元素进行排序,并且是按从小到大的顺序。System.out.println("NameComparator:sort");for(PersonSortable2 i:s){System.out.println(i);}Arrays.sort(s,new AgeComparator());System.out.println("AgeComparator:sort");for(PersonSortable2 i:s){System.out.println(i.toString());}System.out.println(Arrays.toString(NameComparator.class.getInterfaces()));//它能够获得这个System.out.println(Arrays.toString(AgeComparator.class.getInterfaces()));}
}

7-4 USB接口的定义

定义一个USB接口,并通过Mouse和U盘类实现它,具体要求是:

1.接口名字为USB,里面包括两个抽象方法:

void work();描述可以工作

void stop(); 描述停止工作

2.完成类Mouse,实现接口USB,实现两个方法:

work方法输出“我点点点”;

stop方法输出 “我不能点了”;

3.完成类UPan,实现接口USB,实现两个方法:

work方法输出“我存存存”;

stop方法输出 “我走了”;

4测试类Main中,main方法中

定义接口变量usb1 ,存放鼠标对象,然后调用work和stop方法

定义接口数组usbs,包含两个元素,第0个元素存放一个Upan对象,第1个元素存放Mouse对象,循环数组,对每一个元素都调用work和stop方法。

输入格式:

输出格式:

输出方法调用的结果

输入样例:

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


输出样例:

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

我点点点
我不能点了
我存存存
我走了
我点点点
我不能点了
interface USB{abstract public void work();abstract public void stop();
}
class Mouse implements USB{public void work(){System.out.println("我点点点");}public void stop(){System.out.println("我不能点了");}
}
class UPan implements USB{public void work(){System.out.println("我存存存");}public void stop(){System.out.println("我走了");}
}
public class Main{public static void main(String[] args){Mouse usb1=new Mouse();usb1.work();usb1.stop();USB usbs[]=new USB[2];usbs[0]=new UPan();//第0个元素存放一个Upan对象usbs[1]=new Mouse();//第1个元素存放Mouse对象usbs[0].work();usbs[0].stop();usbs[1].work();usbs[1].stop();}
}

7-5 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习)

各位面向对象的小伙伴们,在学习了面向对象的核心概念——类的封装、继承、多态之后,答答租车系统开始营运了。

请你充分利用面向对象思想,为公司解决智能租车问题,根据客户选定的车型和租车天数,来计算租车费用,最大载客人数,最大载载重量。

公司现有三种车型(客车、皮卡车、货车),每种车都有名称和租金的属性;其中:客车只能载人,货车只能载货,皮卡车是客货两用车,即可以载人,也可以载货。

下面是答答租车公司的可用车型、容量及价目表:

要求:根据客户输入的所租车型的序号及天数,计算所能乘载的总人数、货物总数量及租车费用总金额。

输入格式:

首行是一个整数:代表要不要租车 1——要租车(程序继续),0——不租车(程序结束);

第二行是一个整数,代表要租车的数量N;

接下来是N行数据,每行2个整数m和n,其中:m表示要租车的编号,n表示租用该车型的天数。

输出格式:

若成功租车,则输出一行数据,数据间有一个空格,含义为:
载客总人数 载货总重量(保留2位小数) 租车金额(整数)
若不租车,则输出:
0 0.00 0(含义同上)

输入样例:

1
2
1 1
2 2

输出样例:

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

15 0.00 1600
import java.util.Scanner;
class Car
{int num;//是否租车String model;//车型int person;//载人double ton;//载货int money;//租金public Car(int num, String model, int person, double ton, int money){this.num = num;this.model = model;this.person = person;this.ton = ton;this.money = money;}
}
public class Main {public static void main(String[] args){Scanner in = new Scanner(System.in);Car[] car = new Car[11];car[1] = new Car(1, "A", 5, 0, 800);car[2] = new Car(2, "B", 5, 0, 400);car[3] = new Car(3, "C", 5, 0, 800);car[4] = new Car(4, "D", 51, 0, 1300);car[5] = new Car(5, "E", 55, 0, 1500);car[6] = new Car(6, "F", 5, 0.45, 500);car[7] = new Car(7, "G", 5, 2.0, 450);car[8] = new Car(8, "H", 0, 3, 200);car[9] = new Car(9, "I", 0, 25, 1500);car[10] = new Car(10, "J", 0, 35, 2000);int n = in.nextInt();if(n == 1)//说明要租车{int sumPer = 0, sumMon = 0;//载客总人数,租车总天数double sumTon = 0;//载货总吨数int m = in.nextInt();for(int i = 0; i < m; i ++){int a = in.nextInt();int b = in.nextInt();sumPer += (car[a].person * b);sumTon += (car[a].ton * b);sumMon += (car[a].money * b);}System.out.println(sumPer + " " + String.format("%.2f", sumTon) + " " + sumMon);}if(n == 0)System.out.println("0 0.00 0");}
}

7-6 jmu-Java-03面向对象基础-04-形状-继承

前言

前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。

本题描述

1.定义抽象类Shape
属性:不可变静态常量double PI,值为3.14
抽象方法:public double getPerimeter(),public double getArea()

2.RectangleCircle类均继承自Shape类。
Rectangle类(属性:int width,length)、Circle类(属性:int radius)。
带参构造方法为Rectangle(int width,int length),Circle(int radius)
toString方法(Eclipse自动生成)

3.编写double sumAllArea方法计算并返回传入的形状数组中所有对象的面积和
double sumAllPerimeter方法计算并返回传入的形状数组中所有对象的周长和

4.main方法
4.1 输入整型值n,然后建立n个不同的形状。如果输入rect,则依次输入宽、长。如果输入cir,则输入半径。
4.2 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。 提示:使用Arrays.toString
4.3 最后输出每个形状的类型与父类型.使用类似shape.getClass() //获得类型, shape.getClass().getSuperclass() //获得父类型;

注意:处理输入的时候使用混合使用nextIntnextLine需注意行尾回车换行问题。

思考

  1. 你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适?
  2. 是否应该声明为static?

输入样例:

4
rect
3 1
rect
1 5
cir
1
cir
2

输出样例:

38.84
23.700000000000003
[Rectangle [width=3, length=1], Rectangle [width=1, length=5], Circle [radius=1], Circle [radius=2]]
class Rectangle,class Shape
class Rectangle,class Shape
class Circle,class Shape
class Circle,class Shape
import java.util.*;
abstract class Shape{static final double PI = 3.14;public abstract double getPerimeter();public abstract double getArea();
}
class Rectangle extends Shape{int width;int length;public Rectangle(int width,int length) {this.width = width;this.length = length;}public double getPerimeter() {return 2*(this.width+this.length);}public double getArea() {return this.width*this.length;}public String toString() {return "Rectangle [width=" + width + ", length=" + length + "]";}
}
class Circle extends Shape{int radius;public Circle(int radius) {this.radius = radius;}public double getPerimeter() {return PI*this.radius*2;}public double getArea() {return PI*this.radius*this.radius;}public String toString() {return "Circle [radius=" + radius + "]";}
}
public class Main{public static void main(String [] args){Scanner in=new Scanner(System.in);int n = in.nextInt();in.nextLine();Shape [] shapes = new Shape[n];for(int i=0;i<n;i++){String shape = in.nextLine();if(shape.equals("rect")) {int width = in.nextInt();int length = in.nextInt();in.nextLine();shapes[i] = new Rectangle(width, length);}else {int radius = in.nextInt();in.nextLine();shapes[i] = new Circle(radius);}}System.out.println(sumAllPerimeter(shapes));System.out.println(sumAllArea(shapes));System.out.println(Arrays.toString(shapes));for(Shape s:shapes) {System.out.println(s.getClass()+","+s.getClass().getSuperclass());}}public static double sumAllArea(Shape[] shapes) {double sum = 0;for(Shape s:shapes) {sum+=s.getArea();}return sum;}public static double sumAllPerimeter(Shape[] shapes) {double sum = 0;for(Shape s:shapes) {sum+=s.getPerimeter();}return sum;}
}

7-7 jmu-Java-03面向对象基础-05-覆盖

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)]
import java.util.*;
class PersonOverride{String name;int age;boolean gender;public PersonOverride() {this("default", 1, true);}public PersonOverride(String name,int age,boolean gender) {this.name = name;this.age = age;this.gender = gender;}public String toString() {return this.name+"-"+this.age+"-"+this.gender;}public boolean equals(Object o) {if (this == o){return true;}if(o == null){return false;}if (this.getClass() != o.getClass()){return false;}PersonOverride p = (PersonOverride) o;return Objects.equals((this.name), p.name) && this.gender == p.gender && this.age==p.age;}
}
public class Main{public static void main(String [] args){Scanner in=new Scanner(System.in);int n1 = in.nextInt();in.nextLine();PersonOverride[] persons1 = new PersonOverride[n1];for(int i=0;i<n1;i++) {persons1[i] = new PersonOverride();}int n2 = in.nextInt();in.nextLine();PersonOverride[] persons2 = new PersonOverride[n2];int len2=0;for(int i=0;i<n2;i++) {String name = in.next();int age = in.nextInt();boolean gender = in.nextBoolean();in.nextLine();PersonOverride p = new PersonOverride(name,age,gender);boolean flag = true;for(int j=0;j<len2;j++) {if(persons2[j].equals(p)) {flag = false;break;}}if(flag) {persons2[len2] = p;len2++;}}for(PersonOverride p:persons1) {System.out.println(p);}for(int i=0;i<len2;i++) {System.out.println(persons2[i]);}System.out.println(len2);System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));}
}

7-8 设计圆和圆柱体

编写一个完整的Java Application 程序。包含类Circle、Cylinder、Main,具体要求如下。

(1)编写类Circle,表示圆形对象,包含以下成员
①属性:
1)  radius:私有,double型,圆形半径;
②方法:
1)  Circle(double radius), 构造方法,用参数设置圆的半径
2)  Circle(),构造方法,将圆形初始化为半径为0。
3)  void setRadius(double r):用参数r设置radius的值
4)  double getRadius():返回radius的值
5)  double getArea(),返回圆形的面积
6)  double getPerimeter(),返回圆形的周长
7)  public String toString( ),将把当前圆对象的转换成字符串形式,例如圆半径为10.0,返回字符串"Circle(r:10.0)"。
(2)编写一个类Cylinder,表示圆柱形对象,包含以下成员
①属性:
1)  height:私有,double型,圆柱体高度;
2)  circle:私有,Circle类型,圆柱体底面的圆形;
②方法:
1)  Cylinder(double height,Circle circle), 构造方法,用参数设置圆柱体的高度和底面的圆形
2)  Cylinder(),构造方法,将圆柱体的高度初始化为0,底面圆形初始化为一个半径为0的圆形。
3)  void setHeight(double height):用参数height设置圆柱体的高度
4)  double getHeight():返回圆柱体的高度
5)  void setCircle(Circle circle):用参数circle设置圆柱体底面的圆形
6)  Circle getCircle():返回圆柱体底面的圆形
7)  double getArea(),重写Circle类中的area方法,返回圆柱体的表面积
8)  double getVolume(),返回圆柱体的体积
9)  public String toString( ),将把当前圆柱体对象的转换成字符串形式,例如半径为10.0,高为5.0,返回字符串"Cylinder(h:5.0,Circle(r:10.0))"。
(3)编写公共类Main,在main()方法中实现如下功能
输入一个整数n,表示有n个几何图形。
对于每一个几何图形,先输入一个字符串,“Circle”表示圆形,“Cylinder”表示圆柱体。
如果是圆形,输入一个浮点数表示其半径。要求计算其面积和周长并输出。
如果是圆柱体,输入两个浮点数分别表示其半径和高度。要求计算其面积和体积并输出。将以下代码附在自己的代码后面:public class Main{public static void main(String args[]) {Scanner input = new Scanner(System.in);int n = input.nextInt();for(int i = 0; i < n; i++) {String str = input.next();if(str.equals("Circle")) {Circle c = new Circle(input.nextDouble());System.out.println("The area of " + c.toString() + " is " + String.format("%.2f",c.getArea()));System.out.println("The perimeterof " + c.toString() + " is "+ String.format("%.2f",c.getPerimeter()));} else if(str.equals("Cylinder")) {Cylinder r = new Cylinder(input.nextDouble(), new Circle(input.nextDouble()));System.out.println("The area of " + r.toString() + " is " + String.format("%.2f",r.getArea()));System.out.println("The volume of " + r.toString() + " is " + String.format("%.2f",r.getVolume()));}}}
}

输入格式:

第一行输入一个整数n,表示有n个几何图形。
以下有n行,每行输入一个几何图形的数据。
每行先输入一个字符串表示几何图形的类型,“Circle”表示圆形,“Cylinder”表示圆柱体。
如果是圆形,输入一个浮点数表示其半径。
如果是圆柱体,输入两个浮点数分别表示其半径和高度。

输出格式:

如果是圆形,要求计算其面积和周长并输出。
如果是圆柱体,要求计算其面积和体积并输出。
注意,圆周率用Math.PI

输入样例:

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

4
Circle 10.0
Cylinder 10.0 10.0
Circle 1.1
Cylinder 1.1 3.4

输出样例:

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

The area of Circle(r:10.0) is 314.16
The perimeterof Circle(r:10.0) is 62.83
The area of Cylinder(h:10.0,Circle(r:10.0)) is 1256.64
The volume of Cylinder(h:10.0,Circle(r:10.0)) is 3141.59
The area of Circle(r:1.1) is 3.80
The perimeterof Circle(r:1.1) is 6.91
The area of Cylinder(h:1.1,Circle(r:3.4)) is 96.13
The volume of Cylinder(h:1.1,Circle(r:3.4)) is 39.95
import java.util.Scanner;
class Circle{double radius;public Circle(double radius){this.radius = radius;}public Circle(){radius = 0;}public void setRadius(double r){radius = r;}public double getRadius(){return this.radius;}public double getArea(){return Math.PI * radius * radius;}public double getPerimeter(){return 2 * Math.PI * radius;}public String toString(){return "Circle(r:" + radius + ")";}
}
class Cylinder{double height;Circle circle;public Cylinder(double height, Circle circle){this.height = height;this.circle = circle;}public Cylinder(){height = 0;circle = new Circle(0);}public void setHeight(double height){this.height = height;}public double getHeight(){return height;}public void setCircle(Circle circle){this.circle = circle;}public Circle getCircle(){return circle;}public double getArea(){return 2 * Math.PI * circle.getRadius() * circle.getRadius() + 2 * Math.PI * circle.getRadius() * height;}public double getVolume(){return Math.PI * circle.getRadius() * circle.getRadius() * height;}public String toString(){return "Cylinder(h:" + height + "," + circle.toString() + ")";}
}
public class Main{public static void main(String args[]) {Scanner input = new Scanner(System.in);int n = input.nextInt();for(int i = 0; i < n; i++) {String str = input.next();if(str.equals("Circle")) {Circle c = new Circle(input.nextDouble());System.out.println("The area of " + c.toString() + " is " + String.format("%.2f",c.getArea()));System.out.println("The perimeterof " + c.toString() + " is "+ String.format("%.2f",c.getPerimeter()));} else if(str.equals("Cylinder")) {Cylinder r = new Cylinder(input.nextDouble(), new Circle(input.nextDouble()));System.out.println("The area of " + r.toString() + " is " + String.format("%.2f",r.getArea()));System.out.println("The volume of " + r.toString() + " is " + String.format("%.2f",r.getVolume()));}}}
}

PTA 2021级-JAVA06 继承和多态、抽象类和接口相关推荐

  1. 2021级-JAVA06 继承和多态、抽象类和接口

    6-1 创建一个直角三角形类实现IShape接口 class RTriangle implements IShape {double a, b;public RTriangle (double a, ...

  2. 第10章 接口、继承与多态----抽象类和接口

    一.抽象类 在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理.回想继承和多态原理,继承树中越是在上方的类越抽象,如:鸽子类继承鸟类.鸟类继承动物类等.在多态机制中,并不需要 ...

  3. 9继承进阶_抽象类_接口

    9继承进阶_抽象类_接口 导语: 想到在写 子父类中成员变量的特点 子父类中成员函数的特点.★★★★★ 子父类中构造函数的特点.★★★★★ final关键字的使用,重点在于常量的定义 抽象类的由来,犬 ...

  4. 初始Java Java SE 包,继承,组合,多态,抽象类,接口

    目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...

  5. JAVA 继承基本类、抽象类、接口

    Java是一个面向对象的语言,java面向对象一般有三大特征:封装.继承.多态. 封装:就是把一些属性和方法封装到一个类里. 继承:就如子类继承父类的一些属性和方法. 多态:就如一个父类有多个不同特色 ...

  6. Java继承和多态--笔记本USB接口案例

    首先我们创建一个接口要求有打开和关闭两种方法. public interface USB {void open();// 打开设备void close();// 关闭设备 } 再创建一个笔记本类包括开 ...

  7. 继承 多态 抽象类 接口

    面向对象编程 包 继承 组合 多态 抽象类 接口 包 包(package)是组织类的一种方式. 使用包的主要目的是保证类的唯一性. java中已经提供给我们很多现成的类供我们选择,例如可以使用 imp ...

  8. Java基础:继承、多态、抽象、接口

    第一讲    继承 一.继承概述 1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 2.通过extends关键字可以实现类与类的 ...

  9. java虚成员函数_Java常见知识点汇总(④)——虚函数、抽象函数、抽象类、接口...

    一. Java虚函数 虚函数的存在是为了多态. 它虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的. ...

最新文章

  1. MySQL数据单个数据太大,导入不进去
  2. 二叉树的前序,中序,后序,层序遍历的递归和非递归实现
  3. python爬虫脚本ie=utf-8_python脚本-共享文件爬虫
  4. mysql 定时脚本_MySQL定时执行脚本(计划任务)命令实例
  5. 字符数组和字符串的小细节
  6. 接私活被公司开除。。
  7. 百度关键词抓取工具_阿里巴巴国际站运营关键词抓取工具
  8. Python调用seek(pos,mode)方法报错Can‘t do nonzero cur-relative seeks
  9. java 判断数字_如何在java中判断一个字符串是否是数字
  10. SSH框架调用scrapy爬虫
  11. 2019年下半年教师资格中学《综合素质》真题与参考答案
  12. 强化学习学习总结(二)——QLearning算法更新和思维决策
  13. 高德城市编码json_sql_excel 三级联动json合集
  14. linux不识别指纹仪,ubuntu t43指纹仪安装
  15. Photoshop 7.0使用教程
  16. mvp的全称_打游戏抢了这么久的MVP,你竟不知道MVP的全称和由来?
  17. Idea使用系统应用打开md文件
  18. 算法:一个长字符串中含多个连续和不连续的空格,求不含空格的最长字符串长度
  19. Java基础案例 | 第二弹(持续更新...xdm冲啊)
  20. java枚举类Enum入门理解

热门文章

  1. 告别传统开店模式,借鉴餐饮理发店经营思路,谁都可以当甩手掌柜
  2. Ubuntu20.04安装ROS2(Foxy)极简教程
  3. 自己设定Macbook风扇转速,让苹果不再发烫的秘笈
  4. [下载]视频转换工具超级解霸Total Video Converter破解版
  5. AVAST 8.0网络版 提示我是盗版用户,为何还能升级更新?
  6. 个人制作网站全过程分享
  7. 二、Kubernetes安装
  8. 移动端布料的模拟 -基于DynamicBone的实现
  9. unity 运行包无法连接SteamVR问题
  10. 用HTML、CSS写一个酷炫的动态搜索框