**
7-5 图形继承与多态 (50 分)
**
掌握类的继承、多态性及其使用方法。具体需求参见作业指导书。
2021-OO第06次作业-5指导书V1.0.pdf
解题报告
1.深入理解继承与多态的原理及用法
2.ArrayList常用方法及和数组的关系
3.泛型的应用
4.Arrays及Collections的简单应用
** 必须使用面向对象的封装性、继承性及多态性解题,否则一律判定为0分。**
输入格式:
从键盘首先输入三个整型值(例如a b c),分别代表想要创建的Circle、Rectangle及Triangle对象的数量,然后根据图形数量继续输入各对象的属性值(均为实型数),数与数之间可以用一个或多个空格或回车分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边关系),则输出Wrong Format。
如果输入合法,则正常输出,输出内容如下(输出格式见输入输出示例):
各个图形的面积;
所有图形的面积总和;
排序后的各个图形面积;
再次所有图形的面积总和。
输入样例1:
1 1 1 2.3 3.2 3.2 6.5 3.2 4.2
输出样例1:
Original area:
16.62 10.24 5.68
Sum of area:32.54
Sorted area:
5.68 10.24 16.62
Sum of area:32.54
输入样例2:
0 2 2 2.3 2.5 56.4 86.5 64.3 85.6 74.6544 3.2 6.1 4.5
输出样例2:
Original area:
5.75 4878.60 2325.19 7.00
Sum of area:7216.54
Sorted area:
5.75 7.00 2325.19 4878.60
Sum of area:7216.54
输入样例3:
0 0 1 3 3 6
输出样例3:
Wrong Format
import java.util.Scanner;
import java.util.Arrays;
//Shape类
abstract class Shape{
public abstract double Mj();
}
//Circle类
class Circle extends Shape{
private double r;
public Circle(double r){
super();
this.r=r;
}
//getter
public double getR(){
return r;
}
//setter
public void setR(double r){
this.r = r;
}
public double Mj(){//计算圆面积
return Math.PI*r*r;
}
}
//Rectangle类
class Rectangle extends Shape{
private double a,b;
public Rectangle(double a, double b){
super();
this.a=a;
this.b=b;
}
//getter
public double A(){
return a;
}
public double B(){
return b;
}
//setter
public void setA(double a){
this.a=a;
}
public void setB(double b){
this.b=b;
}
public double Mj(){//计算矩形面积
return a*b;
}
}
//Triangle类
class Triangle extends Shape{
private double a;
private double b;
private double c;
public Triangle(double a, double b, double c){
this.a = a;
this.b = b;
this.c = c;
}
//getter
public double A(){
return a;
}
public double B(){
return b;
}
public double C(){
return c;
}
//setter
public void setA(double a){
this.a=a;
}
public void setB(double b){
this.b=b;
}
public void setC(double c){
this.c=c;
}
public double Mj(){//计算三角形面积
double s1,s2;
s1=(a+b+c)/2;
s2=Math.sqrt(s1*(s1-a)*(s1-b)*(s1-c));
return s2;
}
}
//主类
public class Main{
public static void main(String[] args){
Scanner x = new Scanner(System.in);
int q,w,e,gs=0,h;//个数
q=x.nextInt();w=x.nextInt();e=x.nextInt();
if(q<0||w<0||e<0){//如果不合法
System.out.println("Wrong Format");
System.exit(0);
}
h=q+w+e;
double[] he=new double [q+w+e];
double zh=0;
int i,flag=0;
Shape []c=new Circle[q];
Shape []r=new Rectangle[w];
Shape []t=new Triangle[e];
for(i=0;i<q;i++){//三角形
double bj;
bj=x.nextDouble();//输入半径
if(bj<=0){//判断是否合法
flag=1;
}
c[i]=new Circle(bj);//把半径传入Circle类
zh=zh+c[i].Mj();//计算总面积
he[gs]=c[i].Mj();//把面积传入数组he
gs++;
}
for(i=0;i<w;i++){//矩形
double db;
double cb;
db=x.nextDouble();cb=x.nextDouble();//输入边长
if(db<0||cb<0){//判断是否合法
flag=1;
}
r[i]=new Rectangle(db,cb);//把边长传入Rectangle类
zh=zh+r[i].Mj();//计算总面积
he[gs]=r[i].Mj();//把面积传入数组he
gs++;
}
for(i=0;i<e;i++){//三角形
double a;
double b;
double d;
double[] three=new double[3];
three[0]=x.nextDouble();three[1]=x.nextDouble();three[2]=x.nextDouble();//输入边长
Arrays.sort(three);//三边从小到大排序
a=three[0];b=three[1];d=three[2];
if(a<0||b<0||d<0||a+b<=d){//判断是否合法
flag=1;
}
t[i]=new Triangle(a,b,d);//把边长传入Triangle类
zh=zh+t[i].Mj();//计算总面积
he[gs]=t[i].Mj();//把面积传入数组he
gs++;
}
if(flag==1){//如果输入的不合法
System.out.println("Wrong Format");
System.exit(0);
}
System.out.println("Original area:");
for (i=0;i<h;i++){
System.out.printf("%.2f ",he[i]);
}
System.out.printf("\nSum of area:%.2f\n",zh);
System.out.println("Sorted area:");
Arrays.sort(he);
for(i=0;i<h;i++){
System.out.printf("%.2f ",he[i]);
}
System.out.printf("\nSum of area:%.2f",zh);
}
}