掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书2020-OO第07次作业-1指导书V1.0.pdf
输入格式:
-
首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:
1 3 4 2 1 3 4 2 1 3 0
-
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
-
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
-
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
- 排序前的各图形类型及面积,格式为
图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n
,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格; - 排序后的各图形类型及面积,格式同排序前的输出;
- 有图形的面积总和,格式为
Sum of area:总面积值
。
输入样例1:
在这里给出一组输入。例如:
1 5 3 2 0
输出样例1:
在这里给出相应的输出。例如:
Wrong Format
输入样例2:
在这里给出一组输入。例如:
4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5
输出样例2:
在这里给出相应的输出。例如:
The original list:
Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02
The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14
Sum of area:106.91
import java.util.Scanner;
import java.util.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
ArrayList<Integer> w=new ArrayList<>();
ArrayList<Card> k=new ArrayList<Card>();
int i=0,cnt=0;
int n=input.nextInt();
while (n != 0)
{
if (n < 0 || n > 4)
{
System.out.println("Wrong Format");
cnt = 1;
break;
}
w.add(n);
n = input.nextInt();
}
if(cnt==0)
{
for (i=0;i<w.size();i++)
{
if(w.get(i)==1)
{
double r=input.nextDouble();
Circle circle=new Circle(r);
Shape shape=circle;
Card card=new Card(shape);
card.getShape().setShapeName("Circle");
k.add(card);
}
else
if(w.get(i)==2)
{
double width=input.nextDouble();
double length=input.nextDouble();
Rectangle rectangle=new Rectangle(width,length);
Shape shape=rectangle;
Card card=new Card(shape);
card.getShape().setShapeName("Rectangle");
k.add(card);
}
else
if(w.get(i)==3)
{
if(sence())
{
double x = input.nextDouble();
double y = input.nextDouble();
double z = input.nextDouble();
Triangle triangle = new Triangle(x, y, z);
Shape shape = triangle;
Card card = new Card(shape);
card.getShape().setShapeName("Triangle");
k.add(card);
}
}
else
if(w.get(i)==4)
{
if(sence())
{
double x = input.nextDouble();
double y = input.nextDouble();
double z = input.nextDouble();
Trapezoid trapezoid = new Trapezoid(x, y, z);
Shape shape = trapezoid;
Card card = new Card(shape);
card.getShape().setShapeName("Trapezoid");
k.add(card);
}
}
}
double sum=0;
int j=0;
if(check(k))
{
System.out.println("The original list:");
for (i=0;i<k.size();i++)
{
System.out.print(k.get(i).getShape().getShapeName()+":"+String.format("%.2f",k.get(i).getShape().getArea())+" ");
sum+=k.get(i).getShape().getArea();
}
System.out.println("\nThe sorted list:");
k.sort(Collections.reverseOrder());//运用compareTo降序
for (i=0;i<k.size();i++)
{
System.out.print(k.get(i).getShape().getShapeName()+":"+String.format("%.2f",k.get(i).getShape().getArea())+" ");
}
System.out.println("\nSum of area:"+String.format("%.2f",sum));
}
else
{
System.out.println("Wrong Format");
}
}
}
public static boolean check(ArrayList<Card> k)
{
int i=0;
for (i=0;i<k.size();i++)
{
if(!k.get(i).getShape().validate())
return false;
}
return true;
}
}
abstract class Shape{
Shape(){
}
String shapeName;
Shape(String shapeName)
{
this.shapeName=shapeName;
}
@Override
public String toString() {
return "Shape{" +
"shapeName='" + shapeName + '\'' +
'}';
}
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public String getShapeName() {
return shapeName;
}
abstract public double getArea();
abstract public boolean validate();
}
class Card implements Comparable<Card>{
Card(){
}
Shape shape;
Card(Shape shape)
{
this.shape=shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Shape getShape() {
return shape;
}
@Override
public int compareTo(Card o) {
if(this.getShape().getArea()>=o.getShape().getArea())
{
return 1;
}
else
return -1;
}
}
class Rectangle extends Shape{
Rectangle(){
}
double width;
double length;
Rectangle(double width,double length)
{
this.width=width;
this.length=length;
}
@Override
public boolean validate(){
if(width>0&&length>0)
return true;
else
return false;
}
@Override
public double getArea(){
double s;
s=width*length;
return s;
}
}
class Circle extends Shape{
Circle(){
}
double r;
Circle(double r)
{
this.r = r;
}
public double getR()
{
return r;
}
public void setR(double r)
{
this.r = r;
}
@Override
public double getArea()
{
double s=Math.PI*r*r;
return s;
}
@Override
public boolean validate() {
if(r<0)
{
return false;
}
else
return true;
}
}
class Triangle extends Shape{
Triangle(){
}
double side1;
double side2;
double side3;
@Override
public boolean validate()
{
if(side1+side2<=side3||side1+side3<=side2||side2+side3<=side1)
{
return false;
}
if(side1-side2>=side3||side1-side3>=side2||side2-side3>=side1)
{
return false;
}
if(side1<0&&side2<=0&&side3<0)
{
return false;
}
return true;
}
Triangle(double side1,double side2,double side3)
{
this.side1=side1;
this.side2=side2;
this.side3=side3;
}
@Override
public double getArea(){
double p=(side1+side2+side3)/2;
double s=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
return s;
}
}
class Trapezoid extends Shape{
Trapezoid(){
}
double a;
double b;
double c;
Trapezoid(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
@Override
public boolean validate(){
if(a>0&&b>0&&c>0)
return true;
else
return false;
}
@Override
public double getArea() {
double s;
s=(a+b)*c/2;
return s;
}
}