接口实现飞机订票系统的一个需求(托运价格计算),需求如下:

(1) 乘客可以免费托运重量不超过30kg(含30kg)的行李。
(2) 假设行李超过30kg,其收费标准为:

  • 头等舱国内乘客,超重部分每千克收费4元。
  • 其他舱国内乘客,超重部分每千克收费6元。
  • 外国乘客:超重部分每千克比国内乘客多1倍。
  • 残疾乘客:为正常价格的半价。

(3) 行李重量超出部分,不满1kg的按照1kg计算。

代码实现如下:

1、main方法:

package Ticket;

public class Test {
    public static void main(String[] args) {

        ICalcTicket ct = new CalcTicketImpl();
        ct.CalcTicket();

    }
}

2、接口( ICalcTicket.java ):

package Ticket;

public interface ICalcTicket {

    void CalcTicket();
    
    int levelselect(int x, int y, int level, int moreweight);
    
    int TotalMoney(double weight, int nation, int health, int level);
    
    int IsTrue(int flag);

}

3、接口实现类( CalcTicketImpl.java ):

package Ticket;

import java.util.Scanner;

import static java.lang.Math.ceil;

public class CalcTicketImpl implements ICalcTicket {

    private int flag = 0;
    private int money = 0;
    private double weight;
    private int moreweight;
    Scanner scanner = null;
    int[] a = new int[3];
    FormatJudge fj = new FormatJudge();

    public void CalcTicket() {

        while (true) {
            scanner = new Scanner(System.in);
            System.out.println("Please enter weight in KG (with two decimal places):");
            try {
                weight = scanner.nextDouble();
                break;
            } catch (Exception e) {
                System.out.println("输入信息不符合要求,请重新输入!");
            }
        }
        if (weight < 30) {
            System.out.println("Your luggage will be free to carry!");
        } else {

            //调用IsTrue方法输入国籍,健康状况,舱位等级,并将返回值存入数组,作为调用TotalMoney时传入的三个参数
            for (flag = 0; flag <= 2; flag++) {
                int input = IsTrue(flag);
                a[flag] = input;
            }
            money = TotalMoney(weight, a[0], a[1], a[2]);
            System.out.println("You should pay ¥ " + money + " .");
        }

    }

    //舱位等级判断
    public int LevelSelect(int x, int y, int level, int moreWeight) {
        
        switch (level) {
            case 1:  //first class
                money = moreWeight * x;
                break;
            case 2:  //other classes
                money = moreWeight * y;
                break;
            default:
                break;
        }
        return money;
    }

    //计算运费
    public int TotalMoney(double weight, int nation, int health, int level) {

        moreweight = (int) ceil(weight - 30);
        if (nation == 1) {    //domestic
            if (health == 1) {    //disabled
                money = LevelSelect(2, 3, level, moreweight);
            } else {    //healthy
                money = LevelSelect(4, 6, level, moreweight);
            }
        } else {  //foreigner
            if (health == 1) {  //disabled
                money = LevelSelect(4, 6, level, moreweight);
            } else {  //healthy
                money = LevelSelect(8, 12, level, moreweight);
            }
        }
        return money;
    }

    //输入国籍,健康状况,舱位等级三个参数并捕捉输入异常
    public int IsTrue(int flag) {
        int input;
        this.flag = flag;

        while (true) {
            scanner = new Scanner(System.in);
            if (flag == 0) {
                System.out.println("Please enter '1' or '2' (1:domestic, 2:foreigner):");
            } else if (flag == 1) {
                System.out.println("Please enter '1' or '2' (1:disabled, 2:healthy):");
            } else if (flag == 2) {
                System.out.println("Please enter '1' or '2' (1:first class, 2:other classes):");
            }

            //捕捉两个异常,一个是scanner.nextInt异常,一个是自定义异常
            try {
                input = scanner.nextInt();
                fj.judge(input);
                break;
            } catch (Exception e) {
                System.out.println("输入信息不符合要求,请重新输入!");
            }
        }
        return input;
    }
}

4、自定义异常类( FormatException.java ):

package Ticket;

//自定义异常
public class FormatException extends Exception {
    public FormatException() {
        super();
    }
}

//将输入的值是int类型但不是1或2的异常抛出
class FormatJudge {
    public void judge(int m) throws FormatException {
        if (m != 1 && m != 2) {
            throw new FormatException();
        }
    }
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值