通过所学的java知识对基本的通用类知识进行运用,包括类,对象,方法等设计一个快递运费计算项目程序并讲解每段代码的功能
一、项目设计背景
我们寄快递时,快递公司都会根据所寄货物的重量和目的地来计算运费,收费标准根据每个地区的标准进行计费
区域编号 | 快件到达地 | 首重1kg/元 | 续重1kg/元 |
---|---|---|---|
1 | 广西、广东 | 10 | 5 |
2 | 安徽、湖南、江苏、浙江… | 12 | 8 |
3 | 北京、天津、陕西、河北… | 15 | 10 |
4 | 青海、宁夏、甘肃、辽宁… | 18 | 12 |
5 | 西藏、新疆 | 30 | 25 |
二、项目目标
根据上述场景,设计一个“快递运费计算程序”,使程序的操作人员(如收费员等)可以通过简单地输入货物的重量和目的地,即可计算出快递的费用。
三、项目设计要求
- 能够对操作人员的身分进行验证(最多多输入3 次)
- 能计算若干个快递货物的费用,直到操作人员让它停止为止
- 能够方便地录入货物信息
- 能够自动识别出货物所在的收费段,计算出运费
- 能够显示货物信息及其运费
根据以上要求写一个含ExpressSystem、Cargo、CargoHandle、FreshCargoHandle类的代码
ExpressSystem类:
开头代码:
package src;
import java.util.Scanner;
这是一个Java程序的导入语句,它导入了java.util包中的Scanner类。Scanner类是Java的一个工具类,用于获取用户的输入。
public class ExpressSystem {
private CargoHandler cargoHandler;
private FreshCargoHandler freshCargoHandler;
private static final int PASSWORD = 1234;
private String password;
private boolean flag;
private int n; //操作选项
private int type; //货物类型
private int house; //仓库编号
这是一个名为ExpressSystem的Java类,它包含以下成员变量:
- cargoHandler:CargoHandler类型的对象,用于处理普通货物。
- freshCargoHandler:FreshCargoHandler类型的对象,用于处理新鲜货物。
- PASSWORD:一个静态常量,表示系统密码,值为1234。
- password:一个字符串,表示用户输入的密码。
- flag:一个布尔值,表示操作是否成功。
- n:一个整数,表示用户选择的操作选项。
- type:一个整数,表示货物类型。
- house:一个整数,表示冷藏时间。
public ExpressSystem() {
this.cargoHandler = new CargoHandler();
this.freshCargoHandler = new FreshCargoHandler();
}
这是一个ExpressSystem类的构造方法,它初始化了cargoHandler和freshCargoHandler两个成员变量。在这个方法中,分别创建了一个CargoHandler对象和一个FreshCargoHandler对象,并将它们分别赋值给cargoHandler和freshCargoHandler。
public void login() {
Scanner scanner = new Scanner(System.in);
flag = false;
n = 0;
while (n < 3 && !flag) {
System.out.print("请输入操作密码: ");
password = scanner.nextLine();
if (password.equals(String.valueOf(PASSWORD))) {
flag = true;
System.out.println("密码正确!");
} else {
n++;
System.out.println("密码输入错误,请重新输入!");
}
}
if (!flag) {
System.out.println("三次密码输入错误,程序退出: 0");
System.exit(0);
}
// scanner.close();
}
这是一个名为login的方法,它用于实现用户登录功能。在这个方法中,首先创建了一个Scanner对象,用于获取用户的输入。然后定义了一个flag变量,表示登录是否成功,初始值为false。接着定义了一个n变量,表示用户已经尝试了多少次登录,初始值为0。
接下来是一个while循环,条件是n小于3且flag为false。在循环中,首先提示用户输入密码,并使用scanner.nextLine()方法获取用户输入的密码。然后将用户输入的密码与PASSWORD常量进行比较,如果相等,则将flag设置为true,并输出“密码正确!”;否则,将n加1,并输出“密码输入错误,请重新输入!”。
循环结束后,判断flag是否为true,如果不为true,则说明用户三次输入密码都不正确,程序退出。最后,注释掉了scanner.close()方法,因为Scanner对象在使用完毕后会自动关闭,不需要手动关闭。
public void showMenu() {
Scanner scanner = new Scanner(System.in);
int choice;
这是一个名为showMenu的方法,它用于显示菜单并处理用户输入。在这个方法中,首先创建了一个Scanner对象,用于获取用户的输入。然后定义了一个choice变量,表示用户选择的菜单项。
do {
System.out.println("\n---快递运费费用计算程序---");
System.out.println("1. 选择货物类型");
System.out.println("2. 货物数据录入");
System.out.println("3. 计算运费");
System.out.println("4. 货物信息显示");
System.out.println("0. 退出程序");
System.out.print("输入选择:");
choice = scanner.nextInt();
System.out.println();
switch (choice) {
case 0: //
System.out.println("退出程序。");
break;
case 1: //用户选择选择货物类型,则让用户选择货物类型
Scanner sc1 = new Scanner(System.in);
System.out.print("1. 无需保鲜\n2. 需要保鲜\n请选择货物类型:");
int sc6 = sc1.nextInt();
if (sc6 != 1 && sc6 != 2) {
System.out.print("输入错误");
showMenu();
break;
} else {
type = sc6;// 将货物类型保存到变量type中
showMenu();
break;
}
case 2: //用户选择货物数据录入,则根据货物类型调用相应的方法进行数据录入
if (type == 1) {
Scanner sc2 = new Scanner(System.in);
System.out.print("请输入货物编号:");
long no = sc2.nextLong();
System.out.print("请输入寄件人姓名:");
String name = sc2.next();
System.out.print("请输入寄件人电话:");
long phone = sc2.nextLong();
System.out.print("请输入收件地址:");
String receiverAddress = sc2.next();
System.out.print("请输入收件人姓名:");
String receiverName = sc2.next();
System.out.print("请输入收件人电话:");
long receiverPhone = sc2.nextLong();
System.out.print("请输入货物重量:");
double weight = sc2.nextDouble();
cargoHandler.inputData(no, name, phone, receiverAddress, receiverName, receiverPhone, weight);
} else {
Scanner sc2 = new Scanner(System.in);
System.out.print("请输入货物编号:");
long no = sc2.nextLong();
System.out.print("请输入寄件人姓名:");
String name = sc2.next();
System.out.print("请输入寄件人电话:");
long phone = sc2.nextLong();
System.out.print("请输入收件地址:");
String receiverAddress = sc2.next();
System.out.print("请输入收件人姓名:");
String receiverName = sc2.next();
System.out.print("请输入收件人电话:");
long receiverPhone = sc2.nextLong();
System.out.print("请输入货物重量:");
double weight = sc2.nextDouble();
System.out.print("请输入货物保鲜小时:");
int house = sc2.nextInt();
freshCargoHandler.inputData(no, name, phone, receiverAddress, receiverName, receiverPhone, weight, house);
}
showMenu();
break;
case 3: //用户选择计算运费,则根据货物类型调用相应的方法进行运费计算
if (type == 1) {
cargoHandler.computeCharge(cargoHandler.cargo.weight, cargoHandler.cargo.receiverAddress);
cargoHandler.showCharge();
} else {
freshCargoHandler.computeCharge(freshCargoHandler.cargo.weight, freshCargoHandler.cargo.receiverName, house);
freshCargoHandler.showCharge();
}
showMenu();
break;
case 4: //用户选择货物信息显示,则根据货物类型调用相应的方法进行信息显示
if (type == 1) {
cargoHandler.showMessage();
} else {
freshCargoHandler.showMessage();
}
showMenu();
break;
default:
System.out.println("输入错误,请重新输入。");
break;
}
} while (choice < 0 || choice > 4);
scanner.close(); //关闭Scanner对象。
}
接下来是一个do-while循环,条件是choice小于0或大于4。在循环中,首先输出菜单选项,并提示用户输入选择。然后使用scanner.nextInt()方法获取用户输入的选择,并将其赋值给choice变量。
接着是一个switch语句,根据用户选择的菜单项进行相应的操作。如果用户选择退出程序,则输出提示信息并结束程序;如果用户选择选择货物类型,则让用户选择货物类型;如果用户选择货物数据录入,则根据货物类型调用相应的方法进行数据录入;如果用户选择计算运费,则根据货物类型调用相应的方法进行运费计算;如果用户选择货物信息显示,则根据货物类型调用相应的方法进行信息显示。
最后,关闭Scanner对象。
接下来是CargoHandler类
public class CargoHandler {
Cargo cargo;
int area;
public CargoHandler() {
cargo = new Cargo();
}
public void inputData(long no, String name, long phone, String receiverAddress, String receiverName, long receiverPhone, double weight) {
// 要求输入货物编号、寄件人信息、收件人信息、收货地址及货物重量,选择收货区域以便计算运费
cargo.no = no;
cargo.name = name;
cargo.phone = phone;
cargo.receiverAddress = receiverAddress;
cargo.receiverName = receiverName;
cargo.receiverPhone = receiverPhone;
cargo.weight = weight;
computeCharge(weight, receiverAddress); // 该方法调用computeCharge方法计算运费
}
这段代码是一个名为CargoHandler的Java类,其中包含一个Cargo类型的成员变量cargo和一个整型成员变量area。CargoHandler类有一个构造函数,用于初始化cargo对象。inputData方法用于接收货物编号、寄件人信息、收件人信息、收货地址及货物重量等参数,并将这些参数赋值给cargo对象的相应属性。最后,该方法调用computeCharge方法计算运费。
public void computeCharge(double weight, String receiverAddress) {
// 根据货物的重量及所在区域计算货物的运费,并将计算结果保存到货物信息中
List<String> parts = List.of(
"广西", "广东", // 0 -1
"安徽", "湖南", "江苏", "浙江", "上海", "江西", "贵州", "湖北", "山西", "福建", "河南", "云南", "重庆", "四川", // 2-15
"北京", "天津", "陕西", "河北", "山东", "海南", // 16-21
"青海", "宁夏", "甘肃", "辽宁", "吉林", "黑龙江", "内蒙古", // 22-28
"西藏", "新疆" // 29-30
);
int partsChoice = parts.indexOf(receiverAddress);
// 这段代码是获取收件地址在parts列表中的索引值,将其赋值给变量partsChoice。
if (partsChoice == 0 || partsChoice == 1) {
if (weight > 1) {
cargo.charge = 10 + (weight - 1) * 5;
} else {
cargo.charge = 10;
}
} else if (partsChoice >= 2 && partsChoice <= 15) {
if (weight > 1) {
cargo.charge = 12 + (weight - 1) * 8;
} else {
cargo.charge = 12;
}
} else if (partsChoice >= 16 && partsChoice <= 21) {
if (weight > 1) {
cargo.charge = 15 + (weight - 1) * 10;
} else {
cargo.charge = 15;
}
} else if (partsChoice >= 22 && partsChoice <= 28) {
if (weight > 1) {
cargo.charge = 18 + (weight - 1) * 12;
} else {
cargo.charge = 18;
}
} else if (partsChoice >= 29 && partsChoice <= 30) {
if (weight > 1) {
cargo.charge = 30 + (weight - 1) * 25;
} else {
cargo.charge = 30;
}
}
}
这段代码是一个名为computeCharge的方法,用于根据货物的重量及所在区域计算货物的运费,并将计算结果保存到货物信息中。该方法接收两个参数:货物重量weight和收货地址receiverAddress。方法内部定义了一个parts列表,其中包含了不同地区的名称。然后通过indexOf方法获取收货地址在parts列表中的索引值,将其赋值给变量partsChoice。接下来,根据partsChoice的值以及货物重量,计算出相应的运费并保存到cargo对象的charge属性中。
public void showMessage() {
// 将货物编号、货物所有者、货物重量以及货物运费在屏幕上显示出来
System.out.println(
"货物编号:" + cargo.no + "\n" +
"货物寄件人:" + cargo.name + "\n" +
"货物收货人:" + cargo.receiverName + "\n" +
"货物重量:" + cargo.weight + "\n" +
"货物运费:" + cargo.charge
);
}
public void showCharge() {
System.out.println("运费为:" + cargo.charge);
}
}
这段代码是一个名为showMessage的方法,用于将货物编号、货物所有者、货物重量以及货物运费在屏幕上显示出来。方法内部使用了System.out.println()方法来输出这些信息。
另外还有一个名为showCharge的方法,用于仅显示货物的运费。
第三个是继承CargoHandler类的FreshCargoHandler类
package src;
import java.util.List;
public class FreshCargoHandler extends CargoHandler{
int house;
public FreshCargoHandler(){
cargo = new Cargo();
}
public void inputData(long no, String name, long phone, String receiverAddress, String receiverName, long receiverPhone, double weight, int house) {
super.inputData(no, name, phone, receiverAddress, receiverName, receiverPhone, weight);
computeCharge(weight, receiverAddress, house);
}
public void computeCharge(double weight, String receiverAddress, int house) {
List<String> parts = List.of(
"广西", "广东", // 0-1
"安徽", "湖南", "江苏", "浙江", "上海", "江西", "贵州", "湖北", "山西", "福建", "河南", "云南", "重庆", "四川", // 2-15
"北京", "天津", "陕西", "河北", "山东", "海南", // 16-21
"青海", "宁夏", "甘肃", "辽宁", "吉林", "黑龙江", "内蒙古", // 22-28
"西藏", "新疆" // 29-30
);
int partsChoice = parts.indexOf(receiverAddress);
if (partsChoice == 0 || partsChoice == 1) {
if (weight > 1) {
cargo.charge = 10 + (weight - 1) * 5 + house * 10;
} else {
cargo.charge = 10;
}
} else if (partsChoice >= 2 && partsChoice <= 15) {
if (weight > 1) {
cargo.charge = 12 + (weight - 1) * 8 + house * 10;
} else {
cargo.charge = 12;
}
} else if (partsChoice >= 16 && partsChoice <= 21) {
if (weight > 1) {
cargo.charge = 15 + (weight - 1) * 10 + house * 10;
} else {
cargo.charge = 15;
}
} else if (partsChoice >= 22 && partsChoice <= 28) {
if (weight > 1) {
cargo.charge = 18 + (weight - 1) * 12 + house * 10;
} else {
cargo.charge = 18;
}
} else if (partsChoice >= 29 && partsChoice <= 30) {
if (weight > 1) {
cargo.charge = 30 + (weight - 1) * 25 + house * 10;
} else {
cargo.charge = 30;
}
}
}
这段代码是一个名为FreshCargoHandler的类,它继承了CargoHandler类。这个类主要用于处理新鲜货物的信息,包括货物编号、寄件人、收货人、重量、运费等。其中,computeCharge方法用于计算运费,根据货物的重量、收货地址和房屋数量来计算运费。
public void showMessage() {
super.showMessage();
}
public void showCharge() {
super.showCharge();
}
}
showMessage方法用于显示货物信息,showCharge方法用于显示货物运费。这两个方法都调用了父类CargoHandler中的同名方法。
最后Cargo类
package src;
public class Cargo {
long no, phone, receiverPhone;
String name, receiverAddress, receiverName;
double weight, charge;
}
这是一个名为Cargo的Java类,包含以下属性:
- no(货物编号)
- phone(寄件人电话)
- receiverPhone(收货人电话)
- name(寄件人姓名)
- receiverAddress(收货人地址)
- receiverName(收货人姓名)
- weight(货物重量)
- charge(货物运费)
以上是本次项目的程序编写及代码解释和功能的讲述运用本学期所学内容。