Java实训报告----计算图形的周长和面积(保姆级,完整版)

结课项目需求

运用所学的知识,设计计算图形面积和周长的系统,要求用到对象和类,构造方法,继承,抽象类(或接口)和多态。实现如下功能:

  1. 根据菜单提示选择要计算的图像类型。
  2. 输入矩形的长和宽,计算矩形的面积和周长。
  3. 输入圆的半径,计算圆形的面积和周长。(要求保留两位小数)
  4. 输入三角形的三边,计算三角形的面积和周长。
  5. 如果根据菜单提示输入有误,有相关提示并重新选择。
  6. 退出(非右上角x号退出)
框架实现

1.图形父类完成两个抽象方法面积和周长用于子类继承和重写(也可以用接口的方式实现),这里我加了两个shou方法,需要输出面积和周长时直接调用就可以了。

//父类图形
abstract class Shape{

    abstract double Area();
    abstract double Girth();
    abstract void showArea();
    abstract void showGirth();
}

2.子类继承并重写父类中的方法

                                                                矩形

//子类矩形
class Rectangle extends Shape{
    double length;
    double wide;

    public Rectangle(double length, double wide) {
        this.length = length;
        this.wide = wide;
    }

    @Override
    double Area() {
        return length*wide;
    }

    @Override
    double Girth() {
        return 2*(length+wide);
    }

    @Override
    void showArea() {
        System.out.printf("The area of the rectangle:"+"%.2f", Area());
        System.out.println();
    }

    @Override
    void showGirth() {
        System.out.printf("The girth of the rectangle:" +"%.2f", Girth());
        System.out.println();
    }
}

                                                                圆

//子类圆形
class Circle extends Shape{
    double radius;
    final double PI = 3.14;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double Area() {
        return PI*radius*radius;
    }

    @Override
    double Girth() {
        return 2*PI*radius;
    }

    @Override
    void showArea() {
        System.out.printf("The girth of the circle:"+"%.2f", Area());
        System.out.println();
    }

    @Override
    void showGirth() {
        System.out.printf("The girth of the circle:" +"%.2f", Girth());
        System.out.println();
    }
}

                                                                三角形

//子类三角形
class Triangle extends Shape{
    double a,b,c;

    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    double Girth() {
        return a + b + c;
    }

    @Override
    double Area() {
        return Math.sqrt(this.Girth()*(this.Girth()-a)*(this.Girth()-b)*(this.Girth()-c));
    }

    @Override
    void showArea() {
        System.out.printf("The girth of the triangle:" +"%.2f", Area());
        System.out.println();
    }

    @Override
    void showGirth() {
        System.out.printf("The girth of the triangle:" +"%.2f", Girth());
        System.out.println();
    }
}

还需要什么图形自行添加就可以。

下面是需要用到的相关方法

1.主菜单:

//主菜单
     static void Menu(){
        System.out.println("*********图形面积周长计算系统*********");
        System.out.println("*********请挑选需要进行的操作*********");
        System.out.println("*************1.计算矩形**************");
        System.out.println("*************2.计算圆形**************");
        System.out.println("*************3.计算三角形************");
        System.out.println("*************4.退出******************");

    }

2.退出方法,输入y代表确认退出,其他的代表否

 static boolean exit(String c,boolean condition){

        if ("y".equalsIgnoreCase(c)){//判断是否为y,equalsIgnoreCase不区分大小写

            condition = false;
            System.out.println("退出成功!");
        }
        else
            System.out.println("继续操作!");
        return condition;
    }

3.清屏函数。

每一次走到Switch的最后都进行一次清屏,首先我想到的是和c一样用close(),但是发现java并没有close()这个方法,所以这里我并没有想到好的方法,只能用事件来代替人为的操作鼠标和键盘来实现清理控制台,但是这样有不好的地方,首先,当你清屏之后,控制台中什么也没有直接进行到下一次输入需要操作的选项,所以这里清屏之前需要给出一点友好的提示并再次确认;其次如果清屏快捷键不同也不能使用,我这里清理控制台的快捷键设置为Ctrl+R,如果你的清屏快捷键不是这个的话这个函数你将需要做一些修改。当然你也可以选择不用清屏函数,这个看个人需要。

 //清屏函数,利用GUI来实现鼠标事件和键盘事件Ctrl+R
    //我这里设置的清屏快捷键为Ctrl+R,如果快捷键为其他的该方法体内的内容不同

    static void clear()throws AWTException{
        Robot r = new Robot();
        r.mousePress(InputEvent.BUTTON3_DOWN_MASK);//按下鼠标右键
        r.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);//释放鼠标右键
        r.keyPress(KeyEvent.VK_CONTROL);//按下ctrl键
        r.keyPress(KeyEvent.VK_R);//按下R键
        r.keyRelease(KeyEvent.VK_R);//释放R键
        r.keyRelease(KeyEvent.VK_CONTROL);//释放ctrl键
    }

4.判断输入格式是否正确

 //判断输入的格式是否符合矩形
    static boolean IsRectangle(double length,double wide){
        return length > 0 && wide > 0;
    }

    //判断输入是否是圆
    static boolean IsCircle(double radius){
        return radius > 0;
    }

    //判断输入的三条边能否构成三角形
    static boolean IsTriangle(double side[]){
        return side[1] + side[0] > side[2] && side[2] - side[0] < side[1] && side[0] > 0 && side[1] > 0 && side[2] > 0;
    }

5.是否确认清屏及友好提示

//是否要清屏
    static void whether() throws AWTException {
        System.out.println("是否清屏(Y),输入其他的代表否");
        System.out.println("注意清屏之后控制台什么提示也没有,需要直接输入一次需要选择操作的序号");
        Scanner in = new Scanner(System.in);
        String s = in.next();
        if ("y".equalsIgnoreCase(s))
            clear();
    }

6.循环体

 //循环体
    static void CirculatingBody() throws AWTException {
        while (isFlag){
            Scanner in = new Scanner(System.in);
           Menu();
            int n = in.nextInt();
            switch (n){
                case 1:
                    boolean condition1 = true;
                    while (condition1){

                        double length,wide;
                        do {
                            System.out.print("请输入矩形的长和宽(数字):");
                            length = in.nextDouble();
                            wide = in.nextDouble();
                            if (!IsRectangle(length,wide)){
                                System.out.println("输入数据有误,请从新输入");
                            }
                        }while (!IsRectangle(length,wide));//输入数据有误循环继续重新输入

                        Shape rectangle = new Rectangle(length,wide);//多态向下转型
                        rectangle.showArea();
                        rectangle.showGirth();
                        System.out.println("是否返回到上一级(Y),输入其他的代表否");
                        String s = in.next();
                        condition1 = exit(s,condition1);

                    }
                    break;
                case 2:
                    boolean condition2 = true;
                    while (condition2){
                        double radius;
                            do {
                                System.out.println("请输入圆的半径(数字):");
                                radius = in.nextDouble();
                                if (!IsCircle(radius)){
                                    System.out.println("输入有误,请重新输入!");
                                }
                            }while (!IsCircle(radius));//输入有误,重新输入,循环继续

                        Shape circle = new Circle(radius);//多态向下转型
                        circle.showArea();
                        circle.showGirth();
                        System.out.println("是否返回到上一级(Y),输入其他的代表否");
                        String s = in.next();
                        condition2 =  exit(s,condition2);

                    }
                    break;
                case 3:
                    boolean condition3 = true;
                    while (condition3){
                        double []side = new double[3];
                        do {
                            System.out.println("请输入三角形的三条边(数字)");
                            side[0] = in.nextDouble();
                            side[1] = in.nextDouble();
                            side[2] = in.nextDouble();
                            Arrays.sort(side);//将输入的三条边按从小到大排序
                            if (!IsTriangle(side)){
                                //三角形的条件是两边之和大于第三边,两边之差小于第三边
                                //边的长度肯定也不能为0
                                System.out.println("输入的三条边不能构成一个三角形,请重新输入");
                            }

                        }while (!IsTriangle(side));//不能构成三角形重新输入循环继续

                        Shape triangle = new Triangle(side[0],side[1],side[2]);//多态向下转型
                        triangle.showGirth();
                        triangle.showArea();
                        System.out.println("是否返回到上一级(Y),输入其他的代表否");
                        String s = in.next();
                        condition3 =  exit(s,condition3);
                    }
                    break;
                case 4:
                    System.out.println("是否确认退出(Y),输入其他的代表否");
                    String s = in.next();
                    isFlag = exit(s,isFlag);
                    break;
                default:
                    System.out.println("输入有误,请重新输入");
                    break;
            }

            whether();
        }
    }
}

下面附上完整代码

import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.Scanner;


public class ClosingProject {
    static boolean isFlag = true;//控制循环退出
    public static void main(String[] args) throws AWTException {//抛出AWT可能出现的异常,下面同理
        CirculatingBody();//调用循环体
    }



    //主菜单
     static void Menu(){
        System.out.println("*********图形面积周长计算系统*********");
        System.out.println("*********请挑选需要进行的操作*********");
        System.out.println("*************1.计算矩形**************");
        System.out.println("*************2.计算圆形**************");
        System.out.println("*************3.计算三角形************");
        System.out.println("*************4.退出******************");

    }
    //退出方法
    static boolean exit(String c,boolean condition){

        if ("y".equalsIgnoreCase(c)){//判断是否为y,equalsIgnoreCase不区分大小写

            condition = false;
            System.out.println("退出成功!");
        }
        else
            System.out.println("继续操作!");
        return condition;
    }

    //清屏函数,利用GUI来实现鼠标事件和键盘事件Ctrl+R
    //我这里设置的清屏快捷键为Ctrl+R,如果快捷键为其他的该方法体内的内容不同

    static void clear()throws AWTException{
        Robot r = new Robot();
        r.mousePress(InputEvent.BUTTON3_DOWN_MASK);//按下鼠标右键
        r.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);//释放鼠标右键
        r.keyPress(KeyEvent.VK_CONTROL);//按下ctrl键
        r.keyPress(KeyEvent.VK_R);//按下R键
        r.keyRelease(KeyEvent.VK_R);//释放R键
        r.keyRelease(KeyEvent.VK_CONTROL);//释放ctrl键
    }

    //是否要清屏
    static void whether() throws AWTException {
        System.out.println("是否清屏(Y),输入其他的代表否");
        System.out.println("注意清屏之后控制台什么提示也没有,需要直接输入一次需要选择操作的序号");
        Scanner in = new Scanner(System.in);
        String s = in.next();
        if ("y".equalsIgnoreCase(s))
            clear();
    }

    //判断输入的格式是否符合矩形
    static boolean IsRectangle(double length,double wide){
        return length > 0 && wide > 0;
    }

    //判断输入是否是圆
    static boolean IsCircle(double radius){
        return radius > 0;
    }

    //判断输入的三条边能否构成三角形
    static boolean IsTriangle(double side[]){
        return side[1] + side[0] > side[2] && side[2] - side[0] < side[1] && side[0] > 0 && side[1] > 0 && side[2] > 0;
    }
    //循环体
    static void CirculatingBody() throws AWTException {
        while (isFlag){
            Scanner in = new Scanner(System.in);
           Menu();
            int n = in.nextInt();
            switch (n){
                case 1:
                    boolean condition1 = true;
                    while (condition1){

                        double length,wide;
                        do {
                            System.out.print("请输入矩形的长和宽(数字):");
                            length = in.nextDouble();
                            wide = in.nextDouble();
                            if (!IsRectangle(length,wide)){
                                System.out.println("输入数据有误,请从新输入");
                            }
                        }while (!IsRectangle(length,wide));//输入数据有误循环继续重新输入

                        Shape rectangle = new Rectangle(length,wide);//多态向下转型
                        rectangle.showArea();
                        rectangle.showGirth();
                        System.out.println("是否返回到上一级(Y),输入其他的代表否");
                        String s = in.next();
                        condition1 = exit(s,condition1);

                    }
                    break;
                case 2:
                    boolean condition2 = true;
                    while (condition2){
                        double radius;
                            do {
                                System.out.println("请输入圆的半径(数字):");
                                radius = in.nextDouble();
                                if (!IsCircle(radius)){
                                    System.out.println("输入有误,请重新输入!");
                                }
                            }while (!IsCircle(radius));//输入有误,重新输入,循环继续

                        Shape circle = new Circle(radius);//多态向下转型
                        circle.showArea();
                        circle.showGirth();
                        System.out.println("是否返回到上一级(Y),输入其他的代表否");
                        String s = in.next();
                        condition2 =  exit(s,condition2);

                    }
                    break;
                case 3:
                    boolean condition3 = true;
                    while (condition3){
                        double []side = new double[3];
                        do {
                            System.out.println("请输入三角形的三条边(数字)");
                            side[0] = in.nextDouble();
                            side[1] = in.nextDouble();
                            side[2] = in.nextDouble();
                            Arrays.sort(side);//将输入的三条边按从小到大排序
                            if (!IsTriangle(side)){
                                //三角形的条件是两边之和大于第三边,两边之差小于第三边
                                //边的长度肯定也不能为0
                                System.out.println("输入的三条边不能构成一个三角形,请重新输入");
                            }

                        }while (!IsTriangle(side));//不能构成三角形重新输入循环继续

                        Shape triangle = new Triangle(side[0],side[1],side[2]);//多态向下转型
                        triangle.showGirth();
                        triangle.showArea();
                        System.out.println("是否返回到上一级(Y),输入其他的代表否");
                        String s = in.next();
                        condition3 =  exit(s,condition3);
                    }
                    break;
                case 4:
                    System.out.println("是否确认退出(Y),输入其他的代表否");
                    String s = in.next();
                    isFlag = exit(s,isFlag);
                    break;
                default:
                    System.out.println("输入有误,请重新输入");
                    break;
            }

            whether();
        }
    }
}

//父类图形
abstract class Shape{

    abstract double Area();
    abstract double Girth();
    abstract void showArea();
    abstract void showGirth();
}

//子类矩形
class Rectangle extends Shape{
    double length;
    double wide;

    public Rectangle(double length, double wide) {
        this.length = length;
        this.wide = wide;
    }

    @Override
    double Area() {
        return length*wide;
    }

    @Override
    double Girth() {
        return 2*(length+wide);
    }

    @Override
    void showArea() {
        System.out.printf("The area of the rectangle:"+"%.2f", Area());
        System.out.println();
    }

    @Override
    void showGirth() {
        System.out.printf("The girth of the rectangle:" +"%.2f", Girth());
        System.out.println();
    }
}
//子类圆形
class Circle extends Shape{
    double radius;
    final double PI = 3.14;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double Area() {
        return PI*radius*radius;
    }

    @Override
    double Girth() {
        return 2*PI*radius;
    }

    @Override
    void showArea() {
        System.out.printf("The girth of the circle:"+"%.2f", Area());
        System.out.println();
    }

    @Override
    void showGirth() {
        System.out.printf("The girth of the circle:" +"%.2f", Girth());
        System.out.println();
    }
}
//子类三角形
class Triangle extends Shape{
    double a,b,c;

    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    double Girth() {
        return a + b + c;
    }

    @Override
    double Area() {
        return Math.sqrt(this.Girth()*(this.Girth()-a)*(this.Girth()-b)*(this.Girth()-c));
    }

    @Override
    void showArea() {
        System.out.printf("The girth of the triangle:" +"%.2f", Area());
        System.out.println();
    }

    @Override
    void showGirth() {
        System.out.printf("The girth of the triangle:" +"%.2f", Girth());
        System.out.println();
    }
}

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值