Java面向对象编程基础(2)实训答案

第1关:接口,异常处理综合应用
编程要求
本程序包含6个类,对应6个源文件,只有接口IShape的代码是完整的,其余源文件要么缺少小部分代码(位于begin-end块中),要么没有添加任何代码。
你的工作就是在研读主类main方法后,根据IShape接口、Cylinder已有代码,将需要补充代码的文件根据提示补充完整。
测试说明
平台会对你编写的代码进行测试:
以下是测试画面1:
请输入柱体类型
0-圆柱体
1-三菱柱
2-长方体
0
请输入该柱体底面属性值:
1
请输入柱体的高度:
1
体积=3.14,表面积=12.57
测试画面2:
请输入柱体类型
0-圆柱体
1-三菱柱
2-长方体
1
请输入该柱体底面属性值:
3.3 43.2 9.3
不能构成三角形
请重新输入属性值:
5 3 4
请输入柱体的高度:
1.2
体积=7.20,表面积=26.40

MainClass.java

package step1;

import java.util.Scanner;

public class MainClass {
	public static Scanner sc=new Scanner(System.in);
	public static void main(String[] args) {
		System.out.println("请输入柱体类型");
		System.out.println("0-圆柱体\n1-三菱柱\n2-长方体");
		IShape bottom = null;
		switch (sc.nextInt()) {
            //请在begin=end之间补充代码,其他地方补充代码或修改其他代码一律判0分。
/***************begin*************************************/
            case 0:
                bottom = new Circle();
                break;
            case 1:
                bottom = new Triangle();
                break;
            case 2:
                bottom = new Rectangle();
                break;

/***************end*************************************/
			default :
				System.out.println("暂不支持这种柱体!");
				sc.close();
				return;
		}
		System.out.println("请输入该柱体底面属性值:");
		//下面加入异常处理,确保输入的属性值都是合法的值(正数,对于三角形来说,还必须能构成三角形),否则,要求重新输入
		while(true) {
			try {
				bottom.input(sc);
				break;
				}catch(ShapeException exp) {
					System.out.println(exp.getMessage());
					System.out.println("请重新输入属性值:");
				}
		}
		System.out.println("请输入柱体的高度:");
		double height = sc.nextDouble();
        //创建柱体,计算体积
		Cylinder cylinder = new Cylinder(bottom, height);
		String s = String.format("体积=%.2f,表面积=%.2f", cylinder.getVolume(),
				cylinder.getSurfaceArea());
		System.out.printf(s);
		sc.close();
	}

}

Cylinder.java

 /**
 * Cylinder:柱体
 * @author guet.imagan
 */
package step1;
/**
 * 柱体类
 * @author Administrator
 *
 */
public class Cylinder {
	/**
	 * 柱体底部形状
	 */
	private IShape bottom;
	/**
	 * 柱体的高度
	 */
	private double height;
	/**
	 * 构造方法
	 * @param bottom 柱体底部,必须是一个实现了IShape接口的类的对象
	 * @param height 柱体的高度
	 */
	public Cylinder(IShape bottom, double height) {
		this.bottom=bottom;
		this.height=height;
	}
	/**
	 * 计算并返回柱体的表面积
	 * @return 柱体表面积
	 */
	public double getSurfaceArea() {
		//begin
    return bottom.getArea()*2+bottom.getPerimeter()*height;

        //end

	}
	/**
	 * 计算并返回柱体的体积
	 * @return 柱体体积
	 */
	public double getVolume() {
		//begin

    return bottom.getArea()*height;
        //end
        
	}
	
}

Circle.java

 //Circle.java,请在下面完成能满足程序输出要求的圆形Circle的定义。
 package step1;
 import java.util.Scanner;
 public class Circle implements IShape{

    private double R;
    final double PI = 3.1415926;

    @Override
    public double getArea() {
        return R*R*PI;
    }

    @Override
    public double getPerimeter() {
        return (R+R)*PI;
    }

    @Override
    public void input(Scanner sc) throws ShapeException {
        this.R = sc.nextDouble();
        if(R<=0){
            throw new ShapeException("圆");
        }
    }
}

Rectangle.java

 //Rectangle.java,请在下方给出满足程序输出要求的Rectangle类(长方形)的完整定义。
 package step1;
 import java.util.Scanner;
 public class Rectangle implements IShape{

    private double chang;
    private double gao;

    @Override
    public double getArea() {
        return chang*gao;
    }

    @Override
    public double getPerimeter() {
        return (chang+gao)*2;
    }

    @Override
    public void input(Scanner sc) throws ShapeException {
        this.chang = sc.nextDouble();
        this.gao = sc.nextDouble();
        if(chang<=0 || gao<=0){
            throw new ShapeException("长方形");
        }
    }
}

Triangle .java

 //Triangle.java ,请在此文件中给出满足程序输出要求的三角形类Triangle的完整定义。
 package step1;
 import java.util.Scanner;
 public class Triangle implements IShape{

    private double side1;
    private double side2;
    private double side3;

    @Override
    public double getArea() {
        double p = (side1+side2+side3)/2;
        double area = Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
        return area;
    }

    @Override
    public double getPerimeter() {
        return side1+side2+side3;
    }

    @Override
    public void input(Scanner sc) throws ShapeException {
        this.side1 = sc.nextDouble();
        this.side2 = sc.nextDouble();
        this.side3 = sc.nextDouble();
        if(side1<=0 || side2<=0 || side3<=0 || side1+side2<side3 || side1+side3<side2 || side3+side2<side1){
            throw new ShapeException("三角形");
        }

    }
}
 

ShapeException.java

 //ShapeException.java,请在其中完成ShapeException的定义,提示,该异常类可以用Exception作为其父类,从而减少代码。
 //主要结合参阅MainClass.java中的代码
 package step1;
 public class ShapeException extends Throwable {
    String result;
    public ShapeException(String n){
        result = "不能构成"+n;
    }
    public String getMessage(){
        return result;
    }
}

IShape.java(接口)

 /**
 * IShape:所有平面图形所遵循的接口
 */
package step1;

import java.util.Scanner;

/**
 * @author imagan
 *
 */
public interface IShape {
	/**
	 * 求平面图形的面积
	 * @return 平面图形的面积
	 */
	double getArea();
	/**
	 * 求平面图形的周长
	 * @return 平面图形的周长
	 */
	double getPerimeter();
	/**
	 * 从控制台输入平面图形的基本属性,在此基础上可以求面积和周长
	 * @param sc  对控制台输入进行扫描的对象
	 * @throws ShapeException 当输入的属性值,例如圆的半径为负数或0,则抛出ShapeException异常,另外当一些属性不合法(如三条边不能构成三角形),也抛出异常
	 */
	void input(Scanner sc) throws ShapeException;
}

第2关:内部类的定义与使用
编程要求
根据提示,在右侧编辑器补充代码.
本关涉及到两个源文件,分别是step2/MainClass.java,
step2/ClassA.java,你在填空前,请先完整阅读所有代码。
MainClass.java

package step2;
public class MainClass {

	public static void main(String[] args) {
		
		//请补充(1)(2)处的代码,确保测试通过。不要修改其他任何代码,否则记为0分
		ClassA a=  new ClassA();
        ClassA.ClassB b= a.new ClassB();
		

	}

}

ClassA.java

package step2; 
public class ClassA {
	private String memberA;

	public ClassA() {
		System.out.println("我是ClassA对象");
		this.memberA="member1";
	}
	public class ClassB{
		public ClassB() {
			System.out.println("我是ClassA中的内部类ClassB的对象");
			System.out.println("memberA="+memberA);
		}
	}
	
}

第3关:匿名类、lambda表达式的应用
编程要求
本程序由三个源文件组成,分别是:
(1)MainClass.java : 主类定义,需要根据提示补充代码
(2)IFun.java : 一元函数接口,禁止修改
(3)Integrator: 定积分类 , 根据提示补充代码
MainClass.java
思路:淦,上次的有问题,我怎么记得高数的思想是分割成无数矩形啊,上一次是偷偷改输出才过的,后面朋友指点了一下,发现要视为梯形才可以过,精度太大了,离谱!

package step3;
import static java.lang.Math.sin;
public class MainClass {

	public static void main(String[] args) {
		//请在(1)(2)处补充代码,使得下面第12行可以输出 f(x)=sin(x)在[0,pi/2]上的积分
		//这里必须采用匿名类对象方式
		IFun fun1=new IFun()  {
            @Override
            public double fun(double x) {
                return sin(x);
            }
		};
		Integrator integrator=new Integrator(fun1);
		double res=integrator.compute(0,Math.PI/2.0);
		System.out.printf("%.3f\n",res);
        //请补充(3)处的代码,必须用lambda表达式,关于lambda表达式,课堂派或智慧树教学平台都提供了学习资料,务必自学。
		//补充代码务必确保最后一条代码输出f(x)=sin(x*x+10)在[0,3*pi]上的定积分
        IFun fun2=(x)->{return sin(x*x+10);};
	    integrator=new Integrator(fun2);
		res=integrator.compute(0,3*Math.PI);
		System.out.printf("%.4f",res);
	}
	
}


Integrator.java

package step3;
public class Integrator {

	private double precision=1e-3;
	private IFun func;
	public Integrator(IFun func) {
		// TODO Auto-generated constructor stub
		this.func=func;
	}
	/**
	 计算区间[down , up]上的定积分,请根据提示在begin-end之间完成代码补充
	*/
	public double compute(double down, double up) {
		double res=0;
		double x=down;
		double val0=func.fun(x);
		
		while(x<up) {
			x+=this.precision;
			//begin
            setPrecision(1e-3);
            val0 = func.fun(x);
            res += (val0+func.fun(down))*getPrecision()/2;//视为超级多体型
            down = x;

			//end
		}
		return res;
	}
	public double getPrecision() {
		return precision;
	}
	public void setPrecision(double precision) {
		assert precision>1e-6;
		this.precision = precision;
	}
	
}


IFun.java

package step3;
public interface IFun {
	double fun(double x);
}

仅供参考,不懂去答疑

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
湖南科技大学是一所位于中国湖南省的高等学府,开设有丰富的课程和实训项目。其中,Java实训是该校计算机科学与技术专业的重要一部分。 Java实训旨在培养学生在编程语言Java上的应用能力和开发技巧。课程内容包括Java语法、面向对象编程、数据结构与算法、图形用户界面设计等。通过实践练习和课堂教学相结合的方式,培养学生独立解决问题的能力和团队协作精神。 在实训中,学生可以学习和熟悉Java的开发环境和工具,例如Eclipse、Android Studio等。他们将从简单的控制台程序开始,逐步深入学习Java的核心知识,并通过完成各种实际项目来提高自己的编程能力。 此外,湖南科技大学还注重实践教学和产学研结合,为学生提供了丰富的实习机会和实验室资源。学生可以在校内实验室中进行编码和调试,也可以参与校外合作企业的项目实训,亲身体验软件开发的全过程。 随着移动互联网的迅猛发展,Java语言在开发Android应用程序中发挥重要作用。因此,通过参与Java实训,学生不仅能够获得扎实的编程基础,还可以提高自己在移动应用开发领域的竞争力。他们将具备开发各类应用程序的能力,并为未来的职业发展打下坚实的基础。 综上所述,湖南科技大学的Java实训课程为学生提供了全面的Java编程教育和实践机会。这使得学生能够掌握Java的基本概念和技术,并具备开发各种应用程序的能力,为他们将来的职业发展奠定良好的基础

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值