(Java)7-1 图形卡片排序游戏

掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书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:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 有图形的面积总和,格式为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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值