第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);
}
仅供参考,不懂去答疑