首页 > Java > java教程 > 正文

Java程序:多客人度假费用计算与汇总教程

心靈之曲
发布: 2025-09-20 13:29:28
原创
528人浏览过

Java程序:多客人度假费用计算与汇总教程

本教程详细讲解如何使用Java构建一个度假村费用计算系统,实现对多位客人的住宿、餐饮和活动费用进行循环处理、累加汇总,并最终展示总费用及人均每晚费用。文章将重点阐述如何正确设计方法间的参数传递、累加逻辑,并修正原始代码中存在的计算错误,提供结构清晰、功能完整的解决方案。

引言

在开发交互式应用程序时,我们经常需要处理用户输入、执行复杂的计算,并将结果清晰地展示给用户。本教程将以一个度假村预订系统为例,演示如何使用java语言,通过结构化的方法、循环控制和变量累加,实现对多位客人度假费用的精确计算与汇总。我们将从原始代码中存在的问题出发,逐步修正并优化,最终提供一个健壮且易于理解的解决方案。

核心问题解析

原始代码在实现度假村费用计算时,主要面临以下几个挑战:

  1. 多客人循环处理: 系统需要能够根据用户输入的客人数量,重复执行费用选择和计算过程。
  2. 方法间数据传递与汇总: 各个费用计算方法(如房间、餐饮、活动)需要将计算结果返回给主程序,并由主程序进行累加。特别是活动费用,其选择同时作为循环终止条件,需要特殊处理。
  3. 结果展示: 最终需要向用户展示总费用以及人均每晚的平均费用。
  4. 方法内部逻辑错误: 原始代码中,calculateRoomCost、calculateMealPlan 和 getActivitiesCost 方法在根据用户选择计算费用时,存在将用户选择值(1、2、3等)直接作为乘数进行计算的逻辑错误,导致费用计算不准确。

方法实现与修正

为了确保费用的准确计算,我们首先需要修正 calculateRoomCost、calculateMealPlan 和 getActivitiesCost 这三个方法内部的逻辑。这些方法应根据用户的选择返回对应的固定费用,而不是将选择值本身用于乘法。

calculateRoomCost 方法详解及修正

该方法负责计算房间费用。它接收总住宿晚数作为参数,并根据用户的房间选择返回对应的总房间费用。

原始问题: 原始代码将用户输入的 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; // 返回总房间费用
}
登录后复制

calculateMealPlan 方法详解及修正

该方法负责计算餐饮费用。它接收总住宿晚数作为参数,并根据用户的餐饮计划选择返回对应的总餐饮费用。

立即学习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; // 返回总餐饮费用
}
登录后复制

getActivitiesCost 方法详解及修正

该方法负责获取用户选择的活动费用。它不接收额外参数,并根据用户的活动选择返回对应的活动费用。特殊地,选择“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 方法是程序的入口点,它将协调用户输入、调用上述费用计算方法并累加总费用,最终展示结果。

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483
查看详情 豆包AI编程

初始化与用户输入

在 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;
            }
        }
    }
登录后复制

关键点:

  • for 循环确保了为每位客人收集信息。
  • calculateRoomCost(totalNights) 和 calculateMealPlan(totalNights) 的返回值直接累加到 totalCost。
  • getActivitiesCost() 方法在一个 while 循环中被调用,直到用户选择“6: That's all--Done!”。
  • if (activityChoice != 6 && activityChoice != -1) 条件非常重要,它确保只有实际的活动费用才会被累加,避免将退出信号(6)或无效选择(-1)误加到总费用中。

最终结果展示

循环结束后,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
登录后复制

关键点:

  • 使用 printf 格式化输出,确保费用显示为两位小数。
  • 在计算人均每晚费用时,增加了对 numberOfGuests 和 totalNights 是否大于零的检查,以避免除零错误。

完整代码示例

下面是整合了所有修正和优化的完整 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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号