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

风明大大_6759

风明大大_6759

2025-09-20

561人浏览

原创

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 方法详解及修正

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

原始问题: 与 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 方法是程序的入口点,它将协调用户输入、调用上述费用计算方法并累加总费用,最终展示结果。

初始化与用户输入

在 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 <p><strong>关键点:</strong></p>
  • 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免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.25

354

5

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

808

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1029

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

20

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

20

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习