
在开发交互式应用程序时,我们经常需要处理用户输入、执行复杂的计算,并将结果清晰地展示给用户。本教程将以一个度假村预订系统为例,演示如何使用java语言,通过结构化的方法、循环控制和变量累加,实现对多位客人度假费用的精确计算与汇总。我们将从原始代码中存在的问题出发,逐步修正并优化,最终提供一个健壮且易于理解的解决方案。
原始代码在实现度假村费用计算时,主要面临以下几个挑战:
为了确保费用的准确计算,我们首先需要修正 calculateRoomCost、calculateMealPlan 和 getActivitiesCost 这三个方法内部的逻辑。这些方法应根据用户的选择返回对应的固定费用,而不是将选择值本身用于乘法。
该方法负责计算房间费用。它接收总住宿晚数作为参数,并根据用户的房间选择返回对应的总房间费用。
原始问题: 原始代码将用户输入的 cost (即选择的房间类型,1、2或3) 与 100.00、200.00、300.00 相乘,并且 if 条件判断的是 nights 而非 cost,这导致了严重的逻辑错误。
修正后的逻辑: 根据用户选择(1、2或3),确定每晚的房间价格,然后乘以总住宿晚数。
public static double calculateRoomCost(int totalNights) {
    System.out.println("1: Standard Room no view $100/night");
    System.out.println("2: Luxury Room with view $200/night");
    System.out.println("3: Luxury Room with Balcony $300/night");
    System.out.print("Please enter your choice: ");
    int choice = input.nextInt(); // 获取用户选择
    double roomRatePerNight = 0;
    switch (choice) {
        case 1:
            roomRatePerNight = 100.00;
            break;
        case 2:
            roomRatePerNight = 200.00;
            break;
        case 3:
            roomRatePerNight = 300.00;
            break;
        default:
            System.out.println("Invalid room choice. Defaulting to Standard Room.");
            roomRatePerNight = 100.00; // 默认值或错误处理
            break;
    }
    return roomRatePerNight * totalNights; // 返回总房间费用
}该方法负责计算餐饮费用。它接收总住宿晚数作为参数,并根据用户的餐饮计划选择返回对应的总餐饮费用。
立即学习“Java免费学习笔记(深入)”;
原始问题: 与 calculateRoomCost 类似,原始代码将用户输入的 x (即选择的餐饮计划,1、2、3或4) 与价格相乘,且 if 条件判断的是 nights 而非 x,同样存在逻辑错误。
修正后的逻辑: 根据用户选择(1、2、3或4),确定每晚的餐饮价格,然后乘以总住宿晚数。
public static double calculateMealPlan(int totalNights) {
    System.out.println("1: Lunch & Dinner only $65");
    System.out.println("2: 3-Meals a day $150");
    System.out.println("3: 3-Meals a day with drinks $225");
    System.out.println("4: No meal plan $0");
    System.out.print("Please enter your choice: ");
    int choice = input.nextInt(); // 获取用户选择
    double mealCostPerNight = 0;
    switch (choice) {
        case 1:
            mealCostPerNight = 65.00;
            break;
        case 2:
            mealCostPerNight = 150.00;
            break;
        case 3:
            mealCostPerNight = 225.00;
            break;
        case 4:
            mealCostPerNight = 0;
            break;
        default:
            System.out.println("Invalid meal plan choice. Defaulting to No meal plan.");
            mealCostPerNight = 0; // 默认值或错误处理
            break;
    }
    return mealCostPerNight * totalNights; // 返回总餐饮费用
}该方法负责获取用户选择的活动费用。它不接收额外参数,并根据用户的活动选择返回对应的活动费用。特殊地,选择“6: That's all--Done!”时,应返回一个特殊值(例如6),以作为循环终止的信号。
原始问题: 原始代码将用户输入的 loop (即选择的活动,1、2、3、4或5) 与价格相乘,这是错误的。例如,选择“1: Scuba Adventure $300”时,应返回 $300,而不是 1 * 300。
修正后的逻辑: 根据用户选择(1到5),直接返回对应的活动价格。选择6时,返回6作为退出信号。
public static double getActivitiesCost() {
    System.out.println("Choose from these activities");
    System.out.println("1: Scuba Adventure $300");
    System.out.println("2: Island Shopping Hop $100");
    System.out.println("3: Paddle Boarding $125");
    System.out.println("4: Deep Sea Fishing $500");
    System.out.println("5: Beach Sitting $0");
    System.out.println("6: That's all--Done!");
    System.out.print("Please enter your choice: ");
    int choice = input.nextInt(); // 获取用户选择
    switch (choice) {
        case 1:
            return 300.00;
        case 2:
            return 100.00;
        case 3:
            return 125.00;
        case 4:
            return 500.00;
        case 5:
            return 0;
        case 6:
            return 6; // 特殊值,表示活动选择结束
        default:
            System.out.println("Invalid activity choice. Please try again.");
            return -1; // 表示无效选择,可能需要重新输入
    }
}main 方法是程序的入口点,它将协调用户输入、调用上述费用计算方法并累加总费用,最终展示结果。
在 main 方法开始时,我们需要初始化一个 sum 变量来累加总费用,并获取客人数量和住宿晚数。
public static void main(String[] args) {
    double totalCost = 0; // 使用更清晰的变量名
    // display welcome
    System.out.println("Welcome to Likuliku Lagoon Resort - Malolo Island, Fiji.\n");
    System.out.println("Please enter number of guests: ");
    int numberOfGuests = input.nextInt();
    System.out.println("How many nights will you be staying? ");
    int totalNights = input.nextInt();使用 for 循环遍历每一位客人。在每次循环中,收集该客人的房间、餐饮和活动费用。
    for (int i = 0; i < numberOfGuests; i++) {
        System.out.println("-------------------------------------------------------------------");
        System.out.println("Start entering details for guest #" + (i + 1));
        // 累加房间和餐饮费用
        totalCost += calculateRoomCost(totalNights);
        totalCost += calculateMealPlan(totalNights);
        // 处理活动费用,直到用户选择“完成”
        double activityChoice = 0;
        while (activityChoice != 6) {
            activityChoice = getActivitiesCost();
            // 只有当选择不是“完成”且是有效选择时,才将活动费用累加到总费用中
            if (activityChoice != 6 && activityChoice != -1) {
                totalCost += activityChoice;
            }
        }
    }关键点:
循环结束后,totalCost 变量将包含所有客人的总费用。我们可以根据此值计算并显示总费用和人均每晚平均费用。
    System.out.println("-------------------------------------------------------------------");
    System.out.printf("The total cost estimate $%.2f%n", totalCost);
    // 计算人均每晚费用
    if (numberOfGuests > 0 && totalNights > 0) {
        double averageNightlyCostPerPerson = totalCost / numberOfGuests / totalNights;
        System.out.printf("The average nightly cost per person is $%.2f%n", averageNightlyCostPerPerson);
    } else {
        System.out.println("Cannot calculate average nightly cost (guests or nights is zero).");
    }
} // end main关键点:
下面是整合了所有修正和优化的完整 Java 代码:
import java.util.Scanner;
public class Problem {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        double totalCost = 0;以上就是Java程序:多客人度假费用计算与汇总教程的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号