先简单说一下本题要求:
题目中给出了要求“定义接口或类 Shape”,在下面博主给出了定义“接口”或定义“类”的具体实现方法。
本题很适合小白用来练手,知识面很全面。(博主第一次写完后,就感到了对这些知识点有了进一步的了解,当然我也参考了很多博客,哈哈感觉自己好菜啊啊啊啊)
来,先看题:
定义接口或类 Shape,定义求周长的方法length()。
定义如下类,实现接口Shape或父类Shape的方法。
(1)三角形类Triangle (2)长方形类Rectangle (3)圆形类Circle等。
定义测试类ShapeTest,用Shape接口(或类)定义变量shape,用其指向不同类形的对象,输出各种图形的周长。并为其他的Shape接口实现类提供良好的扩展性。
提示: 计算圆周长时PI取3.14。
输入格式:
输入多组数值型数据(double);
一行中若有1个数,表示圆的半径;
一行中若有2个数(中间用空格间隔),表示长方形的长度、宽度。
一行中若有3个数(中间用空格间隔),表示三角形的三边的长度。(需要判断三个边长是否能构成三角形)
若输入数据中有0或负数,则不表示任何图形,周长为0。
输出格式:
行数与输入相对应,数值为根据每行输入数据求得的图形的周长。
输入样例:
在这里给出一组输入。例如:
1
2 3
4 5 6
2
-2
-2 -3
输出样例:
在这里给出相应的输出。例如:
6.28
10.00
15.00
12.56
0.00
0.00
先简单解析一下题目:
建三个类,一个接口或是父类,键盘录入,求周长
啪,没了,(是不是在想:就这啊,要求这么简单,这不随便拿捏吗)
系好安全带,开始发车喽!!!
来上代码,各种细节请看代码注释:
看之前先给你们简单说一下里面那个函数split():
Java中的 split 函数是用于按指定字符(串)或正则表达式(以后会学的不用管)去分割某个字符串,结果以字符串数组形式返回。
就此题来说:如果需要分割的字符串为"4 5 6"(这里有两个空格),
按空格分得到的是三个字符串数组,分别是 "4" "5" "6"。
如果需要分割的字符串为"-2 -3"(这里有一个空格),
按空格分得到的是两个字符串数组,分别是 "-2" "-3" 。
兄弟们体会一下吧。
1.先看定义一个接口的做法:
//键盘录入,需要导入Scanner包
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
double a,b,c;//创建三个变量
while(sc.hasNext()){//hasNext()是标准的多样例输入的写法
String s=sc.nextLine();//录入字符串
String[] str=s.split(" ");//split 这个函数了解一下,知道有这个东西就行
if(str.length==1){
//Double.parseDouble是将字符串转换为小数,下面同理
a=Double.parseDouble(str[0]);
Circle x=new Circle(a);//创建对象,将参数传入,下面也一样
System.out.printf("%.2f\n",x.length());
}
else if(str.length==2){
a=Double.parseDouble(str[0]);
b=Double.parseDouble(str[1]);
Rectangle x = new Rectangle(a,b);
System.out.printf("%.2f\n",x.length());
}
else if(str.length==3){
a=Double.parseDouble(str[0]);
b=Double.parseDouble(str[1]);
c=Double.parseDouble(str[2]);
Triangle x = new Triangle(a,b,c);
System.out.printf("%.2f\n",x.length());
}
}
}
}
//创建三角形类Triangle并实现接口
class Triangle implements Shape{
double a,b,c;
//两种构造方法(无参构造与带参构造)
public Triangle() {
}
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
//@Override是方法重写的一个重要标志,可别忘写了哦,下面一样
@Override
public double length() {
if(a<=0||b<=0||c<=0)//判断输入是否非法
return 0;
if(a+b<=c||a+c<=b||b+c<=a)//是否能构成三角形
return 0;
return a+b+c;
}
}
//创建长方形类Rectangle并实现接口
class Rectangle implements Shape{
double a,b;
//两种构造方法(无参构造与带参构造)
public Rectangle() {
}
public Rectangle(double a, double b) {
this.a = a;
this.b = b;
}
@Override
public double length() {
if(a<=0||b<=0)//判断输入是否非法
return 0;
return a*2+b*2;
}
}
//创建圆类Circle并实现接口
class Circle implements Shape{
double r;
final double PI=3.14;//注意这里要求PI的值为3.14,final表示这个值不可更改
//两种构造方法(无参构造与带参构造)
public Circle() {
}
public Circle(double r) {
this.r = r;
}
@Override
public double length(){
if(r<=0)//判断输入是否非法
return 0;
return 2*r*PI;
}
}
//创建接口Shape
interface Shape{
double length();//注意不用写大括号
}
2.定义shape类和定义接口差不多
也就是将implements->extends
将interface->class,注意:shape需要定义为抽象类,方法为抽象方法
//键盘录入,需要导入Scanner包
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
double a,b,c;//创建三个变量
while(sc.hasNext()){//hasNext()是标准的多样例输入的写法
String s=sc.nextLine();//录入字符串
String[] str=s.split(" ");//split 这个函数了解一下,知道有这个东西就行
if(str.length==1){
//Double.parseDouble是将字符串转换为小数,下面同理
a=Double.parseDouble(str[0]);
Circle x=new Circle(a);//创建对象,将参数传入,下面也一样
System.out.printf("%.2f\n",x.length());
}
else if(str.length==2){
a=Double.parseDouble(str[0]);
b=Double.parseDouble(str[1]);
Rectangle x = new Rectangle(a,b);
System.out.printf("%.2f\n",x.length());
}
else if(str.length==3){
a=Double.parseDouble(str[0]);
b=Double.parseDouble(str[1]);
c=Double.parseDouble(str[2]);
Triangle x = new Triangle(a,b,c);
System.out.printf("%.2f\n",x.length());
}
}
}
}
//创建三角形类Triangle并实现接口
class Triangle extends Shape{
double a,b,c;
//两种构造方法(无参构造与带参构造)
public Triangle() {
}
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
//@Override是方法重写的一个重要标志,可别忘写了哦,下面一样
@Override
public double length() {
if(a<=0||b<=0||c<=0)//判断输入是否非法
return 0;
if(a+b<=c||a+c<=b||b+c<=a)//是否能构成三角形
return 0;
return a+b+c;
}
}
//创建长方形类Rectangle并实现接口
class Rectangle extends Shape{
double a,b;
//两种构造方法(无参构造与带参构造)
public Rectangle() {
}
public Rectangle(double a, double b) {
this.a = a;
this.b = b;
}
@Override
public double length() {
if(a<=0||b<=0)//判断输入是否非法
return 0;
return a*2+b*2;
}
}
//创建圆类Circle并实现接口
class Circle extends Shape{
double r;
final double PI=3.14;//注意这里要求PI的值为3.14,final表示这个值不可更改
//两种构造方法(无参构造与带参构造)
public Circle() {
}
public Circle(double r) {
this.r = r;
}
@Override
public double length(){
if(r<=0)//判断输入是否非法
return 0;
return 2*r*PI;
}
}
//创建Shape类,不过要定义为抽象类
abstract class Shape{
abstract double length();//注意不用写大括号
}
呼,可算搞完了。
知识点挺多的,完全是被拿捏了,哈哈哈(建议使用函数求读入的数据个数,不然写起来有点麻烦,实在是想知道的话,评论一下,我试着给你们写一下)
诶,这篇拖了好几天了,我真是该死,略略略。
完成收工,good!
虽然“天不生无用之人,地不长无名之草”。但仍谨记“冰冻三尺,非一日之寒”。
执长剑纵马,执妙笔生花,我王某人在此邀请诸位与我共身!