注册 登录
编程论坛 JAVA论坛

请各位帮我看看我的代码哪里错了

丶随风飘扬 发布于 2020-03-16 07:49, 5952 次点击
问题:
形状求周长--类继承机制应用
问题描述:

    1、定义父类:形状(Shape),其中有1个方法成员:对形状的周长进行计算;

    2、分别定义子类:圆形(Circle)、正方形(Square)、矩形(Rectangle)、三角形(Triangle);

    3、每个子类重写父类中计算周长的方法,实现对每种形状的周长进行计算;

    4、类中的属性成员均修饰为private,方法成员均修饰为public;

    5、用@Override注解标出重写的方法。

输入要求:        

    第1行输入1个正整数T(1<=T<=100),表示有T组测试数据。

    每组测试数据输入占1行,首先为1个正整数M(1<=M<=4), 若

    1、若M=1,后面输入的为圆形的半径;

    2、若M=2,后面输入的为正方形的边长;

    3、若M=3,后面输入的为矩形的长和宽;

    4、若M=4,后面输入的为三角形的三条边长(确保输入合法)。

    以上各数均为正整数,且定义:兀(pai)=3。



输出要求:

    对于每组测试数据,输出占1行,为1个整数,即形状的边长。

样例输入:

4

1 2

2 2

3 2 3

4 2 3 4

样例输出:
12

8

10

9
这是我的代码:
程序代码:

import java.util.*;

public class JXNU {
    final int π=3;
    class shape{
        public    void count() {   
}
    }
    public class Circle extends shape{
        private  double r;
        public Circle(double r)
        {
            this.r=r;
        }
         @Override
         public void count() {
                System.out.printf("%d",2*π*r);
         }
         }
    public class Square extends shape{
        private double a;
        public Square(double a)
        {
            this.a=a;
        }
         @Override
         public void count() {
                System.out.printf("%d",4*a);
         }
    }
    public class Rectangle extends shape{
        private double a,b;
        public Rectangle(double a,double b)
        {
            this.a=a;
            this.b=b;
        }
         @Override
         public void count() {
                System.out.printf("%d",2*(a+b));
         }
    }
    public class Triangle extends shape{
        private double a,b,c;
        public Triangle(double a,double b,double c)
        {
            this.a=a;
            this.b=b;
            this.c=c;
        }        
         @Override
         public void count() {
                System.out.printf("%d",a+b+c);
         }
    }   

    public void main(String[] args) {
        // TODO Auto-generated method stub
        int T, M;
        double a,b,c,r;
        Scanner sc=new Scanner(System.in);
        T=sc.nextInt();
        while(T-->0){
            M=sc.nextInt();
            if (M==1){
                r=sc.nextDouble();
                Circle c1=new Circle(r);
                c1.count();               
            }
            else if (M==2){
                a=sc.nextDouble();
                Square c1=new Square(a);
                c1.count();
               
            }
            else if (M==3){
                a=sc.nextDouble();
                b=sc.nextDouble();
                Rectangle c1=new Rectangle(a,b);
                c1.count();
            }
            else if (M==4){            
                a=sc.nextDouble();
                b=sc.nextDouble();
                c=sc.nextDouble();
                if(a + b > c && b + c > a && a + c > b)
                {
                    Triangle c1=new Triangle(a,b,c);
                    c1.count();
                }
                else break;
                    
            }

    }

}
}
24 回复
#2
林月儿2020-03-16 07:53
一行数字空格分开用nextLine()取了再分割转型
#3
丶随风飘扬2020-03-16 07:58
我先开始输入1,然后输入1 2,应该得到半径为2的圆的周长,但我第二次输入要输入3个数才能得到结果,而且结果也只是把第二个数和第三个数相乘。
#4
丶随风飘扬2020-03-16 08:12
回复 2楼 林月儿
不懂怎么修改。。。
#5
林月儿2020-03-16 08:37
T=sc.nextInt();
改成T=Integer.valueOf(sc.nextLine());

while里面的nextInt(),nextDouble()
都改成nextLine(),按split(" ")分割成字符串数组
再根据数组第一个元素判断后面有几个元素,分别需要转换成什么类型
#6
林月儿2020-03-16 08:39
字符串分割转换你应该理解,至于都改成字符串读取,整形和字符串交替读取会出问题。这个可以百度一下
#7
丶随风飘扬2020-03-16 09:44
大佬,你说的的东西我还真不怎么理解。。。我基础有点弱。。。你能帮我改一下吗?
#8
林月儿2020-03-16 10:23
public void main(String[] args) {
        // TODO Auto-generated method stub
        int T, M;
        double a,b,c,r;
        Scanner sc=new Scanner(System.in);
        T=sc.nextInt();
        while(T-->0){
            M=sc.nextInt();
            if (M==1){
                r=sc.nextDouble();
                Circle c1=new Circle(r);
                c1.count();               
            }
....

改成


public void main(String[] args) {
        int T, M;
        double a,b,c,r;
        Scanner sc=new Scanner(System.in);
        T=Integer.valueOf(sc.nextInt());
        while(T-->0){
            String[] arr = sc.nextLine().split(" ");//空格分割并转型
            M=Integer.valueOf(arr[0]);
            if (M==1){
                r=Double.parseDouble(arr[1]);
                Circle c1=new Circle(r);
                c1.count();               
            }

....
没啥大问题,下面按这么改试试
#9
丶随风飘扬2020-03-16 10:57
程序代码:
import java.util.*;

public class JXNU {
    final int π=3;
    class shape{
        public    void count() {   
}
    }
    public class Circle extends shape{
        private  double r;
        public Circle(double r)
        {
            this.r=r;
        }
         @Override
         public void count() {
                System.out.printf("%d",2*π*r);
         }
         }
    public class Square extends shape{
        private double a;
        public Square(double a)
        {
            this.a=a;
        }
         @Override
         public void count() {
                System.out.printf("%d",4*a);
         }
    }
    public class Rectangle extends shape{
        private double a,b;
        public Rectangle(double a,double b)
        {
            this.a=a;
            this.b=b;
        }
         @Override
         public void count() {
                System.out.printf("%d",2*(a+b));
         }
    }
    public class Triangle extends shape{
        private double a,b,c;
        public Triangle(double a,double b,double c)
        {
            this.a=a;
            this.b=b;
            this.c=c;
        }        
         @Override
         public void count() {
                System.out.printf("%d",a+b+c);
         }
    }   

    public void main(String[] args) {
        // TODO Auto-generated method stub
        int T, M;
        double a,b,c,r;
        Scanner sc=new Scanner(System.in);
        T=Integer.valueOf(sc.nextInt());
        while(T-->0){
            String[] arr = sc.nextLine().split(" ");//空格分割并转型
            M=Integer.valueOf(arr[0]);
            if (M==1){
                r=Double.parseDouble(arr[1]);
                Circle c1=new Circle(r);
                c1.count();   
            }
            else if (M==2){
                a=Double.parseDouble(arr[1]);
                Square c1=new Square(a);
                c1.count();
               
            }
            else if (M==3){
                a=Double.parseDouble(arr[1]);
                b=Double.parseDouble(arr[2]);
                Rectangle c1=new Rectangle(a,b);
                c1.count();
            }
            else if (M==4){            
                a=Double.parseDouble(arr[1]);
                b=Double.parseDouble(arr[2]);
                c=Double.parseDouble(arr[3]);
                if(a + b > c && b + c > a && a + c > b)
                {
                    Triangle c1=new Triangle(a,b,c);
                    c1.count();
                }
                else break;
            }
    }
}
}

这样改还是不行唉。
#10
林月儿2020-03-16 11:01
搞错了,我写错了,不是Integer.valueOf(sc.nextInt())是sc.nextLine()

5楼提过
#11
丶随风飘扬2020-03-16 11:08
回复 10楼 林月儿
改过来了,但还是有问题,跟我3楼时说的问题一样。。。
#12
林月儿2020-03-16 11:40
3楼第一行输入1,表示只有一组用例输入啊
还是我理解错了?
#13
丶随风飘扬2020-03-16 14:18
回复 12楼 林月儿
在T=1的前提下,当M=1或2时,第二次输入就只需要输入二个数就要输出结果的(第一个数对应M,第二个数是圆的半径或正方形的边长),但实际上需要输入三个数才能输出结果。所以我不知道哪里出问题了。
#14
林月儿2020-03-16 14:35
输入内容发出来呢
#15
丶随风飘扬2020-03-16 14:58
回复 14楼 林月儿
只有本站会员才能查看附件,请 登录
#16
林月儿2020-03-16 15:32
最新代码再发一遍
#17
丶随风飘扬2020-03-16 15:41
回复 16楼 林月儿
程序代码:

import java.util.*;

public class JXNU {
    final int π=3;
    class shape{
        public    void count() {   
}
    }
    public class Circle extends shape{
        private  double r;
        public Circle(double r)
        {
            this.r=r;
        }
         @Override
         public void count() {
                System.out.printf("%d",2*π*r);
         }
         }
    public class Square extends shape{
        private double a;
        public Square(double a)
        {
            this.a=a;
        }
         @Override
         public void count() {
                System.out.printf("%d",4*a);
         }
    }
    public class Rectangle extends shape{
        private double a,b;
        public Rectangle(double a,double b)
        {
            this.a=a;
            this.b=b;
        }
         @Override
         public void count() {
                System.out.printf("%d",2*(a+b));
         }
    }
    public class Triangle extends shape{
        private double a,b,c;
        public Triangle(double a,double b,double c)
        {
            this.a=a;
            this.b=b;
            this.c=c;
        }        
         @Override
         public void count() {
                System.out.printf("%d",a+b+c);
         }
    }   

    public void main(String[] args) {
        // TODO Auto-generated method stub
        int T, M;
        double a,b,c,r;
        Scanner sc=new Scanner(System.in);
        T=Integer.valueOf(sc.nextLine());
        while(T-->0){
            String[] arr = sc.nextLine().split(" ");//空格分割并转型
            M=Integer.valueOf(arr[0]);
            if (M==1){
                r=Double.parseDouble(arr[1]);
                Circle c1=new Circle(r);
                c1.count();   
            }
            else if (M==2){
                a=Double.parseDouble(arr[1]);
                Square c1=new Square(a);
                c1.count();
               
            }
            else if (M==3){
                a=Double.parseDouble(arr[1]);
                b=Double.parseDouble(arr[2]);
                Rectangle c1=new Rectangle(a,b);
                c1.count();
            }
            else if (M==4){            
                a=Double.parseDouble(arr[1]);
                b=Double.parseDouble(arr[2]);
                c=Double.parseDouble(arr[3]);
                if(a + b > c && b + c > a && a + c > b)
                {
                    Triangle c1=new Triangle(a,b,c);
                    c1.count();
                }
                else break;
            }
    }
}
}
#18
林月儿2020-03-16 15:48
String[] arr = sc.nextLine().split(" ");//空格分割并转型
  这句话下面加一行System.out.println(Arrays.toString(arr));


count()方法里,System.out.printf第一个参数占位符后面加换行符
"%d\n"

改不改的对不重要,每次的修改分析能不能加深对代码的理解,能不能学到更多很重要
多分析,多定位!
#19
丶随风飘扬2020-03-16 16:02
回复 18楼 林月儿
还是没用,还是一样的问题,快被这个给整自闭了。。
程序代码:

import java.util.*;

public class JXNU {
    final int π=3;
    class shape{
        public    void count() {   
}
    }
    public class Circle extends shape{
        private  double r;
        public Circle(double r)
        {
            this.r=r;
        }
         @Override
         public void count() {
                System.out.printf("%d\n",2*π*r);
         }
         }
    public class Square extends shape{
        private double a;
        public Square(double a)
        {
            this.a=a;
        }
         @Override
         public void count() {
                System.out.printf("%d\n",4*a);
         }
    }
    public class Rectangle extends shape{
        private double a,b;
        public Rectangle(double a,double b)
        {
            this.a=a;
            this.b=b;
        }
         @Override
         public void count() {
                System.out.printf("%d\n",2*(a+b));
         }
    }
    public class Triangle extends shape{
        private double a,b,c;
        public Triangle(double a,double b,double c)
        {
            this.a=a;
            this.b=b;
            this.c=c;
        }        
         @Override
         public void count() {
                System.out.printf("%d\n",a+b+c);
         }
    }   

    public void main(String[] args) {
        // TODO Auto-generated method stub
        int T, M;
        double a,b,c,r;
        Scanner sc=new Scanner(System.in);
        T=Integer.valueOf(sc.nextLine());
        while(T-->0){
            String[] arr = sc.nextLine().split(" ");//空格分割并转型
            System.out.println(Arrays.toString(arr));
            M=Integer.valueOf(arr[0]);
            if (M==1){
                r=Double.parseDouble(arr[1]);
                Circle c1=new Circle(r);
                c1.count();   
            }
            else if (M==2){
                a=Double.parseDouble(arr[1]);
                Square c1=new Square(a);
                c1.count();
               
            }
            else if (M==3){
                a=Double.parseDouble(arr[1]);
                b=Double.parseDouble(arr[2]);
                Rectangle c1=new Rectangle(a,b);
                c1.count();
            }
            else if (M==4){            
                a=Double.parseDouble(arr[1]);
                b=Double.parseDouble(arr[2]);
                c=Double.parseDouble(arr[3]);
                if(a + b > c && b + c > a && a + c > b)
                {
                    Triangle c1=new Triangle(a,b,c);
                    c1.count();
                }
                else break;
            }
    }
}
}

只有本站会员才能查看附件,请 登录

#20
林月儿2020-03-16 16:21
我都说了,你不要跟机器一样改了跑完不管了
就是做出来有什么用呢?

输入完第二行为啥要空一行再输入个2?输入完第二行回车,这个不行吗?

建议我就不重复了,我说什么你就一句话,还是不行!你这样没法进步
#21
林月儿2020-03-16 16:23
问问题不要对别人的回复视而不见,一股脑的说还是不行!
让你加的东西不全是解决问题的,还有帮助定位问题的
#22
林月儿2020-03-16 16:29
这个输入不要插入空行,估计说完你还是加个空行,然后继续发帖子说还是不行
本来就没必要加空行,就在这个问题耗时间
#23
丶随风飘扬2020-03-16 17:07
回复 20楼 林月儿
我第二行输入两个数按了回车,但不会输出结果呀,按了回车不输出结果所以空行,不是我要加空行呀,之后再输入一个数才输出结果。
这就是我之前说的问题,或许是我之前的表述不太清楚吧,没有让你理解我的意思。
#24
林月儿2020-03-16 17:23
你挨个打印你输入的内容吧,包括第一行输入内容,分析下
#25
丶随风飘扬2020-03-16 17:41
回复 24楼 林月儿
好的,我再看看。
1