项目背景与目的
在日常生活中,我们经常需要寄送快递,而快递公司通常会根据货物的重量和目的地来计算运费。本次项目旨在设计一个Java程序,实现一个简易的快递运费计算系统。该系统能够根据用户输入的货物重量和目的地,自动计算并显示运费。
项目设计要求
- 身份验证:程序应验证操作员身份,最多允许输入3次。
// 身份验证 private static boolean authenticateOperator(Scanner scanner) { int attempts = 0; while (attempts < 3) { System.out.print("请输入用户名:"); String username = scanner.nextLine(); System.out.print("请输入密码:"); String password = scanner.nextLine(); if (OPERATOR_USERNAME.equals(username) && OPERATOR_PASSWORD.equals(password)) { return true; } attempts++; System.out.println("用户名或密码错误,您还有" + (2 - attempts) + "次尝试机会。"); } return false; }
- 费用计算:程序能计算若干个快递货物的费用,直到用户选择退出。
// 计算运费 private static double calculateFee(PackageInfo packageInfo) { // 假设根据destination从FEE_RANGES中获取对应的FeeRange // 这里为了简化,我们直接遍历(实际中应使用更高效的方法) for (Map.Entry<String, FeeRange> entry : FEE_RANGES.entrySet()) { if (entry.getKey().contains(packageInfo.getDestination())) { FeeRange feeRange = entry.getValue(); if (packageInfo.getWeight() <= 1) { return feeRange.getFirstKgPrice(); } else { return feeRange.getFirstKgPrice() + (packageInfo.getWeight() - 1) * feeRange.getAdditionalKgPrice(); } } } throw new IllegalArgumentException("Unknown destination: " + packageInfo.getDestination()); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
- 数据录入:用户应能方便地录入货物信息。
// 录入货物信息 PackageInfo packageInfo = new PackageInfo(); System.out.print("请输入目的地:"); packageInfo.setDestination(scanner.nextLine()); System.out.print("请输入重量(kg):"); packageInfo.setWeight(scanner.nextDouble()); scanner.nextLine(); // 消耗换行符
- 自动识别:程序能自动识别货物所在的收费段,并计算运费。
// 计算运费 double fee = calculateFee(packageInfo);
- 结果显示:程序应显示货物信息及其运费。
// 显示结果 System.out.println("目的地:" + packageInfo.getDestination()); System.out.println("重量:" + packageInfo.getWeight() + "kg"); System.out.println("运费:" + fee + "元"); // 假设用户可以选择继续或退出... System.out.print("是否继续?(y/n):"); String choice = scanner.nextLine(); if ("n".equalsIgnoreCase(choice))
程序模块结构
- 操作员登录
- 显示程序菜单
- 用户输入选择操作项目
- 录入数据
- 计算运费
- 输出结果
- 退出程序
相关代码实现
1. 显示程序菜单
public void displayMenu() {
System.out.println("--- 快递运费计算程序 ---");
System.out.println("1. 货物数据录入");
System.out.println("2. 计算运费");
System.out.println("3. 货物信息显示");
System.out.println("0. 退出程序");
}
2. 验证操作人员身份(此处简化,不实现完整验证逻辑)
// 假设验证逻辑,实际项目中应实现完整验证
public boolean validateOperator() {
// 这里简化处理,直接返回true表示验证通过
return true;
}
3. 录入数据(货物重量和目的地)
public PackageData inputData() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入货物重量(KG): ");
double weight = scanner.nextDouble();
System.out.print("请输入目的地(省份): ");
String destination = scanner.next();
return new PackageData(weight, destination);
}
4. 计算运费(根据目的地和重量)
public double calculateShippingFee(PackageData packageData) {
// 这里使用Map存储费用和目的地对应关系
Map<String, double[]> fees = new HashMap<>();
// ... 初始化费用Map ...
double[] feeRates = fees.getOrDefault(packageData.getDestination(), new double[]{30, 25}); // 默认费用
double baseFee = feeRates[0];
double additionalFee = feeRates[1];
double shippingFee = 0;
if (packageData.getWeight() <= 1) {
shippingFee = baseFee;
} else {
shippingFee = baseFee + (packageData.getWeight() - 1) * additionalFee;
}
return shippingFee;
}
5. 输出结果
public void outputResult(PackageData packageData, double shippingFee) {
System.out.println("货物信息:");
System.out.println("重量: " + packageData.getWeight() + "KG");
System.out.println("目的地: " + packageData.getDestination());
System.out.println("运费: " + shippingFee + "元");
}
具体代码如下:
import java.util.Scanner;
public class ExpressFeeCalculator {
// 省略身份验证部分代码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
displayMenu(); // 显示程序菜单
System.out.print("请选择操作:");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
// 货物数据录入及运费计算逻辑
// 省略详细代码
break;
case 2:
// 假设已经录入了货物数据,直接计算并显示运费
// 省略详细代码
break;
case 3:
// 显示已录入的货物信息及其运费
// 省略详细代码
break;
case 0:
running = false; // 退出程序
System.out.println("程序已退出。");
break;
default:
System.out.println("无效的选择,请重新选择。");
}
}
scanner.close();
}
// 显示程序菜单的方法
private static void displayMenu() {
System.out.println("--- 快递运费计算程序 ---");
System.out.println("1. 货物数据录入");
System.out.println("2. 计算运费");
System.out.println("3. 货物信息显示");
System.out.println("0. 退出程序");
}
// ... 其他相关方法(如计算运费、录入数据等)
}
学习收获与心得
通过本次项目,我深入学习了Java编程语言的基本语法和面向对象编程的概念。在实现过程中,我遇到了不少挑战,比如如何设计合理的程序结构、如何处理用户输入、如何实现身份验证等。通过不断地调试和修改代码,我逐渐掌握了Java编程的技巧和方法。
此外,我也意识到了编程的严谨性和逻辑性。在编写代码时,我需要仔细考虑每一个细节,确保程序的正确性和稳定性。同时,我也学会了如何借助互联网和书籍等资源,解决编程过程中遇到的问题。
总之,本次项目让我受益匪浅,不仅提高了我的编程能力,还锻炼了我的逻辑思维和解决问题的能力。我相信,在今后的学习和工作中,我会更加努力地学习和实践,不断提高自己的编程水平。