(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();
();
}
}
2、接口( ):
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、接口实现类( ):
package Ticket;
import ;
import static ;
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();
("Please enter weight in KG (with two decimal places):");
try {
weight = ();
break;
} catch (Exception e) {
("输入信息不符合要求,请重新输入!");
}
}
if (weight < 30) {
("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]);
("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;
= flag;
while (true) {
scanner = new Scanner();
if (flag == 0) {
("Please enter '1' or '2' (1:domestic, 2:foreigner):");
} else if (flag == 1) {
("Please enter '1' or '2' (1:disabled, 2:healthy):");
} else if (flag == 2) {
("Please enter '1' or '2' (1:first class, 2:other classes):");
}
//捕捉两个异常,一个是异常,一个是自定义异常
try {
input = ();
(input);
break;
} catch (Exception e) {
("输入信息不符合要求,请重新输入!");
}
}
return input;
}
}
4、自定义异常类( ):
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();
}
}
}