给定三个数值代表三角形的三个边长,请判定是否构成三角形。并求其周长和面积。 Main.java.pdf

测试代码已写好,参考文件Main.java,要求不得修改main方法。你只需要补充完善其他相关类的定义。

输入格式:

有若干组测试用例,每组用例包含若干行,每行由三个绝对值不大于10000小数组成,数据之间用空格隔开。

输出格式:

对每一组输入,在第一行中输出三角形信息(参见样例),第二行输出其是否构成三角形、周长和面积(结果保留2位小数)。 如果有非法数据(如负值)或者不能构成三角形,则输出判定结果为false,周长和面积均为0.00

输入样例:

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

1 2 3
3 4 5
0 -1 2

输出样例:

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

Triangle [s1=1.0, s2=2.0, s3=3.0]
false        0.00        0.00
Triangle [s1=3.0, s2=4.0, s3=5.0]
true       12.00        6.00
Triangle [s1=0.0, s2=-1.0, s3=2.0]
false        0.00        0.00
创作不易,点个赞吧!
import java.util.Scanner;

import static java.lang.Math.sqrt;
/**
 * @Tittle Triangle
 * @author 沐景
 * @updateTime 2021年4月1日 18:33:56
 * 
 */
public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        double a, b, c;
        Shape s;
        while (sc.hasNext()) {
            a = sc.nextDouble();
            b = sc.nextDouble();
            c = sc.nextDouble();
            s = new Triangle(a, b, c);
            System.out.println(s);
            System.out.printf("%s\t%8.2f\t%8.2f\n", ((Triangle) s).judge(), s.getPerimeter(), s.getArea());
        }
    }
}

/**
 * 定义图形类
 * a,b,c为三边长
 */
class Shape {

    static double a;
    static double b;
    static double c;

    //因为只有匿名内部类用到无参构造,所以只创建无参构造器
    public Shape() {
    }

    //判断三边长能否构成三角形
    //返回值为布尔值
    public static boolean judge() {
        if (a+b>c && a+c>b && b+c>a && a>0 && b>0 && c>0){
            return true;
        }else {
            return false;
        }
    }

    //计算周长方法
    public double getPerimeter() {
        //先判断能否构成三角形,如果能,则计算周长并返回
        if (new Shape().judge()) { //创建匿名内部类,调用判断方法
            double Perimeter = a + b + c;
            return Perimeter;
        }else {
            //不能构成三角形
            return 0;
        }
    }

    //计算面积
    public double getArea() {
        //先判断能否构成三角形,如果能,则计算面积并返回
        if (new Shape().judge()) {  //此处同上
            //由海伦公式计算
            double p = (a+ b + c)/2;
            double S = sqrt(p*(p-a)*(p-b)*(p-c));
            return S;
        }else {
            return 0;
        }
    }

}

/**
 * 创建子类,继承Shape
 * Shape s = new Triangle(a, b, c)
 * 此处使用的是多态,即子类对象指向父类
 */
class Triangle extends Shape {

    //子类构造器
    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    //重写toString方法,按一定格式打印对象
    @Override
    public String toString() {
        return "Triangle [" +
                "s1=" + a +
                ", s2=" + b +
                ", s3=" + c +
                ']';
    }
}

本题比较简单,涉及到重写、继承、多态等知识点,是java入门不错的题目

关于继承与多态:

面向对象的三大特征:封装性、继承性、多态性

继承是多态的前提,如果没有继承,就没有多态。

特点:

1、子类可以拥有父类的“内容”
2、子类还可以拥有自己专有的新内容
3、单继承:一个类的直接父类只能有唯一一个
4、可以多级继承,有多个子类

在继承关系当中,“子类就是一个父类”。也就是说,子类可以被当作父类看待

例如:
父类是员工,子类是讲师,那么“讲师就是一个员工”。关系:is-a

定义父类的格式:(一个普通的类定义)
public class 父类名称{
	//...
}
定义子类的格式:
public class 子类名称 extends 父类名称 {
	//...
}
在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式:

1、直接通过子类对象访问成员变量: 等号左边是谁,就优先用谁,没有则向上找
2、间接通过成员方法访问成员变量:该方法定义在哪个类中,就优先用谁,没有则向上找。 注意:不会向下找,因为子类知道父类,而父类不知道子类,(例如段正淳)

对于子类成员方法来说:
局部变量:直接写
本类成员变量:this.变量名称
父类成员变量:super.成员变量

在父子类的继承关系当中,创建子类对象,访问成员方法的规则:

创建的对象是谁,就优先用谁,如果没有就向上找 注意: 无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找子类

重写(Override):在继承关系中,方法名称一样,参数列表也一样

区别: 重写(Override):方法名称一样,参数列表 也一样 【覆盖、覆写】
重载(Overload):方法名称一样,参数列表 不一样

注意:

1、必须保证父子类之间方法的名称相同,参数列表也相同
@Override :写在方法前面,用来检测是不是有效的正确覆盖重写(可选,只是用于检测)
2、子类方法的返回值必须小于等于父类方法的返回值范围
java.lang.Object 类是所有类的公共最高父类(祖宗类),java.lang.String 就是Object的子类
3、子类方法的权限必须大于等于父类方法的权限修饰符 public > protected > (default) > private
备注:(default) 不是关键字default,,而是什么都不写,留空

继承关系中,父子类构造方法的访问特点:

1、子类构造方法当中有一个默认的”super();“调用,所以一定是先调用父类构造,后执行子类构造
2、子类构造可以通过super调用父类重载构造
3、super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造
总结:子类必须调用父类构造方法,不写则赠送一个super();写了则用写的指定的super调用,而且super只能有一个,还必须在第一个