给定三个数值代表三角形的三个边长,请判定是否构成三角形。并求其周长和面积。 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只能有一个,还必须在第一个